@bastani/atomic 0.9.5-alpha.8 → 0.9.5
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 +122 -0
- package/README.md +2 -2
- package/dist/builtin/cursor/CHANGELOG.md +12 -0
- package/dist/builtin/cursor/package.json +3 -3
- package/dist/builtin/cursor/src/model-mapper.ts +6 -3
- package/dist/builtin/intercom/CHANGELOG.md +37 -0
- package/dist/builtin/intercom/README.md +4 -2
- package/dist/builtin/intercom/broker/broker.ts +6 -114
- package/dist/builtin/intercom/broker/client.ts +29 -54
- package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
- package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
- package/dist/builtin/intercom/broker/send-handler.ts +106 -0
- package/dist/builtin/intercom/broker/send-signature.ts +37 -0
- package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
- package/dist/builtin/intercom/index-heavy.ts +49 -53
- package/dist/builtin/intercom/index.ts +278 -262
- package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
- package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
- package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
- package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
- package/dist/builtin/intercom/lifecycle.ts +37 -20
- package/dist/builtin/intercom/package.json +3 -6
- package/dist/builtin/intercom/reply-routing.ts +17 -0
- package/dist/builtin/intercom/subagent-relay.ts +58 -12
- package/dist/builtin/intercom/types.ts +3 -3
- package/dist/builtin/mcp/CHANGELOG.md +38 -0
- package/dist/builtin/mcp/OAUTH.md +1 -0
- package/dist/builtin/mcp/README.md +10 -6
- package/dist/builtin/mcp/apps-cancellation.ts +32 -0
- package/dist/builtin/mcp/call-tool-result.ts +9 -0
- package/dist/builtin/mcp/caller-wait.ts +50 -0
- package/dist/builtin/mcp/command-registration.ts +82 -0
- package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
- package/dist/builtin/mcp/direct-tools.ts +40 -255
- package/dist/builtin/mcp/host-html-template.ts +4 -2
- package/dist/builtin/mcp/index.ts +274 -239
- package/dist/builtin/mcp/init.ts +96 -126
- package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
- package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
- package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
- package/dist/builtin/mcp/metadata-hydration.ts +52 -0
- package/dist/builtin/mcp/package.json +3 -3
- package/dist/builtin/mcp/proxy-auth.ts +4 -4
- package/dist/builtin/mcp/proxy-call.ts +111 -40
- package/dist/builtin/mcp/proxy-connect.ts +35 -15
- package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
- package/dist/builtin/mcp/proxy-modes.ts +3 -3
- package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
- package/dist/builtin/mcp/startup-warmup.ts +98 -0
- package/dist/builtin/mcp/state-lease.ts +12 -0
- package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
- package/dist/builtin/mcp/ui-server.ts +8 -8
- package/dist/builtin/mcp/ui-session.ts +9 -18
- package/dist/builtin/subagents/CHANGELOG.md +78 -0
- package/dist/builtin/subagents/README.md +30 -29
- package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
- package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
- package/dist/builtin/subagents/agents/debugger.md +2 -2
- package/dist/builtin/subagents/agents/worker.md +2 -2
- package/dist/builtin/subagents/package.json +5 -5
- package/dist/builtin/subagents/prompts/review-loop.md +1 -1
- package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
- package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
- package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
- package/dist/builtin/subagents/src/extension/index.ts +289 -320
- package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
- package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
- package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
- package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
- package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
- package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
- package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
- package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
- package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
- package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
- package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
- package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
- package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
- package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
- package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
- package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
- package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
- package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
- package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
- package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
- package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
- package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
- package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
- package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
- package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
- package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
- package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
- package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
- package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
- package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
- package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
- package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
- package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
- package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
- package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
- package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
- package/dist/builtin/subagents/src/shared/settings.ts +20 -10
- package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
- package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
- package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
- package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
- package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
- package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
- package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
- package/dist/builtin/subagents/src/tui/render-widget.ts +157 -89
- package/dist/builtin/web-access/CHANGELOG.md +28 -0
- package/dist/builtin/web-access/README.md +4 -0
- package/dist/builtin/web-access/content-tools.ts +8 -3
- package/dist/builtin/web-access/index-heavy.ts +1 -1
- package/dist/builtin/web-access/index.ts +190 -46
- package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/web-access/result-renderers.ts +1 -1
- package/dist/builtin/web-access/summary-review.ts +1 -1
- package/dist/builtin/web-access/web-search-activity.ts +1 -1
- package/dist/builtin/web-access/web-search-return.ts +7 -0
- package/dist/builtin/web-access/web-search-summary.ts +1 -1
- package/dist/builtin/web-access/web-search-tool.ts +4 -2
- package/dist/builtin/workflows/CHANGELOG.md +86 -0
- package/dist/builtin/workflows/README.md +5 -5
- package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +27 -4
- package/dist/builtin/workflows/builtin/goal-runner.ts +86 -27
- package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +10 -0
- package/dist/builtin/workflows/builtin/ralph-core.ts +9 -9
- package/dist/builtin/workflows/builtin/ralph-models.ts +71 -36
- package/dist/builtin/workflows/builtin/ralph-runner.ts +20 -31
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
- package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
- package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
- package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
- package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
- package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
- package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
- package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
- package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
- package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
- package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
- package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
- package/dist/builtin/workflows/src/durable/backend.ts +12 -0
- package/dist/builtin/workflows/src/durable/dbos-backend.ts +17 -1
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
- package/dist/builtin/workflows/src/durable/stage-primitive.ts +2 -1
- package/dist/builtin/workflows/src/durable/types.ts +16 -0
- package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
- package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
- package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
- package/dist/builtin/workflows/src/engine/run.ts +20 -19
- package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
- package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
- package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
- package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
- package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
- package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -22
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
- package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
- package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +3 -2
- package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
- package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
- package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
- package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
- package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
- package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
- package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
- package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
- package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
- package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts +23 -3
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +129 -17
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +9 -1
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +1 -1
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +6 -3
- 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 +2 -2
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +1 -1
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +3 -2
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +4 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/anthropic-thinking-guard.d.ts +5 -5
- package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
- package/dist/core/anthropic-thinking-guard.js +42 -32
- package/dist/core/anthropic-thinking-guard.js.map +1 -1
- package/dist/core/atomic-guide-command.d.ts.map +1 -1
- package/dist/core/atomic-guide-command.js +15 -15
- package/dist/core/atomic-guide-command.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +14 -9
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +79 -46
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
- package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
- package/dist/core/compaction/context-assistant-turns.js +87 -0
- package/dist/core/compaction/context-assistant-turns.js.map +1 -0
- package/dist/core/compaction/context-compaction-critical.d.ts +1 -1
- package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-critical.js +2 -2
- package/dist/core/compaction/context-compaction-critical.js.map +1 -1
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
- package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
- package/dist/core/compaction/context-compaction-eviction.d.ts +10 -2
- package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-eviction.js +196 -146
- package/dist/core/compaction/context-compaction-eviction.js.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-prompt.js +1 -1
- package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
- package/dist/core/compaction/context-compaction-types.d.ts +2 -0
- package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
- package/dist/core/compaction/context-compaction-types.js.map +1 -1
- package/dist/core/compaction/context-deletion-application.d.ts +5 -4
- package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-application.js +17 -15
- package/dist/core/compaction/context-deletion-application.js.map +1 -1
- package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-store.js +1 -1
- package/dist/core/compaction/context-deletion-store.js.map +1 -1
- package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
- package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-targets.js +36 -31
- package/dist/core/compaction/context-deletion-targets.js.map +1 -1
- package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
- package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
- package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.d.ts +1 -2
- package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
- package/dist/core/compaction/context-transcript-analysis.js +33 -37
- package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
- package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
- package/dist/core/copilot-model-synthesis.js +3 -1
- package/dist/core/copilot-model-synthesis.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +2 -1
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +2 -7
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +6 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +72 -29
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/messages.d.ts +9 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +100 -18
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry-builtins.d.ts.map +1 -1
- package/dist/core/model-registry-builtins.js +5 -0
- package/dist/core/model-registry-builtins.js.map +1 -1
- package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
- package/dist/core/model-registry-custom-loader.js +49 -8
- package/dist/core/model-registry-custom-loader.js.map +1 -1
- package/dist/core/model-registry-dynamic.d.ts.map +1 -1
- package/dist/core/model-registry-dynamic.js +11 -5
- package/dist/core/model-registry-dynamic.js.map +1 -1
- package/dist/core/model-registry-loader.d.ts.map +1 -1
- package/dist/core/model-registry-loader.js +8 -0
- package/dist/core/model-registry-loader.js.map +1 -1
- package/dist/core/model-registry-schemas.d.ts +93 -8
- package/dist/core/model-registry-schemas.d.ts.map +1 -1
- package/dist/core/model-registry-schemas.js +24 -12
- package/dist/core/model-registry-schemas.js.map +1 -1
- package/dist/core/model-registry-types.d.ts +7 -6
- package/dist/core/model-registry-types.d.ts.map +1 -1
- package/dist/core/model-registry-types.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +23 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-cli.d.ts.map +1 -1
- package/dist/core/model-resolver-cli.js +33 -5
- package/dist/core/model-resolver-cli.js.map +1 -1
- package/dist/core/model-resolver-initial.d.ts +6 -1
- package/dist/core/model-resolver-initial.d.ts.map +1 -1
- package/dist/core/model-resolver-initial.js +12 -7
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.d.ts +1 -0
- package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -1
- package/dist/core/openai-responses-payload-sanitizer.js +24 -9
- package/dist/core/openai-responses-payload-sanitizer.js.map +1 -1
- package/dist/core/resource-loader-context-files.d.ts +1 -0
- package/dist/core/resource-loader-context-files.d.ts.map +1 -1
- package/dist/core/resource-loader-context-files.js +13 -10
- package/dist/core/resource-loader-context-files.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-entry-normalization.d.ts +7 -0
- package/dist/core/session-entry-normalization.d.ts.map +1 -0
- package/dist/core/session-entry-normalization.js +14 -0
- package/dist/core/session-entry-normalization.js.map +1 -0
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +1 -0
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-history.d.ts +2 -2
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +127 -108
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +2 -2
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-types.d.ts +1 -1
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/slash-commands.d.ts +2 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +141 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main-deferred-startup.d.ts.map +1 -1
- package/dist/main-deferred-startup.js +2 -2
- package/dist/main-deferred-startup.js.map +1 -1
- package/dist/main-early-input.d.ts.map +1 -1
- package/dist/main-early-input.js +7 -0
- package/dist/main-early-input.js.map +1 -1
- package/dist/main-session.d.ts.map +1 -1
- package/dist/main-session.js +1 -0
- package/dist/main-session.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-options.js +3 -1
- package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +2 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +3 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +21 -9
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
- package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-child-ordering.js +26 -0
- package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +43 -30
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -0
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +41 -6
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +3 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +2 -2
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -2
- 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-model-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +11 -4
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-process-lifecycle.js +0 -3
- package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +15 -1
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +5 -1
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +20 -21
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/global-theme.js +26 -2
- package/dist/modes/interactive/theme/global-theme.js.map +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +2 -0
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +3 -0
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/fs-watch.d.ts +24 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js +60 -5
- package/dist/utils/fs-watch.js.map +1 -1
- package/docs/changelog.mdx +19 -0
- package/docs/compaction.md +60 -49
- package/docs/custom-provider.md +18 -5
- package/docs/development.md +4 -0
- package/docs/extensions.md +11 -2
- package/docs/json.md +1 -1
- package/docs/models.md +69 -10
- package/docs/providers.md +1 -1
- package/docs/quickstart.md +12 -8
- package/docs/rpc.md +2 -2
- package/docs/sdk.md +1 -1
- package/docs/settings.md +4 -4
- package/docs/subagents.md +40 -5
- package/docs/tools.md +1 -1
- package/docs/usage.md +4 -2
- package/docs/windows.md +4 -0
- package/docs/workflows.md +33 -48
- package/examples/extensions/preset.ts +2 -2
- package/examples/extensions/subagent/README.md +2 -2
- package/examples/extensions/subagent/index.ts +1 -2
- package/examples/extensions/subagent/schemas.ts +4 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/npm-shrinkwrap.json +48 -51
- package/package.json +7 -7
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
- package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
- package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
|
@@ -11,8 +11,8 @@ import {
|
|
|
11
11
|
getConfiguredOAuthCallbackPort,
|
|
12
12
|
getOAuthCallbackPort,
|
|
13
13
|
setOAuthCallbackPort,
|
|
14
|
-
} from "./mcp-oauth-provider.
|
|
15
|
-
import { logger } from "./logger.
|
|
14
|
+
} from "./mcp-oauth-provider.js"
|
|
15
|
+
import { logger } from "./logger.js"
|
|
16
16
|
|
|
17
17
|
// HTML templates for callback responses
|
|
18
18
|
const HTML_SUCCESS = `<!DOCTYPE html>
|
|
@@ -63,8 +63,9 @@ interface PendingAuth {
|
|
|
63
63
|
timeout: ReturnType<typeof setTimeout>
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
/**
|
|
66
|
+
/** Serialized callback-server ownership prevents startup/teardown publication races. */
|
|
67
67
|
let server: Server | undefined
|
|
68
|
+
let serverTransition: Promise<void> = Promise.resolve()
|
|
68
69
|
const pendingAuths = new Map<string, PendingAuth>()
|
|
69
70
|
|
|
70
71
|
/** Timeout for callback completion (5 minutes) */
|
|
@@ -108,12 +109,9 @@ export function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
108
109
|
// Send HTTP response first before rejecting promise
|
|
109
110
|
res.writeHead(200, { "Content-Type": "text/html" })
|
|
110
111
|
res.end(renderCallbackErrorHtml())
|
|
111
|
-
// Reject
|
|
112
|
+
// Reject only after the response is sent.
|
|
112
113
|
if (pendingAuths.has(state)) {
|
|
113
|
-
|
|
114
|
-
clearTimeout(pending.timeout)
|
|
115
|
-
pendingAuths.delete(state)
|
|
116
|
-
setTimeout(() => pending.reject(new Error(errorMsg)), 0)
|
|
114
|
+
rejectPendingCallback(state, new Error(errorMsg))
|
|
117
115
|
}
|
|
118
116
|
return
|
|
119
117
|
}
|
|
@@ -149,69 +147,87 @@ export function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
|
149
147
|
* If strictPort is true, requires binding on the configured callback port.
|
|
150
148
|
* If strictPort is false, scans forward for an available local port.
|
|
151
149
|
*/
|
|
152
|
-
export
|
|
150
|
+
export function ensureCallbackServer(options: EnsureCallbackServerOptions = {}): Promise<void> {
|
|
151
|
+
return enqueueServerTransition(() => ensureCallbackServerNow(options))
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function enqueueServerTransition<T>(operation: () => Promise<T>): Promise<T> {
|
|
155
|
+
const result = serverTransition.then(operation, operation)
|
|
156
|
+
serverTransition = result.then(() => undefined, () => undefined)
|
|
157
|
+
return result
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
async function closeServer(target: Server): Promise<void> {
|
|
161
|
+
await new Promise<void>((resolve) => {
|
|
162
|
+
target.close(() => resolve())
|
|
163
|
+
})
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async function stopPublishedServer(): Promise<void> {
|
|
167
|
+
const target = server
|
|
168
|
+
if (!target) return
|
|
169
|
+
server = undefined
|
|
170
|
+
await closeServer(target)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function listen(candidate: Server, port: number): Promise<void> {
|
|
174
|
+
await new Promise<void>((resolve, reject) => {
|
|
175
|
+
const onError = (error: Error): void => {
|
|
176
|
+
candidate.off("error", onError)
|
|
177
|
+
reject(error)
|
|
178
|
+
}
|
|
179
|
+
const onListening = (): void => {
|
|
180
|
+
candidate.off("error", onError)
|
|
181
|
+
resolve()
|
|
182
|
+
}
|
|
183
|
+
candidate.once("error", onError)
|
|
184
|
+
candidate.listen(port, "localhost", onListening)
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function ensureCallbackServerNow(options: EnsureCallbackServerOptions): Promise<void> {
|
|
153
189
|
const configuredPort = getConfiguredOAuthCallbackPort()
|
|
154
190
|
const strictPort = options.strictPort === true
|
|
155
191
|
|
|
156
192
|
if (server) {
|
|
157
193
|
if (!strictPort || getOAuthCallbackPort() === configuredPort) return
|
|
158
|
-
|
|
159
194
|
if (pendingAuths.size > 0) {
|
|
160
195
|
throw new Error(
|
|
161
|
-
`OAuth callback server is running on port ${getOAuthCallbackPort()}, but strict callback port ${configuredPort} is required and cannot be switched while authorizations are pending
|
|
196
|
+
`OAuth callback server is running on port ${getOAuthCallbackPort()}, but strict callback port ${configuredPort} is required and cannot be switched while authorizations are pending`,
|
|
162
197
|
)
|
|
163
198
|
}
|
|
164
|
-
|
|
165
|
-
|
|
199
|
+
await stopPublishedServer()
|
|
200
|
+
setOAuthCallbackPort(configuredPort)
|
|
166
201
|
}
|
|
167
202
|
|
|
168
|
-
const preferredPort = configuredPort
|
|
169
203
|
const maxAttempts = strictPort ? 1 : MAX_PORT_SCAN_ATTEMPTS
|
|
170
204
|
let lastError: Error | undefined
|
|
171
|
-
|
|
172
205
|
for (let offset = 0; offset < maxAttempts; offset++) {
|
|
173
|
-
const candidatePort =
|
|
206
|
+
const candidatePort = configuredPort + offset
|
|
174
207
|
const candidateServer = createServer(handleRequest)
|
|
175
|
-
|
|
176
208
|
try {
|
|
177
|
-
await
|
|
178
|
-
candidateServer.once("error", (err) => {
|
|
179
|
-
reject(err)
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
candidateServer.listen(candidatePort, "localhost", () => {
|
|
183
|
-
resolve()
|
|
184
|
-
})
|
|
185
|
-
})
|
|
186
|
-
|
|
209
|
+
await listen(candidateServer, candidatePort)
|
|
187
210
|
server = candidateServer
|
|
188
|
-
|
|
211
|
+
candidateServer.unref()
|
|
189
212
|
setOAuthCallbackPort(candidatePort)
|
|
190
213
|
return
|
|
191
214
|
} catch (error) {
|
|
192
215
|
const nodeError = error as NodeJS.ErrnoException
|
|
193
|
-
await
|
|
194
|
-
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
if (nodeError.code !== "EADDRINUSE") {
|
|
198
|
-
throw error
|
|
199
|
-
}
|
|
200
|
-
|
|
216
|
+
await closeServer(candidateServer)
|
|
217
|
+
if (nodeError.code !== "EADDRINUSE") throw error
|
|
201
218
|
lastError = error instanceof Error ? error : new Error(String(error))
|
|
202
219
|
}
|
|
203
220
|
}
|
|
204
221
|
|
|
205
222
|
if (strictPort) {
|
|
206
223
|
throw new Error(
|
|
207
|
-
`OAuth callback port ${
|
|
208
|
-
{ cause: lastError }
|
|
224
|
+
`OAuth callback port ${configuredPort} is already in use. Pre-registered OAuth clients require an exact redirect URI; set MCP_OAUTH_CALLBACK_PORT to your registered port or free port ${configuredPort}`,
|
|
225
|
+
{ cause: lastError },
|
|
209
226
|
)
|
|
210
227
|
}
|
|
211
|
-
|
|
212
228
|
throw new Error(
|
|
213
|
-
`OAuth callback port ${
|
|
214
|
-
{ cause: lastError }
|
|
229
|
+
`OAuth callback port ${configuredPort} is already in use and no free port was found in range ${configuredPort}-${configuredPort + MAX_PORT_SCAN_ATTEMPTS - 1}`,
|
|
230
|
+
{ cause: lastError },
|
|
215
231
|
)
|
|
216
232
|
}
|
|
217
233
|
|
|
@@ -220,7 +236,7 @@ export async function ensureCallbackServer(options: EnsureCallbackServerOptions
|
|
|
220
236
|
* Returns a promise that resolves with the authorization code.
|
|
221
237
|
*/
|
|
222
238
|
export function waitForCallback(oauthState: string): Promise<string> {
|
|
223
|
-
|
|
239
|
+
const promise = new Promise<string>((resolve, reject) => {
|
|
224
240
|
const timeout = setTimeout(() => {
|
|
225
241
|
if (pendingAuths.has(oauthState)) {
|
|
226
242
|
pendingAuths.delete(oauthState)
|
|
@@ -230,44 +246,49 @@ export function waitForCallback(oauthState: string): Promise<string> {
|
|
|
230
246
|
|
|
231
247
|
pendingAuths.set(oauthState, { resolve, reject, timeout })
|
|
232
248
|
})
|
|
249
|
+
void promise.catch(() => undefined)
|
|
250
|
+
return promise
|
|
233
251
|
}
|
|
234
252
|
|
|
235
253
|
/**
|
|
236
254
|
* Cancel a pending authorization by state.
|
|
237
255
|
*/
|
|
238
|
-
|
|
256
|
+
function rejectPendingCallback(oauthState: string, error: Error): boolean {
|
|
239
257
|
const pending = pendingAuths.get(oauthState)
|
|
240
|
-
if (pending)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
258
|
+
if (!pending) return false
|
|
259
|
+
pendingAuths.delete(oauthState)
|
|
260
|
+
clearTimeout(pending.timeout)
|
|
261
|
+
pending.reject(error)
|
|
262
|
+
return true
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function cancelPendingCallback(
|
|
266
|
+
oauthState: string,
|
|
267
|
+
error = new Error("Authorization cancelled"),
|
|
268
|
+
): void {
|
|
269
|
+
rejectPendingCallback(oauthState, error)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Reject and remove every callback waiter before lifecycle cleanup settles. */
|
|
273
|
+
export function cancelAllPendingCallbacks(error: Error): void {
|
|
274
|
+
for (const oauthState of Array.from(pendingAuths.keys())) {
|
|
275
|
+
rejectPendingCallback(oauthState, error)
|
|
244
276
|
}
|
|
245
277
|
}
|
|
246
278
|
|
|
247
279
|
/**
|
|
248
280
|
* Stop the callback server and reject all pending authorizations.
|
|
249
281
|
*/
|
|
250
|
-
export
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
setOAuthCallbackPort(getConfiguredOAuthCallbackPort())
|
|
261
|
-
|
|
262
|
-
// Reject all pending auths (defer to allow any pending operations to complete)
|
|
263
|
-
const pendingList = Array.from(pendingAuths.entries())
|
|
264
|
-
pendingAuths.clear()
|
|
265
|
-
setTimeout(() => {
|
|
266
|
-
for (const [, pending] of pendingList) {
|
|
267
|
-
clearTimeout(pending.timeout)
|
|
268
|
-
pending.reject(new Error("OAuth callback server stopped"))
|
|
269
|
-
}
|
|
270
|
-
}, 0)
|
|
282
|
+
export function stopCallbackServer(
|
|
283
|
+
error = new Error("OAuth callback server stopped"),
|
|
284
|
+
): Promise<void> {
|
|
285
|
+
cancelAllPendingCallbacks(error)
|
|
286
|
+
return enqueueServerTransition(async () => {
|
|
287
|
+
// A producer can register its waiter while an earlier startup is publishing.
|
|
288
|
+
cancelAllPendingCallbacks(error)
|
|
289
|
+
await stopPublishedServer()
|
|
290
|
+
setOAuthCallbackPort(getConfiguredOAuthCallbackPort())
|
|
291
|
+
})
|
|
271
292
|
}
|
|
272
293
|
|
|
273
294
|
/**
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
clearTokens,
|
|
25
25
|
type StoredTokens,
|
|
26
26
|
type StoredClientInfo,
|
|
27
|
-
} from "./mcp-auth.
|
|
27
|
+
} from "./mcp-auth.js"
|
|
28
28
|
|
|
29
29
|
// Callback server configuration
|
|
30
30
|
const DEFAULT_OAUTH_CALLBACK_PORT = 19876
|
|
@@ -64,6 +64,7 @@ export interface McpOAuthConfig {
|
|
|
64
64
|
/** Callbacks for OAuth flow interactions */
|
|
65
65
|
export interface McpOAuthCallbacks {
|
|
66
66
|
onRedirect: (url: URL) => void | Promise<void>
|
|
67
|
+
assertActive?: () => void
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
/**
|
|
@@ -78,6 +79,10 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
78
79
|
private callbacks: McpOAuthCallbacks,
|
|
79
80
|
) {}
|
|
80
81
|
|
|
82
|
+
private ensureActive(): void {
|
|
83
|
+
this.callbacks.assertActive?.()
|
|
84
|
+
}
|
|
85
|
+
|
|
81
86
|
private get usesClientCredentials(): boolean {
|
|
82
87
|
return this.config.grantType === "client_credentials"
|
|
83
88
|
}
|
|
@@ -125,6 +130,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
125
130
|
* Returns undefined if no client info exists or if the server URL has changed.
|
|
126
131
|
*/
|
|
127
132
|
async clientInformation(): Promise<OAuthClientInformation | undefined> {
|
|
133
|
+
this.ensureActive()
|
|
128
134
|
// Check config first (pre-registered client)
|
|
129
135
|
if (this.config.clientId) {
|
|
130
136
|
return {
|
|
@@ -136,6 +142,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
136
142
|
// Check stored client info (from dynamic registration)
|
|
137
143
|
// Use getAuthForUrl to validate credentials are for the current server URL
|
|
138
144
|
const entry = await getAuthForUrl(this.serverName, this.serverUrl)
|
|
145
|
+
this.ensureActive()
|
|
139
146
|
if (entry?.clientInfo) {
|
|
140
147
|
// Check if client secret has expired
|
|
141
148
|
if (entry.clientInfo.clientSecretExpiresAt && entry.clientInfo.clientSecretExpiresAt < Date.now() / 1000) {
|
|
@@ -155,6 +162,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
155
162
|
* Save client information from dynamic registration.
|
|
156
163
|
*/
|
|
157
164
|
async saveClientInformation(info: OAuthClientInformationFull): Promise<void> {
|
|
165
|
+
this.ensureActive()
|
|
158
166
|
const clientInfo: StoredClientInfo = {
|
|
159
167
|
clientId: info.client_id,
|
|
160
168
|
clientSecret: info.client_secret,
|
|
@@ -169,8 +177,10 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
169
177
|
* Returns undefined if no tokens exist or if the server URL has changed.
|
|
170
178
|
*/
|
|
171
179
|
async tokens(): Promise<OAuthTokens | undefined> {
|
|
180
|
+
this.ensureActive()
|
|
172
181
|
// Use getAuthForUrl to validate tokens are for the current server URL
|
|
173
182
|
const entry = await getAuthForUrl(this.serverName, this.serverUrl)
|
|
183
|
+
this.ensureActive()
|
|
174
184
|
if (!entry?.tokens) return undefined
|
|
175
185
|
|
|
176
186
|
return {
|
|
@@ -188,6 +198,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
188
198
|
* Save OAuth tokens.
|
|
189
199
|
*/
|
|
190
200
|
async saveTokens(tokens: OAuthTokens): Promise<void> {
|
|
201
|
+
this.ensureActive()
|
|
191
202
|
const storedTokens: StoredTokens = {
|
|
192
203
|
accessToken: tokens.access_token,
|
|
193
204
|
refreshToken: tokens.refresh_token,
|
|
@@ -207,11 +218,13 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
207
218
|
* flow, which library hosts cannot complete in-process.
|
|
208
219
|
*/
|
|
209
220
|
async redirectToAuthorization(authorizationUrl: URL): Promise<void> {
|
|
221
|
+
this.ensureActive()
|
|
210
222
|
if (this.usesClientCredentials) {
|
|
211
223
|
throw new Error("redirectToAuthorization is not used for client_credentials flow")
|
|
212
224
|
}
|
|
213
225
|
// No saved oauthState means we're on the post-refresh authorize fallback.
|
|
214
226
|
const entry = await getAuthForUrl(this.serverName, this.serverUrl)
|
|
227
|
+
this.ensureActive()
|
|
215
228
|
if (!entry?.oauthState) {
|
|
216
229
|
throw new UnauthorizedError(
|
|
217
230
|
`Re-authentication required for MCP server: ${this.serverName}`,
|
|
@@ -219,12 +232,14 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
219
232
|
}
|
|
220
233
|
// URL is passed to callback, not logged (may contain sensitive params)
|
|
221
234
|
await this.callbacks.onRedirect(authorizationUrl)
|
|
235
|
+
this.ensureActive()
|
|
222
236
|
}
|
|
223
237
|
|
|
224
238
|
/**
|
|
225
239
|
* Save the PKCE code verifier.
|
|
226
240
|
*/
|
|
227
241
|
async saveCodeVerifier(codeVerifier: string): Promise<void> {
|
|
242
|
+
this.ensureActive()
|
|
228
243
|
updateCodeVerifier(this.serverName, codeVerifier, this.serverUrl)
|
|
229
244
|
}
|
|
230
245
|
|
|
@@ -233,10 +248,12 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
233
248
|
* @throws Error if no code verifier is stored
|
|
234
249
|
*/
|
|
235
250
|
async codeVerifier(): Promise<string> {
|
|
251
|
+
this.ensureActive()
|
|
236
252
|
if (this.usesClientCredentials) {
|
|
237
253
|
throw new Error("codeVerifier is not used for client_credentials flow")
|
|
238
254
|
}
|
|
239
255
|
const entry = await getAuthForUrl(this.serverName, this.serverUrl)
|
|
256
|
+
this.ensureActive()
|
|
240
257
|
if (!entry?.codeVerifier) {
|
|
241
258
|
throw new Error(`No code verifier saved for MCP server: ${this.serverName}`)
|
|
242
259
|
}
|
|
@@ -247,6 +264,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
247
264
|
* Save the OAuth state parameter for CSRF protection.
|
|
248
265
|
*/
|
|
249
266
|
async saveState(state: string): Promise<void> {
|
|
267
|
+
this.ensureActive()
|
|
250
268
|
updateOAuthState(this.serverName, state, this.serverUrl)
|
|
251
269
|
}
|
|
252
270
|
|
|
@@ -255,10 +273,12 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
255
273
|
* @throws UnauthorizedError if no flow is in progress (see redirectToAuthorization)
|
|
256
274
|
*/
|
|
257
275
|
async state(): Promise<string> {
|
|
276
|
+
this.ensureActive()
|
|
258
277
|
if (this.usesClientCredentials) {
|
|
259
278
|
throw new Error("state is not used for client_credentials flow")
|
|
260
279
|
}
|
|
261
280
|
const entry = await getAuthForUrl(this.serverName, this.serverUrl)
|
|
281
|
+
this.ensureActive()
|
|
262
282
|
if (!entry?.oauthState) {
|
|
263
283
|
throw new UnauthorizedError(
|
|
264
284
|
`Re-authentication required for MCP server: ${this.serverName}`,
|
|
@@ -272,6 +292,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
272
292
|
* Clears tokens, client info, or all credentials based on the type.
|
|
273
293
|
*/
|
|
274
294
|
async invalidateCredentials(type: "all" | "client" | "tokens"): Promise<void> {
|
|
295
|
+
this.ensureActive()
|
|
275
296
|
switch (type) {
|
|
276
297
|
case "all":
|
|
277
298
|
clearAllCredentials(this.serverName)
|
|
@@ -286,6 +307,7 @@ export class McpOAuthProvider implements OAuthClientProvider {
|
|
|
286
307
|
}
|
|
287
308
|
|
|
288
309
|
prepareTokenRequest(scope?: string): URLSearchParams | undefined {
|
|
310
|
+
this.ensureActive()
|
|
289
311
|
if (!this.usesClientCredentials) {
|
|
290
312
|
return undefined
|
|
291
313
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { McpExtensionState } from "./state.js";
|
|
2
|
+
import { lazyConnect, updateMetadataCache, updateServerMetadata } from "./init.js";
|
|
3
|
+
import { parallelLimit } from "./utils.js";
|
|
4
|
+
import { waitForCaller } from "./caller-wait.js";
|
|
5
|
+
import { assertMcpStateLease, type AssertMcpStateLease } from "./state-lease.js";
|
|
6
|
+
|
|
7
|
+
export async function hydrateServerMetadata(
|
|
8
|
+
state: McpExtensionState,
|
|
9
|
+
serverName: string,
|
|
10
|
+
signal?: AbortSignal,
|
|
11
|
+
assertActive?: AssertMcpStateLease,
|
|
12
|
+
): Promise<boolean> {
|
|
13
|
+
signal?.throwIfAborted();
|
|
14
|
+
assertMcpStateLease(assertActive);
|
|
15
|
+
if (state.toolMetadata.has(serverName)) return true;
|
|
16
|
+
if (!state.config.mcpServers[serverName]) return false;
|
|
17
|
+
|
|
18
|
+
const connection = state.manager.getConnection(serverName);
|
|
19
|
+
if (connection?.status === "connected") {
|
|
20
|
+
assertMcpStateLease(assertActive);
|
|
21
|
+
updateServerMetadata(state, serverName);
|
|
22
|
+
updateMetadataCache(state, serverName);
|
|
23
|
+
return state.toolMetadata.has(serverName);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const connected = await waitForCaller(() => lazyConnect(state, serverName), signal);
|
|
27
|
+
signal?.throwIfAborted();
|
|
28
|
+
assertMcpStateLease(assertActive);
|
|
29
|
+
return connected;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function hydrateMissingMetadata(
|
|
33
|
+
state: McpExtensionState,
|
|
34
|
+
options?: { server?: string },
|
|
35
|
+
signal?: AbortSignal,
|
|
36
|
+
assertActive?: AssertMcpStateLease,
|
|
37
|
+
): Promise<void> {
|
|
38
|
+
signal?.throwIfAborted();
|
|
39
|
+
assertMcpStateLease(assertActive);
|
|
40
|
+
if (options?.server) {
|
|
41
|
+
await hydrateServerMetadata(state, options.server, signal, assertActive);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const missingServers = Object.keys(state.config.mcpServers).filter(
|
|
46
|
+
(serverName) => !state.toolMetadata.has(serverName),
|
|
47
|
+
);
|
|
48
|
+
await parallelLimit(missingServers, 10, async (serverName) => {
|
|
49
|
+
await hydrateServerMetadata(state, serverName, signal, assertActive);
|
|
50
|
+
});
|
|
51
|
+
assertMcpStateLease(assertActive);
|
|
52
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/mcp",
|
|
3
|
-
"version": "0.9.5
|
|
3
|
+
"version": "0.9.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
|
|
6
6
|
"contributors": [
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"@bastani/atomic": "*",
|
|
35
|
-
"@earendil-works/pi-ai": "^0.80.
|
|
36
|
-
"@earendil-works/pi-tui": "^0.80.
|
|
35
|
+
"@earendil-works/pi-ai": "^0.80.6",
|
|
36
|
+
"@earendil-works/pi-tui": "^0.80.6",
|
|
37
37
|
"zod": "^3.25.0 || ^4.0.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { McpExtensionState } from "./state.
|
|
2
|
-
import { authenticate, supportsOAuth } from "./mcp-auth-flow.
|
|
3
|
-
import { formatAuthRequiredMessage } from "./utils.
|
|
1
|
+
import type { McpExtensionState } from "./state.js";
|
|
2
|
+
import { authenticate, supportsOAuth } from "./mcp-auth-flow.js";
|
|
3
|
+
import { formatAuthRequiredMessage } from "./utils.js";
|
|
4
4
|
|
|
5
|
-
type AutoAuthResult =
|
|
5
|
+
export type AutoAuthResult =
|
|
6
6
|
| { status: "skipped" }
|
|
7
7
|
| { status: "success" }
|
|
8
8
|
| { status: "failed"; message: string };
|