@akon-labs/nexus-cli 0.1.10 → 0.1.11-rc.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/cli/require-login.d.ts.map +1 -1
- package/dist/cli/require-login.js +2 -2
- package/dist/cli/require-login.js.map +1 -1
- package/dist/cli.js +1919 -1040
- package/dist/core/agent-session.d.ts +3 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +14 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +18 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/extensions/gitnexus/config.d.ts +15 -1
- package/dist/extensions/gitnexus/config.d.ts.map +1 -1
- package/dist/extensions/gitnexus/config.js +86 -2
- package/dist/extensions/gitnexus/config.js.map +1 -1
- package/dist/extensions/gitnexus/index.d.ts.map +1 -1
- package/dist/extensions/gitnexus/index.js +2 -2
- package/dist/extensions/gitnexus/index.js.map +1 -1
- package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
- package/dist/extensions/gitnexus/observatory.js +2 -2
- package/dist/extensions/gitnexus/observatory.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/commands.d.ts +22 -2
- package/dist/extensions/mcp/commands.d.ts.map +1 -1
- package/dist/extensions/mcp/commands.js +201 -9
- package/dist/extensions/mcp/commands.js.map +1 -1
- package/dist/extensions/mcp/config.d.ts +2 -0
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +6 -1
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +54 -5
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/mcp-setup-panel.d.ts +63 -2
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -1
- package/dist/extensions/mcp/mcp-setup-panel.js +563 -77
- package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts +2 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +19 -6
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent-render.d.ts +3 -0
- package/dist/extensions/subagent-render.d.ts.map +1 -0
- package/dist/extensions/subagent-render.js +39 -0
- package/dist/extensions/subagent-render.js.map +1 -0
- package/dist/index.js +1951 -1072
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -3
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +1919 -1040
- package/dist/utils/hidden-spawn.d.ts +29 -0
- package/dist/utils/hidden-spawn.d.ts.map +1 -0
- package/dist/utils/hidden-spawn.js +101 -0
- package/dist/utils/hidden-spawn.js.map +1 -0
- package/dist/vendor/ai.js +233 -233
- package/native/win32/build.mjs +95 -0
- package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
- package/native/win32/src/hidden-spawn.c +157 -0
- package/npm-shrinkwrap.json +2 -37
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-setup-panel.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-setup-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport {\n\ttype ConfigWritePreview,\n\tKNOWN_SERVER_PRESETS,\n\ttype KnownServerPreset,\n\ttype McpDiscoverySummary,\n} from \"./config.ts\";\nimport type { McpOnboardingState } from \"./onboarding-state.ts\";\nimport { createPanelKeys, type PanelKeybindings, type PanelKeys } from \"./panel-keys.ts\";\nimport type { ImportKind } from \"./types.ts\";\n\ninterface SetupTheme {\n\tborder: string;\n\ttitle: string;\n\tselected: string;\n\thint: string;\n\tsuccess: string;\n\twarning: string;\n\tmuted: string;\n}\n\nconst DEFAULT_THEME: SetupTheme = {\n\tborder: \"2\",\n\ttitle: \"36\",\n\tselected: \"32\",\n\thint: \"2\",\n\tsuccess: \"32\",\n\twarning: \"33\",\n\tmuted: \"2;3\",\n};\n\nconst MIN_PANEL_WIDTH = 24;\nconst COMPACT_WIDTH = 60;\nconst COMPACT_ACTION_ROWS = 7;\nconst DESKTOP_PREVIEW_WIDTH = 74;\n\nfunction fg(code: string, text: string): string {\n\treturn code ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction wrapText(text: string, width: number): string[] {\n\tif (width <= 8) return [text];\n\tconst words = text.split(/\\s+/).filter(Boolean);\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tfor (const word of words) {\n\t\tconst candidate = current ? `${current} ${word}` : word;\n\t\tif (visibleWidth(candidate) <= width) {\n\t\t\tcurrent = candidate;\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) lines.push(current);\n\t\tcurrent = word;\n\t}\n\tif (current) lines.push(current);\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\nexport interface SetupPanelCallbacks {\n\tpreviewImports: (imports: ImportKind[]) => ConfigWritePreview;\n\tpreviewStarterProject: () => ConfigWritePreview;\n\tpreviewRepoPrompt: () => ConfigWritePreview | null;\n\tpreviewKnownServer: (preset: KnownServerPreset) => ConfigWritePreview;\n\tadoptImports: (imports: ImportKind[]) => Promise<{ added: ImportKind[]; path: string }>;\n\tscaffoldProjectConfig: () => Promise<{ path: string }>;\n\taddRepoPrompt: () => Promise<{ path: string; serverName: string }>;\n\taddKnownServer: (preset: KnownServerPreset) => Promise<{ path: string; serverName: string }>;\n\topenPath: (path: string) => Promise<void>;\n\tmarkSetupCompleted: () => void;\n}\n\nexport interface SetupPanelOptions {\n\tmode: \"empty\" | \"setup\";\n\tonboardingState: McpOnboardingState;\n\tkeybindings?: PanelKeybindings;\n}\n\ntype Screen = \"empty\" | \"setup\" | \"imports\" | \"paths\";\n\ntype ActionId =\n\t| \"run-setup\"\n\t| \"adopt-imports\"\n\t| \"view-example\"\n\t| \"show-precedence\"\n\t| \"open-paths\"\n\t| \"add-repoprompt\"\n\t| \"add-known-server\"\n\t| \"scaffold-project\"\n\t| \"close\";\n\ninterface Action {\n\tid: ActionId;\n\tlabel: string;\n\tdescription: string;\n\tpreset?: KnownServerPreset;\n}\n\nexport class McpSetupPanel {\n\tprivate screen: Screen;\n\tprivate actionCursor = 0;\n\tprivate importCursor = 0;\n\tprivate pathCursor = 0;\n\tprivate selectedImports = new Set<ImportKind>();\n\tprivate busy = false;\n\tprivate notice: { text: string; tone: \"success\" | \"warning\" | \"muted\" } | null = null;\n\tprivate tui: { requestRender(): void };\n\tprivate t = DEFAULT_THEME;\n\tprivate keys: PanelKeys;\n\tprivate inactivityTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate discovery: McpDiscoverySummary;\n\tprivate callbacks: SetupPanelCallbacks;\n\tprivate options: SetupPanelOptions;\n\tprivate done: () => void;\n\tprivate static readonly INACTIVITY_MS = 60_000;\n\n\tconstructor(\n\t\tdiscovery: McpDiscoverySummary,\n\t\tcallbacks: SetupPanelCallbacks,\n\t\toptions: SetupPanelOptions,\n\t\ttui: { requestRender(): void },\n\t\tdone: () => void,\n\t) {\n\t\tthis.discovery = discovery;\n\t\tthis.callbacks = callbacks;\n\t\tthis.options = options;\n\t\tthis.done = done;\n\t\tthis.tui = tui;\n\t\tthis.keys = createPanelKeys(options.keybindings);\n\t\tthis.screen = options.mode;\n\t\tfor (const entry of discovery.imports) {\n\t\t\tthis.selectedImports.add(entry.kind);\n\t\t}\n\t\tthis.resetInactivityTimeout();\n\t}\n\n\tprivate resetInactivityTimeout(): void {\n\t\tif (this.inactivityTimeout) clearTimeout(this.inactivityTimeout);\n\t\tthis.inactivityTimeout = setTimeout(() => {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t}, McpSetupPanel.INACTIVITY_MS);\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.inactivityTimeout) {\n\t\t\tclearTimeout(this.inactivityTimeout);\n\t\t\tthis.inactivityTimeout = null;\n\t\t}\n\t}\n\n\tprivate getActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tif (this.screen === \"empty\") {\n\t\t\tactions.push({\n\t\t\t\tid: \"run-setup\",\n\t\t\t\tlabel: \"Run setup\",\n\t\t\t\tdescription: \"Inspect detected configs, adopt imports, and scaffold a minimal `.nexus/mcp.json`.\",\n\t\t\t});\n\t\t}\n\t\tif (this.discovery.imports.length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"adopt-imports\",\n\t\t\t\tlabel: \"Adopt detected compatibility imports\",\n\t\t\t\tdescription: `Choose which host-specific MCP configs Nexus should import into its own override file. ${this.discovery.imports.length} source${this.discovery.imports.length === 1 ? \"\" : \"s\"} found.`,\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"view-example\",\n\t\t\tlabel: \"View example `.nexus/mcp.json`\",\n\t\t\tdescription: \"Preview a working Nexus MCP config you can paste or adapt.\",\n\t\t});\n\t\tif (!this.discovery.sources.some((source) => source.id === \"nexus-project\" && source.exists)) {\n\t\t\tactions.push({\n\t\t\t\tid: \"scaffold-project\",\n\t\t\t\tlabel: \"Scaffold project `.nexus/mcp.json`\",\n\t\t\t\tdescription: \"Write a minimal Nexus project MCP config, then reload Nexus.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"show-precedence\",\n\t\t\tlabel: \"Explain config precedence\",\n\t\t\tdescription: \"Show the read order and where Nexus writes compatibility settings.\",\n\t\t});\n\t\tif (this.getDetectedPaths().length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"open-paths\",\n\t\t\t\tlabel: \"Open detected config paths\",\n\t\t\t\tdescription: \"Browse the actual config files that Nexus discovered on this machine.\",\n\t\t\t});\n\t\t}\n\t\tfor (const preset of KNOWN_SERVER_PRESETS) {\n\t\t\tactions.push({ id: \"add-known-server\", label: preset.name, description: preset.summary, preset });\n\t\t}\n\t\tif (\n\t\t\t!this.discovery.repoPrompt.configured &&\n\t\t\tthis.discovery.repoPrompt.executablePath &&\n\t\t\tthis.discovery.repoPrompt.targetPath &&\n\t\t\tthis.discovery.repoPrompt.entry &&\n\t\t\tthis.discovery.repoPrompt.serverName\n\t\t) {\n\t\t\tactions.push({\n\t\t\t\tid: \"add-repoprompt\",\n\t\t\t\tlabel: \"Add RepoPrompt to Nexus MCP config\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Write an MCP entry for RepoPrompt to the recommended Nexus target, then reload MCP in-session.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({ id: \"close\", label: \"Close\", description: \"Exit the onboarding flow.\" });\n\t\treturn actions;\n\t}\n\n\tprivate getDetectedPaths(): string[] {\n\t\tconst paths = [\n\t\t\t...this.discovery.sources.filter((source) => source.exists).map((source) => source.path),\n\t\t\t...this.discovery.imports.map((entry) => entry.path),\n\t\t];\n\t\treturn [...new Set(paths)];\n\t}\n\n\tprivate getSelectedAction(): Action | undefined {\n\t\tconst actions = this.getActions();\n\t\treturn actions[this.actionCursor];\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.resetInactivityTimeout();\n\t\tif (!this.busy) this.notice = null;\n\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tif (this.screen === \"imports\" || this.screen === \"paths\") {\n\t\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.busy) return;\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tthis.handleImportsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"paths\") {\n\t\t\tthis.handlePathsInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst actions = this.getActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.actionCursor = Math.max(0, this.actionCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.actionCursor = Math.min(actions.length - 1, this.actionCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = this.getSelectedAction();\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleImportsInput(data: string): void {\n\t\tconst imports = this.discovery.imports;\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.importCursor = Math.max(0, this.importCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.importCursor = Math.min(imports.length - 1, this.importCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"space\")) {\n\t\t\tconst current = imports[this.importCursor];\n\t\t\tif (!current) return;\n\t\t\tif (this.selectedImports.has(current.kind)) {\n\t\t\t\tthis.selectedImports.delete(current.kind);\n\t\t\t} else {\n\t\t\t\tthis.selectedImports.add(current.kind);\n\t\t\t}\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.applySelectedImports();\n\t\t}\n\t}\n\n\tprivate handlePathsInput(data: string): void {\n\t\tconst paths = this.getDetectedPaths();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.pathCursor = Math.max(0, this.pathCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.pathCursor = Math.min(paths.length - 1, this.pathCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = paths[this.pathCursor];\n\t\t\tif (!selected) return;\n\t\t\tvoid this.runBusy(async () => {\n\t\t\t\tawait this.callbacks.openPath(selected);\n\t\t\t\tthis.notice = { text: `Opened ${selected}`, tone: \"success\" };\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async runAction(action: Action): Promise<void> {\n\t\tif (action.id === \"run-setup\") {\n\t\t\tthis.screen = \"setup\";\n\t\t\tthis.actionCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"adopt-imports\") {\n\t\t\tthis.screen = \"imports\";\n\t\t\tthis.importCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-paths\") {\n\t\t\tthis.screen = \"paths\";\n\t\t\tthis.pathCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"scaffold-project\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.scaffoldProjectConfig();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Wrote starter config to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-repoprompt\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addRepoPrompt();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-known-server\" && action.preset) {\n\t\t\tconst preset = action.preset;\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addKnownServer(preset);\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"close\") {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.notice = {\n\t\t\ttext: \"Review the details below. Press Enter on an action with a side effect to apply it.\",\n\t\t\ttone: \"muted\",\n\t\t};\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async applySelectedImports(): Promise<void> {\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tif (selected.length === 0) {\n\t\t\tthis.notice = { text: \"Select at least one compatibility import first.\", tone: \"warning\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBusy(async () => {\n\t\t\tconst result = await this.callbacks.adoptImports(selected);\n\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\tthis.notice =\n\t\t\t\tresult.added.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added ${result.added.join(\", \")} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: { text: `No changes needed in ${result.path}.`, tone: \"muted\" };\n\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\tthis.actionCursor = 0;\n\t\t});\n\t}\n\n\tprivate async runBusy(fn: () => Promise<void>): Promise<void> {\n\t\tthis.busy = true;\n\t\tthis.notice = { text: \"Working...\", tone: \"muted\" };\n\t\tthis.tui.requestRender();\n\t\ttry {\n\t\t\tawait fn();\n\t\t} catch (error) {\n\t\t\tthis.notice = {\n\t\t\t\ttext: error instanceof Error ? error.message : String(error),\n\t\t\t\ttone: \"warning\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst panelW = Math.max(MIN_PANEL_WIDTH, width);\n\t\tconst innerW = panelW - 2;\n\t\tconst contentW = this.contentWidth(innerW);\n\t\tconst lines: string[] = [];\n\t\tconst border = fg(this.t.border, \"─\".repeat(innerW));\n\t\tlines.push(`┌${border}┐`);\n\t\tlines.push(this.padLine(fg(this.t.title, \"MCP setup\"), innerW));\n\t\tfor (const line of wrapText(this.discoverySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tfor (const line of wrapText(this.secondarySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, line), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (this.notice) {\n\t\t\tconst tone =\n\t\t\t\tthis.notice.tone === \"success\"\n\t\t\t\t\t? this.t.success\n\t\t\t\t\t: this.notice.tone === \"warning\"\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.hint;\n\t\t\tfor (const line of wrapText(this.notice.text, contentW)) {\n\t\t\t\tlines.push(this.padLine(fg(tone, line), innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\n\t\tlines.push(`├${border}┤`);\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tlines.push(...this.renderImports(innerW));\n\t\t} else if (this.screen === \"paths\") {\n\t\t\tlines.push(...this.renderPaths(innerW));\n\t\t} else {\n\t\t\tlines.push(...this.renderActions(innerW));\n\t\t}\n\n\t\tlines.push(`└${border}┘`);\n\t\treturn lines;\n\t}\n\n\tprivate renderActions(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getActions();\n\t\tconst compact = innerW < COMPACT_WIDTH;\n\t\tconst { start, end } = compact ? this.visibleActionRange(actions.length) : { start: 0, end: actions.length };\n\n\t\tif (start > 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${start} more above`), innerW));\n\t\t}\n\t\tfor (let index = start; index < end; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tif (action.id === \"add-known-server\" && (index === start || actions[index - 1]?.id !== \"add-known-server\")) {\n\t\t\t\tlines.push(this.padLine(fg(this.t.title, \"Add a known server\"), innerW));\n\t\t\t}\n\t\t\tconst selected = index === this.actionCursor;\n\t\t\tconst cursor = selected ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${truncateToWidth(action.label, this.contentWidth(innerW) - 2)}`, innerW));\n\t\t}\n\t\tif (end < actions.length) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${actions.length - end} more below`), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tconst preview = this.getActionPreview(this.getSelectedAction(), this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst hint = compact ? \"Enter select · Esc back\" : \"Enter selects, Esc goes back, Ctrl+C closes.\";\n\t\tlines.push(this.padLine(fg(this.t.muted, hint), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderImports(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select compatibility imports. Space toggles, Enter saves, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tfor (let index = 0; index < this.discovery.imports.length; index++) {\n\t\t\tconst entry = this.discovery.imports[index];\n\t\t\tif (!entry) continue;\n\t\t\tconst selected = this.selectedImports.has(entry.kind) ? \"[x]\" : \"[ ]\";\n\t\t\tconst cursor = index === this.importCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${selected} ${entry.kind} ${entry.path}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tconst preview = this.callbacks.previewImports(selected);\n\t\tfor (const line of this.formatWritePreview(\n\t\t\t\"Compatibility import write preview\",\n\t\t\tpreview,\n\t\t\t[],\n\t\t\tthis.previewWidth(innerW),\n\t\t)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderPaths(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select a detected config path to open. Enter opens it, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst paths = this.getDetectedPaths();\n\t\tfor (let index = 0; index < paths.length; index++) {\n\t\t\tconst cursor = index === this.pathCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst path = paths[index];\n\t\t\tif (path !== undefined) lines.push(this.padLine(`${cursor} ${path}`, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate discoverySummaryLine(): string {\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn fg(\n\t\t\t\tthis.t.warning,\n\t\t\t\tthis.options.onboardingState.setupCompleted\n\t\t\t\t\t? \"No MCP servers are active right now.\"\n\t\t\t\t\t: \"No MCP config is active yet.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tthis.discovery.totalServerCount === 0 &&\n\t\t\t(this.discovery.imports.length > 0 || !!this.discovery.repoPrompt.executablePath)\n\t\t) {\n\t\t\treturn fg(this.t.warning, \"Nexus found MCP-related setup options, but none are active in Nexus yet.\");\n\t\t}\n\n\t\tconst configuredSources = this.discovery.sources.filter((source) => source.serverCount > 0).length;\n\t\treturn fg(\n\t\t\tthis.t.hint,\n\t\t\t`Detected ${this.discovery.totalServerCount} configured servers across ${configuredSources} Nexus source${configuredSources === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t}\n\n\tprivate secondarySummaryLine(): string {\n\t\tconst hostNote =\n\t\t\tthis.discovery.hostConfigs.length > 0\n\t\t\t\t? ` Host discovery is ${this.discovery.hostConfigDiscovery}; ${this.discovery.hostConfigs.length} host source${this.discovery.hostConfigs.length === 1 ? \"\" : \"s\"} detected.`\n\t\t\t\t: \"\";\n\t\tconst conflictNote =\n\t\t\tthis.discovery.conflicts.length > 0\n\t\t\t\t? ` ${this.discovery.conflicts.length} same-name conflict${this.discovery.conflicts.length === 1 ? \"\" : \"s\"} reported.`\n\t\t\t\t: \"\";\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn `Create .nexus/mcp.json, adopt host imports, or quick-add RepoPrompt from this screen.${hostNote}${conflictNote}`;\n\t\t}\n\t\tif (this.discovery.totalServerCount === 0 && this.discovery.imports.length > 0) {\n\t\t\treturn `Detected ${this.discovery.imports.length} compatibility import source${this.discovery.imports.length === 1 ? \"\" : \"s\"}. Adopt them into Nexus or inspect the underlying files.${hostNote}${conflictNote}`;\n\t\t}\n\t\treturn `Nexus MCP files contain server definitions, compatibility imports, and MCP-specific overrides.${hostNote}${conflictNote}`;\n\t}\n\n\tprivate visibleActionRange(total: number): { start: number; end: number } {\n\t\tif (total <= COMPACT_ACTION_ROWS) return { start: 0, end: total };\n\t\tconst half = Math.floor(COMPACT_ACTION_ROWS / 2);\n\t\tconst start = Math.min(Math.max(0, this.actionCursor - half), Math.max(0, total - COMPACT_ACTION_ROWS));\n\t\treturn { start, end: Math.min(total, start + COMPACT_ACTION_ROWS) };\n\t}\n\n\tprivate contentWidth(innerW: number): number {\n\t\treturn Math.max(8, innerW - 4);\n\t}\n\n\tprivate previewWidth(innerW: number): number {\n\t\treturn Math.max(12, Math.min(DESKTOP_PREVIEW_WIDTH, this.contentWidth(innerW)));\n\t}\n\n\tprivate getActionPreview(action?: Action, previewW = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tswitch (action?.id) {\n\t\t\tcase \"run-setup\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Run setup to adopt host-specific imports, inspect detected paths, and scaffold a minimal `.nexus/mcp.json` if needed.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"adopt-imports\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Compatibility import write preview\",\n\t\t\t\t\tthis.callbacks.previewImports(\n\t\t\t\t\t\tthis.discovery.imports\n\t\t\t\t\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t\t\t\t\t.map((entry) => entry.kind),\n\t\t\t\t\t),\n\t\t\t\t\t[\n\t\t\t\t\t\t`Detected imports: ${this.discovery.imports.map((entry) => `${entry.kind} (${entry.serverCount} servers)`).join(\", \")}`,\n\t\t\t\t\t\t\"Selected imports are written to the Nexus global MCP configuration shown above.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"view-example\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Example Nexus `.nexus/mcp.json`:\",\n\t\t\t\t\t\t\"{\",\n\t\t\t\t\t\t' \"mcpServers\": {',\n\t\t\t\t\t\t' \"chrome-devtools\": {',\n\t\t\t\t\t\t' \"command\": \"npx\",',\n\t\t\t\t\t\t' \"args\": [\"-y\", \"chrome-devtools-mcp@1.6.0\"]',\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\"}\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Use Scaffold project `.nexus/mcp.json` when you want a safe empty shell instead of a live example server.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"show-precedence\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Read order (later entries win):\",\n\t\t\t\t\t\t\"0. detected host configs (opt-in lowest-precedence fallback)\",\n\t\t\t\t\t\t\"1. ~/.config/nexus/mcp.json\",\n\t\t\t\t\t\t`2. ${getConfigDirName()}/mcp.json`,\n\t\t\t\t\t\t`Host discovery: ${this.discovery.hostConfigDiscovery}. Conflicts reported: ${this.discovery.conflicts.length}.`,\n\t\t\t\t\t\t...this.discovery.conflicts\n\t\t\t\t\t\t\t.slice(0, 8)\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(conflict) =>\n\t\t\t\t\t\t\t\t\t`${conflict.serverName}: ${conflict.sources.map((source) => source.path).join(\" -> \")} (winner: ${conflict.winner.path})`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\"Nexus writes global MCP state to ~/.config/nexus/mcp.json and project state to .nexus/mcp.json.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"open-paths\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\tthis.getDetectedPaths().length > 0\n\t\t\t\t\t\t? [\"Detected paths:\", ...this.getDetectedPaths()]\n\t\t\t\t\t\t: [\"No config paths were detected.\"],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-repoprompt\": {\n\t\t\t\tconst repoPrompt = this.discovery.repoPrompt;\n\t\t\t\tconst preview = this.callbacks.previewRepoPrompt();\n\t\t\t\tif (!preview) {\n\t\t\t\t\treturn this.formatPreview([\"RepoPrompt is not available to add from this setup screen.\"], previewW);\n\t\t\t\t}\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"RepoPrompt write preview\",\n\t\t\t\t\tpreview,\n\t\t\t\t\t[\n\t\t\t\t\t\t`Executable: ${repoPrompt.executablePath ?? \"not found\"}`,\n\t\t\t\t\t\t`Target: ${repoPrompt.targetPath ?? \"n/a\"}`,\n\t\t\t\t\t\t`Server name: ${repoPrompt.serverName ?? \"repoprompt\"}`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"add-known-server\": {\n\t\t\t\tconst preset = action.preset;\n\t\t\t\tif (!preset) return this.formatPreview([\"Known server preset is unavailable.\"], previewW);\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t`${preset.name} write preview`,\n\t\t\t\t\tthis.callbacks.previewKnownServer(preset),\n\t\t\t\t\t[preset.summary],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"scaffold-project\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Starter project `.nexus/mcp.json` write preview\",\n\t\t\t\t\tthis.callbacks.previewStarterProject(),\n\t\t\t\t\t[\n\t\t\t\t\t\t\"This writes a minimal `.nexus/mcp.json` in the current project using the Nexus MCP layout.\",\n\t\t\t\t\t\t\"It intentionally avoids adding a fake placeholder server that would fail on first reload.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn this.formatPreview([\"Close the setup flow.\"], previewW);\n\t\t}\n\t}\n\n\tprivate formatPreview(lines: string[], width = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tconst preview: string[] = [];\n\t\tfor (const line of lines) {\n\t\t\tpreview.push(...wrapText(line, width));\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate formatWritePreview(\n\t\ttitle: string,\n\t\tpreview: ConfigWritePreview,\n\t\tintro: string[] = [],\n\t\twidth = DESKTOP_PREVIEW_WIDTH,\n\t): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const line of intro) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (intro.length > 0) lines.push(\"\");\n\t\tlines.push(...wrapText(`${title}: ${preview.path}`, width));\n\t\tlines.push(\n\t\t\t...wrapText(\n\t\t\t\tpreview.existed\n\t\t\t\t\t? \"Existing file detected. Showing exact before/after diff.\"\n\t\t\t\t\t: \"New file will be created. Showing exact content diff.\",\n\t\t\t\twidth,\n\t\t\t),\n\t\t);\n\t\tlines.push(\"\");\n\t\tconst diffLines = preview.diffText.split(\"\\n\");\n\t\tconst maxLines = 18;\n\t\tconst shown = diffLines.slice(0, maxLines);\n\t\tfor (const line of shown) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (diffLines.length > maxLines) {\n\t\t\tlines.push(\n\t\t\t\t...wrapText(\n\t\t\t\t\t`… ${diffLines.length - maxLines} more diff line${diffLines.length - maxLines === 1 ? \"\" : \"s\"}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate padLine(text: string, innerW: number): string {\n\t\tconst inset = 2;\n\t\tconst contentW = Math.max(0, innerW - inset * 2);\n\t\tconst fitted = truncateToWidth(text, contentW, \"…\", true);\n\t\tconst plainWidth = visibleWidth(fitted);\n\t\tconst padding = Math.max(0, contentW - plainWidth);\n\t\treturn `│${\" \".repeat(inset)}${fitted}${\" \".repeat(padding)}${\" \".repeat(inset)}│`;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.cleanup();\n\t}\n}\n\nexport function createMcpSetupPanel(\n\tdiscovery: McpDiscoverySummary,\n\tcallbacks: SetupPanelCallbacks,\n\toptions: SetupPanelOptions,\n\ttui: { requestRender(): void },\n\tdone: () => void,\n): McpSetupPanel & { dispose(): void } {\n\treturn new McpSetupPanel(discovery, callbacks, options, tui, done);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-setup-panel.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-setup-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport {\n\ttype ConfigWritePreview,\n\tKNOWN_SERVER_PRESETS,\n\ttype KnownServerPreset,\n\ttype McpDiscoverySummary,\n} from \"./config.ts\";\nimport type { McpOnboardingState } from \"./onboarding-state.ts\";\nimport { createPanelKeys, type PanelKeybindings, type PanelKeys } from \"./panel-keys.ts\";\nimport type { ImportKind, ServerEntry } from \"./types.ts\";\n\ninterface SetupTheme {\n\tborder: string;\n\ttitle: string;\n\tselected: string;\n\thint: string;\n\tsuccess: string;\n\twarning: string;\n\tmuted: string;\n}\n\nconst DEFAULT_THEME: SetupTheme = {\n\tborder: \"2\",\n\ttitle: \"36\",\n\tselected: \"32\",\n\thint: \"2\",\n\tsuccess: \"32\",\n\twarning: \"33\",\n\tmuted: \"2;3\",\n};\n\nconst MIN_PANEL_WIDTH = 24;\nconst COMPACT_WIDTH = 60;\nconst COMPACT_ACTION_ROWS = 7;\nconst DESKTOP_PREVIEW_WIDTH = 74;\n\nfunction fg(code: string, text: string): string {\n\treturn code ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction wrapText(text: string, width: number): string[] {\n\tif (width <= 8) return [text];\n\tconst words = text.split(/\\s+/).filter(Boolean);\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tfor (const word of words) {\n\t\tconst candidate = current ? `${current} ${word}` : word;\n\t\tif (visibleWidth(candidate) <= width) {\n\t\t\tcurrent = candidate;\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) lines.push(current);\n\t\tcurrent = word;\n\t}\n\tif (current) lines.push(current);\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\nexport interface SetupPanelCallbacks {\n\tpreviewImports: (imports: ImportKind[]) => ConfigWritePreview;\n\tpreviewStarterProject: () => ConfigWritePreview;\n\tpreviewRepoPrompt: () => ConfigWritePreview | null;\n\tpreviewKnownServer: (preset: KnownServerPreset) => ConfigWritePreview;\n\tadoptImports: (imports: ImportKind[]) => Promise<{ added: ImportKind[]; path: string }>;\n\tscaffoldProjectConfig: () => Promise<{ path: string }>;\n\taddRepoPrompt: () => Promise<{ path: string; serverName: string }>;\n\taddKnownServer: (preset: KnownServerPreset) => Promise<{ path: string; serverName: string }>;\n\topenPath: (path: string) => Promise<void>;\n\tmarkSetupCompleted: () => void;\n\t/** Replace the main chat input with `text`, so the user lands on a ready-to-edit command after this panel closes. */\n\tseedEditor: (text: string) => void;\n\t/** Flip a configured server's disabled flag in the project config. */\n\ttoggleServerDisabled: (serverName: string, disabled: boolean) => Promise<{ path: string; changed: boolean }>;\n\t/** Run the actual OAuth sign-in flow (opens a browser) for an already-loaded, OAuth-capable server. */\n\t/** `fallbackEntry` lets a server just written this session (not yet in the live config) authenticate immediately, before /reload. */\n\tauthenticateServer: (serverName: string, fallbackEntry?: ServerEntry) => Promise<{ ok: boolean; message: string }>;\n}\n\nexport interface InstalledServerEntry {\n\tname: string;\n\tdisabled: boolean;\n\tkind: \"stdio\" | \"http\";\n\t/** Whether this server is configured for OAuth, so the Installed tab can offer a sign-in action. */\n\tauthCapable: boolean;\n\t/** Whether OAuth tokens actually exist for this server right now. Meaningless (false) when authCapable is false. */\n\tsignedIn: boolean;\n}\n\nexport interface SetupPanelOptions {\n\tmode: \"empty\" | \"setup\";\n\tonboardingState: McpOnboardingState;\n\tkeybindings?: PanelKeybindings;\n\t/** Effective, already-configured servers (from every source), for the Installed tab and the Presets \"active\" marker. */\n\tinstalledServers: InstalledServerEntry[];\n}\n\ntype Screen = \"empty\" | \"setup\" | \"imports\" | \"paths\" | \"confirm-preset\" | \"advanced\";\n\ntype SetupTab = \"presets\" | \"custom\" | \"installed\";\n\nconst SETUP_TABS: ReadonlyArray<{ id: SetupTab; label: string }> = [\n\t{ id: \"presets\", label: \"Presets\" },\n\t{ id: \"custom\", label: \"Custom\" },\n\t{ id: \"installed\", label: \"Installed\" },\n];\n\ntype ActionId =\n\t| \"adopt-imports\"\n\t| \"view-example\"\n\t| \"show-precedence\"\n\t| \"open-paths\"\n\t| \"add-repoprompt\"\n\t| \"add-known-server\"\n\t| \"add-custom-stdio\"\n\t| \"add-custom-url\"\n\t| \"open-advanced\"\n\t| \"scaffold-project\"\n\t| \"view-installed-server\";\n\ninterface Action {\n\tid: ActionId;\n\tlabel: string;\n\tdescription: string;\n\tpreset?: KnownServerPreset;\n\tinstalled?: InstalledServerEntry;\n}\n\n/** Server-type tag shown next to a preset row; color must survive any terminal, so it's always plain colored text. */\n/** Color a JSON-ish line: keys cyan, string values green, braces/brackets dim. Safe only for short, unwrapped lines. */\nfunction colorizeJsonLine(line: string): string {\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ch = line[i]!;\n\t\tif (ch === '\"') {\n\t\t\tlet end = i + 1;\n\t\t\twhile (end < line.length && line[end] !== '\"') end++;\n\t\t\tconst str = line.slice(i, Math.min(end + 1, line.length));\n\t\t\tconst isKey = line\n\t\t\t\t.slice(i + str.length)\n\t\t\t\t.trimStart()\n\t\t\t\t.startsWith(\":\");\n\t\t\tresult += fg(isKey ? \"36\" : \"32\", str);\n\t\t\ti += str.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"{\" || ch === \"}\" || ch === \"[\" || ch === \"]\") {\n\t\t\tresult += fg(\"2\", ch);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += ch;\n\t\ti++;\n\t}\n\treturn result;\n}\n\n/** Diff-line color by prefix, or undefined for a context line that needs no color. */\nfunction diffLineColor(line: string): string | undefined {\n\tif (line.startsWith(\"+++\") || line.startsWith(\"---\")) return \"2\";\n\tif (line.startsWith(\"+\")) return \"32\";\n\tif (line.startsWith(\"-\")) return \"31\";\n\treturn undefined;\n}\n\n/** Color `/mcp add` command syntax: the command itself cyan, --flags yellow, <placeholders> dim italic. Leaves spacing untouched. */\nfunction colorizeCommandLine(line: string): string {\n\treturn line.replace(/(\\/mcp add\\b|--[a-zA-Z-]+|<[^>]+>|\\[[^\\]]+\\])/g, (match) => {\n\t\tif (match.startsWith(\"<\") || match.startsWith(\"[\")) return fg(\"2;3\", match);\n\t\tif (match.startsWith(\"--\")) return fg(\"33\", match);\n\t\treturn fg(\"36\", match);\n\t});\n}\n\n/** Per-preset accent color for the name, so the list scans by identity, not just by type. 256-color codes, distinct from the type-tag palette above. */\nconst PRESET_ACCENT_COLORS: Record<string, string> = {\n\tdeepwiki: \"38;5;111\", // soft blue\n\tcontext7: \"38;5;80\", // teal\n\tnotion: \"38;5;141\", // purple\n\tgithub: \"38;5;215\", // orange\n\t\"chrome-devtools\": \"38;5;211\", // pink\n};\n\nfunction presetAccent(preset: KnownServerPreset): string {\n\treturn PRESET_ACCENT_COLORS[preset.id] ?? \"37\";\n}\n\nexport class McpSetupPanel {\n\tprivate screen: Screen;\n\tprivate activeTab: SetupTab;\n\tprivate actionCursor = 0;\n\tprivate importCursor = 0;\n\tprivate pathCursor = 0;\n\tprivate advancedCursor = 0;\n\tprivate selectedImports = new Set<ImportKind>();\n\tprivate busy = false;\n\tprivate notice: { text: string; tone: \"success\" | \"warning\" | \"muted\" } | null = null;\n\tprivate pendingAction: Action | undefined;\n\tprivate maxHeight: number | undefined;\n\tprivate tui: { requestRender(): void };\n\tprivate t = DEFAULT_THEME;\n\tprivate keys: PanelKeys;\n\tprivate inactivityTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate discovery: McpDiscoverySummary;\n\tprivate callbacks: SetupPanelCallbacks;\n\tprivate options: SetupPanelOptions;\n\t/** Mutable copy of options.installedServers, updated in-place after a successful add so the Installed tab and Presets \"active\" tag reflect it immediately, without needing to close and reopen the panel. */\n\tprivate installedServers: InstalledServerEntry[];\n\tprivate done: () => void;\n\tprivate static readonly INACTIVITY_MS = 60_000;\n\n\tconstructor(\n\t\tdiscovery: McpDiscoverySummary,\n\t\tcallbacks: SetupPanelCallbacks,\n\t\toptions: SetupPanelOptions,\n\t\ttui: { requestRender(): void },\n\t\tdone: () => void,\n\t) {\n\t\tthis.discovery = discovery;\n\t\tthis.callbacks = callbacks;\n\t\tthis.options = options;\n\t\tthis.installedServers = [...options.installedServers];\n\t\tthis.done = done;\n\t\tthis.tui = tui;\n\t\tthis.keys = createPanelKeys(options.keybindings);\n\t\tthis.screen = options.mode;\n\t\tthis.activeTab = \"presets\";\n\t\tfor (const entry of discovery.imports) {\n\t\t\tthis.selectedImports.add(entry.kind);\n\t\t}\n\t\tthis.resetInactivityTimeout();\n\t}\n\n\tprivate resetInactivityTimeout(): void {\n\t\tif (this.inactivityTimeout) clearTimeout(this.inactivityTimeout);\n\t\tthis.inactivityTimeout = setTimeout(() => {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t}, McpSetupPanel.INACTIVITY_MS);\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.inactivityTimeout) {\n\t\t\tclearTimeout(this.inactivityTimeout);\n\t\t\tthis.inactivityTimeout = null;\n\t\t}\n\t}\n\n\t/** The old \"Setup\" tab's contents — now a sub-screen opened from Custom's \"Advanced options...\", not a permanent top-level tab. */\n\tprivate getAdvancedActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tif (this.discovery.imports.length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"adopt-imports\",\n\t\t\t\tlabel: \"Adopt detected compatibility imports\",\n\t\t\t\tdescription: `Choose which host-specific MCP configs Nexus should import into its own override file. ${this.discovery.imports.length} source${this.discovery.imports.length === 1 ? \"\" : \"s\"} found.`,\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"view-example\",\n\t\t\tlabel: \"View example `.nexus/mcp.json`\",\n\t\t\tdescription: \"Preview a working Nexus MCP config you can paste or adapt.\",\n\t\t});\n\t\tif (!this.discovery.sources.some((source) => source.id === \"nexus-project\" && source.exists)) {\n\t\t\tactions.push({\n\t\t\t\tid: \"scaffold-project\",\n\t\t\t\tlabel: \"Scaffold project `.nexus/mcp.json`\",\n\t\t\t\tdescription: \"Write a minimal Nexus project MCP config, then reload Nexus.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"show-precedence\",\n\t\t\tlabel: \"Explain config precedence\",\n\t\t\tdescription: \"Show the read order and where Nexus writes compatibility settings.\",\n\t\t});\n\t\tif (this.getDetectedPaths().length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"open-paths\",\n\t\t\t\tlabel: \"Open detected config paths\",\n\t\t\t\tdescription: \"Browse the actual config files that Nexus discovered on this machine.\",\n\t\t\t});\n\t\t}\n\t\treturn actions;\n\t}\n\n\tprivate getPresetsTabActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tfor (const preset of KNOWN_SERVER_PRESETS) {\n\t\t\tactions.push({ id: \"add-known-server\", label: preset.name, description: preset.summary, preset });\n\t\t}\n\t\tif (\n\t\t\t!this.discovery.repoPrompt.configured &&\n\t\t\tthis.discovery.repoPrompt.executablePath &&\n\t\t\tthis.discovery.repoPrompt.targetPath &&\n\t\t\tthis.discovery.repoPrompt.entry &&\n\t\t\tthis.discovery.repoPrompt.serverName\n\t\t) {\n\t\t\tactions.push({\n\t\t\t\tid: \"add-repoprompt\",\n\t\t\t\tlabel: \"Add RepoPrompt to Nexus MCP config\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Write an MCP entry for RepoPrompt to the recommended Nexus target, then reload MCP in-session.\",\n\t\t\t});\n\t\t}\n\t\treturn actions;\n\t}\n\n\tprivate getCustomTabActions(): Action[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: \"add-custom-stdio\",\n\t\t\t\tlabel: \"Add a local server (stdio)...\",\n\t\t\t\tdescription: \"Runs a command on your machine, e.g. an npx-installed MCP server.\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"add-custom-url\",\n\t\t\t\tlabel: \"Add a remote server (URL)...\",\n\t\t\t\tdescription: \"Connects to an MCP server over HTTP.\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"open-advanced\",\n\t\t\t\tlabel: \"Advanced options...\",\n\t\t\t\tdescription: \"Import from other tools, scaffold an empty config, or check how config precedence works.\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate getInstalledTabActions(): Action[] {\n\t\tconst servers = this.installedServers;\n\t\tif (servers.length === 0) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: \"view-installed-server\",\n\t\t\t\t\tlabel: \"No servers configured yet.\",\n\t\t\t\t\tdescription: \"Add one from the Presets or Custom tab.\",\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\treturn servers.map((server) => ({\n\t\t\tid: \"view-installed-server\" as const,\n\t\t\tlabel: server.name,\n\t\t\tdescription: server.disabled\n\t\t\t\t? \"Disabled in the effective config.\"\n\t\t\t\t: server.authCapable && !server.signedIn\n\t\t\t\t\t? \"Active, but not signed in yet.\"\n\t\t\t\t\t: \"Active in the effective config.\",\n\t\t\tinstalled: server,\n\t\t}));\n\t}\n\n\t/**\n\t * Single-glyph prefix instead of a tag chip: ✓ for a preset you already have\n\t * (dim if you've disabled it), ✓/⊘ for an Installed-tab row's active state.\n\t * No mark at all for a preset you don't have yet, to keep the list scannable.\n\t */\n\tprivate getRowMark(action: Action): string {\n\t\tif (action.preset) {\n\t\t\tconst installed = this.installedServers.find((server) => server.name === action.preset!.id);\n\t\t\treturn installed ? fg(installed.disabled ? this.t.muted : this.t.success, \"✓ \") : \" \";\n\t\t}\n\t\tif (action.installed) {\n\t\t\tif (action.installed.disabled) return fg(this.t.muted, \"⊘ \");\n\t\t\tif (action.installed.authCapable && !action.installed.signedIn) return fg(this.t.warning, \"! \");\n\t\t\treturn fg(this.t.success, \"✓ \");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tprivate getActions(): Action[] {\n\t\tswitch (this.activeTab) {\n\t\t\tcase \"presets\":\n\t\t\t\treturn this.getPresetsTabActions();\n\t\t\tcase \"custom\":\n\t\t\t\treturn this.getCustomTabActions();\n\t\t\tcase \"installed\":\n\t\t\t\treturn this.getInstalledTabActions();\n\t\t}\n\t}\n\n\tprivate cycleTab(direction: 1 | -1): void {\n\t\tconst order = SETUP_TABS.map((tab) => tab.id);\n\t\tconst index = order.indexOf(this.activeTab);\n\t\tthis.activeTab = order[(index + direction + order.length) % order.length] as SetupTab;\n\t\tthis.actionCursor = 0;\n\t\tthis.notice = null;\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate getDetectedPaths(): string[] {\n\t\tconst paths = [\n\t\t\t...this.discovery.sources.filter((source) => source.exists).map((source) => source.path),\n\t\t\t...this.discovery.imports.map((entry) => entry.path),\n\t\t];\n\t\treturn [...new Set(paths)];\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.resetInactivityTimeout();\n\t\tif (!this.busy) this.notice = null;\n\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tif (this.screen === \"imports\" || this.screen === \"paths\") {\n\t\t\t\t// Both are only reachable from the Advanced sub-screen now — back out one level, not all the way to the tabs.\n\t\t\t\tthis.screen = \"advanced\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.screen === \"confirm-preset\" || this.screen === \"advanced\") {\n\t\t\t\tthis.pendingAction = undefined;\n\t\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.busy) return;\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tthis.handleImportsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"paths\") {\n\t\t\tthis.handlePathsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"confirm-preset\") {\n\t\t\tthis.handleConfirmPresetInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"advanced\") {\n\t\t\tthis.handleAdvancedInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"left\")) {\n\t\t\tthis.cycleTab(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"right\")) {\n\t\t\tthis.cycleTab(1);\n\t\t\treturn;\n\t\t}\n\n\t\tconst actions = this.getActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.actionCursor = Math.max(0, this.actionCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.actionCursor = Math.min(actions.length - 1, this.actionCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"o\" || data === \"O\") {\n\t\t\tthis.openSelectedDocs();\n\t\t\treturn;\n\t\t}\n\t\tif ((data === \"a\" || data === \"A\") && this.activeTab === \"installed\") {\n\t\t\tthis.authenticateSelected();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = this.getSelectedAction();\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleImportsInput(data: string): void {\n\t\tconst imports = this.discovery.imports;\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.importCursor = Math.max(0, this.importCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.importCursor = Math.min(imports.length - 1, this.importCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"space\")) {\n\t\t\tconst current = imports[this.importCursor];\n\t\t\tif (!current) return;\n\t\t\tif (this.selectedImports.has(current.kind)) {\n\t\t\t\tthis.selectedImports.delete(current.kind);\n\t\t\t} else {\n\t\t\t\tthis.selectedImports.add(current.kind);\n\t\t\t}\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.applySelectedImports();\n\t\t}\n\t}\n\n\tprivate handlePathsInput(data: string): void {\n\t\tconst paths = this.getDetectedPaths();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.pathCursor = Math.max(0, this.pathCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.pathCursor = Math.min(paths.length - 1, this.pathCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = paths[this.pathCursor];\n\t\t\tif (!selected) return;\n\t\t\tvoid this.runBusy(async () => {\n\t\t\t\tawait this.callbacks.openPath(selected);\n\t\t\t\tthis.notice = { text: `Opened ${selected}`, tone: \"success\" };\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleAdvancedInput(data: string): void {\n\t\tconst actions = this.getAdvancedActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.advancedCursor = Math.max(0, this.advancedCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.advancedCursor = Math.min(actions.length - 1, this.advancedCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = actions[this.advancedCursor];\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleConfirmPresetInput(data: string): void {\n\t\tif (data === \"o\" || data === \"O\") {\n\t\t\tthis.openSelectedDocs();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.confirmPendingAction();\n\t\t}\n\t}\n\n\t/** Getter used by openSelectedDocs while the confirm screen is up (no action-list cursor there). */\n\tprivate getSelectedAction(): Action | undefined {\n\t\tif (this.screen === \"confirm-preset\") return this.pendingAction;\n\t\tconst actions = this.getActions();\n\t\treturn actions[this.actionCursor];\n\t}\n\n\t/** Add or replace an entry so the Installed tab and Presets \"active\" tag update immediately, without closing the panel. */\n\tprivate upsertInstalledServer(entry: InstalledServerEntry): void {\n\t\tconst index = this.installedServers.findIndex((server) => server.name === entry.name);\n\t\tif (index === -1) this.installedServers.push(entry);\n\t\telse this.installedServers[index] = entry;\n\t}\n\n\tprivate async confirmPendingAction(): Promise<void> {\n\t\tconst action = this.pendingAction;\n\t\tif (!action) return;\n\t\tif (action.id === \"add-repoprompt\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addRepoPrompt();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind: \"stdio\",\n\t\t\t\t\tauthCapable: false,\n\t\t\t\t\tsignedIn: false,\n\t\t\t\t});\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t} else if (action.id === \"add-known-server\" && action.preset) {\n\t\t\tconst preset = action.preset;\n\t\t\tconst authCapable = preset.entry.auth === \"oauth\";\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addKnownServer(preset);\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tconst kind = preset.entry.command ? (\"stdio\" as const) : (\"http\" as const);\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind,\n\t\t\t\t\tauthCapable,\n\t\t\t\t\tsignedIn: false,\n\t\t\t\t});\n\t\t\t\tif (!authCapable) {\n\t\t\t\t\tthis.notice = {\n\t\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t};\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Sign in right now, in the same flow — this is the whole point of a preset:\n\t\t\t\t// don't make the user hunt down a separate command after the fact.\n\t\t\t\tthis.notice = { text: `Added ${result.serverName}. Opening your browser to sign in…`, tone: \"muted\" };\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\tconst authResult = await this.callbacks.authenticateServer(result.serverName, preset.entry);\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind,\n\t\t\t\t\tauthCapable,\n\t\t\t\t\tsignedIn: authResult.ok,\n\t\t\t\t});\n\t\t\t\tthis.notice = authResult.ok\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added and signed in to ${result.serverName} (${result.path}). Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}, but sign-in didn't finish: ${authResult.message} Retry anytime from the Installed tab (press \"a\").`,\n\t\t\t\t\t\t\ttone: \"warning\",\n\t\t\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\tthis.pendingAction = undefined;\n\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async runAction(action: Action): Promise<void> {\n\t\tif (action.id === \"adopt-imports\") {\n\t\t\tthis.screen = \"imports\";\n\t\t\tthis.importCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-paths\") {\n\t\t\tthis.screen = \"paths\";\n\t\t\tthis.pathCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"scaffold-project\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.scaffoldProjectConfig();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Wrote starter config to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-repoprompt\" || (action.id === \"add-known-server\" && action.preset)) {\n\t\t\tthis.pendingAction = action;\n\t\t\tthis.screen = \"confirm-preset\";\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-custom-stdio\" || action.id === \"add-custom-url\") {\n\t\t\tconst template = action.id === \"add-custom-stdio\" ? \"/mcp add my-server -- \" : \"/mcp add my-server --url \";\n\t\t\tthis.callbacks.seedEditor(template);\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-advanced\") {\n\t\t\tthis.screen = \"advanced\";\n\t\t\tthis.advancedCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"view-installed-server\" && action.installed) {\n\t\t\tconst server = action.installed;\n\t\t\tconst nextDisabled = !server.disabled;\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.toggleServerDisabled(server.name, nextDisabled);\n\t\t\t\tthis.upsertInstalledServer({ ...server, disabled: nextDisabled });\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `${nextDisabled ? \"Disabled\" : \"Enabled\"} \"${server.name}\" in ${result.path} — run /reload to apply.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.notice = {\n\t\t\ttext: \"Review the details below. Press Enter on an action with a side effect to apply it.\",\n\t\t\ttone: \"muted\",\n\t\t};\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async applySelectedImports(): Promise<void> {\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tif (selected.length === 0) {\n\t\t\tthis.notice = { text: \"Select at least one compatibility import first.\", tone: \"warning\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBusy(async () => {\n\t\t\tconst result = await this.callbacks.adoptImports(selected);\n\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\tthis.notice =\n\t\t\t\tresult.added.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added ${result.added.join(\", \")} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: { text: `No changes needed in ${result.path}.`, tone: \"muted\" };\n\t\t\tthis.screen = \"advanced\";\n\t\t\tthis.advancedCursor = 0;\n\t\t});\n\t}\n\n\tprivate openSelectedDocs(): void {\n\t\tconst selected = this.getSelectedAction();\n\t\tconst docsUrl = selected?.preset?.docsUrl;\n\t\tif (!docsUrl) {\n\t\t\tthis.notice = { text: \"No docs link for this item.\", tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tvoid this.runBusy(async () => {\n\t\t\tawait this.callbacks.openPath(docsUrl);\n\t\t\tthis.notice = { text: `Opened ${docsUrl}`, tone: \"success\" };\n\t\t});\n\t}\n\n\tprivate authenticateSelected(): void {\n\t\tconst selected = this.getSelectedAction();\n\t\tconst server = selected?.installed;\n\t\tif (!server) return;\n\t\tif (!server.authCapable) {\n\t\t\tthis.notice = { text: `\"${server.name}\" isn't configured for OAuth sign-in.`, tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tvoid this.runBusy(async () => {\n\t\t\tthis.notice = { text: `Opening your browser to sign in to \"${server.name}\"…`, tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\tconst result = await this.callbacks.authenticateServer(server.name);\n\t\t\tthis.upsertInstalledServer({ ...server, signedIn: result.ok });\n\t\t\tthis.notice = { text: result.message, tone: result.ok ? \"success\" : \"warning\" };\n\t\t});\n\t}\n\n\tprivate async runBusy(fn: () => Promise<void>): Promise<void> {\n\t\tthis.busy = true;\n\t\tthis.notice = { text: \"Working...\", tone: \"muted\" };\n\t\tthis.tui.requestRender();\n\t\ttry {\n\t\t\tawait fn();\n\t\t} catch (error) {\n\t\t\tthis.notice = {\n\t\t\t\ttext: error instanceof Error ? error.message : String(error),\n\t\t\t\ttone: \"warning\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst panelW = Math.max(MIN_PANEL_WIDTH, width);\n\t\tconst innerW = panelW - 2;\n\t\tconst contentW = this.contentWidth(innerW);\n\t\tconst lines: string[] = [];\n\t\tconst border = fg(this.t.border, \"─\".repeat(innerW));\n\t\tlines.push(`┌${border}┐`);\n\t\tlines.push(this.padLine(fg(this.t.title, \"MCP setup\"), innerW));\n\t\tfor (const line of wrapText(this.discoverySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tfor (const line of wrapText(this.secondarySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, line), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (this.notice) {\n\t\t\tconst tone =\n\t\t\t\tthis.notice.tone === \"success\"\n\t\t\t\t\t? this.t.success\n\t\t\t\t\t: this.notice.tone === \"warning\"\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.hint;\n\t\t\tfor (const line of wrapText(this.notice.text, contentW)) {\n\t\t\t\tlines.push(this.padLine(fg(tone, line), innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\n\t\tlines.push(`├${border}┤`);\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tlines.push(...this.renderImports(innerW));\n\t\t} else if (this.screen === \"paths\") {\n\t\t\tlines.push(...this.renderPaths(innerW));\n\t\t} else if (this.screen === \"confirm-preset\") {\n\t\t\tlines.push(...this.renderConfirmPreset(innerW));\n\t\t} else if (this.screen === \"advanced\") {\n\t\t\tlines.push(...this.renderAdvanced(innerW));\n\t\t} else {\n\t\t\tlines.push(...this.renderActions(innerW));\n\t\t}\n\n\t\tlines.push(`└${border}┘`);\n\t\treturn this.clampHeight(lines, innerW, border);\n\t}\n\n\tsetMaxHeight(lines: number): void {\n\t\tthis.maxHeight = lines;\n\t}\n\n\t/**\n\t * The overlay host may cap total rows and, absent this hook, would slice\n\t * blindly from the bottom — cutting off the closing border and leaving the\n\t * box looking broken. Truncate the content instead, keeping the header and\n\t * action list (the interactive part) and dropping preview/diff lines first.\n\t */\n\tprivate clampHeight(lines: string[], innerW: number, _border: string): string[] {\n\t\tif (this.maxHeight === undefined || lines.length <= this.maxHeight) return lines;\n\t\tconst budget = Math.max(5, this.maxHeight);\n\t\t// The last line is the closing border, the one before it is the hint/controls\n\t\t// line — both must always stay visible, or the panel loses its own instructions.\n\t\tconst closing = lines[lines.length - 1]!;\n\t\tconst footer = lines[lines.length - 2]!;\n\t\tconst head = lines.slice(0, Math.max(1, budget - 3));\n\t\tconst hidden = lines.length - head.length - 2;\n\t\tif (hidden <= 0) return lines;\n\t\treturn [\n\t\t\t...head,\n\t\t\tthis.padLine(\n\t\t\t\tfg(this.t.muted, `… ${hidden} more line${hidden === 1 ? \"\" : \"s\"} hidden to fit the window`),\n\t\t\t\tinnerW,\n\t\t\t),\n\t\t\tfooter,\n\t\t\tclosing,\n\t\t];\n\t}\n\n\tprivate renderTabBar(): string {\n\t\treturn SETUP_TABS.map((tab) =>\n\t\t\ttab.id === this.activeTab ? fg(this.t.selected, `[ ${tab.label} ]`) : fg(this.t.muted, ` ${tab.label} `),\n\t\t).join(\" \");\n\t}\n\n\tprivate renderActions(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getActions();\n\t\tconst compact = innerW < COMPACT_WIDTH;\n\t\tconst { start, end } = compact ? this.visibleActionRange(actions.length) : { start: 0, end: actions.length };\n\n\t\tlines.push(this.padLine(this.renderTabBar(), innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (start > 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${start} more above`), innerW));\n\t\t}\n\t\tfor (let index = start; index < end; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tconst selected = index === this.actionCursor;\n\t\t\tconst cursor = selected ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst mark = this.getRowMark(action);\n\t\t\tconst label = truncateToWidth(action.label, Math.max(1, this.contentWidth(innerW) - 2 - visibleWidth(mark)));\n\t\t\tconst installedColor = action.installed\n\t\t\t\t? action.installed.disabled\n\t\t\t\t\t? this.t.muted\n\t\t\t\t\t: action.installed.authCapable && !action.installed.signedIn\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.success\n\t\t\t\t: undefined;\n\t\t\tconst labelRendered = action.preset\n\t\t\t\t? fg(presetAccent(action.preset), label)\n\t\t\t\t: installedColor\n\t\t\t\t\t? fg(installedColor, label)\n\t\t\t\t\t: label;\n\t\t\tlines.push(this.padLine(`${cursor} ${mark}${labelRendered}`, innerW));\n\t\t}\n\t\tif (end < actions.length) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${actions.length - end} more below`), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\t// Presets stay a clean, scannable list — no inline summary/diff while browsing.\n\t\t// The write preview only shows on the confirm screen, after pressing Enter.\n\t\tif (this.activeTab !== \"presets\") {\n\t\t\tconst preview = this.getActionPreview(this.getSelectedAction(), this.previewWidth(innerW));\n\t\t\tfor (const line of preview) {\n\t\t\t\tlines.push(this.padLine(line, innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\t\tconst docsHint = this.activeTab === \"presets\" ? \" · o docs\" : \"\";\n\t\tconst confirmHint = this.activeTab === \"presets\" ? \" · enter to review & confirm\" : \"\";\n\t\tconst checkHint = this.activeTab === \"presets\" && this.installedServers.length > 0 ? \" · ✓ already added\" : \"\";\n\t\tconst authHint =\n\t\t\tthis.activeTab === \"installed\" && this.installedServers.some((server) => server.authCapable)\n\t\t\t\t? \" · a sign in\"\n\t\t\t\t: \"\";\n\t\tconst hint = compact\n\t\t\t? `Enter select · ←/→ tabs${docsHint} · Esc back`\n\t\t\t: `Enter selects${confirmHint}, ←/→ switch tabs${docsHint}${checkHint}${authHint}, Esc goes back, Ctrl+C closes.`;\n\t\tlines.push(this.padLine(fg(this.t.muted, hint), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderImports(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select compatibility imports. Space toggles, Enter saves, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tfor (let index = 0; index < this.discovery.imports.length; index++) {\n\t\t\tconst entry = this.discovery.imports[index];\n\t\t\tif (!entry) continue;\n\t\t\tconst selected = this.selectedImports.has(entry.kind) ? \"[x]\" : \"[ ]\";\n\t\t\tconst cursor = index === this.importCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${selected} ${entry.kind} ${entry.path}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tconst preview = this.callbacks.previewImports(selected);\n\t\tfor (const line of this.formatWritePreview(\n\t\t\t\"Compatibility import write preview\",\n\t\t\tpreview,\n\t\t\t[],\n\t\t\tthis.previewWidth(innerW),\n\t\t)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderPaths(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select a detected config path to open. Enter opens it, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst paths = this.getDetectedPaths();\n\t\tfor (let index = 0; index < paths.length; index++) {\n\t\t\tconst cursor = index === this.pathCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst path = paths[index];\n\t\t\tif (path !== undefined) lines.push(this.padLine(`${cursor} ${path}`, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderAdvanced(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getAdvancedActions();\n\t\tlines.push(this.padLine(`${fg(this.t.muted, \"Custom\")} > ${fg(this.t.title, \"Advanced options\")}`, innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tif (actions.length === 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, \"Nothing here right now — nice, config is already tidy.\"), innerW));\n\t\t}\n\t\tfor (let index = 0; index < actions.length; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tconst cursor = index === this.advancedCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst label = truncateToWidth(action.label, Math.max(1, this.contentWidth(innerW) - 2));\n\t\t\tlines.push(this.padLine(`${cursor} ${label}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\t// This is the one screen where showing the full explanation on highlight is the point —\n\t\t// you only ever get here by deliberately asking for \"Advanced options\".\n\t\tconst preview = this.getActionPreview(actions[this.advancedCursor], this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tlines.push(this.padLine(fg(this.t.muted, \"Enter selects, Esc back to Custom, Ctrl+C closes.\"), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderConfirmPreset(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst action = this.pendingAction;\n\t\tconst name = action?.preset?.name ?? (action?.id === \"add-repoprompt\" ? \"RepoPrompt\" : \"this server\");\n\t\tlines.push(this.padLine(fg(this.t.title, `Confirm: add ${name}`), innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst preview = this.getActionPreview(action, this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst docsHint = action?.preset?.docsUrl ? \" · o docs\" : \"\";\n\t\tlines.push(this.padLine(fg(this.t.muted, `Enter writes this file${docsHint} · Esc goes back`), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate discoverySummaryLine(): string {\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn fg(\n\t\t\t\tthis.t.warning,\n\t\t\t\tthis.options.onboardingState.setupCompleted\n\t\t\t\t\t? \"No MCP servers are active right now.\"\n\t\t\t\t\t: \"No MCP config is active yet.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tthis.discovery.totalServerCount === 0 &&\n\t\t\t(this.discovery.imports.length > 0 || !!this.discovery.repoPrompt.executablePath)\n\t\t) {\n\t\t\treturn fg(this.t.warning, \"Nexus found MCP-related setup options, but none are active in Nexus yet.\");\n\t\t}\n\n\t\tconst configuredSources = this.discovery.sources.filter((source) => source.serverCount > 0).length;\n\t\treturn fg(\n\t\t\tthis.t.hint,\n\t\t\t`Detected ${this.discovery.totalServerCount} configured servers across ${configuredSources} Nexus source${configuredSources === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t}\n\n\tprivate secondarySummaryLine(): string {\n\t\tconst hostNote =\n\t\t\tthis.discovery.hostConfigs.length > 0\n\t\t\t\t? ` Host discovery is ${this.discovery.hostConfigDiscovery}; ${this.discovery.hostConfigs.length} host source${this.discovery.hostConfigs.length === 1 ? \"\" : \"s\"} detected.`\n\t\t\t\t: \"\";\n\t\tconst conflictNote =\n\t\t\tthis.discovery.conflicts.length > 0\n\t\t\t\t? ` ${this.discovery.conflicts.length} same-name conflict${this.discovery.conflicts.length === 1 ? \"\" : \"s\"} reported.`\n\t\t\t\t: \"\";\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn `Create .nexus/mcp.json, adopt host imports, or quick-add RepoPrompt from this screen.${hostNote}${conflictNote}`;\n\t\t}\n\t\tif (this.discovery.totalServerCount === 0 && this.discovery.imports.length > 0) {\n\t\t\treturn `Detected ${this.discovery.imports.length} compatibility import source${this.discovery.imports.length === 1 ? \"\" : \"s\"}. Adopt them into Nexus or inspect the underlying files.${hostNote}${conflictNote}`;\n\t\t}\n\t\treturn `Nexus MCP files contain server definitions, compatibility imports, and MCP-specific overrides.${hostNote}${conflictNote}`;\n\t}\n\n\tprivate visibleActionRange(total: number): { start: number; end: number } {\n\t\tif (total <= COMPACT_ACTION_ROWS) return { start: 0, end: total };\n\t\tconst half = Math.floor(COMPACT_ACTION_ROWS / 2);\n\t\tconst start = Math.min(Math.max(0, this.actionCursor - half), Math.max(0, total - COMPACT_ACTION_ROWS));\n\t\treturn { start, end: Math.min(total, start + COMPACT_ACTION_ROWS) };\n\t}\n\n\tprivate contentWidth(innerW: number): number {\n\t\treturn Math.max(8, innerW - 4);\n\t}\n\n\tprivate previewWidth(innerW: number): number {\n\t\treturn Math.max(12, Math.min(DESKTOP_PREVIEW_WIDTH, this.contentWidth(innerW)));\n\t}\n\n\tprivate getActionPreview(action?: Action, previewW = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tswitch (action?.id) {\n\t\t\tcase \"adopt-imports\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Compatibility import write preview\",\n\t\t\t\t\tthis.callbacks.previewImports(\n\t\t\t\t\t\tthis.discovery.imports\n\t\t\t\t\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t\t\t\t\t.map((entry) => entry.kind),\n\t\t\t\t\t),\n\t\t\t\t\t[\n\t\t\t\t\t\t`Detected imports: ${this.discovery.imports.map((entry) => `${entry.kind} (${entry.serverCount} servers)`).join(\", \")}`,\n\t\t\t\t\t\t\"Selected imports are written to the Nexus global MCP configuration shown above.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"view-example\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview([\"Example Nexus `.nexus/mcp.json`:\"], previewW),\n\t\t\t\t\t// Truncate, don't word-wrap: wrapText would collapse JSON's indentation.\n\t\t\t\t\t...[\n\t\t\t\t\t\t\"{\",\n\t\t\t\t\t\t' \"mcpServers\": {',\n\t\t\t\t\t\t' \"chrome-devtools\": {',\n\t\t\t\t\t\t' \"command\": \"npx\",',\n\t\t\t\t\t\t' \"args\": [\"-y\", \"chrome-devtools-mcp@1.6.0\"]',\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\"}\",\n\t\t\t\t\t].map((line) => colorizeJsonLine(truncateToWidth(line, previewW, \"…\"))),\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\"Use Scaffold project `.nexus/mcp.json` when you want a safe empty shell instead of a live example server.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"show-precedence\": {\n\t\t\t\tconst hostNote =\n\t\t\t\t\tthis.discovery.hostConfigDiscovery === \"off\"\n\t\t\t\t\t\t? \"Configs from other tools (Cursor, Claude Code, VS Code, etc.) are NOT being read right now — Nexus only looks at its own two files above. You can turn that on if you'd rather not redefine servers you already set up elsewhere.\"\n\t\t\t\t\t\t: this.discovery.hostConfigDiscovery === \"prompt\"\n\t\t\t\t\t\t\t? \"Nexus will ask before reading configs from other tools (Cursor, Claude Code, VS Code, etc.). If you say yes, they're used as a fallback — only for a server name that isn't already defined in either file above.\"\n\t\t\t\t\t\t\t: \"Nexus is also reading configs from other tools (Cursor, Claude Code, VS Code, etc.) as a fallback — they only apply to a server name that isn't already defined in either file above.\";\n\t\t\t\tconst conflictNote =\n\t\t\t\t\tthis.discovery.conflicts.length === 0\n\t\t\t\t\t\t? \"Right now no server name is defined in more than one place, so there's nothing actually being overridden.\"\n\t\t\t\t\t\t: `Right now ${this.discovery.conflicts.length} server name${this.discovery.conflicts.length === 1 ? \" is\" : \"s are\"} defined in more than one place — whichever file is read last wins, and the loser is silently ignored:`;\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Nexus can load MCP servers from a few different places, so when the same server name shows up twice, something has to decide which definition actually gets used.\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"It reads, in this order — each one can override a server name defined before it:\",\n\t\t\t\t\t\t\" 1. Global — ~/.config/nexus/mcp.json (applies to every project on this machine)\",\n\t\t\t\t\t\t` 2. Project — ${getConfigDirName()}/mcp.json (just this project; wins over global for the same name)`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\thostNote,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Everything you add from this panel (a preset, a custom server) gets written to the project file, so it's scoped to this project and takes priority over anything global.\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tconflictNote,\n\t\t\t\t\t\t...this.discovery.conflicts\n\t\t\t\t\t\t\t.slice(0, 8)\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(conflict) =>\n\t\t\t\t\t\t\t\t\t` ${conflict.serverName}: ${conflict.sources.map((source) => source.path).join(\" then \")} — \"${conflict.winner.path}\" wins`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"open-paths\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\tthis.getDetectedPaths().length > 0\n\t\t\t\t\t\t? [\"Detected paths:\", ...this.getDetectedPaths()]\n\t\t\t\t\t\t: [\"No config paths were detected.\"],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-repoprompt\": {\n\t\t\t\tconst repoPrompt = this.discovery.repoPrompt;\n\t\t\t\tconst preview = this.callbacks.previewRepoPrompt();\n\t\t\t\tif (!preview) {\n\t\t\t\t\treturn this.formatPreview([\"RepoPrompt is not available to add from this setup screen.\"], previewW);\n\t\t\t\t}\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"RepoPrompt write preview\",\n\t\t\t\t\tpreview,\n\t\t\t\t\t[\n\t\t\t\t\t\t`Executable: ${repoPrompt.executablePath ?? \"not found\"}`,\n\t\t\t\t\t\t`Target: ${repoPrompt.targetPath ?? \"n/a\"}`,\n\t\t\t\t\t\t`Server name: ${repoPrompt.serverName ?? \"repoprompt\"}`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"add-known-server\": {\n\t\t\t\tconst preset = action.preset;\n\t\t\t\tif (!preset) return this.formatPreview([\"Known server preset is unavailable.\"], previewW);\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t`${preset.name} write preview`,\n\t\t\t\t\tthis.callbacks.previewKnownServer(preset),\n\t\t\t\t\t[preset.summary, ...(preset.docsUrl ? [`Docs: ${preset.docsUrl}`, 'Press \"o\" to open docs.'] : [])],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"scaffold-project\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Starter project `.nexus/mcp.json` write preview\",\n\t\t\t\t\tthis.callbacks.previewStarterProject(),\n\t\t\t\t\t[\n\t\t\t\t\t\t`This creates ${getConfigDirName()}/mcp.json right here in this project — the file everything you add from the Presets or Custom tab actually gets written into. If you already have one, this action doesn't show up (check the Installed tab instead).`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`It starts out empty on purpose (just an empty \"mcpServers\" list). A fake placeholder server would fail the moment Nexus tried to connect to it on your very next reload, so this just gives you a valid, empty file to add real servers into afterward.`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-custom-stdio\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\"Runs a command on your machine over stdio — e.g. an npx-installed MCP server.\"],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\tcolorizeCommandLine(truncateToWidth(\"/mcp add <name> -- <command> [args...]\", previewW, \"…\")),\n\t\t\t\t\t\"\",\n\t\t\t\t\tfg(this.t.muted, \"Example (real, runnable):\"),\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\"/mcp add chrome-devtools -- npx -y chrome-devtools-mcp@1.6.0\", previewW, \"…\"),\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'Enter fills in \"/mcp add my-server -- \" into the chat input below — finish typing there.',\n\t\t\t\t\t\t\t\"Run `/mcp add` with no arguments (from chat) for the full flag list.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"add-custom-url\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview([\"Connects to a remote MCP server over HTTP.\"], previewW),\n\t\t\t\t\t\"\",\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\n\t\t\t\t\t\t\t\"/mcp add <name> --url <url> [--header K=V] [--auth oauth|bearer] [--bearer-env VAR]\",\n\t\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t\t\t\"…\",\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\tfg(this.t.muted, \"Example (real, runnable):\"),\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\"/mcp add context7 --url https://mcp.context7.com/mcp\", previewW, \"…\"),\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'Enter fills in \"/mcp add my-server --url \" into the chat input below — finish typing there.',\n\t\t\t\t\t\t\t\"Run `/mcp add` with no arguments (from chat) for the full flag list.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"view-installed-server\": {\n\t\t\t\tconst server = action.installed;\n\t\t\t\tif (!server)\n\t\t\t\t\treturn this.formatPreview([\"Add a server from the Presets or Custom tab to see it here.\"], previewW);\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t`${server.name} — ${server.kind === \"stdio\" ? \"local (stdio)\" : \"remote (HTTP)\"}, currently ${server.disabled ? \"disabled\" : \"active\"}${server.authCapable ? (server.signedIn ? \", signed in\" : \", NOT signed in yet\") : \"\"}.`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`Press Enter to ${server.disabled ? \"enable\" : \"disable\"} it here. Takes effect after /reload.`,\n\t\t\t\t\t\t...(server.authCapable\n\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\t\tserver.signedIn\n\t\t\t\t\t\t\t\t\t\t? 'Press \"a\" to sign in again (e.g. to switch accounts). This re-opens your browser.'\n\t\t\t\t\t\t\t\t\t\t: 'Press \"a\" to sign in now — opens your browser for this server\\'s OAuth login. Tokens refresh automatically after that; you should not need to repeat this unless access is revoked.',\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.formatPreview([\"Close the setup flow.\"], previewW);\n\t\t}\n\t}\n\n\tprivate formatPreview(lines: string[], width = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tconst preview: string[] = [];\n\t\tfor (const line of lines) {\n\t\t\tpreview.push(...wrapText(line, width));\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate formatWritePreview(\n\t\ttitle: string,\n\t\tpreview: ConfigWritePreview,\n\t\tintro: string[] = [],\n\t\twidth = DESKTOP_PREVIEW_WIDTH,\n\t): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const line of intro) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (intro.length > 0) lines.push(\"\");\n\t\tlines.push(...wrapText(`${title}: ${preview.path}`, width));\n\t\tlines.push(\n\t\t\t...wrapText(\n\t\t\t\tpreview.existed\n\t\t\t\t\t? \"Existing file detected. Showing exact before/after diff.\"\n\t\t\t\t\t: \"New file will be created. Showing exact content diff.\",\n\t\t\t\twidth,\n\t\t\t),\n\t\t);\n\t\tlines.push(\"\");\n\t\tconst diffLines = preview.diffText.split(\"\\n\");\n\t\tconst maxLines = 12;\n\t\tconst shown = diffLines.slice(0, maxLines);\n\t\tfor (const line of shown) {\n\t\t\t// Truncate, don't word-wrap: wrapText collapses whitespace and would\n\t\t\t// destroy JSON's nested indentation.\n\t\t\tconst color = diffLineColor(line);\n\t\t\tconst truncated = truncateToWidth(line, width, \"…\");\n\t\t\tlines.push(color ? fg(color, truncated) : colorizeJsonLine(truncated));\n\t\t}\n\t\tif (diffLines.length > maxLines) {\n\t\t\tlines.push(\n\t\t\t\t...wrapText(\n\t\t\t\t\t`… ${diffLines.length - maxLines} more diff line${diffLines.length - maxLines === 1 ? \"\" : \"s\"}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate padLine(text: string, innerW: number): string {\n\t\tconst inset = 2;\n\t\tconst contentW = Math.max(0, innerW - inset * 2);\n\t\tconst fitted = truncateToWidth(text, contentW, \"…\", true);\n\t\tconst plainWidth = visibleWidth(fitted);\n\t\tconst padding = Math.max(0, contentW - plainWidth);\n\t\treturn `│${\" \".repeat(inset)}${fitted}${\" \".repeat(padding)}${\" \".repeat(inset)}│`;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.cleanup();\n\t}\n}\n\nexport function createMcpSetupPanel(\n\tdiscovery: McpDiscoverySummary,\n\tcallbacks: SetupPanelCallbacks,\n\toptions: SetupPanelOptions,\n\ttui: { requestRender(): void },\n\tdone: () => void,\n): McpSetupPanel & { dispose(): void } {\n\treturn new McpSetupPanel(discovery, callbacks, options, tui, done);\n}\n"]}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import * as fs from "node:fs";
|
|
10
10
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
11
11
|
import type { ExtensionAPI } from "../../core/extensions/types.ts";
|
|
12
|
+
import { type HiddenSpawnOptions } from "../../utils/hidden-spawn.ts";
|
|
12
13
|
import type { GitNexusConfig } from "../gitnexus/config.ts";
|
|
13
14
|
export declare const DELEGATE_TASK_TOOL_NAME = "delegate_task";
|
|
14
15
|
export declare const INTERNAL_WORKER_MARKER_ENV = "NEXUS_INTERNAL_DELEGATED_WORKER";
|
|
@@ -136,7 +137,7 @@ export declare function applyPiSubagentChildWorkerScope(env?: NodeJS.ProcessEnv,
|
|
|
136
137
|
* built cli.js carries a shebang and the executable bit from the build.
|
|
137
138
|
*/
|
|
138
139
|
export declare function resolveBundledChildBinary(argv1?: string | undefined, execPath?: string, fsImpl?: Pick<typeof fs, "realpathSync" | "accessSync" | "constants">): string | undefined;
|
|
139
|
-
export declare function applyBundledChildBinaryDefault(env?: NodeJS.ProcessEnv, resolved?: string | undefined): void;
|
|
140
|
+
export declare function applyBundledChildBinaryDefault(env?: NodeJS.ProcessEnv, resolved?: string | undefined, options?: HiddenSpawnOptions): void;
|
|
140
141
|
export declare const BLOCKED_ORCHESTRATOR_TOOLS: Set<string>;
|
|
141
142
|
export declare const ORCHESTRATOR_GUIDANCE: string;
|
|
142
143
|
export declare function isOrchestratorPolicyDisabled(env?: NodeJS.ProcessEnv): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Internal delegated-worker runtime.\n *\n * This file deliberately does not register a user-facing tool by default. The\n * authenticated Hub policy must advertise delegation before the GitNexus\n * extension calls registerDelegateTaskTool(). The CLI owns process isolation\n * and streaming UX; the Hub owns one-time worker authorization and routing.\n */\n\nimport { execFile, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { AUTO_MODEL_ID, AUTO_PROVIDER_ID, isAutoModel } from \"../../core/auto-model.ts\";\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/index.ts\";\nimport type { GitNexusConfig } from \"../gitnexus/config.ts\";\nimport { resolveGitNexusConfig } from \"../gitnexus/config.ts\";\nimport { hubApiBase } from \"../gitnexus/device-auth.ts\";\n\nexport const DELEGATE_TASK_TOOL_NAME = \"delegate_task\";\nexport const INTERNAL_WORKER_MARKER_ENV = \"NEXUS_INTERNAL_DELEGATED_WORKER\";\nexport const INTERNAL_WORKER_SESSION_ENV = \"NEXUS_INTERNAL_WORKER_SESSION_ID\";\nexport const INTERNAL_WORKER_TASK_ENV = \"NEXUS_INTERNAL_WORKER_TASK_ID\";\nexport const INTERNAL_WORKER_RUN_ENV = \"NEXUS_INTERNAL_WORKER_RUN_ID\";\nexport const INTERNAL_WORKER_ROOT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_ROOT_REQUEST_ID\";\nexport const INTERNAL_WORKER_PARENT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_PARENT_REQUEST_ID\";\nexport const INTERNAL_WORKER_GRANT_HEADER = \"x-nexus-worker-grant\";\nexport const INTERNAL_WORKER_TASK_HEADER = \"x-nexus-worker-task-id\";\nexport const SESSION_AFFINITY_HEADER = \"x-session-affinity\";\nexport const RUN_ID_HEADER = \"x-nexus-run-id\";\nexport const REQUEST_ID_HEADER = \"x-nexus-request-id\";\nexport const ROOT_REQUEST_ID_HEADER = \"x-nexus-root-request-id\";\nexport const PARENT_REQUEST_ID_HEADER = \"x-nexus-parent-request-id\";\nexport const DELEGATION_ID_HEADER = \"x-nexus-delegation-id\";\nexport const REQUEST_SCOPE_HEADER = \"x-nexus-request-scope\";\nexport const MAX_DELEGATED_TURNS = 50;\nexport const DELEGATED_WORKER_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DELEGATED_OUTPUT_CAP_BYTES = 32 * 1024;\nexport const DELEGATED_EVENT_CAP_BYTES = 1024 * 1024;\nexport const MAX_DELEGATED_TASK_BYTES = 32 * 1024;\n\nconst WORKER_GRANT_TIMEOUT_MS = 10_000;\nconst INVALID_WORKER_GRANT = \"unavailable\";\nconst MAX_PARALLEL_MUTATING_WORKERS = 1;\n\nexport const DELEGATED_WORKER_TOOLS = [\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"bash\",\n\t\"write\",\n\t\"edit\",\n\t\"web_search\",\n\t\"gitnexus_query\",\n\t\"gitnexus_context\",\n\t\"gitnexus_impact\",\n\t\"gitnexus_detect_changes\",\n\t\"gitnexus_cypher\",\n\t\"gitnexus_list_repos\",\n] as const;\n\nconst WORKER_SYSTEM_PROMPT = `You are an internal delegated worker for Nexus Agent.\n\nComplete only the self-contained task you were delegated. Investigate before editing, follow local instructions, and verify any changed behavior. Do not delegate work or broaden scope. Do not discuss model names, providers, routing, credits, or internal architecture.\n\nFinish with a concise report containing:\n- work completed or findings\n- verification performed and results\n- blockers or remaining risks`;\n\nexport type DelegationStatus =\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"aborted\"\n\t| \"timeout\"\n\t| \"turn_limit\"\n\t| \"event_limit\";\n\nexport interface DelegationDetails {\n\tstatus: DelegationStatus;\n\tturns: number;\n\texitCode?: number;\n\toutputTruncated?: boolean;\n}\n\nexport interface WorkerGrant {\n\t/** Opaque, short-lived grant minted by the Hub for one worker completion. */\n\ttoken: string;\n\texpiresAt: string;\n}\n\nexport interface DelegationCapability {\n\tenabled: true;\n\tversion: 1;\n\tmaxParallel: number;\n\tmaxTaskBytes: number;\n\tworkerTimeoutMs: number;\n}\n\nexport interface WorkerGrantRequest {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n\trequestId: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface DelegationController {\n\tcreateWorkerGrant(request: WorkerGrantRequest): Promise<WorkerGrant>;\n}\n\nexport interface DelegationRequest {\n\ttask: string;\n\tacceptanceCriteria: string[];\n\trelevantPaths: string[];\n\tcwd: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface WorkerContext {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n}\n\nexport interface DelegatedWorkerOptions extends DelegationRequest {\n\tworkerContext: WorkerContext;\n\ttimeoutMs?: number;\n\tonUpdate?: (result: AgentToolResult<DelegationDetails>) => void;\n}\n\nexport interface DelegatedWorkerResult {\n\tstatus: Exclude<DelegationStatus, \"running\">;\n\tturns: number;\n\texitCode: number;\n\toutput: string;\n\toutputTruncated: boolean;\n}\n\ninterface AssistantSnapshot {\n\ttext: string;\n\tstopReason?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseAssistantSnapshot(value: unknown): AssistantSnapshot | undefined {\n\tif (!isRecord(value) || value.role !== \"assistant\" || !Array.isArray(value.content)) return undefined;\n\tconst text = value.content\n\t\t.filter(isRecord)\n\t\t.filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text as string)\n\t\t.join(\"\\n\");\n\treturn {\n\t\ttext,\n\t\t...(typeof value.stopReason === \"string\" ? { stopReason: value.stopReason } : {}),\n\t};\n}\n\nexport function composeDelegatedTask(\n\ttask: string,\n\tacceptanceCriteria: readonly string[],\n\trelevantPaths: readonly string[],\n): string {\n\tconst sections = [`Task:\\n${task.trim()}`];\n\tif (acceptanceCriteria.length > 0) {\n\t\tsections.push(`Acceptance criteria:\\n${acceptanceCriteria.map((criterion) => `- ${criterion}`).join(\"\\n\")}`);\n\t}\n\tif (relevantPaths.length > 0) {\n\t\tsections.push(`Relevant paths:\\n${relevantPaths.map((filePath) => `- ${filePath}`).join(\"\\n\")}`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function buildDelegatedWorkerArgs(task: string, promptPath: string): string[] {\n\treturn [\n\t\t\"--mode\",\n\t\t\"json\",\n\t\t\"-p\",\n\t\t\"--no-session\",\n\t\t\"--model\",\n\t\t`${AUTO_PROVIDER_ID}/${AUTO_MODEL_ID}`,\n\t\t\"--tools\",\n\t\tDELEGATED_WORKER_TOOLS.join(\",\"),\n\t\t\"--exclude-tools\",\n\t\t`${DELEGATE_TASK_TOOL_NAME},subagent`,\n\t\t\"--append-system-prompt\",\n\t\tpromptPath,\n\t\ttask,\n\t];\n}\n\nfunction getNexusInvocation(args: string[]): { command: string; args: string[] } {\n\tconst currentScript = process.argv[1];\n\tconst isBunVirtualScript = currentScript?.startsWith(\"/$bunfs/root/\");\n\tif (currentScript && !isBunVirtualScript && fs.existsSync(currentScript)) {\n\t\treturn { command: process.execPath, args: [currentScript, ...args] };\n\t}\n\n\tconst execName = path.basename(process.execPath).toLowerCase();\n\tconst isGenericRuntime = /^(node|bun)(\\.exe)?$/.test(execName);\n\treturn isGenericRuntime ? { command: \"nexus\", args } : { command: process.execPath, args };\n}\n\nasync function writeWorkerPrompt(): Promise<{ dir: string; filePath: string }> {\n\tconst dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"nexus-worker-\"));\n\tconst filePath = path.join(dir, \"system.md\");\n\tawait withFileMutationQueue(filePath, async () => {\n\t\tawait fs.promises.writeFile(filePath, WORKER_SYSTEM_PROMPT, { encoding: \"utf8\", mode: 0o600 });\n\t});\n\treturn { dir, filePath };\n}\n\nfunction truncateUtf8(value: string, cap: number): { value: string; truncated: boolean } {\n\tif (Buffer.byteLength(value, \"utf8\") <= cap) return { value, truncated: false };\n\tconst suffix = \"\\n\\n[Report truncated]\";\n\tlet truncated = value.slice(0, Math.max(0, cap - Buffer.byteLength(suffix, \"utf8\")));\n\twhile (Buffer.byteLength(`${truncated}${suffix}`, \"utf8\") > cap) truncated = truncated.slice(0, -1);\n\treturn { value: `${truncated}${suffix}`, truncated: true };\n}\n\nexport function createHubDelegationController(\n\tconfig: GitNexusConfig,\n\toptions: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): DelegationController {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\treturn {\n\t\tasync createWorkerGrant(request) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst onAbort = (): void => controller.abort();\n\t\t\tif (request.signal?.aborted) controller.abort();\n\t\t\telse request.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tconst timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? WORKER_GRANT_TIMEOUT_MS);\n\t\t\ttry {\n\t\t\t\tconst response = await fetchImpl(`${hubApiBase(config.hubUrl)}/llm/worker-grants`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\tauthorization: `Bearer ${config.token}`,\n\t\t\t\t\t\t[RUN_ID_HEADER]: request.runId,\n\t\t\t\t\t\t[REQUEST_ID_HEADER]: request.requestId,\n\t\t\t\t\t\t[ROOT_REQUEST_ID_HEADER]: request.rootRequestId,\n\t\t\t\t\t\t[PARENT_REQUEST_ID_HEADER]: request.parentRequestId,\n\t\t\t\t\t\t[DELEGATION_ID_HEADER]: request.taskId,\n\t\t\t\t\t\t[REQUEST_SCOPE_HEADER]: \"worker\",\n\t\t\t\t\t\t...(config.deviceFingerprint ? { \"x-device-fingerprint\": config.deviceFingerprint } : {}),\n\t\t\t\t\t\t...(config.deviceName ? { \"x-device-name\": config.deviceName } : {}),\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ sessionId: request.sessionId, taskId: request.taskId }),\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tawait response.body?.cancel().catch(() => {});\n\t\t\t\t\tthrow new Error(\"Worker authorization unavailable\");\n\t\t\t\t}\n\t\t\t\tconst body: unknown = await response.json();\n\t\t\t\tif (\n\t\t\t\t\t!isRecord(body) ||\n\t\t\t\t\ttypeof body.grant !== \"string\" ||\n\t\t\t\t\t!body.grant.trim() ||\n\t\t\t\t\ttypeof body.expiresAt !== \"string\" ||\n\t\t\t\t\t!body.expiresAt.trim() ||\n\t\t\t\t\t!Number.isFinite(Date.parse(body.expiresAt))\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid worker authorization response\");\n\t\t\t\t}\n\t\t\t\treturn { token: body.grant, expiresAt: body.expiresAt };\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\trequest.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function isDelegatedWorkerProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[INTERNAL_WORKER_MARKER_ENV] === \"1\";\n}\n\nexport const DELEGATION_MODE_ENV = \"NEXUS_DELEGATION_MODE\";\n\n/**\n * `NEXUS_DELEGATION_MODE=external` hands delegation to an external\n * orchestrator (e.g. the pi-subagents package): delegate_task is not\n * registered, so the model sees exactly one delegation surface. Worker-scope\n * billing still works — children marked via the nexus-subagent-worker wrapper\n * self-mint grants exactly like delegate_task workers do.\n */\nexport const BIG_MODEL_AGENTS_ENV = \"NEXUS_BIG_MODEL_AGENTS\";\nexport const WORKER_SCOPE_ENV = \"NEXUS_WORKER_SCOPE\";\nexport const PARENT_POLICY_ENV = \"NEXUS_PARENT_POLICY\";\nexport const BUNDLED_SUBAGENTS_ENV = \"NEXUS_BUNDLED_SUBAGENTS\";\nexport const BUNDLED_PACKAGES_ENV = \"NEXUS_BUNDLED_PACKAGES\";\nexport const PI_SUBAGENT_CHILD_AGENT_ENV = \"PI_SUBAGENT_CHILD_AGENT\";\nexport const PI_SUBAGENT_BINARY_ENV = \"PI_SUBAGENT_PI_BINARY\";\nexport const DEFAULT_BIG_MODEL_AGENTS = [\"oracle\"] as const;\n\n/** pi-subagents ships inside the CLI unless bundled packages are switched off. */\nexport function bundledSubagentsAvailable(env: NodeJS.ProcessEnv = process.env): boolean {\n\tconst value = env[BUNDLED_PACKAGES_ENV]?.trim().toLowerCase();\n\treturn !(value === \"off\" || value === \"0\" || value === \"false\");\n}\n\n/**\n * Delegation runs through the bundled pi-subagents tool by default; the\n * legacy delegate_task worker is opt-in via NEXUS_DELEGATION_MODE=internal.\n */\nexport function isExternalDelegationMode(env: NodeJS.ProcessEnv = process.env): boolean {\n\tconst mode = env[DELEGATION_MODE_ENV]?.trim().toLowerCase();\n\tif (mode === \"internal\") return false;\n\tif (mode === \"external\") return true;\n\treturn bundledSubagentsAvailable(env);\n}\n\n/** Agents that keep billing the orchestrator deployment (big model). */\nexport function bigModelAgents(env: NodeJS.ProcessEnv = process.env): Set<string> {\n\tconst raw = env[BIG_MODEL_AGENTS_ENV];\n\tif (raw === undefined) return new Set(DEFAULT_BIG_MODEL_AGENTS);\n\treturn new Set(\n\t\traw\n\t\t\t.split(\",\")\n\t\t\t.map((name) => name.trim())\n\t\t\t.filter(Boolean),\n\t);\n}\n\n/**\n * A process spawned by pi-subagents announces its agent in PI_SUBAGENT_CHILD_AGENT.\n * Mark it as a delegated worker so every model turn self-mints a worker grant\n * and bills the worker deployment. Big-model agents are explicitly unmarked,\n * even when a marker was inherited from a worker parent (nested fan-out).\n * Context is always regenerated: a worker deletes its own context before\n * spawning tools, so nothing inherited is trustworthy.\n */\nexport function applyPiSubagentChildWorkerScope(\n\tenv: NodeJS.ProcessEnv = process.env,\n\tuuid: () => string = randomUUID,\n): boolean {\n\tconst agent = env[PI_SUBAGENT_CHILD_AGENT_ENV]?.trim();\n\tif (!agent) return false;\n\tconst contextKeys = [\n\t\tINTERNAL_WORKER_SESSION_ENV,\n\t\tINTERNAL_WORKER_TASK_ENV,\n\t\tINTERNAL_WORKER_RUN_ENV,\n\t\tINTERNAL_WORKER_ROOT_REQUEST_ENV,\n\t\tINTERNAL_WORKER_PARENT_REQUEST_ENV,\n\t];\n\tconst scopeOff = env[WORKER_SCOPE_ENV]?.trim().toLowerCase() === \"off\";\n\tif (scopeOff || bigModelAgents(env).has(agent)) {\n\t\tdelete env[INTERNAL_WORKER_MARKER_ENV];\n\t\tfor (const key of contextKeys) delete env[key];\n\t\treturn false;\n\t}\n\tenv[INTERNAL_WORKER_MARKER_ENV] = \"1\";\n\tfor (const key of contextKeys) env[key] = uuid();\n\treturn true;\n}\n\n/**\n * The executable pi-subagents should spawn for children: this CLI itself.\n * A compiled standalone binary is its own executable; under node/bun the\n * built cli.js carries a shebang and the executable bit from the build.\n */\nexport function resolveBundledChildBinary(\n\targv1: string | undefined = process.argv[1],\n\texecPath: string = process.execPath,\n\tfsImpl: Pick<typeof fs, \"realpathSync\" | \"accessSync\" | \"constants\"> = fs,\n): string | undefined {\n\tconst execName = path.basename(execPath).toLowerCase();\n\tif (!/^(node|bun)(\\.exe)?$/.test(execName)) return execPath;\n\tif (!argv1) return undefined;\n\ttry {\n\t\tconst real = fsImpl.realpathSync(argv1);\n\t\tif (!/cli\\.(js|mjs|cjs)$/.test(real)) return undefined;\n\t\tfsImpl.accessSync(real, fsImpl.constants.X_OK);\n\t\treturn real;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function applyBundledChildBinaryDefault(\n\tenv: NodeJS.ProcessEnv = process.env,\n\tresolved: string | undefined = resolveBundledChildBinary(),\n): void {\n\tif (env[PI_SUBAGENT_BINARY_ENV]?.trim() || !resolved) return;\n\tenv[PI_SUBAGENT_BINARY_ENV] = resolved;\n}\n\nexport const BLOCKED_ORCHESTRATOR_TOOLS = new Set([\"bash\", \"write\", \"edit\", DELEGATE_TASK_TOOL_NAME]);\n\nexport const ORCHESTRATOR_GUIDANCE = [\n\t\"Delegation policy: you are the orchestrator. Perform implementation, mutation,\",\n\t\"shell commands, tests, and long repetitive tool loops through the `subagent`\",\n\t\"tool (worker for implementation, reviewer for checks, scout for codebase\",\n\t\"exploration, researcher for web research). Direct bash/write/edit are disabled\",\n\t\"in this session. Reading files and querying the GitNexus graph directly is fine\",\n\t\"and unlimited — prefer gitnexus_query/context/impact to locate code before\",\n\t\"delegating. For broad or multi-source research, fan out scout or researcher\",\n\t\"subagents (or use /parallel-research) and run long investigations in the\",\n\t\"background (async) instead of one long foreground run. Give each subagent a\",\n\t\"narrow, self-contained task rather than one sprawling one. Keep planning,\",\n\t\"user communication, and final review here.\",\n].join(\" \");\n\nexport function isOrchestratorPolicyDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn (\n\t\tenv[PARENT_POLICY_ENV]?.trim().toLowerCase() === \"off\" ||\n\t\tenv[INTERNAL_WORKER_MARKER_ENV] === \"1\" ||\n\t\tBoolean(env[PI_SUBAGENT_CHILD_AGENT_ENV]?.trim())\n\t);\n}\n\n/**\n * Orchestrator-side policy for bundled subagents: hard-block mutating tools\n * (the cost guarantee — implementation always bills the worker deployment)\n * and steer everything else by prompt. No read budget: reads and graph calls\n * are cheap on cached input and capping them measurably hurt output quality.\n */\nexport function registerOrchestratorPolicy(pi: ExtensionAPI, env: NodeJS.ProcessEnv = process.env): void {\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (isOrchestratorPolicyDisabled(env) || !isAutoModel(ctx.model)) return;\n\t\treturn { systemPrompt: `${event.systemPrompt}\\n\\n${ORCHESTRATOR_GUIDANCE}` };\n\t});\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tif (isOrchestratorPolicyDisabled(env) || !isAutoModel(ctx.model)) return;\n\t\tif (!BLOCKED_ORCHESTRATOR_TOOLS.has(event.toolName)) return;\n\t\treturn {\n\t\t\tblock: true,\n\t\t\treason:\n\t\t\t\t\"This orchestrator session does not run mutating tools directly. Use the `subagent` tool \" +\n\t\t\t\t\"(worker for implementation, reviewer for checks, scout for exploration), then review its report.\",\n\t\t};\n\t});\n}\n\n/**\n * Nexus-branded aliases for the upstream pi-subagents env knobs: users set\n * NEXUS_SUBAGENT_*, we copy onto the PI_SUBAGENT_* names the package reads.\n * NEXUS_SUBAGENT_BINARY maps to PI_SUBAGENT_PI_BINARY (the child-spawn\n * wrapper hook); every other NEXUS_SUBAGENT_X maps to PI_SUBAGENT_X.\n * Explicit PI_* values always win — aliases never overwrite them.\n */\nexport function applyNexusSubagentEnvAliases(env: NodeJS.ProcessEnv = process.env): void {\n\tconst binary = env.NEXUS_SUBAGENT_BINARY?.trim();\n\tif (binary && !env.PI_SUBAGENT_PI_BINARY?.trim()) {\n\t\tenv.PI_SUBAGENT_PI_BINARY = binary;\n\t}\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (!key.startsWith(\"NEXUS_SUBAGENT_\") || key === \"NEXUS_SUBAGENT_BINARY\") continue;\n\t\tif (!value?.trim()) continue;\n\t\tconst target = `PI_SUBAGENT_${key.slice(\"NEXUS_SUBAGENT_\".length)}`;\n\t\tif (!env[target]?.trim()) env[target] = value;\n\t}\n}\n\n/** Capture task routing once, then remove it before worker tools can inherit it. */\nexport function consumeWorkerContext(env: NodeJS.ProcessEnv = process.env): WorkerContext | undefined {\n\tif (!isDelegatedWorkerProcess(env)) return undefined;\n\tconst sessionId = env[INTERNAL_WORKER_SESSION_ENV]?.trim();\n\tconst taskId = env[INTERNAL_WORKER_TASK_ENV]?.trim();\n\tconst runId = env[INTERNAL_WORKER_RUN_ENV]?.trim();\n\tconst rootRequestId = env[INTERNAL_WORKER_ROOT_REQUEST_ENV]?.trim();\n\tconst parentRequestId = env[INTERNAL_WORKER_PARENT_REQUEST_ENV]?.trim();\n\tdelete env[INTERNAL_WORKER_SESSION_ENV];\n\tdelete env[INTERNAL_WORKER_TASK_ENV];\n\tdelete env[INTERNAL_WORKER_RUN_ENV];\n\tdelete env[INTERNAL_WORKER_ROOT_REQUEST_ENV];\n\tdelete env[INTERNAL_WORKER_PARENT_REQUEST_ENV];\n\tif (!sessionId || !taskId || !runId || !rootRequestId || !parentRequestId) return undefined;\n\treturn { sessionId, taskId, runId, rootRequestId, parentRequestId };\n}\n\nfunction killProcessTree(pid: number | undefined, signal: NodeJS.Signals): void {\n\tif (pid === undefined) return;\n\tif (process.platform === \"win32\") {\n\t\texecFile(\"taskkill\", [\"/T\", \"/F\", \"/PID\", String(pid)], () => undefined);\n\t\treturn;\n\t}\n\ttry {\n\t\tprocess.kill(-pid, signal);\n\t} catch {\n\t\t// The detached process group may already have exited.\n\t}\n}\n\nexport async function runDelegatedWorker(options: DelegatedWorkerOptions): Promise<DelegatedWorkerResult> {\n\tconst prompt = await writeWorkerPrompt();\n\tconst task = composeDelegatedTask(options.task, options.acceptanceCriteria, options.relevantPaths);\n\tconst args = buildDelegatedWorkerArgs(task, prompt.filePath);\n\tlet output = \"\";\n\tlet turns = 0;\n\tlet terminalStatus: Exclude<DelegationStatus, \"running\" | \"completed\" | \"failed\"> | undefined;\n\tlet assistantFailed = false;\n\tlet eventBytes = 0;\n\n\ttry {\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tconst invocation = getNexusInvocation(args);\n\t\t\tconst child = spawn(invocation.command, invocation.args, {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\tdetached: true,\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\t[INTERNAL_WORKER_MARKER_ENV]: \"1\",\n\t\t\t\t\t[INTERNAL_WORKER_SESSION_ENV]: options.workerContext.sessionId,\n\t\t\t\t\t[INTERNAL_WORKER_TASK_ENV]: options.workerContext.taskId,\n\t\t\t\t\t[INTERNAL_WORKER_RUN_ENV]: options.workerContext.runId,\n\t\t\t\t\t[INTERNAL_WORKER_ROOT_REQUEST_ENV]: options.workerContext.rootRequestId,\n\t\t\t\t\t[INTERNAL_WORKER_PARENT_REQUEST_ENV]: options.workerContext.parentRequestId,\n\t\t\t\t},\n\t\t\t\tshell: false,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tlet buffer = \"\";\n\t\t\tlet settled = false;\n\t\t\tlet stopped = false;\n\t\t\tlet forceKillTimer: NodeJS.Timeout | undefined;\n\n\t\t\tconst finish = (code: number): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\tclearTimeout(forceKillTimer);\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", abortHandler);\n\t\t\t\tresolve(code);\n\t\t\t};\n\n\t\t\tconst stop = (status: \"aborted\" | \"timeout\" | \"turn_limit\" | \"event_limit\"): void => {\n\t\t\t\tif (stopped) return;\n\t\t\t\tstopped = true;\n\t\t\t\tterminalStatus = status;\n\t\t\t\tkillProcessTree(child.pid, \"SIGTERM\");\n\t\t\t\tforceKillTimer = setTimeout(() => {\n\t\t\t\t\tif (process.platform !== \"win32\") killProcessTree(child.pid, \"SIGKILL\");\n\t\t\t\t\tfinish(1);\n\t\t\t\t}, 5000);\n\t\t\t};\n\n\t\t\tconst emitProgress = (): void => {\n\t\t\t\toptions.onUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is in progress.\" }],\n\t\t\t\t\tdetails: { status: \"running\", turns },\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst processLine = (line: string): void => {\n\t\t\t\tif (!line.trim()) return;\n\t\t\t\tlet parsed: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(line);\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!isRecord(parsed) || parsed.type !== \"message_end\") return;\n\t\t\t\tconst snapshot = parseAssistantSnapshot(parsed.message);\n\t\t\t\tif (!snapshot) return;\n\t\t\t\tturns += 1;\n\t\t\t\tif (snapshot.text) output = snapshot.text;\n\t\t\t\tif (snapshot.stopReason === \"error\" || snapshot.stopReason === \"aborted\") assistantFailed = true;\n\t\t\t\temitProgress();\n\t\t\t\tif (turns >= MAX_DELEGATED_TURNS && snapshot.stopReason === \"toolUse\") stop(\"turn_limit\");\n\t\t\t};\n\n\t\t\tconst abortHandler = (): void => stop(\"aborted\");\n\t\t\tconst timeoutTimer = setTimeout(\n\t\t\t\t() => stop(\"timeout\"),\n\t\t\t\tMath.min(Math.max(1_000, options.timeoutMs ?? DELEGATED_WORKER_TIMEOUT_MS), DELEGATED_WORKER_TIMEOUT_MS),\n\t\t\t);\n\t\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\t\teventBytes += Buffer.byteLength(chunk);\n\t\t\t\tif (eventBytes > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\tstop(\"event_limit\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer += chunk.toString();\n\t\t\t\tif (Buffer.byteLength(buffer, \"utf8\") > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) processLine(line);\n\t\t\t});\n\t\t\t// Consume stderr so a noisy child cannot block. Raw provider/process output\n\t\t\t// is intentionally not retained or exposed to the orchestrator or user.\n\t\t\tchild.stderr.on(\"data\", () => undefined);\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tif (buffer.trim()) processLine(buffer);\n\t\t\t\tfinish(code ?? (terminalStatus ? 1 : 0));\n\t\t\t});\n\t\t\tchild.on(\"error\", () => finish(1));\n\t\t\tif (options.signal?.aborted) abortHandler();\n\t\t\telse options.signal?.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t});\n\n\t\tconst limitedOutput = truncateUtf8(output, DELEGATED_OUTPUT_CAP_BYTES);\n\t\tconst status = terminalStatus ?? (exitCode === 0 && !assistantFailed ? \"completed\" : \"failed\");\n\t\treturn {\n\t\t\tstatus,\n\t\t\tturns,\n\t\t\texitCode,\n\t\t\toutput: limitedOutput.value,\n\t\t\toutputTruncated: limitedOutput.truncated,\n\t\t};\n\t} finally {\n\t\tawait fs.promises.rm(prompt.dir, { recursive: true, force: true });\n\t}\n}\n\nconst DelegateTaskParameters = Type.Object({\n\ttask: Type.String({ description: \"A self-contained task with explicit boundaries\", maxLength: 32_768 }),\n\tacceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 2000 }), { maxItems: 10 })),\n\trelevantPaths: Type.Optional(Type.Array(Type.String({ maxLength: 1000 }), { maxItems: 20 })),\n});\n\nfunction resultContent(result: DelegatedWorkerResult): string {\n\tconst report = result.output.trim() || \"No worker report was returned.\";\n\tif (result.status === \"completed\") return `Delegated work completed.\\n\\n${report}`;\n\treturn `Delegated work did not complete (${result.status}).\\n\\nPartial report:\\n${report}`;\n}\n\n/** Register the tool only after the Hub explicitly advertises delegation. */\nexport function registerDelegateTaskTool(pi: ExtensionAPI, capability: DelegationCapability): void {\n\tconst maxTaskBytes = Math.min(Math.max(1, Math.floor(capability.maxTaskBytes)), MAX_DELEGATED_TASK_BYTES);\n\tconst workerTimeoutMs = Math.min(\n\t\tMath.max(1_000, Math.floor(capability.workerTimeoutMs)),\n\t\tDELEGATED_WORKER_TIMEOUT_MS,\n\t);\n\tconst runId = randomUUID();\n\tlet rootRequestId: string | undefined;\n\tlet latestRootRequestId: string | undefined;\n\tlet activeWorkers = 0;\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) return;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\nDelegation guidance: prioritize delegate_task for self-contained, context-heavy investigation, broad searches, audits, repeated tool loops, or substantial implementation so the main conversation stays focused and efficient. Use your own tools directly when the work is small, depends on context already established in this conversation, requires direct verification, or delegation fails or reaches a limit. You remain responsible for the final result.`,\n\t\t};\n\t});\n\tpi.on(\"before_provider_headers\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model) || isDelegatedWorkerProcess()) return;\n\t\tconst requestId = randomUUID();\n\t\trootRequestId ??= requestId;\n\t\tlatestRootRequestId = requestId;\n\t\tevent.headers[RUN_ID_HEADER] = runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = rootRequestId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"root\";\n\t});\n\tpi.registerTool({\n\t\tname: DELEGATE_TASK_TOOL_NAME,\n\t\tlabel: \"Work\",\n\t\tdescription:\n\t\t\t\"Delegate one self-contained task to an isolated internal worker. Keep user communication and final responsibility in this conversation.\",\n\t\tparameters: DelegateTaskParameters,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tif (!isAutoModel(ctx.model)) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is unavailable for the active mode.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!ctx.isProjectTrusted()) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work requires a trusted project.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (activeWorkers >= MAX_PARALLEL_MUTATING_WORKERS) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is temporarily unavailable for this run.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst request: DelegationRequest = {\n\t\t\t\ttask: params.task,\n\t\t\t\tacceptanceCriteria: params.acceptanceCriteria ?? [],\n\t\t\t\trelevantPaths: params.relevantPaths ?? [],\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tsignal,\n\t\t\t};\n\t\t\tif (\n\t\t\t\tBuffer.byteLength(\n\t\t\t\t\tcomposeDelegatedTask(request.task, request.acceptanceCriteria, request.relevantPaths),\n\t\t\t\t\t\"utf8\",\n\t\t\t\t) > maxTaskBytes\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is too large for one bounded task.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tactiveWorkers += 1;\n\t\t\ttry {\n\t\t\t\tconst delegationId = randomUUID();\n\t\t\t\trootRequestId ??= randomUUID();\n\t\t\t\tconst result = await runDelegatedWorker({\n\t\t\t\t\t...request,\n\t\t\t\t\tworkerContext: {\n\t\t\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\t\t\ttaskId: delegationId,\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\trootRequestId,\n\t\t\t\t\t\tparentRequestId: latestRootRequestId ?? rootRequestId,\n\t\t\t\t\t},\n\t\t\t\t\ttimeoutMs: workerTimeoutMs,\n\t\t\t\t\tonUpdate,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: resultContent(result) }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\tturns: result.turns,\n\t\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\t\toutputTruncated: result.outputTruncated,\n\t\t\t\t\t} satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work could not be started.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tactiveWorkers -= 1;\n\t\t\t}\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"Working…\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as DelegationDetails | undefined;\n\t\t\tif (details?.status === \"running\") return new Text(theme.fg(\"muted\", \"Working…\"), 0, 0);\n\t\t\tif (details?.status === \"completed\") return new Text(theme.fg(\"success\", \"Work completed\"), 0, 0);\n\t\t\treturn new Text(theme.fg(\"error\", \"Work needs attention\"), 0, 0);\n\t\t},\n\t});\n}\n\n/**\n * Install a fail-closed header hook for one worker task. A fresh one-time grant\n * is minted for each model turn; no grant is inherited by worker tools.\n */\nexport function registerWorkerGrantHeaders(\n\tpi: ExtensionAPI,\n\tworkerContext: WorkerContext,\n\tcontroller: DelegationController | undefined,\n): void {\n\tpi.on(\"before_provider_headers\", async (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) {\n\t\t\tctx.abort();\n\t\t\treturn;\n\t\t}\n\n\t\t// Set an invalid sentinel first. Extension handler errors are reported and\n\t\t// swallowed by the runner, so this prevents a mint failure from silently\n\t\t// falling back to an ungranted root request.\n\t\tconst requestId = randomUUID();\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = INVALID_WORKER_GRANT;\n\t\tevent.headers[INTERNAL_WORKER_TASK_HEADER] = workerContext.taskId;\n\t\tevent.headers[SESSION_AFFINITY_HEADER] = workerContext.sessionId;\n\t\tevent.headers[RUN_ID_HEADER] = workerContext.runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = workerContext.rootRequestId;\n\t\tevent.headers[PARENT_REQUEST_ID_HEADER] = workerContext.parentRequestId;\n\t\tevent.headers[DELEGATION_ID_HEADER] = workerContext.taskId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"worker\";\n\t\tif (!controller) return;\n\n\t\tconst grant = await controller.createWorkerGrant({\n\t\t\t...workerContext,\n\t\t\trequestId,\n\t\t\tsignal: ctx.signal,\n\t\t});\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = grant.token;\n\t});\n}\n\nexport default function delegatedWorkerRuntime(pi: ExtensionAPI): void {\n\tapplyNexusSubagentEnvAliases();\n\tif (bundledSubagentsAvailable()) process.env[BUNDLED_SUBAGENTS_ENV] = \"1\";\n\tapplyPiSubagentChildWorkerScope();\n\tconst isWorker = isDelegatedWorkerProcess();\n\tconst workerContext = consumeWorkerContext();\n\tif (!isWorker) {\n\t\tif (isExternalDelegationMode()) {\n\t\t\tapplyBundledChildBinaryDefault();\n\t\t\tregisterOrchestratorPolicy(pi);\n\t\t}\n\t\treturn;\n\t}\n\tconst config = resolveGitNexusConfig();\n\tconst failClosedContext: WorkerContext = {\n\t\tsessionId: \"unavailable\",\n\t\ttaskId: \"unavailable\",\n\t\trunId: \"unavailable\",\n\t\trootRequestId: \"unavailable\",\n\t\tparentRequestId: \"unavailable\",\n\t};\n\tregisterWorkerGrantHeaders(\n\t\tpi,\n\t\tworkerContext ?? failClosedContext,\n\t\tworkerContext && config ? createHubDelegationController(config) : undefined,\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Internal delegated-worker runtime.\n *\n * This file deliberately does not register a user-facing tool by default. The\n * authenticated Hub policy must advertise delegation before the GitNexus\n * extension calls registerDelegateTaskTool(). The CLI owns process isolation\n * and streaming UX; the Hub owns one-time worker authorization and routing.\n */\n\nimport { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { AUTO_MODEL_ID, AUTO_PROVIDER_ID, isAutoModel } from \"../../core/auto-model.ts\";\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/index.ts\";\nimport { applyHiddenChildLaunch, type HiddenSpawnOptions, spawnWithoutConsole } from \"../../utils/hidden-spawn.ts\";\nimport type { GitNexusConfig } from \"../gitnexus/config.ts\";\nimport { resolveGitNexusConfig } from \"../gitnexus/config.ts\";\nimport { hubApiBase } from \"../gitnexus/device-auth.ts\";\n\nexport const DELEGATE_TASK_TOOL_NAME = \"delegate_task\";\nexport const INTERNAL_WORKER_MARKER_ENV = \"NEXUS_INTERNAL_DELEGATED_WORKER\";\nexport const INTERNAL_WORKER_SESSION_ENV = \"NEXUS_INTERNAL_WORKER_SESSION_ID\";\nexport const INTERNAL_WORKER_TASK_ENV = \"NEXUS_INTERNAL_WORKER_TASK_ID\";\nexport const INTERNAL_WORKER_RUN_ENV = \"NEXUS_INTERNAL_WORKER_RUN_ID\";\nexport const INTERNAL_WORKER_ROOT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_ROOT_REQUEST_ID\";\nexport const INTERNAL_WORKER_PARENT_REQUEST_ENV = \"NEXUS_INTERNAL_WORKER_PARENT_REQUEST_ID\";\nexport const INTERNAL_WORKER_GRANT_HEADER = \"x-nexus-worker-grant\";\nexport const INTERNAL_WORKER_TASK_HEADER = \"x-nexus-worker-task-id\";\nexport const SESSION_AFFINITY_HEADER = \"x-session-affinity\";\nexport const RUN_ID_HEADER = \"x-nexus-run-id\";\nexport const REQUEST_ID_HEADER = \"x-nexus-request-id\";\nexport const ROOT_REQUEST_ID_HEADER = \"x-nexus-root-request-id\";\nexport const PARENT_REQUEST_ID_HEADER = \"x-nexus-parent-request-id\";\nexport const DELEGATION_ID_HEADER = \"x-nexus-delegation-id\";\nexport const REQUEST_SCOPE_HEADER = \"x-nexus-request-scope\";\nexport const MAX_DELEGATED_TURNS = 50;\nexport const DELEGATED_WORKER_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DELEGATED_OUTPUT_CAP_BYTES = 32 * 1024;\nexport const DELEGATED_EVENT_CAP_BYTES = 1024 * 1024;\nexport const MAX_DELEGATED_TASK_BYTES = 32 * 1024;\n\nconst WORKER_GRANT_TIMEOUT_MS = 10_000;\nconst INVALID_WORKER_GRANT = \"unavailable\";\nconst MAX_PARALLEL_MUTATING_WORKERS = 1;\n\nexport const DELEGATED_WORKER_TOOLS = [\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"bash\",\n\t\"write\",\n\t\"edit\",\n\t\"web_search\",\n\t\"gitnexus_query\",\n\t\"gitnexus_context\",\n\t\"gitnexus_impact\",\n\t\"gitnexus_detect_changes\",\n\t\"gitnexus_cypher\",\n\t\"gitnexus_list_repos\",\n] as const;\n\nconst WORKER_SYSTEM_PROMPT = `You are an internal delegated worker for Nexus Agent.\n\nComplete only the self-contained task you were delegated. Investigate before editing, follow local instructions, and verify any changed behavior. Do not delegate work or broaden scope. Do not discuss model names, providers, routing, credits, or internal architecture.\n\nFinish with a concise report containing:\n- work completed or findings\n- verification performed and results\n- blockers or remaining risks`;\n\nexport type DelegationStatus =\n\t| \"running\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"aborted\"\n\t| \"timeout\"\n\t| \"turn_limit\"\n\t| \"event_limit\";\n\nexport interface DelegationDetails {\n\tstatus: DelegationStatus;\n\tturns: number;\n\texitCode?: number;\n\toutputTruncated?: boolean;\n}\n\nexport interface WorkerGrant {\n\t/** Opaque, short-lived grant minted by the Hub for one worker completion. */\n\ttoken: string;\n\texpiresAt: string;\n}\n\nexport interface DelegationCapability {\n\tenabled: true;\n\tversion: 1;\n\tmaxParallel: number;\n\tmaxTaskBytes: number;\n\tworkerTimeoutMs: number;\n}\n\nexport interface WorkerGrantRequest {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n\trequestId: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface DelegationController {\n\tcreateWorkerGrant(request: WorkerGrantRequest): Promise<WorkerGrant>;\n}\n\nexport interface DelegationRequest {\n\ttask: string;\n\tacceptanceCriteria: string[];\n\trelevantPaths: string[];\n\tcwd: string;\n\tsignal: AbortSignal | undefined;\n}\n\nexport interface WorkerContext {\n\tsessionId: string;\n\ttaskId: string;\n\trunId: string;\n\trootRequestId: string;\n\tparentRequestId: string;\n}\n\nexport interface DelegatedWorkerOptions extends DelegationRequest {\n\tworkerContext: WorkerContext;\n\ttimeoutMs?: number;\n\tonUpdate?: (result: AgentToolResult<DelegationDetails>) => void;\n}\n\nexport interface DelegatedWorkerResult {\n\tstatus: Exclude<DelegationStatus, \"running\">;\n\tturns: number;\n\texitCode: number;\n\toutput: string;\n\toutputTruncated: boolean;\n}\n\ninterface AssistantSnapshot {\n\ttext: string;\n\tstopReason?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction parseAssistantSnapshot(value: unknown): AssistantSnapshot | undefined {\n\tif (!isRecord(value) || value.role !== \"assistant\" || !Array.isArray(value.content)) return undefined;\n\tconst text = value.content\n\t\t.filter(isRecord)\n\t\t.filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text as string)\n\t\t.join(\"\\n\");\n\treturn {\n\t\ttext,\n\t\t...(typeof value.stopReason === \"string\" ? { stopReason: value.stopReason } : {}),\n\t};\n}\n\nexport function composeDelegatedTask(\n\ttask: string,\n\tacceptanceCriteria: readonly string[],\n\trelevantPaths: readonly string[],\n): string {\n\tconst sections = [`Task:\\n${task.trim()}`];\n\tif (acceptanceCriteria.length > 0) {\n\t\tsections.push(`Acceptance criteria:\\n${acceptanceCriteria.map((criterion) => `- ${criterion}`).join(\"\\n\")}`);\n\t}\n\tif (relevantPaths.length > 0) {\n\t\tsections.push(`Relevant paths:\\n${relevantPaths.map((filePath) => `- ${filePath}`).join(\"\\n\")}`);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\n\nexport function buildDelegatedWorkerArgs(task: string, promptPath: string): string[] {\n\treturn [\n\t\t\"--mode\",\n\t\t\"json\",\n\t\t\"-p\",\n\t\t\"--no-session\",\n\t\t\"--model\",\n\t\t`${AUTO_PROVIDER_ID}/${AUTO_MODEL_ID}`,\n\t\t\"--tools\",\n\t\tDELEGATED_WORKER_TOOLS.join(\",\"),\n\t\t\"--exclude-tools\",\n\t\t`${DELEGATE_TASK_TOOL_NAME},subagent`,\n\t\t\"--append-system-prompt\",\n\t\tpromptPath,\n\t\ttask,\n\t];\n}\n\nfunction getNexusInvocation(args: string[]): { command: string; args: string[] } {\n\tconst currentScript = process.argv[1];\n\tconst isBunVirtualScript = currentScript?.startsWith(\"/$bunfs/root/\");\n\tif (currentScript && !isBunVirtualScript && fs.existsSync(currentScript)) {\n\t\treturn { command: process.execPath, args: [currentScript, ...args] };\n\t}\n\n\tconst execName = path.basename(process.execPath).toLowerCase();\n\tconst isGenericRuntime = /^(node|bun)(\\.exe)?$/.test(execName);\n\treturn isGenericRuntime ? { command: \"nexus\", args } : { command: process.execPath, args };\n}\n\nasync function writeWorkerPrompt(): Promise<{ dir: string; filePath: string }> {\n\tconst dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"nexus-worker-\"));\n\tconst filePath = path.join(dir, \"system.md\");\n\tawait withFileMutationQueue(filePath, async () => {\n\t\tawait fs.promises.writeFile(filePath, WORKER_SYSTEM_PROMPT, { encoding: \"utf8\", mode: 0o600 });\n\t});\n\treturn { dir, filePath };\n}\n\nfunction truncateUtf8(value: string, cap: number): { value: string; truncated: boolean } {\n\tif (Buffer.byteLength(value, \"utf8\") <= cap) return { value, truncated: false };\n\tconst suffix = \"\\n\\n[Report truncated]\";\n\tlet truncated = value.slice(0, Math.max(0, cap - Buffer.byteLength(suffix, \"utf8\")));\n\twhile (Buffer.byteLength(`${truncated}${suffix}`, \"utf8\") > cap) truncated = truncated.slice(0, -1);\n\treturn { value: `${truncated}${suffix}`, truncated: true };\n}\n\nexport function createHubDelegationController(\n\tconfig: GitNexusConfig,\n\toptions: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): DelegationController {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\treturn {\n\t\tasync createWorkerGrant(request) {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst onAbort = (): void => controller.abort();\n\t\t\tif (request.signal?.aborted) controller.abort();\n\t\t\telse request.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tconst timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? WORKER_GRANT_TIMEOUT_MS);\n\t\t\ttry {\n\t\t\t\tconst response = await fetchImpl(`${hubApiBase(config.hubUrl)}/llm/worker-grants`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\tauthorization: `Bearer ${config.token}`,\n\t\t\t\t\t\t[RUN_ID_HEADER]: request.runId,\n\t\t\t\t\t\t[REQUEST_ID_HEADER]: request.requestId,\n\t\t\t\t\t\t[ROOT_REQUEST_ID_HEADER]: request.rootRequestId,\n\t\t\t\t\t\t[PARENT_REQUEST_ID_HEADER]: request.parentRequestId,\n\t\t\t\t\t\t[DELEGATION_ID_HEADER]: request.taskId,\n\t\t\t\t\t\t[REQUEST_SCOPE_HEADER]: \"worker\",\n\t\t\t\t\t\t...(config.deviceFingerprint ? { \"x-device-fingerprint\": config.deviceFingerprint } : {}),\n\t\t\t\t\t\t...(config.deviceName ? { \"x-device-name\": config.deviceName } : {}),\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify({ sessionId: request.sessionId, taskId: request.taskId }),\n\t\t\t\t\tsignal: controller.signal,\n\t\t\t\t});\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tawait response.body?.cancel().catch(() => {});\n\t\t\t\t\tthrow new Error(\"Worker authorization unavailable\");\n\t\t\t\t}\n\t\t\t\tconst body: unknown = await response.json();\n\t\t\t\tif (\n\t\t\t\t\t!isRecord(body) ||\n\t\t\t\t\ttypeof body.grant !== \"string\" ||\n\t\t\t\t\t!body.grant.trim() ||\n\t\t\t\t\ttypeof body.expiresAt !== \"string\" ||\n\t\t\t\t\t!body.expiresAt.trim() ||\n\t\t\t\t\t!Number.isFinite(Date.parse(body.expiresAt))\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(\"Invalid worker authorization response\");\n\t\t\t\t}\n\t\t\t\treturn { token: body.grant, expiresAt: body.expiresAt };\n\t\t\t} finally {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\trequest.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function isDelegatedWorkerProcess(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn env[INTERNAL_WORKER_MARKER_ENV] === \"1\";\n}\n\nexport const DELEGATION_MODE_ENV = \"NEXUS_DELEGATION_MODE\";\n\n/**\n * `NEXUS_DELEGATION_MODE=external` hands delegation to an external\n * orchestrator (e.g. the pi-subagents package): delegate_task is not\n * registered, so the model sees exactly one delegation surface. Worker-scope\n * billing still works — children marked via the nexus-subagent-worker wrapper\n * self-mint grants exactly like delegate_task workers do.\n */\nexport const BIG_MODEL_AGENTS_ENV = \"NEXUS_BIG_MODEL_AGENTS\";\nexport const WORKER_SCOPE_ENV = \"NEXUS_WORKER_SCOPE\";\nexport const PARENT_POLICY_ENV = \"NEXUS_PARENT_POLICY\";\nexport const BUNDLED_SUBAGENTS_ENV = \"NEXUS_BUNDLED_SUBAGENTS\";\nexport const BUNDLED_PACKAGES_ENV = \"NEXUS_BUNDLED_PACKAGES\";\nexport const PI_SUBAGENT_CHILD_AGENT_ENV = \"PI_SUBAGENT_CHILD_AGENT\";\nexport const PI_SUBAGENT_BINARY_ENV = \"PI_SUBAGENT_PI_BINARY\";\nexport const DEFAULT_BIG_MODEL_AGENTS = [\"oracle\"] as const;\n\n/** pi-subagents ships inside the CLI unless bundled packages are switched off. */\nexport function bundledSubagentsAvailable(env: NodeJS.ProcessEnv = process.env): boolean {\n\tconst value = env[BUNDLED_PACKAGES_ENV]?.trim().toLowerCase();\n\treturn !(value === \"off\" || value === \"0\" || value === \"false\");\n}\n\n/**\n * Delegation runs through the bundled pi-subagents tool by default; the\n * legacy delegate_task worker is opt-in via NEXUS_DELEGATION_MODE=internal.\n */\nexport function isExternalDelegationMode(env: NodeJS.ProcessEnv = process.env): boolean {\n\tconst mode = env[DELEGATION_MODE_ENV]?.trim().toLowerCase();\n\tif (mode === \"internal\") return false;\n\tif (mode === \"external\") return true;\n\treturn bundledSubagentsAvailable(env);\n}\n\n/** Agents that keep billing the orchestrator deployment (big model). */\nexport function bigModelAgents(env: NodeJS.ProcessEnv = process.env): Set<string> {\n\tconst raw = env[BIG_MODEL_AGENTS_ENV];\n\tif (raw === undefined) return new Set(DEFAULT_BIG_MODEL_AGENTS);\n\treturn new Set(\n\t\traw\n\t\t\t.split(\",\")\n\t\t\t.map((name) => name.trim())\n\t\t\t.filter(Boolean),\n\t);\n}\n\n/**\n * A process spawned by pi-subagents announces its agent in PI_SUBAGENT_CHILD_AGENT.\n * Mark it as a delegated worker so every model turn self-mints a worker grant\n * and bills the worker deployment. Big-model agents are explicitly unmarked,\n * even when a marker was inherited from a worker parent (nested fan-out).\n * Context is always regenerated: a worker deletes its own context before\n * spawning tools, so nothing inherited is trustworthy.\n */\nexport function applyPiSubagentChildWorkerScope(\n\tenv: NodeJS.ProcessEnv = process.env,\n\tuuid: () => string = randomUUID,\n): boolean {\n\tconst agent = env[PI_SUBAGENT_CHILD_AGENT_ENV]?.trim();\n\tif (!agent) return false;\n\tconst contextKeys = [\n\t\tINTERNAL_WORKER_SESSION_ENV,\n\t\tINTERNAL_WORKER_TASK_ENV,\n\t\tINTERNAL_WORKER_RUN_ENV,\n\t\tINTERNAL_WORKER_ROOT_REQUEST_ENV,\n\t\tINTERNAL_WORKER_PARENT_REQUEST_ENV,\n\t];\n\tconst scopeOff = env[WORKER_SCOPE_ENV]?.trim().toLowerCase() === \"off\";\n\tif (scopeOff || bigModelAgents(env).has(agent)) {\n\t\tdelete env[INTERNAL_WORKER_MARKER_ENV];\n\t\tfor (const key of contextKeys) delete env[key];\n\t\treturn false;\n\t}\n\tenv[INTERNAL_WORKER_MARKER_ENV] = \"1\";\n\tfor (const key of contextKeys) env[key] = uuid();\n\treturn true;\n}\n\n/**\n * The executable pi-subagents should spawn for children: this CLI itself.\n * A compiled standalone binary is its own executable; under node/bun the\n * built cli.js carries a shebang and the executable bit from the build.\n */\nexport function resolveBundledChildBinary(\n\targv1: string | undefined = process.argv[1],\n\texecPath: string = process.execPath,\n\tfsImpl: Pick<typeof fs, \"realpathSync\" | \"accessSync\" | \"constants\"> = fs,\n): string | undefined {\n\tconst execName = path.basename(execPath).toLowerCase();\n\tif (!/^(node|bun)(\\.exe)?$/.test(execName)) return execPath;\n\tif (!argv1) return undefined;\n\ttry {\n\t\tconst real = fsImpl.realpathSync(argv1);\n\t\tif (!/cli\\.(js|mjs|cjs)$/.test(real)) return undefined;\n\t\tfsImpl.accessSync(real, fsImpl.constants.X_OK);\n\t\treturn real;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function applyBundledChildBinaryDefault(\n\tenv: NodeJS.ProcessEnv = process.env,\n\tresolved: string | undefined = resolveBundledChildBinary(),\n\toptions: HiddenSpawnOptions = {},\n): void {\n\tif (env[PI_SUBAGENT_BINARY_ENV]?.trim() || !resolved) return;\n\t// On Windows the helper is a GUI-subsystem exe. pi-subagents spawns that,\n\t// and the helper starts this CLI with CREATE_NO_WINDOW, so the child\n\t// console is never created.\n\tif (applyHiddenChildLaunch(env, resolved, PI_SUBAGENT_BINARY_ENV, options)) return;\n\tenv[PI_SUBAGENT_BINARY_ENV] = resolved;\n}\n\nexport const BLOCKED_ORCHESTRATOR_TOOLS = new Set([\"bash\", \"write\", \"edit\", DELEGATE_TASK_TOOL_NAME]);\n\nexport const ORCHESTRATOR_GUIDANCE = [\n\t\"Delegation policy: you are the orchestrator. Perform implementation, mutation,\",\n\t\"shell commands, tests, and long repetitive tool loops through the `subagent`\",\n\t\"tool (worker for implementation, reviewer for checks, scout for codebase\",\n\t\"exploration, researcher for web research). Direct bash/write/edit are disabled\",\n\t\"in this session. Reading files and querying the GitNexus graph directly is fine\",\n\t\"and unlimited — prefer gitnexus_query/context/impact to locate code before\",\n\t\"delegating. For broad or multi-source research, fan out scout or researcher\",\n\t\"subagents (or use /parallel-research) and run long investigations in the\",\n\t\"background (async) instead of one long foreground run. Give each subagent a\",\n\t\"narrow, self-contained task rather than one sprawling one. Keep planning,\",\n\t\"user communication, and final review here.\",\n].join(\" \");\n\nexport function isOrchestratorPolicyDisabled(env: NodeJS.ProcessEnv = process.env): boolean {\n\treturn (\n\t\tenv[PARENT_POLICY_ENV]?.trim().toLowerCase() === \"off\" ||\n\t\tenv[INTERNAL_WORKER_MARKER_ENV] === \"1\" ||\n\t\tBoolean(env[PI_SUBAGENT_CHILD_AGENT_ENV]?.trim())\n\t);\n}\n\n/**\n * Orchestrator-side policy for bundled subagents: hard-block mutating tools\n * (the cost guarantee — implementation always bills the worker deployment)\n * and steer everything else by prompt. No read budget: reads and graph calls\n * are cheap on cached input and capping them measurably hurt output quality.\n */\nexport function registerOrchestratorPolicy(pi: ExtensionAPI, env: NodeJS.ProcessEnv = process.env): void {\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (isOrchestratorPolicyDisabled(env) || !isAutoModel(ctx.model)) return;\n\t\treturn { systemPrompt: `${event.systemPrompt}\\n\\n${ORCHESTRATOR_GUIDANCE}` };\n\t});\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tif (isOrchestratorPolicyDisabled(env) || !isAutoModel(ctx.model)) return;\n\t\tif (!BLOCKED_ORCHESTRATOR_TOOLS.has(event.toolName)) return;\n\t\treturn {\n\t\t\tblock: true,\n\t\t\treason:\n\t\t\t\t\"This orchestrator session does not run mutating tools directly. Use the `subagent` tool \" +\n\t\t\t\t\"(worker for implementation, reviewer for checks, scout for exploration), then review its report.\",\n\t\t};\n\t});\n}\n\n/**\n * Nexus-branded aliases for the upstream pi-subagents env knobs: users set\n * NEXUS_SUBAGENT_*, we copy onto the PI_SUBAGENT_* names the package reads.\n * NEXUS_SUBAGENT_BINARY maps to PI_SUBAGENT_PI_BINARY (the child-spawn\n * wrapper hook); every other NEXUS_SUBAGENT_X maps to PI_SUBAGENT_X.\n * Explicit PI_* values always win — aliases never overwrite them.\n */\nexport function applyNexusSubagentEnvAliases(env: NodeJS.ProcessEnv = process.env): void {\n\tconst binary = env.NEXUS_SUBAGENT_BINARY?.trim();\n\tif (binary && !env.PI_SUBAGENT_PI_BINARY?.trim()) {\n\t\tenv.PI_SUBAGENT_PI_BINARY = binary;\n\t}\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (!key.startsWith(\"NEXUS_SUBAGENT_\") || key === \"NEXUS_SUBAGENT_BINARY\") continue;\n\t\tif (!value?.trim()) continue;\n\t\tconst target = `PI_SUBAGENT_${key.slice(\"NEXUS_SUBAGENT_\".length)}`;\n\t\tif (!env[target]?.trim()) env[target] = value;\n\t}\n}\n\n/** Capture task routing once, then remove it before worker tools can inherit it. */\nexport function consumeWorkerContext(env: NodeJS.ProcessEnv = process.env): WorkerContext | undefined {\n\tif (!isDelegatedWorkerProcess(env)) return undefined;\n\tconst sessionId = env[INTERNAL_WORKER_SESSION_ENV]?.trim();\n\tconst taskId = env[INTERNAL_WORKER_TASK_ENV]?.trim();\n\tconst runId = env[INTERNAL_WORKER_RUN_ENV]?.trim();\n\tconst rootRequestId = env[INTERNAL_WORKER_ROOT_REQUEST_ENV]?.trim();\n\tconst parentRequestId = env[INTERNAL_WORKER_PARENT_REQUEST_ENV]?.trim();\n\tdelete env[INTERNAL_WORKER_SESSION_ENV];\n\tdelete env[INTERNAL_WORKER_TASK_ENV];\n\tdelete env[INTERNAL_WORKER_RUN_ENV];\n\tdelete env[INTERNAL_WORKER_ROOT_REQUEST_ENV];\n\tdelete env[INTERNAL_WORKER_PARENT_REQUEST_ENV];\n\tif (!sessionId || !taskId || !runId || !rootRequestId || !parentRequestId) return undefined;\n\treturn { sessionId, taskId, runId, rootRequestId, parentRequestId };\n}\n\nfunction killProcessTree(pid: number | undefined, signal: NodeJS.Signals): void {\n\tif (pid === undefined) return;\n\tif (process.platform === \"win32\") {\n\t\texecFile(\"taskkill\", [\"/T\", \"/F\", \"/PID\", String(pid)], () => undefined);\n\t\treturn;\n\t}\n\ttry {\n\t\tprocess.kill(-pid, signal);\n\t} catch {\n\t\t// The detached process group may already have exited.\n\t}\n}\n\nexport async function runDelegatedWorker(options: DelegatedWorkerOptions): Promise<DelegatedWorkerResult> {\n\tconst prompt = await writeWorkerPrompt();\n\tconst task = composeDelegatedTask(options.task, options.acceptanceCriteria, options.relevantPaths);\n\tconst args = buildDelegatedWorkerArgs(task, prompt.filePath);\n\tlet output = \"\";\n\tlet turns = 0;\n\tlet terminalStatus: Exclude<DelegationStatus, \"running\" | \"completed\" | \"failed\"> | undefined;\n\tlet assistantFailed = false;\n\tlet eventBytes = 0;\n\n\ttry {\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tconst invocation = getNexusInvocation(args);\n\t\t\tconst child = spawnWithoutConsole(invocation.command, invocation.args, {\n\t\t\t\tcwd: options.cwd,\n\t\t\t\t// Unix uses a new process group so the tree can be signalled.\n\t\t\t\t// On Windows detached allocates a console and ignores CREATE_NO_WINDOW.\n\t\t\t\tdetached: true,\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\t[INTERNAL_WORKER_MARKER_ENV]: \"1\",\n\t\t\t\t\t[INTERNAL_WORKER_SESSION_ENV]: options.workerContext.sessionId,\n\t\t\t\t\t[INTERNAL_WORKER_TASK_ENV]: options.workerContext.taskId,\n\t\t\t\t\t[INTERNAL_WORKER_RUN_ENV]: options.workerContext.runId,\n\t\t\t\t\t[INTERNAL_WORKER_ROOT_REQUEST_ENV]: options.workerContext.rootRequestId,\n\t\t\t\t\t[INTERNAL_WORKER_PARENT_REQUEST_ENV]: options.workerContext.parentRequestId,\n\t\t\t\t},\n\t\t\t\tshell: false,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t\tlet buffer = \"\";\n\t\t\tlet settled = false;\n\t\t\tlet stopped = false;\n\t\t\tlet forceKillTimer: NodeJS.Timeout | undefined;\n\n\t\t\tconst finish = (code: number): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\tclearTimeout(forceKillTimer);\n\t\t\t\toptions.signal?.removeEventListener(\"abort\", abortHandler);\n\t\t\t\tresolve(code);\n\t\t\t};\n\n\t\t\tconst stop = (status: \"aborted\" | \"timeout\" | \"turn_limit\" | \"event_limit\"): void => {\n\t\t\t\tif (stopped) return;\n\t\t\t\tstopped = true;\n\t\t\t\tterminalStatus = status;\n\t\t\t\tkillProcessTree(child.pid, \"SIGTERM\");\n\t\t\t\tforceKillTimer = setTimeout(() => {\n\t\t\t\t\tif (process.platform !== \"win32\") killProcessTree(child.pid, \"SIGKILL\");\n\t\t\t\t\tfinish(1);\n\t\t\t\t}, 5000);\n\t\t\t};\n\n\t\t\tconst emitProgress = (): void => {\n\t\t\t\toptions.onUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is in progress.\" }],\n\t\t\t\t\tdetails: { status: \"running\", turns },\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst processLine = (line: string): void => {\n\t\t\t\tif (!line.trim()) return;\n\t\t\t\tlet parsed: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(line);\n\t\t\t\t} catch {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!isRecord(parsed) || parsed.type !== \"message_end\") return;\n\t\t\t\tconst snapshot = parseAssistantSnapshot(parsed.message);\n\t\t\t\tif (!snapshot) return;\n\t\t\t\tturns += 1;\n\t\t\t\tif (snapshot.text) output = snapshot.text;\n\t\t\t\tif (snapshot.stopReason === \"error\" || snapshot.stopReason === \"aborted\") assistantFailed = true;\n\t\t\t\temitProgress();\n\t\t\t\tif (turns >= MAX_DELEGATED_TURNS && snapshot.stopReason === \"toolUse\") stop(\"turn_limit\");\n\t\t\t};\n\n\t\t\tconst abortHandler = (): void => stop(\"aborted\");\n\t\t\tconst timeoutTimer = setTimeout(\n\t\t\t\t() => stop(\"timeout\"),\n\t\t\t\tMath.min(Math.max(1_000, options.timeoutMs ?? DELEGATED_WORKER_TIMEOUT_MS), DELEGATED_WORKER_TIMEOUT_MS),\n\t\t\t);\n\t\t\tconst stdout = child.stdout;\n\t\t\tconst stderr = child.stderr;\n\t\t\tif (!stdout || !stderr) {\n\t\t\t\tfinish(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\t\teventBytes += Buffer.byteLength(chunk);\n\t\t\t\tif (eventBytes > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\tstop(\"event_limit\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbuffer += chunk.toString();\n\t\t\t\tif (Buffer.byteLength(buffer, \"utf8\") > DELEGATED_EVENT_CAP_BYTES) {\n\t\t\t\t\tbuffer = \"\";\n\t\t\t\t\tassistantFailed = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() ?? \"\";\n\t\t\t\tfor (const line of lines) processLine(line);\n\t\t\t});\n\t\t\t// Consume stderr so a noisy child cannot block. Raw provider/process output\n\t\t\t// is intentionally not retained or exposed to the orchestrator or user.\n\t\t\tstderr.on(\"data\", () => undefined);\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tif (buffer.trim()) processLine(buffer);\n\t\t\t\tfinish(code ?? (terminalStatus ? 1 : 0));\n\t\t\t});\n\t\t\tchild.on(\"error\", () => finish(1));\n\t\t\tif (options.signal?.aborted) abortHandler();\n\t\t\telse options.signal?.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t});\n\n\t\tconst limitedOutput = truncateUtf8(output, DELEGATED_OUTPUT_CAP_BYTES);\n\t\tconst status = terminalStatus ?? (exitCode === 0 && !assistantFailed ? \"completed\" : \"failed\");\n\t\treturn {\n\t\t\tstatus,\n\t\t\tturns,\n\t\t\texitCode,\n\t\t\toutput: limitedOutput.value,\n\t\t\toutputTruncated: limitedOutput.truncated,\n\t\t};\n\t} finally {\n\t\tawait fs.promises.rm(prompt.dir, { recursive: true, force: true });\n\t}\n}\n\nconst DelegateTaskParameters = Type.Object({\n\ttask: Type.String({ description: \"A self-contained task with explicit boundaries\", maxLength: 32_768 }),\n\tacceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 2000 }), { maxItems: 10 })),\n\trelevantPaths: Type.Optional(Type.Array(Type.String({ maxLength: 1000 }), { maxItems: 20 })),\n});\n\nfunction resultContent(result: DelegatedWorkerResult): string {\n\tconst report = result.output.trim() || \"No worker report was returned.\";\n\tif (result.status === \"completed\") return `Delegated work completed.\\n\\n${report}`;\n\treturn `Delegated work did not complete (${result.status}).\\n\\nPartial report:\\n${report}`;\n}\n\n/** Register the tool only after the Hub explicitly advertises delegation. */\nexport function registerDelegateTaskTool(pi: ExtensionAPI, capability: DelegationCapability): void {\n\tconst maxTaskBytes = Math.min(Math.max(1, Math.floor(capability.maxTaskBytes)), MAX_DELEGATED_TASK_BYTES);\n\tconst workerTimeoutMs = Math.min(\n\t\tMath.max(1_000, Math.floor(capability.workerTimeoutMs)),\n\t\tDELEGATED_WORKER_TIMEOUT_MS,\n\t);\n\tconst runId = randomUUID();\n\tlet rootRequestId: string | undefined;\n\tlet latestRootRequestId: string | undefined;\n\tlet activeWorkers = 0;\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) return;\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\nDelegation guidance: prioritize delegate_task for self-contained, context-heavy investigation, broad searches, audits, repeated tool loops, or substantial implementation so the main conversation stays focused and efficient. Use your own tools directly when the work is small, depends on context already established in this conversation, requires direct verification, or delegation fails or reaches a limit. You remain responsible for the final result.`,\n\t\t};\n\t});\n\tpi.on(\"before_provider_headers\", (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model) || isDelegatedWorkerProcess()) return;\n\t\tconst requestId = randomUUID();\n\t\trootRequestId ??= requestId;\n\t\tlatestRootRequestId = requestId;\n\t\tevent.headers[RUN_ID_HEADER] = runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = rootRequestId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"root\";\n\t});\n\tpi.registerTool({\n\t\tname: DELEGATE_TASK_TOOL_NAME,\n\t\tlabel: \"Work\",\n\t\tdescription:\n\t\t\t\"Delegate one self-contained task to an isolated internal worker. Keep user communication and final responsibility in this conversation.\",\n\t\tparameters: DelegateTaskParameters,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tif (!isAutoModel(ctx.model)) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is unavailable for the active mode.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!ctx.isProjectTrusted()) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work requires a trusted project.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (activeWorkers >= MAX_PARALLEL_MUTATING_WORKERS) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is temporarily unavailable for this run.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst request: DelegationRequest = {\n\t\t\t\ttask: params.task,\n\t\t\t\tacceptanceCriteria: params.acceptanceCriteria ?? [],\n\t\t\t\trelevantPaths: params.relevantPaths ?? [],\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tsignal,\n\t\t\t};\n\t\t\tif (\n\t\t\t\tBuffer.byteLength(\n\t\t\t\t\tcomposeDelegatedTask(request.task, request.acceptanceCriteria, request.relevantPaths),\n\t\t\t\t\t\"utf8\",\n\t\t\t\t) > maxTaskBytes\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work is too large for one bounded task.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tactiveWorkers += 1;\n\t\t\ttry {\n\t\t\t\tconst delegationId = randomUUID();\n\t\t\t\trootRequestId ??= randomUUID();\n\t\t\t\tconst result = await runDelegatedWorker({\n\t\t\t\t\t...request,\n\t\t\t\t\tworkerContext: {\n\t\t\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\t\t\ttaskId: delegationId,\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\trootRequestId,\n\t\t\t\t\t\tparentRequestId: latestRootRequestId ?? rootRequestId,\n\t\t\t\t\t},\n\t\t\t\t\ttimeoutMs: workerTimeoutMs,\n\t\t\t\t\tonUpdate,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: resultContent(result) }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\tturns: result.turns,\n\t\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\t\toutputTruncated: result.outputTruncated,\n\t\t\t\t\t} satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Delegated work could not be started.\" }],\n\t\t\t\t\tdetails: { status: \"failed\", turns: 0 } satisfies DelegationDetails,\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\tactiveWorkers -= 1;\n\t\t\t}\n\t\t},\n\t\trenderCall(_args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"Working…\")), 0, 0);\n\t\t},\n\t\trenderResult(result, _options, theme) {\n\t\t\tconst details = result.details as DelegationDetails | undefined;\n\t\t\tif (details?.status === \"running\") return new Text(theme.fg(\"muted\", \"Working…\"), 0, 0);\n\t\t\tif (details?.status === \"completed\") return new Text(theme.fg(\"success\", \"Work completed\"), 0, 0);\n\t\t\treturn new Text(theme.fg(\"error\", \"Work needs attention\"), 0, 0);\n\t\t},\n\t});\n}\n\n/**\n * Install a fail-closed header hook for one worker task. A fresh one-time grant\n * is minted for each model turn; no grant is inherited by worker tools.\n */\nexport function registerWorkerGrantHeaders(\n\tpi: ExtensionAPI,\n\tworkerContext: WorkerContext,\n\tcontroller: DelegationController | undefined,\n): void {\n\tpi.on(\"before_provider_headers\", async (event, ctx) => {\n\t\tif (!isAutoModel(ctx.model)) {\n\t\t\tctx.abort();\n\t\t\treturn;\n\t\t}\n\n\t\t// Set an invalid sentinel first. Extension handler errors are reported and\n\t\t// swallowed by the runner, so this prevents a mint failure from silently\n\t\t// falling back to an ungranted root request.\n\t\tconst requestId = randomUUID();\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = INVALID_WORKER_GRANT;\n\t\tevent.headers[INTERNAL_WORKER_TASK_HEADER] = workerContext.taskId;\n\t\tevent.headers[SESSION_AFFINITY_HEADER] = workerContext.sessionId;\n\t\tevent.headers[RUN_ID_HEADER] = workerContext.runId;\n\t\tevent.headers[REQUEST_ID_HEADER] = requestId;\n\t\tevent.headers[ROOT_REQUEST_ID_HEADER] = workerContext.rootRequestId;\n\t\tevent.headers[PARENT_REQUEST_ID_HEADER] = workerContext.parentRequestId;\n\t\tevent.headers[DELEGATION_ID_HEADER] = workerContext.taskId;\n\t\tevent.headers[REQUEST_SCOPE_HEADER] = \"worker\";\n\t\tif (!controller) return;\n\n\t\tconst grant = await controller.createWorkerGrant({\n\t\t\t...workerContext,\n\t\t\trequestId,\n\t\t\tsignal: ctx.signal,\n\t\t});\n\t\tevent.headers[INTERNAL_WORKER_GRANT_HEADER] = grant.token;\n\t});\n}\n\nexport default function delegatedWorkerRuntime(pi: ExtensionAPI): void {\n\tapplyNexusSubagentEnvAliases();\n\tif (bundledSubagentsAvailable()) process.env[BUNDLED_SUBAGENTS_ENV] = \"1\";\n\tapplyPiSubagentChildWorkerScope();\n\tconst isWorker = isDelegatedWorkerProcess();\n\tconst workerContext = consumeWorkerContext();\n\tif (!isWorker) {\n\t\tif (isExternalDelegationMode()) {\n\t\t\tapplyBundledChildBinaryDefault();\n\t\t\tregisterOrchestratorPolicy(pi);\n\t\t}\n\t\treturn;\n\t}\n\tconst config = resolveGitNexusConfig();\n\tconst failClosedContext: WorkerContext = {\n\t\tsessionId: \"unavailable\",\n\t\ttaskId: \"unavailable\",\n\t\trunId: \"unavailable\",\n\t\trootRequestId: \"unavailable\",\n\t\tparentRequestId: \"unavailable\",\n\t};\n\tregisterWorkerGrantHeaders(\n\t\tpi,\n\t\tworkerContext ?? failClosedContext,\n\t\tworkerContext && config ? createHubDelegationController(config) : undefined,\n\t);\n}\n"]}
|