@gajae-code/coding-agent 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +215 -8
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +10 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +73 -9
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +2 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +7 -21
- package/dist/types/modes/components/settings-selector.d.ts +5 -0
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/theme/defaults/index.d.ts +118 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +47 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +10 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +23 -2
- package/src/config/model-profiles.ts +88 -21
- package/src/config/model-registry.ts +147 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +77 -7
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +41 -32
- package/src/main.ts +36 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/chrome.ts +4 -3
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/dynamic-theme-text.ts +22 -0
- package/src/modes/components/gajae-pet-widget.ts +607 -193
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/model-selector.ts +1 -6
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +35 -31
- package/src/modes/components/settings-selector.ts +29 -5
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +19 -4
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +238 -77
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/theme/defaults/index.ts +2 -0
- package/src/modes/theme/defaults/ouroboros.json +118 -0
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2873 -559
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +199 -31
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +757 -57
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +117 -19
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +349 -142
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/todo-contract.ts +55 -3
- package/src/tools/todo-write.ts +4 -3
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
package/src/sdk/mcp/server.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
1
|
import { getAgentDir } from "@gajae-code/utils";
|
|
3
2
|
import { ensureBroker } from "../broker/ensure";
|
|
4
3
|
import { lifecycleRequestTimeoutMs } from "../broker/startup-budget";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { SdkClientError } from "../client/client";
|
|
5
|
+
import { createBrokerSessionLifecycleService } from "../lifecycle/broker-client";
|
|
6
|
+
import type {
|
|
7
|
+
SessionLifecycleMutationRequest,
|
|
8
|
+
SessionLifecycleOperation,
|
|
9
|
+
SessionLifecycleService,
|
|
10
|
+
} from "../lifecycle/service";
|
|
7
11
|
import { validateAdapterControl, validateAdapterSecretFields } from "../protocol/adapter-validation";
|
|
8
12
|
import { adapterDispositionError, findOperation } from "../protocol/operation-registry";
|
|
13
|
+
import { type SessionAttachment, SessionRouter, SessionRouterError } from "../router";
|
|
14
|
+
import { SessionListTraversalError, sessionListPageFromResponse, traverseSessionList } from "../session-list";
|
|
9
15
|
|
|
10
16
|
const PROTOCOL_VERSION = "2024-11-05";
|
|
11
17
|
const SERVER_NAME = "gjc-sdk-mcp";
|
|
@@ -21,11 +27,10 @@ type JsonRpcResponse = {
|
|
|
21
27
|
};
|
|
22
28
|
|
|
23
29
|
export interface SdkMcpServerOptions {
|
|
24
|
-
repo?: string;
|
|
25
30
|
agentDir?: string;
|
|
26
|
-
|
|
31
|
+
router?: SessionRouter;
|
|
32
|
+
lifecycleService?: SessionLifecycleService;
|
|
27
33
|
}
|
|
28
|
-
const MAX_SESSION_LIST_PAGES = 10_000;
|
|
29
34
|
|
|
30
35
|
export const SDK_MCP_TOOL_NAMES = [
|
|
31
36
|
"gjc_session_control",
|
|
@@ -49,6 +54,10 @@ function schema(name: (typeof SDK_MCP_TOOL_NAMES)[number]): Record<string, unkno
|
|
|
49
54
|
operation: { type: "string" },
|
|
50
55
|
input: { type: "object" },
|
|
51
56
|
confirm: { type: "boolean", description: "Required for destructive controls." },
|
|
57
|
+
idempotencyKey: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "Bounded idempotency key; required for turn.abort mode:terminal.",
|
|
60
|
+
},
|
|
52
61
|
},
|
|
53
62
|
},
|
|
54
63
|
};
|
|
@@ -103,8 +112,7 @@ function asString(args: Arguments, name: string): string | null {
|
|
|
103
112
|
}
|
|
104
113
|
|
|
105
114
|
function resultError(error: unknown): { ok: false; error: { code: string; message: string; path?: string } } {
|
|
106
|
-
if (error instanceof
|
|
107
|
-
return { ok: false, error: { code: error.code, path: path.basename(error.path), message: error.message } };
|
|
115
|
+
if (error instanceof SessionRouterError) return { ok: false, error: { code: error.phase, message: error.message } };
|
|
108
116
|
if (error instanceof SdkClientError) return { ok: false, error: { code: error.code, message: error.message } };
|
|
109
117
|
return {
|
|
110
118
|
ok: false,
|
|
@@ -139,7 +147,12 @@ function mcpOperationError(
|
|
|
139
147
|
return adapterDispositionError("mcp", kind, operation, true);
|
|
140
148
|
}
|
|
141
149
|
|
|
142
|
-
|
|
150
|
+
const MCP_LIFECYCLE_ACTOR = { id: "gjc-sdk-mcp", namespace: "sdk:mcp" } as const;
|
|
151
|
+
const ROUTER_START_TIMEOUT_MS = 3_000;
|
|
152
|
+
const ROUTER_STOP_TIMEOUT_MS = 5_000;
|
|
153
|
+
type LifecycleMutationOperation = Exclude<SessionLifecycleOperation, "session.list">;
|
|
154
|
+
|
|
155
|
+
function isLifecycleOperation(operation: string): operation is LifecycleMutationOperation {
|
|
143
156
|
return (
|
|
144
157
|
operation === "session.create" ||
|
|
145
158
|
operation === "session.fork" ||
|
|
@@ -148,14 +161,64 @@ function isLifecycleOperation(operation: string): boolean {
|
|
|
148
161
|
operation === "session.delete"
|
|
149
162
|
);
|
|
150
163
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
164
|
+
|
|
165
|
+
async function bounded<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {
|
|
166
|
+
let timer: NodeJS.Timeout | undefined;
|
|
167
|
+
const timeout = Promise.withResolvers<never>();
|
|
168
|
+
try {
|
|
169
|
+
timer = setTimeout(() => timeout.reject(new SdkClientError("timeout", message)), timeoutMs);
|
|
170
|
+
return await Promise.race([promise, timeout.promise]);
|
|
171
|
+
} finally {
|
|
172
|
+
if (timer) clearTimeout(timer);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
class McpSessionListBrokerResponseError extends Error {
|
|
177
|
+
readonly #response: Arguments;
|
|
178
|
+
|
|
179
|
+
constructor(response: Arguments) {
|
|
180
|
+
super("session.list failed");
|
|
181
|
+
this.name = "McpSessionListBrokerResponseError";
|
|
182
|
+
this.#response = response;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
get response(): Arguments {
|
|
186
|
+
return this.#response;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function paginatedSessionList(
|
|
191
|
+
router: SessionRouter,
|
|
192
|
+
input: Arguments = {},
|
|
193
|
+
requestKey = `${MCP_LIFECYCLE_ACTOR.namespace}:session.list`,
|
|
194
|
+
): Promise<unknown> {
|
|
195
|
+
try {
|
|
196
|
+
const pages = await traverseSessionList(
|
|
197
|
+
input,
|
|
198
|
+
async pageInput => {
|
|
199
|
+
const rawResponse = await router.listBrokerSessions(pageInput, requestKey);
|
|
200
|
+
const response = isObject(rawResponse) ? rawResponse : undefined;
|
|
201
|
+
if (response?.ok === false) throw new McpSessionListBrokerResponseError(response);
|
|
202
|
+
return response;
|
|
203
|
+
},
|
|
204
|
+
response => sessionListPageFromResponse(response),
|
|
205
|
+
);
|
|
206
|
+
const aggregate: Arguments = {};
|
|
207
|
+
const sessions: unknown[] = [];
|
|
208
|
+
for (const { page } of pages) {
|
|
209
|
+
for (const [key, value] of Object.entries(page))
|
|
210
|
+
if (key !== "sessions" && key !== "continuationCursor") aggregate[key] = value;
|
|
211
|
+
sessions.push(...page.sessions);
|
|
212
|
+
}
|
|
213
|
+
const result = { ...aggregate, sessions };
|
|
214
|
+
const firstResponse = pages[0]?.response;
|
|
215
|
+
return firstResponse && Object.hasOwn(firstResponse, "result") ? { ...firstResponse, result } : result;
|
|
216
|
+
} catch (error) {
|
|
217
|
+
if (error instanceof McpSessionListBrokerResponseError) return error.response;
|
|
218
|
+
if (error instanceof SessionListTraversalError)
|
|
219
|
+
return { ok: false, error: { code: "protocol_error", message: error.message } };
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
159
222
|
}
|
|
160
223
|
|
|
161
224
|
function textResult(
|
|
@@ -165,111 +228,70 @@ function textResult(
|
|
|
165
228
|
return { content: [{ type: "text", text: JSON.stringify(payload) }], isError };
|
|
166
229
|
}
|
|
167
230
|
|
|
168
|
-
/** Creates the model-facing MCP adapter
|
|
231
|
+
/** Creates the model-facing MCP adapter with Router-owned live session authority. */
|
|
169
232
|
export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
170
233
|
const agentDir = options.agentDir ?? getAgentDir();
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
/** Extracts a broker `result` envelope, converting an explicit error frame into a typed throw. */
|
|
186
|
-
function brokerResult(value: unknown): Record<string, unknown> {
|
|
187
|
-
if (isObject(value) && value.ok === false) {
|
|
188
|
-
const error = isObject(value.error) ? value.error : {};
|
|
189
|
-
const code = typeof error.code === "string" ? error.code : "unavailable";
|
|
190
|
-
const message = typeof error.message === "string" ? error.message : "SDK broker request failed";
|
|
191
|
-
throw new SdkClientError(code, message, value.error);
|
|
234
|
+
const router = options.router ?? new SessionRouter({ agentDir });
|
|
235
|
+
const lifecycleService = options.lifecycleService ?? createBrokerSessionLifecycleService(agentDir);
|
|
236
|
+
let startPromise: Promise<void> | undefined;
|
|
237
|
+
let closePromise: Promise<void> | undefined;
|
|
238
|
+
async function start(): Promise<void> {
|
|
239
|
+
if (closePromise) throw new SdkClientError("connection_closed", "SDK MCP server is closed.");
|
|
240
|
+
if (!startPromise) {
|
|
241
|
+
const authoritative = router.start();
|
|
242
|
+
let tracked!: Promise<void>;
|
|
243
|
+
tracked = authoritative.catch(error => {
|
|
244
|
+
if (startPromise === tracked) startPromise = undefined;
|
|
245
|
+
throw error;
|
|
246
|
+
});
|
|
247
|
+
startPromise = tracked;
|
|
192
248
|
}
|
|
193
|
-
|
|
249
|
+
await bounded(startPromise, ROUTER_START_TIMEOUT_MS, "SDK session Router startup timed out.");
|
|
194
250
|
}
|
|
195
251
|
|
|
196
|
-
function
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
* to one full snapshot. The broker remains the sole session authority; this
|
|
202
|
-
* only aggregates its indexed truth across pages.
|
|
203
|
-
*/
|
|
204
|
-
async function paginatedBrokerSessionList(
|
|
205
|
-
client: SdkClient,
|
|
206
|
-
): Promise<{ sessions: Record<string, unknown>[]; warnings: unknown[] }> {
|
|
207
|
-
const sessions: Record<string, unknown>[] = [];
|
|
208
|
-
let warnings: unknown[] = [];
|
|
209
|
-
let cursor: string | undefined;
|
|
210
|
-
for (let pageCount = 0; pageCount < MAX_SESSION_LIST_PAGES; pageCount++) {
|
|
211
|
-
const listed = brokerResult(await client.global("session.list", cursor === undefined ? {} : { cursor }));
|
|
212
|
-
sessions.push(...arrayOf(listed.sessions).filter(isObject));
|
|
213
|
-
if (Array.isArray(listed.warnings)) warnings = listed.warnings;
|
|
214
|
-
const nextCursor =
|
|
215
|
-
typeof listed.continuationCursor === "string" && listed.continuationCursor.length > 0
|
|
216
|
-
? listed.continuationCursor
|
|
217
|
-
: undefined;
|
|
218
|
-
if (!nextCursor) return { sessions, warnings };
|
|
219
|
-
cursor = nextCursor;
|
|
220
|
-
}
|
|
221
|
-
throw new SdkClientError("protocol_error", "session.list exceeded the page budget.");
|
|
252
|
+
async function close(): Promise<void> {
|
|
253
|
+
closePromise ??= (async () => {
|
|
254
|
+
await bounded(router.stop(), ROUTER_STOP_TIMEOUT_MS, "SDK session Router shutdown timed out.");
|
|
255
|
+
})();
|
|
256
|
+
await closePromise;
|
|
222
257
|
}
|
|
223
258
|
|
|
224
|
-
|
|
225
|
-
* Resolves one session through broker `session.list` + `session.get_endpoint`
|
|
226
|
-
* (C10): the broker's liveness and ambiguity truth decides reachability, and
|
|
227
|
-
* only the broker mints the endpoint credential.
|
|
228
|
-
*/
|
|
229
|
-
async function withSession(sessionId: string, action: (client: SdkClient) => Promise<unknown>): Promise<unknown> {
|
|
230
|
-
let broker: SdkClient | undefined;
|
|
231
|
-
let client: SdkClient | undefined;
|
|
259
|
+
async function withSession(sessionId: string, frame: Record<string, unknown>): Promise<unknown> {
|
|
232
260
|
try {
|
|
233
|
-
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
return {
|
|
239
|
-
ok: false,
|
|
240
|
-
error: { code: "ambiguous_session", message: "session id maps to more than one state root" },
|
|
241
|
-
};
|
|
242
|
-
if (row.live !== true)
|
|
243
|
-
return { ok: false, error: { code: "endpoint_stale", message: "session endpoint is not live" } };
|
|
244
|
-
const endpoint = brokerResult(await broker.global("session.get_endpoint", { sessionId }));
|
|
245
|
-
const url = typeof endpoint.url === "string" && endpoint.url ? endpoint.url : undefined;
|
|
246
|
-
const token = typeof endpoint.token === "string" ? endpoint.token : "";
|
|
247
|
-
if (!url)
|
|
248
|
-
return { ok: false, error: { code: "unavailable", message: "SDK broker returned an invalid endpoint" } };
|
|
249
|
-
client = await connect(url, token);
|
|
250
|
-
return await action(client);
|
|
261
|
+
await start();
|
|
262
|
+
const attachment: SessionAttachment | null = router.attachment(sessionId);
|
|
263
|
+
if (!attachment)
|
|
264
|
+
return { ok: false, error: { code: "not_found", message: `SDK session not found: ${sessionId}` } };
|
|
265
|
+
return await router.request(sessionId, frame, attachment.generation, attachment);
|
|
251
266
|
} catch (error) {
|
|
252
267
|
return resultError(error);
|
|
253
|
-
} finally {
|
|
254
|
-
await client?.close();
|
|
255
|
-
await broker?.close();
|
|
256
268
|
}
|
|
257
269
|
}
|
|
258
270
|
|
|
271
|
+
async function runLifecycle(
|
|
272
|
+
operation: LifecycleMutationOperation,
|
|
273
|
+
input: Arguments,
|
|
274
|
+
requestKey: string,
|
|
275
|
+
): Promise<unknown> {
|
|
276
|
+
const timeoutMs = lifecycleRequestTimeoutMs(operation, input);
|
|
277
|
+
return await lifecycleService.execute({
|
|
278
|
+
operation,
|
|
279
|
+
actor: MCP_LIFECYCLE_ACTOR,
|
|
280
|
+
capability: operation,
|
|
281
|
+
requestKey,
|
|
282
|
+
target: input,
|
|
283
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
284
|
+
} as unknown as SessionLifecycleMutationRequest);
|
|
285
|
+
}
|
|
286
|
+
|
|
259
287
|
async function callTool(name: string, args: Arguments = {}): Promise<unknown> {
|
|
260
288
|
if (name === "gjc_session_list") {
|
|
261
|
-
let broker: SdkClient | undefined;
|
|
262
289
|
try {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
typeof item.sessionId === "string" && item.sessionId ? [{ sessionId: item.sessionId }] : [],
|
|
267
|
-
);
|
|
268
|
-
return { ok: true, sessions: listed, warnings };
|
|
290
|
+
await ensureBroker({ agentDir });
|
|
291
|
+
await start();
|
|
292
|
+
return await paginatedSessionList(router);
|
|
269
293
|
} catch (error) {
|
|
270
294
|
return resultError(error);
|
|
271
|
-
} finally {
|
|
272
|
-
await broker?.close();
|
|
273
295
|
}
|
|
274
296
|
}
|
|
275
297
|
if (name === "gjc_session_control") {
|
|
@@ -284,9 +306,23 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
|
284
306
|
if (secretError) return invalidControl(secretError);
|
|
285
307
|
const invalid = validateAdapterControl(operation, input);
|
|
286
308
|
if (invalid) return invalidControl(invalid);
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
)
|
|
309
|
+
const idempotencyKey =
|
|
310
|
+
args.idempotencyKey === undefined ? undefined : (asString(args, "idempotencyKey") ?? undefined);
|
|
311
|
+
if (args.idempotencyKey !== undefined && !idempotencyKey)
|
|
312
|
+
return {
|
|
313
|
+
ok: false,
|
|
314
|
+
error: { code: "invalid_input", message: "idempotencyKey must be a non-empty string" },
|
|
315
|
+
};
|
|
316
|
+
// Forward the key on the control frame: terminal abort requires it,
|
|
317
|
+
// and without it every {mode:"terminal"} control is rejected (review
|
|
318
|
+
// thread P1).
|
|
319
|
+
return await withSession(sessionId, {
|
|
320
|
+
type: "control_request",
|
|
321
|
+
operation,
|
|
322
|
+
input,
|
|
323
|
+
confirm: args.confirm === true,
|
|
324
|
+
...(idempotencyKey === undefined ? {} : { idempotencyKey }),
|
|
325
|
+
});
|
|
290
326
|
}
|
|
291
327
|
if (name === "gjc_session_query") {
|
|
292
328
|
const sessionId = asString(args, "sessionId");
|
|
@@ -299,7 +335,12 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
|
299
335
|
const input = isObject(args.input) ? args.input : {};
|
|
300
336
|
const dispositionError = mcpOperationError("query", query);
|
|
301
337
|
if (dispositionError) return invalidControl(dispositionError);
|
|
302
|
-
return await withSession(sessionId,
|
|
338
|
+
return await withSession(sessionId, {
|
|
339
|
+
type: "query_request",
|
|
340
|
+
query,
|
|
341
|
+
input,
|
|
342
|
+
...(cursor === undefined ? {} : { cursor }),
|
|
343
|
+
});
|
|
303
344
|
}
|
|
304
345
|
if (name === "gjc_session_global") {
|
|
305
346
|
const operation = asString(args, "operation");
|
|
@@ -321,35 +362,20 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
|
321
362
|
ok: false,
|
|
322
363
|
error: { code: "invalid_input", message: "idempotencyKey is required for lifecycle operations" },
|
|
323
364
|
};
|
|
324
|
-
let client: SdkClient | undefined;
|
|
325
365
|
try {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
let response: unknown;
|
|
331
|
-
try {
|
|
332
|
-
const timeoutMs = lifecycleRequestTimeoutMs(operation, input);
|
|
333
|
-
response = await client.global(operation, input, {
|
|
334
|
-
idempotencyKey,
|
|
335
|
-
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
336
|
-
});
|
|
337
|
-
} catch (error) {
|
|
338
|
-
if (
|
|
339
|
-
isLifecycleOperation(operation) &&
|
|
340
|
-
error instanceof SdkClientError &&
|
|
341
|
-
error.code === "uncertain_after_send" &&
|
|
342
|
-
error.details &&
|
|
343
|
-
typeof error.details === "object"
|
|
344
|
-
)
|
|
345
|
-
response = await client.lookupLifecycle(error.details as SdkSentRecord);
|
|
346
|
-
else throw error;
|
|
366
|
+
if (operation === "session.list") {
|
|
367
|
+
await ensureBroker({ agentDir });
|
|
368
|
+
await start();
|
|
369
|
+
return await paginatedSessionList(router, input);
|
|
347
370
|
}
|
|
348
|
-
|
|
371
|
+
if (!isLifecycleOperation(operation))
|
|
372
|
+
return {
|
|
373
|
+
ok: false,
|
|
374
|
+
error: { code: "unknown_operation", message: `Unknown global operation: ${operation}` },
|
|
375
|
+
};
|
|
376
|
+
return await runLifecycle(operation, input, idempotencyKey!);
|
|
349
377
|
} catch (error) {
|
|
350
378
|
return resultError(error);
|
|
351
|
-
} finally {
|
|
352
|
-
await client?.close();
|
|
353
379
|
}
|
|
354
380
|
}
|
|
355
381
|
return { ok: false, error: { code: "unknown_tool", message: `Unknown SDK MCP tool: ${name}` } };
|
|
@@ -381,71 +407,83 @@ export function createSdkMcpServer(options: SdkMcpServerOptions = {}) {
|
|
|
381
407
|
return { jsonrpc: "2.0", id, error: { code: -32601, message: `unknown_method:${request.method}` } };
|
|
382
408
|
}
|
|
383
409
|
|
|
384
|
-
return {
|
|
410
|
+
return {
|
|
411
|
+
callTool,
|
|
412
|
+
handleJsonRpc,
|
|
413
|
+
handle: handleJsonRpc,
|
|
414
|
+
start,
|
|
415
|
+
close,
|
|
416
|
+
tools: SDK_MCP_TOOL_NAMES.map(schema),
|
|
417
|
+
};
|
|
385
418
|
}
|
|
386
419
|
|
|
387
420
|
/**
|
|
388
421
|
* Runs the SDK MCP server over stdio (newline-delimited JSON-RPC), the shipped
|
|
389
|
-
* `gjc mcp-serve sdk` entrypoint.
|
|
390
|
-
*
|
|
422
|
+
* `gjc mcp-serve sdk` entrypoint. SessionRouter owns live endpoint authority and starts lazily
|
|
423
|
+
* on the first live-session tool, then stops after stdin and in-flight requests drain.
|
|
391
424
|
*/
|
|
392
425
|
export async function runSdkMcpStdio(options: SdkMcpServerOptions = {}): Promise<void> {
|
|
393
426
|
const server = createSdkMcpServer(options);
|
|
394
427
|
let buffer = "";
|
|
395
428
|
const inflight = new Set<Promise<void>>();
|
|
396
|
-
|
|
429
|
+
try {
|
|
430
|
+
process.stdin.setEncoding("utf8");
|
|
397
431
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
await new Promise<void>((resolve, reject) => {
|
|
404
|
-
const onData = (chunk: string) => {
|
|
405
|
-
buffer += chunk;
|
|
406
|
-
let index = buffer.indexOf("\n");
|
|
407
|
-
while (index >= 0) {
|
|
408
|
-
const line = buffer.slice(0, index).trim();
|
|
409
|
-
buffer = buffer.slice(index + 1);
|
|
410
|
-
index = buffer.indexOf("\n");
|
|
411
|
-
if (!line) continue;
|
|
412
|
-
track(
|
|
413
|
-
(async () => {
|
|
414
|
-
let request: JsonRpcRequest;
|
|
415
|
-
try {
|
|
416
|
-
request = JSON.parse(line) as JsonRpcRequest;
|
|
417
|
-
} catch {
|
|
418
|
-
process.stdout.write(
|
|
419
|
-
`${JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "parse_error" } })}\n`,
|
|
420
|
-
);
|
|
421
|
-
return;
|
|
422
|
-
}
|
|
423
|
-
const response = await server.handleJsonRpc(request);
|
|
424
|
-
// JSON-RPC notifications (no id) receive no response.
|
|
425
|
-
if (request.id !== undefined) process.stdout.write(`${JSON.stringify(response)}\n`);
|
|
426
|
-
})(),
|
|
427
|
-
);
|
|
428
|
-
}
|
|
432
|
+
const track = (work: Promise<void>): void => {
|
|
433
|
+
inflight.add(work);
|
|
434
|
+
void work.finally(() => inflight.delete(work));
|
|
429
435
|
};
|
|
430
|
-
const onEnd = () => {
|
|
431
|
-
process.stdin.off("data", onData);
|
|
432
|
-
process.stdin.off("end", onEnd);
|
|
433
|
-
process.stdin.off("error", onError);
|
|
434
|
-
resolve();
|
|
435
|
-
};
|
|
436
|
-
const onError = (error: Error) => {
|
|
437
|
-
process.stdin.off("data", onData);
|
|
438
|
-
process.stdin.off("end", onEnd);
|
|
439
|
-
process.stdin.off("error", onError);
|
|
440
|
-
reject(error);
|
|
441
|
-
};
|
|
442
|
-
process.stdin.on("data", onData);
|
|
443
|
-
process.stdin.on("end", onEnd);
|
|
444
|
-
process.stdin.on("error", onError);
|
|
445
|
-
});
|
|
446
436
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
437
|
+
const stdinDone = Promise.withResolvers<void>();
|
|
438
|
+
{
|
|
439
|
+
const onData = (chunk: string) => {
|
|
440
|
+
buffer += chunk;
|
|
441
|
+
let index = buffer.indexOf("\n");
|
|
442
|
+
while (index >= 0) {
|
|
443
|
+
const line = buffer.slice(0, index).trim();
|
|
444
|
+
buffer = buffer.slice(index + 1);
|
|
445
|
+
index = buffer.indexOf("\n");
|
|
446
|
+
if (!line) continue;
|
|
447
|
+
track(
|
|
448
|
+
(async () => {
|
|
449
|
+
let request: JsonRpcRequest;
|
|
450
|
+
try {
|
|
451
|
+
request = JSON.parse(line) as JsonRpcRequest;
|
|
452
|
+
} catch {
|
|
453
|
+
process.stdout.write(
|
|
454
|
+
`${JSON.stringify({ jsonrpc: "2.0", id: null, error: { code: -32700, message: "parse_error" } })}\n`,
|
|
455
|
+
);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
const response = await server.handleJsonRpc(request);
|
|
459
|
+
// JSON-RPC notifications (no id) receive no response.
|
|
460
|
+
if (request.id !== undefined) process.stdout.write(`${JSON.stringify(response)}\n`);
|
|
461
|
+
})(),
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
const onEnd = () => {
|
|
466
|
+
process.stdin.off("data", onData);
|
|
467
|
+
process.stdin.off("end", onEnd);
|
|
468
|
+
process.stdin.off("error", onError);
|
|
469
|
+
stdinDone.resolve();
|
|
470
|
+
};
|
|
471
|
+
const onError = (error: Error) => {
|
|
472
|
+
process.stdin.off("data", onData);
|
|
473
|
+
process.stdin.off("end", onEnd);
|
|
474
|
+
process.stdin.off("error", onError);
|
|
475
|
+
stdinDone.reject(error);
|
|
476
|
+
};
|
|
477
|
+
process.stdin.on("data", onData);
|
|
478
|
+
process.stdin.on("end", onEnd);
|
|
479
|
+
process.stdin.on("error", onError);
|
|
480
|
+
}
|
|
481
|
+
await stdinDone.promise;
|
|
482
|
+
|
|
483
|
+
// Stdin EOF must not drop in-flight tools/call handlers (WS connect/query).
|
|
484
|
+
// Awaiting them also prevents the process from exiting before responses flush.
|
|
485
|
+
await Promise.allSettled([...inflight]);
|
|
486
|
+
} finally {
|
|
487
|
+
await server.close();
|
|
488
|
+
}
|
|
451
489
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded progress-aware lease for the SDK prompt terminal deadline (#4334).
|
|
3
|
+
*
|
|
4
|
+
* The accepted prompt deadline is no longer a fixed wall-clock window from
|
|
5
|
+
* acceptance: fresh *attributable* progress — tool/skill execution events
|
|
6
|
+
* correlated to the exact accepted `commandId`/`turnId` at the prompt/agent
|
|
7
|
+
* runtime boundary — renews the terminal deadline up to a deterministic hard
|
|
8
|
+
* maximum runtime. Unrelated session noise, heartbeats, other turns, streaming
|
|
9
|
+
* chatter, and retry bookkeeping never renew the lease, and there is no
|
|
10
|
+
* unbounded disable value: `maxMs` is always a finite bound.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** Agent session event types that constitute attributable agent/skill/tool progress. */
|
|
14
|
+
const ATTRIBUTABLE_PROGRESS_EVENT_TYPES = new Set(["tool_execution_start", "tool_execution_end"]);
|
|
15
|
+
|
|
16
|
+
export interface PromptDeadlineLease {
|
|
17
|
+
/** When the prompt was accepted; anchors the hard maximum runtime. */
|
|
18
|
+
readonly acceptedAt: number;
|
|
19
|
+
/** Last verified attributable progress (starts at acceptance). */
|
|
20
|
+
lastProgressAt: number;
|
|
21
|
+
/** Inactivity window: the deadline is this far past the last verified progress. */
|
|
22
|
+
readonly leaseMs: number;
|
|
23
|
+
/** Deterministic hard maximum runtime from acceptance; never unbounded. */
|
|
24
|
+
readonly maxMs: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createPromptDeadlineLease(input: { now: number; leaseMs: number; maxMs: number }): PromptDeadlineLease {
|
|
28
|
+
return { acceptedAt: input.now, lastProgressAt: input.now, leaseMs: input.leaseMs, maxMs: input.maxMs };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Current terminal deadline: the inactivity lease from last verified progress,
|
|
33
|
+
* bounded by the hard maximum runtime from acceptance.
|
|
34
|
+
*/
|
|
35
|
+
export function promptDeadlineAt(lease: PromptDeadlineLease): number {
|
|
36
|
+
return Math.min(lease.lastProgressAt + lease.leaseMs, lease.acceptedAt + lease.maxMs);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Record fresh attributable progress. Monotonic: a stale or equal timestamp
|
|
41
|
+
* never moves the lease backwards, so out-of-order delivery cannot shorten it.
|
|
42
|
+
*/
|
|
43
|
+
export function recordAttributableProgress(lease: PromptDeadlineLease, now: number): void {
|
|
44
|
+
if (now > lease.lastProgressAt) lease.lastProgressAt = now;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Whether an agent session event at the prompt/agent runtime boundary is
|
|
49
|
+
* attributable progress for the accepted prompt. Only tool execution
|
|
50
|
+
* boundaries qualify: skills do their work through tools, so skill progress is
|
|
51
|
+
* covered; streaming text/thinking deltas, retries, and bookkeeping are not.
|
|
52
|
+
*/
|
|
53
|
+
export function isAttributableProgressEventType(type: string): boolean {
|
|
54
|
+
return ATTRIBUTABLE_PROGRESS_EVENT_TYPES.has(type);
|
|
55
|
+
}
|