@bastani/atomic 0.9.28-alpha.1 → 0.9.28-alpha.3
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 +60 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/mcp/native-client-licenses/NOTICE +2 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +34 -0
- package/dist/builtin/workflows/builtin/{chunk-wz8v67bn.js → chunk-aqv8ny38.js} +257 -259
- package/dist/builtin/workflows/builtin/{chunk-f61w0hpm.js → chunk-br4ac9a3.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-tecnpe8j.js → chunk-p3xmajmj.js} +438 -39
- package/dist/builtin/workflows/builtin/chunk-p6jagvyf.js +8 -0
- package/dist/builtin/workflows/builtin/goal.js +2 -2
- package/dist/builtin/workflows/builtin/index.js +4 -4
- package/dist/builtin/workflows/builtin/ralph.js +2 -2
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/authoring.d.ts +14 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +111102 -110218
- package/dist/builtin/workflows/src/index.js +42284 -41141
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +16 -11
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +16 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +8 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/credential-print.d.ts +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +2 -56
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +6 -1
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +20 -3
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +2 -1
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts +6 -0
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +90 -9
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +3 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +14 -1
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +1 -0
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +2 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +22 -4
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/child-session-options.d.ts.map +1 -1
- package/dist/core/child-session-options.js +17 -2
- package/dist/core/child-session-options.js.map +1 -1
- package/dist/core/compaction/classifier-compaction.d.ts +13 -0
- package/dist/core/compaction/classifier-compaction.d.ts.map +1 -0
- package/dist/core/compaction/classifier-compaction.js +110 -0
- package/dist/core/compaction/classifier-compaction.js.map +1 -0
- package/dist/core/compaction/compaction-boundary.d.ts.map +1 -1
- package/dist/core/compaction/compaction-boundary.js +2 -6
- package/dist/core/compaction/compaction-boundary.js.map +1 -1
- package/dist/core/compaction/compaction-runner.d.ts +16 -1
- package/dist/core/compaction/compaction-runner.d.ts.map +1 -1
- package/dist/core/compaction/compaction-runner.js +97 -12
- package/dist/core/compaction/compaction-runner.js.map +1 -1
- package/dist/core/compaction/compaction-types.d.ts +18 -1
- package/dist/core/compaction/compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/compaction-types.js +1 -1
- package/dist/core/compaction/compaction-types.js.map +1 -1
- package/dist/core/compaction/fallback-planner.d.ts +1 -0
- package/dist/core/compaction/fallback-planner.d.ts.map +1 -1
- package/dist/core/compaction/fallback-planner.js +2 -0
- package/dist/core/compaction/fallback-planner.js.map +1 -1
- package/dist/core/compaction/index.d.ts +3 -0
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js +3 -0
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/model-resolver.d.ts +16 -0
- package/dist/core/compaction/model-resolver.d.ts.map +1 -0
- package/dist/core/compaction/model-resolver.js +18 -0
- package/dist/core/compaction/model-resolver.js.map +1 -0
- package/dist/core/compaction/morph-compaction.d.ts +14 -0
- package/dist/core/compaction/morph-compaction.d.ts.map +1 -0
- package/dist/core/compaction/morph-compaction.js +99 -0
- package/dist/core/compaction/morph-compaction.js.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts +34 -0
- package/dist/core/compaction/pi-summary-fallback.d.ts.map +1 -0
- package/dist/core/compaction/pi-summary-fallback.js +357 -0
- package/dist/core/compaction/pi-summary-fallback.js.map +1 -0
- package/dist/core/compaction/planner-outcome.d.ts +10 -6
- package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
- package/dist/core/compaction/planner-outcome.js +11 -4
- package/dist/core/compaction/planner-outcome.js.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts +3 -1
- package/dist/core/compaction/range-planner-diagnostics.d.ts.map +1 -1
- package/dist/core/compaction/range-planner-diagnostics.js +11 -0
- package/dist/core/compaction/range-planner-diagnostics.js.map +1 -1
- package/dist/core/compaction/range-planner.d.ts +3 -3
- package/dist/core/compaction/range-planner.d.ts.map +1 -1
- package/dist/core/compaction/range-planner.js +59 -28
- package/dist/core/compaction/range-planner.js.map +1 -1
- package/dist/core/compaction/region-trimming.d.ts.map +1 -1
- package/dist/core/compaction/region-trimming.js +7 -0
- package/dist/core/compaction/region-trimming.js.map +1 -1
- package/dist/core/compaction/structured-compaction-input.d.ts +19 -0
- package/dist/core/compaction/structured-compaction-input.d.ts.map +1 -0
- package/dist/core/compaction/structured-compaction-input.js +70 -0
- package/dist/core/compaction/structured-compaction-input.js.map +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts +1 -0
- package/dist/core/compaction/transcript-serialization.d.ts.map +1 -1
- package/dist/core/compaction/transcript-serialization.js +26 -0
- package/dist/core/compaction/transcript-serialization.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +2 -2
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +1 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts +3 -4
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +14 -9
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/runner-context.d.ts +10 -4
- package/dist/core/extensions/runner-context.d.ts.map +1 -1
- package/dist/core/extensions/runner-context.js +47 -3
- package/dist/core/extensions/runner-context.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +10 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +31 -7
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/tool-events.d.ts +1 -1
- package/dist/core/extensions/tool-events.js.map +1 -1
- package/dist/core/extensions/ts-source-specifiers.d.ts +18 -0
- package/dist/core/extensions/ts-source-specifiers.d.ts.map +1 -0
- package/dist/core/extensions/ts-source-specifiers.js +142 -0
- package/dist/core/extensions/ts-source-specifiers.js.map +1 -0
- package/dist/core/extensions/workflow-events.d.ts +49 -0
- package/dist/core/extensions/workflow-events.d.ts.map +1 -1
- package/dist/core/extensions/workflow-events.js.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.d.ts +16 -4
- package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control-hub.js +72 -1
- package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
- package/dist/core/extensions/workflow-run-control.d.ts +11 -3
- package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
- package/dist/core/extensions/workflow-run-control.js.map +1 -1
- package/dist/core/messages.d.ts +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +5 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +3 -0
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/sdk-exports.d.ts +2 -2
- package/dist/core/sdk-exports.js.map +1 -1
- package/dist/core/sdk-types.d.ts +3 -0
- package/dist/core/sdk-types.d.ts.map +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -8
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +4 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +2 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +29 -0
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-merge.d.ts +3 -0
- package/dist/core/settings-merge.d.ts.map +1 -1
- package/dist/core/settings-merge.js +18 -4
- package/dist/core/settings-merge.js.map +1 -1
- package/dist/core/settings-storage.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -0
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/transcript.d.ts +58 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +185 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +14 -1
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/tool.js +2 -2
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/herdr/index.d.ts.map +1 -1
- package/dist/extensions/herdr/index.js +15 -10
- package/dist/extensions/herdr/index.js.map +1 -1
- package/dist/extensions/herdr/pane-owner.d.ts +6 -2
- package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
- package/dist/extensions/herdr/pane-owner.js +19 -4
- package/dist/extensions/herdr/pane-owner.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +19 -8
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/mcp/cli.js +18 -24
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/client/auth-provider.d.ts +4 -0
- package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -1
- package/dist/extensions/mcp/client/auth-provider.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/discovery.d.ts +3 -0
- package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/discovery.js +8 -5
- package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.d.ts +4 -0
- package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -1
- package/dist/extensions/mcp/client/oauth/flow.js +12 -2
- package/dist/extensions/mcp/client/oauth/flow.js.map +1 -1
- package/dist/extensions/mcp/client/transports/streamable-http.d.ts +3 -0
- package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -1
- package/dist/extensions/mcp/client/transports/streamable-http.js +17 -14
- package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +150 -72
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +5 -3
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +36 -10
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts +3 -3
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +10 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main-deferred-startup.d.ts +1 -0
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-deferred-startup.js +9 -21
- package/dist/main-deferred-startup.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -6
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts +2 -0
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +15 -3
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +43 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +6 -0
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +1 -47
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +0 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +0 -1
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +0 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-prompt-restore.js +0 -5
- package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
- package/dist/modes/interactive/interactive-prompt-turn.js +6 -4
- package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +13 -6
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +8 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +2 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -1
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/rpc/rpc-client-process.d.ts +7 -0
- package/dist/modes/rpc/rpc-client-process.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client-process.js +20 -3
- package/dist/modes/rpc/rpc-client-process.js.map +1 -1
- package/dist/modes/rpc/rpc-command-timeouts.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-timeouts.js +1 -0
- package/dist/modes/rpc/rpc-command-timeouts.js.map +1 -1
- package/dist/utils/ansi.d.ts +8 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +29 -10
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +13 -3
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/credential-redaction.d.ts +2 -0
- package/dist/utils/credential-redaction.d.ts.map +1 -0
- package/dist/utils/credential-redaction.js +20 -0
- package/dist/utils/credential-redaction.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +8 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +1 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts +2 -2
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +7 -10
- package/dist/utils/image-resize.js.map +1 -1
- package/docs/codemode.md +21 -1
- package/docs/compaction/reference.md +10 -4
- package/docs/compaction.md +40 -8
- package/docs/docs.json +1 -0
- package/docs/extensions/api-reference.md +4 -0
- package/docs/extensions/events.md +2 -2
- package/docs/llama-cpp.md +9 -2
- package/docs/mcp-servers.md +3 -3
- package/docs/models.md +10 -0
- package/docs/providers.md +39 -5
- package/docs/reference/cli.md +2 -2
- package/docs/sdk/reference.md +19 -4
- package/docs/sdk/web-server.md +325 -0
- package/docs/sdk.md +83 -1
- package/docs/security.md +1 -1
- package/docs/settings.md +2 -2
- package/docs/tools.md +1 -1
- package/docs/workflows/api-reference.md +71 -3
- package/docs/workflows/builtins.md +4 -0
- package/docs/workflows/operations.md +13 -5
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
|
@@ -212,8 +212,6 @@ export function createMcpExtension(options = {}) {
|
|
|
212
212
|
let overridden = [];
|
|
213
213
|
let latestContext;
|
|
214
214
|
let subagentMcpDirectTools;
|
|
215
|
-
/** Between session_start and session_shutdown. Registrations before that are read on session_start. */
|
|
216
|
-
let sessionActive = false;
|
|
217
215
|
let autoEnableCodemode = true;
|
|
218
216
|
/** Whether the "codemode tools unreachable" warning was shown since the session started. */
|
|
219
217
|
let warnedUnreachable = false;
|
|
@@ -221,8 +219,6 @@ export function createMcpExtension(options = {}) {
|
|
|
221
219
|
/** Whether a prompt already waited for the startup connections since the session started. */
|
|
222
220
|
let waitedForStartup = false;
|
|
223
221
|
const startupWaitMs = options.startupWaitMs ?? DEFAULT_STARTUP_WAIT_MS;
|
|
224
|
-
/** Bumped on every session start and shutdown so a runtime load that resolves late is dropped. */
|
|
225
|
-
let generation = 0;
|
|
226
222
|
/** Working directory of the session, for stdio servers. */
|
|
227
223
|
let sessionCwd = process.cwd();
|
|
228
224
|
let credentials = options.credentials;
|
|
@@ -234,6 +230,23 @@ export function createMcpExtension(options = {}) {
|
|
|
234
230
|
((entry, patch) => updateMcpServerConfig(entry.override ?? entry.source, entry.name, patch, {
|
|
235
231
|
override: entry.override !== undefined,
|
|
236
232
|
}));
|
|
233
|
+
/**
|
|
234
|
+
* Lifetime of the current session: aborted on session_shutdown, and before the first session_start
|
|
235
|
+
* (registrations before that are read on session_start). Work captures `session.signal` when it
|
|
236
|
+
* starts and drops late results once it aborted, for example a runtime load that resolves after
|
|
237
|
+
* shutdown. Work that outlives the command that started it also stops on the signal and is
|
|
238
|
+
* registered with `track`, so shutdown can wait for its cleanup.
|
|
239
|
+
*/
|
|
240
|
+
let session = new AbortController();
|
|
241
|
+
session.abort();
|
|
242
|
+
/** Work registered with `track`: manager actions opening or closing connections, and sign-ins. */
|
|
243
|
+
const backgroundActions = new Set();
|
|
244
|
+
const track = (work) => {
|
|
245
|
+
const task = work.then(() => undefined, () => undefined);
|
|
246
|
+
backgroundActions.add(task);
|
|
247
|
+
void task.finally(() => backgroundActions.delete(task));
|
|
248
|
+
return work;
|
|
249
|
+
};
|
|
237
250
|
const listeners = new Set();
|
|
238
251
|
const emitChange = () => {
|
|
239
252
|
for (const listener of listeners)
|
|
@@ -357,8 +370,20 @@ export function createMcpExtension(options = {}) {
|
|
|
357
370
|
exposure,
|
|
358
371
|
namespace,
|
|
359
372
|
timeoutMs: connection.timeoutMs,
|
|
360
|
-
getClient: async () =>
|
|
361
|
-
|
|
373
|
+
getClient: async () => {
|
|
374
|
+
const current = findServer(server);
|
|
375
|
+
if (!current || !isEnabled(current))
|
|
376
|
+
throw new Error(`MCP server "${server}" is disabled.`);
|
|
377
|
+
const client = current.connection;
|
|
378
|
+
if (!client)
|
|
379
|
+
throw new Error(`MCP server "${server}" is still starting.`);
|
|
380
|
+
if (getMcpToolExposure(current.entry.config, tool.name) === "hidden" ||
|
|
381
|
+
(client.state === "connected" && !client.tools.some((offered) => offered.name === tool.name))) {
|
|
382
|
+
throw new Error(`MCP tool "${server}/${tool.name}" is no longer available.`);
|
|
383
|
+
}
|
|
384
|
+
return client;
|
|
385
|
+
},
|
|
386
|
+
readableResources: () => resourceServers().some((current) => current.name === server),
|
|
362
387
|
});
|
|
363
388
|
markNativeMcpToolDefinition(definition, { server, tool: tool.name });
|
|
364
389
|
definitions.set(definition.name, definition);
|
|
@@ -493,52 +518,59 @@ export function createMcpExtension(options = {}) {
|
|
|
493
518
|
credentials: getCredentials(runtime),
|
|
494
519
|
providerToken: async (provider) => modelRegistry?.getApiKeyForProvider(provider),
|
|
495
520
|
log: getServerLog(runtime),
|
|
496
|
-
onTools:
|
|
497
|
-
|
|
521
|
+
onTools: (connection) => {
|
|
522
|
+
if (isCurrent())
|
|
523
|
+
registerTools(connection);
|
|
524
|
+
},
|
|
525
|
+
onChange: (connection) => {
|
|
526
|
+
if (isCurrent())
|
|
527
|
+
onConnectionChange(connection);
|
|
528
|
+
else
|
|
529
|
+
tokensAtSignIn.delete(connection);
|
|
530
|
+
},
|
|
498
531
|
});
|
|
499
532
|
server.connection = connection;
|
|
500
533
|
emitChange();
|
|
501
534
|
return connection;
|
|
502
535
|
};
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
const startConnection = (server, isCurrent, after) => {
|
|
509
|
-
// A contribution can be replaced without changing the session generation.
|
|
510
|
-
const ownsServer = () => isCurrent() && servers.includes(server) && isEnabled(server);
|
|
536
|
+
const startConnection = (server, after) => {
|
|
537
|
+
const { signal } = session;
|
|
538
|
+
const attempt = Symbol();
|
|
539
|
+
server.attempt = attempt;
|
|
540
|
+
const isCurrent = () => !signal.aborted && server.attempt === attempt && isEnabled(server) && servers.includes(server);
|
|
511
541
|
const ready = (async () => {
|
|
512
542
|
await after;
|
|
513
|
-
if (!
|
|
514
|
-
return;
|
|
515
|
-
const connection = await createConnection(server, ownsServer);
|
|
516
|
-
if (!connection)
|
|
543
|
+
if (!isCurrent())
|
|
517
544
|
return;
|
|
518
|
-
|
|
519
|
-
|
|
545
|
+
const connection = await createConnection(server, isCurrent);
|
|
546
|
+
if (!connection || !isCurrent())
|
|
520
547
|
return;
|
|
521
|
-
}
|
|
522
548
|
await connection.getClient().catch(() => undefined);
|
|
523
549
|
})();
|
|
524
550
|
server.ready = ready.catch(() => undefined);
|
|
525
551
|
return ready;
|
|
526
552
|
};
|
|
527
|
-
/** Wait for servers still connecting, until they settle or `signal` aborts. */
|
|
528
553
|
const waitForServers = async (waiting, signal) => {
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
Promise.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
554
|
+
for (;;) {
|
|
555
|
+
const ready = waiting.flatMap((server) => isEnabled(server) && servers.includes(server) && server.ready ? [{ server, ready: server.ready }] : []);
|
|
556
|
+
if (ready.length === 0 || signal?.aborted)
|
|
557
|
+
return;
|
|
558
|
+
let onAbort;
|
|
559
|
+
await Promise.race([
|
|
560
|
+
Promise.all(ready.map((attempt) => attempt.ready)),
|
|
561
|
+
new Promise((resolve) => {
|
|
562
|
+
onAbort = () => resolve();
|
|
563
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
564
|
+
}),
|
|
565
|
+
]);
|
|
566
|
+
if (onAbort)
|
|
567
|
+
signal?.removeEventListener("abort", onAbort);
|
|
568
|
+
if (signal?.aborted ||
|
|
569
|
+
ready.every((attempt) => !isEnabled(attempt.server) ||
|
|
570
|
+
!servers.includes(attempt.server) ||
|
|
571
|
+
attempt.ready === attempt.server.ready))
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
542
574
|
};
|
|
543
575
|
/**
|
|
544
576
|
* One message for everything that needs the user after startup, or only for `only`, servers
|
|
@@ -573,20 +605,23 @@ export function createMcpExtension(options = {}) {
|
|
|
573
605
|
server.entry = { ...entry, config: { ...entry.config, ...patch } };
|
|
574
606
|
return undefined;
|
|
575
607
|
};
|
|
576
|
-
|
|
608
|
+
/** Sign in, then reconnect. Returns an error message on failure. `cancel` or the session's end stops the sign-in. */
|
|
609
|
+
const signIn = async (server, prompt, cancel) => {
|
|
577
610
|
const connection = server.connection;
|
|
578
611
|
const url = connection?.oauthUrl;
|
|
579
612
|
if (!connection || !url)
|
|
580
613
|
return `MCP server "${server.entry.name}" does not use OAuth.`;
|
|
581
614
|
const runtime = await loadMcpRuntime();
|
|
615
|
+
const signal = cancel ? AbortSignal.any([session.signal, cancel]) : session.signal;
|
|
582
616
|
try {
|
|
583
|
-
await runtime.signInMcpServer({
|
|
617
|
+
await track(runtime.signInMcpServer({
|
|
584
618
|
serverUrl: url,
|
|
585
619
|
store: getCredentials(runtime).forServer(server.entry.name, url),
|
|
586
620
|
settings: connection.oauthSettings(),
|
|
587
621
|
challenge: connection.challenge,
|
|
588
622
|
prompt,
|
|
589
|
-
|
|
623
|
+
signal,
|
|
624
|
+
}));
|
|
590
625
|
}
|
|
591
626
|
catch (error) {
|
|
592
627
|
if (error instanceof runtime.McpSignInCancelledError)
|
|
@@ -616,8 +651,14 @@ export function createMcpExtension(options = {}) {
|
|
|
616
651
|
const connection = server.connection;
|
|
617
652
|
if (!connection)
|
|
618
653
|
return `MCP server "${server.entry.name}" is disabled.`;
|
|
619
|
-
|
|
654
|
+
const previous = server.ready;
|
|
655
|
+
const ready = (async () => {
|
|
656
|
+
await previous;
|
|
620
657
|
await connection.reconnect();
|
|
658
|
+
})();
|
|
659
|
+
server.ready = ready.catch(() => undefined);
|
|
660
|
+
try {
|
|
661
|
+
await ready;
|
|
621
662
|
return undefined;
|
|
622
663
|
}
|
|
623
664
|
catch (error) {
|
|
@@ -631,13 +672,24 @@ export function createMcpExtension(options = {}) {
|
|
|
631
672
|
return failed;
|
|
632
673
|
if (!enabled) {
|
|
633
674
|
const connection = server.connection;
|
|
675
|
+
server.attempt = undefined;
|
|
634
676
|
server.connection = undefined;
|
|
677
|
+
if (connection) {
|
|
678
|
+
server.closing = connection.close();
|
|
679
|
+
}
|
|
680
|
+
const closing = server.closing;
|
|
635
681
|
hideTools(server.entry.name);
|
|
636
682
|
emitChange();
|
|
637
|
-
|
|
683
|
+
try {
|
|
684
|
+
await closing;
|
|
685
|
+
}
|
|
686
|
+
finally {
|
|
687
|
+
if (server.closing === closing)
|
|
688
|
+
server.closing = undefined;
|
|
689
|
+
}
|
|
638
690
|
return undefined;
|
|
639
691
|
}
|
|
640
|
-
await startConnection(server,
|
|
692
|
+
await startConnection(server, server.closing);
|
|
641
693
|
return undefined;
|
|
642
694
|
};
|
|
643
695
|
const setExposure = (server, exposure) => {
|
|
@@ -787,8 +839,10 @@ export function createMcpExtension(options = {}) {
|
|
|
787
839
|
};
|
|
788
840
|
const signInWithUi = (ui, server) => {
|
|
789
841
|
const title = `Sign in to ${server.entry.name}`;
|
|
842
|
+
const cancel = new AbortController();
|
|
843
|
+
const status = (message) => ui.status(title, message, () => cancel.abort());
|
|
790
844
|
let authorizationUrl = "";
|
|
791
|
-
|
|
845
|
+
status("Contacting the authorization server…");
|
|
792
846
|
return signIn(server, {
|
|
793
847
|
showAuthorizationUrl: (url) => {
|
|
794
848
|
authorizationUrl = url.href;
|
|
@@ -796,22 +850,36 @@ export function createMcpExtension(options = {}) {
|
|
|
796
850
|
},
|
|
797
851
|
promptForRedirectUrl: async (signal) => {
|
|
798
852
|
const value = await ui.redirectUrl(title, authorizationUrl, signal);
|
|
799
|
-
|
|
853
|
+
status("Connecting…");
|
|
800
854
|
return value;
|
|
801
855
|
},
|
|
802
|
-
});
|
|
856
|
+
}, cancel.signal);
|
|
857
|
+
};
|
|
858
|
+
const runInBackground = (ctx, server, operation) => {
|
|
859
|
+
const ready = operation();
|
|
860
|
+
const attempt = server.attempt;
|
|
861
|
+
const { signal } = session;
|
|
862
|
+
const finish = (message) => {
|
|
863
|
+
if (signal.aborted || server.attempt !== attempt || !servers.includes(server))
|
|
864
|
+
return;
|
|
865
|
+
server.message = message;
|
|
866
|
+
ensureDiscoveryActive(ctx);
|
|
867
|
+
emitChange();
|
|
868
|
+
};
|
|
869
|
+
void track(ready.then(finish, (error) => finish(errorMessage(error))));
|
|
803
870
|
};
|
|
804
871
|
const runAction = async (ui, ctx, server, action) => {
|
|
805
|
-
const {
|
|
872
|
+
const { signal } = session;
|
|
806
873
|
let message;
|
|
807
874
|
switch (action) {
|
|
808
875
|
case "signin":
|
|
809
876
|
message = await signInWithUi(ui, server);
|
|
810
877
|
break;
|
|
811
878
|
case "reconnect":
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
879
|
+
runInBackground(ctx, server, async () => {
|
|
880
|
+
await reconnect(server);
|
|
881
|
+
return undefined;
|
|
882
|
+
});
|
|
815
883
|
break;
|
|
816
884
|
case "signout":
|
|
817
885
|
await signOut(server);
|
|
@@ -827,11 +895,13 @@ export function createMcpExtension(options = {}) {
|
|
|
827
895
|
case "enable-project":
|
|
828
896
|
case "disable-project": {
|
|
829
897
|
const enable = action.startsWith("enable");
|
|
830
|
-
|
|
831
|
-
message = await setEnabled(server, enable, action.endsWith("-project"));
|
|
898
|
+
runInBackground(ctx, server, () => setEnabled(server, enable, action.endsWith("-project")));
|
|
832
899
|
break;
|
|
833
900
|
}
|
|
834
901
|
}
|
|
902
|
+
// The session ended meanwhile (for example during a sign-in), which made ctx stale.
|
|
903
|
+
if (signal.aborted)
|
|
904
|
+
return;
|
|
835
905
|
server.message = message;
|
|
836
906
|
ensureDiscoveryActive(ctx);
|
|
837
907
|
emitChange();
|
|
@@ -915,6 +985,7 @@ export function createMcpExtension(options = {}) {
|
|
|
915
985
|
ctx.ui.notify(`Signing in to MCP server "${name}" requires interactive mode.`, "error");
|
|
916
986
|
return;
|
|
917
987
|
}
|
|
988
|
+
const { signal } = session;
|
|
918
989
|
let failure;
|
|
919
990
|
if (ctx.mode === "tui") {
|
|
920
991
|
let completed = false;
|
|
@@ -934,6 +1005,9 @@ export function createMcpExtension(options = {}) {
|
|
|
934
1005
|
promptForRedirectUrl: (signal) => ctx.ui.input(`Waiting for sign-in to "${name}". If the browser cannot reach this machine, paste the URL it was redirected to.`, "http://127.0.0.1:.../callback?code=...", { signal }),
|
|
935
1006
|
});
|
|
936
1007
|
}
|
|
1008
|
+
// The session ended meanwhile, which cancelled the sign-in and made ctx stale.
|
|
1009
|
+
if (signal.aborted)
|
|
1010
|
+
return;
|
|
937
1011
|
if (failure) {
|
|
938
1012
|
ctx.ui.notify(failure, failure === "Sign-in cancelled." ? "info" : "error");
|
|
939
1013
|
return;
|
|
@@ -952,8 +1026,8 @@ export function createMcpExtension(options = {}) {
|
|
|
952
1026
|
waitedForStartup = false;
|
|
953
1027
|
sessionCwd = ctx.cwd;
|
|
954
1028
|
modelRegistry = ctx.modelRegistry;
|
|
955
|
-
|
|
956
|
-
|
|
1029
|
+
session = new AbortController();
|
|
1030
|
+
const { signal } = session;
|
|
957
1031
|
configuredEntries = loaded.servers;
|
|
958
1032
|
const registered = registeredServers();
|
|
959
1033
|
overridden = registered.overridden;
|
|
@@ -970,10 +1044,9 @@ export function createMcpExtension(options = {}) {
|
|
|
970
1044
|
// The MCP client loads only now, so sessions without servers never pay for it. Waiting one
|
|
971
1045
|
// event loop turn lets the first render happen before loading and connecting.
|
|
972
1046
|
const runtime = new Promise((resolve) => setImmediate(resolve)).then(() => loadMcpRuntime());
|
|
973
|
-
|
|
974
|
-
pending = Promise.all(enabled.map((server) => startConnection(server, isCurrent, runtime)))
|
|
1047
|
+
pending = Promise.all(enabled.map((server) => startConnection(server, runtime)))
|
|
975
1048
|
.then(() => {
|
|
976
|
-
if (
|
|
1049
|
+
if (!signal.aborted)
|
|
977
1050
|
reportProblems(ctx);
|
|
978
1051
|
})
|
|
979
1052
|
.catch((error) => {
|
|
@@ -1028,17 +1101,21 @@ export function createMcpExtension(options = {}) {
|
|
|
1028
1101
|
const tool = pi.getAllTools().find((candidate) => candidate.name === event.toolName);
|
|
1029
1102
|
if (!tool)
|
|
1030
1103
|
return;
|
|
1031
|
-
const
|
|
1032
|
-
if (
|
|
1104
|
+
const readyServers = servers.filter((server) => isEnabled(server) && server.ready);
|
|
1105
|
+
if (readyServers.length === 0)
|
|
1033
1106
|
return;
|
|
1034
1107
|
let waiting = [];
|
|
1035
1108
|
if (isCodemodeDiscoveryTool(tool)) {
|
|
1036
1109
|
const { code } = event.input;
|
|
1037
1110
|
const source = typeof code === "string" ? code : "";
|
|
1038
|
-
waiting =
|
|
1111
|
+
waiting = readyServers.filter((server) => scriptNeedsServer(source, server.entry.name));
|
|
1039
1112
|
}
|
|
1040
1113
|
else if (isToolSearchDiscoveryTool(tool) || RESOURCE_TOOL_NAMES.has(tool.name)) {
|
|
1041
|
-
waiting =
|
|
1114
|
+
waiting = readyServers;
|
|
1115
|
+
}
|
|
1116
|
+
else {
|
|
1117
|
+
const owner = toolOwners.get(event.toolName)?.split("\0", 1)[0];
|
|
1118
|
+
waiting = readyServers.filter((server) => server.entry.name === owner);
|
|
1042
1119
|
}
|
|
1043
1120
|
await waitForServers(waiting, ctx.signal);
|
|
1044
1121
|
});
|
|
@@ -1049,9 +1126,9 @@ export function createMcpExtension(options = {}) {
|
|
|
1049
1126
|
});
|
|
1050
1127
|
// Servers registered or unregistered during the session connect or disconnect right away.
|
|
1051
1128
|
pi.onMcpServerContributionsChanged?.(() => {
|
|
1052
|
-
|
|
1129
|
+
const { signal } = session;
|
|
1130
|
+
if (signal.aborted)
|
|
1053
1131
|
return;
|
|
1054
|
-
const current = generation;
|
|
1055
1132
|
const registered = registeredServers();
|
|
1056
1133
|
overridden = registered.overridden;
|
|
1057
1134
|
const next = new Map(registered.servers.map((server) => [server.entry.name, server]));
|
|
@@ -1067,22 +1144,21 @@ export function createMcpExtension(options = {}) {
|
|
|
1067
1144
|
ensureDiscoveryActive(latestContext);
|
|
1068
1145
|
void Promise.all(removed.map((server) => server.connection?.close())).then(async () => {
|
|
1069
1146
|
const connecting = added.filter(isEnabled);
|
|
1070
|
-
if (
|
|
1147
|
+
if (signal.aborted || connecting.length === 0)
|
|
1071
1148
|
return;
|
|
1072
1149
|
try {
|
|
1073
|
-
await Promise.all(connecting.map((server) => startConnection(server
|
|
1074
|
-
if (
|
|
1150
|
+
await Promise.all(connecting.map((server) => startConnection(server)));
|
|
1151
|
+
if (!signal.aborted)
|
|
1075
1152
|
reportProblems(latestContext, connecting);
|
|
1076
1153
|
}
|
|
1077
1154
|
catch (error) {
|
|
1078
|
-
if (
|
|
1155
|
+
if (!signal.aborted)
|
|
1079
1156
|
latestContext?.ui.notify(`MCP failed to load: ${errorMessage(error)}`, "error");
|
|
1080
1157
|
}
|
|
1081
1158
|
});
|
|
1082
1159
|
});
|
|
1083
1160
|
pi.on("session_shutdown", async () => {
|
|
1084
|
-
|
|
1085
|
-
generation++;
|
|
1161
|
+
session.abort();
|
|
1086
1162
|
const closing = connections();
|
|
1087
1163
|
// The retiring registry is discarded. Do not register hidden tools or call a
|
|
1088
1164
|
// captured UI here: reload has already revoked this generation's authority.
|
|
@@ -1095,7 +1171,7 @@ export function createMcpExtension(options = {}) {
|
|
|
1095
1171
|
servers = [];
|
|
1096
1172
|
latestContext = undefined;
|
|
1097
1173
|
subagentMcpDirectTools = undefined;
|
|
1098
|
-
await Promise.all(closing.map((connection) => connection.close()));
|
|
1174
|
+
await Promise.all([...backgroundActions, ...closing.map((connection) => connection.close())]);
|
|
1099
1175
|
});
|
|
1100
1176
|
pi.registerCommand("mcp", {
|
|
1101
1177
|
description: "Manage MCP servers: sign in, reconnect, enable or disable, and change exposure",
|
|
@@ -1121,19 +1197,21 @@ export function createMcpExtension(options = {}) {
|
|
|
1121
1197
|
return items.length > 0 ? items : null;
|
|
1122
1198
|
},
|
|
1123
1199
|
handler: async (args, ctx) => {
|
|
1124
|
-
await pending;
|
|
1125
1200
|
const [action, name, ...extra] = args.trim().split(/\s+/).filter(Boolean);
|
|
1126
1201
|
if (action === undefined) {
|
|
1127
1202
|
if (ctx.mode === "tui")
|
|
1128
1203
|
await showMcpManager(ctx, (ui) => manage(ui, ctx));
|
|
1129
|
-
else
|
|
1204
|
+
else {
|
|
1205
|
+
await pending;
|
|
1130
1206
|
ctx.ui.notify(formatStatus(), "info");
|
|
1207
|
+
}
|
|
1131
1208
|
return;
|
|
1132
1209
|
}
|
|
1133
1210
|
if (extra.length > 0) {
|
|
1134
1211
|
ctx.ui.notify(MCP_USAGE, "warning");
|
|
1135
1212
|
return;
|
|
1136
1213
|
}
|
|
1214
|
+
await pending;
|
|
1137
1215
|
switch (action) {
|
|
1138
1216
|
case "login": {
|
|
1139
1217
|
const server = await pickServer(name, ctx, oauthPick);
|