@gajae-code/coding-agent 0.10.2 → 0.11.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 +50 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/cli/args.d.ts +4 -5
- package/dist/types/cli/daemon-cli.d.ts +12 -1
- package/dist/types/cli/notify-cli.d.ts +21 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +39 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/commands/notify.d.ts +28 -1
- package/dist/types/commands/sdk.d.ts +33 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
- package/dist/types/config/model-profile-activation.d.ts +35 -15
- package/dist/types/config/model-profiles.d.ts +11 -5
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/model-resolver.d.ts +39 -6
- package/dist/types/config/model-selector-value.d.ts +17 -0
- package/dist/types/config/models-config-schema.d.ts +10 -6
- package/dist/types/config/settings-schema.d.ts +133 -6
- package/dist/types/config/settings.d.ts +63 -35
- package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
- package/dist/types/coordinator-mcp/server.d.ts +6 -49
- package/dist/types/daemon/builtin.d.ts +6 -5
- package/dist/types/daemon/control-types.d.ts +1 -1
- package/dist/types/discovery/mcp-json.d.ts +12 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
- package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
- package/dist/types/extensibility/extensions/loader.d.ts +10 -1
- package/dist/types/extensibility/extensions/runner.d.ts +3 -3
- package/dist/types/extensibility/extensions/types.d.ts +141 -16
- package/dist/types/extensibility/hooks/types.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
- package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
- package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
- package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
- package/dist/types/harness-control-plane/operate.d.ts +5 -5
- package/dist/types/harness-control-plane/owner.d.ts +18 -4
- package/dist/types/harness-control-plane/receipts.d.ts +0 -1
- package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
- package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
- package/dist/types/harness-control-plane/types.d.ts +3 -4
- package/dist/types/lsp/index.d.ts +1 -1
- package/dist/types/main.d.ts +32 -38
- package/dist/types/modes/acp/acp-agent.d.ts +224 -53
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
- package/dist/types/modes/acp/acp-mode.d.ts +6 -15
- package/dist/types/modes/acp/permission-mode.d.ts +4 -0
- package/dist/types/modes/acp/startup-options.d.ts +6 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
- package/dist/types/modes/components/model-selector.d.ts +1 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
- package/dist/types/modes/components/settings-selector.d.ts +6 -4
- package/dist/types/modes/components/welcome.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
- package/dist/types/modes/index.d.ts +0 -4
- package/dist/types/modes/interactive-mode.d.ts +3 -0
- package/dist/types/modes/runtime-init.d.ts +2 -2
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
- package/dist/types/modes/types.d.ts +5 -0
- package/dist/types/runtime-mcp/client.d.ts +2 -0
- package/dist/types/runtime-mcp/config.d.ts +5 -1
- package/dist/types/runtime-mcp/manager.d.ts +8 -1
- package/dist/types/runtime-mcp/types.d.ts +4 -0
- package/dist/types/sdk/acp/adapter.d.ts +67 -0
- package/dist/types/sdk/acp/index.d.ts +2 -0
- package/dist/types/sdk/broker/broker.d.ts +53 -0
- package/dist/types/sdk/broker/discovery.d.ts +30 -0
- package/dist/types/sdk/broker/ensure.d.ts +33 -0
- package/dist/types/sdk/broker/identity.d.ts +3 -0
- package/dist/types/sdk/broker/index.d.ts +8 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
- package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
- package/dist/types/sdk/broker/runtime.d.ts +33 -0
- package/dist/types/sdk/broker/session-index.d.ts +57 -0
- package/dist/types/sdk/broker/state-version.d.ts +8 -0
- package/dist/types/sdk/broker/transport.d.ts +9 -0
- package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
- package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
- package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
- package/dist/types/sdk/bus/config.d.ts +274 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
- package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
- package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
- package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
- package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
- package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
- package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
- package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
- package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
- package/dist/types/sdk/bus/session-control.d.ts +83 -0
- package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
- package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
- package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
- package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
- package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
- package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
- package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
- package/dist/types/sdk/cli/index.d.ts +1 -0
- package/dist/types/sdk/cli/session-cli.d.ts +19 -0
- package/dist/types/sdk/client/client.d.ts +1 -0
- package/dist/types/sdk/client/discovery.d.ts +27 -0
- package/dist/types/sdk/client/index.d.ts +2 -0
- package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
- package/dist/types/sdk/host/control/index.d.ts +2 -0
- package/dist/types/sdk/host/control/operations.d.ts +65 -0
- package/dist/types/sdk/host/events.d.ts +35 -0
- package/dist/types/sdk/host/host.d.ts +35 -0
- package/dist/types/sdk/host/index.d.ts +4 -0
- package/dist/types/sdk/host/query/cursor.d.ts +62 -0
- package/dist/types/sdk/host/query/handlers.d.ts +70 -0
- package/dist/types/sdk/host/query/index.d.ts +3 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
- package/dist/types/sdk/host/types.d.ts +32 -0
- package/dist/types/sdk/index.d.ts +6 -0
- package/dist/types/sdk/lifecycle-session.d.ts +14 -0
- package/dist/types/sdk/mcp/index.d.ts +1 -0
- package/dist/types/sdk/mcp/server.d.ts +37 -0
- package/dist/types/sdk/models.d.ts +44 -0
- package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
- package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
- package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
- package/dist/types/sdk/startup-capability.d.ts +50 -0
- package/dist/types/session/agent-session.d.ts +114 -21
- package/dist/types/session/default-model-selection.d.ts +25 -0
- package/dist/types/session/fallback-chain-controller.d.ts +52 -0
- package/dist/types/session/session-manager.d.ts +58 -1
- package/dist/types/setup/credential-auto-import.d.ts +36 -6
- package/dist/types/tools/ask-answer-registry.d.ts +1 -1
- package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
- package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
- package/dist/types/tools/browser/launch.d.ts +22 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
- package/dist/types/tools/browser/profile-posture.d.ts +37 -0
- package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
- package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
- package/dist/types/tools/browser/registry.d.ts +19 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
- package/dist/types/tools/index.d.ts +8 -8
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +94 -0
- package/scripts/capture-notifications-settings-showcase.ts +435 -0
- package/scripts/compile-args.ts +4 -2
- package/scripts/g005-daemon-smoke.ts +4 -5
- package/scripts/g011-daemon-path-smoke.ts +5 -5
- package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
- package/scripts/generate-sdk-operation-inventory.ts +867 -0
- package/scripts/generate-telegram-baseline-manifest.ts +128 -0
- package/scripts/manifest-schema.ts +124 -0
- package/scripts/run-test-manifest.ts +153 -0
- package/scripts/run-threat-model-check.ts +157 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
- package/scripts/verify-gjc-sdk-rename.ts +90 -0
- package/src/append-only-mode.ts +1 -1
- package/src/cli/args.ts +43 -12
- package/src/cli/auth-gateway-cli.ts +2 -2
- package/src/cli/config-cli.ts +2 -1
- package/src/cli/daemon-cli.ts +63 -14
- package/src/cli/list-models.ts +1 -1
- package/src/cli/notify-cli.ts +288 -286
- package/src/cli.ts +21 -2
- package/src/commands/daemon.ts +50 -6
- package/src/commands/harness.ts +93 -36
- package/src/commands/launch.ts +5 -2
- package/src/commands/mcp-serve.ts +19 -12
- package/src/commands/notify.ts +36 -3
- package/src/commands/sdk.ts +426 -0
- package/src/commit/agentic/agent.ts +1 -0
- package/src/config/atomic-yaml-patch.ts +423 -0
- package/src/config/model-profile-activation.ts +240 -89
- package/src/config/model-profiles.ts +18 -15
- package/src/config/model-registry.ts +51 -26
- package/src/config/model-resolver.ts +138 -51
- package/src/config/model-selector-value.ts +50 -0
- package/src/config/models-config-schema.ts +14 -21
- package/src/config/settings-schema.ts +128 -10
- package/src/config/settings.ts +1120 -158
- package/src/coordinator-mcp/model-preset.ts +74 -20
- package/src/coordinator-mcp/server.ts +1597 -3052
- package/src/daemon/builtin.ts +8 -5
- package/src/daemon/control-types.ts +1 -1
- package/src/defaults/gjc/skills/team/SKILL.md +4 -4
- package/src/discovery/mcp-json.ts +327 -20
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/compact-handler.ts +3 -3
- package/src/extensibility/extensions/get-commands-handler.ts +2 -2
- package/src/extensibility/extensions/loader.ts +69 -5
- package/src/extensibility/extensions/runner.ts +112 -4
- package/src/extensibility/extensions/types.ts +176 -17
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/gjc-runtime/launch-tmux.ts +170 -86
- package/src/gjc-runtime/psmux-detect.ts +82 -4
- package/src/gjc-runtime/session-state-sidecar.ts +41 -31
- package/src/gjc-runtime/team-runtime.ts +54 -35
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
- package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
- package/src/gjc-runtime/tmux-sessions.ts +19 -13
- package/src/gjc-runtime/ultragoal-guard.ts +53 -6
- package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
- package/src/gjc-runtime/windows-powershell-command.ts +58 -0
- package/src/harness-control-plane/operate.ts +9 -9
- package/src/harness-control-plane/owner.ts +283 -39
- package/src/harness-control-plane/receipts.ts +0 -1
- package/src/harness-control-plane/sdk-transport.ts +395 -0
- package/src/harness-control-plane/session-transport.ts +94 -0
- package/src/harness-control-plane/types.ts +1 -1
- package/src/internal-urls/docs-index.generated.ts +34 -35
- package/src/lsp/client.ts +42 -6
- package/src/lsp/index.ts +2 -2
- package/src/main.ts +299 -204
- package/src/modes/DESIGN.md +258 -0
- package/src/modes/acp/acp-agent.ts +1228 -2612
- package/src/modes/acp/acp-client-bridge.ts +2 -20
- package/src/modes/acp/acp-event-mapper.ts +18 -2
- package/src/modes/acp/acp-mode.ts +8 -36
- package/src/modes/acp/permission-mode.ts +25 -0
- package/src/modes/acp/startup-options.ts +6 -0
- package/src/modes/components/agent-dashboard.ts +37 -17
- package/src/modes/components/model-selector.ts +93 -35
- package/src/modes/components/notifications-settings-editor.ts +1379 -0
- package/src/modes/components/settings-selector.ts +60 -11
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +1 -2
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +348 -4
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +59 -20
- package/src/modes/runtime-init.ts +298 -6
- package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
- package/src/modes/shared/agent-wire/event-contract.ts +7 -8
- package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
- package/src/modes/shared/agent-wire/event-observation.ts +16 -7
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
- package/src/modes/types.ts +5 -0
- package/src/runtime-mcp/client.ts +94 -19
- package/src/runtime-mcp/config.ts +27 -15
- package/src/runtime-mcp/manager.ts +343 -105
- package/src/runtime-mcp/oauth-flow.ts +42 -12
- package/src/runtime-mcp/transports/http.ts +49 -19
- package/src/runtime-mcp/transports/stdio.ts +47 -28
- package/src/runtime-mcp/types.ts +10 -0
- package/src/sdk/acp/adapter.ts +418 -0
- package/src/sdk/acp/index.ts +2 -0
- package/src/sdk/broker/broker.ts +642 -0
- package/src/sdk/broker/discovery.ts +94 -0
- package/src/sdk/broker/ensure.ts +249 -0
- package/src/sdk/broker/identity.ts +42 -0
- package/src/sdk/broker/index.ts +8 -0
- package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
- package/src/sdk/broker/internal-source.bunfig.toml +1 -0
- package/src/sdk/broker/lifecycle-ledger.ts +286 -0
- package/src/sdk/broker/lifecycle.ts +2157 -0
- package/src/sdk/broker/process-incarnation.ts +159 -0
- package/src/sdk/broker/runtime.ts +164 -0
- package/src/sdk/broker/session-index.ts +318 -0
- package/src/sdk/broker/state-version.ts +23 -0
- package/src/sdk/broker/transport.ts +125 -0
- package/src/sdk/bus/chat-command-policy.ts +107 -0
- package/src/sdk/bus/chat-daemon-cli.ts +214 -0
- package/src/sdk/bus/chat-daemon-control.ts +713 -0
- package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
- package/src/sdk/bus/chat-effect-journal.ts +353 -0
- package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
- package/src/sdk/bus/config.ts +433 -0
- package/src/sdk/bus/conversation-store.ts +391 -0
- package/src/sdk/bus/discord-conversation.ts +85 -0
- package/src/sdk/bus/discord-daemon.ts +2275 -0
- package/src/sdk/bus/discord-live-provider.ts +521 -0
- package/src/sdk/bus/discord-provider.ts +56 -0
- package/src/{notifications → sdk/bus}/html-format.ts +2 -2
- package/src/sdk/bus/index.ts +3943 -0
- package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
- package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
- package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
- package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
- package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
- package/src/sdk/bus/natives-augment.d.ts +38 -0
- package/src/sdk/bus/notification-orchestration.ts +535 -0
- package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
- package/src/sdk/bus/session-control.ts +333 -0
- package/src/sdk/bus/slack-conversation.ts +74 -0
- package/src/sdk/bus/slack-daemon.ts +2144 -0
- package/src/sdk/bus/slack-live-provider.ts +380 -0
- package/src/sdk/bus/slack-provider.ts +76 -0
- package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
- package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
- package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
- package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
- package/src/sdk/bus/telegram-setup.ts +663 -0
- package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/session-cli.ts +275 -0
- package/src/sdk/client/client.ts +1 -0
- package/src/sdk/client/discovery.ts +108 -0
- package/src/sdk/client/index.ts +2 -0
- package/src/sdk/host/control/dispatch.ts +367 -0
- package/src/sdk/host/control/index.ts +10 -0
- package/src/sdk/host/control/operations.ts +63 -0
- package/src/sdk/host/events.ts +91 -0
- package/src/sdk/host/host.ts +296 -0
- package/src/sdk/host/index.ts +4 -0
- package/src/sdk/host/query/cursor.ts +189 -0
- package/src/sdk/host/query/handlers.ts +533 -0
- package/src/sdk/host/query/index.ts +3 -0
- package/src/sdk/host/query/revision-store.ts +1126 -0
- package/src/sdk/host/reverse-leases.ts +325 -0
- package/src/sdk/host/types.ts +29 -0
- package/src/sdk/index.ts +13 -0
- package/src/sdk/lifecycle-session.ts +39 -0
- package/src/sdk/mcp/index.ts +1 -0
- package/src/sdk/mcp/server.ts +332 -0
- package/src/sdk/models.ts +168 -0
- package/src/sdk/protocol/adapter-validation.ts +48 -0
- package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
- package/src/sdk/protocol/operation-registry.ts +312 -0
- package/src/{sdk.ts → sdk/session.ts} +339 -212
- package/src/sdk/startup-capability.ts +189 -0
- package/src/session/agent-session.ts +2453 -894
- package/src/session/default-model-selection.ts +93 -0
- package/src/session/fallback-chain-controller.ts +136 -0
- package/src/session/session-manager.ts +438 -11
- package/src/session/session-storage.ts +8 -1
- package/src/setup/credential-auto-import.ts +290 -35
- package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
- package/src/slash-commands/builtin-registry.ts +2 -1
- package/src/task/executor.ts +62 -13
- package/src/tools/ask-answer-registry.ts +1 -1
- package/src/tools/ask.ts +13 -8
- package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
- package/src/tools/browser/benchmark/detector-report.ts +157 -0
- package/src/tools/browser/benchmark/run-suite.ts +39 -0
- package/src/tools/browser/launch.ts +124 -19
- package/src/tools/browser/profile-discovery.ts +63 -0
- package/src/tools/browser/profile-posture.ts +59 -0
- package/src/tools/browser/profile-reuse.ts +102 -0
- package/src/tools/browser/profile-warmup.ts +109 -0
- package/src/tools/browser/registry.ts +87 -11
- package/src/tools/browser/tab-protocol.ts +1 -0
- package/src/tools/browser/tab-supervisor.ts +1 -0
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/browser.ts +6 -0
- package/src/tools/index.ts +8 -8
- package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
- package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
- package/src/tools/telegram-send.ts +2 -2
- package/vendor/insane-search/MANIFEST.json +2 -1
- package/vendor/insane-search/engine/bias_check.py +4 -1
- package/vendor/insane-search/engine/phase0.py +26 -1
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
- package/dist/types/notifications/config.d.ts +0 -132
- package/src/harness-control-plane/rpc-adapter.ts +0 -290
- package/src/modes/bridge/auth.ts +0 -41
- package/src/modes/bridge/bridge-client-bridge.ts +0 -47
- package/src/modes/bridge/bridge-mode.ts +0 -675
- package/src/modes/bridge/bridge-ui-context.ts +0 -200
- package/src/modes/bridge/event-stream.ts +0 -70
- package/src/modes/rpc/host-tools.ts +0 -1
- package/src/modes/rpc/host-uris.ts +0 -1
- package/src/modes/rpc/rpc-client.ts +0 -1166
- package/src/modes/rpc/rpc-mode.ts +0 -1029
- package/src/modes/rpc/rpc-socket-security.ts +0 -115
- package/src/modes/rpc/rpc-types.ts +0 -637
- package/src/modes/shared/agent-wire/command-contract.ts +0 -18
- package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
- package/src/modes/shared/agent-wire/command-validation.ts +0 -181
- package/src/modes/shared/agent-wire/handshake.ts +0 -157
- package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
- package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
- package/src/modes/shared/agent-wire/protocol.ts +0 -46
- package/src/modes/shared/agent-wire/responses.ts +0 -17
- package/src/modes/shared/agent-wire/scopes.ts +0 -94
- package/src/modes/shared/agent-wire/session-registry.ts +0 -109
- package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
- package/src/modes/shared/agent-wire/ui-result.ts +0 -48
- package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
- package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
- package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
- package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
- package/src/notifications/config.ts +0 -219
- package/src/notifications/index.ts +0 -1835
- package/src/notifications/telegram-daemon-cli.ts +0 -243
- package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
- /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
- /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
- /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
- /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
- /package/src/{notifications → sdk/bus}/engine.ts +0 -0
- /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
- /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
- /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
- /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
- /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { Args, Command, Flags } from "@gajae-code/utils/cli";
|
|
5
|
+
import type { Args as ParsedArgs } from "../cli/args";
|
|
6
|
+
import { applyStartupModelProfiles, createSessionManager } from "../main";
|
|
7
|
+
import { initializeExtensions } from "../modes/runtime-init";
|
|
8
|
+
import { Broker } from "../sdk/broker/broker";
|
|
9
|
+
import {
|
|
10
|
+
type LifecycleTranscriptEvidence,
|
|
11
|
+
readSessionLifecycleLaunchRequest,
|
|
12
|
+
type SessionLifecycleLaunchRequest,
|
|
13
|
+
type SessionLifecycleTranscriptIdentity,
|
|
14
|
+
writeSessionLifecycleFailure,
|
|
15
|
+
writeSessionLifecycleReady,
|
|
16
|
+
} from "../sdk/broker/lifecycle";
|
|
17
|
+
import { processIncarnation } from "../sdk/broker/process-incarnation";
|
|
18
|
+
import { type CreateLifecycleAgentSessionResult, createLifecycleAgentSession } from "../sdk/lifecycle-session";
|
|
19
|
+
import {
|
|
20
|
+
normalizeSdkStartupFailure,
|
|
21
|
+
type SdkStartupFailure,
|
|
22
|
+
type SdkStartupRollbackResult,
|
|
23
|
+
SdkStartupRollbackTracker,
|
|
24
|
+
} from "../sdk/startup-capability";
|
|
25
|
+
|
|
26
|
+
import {
|
|
27
|
+
type CapturedSessionTranscriptSnapshot,
|
|
28
|
+
type ResumeSessionIdentity,
|
|
29
|
+
SessionManager,
|
|
30
|
+
} from "../session/session-manager";
|
|
31
|
+
|
|
32
|
+
export function lifecycleArgs(request: SessionLifecycleLaunchRequest, cwd: string, agentDir: string): ParsedArgs {
|
|
33
|
+
return {
|
|
34
|
+
messages: [],
|
|
35
|
+
fileArgs: [],
|
|
36
|
+
unknownFlags: new Map(),
|
|
37
|
+
...(request.operation === "session.resume" ? { resume: request.sessionPath } : {}),
|
|
38
|
+
...(request.modelPreset ? { mpreset: request.modelPreset } : {}),
|
|
39
|
+
...(request.operation === "session.fork"
|
|
40
|
+
? {
|
|
41
|
+
fork: request.sourceSessionPath ?? request.sourceSessionId,
|
|
42
|
+
sessionDir: SessionManager.getDefaultSessionDirReadOnly(cwd, agentDir),
|
|
43
|
+
}
|
|
44
|
+
: {}),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type LifecycleTranscriptSource = {
|
|
49
|
+
cwd: string;
|
|
50
|
+
path: string;
|
|
51
|
+
id: string;
|
|
52
|
+
identity: SessionLifecycleTranscriptIdentity;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function sameTranscriptIdentity(
|
|
56
|
+
actual: { dev: bigint; ino: bigint; size: number; mtimeMs: number; mtimeNs: bigint },
|
|
57
|
+
expected: SessionLifecycleTranscriptIdentity,
|
|
58
|
+
): boolean {
|
|
59
|
+
return (
|
|
60
|
+
actual.dev.toString() === expected.dev &&
|
|
61
|
+
actual.ino.toString() === expected.ino &&
|
|
62
|
+
actual.size === expected.size &&
|
|
63
|
+
actual.mtimeMs === expected.mtimeMs &&
|
|
64
|
+
actual.mtimeNs.toString() === expected.mtimeNs
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function lifecycleTranscriptSource(request: SessionLifecycleLaunchRequest, cwd: string): LifecycleTranscriptSource {
|
|
69
|
+
if (request.operation === "session.resume") {
|
|
70
|
+
return {
|
|
71
|
+
cwd,
|
|
72
|
+
path: request.sessionPath!,
|
|
73
|
+
id: request.sessionId,
|
|
74
|
+
identity: request.sessionIdentity!,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (request.operation === "session.fork") {
|
|
78
|
+
return {
|
|
79
|
+
cwd: path.resolve(request.sourceCwd ?? cwd),
|
|
80
|
+
path: request.sourceSessionPath!,
|
|
81
|
+
id: request.sourceSessionId!,
|
|
82
|
+
identity: request.sourceSessionIdentity!,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
throw new Error("A new lifecycle session has no persisted transcript authority.");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function verifyLifecycleTranscript(
|
|
89
|
+
request: SessionLifecycleLaunchRequest,
|
|
90
|
+
cwd: string,
|
|
91
|
+
agentDir: string,
|
|
92
|
+
): LifecycleTranscriptSource {
|
|
93
|
+
const source = lifecycleTranscriptSource(request, cwd);
|
|
94
|
+
const inventory = SessionManager.inventorySessionsStrict(source.cwd, {
|
|
95
|
+
sessionDir: SessionManager.getDefaultSessionDir(source.cwd, agentDir),
|
|
96
|
+
});
|
|
97
|
+
if (inventory.kind !== "complete")
|
|
98
|
+
throw new Error("Lifecycle saved session storage could not be verified for the requested workspace.");
|
|
99
|
+
const matches = inventory.candidates.filter(
|
|
100
|
+
candidate =>
|
|
101
|
+
candidate.path === path.resolve(source.path) &&
|
|
102
|
+
candidate.id === source.id &&
|
|
103
|
+
sameTranscriptIdentity(candidate.identity, source.identity),
|
|
104
|
+
);
|
|
105
|
+
if (matches.length !== 1)
|
|
106
|
+
throw new Error("Lifecycle saved session authority changed before the session host started.");
|
|
107
|
+
return source;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function sameLifecycleTranscriptSnapshot(left: ResumeSessionIdentity, right: ResumeSessionIdentity): boolean {
|
|
111
|
+
return (
|
|
112
|
+
left.canonicalPath === right.canonicalPath &&
|
|
113
|
+
left.sessionId === right.sessionId &&
|
|
114
|
+
left.dev === right.dev &&
|
|
115
|
+
left.ino === right.ino &&
|
|
116
|
+
left.size === right.size &&
|
|
117
|
+
left.mtimeMs === right.mtimeMs &&
|
|
118
|
+
left.mtimeNs === right.mtimeNs &&
|
|
119
|
+
left.sha256 === right.sha256
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function captureLifecycleTranscript(
|
|
124
|
+
request: SessionLifecycleLaunchRequest,
|
|
125
|
+
cwd: string,
|
|
126
|
+
agentDir: string,
|
|
127
|
+
): CapturedSessionTranscriptSnapshot {
|
|
128
|
+
const source = verifyLifecycleTranscript(request, cwd, agentDir);
|
|
129
|
+
const captured = SessionManager.captureTranscriptStrict(source.path);
|
|
130
|
+
if (
|
|
131
|
+
captured.kind !== "captured" ||
|
|
132
|
+
captured.snapshot.sourcePath !== path.resolve(source.path) ||
|
|
133
|
+
captured.snapshot.identity.sessionId !== source.id ||
|
|
134
|
+
!sameTranscriptIdentity(captured.snapshot.identity, source.identity)
|
|
135
|
+
)
|
|
136
|
+
throw new Error("Lifecycle saved session authority changed before the session host consumed it.");
|
|
137
|
+
return captured.snapshot;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function revalidateLifecycleTranscript(snapshot: ResumeSessionIdentity): Promise<void> {
|
|
141
|
+
const inspected = await SessionManager.inspectSessionTailReadOnly(snapshot.canonicalPath);
|
|
142
|
+
if (inspected.kind === "error" || !sameLifecycleTranscriptSnapshot(snapshot, inspected.identity))
|
|
143
|
+
throw new Error("Lifecycle saved session authority changed while the session host opened it.");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Opens lifecycle-authorized history without letting replacement content reach readiness. */
|
|
147
|
+
export async function openLifecycleSessionManager(
|
|
148
|
+
request: SessionLifecycleLaunchRequest,
|
|
149
|
+
cwd: string,
|
|
150
|
+
agentDir: string,
|
|
151
|
+
): Promise<{ parsed: ParsedArgs; sessionManager: SessionManager | undefined }> {
|
|
152
|
+
const parsed = lifecycleArgs(request, cwd, agentDir);
|
|
153
|
+
if (request.operation === "session.create") {
|
|
154
|
+
return { parsed, sessionManager: await createSessionManager(parsed, cwd) };
|
|
155
|
+
}
|
|
156
|
+
const snapshot = captureLifecycleTranscript(request, cwd, agentDir);
|
|
157
|
+
let sessionManager: SessionManager | undefined;
|
|
158
|
+
if (request.operation === "session.resume") {
|
|
159
|
+
const opened = await SessionManager.openExistingStrict(snapshot.identity, parsed.sessionDir);
|
|
160
|
+
if (opened.kind === "error")
|
|
161
|
+
throw new Error("Lifecycle saved session authority changed while the session host opened it.");
|
|
162
|
+
sessionManager = opened.manager;
|
|
163
|
+
try {
|
|
164
|
+
await revalidateLifecycleTranscript(snapshot.identity);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
await sessionManager.close();
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
const forked = await SessionManager.forkFromCaptured(snapshot, cwd, parsed.sessionDir);
|
|
171
|
+
if (forked.kind === "error")
|
|
172
|
+
throw new Error("Lifecycle saved session authority changed while the session host forked it.");
|
|
173
|
+
sessionManager = forked.manager;
|
|
174
|
+
}
|
|
175
|
+
return { parsed, sessionManager };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Runs the same persisted AgentSession bootstrap used by the production CLI. */
|
|
179
|
+
export async function runSessionHost(
|
|
180
|
+
timing: {
|
|
181
|
+
now?: () => number;
|
|
182
|
+
sleep?: (ms: number) => Promise<void>;
|
|
183
|
+
cwd?: string;
|
|
184
|
+
processIncarnation?: (pid: number) => string | undefined;
|
|
185
|
+
} = {},
|
|
186
|
+
): Promise<void> {
|
|
187
|
+
const now = timing.now ?? Date.now;
|
|
188
|
+
const sleep = timing.sleep ?? (async ms => await Bun.sleep(ms));
|
|
189
|
+
const readIncarnation = timing.processIncarnation ?? processIncarnation;
|
|
190
|
+
const request = readSessionLifecycleLaunchRequest(process.env.GJC_SDK_LIFECYCLE_REQUEST, now());
|
|
191
|
+
const agentDir = process.env.GJC_AGENT_DIR;
|
|
192
|
+
if (!agentDir) throw new Error("GJC_AGENT_DIR is required for sdk session-host-internal.");
|
|
193
|
+
const cwd = timing.cwd ?? process.cwd();
|
|
194
|
+
if ((await fs.realpath(request.cwd)) !== (await fs.realpath(cwd)))
|
|
195
|
+
throw new Error(`Lifecycle worktree mismatch: expected ${request.cwd}, got ${cwd}.`);
|
|
196
|
+
if (
|
|
197
|
+
process.env.GJC_STATE_ROOT !== undefined &&
|
|
198
|
+
path.resolve(process.env.GJC_STATE_ROOT) !== path.resolve(request.stateRoot)
|
|
199
|
+
)
|
|
200
|
+
throw new Error("Lifecycle state root does not match the broker-issued request.");
|
|
201
|
+
if (request.effectMarker && process.env.GJC_LIFECYCLE_REQUEST_ID !== request.effectMarker)
|
|
202
|
+
throw new Error("Lifecycle effect marker does not match the broker-issued request.");
|
|
203
|
+
if (!request.effectMarker) throw new Error("Lifecycle effect marker is required.");
|
|
204
|
+
const effectMarker = request.effectMarker;
|
|
205
|
+
const markerPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.lifecycle.json`);
|
|
206
|
+
let marker: { pid?: unknown; effectMarker?: unknown; incarnation?: unknown } | undefined;
|
|
207
|
+
do {
|
|
208
|
+
try {
|
|
209
|
+
const candidate = JSON.parse(await fs.readFile(markerPath, "utf8")) as {
|
|
210
|
+
pid?: unknown;
|
|
211
|
+
effectMarker?: unknown;
|
|
212
|
+
incarnation?: unknown;
|
|
213
|
+
};
|
|
214
|
+
const incarnation = readIncarnation(process.pid);
|
|
215
|
+
if (
|
|
216
|
+
request.effectMarker &&
|
|
217
|
+
Number.isSafeInteger(candidate.pid) &&
|
|
218
|
+
candidate.pid === process.pid &&
|
|
219
|
+
typeof candidate.effectMarker === "string" &&
|
|
220
|
+
candidate.effectMarker === request.effectMarker &&
|
|
221
|
+
typeof candidate.incarnation === "string" &&
|
|
222
|
+
incarnation &&
|
|
223
|
+
candidate.incarnation === incarnation
|
|
224
|
+
)
|
|
225
|
+
marker = candidate;
|
|
226
|
+
} catch {
|
|
227
|
+
// Marker publication may be observed between write and rename; retry until cutoff.
|
|
228
|
+
}
|
|
229
|
+
if (!marker && now() < request.semanticReadyDeadlineAt)
|
|
230
|
+
await sleep(Math.min(10, Math.max(0, request.semanticReadyDeadlineAt - now())));
|
|
231
|
+
} while (!marker && now() < request.semanticReadyDeadlineAt);
|
|
232
|
+
if (!marker) throw new Error("Lifecycle owner-bound marker authority was not published before readiness cutoff.");
|
|
233
|
+
const incarnation = readIncarnation(process.pid);
|
|
234
|
+
if (!incarnation) throw new Error("Lifecycle owner-bound marker authority is invalid.");
|
|
235
|
+
|
|
236
|
+
const writeFailure = async (
|
|
237
|
+
failure: SdkStartupFailure,
|
|
238
|
+
rollback: SdkStartupRollbackResult,
|
|
239
|
+
transcript?: LifecycleTranscriptEvidence,
|
|
240
|
+
): Promise<void> => {
|
|
241
|
+
if (!request.effectMarker) return;
|
|
242
|
+
await writeSessionLifecycleFailure(
|
|
243
|
+
request.stateRoot,
|
|
244
|
+
request.sessionId,
|
|
245
|
+
effectMarker,
|
|
246
|
+
failure,
|
|
247
|
+
rollback,
|
|
248
|
+
transcript,
|
|
249
|
+
incarnation,
|
|
250
|
+
);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
if (now() >= request.semanticReadyDeadlineAt) {
|
|
254
|
+
const absent = new SdkStartupRollbackTracker();
|
|
255
|
+
absent.recordAbsent();
|
|
256
|
+
await writeFailure(
|
|
257
|
+
{
|
|
258
|
+
phase: "startup",
|
|
259
|
+
reason: "pending",
|
|
260
|
+
message: "SDK startup did not complete before readiness cutoff.",
|
|
261
|
+
},
|
|
262
|
+
absent.result,
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
throw new Error("SDK startup did not complete before readiness cutoff.");
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
let opened: { parsed: ParsedArgs; sessionManager: SessionManager | undefined };
|
|
269
|
+
let created: CreateLifecycleAgentSessionResult;
|
|
270
|
+
try {
|
|
271
|
+
opened = await openLifecycleSessionManager(request, cwd, agentDir);
|
|
272
|
+
created = await createLifecycleAgentSession({ cwd, agentDir, sessionManager: opened.sessionManager });
|
|
273
|
+
} catch (error) {
|
|
274
|
+
const rollback = new SdkStartupRollbackTracker();
|
|
275
|
+
rollback.recordAbsent();
|
|
276
|
+
const failure = normalizeSdkStartupFailure("registration", "failed", error);
|
|
277
|
+
await writeFailure(failure, rollback.result);
|
|
278
|
+
throw new Error(failure.message);
|
|
279
|
+
}
|
|
280
|
+
const { parsed } = opened;
|
|
281
|
+
if ("failure" in created) {
|
|
282
|
+
created.rollback.recordAbsent();
|
|
283
|
+
await writeFailure(created.failure, created.rollback.result);
|
|
284
|
+
|
|
285
|
+
throw new Error(created.failure.message);
|
|
286
|
+
}
|
|
287
|
+
const { session, capability, rollback } = created;
|
|
288
|
+
let sessionDisposal: Promise<void> | undefined;
|
|
289
|
+
const disposeSession = (): Promise<void> => {
|
|
290
|
+
sessionDisposal ??= session.dispose().catch(() => {});
|
|
291
|
+
return sessionDisposal;
|
|
292
|
+
};
|
|
293
|
+
let disposal: Promise<LifecycleTranscriptEvidence | undefined> | undefined;
|
|
294
|
+
const disposeAndCapture = (): Promise<LifecycleTranscriptEvidence | undefined> => {
|
|
295
|
+
disposal ??= (async () => {
|
|
296
|
+
await disposeSession();
|
|
297
|
+
try {
|
|
298
|
+
await session.sessionManager.ensureOnDisk();
|
|
299
|
+
const transcriptPath = session.sessionManager.getSessionFile();
|
|
300
|
+
if (!transcriptPath) return undefined;
|
|
301
|
+
const [bytes, stat] = await Promise.all([
|
|
302
|
+
fs.readFile(transcriptPath),
|
|
303
|
+
fs.stat(transcriptPath, { bigint: true }),
|
|
304
|
+
]);
|
|
305
|
+
return {
|
|
306
|
+
digest: createHash("sha256").update(bytes).digest("hex"),
|
|
307
|
+
identity: {
|
|
308
|
+
dev: stat.dev.toString(),
|
|
309
|
+
ino: stat.ino.toString(),
|
|
310
|
+
size: Number(stat.size),
|
|
311
|
+
mtimeMs: Number(stat.mtimeMs),
|
|
312
|
+
mtimeNs: stat.mtimeNs.toString(),
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
} catch {
|
|
316
|
+
return undefined;
|
|
317
|
+
}
|
|
318
|
+
})();
|
|
319
|
+
return disposal;
|
|
320
|
+
};
|
|
321
|
+
let failureRollback: Promise<void> | undefined;
|
|
322
|
+
const failAfterRollback = (failure: SdkStartupFailure): Promise<void> => {
|
|
323
|
+
failureRollback ??= (async () => {
|
|
324
|
+
const transcript = await disposeAndCapture();
|
|
325
|
+
if (rollback.generation === undefined) rollback.recordAbsent();
|
|
326
|
+
await writeFailure(failure, rollback.result, transcript);
|
|
327
|
+
})();
|
|
328
|
+
return failureRollback;
|
|
329
|
+
};
|
|
330
|
+
const stop = () => {
|
|
331
|
+
if (capability.result?.status === "started") {
|
|
332
|
+
void disposeSession().finally(() => process.exit(0));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
|
|
336
|
+
capability.cancel();
|
|
337
|
+
void failAfterRollback(failure).finally(() => process.exit(0));
|
|
338
|
+
};
|
|
339
|
+
const cutoffFailure = (): SdkStartupFailure => capability.normalizeFailure("startup", "pending");
|
|
340
|
+
const throwIfCutoff = (): void => {
|
|
341
|
+
if (now() >= request.semanticReadyDeadlineAt) {
|
|
342
|
+
capability.cancel();
|
|
343
|
+
throw cutoffFailure();
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
const cutoff = sleep(Math.max(0, request.semanticReadyDeadlineAt - now())).then(() => ({ cutoff: true }) as const);
|
|
347
|
+
const beforeCutoff = async <T>(stage: Promise<T>): Promise<T> => {
|
|
348
|
+
const result = await Promise.race([stage.then(value => ({ cutoff: false, value }) as const), cutoff]);
|
|
349
|
+
if (result.cutoff) {
|
|
350
|
+
capability.cancel();
|
|
351
|
+
throw cutoffFailure();
|
|
352
|
+
}
|
|
353
|
+
return result.value;
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
try {
|
|
357
|
+
const modelProfileStartup =
|
|
358
|
+
process.env.GJC_SDK_TEST_HANG_MODEL_PROFILE === cwd
|
|
359
|
+
? new Promise<void>(() => {})
|
|
360
|
+
: applyStartupModelProfiles({
|
|
361
|
+
session,
|
|
362
|
+
settings: session.settings,
|
|
363
|
+
modelRegistry: session.modelRegistry,
|
|
364
|
+
parsedArgs: parsed,
|
|
365
|
+
});
|
|
366
|
+
await beforeCutoff(modelProfileStartup);
|
|
367
|
+
throwIfCutoff();
|
|
368
|
+
await beforeCutoff(
|
|
369
|
+
initializeExtensions(session, {
|
|
370
|
+
reportSendError: () => {},
|
|
371
|
+
reportRuntimeError: () => {},
|
|
372
|
+
onShutdown: stop,
|
|
373
|
+
}),
|
|
374
|
+
);
|
|
375
|
+
throwIfCutoff();
|
|
376
|
+
if (session.sessionManager.getSessionId() !== request.sessionId)
|
|
377
|
+
throw new Error(
|
|
378
|
+
`Lifecycle session id mismatch: expected ${request.sessionId}, got ${session.sessionManager.getSessionId()}.`,
|
|
379
|
+
);
|
|
380
|
+
const startup = await beforeCutoff(capability.promise);
|
|
381
|
+
if (startup.status !== "started") throw startup.failure;
|
|
382
|
+
throwIfCutoff();
|
|
383
|
+
if (process.env.GJC_SDK_TEST_FAIL_AFTER_REGISTRATION === cwd)
|
|
384
|
+
throw new Error("Lifecycle test failure after SDK host registration.");
|
|
385
|
+
|
|
386
|
+
await session.sessionManager.ensureOnDisk();
|
|
387
|
+
throwIfCutoff();
|
|
388
|
+
|
|
389
|
+
await writeSessionLifecycleReady(request.stateRoot, request.sessionId, effectMarker);
|
|
390
|
+
} catch (error) {
|
|
391
|
+
const failure =
|
|
392
|
+
error && typeof error === "object" && "phase" in error && "reason" in error && "message" in error
|
|
393
|
+
? (error as SdkStartupFailure)
|
|
394
|
+
: capability.normalizeFailure("startup", "failed", error);
|
|
395
|
+
const settled = capability.settleFailure(failure);
|
|
396
|
+
const durableFailure = settled.status === "failed" ? settled.failure : failure;
|
|
397
|
+
await failAfterRollback(durableFailure);
|
|
398
|
+
throw error;
|
|
399
|
+
}
|
|
400
|
+
process.once("SIGTERM", stop);
|
|
401
|
+
process.once("SIGINT", stop);
|
|
402
|
+
await new Promise<void>(() => {});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export default class Sdk extends Command {
|
|
406
|
+
static description = "SDK internal services";
|
|
407
|
+
static hidden = true;
|
|
408
|
+
static args = { action: Args.string({ required: true, options: ["broker-internal", "session-host-internal"] }) };
|
|
409
|
+
static flags = { "agent-dir": Flags.string({ description: "Internal broker agent directory" }) };
|
|
410
|
+
async run(): Promise<void> {
|
|
411
|
+
const { args, flags } = await this.parse(Sdk);
|
|
412
|
+
if (args.action === "session-host-internal") {
|
|
413
|
+
await runSessionHost();
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const agentDir = flags["agent-dir"] as string | undefined;
|
|
417
|
+
if (!agentDir) throw new Error("--agent-dir is required for sdk broker-internal.");
|
|
418
|
+
const broker = new Broker({ agentDir });
|
|
419
|
+
await broker.start();
|
|
420
|
+
if (!broker.ownsDiscovery) return;
|
|
421
|
+
const stop = () => void broker.stop().finally(() => process.exit(0));
|
|
422
|
+
process.once("SIGTERM", stop);
|
|
423
|
+
process.once("SIGINT", stop);
|
|
424
|
+
await new Promise<void>(() => {});
|
|
425
|
+
}
|
|
426
|
+
}
|