reasonix 0.47.2 → 0.48.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/README.md +5 -26
- package/README.zh-CN.md +5 -26
- package/dist/cli/{acp-GEOAKSTU.js → acp-4ROCGYNH.js} +17 -17
- package/dist/cli/{chat-YTPATMMG.js → chat-GZNB5625.js} +24 -24
- package/dist/cli/{chunk-BQ6HC66J.js → chunk-2QSTA2QV.js} +3 -13
- package/dist/cli/chunk-2QSTA2QV.js.map +1 -0
- package/dist/cli/{chunk-DQ6K5ZQ7.js → chunk-3WGTGXO4.js} +2 -2
- package/dist/cli/{chunk-6QC5RQLE.js → chunk-5OHHAQ4W.js} +2 -2
- package/dist/cli/{chunk-XMHP7BEE.js → chunk-6MZTZO7A.js} +514 -791
- package/dist/cli/chunk-6MZTZO7A.js.map +1 -0
- package/dist/cli/chunk-7M4YYMKW.js +5198 -0
- package/dist/cli/chunk-7M4YYMKW.js.map +1 -0
- package/dist/cli/{chunk-KYQVQ5X4.js → chunk-B5CZL2SE.js} +9 -4
- package/dist/cli/chunk-B5CZL2SE.js.map +1 -0
- package/dist/cli/chunk-CDVSFSAK.js +17732 -0
- package/dist/cli/chunk-CDVSFSAK.js.map +1 -0
- package/dist/cli/{chunk-TRWHTFG7.js → chunk-DOWEOA6E.js} +2 -2
- package/dist/cli/chunk-EMMENC4O.js +831 -0
- package/dist/cli/chunk-EMMENC4O.js.map +1 -0
- package/dist/cli/{chunk-TDHXB2ER.js → chunk-H4CCXMDD.js} +2 -2
- package/dist/cli/{chunk-T5A7EY6B.js → chunk-HR5NBKEM.js} +2 -2
- package/dist/cli/{chunk-CNG32VAB.js → chunk-I4M5QJNL.js} +2 -2
- package/dist/cli/{chunk-5QCB62C4.js → chunk-J2TQAWOM.js} +135 -18
- package/dist/cli/{chunk-5QCB62C4.js.map → chunk-J2TQAWOM.js.map} +1 -1
- package/dist/cli/{chunk-DN4B5S6Y.js → chunk-JMDE6IO3.js} +2 -2
- package/dist/cli/{chunk-4MFCAZ2W.js → chunk-MOJYKO2A.js} +3 -3
- package/dist/cli/{chunk-HUILPCYX.js → chunk-MRZG4GBF.js} +3 -3
- package/dist/cli/{chunk-GH7DC2Y5.js → chunk-NMQSUNLB.js} +2 -2
- package/dist/cli/{chunk-ZXSCAODE.js → chunk-OB4BUJBL.js} +67 -2
- package/dist/cli/chunk-OB4BUJBL.js.map +1 -0
- package/dist/cli/{chunk-QCFLPSPH.js → chunk-OG5JANQ4.js} +2 -2
- package/dist/cli/{chunk-JBH5RM7X.js → chunk-OPYALNTT.js} +326 -55
- package/dist/cli/chunk-OPYALNTT.js.map +1 -0
- package/dist/cli/{chunk-CCJAP7G3.js → chunk-RUDBUHO4.js} +2 -2
- package/dist/cli/{chunk-2XY77LW7.js → chunk-S2RMQULY.js} +56 -24
- package/dist/cli/chunk-S2RMQULY.js.map +1 -0
- package/dist/cli/{chunk-DWPAKZTY.js → chunk-TE5UIIFL.js} +2 -2
- package/dist/cli/{chunk-KVZZ5U75.js → chunk-V4Y732RQ.js} +2 -2
- package/dist/cli/{chunk-TRSAHHCL.js → chunk-WZGNXR6E.js} +3 -3
- package/dist/cli/chunk-WZGNXR6E.js.map +1 -0
- package/dist/cli/{chunk-NRQ5UP5T.js → chunk-YW63N3ZR.js} +116 -28
- package/dist/cli/chunk-YW63N3ZR.js.map +1 -0
- package/dist/cli/{code-Q4NRVEDG.js → code-PMPJWXEO.js} +30 -31
- package/dist/cli/code-PMPJWXEO.js.map +1 -0
- package/dist/cli/{commands-4CDI4GFM.js → commands-QS6TG4G3.js} +4 -4
- package/dist/cli/{commit-GW7LDQP5.js → commit-XPRSKUBF.js} +3 -3
- package/dist/cli/{desktop-EG6P5SF2.js → desktop-562OPWIU.js} +461 -43
- package/dist/cli/desktop-562OPWIU.js.map +1 -0
- package/dist/cli/{diff-VI2YX4FN.js → diff-I6W4AUWJ.js} +8 -8
- package/dist/cli/{doctor-CQTTZP27.js → doctor-6XVZKT4U.js} +9 -9
- package/dist/cli/index.js +52 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-J2UCD4RZ.js → mcp-7W7ANO2Y.js} +2 -2
- package/dist/cli/{mcp-browse-GSX34JEK.js → mcp-browse-LA4I4YIZ.js} +2 -2
- package/dist/cli/{mcp-inspect-RRFYF4ZV.js → mcp-inspect-LWXXU7BY.js} +2 -2
- package/dist/cli/{prompt-5TQPIVHV.js → prompt-RKZD4X6Y.js} +3 -3
- package/dist/cli/{replay-MJCEMODU.js → replay-2X7MVXOI.js} +8 -8
- package/dist/cli/{run-P4D5VDYE.js → run-TPKXIJ27.js} +13 -13
- package/dist/cli/{server-C25JNNZV.js → server-NHQ3QXOZ.js} +15 -14
- package/dist/cli/{server-C25JNNZV.js.map → server-NHQ3QXOZ.js.map} +1 -1
- package/dist/cli/{sessions-QIONZJQ6.js → sessions-2A4DGSHA.js} +12 -12
- package/dist/cli/{setup-NLQ6G5G4.js → setup-GOLP7J4C.js} +5 -5
- package/dist/cli/{stats-DFZEXHP4.js → stats-CGDAFDKI.js} +6 -6
- package/dist/cli/{version-GR3X3MPI.js → version-FIL4ZFOS.js} +12 -12
- package/dist/grammars/tree-sitter-go.wasm +0 -0
- package/dist/grammars/tree-sitter-java.wasm +0 -0
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-python.wasm +0 -0
- package/dist/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/grammars/web-tree-sitter.wasm +0 -0
- package/dist/index.d.ts +38 -10
- package/dist/index.js +488 -87
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
- package/dist/cli/chunk-2XY77LW7.js.map +0 -1
- package/dist/cli/chunk-6CRPCJAU.js +0 -3141
- package/dist/cli/chunk-6CRPCJAU.js.map +0 -1
- package/dist/cli/chunk-BQ6HC66J.js.map +0 -1
- package/dist/cli/chunk-JBH5RM7X.js.map +0 -1
- package/dist/cli/chunk-KYQVQ5X4.js.map +0 -1
- package/dist/cli/chunk-NRQ5UP5T.js.map +0 -1
- package/dist/cli/chunk-TRSAHHCL.js.map +0 -1
- package/dist/cli/chunk-XD6P7AFH.js +0 -375
- package/dist/cli/chunk-XD6P7AFH.js.map +0 -1
- package/dist/cli/chunk-XMHP7BEE.js.map +0 -1
- package/dist/cli/chunk-YFP3MYMY.js +0 -323
- package/dist/cli/chunk-YFP3MYMY.js.map +0 -1
- package/dist/cli/chunk-ZXSCAODE.js.map +0 -1
- package/dist/cli/code-Q4NRVEDG.js.map +0 -1
- package/dist/cli/desktop-EG6P5SF2.js.map +0 -1
- /package/dist/cli/{acp-GEOAKSTU.js.map → acp-4ROCGYNH.js.map} +0 -0
- /package/dist/cli/{chat-YTPATMMG.js.map → chat-GZNB5625.js.map} +0 -0
- /package/dist/cli/{chunk-DQ6K5ZQ7.js.map → chunk-3WGTGXO4.js.map} +0 -0
- /package/dist/cli/{chunk-6QC5RQLE.js.map → chunk-5OHHAQ4W.js.map} +0 -0
- /package/dist/cli/{chunk-TRWHTFG7.js.map → chunk-DOWEOA6E.js.map} +0 -0
- /package/dist/cli/{chunk-TDHXB2ER.js.map → chunk-H4CCXMDD.js.map} +0 -0
- /package/dist/cli/{chunk-T5A7EY6B.js.map → chunk-HR5NBKEM.js.map} +0 -0
- /package/dist/cli/{chunk-CNG32VAB.js.map → chunk-I4M5QJNL.js.map} +0 -0
- /package/dist/cli/{chunk-DN4B5S6Y.js.map → chunk-JMDE6IO3.js.map} +0 -0
- /package/dist/cli/{chunk-4MFCAZ2W.js.map → chunk-MOJYKO2A.js.map} +0 -0
- /package/dist/cli/{chunk-HUILPCYX.js.map → chunk-MRZG4GBF.js.map} +0 -0
- /package/dist/cli/{chunk-GH7DC2Y5.js.map → chunk-NMQSUNLB.js.map} +0 -0
- /package/dist/cli/{chunk-QCFLPSPH.js.map → chunk-OG5JANQ4.js.map} +0 -0
- /package/dist/cli/{chunk-CCJAP7G3.js.map → chunk-RUDBUHO4.js.map} +0 -0
- /package/dist/cli/{chunk-DWPAKZTY.js.map → chunk-TE5UIIFL.js.map} +0 -0
- /package/dist/cli/{chunk-KVZZ5U75.js.map → chunk-V4Y732RQ.js.map} +0 -0
- /package/dist/cli/{commands-4CDI4GFM.js.map → commands-QS6TG4G3.js.map} +0 -0
- /package/dist/cli/{commit-GW7LDQP5.js.map → commit-XPRSKUBF.js.map} +0 -0
- /package/dist/cli/{diff-VI2YX4FN.js.map → diff-I6W4AUWJ.js.map} +0 -0
- /package/dist/cli/{doctor-CQTTZP27.js.map → doctor-6XVZKT4U.js.map} +0 -0
- /package/dist/cli/{mcp-J2UCD4RZ.js.map → mcp-7W7ANO2Y.js.map} +0 -0
- /package/dist/cli/{mcp-browse-GSX34JEK.js.map → mcp-browse-LA4I4YIZ.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-RRFYF4ZV.js.map → mcp-inspect-LWXXU7BY.js.map} +0 -0
- /package/dist/cli/{prompt-5TQPIVHV.js.map → prompt-RKZD4X6Y.js.map} +0 -0
- /package/dist/cli/{replay-MJCEMODU.js.map → replay-2X7MVXOI.js.map} +0 -0
- /package/dist/cli/{run-P4D5VDYE.js.map → run-TPKXIJ27.js.map} +0 -0
- /package/dist/cli/{sessions-QIONZJQ6.js.map → sessions-2A4DGSHA.js.map} +0 -0
- /package/dist/cli/{setup-NLQ6G5G4.js.map → setup-GOLP7J4C.js.map} +0 -0
- /package/dist/cli/{stats-DFZEXHP4.js.map → stats-CGDAFDKI.js.map} +0 -0
- /package/dist/cli/{version-GR3X3MPI.js.map → version-FIL4ZFOS.js.map} +0 -0
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
|
-
import {
|
|
4
|
-
registerSkillTools
|
|
5
|
-
} from "./chunk-ZXSCAODE.js";
|
|
6
|
-
import {
|
|
7
|
-
preflightStdioSpec
|
|
8
|
-
} from "./chunk-EQATK2L2.js";
|
|
9
|
-
import {
|
|
10
|
-
ToolRegistry,
|
|
11
|
-
formatSubagentResult,
|
|
12
|
-
registerChoiceTool,
|
|
13
|
-
registerFilesystemTools,
|
|
14
|
-
registerMemoryTools,
|
|
15
|
-
registerPlanTool,
|
|
16
|
-
registerTodoTool,
|
|
17
|
-
registerWebTools,
|
|
18
|
-
spawnSubagent
|
|
19
|
-
} from "./chunk-JBH5RM7X.js";
|
|
20
|
-
import {
|
|
21
|
-
DeepSeekClient
|
|
22
|
-
} from "./chunk-DWPAKZTY.js";
|
|
23
|
-
import {
|
|
24
|
-
bootstrapSemanticSearchInCodeMode
|
|
25
|
-
} from "./chunk-KVZZ5U75.js";
|
|
26
|
-
import {
|
|
27
|
-
JobRegistry,
|
|
28
|
-
registerShellTools
|
|
29
|
-
} from "./chunk-TRSAHHCL.js";
|
|
30
|
-
import {
|
|
31
|
-
SkillStore
|
|
32
|
-
} from "./chunk-FY4S7TJZ.js";
|
|
33
|
-
import {
|
|
34
|
-
MCP_CATALOG
|
|
35
|
-
} from "./chunk-PLHAZOLZ.js";
|
|
36
|
-
import {
|
|
37
|
-
defaultConfigPath,
|
|
38
|
-
loadBaseUrl,
|
|
39
|
-
loadEditMode,
|
|
40
|
-
loadFilesystemOutlineThresholdBytes,
|
|
41
|
-
loadProjectShellAllowed,
|
|
42
|
-
loadResolvedSkillPaths,
|
|
43
|
-
parseMcpSpec,
|
|
44
|
-
readConfig,
|
|
45
|
-
searchEnabled,
|
|
46
|
-
writeConfig
|
|
47
|
-
} from "./chunk-6CRPCJAU.js";
|
|
48
|
-
|
|
49
|
-
// src/tools/scaffold.ts
|
|
50
|
-
var VALID_SKILL_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
|
|
51
|
-
var VALID_SERVER_NAME = /^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$/;
|
|
52
|
-
var VALID_TOOL_NAME = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
|
|
53
|
-
function registerScaffoldTools(registry, opts = {}) {
|
|
54
|
-
const configPath = opts.configPath ?? defaultConfigPath();
|
|
55
|
-
registry.register({
|
|
56
|
-
name: "create_skill",
|
|
57
|
-
description: '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.',
|
|
58
|
-
parameters: {
|
|
59
|
-
type: "object",
|
|
60
|
-
properties: {
|
|
61
|
-
name: {
|
|
62
|
-
type: "string",
|
|
63
|
-
description: "Identifier \u2014 letters/digits/`_`/`-`/`.`, 1\u201364 chars. Becomes filename + frontmatter `name`."
|
|
64
|
-
},
|
|
65
|
-
description: {
|
|
66
|
-
type: "string",
|
|
67
|
-
description: 'One-liner for the skills index. Lead with the verb ("Run X and \u2026").'
|
|
68
|
-
},
|
|
69
|
-
body: {
|
|
70
|
-
type: "string",
|
|
71
|
-
description: "Markdown playbook. Reference tools by name."
|
|
72
|
-
},
|
|
73
|
-
scope: {
|
|
74
|
-
type: "string",
|
|
75
|
-
enum: ["project", "global"],
|
|
76
|
-
description: "`project` (default) = workspace .reasonix/skills/; `global` = ~/.reasonix/skills/."
|
|
77
|
-
},
|
|
78
|
-
allowed_tools: {
|
|
79
|
-
type: "array",
|
|
80
|
-
items: { type: "string" },
|
|
81
|
-
description: "Optional tool allowlist for `run_as: subagent`. Omit for full inherited toolset."
|
|
82
|
-
},
|
|
83
|
-
run_as: {
|
|
84
|
-
type: "string",
|
|
85
|
-
enum: ["inline", "subagent"],
|
|
86
|
-
description: "inline (default) appends body to parent log. subagent spawns isolated child; only final answer returns."
|
|
87
|
-
},
|
|
88
|
-
model: {
|
|
89
|
-
type: "string",
|
|
90
|
-
enum: ["deepseek-v4-flash", "deepseek-v4-pro"],
|
|
91
|
-
description: "Subagent model override. Default flash; use pro only when the playbook needs it."
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
required: ["name", "description", "body"]
|
|
95
|
-
},
|
|
96
|
-
fn: async (args) => {
|
|
97
|
-
const name = typeof args.name === "string" ? args.name.trim() : "";
|
|
98
|
-
if (!VALID_SKILL_NAME.test(name)) {
|
|
99
|
-
return JSON.stringify({
|
|
100
|
-
error: `invalid skill name: ${JSON.stringify(name)} \u2014 use letters, digits, _, -, .`
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
const description = typeof args.description === "string" ? args.description.trim().replace(/\n+/g, " ") : "";
|
|
104
|
-
if (!description) {
|
|
105
|
-
return JSON.stringify({
|
|
106
|
-
error: "create_skill requires a non-empty 'description'"
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
const body = typeof args.body === "string" ? args.body : "";
|
|
110
|
-
if (!body.trim()) {
|
|
111
|
-
return JSON.stringify({ error: "create_skill requires a non-empty 'body'" });
|
|
112
|
-
}
|
|
113
|
-
const scope = args.scope === "global" ? "global" : opts.projectRoot ? "project" : "global";
|
|
114
|
-
const runAs = args.run_as === "subagent" ? "subagent" : "inline";
|
|
115
|
-
const allowedTools = parseAllowedTools(args.allowed_tools);
|
|
116
|
-
if (allowedTools && "error" in allowedTools) {
|
|
117
|
-
return JSON.stringify({ error: allowedTools.error });
|
|
118
|
-
}
|
|
119
|
-
const model = typeof args.model === "string" && args.model.startsWith("deepseek-") ? args.model : void 0;
|
|
120
|
-
const content = serializeSkill({
|
|
121
|
-
name,
|
|
122
|
-
description,
|
|
123
|
-
runAs,
|
|
124
|
-
allowedTools: allowedTools ?? void 0,
|
|
125
|
-
model,
|
|
126
|
-
body
|
|
127
|
-
});
|
|
128
|
-
const store = new SkillStore({
|
|
129
|
-
homeDir: opts.homeDir,
|
|
130
|
-
projectRoot: opts.projectRoot,
|
|
131
|
-
customSkillPaths: opts.projectRoot ? loadResolvedSkillPaths(opts.projectRoot, configPath) : []
|
|
132
|
-
});
|
|
133
|
-
const result = store.createWithContent(name, scope, content);
|
|
134
|
-
if ("error" in result) {
|
|
135
|
-
return JSON.stringify({ error: result.error });
|
|
136
|
-
}
|
|
137
|
-
return JSON.stringify({
|
|
138
|
-
success: true,
|
|
139
|
-
path: result.path,
|
|
140
|
-
scope,
|
|
141
|
-
name,
|
|
142
|
-
run_as: runAs
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
registry.register({
|
|
147
|
-
name: "add_mcp_server",
|
|
148
|
-
description: '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.',
|
|
149
|
-
parameters: {
|
|
150
|
-
type: "object",
|
|
151
|
-
properties: {
|
|
152
|
-
name: {
|
|
153
|
-
type: "string",
|
|
154
|
-
description: "Namespace prefix on every tool. Letters/digits/`_`/`-`, must start with letter or `_`."
|
|
155
|
-
},
|
|
156
|
-
transport: {
|
|
157
|
-
type: "string",
|
|
158
|
-
enum: ["stdio", "sse", "streamable-http"],
|
|
159
|
-
description: "stdio = local command via stdin/stdout; sse / streamable-http = remote. Required unless `from_catalog` is set."
|
|
160
|
-
},
|
|
161
|
-
command: {
|
|
162
|
-
type: "string",
|
|
163
|
-
description: "Argv[0] for stdio \u2014 typically `npx` or a binary path."
|
|
164
|
-
},
|
|
165
|
-
args: {
|
|
166
|
-
type: "array",
|
|
167
|
-
items: { type: "string" },
|
|
168
|
-
description: 'Remaining argv for stdio \u2014 e.g. `["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]`.'
|
|
169
|
-
},
|
|
170
|
-
url: {
|
|
171
|
-
type: "string",
|
|
172
|
-
description: "Endpoint URL for sse / streamable-http \u2014 must be http(s)://."
|
|
173
|
-
},
|
|
174
|
-
from_catalog: {
|
|
175
|
-
type: "string",
|
|
176
|
-
description: "Bundled catalog shortcut: filesystem / memory / github / puppeteer / everything. Fills command+args; user supplies user-args via `args`."
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
required: ["name"]
|
|
180
|
-
},
|
|
181
|
-
fn: async (args) => {
|
|
182
|
-
const name = typeof args.name === "string" ? args.name.trim() : "";
|
|
183
|
-
if (!VALID_SERVER_NAME.test(name)) {
|
|
184
|
-
return JSON.stringify({
|
|
185
|
-
error: `invalid server name: ${JSON.stringify(name)} \u2014 must match [a-zA-Z_][a-zA-Z0-9_-]*`
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
const specStr = buildSpecString({
|
|
189
|
-
name,
|
|
190
|
-
transport: typeof args.transport === "string" ? args.transport : void 0,
|
|
191
|
-
command: typeof args.command === "string" ? args.command : void 0,
|
|
192
|
-
argv: Array.isArray(args.args) ? args.args.filter((a) => typeof a === "string") : void 0,
|
|
193
|
-
url: typeof args.url === "string" ? args.url : void 0,
|
|
194
|
-
fromCatalog: typeof args.from_catalog === "string" ? args.from_catalog : void 0
|
|
195
|
-
});
|
|
196
|
-
if ("error" in specStr) {
|
|
197
|
-
return JSON.stringify({ error: specStr.error });
|
|
198
|
-
}
|
|
199
|
-
let parsed;
|
|
200
|
-
try {
|
|
201
|
-
parsed = parseMcpSpec(specStr.spec);
|
|
202
|
-
} catch (err) {
|
|
203
|
-
return JSON.stringify({ error: err.message });
|
|
204
|
-
}
|
|
205
|
-
if (parsed.transport === "stdio") {
|
|
206
|
-
try {
|
|
207
|
-
preflightStdioSpec(parsed);
|
|
208
|
-
} catch (err) {
|
|
209
|
-
return JSON.stringify({ error: err.message });
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
const cfg = readConfig(configPath);
|
|
213
|
-
const existing = cfg.mcp ?? [];
|
|
214
|
-
const collision = existing.find((s) => parseSpecName(s) === name);
|
|
215
|
-
if (collision) {
|
|
216
|
-
return JSON.stringify({
|
|
217
|
-
error: `MCP server ${JSON.stringify(name)} already registered: ${collision}`
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
cfg.mcp = [...existing, specStr.spec];
|
|
221
|
-
writeConfig(cfg, configPath);
|
|
222
|
-
return JSON.stringify({
|
|
223
|
-
success: true,
|
|
224
|
-
name,
|
|
225
|
-
transport: parsed.transport,
|
|
226
|
-
spec: specStr.spec,
|
|
227
|
-
config_path: configPath,
|
|
228
|
-
active_on_next_launch: true
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
return registry;
|
|
233
|
-
}
|
|
234
|
-
function serializeSkill(args) {
|
|
235
|
-
const lines = ["---", `name: ${args.name}`, `description: ${args.description}`];
|
|
236
|
-
if (args.runAs === "subagent") {
|
|
237
|
-
lines.push("runAs: subagent");
|
|
238
|
-
}
|
|
239
|
-
if (args.allowedTools && args.allowedTools.length > 0) {
|
|
240
|
-
lines.push(`allowed-tools: ${args.allowedTools.join(", ")}`);
|
|
241
|
-
}
|
|
242
|
-
if (args.model) {
|
|
243
|
-
lines.push(`model: ${args.model}`);
|
|
244
|
-
}
|
|
245
|
-
lines.push("---", "");
|
|
246
|
-
return `${lines.join("\n")}
|
|
247
|
-
${args.body.trim()}
|
|
248
|
-
`;
|
|
249
|
-
}
|
|
250
|
-
function parseAllowedTools(raw) {
|
|
251
|
-
if (raw === void 0 || raw === null) return void 0;
|
|
252
|
-
if (!Array.isArray(raw)) {
|
|
253
|
-
return { error: "'allowed_tools' must be an array of tool-name strings" };
|
|
254
|
-
}
|
|
255
|
-
const out = [];
|
|
256
|
-
for (const v of raw) {
|
|
257
|
-
if (typeof v !== "string") {
|
|
258
|
-
return { error: "'allowed_tools' entries must be strings" };
|
|
259
|
-
}
|
|
260
|
-
const trimmed = v.trim();
|
|
261
|
-
if (!trimmed) continue;
|
|
262
|
-
if (!VALID_TOOL_NAME.test(trimmed)) {
|
|
263
|
-
return { error: `invalid tool name in allowed_tools: ${JSON.stringify(trimmed)}` };
|
|
264
|
-
}
|
|
265
|
-
out.push(trimmed);
|
|
266
|
-
}
|
|
267
|
-
return out.length > 0 ? out : void 0;
|
|
268
|
-
}
|
|
269
|
-
function buildSpecString(input) {
|
|
270
|
-
if (input.fromCatalog) {
|
|
271
|
-
const entry = MCP_CATALOG.find((e) => e.name === input.fromCatalog);
|
|
272
|
-
if (!entry) {
|
|
273
|
-
const known = MCP_CATALOG.map((e) => e.name).join(", ");
|
|
274
|
-
return {
|
|
275
|
-
error: `unknown catalog entry: ${JSON.stringify(input.fromCatalog)} \u2014 known: ${known}`
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
const userArgs = input.argv ?? [];
|
|
279
|
-
if (entry.userArgs && userArgs.length === 0) {
|
|
280
|
-
return {
|
|
281
|
-
error: `catalog entry "${entry.name}" needs ${entry.userArgs} \u2014 pass it via the 'args' parameter`
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
const tail = userArgs.map(quoteIfNeeded).join(" ");
|
|
285
|
-
const body = `npx -y ${entry.package}${tail ? ` ${tail}` : ""}`;
|
|
286
|
-
return { spec: `${input.name}=${body}` };
|
|
287
|
-
}
|
|
288
|
-
const transport = input.transport;
|
|
289
|
-
if (!transport) {
|
|
290
|
-
return { error: "add_mcp_server requires 'transport' (or 'from_catalog')" };
|
|
291
|
-
}
|
|
292
|
-
if (transport === "stdio") {
|
|
293
|
-
if (!input.command || !input.command.trim()) {
|
|
294
|
-
return { error: "stdio transport requires 'command'" };
|
|
295
|
-
}
|
|
296
|
-
const tail = (input.argv ?? []).map(quoteIfNeeded).join(" ");
|
|
297
|
-
const body = `${quoteIfNeeded(input.command.trim())}${tail ? ` ${tail}` : ""}`;
|
|
298
|
-
return { spec: `${input.name}=${body}` };
|
|
299
|
-
}
|
|
300
|
-
if (transport === "sse" || transport === "streamable-http") {
|
|
301
|
-
if (!input.url || !/^https?:\/\//i.test(input.url)) {
|
|
302
|
-
return { error: `${transport} transport requires an http(s):// 'url'` };
|
|
303
|
-
}
|
|
304
|
-
const prefix = transport === "streamable-http" ? "streamable+" : "";
|
|
305
|
-
return { spec: `${input.name}=${prefix}${input.url.trim()}` };
|
|
306
|
-
}
|
|
307
|
-
return { error: `unknown transport: ${JSON.stringify(transport)}` };
|
|
308
|
-
}
|
|
309
|
-
function parseSpecName(spec) {
|
|
310
|
-
const m = spec.trim().match(/^([a-zA-Z_][a-zA-Z0-9_-]*)=/);
|
|
311
|
-
return m ? m[1] ?? null : null;
|
|
312
|
-
}
|
|
313
|
-
function quoteIfNeeded(s) {
|
|
314
|
-
return /\s|"/.test(s) ? `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"` : s;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// src/code/setup.ts
|
|
318
|
-
async function buildCodeToolset(opts) {
|
|
319
|
-
const tools = new ToolRegistry();
|
|
320
|
-
const jobs = new JobRegistry();
|
|
321
|
-
const outlineThresholdBytes = loadFilesystemOutlineThresholdBytes();
|
|
322
|
-
const registerRooted = (root) => {
|
|
323
|
-
registerFilesystemTools(tools, { rootDir: root, outlineThresholdBytes });
|
|
324
|
-
const cfg = readConfig();
|
|
325
|
-
registerShellTools(tools, {
|
|
326
|
-
rootDir: root,
|
|
327
|
-
extraAllowed: () => loadProjectShellAllowed(root),
|
|
328
|
-
allowAll: () => loadEditMode() === "yolo",
|
|
329
|
-
jobs,
|
|
330
|
-
onJobsChanged: opts.onJobsChanged,
|
|
331
|
-
sensitivePaths: cfg.sensitivePaths
|
|
332
|
-
});
|
|
333
|
-
registerMemoryTools(tools, { projectRoot: root });
|
|
334
|
-
};
|
|
335
|
-
const reBootstrapSemantic = async (root) => {
|
|
336
|
-
const result = await bootstrapSemanticSearchInCodeMode(tools, root);
|
|
337
|
-
if (!result.enabled) tools.unregister("semantic_search");
|
|
338
|
-
return result;
|
|
339
|
-
};
|
|
340
|
-
registerRooted(opts.rootDir);
|
|
341
|
-
registerPlanTool(tools);
|
|
342
|
-
registerChoiceTool(tools);
|
|
343
|
-
registerTodoTool(tools);
|
|
344
|
-
registerScaffoldTools(tools, { projectRoot: opts.rootDir });
|
|
345
|
-
if (searchEnabled()) {
|
|
346
|
-
registerWebTools(tools);
|
|
347
|
-
}
|
|
348
|
-
let subagentClient = null;
|
|
349
|
-
registerSkillTools(tools, {
|
|
350
|
-
projectRoot: opts.rootDir,
|
|
351
|
-
customSkillPaths: loadResolvedSkillPaths(opts.rootDir),
|
|
352
|
-
onSkillInstalled: opts.onSkillInstalled,
|
|
353
|
-
subagentRunner: async (skill, task, signal) => {
|
|
354
|
-
if (!subagentClient) subagentClient = new DeepSeekClient({ baseUrl: loadBaseUrl() });
|
|
355
|
-
const result = await spawnSubagent({
|
|
356
|
-
client: subagentClient,
|
|
357
|
-
parentRegistry: tools,
|
|
358
|
-
parentSignal: signal,
|
|
359
|
-
system: skill.body,
|
|
360
|
-
task,
|
|
361
|
-
model: skill.model,
|
|
362
|
-
allowedTools: skill.allowedTools,
|
|
363
|
-
skillName: skill.name
|
|
364
|
-
});
|
|
365
|
-
return formatSubagentResult(result);
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
const semantic = await reBootstrapSemantic(opts.rootDir);
|
|
369
|
-
return { tools, jobs, registerRooted, reBootstrapSemantic, semantic };
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export {
|
|
373
|
-
buildCodeToolset
|
|
374
|
-
};
|
|
375
|
-
//# sourceMappingURL=chunk-XD6P7AFH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tools/scaffold.ts","../../src/code/setup.ts"],"sourcesContent":["/** 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 loadBaseUrl,\n loadEditMode,\n loadFilesystemOutlineThresholdBytes,\n loadProjectShellAllowed,\n loadResolvedSkillPaths,\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 { registerFilesystemTools } from \"../tools/filesystem.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 { formatSubagentResult, spawnSubagent } from \"../tools/subagent.js\";\nimport { registerTodoTool } from \"../tools/todo.js\";\nimport { registerWebTools } from \"../tools/web.js\";\n\nexport interface CodeToolsetOpts {\n rootDir: 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}\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\nexport async function buildCodeToolset(opts: CodeToolsetOpts): Promise<CodeToolset> {\n const tools = new ToolRegistry();\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 };\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 // 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 onSkillInstalled: opts.onSkillInstalled,\n subagentRunner: async (skill, task, signal) => {\n if (!subagentClient) subagentClient = new DeepSeekClient({ baseUrl: loadBaseUrl() });\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 });\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":[]}
|