Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
a040ee1
generate protobuf types
brendan-kellam Nov 14, 2025
cca3d30
stream poc over SSE
brendan-kellam Nov 14, 2025
9cd3236
wip: make stream search api follow existing schema. Modify UI to supp…
brendan-kellam Nov 15, 2025
9f66c45
fix scrolling issue
brendan-kellam Nov 15, 2025
4f39451
Dockerfile
brendan-kellam Nov 15, 2025
cfdadf2
wip on lezer parser grammar for query language
brendan-kellam Nov 15, 2025
8dce2aa
add lezer tree -> grpc transformer
brendan-kellam Nov 16, 2025
46c8d60
remove spammy log message
brendan-kellam Nov 17, 2025
ac9d05a
fix syntax highlighting by adding a module resolution for @lezer/common
brendan-kellam Nov 17, 2025
b966b63
further wip on query language
brendan-kellam Nov 17, 2025
69e0a1a
Add case sensitivity and regexp toggles
brendan-kellam Nov 17, 2025
e6859cb
Improved type safety / cleanup for query lang
brendan-kellam Nov 18, 2025
307e17e
support search contexts
brendan-kellam Nov 18, 2025
09581f3
update Dockerfile with query langauge package
brendan-kellam Nov 18, 2025
b09def9
fix filter
brendan-kellam Nov 18, 2025
74376c0
Add skeletons to filter panel when search is streaming
brendan-kellam Nov 18, 2025
c7ba32f
add client side caching
brendan-kellam Nov 18, 2025
5ab585c
improved cancelation handling
brendan-kellam Nov 19, 2025
9c9b6b9
add isSearchExausted flag for flagging when a search captured all res…
brendan-kellam Nov 19, 2025
d55dd13
Add back posthog search_finished event
brendan-kellam Nov 19, 2025
afcc30d
remove zoekt tenant enforcement
brendan-kellam Nov 19, 2025
898c909
migrate blocking search over to grpc. Centralize everything in searchApi
brendan-kellam Nov 19, 2025
696d06b
branch handling
brendan-kellam Nov 20, 2025
aad3507
plumb file weburl
brendan-kellam Nov 20, 2025
3fd5f49
add repo_sets filter for repositories a user has access to
brendan-kellam Nov 20, 2025
bddbb76
refactor a bunch of stuff + add support for passing in Query IR to se…
brendan-kellam Nov 20, 2025
ceee66e
refactor
brendan-kellam Nov 21, 2025
1d1205f
dev README
brendan-kellam Nov 21, 2025
5c624cd
wip on better error handling
brendan-kellam Nov 21, 2025
55a3e9e
error handling for stream path
brendan-kellam Nov 21, 2025
93a3f89
update mcp
brendan-kellam Nov 21, 2025
a6e4092
changelog wip
brendan-kellam Nov 21, 2025
f52dfc7
type fix
brendan-kellam Nov 21, 2025
c477d76
style
brendan-kellam Nov 21, 2025
2f6fc04
Support rev:* wildcard
brendan-kellam Nov 21, 2025
5c80c53
changelog
brendan-kellam Nov 21, 2025
7c964d9
changelog nit
brendan-kellam Nov 21, 2025
ac19251
feedback
brendan-kellam Nov 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .env.development
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
ZOEKT_WEBSERVER_URL="http://localhost:6070"
# The command to use for generating ctags.
CTAGS_COMMAND=ctags
# logging, strict
SRC_TENANT_ENFORCEMENT_MODE=strict

# Auth.JS
# You can generate a new secret with:
Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

<!-- Bump @sourcebot/mcp since there are breaking changes to the api in this release -->

### Added
- Added support for streaming code search results. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Added buttons to toggle case sensitivity and regex patterns. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Added counts to members, requets, and invites tabs in the members settings. [#621](https://github.com/sourcebot-dev/sourcebot/pull/621)

### Changed
- Changed the default search behaviour to match patterns as substrings and **not** regular expressions. Regular expressions can be used by toggling the regex button in search bar. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Renamed `public` query prefix to `visibility`. Allowed values for `visibility` are `public`, `private`, and `any`. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Changed `archived` query prefix to accept values `yes`, `no`, and `only`. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)

### Removed
- Removed `case` query prefix. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Removed `branch` and `b` query prefixes. Please use `rev:` instead. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)
- Removed `regex` query prefix. [#623](https://github.com/sourcebot-dev/sourcebot/pull/623)

### Fixed
- Fixed spurious infinite loads with explore panel, file tree, and file search command. [#617](https://github.com/sourcebot-dev/sourcebot/pull/617)
- Wipe search context on init if entitlement no longer exists [#618](https://github.com/sourcebot-dev/sourcebot/pull/618)
Expand Down
9 changes: 8 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,12 @@ COPY .yarn ./.yarn
COPY ./packages/db ./packages/db
COPY ./packages/schemas ./packages/schemas
COPY ./packages/shared ./packages/shared
COPY ./packages/queryLanguage ./packages/queryLanguage

RUN yarn workspace @sourcebot/db install
RUN yarn workspace @sourcebot/schemas install
RUN yarn workspace @sourcebot/shared install
RUN yarn workspace @sourcebot/query-language install
# ------------------------------------

# ------ Build Web ------
Expand Down Expand Up @@ -92,6 +94,7 @@ COPY --from=shared-libs-builder /app/node_modules ./node_modules
COPY --from=shared-libs-builder /app/packages/db ./packages/db
COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas
COPY --from=shared-libs-builder /app/packages/shared ./packages/shared
COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage

# Fixes arm64 timeouts
RUN yarn workspace @sourcebot/web install
Expand Down Expand Up @@ -130,6 +133,7 @@ COPY --from=shared-libs-builder /app/node_modules ./node_modules
COPY --from=shared-libs-builder /app/packages/db ./packages/db
COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas
COPY --from=shared-libs-builder /app/packages/shared ./packages/shared
COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage
RUN yarn workspace @sourcebot/backend install
RUN yarn workspace @sourcebot/backend build

Expand Down Expand Up @@ -173,7 +177,6 @@ ENV DATA_DIR=/data
ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot
ENV DATABASE_DATA_DIR=$DATA_CACHE_DIR/db
ENV REDIS_DATA_DIR=$DATA_CACHE_DIR/redis
ENV SRC_TENANT_ENFORCEMENT_MODE=strict
ENV SOURCEBOT_PUBLIC_KEY_PATH=/app/public.pem

# Valid values are: debug, info, warn, error
Expand Down Expand Up @@ -217,6 +220,9 @@ COPY --from=zoekt-builder \
/cmd/zoekt-index \
/usr/local/bin/

# Copy zoekt proto files (needed for gRPC client at runtime)
COPY vendor/zoekt/grpc/protos /app/vendor/zoekt/grpc/protos

# Copy all of the things
COPY --from=web-builder /app/packages/web/public ./packages/web/public
COPY --from=web-builder /app/packages/web/.next/standalone ./
Expand All @@ -229,6 +235,7 @@ COPY --from=shared-libs-builder /app/node_modules ./node_modules
COPY --from=shared-libs-builder /app/packages/db ./packages/db
COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas
COPY --from=shared-libs-builder /app/packages/shared ./packages/shared
COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage

# Fixes git "dubious ownership" issues when the volume is mounted with different permissions to the container.
RUN git config --global safe.directory "*"
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"dev:prisma:studio": "yarn with-env yarn workspace @sourcebot/db prisma:studio",
"dev:prisma:migrate:reset": "yarn with-env yarn workspace @sourcebot/db prisma:migrate:reset",
"dev:prisma:db:push": "yarn with-env yarn workspace @sourcebot/db prisma:db:push",
"build:deps": "yarn workspaces foreach --recursive --topological --from '{@sourcebot/schemas,@sourcebot/db,@sourcebot/shared}' run build"
"build:deps": "yarn workspaces foreach --recursive --topological --from '{@sourcebot/schemas,@sourcebot/db,@sourcebot/shared,@sourcebot/query-language}' run build"
},
"devDependencies": {
"concurrently": "^9.2.1",
Expand All @@ -27,6 +27,7 @@
},
"packageManager": "[email protected]",
"resolutions": {
"prettier": "3.5.3"
"prettier": "3.5.3",
"@lezer/common": "1.3.0"
}
}
1 change: 0 additions & 1 deletion packages/backend/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ const listenToShutdownSignals = () => {
const cleanup = async (signal: string) => {
try {
if (receivedSignal) {
logger.debug(`Recieved repeat signal ${signal}, ignoring.`);
return;
}
receivedSignal = true;
Expand Down
2 changes: 2 additions & 0 deletions packages/db/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
import type { User, Account } from ".prisma/client";
export type UserWithAccounts = User & { accounts: Account[] };
export * from ".prisma/client";
3 changes: 3 additions & 0 deletions packages/mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed
- Updated API client to match the latest Sourcebot release. [#555](https://github.com/sourcebot-dev/sourcebot/pull/555)

## [1.0.9] - 2025-11-17

### Added
Expand Down
8 changes: 2 additions & 6 deletions packages/mcp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,12 @@ server.tool(
query += ` ( lang:${languages.join(' or lang:')} )`;
}

if (caseSensitive) {
query += ` case:yes`;
} else {
query += ` case:no`;
}

const response = await search({
query,
matches: env.DEFAULT_MATCHES,
contextLines: env.DEFAULT_CONTEXT_LINES,
isRegexEnabled: true,
isCaseSensitivityEnabled: caseSensitive,
});

if (isServiceError(response)) {
Expand Down
21 changes: 11 additions & 10 deletions packages/mcp/src/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,17 @@ export const symbolSchema = z.object({
kind: z.string(),
});

export const searchOptionsSchema = z.object({
matches: z.number(), // The number of matches to return.
contextLines: z.number().optional(), // The number of context lines to return.
whole: z.boolean().optional(), // Whether to return the whole file as part of the response.
isRegexEnabled: z.boolean().optional(), // Whether to enable regular expression search.
isCaseSensitivityEnabled: z.boolean().optional(), // Whether to enable case sensitivity.
});

export const searchRequestSchema = z.object({
// The zoekt query to execute.
query: z.string(),
// The number of matches to return.
matches: z.number(),
// The number of context lines to return.
contextLines: z.number().optional(),
// Whether to return the whole file as part of the response.
whole: z.boolean().optional(),
query: z.string(), // The zoekt query to execute.
...searchOptionsSchema.shape,
});

export const repositoryInfoSchema = z.object({
Expand Down Expand Up @@ -109,7 +111,7 @@ export const searchStatsSchema = z.object({
regexpsConsidered: z.number(),

// FlushReason explains why results were flushed.
flushReason: z.number(),
flushReason: z.string(),
});

export const searchResponseSchema = z.object({
Expand Down Expand Up @@ -139,7 +141,6 @@ export const searchResponseSchema = z.object({
content: z.string().optional(),
})),
repositoryInfo: z.array(repositoryInfoSchema),
isBranchFilteringEnabled: z.boolean(),
isSearchExhaustive: z.boolean(),
});

Expand Down
2 changes: 2 additions & 0 deletions packages/queryLanguage/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/node_modules/
/dist
19 changes: 19 additions & 0 deletions packages/queryLanguage/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "@sourcebot/query-language",
"private": true,
"main": "dist/index.js",
"scripts": {
"build": "lezer-generator src/query.grammar -o src/parser --typeScript --names && tsc",
"test": "vitest"
},
"devDependencies": {
"@lezer/generator": "^1.8.0",
"tsx": "^4.19.1",
"typescript": "^5.7.3",
"vitest": "^2.1.9"
},
"dependencies": {
"@lezer/common": "^1.3.0",
"@lezer/lr": "^1.4.3"
}
}
7 changes: 7 additions & 0 deletions packages/queryLanguage/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { parser } from "./parser";

type Tree = ReturnType<typeof parser.parse>;
type SyntaxNode = Tree['topNode'];
export type { Tree, SyntaxNode };
export * from "./parser";
export * from "./parser.terms";
21 changes: 21 additions & 0 deletions packages/queryLanguage/src/parser.terms.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
export const
negate = 22,
Program = 1,
OrExpr = 2,
AndExpr = 3,
NegateExpr = 4,
PrefixExpr = 5,
ArchivedExpr = 6,
RevisionExpr = 7,
ContentExpr = 8,
ContextExpr = 9,
FileExpr = 10,
ForkExpr = 11,
VisibilityExpr = 12,
RepoExpr = 13,
LangExpr = 14,
SymExpr = 15,
RepoSetExpr = 16,
ParenExpr = 17,
Term = 18
18 changes: 18 additions & 0 deletions packages/queryLanguage/src/parser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
import {LRParser} from "@lezer/lr"
import {negateToken} from "./tokens"
export const parser = LRParser.deserialize({
version: 14,
states: "'[OVQROOO!WQQO'#CcO!WQQO'#CdO!WQQO'#CeO!WQQO'#CfO!`QSO'#CgO!kQSO'#ChO!WQQO'#CiO!WQQO'#CjO!WQQO'#CkO!WQQO'#ClOOQP'#Ca'#CaOVQRO'#CmO!vQQO'#C`OOQP'#Cn'#CnOOQP'#Cw'#CwO#nQRO'#CvO#{QQO'#CvO$WQQO'#C^OOQO'#Cu'#CuQOQQOOO!`QSO'#CbOOQP'#C}'#C}OOQP,58},58}OOQP,59O,59OOOQP,59P,59POOQP,59Q,59QOOQP'#DU'#DUOOQP,59R,59ROOQP'#DW'#DWOOQP,59S,59SOOQP,59T,59TOOQP,59U,59UOOQP,59V,59VOOQP,59W,59WO$]QQO,59XOOQP,58z,58zOOQP'#Co'#CoO$bQRO,58yOVQRO'#CpO$oQQO,58xOOQP,58|,58|OOQP1G.s1G.sOOQP-E6m-E6mO$zQRO'#CvOOQO'#Cv'#CvOOQO,59[,59[OOQO-E6n-E6n",
stateData: "%i~OhOS~Of]OleOpPOr^Os^OtQOuROvSOwTOyUO!OVO!PWO!QXO!RYO!S[O~OrfOsfO~OmkOnkOokO~O{mO|mO}mO~OleOpPOtQOuROvSOwTOyUO!OVO!PWO!QXO!RYO!S[O~OeiX!UjX!TiX~PVOeiX!UjX!TiX~O!UwO~O!TzO~OeRa!URa!TRa~PVO!UwOeQa!TQa~OejX!UjX!TjX~PVOrlptuvwy!O!P!Q!R!Usy~",
goto: "$`{PP|!Q!X!a!l!l!l!l!l!l!l!l!l!l!l!a!X!u!|PPPP#S#Y#aPPPPP#mPPPPPP$VP$]TcO[SaO[R}w]_O[`vw|[_O[`vw|Rt]_ZO[]`vw|Sv`|R{vQxbR!PxQdORs[SbO[R!OwS`O[Uu`v|R|wQgPQhQQiRQjSQoVQpWQqXRrYQlTRyeRnU",
nodeNames: "⚠ Program OrExpr AndExpr NegateExpr PrefixExpr ArchivedExpr RevisionExpr ContentExpr ContextExpr FileExpr ForkExpr VisibilityExpr RepoExpr LangExpr SymExpr RepoSetExpr ParenExpr Term",
maxTerm: 52,
skippedNodes: [0],
repeatNodeCount: 2,
tokenData: "!Hc~RpOX#VXY$TYZ$TZp#Vpq$Tqr#Vrs$csx#Vxy&Vyz&[z#T#V#T#U&a#U#V#V#V#W0q#W#Y#V#Y#Z:{#Z#`#V#`#aCZ#a#b#V#b#cGu#c#dIm#d#e!!V#e#f#V#f#g!-k#g#h!7q#h#j#V#j#k!;_#k#m#V#m#n!Em#n;'S#V;'S;=`#}<%lO#VP#[ZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VP$QP;=`<%l#V~$YRh~XY$TYZ$Tpq$T~$fWOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P<%lO$c~%TOr~~%WRO;'S$c;'S;=`%a;=`O$c~%dXOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P;=`<%l$c<%lO$c~&SP;=`<%l$c~&[O!S~~&aO!T~~&f_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c'e#c#f#V#f#g)]#g;'S#V;'S;=`#}<%lO#VR'j]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n(c#n;'S#V;'S;=`#}<%lO#VR(jZ}QsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~)b]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W*Z#W;'S#V;'S;=`#}<%lO#V~*`]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#[#V#[#]+X#];'S#V;'S;=`#}<%lO#V~+^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^,V#^;'S#V;'S;=`#}<%lO#V~,[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k-T#k;'S#V;'S;=`#}<%lO#V~-Y]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y.R#Y;'S#V;'S;=`#}<%lO#V~.W]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#W#V#W#X/P#X;'S#V;'S;=`#}<%lO#V~/UZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]/w!];'S#V;'S;=`#}<%lO#V~0OZl~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~0v]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!]#c#V#c#d2i#d;'S#V;'S;=`#}<%lO#V~1vZt~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~2n]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c3g#c;'S#V;'S;=`#}<%lO#V~3l]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i4e#i;'S#V;'S;=`#}<%lO#V~4j]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y5c#Y;'S#V;'S;=`#}<%lO#V~5h_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c6g#c#l#V#l#m8]#m;'S#V;'S;=`#}<%lO#V~6l]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i7e#i;'S#V;'S;=`#}<%lO#V~7jZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!];'S#V;'S;=`#}<%lO#V~8b]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i9Z#i;'S#V;'S;=`#}<%lO#V~9`ZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]:R!];'S#V;'S;=`#}<%lO#V~:YZu~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~;Q_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]<P!]#]#V#]#^<y#^#c#V#c#d?m#d;'S#V;'S;=`#}<%lO#V~<WZv~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~=O]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a=w#a;'S#V;'S;=`#}<%lO#V~=|]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y>u#Y;'S#V;'S;=`#}<%lO#V~>zZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]<P!];'S#V;'S;=`#}<%lO#V~?r]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#f#V#f#g@k#g;'S#V;'S;=`#}<%lO#V~@p]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#_#V#_#`Ai#`;'S#V;'S;=`#}<%lO#V~AnZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]Ba!];'S#V;'S;=`#}<%lO#V~BhZw~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~C`]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#UDX#U;'S#V;'S;=`#}<%lO#V~D^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cEV#c;'S#V;'S;=`#}<%lO#V~E[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#Z#V#Z#[FT#[;'S#V;'S;=`#}<%lO#V~FYZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]F{!];'S#V;'S;=`#}<%lO#V~GSZ!P~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VRGz]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#dHs#d;'S#V;'S;=`#}<%lO#VRHzZnQsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~Ir_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cJq#c#f#V#f#gMg#g;'S#V;'S;=`#}<%lO#VRJv]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#aKo#a;'S#V;'S;=`#}<%lO#VRKt]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#nLm#n;'S#V;'S;=`#}<%lO#VRLtZoQsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~MlfsPOX! QXZ! zZp! Qpq! zqr! Qrs! zsx! Qxz! zz}! Q}!O! Q!O!Q! Q!Q![#V![!]! Q!]!c! Q!c!}#V!}#R! Q#R#S#V#S#T! Q#T#o#V#o;'S! Q;'S;=`!!P<%lO! Q~! XZ!U~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!!PO!U~~!!SP;=`<%l! QR!![_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#f#V#f#g!#Z#g#i#V#i#j!(y#j;'S#V;'S;=`#}<%lO#VR!#`]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!$X#^;'S#V;'S;=`#}<%lO#VR!$^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k!%V#k;'S#V;'S;=`#}<%lO#VR!%[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#U!&T#U;'S#V;'S;=`#}<%lO#VR!&Y]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!'R#i;'S#V;'S;=`#}<%lO#VR!'W]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!(P#Y;'S#V;'S;=`#}<%lO#VR!(WZ|QsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VR!)O]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!)w#V;'S#V;'S;=`#}<%lO#VR!)|]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!*u#a;'S#V;'S;=`#}<%lO#VR!*z]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!+s#^;'S#V;'S;=`#}<%lO#VR!+x]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W!,q#W;'S#V;'S;=`#}<%lO#VR!,xZ{QsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!-p]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!.i!]#X#V#X#Y!/c#Y;'S#V;'S;=`#}<%lO#V~!.pZ!O~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!/h_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#d#V#d#e!0g#e#j#V#j#k!6P#k;'S#V;'S;=`#}<%lO#V~!0l]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#d!1e#d;'S#V;'S;=`#}<%lO#V~!1j]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!.i!]#g#V#g#h!2c#h;'S#V;'S;=`#}<%lO#V~!2h]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!3a#Y;'S#V;'S;=`#}<%lO#V~!3f]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!4_#i;'S#V;'S;=`#}<%lO#V~!4dZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!5V!];'S#V;'S;=`#}<%lO#V~!5^Z!R~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!6UZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!6w!];'S#V;'S;=`#}<%lO#V~!7OZp~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!7v]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!8o#n;'S#V;'S;=`#}<%lO#V~!8t]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#a#V#a#b!9m#b;'S#V;'S;=`#}<%lO#V~!9rZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!:e!];'S#V;'S;=`#}<%lO#V~!:lZ!Q~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~!;d]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!<]#^;'S#V;'S;=`#}<%lO#V~!<b]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!=Z#h;'S#V;'S;=`#}<%lO#V~!=`]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!>X#^;'S#V;'S;=`#}<%lO#V~!>^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!?V#V;'S#V;'S;=`#}<%lO#V~!?[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!@T#^;'S#V;'S;=`#}<%lO#V~!@Y]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!AR#a;'S#V;'S;=`#}<%lO#V~!AW]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!BP#^;'S#V;'S;=`#}<%lO#V~!BU]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!B}#i;'S#V;'S;=`#}<%lO#V~!CS]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!C{#n;'S#V;'S;=`#}<%lO#V~!DQZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!Ds!];'S#V;'S;=`#}<%lO#V~!DzZy~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VR!Er]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!Fk#Y;'S#V;'S;=`#}<%lO#VR!Fp]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!Gi#h;'S#V;'S;=`#}<%lO#VR!GpZmQsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V",
tokenizers: [negateToken, 0, 1],
topRules: {"Program":[0,1]},
tokenPrec: 193,
termNames: {"0":"⚠","1":"@top","2":"OrExpr","3":"AndExpr","4":"NegateExpr","5":"PrefixExpr","6":"ArchivedExpr","7":"RevisionExpr","8":"ContentExpr","9":"ContextExpr","10":"FileExpr","11":"ForkExpr","12":"VisibilityExpr","13":"RepoExpr","14":"LangExpr","15":"SymExpr","16":"RepoSetExpr","17":"ParenExpr","18":"Term","19":"expr+","20":"(or andExpr)+","21":"␄","22":"negate","23":"%mainskip","24":"space","25":"query","26":"andExpr","27":"expr","28":"archivedKw","29":"\"yes\"","30":"\"no\"","31":"\"only\"","32":"revisionKw","33":"value","34":"quotedString","35":"word","36":"contentKw","37":"contextKw","38":"fileKw","39":"forkKw","40":"forkValue","41":"visibilityKw","42":"visibilityValue","43":"\"public\"","44":"\"private\"","45":"\"any\"","46":"repoKw","47":"langKw","48":"symKw","49":"reposetKw","50":"\"(\"","51":"\")\"","52":"or"}
})
Loading
Loading