reasonix 0.50.1 → 0.51.0
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/dashboard/dist/app.css +1 -1
- package/dashboard/dist/app.js +24 -22
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-6B25WIFF.js → acp-XEUHGG7X.js} +34 -31
- package/dist/cli/acp-XEUHGG7X.js.map +1 -0
- package/dist/cli/chat-NJ2Q5KHG.js +50 -0
- package/dist/cli/{chunk-OPGWCKKU.js → chunk-2HVTBFCI.js} +3 -3
- package/dist/cli/{chunk-AJIZ5KFK.js → chunk-2WUEAI2I.js} +3 -3
- package/dist/cli/{chunk-I4Q3QT4W.js → chunk-36BM7INR.js} +2 -2
- package/dist/cli/{chunk-3RNFYDDM.js → chunk-3BTK5BHI.js} +11 -7
- package/dist/cli/chunk-3BTK5BHI.js.map +1 -0
- package/dist/cli/{chunk-GMSAB2TC.js → chunk-3YRTIWFX.js} +2 -2
- package/dist/cli/{chunk-NLRC3DWQ.js → chunk-544J4PXD.js} +5 -5
- package/dist/cli/{chunk-7WITYWKN.js → chunk-5AIDYVH2.js} +2 -2
- package/dist/cli/{chunk-ALCOQP6R.js → chunk-5BBC6YMV.js} +5 -5
- package/dist/cli/{chunk-S4XVGLRW.js → chunk-6UNHNVJR.js} +72 -5
- package/dist/cli/chunk-6UNHNVJR.js.map +1 -0
- package/dist/cli/{chunk-IK6WWRIX.js → chunk-6XWXIVQ3.js} +38 -22
- package/dist/cli/chunk-6XWXIVQ3.js.map +1 -0
- package/dist/cli/{chunk-AAHB2PFX.js → chunk-7YB26OQO.js} +4 -4
- package/dist/cli/chunk-7YB26OQO.js.map +1 -0
- package/dist/cli/{chunk-MXWPAPZW.js → chunk-A5PBEIJ7.js} +53 -10
- package/dist/cli/chunk-A5PBEIJ7.js.map +1 -0
- package/dist/cli/{chunk-FQSQFCBI.js → chunk-BA5R6BAE.js} +2 -2
- package/dist/cli/{chunk-XWPZHWC2.js → chunk-BM6BBFAV.js} +2 -2
- package/dist/cli/{chunk-CAGKEGNE.js → chunk-BOWSNGQC.js} +52 -140
- package/dist/cli/chunk-BOWSNGQC.js.map +1 -0
- package/dist/cli/{chunk-EZ57UEZQ.js → chunk-C2MRSJTV.js} +2 -2
- package/dist/cli/{chunk-PYIZZAVQ.js → chunk-DVD67FXQ.js} +1716 -4
- package/dist/cli/chunk-DVD67FXQ.js.map +1 -0
- package/dist/cli/{chunk-ZAXMJANP.js → chunk-EAMXOWUW.js} +3 -3
- package/dist/cli/{chunk-TX652NBA.js → chunk-EWVFGYT6.js} +2 -2
- package/dist/cli/{chunk-IBRTU5WO.js → chunk-FP7IOWBQ.js} +18 -1182
- package/dist/cli/chunk-FP7IOWBQ.js.map +1 -0
- package/dist/cli/{chunk-I6FBSTTR.js → chunk-HGK57NBN.js} +9 -353
- package/dist/cli/chunk-HGK57NBN.js.map +1 -0
- package/dist/cli/chunk-JHWQDJZA.js +80 -0
- package/dist/cli/chunk-JHWQDJZA.js.map +1 -0
- package/dist/cli/{chunk-X2BQZQEE.js → chunk-K3QJ3GKI.js} +3 -3
- package/dist/cli/{chunk-GPUH2BNM.js → chunk-K4YQFULP.js} +612 -254
- package/dist/cli/chunk-K4YQFULP.js.map +1 -0
- package/dist/cli/chunk-L3VPEESB.js +31 -0
- package/dist/cli/chunk-L3VPEESB.js.map +1 -0
- package/dist/cli/{chunk-ENFBF6HI.js → chunk-N4SEBLU4.js} +383 -5
- package/dist/cli/chunk-N4SEBLU4.js.map +1 -0
- package/dist/cli/chunk-NRROJXXT.js +879 -0
- package/dist/cli/chunk-NRROJXXT.js.map +1 -0
- package/dist/cli/{chunk-3KRRTLC5.js → chunk-R6KIHEF3.js} +1619 -1036
- package/dist/cli/chunk-R6KIHEF3.js.map +1 -0
- package/dist/cli/{chunk-VVMY4M7J.js → chunk-SBHF5NWD.js} +27 -4
- package/dist/cli/chunk-SBHF5NWD.js.map +1 -0
- package/dist/cli/{chunk-OWA42BKS.js → chunk-SXSAWOB7.js} +14 -14
- package/dist/cli/{chunk-6IUMTRFP.js → chunk-UMZ6KHTS.js} +2 -2
- package/dist/cli/{chunk-7X4JJOO7.js → chunk-UO6E7FN3.js} +69 -5
- package/dist/cli/{chunk-7X4JJOO7.js.map → chunk-UO6E7FN3.js.map} +1 -1
- package/dist/cli/{chunk-3ZZXQ3CZ.js → chunk-UPW544V3.js} +2 -2
- package/dist/cli/{chunk-XJZWMU5P.js → chunk-WPOKBW5E.js} +2 -2
- package/dist/cli/{chunk-WSBFVOCO.js → chunk-Z3MKG7MQ.js} +2 -2
- package/dist/cli/{code-TBK2TASK.js → code-BMXLBC7D.js} +37 -36
- package/dist/cli/{code-TBK2TASK.js.map → code-BMXLBC7D.js.map} +1 -1
- package/dist/cli/{commands-NXTKSQTN.js → commands-E4RZXMF6.js} +5 -5
- package/dist/cli/{commit-IR5SPP7A.js → commit-KSRQ64IL.js} +3 -3
- package/dist/cli/{config-XK5WQGTS.js → config-QNDONOTU.js} +4 -2
- package/dist/cli/{desktop-5NTQBADL.js → desktop-H3ZHIMDA.js} +83 -37
- package/dist/cli/desktop-H3ZHIMDA.js.map +1 -0
- package/dist/cli/{diff-JNYX5BSZ.js → diff-I4PYI43W.js} +9 -9
- package/dist/cli/{doctor-IKYLUFXX.js → doctor-Y2E4MY2F.js} +12 -12
- package/dist/cli/{events-HSC57ONU.js → events-47HOT7ZA.js} +5 -5
- package/dist/cli/find-in-code-YLEIK5FK.js +145 -0
- package/dist/cli/find-in-code-YLEIK5FK.js.map +1 -0
- package/dist/cli/index.js +95 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-BDJJWOCD.js → mcp-76DK63ZB.js} +3 -3
- package/dist/cli/{mcp-browse-NJRZDI6V.js → mcp-browse-SDNUGO74.js} +3 -3
- package/dist/cli/{mcp-inspect-Y62NWZQL.js → mcp-inspect-BL5DEO5M.js} +3 -3
- package/dist/cli/{prompt-UTOIFUQC.js → prompt-JLATI3P7.js} +5 -5
- package/dist/cli/{prune-sessions-UCUD4XAP.js → prune-sessions-WHZDFUKD.js} +4 -4
- package/dist/cli/{replay-VVIN64MN.js → replay-MHXS7C7Z.js} +10 -10
- package/dist/cli/{run-76OBDZFB.js → run-SXNCPRJE.js} +22 -22
- package/dist/cli/{server-SZZDKTH2.js → server-GEHOE6CO.js} +61 -35
- package/dist/cli/server-GEHOE6CO.js.map +1 -0
- package/dist/cli/{sessions-FZTGRCM5.js → sessions-EPBFYISL.js} +18 -18
- package/dist/cli/{setup-4UNENGOE.js → setup-IW2XR5XI.js} +8 -7
- package/dist/cli/setup-IW2XR5XI.js.map +1 -0
- package/dist/cli/{stats-F4NDOD7D.js → stats-4WB4XHBP.js} +6 -6
- package/dist/cli/symbols-UQ274IOB.js +167 -0
- package/dist/cli/symbols-UQ274IOB.js.map +1 -0
- package/dist/cli/version-4SP3DLLH.js +33 -0
- package/dist/index.d.ts +25 -6
- package/dist/index.js +2700 -578
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/scripts/postinstall.mjs +3 -5
- package/dist/cli/acp-6B25WIFF.js.map +0 -1
- package/dist/cli/chat-7WASPB4O.js +0 -50
- package/dist/cli/chunk-3KRRTLC5.js.map +0 -1
- package/dist/cli/chunk-3RNFYDDM.js.map +0 -1
- package/dist/cli/chunk-AAHB2PFX.js.map +0 -1
- package/dist/cli/chunk-CAGKEGNE.js.map +0 -1
- package/dist/cli/chunk-ENFBF6HI.js.map +0 -1
- package/dist/cli/chunk-GPUH2BNM.js.map +0 -1
- package/dist/cli/chunk-I6FBSTTR.js.map +0 -1
- package/dist/cli/chunk-IBRTU5WO.js.map +0 -1
- package/dist/cli/chunk-IK6WWRIX.js.map +0 -1
- package/dist/cli/chunk-MXWPAPZW.js.map +0 -1
- package/dist/cli/chunk-PYIZZAVQ.js.map +0 -1
- package/dist/cli/chunk-S4XVGLRW.js.map +0 -1
- package/dist/cli/chunk-VVMY4M7J.js.map +0 -1
- package/dist/cli/desktop-5NTQBADL.js.map +0 -1
- package/dist/cli/server-SZZDKTH2.js.map +0 -1
- package/dist/cli/setup-4UNENGOE.js.map +0 -1
- package/dist/cli/version-LUVTWHLL.js +0 -33
- /package/dist/cli/{chat-7WASPB4O.js.map → chat-NJ2Q5KHG.js.map} +0 -0
- /package/dist/cli/{chunk-OPGWCKKU.js.map → chunk-2HVTBFCI.js.map} +0 -0
- /package/dist/cli/{chunk-AJIZ5KFK.js.map → chunk-2WUEAI2I.js.map} +0 -0
- /package/dist/cli/{chunk-I4Q3QT4W.js.map → chunk-36BM7INR.js.map} +0 -0
- /package/dist/cli/{chunk-GMSAB2TC.js.map → chunk-3YRTIWFX.js.map} +0 -0
- /package/dist/cli/{chunk-NLRC3DWQ.js.map → chunk-544J4PXD.js.map} +0 -0
- /package/dist/cli/{chunk-7WITYWKN.js.map → chunk-5AIDYVH2.js.map} +0 -0
- /package/dist/cli/{chunk-ALCOQP6R.js.map → chunk-5BBC6YMV.js.map} +0 -0
- /package/dist/cli/{chunk-FQSQFCBI.js.map → chunk-BA5R6BAE.js.map} +0 -0
- /package/dist/cli/{chunk-XWPZHWC2.js.map → chunk-BM6BBFAV.js.map} +0 -0
- /package/dist/cli/{chunk-EZ57UEZQ.js.map → chunk-C2MRSJTV.js.map} +0 -0
- /package/dist/cli/{chunk-ZAXMJANP.js.map → chunk-EAMXOWUW.js.map} +0 -0
- /package/dist/cli/{chunk-TX652NBA.js.map → chunk-EWVFGYT6.js.map} +0 -0
- /package/dist/cli/{chunk-X2BQZQEE.js.map → chunk-K3QJ3GKI.js.map} +0 -0
- /package/dist/cli/{chunk-OWA42BKS.js.map → chunk-SXSAWOB7.js.map} +0 -0
- /package/dist/cli/{chunk-6IUMTRFP.js.map → chunk-UMZ6KHTS.js.map} +0 -0
- /package/dist/cli/{chunk-3ZZXQ3CZ.js.map → chunk-UPW544V3.js.map} +0 -0
- /package/dist/cli/{chunk-XJZWMU5P.js.map → chunk-WPOKBW5E.js.map} +0 -0
- /package/dist/cli/{chunk-WSBFVOCO.js.map → chunk-Z3MKG7MQ.js.map} +0 -0
- /package/dist/cli/{commands-NXTKSQTN.js.map → commands-E4RZXMF6.js.map} +0 -0
- /package/dist/cli/{commit-IR5SPP7A.js.map → commit-KSRQ64IL.js.map} +0 -0
- /package/dist/cli/{config-XK5WQGTS.js.map → config-QNDONOTU.js.map} +0 -0
- /package/dist/cli/{diff-JNYX5BSZ.js.map → diff-I4PYI43W.js.map} +0 -0
- /package/dist/cli/{doctor-IKYLUFXX.js.map → doctor-Y2E4MY2F.js.map} +0 -0
- /package/dist/cli/{events-HSC57ONU.js.map → events-47HOT7ZA.js.map} +0 -0
- /package/dist/cli/{mcp-BDJJWOCD.js.map → mcp-76DK63ZB.js.map} +0 -0
- /package/dist/cli/{mcp-browse-NJRZDI6V.js.map → mcp-browse-SDNUGO74.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-Y62NWZQL.js.map → mcp-inspect-BL5DEO5M.js.map} +0 -0
- /package/dist/cli/{prompt-UTOIFUQC.js.map → prompt-JLATI3P7.js.map} +0 -0
- /package/dist/cli/{prune-sessions-UCUD4XAP.js.map → prune-sessions-WHZDFUKD.js.map} +0 -0
- /package/dist/cli/{replay-VVIN64MN.js.map → replay-MHXS7C7Z.js.map} +0 -0
- /package/dist/cli/{run-76OBDZFB.js.map → run-SXNCPRJE.js.map} +0 -0
- /package/dist/cli/{sessions-FZTGRCM5.js.map → sessions-EPBFYISL.js.map} +0 -0
- /package/dist/cli/{stats-F4NDOD7D.js.map → stats-4WB4XHBP.js.map} +0 -0
- /package/dist/cli/{version-LUVTWHLL.js.map → version-4SP3DLLH.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tools/code-query.ts","../../src/core/lazy.ts","../../src/java/class-source-finder.ts","../../src/java/zip-reader.ts","../../src/tools/java-source.ts","../../src/tools/scaffold.ts","../../src/code/setup.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { resolve as pathResolve } from \"node:path\";\nimport type { CodeMatchKind, FindInCodeOptions } from \"../code-query/find-in-code.js\";\nimport { grammarForPath } from \"../code-query/grammar-map.js\";\nimport { lazy } from \"../core/lazy.js\";\nimport type { ToolRegistry } from \"../tools.js\";\n\n/** web-tree-sitter is a multi-MB Emscripten runtime — defer until the model actually\n * dispatches one of these tools so sessions that never touch code_query don't pay for it. */\nconst loadSymbols = lazy(() => import(\"../code-query/symbols.js\"));\nconst loadFindInCode = lazy(() => import(\"../code-query/find-in-code.js\"));\n\nexport interface CodeQueryToolOpts {\n rootDir: string;\n}\n\nconst UNSUPPORTED =\n \"language not supported (TS/TSX/JS/JSX/Python/Go/Rust/Java); use search_content for grep-style matching\";\n\nexport function registerCodeQueryTools(registry: ToolRegistry, opts: CodeQueryToolOpts): void {\n const { rootDir } = opts;\n\n registry.register({\n name: \"get_symbols\",\n description:\n \"Outline a single TS/TSX/JS/JSX/Python/Go/Rust/Java file via tree-sitter — returns its top-level + nested symbols (functions, classes, methods, interfaces, types, enums, namespaces) with 1-based line/column. Grammar-aware, ignores names inside comments/strings. Use for 'what's in this file' / 'where is X defined here'; for cross-file scans use search_content. Result: {path, symbols:[{name, kind, line, column, endLine, endColumn, parent?}]} or {path, error}.\",\n readOnly: true,\n parallelSafe: true,\n stormExempt: true,\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"File path (relative to project root or absolute).\",\n },\n },\n required: [\"path\"],\n },\n fn: async (args: { path: string }) => {\n const filePath = resolveProjectPath(rootDir, args.path);\n if (!grammarForPath(filePath)) {\n return JSON.stringify({ path: args.path, error: UNSUPPORTED });\n }\n const source = await readFile(filePath, \"utf8\");\n const { extractSymbols } = await loadSymbols();\n const symbols = await extractSymbols(filePath, source);\n return JSON.stringify({ path: args.path, symbols });\n },\n });\n\n registry.register({\n name: \"find_in_code\",\n description:\n \"Find an identifier `name` in a single TS/TSX/JS/JSX/Python/Go/Rust/Java file, AST-filtered — skips matches inside comments and strings. Optional `kind` narrows by syntactic role: 'call' (function call site), 'definition' (declaration name), 'reference' (other uses), 'any' (default). Within-file only — does NOT resolve cross-file references; use search_content + reading for that. Result: {path, matches:[{line, column, kind, snippet}]} or {path, error}.\",\n readOnly: true,\n parallelSafe: true,\n stormExempt: true,\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Exact identifier text to find.\",\n },\n path: {\n type: \"string\",\n description: \"File path (relative to project root or absolute).\",\n },\n kind: {\n type: \"string\",\n enum: [\"any\", \"call\", \"definition\", \"reference\"],\n description: \"Filter by syntactic role. Default 'any'.\",\n },\n },\n required: [\"name\", \"path\"],\n },\n fn: async (args: { name: string; path: string; kind?: string }) => {\n const filePath = resolveProjectPath(rootDir, args.path);\n if (!grammarForPath(filePath)) {\n return JSON.stringify({ path: args.path, error: UNSUPPORTED });\n }\n const source = await readFile(filePath, \"utf8\");\n const kind = (args.kind ?? \"any\") as CodeMatchKind | \"any\";\n const findOpts: FindInCodeOptions = kind === \"any\" ? {} : { kind };\n const { findInCode } = await loadFindInCode();\n const matches = await findInCode(filePath, source, args.name, findOpts);\n return JSON.stringify({ path: args.path, matches });\n },\n });\n}\n\nfunction resolveProjectPath(rootDir: string, raw: string): string {\n const stripped = raw.replace(/^[/\\\\]+/, \"\");\n return pathResolve(rootDir, stripped.length === 0 ? \".\" : stripped);\n}\n","/** Memoize an async loader so the first call kicks off work and every later call returns the same promise. */\nexport function lazy<T>(load: () => Promise<T>): () => Promise<T> {\n let pending: Promise<T> | null = null;\n return () => {\n if (!pending) pending = load();\n return pending;\n };\n}\n","// Java source resolver: project tree → ~/.m2 + ~/.gradle jar cache → javap decompile.\n\nimport { execFile } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { readJarEntry } from \"./zip-reader.js\";\n\nexport interface FindResultSuccess {\n found: true;\n source: string;\n method: \"project\" | \"m2-source-jar\" | \"m2-jar\" | \"jar\";\n sourcePath: string;\n}\n\nexport interface FindResultNotFound {\n found: false;\n method: \"not-found\";\n}\n\nexport type FindResult = FindResultSuccess | FindResultNotFound;\n\nexport interface FindSourceOptions {\n /** Case-insensitive substring match against jar path; dramatically narrows the cache scan. */\n jarKeyword?: string;\n}\n\nexport interface ClassSourceFinderOptions {\n projectRoot: string;\n /** Jar cache dirs. When absent, auto-detects ~/.m2/repository + ~/.gradle/caches. */\n repoPaths?: string[];\n javapCommand?: string;\n /** Cap on jars walked before bailing. */\n maxJarScan?: number;\n signal?: AbortSignal;\n}\n\nexport class ClassSourceFinder {\n private projectRoot: string;\n private repoPaths: string[];\n private javapCommand: string;\n private maxJarScan: number;\n private signal?: AbortSignal;\n\n static defaultRepoPaths(): string[] {\n const home = os.homedir();\n const candidates = [path.join(home, \".m2\", \"repository\"), path.join(home, \".gradle\", \"caches\")];\n return candidates.filter((p) => fs.existsSync(p));\n }\n\n constructor(options: ClassSourceFinderOptions) {\n this.projectRoot = path.resolve(options.projectRoot);\n this.repoPaths =\n options.repoPaths && options.repoPaths.length > 0\n ? options.repoPaths.map((p) => path.resolve(p))\n : ClassSourceFinder.defaultRepoPaths();\n this.javapCommand = options.javapCommand ?? \"javap\";\n this.maxJarScan = options.maxJarScan ?? 2000;\n this.signal = options.signal;\n }\n\n async findSource(fullyQualifiedName: string, options?: FindSourceOptions): Promise<FindResult> {\n this.throwIfAborted();\n const projectResult = await this.searchProject(fullyQualifiedName);\n if (projectResult) return projectResult;\n return this.searchRepositories(fullyQualifiedName, options?.jarKeyword);\n }\n\n async findSourceInJar(fullyQualifiedName: string, jarPath: string): Promise<FindResult> {\n this.throwIfAborted();\n\n const resolvedJarPath = path.resolve(jarPath);\n if (!fs.existsSync(resolvedJarPath)) {\n return { found: false, method: \"not-found\" };\n }\n\n const classEntry = `${fullyQualifiedName.replace(/\\./g, \"/\")}.class`;\n try {\n const content = readJarEntry(resolvedJarPath, classEntry);\n if (!content) return { found: false, method: \"not-found\" };\n const source = await this.decompileFromJar(resolvedJarPath, content.data, fullyQualifiedName);\n return { found: true, source, method: \"jar\", sourcePath: resolvedJarPath };\n } catch (err) {\n return { found: false, method: \"not-found\" };\n }\n }\n\n private async searchProject(fqn: string): Promise<FindResultSuccess | null> {\n const simpleName = this.simpleClassName(fqn);\n const suffixes = [`${simpleName}.java`, `${simpleName}.java.txt`];\n\n const queue: string[] = [this.projectRoot];\n while (queue.length > 0) {\n this.throwIfAborted();\n const dir = queue.shift()!;\n let entries: fs.Dirent[];\n try {\n entries = await fsp.readdir(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (\n entry.name === \"node_modules\" ||\n entry.name === \".git\" ||\n entry.name === \"target\" ||\n entry.name === \"build\" ||\n entry.name === \"dist\" ||\n entry.name === \".idea\" ||\n entry.name === \".vscode\" ||\n entry.name === \".gradle\"\n ) {\n continue;\n }\n queue.push(fullPath);\n } else if (entry.isFile()) {\n if (suffixes.includes(entry.name)) {\n const source = await fsp.readFile(fullPath, \"utf-8\");\n return { found: true, source, method: \"project\", sourcePath: fullPath };\n }\n }\n }\n }\n\n return null;\n }\n\n private async searchRepositories(fqn: string, jarKeyword?: string): Promise<FindResult> {\n const javaEntry = `${fqn.replace(/\\./g, \"/\")}.java`;\n const classEntry = `${fqn.replace(/\\./g, \"/\")}.class`;\n\n const sourceJars: string[] = [];\n const regularJars: string[] = [];\n for (const repoDir of this.repoPaths) {\n await this.walkForJars(repoDir, sourceJars, regularJars, jarKeyword);\n }\n\n // Pass 1: prefer source jars — read .java directly, no decompile.\n for (const jarPath of sourceJars) {\n this.throwIfAborted();\n try {\n const content = readJarEntry(jarPath, javaEntry);\n if (content) {\n return {\n found: true,\n source: content.data.toString(\"utf-8\"),\n method: \"m2-source-jar\",\n sourcePath: jarPath,\n };\n }\n } catch {\n // skip\n }\n }\n\n // Pass 2: fall back to regular jars — decompile .class via javap.\n let scanned = 0;\n for (const jarPath of regularJars) {\n this.throwIfAborted();\n if (scanned >= this.maxJarScan) break;\n\n scanned++;\n try {\n const content = readJarEntry(jarPath, classEntry);\n if (content) {\n const source = await this.decompileFromJar(jarPath, content.data, fqn);\n return { found: true, source, method: \"m2-jar\", sourcePath: jarPath };\n }\n } catch {\n // skip\n }\n }\n\n return { found: false, method: \"not-found\" };\n }\n\n private static readonly MAX_WALK_DEPTH = 64;\n\n private async walkForJars(\n dir: string,\n sourceJars: string[],\n regularJars: string[],\n keyword?: string,\n depth = 0,\n ): Promise<void> {\n if (depth >= ClassSourceFinder.MAX_WALK_DEPTH) return;\n\n let entries: fs.Dirent[];\n try {\n entries = await fsp.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n this.throwIfAborted();\n if (sourceJars.length + regularJars.length >= this.maxJarScan) return;\n\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await this.walkForJars(fullPath, sourceJars, regularJars, keyword, depth + 1);\n } else if (entry.isFile() && entry.name.endsWith(\".jar\")) {\n if (!keyword || fullPath.toLowerCase().includes(keyword.toLowerCase())) {\n if (entry.name.endsWith(\"-sources.jar\") || entry.name.includes(\"-sources-\")) {\n sourceJars.push(fullPath);\n } else {\n regularJars.push(fullPath);\n }\n }\n }\n }\n }\n\n private async decompileFromJar(\n jarPath: string,\n classBytes: Buffer,\n fqn: string,\n ): Promise<string> {\n const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), \"reasonix-java-src-\"));\n\n try {\n const pkgPath = fqn.replace(/\\./g, path.sep);\n const classDir = path.join(tmpDir, path.dirname(pkgPath));\n await fsp.mkdir(classDir, { recursive: true });\n\n const classFile = path.join(tmpDir, `${pkgPath}.class`);\n await fsp.writeFile(classFile, classBytes);\n\n const raw = await this.runJavap(fqn, tmpDir);\n return ClassSourceFinder.compressJavapOutput(raw);\n } finally {\n await fsp.rm(tmpDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n // Strip constant pool, debug tables (LineNumberTable / LocalVariableTable /\n // StackMapTable), and \"Compiled from …\" from javap output — cuts ~60-80% of\n // tokens for AI consumption while keeping method sigs + bytecode.\n private static compressJavapOutput(raw: string): string {\n const lines = raw.split(\"\\n\");\n const out: string[] = [];\n let skipUntilIndent: number | null = null;\n\n for (const line of lines) {\n // Constant pool entry lines — always indented `#N = ...`\n if (/^\\s+#\\d+\\s*=/.test(line)) continue;\n\n // Inside a debug table body — skip lines indented deeper than the header\n if (skipUntilIndent !== null) {\n const m = line.match(/^(\\s*)/);\n const indent = m?.[1]?.length ?? 0;\n if (indent > skipUntilIndent) continue;\n skipUntilIndent = null;\n // Also eat the blank line that often separates the table from the next section\n if (line.trim() === \"\") continue;\n }\n\n // Debug table header — note its indent so we know when the body ends\n const debugMatch = line.match(/^(\\s+)(LineNumberTable|LocalVariableTable|StackMapTable):/);\n if (debugMatch) {\n skipUntilIndent = debugMatch[1]!.length;\n continue;\n }\n\n // \"Compiled from …\" preamble\n if (line.startsWith(\"Compiled from \")) continue;\n\n out.push(line);\n }\n\n return out\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\") // collapse multiple blank lines\n .trim();\n }\n\n private runJavap(className: string, classPath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(\n this.javapCommand,\n [\"-c\", \"-p\", \"-cp\", classPath, className],\n {\n maxBuffer: 15 * 1024 * 1024,\n timeout: 30_000,\n signal: this.signal,\n },\n (err, stdout, stderr) => {\n if (err) {\n // javap exits non-zero on missing class / unsupported bytecode — keep its diagnostics.\n const msg = [stdout, stderr].filter(Boolean).join(\"\\n\") || err.message;\n reject(new Error(`javap failed: ${msg}`));\n return;\n }\n resolve(stdout);\n },\n );\n });\n }\n\n private simpleClassName(fqn: string): string {\n const lastDot = fqn.lastIndexOf(\".\");\n return lastDot === -1 ? fqn : fqn.slice(lastDot + 1);\n }\n\n private throwIfAborted(): void {\n if (this.signal?.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n }\n}\n","// Pure-Node ZIP/JAR entry reader — STORED + DEFLATED only.\n\nimport * as fs from \"node:fs\";\nimport * as zlib from \"node:zlib\";\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIR_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_SIGNATURE = 0x04034b50;\n\nconst EOCD_MIN_SIZE = 22;\nconst EOCD_MAX_COMMENT = 0xffff;\n\nconst COMPRESSION_STORED = 0;\nconst COMPRESSION_DEFLATED = 8;\n\ninterface CentralDirEntry {\n fileName: string;\n compressionMethod: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n}\n\nfunction readU32LE(buf: Buffer, offset: number): number {\n return buf.readUInt32LE(offset);\n}\n\nfunction readU16LE(buf: Buffer, offset: number): number {\n return buf.readUInt16LE(offset);\n}\n\nfunction findEOCD(fd: number, fileSize: number): { offset: number; buf: Buffer } {\n // EOCD sits at end-of-file but a variable ZIP comment can push it back up to 64 KiB.\n const searchStart = Math.max(0, fileSize - EOCD_MAX_COMMENT - EOCD_MIN_SIZE);\n let chunkOffset = fileSize;\n while (chunkOffset > searchStart) {\n const readSize = Math.min(1024, chunkOffset - searchStart);\n chunkOffset -= readSize;\n const buf = Buffer.alloc(readSize);\n fs.readSync(fd, buf, 0, readSize, chunkOffset);\n\n for (let i = readSize - 4; i >= 0; i--) {\n if (buf.readUInt32LE(i) === EOCD_SIGNATURE) {\n const eocdOffset = chunkOffset + i;\n const eocdSize = Math.min(EOCD_MIN_SIZE + EOCD_MAX_COMMENT, fileSize - eocdOffset);\n const eocdBuf = Buffer.alloc(eocdSize);\n fs.readSync(fd, eocdBuf, 0, eocdSize, eocdOffset);\n return { offset: eocdOffset, buf: eocdBuf };\n }\n }\n }\n throw new Error(\"Not a valid ZIP file: EOCD signature not found\");\n}\n\nfunction parseCentralDirectory(fd: number, eocdBuf: Buffer): CentralDirEntry[] {\n const centralDirOffset = readU32LE(eocdBuf, 16);\n const totalEntries = readU16LE(eocdBuf, 10);\n\n const entries: CentralDirEntry[] = [];\n let offset = centralDirOffset;\n\n for (let i = 0; i < totalEntries; i++) {\n const headerBuf = Buffer.alloc(46);\n fs.readSync(fd, headerBuf, 0, 46, offset);\n\n if (readU32LE(headerBuf, 0) !== CENTRAL_DIR_SIGNATURE) {\n throw new Error(`Corrupt central directory at offset ${offset}`);\n }\n\n const compressionMethod = readU16LE(headerBuf, 10);\n const compressedSize = readU32LE(headerBuf, 20);\n const uncompressedSize = readU32LE(headerBuf, 24);\n const fileNameLen = readU16LE(headerBuf, 28);\n const extraLen = readU16LE(headerBuf, 30);\n const commentLen = readU16LE(headerBuf, 32);\n const localHeaderOffset = readU32LE(headerBuf, 42);\n\n const nameBuf = Buffer.alloc(fileNameLen);\n fs.readSync(fd, nameBuf, 0, fileNameLen, offset + 46);\n const fileName = nameBuf.toString(\"utf8\");\n\n entries.push({\n fileName,\n compressionMethod,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n });\n\n offset += 46 + fileNameLen + extraLen + commentLen;\n }\n\n return entries;\n}\n\nexport interface JarEntry {\n fileName: string;\n data: Buffer;\n}\n\nexport function readJarEntry(jarPath: string, entryName: string): JarEntry | null {\n const fd = fs.openSync(jarPath, \"r\");\n try {\n const stat = fs.fstatSync(fd);\n const fileSize = stat.size;\n\n const eocd = findEOCD(fd, fileSize);\n const entries = parseCentralDirectory(fd, eocd.buf);\n\n const target = entries.find((e) => e.fileName === entryName);\n if (!target) return null;\n\n const localHeaderBuf = Buffer.alloc(30);\n fs.readSync(fd, localHeaderBuf, 0, 30, target.localHeaderOffset);\n\n if (readU32LE(localHeaderBuf, 0) !== LOCAL_FILE_SIGNATURE) {\n throw new Error(`Corrupt local file header at offset ${target.localHeaderOffset}`);\n }\n\n const localFileNameLen = readU16LE(localHeaderBuf, 26);\n const localExtraLen = readU16LE(localHeaderBuf, 28);\n\n const dataOffset = target.localHeaderOffset + 30 + localFileNameLen + localExtraLen;\n const compressedBuf = Buffer.alloc(target.compressedSize);\n fs.readSync(fd, compressedBuf, 0, target.compressedSize, dataOffset);\n\n let data: Buffer;\n if (target.compressionMethod === COMPRESSION_STORED) {\n data = compressedBuf;\n } else if (target.compressionMethod === COMPRESSION_DEFLATED) {\n data = zlib.inflateRawSync(compressedBuf);\n } else {\n throw new Error(\n `Unsupported compression method ${target.compressionMethod} for entry \"${entryName}\"`,\n );\n }\n\n return { fileName: target.fileName, data };\n } finally {\n fs.closeSync(fd);\n }\n}\n\nexport function listJarEntries(jarPath: string): string[] {\n const fd = fs.openSync(jarPath, \"r\");\n try {\n const stat = fs.fstatSync(fd);\n const eocd = findEOCD(fd, stat.size);\n const entries = parseCentralDirectory(fd, eocd.buf);\n return entries.map((e) => e.fileName);\n } finally {\n fs.closeSync(fd);\n }\n}\n","import { ClassSourceFinder } from \"../java/class-source-finder.js\";\nimport type { ToolRegistry } from \"../tools.js\";\n\nexport interface JavaSourceToolOptions {\n projectRoot?: string;\n}\n\nexport function registerJavaSourceTool(\n registry: ToolRegistry,\n opts: JavaSourceToolOptions = {},\n): ToolRegistry {\n registry.register({\n name: \"java_source\",\n description: [\n \"Find and return Java source code by fully-qualified class name.\",\n \"\",\n \"Search mode: walk the project tree for a `.java` file, then scan `~/.m2/repository` jars whose filename or path contains `jarKeyword`.\",\n \"\",\n \"Returns the source text (or decompiled bytecode) on success, or a clear 'not found' message.\",\n \"Only call this tool once per class name — it's I/O heavy.\",\n ].join(\"\\n\"),\n readOnly: true,\n parameters: {\n type: \"object\",\n properties: {\n className: {\n type: \"string\",\n description:\n 'Fully qualified Java class name, e.g. \"com.google.common.collect.Lists\" or \"org.springframework.web.servlet.DispatcherServlet\".',\n },\n jarKeyword: {\n type: \"string\",\n description:\n 'Only search jars whose filename or path contains this keyword (case-insensitive). Keep it short — a narrow substring like \"spring-core\", \"guava\", or \"mycompany-utils\" scans faster and matches more precisely than a long fragment.',\n },\n },\n required: [\"className\", \"jarKeyword\"],\n },\n parallelSafe: true,\n fn: async (args: { className: string; jarKeyword: string }) => {\n const className = (args?.className ?? \"\").trim();\n if (!className) {\n throw new Error(\"java_source: `className` is required\");\n }\n\n if (!/^[a-zA-Z_$][\\w$]*(\\.[a-zA-Z_$][\\w$]*)*$/.test(className)) {\n throw new Error(\n `java_source: \"${className}\" is not a valid fully qualified Java class name. Expected format: \\`com.example.MyClass\\``,\n );\n }\n\n const jarKeyword = args.jarKeyword.trim();\n if (!jarKeyword) {\n throw new Error(\"java_source: `jarKeyword` must not be empty\");\n }\n\n const projectRoot = opts.projectRoot || process.cwd();\n const finder = new ClassSourceFinder({ projectRoot });\n\n const result = await finder.findSource(className, { jarKeyword });\n\n if (!result.found) {\n const keywordLine = ` • Maven .m2 / Gradle cache for jars containing keyword \"${jarKeyword}\"`;\n const tip = \"Try a different keyword, or check if the class is in a different library.\";\n return JSON.stringify({\n status: \"not-found\",\n className,\n message: `No source found for \"${className}\". Searched:\\n • ${projectRoot}/ for matching .java files\\n ${keywordLine}\\n\\n${tip}`,\n });\n }\n\n return JSON.stringify({\n status: \"found\",\n className,\n method: result.method,\n sourcePath: result.sourcePath,\n source: result.source,\n });\n },\n });\n\n return registry;\n}\n","/** Agent-facing tools for scaffolding skills + MCP servers from chat. Persists via the same paths the wizard / `/skill new` use. */\n\nimport { defaultConfigPath, loadResolvedSkillPaths, readConfig, writeConfig } from \"../config.js\";\nimport { MCP_CATALOG } from \"../mcp/catalog.js\";\nimport { preflightStdioSpec } from \"../mcp/preflight.js\";\nimport { type McpSpec, parseMcpSpec } from \"../mcp/spec.js\";\nimport { SkillStore } from \"../skills.js\";\nimport type { ToolRegistry } from \"../tools.js\";\n\nexport interface ScaffoldToolsOptions {\n homeDir?: string;\n projectRoot?: string;\n /** Override config path — tests point this at a tmp file. */\n configPath?: string;\n}\n\nconst VALID_SKILL_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;\nconst VALID_SERVER_NAME = /^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$/;\nconst VALID_TOOL_NAME = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;\n\nexport function registerScaffoldTools(\n registry: ToolRegistry,\n opts: ScaffoldToolsOptions = {},\n): ToolRegistry {\n const configPath = opts.configPath ?? defaultConfigPath();\n\n registry.register({\n name: \"create_skill\",\n description:\n 'Scaffold a SKILL.md the user can later invoke via `/skill <name>`. Frontmatter (description / allowed_tools / run_as / model) is filled from structured args here. Use `run_as: \"subagent\"` for read-and-synthesize playbooks; default inline appends body to parent log. Refuses to overwrite existing skills.',\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n \"Identifier — letters/digits/`_`/`-`/`.`, 1–64 chars. Becomes filename + frontmatter `name`.\",\n },\n description: {\n type: \"string\",\n description: 'One-liner for the skills index. Lead with the verb (\"Run X and …\").',\n },\n body: {\n type: \"string\",\n description: \"Markdown playbook. Reference tools by name.\",\n },\n scope: {\n type: \"string\",\n enum: [\"project\", \"global\"],\n description:\n \"`project` (default) = workspace .reasonix/skills/; `global` = ~/.reasonix/skills/.\",\n },\n allowed_tools: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Optional tool allowlist for `run_as: subagent`. Omit for full inherited toolset.\",\n },\n run_as: {\n type: \"string\",\n enum: [\"inline\", \"subagent\"],\n description:\n \"inline (default) appends body to parent log. subagent spawns isolated child; only final answer returns.\",\n },\n model: {\n type: \"string\",\n enum: [\"deepseek-v4-flash\", \"deepseek-v4-pro\"],\n description:\n \"Subagent model override. Default flash; use pro only when the playbook needs it.\",\n },\n },\n required: [\"name\", \"description\", \"body\"],\n },\n fn: async (args: {\n name?: unknown;\n description?: unknown;\n body?: unknown;\n scope?: unknown;\n allowed_tools?: unknown;\n run_as?: unknown;\n model?: unknown;\n }) => {\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\n if (!VALID_SKILL_NAME.test(name)) {\n return JSON.stringify({\n error: `invalid skill name: ${JSON.stringify(name)} — use letters, digits, _, -, .`,\n });\n }\n const description =\n typeof args.description === \"string\" ? args.description.trim().replace(/\\n+/g, \" \") : \"\";\n if (!description) {\n return JSON.stringify({\n error: \"create_skill requires a non-empty 'description'\",\n });\n }\n const body = typeof args.body === \"string\" ? args.body : \"\";\n if (!body.trim()) {\n return JSON.stringify({ error: \"create_skill requires a non-empty 'body'\" });\n }\n const scope: \"project\" | \"global\" =\n args.scope === \"global\" ? \"global\" : opts.projectRoot ? \"project\" : \"global\";\n const runAs: \"inline\" | \"subagent\" = args.run_as === \"subagent\" ? \"subagent\" : \"inline\";\n const allowedTools = parseAllowedTools(args.allowed_tools);\n if (allowedTools && \"error\" in allowedTools) {\n return JSON.stringify({ error: allowedTools.error });\n }\n const model =\n typeof args.model === \"string\" && args.model.startsWith(\"deepseek-\")\n ? args.model\n : undefined;\n\n const content = serializeSkill({\n name,\n description,\n runAs,\n allowedTools: allowedTools ?? undefined,\n model,\n body,\n });\n\n const store = new SkillStore({\n homeDir: opts.homeDir,\n projectRoot: opts.projectRoot,\n customSkillPaths: opts.projectRoot\n ? loadResolvedSkillPaths(opts.projectRoot, configPath)\n : [],\n });\n const result = store.createWithContent(name, scope, content);\n if (\"error\" in result) {\n return JSON.stringify({ error: result.error });\n }\n return JSON.stringify({\n success: true,\n path: result.path,\n scope,\n name,\n run_as: runAs,\n });\n },\n });\n\n registry.register({\n name: \"add_mcp_server\",\n description:\n 'Register a new MCP server in the user\\'s config (`mcp` array). Takes effect next session. Use stdio for local commands, sse/streamable-http for remote. Pass `from_catalog` (e.g. \"filesystem\", \"github\") to auto-fill command+args from the bundled catalog. Refuses name collisions.',\n parameters: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description:\n \"Namespace prefix on every tool. Letters/digits/`_`/`-`, must start with letter or `_`.\",\n },\n transport: {\n type: \"string\",\n enum: [\"stdio\", \"sse\", \"streamable-http\"],\n description:\n \"stdio = local command via stdin/stdout; sse / streamable-http = remote. Required unless `from_catalog` is set.\",\n },\n command: {\n type: \"string\",\n description: \"Argv[0] for stdio — typically `npx` or a binary path.\",\n },\n args: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n 'Remaining argv for stdio — e.g. `[\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/path/to/dir\"]`.',\n },\n url: {\n type: \"string\",\n description: \"Endpoint URL for sse / streamable-http — must be http(s)://.\",\n },\n from_catalog: {\n type: \"string\",\n description:\n \"Bundled catalog shortcut: filesystem / memory / github / puppeteer / everything. Fills command+args; user supplies user-args via `args`.\",\n },\n },\n required: [\"name\"],\n },\n fn: async (args: {\n name?: unknown;\n transport?: unknown;\n command?: unknown;\n args?: unknown;\n url?: unknown;\n from_catalog?: unknown;\n }) => {\n const name = typeof args.name === \"string\" ? args.name.trim() : \"\";\n if (!VALID_SERVER_NAME.test(name)) {\n return JSON.stringify({\n error: `invalid server name: ${JSON.stringify(name)} — must match [a-zA-Z_][a-zA-Z0-9_-]*`,\n });\n }\n\n const specStr = buildSpecString({\n name,\n transport: typeof args.transport === \"string\" ? args.transport : undefined,\n command: typeof args.command === \"string\" ? args.command : undefined,\n argv: Array.isArray(args.args)\n ? (args.args.filter((a) => typeof a === \"string\") as string[])\n : undefined,\n url: typeof args.url === \"string\" ? args.url : undefined,\n fromCatalog: typeof args.from_catalog === \"string\" ? args.from_catalog : undefined,\n });\n if (\"error\" in specStr) {\n return JSON.stringify({ error: specStr.error });\n }\n\n let parsed: McpSpec;\n try {\n parsed = parseMcpSpec(specStr.spec);\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n if (parsed.transport === \"stdio\") {\n try {\n preflightStdioSpec(parsed);\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n }\n\n const cfg = readConfig(configPath);\n const existing = cfg.mcp ?? [];\n const collision = existing.find((s) => parseSpecName(s) === name);\n if (collision) {\n return JSON.stringify({\n error: `MCP server ${JSON.stringify(name)} already registered: ${collision}`,\n });\n }\n cfg.mcp = [...existing, specStr.spec];\n writeConfig(cfg, configPath);\n return JSON.stringify({\n success: true,\n name,\n transport: parsed.transport,\n spec: specStr.spec,\n config_path: configPath,\n active_on_next_launch: true,\n });\n },\n });\n\n return registry;\n}\n\ninterface SerializeSkillArgs {\n name: string;\n description: string;\n runAs: \"inline\" | \"subagent\";\n allowedTools?: readonly string[];\n model?: string;\n body: string;\n}\n\nexport function serializeSkill(args: SerializeSkillArgs): string {\n const lines: string[] = [\"---\", `name: ${args.name}`, `description: ${args.description}`];\n if (args.runAs === \"subagent\") {\n lines.push(\"runAs: subagent\");\n }\n if (args.allowedTools && args.allowedTools.length > 0) {\n lines.push(`allowed-tools: ${args.allowedTools.join(\", \")}`);\n }\n if (args.model) {\n lines.push(`model: ${args.model}`);\n }\n lines.push(\"---\", \"\");\n return `${lines.join(\"\\n\")}\\n${args.body.trim()}\\n`;\n}\n\nfunction parseAllowedTools(raw: unknown): readonly string[] | { error: string } | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (!Array.isArray(raw)) {\n return { error: \"'allowed_tools' must be an array of tool-name strings\" };\n }\n const out: string[] = [];\n for (const v of raw) {\n if (typeof v !== \"string\") {\n return { error: \"'allowed_tools' entries must be strings\" };\n }\n const trimmed = v.trim();\n if (!trimmed) continue;\n if (!VALID_TOOL_NAME.test(trimmed)) {\n return { error: `invalid tool name in allowed_tools: ${JSON.stringify(trimmed)}` };\n }\n out.push(trimmed);\n }\n return out.length > 0 ? out : undefined;\n}\n\ninterface BuildSpecInput {\n name: string;\n transport?: string;\n command?: string;\n argv?: string[];\n url?: string;\n fromCatalog?: string;\n}\n\nfunction buildSpecString(input: BuildSpecInput): { spec: string } | { error: string } {\n if (input.fromCatalog) {\n const entry = MCP_CATALOG.find((e) => e.name === input.fromCatalog);\n if (!entry) {\n const known = MCP_CATALOG.map((e) => e.name).join(\", \");\n return {\n error: `unknown catalog entry: ${JSON.stringify(input.fromCatalog)} — known: ${known}`,\n };\n }\n const userArgs = input.argv ?? [];\n if (entry.userArgs && userArgs.length === 0) {\n return {\n error: `catalog entry \"${entry.name}\" needs ${entry.userArgs} — pass it via the 'args' parameter`,\n };\n }\n const tail = userArgs.map(quoteIfNeeded).join(\" \");\n const body = `npx -y ${entry.package}${tail ? ` ${tail}` : \"\"}`;\n return { spec: `${input.name}=${body}` };\n }\n\n const transport = input.transport;\n if (!transport) {\n return { error: \"add_mcp_server requires 'transport' (or 'from_catalog')\" };\n }\n if (transport === \"stdio\") {\n if (!input.command || !input.command.trim()) {\n return { error: \"stdio transport requires 'command'\" };\n }\n const tail = (input.argv ?? []).map(quoteIfNeeded).join(\" \");\n const body = `${quoteIfNeeded(input.command.trim())}${tail ? ` ${tail}` : \"\"}`;\n return { spec: `${input.name}=${body}` };\n }\n if (transport === \"sse\" || transport === \"streamable-http\") {\n if (!input.url || !/^https?:\\/\\//i.test(input.url)) {\n return { error: `${transport} transport requires an http(s):// 'url'` };\n }\n const prefix = transport === \"streamable-http\" ? \"streamable+\" : \"\";\n return { spec: `${input.name}=${prefix}${input.url.trim()}` };\n }\n return { error: `unknown transport: ${JSON.stringify(transport)}` };\n}\n\nfunction parseSpecName(spec: string): string | null {\n const m = spec.trim().match(/^([a-zA-Z_][a-zA-Z0-9_-]*)=/);\n return m ? (m[1] ?? null) : null;\n}\n\nfunction quoteIfNeeded(s: string): string {\n return /\\s|\"/.test(s) ? `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"` : s;\n}\n","import { DeepSeekClient } from \"../client.js\";\nimport {\n type EditMode,\n loadEditMode,\n loadEndpoint,\n loadFilesystemOutlineThresholdBytes,\n loadJavaSourceEnabled,\n loadProjectShellAllowed,\n loadResolvedSkillPaths,\n loadSubagentModels,\n loadToolRateLimit,\n readConfig,\n searchEnabled,\n} from \"../config.js\";\nimport { bootstrapSemanticSearchInCodeMode } from \"../index/semantic/tool.js\";\nimport { ToolRegistry } from \"../tools.js\";\nimport { registerChoiceTool } from \"../tools/choice.js\";\nimport { registerCodeQueryTools } from \"../tools/code-query.js\";\nimport { registerFilesystemTools } from \"../tools/filesystem.js\";\nimport { registerJavaSourceTool } from \"../tools/java-source.js\";\nimport { JobRegistry } from \"../tools/jobs.js\";\nimport { registerMemoryTools } from \"../tools/memory.js\";\nimport { registerPlanTool } from \"../tools/plan.js\";\nimport { registerScaffoldTools } from \"../tools/scaffold.js\";\nimport { registerShellTools } from \"../tools/shell.js\";\nimport { type SkillInstalledHook, registerSkillTools } from \"../tools/skills.js\";\nimport {\n SHARED_SUBAGENT_SINK,\n type SubagentSink,\n formatSubagentResult,\n spawnSubagent,\n} from \"../tools/subagent.js\";\nimport { registerTodoTool } from \"../tools/todo.js\";\nimport { registerWebTools } from \"../tools/web.js\";\n\nexport interface CodeToolsetOpts {\n rootDir: string;\n /** Override the default `~/.reasonix/config.json` lookup — primarily for tests that pin a tmp config. */\n configPath?: string;\n /** Fired after `install_skill` writes a new skill — desktop wires this to push a fresh `$skills` event so the sidebar updates without a tab reload. */\n onSkillInstalled?: SkillInstalledHook;\n /** Fired after `run_background` / `stop_job` mutate the JobRegistry — desktop pushes a fresh `$jobs` event so the popover updates without waiting for poll. */\n onJobsChanged?: () => void;\n /** Shared `{current: callback}` sink the TUI populates after mount. Setup forwards it into every `spawnSubagent` so live progress events reach the rich subagent row even though setup runs before the UI does. */\n subagentSink?: SubagentSink;\n}\n\nexport interface CodeToolset {\n tools: ToolRegistry;\n jobs: JobRegistry;\n registerRooted: (root: string) => void;\n reBootstrapSemantic: (root: string) => Promise<{ enabled: boolean }>;\n semantic: { enabled: boolean };\n}\n\n/** Mirror `editMode === \"plan\"` into the registry's dispatch gate — keeps a single source of truth (the persisted EditMode) for the read-only mode. */\nexport function applyPlanMode(tools: ToolRegistry, editMode: EditMode): void {\n tools.setPlanMode(editMode === \"plan\");\n}\n\nexport async function buildCodeToolset(opts: CodeToolsetOpts): Promise<CodeToolset> {\n const tools = new ToolRegistry({ rateLimit: loadToolRateLimit() });\n applyPlanMode(tools, loadEditMode(opts.configPath));\n const jobs = new JobRegistry();\n\n const outlineThresholdBytes = loadFilesystemOutlineThresholdBytes();\n const registerRooted = (root: string): void => {\n registerFilesystemTools(tools, { rootDir: root, outlineThresholdBytes });\n const cfg = readConfig();\n registerShellTools(tools, {\n rootDir: root,\n extraAllowed: () => loadProjectShellAllowed(root),\n allowAll: () => loadEditMode() === \"yolo\",\n jobs,\n onJobsChanged: opts.onJobsChanged,\n sensitivePaths: cfg.sensitivePaths,\n });\n registerMemoryTools(tools, { projectRoot: root });\n registerCodeQueryTools(tools, { rootDir: root });\n };\n\n const reBootstrapSemantic = async (root: string): Promise<{ enabled: boolean }> => {\n const result = await bootstrapSemanticSearchInCodeMode(tools, root);\n if (!result.enabled) tools.unregister(\"semantic_search\");\n return result;\n };\n\n registerRooted(opts.rootDir);\n registerPlanTool(tools);\n registerChoiceTool(tools);\n registerTodoTool(tools);\n registerScaffoldTools(tools, { projectRoot: opts.rootDir });\n if (searchEnabled()) {\n registerWebTools(tools);\n }\n if (loadJavaSourceEnabled()) {\n registerJavaSourceTool(tools, { projectRoot: opts.rootDir });\n }\n // Lazy: constructing DeepSeekClient throws when DEEPSEEK_API_KEY is unset,\n // which would kill `reasonix code` before the setup wizard can prompt for\n // one. Defer to first subagent dispatch — by then the user has either keyed\n // in or we error per-call instead of at boot.\n let subagentClient: DeepSeekClient | null = null;\n registerSkillTools(tools, {\n projectRoot: opts.rootDir,\n customSkillPaths: loadResolvedSkillPaths(opts.rootDir),\n subagentModels: loadSubagentModels(),\n onSkillInstalled: opts.onSkillInstalled,\n subagentRunner: async (skill, task, signal) => {\n if (!subagentClient) {\n const ep = loadEndpoint();\n subagentClient = new DeepSeekClient({ apiKey: ep.apiKey, baseUrl: ep.baseUrl });\n }\n const result = await spawnSubagent({\n client: subagentClient,\n parentRegistry: tools,\n parentSignal: signal,\n system: skill.body,\n task,\n model: skill.model,\n allowedTools: skill.allowedTools,\n skillName: skill.name,\n // Late-bound: the TUI's `useSubagent` writes the live callback into\n // SHARED_SUBAGENT_SINK after mount. Until then `.current` is null\n // and the events are silently dropped — that's fine for non-TUI\n // callers (`reasonix chat --transcript`, library use).\n sink: opts.subagentSink ?? SHARED_SUBAGENT_SINK,\n });\n return formatSubagentResult(result);\n },\n });\n\n const semantic = await reBootstrapSemantic(opts.rootDir);\n\n return { tools, jobs, registerRooted, reBootstrapSemantic, semantic };\n}\n"],"mappings":"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","names":["fs","resolve"]}
|