@octocodeai/octocode-tools-core 17.0.1 → 17.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/schema.js CHANGED
@@ -5,5 +5,5 @@ import { dirname as __dirname_fn } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __dirname_fn(__filename);
8
- import{z as qt}from"zod";import{completeMetadata as Kt}from"@octocodeai/octocode-core";var g=Kt.toolNames,I=g.LSP_GET_SEMANTIC_CONTENT,W="oqlSearch";function ce(e=process.env){let o=e.ENABLE_OQL;return o===void 0?!1:["1","true","yes","on"].includes(o.trim().toLowerCase())}var Xn=new Set([g.LOCAL_RIPGREP,g.LOCAL_FETCH_CONTENT,g.LOCAL_FIND_FILES,g.LOCAL_VIEW_STRUCTURE,I]);var Xe=["definition","references","callers","callees","callHierarchy","hover","documentSymbols","typeDefinition","implementation","workspaceSymbol","supertypes","subtypes","diagnostic"];import{CloneRepoQuerySchema as ao}from"@octocodeai/octocode-core/schemas";import{GitHubCloneRepoOutputSchema as io}from"@octocodeai/octocode-core/schemas/outputs";import{z as oe}from"zod";function m(e,o){return oe.preprocess(r=>typeof r=="number"&&Number.isFinite(r)?Math.min(Math.max(r,e),o):r,oe.number().int().min(e).max(o))}var L=m(1,1e3).optional().default(1),N=m(0,100).optional(),B=m(1,1e9).optional(),eo={responseCharOffset:m(0,1e8).optional().describe("Full-response char offset; re-call with returned value when hasMore."),responseCharLength:m(1,5e4).optional().describe("Full-response char window.")};function O(e,o={}){let{maxQueries:r=5}=o;return oe.object({queries:oe.array(e).min(1).max(r).describe("Parallel queries."),...eo}).superRefine((a,c)=>{let i=new Set;a.queries.forEach((p,f)=>{p&&typeof p=="object"&&"id"in p&&typeof p.id=="string"&&(i.has(p.id)&&c.addIssue({code:"custom",message:`Duplicate query id "${p.id}" at index ${f}`,path:["queries",f,"id"]}),i.add(p.id))})})}import{z as We}from"zod";function to(e,o){return e?.description&&!o.description?o.describe(e.description):o}function Ze(e,o){let r={};for(let[a,c]of Object.entries(o))r[a]=to(e.shape[a],c);return r}function oo(e,o){let r=e;return r.safeExtend?r.safeExtend(o):e.extend(o)}function Je(e,o){if(!o?.length)return e;let r=new Set(o);return We.object(Object.fromEntries(Object.entries(e.shape).filter(([a])=>!r.has(a))))}function R(e,o={},r={}){let a=Je(e,r.omit),c=oo(a,Ze(a,o));return r.strict?c.strict():c}function C(e,o={},r={}){let a=Je(e,r.omit),c=We.object({...a.shape,...Ze(a,o)});return r.strict?c.strict():c}import{z as w}from"zod";import{z as d}from"zod";var F=d.object({currentPage:d.number(),totalPages:d.number(),hasMore:d.boolean(),nextPage:d.number().optional(),pageSize:d.number().optional(),totalItems:d.number().optional(),perPage:d.number().optional(),totalFound:d.number().optional(),returned:d.number().optional(),totalMatches:d.number().optional(),reportedTotalMatches:d.number().optional(),reachableTotalMatches:d.number().optional(),totalMatchesKind:d.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:d.boolean().optional(),totalResults:d.number().optional(),itemsPerPage:d.number().optional()}),ne=d.object({charOffset:d.number(),charLength:d.number(),totalChars:d.number(),hasMore:d.boolean(),nextCharOffset:d.number().optional(),currentPage:d.number().optional(),totalPages:d.number().optional(),chunkMode:d.enum(["semantic","char-limit"]).optional()}),E=d.object({tool:d.string(),query:d.record(d.string(),d.unknown()),why:d.string().optional(),confidence:d.enum(["exact","heuristic"]).optional()}),Q=F.extend({filesPerPage:d.number().optional(),entriesPerPage:d.number().optional(),matchesPerPage:d.number().optional(),totalFiles:d.number().optional(),totalEntries:d.number().optional(),totalMatches:d.number().optional(),totalFilesFound:d.number().optional(),nextMatchPage:d.number().optional()});var z=d.object({level:d.enum(["info","warning","error"]),message:d.string(),field:d.string().optional(),code:d.string().optional()});var no=w.object({currentPage:w.number(),totalPages:w.number(),hasMore:w.boolean(),charOffset:w.number(),charLength:w.number(),totalChars:w.number(),nextCharOffset:w.number().optional()}).optional(),P={base:w.string().optional(),shared:w.record(w.string(),w.union([w.string(),w.number(),w.boolean()])).optional(),responsePagination:no};function ro(e){return w.object({id:w.string(),status:w.enum(["empty","error"]).optional(),data:e,diagnostics:w.array(z).optional(),next:w.record(w.string(),E).optional()})}var cr=ro(w.record(w.string(),w.unknown()).optional()),j=P;var re=R(ao),pe=O(re),gr=io.extend(P);import{z as s}from"zod";import{FileContentQuerySchema as Ke}from"@octocodeai/octocode-core/schemas";var so=s.enum(["none","standard","symbols"]).optional().default("standard"),co=s.union([ne.extend({nextPage:s.number().optional()}),F.extend({charOffset:s.number().optional(),charLength:s.number().optional(),totalChars:s.number().optional(),nextCharOffset:s.number().optional()})]),lo=s.object({continueChars:E.extend({tool:s.literal("ghGetFileContent")}).optional()}),po=s.object({path:s.string(),content:s.string(),localPath:s.string().optional(),repoRoot:s.string().optional(),contentView:s.enum(["none","standard","symbols"]).optional(),totalLines:s.number().optional(),sourceChars:s.number().optional(),sourceBytes:s.number().optional(),resolvedBranch:s.string().optional(),modified:s.string().optional(),fileSize:s.number().optional(),pagination:co.optional(),next:lo.optional(),isPartial:s.boolean().optional(),startLine:s.number().optional(),endLine:s.number().optional(),matchRanges:s.array(s.object({start:s.number(),end:s.number()})).optional(),lastModified:s.string().optional(),lastModifiedBy:s.string().optional(),warnings:s.array(s.string()).optional(),matchNotFound:s.boolean().optional(),searchedFor:s.string().optional(),cached:s.boolean().optional()}),uo=s.object({path:s.string(),localPath:s.string(),repoRoot:s.string().optional(),fileCount:s.number(),totalSize:s.number(),complete:s.boolean().optional(),directoryEntryCount:s.number().optional(),eligibleFileCount:s.number().optional(),savedFileCount:s.number().optional(),skipped:s.object({nonFile:s.number(),missingDownloadUrl:s.number(),oversized:s.number(),binary:s.number(),fileLimit:s.number(),fetchFailed:s.number(),totalSizeLimit:s.number(),pathTraversal:s.number()}).optional(),limits:s.object({maxDirectoryFiles:s.number(),maxTotalSize:s.number(),maxFileSize:s.number()}).optional(),warnings:s.array(s.string()).optional(),files:s.array(s.object({path:s.string(),size:s.number(),type:s.string()})).optional(),cached:s.boolean().optional(),resolvedBranch:s.string().optional()}),Ye={startLine:B,endLine:B,contextLines:N,charOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional(),minify:so},mo=C(Ke,Ye),ue=R(Ke,Ye),me=O(mo),wr=s.object({base:s.string().optional(),shared:s.record(s.string(),s.union([s.string(),s.number(),s.boolean()])).optional(),responsePagination:P.responsePagination,results:s.array(s.object({id:s.string(),data:s.object({owner:s.string(),repo:s.string(),files:s.array(po).optional(),directories:s.array(uo).optional()}).optional()})),errors:s.array(s.object({id:s.string(),owner:s.string().optional(),repo:s.string().optional(),path:s.string().optional(),error:s.string()})).optional()});import{z as u}from"zod";import{GitHubCodeSearchQuerySchema as et}from"@octocodeai/octocode-core/schemas";var tt={limit:m(1,100).optional(),page:L.default(1),match:u.enum(["file","path"]).default("file").describe('"file" searches file contents and returns snippets with matchIndices. "path" searches only file paths/names \u2014 no snippets, far cheaper; use it to confirm a file exists before reading it. (Unlike ghSearchRepos/ghHistoryResearch, where `match` instead selects which text FIELDS to search \u2014 a different concept sharing this name.)')},de=R(et,tt),he=O(C(et,tt)),ho=F.extend({totalMatchesKind:u.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:u.boolean().optional(),uniqueFileCount:u.number().optional()}),Dr=u.object({base:u.string().optional(),shared:u.record(u.string(),u.union([u.string(),u.number(),u.boolean()])).optional(),responsePagination:P.responsePagination,results:u.array(u.object({id:u.string(),data:u.object({files:u.array(u.union([u.string(),u.object({owner:u.string(),repo:u.string(),path:u.string(),queryId:u.string().optional(),matches:u.array(u.object({value:u.string().optional(),pathOnly:u.boolean().optional(),matchIndices:u.array(u.object({start:u.number(),end:u.number(),lineOffset:u.number()})).optional(),url:u.string().optional()}))})])),pagination:ho.optional()})})),emptyQueries:u.array(u.object({id:u.string(),nonExistentScope:u.literal(!0).optional(),incompleteResults:u.literal(!0).optional()})).optional(),warnings:u.array(u.string()).optional(),diagnostics:u.array(z).optional(),next:u.record(u.string(),E).optional(),errors:u.array(u.object({id:u.string(),error:u.string()})).optional()});import{z as _}from"zod";import{GitHubPullRequestSearchQuerySchema as nt}from"@octocodeai/octocode-core/schemas";import{GitHubSearchPullRequestsOutputSchema as bo}from"@octocodeai/octocode-core/schemas/outputs";var rt={type:_.enum(["prs","commits","releases","issues"]).optional().describe('Research mode: "prs" (default) searches pull requests; "commits" walks commit history for a repo or path; "releases" lists the repository releases (tagName, publishedAt, prerelease flag) and surfaces the latest stable release; "issues" searches or reads GitHub issues (body/discussion comments \u2014 not PRs).'),perPage:m(1,100).optional().default(30),prNumber:m(1,1e9).optional(),issueNumber:m(1,1e9).optional().describe('Issue number for type:"issues" detail mode \u2014 reads that specific issue (body/discussion comments). Requires owner+repo. Falls back to prNumber if omitted.'),limit:m(1,100).optional().default(30),match:_.array(_.enum(["title","body","comments"])).optional().describe('Fields to match keywords against: "title", "body", "comments". Default searches all three. Use ["title"] for the most precise and fastest match. (Unlike ghSearchCode, where `match` instead selects file-contents vs file-paths \u2014 a different concept sharing this name.)'),page:L.default(1),filePage:L.optional(),commentPage:L.optional(),commitPage:L.optional(),itemsPerPage:m(1,100).optional().default(20),charOffset:m(0,1e8).optional(),commentBodyOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional()},So=C(nt,rt),ge=R(nt,rt),fe=O(So),ot=_.union([_.string(),_.object({}).passthrough()]),Br=bo.extend({results:_.array(_.object({id:_.string().optional(),status:_.string().optional(),data:_.object({pull_requests:_.array(ot).optional(),issues:_.array(ot).optional(),next:_.record(_.string(),E).optional()}).passthrough().optional()}).passthrough()).optional(),...P});import{z as S}from"zod";import{GitHubReposSearchSingleQuerySchema as at}from"@octocodeai/octocode-core/schemas";var it={limit:m(1,100).optional(),page:L.default(1),match:S.array(S.enum(["name","description","readme"])).optional().describe("Which text fields to search: name, description, and/or readme. Defaults to name+description; add 'readme' for broader, slower full-text search. (Unlike ghSearchCode, where `match` instead selects file-contents vs file-paths \u2014 a different concept sharing this name.)")},ye=R(at,it),be=O(C(at,it)),xo=S.object({owner:S.string(),repo:S.string(),stars:S.number().optional(),forks:S.number().optional(),openIssuesCount:S.number().optional(),language:S.string().optional(),license:S.string().optional(),description:S.string().optional(),homepage:S.string().optional(),pushedAt:S.string().optional(),createdAt:S.string().optional(),defaultBranch:S.string().optional(),topics:S.array(S.string()).optional(),visibility:S.string().optional(),url:S.string().optional(),updatedAt:S.string().optional()}),To=F.extend({totalMatchesKind:S.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:S.boolean().optional()}).optional(),Oo=S.object({repositories:S.array(S.union([S.string(),xo])).optional(),pagination:To}).passthrough(),Kr=S.object({results:S.array(S.object({id:S.string().optional(),status:S.string().optional(),data:Oo.optional()}).passthrough()).optional()}).extend(P);import{GitHubViewRepoStructureQuerySchema as st}from"@octocodeai/octocode-core/schemas";import{GitHubViewRepoStructureOutputSchema as wo}from"@octocodeai/octocode-core/schemas/outputs";var ct={maxDepth:m(0,20).optional(),page:L.default(1),itemsPerPage:m(1,200).optional()},Se=R(st,ct),xe=O(C(st,ct)),sa=wo.extend(P);import{z as y}from"zod";import{NpmPackageQuerySchema as lt}from"@octocodeai/octocode-core/schemas";var pt={page:L,mode:y.enum(["lean","full"]).optional(),keywords:y.union([y.string(),y.array(y.string())]).optional().describe("Registry keyword query (string; an array of terms is accepted and joined with spaces).")},Te=R(lt,pt),Oe=O(C(lt,pt,{strict:!0}),{maxQueries:5}),ga=y.object({results:y.array(y.looseObject({id:y.string(),data:y.looseObject({packages:y.array(y.object({name:y.string(),version:y.string().optional(),description:y.string().optional(),license:y.string().optional(),downloads:y.number().optional(),repository:y.string().optional(),repositoryDirectory:y.string().optional(),repositoryId:y.string().optional(),next:y.record(y.string(),E).optional(),warnings:y.array(y.string()).optional(),diagnostics:y.array(z).optional()}).passthrough()).optional(),repositories:y.record(y.string(),y.object({repository:y.string(),owner:y.string(),repo:y.string(),repositoryDirectory:y.string().optional(),next:y.record(y.string(),E)}).passthrough()).optional(),pagination:F.optional()}).optional(),status:y.string().optional()})).optional()}).extend(P);import{z as x}from"zod";import{FetchContentQuerySchema as ut}from"@octocodeai/octocode-core/schemas";var Lo=x.enum(["none","standard","symbols"]).optional().default("standard"),mt={startLine:B,endLine:B,contextLines:N.default(5),charOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional(),minify:Lo},Co=C(ut,mt),Re=R(ut,mt),we=O(Co,{maxQueries:5}),Eo=x.object({start:x.number(),end:x.number()}),ko=x.object({path:x.string().optional(),content:x.string().optional(),contentView:x.enum(["none","standard","symbols"]).optional(),totalLines:x.number().optional(),sourceChars:x.number().optional(),sourceBytes:x.number().optional(),startLine:x.number().optional(),endLine:x.number().optional(),isPartial:x.boolean().optional(),matchRanges:x.array(Eo).optional(),pagination:x.union([ne.extend({nextBlockChar:x.number().optional()}),F]).optional(),next:x.record(x.string(),E).optional(),modified:x.string().optional(),lastModified:x.string().optional(),lastModifiedBy:x.string().optional(),warnings:x.array(x.string()).optional(),matchNotFound:x.boolean().optional(),searchedFor:x.string().optional()}),wa=x.object({results:x.array(x.object({id:x.string(),status:x.enum(["empty","error"]).optional(),data:ko}))}).extend(j);import{z as T}from"zod";import{FindFilesQuerySchema as Po}from"@octocodeai/octocode-core/schemas";var dt={maxDepth:m(0,100).optional(),minDepth:m(0,100).optional(),limit:m(1,1e4).optional(),page:L.default(1),itemsPerPage:m(1,50).optional(),excludeDir:T.array(T.string()).optional().describe('Directory names to prune from the walk (e.g. ["node_modules","dist","coverage"]). NOTHING is excluded by default \u2014 results include build output and vendor dirs unless you pass this explicitly.')},ht=T.object(Object.fromEntries(Object.entries(Po.shape).filter(([e])=>e!=="regexType")));function _o(e,o){e.minDepth!==void 0&&e.maxDepth!==void 0&&e.minDepth>e.maxDepth&&o.addIssue({code:"custom",message:"minDepth must be less than or equal to maxDepth.",path:["minDepth"]})}var Ao=C(ht,dt),Ee=R(ht,dt).superRefine(_o),ke=O(Ao,{maxQueries:5}),Fo=T.object({name:T.string().optional(),path:T.string().optional(),type:T.enum(["file","dir","directory","link","symlink"]).optional(),size:T.union([T.number(),T.string()]).optional(),sizeFormatted:T.string().optional(),modified:T.string().optional(),accessed:T.string().optional(),created:T.string().optional(),permissions:T.string().optional()}),Do=T.object({path:T.string().optional(),files:T.array(Fo).optional(),summary:T.string().optional(),pagination:Q.optional(),next:T.record(T.string(),E).optional(),warnings:T.array(T.string()).optional()}),Da=T.object({results:T.array(T.object({id:T.string(),status:T.enum(["empty","error"]).optional(),data:Do}))}).extend(j);import{z as l}from"zod";import{RipgrepQuerySchema as gt}from"@octocodeai/octocode-core/schemas";var vo=["paginated","discovery","detailed","structural"],Io=["semanticRanking"],ft={mode:l.enum(vo).optional().default("paginated").describe('"paginated" snippets; "discovery" paths only; "detailed" snippets plus context; "structural" AST/code-shape search with pattern or rule. Structural matches return line/capture anchors that can feed lspGetSemantics when symbol identity matters. (Unrelated to ghHistoryResearch\'s `patches.mode` \u2014 different concepts sharing this name.)'),keywords:l.string().optional().describe("The search pattern (text or regex). Set fixedString:true for a literal match, or perlRegex:true for advanced regex features (lookaheads, backreferences). (Unlike ghSearchCode/ghSearchRepos, where `keywords` is an array of ANDed terms \u2014 this is a single string.)"),filesOnly:l.boolean().optional().describe("Returns matching file paths without line content. Mutually exclusive with filesWithoutMatch. (Unlike localViewStructure's `filesOnly`, which filters a directory listing to file entries only \u2014 a different concept sharing this name.)"),pattern:l.string().optional().describe("Structural only: code-shaped AST pattern with $X (one node) or $$$ARGS (node list). Use this to find syntax shape, then use lspGetSemantics for semantic proof."),rule:l.string().optional().describe("Structural only: YAML ast-grep rule for not/inside/has/all/any. Use for partial or relational AST queries before escalating matched anchors to lspGetSemantics."),contextLines:N,matchContentLength:m(1,1e5).optional().default(500),maxMatchesPerFile:m(1,1e5).optional(),maxFiles:m(1,1e5).optional(),matchPage:L.optional(),itemsPerPage:m(1,1e3).optional(),page:L.default(1),unique:l.boolean().optional().describe("With onlyMatching, return each matched value once per file."),countUnique:l.boolean().optional().describe("With onlyMatching, return each matched value once per file with its frequency.")},qo={...ft,semanticRanking:l.never().optional()},Qo=C(gt,qo),jo=R(gt,ft,{strict:!0,omit:Io}),_e=jo.superRefine((e,o)=>{let r=e;if(r.caseSensitive&&r.caseInsensitive&&o.addIssue({code:"custom",message:"caseSensitive and caseInsensitive are mutually exclusive.",path:["caseSensitive"]}),r.fixedString&&r.perlRegex&&o.addIssue({code:"custom",message:"fixedString and perlRegex are mutually exclusive.",path:["fixedString"]}),r.filesOnly&&r.filesWithoutMatch&&o.addIssue({code:"custom",message:"filesOnly and filesWithoutMatch are mutually exclusive.",path:["filesOnly"]}),r.countLinesPerFile&&r.countMatchesPerFile&&o.addIssue({code:"custom",message:"countLinesPerFile and countMatchesPerFile are mutually exclusive.",path:["countLinesPerFile"]}),r.multilineDotall&&!r.multiline&&o.addIssue({code:"custom",message:"multilineDotall requires multiline=true.",path:["multilineDotall"]}),r.mode==="structural"){for(let a of["unique","countUnique"])r[a]&&o.addIssue({code:"custom",message:`\`${a}\` is not valid with mode:"structural".`,path:[a]});return}r.unique&&!r.onlyMatching&&o.addIssue({code:"custom",message:"unique requires onlyMatching:true.",path:["unique"]}),r.countUnique&&!r.onlyMatching&&o.addIssue({code:"custom",message:"countUnique requires onlyMatching:true.",path:["countUnique"]})}),Ae=O(Qo,{maxQueries:5}),Go=l.object({line:l.number(),endLine:l.number().optional(),value:l.string().optional(),column:l.number().optional(),endColumn:l.number().optional(),count:l.number().optional(),kind:l.string().optional(),scoreHint:l.number().optional(),metavars:l.record(l.string(),l.array(l.string())).optional(),metavarRanges:l.record(l.string(),l.array(l.object({text:l.string(),line:l.number(),column:l.number(),endLine:l.number(),endColumn:l.number()}))).optional()}),Ho=l.object({path:l.string(),matches:l.array(Go).optional(),totalOccurrences:l.number().optional(),totalMatchedLines:l.number().optional(),totalMatchRows:l.number().optional(),returnedMatchRows:l.number().optional(),ranking:l.object({score:l.number(),profile:l.string().optional(),pathRole:l.string().optional(),reasons:l.array(l.string()).optional()}).optional(),matchPagination:Q.optional(),pagination:Q.optional(),next:l.record(l.string(),E).optional()}),Mo=l.object({files:l.array(Ho).optional(),summary:l.string().optional(),searchEngine:l.string().optional(),stats:l.object({totalOccurrences:l.number().optional(),matchedLines:l.number().optional(),filesMatched:l.number().optional(),filesSearched:l.number().optional(),bytesSearched:l.number().optional(),searchTime:l.string().optional()}).passthrough().optional(),pagination:Q.optional(),next:l.record(l.string(),E).optional(),warnings:l.array(l.string()).optional()}),Na=l.object({results:l.array(l.object({id:l.string(),status:l.enum(["empty","error"]).optional(),data:Mo}))}).extend(j);import{z as b}from"zod";import{ViewStructureQuerySchema as yt}from"@octocodeai/octocode-core/schemas";var bt={maxDepth:m(0,20).optional(),limit:m(1,1e4).optional(),page:L.default(1),itemsPerPage:m(1,50).optional(),filesOnly:b.boolean().optional().describe("Returns files only. Mutually exclusive with directoriesOnly. (Unlike localSearchCode's `filesOnly`, which filters search results to matching file paths \u2014 a different concept sharing this name.)")},No=C(yt,bt),Fe=R(yt,bt),De=O(No,{maxQueries:5}),Bo=b.object({name:b.string().optional(),type:b.enum(["file","dir","directory","link","symlink"]),path:b.string().optional(),depth:b.number().optional(),size:b.union([b.number(),b.string()]).optional(),sizeBytes:b.number().optional(),modified:b.string().optional(),permissions:b.string().optional()}),zo=b.object({path:b.string().optional(),entries:b.array(Bo).optional(),files:b.array(b.string()).optional(),folders:b.array(b.string()).optional(),links:b.array(b.string()).optional(),summary:b.union([b.string(),b.record(b.string(),b.unknown())]).optional(),pagination:Q.optional(),next:b.record(b.string(),E).optional(),warnings:b.array(b.string()).optional()}),Ja=b.object({results:b.array(b.object({id:b.string(),status:b.enum(["empty","error"]).optional(),data:zo}))}).extend(j);import{z as t}from"zod";import{LspGetSemanticsQuerySchema as Tt}from"@octocodeai/octocode-core/schemas";import{ErrorDataSchema as Uo}from"@octocodeai/octocode-core/schemas/outputs";var $o=m(1,1e9).describe("1-based source line for symbol-anchored semantic operations. Get it from search/localSearchCode, structural AST captures, or documentSymbols; never guess."),Vo=m(0,1e5).optional(),Xo=["structured","compact"],Ot={type:t.enum(Xe).default("definition").describe("Semantic operation for local code intelligence. Use after text or structural AST search when you need identity, references, call flow, type relations, hover, symbols, or diagnostics."),symbolName:t.string().min(1).max(1024).optional().describe("Exact bare identifier at the lineHint anchor for symbol operations; workspaceSymbol uses this as the fuzzy project-wide symbol query."),lineHint:$o.optional(),orderHint:Vo,depth:m(0,20).optional(),includeDeclaration:t.boolean().optional().default(!0),page:L,itemsPerPage:m(1,100).optional(),contextLines:m(0,100).optional(),format:t.enum(Xo).optional().default("structured")},Wo=C(Tt,Ot),ve=R(Tt,Ot);var Ie=O(Wo,{maxQueries:5}),St=t.object({line:t.number(),character:t.number()}),Zo=t.object({start:St,end:St}),Jo=t.object({startLine:t.number(),endLine:t.number()}),ae=t.object({uri:t.string(),content:t.string().optional(),displayRange:Jo.optional(),isDefinition:t.boolean().optional()}),ie=t.string(),Ko=t.object({name:t.string(),uri:t.string(),foundAtLine:t.number(),orderHint:t.number().optional()}),Yo=t.object({serverAvailable:t.boolean().optional(),provider:t.string().optional(),source:t.string().optional()}),Rt=t.enum(["unsupportedOperation","symbolNotFound","anchorFailed","noLocations","noReferences","noHover","noCalls","noWorkspaceSymbols","noTypeHierarchy","noDiagnostics"]),U=t.object({category:Rt,reason:t.string()}),en=F,tn=t.object({name:t.string(),kind:t.string(),line:t.number(),character:t.number(),endLine:t.number(),childCount:t.number(),containerName:t.string().optional()}),on=t.string(),wt=t.object({name:t.string(),kind:t.string(),uri:t.string(),line:t.number(),endLine:t.number(),selectionLine:t.number().optional()}),nn=t.string(),rn=t.object({direction:t.enum(["incoming","outgoing"]),item:wt,ranges:t.array(t.object({line:t.number(),character:t.number()})),rangeCount:t.number(),rangeSampleCount:t.number(),contentPreview:t.string().optional()}),an=t.string(),sn=t.object({complete:t.boolean(),truncatedByDepth:t.boolean(),cycleCount:t.number(),failedRequestCount:t.number(),dynamicCallsExcluded:t.literal(!0),stdlibCallsExcluded:t.number().optional()}),cn=t.object({uri:t.string(),count:t.number(),firstLine:t.number(),firstCharacter:t.number(),lines:t.array(t.number()),hasDefinition:t.boolean().optional()}),ln=t.string(),pn=t.discriminatedUnion("kind",[t.object({kind:t.literal("definition"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("typeDefinition"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("implementation"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("references"),locations:t.array(t.union([ae,ie])).optional(),byFile:t.array(t.union([cn,ln])).optional(),totalReferences:t.number(),totalFiles:t.number(),empty:U.optional()}),...["callers","callees","callHierarchy"].map(e=>t.object({kind:t.literal(e),root:t.union([wt,nn]).optional(),direction:t.enum(["incoming","outgoing","both"]),calls:t.array(t.union([rn,an])),incomingCalls:t.number(),outgoingCalls:t.number(),completeness:sn,empty:U.optional()})),t.object({kind:t.literal("hover"),markdown:t.string().optional(),text:t.string().optional(),range:Zo.optional()}),t.object({kind:t.literal("documentSymbols"),symbols:t.array(t.union([tn,on])),totalSymbols:t.number().optional(),topLevelSymbols:t.number().optional(),empty:U.optional()}),t.object({kind:t.literal("workspaceSymbol"),query:t.string(),symbols:t.array(t.unknown()),totalSymbols:t.number(),empty:U.optional()}),t.object({kind:t.literal("typeHierarchy"),direction:t.enum(["supertypes","subtypes"]),root:t.unknown().optional(),items:t.array(t.unknown()),totalItems:t.number(),empty:U.optional()}),t.object({kind:t.literal("diagnostic"),diagnostics:t.array(t.unknown()),totalDiagnostics:t.number(),errorCount:t.number(),warningCount:t.number(),empty:U.optional()}),t.object({kind:t.literal("empty"),category:Rt,reason:t.string()})]),xt=t.object({type:t.string(),uri:t.string(),format:t.enum(["structured","compact"]).optional(),resolvedSymbol:Ko.optional(),lsp:Yo.optional(),payload:pn,pagination:en.optional(),summary:t.record(t.string(),t.unknown()).optional(),warnings:t.array(t.string()).optional(),next:t.record(t.string(),E).optional(),hints:t.array(t.string()).optional()}),si=t.object({base:t.string().optional(),shared:t.record(t.string(),t.union([t.string(),t.number(),t.boolean()])).optional(),results:t.array(t.union([t.object({id:t.string().min(1),status:t.literal("empty"),data:xt}),t.object({id:t.string().min(1),status:t.literal("error"),data:Uo}),t.object({id:t.string().min(1),data:xt})]))});import{z as n}from"zod";var G=["code","content","structure","files","semantics","repositories","packages","pullRequests","commits","diff","research","graph","materialize"],Y=["fixes","dataflow"];import{z as h}from"zod";var Lt=h.enum(["smart","sensitive","insensitive"]),Ct=h.string().max(1e4),un=h.strictObject({id:h.string().optional(),kind:h.literal("text"),value:Ct,case:Lt.optional(),wholeWord:h.boolean().optional()}),mn=h.strictObject({id:h.string().optional(),kind:h.literal("regex"),value:Ct,dialect:h.enum(["rust","pcre2","provider"]).optional(),case:Lt.optional(),wholeWord:h.boolean().optional(),multiline:h.boolean().optional(),dotAll:h.boolean().optional()}),H=h.lazy(()=>h.strictObject({pattern:h.string().optional(),kind:h.string().optional(),inside:H.optional(),has:H.optional(),not:H.optional(),all:h.array(H).optional(),any:h.array(H).optional(),stopBy:h.literal("end").optional()})),qe=h.union([H,h.string().min(1)]),dn=h.strictObject({id:h.string().optional(),kind:h.literal("structural"),lang:h.string().min(1),pattern:h.string().optional(),rule:qe.optional()}),hn=h.strictObject({id:h.string().optional(),kind:h.literal("field"),field:h.enum(["path","basename","extension","size","modified","accessed","empty","permissions","executable","readable","writable","entryType"]),op:h.enum(["=","!=","in","exists","glob","regex",">",">=","<","<=","within","before"]),value:h.unknown().optional()}),$=h.lazy(()=>h.discriminatedUnion("kind",[h.strictObject({kind:h.literal("all"),id:h.string().optional(),of:h.array($).min(1)}),h.strictObject({kind:h.literal("any"),id:h.string().optional(),of:h.array($).min(1)}),h.strictObject({kind:h.literal("not"),id:h.string().optional(),predicate:$}),un,mn,dn,hn]));var je=n.lazy(()=>n.union([n.strictObject({kind:n.literal("local"),path:n.string().min(1)}),n.strictObject({kind:n.literal("github"),repo:n.string().min(1).optional(),owner:n.string().min(1).optional(),ref:n.string().min(1).optional()}),n.strictObject({kind:n.literal("materialized"),localPath:n.string().min(1),source:je.optional()}),n.strictObject({kind:n.literal("npm")})])),Qe=n.union([n.string(),n.array(n.string()).max(100)]),gn=n.strictObject({path:Qe.optional(),language:Qe.optional(),include:n.array(n.string()).max(100).optional(),exclude:n.array(n.string()).max(100).optional(),excludeDir:n.array(n.string()).max(100).optional(),hidden:n.boolean().optional(),noIgnore:n.boolean().optional(),minDepth:n.number().int().min(0).max(64).optional(),maxDepth:n.number().int().min(0).max(64).optional()}).optional(),Et=n.strictObject({mode:n.enum(["never","auto","required"]),strategy:n.enum(["file","tree","subtree","repo"]).optional(),allowFullRepo:n.boolean().optional(),forceRefresh:n.boolean().optional()}),kt=n.strictObject({content:n.strictObject({range:n.strictObject({startLine:n.number().int().min(1).optional(),endLine:n.number().int().min(1).optional(),contextLines:n.number().int().min(0).max(100).optional()}).optional(),match:n.strictObject({text:n.string(),regex:n.boolean().optional(),caseSensitive:n.boolean().optional()}).optional(),contentView:n.enum(["none","standard","symbols","exact","compact"]).transform(e=>e==="exact"?"none":e==="compact"?"standard":e).optional(),charOffset:n.number().int().min(0).max(1e8).optional(),charLength:n.number().int().min(1).max(5e4).optional(),fullContent:n.boolean().optional()}).optional(),tree:n.strictObject({maxDepth:n.number().int().min(0).max(64).optional(),pattern:n.string().optional(),includeSizes:n.boolean().optional(),extensions:n.array(n.string()).optional(),filesOnly:n.boolean().optional(),directoriesOnly:n.boolean().optional(),sortBy:n.enum(["name","size","time","extension"]).optional(),reverse:n.boolean().optional()}).optional()}),Pt=n.strictObject({search:n.strictObject({countLinesPerFile:n.boolean().optional(),countMatchesPerFile:n.boolean().optional(),onlyMatching:n.boolean().optional(),unique:n.boolean().optional(),countUnique:n.boolean().optional(),contextLines:n.number().int().min(0).max(100).optional(),invertMatch:n.boolean().optional(),matchWindow:n.number().int().min(0).optional(),matchContentLength:n.number().int().min(1).optional(),maxMatchesPerFile:n.number().int().min(1).optional(),matchPage:n.number().int().min(1).optional(),sort:n.enum(["relevance","matchCount","path","modified","accessed","created","size","name"]).optional(),sortReverse:n.boolean().optional(),rankingProfile:n.string().optional(),debugRanking:n.boolean().optional()}).optional(),budget:n.strictObject({maxFiles:n.number().int().min(1).optional(),maxCandidates:n.number().int().min(1).optional(),maxBytes:n.number().int().min(1).optional(),maxMaterializedBytes:n.number().int().min(1).optional(),maxPlanNodes:n.number().int().min(1).optional(),maxBooleanExpansion:n.number().int().min(1).optional(),timeoutMs:n.number().int().min(1).optional()}).optional()}),_t=n.enum(["discovery","paginated","detailed"]),At=n.strictObject({schema:n.literal("oql"),id:n.string().optional(),target:n.enum(G),from:je.optional(),scope:gn,where:$.optional(),materialize:Et.optional(),fetch:kt.optional(),select:n.array(n.string()).optional(),view:_t.optional(),controls:Pt.optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),params:n.record(n.string(),n.unknown()).optional(),explain:n.boolean().optional()}),fn=n.strictObject({schema:n.literal("oql"),id:n.string().optional(),queries:n.array(At).min(1).max(5),combine:n.enum(["independent","merge"]).optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),explain:n.boolean().optional()}),wi=n.union([At,fn]),Ft=[...G,...Y],Dt={schema:n.literal("oql").optional(),id:n.string().optional(),mainResearchGoal:n.string().optional(),researchGoal:n.string().optional(),reasoning:n.string().optional()},vt={...Dt,target:n.enum(Ft).optional().describe("REQUIRED unless inferable from sugar (text/regex/pattern/rule/boolean \u2192 code, fetch.content \u2192 content, fetch.tree \u2192 structure). One of the active targets \u2014 run `search --scheme` for the full list and recipes."),from:je.optional().describe('Source. Defaults to local cwd when omitted; use {kind:"github",owner,repo} for remote or {kind:"materialized",localPath} after a fetch/clone.'),where:$.optional().describe("Canonical predicate tree (kind: text | regex | structural | field | all | any | not). Mutually exclusive with the flat shorthand fields (text/regex/pattern/and/or/...): use ONE shape, not both."),materialize:n.union([Et,n.enum(["never","auto","required"])]).optional(),fetch:kt.optional(),select:n.array(n.string()).optional(),view:_t.optional(),controls:Pt.optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),params:n.record(n.string(),n.unknown()).optional(),explain:n.boolean().optional(),repo:n.string().optional(),owner:n.string().optional(),ref:n.string().optional(),path:Qe.optional(),text:n.string().optional().describe("Shorthand text search (\u2192 where.text, target code). Do not combine with a canonical `where`."),regex:n.string().optional(),pattern:n.string().optional().describe("Shorthand AST/structural pattern (\u2192 structural where, target code). A function pattern must match a COMPLETE node \u2014 include return type (e.g. `function $N($$$A): $R { $$$B }`) or use a `rule` for partial/relational matches."),rule:qe.optional(),lang:n.string().optional(),and:n.array(n.unknown()).optional(),or:n.array(n.unknown()).optional(),xor:n.array(n.unknown()).optional(),noneOf:n.array(n.unknown()).optional(),oneOf:n.array(n.unknown()).optional(),invert:n.unknown().optional(),filesOnly:n.boolean().optional(),filesWithoutMatch:n.boolean().optional(),verbose:n.boolean().optional()},It={...vt,target:n.enum(Ft).optional().describe("REQUIRED unless inferable from sugar (text/regex/pattern/rule/boolean \u2192 code, fetch.content \u2192 content, fetch.tree \u2192 structure). One of the active targets \u2014 run `search --scheme` for the full list and recipes. Reserved targets are accepted so the normalizer can return an unsupported-target diagnostic instead of a schema rejection.")},Ge=n.object(It).catchall(n.unknown()),Li=n.object(vt).catchall(n.unknown()),Ci=n.object({...Dt,queries:n.array(n.unknown()).min(1)}).catchall(n.unknown()),He=n.object({...It,queries:n.array(n.unknown()).min(1).max(5).optional(),combine:n.enum(["independent","merge"]).optional()}).catchall(n.unknown());var Qt=["GitHub","Local Code","Package","Other"],jt=new Map([g.GITHUB_SEARCH_CODE,g.GITHUB_SEARCH_REPOSITORIES,g.GITHUB_SEARCH_PULL_REQUESTS,g.GITHUB_FETCH_CONTENT,g.GITHUB_VIEW_REPO_STRUCTURE,g.GITHUB_CLONE_REPO,g.LOCAL_RIPGREP,g.LOCAL_FIND_FILES,g.LOCAL_FETCH_CONTENT,g.LOCAL_VIEW_STRUCTURE,I,g.PACKAGE_SEARCH,...ce()?[W]:[]].map((e,o)=>[e,o])),v=class extends Error{constructor(r,a=[]){super(r);this.details=a;this.name="DirectToolInputError"}details},yn=["id","mainResearchGoal","researchGoal","reasoning"],te=new Set([...yn]),bn=["id","researchGoal","reasoning"],Gt=[{name:"content",type:"Array<{ type: string; text: string }>"},{name:"structuredContent",type:"object",optional:!0},{name:"isError",type:"boolean",optional:!0}],Sn=[{name:g.GITHUB_SEARCH_CODE,schema:de,inputSchema:he},{name:g.GITHUB_FETCH_CONTENT,schema:ue,inputSchema:me},{name:g.GITHUB_VIEW_REPO_STRUCTURE,schema:Se,inputSchema:xe},{name:g.GITHUB_SEARCH_REPOSITORIES,schema:ye,inputSchema:be},{name:g.GITHUB_SEARCH_PULL_REQUESTS,schema:ge,inputSchema:fe},{name:g.PACKAGE_SEARCH,schema:Te,inputSchema:Oe},{name:g.GITHUB_CLONE_REPO,schema:re,inputSchema:pe},{name:g.LOCAL_RIPGREP,schema:_e,inputSchema:Ae},{name:g.LOCAL_VIEW_STRUCTURE,schema:Fe,inputSchema:De},{name:g.LOCAL_FIND_FILES,schema:Ee,inputSchema:ke},{name:g.LOCAL_FETCH_CONTENT,schema:Re,inputSchema:we},{name:I,schema:ve,inputSchema:Ie},...ce()?[{name:W,schema:Ge,inputSchema:He}]:[]];function M(e){return Sn.find(o=>o.name===e)}function ee(e){return e.startsWith("gh")?"GitHub":e.startsWith("local")||e.startsWith("lsp")?"Local Code":e===g.PACKAGE_SEARCH?"Package":"Other"}function $i(e){return[...e].sort((o,r)=>{let a=Qt.indexOf(ee(o)),c=Qt.indexOf(ee(r));if(a!==c)return a-c;let i=jt.get(o)??Number.MAX_SAFE_INTEGER,p=jt.get(r)??Number.MAX_SAFE_INTEGER;return i!==p?i-p:o.localeCompare(r)})}function Vi(e){let o=M(e);if(!o)return"{}";try{return JSON.stringify(qt.toJSONSchema(o.inputSchema,{io:"input"}),null,2)}catch{return JSON.stringify(qt.toJSONSchema(o.schema,{io:"input"}),null,2)}}function Xi(e){return JSON.stringify(e??{},null,2)}function Wi(e){let o=ee(e),r=[...bn];return(o==="GitHub"||o==="Package")&&r.splice(1,0,"mainResearchGoal"),r}function Zi(){return Gt.map(e=>({...e}))}function Ji(){return JSON.stringify(Object.fromEntries(Gt.map(e=>[e.name,e.optional?`${e.type} (optional)`:e.type])),null,2)}function Ki(e,o){return o?.tools?.[e]?.description??e}import{z as xn}from"zod";function se(e){let o=M(e);if(!o)return[];let r=xn.toJSONSchema(o.schema,{io:"input"});if(!V(r))return[];let a=q(r.properties)?r.properties:{},c=new Set(Array.isArray(r.required)?r.required.filter(i=>!te.has(i)&&!Be(a[i])):[]);return Ne(a,c)}function Tn(e){let o=[],r=typeof e.minimum=="number"?e.minimum:void 0,a=typeof e.maximum=="number"?e.maximum:void 0;return r!==void 0&&a!==void 0?o.push(`${r}-${a}`):r!==void 0?o.push(`>=${r}`):a!==void 0&&o.push(`<=${a}`),"default"in e&&o.push(`default ${JSON.stringify(e.default)}`),o.length>0?o.join(", "):void 0}function Me(e){if(Array.isArray(e.enum)&&e.enum.length>0)return`enum(${e.enum.map(String).join(", ")})`;if(e.type==="array"){let r=V(e.items)?e.items:void 0;return`array<${r?Me(r):"value"}>`}let o=Array.isArray(e.anyOf)?e.anyOf:Array.isArray(e.oneOf)?e.oneOf:void 0;if(o){let r=o.filter(V).map(Me).filter(a=>a!=="value");if(r.length>0)return[...new Set(r)].join(" | ")}return Array.isArray(e.type)?e.type.join(" | "):typeof e.type=="string"?e.type:"value"}function Ne(e,o,r=""){let a=[];for(let[c,i]of Object.entries(e)){if(!r&&te.has(c))continue;let p=V(i)?i:{},f=r?`${r}.${c}`:c;if(a.push({name:f,required:o.has(c),type:Me(p),constraints:Tn(p),description:typeof p.description=="string"?p.description:void 0}),q(p.properties)){let A=new Set(Array.isArray(p.required)?p.required.filter(D=>typeof D=="string"?!Be(p.properties?.[D]):!1):[]);a.push(...Ne(p.properties,A,f))}let k=p.type==="array"&&V(p.items)?p.items:void 0;if(k&&q(k.properties)){let A=new Set(Array.isArray(k.required)?k.required.filter(D=>typeof D=="string"?!Be(k.properties?.[D]):!1):[]);a.push(...Ne(k.properties,A,f))}}return a}function Mt(e,o){if(o.startsWith("array<")){let r=o.slice(6,-1);return[Ht(e,r)]}return Ht(e,o)}function Ht(e,o){if(o.startsWith("enum("))return/^enum\(([^,)]+)/.exec(o)?.[1]??e;if(o==="integer"||o==="number")return e==="lineHint"?42:5;if(o==="boolean")return!0;switch(e){case"keywords":case"keywordsToSearch":case"query":case"text":return"runCLI";case"path":return".";case"uri":return"/path/to/file.ts";case"owner":return"bgauryy";case"repo":return"octocode";case"extension":return"ts";case"filename":return"package.json";case"language":return"TypeScript";case"symbolName":return"myFunction";case"name":case"packageName":return"zod";default:return e}}function q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function V(e){return q(e)}function Be(e){return V(e)&&"default"in e}function Nt(e){return e===W?[{label:"local code query",query:{schema:"oql",target:"code",from:{kind:"local",path:"."},where:{kind:"text",value:"executeDirectTool"},view:"discovery",limit:5}}]:e===g.GITHUB_SEARCH_PULL_REQUESTS?[{label:"PR search",query:{type:"prs",owner:"bgauryy",repo:"octocode",keywordsToSearch:["localSearchCode"],concise:!0,limit:5}},{label:"commit history",query:{type:"commits",owner:"bgauryy",repo:"octocode",path:"packages/octocode-tools-core/src",since:"2024-01-01T00:00:00Z",perPage:5}},{label:"releases + latest",query:{type:"releases",owner:"microsoft",repo:"TypeScript",perPage:5}},{label:"issues search",query:{type:"issues",owner:"microsoft",repo:"TypeScript",keywordsToSearch:["crash"],state:"open",concise:!0,limit:5}},{label:"issue detail",query:{type:"issues",owner:"bgauryy",repo:"octocode",issueNumber:443,content:{body:!0,comments:{discussion:!0}}}}]:e===g.GITHUB_SEARCH_CODE?[{label:"path search",query:{keywords:["package.json"],owner:"bgauryy",repo:"octocode",match:"path",concise:!0,limit:5}},{label:"content search",query:{keywords:["localSearchCode"],owner:"bgauryy",repo:"octocode",extension:"ts",limit:5}}]:e===g.GITHUB_SEARCH_REPOSITORIES?[{label:"repository search",query:{keywords:["react"],language:"TypeScript",stars:">1000",concise:!0,limit:5}},{label:"owner repositories",query:{owner:"bgauryy",concise:!0,limit:5}}]:e===g.GITHUB_VIEW_REPO_STRUCTURE?[{label:"repo tree",query:{owner:"bgauryy",repo:"octocode",path:"packages",maxDepth:2,itemsPerPage:50}}]:e===g.GITHUB_CLONE_REPO?[{label:"full repo clone",query:{owner:"bgauryy",repo:"octocode"}},{label:"subtree clone",query:{owner:"bgauryy",repo:"octocode",sparsePath:"packages/octocode-tools-core"}}]:e===g.LOCAL_RIPGREP?[{label:"text search",query:{path:"packages/octocode-tools-core/src",keywords:"buildDirectToolCommandPatterns",maxFiles:20}},{label:"structural code search",query:{path:"packages/octocode-tools-core/src/tools",mode:"structural",pattern:"eval($X)"}}]:e===g.LOCAL_FETCH_CONTENT?[{label:"exact line range",query:{path:"packages/octocode-tools-core/package.json",startLine:1,endLine:30,minify:"none"}},{label:"matched slice",query:{path:"packages/octocode-tools-core/src/tools/directToolCatalog.meta.ts",matchString:"buildKnownDirectToolCommandPatternQueries",contextLines:8,minify:"standard"}}]:e===g.LOCAL_FIND_FILES?[{label:"basename globs",query:{path:"packages/octocode-tools-core",names:["scheme.ts","package.json"],entryType:"f",itemsPerPage:20}},{label:"monorepo path glob",query:{path:".",pathPattern:"packages/*/src/tools/**",entryType:"f",itemsPerPage:20}},{label:"prune build dirs",query:{path:"packages/octocode-tools-core",names:["*.js"],entryType:"f",excludeDir:["node_modules","dist","coverage","out"],itemsPerPage:20}}]:e===g.LOCAL_VIEW_STRUCTURE?[{label:"shallow tree",query:{path:"packages/octocode-tools-core/src/tools",maxDepth:2,itemsPerPage:50}},{label:"files only at depth 1",query:{path:"packages/octocode-engine/src",maxDepth:1,filesOnly:!0,itemsPerPage:100}}]:e===I?[{label:"symbol outline (absolute uri)",query:{uri:"/ABS/packages/octocode-tools-core/src/scheme/pagination.ts",type:"documentSymbols"}},{label:"semantic definition (absolute uri + lineHint)",query:{uri:"/ABS/packages/octocode-tools-core/src/scheme/pagination.ts",type:"definition",symbolName:"buildNextPageContinuation",lineHint:72}}]:[]}function Bt(e,o){return`tools ${e} --queries '${JSON.stringify(o)}'`}function On(e){let o=Nt(e);if(o.length>0)return o.map(a=>({...a,command:Bt(e,a.query)}));let r=Rn(e);return Object.keys(r).length===0?[]:[{label:"schema-derived",query:r,command:Bt(e,r)}]}function ls(e){return On(e)[0]?.query??{}}function Rn(e){if(!M(e))return{};let o=se(e),r=o.filter(i=>!i.name.includes(".")),a=wn(r),c={};for(let i of a)c[i.name]=Mt(i.name,i.type);return e.startsWith("lsp")&&o.some(i=>i.name==="uri")&&(c.uri??="uri"),e===I&&(c.type??="definition",c.symbolName??="symbolName",c.lineHint??=1),c}var zt=4,ze=new Map([["keywords",10],["keywordsToSearch",11],["query",12],["text",13],["packageName",14],["name",15],["uri",20],["type",21],["owner",30],["repo",31],["extension",32],["filename",33],["language",34],["path",40],["target",50],["from",51],["scope",52],["pattern",60],["rule",61],["op",80],["operation",81],["minify",90]]),Ut=new Set(["page","itemsPerPage","limit","matchPage","maxFiles","maxMatchesPerFile","matchContentLength","responseCharLength","responseCharOffset"]);function wn(e){let o=e.filter(i=>i.required),r=new Map;for(let i of o)r.set(i.name,i);let a=e.filter(i=>!i.required&&Ln(i)).sort(Cn),c=Math.max(zt,o.length);for(let i of a){if(r.size>=c)break;r.set(i.name,i)}return r.size>0?[...r.values()]:e.filter(i=>!Ut.has(i.name)).filter(i=>i.type!=="boolean").slice(0,zt)}function Ln(e){return Ut.has(e.name)||e.type==="boolean"?!1:En(e)?ze.has(e.name):!0}function Cn(e,o){let r=ze.get(e.name)??Number.MAX_SAFE_INTEGER,a=ze.get(o.name)??Number.MAX_SAFE_INTEGER;return r!==a?r-a:e.name.localeCompare(o.name)}function En(e){return e.constraints?.includes("default ")===!0}function ds(e,o,r={}){if(typeof o!="string")return null;let a;try{a=JSON.parse(o)}catch{throw new v("Tool input must be valid JSON.")}return kn(e,a,r)}function kn(e,o,r={}){let a=_n(e,o,r),c=M(e);if(!c)throw new v(`Unknown tool: ${e}`);let i=c.inputSchema.safeParse(a);if(!i.success)throw new v("Tool input does not match the expected schema.",Pn(i.error));return i.data}function Pn(e){return e.issues.map(o=>`${o.path.length>0?o.path.join("."):"input"}: ${o.message}`)}function _n(e,o,r){let a=[];if(Array.isArray(o))a=o;else if(q(o)&&Array.isArray(o.queries))a=o.queries;else if(q(o))a=[o];else throw new v('Tool input must be a JSON object, an array of query objects, or { "queries": [...] }.');if(a.length===0)throw new v("At least one query is required.");let c=q(o)&&Array.isArray(o.queries)?Object.fromEntries(Object.entries(o).filter(([p])=>p!=="queries")):{},i=a.map((p,f)=>An(e,f,Qn(e,p,f,r),{sourceLabel:r.sourceLabel}));return{...c,queries:i}}function An(e,o,r,a){let c={...r},i=ee(e),p=a.sourceLabel??"direct tool execution",f=Fn(e,p);return(typeof c.id!="string"||c.id.trim().length===0)&&(c.id=`${e}-${o+1}`),(i==="GitHub"||i==="Package")&&(typeof c.mainResearchGoal!="string"||c.mainResearchGoal.trim().length===0)&&(c.mainResearchGoal=f),(typeof c.researchGoal!="string"||c.researchGoal.trim().length===0)&&(c.researchGoal=f),(typeof c.reasoning!="string"||c.reasoning.trim().length===0)&&(c.reasoning=`Executed via ${p} tool command`),c}function Fn(e,o){return`Execute ${e} via ${o}`}function Dn(e,o){let r=e.length+1,a=o.length+1,c=Array.from({length:r*a},()=>0);for(let i=0;i<r;i++)c[i*a]=i;for(let i=0;i<a;i++)c[i]=i;for(let i=1;i<r;i++)for(let p=1;p<a;p++){let f=e[i-1]===o[p-1]?0:1;c[i*a+p]=Math.min(c[(i-1)*a+p]+1,c[i*a+p-1]+1,c[(i-1)*a+p-1]+f)}return c[r*a-1]}function vn(e,o){let r=e.toLowerCase(),a,c=Number.POSITIVE_INFINITY,i,p=Number.POSITIVE_INFINITY;for(let f of o){let k=f.toLowerCase(),A=Dn(r,k);if(k.includes(r)||r.includes(k)){A<c&&(a=f,c=A);continue}if(r.length<3)continue;let D=Math.max(2,Math.floor(f.length/3));A<=D&&A<p&&(i=f,p=A)}return a??i}var In={ghSearchCode:{keywordsToSearch:"keywords"},ghSearchRepos:{keywordsToSearch:"keywords"},npmSearch:{name:"packageName"},ghViewRepoStructure:{depth:"maxDepth"},lspGetSemantics:{op:"type",line:"lineHint",path:"uri"},localGetFileContent:{filePath:"path"},localSearchCode:{keywordsToSearch:"keywords"}};function qn(e,o){let r=In[e];if(!r)return o;let a;for(let[c,i]of Object.entries(r))c in o&&!(i in o)&&(a??={...o},a[i]=a[c],delete a[c]);return a??o}function Qn(e,o,r,a={}){if(!q(o))throw new v("Tool input must be a JSON object or an array of objects.");let c=qn(e,o),i=new Set([...se(e).filter(k=>!k.name.includes(".")).map(k=>k.name),...te]),p={},f=[];for(let[k,A]of Object.entries(c)){if(i.has(k)){p[k]=A;continue}f.push(k)}if(f.length>0&&i.size>0&&(a.onUnknownFields?.(f,r),a.rejectUnknownFields===!0)){let k=f.map(A=>{let D=vn(A,i);return D?`'${A}' \u2192 did you mean '${D}'?`:""}).filter(Boolean);throw new v(`Unknown field(s): ${f.join(", ")}`,[...k,`Remove unknown field(s) from query ${r+1}: ${f.join(", ")}`,`Run tools ${e} --scheme to see valid fields.`])}return p}var $t={schema:"oql",view:"paginated",page:1,itemsPerPage:25,githubMaterializeMode:"never",textCase:"smart",regexDialectLocal:"rust",regexCase:"smart",contentView:"standard",contentCharLength:2e4,matchContentLength:500,maxPlanNodes:128,maxBooleanExpansion:64,normalCodeContext:2,detailedCodeContext:3,localSearchSort:"relevance",localRankingProfile:"auto"};var X={schema:"oql",description:"octocode search \u2014 typed read-only queries over code, files, symbols, repos, packages, history, diffs, and graph evidence. Think source + answer type + filters + read/output options; use --explain for routing; follow next.* for pages, exact reads, materialization, or proof.",activeTargets:G,reservedTargets:Y,sourceGuide:{local:'from:{kind:"local",path:"./src"}; shorthand: search "term" ./src, search ./src --tree, search file.ts --op documentSymbols. Best for local code/content/files/tree/LSP/diff.',github:'from:{kind:"github",repo:"owner/repo",ref?}; shorthand: search "term" owner/repo, search owner/repo --tree, search owner/repo#123 --target pullRequests. GitHub code is indexed/default-branch scoped; materialize for AST/LSP/local proof.',npm:'from:{kind:"npm"} with target:"packages"; shorthand: search zod --target packages. Use to resolve package metadata and source repo, then continue with GitHub or local/materialized proof.',materialized:'from:{kind:"materialized",localPath:"/abs/path"} after target:"materialize", clone, or cache fetch. Use when a remote repo/subtree must behave like local code.'},plainLanguage:{source:"`from` = where to look: local path, GitHub repo, npm, or a materialized checkout.",answerType:"`target` = what kind of answer you want: code matches, file content, tree, files, symbols, repos, packages, PRs, commits, diffs, research packets, graph proof, or materialization.",filters:"`where` = match/filter conditions for code and file discovery only: text, regex, AST shape, file fields, and boolean combinations.",readOptions:"`fetch` = what to read once you know the file/tree: exact content, compact content, symbol outline, ranges, match slices, or tree depth.",targetOptions:"`params` = options that belong to one answer type, such as LSP operation, PR number, package name, research intent, or graph proof.",output:"`view`, `select`, and `controls` = response shape, projected fields, search tuning, and cost limits.",paging:"`page` + `itemsPerPage` page the target's primary result domain. For code search that may be matched files; per-file match paging uses `controls.search.matchPage` / `--match-page`."},targetDecisionTree:{"find a string/pattern in code":"target:code (shorthand default for text/regex/--pattern/--rule; needs a where filter)","read or slice a known file":"target:content (file positional + --content-view, --start-line/--end-line, or --match-string)","see the file/dir layout":"target:structure (--tree)","find files by name/glob/ext/size/mtime":"target:files (--search path, --name/--ext/--size-greater/--modified-within)","symbol defs/refs/callers/hover":"target:semantics (--op \u2026; local or materialized only)","search GitHub repos":"target:repositories (--stars/--lang/--topic)","resolve an npm package":"target:packages","PR list or deep-read":"target:pullRequests (owner/repo#N)","commit history":"target:commits (--since/--until)","a diff":"target:diff ({prNumber} for a PR patch, {baseRef,headRef,path} for two refs)","dead-code / reachability sweep":'target:research, then upgrade with target:graph proof:"lsp"',"make a remote repo behave like local (AST/LSP/negation)":"target:materialize (or clone / cache fetch)"},agentBestPractices:["Start with cheap orientation: --tree, --search path, --view discovery, or --content-view symbols.","Then narrow and read exact evidence: --match-string, --start-line/--end-line, --char-offset/--char-length, or --content-view none.","Use snippets as discovery only; make decisions from exact content, PR/commit metadata, or LSP/graph proof.","For semantics, run documentSymbols first to get line anchors, then references/callers/hover with symbolName + lineHint.","For GitHub zero rows / providerUnindexed, do NOT claim absence \u2014 follow evidenceSemantics.providerUnindexed (verify path with structure, then materialize a bounded path).","Read evidence.answerReady, evidence.complete, diagnostics, pagination, and next.* before concluding."],quickStart:{"text search (local)":'search "functionName" ./src',"text search (GitHub)":'search "functionName" vercel/next.js',"package lookup (npm)":"search zod --target packages","PR deep read (GitHub)":"search vercel/next.js#1 --target pullRequests --comments --patches","commit history (GitHub)":"search vercel/next.js/packages/next/src --target commits --since 2024-01-01T00:00:00Z","browse a tree (local dir or owner/repo)":"search ./src --tree | search vercel/next.js --tree","read a file (local or owner/repo/path)":"search ./src/index.ts | search vercel/next.js/packages/next/src/server/config.ts","read a remote file (exact)":"search vercel/next.js/README.md --content-view none","semantics (local/materialized)":"search ./src/index.ts --op documentSymbols | search ./src/index.ts --op references --symbol runCLI --line 42","PR diff (GitHub)":"search vercel/next.js#123 --target diff | search vercel/next.js --target diff --pr 123","two-ref / two-file diff":"search src/a.ts src/b.ts --target diff | search owner/repo --target diff --base-ref <sha> --head-ref <sha> --path <file>","structural AST (local \u2014 needs full node shape)":'search --pattern "function $NAME($$$ARGS) { $$$BODY }" ./src --lang ts',"structural AST (GitHub \u2014 clones bounded subtree)":'search --pattern "function $NAME($$$ARGS) { $$$BODY }" vercel/next.js/packages/next/src --lang ts --materialize auto',"GitHub index miss recovery":"search useState packages/next/src --repo vercel/next.js --materialize required | clone vercel/next.js/packages/next/src | cache fetch vercel/next.js packages/next/src --depth tree","dead-code triage (research)":`search --query '{"schema":"oql","target":"research","from":{"kind":"local","path":"./src"},"params":{"intent":"reachability","facets":["symbols","files"]},"itemsPerPage":1,"page":1}'`,"LSP-proven dead symbols (graph)":`search --query '{"schema":"oql","target":"graph","from":{"kind":"local","path":"./src"},"params":{"intent":"reachability","facets":["symbols"],"proof":"lsp","proofLimit":5,"includePackets":true},"page":1,"itemsPerPage":10}'`,"OQL full-schema reference":"search --scheme","routing explanation before running":`search --explain --query '{"target":"code","from":{"kind":"local","path":"./src"},"where":{"kind":"text","value":"term"}}'`},evidenceSemantics:{"answerReady:true":"The envelope answers the query as asked. No required follow-up.","answerReady:false":"Normal, NOT a failure \u2014 the results above are valid; only answerReady:true means no follow-up is needed. Follow next.* for more pages, LSP proof, or content.","complete:false":"Pages/proof/slices may remain. Read diagnostics: non-blocking warnings can still leave usable rows, but deletion/absence claims need the requested scope plus the listed continuations.","kind:proof":"Backend evaluated the request exactly.","kind:partial":"Truncation, pagination, or residual checks remain.","kind:candidate":"Useful evidence, not proof. research/graph are always candidate \u2014 upgrade via next.semantic/search/fetch.","kind:unsupported":"OQL could not safely execute the requested semantics.","proofStatus:confirmed-by-lsp":"LSP refs=0 inside the bounded workspace. Inspect for deletion only after checking entrypoints, framework conventions, dynamic imports, package exports, and scripts.","proofStatus:conflicting-evidence":"LSP refs>0 \u2014 symbol IS retained; check retainedBy before acting.","proofStatus:needs-framework-graph":"Maybe an entrypoint (framework/export/dynamic import) \u2014 LSP alone can't prove reachability.","proofStatus:candidate":`Pre-proof state (no LSP run yet) \u2014 run the row's next.graph (proof:"lsp") to resolve it to confirmed-by-lsp / conflicting-evidence / needs-framework-graph.`,partialParse:"Non-fatal structural-search warning. Some files were not parsed, often because a literal prefilter had no anchor; add a literal/rule or broaden proof before claiming absence.",providerUnindexed:'GitHub provider returned zero rows. This is NOT absence. Verify the path with structure, then use bounded local proof: search "term" path --repo owner/repo --materialize required, clone owner/repo[/path], or cache fetch owner/repo [path] --depth file|tree|clone.'},semanticsGuide:{documentSymbols:"list a file's symbols to get line anchors first (run before references/callers/hover)",references:"all usages of a symbol across the workspace (often includes its declaration)",callers:"incoming calls to a function/method (call sites only) \u2014 narrower than references",hover:"type, signature, and docs at a symbol"},query:{schema:'"oql" (inserted by normalization)',target:G.join(" | "),from:'{ kind:"local", path } | { kind:"github", repo?, owner?, ref? } | { kind:"materialized", localPath, source? } | { kind:"npm" } \u2014 local row.path is relative to from.path; the pre-filled next.fetch carries the resolved ABSOLUTE path, so follow it directly rather than re-joining paths yourself',scope:"{ path?, language?, include?, exclude?, excludeDir?, hidden?, noIgnore?, minDepth?, maxDepth? } \u2014 minDepth/maxDepth bound directory recursion depth (0-64)",where:"filters for code/files only: text | regex | structural | field | all | any | not. To read a matched file slice, use fetch.content.match. For PR/commit text narrowing, use that target params hint.",materialize:'{ mode:"never"|"auto"|"required", strategy?:"file"|"tree"|"subtree"|"repo", allowFullRepo?, forceRefresh? }',fetch:'{ content?: { contentView:"none"|"standard"|"symbols", fullContent?, match?:{text|regex,case?}, range?:{startLine?,endLine?,contextLines?}, charOffset?, charLength? }, tree?:{ maxDepth?, pattern?, includeSizes?, extensions?, filesOnly?, directoriesOnly?, sortBy?:"name"|"size"|"time"|"extension", reverse? } } \u2014 read options for known files/trees; fetch.content.fullContent:true returns the WHOLE file in one shot (lossless, no char-window paging); to read the region around a string, anchor with fetch.content.match (NOT a top-level where, which is code/files only)',params:"target options (validated by OQL for common fields and by the backing tool exhaustively) \u2014 see params hints below",select:"string[] projection of result/continuation fields",view:"discovery | paginated | detailed",controls:'{ search?: { countLinesPerFile?, countMatchesPerFile?, onlyMatching?, unique?, countUnique?, contextLines?, invertMatch?, matchWindow?, matchContentLength?, maxMatchesPerFile?, matchPage?, sort?:"relevance"|"matchCount"|"path"|"modified"|"accessed"|"created"|"size"|"name", sortReverse?, rankingProfile?, debugRanking? }, budget?: { maxFiles?, maxCandidates?, maxBytes?, maxMaterializedBytes?, maxPlanNodes?, maxBooleanExpansion?, timeoutMs? } } \u2014 output/cost controls; sort values "size"/"name" apply to target:"files" only (lowered to localFindFiles sortBy), the rest are code-search sorts',limit:"number \u2014 total result cap where supported. Prefer itemsPerPage for paged research/graph/file-history continuations.",page:"number \u2014 top-level page number for OQL windowing/continuations",itemsPerPage:"number \u2014 page size for the target primary result domain. For code search this may be matched files, not individual matches; per-file match paging uses controls.search.matchPage. Per-target params expose backing-tool sub-pages only (filePage/commentPage/commitPage, etc.).",explain:"boolean"},params:{semantics:'{ type:"definition"|"references"|"callers"|"callees"|"callHierarchy"|"hover"|"documentSymbols"|"typeDefinition"|"implementation"|"workspaceSymbol"|"supertypes"|"subtypes"|"diagnostic", uri?, symbolName?, symbolKind?, lineHint?, orderHint?, depth?, contextLines?, includeDeclaration?, groupByFile?, workspaceRoot?, format? } \u2014 backing tool lspGetSemantics; contextLines adds call-flow snippets; symbolKind filters returned symbol rows after documentSymbols/workspaceSymbol',repositories:"{ keywords?: string[], topicsToSearch?: string[], language?, owner?, stars?, license?, sort?, archived?, limit?, page? } \u2014 backing tool ghSearchRepos; keywords/topicsToSearch are arrays even for one term",packages:'{ packageName?: string | keywords?: string[], mode?:"lean"|"full", page? } \u2014 backing tool npmSearch',pullRequests:'{ state?:"open"|"closed"|"merged", author?, label?, keywordsToSearch?, prNumber?, reviewMode?, filePage?, commentPage?, commitPage?, limit?, page?, matchString?, matchScope?:"body"|"title"|"comments"|"reviews"|"all", content? } \u2014 backing tool ghHistoryResearch; matchString filters fetched PR title/body/comments/reviews per matchScope (default body), not a search-index query \u2014 no match \u2192 zeroMatches',commits:'{ path?, branch?, since?, until?, includeDiff?, limit?, page?, filePage?, itemsPerPage?, matchString? } \u2014 backing tool ghHistoryResearch type:"commits"; matchString filters commit messages; repo/directory diffs page changed files per commit with filePage/itemsPerPage',diff:"{ prNumber, files? } (PR patch via ghHistoryResearch) | { baseRef, headRef, path } (direct two-ref file diff via ghGetFileContent + local line diff); neither shape -> invalidQuery repair",research:`{ goal?, intent?:"general"|"reachability"|"dependencies"|"symbols", facets?:("symbols"|"files"|"dependencies"|"relations")[], mode?:"plan"|"analyze"|"prove", maxFiles? } \u2014 TWO-PHASE: page:1+itemsPerPage:1 \u2192 data.summary (full-scope counts) and may include a bounded first packet page; page:2+ \u2192 data.packets[] continuation pages (candidates w/ retainedBy edges + per-packet next.*). Always evidence:"candidate"/answerReady:false (normal). Follow the row's pre-filled next.graph (proof:"lsp", proofLimit-bounded) to upgrade a page to LSP-proven proofStatus.`,graph:`{ goal?, intent?:"general"|"reachability"|"dependencies"|"symbols", facets?:(\u2026)[], mode?:"plan"|"analyze"|"prove", maxFiles?, subject?, subjectKind?, relation?, verdict?, direction?:"incoming"|"outgoing"|"both", proof?:"none"|"lsp", proofLimit?, includePackets?, includeFacts?, includeEdges? } \u2014 UPGRADE PATH: run a research row's pre-filled next.graph directly. proof:"lsp" sets per-row proofStatus: "confirmed-by-lsp" (refs=0 in bounded workspace; still inspect entrypoints/exports before deletion), "conflicting-evidence" (refs>0 \u2192 retained, check retainedBy), "needs-framework-graph" (maybe an entrypoint). answerReady:false is normal \u2014 follow next.* for more pages/proof.`,materialize:'(no params; no `where`) clone/cache a bounded corpus (from:{kind:"github",repo} + scope.path) and return a stable materialized checkpoint row (localPath/repoRoot/ref/cache/complete) with next.structure/next.files. Use after GitHub providerUnindexed; for CLI alternatives use clone owner/repo[/path] or cache fetch owner/repo [path] --depth file|tree|clone.'},predicates:{text:'{ kind:"text", value, case?, wholeWord? }',regex:'{ kind:"regex", value, dialect?:"rust"|"pcre2"|"provider", case?, wholeWord?, multiline?, dotAll? }',structural:'{ kind:"structural", lang, pattern? | rule? } (exactly one; rule is a JSON object or grep-compatible YAML rule string) \u2014 pattern must match the COMPLETE node, so include the parts the real node has: a fn WITH a return type only matches if the pattern has one too (`function $N($$$A): $R { $$$B }`); omitting it returns 0. Shapes: `function $N($$$A) { $$$B }` (no-return-type fn), `($$$A) => $$$B` (arrow, block+expression), `$F($$$A)` (call), `$O.$M($$$A)` (method). For "find symbol X" the ROBUST form is a rule, not a pattern: `{ kind:"function_declaration", has:{ pattern:"X" } }`. 0 matches + no parse error = pattern shape \u2260 real node (add `: $R`, or switch to a rule). Note: $$$-only patterns skip files with no literal anchor \u2192 low counts; add a literal name or use a regex where.',field:'{ kind:"field", field:"path"|"basename"|"extension"|"size"|"modified"|"accessed"|"empty"|"permissions"|"executable"|"readable"|"writable"|"entryType", op:"="|"!="|"in"|"exists"|"glob"|"regex"|">"|">="|"<"|"<="|"within"|"before", value? } (use symbolic ops like "="; aliases such as "eq" are invalid; there is no "contains" op \u2014 use op:"glob", value:"*term*" or op:"regex"; "within"/"before" compare modified/accessed times; empty/executable/readable/writable are boolean file attributes paired with op:"exists" or op:"=") SCOPE: field predicates evaluate file attributes, so they run on target:"files" (and mixed into files-lane booleans); target:"code" rejects a bare field predicate with unsupportedPredicate \u2014 use text/regex/structural for code content, or target:"files" for file discovery.',boolean:'{ kind:"all"|"any", of: Predicate[] } | { kind:"not", predicate }',booleanSugar:"Top-level sugar keys lower to canonical booleans at normalize time: and:[...]\u2192all, or:[...]\u2192any, noneOf:[...]\u2192not(any), xor:[a,b]\u2192any(all(a,not b),all(not a,b)), oneOf:[...]\u2192exactly-one expansion (bounded by controls.budget.maxBooleanExpansion), invert:true\u2192not(where). Prefer canonical all/any/not in programmatic queries; sugar is for terse hand-written ones."},batch:{queries:"OqlQuery[] (1-5)",combine:"independent | merge"},explainRoutes:{PUSHDOWN:"Backend evaluates this predicate exactly \u2014 good. No residual work.",RESIDUAL:"Backend narrows candidates but OQL must finish evaluation locally.",ROUTE:"OQL must use a different lane, often materialization.",UNSUPPORTED:"OQL cannot execute this predicate safely on the chosen source."},defaults:$t};function jn(){return JSON.stringify(X,null,2)}function Vt(e){let o="shorthand: ",r=e.indexOf(o);if(r===-1)return null;let a=e.slice(r+o.length).trim(),c=a.length,i=a.indexOf(",");i!==-1&&(c=Math.min(c,i));let p=a.search(/\.\s/);return p!==-1&&(c=Math.min(c,p)),a.slice(0,c).trim().replace(/\.$/,"")||null}function Xt(){let e=[],o=new Set;for(let[r,a]of Object.entries(X.targetDecisionTree))for(let c of a.matchAll(/target:"?(\w+)"?/g)){let i=c[1];!i||o.has(i)||(o.add(i),e.push({target:i,task:r}))}for(let r of X.activeTargets)o.has(r)||(o.add(r),e.push({target:r,task:"advanced target; see full schema"}));return e}function Gn(){let e=X,o=["local","github","npm","materialized"],r=["text search (local)","text search (GitHub)","read a remote file (exact)","package lookup (npm)","semantics (local/materialized)"],a=e.quickStart,c=e.agentBestPractices.find(i=>/snippet/i.test(i));return{schema:"oql",kind:"octocode.search.compactScheme",description:e.description,sources:Object.fromEntries(o.map(i=>[i,Vt(e.sourceGuide[i])??"a prior clone / cache fetch / materialize localPath"])),targets:Xt(),recipes:Object.fromEntries(r.map(i=>[i,a[i]]).filter(i=>typeof i[1]=="string")),semantics:e.semanticsGuide,proof:{snippets:c,providerUnindexed:e.evidenceSemantics.providerUnindexed},commands:{explain:"search --explain --query '{...}'",fullSchema:"search --scheme"}}}function Hn(){return JSON.stringify(Gn(),null,2)}function Mn(){let e=X,o=["octocode search \u2014 compact agent guide (full reference: search --scheme)","","SOURCE \u2014 where to look (choose one):"],r=["local","github","npm","materialized"];for(let p of r){let f=Vt(e.sourceGuide[p]);o.push(` ${p.padEnd(13)}${f??"a prior clone / cache fetch / materialize localPath"}`)}o.push("","TARGET \u2014 answer type (--target, or inferred from the args):");for(let{target:p,task:f}of Xt())o.push(` ${p.padEnd(13)}${f}`);o.push("","COMMON RECIPES:");let a=["text search (local)","text search (GitHub)","read a remote file (exact)","package lookup (npm)","semantics (local/materialized)"],c=e.quickStart;for(let p of a){let f=c[p];f&&o.push(` ${f}`)}o.push("","LSP SEMANTICS (run documentSymbols first, then narrow):");for(let[p,f]of Object.entries(e.semanticsGuide))o.push(` ${p.padEnd(16)}${f}`);o.push("","PROOF \u2014 snippets are discovery, not proof:");let i=e.agentBestPractices.find(p=>/snippet/i.test(p));return i&&o.push(` ${i}`),o.push(` ${e.evidenceSemantics.providerUnindexed}`),o.push("","Routing debug: search --explain --query '{...}'","Full schema: search --scheme"),o.join(`
9
- `)}import{completeMetadata as zn}from"@octocodeai/octocode-core";import{completeMetadata as Ue}from"@octocodeai/octocode-core";var Wt=/Default excludeDir skips common generated\/vendor dirs; pass \[\] to search all\./,Nn='Nothing is excluded by default \u2014 pass excludeDir (e.g. ["node_modules","dist","coverage"]) to prune build/vendor dirs.',Zt=/type:"prs" searches PRs; add prNumber to read selected content\. type:"commits" reads owner\/repo\/path history\./,Bn='type:"prs" searches PRs; add prNumber to read selected content. type:"commits" reads owner/repo/path history. type:"issues" searches or reads GitHub issues; add issueNumber to read a specific issue (body + comments). type:"releases" lists repo releases.',$e=null;function Jt(e=Ue){if($e&&e===Ue)return $e;let o=e,r=o.tools?.localFindFiles;r?.description&&Wt.test(r.description)&&(o={...o,tools:{...o.tools,localFindFiles:{...r,description:r.description.replace(Wt,Nn)}}});let a=o.tools?.ghHistoryResearch;return a?.description&&Zt.test(a.description)&&(o={...o,tools:{...o.tools,ghHistoryResearch:{...a,description:a.description.replace(Zt,Bn)}}}),e===Ue&&($e=o),o}var Ve=null;function Un(){return Ve||(Ve=Jt(zn)),Ve}async function $n(){return Un()}export{te as DIRECT_TOOL_AUTO_FILLED_FIELDS,Qt as DIRECT_TOOL_CATEGORIES,Sn as DIRECT_TOOL_DEFINITIONS,v as DirectToolInputError,X as OQL_SCHEMA_DOC,On as buildDirectToolCommandPatterns,ls as buildDirectToolExampleQuery,Mt as buildExampleValue,Ht as buildScalarExampleValue,Ne as collectDisplayFields,Tn as describeSchemaConstraints,Me as describeSchemaType,M as findDirectToolDefinition,Bt as formatDirectToolCommandPattern,Xi as formatDirectToolMetadataSchemaText,Ji as formatDirectToolOutputSchemaText,Vi as formatDirectToolSchemaText,Pn as formatDirectToolValidationIssues,Wi as getDirectToolAutoFilledFields,ee as getDirectToolCategory,Ki as getDirectToolDescription,se as getDirectToolDisplayFields,Zi as getDirectToolOutputFields,Be as hasSchemaDefault,V as isJsonSchemaObject,q as isRecord,$n as loadToolContent,Hn as oqlCompactSchemeJson,Mn as oqlCompactSchemeText,jn as oqlSchemaText,kn as prepareDirectToolInput,ds as prepareDirectToolInputFromJsonText,$i as sortDirectToolNames};
8
+ import{z as qt}from"zod";import{completeMetadata as Kt}from"@octocodeai/octocode-core";var g=Kt.toolNames,I=g.LSP_GET_SEMANTIC_CONTENT,Z="oqlSearch";function ce(e=process.env){let o=e.ENABLE_OQL;return o===void 0?!1:["1","true","yes","on"].includes(o.trim().toLowerCase())}var Xn=new Set([g.LOCAL_RIPGREP,g.LOCAL_FETCH_CONTENT,g.LOCAL_FIND_FILES,g.LOCAL_VIEW_STRUCTURE,I]);var Xe=["definition","references","callers","callees","callHierarchy","hover","documentSymbols","typeDefinition","implementation","workspaceSymbol","supertypes","subtypes","diagnostic"];import{CloneRepoQuerySchema as ao}from"@octocodeai/octocode-core/schemas";import{GitHubCloneRepoOutputSchema as io}from"@octocodeai/octocode-core/schemas/outputs";import{z as ne}from"zod";function m(e,o){return ne.preprocess(r=>typeof r=="number"&&Number.isFinite(r)?Math.min(Math.max(r,e),o):r,ne.number().int().min(e).max(o))}var L=m(1,1e3).optional().default(1),N=m(0,100).optional(),B=m(1,1e9).optional(),eo={responseCharOffset:m(0,1e8).optional().describe("Full-response char offset; re-call with returned value when hasMore."),responseCharLength:m(1,5e4).optional().describe("Full-response char window.")};function O(e,o={}){let{maxQueries:r=5}=o;return ne.object({queries:ne.array(e).min(1).max(r).describe("Parallel queries."),...eo}).superRefine((a,c)=>{let i=new Set;a.queries.forEach((p,f)=>{p&&typeof p=="object"&&"id"in p&&typeof p.id=="string"&&(i.has(p.id)&&c.addIssue({code:"custom",message:`Duplicate query id "${p.id}" at index ${f}`,path:["queries",f,"id"]}),i.add(p.id))})})}import{z as We}from"zod";function to(e,o){return e?.description&&!o.description?o.describe(e.description):o}function Ze(e,o){let r={};for(let[a,c]of Object.entries(o))r[a]=to(e.shape[a],c);return r}function oo(e,o){let r=e;return r.safeExtend?r.safeExtend(o):e.extend(o)}function Je(e,o){if(!o?.length)return e;let r=new Set(o);return We.object(Object.fromEntries(Object.entries(e.shape).filter(([a])=>!r.has(a))))}function R(e,o={},r={}){let a=Je(e,r.omit),c=oo(a,Ze(a,o));return r.strict?c.strict():c}function C(e,o={},r={}){let a=Je(e,r.omit),c=We.object({...a.shape,...Ze(a,o)});return r.strict?c.strict():c}import{z as w}from"zod";import{z as d}from"zod";var F=d.object({currentPage:d.number(),totalPages:d.number(),hasMore:d.boolean(),nextPage:d.number().optional(),pageSize:d.number().optional(),totalItems:d.number().optional(),perPage:d.number().optional(),totalFound:d.number().optional(),returned:d.number().optional(),totalMatches:d.number().optional(),reportedTotalMatches:d.number().optional(),reachableTotalMatches:d.number().optional(),totalMatchesKind:d.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:d.boolean().optional(),totalResults:d.number().optional(),itemsPerPage:d.number().optional()}),z=d.object({charOffset:d.number(),charLength:d.number(),totalChars:d.number(),hasMore:d.boolean(),nextCharOffset:d.number().optional(),currentPage:d.number().optional(),totalPages:d.number().optional(),chunkMode:d.enum(["semantic","char-limit"]).optional()}),E=d.object({tool:d.string(),query:d.record(d.string(),d.unknown()),why:d.string().optional(),confidence:d.enum(["exact","heuristic"]).optional()}),Q=F.extend({filesPerPage:d.number().optional(),entriesPerPage:d.number().optional(),matchesPerPage:d.number().optional(),totalFiles:d.number().optional(),totalEntries:d.number().optional(),totalMatches:d.number().optional(),totalFilesFound:d.number().optional(),nextMatchPage:d.number().optional()});var U=d.object({level:d.enum(["info","warning","error"]),message:d.string(),field:d.string().optional(),code:d.string().optional()});var no=w.object({currentPage:w.number(),totalPages:w.number(),hasMore:w.boolean(),charOffset:w.number(),charLength:w.number(),totalChars:w.number(),nextCharOffset:w.number().optional()}).optional(),P={base:w.string().optional(),shared:w.record(w.string(),w.union([w.string(),w.number(),w.boolean()])).optional(),responsePagination:no};function ro(e){return w.object({id:w.string(),status:w.enum(["empty","error"]).optional(),data:e,diagnostics:w.array(U).optional(),next:w.record(w.string(),E).optional()})}var cr=ro(w.record(w.string(),w.unknown()).optional()),j=P;var re=R(ao),pe=O(re),gr=io.extend(P);import{z as s}from"zod";import{FileContentQuerySchema as Ke}from"@octocodeai/octocode-core/schemas";var so=s.enum(["none","standard","symbols"]).optional().default("standard"),co=s.union([z.extend({nextPage:s.number().optional()}),F.extend({charOffset:s.number().optional(),charLength:s.number().optional(),totalChars:s.number().optional(),nextCharOffset:s.number().optional()})]),lo=s.record(s.string(),E),po=s.object({path:s.string(),content:s.string(),localPath:s.string().optional(),repoRoot:s.string().optional(),contentView:s.enum(["none","standard","symbols"]).optional(),totalLines:s.number().optional(),sourceChars:s.number().optional(),sourceBytes:s.number().optional(),resolvedBranch:s.string().optional(),modified:s.string().optional(),fileSize:s.number().optional(),pagination:co.optional(),next:lo.optional(),isPartial:s.boolean().optional(),startLine:s.number().optional(),endLine:s.number().optional(),matchRanges:s.array(s.object({start:s.number(),end:s.number()})).optional(),lastModified:s.string().optional(),lastModifiedBy:s.string().optional(),warnings:s.array(s.string()).optional(),matchNotFound:s.boolean().optional(),searchedFor:s.string().optional(),cached:s.boolean().optional()}),uo=s.object({path:s.string(),localPath:s.string(),repoRoot:s.string().optional(),fileCount:s.number(),totalSize:s.number(),complete:s.boolean().optional(),directoryEntryCount:s.number().optional(),eligibleFileCount:s.number().optional(),savedFileCount:s.number().optional(),skipped:s.object({nonFile:s.number(),missingDownloadUrl:s.number(),oversized:s.number(),binary:s.number(),fileLimit:s.number(),fetchFailed:s.number(),totalSizeLimit:s.number(),pathTraversal:s.number()}).optional(),limits:s.object({maxDirectoryFiles:s.number(),maxTotalSize:s.number(),maxFileSize:s.number()}).optional(),warnings:s.array(s.string()).optional(),files:s.array(s.object({path:s.string(),size:s.number(),type:s.string()})).optional(),cached:s.boolean().optional(),resolvedBranch:s.string().optional()}),Ye={startLine:B,endLine:B,contextLines:N,charOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional(),minify:so},mo=C(Ke,Ye),ue=R(Ke,Ye),me=O(mo),wr=s.object({base:s.string().optional(),shared:s.record(s.string(),s.union([s.string(),s.number(),s.boolean()])).optional(),responsePagination:P.responsePagination,results:s.array(s.object({id:s.string(),data:s.object({owner:s.string(),repo:s.string(),files:s.array(po).optional(),directories:s.array(uo).optional()}).optional()})),errors:s.array(s.object({id:s.string(),owner:s.string().optional(),repo:s.string().optional(),path:s.string().optional(),error:s.string()})).optional()});import{z as u}from"zod";import{GitHubCodeSearchQuerySchema as et}from"@octocodeai/octocode-core/schemas";var tt={limit:m(1,100).optional(),page:L.default(1),match:u.enum(["file","path"]).default("file").describe('"file" searches file contents and returns snippets with matchIndices. "path" searches only file paths/names \u2014 no snippets, far cheaper; use it to confirm a file exists before reading it. (Unlike ghSearchRepos/ghHistoryResearch, where `match` instead selects which text FIELDS to search \u2014 a different concept sharing this name.)')},de=R(et,tt),he=O(C(et,tt)),ho=F.extend({totalMatchesKind:u.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:u.boolean().optional(),uniqueFileCount:u.number().optional()}),Dr=u.object({base:u.string().optional(),shared:u.record(u.string(),u.union([u.string(),u.number(),u.boolean()])).optional(),responsePagination:P.responsePagination,results:u.array(u.object({id:u.string(),data:u.object({files:u.array(u.union([u.string(),u.object({owner:u.string(),repo:u.string(),path:u.string(),queryId:u.string().optional(),matches:u.array(u.object({value:u.string().optional(),pathOnly:u.boolean().optional(),matchIndices:u.array(u.object({start:u.number(),end:u.number(),lineOffset:u.number()})).optional(),url:u.string().optional()}))})])),pagination:ho.optional()})})),emptyQueries:u.array(u.object({id:u.string(),nonExistentScope:u.literal(!0).optional(),incompleteResults:u.literal(!0).optional()})).optional(),warnings:u.array(u.string()).optional(),diagnostics:u.array(U).optional(),next:u.record(u.string(),E).optional(),errors:u.array(u.object({id:u.string(),error:u.string()})).optional()});import{z as _}from"zod";import{GitHubPullRequestSearchQuerySchema as nt}from"@octocodeai/octocode-core/schemas";import{GitHubSearchPullRequestsOutputSchema as bo}from"@octocodeai/octocode-core/schemas/outputs";var rt={type:_.enum(["prs","commits","releases","issues"]).optional().describe('Research mode: "prs" (default) searches pull requests; "commits" walks commit history for a repo or path; "releases" lists the repository releases (tagName, publishedAt, prerelease flag) and surfaces the latest stable release; "issues" searches or reads GitHub issues (body/discussion comments \u2014 not PRs).'),perPage:m(1,100).optional().default(30),prNumber:m(1,1e9).optional(),issueNumber:m(1,1e9).optional().describe('Issue number for type:"issues" detail mode \u2014 reads that specific issue (body/discussion comments). Requires owner+repo. Falls back to prNumber if omitted.'),limit:m(1,100).optional().default(30),match:_.array(_.enum(["title","body","comments"])).optional().describe('Fields to match keywords against: "title", "body", "comments". Default searches all three. Use ["title"] for the most precise and fastest match. (Unlike ghSearchCode, where `match` instead selects file-contents vs file-paths \u2014 a different concept sharing this name.)'),page:L.default(1),filePage:L.optional(),commentPage:L.optional(),commitPage:L.optional(),itemsPerPage:m(1,100).optional().default(20),charOffset:m(0,1e8).optional(),commentBodyOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional()},So=C(nt,rt),ge=R(nt,rt),fe=O(So),ot=_.union([_.string(),_.object({}).passthrough()]),Br=bo.extend({results:_.array(_.object({id:_.string().optional(),status:_.string().optional(),data:_.object({pull_requests:_.array(ot).optional(),issues:_.array(ot).optional(),next:_.record(_.string(),E).optional()}).passthrough().optional()}).passthrough()).optional(),...P});import{z as S}from"zod";import{GitHubReposSearchSingleQuerySchema as at}from"@octocodeai/octocode-core/schemas";var it={limit:m(1,100).optional(),page:L.default(1),match:S.array(S.enum(["name","description","readme"])).optional().describe("Which text fields to search: name, description, and/or readme. Defaults to name+description; add 'readme' for broader, slower full-text search. (Unlike ghSearchCode, where `match` instead selects file-contents vs file-paths \u2014 a different concept sharing this name.)")},ye=R(at,it),be=O(C(at,it)),xo=S.object({owner:S.string(),repo:S.string(),stars:S.number().optional(),forks:S.number().optional(),openIssuesCount:S.number().optional(),language:S.string().optional(),license:S.string().optional(),description:S.string().optional(),homepage:S.string().optional(),pushedAt:S.string().optional(),createdAt:S.string().optional(),defaultBranch:S.string().optional(),topics:S.array(S.string()).optional(),visibility:S.string().optional(),url:S.string().optional(),updatedAt:S.string().optional()}),To=F.extend({totalMatchesKind:S.enum(["exact","reported","lowerBound"]).optional(),totalMatchesCapped:S.boolean().optional()}).optional(),Oo=S.object({repositories:S.array(S.union([S.string(),xo])).optional(),pagination:To}).passthrough(),Kr=S.object({results:S.array(S.object({id:S.string().optional(),status:S.string().optional(),data:Oo.optional()}).passthrough()).optional()}).extend(P);import{GitHubViewRepoStructureQuerySchema as st}from"@octocodeai/octocode-core/schemas";import{GitHubViewRepoStructureOutputSchema as wo}from"@octocodeai/octocode-core/schemas/outputs";var ct={maxDepth:m(0,20).optional(),page:L.default(1),itemsPerPage:m(1,200).optional()},Se=R(st,ct),xe=O(C(st,ct)),sa=wo.extend(P);import{z as y}from"zod";import{NpmPackageQuerySchema as lt}from"@octocodeai/octocode-core/schemas";var pt={page:L,mode:y.enum(["lean","full"]).optional(),keywords:y.union([y.string(),y.array(y.string())]).optional().describe("Registry keyword query (string; an array of terms is accepted and joined with spaces).")},Te=R(lt,pt),Oe=O(C(lt,pt,{strict:!0}),{maxQueries:5}),ga=y.object({results:y.array(y.looseObject({id:y.string(),data:y.looseObject({packages:y.array(y.object({name:y.string(),version:y.string().optional(),description:y.string().optional(),license:y.string().optional(),downloads:y.number().optional(),repository:y.string().optional(),repositoryDirectory:y.string().optional(),repositoryId:y.string().optional(),next:y.record(y.string(),E).optional(),warnings:y.array(y.string()).optional(),diagnostics:y.array(U).optional()}).passthrough()).optional(),repositories:y.record(y.string(),y.object({repository:y.string(),owner:y.string(),repo:y.string(),repositoryDirectory:y.string().optional(),next:y.record(y.string(),E)}).passthrough()).optional(),pagination:F.optional()}).optional(),status:y.string().optional()})).optional()}).extend(P);import{z as x}from"zod";import{FetchContentQuerySchema as ut}from"@octocodeai/octocode-core/schemas";var Lo=x.enum(["none","standard","symbols"]).optional().default("standard"),mt={startLine:B,endLine:B,contextLines:N.default(5),charOffset:m(0,1e8).optional(),charLength:m(1,5e4).optional(),minify:Lo},Co=C(ut,mt),Re=R(ut,mt),we=O(Co,{maxQueries:5}),Eo=x.object({start:x.number(),end:x.number()}),ko=x.object({path:x.string().optional(),content:x.string().optional(),contentView:x.enum(["none","standard","symbols"]).optional(),totalLines:x.number().optional(),sourceChars:x.number().optional(),sourceBytes:x.number().optional(),startLine:x.number().optional(),endLine:x.number().optional(),isPartial:x.boolean().optional(),matchRanges:x.array(Eo).optional(),pagination:x.union([z.extend({nextBlockChar:x.number().optional()}),F]).optional(),next:x.record(x.string(),E).optional(),modified:x.string().optional(),lastModified:x.string().optional(),lastModifiedBy:x.string().optional(),warnings:x.array(x.string()).optional(),matchNotFound:x.boolean().optional(),searchedFor:x.string().optional()}),wa=x.object({results:x.array(x.object({id:x.string(),status:x.enum(["empty","error"]).optional(),data:ko}))}).extend(j);import{z as T}from"zod";import{FindFilesQuerySchema as Po}from"@octocodeai/octocode-core/schemas";var dt={maxDepth:m(0,100).optional(),minDepth:m(0,100).optional(),limit:m(1,1e4).optional(),page:L.default(1),itemsPerPage:m(1,50).optional(),excludeDir:T.array(T.string()).optional().describe('Directory names to prune from the walk (e.g. ["node_modules","dist","coverage"]). NOTHING is excluded by default \u2014 results include build output and vendor dirs unless you pass this explicitly.')},ht=T.object(Object.fromEntries(Object.entries(Po.shape).filter(([e])=>e!=="regexType")));function _o(e,o){e.minDepth!==void 0&&e.maxDepth!==void 0&&e.minDepth>e.maxDepth&&o.addIssue({code:"custom",message:"minDepth must be less than or equal to maxDepth.",path:["minDepth"]})}var Ao=C(ht,dt),Ee=R(ht,dt).superRefine(_o),ke=O(Ao,{maxQueries:5}),Fo=T.object({name:T.string().optional(),path:T.string().optional(),type:T.enum(["file","dir","directory","link","symlink"]).optional(),size:T.union([T.number(),T.string()]).optional(),sizeFormatted:T.string().optional(),modified:T.string().optional(),accessed:T.string().optional(),created:T.string().optional(),permissions:T.string().optional()}),Do=T.object({path:T.string().optional(),files:T.array(Fo).optional(),summary:T.string().optional(),pagination:Q.optional(),next:T.record(T.string(),E).optional(),warnings:T.array(T.string()).optional()}),Da=T.object({results:T.array(T.object({id:T.string(),status:T.enum(["empty","error"]).optional(),data:Do}))}).extend(j);import{z as l}from"zod";import{RipgrepQuerySchema as gt}from"@octocodeai/octocode-core/schemas";var vo=["paginated","discovery","detailed","structural"],Io=["semanticRanking"],ft={mode:l.enum(vo).optional().default("paginated").describe('"paginated" snippets; "discovery" paths only; "detailed" snippets plus context; "structural" AST/code-shape search with pattern or rule. Structural matches return line/capture anchors that can feed lspGetSemantics when symbol identity matters. (Unrelated to ghHistoryResearch\'s `patches.mode` \u2014 different concepts sharing this name.)'),keywords:l.string().optional().describe("The search pattern (text or regex). Set fixedString:true for a literal match, or perlRegex:true for advanced regex features (lookaheads, backreferences). (Unlike ghSearchCode/ghSearchRepos, where `keywords` is an array of ANDed terms \u2014 this is a single string.)"),filesOnly:l.boolean().optional().describe("Returns matching file paths without line content. Mutually exclusive with filesWithoutMatch. (Unlike localViewStructure's `filesOnly`, which filters a directory listing to file entries only \u2014 a different concept sharing this name.)"),pattern:l.string().optional().describe("Structural only: code-shaped AST pattern with $X (one node) or $$$ARGS (node list). Use this to find syntax shape, then use lspGetSemantics for semantic proof."),rule:l.string().optional().describe("Structural only: YAML ast-grep rule for not/inside/has/all/any. Use for partial or relational AST queries before escalating matched anchors to lspGetSemantics."),contextLines:N,matchContentLength:m(1,1e5).optional().default(500),maxMatchesPerFile:m(1,1e5).optional(),maxFiles:m(1,1e5).optional(),matchPage:L.optional(),itemsPerPage:m(1,1e3).optional(),page:L.default(1),unique:l.boolean().optional().describe("With onlyMatching, return each matched value once per file."),countUnique:l.boolean().optional().describe("With onlyMatching, return each matched value once per file with its frequency.")},qo={...ft,semanticRanking:l.never().optional()},Qo=C(gt,qo),jo=R(gt,ft,{strict:!0,omit:Io}),_e=jo.superRefine((e,o)=>{let r=e;if(r.caseSensitive&&r.caseInsensitive&&o.addIssue({code:"custom",message:"caseSensitive and caseInsensitive are mutually exclusive.",path:["caseSensitive"]}),r.fixedString&&r.perlRegex&&o.addIssue({code:"custom",message:"fixedString and perlRegex are mutually exclusive.",path:["fixedString"]}),r.filesOnly&&r.filesWithoutMatch&&o.addIssue({code:"custom",message:"filesOnly and filesWithoutMatch are mutually exclusive.",path:["filesOnly"]}),r.countLinesPerFile&&r.countMatchesPerFile&&o.addIssue({code:"custom",message:"countLinesPerFile and countMatchesPerFile are mutually exclusive.",path:["countLinesPerFile"]}),r.multilineDotall&&!r.multiline&&o.addIssue({code:"custom",message:"multilineDotall requires multiline=true.",path:["multilineDotall"]}),r.mode==="structural"){for(let a of["unique","countUnique"])r[a]&&o.addIssue({code:"custom",message:`\`${a}\` is not valid with mode:"structural".`,path:[a]});return}r.unique&&!r.onlyMatching&&o.addIssue({code:"custom",message:"unique requires onlyMatching:true.",path:["unique"]}),r.countUnique&&!r.onlyMatching&&o.addIssue({code:"custom",message:"countUnique requires onlyMatching:true.",path:["countUnique"]})}),Ae=O(Qo,{maxQueries:5}),Go=l.object({line:l.number(),endLine:l.number().optional(),value:l.string().optional(),column:l.number().optional(),endColumn:l.number().optional(),count:l.number().optional(),kind:l.string().optional(),scoreHint:l.number().optional(),metavars:l.record(l.string(),l.array(l.string())).optional(),metavarRanges:l.record(l.string(),l.array(l.object({text:l.string(),line:l.number(),column:l.number(),endLine:l.number(),endColumn:l.number()}))).optional()}),Ho=l.object({path:l.string(),matches:l.array(Go).optional(),totalOccurrences:l.number().optional(),totalMatchedLines:l.number().optional(),totalMatchRows:l.number().optional(),returnedMatchRows:l.number().optional(),ranking:l.object({score:l.number(),profile:l.string().optional(),pathRole:l.string().optional(),reasons:l.array(l.string()).optional()}).optional(),matchPagination:Q.optional(),pagination:Q.optional(),next:l.record(l.string(),E).optional()}),Mo=l.object({files:l.array(Ho).optional(),summary:l.string().optional(),searchEngine:l.string().optional(),stats:l.object({totalOccurrences:l.number().optional(),matchedLines:l.number().optional(),filesMatched:l.number().optional(),filesSearched:l.number().optional(),bytesSearched:l.number().optional(),searchTime:l.string().optional()}).passthrough().optional(),pagination:Q.optional(),next:l.record(l.string(),E).optional(),warnings:l.array(l.string()).optional()}),Na=l.object({results:l.array(l.object({id:l.string(),status:l.enum(["empty","error"]).optional(),data:Mo}))}).extend(j);import{z as b}from"zod";import{ViewStructureQuerySchema as yt}from"@octocodeai/octocode-core/schemas";var bt={maxDepth:m(0,20).optional(),limit:m(1,1e4).optional(),page:L.default(1),itemsPerPage:m(1,50).optional(),filesOnly:b.boolean().optional().describe("Returns files only. Mutually exclusive with directoriesOnly. (Unlike localSearchCode's `filesOnly`, which filters search results to matching file paths \u2014 a different concept sharing this name.)")},No=C(yt,bt),Fe=R(yt,bt),De=O(No,{maxQueries:5}),Bo=b.object({name:b.string().optional(),type:b.enum(["file","dir","directory","link","symlink"]),path:b.string().optional(),depth:b.number().optional(),size:b.union([b.number(),b.string()]).optional(),sizeBytes:b.number().optional(),modified:b.string().optional(),permissions:b.string().optional()}),zo=b.object({path:b.string().optional(),entries:b.array(Bo).optional(),files:b.array(b.string()).optional(),folders:b.array(b.string()).optional(),links:b.array(b.string()).optional(),summary:b.union([b.string(),b.record(b.string(),b.unknown())]).optional(),pagination:Q.optional(),next:b.record(b.string(),E).optional(),warnings:b.array(b.string()).optional()}),Ja=b.object({results:b.array(b.object({id:b.string(),status:b.enum(["empty","error"]).optional(),data:zo}))}).extend(j);import{z as t}from"zod";import{LspGetSemanticsQuerySchema as Tt}from"@octocodeai/octocode-core/schemas";import{ErrorDataSchema as Uo}from"@octocodeai/octocode-core/schemas/outputs";var $o=m(1,1e9).describe("1-based source line for symbol-anchored semantic operations. Get it from search/localSearchCode, structural AST captures, or documentSymbols; never guess."),Vo=m(0,1e5).optional(),Xo=["structured","compact"],Ot={type:t.enum(Xe).default("definition").describe("Semantic operation for local code intelligence. Use after text or structural AST search when you need identity, references, call flow, type relations, hover, symbols, or diagnostics."),symbolName:t.string().min(1).max(1024).optional().describe("Exact bare identifier at the lineHint anchor for symbol operations; workspaceSymbol uses this as the fuzzy project-wide symbol query."),lineHint:$o.optional(),orderHint:Vo,depth:m(0,20).optional(),includeDeclaration:t.boolean().optional().default(!0),page:L,itemsPerPage:m(1,100).optional(),contextLines:m(0,100).optional(),format:t.enum(Xo).optional().default("structured")},Wo=C(Tt,Ot),ve=R(Tt,Ot);var Ie=O(Wo,{maxQueries:5}),St=t.object({line:t.number(),character:t.number()}),Zo=t.object({start:St,end:St}),Jo=t.object({startLine:t.number(),endLine:t.number()}),ae=t.object({uri:t.string(),content:t.string().optional(),displayRange:Jo.optional(),isDefinition:t.boolean().optional()}),ie=t.string(),Ko=t.object({name:t.string(),uri:t.string(),foundAtLine:t.number(),orderHint:t.number().optional()}),Yo=t.object({serverAvailable:t.boolean().optional(),provider:t.string().optional(),source:t.string().optional()}),Rt=t.enum(["unsupportedOperation","symbolNotFound","anchorFailed","noLocations","noReferences","noHover","noCalls","noWorkspaceSymbols","noTypeHierarchy","noDiagnostics"]),$=t.object({category:Rt,reason:t.string()}),en=F,tn=t.object({name:t.string(),kind:t.string(),line:t.number(),character:t.number(),endLine:t.number(),childCount:t.number(),containerName:t.string().optional()}),on=t.string(),wt=t.object({name:t.string(),kind:t.string(),uri:t.string(),line:t.number(),endLine:t.number(),selectionLine:t.number().optional()}),nn=t.string(),rn=t.object({direction:t.enum(["incoming","outgoing"]),item:wt,ranges:t.array(t.object({line:t.number(),character:t.number()})),rangeCount:t.number(),rangeSampleCount:t.number(),contentPreview:t.string().optional()}),an=t.string(),sn=t.object({complete:t.boolean(),truncatedByDepth:t.boolean(),cycleCount:t.number(),failedRequestCount:t.number(),dynamicCallsExcluded:t.literal(!0),stdlibCallsExcluded:t.number().optional()}),cn=t.object({uri:t.string(),count:t.number(),firstLine:t.number(),firstCharacter:t.number(),lines:t.array(t.number()),hasDefinition:t.boolean().optional()}),ln=t.string(),pn=t.discriminatedUnion("kind",[t.object({kind:t.literal("definition"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("typeDefinition"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("implementation"),locations:t.array(t.union([ae,ie]))}),t.object({kind:t.literal("references"),locations:t.array(t.union([ae,ie])).optional(),byFile:t.array(t.union([cn,ln])).optional(),totalReferences:t.number(),totalFiles:t.number(),empty:$.optional()}),...["callers","callees","callHierarchy"].map(e=>t.object({kind:t.literal(e),root:t.union([wt,nn]).optional(),direction:t.enum(["incoming","outgoing","both"]),calls:t.array(t.union([rn,an])),incomingCalls:t.number(),outgoingCalls:t.number(),completeness:sn,empty:$.optional()})),t.object({kind:t.literal("hover"),markdown:t.string().optional(),text:t.string().optional(),range:Zo.optional()}),t.object({kind:t.literal("documentSymbols"),symbols:t.array(t.union([tn,on])),totalSymbols:t.number().optional(),topLevelSymbols:t.number().optional(),empty:$.optional()}),t.object({kind:t.literal("workspaceSymbol"),query:t.string(),symbols:t.array(t.unknown()),totalSymbols:t.number(),empty:$.optional()}),t.object({kind:t.literal("typeHierarchy"),direction:t.enum(["supertypes","subtypes"]),root:t.unknown().optional(),items:t.array(t.unknown()),totalItems:t.number(),empty:$.optional()}),t.object({kind:t.literal("diagnostic"),diagnostics:t.array(t.unknown()),totalDiagnostics:t.number(),errorCount:t.number(),warningCount:t.number(),empty:$.optional()}),t.object({kind:t.literal("empty"),category:Rt,reason:t.string()})]),xt=t.object({type:t.string(),uri:t.string(),format:t.enum(["structured","compact"]).optional(),resolvedSymbol:Ko.optional(),lsp:Yo.optional(),payload:pn,pagination:en.optional(),summary:t.record(t.string(),t.unknown()).optional(),warnings:t.array(t.string()).optional(),next:t.record(t.string(),E).optional(),hints:t.array(t.string()).optional()}),si=t.object({base:t.string().optional(),shared:t.record(t.string(),t.union([t.string(),t.number(),t.boolean()])).optional(),responsePagination:z.optional(),results:t.array(t.union([t.object({id:t.string().min(1),status:t.literal("empty"),data:xt}),t.object({id:t.string().min(1),status:t.literal("error"),data:Uo}),t.object({id:t.string().min(1),data:xt})]))});import{z as n}from"zod";var G=["code","content","structure","files","semantics","repositories","packages","pullRequests","commits","diff","research","graph","materialize"],ee=["fixes","dataflow"];import{z as h}from"zod";var Lt=h.enum(["smart","sensitive","insensitive"]),Ct=h.string().max(1e4),un=h.strictObject({id:h.string().optional(),kind:h.literal("text"),value:Ct,case:Lt.optional(),wholeWord:h.boolean().optional()}),mn=h.strictObject({id:h.string().optional(),kind:h.literal("regex"),value:Ct,dialect:h.enum(["rust","pcre2","provider"]).optional(),case:Lt.optional(),wholeWord:h.boolean().optional(),multiline:h.boolean().optional(),dotAll:h.boolean().optional()}),H=h.lazy(()=>h.strictObject({pattern:h.string().optional(),kind:h.string().optional(),inside:H.optional(),has:H.optional(),not:H.optional(),all:h.array(H).optional(),any:h.array(H).optional(),stopBy:h.literal("end").optional()})),qe=h.union([H,h.string().min(1)]),dn=h.strictObject({id:h.string().optional(),kind:h.literal("structural"),lang:h.string().min(1),pattern:h.string().optional(),rule:qe.optional()}),hn=h.strictObject({id:h.string().optional(),kind:h.literal("field"),field:h.enum(["path","basename","extension","size","modified","accessed","empty","permissions","executable","readable","writable","entryType"]),op:h.enum(["=","!=","in","exists","glob","regex",">",">=","<","<=","within","before"]),value:h.unknown().optional()}),V=h.lazy(()=>h.discriminatedUnion("kind",[h.strictObject({kind:h.literal("all"),id:h.string().optional(),of:h.array(V).min(1)}),h.strictObject({kind:h.literal("any"),id:h.string().optional(),of:h.array(V).min(1)}),h.strictObject({kind:h.literal("not"),id:h.string().optional(),predicate:V}),un,mn,dn,hn]));var je=n.lazy(()=>n.union([n.strictObject({kind:n.literal("local"),path:n.string().min(1)}),n.strictObject({kind:n.literal("github"),repo:n.string().min(1).optional(),owner:n.string().min(1).optional(),ref:n.string().min(1).optional()}),n.strictObject({kind:n.literal("materialized"),localPath:n.string().min(1),source:je.optional()}),n.strictObject({kind:n.literal("npm")})])),Qe=n.union([n.string(),n.array(n.string()).max(100)]),gn=n.strictObject({path:Qe.optional(),language:Qe.optional(),include:n.array(n.string()).max(100).optional(),exclude:n.array(n.string()).max(100).optional(),excludeDir:n.array(n.string()).max(100).optional(),hidden:n.boolean().optional(),noIgnore:n.boolean().optional(),minDepth:n.number().int().min(0).max(64).optional(),maxDepth:n.number().int().min(0).max(64).optional()}).optional(),Et=n.strictObject({mode:n.enum(["never","auto","required"]),strategy:n.enum(["file","tree","subtree","repo"]).optional(),allowFullRepo:n.boolean().optional(),forceRefresh:n.boolean().optional()}),kt=n.strictObject({content:n.strictObject({range:n.strictObject({startLine:n.number().int().min(1).optional(),endLine:n.number().int().min(1).optional(),contextLines:n.number().int().min(0).max(100).optional()}).optional(),match:n.strictObject({text:n.string(),regex:n.boolean().optional(),caseSensitive:n.boolean().optional()}).optional(),contentView:n.enum(["none","standard","symbols","exact","compact"]).transform(e=>e==="exact"?"none":e==="compact"?"standard":e).optional(),charOffset:n.number().int().min(0).max(1e8).optional(),charLength:n.number().int().min(1).max(5e4).optional(),fullContent:n.boolean().optional()}).optional(),tree:n.strictObject({maxDepth:n.number().int().min(0).max(64).optional(),pattern:n.string().optional(),includeSizes:n.boolean().optional(),extensions:n.array(n.string()).optional(),filesOnly:n.boolean().optional(),directoriesOnly:n.boolean().optional(),sortBy:n.enum(["name","size","time","extension"]).optional(),reverse:n.boolean().optional()}).optional()}),Pt=n.strictObject({search:n.strictObject({countLinesPerFile:n.boolean().optional(),countMatchesPerFile:n.boolean().optional(),onlyMatching:n.boolean().optional(),unique:n.boolean().optional(),countUnique:n.boolean().optional(),contextLines:n.number().int().min(0).max(100).optional(),invertMatch:n.boolean().optional(),matchWindow:n.number().int().min(0).optional(),matchContentLength:n.number().int().min(1).optional(),maxMatchesPerFile:n.number().int().min(1).optional(),matchPage:n.number().int().min(1).optional(),sort:n.enum(["relevance","matchCount","path","modified","accessed","created","size","name"]).optional(),sortReverse:n.boolean().optional(),rankingProfile:n.string().optional(),debugRanking:n.boolean().optional()}).optional(),budget:n.strictObject({maxFiles:n.number().int().min(1).optional(),maxCandidates:n.number().int().min(1).optional(),maxBytes:n.number().int().min(1).optional(),maxMaterializedBytes:n.number().int().min(1).optional(),maxPlanNodes:n.number().int().min(1).optional(),maxBooleanExpansion:n.number().int().min(1).optional(),timeoutMs:n.number().int().min(1).optional()}).optional()}),_t=n.enum(["discovery","paginated","detailed"]),At=n.strictObject({schema:n.literal("oql"),id:n.string().optional(),target:n.enum(G),from:je.optional(),scope:gn,where:V.optional(),materialize:Et.optional(),fetch:kt.optional(),select:n.array(n.string()).optional(),view:_t.optional(),controls:Pt.optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),params:n.record(n.string(),n.unknown()).optional(),explain:n.boolean().optional()}),fn=n.strictObject({schema:n.literal("oql"),id:n.string().optional(),queries:n.array(At).min(1).max(5),combine:n.enum(["independent","merge"]).optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),explain:n.boolean().optional()}),wi=n.union([At,fn]),Ft=[...G,...ee],Dt={schema:n.literal("oql").optional(),id:n.string().optional(),mainResearchGoal:n.string().optional(),researchGoal:n.string().optional(),reasoning:n.string().optional()},vt={...Dt,target:n.enum(Ft).optional().describe("REQUIRED unless inferable from sugar (text/regex/pattern/rule/boolean \u2192 code, fetch.content \u2192 content, fetch.tree \u2192 structure). One of the active targets \u2014 run `search --scheme` for the full list and recipes."),from:je.optional().describe('Source. Defaults to local cwd when omitted; use {kind:"github",owner,repo} for remote or {kind:"materialized",localPath} after a fetch/clone.'),where:V.optional().describe("Canonical predicate tree (kind: text | regex | structural | field | all | any | not). Mutually exclusive with the flat shorthand fields (text/regex/pattern/and/or/...): use ONE shape, not both."),materialize:n.union([Et,n.enum(["never","auto","required"])]).optional(),fetch:kt.optional(),select:n.array(n.string()).optional(),view:_t.optional(),controls:Pt.optional(),limit:n.number().int().min(1).optional(),page:n.number().int().min(1).optional(),itemsPerPage:n.number().int().min(1).optional(),params:n.record(n.string(),n.unknown()).optional(),explain:n.boolean().optional(),repo:n.string().optional(),owner:n.string().optional(),ref:n.string().optional(),path:Qe.optional(),text:n.string().optional().describe("Shorthand text search (\u2192 where.text, target code). Do not combine with a canonical `where`."),regex:n.string().optional(),pattern:n.string().optional().describe("Shorthand AST/structural pattern (\u2192 structural where, target code). A function pattern must match a COMPLETE node \u2014 include return type (e.g. `function $N($$$A): $R { $$$B }`) or use a `rule` for partial/relational matches."),rule:qe.optional(),lang:n.string().optional(),and:n.array(n.unknown()).optional(),or:n.array(n.unknown()).optional(),xor:n.array(n.unknown()).optional(),noneOf:n.array(n.unknown()).optional(),oneOf:n.array(n.unknown()).optional(),invert:n.unknown().optional(),filesOnly:n.boolean().optional(),filesWithoutMatch:n.boolean().optional(),verbose:n.boolean().optional()},It={...vt,target:n.enum(Ft).optional().describe("REQUIRED unless inferable from sugar (text/regex/pattern/rule/boolean \u2192 code, fetch.content \u2192 content, fetch.tree \u2192 structure). One of the active targets \u2014 run `search --scheme` for the full list and recipes. Reserved targets are accepted so the normalizer can return an unsupported-target diagnostic instead of a schema rejection.")},Ge=n.object(It).catchall(n.unknown()),Li=n.object(vt).catchall(n.unknown()),Ci=n.object({...Dt,queries:n.array(n.unknown()).min(1)}).catchall(n.unknown()),He=n.object({...It,queries:n.array(n.unknown()).min(1).max(5).optional(),combine:n.enum(["independent","merge"]).optional()}).catchall(n.unknown());var Qt=["GitHub","Local Code","Package","Other"],jt=new Map([g.GITHUB_SEARCH_CODE,g.GITHUB_SEARCH_REPOSITORIES,g.GITHUB_SEARCH_PULL_REQUESTS,g.GITHUB_FETCH_CONTENT,g.GITHUB_VIEW_REPO_STRUCTURE,g.GITHUB_CLONE_REPO,g.LOCAL_RIPGREP,g.LOCAL_FIND_FILES,g.LOCAL_FETCH_CONTENT,g.LOCAL_VIEW_STRUCTURE,I,g.PACKAGE_SEARCH,...ce()?[Z]:[]].map((e,o)=>[e,o])),v=class extends Error{constructor(r,a=[]){super(r);this.details=a;this.name="DirectToolInputError"}details},yn=["id","mainResearchGoal","researchGoal","reasoning"],oe=new Set([...yn]),bn=["id","researchGoal","reasoning"],Gt=[{name:"content",type:"Array<{ type: string; text: string }>"},{name:"structuredContent",type:"object",optional:!0},{name:"isError",type:"boolean",optional:!0}],Sn=[{name:g.GITHUB_SEARCH_CODE,schema:de,inputSchema:he},{name:g.GITHUB_FETCH_CONTENT,schema:ue,inputSchema:me},{name:g.GITHUB_VIEW_REPO_STRUCTURE,schema:Se,inputSchema:xe},{name:g.GITHUB_SEARCH_REPOSITORIES,schema:ye,inputSchema:be},{name:g.GITHUB_SEARCH_PULL_REQUESTS,schema:ge,inputSchema:fe},{name:g.PACKAGE_SEARCH,schema:Te,inputSchema:Oe},{name:g.GITHUB_CLONE_REPO,schema:re,inputSchema:pe},{name:g.LOCAL_RIPGREP,schema:_e,inputSchema:Ae},{name:g.LOCAL_VIEW_STRUCTURE,schema:Fe,inputSchema:De},{name:g.LOCAL_FIND_FILES,schema:Ee,inputSchema:ke},{name:g.LOCAL_FETCH_CONTENT,schema:Re,inputSchema:we},{name:I,schema:ve,inputSchema:Ie},...ce()?[{name:Z,schema:Ge,inputSchema:He}]:[]];function M(e){return Sn.find(o=>o.name===e)}function te(e){return e.startsWith("gh")?"GitHub":e.startsWith("local")||e.startsWith("lsp")?"Local Code":e===g.PACKAGE_SEARCH?"Package":"Other"}function $i(e){return[...e].sort((o,r)=>{let a=Qt.indexOf(te(o)),c=Qt.indexOf(te(r));if(a!==c)return a-c;let i=jt.get(o)??Number.MAX_SAFE_INTEGER,p=jt.get(r)??Number.MAX_SAFE_INTEGER;return i!==p?i-p:o.localeCompare(r)})}function Vi(e){let o=M(e);if(!o)return"{}";try{return JSON.stringify(qt.toJSONSchema(o.inputSchema,{io:"input"}),null,2)}catch{return JSON.stringify(qt.toJSONSchema(o.schema,{io:"input"}),null,2)}}function Xi(e){return JSON.stringify(e??{},null,2)}function Wi(e){let o=te(e),r=[...bn];return(o==="GitHub"||o==="Package")&&r.splice(1,0,"mainResearchGoal"),r}function Zi(){return Gt.map(e=>({...e}))}function Ji(){return JSON.stringify(Object.fromEntries(Gt.map(e=>[e.name,e.optional?`${e.type} (optional)`:e.type])),null,2)}function Ki(e,o){return o?.tools?.[e]?.description??e}import{z as xn}from"zod";function se(e){let o=M(e);if(!o)return[];let r=xn.toJSONSchema(o.schema,{io:"input"});if(!X(r))return[];let a=q(r.properties)?r.properties:{},c=new Set(Array.isArray(r.required)?r.required.filter(i=>!oe.has(i)&&!Be(a[i])):[]);return Ne(a,c)}function Tn(e){let o=[],r=typeof e.minimum=="number"?e.minimum:void 0,a=typeof e.maximum=="number"?e.maximum:void 0;return r!==void 0&&a!==void 0?o.push(`${r}-${a}`):r!==void 0?o.push(`>=${r}`):a!==void 0&&o.push(`<=${a}`),"default"in e&&o.push(`default ${JSON.stringify(e.default)}`),o.length>0?o.join(", "):void 0}function Me(e){if(Array.isArray(e.enum)&&e.enum.length>0)return`enum(${e.enum.map(String).join(", ")})`;if(e.type==="array"){let r=X(e.items)?e.items:void 0;return`array<${r?Me(r):"value"}>`}let o=Array.isArray(e.anyOf)?e.anyOf:Array.isArray(e.oneOf)?e.oneOf:void 0;if(o){let r=o.filter(X).map(Me).filter(a=>a!=="value");if(r.length>0)return[...new Set(r)].join(" | ")}return Array.isArray(e.type)?e.type.join(" | "):typeof e.type=="string"?e.type:"value"}function Ne(e,o,r=""){let a=[];for(let[c,i]of Object.entries(e)){if(!r&&oe.has(c))continue;let p=X(i)?i:{},f=r?`${r}.${c}`:c;if(a.push({name:f,required:o.has(c),type:Me(p),constraints:Tn(p),description:typeof p.description=="string"?p.description:void 0}),q(p.properties)){let A=new Set(Array.isArray(p.required)?p.required.filter(D=>typeof D=="string"?!Be(p.properties?.[D]):!1):[]);a.push(...Ne(p.properties,A,f))}let k=p.type==="array"&&X(p.items)?p.items:void 0;if(k&&q(k.properties)){let A=new Set(Array.isArray(k.required)?k.required.filter(D=>typeof D=="string"?!Be(k.properties?.[D]):!1):[]);a.push(...Ne(k.properties,A,f))}}return a}function Mt(e,o){if(o.startsWith("array<")){let r=o.slice(6,-1);return[Ht(e,r)]}return Ht(e,o)}function Ht(e,o){if(o.startsWith("enum("))return/^enum\(([^,)]+)/.exec(o)?.[1]??e;if(o==="integer"||o==="number")return e==="lineHint"?42:5;if(o==="boolean")return!0;switch(e){case"keywords":case"keywordsToSearch":case"query":case"text":return"runCLI";case"path":return".";case"uri":return"/path/to/file.ts";case"owner":return"bgauryy";case"repo":return"octocode";case"extension":return"ts";case"filename":return"package.json";case"language":return"TypeScript";case"symbolName":return"myFunction";case"name":case"packageName":return"zod";default:return e}}function q(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function X(e){return q(e)}function Be(e){return X(e)&&"default"in e}function Nt(e){return e===Z?[{label:"local code query",query:{schema:"oql",target:"code",from:{kind:"local",path:"."},where:{kind:"text",value:"executeDirectTool"},view:"discovery",limit:5}}]:e===g.GITHUB_SEARCH_PULL_REQUESTS?[{label:"PR search",query:{type:"prs",owner:"bgauryy",repo:"octocode",keywordsToSearch:["localSearchCode"],concise:!0,limit:5}},{label:"commit history",query:{type:"commits",owner:"bgauryy",repo:"octocode",path:"packages/octocode-tools-core/src",since:"2024-01-01T00:00:00Z",perPage:5}},{label:"releases + latest",query:{type:"releases",owner:"microsoft",repo:"TypeScript",perPage:5}},{label:"issues search",query:{type:"issues",owner:"microsoft",repo:"TypeScript",keywordsToSearch:["crash"],state:"open",concise:!0,limit:5}},{label:"issue detail",query:{type:"issues",owner:"bgauryy",repo:"octocode",issueNumber:443,content:{body:!0,comments:{discussion:!0}}}}]:e===g.GITHUB_SEARCH_CODE?[{label:"path search",query:{keywords:["package.json"],owner:"bgauryy",repo:"octocode",match:"path",concise:!0,limit:5}},{label:"content search",query:{keywords:["localSearchCode"],owner:"bgauryy",repo:"octocode",extension:"ts",limit:5}}]:e===g.GITHUB_SEARCH_REPOSITORIES?[{label:"repository search",query:{keywords:["react"],language:"TypeScript",stars:">1000",concise:!0,limit:5}},{label:"owner repositories",query:{owner:"bgauryy",concise:!0,limit:5}}]:e===g.GITHUB_VIEW_REPO_STRUCTURE?[{label:"repo tree",query:{owner:"bgauryy",repo:"octocode",path:"packages",maxDepth:2,itemsPerPage:50}}]:e===g.GITHUB_CLONE_REPO?[{label:"full repo clone",query:{owner:"bgauryy",repo:"octocode"}},{label:"subtree clone",query:{owner:"bgauryy",repo:"octocode",sparsePath:"packages/octocode-tools-core"}}]:e===g.LOCAL_RIPGREP?[{label:"text search",query:{path:"packages/octocode-tools-core/src",keywords:"buildDirectToolCommandPatterns",maxFiles:20}},{label:"structural code search",query:{path:"packages/octocode-tools-core/src/tools",mode:"structural",pattern:"eval($X)"}}]:e===g.LOCAL_FETCH_CONTENT?[{label:"exact line range",query:{path:"packages/octocode-tools-core/package.json",startLine:1,endLine:30,minify:"none"}},{label:"matched slice",query:{path:"packages/octocode-tools-core/src/tools/directToolCatalog.meta.ts",matchString:"buildKnownDirectToolCommandPatternQueries",contextLines:8,minify:"standard"}}]:e===g.LOCAL_FIND_FILES?[{label:"basename globs",query:{path:"packages/octocode-tools-core",names:["scheme.ts","package.json"],entryType:"f",itemsPerPage:20}},{label:"monorepo path glob",query:{path:".",pathPattern:"packages/*/src/tools/**",entryType:"f",itemsPerPage:20}},{label:"prune build dirs",query:{path:"packages/octocode-tools-core",names:["*.js"],entryType:"f",excludeDir:["node_modules","dist","coverage","out"],itemsPerPage:20}}]:e===g.LOCAL_VIEW_STRUCTURE?[{label:"shallow tree",query:{path:"packages/octocode-tools-core/src/tools",maxDepth:2,itemsPerPage:50}},{label:"files only at depth 1",query:{path:"packages/octocode-engine/src",maxDepth:1,filesOnly:!0,itemsPerPage:100}}]:e===I?[{label:"symbol outline (absolute uri)",query:{uri:"/ABS/packages/octocode-tools-core/src/scheme/pagination.ts",type:"documentSymbols"}},{label:"semantic definition (absolute uri + lineHint)",query:{uri:"/ABS/packages/octocode-tools-core/src/scheme/pagination.ts",type:"definition",symbolName:"buildNextPageContinuation",lineHint:72}}]:[]}function Bt(e,o){return`tools ${e} --queries '${JSON.stringify(o)}'`}function On(e){let o=Nt(e);if(o.length>0)return o.map(a=>({...a,command:Bt(e,a.query)}));let r=Rn(e);return Object.keys(r).length===0?[]:[{label:"schema-derived",query:r,command:Bt(e,r)}]}function ls(e){return On(e)[0]?.query??{}}function Rn(e){if(!M(e))return{};let o=se(e),r=o.filter(i=>!i.name.includes(".")),a=wn(r),c={};for(let i of a)c[i.name]=Mt(i.name,i.type);return e.startsWith("lsp")&&o.some(i=>i.name==="uri")&&(c.uri??="uri"),e===I&&(c.type??="definition",c.symbolName??="symbolName",c.lineHint??=1),c}var zt=4,ze=new Map([["keywords",10],["keywordsToSearch",11],["query",12],["text",13],["packageName",14],["name",15],["uri",20],["type",21],["owner",30],["repo",31],["extension",32],["filename",33],["language",34],["path",40],["target",50],["from",51],["scope",52],["pattern",60],["rule",61],["op",80],["operation",81],["minify",90]]),Ut=new Set(["page","itemsPerPage","limit","matchPage","maxFiles","maxMatchesPerFile","matchContentLength","responseCharLength","responseCharOffset"]);function wn(e){let o=e.filter(i=>i.required),r=new Map;for(let i of o)r.set(i.name,i);let a=e.filter(i=>!i.required&&Ln(i)).sort(Cn),c=Math.max(zt,o.length);for(let i of a){if(r.size>=c)break;r.set(i.name,i)}return r.size>0?[...r.values()]:e.filter(i=>!Ut.has(i.name)).filter(i=>i.type!=="boolean").slice(0,zt)}function Ln(e){return Ut.has(e.name)||e.type==="boolean"?!1:En(e)?ze.has(e.name):!0}function Cn(e,o){let r=ze.get(e.name)??Number.MAX_SAFE_INTEGER,a=ze.get(o.name)??Number.MAX_SAFE_INTEGER;return r!==a?r-a:e.name.localeCompare(o.name)}function En(e){return e.constraints?.includes("default ")===!0}function ds(e,o,r={}){if(typeof o!="string")return null;let a;try{a=JSON.parse(o)}catch{throw new v("Tool input must be valid JSON.")}return kn(e,a,r)}function kn(e,o,r={}){let a=_n(e,o,r),c=M(e);if(!c)throw new v(`Unknown tool: ${e}`);let i=c.inputSchema.safeParse(a);if(!i.success)throw new v("Tool input does not match the expected schema.",Pn(i.error));return i.data}function Pn(e){return e.issues.map(o=>`${o.path.length>0?o.path.join("."):"input"}: ${o.message}`)}function _n(e,o,r){let a=[];if(Array.isArray(o))a=o;else if(q(o)&&Array.isArray(o.queries))a=o.queries;else if(q(o))a=[o];else throw new v('Tool input must be a JSON object, an array of query objects, or { "queries": [...] }.');if(a.length===0)throw new v("At least one query is required.");let c=q(o)&&Array.isArray(o.queries)?Object.fromEntries(Object.entries(o).filter(([p])=>p!=="queries")):{},i=a.map((p,f)=>An(e,f,Qn(e,p,f,r),{sourceLabel:r.sourceLabel}));return{...c,queries:i}}function An(e,o,r,a){let c={...r},i=te(e),p=a.sourceLabel??"direct tool execution",f=Fn(e,p);return(typeof c.id!="string"||c.id.trim().length===0)&&(c.id=`${e}-${o+1}`),(i==="GitHub"||i==="Package")&&(typeof c.mainResearchGoal!="string"||c.mainResearchGoal.trim().length===0)&&(c.mainResearchGoal=f),(typeof c.researchGoal!="string"||c.researchGoal.trim().length===0)&&(c.researchGoal=f),(typeof c.reasoning!="string"||c.reasoning.trim().length===0)&&(c.reasoning=`Executed via ${p} tool command`),c}function Fn(e,o){return`Execute ${e} via ${o}`}function Dn(e,o){let r=e.length+1,a=o.length+1,c=Array.from({length:r*a},()=>0);for(let i=0;i<r;i++)c[i*a]=i;for(let i=0;i<a;i++)c[i]=i;for(let i=1;i<r;i++)for(let p=1;p<a;p++){let f=e[i-1]===o[p-1]?0:1;c[i*a+p]=Math.min(c[(i-1)*a+p]+1,c[i*a+p-1]+1,c[(i-1)*a+p-1]+f)}return c[r*a-1]}function vn(e,o){let r=e.toLowerCase(),a,c=Number.POSITIVE_INFINITY,i,p=Number.POSITIVE_INFINITY;for(let f of o){let k=f.toLowerCase(),A=Dn(r,k);if(k.includes(r)||r.includes(k)){A<c&&(a=f,c=A);continue}if(r.length<3)continue;let D=Math.max(2,Math.floor(f.length/3));A<=D&&A<p&&(i=f,p=A)}return a??i}var In={ghSearchCode:{keywordsToSearch:"keywords"},ghSearchRepos:{keywordsToSearch:"keywords"},npmSearch:{name:"packageName"},ghViewRepoStructure:{depth:"maxDepth"},lspGetSemantics:{op:"type",line:"lineHint",path:"uri"},localGetFileContent:{filePath:"path"},localSearchCode:{keywordsToSearch:"keywords"}};function qn(e,o){let r=In[e];if(!r)return o;let a;for(let[c,i]of Object.entries(r))c in o&&!(i in o)&&(a??={...o},a[i]=a[c],delete a[c]);return a??o}function Qn(e,o,r,a={}){if(!q(o))throw new v("Tool input must be a JSON object or an array of objects.");let c=qn(e,o),i=new Set([...se(e).filter(k=>!k.name.includes(".")).map(k=>k.name),...oe]),p={},f=[];for(let[k,A]of Object.entries(c)){if(i.has(k)){p[k]=A;continue}f.push(k)}if(f.length>0&&i.size>0&&(a.onUnknownFields?.(f,r),a.rejectUnknownFields===!0)){let k=f.map(A=>{let D=vn(A,i);return D?`'${A}' \u2192 did you mean '${D}'?`:""}).filter(Boolean);throw new v(`Unknown field(s): ${f.join(", ")}`,[...k,`Remove unknown field(s) from query ${r+1}: ${f.join(", ")}`,`Run tools ${e} --scheme to see valid fields.`])}return p}var $t={schema:"oql",view:"paginated",page:1,itemsPerPage:25,githubMaterializeMode:"never",textCase:"smart",regexDialectLocal:"rust",regexCase:"smart",contentView:"standard",contentCharLength:2e4,matchContentLength:500,maxPlanNodes:128,maxBooleanExpansion:64,normalCodeContext:2,detailedCodeContext:3,localSearchSort:"relevance",localRankingProfile:"auto"};var W={schema:"oql",description:"octocode search \u2014 typed read-only queries over code, files, symbols, repos, packages, history, diffs, and graph evidence. Think source + answer type + filters + read/output options; use --explain for routing; follow next.* for pages, exact reads, materialization, or proof.",activeTargets:G,reservedTargets:ee,sourceGuide:{local:'from:{kind:"local",path:"./src"}; shorthand: search "term" ./src, search ./src --tree, search file.ts --op documentSymbols. Best for local code/content/files/tree/LSP/diff.',github:'from:{kind:"github",repo:"owner/repo",ref?}; shorthand: search "term" owner/repo, search owner/repo --tree, search owner/repo#123 --target pullRequests. GitHub code is indexed/default-branch scoped; materialize for AST/LSP/local proof.',npm:'from:{kind:"npm"} with target:"packages"; shorthand: search zod --target packages. Use to resolve package metadata and source repo, then continue with GitHub or local/materialized proof.',materialized:'from:{kind:"materialized",localPath:"/abs/path"} after target:"materialize", clone, or cache fetch. Use when a remote repo/subtree must behave like local code.'},plainLanguage:{source:"`from` = where to look: local path, GitHub repo, npm, or a materialized checkout.",answerType:"`target` = what kind of answer you want: code matches, file content, tree, files, symbols, repos, packages, PRs, commits, diffs, research packets, graph proof, or materialization.",filters:"`where` = match/filter conditions for code and file discovery only: text, regex, AST shape, file fields, and boolean combinations.",readOptions:"`fetch` = what to read once you know the file/tree: exact content, compact content, symbol outline, ranges, match slices, or tree depth.",targetOptions:"`params` = options that belong to one answer type, such as LSP operation, PR number, package name, research intent, or graph proof.",output:"`view`, `select`, and `controls` = response shape, projected fields, search tuning, and cost limits.",paging:"`page` + `itemsPerPage` page the target's primary result domain. For code search that may be matched files; per-file match paging uses `controls.search.matchPage` / `--match-page`."},targetDecisionTree:{"find a string/pattern in code":"target:code (shorthand default for text/regex/--pattern/--rule; needs a where filter)","read or slice a known file":"target:content (file positional + --content-view, --start-line/--end-line, or --match-string)","see the file/dir layout":"target:structure (--tree)","find files by name/glob/ext/size/mtime":"target:files (--search path, --name/--ext/--size-greater/--modified-within)","symbol defs/refs/callers/hover":"target:semantics (--op \u2026; local or materialized only)","search GitHub repos":"target:repositories (--stars/--lang/--topic)","resolve an npm package":"target:packages","PR list or deep-read":"target:pullRequests (owner/repo#N)","commit history":"target:commits (--since/--until)","a diff":"target:diff ({prNumber} for a PR patch, {baseRef,headRef,path} for two refs)","dead-code / reachability sweep":'target:research, then upgrade with target:graph proof:"lsp"',"make a remote repo behave like local (AST/LSP/negation)":"target:materialize (or clone / cache fetch)"},agentBestPractices:["Start with cheap orientation: --tree, --search path, --view discovery, or --content-view symbols.","Then narrow and read exact evidence: --match-string, --start-line/--end-line, --char-offset/--char-length, or --content-view none.","Use snippets as discovery only; make decisions from exact content, PR/commit metadata, or LSP/graph proof.","For semantics, run documentSymbols first to get line anchors, then references/callers/hover with symbolName + lineHint.","For GitHub zero rows / providerUnindexed, do NOT claim absence \u2014 follow evidenceSemantics.providerUnindexed (verify path with structure, then materialize a bounded path).","Read evidence.answerReady, evidence.complete, diagnostics, pagination, and next.* before concluding."],quickStart:{"text search (local)":'search "functionName" ./src',"text search (GitHub)":'search "functionName" vercel/next.js',"package lookup (npm)":"search zod --target packages","PR deep read (GitHub)":"search vercel/next.js#1 --target pullRequests --comments --patches","commit history (GitHub)":"search vercel/next.js/packages/next/src --target commits --since 2024-01-01T00:00:00Z","browse a tree (local dir or owner/repo)":"search ./src --tree | search vercel/next.js --tree","read a file (local or owner/repo/path)":"search ./src/index.ts | search vercel/next.js/packages/next/src/server/config.ts","read a remote file (exact)":"search vercel/next.js/README.md --content-view none","semantics (local/materialized)":"search ./src/index.ts --op documentSymbols | search ./src/index.ts --op references --symbol runCLI --line 42","PR diff (GitHub)":"search vercel/next.js#123 --target diff | search vercel/next.js --target diff --pr 123","two-ref / two-file diff":"search src/a.ts src/b.ts --target diff | search owner/repo --target diff --base-ref <sha> --head-ref <sha> --path <file>","structural AST (local \u2014 needs full node shape)":'search --pattern "function $NAME($$$ARGS) { $$$BODY }" ./src --lang ts',"structural AST (GitHub \u2014 clones bounded subtree)":'search --pattern "function $NAME($$$ARGS) { $$$BODY }" vercel/next.js/packages/next/src --lang ts --materialize auto',"GitHub index miss recovery":"search useState packages/next/src --repo vercel/next.js --materialize required | clone vercel/next.js/packages/next/src | cache fetch vercel/next.js packages/next/src --depth tree","dead-code triage (research)":`search --query '{"schema":"oql","target":"research","from":{"kind":"local","path":"./src"},"params":{"intent":"reachability","facets":["symbols","files"]},"itemsPerPage":1,"page":1}'`,"LSP-proven dead symbols (graph)":`search --query '{"schema":"oql","target":"graph","from":{"kind":"local","path":"./src"},"params":{"intent":"reachability","facets":["symbols"],"proof":"lsp","proofLimit":5,"includePackets":true},"page":1,"itemsPerPage":10}'`,"OQL full-schema reference":"search --scheme","routing explanation before running":`search --explain --query '{"target":"code","from":{"kind":"local","path":"./src"},"where":{"kind":"text","value":"term"}}'`},evidenceSemantics:{"answerReady:true":"The envelope answers the query as asked. No required follow-up.","answerReady:false":"Normal, NOT a failure \u2014 the results above are valid; only answerReady:true means no follow-up is needed. Follow next.* for more pages, LSP proof, or content.","complete:false":"Pages/proof/slices may remain. Read diagnostics: non-blocking warnings can still leave usable rows, but deletion/absence claims need the requested scope plus the listed continuations.","kind:proof":"Backend evaluated the request exactly.","kind:partial":"Truncation, pagination, or residual checks remain.","kind:candidate":"Useful evidence, not proof. research/graph are always candidate \u2014 upgrade via next.semantic/search/fetch.","kind:unsupported":"OQL could not safely execute the requested semantics.","proofStatus:confirmed-by-lsp":"LSP refs=0 inside the bounded workspace. Inspect for deletion only after checking entrypoints, framework conventions, dynamic imports, package exports, and scripts.","proofStatus:conflicting-evidence":"LSP refs>0 \u2014 symbol IS retained; check retainedBy before acting.","proofStatus:needs-framework-graph":"Maybe an entrypoint (framework/export/dynamic import) \u2014 LSP alone can't prove reachability.","proofStatus:candidate":`Pre-proof state (no LSP run yet) \u2014 run the row's next.graph (proof:"lsp") to resolve it to confirmed-by-lsp / conflicting-evidence / needs-framework-graph.`,partialParse:"Non-fatal structural-search warning. Some files were not parsed, often because a literal prefilter had no anchor; add a literal/rule or broaden proof before claiming absence.",providerUnindexed:'GitHub provider returned zero rows. This is NOT absence. Verify the path with structure, then use bounded local proof: search "term" path --repo owner/repo --materialize required, clone owner/repo[/path], or cache fetch owner/repo [path] --depth file|tree|clone.'},semanticsGuide:{documentSymbols:"list a file's symbols to get line anchors first (run before references/callers/hover)",references:"all usages of a symbol across the workspace (often includes its declaration)",callers:"incoming calls to a function/method (call sites only) \u2014 narrower than references",hover:"type, signature, and docs at a symbol"},query:{schema:'"oql" (inserted by normalization)',target:G.join(" | "),from:'{ kind:"local", path } | { kind:"github", repo?, owner?, ref? } | { kind:"materialized", localPath, source? } | { kind:"npm" } \u2014 local row.path is relative to from.path; the pre-filled next.fetch carries the resolved ABSOLUTE path, so follow it directly rather than re-joining paths yourself',scope:"{ path?, language?, include?, exclude?, excludeDir?, hidden?, noIgnore?, minDepth?, maxDepth? } \u2014 minDepth/maxDepth bound directory recursion depth (0-64)",where:"filters for code/files only: text | regex | structural | field | all | any | not. To read a matched file slice, use fetch.content.match. For PR/commit text narrowing, use that target params hint.",materialize:'{ mode:"never"|"auto"|"required", strategy?:"file"|"tree"|"subtree"|"repo", allowFullRepo?, forceRefresh? }',fetch:'{ content?: { contentView:"none"|"standard"|"symbols", fullContent?, match?:{text|regex,case?}, range?:{startLine?,endLine?,contextLines?}, charOffset?, charLength? }, tree?:{ maxDepth?, pattern?, includeSizes?, extensions?, filesOnly?, directoriesOnly?, sortBy?:"name"|"size"|"time"|"extension", reverse? } } \u2014 read options for known files/trees; fetch.content.fullContent:true returns the WHOLE file in one shot (lossless, no char-window paging); to read the region around a string, anchor with fetch.content.match (NOT a top-level where, which is code/files only)',params:"target options (validated by OQL for common fields and by the backing tool exhaustively) \u2014 see params hints below",select:"string[] projection of result/continuation fields",view:"discovery | paginated | detailed",controls:'{ search?: { countLinesPerFile?, countMatchesPerFile?, onlyMatching?, unique?, countUnique?, contextLines?, invertMatch?, matchWindow?, matchContentLength?, maxMatchesPerFile?, matchPage?, sort?:"relevance"|"matchCount"|"path"|"modified"|"accessed"|"created"|"size"|"name", sortReverse?, rankingProfile?, debugRanking? }, budget?: { maxFiles?, maxCandidates?, maxBytes?, maxMaterializedBytes?, maxPlanNodes?, maxBooleanExpansion?, timeoutMs? } } \u2014 output/cost controls; sort values "size"/"name" apply to target:"files" only (lowered to localFindFiles sortBy), the rest are code-search sorts',limit:"number \u2014 total result cap where supported. Prefer itemsPerPage for paged research/graph/file-history continuations.",page:"number \u2014 top-level page number for OQL windowing/continuations",itemsPerPage:"number \u2014 page size for the target primary result domain. For code search this may be matched files, not individual matches; per-file match paging uses controls.search.matchPage. Per-target params expose backing-tool sub-pages only (filePage/commentPage/commitPage, etc.).",explain:"boolean"},params:{semantics:'{ type:"definition"|"references"|"callers"|"callees"|"callHierarchy"|"hover"|"documentSymbols"|"typeDefinition"|"implementation"|"workspaceSymbol"|"supertypes"|"subtypes"|"diagnostic", uri?, symbolName?, symbolKind?, lineHint?, orderHint?, depth?, contextLines?, includeDeclaration?, groupByFile?, workspaceRoot?, format? } \u2014 backing tool lspGetSemantics; contextLines adds call-flow snippets; symbolKind filters returned symbol rows after documentSymbols/workspaceSymbol',repositories:"{ keywords?: string[], topicsToSearch?: string[], language?, owner?, stars?, license?, sort?, archived?, limit?, page? } \u2014 backing tool ghSearchRepos; keywords/topicsToSearch are arrays even for one term",packages:'{ packageName?: string | keywords?: string[], mode?:"lean"|"full", page? } \u2014 backing tool npmSearch',pullRequests:'{ state?:"open"|"closed"|"merged", author?, label?, keywordsToSearch?, prNumber?, reviewMode?, filePage?, commentPage?, commitPage?, limit?, page?, matchString?, matchScope?:"body"|"title"|"comments"|"reviews"|"all", content? } \u2014 backing tool ghHistoryResearch; matchString filters fetched PR title/body/comments/reviews per matchScope (default body), not a search-index query \u2014 no match \u2192 zeroMatches',commits:'{ path?, branch?, since?, until?, includeDiff?, limit?, page?, filePage?, itemsPerPage?, matchString? } \u2014 backing tool ghHistoryResearch type:"commits"; matchString filters commit messages; repo/directory diffs page changed files per commit with filePage/itemsPerPage',diff:"{ prNumber, files? } (PR patch via ghHistoryResearch) | { baseRef, headRef, path } (direct two-ref file diff via ghGetFileContent + local line diff); neither shape -> invalidQuery repair",research:`{ goal?, intent?:"general"|"reachability"|"dependencies"|"symbols", facets?:("symbols"|"files"|"dependencies"|"relations")[], mode?:"plan"|"analyze"|"prove", maxFiles? } \u2014 TWO-PHASE: page:1+itemsPerPage:1 \u2192 data.summary (full-scope counts) and may include a bounded first packet page; page:2+ \u2192 data.packets[] continuation pages (candidates w/ retainedBy edges + per-packet next.*). Always evidence:"candidate"/answerReady:false (normal). Follow the row's pre-filled next.graph (proof:"lsp", proofLimit-bounded) to upgrade a page to LSP-proven proofStatus.`,graph:`{ goal?, intent?:"general"|"reachability"|"dependencies"|"symbols", facets?:(\u2026)[], mode?:"plan"|"analyze"|"prove", maxFiles?, subject?, subjectKind?, relation?, verdict?, direction?:"incoming"|"outgoing"|"both", proof?:"none"|"lsp", proofLimit?, includePackets?, includeFacts?, includeEdges? } \u2014 UPGRADE PATH: run a research row's pre-filled next.graph directly. proof:"lsp" sets per-row proofStatus: "confirmed-by-lsp" (refs=0 in bounded workspace; still inspect entrypoints/exports before deletion), "conflicting-evidence" (refs>0 \u2192 retained, check retainedBy), "needs-framework-graph" (maybe an entrypoint). answerReady:false is normal \u2014 follow next.* for more pages/proof.`,materialize:'(no params; no `where`) clone/cache a bounded corpus (from:{kind:"github",repo} + scope.path) and return a stable materialized checkpoint row (localPath/repoRoot/ref/cache/complete) with next.structure/next.files. Use after GitHub providerUnindexed; for CLI alternatives use clone owner/repo[/path] or cache fetch owner/repo [path] --depth file|tree|clone.'},predicates:{text:'{ kind:"text", value, case?, wholeWord? }',regex:'{ kind:"regex", value, dialect?:"rust"|"pcre2"|"provider", case?, wholeWord?, multiline?, dotAll? }',structural:'{ kind:"structural", lang, pattern? | rule? } (exactly one; rule is a JSON object or grep-compatible YAML rule string) \u2014 pattern must match the COMPLETE node, so include the parts the real node has: a fn WITH a return type only matches if the pattern has one too (`function $N($$$A): $R { $$$B }`); omitting it returns 0. Shapes: `function $N($$$A) { $$$B }` (no-return-type fn), `($$$A) => $$$B` (arrow, block+expression), `$F($$$A)` (call), `$O.$M($$$A)` (method). For "find symbol X" the ROBUST form is a rule, not a pattern: `{ kind:"function_declaration", has:{ pattern:"X" } }`. 0 matches + no parse error = pattern shape \u2260 real node (add `: $R`, or switch to a rule). Note: $$$-only patterns skip files with no literal anchor \u2192 low counts; add a literal name or use a regex where.',field:'{ kind:"field", field:"path"|"basename"|"extension"|"size"|"modified"|"accessed"|"empty"|"permissions"|"executable"|"readable"|"writable"|"entryType", op:"="|"!="|"in"|"exists"|"glob"|"regex"|">"|">="|"<"|"<="|"within"|"before", value? } (use symbolic ops like "="; aliases such as "eq" are invalid; there is no "contains" op \u2014 use op:"glob", value:"*term*" or op:"regex"; "within"/"before" compare modified/accessed times; empty/executable/readable/writable are boolean file attributes paired with op:"exists" or op:"=") SCOPE: field predicates evaluate file attributes, so they run on target:"files" (and mixed into files-lane booleans); target:"code" rejects a bare field predicate with unsupportedPredicate \u2014 use text/regex/structural for code content, or target:"files" for file discovery.',boolean:'{ kind:"all"|"any", of: Predicate[] } | { kind:"not", predicate }',booleanSugar:"Top-level sugar keys lower to canonical booleans at normalize time: and:[...]\u2192all, or:[...]\u2192any, noneOf:[...]\u2192not(any), xor:[a,b]\u2192any(all(a,not b),all(not a,b)), oneOf:[...]\u2192exactly-one expansion (bounded by controls.budget.maxBooleanExpansion), invert:true\u2192not(where). Prefer canonical all/any/not in programmatic queries; sugar is for terse hand-written ones."},batch:{queries:"OqlQuery[] (1-5)",combine:"independent | merge"},explainRoutes:{PUSHDOWN:"Backend evaluates this predicate exactly \u2014 good. No residual work.",RESIDUAL:"Backend narrows candidates but OQL must finish evaluation locally.",ROUTE:"OQL must use a different lane, often materialization.",UNSUPPORTED:"OQL cannot execute this predicate safely on the chosen source."},defaults:$t};function jn(){return JSON.stringify(W,null,2)}function Vt(e){let o="shorthand: ",r=e.indexOf(o);if(r===-1)return null;let a=e.slice(r+o.length).trim(),c=a.length,i=a.indexOf(",");i!==-1&&(c=Math.min(c,i));let p=a.search(/\.\s/);return p!==-1&&(c=Math.min(c,p)),a.slice(0,c).trim().replace(/\.$/,"")||null}function Xt(){let e=[],o=new Set;for(let[r,a]of Object.entries(W.targetDecisionTree))for(let c of a.matchAll(/target:"?(\w+)"?/g)){let i=c[1];!i||o.has(i)||(o.add(i),e.push({target:i,task:r}))}for(let r of W.activeTargets)o.has(r)||(o.add(r),e.push({target:r,task:"advanced target; see full schema"}));return e}function Gn(){let e=W,o=["local","github","npm","materialized"],r=["text search (local)","text search (GitHub)","read a remote file (exact)","package lookup (npm)","semantics (local/materialized)"],a=e.quickStart,c=e.agentBestPractices.find(i=>/snippet/i.test(i));return{schema:"oql",kind:"octocode.search.compactScheme",description:e.description,sources:Object.fromEntries(o.map(i=>[i,Vt(e.sourceGuide[i])??"a prior clone / cache fetch / materialize localPath"])),targets:Xt(),recipes:Object.fromEntries(r.map(i=>[i,a[i]]).filter(i=>typeof i[1]=="string")),semantics:e.semanticsGuide,proof:{snippets:c,providerUnindexed:e.evidenceSemantics.providerUnindexed},commands:{explain:"search --explain --query '{...}'",fullSchema:"search --scheme"}}}function Hn(){return JSON.stringify(Gn(),null,2)}function Mn(){let e=W,o=["octocode search \u2014 compact agent guide (full reference: search --scheme)","","SOURCE \u2014 where to look (choose one):"],r=["local","github","npm","materialized"];for(let p of r){let f=Vt(e.sourceGuide[p]);o.push(` ${p.padEnd(13)}${f??"a prior clone / cache fetch / materialize localPath"}`)}o.push("","TARGET \u2014 answer type (--target, or inferred from the args):");for(let{target:p,task:f}of Xt())o.push(` ${p.padEnd(13)}${f}`);o.push("","COMMON RECIPES:");let a=["text search (local)","text search (GitHub)","read a remote file (exact)","package lookup (npm)","semantics (local/materialized)"],c=e.quickStart;for(let p of a){let f=c[p];f&&o.push(` ${f}`)}o.push("","LSP SEMANTICS (run documentSymbols first, then narrow):");for(let[p,f]of Object.entries(e.semanticsGuide))o.push(` ${p.padEnd(16)}${f}`);o.push("","PROOF \u2014 snippets are discovery, not proof:");let i=e.agentBestPractices.find(p=>/snippet/i.test(p));return i&&o.push(` ${i}`),o.push(` ${e.evidenceSemantics.providerUnindexed}`),o.push("","Routing debug: search --explain --query '{...}'","Full schema: search --scheme"),o.join(`
9
+ `)}import{completeMetadata as zn}from"@octocodeai/octocode-core";import{completeMetadata as Ue}from"@octocodeai/octocode-core";var Wt=/Default excludeDir skips common generated\/vendor dirs; pass \[\] to search all\./,Nn='Nothing is excluded by default \u2014 pass excludeDir (e.g. ["node_modules","dist","coverage"]) to prune build/vendor dirs.',Zt=/type:"prs" searches PRs; add prNumber to read selected content\. type:"commits" reads owner\/repo\/path history\./,Bn='type:"prs" searches PRs; add prNumber to read selected content. type:"commits" reads owner/repo/path history. type:"issues" searches or reads GitHub issues; add issueNumber to read a specific issue (body + comments). type:"releases" lists repo releases.',$e=null;function Jt(e=Ue){if($e&&e===Ue)return $e;let o=e,r=o.tools?.localFindFiles;r?.description&&Wt.test(r.description)&&(o={...o,tools:{...o.tools,localFindFiles:{...r,description:r.description.replace(Wt,Nn)}}});let a=o.tools?.ghHistoryResearch;return a?.description&&Zt.test(a.description)&&(o={...o,tools:{...o.tools,ghHistoryResearch:{...a,description:a.description.replace(Zt,Bn)}}}),e===Ue&&($e=o),o}var Ve=null;function Un(){return Ve||(Ve=Jt(zn)),Ve}async function $n(){return Un()}export{oe as DIRECT_TOOL_AUTO_FILLED_FIELDS,Qt as DIRECT_TOOL_CATEGORIES,Sn as DIRECT_TOOL_DEFINITIONS,v as DirectToolInputError,W as OQL_SCHEMA_DOC,On as buildDirectToolCommandPatterns,ls as buildDirectToolExampleQuery,Mt as buildExampleValue,Ht as buildScalarExampleValue,Ne as collectDisplayFields,Tn as describeSchemaConstraints,Me as describeSchemaType,M as findDirectToolDefinition,Bt as formatDirectToolCommandPattern,Xi as formatDirectToolMetadataSchemaText,Ji as formatDirectToolOutputSchemaText,Vi as formatDirectToolSchemaText,Pn as formatDirectToolValidationIssues,Wi as getDirectToolAutoFilledFields,te as getDirectToolCategory,Ki as getDirectToolDescription,se as getDirectToolDisplayFields,Zi as getDirectToolOutputFields,Be as hasSchemaDefault,X as isJsonSchemaObject,q as isRecord,$n as loadToolContent,Hn as oqlCompactSchemeJson,Mn as oqlCompactSchemeText,jn as oqlSchemaText,kn as prepareDirectToolInput,ds as prepareDirectToolInputFromJsonText,$i as sortDirectToolNames};
@@ -108,17 +108,15 @@ export declare const GitHubFetchContentOutputLocalSchema: z.ZodObject<{
108
108
  totalChars: z.ZodOptional<z.ZodNumber>;
109
109
  nextCharOffset: z.ZodOptional<z.ZodNumber>;
110
110
  }, z.core.$strip>]>>;
111
- next: z.ZodOptional<z.ZodObject<{
112
- continueChars: z.ZodOptional<z.ZodObject<{
113
- query: z.ZodRecord<z.ZodString, z.ZodUnknown>;
114
- why: z.ZodOptional<z.ZodString>;
115
- confidence: z.ZodOptional<z.ZodEnum<{
116
- exact: "exact";
117
- heuristic: "heuristic";
118
- }>>;
119
- tool: z.ZodLiteral<"ghGetFileContent">;
120
- }, z.core.$strip>>;
121
- }, z.core.$strip>>;
111
+ next: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
112
+ tool: z.ZodString;
113
+ query: z.ZodRecord<z.ZodString, z.ZodUnknown>;
114
+ why: z.ZodOptional<z.ZodString>;
115
+ confidence: z.ZodOptional<z.ZodEnum<{
116
+ exact: "exact";
117
+ heuristic: "heuristic";
118
+ }>>;
119
+ }, z.core.$strip>>>;
122
120
  isPartial: z.ZodOptional<z.ZodBoolean>;
123
121
  startLine: z.ZodOptional<z.ZodNumber>;
124
122
  endLine: z.ZodOptional<z.ZodNumber>;
@@ -79,6 +79,19 @@ export declare const BulkLspGetSemanticsQuerySchema: z.ZodObject<{
79
79
  export declare const LspGetSemanticsOutputSchema: z.ZodObject<{
80
80
  base: z.ZodOptional<z.ZodString>;
81
81
  shared: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
82
+ responsePagination: z.ZodOptional<z.ZodObject<{
83
+ charOffset: z.ZodNumber;
84
+ charLength: z.ZodNumber;
85
+ totalChars: z.ZodNumber;
86
+ hasMore: z.ZodBoolean;
87
+ nextCharOffset: z.ZodOptional<z.ZodNumber>;
88
+ currentPage: z.ZodOptional<z.ZodNumber>;
89
+ totalPages: z.ZodOptional<z.ZodNumber>;
90
+ chunkMode: z.ZodOptional<z.ZodEnum<{
91
+ semantic: "semantic";
92
+ "char-limit": "char-limit";
93
+ }>>;
94
+ }, z.core.$strip>>;
82
95
  results: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
83
96
  id: z.ZodString;
84
97
  status: z.ZodLiteral<"empty">;
@@ -12,6 +12,18 @@ type ToolPathValidationResult = {
12
12
  sanitizedPath: string;
13
13
  errorResult?: undefined;
14
14
  };
15
+ /**
16
+ * Apply `.octocoderc` `local.allowedPaths` to the shared PathValidator so the
17
+ * file-config allowlist behaves identically to the `ALLOWED_PATHS` env var
18
+ * (which the PathValidator reads directly at construction). Without this, a
19
+ * user setting `allowedPaths` in `.octocoderc` gets a silent no-op — the field
20
+ * is validated by the config layer but never reaches the validator.
21
+ *
22
+ * `addAllowedRoot` de-duplicates and expands `~`, so this is idempotent and
23
+ * cheap to call per request (the common case is an empty array — a no-op).
24
+ * Exported for testing.
25
+ */
26
+ export declare function applyConfiguredAllowedRoots(allowedPaths?: readonly string[]): void;
15
27
  export declare function validateToolPath(query: PartialBaseQueryLocal & {
16
28
  path?: string;
17
29
  }, toolName: string): ToolPathValidationResult;
package/package.json CHANGED
@@ -1,21 +1,35 @@
1
1
  {
2
2
  "name": "@octocodeai/octocode-tools-core",
3
- "version": "17.0.1",
4
3
  "description": "Core tool implementations for Octocode: GitHub, local filesystem, LSP, and package search tools.",
4
+ "version": "17.0.2",
5
5
  "author": "Guy Bary <bgauryy@octocodeai.com>",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/bgauryy/octocode.git",
9
- "directory": "packages/octocode-tools-core"
10
- },
11
6
  "bugs": "https://github.com/bgauryy/octocode/issues",
12
- "license": "MIT",
13
- "type": "module",
14
- "publishConfig": {
15
- "access": "public"
7
+ "dependencies": {
8
+ "@modelcontextprotocol/sdk": "^1.29.0",
9
+ "@octocodeai/config": "^17.0.2",
10
+ "@octocodeai/octocode-core": "^16.6.3",
11
+ "@octocodeai/octocode-engine": "^17.0.2",
12
+ "@octokit/oauth-methods": "^6.0.2",
13
+ "@octokit/plugin-throttling": "^11.0.3",
14
+ "@octokit/request": "^10.0.10",
15
+ "node-cache": "^5.1.2",
16
+ "octokit": "^5.0.5",
17
+ "zod": "^4.4.3"
18
+ },
19
+ "devDependencies": {
20
+ "@octokit/core": "^7.0.6",
21
+ "@octokit/openapi-types": "^27.0.0",
22
+ "@octokit/plugin-rest-endpoint-methods": "^17.0.0",
23
+ "@types/node": "^25.9.3",
24
+ "@vitest/coverage-v8": "^4.1.9",
25
+ "esbuild": "^0.28.1",
26
+ "eslint": "^9.18.0",
27
+ "typescript": "^5.9.3",
28
+ "vitest": "^4.1.9"
29
+ },
30
+ "engines": {
31
+ "node": ">=20.0.0"
16
32
  },
17
- "main": "dist/index.js",
18
- "types": "dist/index.d.ts",
19
33
  "exports": {
20
34
  ".": {
21
35
  "types": "./dist/index.d.ts",
@@ -71,8 +85,15 @@
71
85
  "LICENSE",
72
86
  "README.md"
73
87
  ],
74
- "engines": {
75
- "node": ">=20.0.0"
88
+ "license": "MIT",
89
+ "main": "dist/index.js",
90
+ "publishConfig": {
91
+ "access": "public"
92
+ },
93
+ "repository": {
94
+ "type": "git",
95
+ "url": "git+https://github.com/bgauryy/octocode.git",
96
+ "directory": "packages/octocode-tools-core"
76
97
  },
77
98
  "scripts": {
78
99
  "build": "yarn readme:sync && yarn clean && node build.mjs && tsc --emitDeclarationOnly -p tsconfig.build.json",
@@ -80,34 +101,14 @@
80
101
  "clean": "rm -rf dist/",
81
102
  "lint": "eslint src",
82
103
  "lint:fix": "eslint src --fix",
104
+ "prepack": "yarn readme:sync && node ../octocode/scripts/check-no-workspace-protocol.mjs",
105
+ "prepublishOnly": "node ../octocode/scripts/check-no-workspace-protocol.mjs",
106
+ "readme:sync": "node ../../scripts/sync-package-readmes.mjs .",
83
107
  "test": "vitest run --coverage",
84
108
  "test:quiet": "vitest run --reporter=dot --silent",
85
109
  "typecheck": "tsc --noEmit --skipLibCheck -p tsconfig.json",
86
- "verify": "yarn lint && yarn typecheck && yarn test",
87
- "readme:sync": "node ../../scripts/sync-package-readmes.mjs .",
88
- "prepack": "yarn readme:sync"
110
+ "verify": "yarn lint && yarn typecheck && yarn test"
89
111
  },
90
- "dependencies": {
91
- "@modelcontextprotocol/sdk": "^1.29.0",
92
- "@octocodeai/config": "^17.0.1",
93
- "@octocodeai/octocode-core": "^16.6.3",
94
- "@octocodeai/octocode-engine": "^17.0.1",
95
- "@octokit/oauth-methods": "^6.0.2",
96
- "@octokit/plugin-throttling": "^11.0.3",
97
- "@octokit/request": "^10.0.10",
98
- "node-cache": "^5.1.2",
99
- "octokit": "^5.0.5",
100
- "zod": "^4.4.3"
101
- },
102
- "devDependencies": {
103
- "@octokit/core": "^7.0.6",
104
- "@octokit/openapi-types": "^27.0.0",
105
- "@octokit/plugin-rest-endpoint-methods": "^17.0.0",
106
- "@types/node": "^25.9.3",
107
- "@vitest/coverage-v8": "^4.1.9",
108
- "esbuild": "^0.28.1",
109
- "eslint": "^9.18.0",
110
- "typescript": "^5.9.3",
111
- "vitest": "^4.1.9"
112
- }
112
+ "type": "module",
113
+ "types": "dist/index.d.ts"
113
114
  }