@gajae-code/coding-agent 0.13.3 → 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 +184 -2
- 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 +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- 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 +1 -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/gajae-pet-widget.d.ts +8 -30
- 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 +11 -25
- 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/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 +40 -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 +9 -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 +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- 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/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 +40 -32
- package/src/main.ts +32 -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/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/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- 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 +177 -72
- 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/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 +2857 -582
- 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 +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- 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 +98 -16
- 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 +27 -16
- 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/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
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
SessionListTraversalError,
|
|
4
|
+
type SessionListTraversalPage,
|
|
5
|
+
sessionListPageFromResponse,
|
|
6
|
+
traverseSessionList,
|
|
7
|
+
} from "../session-list";
|
|
8
|
+
|
|
9
|
+
export type SessionLifecycleOperation =
|
|
10
|
+
| "session.create"
|
|
11
|
+
| "session.fork"
|
|
12
|
+
| "session.resume"
|
|
13
|
+
| "session.close"
|
|
14
|
+
| "session.delete"
|
|
15
|
+
| "session.list";
|
|
16
|
+
|
|
17
|
+
export interface SessionLifecycleActor {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly namespace: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface SessionLifecycleClientRequestOptions {
|
|
23
|
+
readonly idempotencyKey?: string;
|
|
24
|
+
readonly timeoutMs?: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** The deliberately small client surface needed by the lifecycle facade. */
|
|
28
|
+
export interface SessionLifecycleClient {
|
|
29
|
+
global(
|
|
30
|
+
operation: SessionLifecycleOperation,
|
|
31
|
+
input: Record<string, unknown>,
|
|
32
|
+
options: SessionLifecycleClientRequestOptions,
|
|
33
|
+
): Promise<unknown>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface SessionLifecycleWorktreeTarget {
|
|
37
|
+
readonly enabled: true;
|
|
38
|
+
readonly name?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface SessionLifecycleTranscriptIdentity {
|
|
42
|
+
readonly dev: string;
|
|
43
|
+
readonly ino: string;
|
|
44
|
+
readonly size: number;
|
|
45
|
+
readonly mtimeMs: number;
|
|
46
|
+
readonly mtimeNs: string;
|
|
47
|
+
readonly sha256: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface SessionLifecycleSavedSessionIdentity extends SessionLifecycleTranscriptIdentity {
|
|
51
|
+
readonly nlink: string;
|
|
52
|
+
readonly ctimeNs: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface SessionLifecycleSavedSession {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly path: string;
|
|
58
|
+
readonly identity: SessionLifecycleSavedSessionIdentity;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface SessionLifecycleCoordinatorTarget {
|
|
62
|
+
readonly coordinatorStateDir?: string;
|
|
63
|
+
readonly coordinatorSessionId?: string;
|
|
64
|
+
readonly coordinatorSessionBranch?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface SessionCreateTarget extends SessionLifecycleCoordinatorTarget {
|
|
68
|
+
readonly cwd: string;
|
|
69
|
+
readonly stateRoot?: string;
|
|
70
|
+
readonly body?: string;
|
|
71
|
+
readonly modelPreset?: string;
|
|
72
|
+
readonly mcpServers?: readonly Record<string, unknown>[];
|
|
73
|
+
readonly worktree?: SessionLifecycleWorktreeTarget;
|
|
74
|
+
readonly readiness?: "immediate" | "deferred";
|
|
75
|
+
readonly readinessTimeoutMs?: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface SessionForkTarget extends SessionLifecycleCoordinatorTarget {
|
|
79
|
+
readonly cwd: string;
|
|
80
|
+
readonly stateRoot?: string;
|
|
81
|
+
readonly sourceSessionId?: string;
|
|
82
|
+
readonly sourceSessionPath?: string;
|
|
83
|
+
readonly sourceSessionIdentity?: SessionLifecycleTranscriptIdentity;
|
|
84
|
+
readonly body?: string;
|
|
85
|
+
readonly modelPreset?: string;
|
|
86
|
+
readonly mcpServers?: readonly Record<string, unknown>[];
|
|
87
|
+
readonly worktree?: SessionLifecycleWorktreeTarget;
|
|
88
|
+
readonly readinessTimeoutMs?: number;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface SessionResumeTarget extends SessionLifecycleCoordinatorTarget {
|
|
92
|
+
readonly sessionId: string;
|
|
93
|
+
readonly cwd?: string;
|
|
94
|
+
readonly stateRoot?: string;
|
|
95
|
+
readonly sessionPath?: string;
|
|
96
|
+
readonly sessionIdentity?: SessionLifecycleTranscriptIdentity;
|
|
97
|
+
readonly body?: string;
|
|
98
|
+
readonly modelPreset?: string;
|
|
99
|
+
readonly mcpServers?: readonly Record<string, unknown>[];
|
|
100
|
+
readonly worktree?: SessionLifecycleWorktreeTarget;
|
|
101
|
+
readonly readinessTimeoutMs?: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface SessionCloseTarget {
|
|
105
|
+
readonly sessionId: string;
|
|
106
|
+
readonly endpointGeneration?: number;
|
|
107
|
+
readonly endpointIncarnation?: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface SessionDeleteTarget {
|
|
111
|
+
readonly sessionId: string;
|
|
112
|
+
readonly cwd?: string;
|
|
113
|
+
readonly stateRoot?: string;
|
|
114
|
+
readonly sessionPath?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface SessionListTarget {
|
|
118
|
+
readonly cwd?: string;
|
|
119
|
+
readonly resolveSessionId?: string;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
interface SessionLifecycleMutationRequestBase<
|
|
123
|
+
TOperation extends Exclude<SessionLifecycleOperation, "session.list">,
|
|
124
|
+
TTarget,
|
|
125
|
+
> {
|
|
126
|
+
readonly operation: TOperation;
|
|
127
|
+
readonly actor: SessionLifecycleActor;
|
|
128
|
+
readonly capability: TOperation;
|
|
129
|
+
readonly requestKey: string;
|
|
130
|
+
readonly target: TTarget;
|
|
131
|
+
readonly timeoutMs?: number;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export type SessionCreateRequest = SessionLifecycleMutationRequestBase<"session.create", SessionCreateTarget>;
|
|
135
|
+
export type SessionForkRequest = SessionLifecycleMutationRequestBase<"session.fork", SessionForkTarget>;
|
|
136
|
+
export type SessionResumeRequest = SessionLifecycleMutationRequestBase<"session.resume", SessionResumeTarget>;
|
|
137
|
+
export type SessionCloseRequest = SessionLifecycleMutationRequestBase<"session.close", SessionCloseTarget>;
|
|
138
|
+
export type SessionDeleteRequest = SessionLifecycleMutationRequestBase<"session.delete", SessionDeleteTarget>;
|
|
139
|
+
export interface SessionListRequest {
|
|
140
|
+
readonly operation: "session.list";
|
|
141
|
+
readonly actor: SessionLifecycleActor;
|
|
142
|
+
readonly capability: "session.list";
|
|
143
|
+
readonly target?: SessionListTarget;
|
|
144
|
+
readonly timeoutMs?: number;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export type SessionLifecycleRequest = SessionLifecycleMutationRequest | SessionListRequest;
|
|
148
|
+
|
|
149
|
+
export type SessionLifecycleMutationRequest =
|
|
150
|
+
| SessionCreateRequest
|
|
151
|
+
| SessionForkRequest
|
|
152
|
+
| SessionResumeRequest
|
|
153
|
+
| SessionCloseRequest
|
|
154
|
+
| SessionDeleteRequest;
|
|
155
|
+
|
|
156
|
+
export type SessionLifecycleCertainty = "terminal" | "retryable" | "cleanup_pending" | "uncertain";
|
|
157
|
+
|
|
158
|
+
export interface SessionLifecycleSessionResult {
|
|
159
|
+
readonly sessionId: string;
|
|
160
|
+
readonly cwd?: string;
|
|
161
|
+
readonly endpointGeneration?: number;
|
|
162
|
+
readonly reused?: boolean;
|
|
163
|
+
readonly note?: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface SessionLifecycleListEntry {
|
|
167
|
+
readonly sessionId: string;
|
|
168
|
+
readonly live?: boolean;
|
|
169
|
+
readonly endpointGeneration?: number;
|
|
170
|
+
readonly terminalUncertain?: boolean;
|
|
171
|
+
readonly repo?: string;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export interface SessionLifecycleListResult {
|
|
175
|
+
readonly indexSeq: number;
|
|
176
|
+
readonly sessions: readonly SessionLifecycleListEntry[];
|
|
177
|
+
readonly warnings: readonly string[];
|
|
178
|
+
readonly savedSession?: SessionLifecycleSavedSession;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface SessionCreateResult {
|
|
182
|
+
readonly ok: true;
|
|
183
|
+
readonly operation: "session.create";
|
|
184
|
+
readonly result: SessionLifecycleSessionResult;
|
|
185
|
+
}
|
|
186
|
+
export interface SessionForkResult {
|
|
187
|
+
readonly ok: true;
|
|
188
|
+
readonly operation: "session.fork";
|
|
189
|
+
readonly result: SessionLifecycleSessionResult;
|
|
190
|
+
}
|
|
191
|
+
export interface SessionResumeResult {
|
|
192
|
+
readonly ok: true;
|
|
193
|
+
readonly operation: "session.resume";
|
|
194
|
+
readonly result: SessionLifecycleSessionResult;
|
|
195
|
+
}
|
|
196
|
+
export interface SessionCloseResult {
|
|
197
|
+
readonly ok: true;
|
|
198
|
+
readonly operation: "session.close";
|
|
199
|
+
readonly result: SessionLifecycleSessionResult;
|
|
200
|
+
}
|
|
201
|
+
export interface SessionDeleteResult {
|
|
202
|
+
readonly ok: true;
|
|
203
|
+
readonly operation: "session.delete";
|
|
204
|
+
readonly result: SessionLifecycleSessionResult;
|
|
205
|
+
}
|
|
206
|
+
export interface SessionListSuccessResult {
|
|
207
|
+
readonly ok: true;
|
|
208
|
+
readonly operation: "session.list";
|
|
209
|
+
readonly result: SessionLifecycleListResult;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export interface SessionLifecycleError {
|
|
213
|
+
readonly code: string;
|
|
214
|
+
readonly message: string;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export type SessionCreateFailure = {
|
|
218
|
+
readonly ok: false;
|
|
219
|
+
readonly operation: "session.create";
|
|
220
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
221
|
+
readonly error: SessionLifecycleError;
|
|
222
|
+
};
|
|
223
|
+
export type SessionForkFailure = {
|
|
224
|
+
readonly ok: false;
|
|
225
|
+
readonly operation: "session.fork";
|
|
226
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
227
|
+
readonly error: SessionLifecycleError;
|
|
228
|
+
};
|
|
229
|
+
export type SessionResumeFailure = {
|
|
230
|
+
readonly ok: false;
|
|
231
|
+
readonly operation: "session.resume";
|
|
232
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
233
|
+
readonly error: SessionLifecycleError;
|
|
234
|
+
};
|
|
235
|
+
export type SessionCloseFailure = {
|
|
236
|
+
readonly ok: false;
|
|
237
|
+
readonly operation: "session.close";
|
|
238
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
239
|
+
readonly error: SessionLifecycleError;
|
|
240
|
+
};
|
|
241
|
+
export type SessionDeleteFailure = {
|
|
242
|
+
readonly ok: false;
|
|
243
|
+
readonly operation: "session.delete";
|
|
244
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
245
|
+
readonly error: SessionLifecycleError;
|
|
246
|
+
};
|
|
247
|
+
export type SessionListFailure = {
|
|
248
|
+
readonly ok: false;
|
|
249
|
+
readonly operation: "session.list";
|
|
250
|
+
readonly certainty: SessionLifecycleCertainty;
|
|
251
|
+
readonly error: SessionLifecycleError;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
export type SessionCreateOutcome = SessionCreateResult | SessionCreateFailure;
|
|
255
|
+
export type SessionForkOutcome = SessionForkResult | SessionForkFailure;
|
|
256
|
+
export type SessionResumeOutcome = SessionResumeResult | SessionResumeFailure;
|
|
257
|
+
export type SessionCloseOutcome = SessionCloseResult | SessionCloseFailure;
|
|
258
|
+
export type SessionDeleteOutcome = SessionDeleteResult | SessionDeleteFailure;
|
|
259
|
+
export type SessionListOutcome = SessionListSuccessResult | SessionListFailure;
|
|
260
|
+
export type SessionLifecycleResult =
|
|
261
|
+
| SessionCreateOutcome
|
|
262
|
+
| SessionForkOutcome
|
|
263
|
+
| SessionResumeOutcome
|
|
264
|
+
| SessionCloseOutcome
|
|
265
|
+
| SessionDeleteOutcome
|
|
266
|
+
| SessionListOutcome;
|
|
267
|
+
|
|
268
|
+
/** Shared, side-effect-free validation for lifecycle mutation requests. */
|
|
269
|
+
export type SessionLifecycleMutationValidation =
|
|
270
|
+
| {
|
|
271
|
+
readonly ok: true;
|
|
272
|
+
readonly operation: Exclude<SessionLifecycleOperation, "session.list">;
|
|
273
|
+
readonly actor: SessionLifecycleActor;
|
|
274
|
+
readonly requestKey: string;
|
|
275
|
+
readonly target: Readonly<Record<string, unknown>>;
|
|
276
|
+
}
|
|
277
|
+
| SessionCreateFailure
|
|
278
|
+
| SessionForkFailure
|
|
279
|
+
| SessionResumeFailure
|
|
280
|
+
| SessionCloseFailure
|
|
281
|
+
| SessionDeleteFailure;
|
|
282
|
+
|
|
283
|
+
const RETRYABLE_BROKER_ERRORS = new Set([
|
|
284
|
+
"unavailable",
|
|
285
|
+
"broker_restarting",
|
|
286
|
+
"readiness_timeout",
|
|
287
|
+
"startup_admission_timeout",
|
|
288
|
+
]);
|
|
289
|
+
|
|
290
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
291
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function canonicalJson(value: unknown): string {
|
|
295
|
+
if (value === null) return "null";
|
|
296
|
+
if (typeof value === "string" || typeof value === "boolean" || typeof value === "number")
|
|
297
|
+
return JSON.stringify(value);
|
|
298
|
+
if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
|
|
299
|
+
if (isRecord(value)) {
|
|
300
|
+
return `{${Object.keys(value)
|
|
301
|
+
.filter(key => value[key] !== undefined)
|
|
302
|
+
.sort()
|
|
303
|
+
.map(key => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
|
|
304
|
+
.join(",")}}`;
|
|
305
|
+
}
|
|
306
|
+
return JSON.stringify(String(value));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** Derives a stable Broker idempotency key without exposing caller identity to Broker inputs. */
|
|
310
|
+
export function deriveSessionLifecycleIdempotencyKey(
|
|
311
|
+
actor: SessionLifecycleActor,
|
|
312
|
+
requestKey: string,
|
|
313
|
+
operation: SessionLifecycleOperation,
|
|
314
|
+
): string {
|
|
315
|
+
const identity = {
|
|
316
|
+
actorNamespace: actor.namespace,
|
|
317
|
+
actorId: actor.id,
|
|
318
|
+
requestKey,
|
|
319
|
+
operation,
|
|
320
|
+
};
|
|
321
|
+
return createHash("sha256").update(canonicalJson(identity), "utf8").digest("hex");
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function operationOf(value: unknown): SessionLifecycleOperation {
|
|
325
|
+
if (
|
|
326
|
+
value === "session.create" ||
|
|
327
|
+
value === "session.fork" ||
|
|
328
|
+
value === "session.resume" ||
|
|
329
|
+
value === "session.close" ||
|
|
330
|
+
value === "session.delete" ||
|
|
331
|
+
value === "session.list"
|
|
332
|
+
)
|
|
333
|
+
return value;
|
|
334
|
+
return "session.list";
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function failure<TOperation extends SessionLifecycleOperation>(
|
|
338
|
+
operation: TOperation,
|
|
339
|
+
certainty: SessionLifecycleCertainty,
|
|
340
|
+
code: string,
|
|
341
|
+
message: string,
|
|
342
|
+
): {
|
|
343
|
+
ok: false;
|
|
344
|
+
operation: TOperation;
|
|
345
|
+
certainty: SessionLifecycleCertainty;
|
|
346
|
+
error: SessionLifecycleError;
|
|
347
|
+
} {
|
|
348
|
+
return { ok: false, operation, certainty, error: { code, message } };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function validActor(actor: unknown): actor is SessionLifecycleActor {
|
|
352
|
+
return (
|
|
353
|
+
isRecord(actor) &&
|
|
354
|
+
typeof actor.id === "string" &&
|
|
355
|
+
actor.id.length > 0 &&
|
|
356
|
+
typeof actor.namespace === "string" &&
|
|
357
|
+
actor.namespace.length > 0
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function validRequestKey(requestKey: unknown): requestKey is string {
|
|
362
|
+
return typeof requestKey === "string" && requestKey.length > 0;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function validTarget(target: unknown): target is Readonly<Record<string, unknown>> {
|
|
366
|
+
return isRecord(target);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Validates lifecycle authority and shape without contacting the Broker. */
|
|
370
|
+
export function validateSessionLifecycleMutationRequest(request: unknown): SessionLifecycleMutationValidation {
|
|
371
|
+
const record = isRecord(request) ? request : {};
|
|
372
|
+
const operation = operationOf(record.operation);
|
|
373
|
+
if (operation === "session.list")
|
|
374
|
+
return failure("session.create", "terminal", "invalid_request", "lifecycle mutation operation is required");
|
|
375
|
+
if (!validActor(record.actor))
|
|
376
|
+
return failure(operation, "terminal", "unauthorized", "authenticated actor is required");
|
|
377
|
+
if (!validRequestKey(record.requestKey))
|
|
378
|
+
return failure(operation, "terminal", "invalid_request", "requestKey is required");
|
|
379
|
+
if (record.capability !== operation)
|
|
380
|
+
return failure(operation, "terminal", "capability_denied", `capability does not authorize ${operation}`);
|
|
381
|
+
if (!validTarget(record.target))
|
|
382
|
+
return failure(operation, "terminal", "invalid_request", "target must be an object");
|
|
383
|
+
return {
|
|
384
|
+
ok: true,
|
|
385
|
+
operation,
|
|
386
|
+
actor: record.actor,
|
|
387
|
+
requestKey: record.requestKey,
|
|
388
|
+
target: record.target,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function certaintyForBrokerCode(code: string): SessionLifecycleCertainty {
|
|
393
|
+
if (code === "terminal_uncertain") return "uncertain";
|
|
394
|
+
if (code === "cleanup_pending") return "cleanup_pending";
|
|
395
|
+
if (RETRYABLE_BROKER_ERRORS.has(code)) return "retryable";
|
|
396
|
+
return "terminal";
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function credentialFreeRecord(value: Record<string, unknown>): Record<string, unknown> {
|
|
400
|
+
const output: Record<string, unknown> = {};
|
|
401
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
402
|
+
if (key === "endpoint" || key === "token" || key === "url") continue;
|
|
403
|
+
if (isRecord(nested)) output[key] = credentialFreeRecord(nested);
|
|
404
|
+
else if (Array.isArray(nested))
|
|
405
|
+
output[key] = nested.map(item => (isRecord(item) ? credentialFreeRecord(item) : item));
|
|
406
|
+
else output[key] = nested;
|
|
407
|
+
}
|
|
408
|
+
return output;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
function sessionResult(value: unknown, expectedSessionId?: string): SessionLifecycleSessionResult | undefined {
|
|
412
|
+
if (!isRecord(value)) return undefined;
|
|
413
|
+
const record = credentialFreeRecord(value);
|
|
414
|
+
const sessionId = typeof record.sessionId === "string" ? record.sessionId : undefined;
|
|
415
|
+
if (!sessionId || (expectedSessionId !== undefined && sessionId !== expectedSessionId)) return undefined;
|
|
416
|
+
const result: {
|
|
417
|
+
sessionId: string;
|
|
418
|
+
cwd?: string;
|
|
419
|
+
endpointGeneration?: number;
|
|
420
|
+
reused?: boolean;
|
|
421
|
+
note?: string;
|
|
422
|
+
} = { sessionId };
|
|
423
|
+
if (typeof record.cwd === "string") result.cwd = record.cwd;
|
|
424
|
+
if (typeof record.endpointGeneration === "number") result.endpointGeneration = record.endpointGeneration;
|
|
425
|
+
if (typeof record.reused === "boolean") result.reused = record.reused;
|
|
426
|
+
if (typeof record.note === "string") result.note = record.note;
|
|
427
|
+
return result;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
function savedSessionTranscriptIdentity(value: unknown): SessionLifecycleSavedSessionIdentity | undefined {
|
|
431
|
+
if (!isRecord(value)) return undefined;
|
|
432
|
+
const { dev, ino, nlink, size, mtimeMs, mtimeNs, ctimeNs, sha256 } = value;
|
|
433
|
+
if (
|
|
434
|
+
typeof dev !== "string" ||
|
|
435
|
+
!/^\d+$/.test(dev) ||
|
|
436
|
+
typeof ino !== "string" ||
|
|
437
|
+
!/^\d+$/.test(ino) ||
|
|
438
|
+
typeof nlink !== "string" ||
|
|
439
|
+
!/^\d+$/.test(nlink) ||
|
|
440
|
+
typeof size !== "number" ||
|
|
441
|
+
!Number.isSafeInteger(size) ||
|
|
442
|
+
size < 0 ||
|
|
443
|
+
typeof mtimeMs !== "number" ||
|
|
444
|
+
!Number.isFinite(mtimeMs) ||
|
|
445
|
+
mtimeMs < 0 ||
|
|
446
|
+
typeof mtimeNs !== "string" ||
|
|
447
|
+
!/^\d+$/.test(mtimeNs) ||
|
|
448
|
+
typeof ctimeNs !== "string" ||
|
|
449
|
+
!/^\d+$/.test(ctimeNs) ||
|
|
450
|
+
typeof sha256 !== "string" ||
|
|
451
|
+
!/^[a-f0-9]{64}$/.test(sha256)
|
|
452
|
+
)
|
|
453
|
+
return undefined;
|
|
454
|
+
return { dev, ino, nlink, size, mtimeMs, mtimeNs, ctimeNs, sha256 };
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function savedSessionFromResult(value: unknown): SessionLifecycleSavedSession | undefined {
|
|
458
|
+
if (!isRecord(value)) return undefined;
|
|
459
|
+
const identity = savedSessionTranscriptIdentity(value.identity);
|
|
460
|
+
if (typeof value.id !== "string" || typeof value.path !== "string" || value.path.length === 0 || !identity)
|
|
461
|
+
return undefined;
|
|
462
|
+
return { id: value.id, path: value.path, identity };
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function listResult(value: unknown): SessionLifecycleListResult | undefined {
|
|
466
|
+
if (!isRecord(value) || !Array.isArray(value.sessions)) return undefined;
|
|
467
|
+
const indexSeq = value.indexSeq;
|
|
468
|
+
if (
|
|
469
|
+
typeof indexSeq !== "number" ||
|
|
470
|
+
!Number.isSafeInteger(indexSeq) ||
|
|
471
|
+
indexSeq < 0 ||
|
|
472
|
+
!Array.isArray(value.warnings)
|
|
473
|
+
)
|
|
474
|
+
return undefined;
|
|
475
|
+
const sessions: SessionLifecycleListEntry[] = [];
|
|
476
|
+
for (const entry of value.sessions) {
|
|
477
|
+
if (!isRecord(entry) || typeof entry.sessionId !== "string") return undefined;
|
|
478
|
+
const item: {
|
|
479
|
+
sessionId: string;
|
|
480
|
+
live?: boolean;
|
|
481
|
+
endpointGeneration?: number;
|
|
482
|
+
terminalUncertain?: boolean;
|
|
483
|
+
repo?: string;
|
|
484
|
+
} = { sessionId: entry.sessionId };
|
|
485
|
+
if (typeof entry.live === "boolean") item.live = entry.live;
|
|
486
|
+
if (typeof entry.endpointGeneration === "number") item.endpointGeneration = entry.endpointGeneration;
|
|
487
|
+
if (typeof entry.terminalUncertain === "boolean") item.terminalUncertain = entry.terminalUncertain;
|
|
488
|
+
if (isRecord(entry.locator) && typeof entry.locator.repo === "string") item.repo = entry.locator.repo;
|
|
489
|
+
sessions.push(item);
|
|
490
|
+
}
|
|
491
|
+
const warnings: string[] = [];
|
|
492
|
+
for (const warning of value.warnings) {
|
|
493
|
+
if (typeof warning !== "string") return undefined;
|
|
494
|
+
warnings.push(warning);
|
|
495
|
+
}
|
|
496
|
+
const savedSessionPresent = Object.hasOwn(value, "savedSession");
|
|
497
|
+
const savedSession = savedSessionPresent ? savedSessionFromResult(value.savedSession) : undefined;
|
|
498
|
+
if (savedSessionPresent && !savedSession) return undefined;
|
|
499
|
+
return { indexSeq, sessions, warnings, ...(savedSession ? { savedSession } : {}) };
|
|
500
|
+
}
|
|
501
|
+
type LifecycleListPage = {
|
|
502
|
+
readonly result: SessionLifecycleListResult;
|
|
503
|
+
readonly sessions: readonly SessionLifecycleListEntry[];
|
|
504
|
+
readonly continuationCursor?: unknown;
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
function brokerError(value: unknown): { code: string; message: string } | undefined {
|
|
508
|
+
if (!isRecord(value) || value.ok !== false || !isRecord(value.error)) return undefined;
|
|
509
|
+
if (typeof value.error.code !== "string" || typeof value.error.message !== "string") return undefined;
|
|
510
|
+
return { code: value.error.code, message: value.error.message };
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
class BrokerSessionListResponseError extends Error {
|
|
514
|
+
readonly #brokerError: { readonly code: string; readonly message: string };
|
|
515
|
+
|
|
516
|
+
constructor(error: { readonly code: string; readonly message: string }) {
|
|
517
|
+
super(error.message);
|
|
518
|
+
this.name = "BrokerSessionListResponseError";
|
|
519
|
+
this.#brokerError = error;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
get brokerError(): { readonly code: string; readonly message: string } {
|
|
523
|
+
return this.#brokerError;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
function brokerErrorFromThrown(value: unknown): { code: string; message: string; requestSent?: boolean } | undefined {
|
|
528
|
+
if (!isRecord(value)) return undefined;
|
|
529
|
+
const details = isRecord(value.details) ? value.details : undefined;
|
|
530
|
+
const code =
|
|
531
|
+
typeof details?.code === "string" ? details.code : typeof value.code === "string" ? value.code : undefined;
|
|
532
|
+
if (!code) return undefined;
|
|
533
|
+
const message =
|
|
534
|
+
typeof details?.message === "string"
|
|
535
|
+
? details.message
|
|
536
|
+
: typeof value.message === "string"
|
|
537
|
+
? value.message
|
|
538
|
+
: "lifecycle broker request failed";
|
|
539
|
+
const requestSent =
|
|
540
|
+
typeof details?.requestSent === "boolean"
|
|
541
|
+
? details.requestSent
|
|
542
|
+
: typeof value.requestSent === "boolean"
|
|
543
|
+
? value.requestSent
|
|
544
|
+
: undefined;
|
|
545
|
+
return { code, message, ...(requestSent === undefined ? {} : { requestSent }) };
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
const TRANSPORT_ERROR_CODES = new Set([
|
|
549
|
+
"timeout",
|
|
550
|
+
"connection_closed",
|
|
551
|
+
"reconnect_exhausted",
|
|
552
|
+
"unavailable",
|
|
553
|
+
"protocol_error",
|
|
554
|
+
]);
|
|
555
|
+
|
|
556
|
+
function certaintyForThrownError(error: {
|
|
557
|
+
readonly code: string;
|
|
558
|
+
readonly requestSent?: boolean;
|
|
559
|
+
}): SessionLifecycleCertainty {
|
|
560
|
+
if (error.code === "protocol_error") return error.requestSent === false ? "retryable" : "uncertain";
|
|
561
|
+
if (!TRANSPORT_ERROR_CODES.has(error.code)) return certaintyForBrokerCode(error.code);
|
|
562
|
+
if (error.requestSent === false) return "retryable";
|
|
563
|
+
if (error.requestSent === true || error.code === "connection_closed") return "uncertain";
|
|
564
|
+
return "retryable";
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
function brokerSuccess(value: unknown): unknown | undefined {
|
|
568
|
+
if (!isRecord(value) || value.ok !== true) return undefined;
|
|
569
|
+
return value.result;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
export class SessionLifecycleService {
|
|
573
|
+
readonly #client: SessionLifecycleClient;
|
|
574
|
+
|
|
575
|
+
constructor(client: SessionLifecycleClient) {
|
|
576
|
+
this.#client = client;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
async execute(
|
|
580
|
+
request: SessionLifecycleMutationRequest,
|
|
581
|
+
): Promise<
|
|
582
|
+
SessionCreateOutcome | SessionForkOutcome | SessionResumeOutcome | SessionCloseOutcome | SessionDeleteOutcome
|
|
583
|
+
> {
|
|
584
|
+
const validation = validateSessionLifecycleMutationRequest(request);
|
|
585
|
+
if (!validation.ok) return validation;
|
|
586
|
+
const { operation, actor, requestKey, target } = validation;
|
|
587
|
+
const idempotencyKey = deriveSessionLifecycleIdempotencyKey(actor, requestKey, operation);
|
|
588
|
+
let response: unknown;
|
|
589
|
+
try {
|
|
590
|
+
response = await this.#client.global(
|
|
591
|
+
operation,
|
|
592
|
+
{ ...target },
|
|
593
|
+
{
|
|
594
|
+
idempotencyKey,
|
|
595
|
+
...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),
|
|
596
|
+
},
|
|
597
|
+
);
|
|
598
|
+
} catch (thrown) {
|
|
599
|
+
const error = brokerError(thrown) ?? brokerErrorFromThrown(thrown);
|
|
600
|
+
return error
|
|
601
|
+
? failure(operation, certaintyForThrownError(error), error.code, error.message)
|
|
602
|
+
: failure(operation, "retryable", "unavailable", "lifecycle broker request was unavailable");
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
const error = brokerError(response);
|
|
606
|
+
if (error) return failure(operation, certaintyForBrokerCode(error.code), error.code, error.message);
|
|
607
|
+
if (!isRecord(response) || response.ok !== true)
|
|
608
|
+
return failure(operation, "uncertain", "malformed_response", "lifecycle broker returned a malformed response");
|
|
609
|
+
const expectedSessionId =
|
|
610
|
+
operation === "session.resume" || operation === "session.close" || operation === "session.delete"
|
|
611
|
+
? typeof target.sessionId === "string"
|
|
612
|
+
? target.sessionId
|
|
613
|
+
: undefined
|
|
614
|
+
: undefined;
|
|
615
|
+
const parsed = sessionResult(brokerSuccess(response), expectedSessionId);
|
|
616
|
+
if (!parsed)
|
|
617
|
+
return failure(
|
|
618
|
+
operation,
|
|
619
|
+
"uncertain",
|
|
620
|
+
"malformed_response",
|
|
621
|
+
"lifecycle broker returned a malformed session result",
|
|
622
|
+
);
|
|
623
|
+
return { ok: true, operation, result: parsed } as
|
|
624
|
+
| SessionCreateOutcome
|
|
625
|
+
| SessionForkOutcome
|
|
626
|
+
| SessionResumeOutcome
|
|
627
|
+
| SessionCloseOutcome
|
|
628
|
+
| SessionDeleteOutcome;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
async create(request: Omit<SessionCreateRequest, "operation">): Promise<SessionCreateOutcome> {
|
|
632
|
+
return (await this.execute({ ...request, operation: "session.create" })) as SessionCreateOutcome;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
async fork(request: Omit<SessionForkRequest, "operation">): Promise<SessionForkOutcome> {
|
|
636
|
+
return (await this.execute({ ...request, operation: "session.fork" })) as SessionForkOutcome;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
async resume(request: Omit<SessionResumeRequest, "operation">): Promise<SessionResumeOutcome> {
|
|
640
|
+
return (await this.execute({ ...request, operation: "session.resume" })) as SessionResumeOutcome;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
async close(request: Omit<SessionCloseRequest, "operation">): Promise<SessionCloseOutcome> {
|
|
644
|
+
return (await this.execute({ ...request, operation: "session.close" })) as SessionCloseOutcome;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
async delete(request: Omit<SessionDeleteRequest, "operation">): Promise<SessionDeleteOutcome> {
|
|
648
|
+
return (await this.execute({ ...request, operation: "session.delete" })) as SessionDeleteOutcome;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
async list(request: Omit<SessionListRequest, "operation">): Promise<SessionListOutcome> {
|
|
652
|
+
if (!validActor((request as { actor?: unknown }).actor))
|
|
653
|
+
return failure("session.list", "terminal", "unauthorized", "authenticated actor is required");
|
|
654
|
+
if ((request as { capability?: unknown }).capability !== "session.list")
|
|
655
|
+
return failure("session.list", "terminal", "capability_denied", "capability does not authorize session.list");
|
|
656
|
+
const target = request.target ?? {};
|
|
657
|
+
if (!validTarget(target))
|
|
658
|
+
return failure("session.list", "terminal", "invalid_request", "target must be an object");
|
|
659
|
+
let pages: readonly SessionListTraversalPage<unknown, LifecycleListPage>[];
|
|
660
|
+
try {
|
|
661
|
+
pages = await traverseSessionList<Record<string, unknown>, unknown, LifecycleListPage>(
|
|
662
|
+
{ ...target },
|
|
663
|
+
async input =>
|
|
664
|
+
await this.#client.global("session.list", input, {
|
|
665
|
+
...(request.timeoutMs === undefined ? {} : { timeoutMs: request.timeoutMs }),
|
|
666
|
+
}),
|
|
667
|
+
response => {
|
|
668
|
+
const error = brokerError(response);
|
|
669
|
+
if (error) throw new BrokerSessionListResponseError(error);
|
|
670
|
+
if (!isRecord(response) || response.ok !== true) return undefined;
|
|
671
|
+
const page = sessionListPageFromResponse(response);
|
|
672
|
+
if (!page) return undefined;
|
|
673
|
+
const result = listResult(page);
|
|
674
|
+
return result
|
|
675
|
+
? { result, sessions: result.sessions, continuationCursor: page.continuationCursor }
|
|
676
|
+
: undefined;
|
|
677
|
+
},
|
|
678
|
+
);
|
|
679
|
+
} catch (thrown) {
|
|
680
|
+
if (thrown instanceof BrokerSessionListResponseError) {
|
|
681
|
+
const error = thrown.brokerError;
|
|
682
|
+
return failure("session.list", certaintyForBrokerCode(error.code), error.code, error.message);
|
|
683
|
+
}
|
|
684
|
+
if (thrown instanceof SessionListTraversalError)
|
|
685
|
+
return failure(
|
|
686
|
+
"session.list",
|
|
687
|
+
"uncertain",
|
|
688
|
+
thrown.kind === "malformed_page" ? "malformed_response" : "protocol_error",
|
|
689
|
+
thrown.kind === "malformed_page"
|
|
690
|
+
? "lifecycle broker returned a malformed list result"
|
|
691
|
+
: thrown.kind === "repeated_cursor"
|
|
692
|
+
? "session.list returned a repeated continuation cursor"
|
|
693
|
+
: "session.list exceeded the page budget",
|
|
694
|
+
);
|
|
695
|
+
const error = brokerError(thrown) ?? brokerErrorFromThrown(thrown);
|
|
696
|
+
return error
|
|
697
|
+
? failure("session.list", certaintyForThrownError(error), error.code, error.message)
|
|
698
|
+
: failure("session.list", "retryable", "unavailable", "lifecycle broker request was unavailable");
|
|
699
|
+
}
|
|
700
|
+
const firstPage = pages[0];
|
|
701
|
+
if (!firstPage)
|
|
702
|
+
return failure(
|
|
703
|
+
"session.list",
|
|
704
|
+
"uncertain",
|
|
705
|
+
"malformed_response",
|
|
706
|
+
"lifecycle broker returned a malformed list result",
|
|
707
|
+
);
|
|
708
|
+
const { result } = firstPage.page;
|
|
709
|
+
return {
|
|
710
|
+
ok: true,
|
|
711
|
+
operation: "session.list",
|
|
712
|
+
result: {
|
|
713
|
+
indexSeq: result.indexSeq,
|
|
714
|
+
sessions: pages.flatMap(page => page.page.result.sessions),
|
|
715
|
+
warnings: result.warnings,
|
|
716
|
+
...(result.savedSession === undefined ? {} : { savedSession: result.savedSession }),
|
|
717
|
+
},
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
}
|