@code-yeongyu/senpi 2026.9.23-2 → 2026.9.23-4
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/CHANGELOG.md +45 -0
- package/dist/bundle/chunks/{app-server-command-UO3ODP6D.js → app-server-command-QRBQLEXY.js} +1 -1
- package/dist/bundle/chunks/{chunk-UCTYTLP3.js → chunk-3RN6BFG2.js} +2 -2
- package/dist/bundle/chunks/{chunk-OLJ7LQJY.js → chunk-BBOQ5H4W.js} +1 -1
- package/dist/bundle/chunks/{chunk-XTXBPXZZ.js → chunk-EN6KDFY2.js} +1 -1
- package/dist/bundle/chunks/{chunk-2NFHX2FJ.js → chunk-J3QXPP4T.js} +1 -1
- package/dist/bundle/chunks/chunk-KBG7BJIL.js +8 -0
- package/dist/bundle/chunks/{chunk-LMO3WYKH.js → chunk-N46LNXHU.js} +156 -167
- package/dist/bundle/chunks/{chunk-7EH64T6E.js → chunk-ORCF262V.js} +2 -2
- package/dist/bundle/chunks/{chunk-67Z5WNA4.js → chunk-PSMTQDII.js} +1 -1
- package/dist/bundle/chunks/{chunk-IDJUNOOR.js → chunk-WUYBEF7C.js} +2 -2
- package/dist/bundle/chunks/{chunk-IDSOMHWS.js → chunk-WXIRFRXY.js} +1 -1
- package/dist/bundle/chunks/{chunk-BPHXJ4N2.js → chunk-XDSQYM4F.js} +1 -1
- package/dist/bundle/chunks/{chunk-IBHBWRC4.js → chunk-ZEFQYQOU.js} +3 -3
- package/dist/bundle/chunks/{cli-main-LUQZADLN.js → cli-main-ROBDBYAB.js} +1 -1
- package/dist/bundle/chunks/cursor-agent.js +1 -1
- package/dist/bundle/chunks/{help-fast-path-VXAZDQ3Z.js → help-fast-path-QXVCHTP3.js} +1 -1
- package/dist/bundle/chunks/{host-command-5PEFD4N6.js → host-command-3PUZYQOK.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-BXW5C4JT.js → host-lifecycle-OHPSU5VU.js} +1 -1
- package/dist/bundle/chunks/{interactive-host-runtime-A6PM52FT.js → interactive-host-runtime-57LEAJPU.js} +1 -1
- package/dist/bundle/chunks/{interactive-mode-VR7QYMAE.js → interactive-mode-SLPAGRHH.js} +1 -1
- package/dist/bundle/chunks/{list-tips-VGOIMT6W.js → list-tips-Z62FXPOJ.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-LYOVVA75.js → multi-session-host-3PACMEHC.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-OMEJACX6.js → package-manager-cli-6UIUSRQO.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-B6RSUQKL.js → pi-messages-CAS467IY.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-ZIYWOB2N.js → rotation-stream-CZT4TRPD.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-AKGJA73P.js → rpc-mode-47EVLL6X.js} +1 -1
- package/dist/bundle/chunks/{session-picker-UE5LOM6W.js → session-picker-ZIBANFBQ.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +235 -246
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.d.ts +19 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.js +76 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-model-support.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.d.ts +7 -2
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.js +28 -3
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable.d.ts +11 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/executable.js +31 -10
- package/dist/core/extensions/builtin/anthropic-subscription/executable.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts +2 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.js +18 -2
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.d.ts +2 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/stream.js +5 -3
- package/dist/core/extensions/builtin/anthropic-subscription/stream.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +43 -26
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +8 -0
- package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +4 -2
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +3 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +32 -10
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/parked-wait.d.ts +16 -0
- package/dist/core/extensions/builtin/goal/parked-wait.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/parked-wait.js +54 -0
- package/dist/core/extensions/builtin/goal/parked-wait.js.map +1 -0
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js +8 -2
- package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.js +15 -4
- package/dist/core/extensions/builtin/mcp/auth/commands-auth.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/commands.js +2 -0
- package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +5 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +16 -11
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +5 -5
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +9 -6
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/test-decision.d.ts +2 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.js +5 -0
- package/dist/core/extensions/builtin/prompt-preset/test-decision.js.map +1 -0
- package/dist/core/extensions/builtin/rule-activation/types.d.ts +2 -0
- package/dist/core/extensions/builtin/rule-activation/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rule-activation/types.js +7 -1
- package/dist/core/extensions/builtin/rule-activation/types.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +2 -1
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +3 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +9 -3
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.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 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +5 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-config.d.ts +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +26 -20
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +87 -14
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-json-migration.d.ts +30 -0
- package/dist/core/models-json-migration.d.ts.map +1 -0
- package/dist/core/models-json-migration.js +257 -0
- package/dist/core/models-json-migration.js.map +1 -0
- package/dist/core/output-guard.d.ts +2 -0
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js +31 -0
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +16 -6
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-overrides.d.ts +8 -0
- package/dist/core/settings-overrides.d.ts.map +1 -0
- package/dist/core/settings-overrides.js +28 -0
- package/dist/core/settings-overrides.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +12 -7
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +9 -6
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep/format.d.ts +3 -2
- package/dist/core/tools/grep/format.d.ts.map +1 -1
- package/dist/core/tools/grep/format.js +5 -3
- package/dist/core/tools/grep/format.js.map +1 -1
- package/dist/core/tools/grep/index.js +2 -2
- package/dist/core/tools/grep/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -3
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/model-only-text.d.ts +4 -0
- package/dist/core/tools/model-only-text.d.ts.map +1 -0
- package/dist/core/tools/model-only-text.js +12 -0
- package/dist/core/tools/model-only-text.js.map +1 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +15 -5
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +2 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +1 -25
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/grep.d.ts.map +1 -1
- package/dist/core/tools/renderers/grep.js +0 -25
- package/dist/core/tools/renderers/grep.js.map +1 -1
- package/dist/core/tools/renderers/read.d.ts +8 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -1
- package/dist/core/tools/renderers/read.js +2 -14
- package/dist/core/tools/renderers/read.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +4 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +10 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +22 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/exploration-call.d.ts +15 -0
- package/dist/modes/interactive/components/exploration-call.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-call.js +56 -0
- package/dist/modes/interactive/components/exploration-call.js.map +1 -0
- package/dist/modes/interactive/components/exploration-group.d.ts +21 -0
- package/dist/modes/interactive/components/exploration-group.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-group.js +95 -0
- package/dist/modes/interactive/components/exploration-group.js.map +1 -0
- package/dist/modes/interactive/components/exploration-rules.d.ts +5 -0
- package/dist/modes/interactive/components/exploration-rules.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-rules.js +15 -0
- package/dist/modes/interactive/components/exploration-rules.js.map +1 -0
- package/dist/modes/interactive/components/exploration-transcript-container.d.ts +18 -0
- package/dist/modes/interactive/components/exploration-transcript-container.d.ts.map +1 -0
- package/dist/modes/interactive/components/exploration-transcript-container.js +76 -0
- package/dist/modes/interactive/components/exploration-transcript-container.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +7 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +8 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +24 -35
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/replay-assistant-tools.d.ts +14 -0
- package/dist/modes/interactive/replay-assistant-tools.d.ts.map +1 -0
- package/dist/modes/interactive/replay-assistant-tools.js +33 -0
- package/dist/modes/interactive/replay-assistant-tools.js.map +1 -0
- package/dist/modes/interactive/tool-progress.d.ts +2 -0
- package/dist/modes/interactive/tool-progress.d.ts.map +1 -1
- package/dist/modes/interactive/tool-progress.js +5 -2
- package/dist/modes/interactive/tool-progress.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/tui-renderer.js +6 -1
- package/dist/modes/interactive/tui-renderer.js.map +1 -1
- package/docs/extensions.md +8 -0
- package/docs/mcp.md +9 -6
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +30 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +10 -8
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/display-code.ts +145 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-request.ts +7 -12
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +38 -35
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +1 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +17 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts +18 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js +103 -3
- package/node_modules/@earendil-works/pi-ai/dist/cursor/catalog-grouping.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js +15 -3
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts +7 -2
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +92 -20
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +9 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.d.ts +3 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.js +14 -0
- package/node_modules/@earendil-works/pi-tui/dist/stderr-observer.js.map +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +4 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +8 -12
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/chunk-WJ2BGYFK.js +0 -8
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { GOAL_CACHE_WARMUP_ENTRY_TYPE } from "./cache-warm.js";
|
|
2
|
+
/**
|
|
3
|
+
* Finds the wait a retired extension generation left parked for `goalId`, so a
|
|
4
|
+
* reload re-arms that same wait instead of starting a new one. The branch tail
|
|
5
|
+
* is authoritative: any message or custom message after the last cache-warm
|
|
6
|
+
* entry means a turn ran since, so nothing is parked any more.
|
|
7
|
+
*/
|
|
8
|
+
export function findParkedGoalWait(entries, goalId) {
|
|
9
|
+
for (let index = entries.length - 1; index >= 0; index--) {
|
|
10
|
+
const entry = entries[index];
|
|
11
|
+
if (entry === undefined)
|
|
12
|
+
continue;
|
|
13
|
+
if (entry.type === "message" || entry.type === "custom_message")
|
|
14
|
+
return undefined;
|
|
15
|
+
if (entry.type !== "custom" || entry.customType !== GOAL_CACHE_WARMUP_ENTRY_TYPE)
|
|
16
|
+
continue;
|
|
17
|
+
return parseParkedWait(entry.data, goalId);
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
function parseParkedWait(data, goalId) {
|
|
22
|
+
if (typeof data !== "object" || data === null)
|
|
23
|
+
return undefined;
|
|
24
|
+
const phase = Reflect.get(data, "phase");
|
|
25
|
+
const entryGoalId = Reflect.get(data, "goalId");
|
|
26
|
+
const iteration = Reflect.get(data, "iteration");
|
|
27
|
+
const delayMs = Reflect.get(data, "delayMs");
|
|
28
|
+
const dueAtMs = Reflect.get(data, "dueAtMs");
|
|
29
|
+
if (phase !== "scheduled" || entryGoalId !== goalId)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (typeof iteration !== "number" || !Number.isInteger(iteration) || iteration < 1)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (typeof delayMs !== "number" || !Number.isFinite(delayMs) || delayMs <= 0)
|
|
34
|
+
return undefined;
|
|
35
|
+
if (typeof dueAtMs !== "number" || !Number.isFinite(dueAtMs))
|
|
36
|
+
return undefined;
|
|
37
|
+
const cache = parseCache(Reflect.get(data, "cache"));
|
|
38
|
+
return { iteration, delayMs, dueAtMs, ...(cache !== undefined ? { cache } : {}) };
|
|
39
|
+
}
|
|
40
|
+
function parseCache(value) {
|
|
41
|
+
if (typeof value !== "object" || value === null)
|
|
42
|
+
return undefined;
|
|
43
|
+
const cachedTokens = Reflect.get(value, "cachedTokens");
|
|
44
|
+
if (typeof cachedTokens !== "number" || !Number.isFinite(cachedTokens))
|
|
45
|
+
return undefined;
|
|
46
|
+
const ttlSeconds = Reflect.get(value, "ttlSeconds");
|
|
47
|
+
const estimatedSavedUsd = Reflect.get(value, "estimatedSavedUsd");
|
|
48
|
+
return {
|
|
49
|
+
cachedTokens,
|
|
50
|
+
...(typeof ttlSeconds === "number" && Number.isFinite(ttlSeconds) ? { ttlSeconds } : {}),
|
|
51
|
+
...(typeof estimatedSavedUsd === "number" && Number.isFinite(estimatedSavedUsd) ? { estimatedSavedUsd } : {}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=parked-wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parked-wait.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/parked-wait.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionEntry } from \"../../../session-manager.ts\";\nimport { GOAL_CACHE_WARMUP_ENTRY_TYPE, type GoalCacheWarmMetrics } from \"./cache-warm.ts\";\n\nexport interface ParkedGoalWait {\n\treadonly iteration: number;\n\treadonly delayMs: number;\n\treadonly dueAtMs: number;\n\treadonly cache?: GoalCacheWarmMetrics;\n}\n\n/**\n * Finds the wait a retired extension generation left parked for `goalId`, so a\n * reload re-arms that same wait instead of starting a new one. The branch tail\n * is authoritative: any message or custom message after the last cache-warm\n * entry means a turn ran since, so nothing is parked any more.\n */\nexport function findParkedGoalWait(entries: readonly SessionEntry[], goalId: string): ParkedGoalWait | undefined {\n\tfor (let index = entries.length - 1; index >= 0; index--) {\n\t\tconst entry = entries[index];\n\t\tif (entry === undefined) continue;\n\t\tif (entry.type === \"message\" || entry.type === \"custom_message\") return undefined;\n\t\tif (entry.type !== \"custom\" || entry.customType !== GOAL_CACHE_WARMUP_ENTRY_TYPE) continue;\n\t\treturn parseParkedWait(entry.data, goalId);\n\t}\n\treturn undefined;\n}\n\nfunction parseParkedWait(data: unknown, goalId: string): ParkedGoalWait | undefined {\n\tif (typeof data !== \"object\" || data === null) return undefined;\n\tconst phase = Reflect.get(data, \"phase\");\n\tconst entryGoalId = Reflect.get(data, \"goalId\");\n\tconst iteration = Reflect.get(data, \"iteration\");\n\tconst delayMs = Reflect.get(data, \"delayMs\");\n\tconst dueAtMs = Reflect.get(data, \"dueAtMs\");\n\tif (phase !== \"scheduled\" || entryGoalId !== goalId) return undefined;\n\tif (typeof iteration !== \"number\" || !Number.isInteger(iteration) || iteration < 1) return undefined;\n\tif (typeof delayMs !== \"number\" || !Number.isFinite(delayMs) || delayMs <= 0) return undefined;\n\tif (typeof dueAtMs !== \"number\" || !Number.isFinite(dueAtMs)) return undefined;\n\tconst cache = parseCache(Reflect.get(data, \"cache\"));\n\treturn { iteration, delayMs, dueAtMs, ...(cache !== undefined ? { cache } : {}) };\n}\n\nfunction parseCache(value: unknown): GoalCacheWarmMetrics | undefined {\n\tif (typeof value !== \"object\" || value === null) return undefined;\n\tconst cachedTokens = Reflect.get(value, \"cachedTokens\");\n\tif (typeof cachedTokens !== \"number\" || !Number.isFinite(cachedTokens)) return undefined;\n\tconst ttlSeconds = Reflect.get(value, \"ttlSeconds\");\n\tconst estimatedSavedUsd = Reflect.get(value, \"estimatedSavedUsd\");\n\treturn {\n\t\tcachedTokens,\n\t\t...(typeof ttlSeconds === \"number\" && Number.isFinite(ttlSeconds) ? { ttlSeconds } : {}),\n\t\t...(typeof estimatedSavedUsd === \"number\" && Number.isFinite(estimatedSavedUsd) ? { estimatedSavedUsd } : {}),\n\t};\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ExtensionAPI, ExtensionCommandContext } from "../../../types.ts";
|
|
2
2
|
import type { McpService } from "../service.ts";
|
|
3
|
-
export declare function handleMcpAuthCommand(subcommand: string, args: readonly string[], ctx: ExtensionCommandContext, pi: Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" | "registerTool">, service: McpService): Promise<void>;
|
|
3
|
+
export declare function handleMcpAuthCommand(subcommand: string, args: readonly string[], ctx: ExtensionCommandContext, pi: Pick<ExtensionAPI, "getActiveTools" | "setActiveTools" | "registerTool" | "appendEntry">, service: McpService): Promise<void>;
|
|
4
4
|
//# sourceMappingURL=commands-auth-dispatch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-auth-dispatch.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth-dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands-auth-dispatch.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth-dispatch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,wBAAsB,oBAAoB,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,uBAAuB,EAC5B,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,GAAG,aAAa,CAAC,EAC5F,OAAO,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { openBrowser } from "../../../../../utils/open-browser.js";
|
|
1
2
|
import { createMcpLogger } from "../log.js";
|
|
2
3
|
import { runAuth, runAuthComplete, runAuthStart, runLogout } from "./commands-auth.js";
|
|
3
4
|
// Bridges the /mcp slash command to the pure auth flow runners in
|
|
@@ -16,7 +17,12 @@ export async function handleMcpAuthCommand(subcommand, args, ctx, pi, service) {
|
|
|
16
17
|
env: target.env,
|
|
17
18
|
hasUI: ctx.hasUI,
|
|
18
19
|
logger: createMcpLogger(name),
|
|
19
|
-
notify: (message, type) =>
|
|
20
|
+
notify: (message, type) => {
|
|
21
|
+
if (ctx.hasUI)
|
|
22
|
+
pi.appendEntry("mcp-auth", message);
|
|
23
|
+
else
|
|
24
|
+
ctx.ui.notify(message, type);
|
|
25
|
+
},
|
|
20
26
|
onReconnect: async () => {
|
|
21
27
|
try {
|
|
22
28
|
await service.reconnectServer(name);
|
|
@@ -26,7 +32,7 @@ export async function handleMcpAuthCommand(subcommand, args, ctx, pi, service) {
|
|
|
26
32
|
}
|
|
27
33
|
await service.attachSession({ type: "session_start", reason: "reload" }, ctx, pi).catch(() => undefined);
|
|
28
34
|
},
|
|
29
|
-
openBrowser: (url) =>
|
|
35
|
+
openBrowser: (url) => openBrowser(url.toString()),
|
|
30
36
|
pending: service.getPendingAuth(),
|
|
31
37
|
interactiveGuard: {
|
|
32
38
|
begin: (serverName) => service.beginInteractiveAuth(serverName),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-auth-dispatch.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth-dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands-auth-dispatch.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["import { openBrowser } from \"../../../../../utils/open-browser.ts\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../../types.ts\";\nimport { createMcpLogger } from \"../log.ts\";\nimport type { McpService } from \"../service.ts\";\nimport { type AuthCommandDeps, runAuth, runAuthComplete, runAuthStart, runLogout } from \"./commands-auth.ts\";\n\n// Bridges the /mcp slash command to the pure auth flow runners in\n// commands-auth.ts, sourcing config/agentDir/env from the running service.\nexport async function handleMcpAuthCommand(\n\tsubcommand: string,\n\targs: readonly string[],\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\" | \"appendEntry\">,\n\tservice: McpService,\n): Promise<void> {\n\tconst name = args[0] ?? \"\";\n\tconst target = service.getAuthTarget(name);\n\tif (name.length === 0 || target === undefined) {\n\t\tctx.ui.notify(`Unknown MCP server: ${name || \"<missing>\"}`, \"error\");\n\t\treturn;\n\t}\n\tconst deps: AuthCommandDeps = {\n\t\tagentDir: target.agentDir,\n\t\tcallbackUrl: target.callbackUrl,\n\t\tconfig: target.config,\n\t\tenv: target.env,\n\t\thasUI: ctx.hasUI,\n\t\tlogger: createMcpLogger(name),\n\t\tnotify: (message, type) => {\n\t\t\tif (ctx.hasUI) pi.appendEntry(\"mcp-auth\", message);\n\t\t\telse ctx.ui.notify(message, type);\n\t\t},\n\t\tonReconnect: async () => {\n\t\t\ttry {\n\t\t\t\tawait service.reconnectServer(name);\n\t\t\t} catch {\n\t\t\t\t// A needs_auth/degraded state after logout is expected; status shows it.\n\t\t\t}\n\t\t\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi).catch(() => undefined);\n\t\t},\n\t\topenBrowser: (url) => openBrowser(url.toString()),\n\t\tpending: service.getPendingAuth(),\n\t\tinteractiveGuard: {\n\t\t\tbegin: (serverName) => service.beginInteractiveAuth(serverName),\n\t\t\tend: (serverName) => service.endInteractiveAuth(serverName),\n\t\t},\n\t\tserverName: name,\n\t};\n\tif (subcommand === \"auth\") return runAuth(deps);\n\tif (subcommand === \"auth-start\") {\n\t\tawait runAuthStart(deps);\n\t\treturn;\n\t}\n\tif (subcommand === \"auth-complete\") {\n\t\tconst redirect = args[1] ?? \"\";\n\t\tif (redirect.length === 0) {\n\t\t\tctx.ui.notify(`Usage: /mcp auth-complete ${name} <redirect-url>`, \"error\");\n\t\t\treturn;\n\t\t}\n\t\treturn runAuthComplete(deps, redirect);\n\t}\n\tif (subcommand === \"logout\") return runLogout(deps);\n\tctx.ui.notify(`Unknown MCP auth subcommand: ${subcommand}`, \"error\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzF,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAqCD,wBAAsB,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlE;
|
|
1
|
+
{"version":3,"file":"commands-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzF,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAqCD,wBAAsB,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlE;AAwED,wBAAsB,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAezE;AAGD,wBAAsB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F;AAGD,wBAAsB,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpE"}
|
|
@@ -69,10 +69,22 @@ async function runInteractive(deps) {
|
|
|
69
69
|
validateState: (state) => provider?.consumeState(state) ?? false,
|
|
70
70
|
});
|
|
71
71
|
const loopbackResult = channel.usesLoopback ? channel.waitForCode() : undefined;
|
|
72
|
-
|
|
72
|
+
const usesLoopback = channel.usesLoopback;
|
|
73
|
+
provider = buildProvider(deps, channel.redirectUrl, async (url) => {
|
|
74
|
+
const instruction = usesLoopback
|
|
75
|
+
? ""
|
|
76
|
+
: `\nThen run /mcp auth-complete ${deps.serverName} <redirect-url> with the final redirect URL.`;
|
|
77
|
+
const announcement = `Open this URL to authorize ${deps.serverName}:\n${url.toString()}${instruction}`;
|
|
78
|
+
deps.notify(announcement);
|
|
79
|
+
try {
|
|
80
|
+
await deps.openBrowser?.(url);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
+
deps.notify(`Browser launch failed: ${message}\n${announcement}`, "warning");
|
|
85
|
+
}
|
|
86
|
+
});
|
|
73
87
|
const begin = await beginAuthorization(provider, deps.flow);
|
|
74
|
-
if (begin.authorizationUrl !== undefined)
|
|
75
|
-
deps.notify(`Opening browser to authorize ${deps.serverName}...`);
|
|
76
88
|
if (!channel.usesLoopback) {
|
|
77
89
|
deps.pending.set(deps.serverName, provider);
|
|
78
90
|
if (begin.authorizationUrl === undefined) {
|
|
@@ -80,7 +92,6 @@ async function runInteractive(deps) {
|
|
|
80
92
|
serverName: deps.serverName,
|
|
81
93
|
});
|
|
82
94
|
}
|
|
83
|
-
deps.notify(`Complete the browser flow, then run /mcp auth-complete ${deps.serverName} <redirect-url> with the final redirect URL.`);
|
|
84
95
|
return;
|
|
85
96
|
}
|
|
86
97
|
const { code } = await (loopbackResult ?? channel.waitForCode());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-auth.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import type { McpServerConfig } from \"../config-schema.ts\";\nimport type { McpLogger } from \"../log.ts\";\nimport { openCallbackChannel } from \"./callback.ts\";\nimport { resolveServerAuth } from \"./context.ts\";\nimport type { OAuthFlowOptions } from \"./oauth.ts\";\nimport {\n\tbeginAuthorization,\n\tclientCredentialsGrant,\n\tcompleteAuthorization,\n\tfinishAuthorization,\n\tlogout,\n} from \"./oauth.ts\";\nimport { OAuthFlowError } from \"./oauth-errors.ts\";\nimport type { McpOAuthProvider } from \"./oauth-provider.ts\";\n\ntype Notify = (message: string, type?: \"info\" | \"warning\" | \"error\") => void;\n\nexport interface AuthCommandDeps {\n\tserverName: string;\n\tconfig: McpServerConfig;\n\tagentDir?: string;\n\tenv?: Record<string, string | undefined>;\n\tlogger?: McpLogger;\n\thasUI: boolean;\n\tnotify: Notify;\n\t// settings.oauthCallbackUrl override: when set, no local listener is opened.\n\tcallbackUrl?: string;\n\topenBrowser?: (url: URL) => void | Promise<void>;\n\tonReconnect: () => Promise<void>;\n\t// Persists the provider between auth-start and auth-complete so the in-memory\n\t// CSRF state survives across two command invocations in one session.\n\tpending: Map<string, McpOAuthProvider>;\n\t/** Per-service guard: the same server may authenticate in another session. */\n\tinteractiveGuard?: { begin(serverName: string): boolean; end(serverName: string): void };\n\tflow?: OAuthFlowOptions;\n}\n\nconst PASTE_REDIRECT = \"http://127.0.0.1:0/callback\";\nconst activeInteractiveAuthServers = new Set<string>();\n\nfunction ensureOAuth(deps: AuthCommandDeps): void {\n\tif (deps.config.auth === false || deps.config.type !== \"http\" || deps.config.url === undefined) {\n\t\tthrow new OAuthFlowError(\"headless\", `MCP server ${deps.serverName} is not an OAuth HTTP server.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n}\n\nfunction buildProvider(\n\tdeps: AuthCommandDeps,\n\tredirectUrl: string,\n\tonRedirect?: (url: URL) => void | Promise<void>,\n): McpOAuthProvider {\n\tconst plan = resolveServerAuth({\n\t\tagentDir: deps.agentDir,\n\t\tconfig: { ...deps.config, auth: \"oauth\" },\n\t\tenv: deps.env,\n\t\tlogger: deps.logger,\n\t\tonRedirect,\n\t\tredirectUrl,\n\t\tserverName: deps.serverName,\n\t});\n\tif (plan.provider === undefined) {\n\t\tthrow new OAuthFlowError(\"headless\", `MCP server ${deps.serverName} could not build an OAuth provider.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n\treturn plan.provider;\n}\n\n// `/mcp auth <server>`: client_credentials M2M, or interactive loopback flow.\n// Non-UI callers fail fast with an actionable headless hint (no browser).\nexport async function runAuth(deps: AuthCommandDeps): Promise<void> {\n\tensureOAuth(deps);\n\tif (deps.config.oauth?.flow === \"client_credentials\") {\n\t\tconst provider = buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\t\tawait clientCredentialsGrant(provider, deps.flow);\n\t\tawait deps.onReconnect();\n\t\tdeps.notify(`MCP server ${deps.serverName} authenticated (client_credentials)`);\n\t\treturn;\n\t}\n\tif (!deps.hasUI) {\n\t\tdeps.notify(\n\t\t\t`MCP server ${deps.serverName} needs interactive OAuth. Run senpi in a terminal, then: /mcp auth-start ${deps.serverName} and /mcp auth-complete ${deps.serverName} <redirect-url>`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tawait runInteractive(deps);\n}\n\nasync function runInteractive(deps: AuthCommandDeps): Promise<void> {\n\tconst beginInteractiveAuth =\n\t\tdeps.interactiveGuard?.begin(deps.serverName) ?? !activeInteractiveAuthServers.has(deps.serverName);\n\tif (!beginInteractiveAuth) {\n\t\tthrow new OAuthFlowError(\n\t\t\t\"needs_auth\",\n\t\t\t`MCP server ${deps.serverName} authorization is already in progress; complete the existing browser flow or retry after it finishes.`,\n\t\t\t{ serverName: deps.serverName },\n\t\t);\n\t}\n\tif (deps.interactiveGuard === undefined) activeInteractiveAuthServers.add(deps.serverName);\n\tlet provider: McpOAuthProvider | undefined;\n\tlet channel: Awaited<ReturnType<typeof openCallbackChannel>> | undefined;\n\tconst oauth = deps.config.oauth;\n\tlet callbackPort: number | undefined;\n\tif (\n\t\t(deps.callbackUrl === undefined || deps.callbackUrl.length === 0) &&\n\t\toauth?.clientId !== undefined &&\n\t\toauth.clientMetadataUrl === undefined\n\t) {\n\t\tcallbackPort = oauth.callbackPort;\n\t}\n\ttry {\n\t\tchannel = await openCallbackChannel({\n\t\t\toverrideUrl: deps.callbackUrl,\n\t\t\tport: callbackPort,\n\t\t\tserverName: deps.serverName,\n\t\t\tvalidateState: (state) => provider?.consumeState(state) ?? false,\n\t\t});\n\t\tconst loopbackResult = channel.usesLoopback ? channel.waitForCode() : undefined;\n\t\tprovider = buildProvider(deps, channel.redirectUrl, (url) => deps.openBrowser?.(url));\n\t\tconst begin = await beginAuthorization(provider, deps.flow);\n\t\tif (begin.authorizationUrl !== undefined) deps.notify(`Opening browser to authorize ${deps.serverName}...`);\n\t\tif (!channel.usesLoopback) {\n\t\t\tdeps.pending.set(deps.serverName, provider);\n\t\t\tif (begin.authorizationUrl === undefined) {\n\t\t\t\tthrow new OAuthFlowError(\n\t\t\t\t\t\"needs_auth\",\n\t\t\t\t\t`MCP server ${deps.serverName} did not produce an authorization URL.`,\n\t\t\t\t\t{\n\t\t\t\t\t\tserverName: deps.serverName,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\tdeps.notify(\n\t\t\t\t`Complete the browser flow, then run /mcp auth-complete ${deps.serverName} <redirect-url> with the final redirect URL.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst { code } = await (loopbackResult ?? channel.waitForCode());\n\t\tawait finishAuthorization(provider, code, deps.flow);\n\t\tawait deps.onReconnect();\n\t\tdeps.notify(`MCP server ${deps.serverName} authorized`);\n\t} finally {\n\t\tif (deps.interactiveGuard) deps.interactiveGuard.end(deps.serverName);\n\t\telse activeInteractiveAuthServers.delete(deps.serverName);\n\t\tawait channel?.close();\n\t}\n}\n\n// `/mcp auth-start <server>`: print the authorize URL for a browser-less paste.\nexport async function runAuthStart(deps: AuthCommandDeps): Promise<string> {\n\tensureOAuth(deps);\n\tconst provider = buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\tconst begin = await beginAuthorization(provider, deps.flow);\n\tconst url = begin.authorizationUrl;\n\tif (url === undefined) {\n\t\tthrow new OAuthFlowError(\"needs_auth\", `MCP server ${deps.serverName} did not produce an authorization URL.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n\tdeps.pending.set(deps.serverName, provider);\n\tdeps.notify(\n\t\t`Open this URL, approve, then run /mcp auth-complete ${deps.serverName} <redirect-url>:\\n${url.toString()}`,\n\t);\n\treturn url.toString();\n}\n\n// `/mcp auth-complete <server> <redirect-url>`: finish the paste flow.\nexport async function runAuthComplete(deps: AuthCommandDeps, redirectUrl: string): Promise<void> {\n\tensureOAuth(deps);\n\tconst pending = deps.pending.get(deps.serverName);\n\tconst provider = pending ?? buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\tawait completeAuthorization(provider, redirectUrl, deps.flow);\n\tdeps.pending.delete(deps.serverName);\n\tawait deps.onReconnect();\n\tdeps.notify(`MCP server ${deps.serverName} authorized`);\n}\n\n// `/mcp logout <server>`: clear stored credentials.\nexport async function runLogout(deps: AuthCommandDeps): Promise<void> {\n\tconst provider = buildProvider(deps, PASTE_REDIRECT);\n\tawait logout(provider);\n\tdeps.pending.delete(deps.serverName);\n\tawait deps.onReconnect();\n\tdeps.notify(`MCP server ${deps.serverName} logged out`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands-auth.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/mcp/auth/commands-auth.ts"],"names":[],"mappings":"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","sourcesContent":["import type { McpServerConfig } from \"../config-schema.ts\";\nimport type { McpLogger } from \"../log.ts\";\nimport { openCallbackChannel } from \"./callback.ts\";\nimport { resolveServerAuth } from \"./context.ts\";\nimport type { OAuthFlowOptions } from \"./oauth.ts\";\nimport {\n\tbeginAuthorization,\n\tclientCredentialsGrant,\n\tcompleteAuthorization,\n\tfinishAuthorization,\n\tlogout,\n} from \"./oauth.ts\";\nimport { OAuthFlowError } from \"./oauth-errors.ts\";\nimport type { McpOAuthProvider } from \"./oauth-provider.ts\";\n\ntype Notify = (message: string, type?: \"info\" | \"warning\" | \"error\") => void;\n\nexport interface AuthCommandDeps {\n\tserverName: string;\n\tconfig: McpServerConfig;\n\tagentDir?: string;\n\tenv?: Record<string, string | undefined>;\n\tlogger?: McpLogger;\n\thasUI: boolean;\n\tnotify: Notify;\n\t// settings.oauthCallbackUrl override: when set, no local listener is opened.\n\tcallbackUrl?: string;\n\topenBrowser?: (url: URL) => void | Promise<void>;\n\tonReconnect: () => Promise<void>;\n\t// Persists the provider between auth-start and auth-complete so the in-memory\n\t// CSRF state survives across two command invocations in one session.\n\tpending: Map<string, McpOAuthProvider>;\n\t/** Per-service guard: the same server may authenticate in another session. */\n\tinteractiveGuard?: { begin(serverName: string): boolean; end(serverName: string): void };\n\tflow?: OAuthFlowOptions;\n}\n\nconst PASTE_REDIRECT = \"http://127.0.0.1:0/callback\";\nconst activeInteractiveAuthServers = new Set<string>();\n\nfunction ensureOAuth(deps: AuthCommandDeps): void {\n\tif (deps.config.auth === false || deps.config.type !== \"http\" || deps.config.url === undefined) {\n\t\tthrow new OAuthFlowError(\"headless\", `MCP server ${deps.serverName} is not an OAuth HTTP server.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n}\n\nfunction buildProvider(\n\tdeps: AuthCommandDeps,\n\tredirectUrl: string,\n\tonRedirect?: (url: URL) => void | Promise<void>,\n): McpOAuthProvider {\n\tconst plan = resolveServerAuth({\n\t\tagentDir: deps.agentDir,\n\t\tconfig: { ...deps.config, auth: \"oauth\" },\n\t\tenv: deps.env,\n\t\tlogger: deps.logger,\n\t\tonRedirect,\n\t\tredirectUrl,\n\t\tserverName: deps.serverName,\n\t});\n\tif (plan.provider === undefined) {\n\t\tthrow new OAuthFlowError(\"headless\", `MCP server ${deps.serverName} could not build an OAuth provider.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n\treturn plan.provider;\n}\n\n// `/mcp auth <server>`: client_credentials M2M, or interactive loopback flow.\n// Non-UI callers fail fast with an actionable headless hint (no browser).\nexport async function runAuth(deps: AuthCommandDeps): Promise<void> {\n\tensureOAuth(deps);\n\tif (deps.config.oauth?.flow === \"client_credentials\") {\n\t\tconst provider = buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\t\tawait clientCredentialsGrant(provider, deps.flow);\n\t\tawait deps.onReconnect();\n\t\tdeps.notify(`MCP server ${deps.serverName} authenticated (client_credentials)`);\n\t\treturn;\n\t}\n\tif (!deps.hasUI) {\n\t\tdeps.notify(\n\t\t\t`MCP server ${deps.serverName} needs interactive OAuth. Run senpi in a terminal, then: /mcp auth-start ${deps.serverName} and /mcp auth-complete ${deps.serverName} <redirect-url>`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tawait runInteractive(deps);\n}\n\nasync function runInteractive(deps: AuthCommandDeps): Promise<void> {\n\tconst beginInteractiveAuth =\n\t\tdeps.interactiveGuard?.begin(deps.serverName) ?? !activeInteractiveAuthServers.has(deps.serverName);\n\tif (!beginInteractiveAuth) {\n\t\tthrow new OAuthFlowError(\n\t\t\t\"needs_auth\",\n\t\t\t`MCP server ${deps.serverName} authorization is already in progress; complete the existing browser flow or retry after it finishes.`,\n\t\t\t{ serverName: deps.serverName },\n\t\t);\n\t}\n\tif (deps.interactiveGuard === undefined) activeInteractiveAuthServers.add(deps.serverName);\n\tlet provider: McpOAuthProvider | undefined;\n\tlet channel: Awaited<ReturnType<typeof openCallbackChannel>> | undefined;\n\tconst oauth = deps.config.oauth;\n\tlet callbackPort: number | undefined;\n\tif (\n\t\t(deps.callbackUrl === undefined || deps.callbackUrl.length === 0) &&\n\t\toauth?.clientId !== undefined &&\n\t\toauth.clientMetadataUrl === undefined\n\t) {\n\t\tcallbackPort = oauth.callbackPort;\n\t}\n\ttry {\n\t\tchannel = await openCallbackChannel({\n\t\t\toverrideUrl: deps.callbackUrl,\n\t\t\tport: callbackPort,\n\t\t\tserverName: deps.serverName,\n\t\t\tvalidateState: (state) => provider?.consumeState(state) ?? false,\n\t\t});\n\t\tconst loopbackResult = channel.usesLoopback ? channel.waitForCode() : undefined;\n\t\tconst usesLoopback = channel.usesLoopback;\n\t\tprovider = buildProvider(deps, channel.redirectUrl, async (url) => {\n\t\t\tconst instruction = usesLoopback\n\t\t\t\t? \"\"\n\t\t\t\t: `\\nThen run /mcp auth-complete ${deps.serverName} <redirect-url> with the final redirect URL.`;\n\t\t\tconst announcement = `Open this URL to authorize ${deps.serverName}:\\n${url.toString()}${instruction}`;\n\t\t\tdeps.notify(announcement);\n\t\t\ttry {\n\t\t\t\tawait deps.openBrowser?.(url);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdeps.notify(`Browser launch failed: ${message}\\n${announcement}`, \"warning\");\n\t\t\t}\n\t\t});\n\t\tconst begin = await beginAuthorization(provider, deps.flow);\n\t\tif (!channel.usesLoopback) {\n\t\t\tdeps.pending.set(deps.serverName, provider);\n\t\t\tif (begin.authorizationUrl === undefined) {\n\t\t\t\tthrow new OAuthFlowError(\n\t\t\t\t\t\"needs_auth\",\n\t\t\t\t\t`MCP server ${deps.serverName} did not produce an authorization URL.`,\n\t\t\t\t\t{\n\t\t\t\t\t\tserverName: deps.serverName,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst { code } = await (loopbackResult ?? channel.waitForCode());\n\t\tawait finishAuthorization(provider, code, deps.flow);\n\t\tawait deps.onReconnect();\n\t\tdeps.notify(`MCP server ${deps.serverName} authorized`);\n\t} finally {\n\t\tif (deps.interactiveGuard) deps.interactiveGuard.end(deps.serverName);\n\t\telse activeInteractiveAuthServers.delete(deps.serverName);\n\t\tawait channel?.close();\n\t}\n}\n\n// `/mcp auth-start <server>`: print the authorize URL for a browser-less paste.\nexport async function runAuthStart(deps: AuthCommandDeps): Promise<string> {\n\tensureOAuth(deps);\n\tconst provider = buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\tconst begin = await beginAuthorization(provider, deps.flow);\n\tconst url = begin.authorizationUrl;\n\tif (url === undefined) {\n\t\tthrow new OAuthFlowError(\"needs_auth\", `MCP server ${deps.serverName} did not produce an authorization URL.`, {\n\t\t\tserverName: deps.serverName,\n\t\t});\n\t}\n\tdeps.pending.set(deps.serverName, provider);\n\tdeps.notify(\n\t\t`Open this URL, approve, then run /mcp auth-complete ${deps.serverName} <redirect-url>:\\n${url.toString()}`,\n\t);\n\treturn url.toString();\n}\n\n// `/mcp auth-complete <server> <redirect-url>`: finish the paste flow.\nexport async function runAuthComplete(deps: AuthCommandDeps, redirectUrl: string): Promise<void> {\n\tensureOAuth(deps);\n\tconst pending = deps.pending.get(deps.serverName);\n\tconst provider = pending ?? buildProvider(deps, deps.callbackUrl ?? PASTE_REDIRECT);\n\tawait completeAuthorization(provider, redirectUrl, deps.flow);\n\tdeps.pending.delete(deps.serverName);\n\tawait deps.onReconnect();\n\tdeps.notify(`MCP server ${deps.serverName} authorized`);\n}\n\n// `/mcp logout <server>`: clear stored credentials.\nexport async function runLogout(deps: AuthCommandDeps): Promise<void> {\n\tconst provider = buildProvider(deps, PASTE_REDIRECT);\n\tawait logout(provider);\n\tdeps.pending.delete(deps.serverName);\n\tawait deps.onReconnect();\n\tdeps.notify(`MCP server ${deps.serverName} logged out`);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAwB5E,wBAAgB,mBAAmB,CAClC,EAAE,EAAE,YAAY,EAChB,OAAO,oCAAkB,EACzB,aAAa,GAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,SAA2B,GAC9D,IAAI,CAuBN"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { noticeEntryRenderer } from "../../notice/index.js";
|
|
1
2
|
import { handleMcpAuthCommand } from "./auth/commands-auth-dispatch.js";
|
|
2
3
|
import { addGlobalMcpServer, setGlobalMcpServerEnabled } from "./config-edit.js";
|
|
3
4
|
import { getMcpService } from "./service.js";
|
|
@@ -18,6 +19,7 @@ const SUBCOMMANDS = [
|
|
|
18
19
|
];
|
|
19
20
|
const AUTH_SUBCOMMANDS = new Set(["auth", "auth-start", "auth-complete", "logout"]);
|
|
20
21
|
export function registerMcpCommands(pi, service = getMcpService(), pendingAttach = () => undefined) {
|
|
22
|
+
pi.registerEntryRenderer("mcp-auth", noticeEntryRenderer((entry) => typeof entry.data === "string" ? { title: "MCP authorization", why: entry.data } : undefined));
|
|
21
23
|
pi.registerCommand("mcp", {
|
|
22
24
|
description: "Inspect and manage MCP servers.",
|
|
23
25
|
getArgumentCompletions: (prefix) => SUBCOMMANDS.filter((item) => item.startsWith(prefix)).map((value) => ({ value, label: value })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { handleMcpAuthCommand } from \"./auth/commands-auth-dispatch.ts\";\nimport { addGlobalMcpServer, setGlobalMcpServerEnabled } from \"./config-edit.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport { MCP_STARTUP_RACE_MS } from \"./startup-race.ts\";\nimport { buildMcpStatusRows, formatMcpStatus } from \"./status.ts\";\n\nconst SUBCOMMANDS = [\n\t\"status\",\n\t\"add\",\n\t\"enable\",\n\t\"disable\",\n\t\"test\",\n\t\"logs\",\n\t\"reconnect\",\n\t\"auth\",\n\t\"auth-start\",\n\t\"auth-complete\",\n\t\"logout\",\n] as const;\n\nconst AUTH_SUBCOMMANDS = new Set([\"auth\", \"auth-start\", \"auth-complete\", \"logout\"]);\n\nexport function registerMcpCommands(\n\tpi: ExtensionAPI,\n\tservice = getMcpService(),\n\tpendingAttach: () => Promise<void> | undefined = () => undefined,\n): void {\n\tpi.registerCommand(\"mcp\", {\n\t\tdescription: \"Inspect and manage MCP servers.\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tSUBCOMMANDS.filter((item) => item.startsWith(prefix)).map((value) => ({ value, label: value })),\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Startup attach no longer blocks the first frame, so /mcp can be reached while it is still\n\t\t\t\t// in flight. Every subcommand reports or mutates attached state, so wait for the single\n\t\t\t\t// in-flight attach rather than rendering a half-connected snapshot.\n\t\t\t\tawait pendingAttach();\n\t\t\t\tawait handleMcpCommand(rawArgs, ctx, pi, service);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nasync function handleMcpCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tpi: ExtensionAPI,\n\tservice: ReturnType<typeof getMcpService>,\n): Promise<void> {\n\tconst args = splitCommandArgs(rawArgs);\n\tconst subcommand = args[0] ?? \"\";\n\tif (subcommand === \"\") {\n\t\tawait showPanel(ctx, service);\n\t\treturn;\n\t}\n\tif (AUTH_SUBCOMMANDS.has(subcommand)) {\n\t\tawait handleMcpAuthCommand(subcommand, args.slice(1), ctx, pi, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"status\") {\n\t\tawait notifyStatus(ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"add\") {\n\t\tawait addServer(args.slice(1), ctx, pi, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"enable\" || subcommand === \"disable\") {\n\t\tawait setServerEnabled(ctx, pi, service, args[1] ?? \"\", subcommand === \"enable\");\n\t\treturn;\n\t}\n\tif (subcommand === \"test\") {\n\t\tawait testServer(args[1] ?? \"\", ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"logs\") {\n\t\tshowLogs(args[1] ?? \"\", ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"reconnect\") {\n\t\tawait reconnectServer(args[1] ?? \"\", ctx, pi, service);\n\t\treturn;\n\t}\n\tctx.ui.notify(`Unknown /mcp subcommand: ${subcommand}`, \"error\");\n}\n\ntype McpCommandService = ReturnType<typeof getMcpService>;\n\nasync function showPanel(ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tconst text = await renderStatus(\"MCP servers\", service);\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(text);\n\t\treturn;\n\t}\n\tconst choice = await ctx.ui.select(text, [\"status\", \"logs <server>\", \"test <server>\"]);\n\tif (choice === undefined) ctx.ui.notify(text);\n}\n\nasync function notifyStatus(ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tctx.ui.notify(await renderStatus(\"MCP status\", service));\n}\n\nasync function renderStatus(title: string, service: McpCommandService): Promise<string> {\n\tconst rows = await buildMcpStatusRows(service.getServerSnapshots(), (name) => service.getServerExposureStatus(name));\n\treturn formatMcpStatus(title, rows);\n}\n\nasync function addServer(\n\targs: readonly string[],\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n): Promise<void> {\n\tconst [name, ...endpoint] = args;\n\tif (!name || endpoint.length === 0) {\n\t\tctx.ui.notify(\"Usage: /mcp add <name> <command...|url>\", \"error\");\n\t\treturn;\n\t}\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"Cannot add MCP server without UI confirmation.\", \"error\");\n\t\treturn;\n\t}\n\tconst server = parseServerConfig(endpoint);\n\tconst confirmed = await ctx.ui.confirm(\"Add MCP server?\", `${name}: ${endpoint.join(\" \")}`);\n\tif (!confirmed) {\n\t\tctx.ui.notify(\"MCP add cancelled\", \"warning\");\n\t\treturn;\n\t}\n\taddGlobalMcpServer(name, server);\n\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`Added MCP server ${name}`);\n}\n\nasync function setServerEnabled(\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n\tname: string,\n\tenabled: boolean,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tif (!setGlobalMcpServerEnabled(name, enabled)) {\n\t\tctx.ui.notify(`MCP server ${name} is not in the global config file`, \"error\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`MCP server ${name} connecting`);\n\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${name}`);\n}\n\nasync function testServer(name: string, ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tconst connection = service.getConnection(name);\n\tif (connection === undefined) return;\n\tconst started = Date.now();\n\ttry {\n\t\tawait connection.connect();\n\t\tconst result = await connection.client.listTools({}, { timeout: 2000 });\n\t\tconst elapsedMs = Date.now() - started;\n\t\tservice.recordCall(name, elapsedMs, false);\n\t\tctx.ui.notify(`MCP test ${name} ok (${elapsedMs}ms): ${result.tools.length} tools`);\n\t} catch (error) {\n\t\tconst elapsedMs = Date.now() - started;\n\t\tservice.recordCall(name, elapsedMs, true);\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP test ${name} failed (${elapsedMs}ms): ${message}`, \"error\");\n\t}\n}\n\nfunction showLogs(name: string, ctx: ExtensionCommandContext, service: McpCommandService): void {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tconst lines = service.getLogLines(name, 20);\n\tctx.ui.notify(lines.length === 0 ? `MCP logs for ${name}: (empty)` : lines.join(\"\\n\"));\n}\n\nasync function reconnectServer(\n\tname: string,\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\ttry {\n\t\tawait service.reconnectServer(name);\n\t\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\t\tctx.ui.notify(`MCP reconnect ${name} connected`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP reconnect ${name} failed: ${message}`, \"error\");\n\t}\n}\n\nfunction ensureKnown(name: string, ctx: ExtensionCommandContext, service: McpCommandService): boolean {\n\tif (name.length > 0 && service.getServerSnapshots().some((snapshot) => snapshot.name === name)) return true;\n\tconst known = service\n\t\t.getServerSnapshots()\n\t\t.map((snapshot) => snapshot.name)\n\t\t.join(\", \");\n\tctx.ui.notify(`Unknown MCP server: ${name || \"<missing>\"}\\nKnown MCP servers: ${known || \"(none)\"}`, \"error\");\n\treturn false;\n}\n\nfunction parseServerConfig(endpoint: readonly string[]): McpServerConfig {\n\tconst first = endpoint[0] ?? \"\";\n\tif (/^https?:\\/\\//.test(first)) {\n\t\treturn baseServer({ type: \"http\", url: first });\n\t}\n\treturn baseServer({ type: \"stdio\", command: first, args: endpoint.slice(1) });\n}\n\nfunction baseServer(endpoint: Pick<McpServerConfig, \"type\"> & Partial<McpServerConfig>): McpServerConfig {\n\treturn {\n\t\targs: [],\n\t\tconnectTimeoutMs: 15_000,\n\t\tenabled: true,\n\t\texposure: \"auto\",\n\t\tidleTimeoutMin: 10,\n\t\tlifecycle: \"lazy\",\n\t\tlogLevel: \"info\",\n\t\trequestTimeoutMs: 30_000,\n\t\tstartupTimeoutMs: MCP_STARTUP_RACE_MS,\n\t\t...endpoint,\n\t};\n}\n\nfunction splitCommandArgs(raw: string): string[] {\n\tconst matches = raw.match(/\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'|[^\\s]+/g) ?? [];\n\treturn matches.map((part) => part.replace(/^[\"']|[\"']$/g, \"\").replace(/\\\\([\"'])/g, \"$1\"));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { noticeEntryRenderer } from \"../../notice/index.ts\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { handleMcpAuthCommand } from \"./auth/commands-auth-dispatch.ts\";\nimport { addGlobalMcpServer, setGlobalMcpServerEnabled } from \"./config-edit.ts\";\nimport type { McpServerConfig } from \"./config-schema.ts\";\nimport { getMcpService } from \"./service.ts\";\nimport { MCP_STARTUP_RACE_MS } from \"./startup-race.ts\";\nimport { buildMcpStatusRows, formatMcpStatus } from \"./status.ts\";\n\nconst SUBCOMMANDS = [\n\t\"status\",\n\t\"add\",\n\t\"enable\",\n\t\"disable\",\n\t\"test\",\n\t\"logs\",\n\t\"reconnect\",\n\t\"auth\",\n\t\"auth-start\",\n\t\"auth-complete\",\n\t\"logout\",\n] as const;\n\nconst AUTH_SUBCOMMANDS = new Set([\"auth\", \"auth-start\", \"auth-complete\", \"logout\"]);\n\nexport function registerMcpCommands(\n\tpi: ExtensionAPI,\n\tservice = getMcpService(),\n\tpendingAttach: () => Promise<void> | undefined = () => undefined,\n): void {\n\tpi.registerEntryRenderer(\n\t\t\"mcp-auth\",\n\t\tnoticeEntryRenderer<string>((entry) =>\n\t\t\ttypeof entry.data === \"string\" ? { title: \"MCP authorization\", why: entry.data } : undefined,\n\t\t),\n\t);\n\tpi.registerCommand(\"mcp\", {\n\t\tdescription: \"Inspect and manage MCP servers.\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tSUBCOMMANDS.filter((item) => item.startsWith(prefix)).map((value) => ({ value, label: value })),\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\ttry {\n\t\t\t\t// Startup attach no longer blocks the first frame, so /mcp can be reached while it is still\n\t\t\t\t// in flight. Every subcommand reports or mutates attached state, so wait for the single\n\t\t\t\t// in-flight attach rather than rendering a half-connected snapshot.\n\t\t\t\tawait pendingAttach();\n\t\t\t\tawait handleMcpCommand(rawArgs, ctx, pi, service);\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nasync function handleMcpCommand(\n\trawArgs: string,\n\tctx: ExtensionCommandContext,\n\tpi: ExtensionAPI,\n\tservice: ReturnType<typeof getMcpService>,\n): Promise<void> {\n\tconst args = splitCommandArgs(rawArgs);\n\tconst subcommand = args[0] ?? \"\";\n\tif (subcommand === \"\") {\n\t\tawait showPanel(ctx, service);\n\t\treturn;\n\t}\n\tif (AUTH_SUBCOMMANDS.has(subcommand)) {\n\t\tawait handleMcpAuthCommand(subcommand, args.slice(1), ctx, pi, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"status\") {\n\t\tawait notifyStatus(ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"add\") {\n\t\tawait addServer(args.slice(1), ctx, pi, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"enable\" || subcommand === \"disable\") {\n\t\tawait setServerEnabled(ctx, pi, service, args[1] ?? \"\", subcommand === \"enable\");\n\t\treturn;\n\t}\n\tif (subcommand === \"test\") {\n\t\tawait testServer(args[1] ?? \"\", ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"logs\") {\n\t\tshowLogs(args[1] ?? \"\", ctx, service);\n\t\treturn;\n\t}\n\tif (subcommand === \"reconnect\") {\n\t\tawait reconnectServer(args[1] ?? \"\", ctx, pi, service);\n\t\treturn;\n\t}\n\tctx.ui.notify(`Unknown /mcp subcommand: ${subcommand}`, \"error\");\n}\n\ntype McpCommandService = ReturnType<typeof getMcpService>;\n\nasync function showPanel(ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tconst text = await renderStatus(\"MCP servers\", service);\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(text);\n\t\treturn;\n\t}\n\tconst choice = await ctx.ui.select(text, [\"status\", \"logs <server>\", \"test <server>\"]);\n\tif (choice === undefined) ctx.ui.notify(text);\n}\n\nasync function notifyStatus(ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tctx.ui.notify(await renderStatus(\"MCP status\", service));\n}\n\nasync function renderStatus(title: string, service: McpCommandService): Promise<string> {\n\tconst rows = await buildMcpStatusRows(service.getServerSnapshots(), (name) => service.getServerExposureStatus(name));\n\treturn formatMcpStatus(title, rows);\n}\n\nasync function addServer(\n\targs: readonly string[],\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n): Promise<void> {\n\tconst [name, ...endpoint] = args;\n\tif (!name || endpoint.length === 0) {\n\t\tctx.ui.notify(\"Usage: /mcp add <name> <command...|url>\", \"error\");\n\t\treturn;\n\t}\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"Cannot add MCP server without UI confirmation.\", \"error\");\n\t\treturn;\n\t}\n\tconst server = parseServerConfig(endpoint);\n\tconst confirmed = await ctx.ui.confirm(\"Add MCP server?\", `${name}: ${endpoint.join(\" \")}`);\n\tif (!confirmed) {\n\t\tctx.ui.notify(\"MCP add cancelled\", \"warning\");\n\t\treturn;\n\t}\n\taddGlobalMcpServer(name, server);\n\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`Added MCP server ${name}`);\n}\n\nasync function setServerEnabled(\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n\tname: string,\n\tenabled: boolean,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tif (!setGlobalMcpServerEnabled(name, enabled)) {\n\t\tctx.ui.notify(`MCP server ${name} is not in the global config file`, \"error\");\n\t\treturn;\n\t}\n\tctx.ui.notify(`MCP server ${name} connecting`);\n\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\tctx.ui.notify(`${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${name}`);\n}\n\nasync function testServer(name: string, ctx: ExtensionCommandContext, service: McpCommandService): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tconst connection = service.getConnection(name);\n\tif (connection === undefined) return;\n\tconst started = Date.now();\n\ttry {\n\t\tawait connection.connect();\n\t\tconst result = await connection.client.listTools({}, { timeout: 2000 });\n\t\tconst elapsedMs = Date.now() - started;\n\t\tservice.recordCall(name, elapsedMs, false);\n\t\tctx.ui.notify(`MCP test ${name} ok (${elapsedMs}ms): ${result.tools.length} tools`);\n\t} catch (error) {\n\t\tconst elapsedMs = Date.now() - started;\n\t\tservice.recordCall(name, elapsedMs, true);\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP test ${name} failed (${elapsedMs}ms): ${message}`, \"error\");\n\t}\n}\n\nfunction showLogs(name: string, ctx: ExtensionCommandContext, service: McpCommandService): void {\n\tif (!ensureKnown(name, ctx, service)) return;\n\tconst lines = service.getLogLines(name, 20);\n\tctx.ui.notify(lines.length === 0 ? `MCP logs for ${name}: (empty)` : lines.join(\"\\n\"));\n}\n\nasync function reconnectServer(\n\tname: string,\n\tctx: ExtensionCommandContext,\n\tpi: Pick<ExtensionAPI, \"getActiveTools\" | \"setActiveTools\" | \"registerTool\">,\n\tservice: McpCommandService,\n): Promise<void> {\n\tif (!ensureKnown(name, ctx, service)) return;\n\ttry {\n\t\tawait service.reconnectServer(name);\n\t\tawait service.attachSession({ type: \"session_start\", reason: \"reload\" }, ctx, pi);\n\t\tctx.ui.notify(`MCP reconnect ${name} connected`);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tctx.ui.notify(`MCP reconnect ${name} failed: ${message}`, \"error\");\n\t}\n}\n\nfunction ensureKnown(name: string, ctx: ExtensionCommandContext, service: McpCommandService): boolean {\n\tif (name.length > 0 && service.getServerSnapshots().some((snapshot) => snapshot.name === name)) return true;\n\tconst known = service\n\t\t.getServerSnapshots()\n\t\t.map((snapshot) => snapshot.name)\n\t\t.join(\", \");\n\tctx.ui.notify(`Unknown MCP server: ${name || \"<missing>\"}\\nKnown MCP servers: ${known || \"(none)\"}`, \"error\");\n\treturn false;\n}\n\nfunction parseServerConfig(endpoint: readonly string[]): McpServerConfig {\n\tconst first = endpoint[0] ?? \"\";\n\tif (/^https?:\\/\\//.test(first)) {\n\t\treturn baseServer({ type: \"http\", url: first });\n\t}\n\treturn baseServer({ type: \"stdio\", command: first, args: endpoint.slice(1) });\n}\n\nfunction baseServer(endpoint: Pick<McpServerConfig, \"type\"> & Partial<McpServerConfig>): McpServerConfig {\n\treturn {\n\t\targs: [],\n\t\tconnectTimeoutMs: 15_000,\n\t\tenabled: true,\n\t\texposure: \"auto\",\n\t\tidleTimeoutMin: 10,\n\t\tlifecycle: \"lazy\",\n\t\tlogLevel: \"info\",\n\t\trequestTimeoutMs: 30_000,\n\t\tstartupTimeoutMs: MCP_STARTUP_RACE_MS,\n\t\t...endpoint,\n\t};\n}\n\nfunction splitCommandArgs(raw: string): string[] {\n\tconst matches = raw.match(/\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'|[^\\s]+/g) ?? [];\n\treturn matches.map((part) => part.replace(/^[\"']|[\"']$/g, \"\").replace(/\\\\([\"'])/g, \"$1\"));\n}\n"]}
|
|
@@ -65,7 +65,7 @@ export default function nestedAgentsMd(pi) {
|
|
|
65
65
|
updateStatus(ctx, cache, sessionKey, hasErrors);
|
|
66
66
|
if (widgetVisible)
|
|
67
67
|
updateWidget(ctx, true, [...metaMap.values()]);
|
|
68
|
-
const textBlock = { type: "text", text: result.injectedText };
|
|
68
|
+
const textBlock = { type: "text", text: result.injectedText, audience: "model" };
|
|
69
69
|
return { content: [...event.content, textBlock] };
|
|
70
70
|
});
|
|
71
71
|
pi.on("session_compact", async (event, ctx) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/nested-agents-md/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextContent } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { isReadToolResult } from \"../../types.ts\";\nimport { injectDirectoryContext } from \"./core/inject-directory-context.ts\";\nimport { InjectionCache } from \"./core/injection-cache.ts\";\nimport { getSessionKey } from \"./core/session-key.ts\";\nimport {\n\tbuildDebugRecord,\n\tclearStatus,\n\tclearWidget,\n\ttype InjectedFileMeta,\n\tupdateStatus,\n\tupdateWidget,\n} from \"./ui/reporter.ts\";\n\nconst FLAG_DISABLE = \"no-nested-agents\";\nconst COMMAND_TOGGLE = \"nested-agents\";\nconst ENTRY_TYPE_DEBUG = \"nested-agents-md:debug\";\n\nexport default function nestedAgentsMd(pi: ExtensionAPI): void {\n\tpi.registerFlag(FLAG_DISABLE, {\n\t\tdescription: \"Disable nested AGENTS.md context injection.\",\n\t\ttype: \"boolean\",\n\t\tdefault: false,\n\t});\n\n\tconst cache = new InjectionCache();\n\tconst filesPerSession = new Map<string, Map<string, InjectedFileMeta>>();\n\tconst errorsPerSession = new Map<string, boolean>();\n\t// Widget visibility is extension-scoped because command registration currently has no session-local state hook.\n\tlet widgetVisible = false;\n\tlet disabled = false;\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tdisabled = pi.getFlag(FLAG_DISABLE) === true;\n\t\tif (disabled) {\n\t\t\tclearStatus(ctx);\n\t\t\tclearWidget(ctx);\n\t\t}\n\t});\n\n\tpi.on(\"tool_result\", async (event, ctx) => {\n\t\tif (disabled) return undefined;\n\t\tif (!isReadToolResult(event) || event.isError) return undefined;\n\t\tconst filePath = event.input.path;\n\t\tif (typeof filePath !== \"string\" || filePath.length === 0) return undefined;\n\t\tconst hasText = event.content.some((block) => block.type === \"text\");\n\t\tif (!hasText) return undefined;\n\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tconst result = await injectDirectoryContext({\n\t\t\tfilePath,\n\t\t\trootDir: ctx.cwd,\n\t\t\tcache,\n\t\t\tsessionKey,\n\t\t});\n\n\t\tconst errorsRecorded = errorsPerSession.get(sessionKey) === true;\n\t\tconst hasErrors = errorsRecorded || result.errors.length > 0;\n\t\tif (result.errors.length > 0) errorsPerSession.set(sessionKey, true);\n\n\t\tif (!result.injectedText) {\n\t\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tlet metaMap = filesPerSession.get(sessionKey);\n\t\tif (!metaMap) {\n\t\t\tmetaMap = new Map();\n\t\t\tfilesPerSession.set(sessionKey, metaMap);\n\t\t}\n\t\tfor (const file of result.injectedFiles) {\n\t\t\tmetaMap.set(file.absolutePath, {\n\t\t\t\tabsolutePath: file.absolutePath,\n\t\t\t\ttruncated: file.truncated,\n\t\t\t});\n\t\t}\n\n\t\tupdateStatus(ctx, cache, sessionKey, hasErrors);\n\t\tif (widgetVisible) updateWidget(ctx, true, [...metaMap.values()]);\n\n\t\tconst textBlock: TextContent = { type: \"text\", text: result.injectedText, audience: \"model\" };\n\t\treturn { content: [...event.content, textBlock] };\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\t// Rejected compactions do not mutate session state; keep the cache warm.\n\t\tif (!event.accepted) return;\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t\tupdateStatus(ctx, cache, sessionKey, false);\n\t\tif (widgetVisible) updateWidget(ctx, true, []);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sessionKey = getSessionKey(ctx);\n\t\tcache.clearSession(sessionKey);\n\t\tfilesPerSession.delete(sessionKey);\n\t\terrorsPerSession.delete(sessionKey);\n\t});\n\n\tpi.registerCommand(COMMAND_TOGGLE, {\n\t\tdescription: \"Toggle the nested AGENTS.md context widget and dump cache state.\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (disabled) {\n\t\t\t\tctx.ui.notify(\"nested-agents-md is disabled via --no-nested-agents\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\twidgetVisible = !widgetVisible;\n\t\t\tconst sessionKey = getSessionKey(ctx);\n\t\t\tconst files = [...(filesPerSession.get(sessionKey)?.values() ?? [])];\n\t\t\tupdateWidget(ctx, widgetVisible, files);\n\t\t\tpi.appendEntry(ENTRY_TYPE_DEBUG, buildDebugRecord({ cache, sessionKey, files }));\n\t\t\tctx.ui.notify(\n\t\t\t\twidgetVisible ? \"Nested AGENTS.md context widget shown\" : \"Nested AGENTS.md context widget hidden\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t},\n\t});\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type BuildDynamicSystemPromptOptions } from "../../../dynamic-prompt/build.ts";
|
|
2
|
-
export type Gpt56ExecutionRuleId = "eval-first-routing" | "evidence-comparison" | "perceived-state-loop" | "stay-direct-exceptions" | "delegation" | "todo-granularity" | "test-
|
|
3
|
-
export type Gpt56ExecutionConcern = "tool-orchestration" | "delegation" | "todo-discipline" | "
|
|
2
|
+
export type Gpt56ExecutionRuleId = "eval-first-routing" | "evidence-comparison" | "perceived-state-loop" | "stay-direct-exceptions" | "delegation" | "todo-granularity" | "test-decision" | "atomic-commits" | "lsp-symbol-routing";
|
|
3
|
+
export type Gpt56ExecutionConcern = "tool-orchestration" | "delegation" | "todo-discipline" | "tests" | "commit-discipline" | "symbol-routing";
|
|
4
4
|
export interface Gpt56ExecutionRule {
|
|
5
5
|
id: Gpt56ExecutionRuleId;
|
|
6
6
|
concern: Gpt56ExecutionConcern;
|
|
@@ -31,9 +31,9 @@ export declare const GPT56_EXECUTION_RULES: readonly [{
|
|
|
31
31
|
readonly concern: "todo-discipline";
|
|
32
32
|
readonly directive: "Split the work to the finest actionable grain - one item per edit plus the check that proves it - and drive every transition the moment it happens: start it, complete it, append newly discovered steps, drop abandoned ones, never batch the updates.";
|
|
33
33
|
}, {
|
|
34
|
-
readonly id: "test-
|
|
35
|
-
readonly concern: "
|
|
36
|
-
readonly directive: "
|
|
34
|
+
readonly id: "test-decision";
|
|
35
|
+
readonly concern: "tests";
|
|
36
|
+
readonly directive: "Read existing tests first - the behavior of record: update those your change makes stale; one wrong before your change is a finding, not a test to edit green. Reproduce a bug before fixing it. The run proves the change: add a test only where the repository keeps tests for this behavior and a regression would otherwise pass unnoticed - sized like its neighbors, never restating the change.";
|
|
37
37
|
}, {
|
|
38
38
|
readonly id: "atomic-commits";
|
|
39
39
|
readonly concern: "commit-discipline";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpt-5.6.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/gpt-5.6.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gpt-5.6.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/prompt-preset/gpt-5.6.ts"],"names":[],"mappings":"AA4DA,OAAO,EAAE,KAAK,+BAA+B,EAA4B,MAAM,kCAAkC,CAAC;AAMlH,MAAM,MAAM,oBAAoB,GAC7B,oBAAoB,GACpB,qBAAqB,GACrB,sBAAsB,GACtB,wBAAwB,GACxB,YAAY,GACZ,kBAAkB,GAClB,eAAe,GACf,gBAAgB,GAChB,oBAAoB,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAC9B,oBAAoB,GACpB,YAAY,GACZ,iBAAiB,GACjB,OAAO,GACP,mBAAmB,GACnB,gBAAgB,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,oBAAoB,CAAC;IACzB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CAClB;AA0BD,eAAO,MAAM,qBAAqB;iBAC3B,oBAAoB;sBAAW,oBAAoB;;;iBACnD,qBAAqB;sBAAW,oBAAoB;;;iBACpD,sBAAsB;sBAAW,oBAAoB;;;iBACrD,wBAAwB;sBAAW,oBAAoB;;;iBACvD,YAAY;sBAAW,YAAY;;;iBACnC,kBAAkB;sBAAW,iBAAiB;;;iBAC9C,eAAe;sBAAW,OAAO;;;iBACjC,gBAAgB;sBAAW,mBAAmB;;;iBAC9C,oBAAoB;sBAAW,gBAAgB;;EACJ,CAAC;AAoGnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,CAEjF"}
|
|
@@ -37,31 +37,36 @@
|
|
|
37
37
|
// kernel as the default multi-call surface, deep-planned parallel batching as
|
|
38
38
|
// wide as the step allows, a bias toward over-calling inside that one wave,
|
|
39
39
|
// in-kernel reduction, the stay-direct exceptions, subagent fan-out,
|
|
40
|
-
// finest-grain todo transitions, test
|
|
41
|
-
// routing. They live in `GPT56_EXECUTION_RULES` (typed rule data, like
|
|
40
|
+
// finest-grain todo transitions, the test decision, atomic commits, and LSP
|
|
41
|
+
// symbol routing. They live in `GPT56_EXECUTION_RULES` (typed rule data, like
|
|
42
42
|
// `dynamic-prompt/verification.ts`) and each directive is interpolated once, at
|
|
43
43
|
// its point of use, replacing the weaker text it supersedes rather than being
|
|
44
44
|
// appended as a trailer: the old "independent calls run in the same message" /
|
|
45
|
-
// "each shell command is its own bash call" pair
|
|
46
|
-
// mechanics
|
|
47
|
-
// test-first itself: tests at the touched seam, prose and visual work via
|
|
48
|
-
// real-surface QA - the blanket version contradicted test-first, the scoped
|
|
49
|
-
// version bounds it). The GPT-5.6 guide's Programmatic-Tool-Calling
|
|
45
|
+
// "each shell command is its own bash call" pair and the mid-paragraph todo
|
|
46
|
+
// mechanics. The GPT-5.6 guide's Programmatic-Tool-Calling
|
|
50
47
|
// section drives the shape: a bounded routing contract naming the stage,
|
|
51
48
|
// eligible surface, output, and what stays direct beats generic "use PTC
|
|
52
49
|
// efficiently" wording, which does not route.
|
|
50
|
+
//
|
|
51
|
+
// 2026-09-23: `test-first` became `test-decision` and moved from Pragmatism &
|
|
52
|
+
// Scope into `## Verification`. The test-first rule made a test the proof of
|
|
53
|
+
// every change with a seam, so simple changes inside tested modules grew
|
|
54
|
+
// change-certifying tests and the harness grew counter-rules to catch them.
|
|
55
|
+
// The run proves the change; a test is added only where the repository keeps
|
|
56
|
+
// tests for that behavior and a regression would otherwise pass unnoticed,
|
|
57
|
+
// after the existing tests were read as the behavior of record.
|
|
53
58
|
import { APP_NAME } from "../../../../config.js";
|
|
54
59
|
import { buildDynamicSystemPrompt } from "../../../dynamic-prompt/build.js";
|
|
55
60
|
import { buildTestDisciplineSection } from "../../../dynamic-prompt/verification.js";
|
|
56
61
|
import { buildFileOperationsTuning } from "./file-operations.js";
|
|
57
62
|
import { buildGptEvalRoutingTuning } from "./gpt-eval-routing.js";
|
|
63
|
+
import { TEST_DECISION } from "./test-decision.js";
|
|
58
64
|
const EVAL_FIRST_ROUTING = "When a code-execution tool is available, batch the independent reads, searches, symbol lookups, and commands of a step in one cell: enumerate them first, dispatch them together with the runtime's parallel helper, and inspect every result; an extra read-only call in that wave costs almost nothing, while acting on a stale assumption costs the whole turn. Edits, side-effecting commands, approvals, waits, and any call whose input is another call's result stay sequential, one action observed before the next.";
|
|
59
65
|
const EVIDENCE_COMPARISON = "Before running a cell, name the state it should produce; when it returns, compare the returned evidence with that state and check that a mutating cell changed nothing beyond it. A result that hides a failed item or a truncated tail is not evidence.";
|
|
60
66
|
const PERCEIVED_STATE_LOOP = "A result that must be seen rather than read - a page, a component, an image, a 3D scene, a layout - gets one change, a render or screenshot, a look, then the next change; a 3D scene is checked from several angles and a page at desktop and mobile widths. Compare what you see with the reference or the stated intent; ask only where two readings of that intent diverge.";
|
|
61
67
|
const STAY_DIRECT_EXCEPTIONS = "Call tools directly instead when one call is enough, the output is already small, each result decides the next call, semantic judgment sits between calls, or the action needs approval - and after two failed cell strategies for the same fact, or an empty or suspiciously narrow result, fall back to direct calls and one or two meaningful alternatives before concluding nothing exists.";
|
|
62
68
|
const DELEGATION = "When subagent or task tools are available, fan sizeable independent tracks out to them in one wave - each brief naming its deliverable, scope, observable stop condition, and the evidence it returns for you to verify - and keep work you can finish in a few calls yourself.";
|
|
63
69
|
const TODO_GRANULARITY = "Split the work to the finest actionable grain - one item per edit plus the check that proves it - and drive every transition the moment it happens: start it, complete it, append newly discovered steps, drop abandoned ones, never batch the updates.";
|
|
64
|
-
const TEST_FIRST = "Work test-first on behavior changes: write the one failing test at the seam the change touches, watch it fail for the right reason, then make the smallest change that turns it green. Prose, doc, and visual-only changes take review plus real-surface QA, not tests. Skip test-first also for formatting, comments, renames, or dependency bumps, and never write a test that cannot fail for the regression it names.";
|
|
65
70
|
const ATOMIC_COMMITS = "When commits are authorized, commit atomically per verified increment, in the repository's existing message convention, each commit green on its own - never one omnibus commit at the end.";
|
|
66
71
|
const LSP_SYMBOL_ROUTING = "Route symbol work through the language server when LSP tools are available - definitions, references, rename impact, and diagnostics on the files you changed - and keep text search for text, filenames, and history.";
|
|
67
72
|
export const GPT56_EXECUTION_RULES = [
|
|
@@ -71,7 +76,7 @@ export const GPT56_EXECUTION_RULES = [
|
|
|
71
76
|
{ id: "stay-direct-exceptions", concern: "tool-orchestration", directive: STAY_DIRECT_EXCEPTIONS },
|
|
72
77
|
{ id: "delegation", concern: "delegation", directive: DELEGATION },
|
|
73
78
|
{ id: "todo-granularity", concern: "todo-discipline", directive: TODO_GRANULARITY },
|
|
74
|
-
{ id: "test-
|
|
79
|
+
{ id: "test-decision", concern: "tests", directive: TEST_DECISION },
|
|
75
80
|
{ id: "atomic-commits", concern: "commit-discipline", directive: ATOMIC_COMMITS },
|
|
76
81
|
{ id: "lsp-symbol-routing", concern: "symbol-routing", directive: LSP_SYMBOL_ROUTING },
|
|
77
82
|
];
|
|
@@ -113,6 +118,8 @@ Scale the scope of checks to the change, never the rigor:
|
|
|
113
118
|
|
|
114
119
|
Run the validator before reporting anything clean - "should pass" is not verification; if validation cannot run, say so and name the next best check. Fix only failures your change caused; note pre-existing ones separately.
|
|
115
120
|
|
|
121
|
+
${TEST_DECISION}
|
|
122
|
+
|
|
116
123
|
${buildTestDisciplineSection()}
|
|
117
124
|
|
|
118
125
|
## Manual QA Gate
|
|
@@ -137,8 +144,6 @@ The best change is usually the smallest correct change: fewer new names, helpers
|
|
|
137
144
|
|
|
138
145
|
Write only what the current correct path needs - no error handlers, fallbacks, retries, or validation for scenarios the current contracts exclude; validate at system boundaries only (user input, external APIs, untrusted I/O). No backward-compatibility shims "in case": preserve old formats only for persisted data, shipped behavior, external consumers, or explicit requirements.
|
|
139
146
|
|
|
140
|
-
${TEST_FIRST}
|
|
141
|
-
|
|
142
147
|
${context.toolSection}
|
|
143
148
|
|
|
144
149
|
## Hard Limits
|