@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
|
@@ -31,6 +31,10 @@ export interface TopicRecord {
|
|
|
31
31
|
userNameUpdateId?: number;
|
|
32
32
|
/** Stable repo/branch identity used when topic names are user-owned or customized. */
|
|
33
33
|
identityKey?: string;
|
|
34
|
+
/** Last SDK event generation durably consumed by the notification daemon. */
|
|
35
|
+
replayGeneration?: number;
|
|
36
|
+
/** Last SDK event sequence durably consumed within replayGeneration. */
|
|
37
|
+
replaySeq?: number;
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
/** Serialisable shape persisted to disk. */
|
|
@@ -71,6 +75,13 @@ export class TopicRegistry {
|
|
|
71
75
|
typeof raw.userNameUpdateId === "number" &&
|
|
72
76
|
Number.isSafeInteger(raw.userNameUpdateId) &&
|
|
73
77
|
raw.userNameUpdateId >= 0;
|
|
78
|
+
const hasValidReplayCursor =
|
|
79
|
+
typeof raw.replayGeneration === "number" &&
|
|
80
|
+
Number.isSafeInteger(raw.replayGeneration) &&
|
|
81
|
+
raw.replayGeneration >= 1 &&
|
|
82
|
+
typeof raw.replaySeq === "number" &&
|
|
83
|
+
Number.isSafeInteger(raw.replaySeq) &&
|
|
84
|
+
raw.replaySeq >= 0;
|
|
74
85
|
const record: TopicRecord = {
|
|
75
86
|
topicId: raw.topicId,
|
|
76
87
|
identitySent: raw.identitySent === true,
|
|
@@ -80,6 +91,7 @@ export class TopicRegistry {
|
|
|
80
91
|
...(hasValidUserAuthority && raw.nameReconcilePending === true ? { nameReconcilePending: true } : {}),
|
|
81
92
|
...(hasValidUserAuthority ? { userNameUpdateId: raw.userNameUpdateId } : {}),
|
|
82
93
|
...(typeof raw.identityKey === "string" ? { identityKey: raw.identityKey } : {}),
|
|
94
|
+
...(hasValidReplayCursor ? { replayGeneration: raw.replayGeneration, replaySeq: raw.replaySeq } : {}),
|
|
83
95
|
};
|
|
84
96
|
this.topics.set(sessionId, record);
|
|
85
97
|
this.byTopic.set(record.topicId, sessionId);
|
|
@@ -154,6 +166,26 @@ export class TopicRegistry {
|
|
|
154
166
|
return true;
|
|
155
167
|
}
|
|
156
168
|
|
|
169
|
+
/** Last durably consumed SDK event cursor for reconnect replay. */
|
|
170
|
+
replayCursor(sessionId: string): { generation: number; seq: number } | undefined {
|
|
171
|
+
const record = this.topics.get(sessionId);
|
|
172
|
+
return record?.replayGeneration !== undefined && record.replaySeq !== undefined
|
|
173
|
+
? { generation: record.replayGeneration, seq: record.replaySeq }
|
|
174
|
+
: undefined;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** Advance the durable reconnect cursor without allowing stale responses to move it backwards. */
|
|
178
|
+
markReplayCursor(sessionId: string, generation: number, seq: number): boolean {
|
|
179
|
+
const record = this.topics.get(sessionId);
|
|
180
|
+
if (!record) return false;
|
|
181
|
+
const currentGeneration = record.replayGeneration ?? 0;
|
|
182
|
+
const currentSeq = record.replaySeq ?? 0;
|
|
183
|
+
if (generation < currentGeneration || (generation === currentGeneration && seq <= currentSeq)) return false;
|
|
184
|
+
record.replayGeneration = generation;
|
|
185
|
+
record.replaySeq = seq;
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
|
|
157
189
|
/** Whether daemon identity reconciliation should apply `name`. */
|
|
158
190
|
needsRename(sessionId: string, name: string): boolean {
|
|
159
191
|
const record = this.topics.get(sessionId);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./session-cli";
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { getAgentDir } from "@gajae-code/utils";
|
|
4
|
+
import { ensureBroker } from "../broker/ensure";
|
|
5
|
+
import {
|
|
6
|
+
listSdkSessionEndpoints,
|
|
7
|
+
readSdkBrokerDiscovery,
|
|
8
|
+
readSdkSessionEndpoint,
|
|
9
|
+
SdkClient,
|
|
10
|
+
SdkClientError,
|
|
11
|
+
SdkDiscoveryError,
|
|
12
|
+
} from "../client";
|
|
13
|
+
import { validateAdapterControl } from "../protocol/adapter-validation";
|
|
14
|
+
import { adapterDispositionError, findOperation, type OperationKind } from "../protocol/operation-registry";
|
|
15
|
+
|
|
16
|
+
export type SdkSessionCliAction = "list" | "control" | "query" | "global";
|
|
17
|
+
|
|
18
|
+
export interface SdkSessionCliArgs {
|
|
19
|
+
action?: string;
|
|
20
|
+
sessionId?: string;
|
|
21
|
+
operation?: string;
|
|
22
|
+
query?: string;
|
|
23
|
+
jsonInput?: string;
|
|
24
|
+
jsonInputFile?: string;
|
|
25
|
+
idempotencyKey?: string;
|
|
26
|
+
jsonInputStdin?: boolean;
|
|
27
|
+
confirm?: boolean;
|
|
28
|
+
cursor?: string;
|
|
29
|
+
showEndpointCredential?: boolean;
|
|
30
|
+
yes?: boolean;
|
|
31
|
+
repo?: string;
|
|
32
|
+
agentDir?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type JsonRecord = Record<string, unknown>;
|
|
36
|
+
const SECRET_FIELD = /(?:secret|token|password|credential|authorization|api[_-]?key)/i;
|
|
37
|
+
|
|
38
|
+
class SdkSessionCliError extends Error {
|
|
39
|
+
constructor(
|
|
40
|
+
readonly code: string,
|
|
41
|
+
message: string,
|
|
42
|
+
readonly exitCode: 1 | 2,
|
|
43
|
+
) {
|
|
44
|
+
super(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function writeJson(value: unknown): void {
|
|
49
|
+
process.stdout.write(`${JSON.stringify(value)}\n`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function parseInput(raw: string | undefined, source: string): JsonRecord {
|
|
53
|
+
if (raw === undefined) return {};
|
|
54
|
+
try {
|
|
55
|
+
const value: unknown = JSON.parse(raw);
|
|
56
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
57
|
+
throw new SdkSessionCliError("invalid_input", `${source} must be a JSON object.`, 2);
|
|
58
|
+
return value as JsonRecord;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (error instanceof SdkSessionCliError) throw error;
|
|
61
|
+
throw new SdkSessionCliError("invalid_json", `${source} must contain valid JSON.`, 2);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function containsSecretField(value: unknown): boolean {
|
|
66
|
+
if (Array.isArray(value)) return value.some(containsSecretField);
|
|
67
|
+
if (!value || typeof value !== "object") return false;
|
|
68
|
+
return Object.entries(value).some(([key, nested]) => SECRET_FIELD.test(key) || containsSecretField(nested));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function inputFromArgs(args: SdkSessionCliArgs): Promise<JsonRecord> {
|
|
72
|
+
const sources = [
|
|
73
|
+
args.jsonInput !== undefined,
|
|
74
|
+
args.jsonInputFile !== undefined,
|
|
75
|
+
args.jsonInputStdin === true,
|
|
76
|
+
].filter(Boolean).length;
|
|
77
|
+
if (sources > 1) throw new SdkSessionCliError("usage", "Use only one JSON input source.", 2);
|
|
78
|
+
if (args.jsonInput !== undefined) {
|
|
79
|
+
const input = parseInput(args.jsonInput, "--json-input");
|
|
80
|
+
if (containsSecretField(input))
|
|
81
|
+
throw new SdkSessionCliError(
|
|
82
|
+
"secret_field_forbidden",
|
|
83
|
+
"Secret values must use --json-input-file or --json-input-stdin.",
|
|
84
|
+
2,
|
|
85
|
+
);
|
|
86
|
+
return input;
|
|
87
|
+
}
|
|
88
|
+
if (args.jsonInputFile !== undefined) {
|
|
89
|
+
let stat: Awaited<ReturnType<typeof fs.stat>>;
|
|
90
|
+
try {
|
|
91
|
+
stat = await fs.stat(args.jsonInputFile);
|
|
92
|
+
} catch {
|
|
93
|
+
throw new SdkSessionCliError("input_file_unavailable", "Unable to read --json-input-file.", 2);
|
|
94
|
+
}
|
|
95
|
+
if (!stat.isFile() || (stat.mode & 0o077) !== 0)
|
|
96
|
+
throw new SdkSessionCliError(
|
|
97
|
+
"input_file_permissions",
|
|
98
|
+
"--json-input-file must be a regular file with 0600 permissions.",
|
|
99
|
+
2,
|
|
100
|
+
);
|
|
101
|
+
try {
|
|
102
|
+
return parseInput(await fs.readFile(args.jsonInputFile, "utf8"), "--json-input-file");
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (error instanceof SdkSessionCliError) throw error;
|
|
105
|
+
throw new SdkSessionCliError("input_file_unavailable", "Unable to read --json-input-file.", 2);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return args.jsonInputStdin ? parseInput(await Bun.stdin.text(), "--json-input-stdin") : {};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function requireValue(value: string | undefined, flag: string): string {
|
|
112
|
+
if (!value) throw new SdkSessionCliError("usage", `${flag} is required.`, 2);
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function isEndpointOperation(operation: string): boolean {
|
|
117
|
+
return operation === "session.get_endpoint";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function cliOperationError(kind: OperationKind, operation: string): { code: string; message: string } | undefined {
|
|
121
|
+
const row = findOperation(kind, operation);
|
|
122
|
+
const error = adapterDispositionError("daemonCli", kind, operation);
|
|
123
|
+
if (!error) return undefined;
|
|
124
|
+
if (row?.adapterDispositions.daemonCli === "prohibited")
|
|
125
|
+
return {
|
|
126
|
+
code: error.code,
|
|
127
|
+
message: `${operation} is unavailable through the ordinary CLI; provider mode is out of scope this phase.`,
|
|
128
|
+
};
|
|
129
|
+
return error;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function isLifecycleOperation(operation: string): boolean {
|
|
133
|
+
return (
|
|
134
|
+
operation === "session.create" ||
|
|
135
|
+
operation === "session.fork" ||
|
|
136
|
+
operation === "session.resume" ||
|
|
137
|
+
operation === "session.close" ||
|
|
138
|
+
operation === "session.delete"
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function confirmEndpointCredentialOutput(): Promise<boolean> {
|
|
143
|
+
const prompt = createInterface({ input: process.stdin, output: process.stderr });
|
|
144
|
+
try {
|
|
145
|
+
return (await prompt.question("Print the endpoint credential to stdout? [y/N] ")).trim().toLowerCase() === "y";
|
|
146
|
+
} finally {
|
|
147
|
+
prompt.close();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function connectBroker(agentDir: string): Promise<SdkClient> {
|
|
152
|
+
await ensureBroker({ agentDir });
|
|
153
|
+
const discovery = await readSdkBrokerDiscovery(agentDir);
|
|
154
|
+
if (!discovery) throw new SdkSessionCliError("broker_unavailable", "SDK broker discovery is unavailable.", 1);
|
|
155
|
+
return await SdkClient.connect(discovery.url, discovery.token);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function connectSession(repo: string, sessionId: string): Promise<SdkClient> {
|
|
159
|
+
const endpoint = await readSdkSessionEndpoint(repo, sessionId);
|
|
160
|
+
if (!endpoint)
|
|
161
|
+
throw new SdkSessionCliError("session_unavailable", `SDK endpoint for session ${sessionId} is unavailable.`, 1);
|
|
162
|
+
return await SdkClient.connect(endpoint.url, endpoint.token);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function brokerAbsent(error: unknown): boolean {
|
|
166
|
+
if (error instanceof SdkSessionCliError) return error.code === "broker_unavailable";
|
|
167
|
+
const details = error instanceof SdkClientError ? error.details : error;
|
|
168
|
+
const code = (details as { code?: unknown } | undefined)?.code;
|
|
169
|
+
return (
|
|
170
|
+
code === "ENOENT" ||
|
|
171
|
+
code === "ECONNREFUSED" ||
|
|
172
|
+
/(?:ENOENT|ECONNREFUSED|connection refused)/i.test(error instanceof Error ? error.message : "")
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
async function runList(repo: string, agentDir: string): Promise<unknown> {
|
|
177
|
+
try {
|
|
178
|
+
const client = await connectBroker(agentDir);
|
|
179
|
+
try {
|
|
180
|
+
return await client.global("session.list", {});
|
|
181
|
+
} finally {
|
|
182
|
+
await client.close();
|
|
183
|
+
}
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if (!brokerAbsent(error)) throw error;
|
|
186
|
+
const { endpoints, warnings } = await listSdkSessionEndpoints(repo);
|
|
187
|
+
return {
|
|
188
|
+
sessions: endpoints.map(({ sessionId, path }) => ({ sessionId, path })),
|
|
189
|
+
warnings: [
|
|
190
|
+
{ code: "broker_unavailable", message: "Listed endpoint files because the broker is unavailable." },
|
|
191
|
+
...warnings,
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** Runs the pure-SDK `gjc daemon session` command family. */
|
|
198
|
+
export async function runSdkSessionCli(
|
|
199
|
+
args: SdkSessionCliArgs,
|
|
200
|
+
writeOutput: (value: unknown) => void = writeJson,
|
|
201
|
+
setExitCode: (exitCode: 1 | 2) => void = exitCode => {
|
|
202
|
+
process.exitCode = exitCode;
|
|
203
|
+
},
|
|
204
|
+
): Promise<void> {
|
|
205
|
+
try {
|
|
206
|
+
const action = args.action;
|
|
207
|
+
if (action !== "list" && action !== "control" && action !== "query" && action !== "global")
|
|
208
|
+
throw new SdkSessionCliError("usage", "Expected one of: list, control, query, global.", 2);
|
|
209
|
+
const repo = args.repo ?? process.cwd();
|
|
210
|
+
const agentDir = args.agentDir ?? getAgentDir();
|
|
211
|
+
if (action === "list") {
|
|
212
|
+
writeOutput(await runList(repo, agentDir));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const operation = action === "query" ? requireValue(args.query, "--query") : requireValue(args.operation, "--op");
|
|
216
|
+
const kind: OperationKind = action === "query" ? "query" : action === "global" ? "global" : "control";
|
|
217
|
+
const dispositionError = cliOperationError(kind, operation);
|
|
218
|
+
if (dispositionError) throw new SdkSessionCliError(dispositionError.code, dispositionError.message, 1);
|
|
219
|
+
if (isEndpointOperation(operation)) {
|
|
220
|
+
if (!args.showEndpointCredential)
|
|
221
|
+
throw new SdkSessionCliError(
|
|
222
|
+
"endpoint_credential_forbidden",
|
|
223
|
+
"session.get_endpoint requires --show-endpoint-credential.",
|
|
224
|
+
1,
|
|
225
|
+
);
|
|
226
|
+
if (process.stdout.isTTY && !args.yes && !(await confirmEndpointCredentialOutput()))
|
|
227
|
+
throw new SdkSessionCliError(
|
|
228
|
+
"endpoint_credential_confirmation_required",
|
|
229
|
+
"Endpoint credential output was not confirmed.",
|
|
230
|
+
1,
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
const input = await inputFromArgs(args);
|
|
234
|
+
if (kind === "control") {
|
|
235
|
+
const invalid = validateAdapterControl(operation, input);
|
|
236
|
+
if (invalid) throw new SdkSessionCliError(invalid.code, invalid.message, 2);
|
|
237
|
+
}
|
|
238
|
+
if (action === "global") {
|
|
239
|
+
const idempotencyKey = args.idempotencyKey;
|
|
240
|
+
if (isLifecycleOperation(operation) && !idempotencyKey)
|
|
241
|
+
throw new SdkSessionCliError("invalid_input", "--idempotency-key is required for lifecycle operations.", 2);
|
|
242
|
+
const client = await connectBroker(agentDir);
|
|
243
|
+
try {
|
|
244
|
+
writeOutput(await client.global(operation, input, { idempotencyKey }));
|
|
245
|
+
} finally {
|
|
246
|
+
await client.close();
|
|
247
|
+
}
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const sessionId = requireValue(args.sessionId, "<sessionId>");
|
|
251
|
+
const client = await connectSession(repo, sessionId);
|
|
252
|
+
try {
|
|
253
|
+
if (action === "control")
|
|
254
|
+
writeOutput(await client.control(operation, input, { confirm: args.confirm === true }));
|
|
255
|
+
else writeOutput(await client.query(operation, input, args.cursor));
|
|
256
|
+
} finally {
|
|
257
|
+
await client.close();
|
|
258
|
+
}
|
|
259
|
+
} catch (error) {
|
|
260
|
+
const cliError =
|
|
261
|
+
error instanceof SdkSessionCliError
|
|
262
|
+
? error
|
|
263
|
+
: error instanceof SdkClientError
|
|
264
|
+
? new SdkSessionCliError(error.code, error.message, 1)
|
|
265
|
+
: error instanceof SdkDiscoveryError
|
|
266
|
+
? new SdkSessionCliError(error.code, error.message, 1)
|
|
267
|
+
: new SdkSessionCliError(
|
|
268
|
+
"operation_failed",
|
|
269
|
+
error instanceof Error ? error.message : "SDK operation failed.",
|
|
270
|
+
1,
|
|
271
|
+
);
|
|
272
|
+
writeOutput({ ok: false, error: { code: cliError.code, message: cliError.message } });
|
|
273
|
+
setExitCode(cliError.exitCode);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "@gajae-code/bridge-client";
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { type BrokerDiscovery, readBrokerDiscovery as readBrokerFile } from "../broker/discovery";
|
|
4
|
+
|
|
5
|
+
export interface SdkSessionEndpoint {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
url: string;
|
|
8
|
+
token: string;
|
|
9
|
+
path: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface SdkDiscoveryWarning {
|
|
13
|
+
code: "discovery_error";
|
|
14
|
+
path: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface SdkSessionEndpointList {
|
|
19
|
+
endpoints: SdkSessionEndpoint[];
|
|
20
|
+
warnings: SdkDiscoveryWarning[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class SdkDiscoveryError extends Error {
|
|
24
|
+
readonly code = "discovery_error";
|
|
25
|
+
constructor(
|
|
26
|
+
readonly path: string,
|
|
27
|
+
message: string,
|
|
28
|
+
) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "SdkDiscoveryError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function endpointDirectory(repo: string): string {
|
|
35
|
+
return path.join(repo, ".gjc", "state", "sdk");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function parseEndpoint(sessionId: string, file: string, value: unknown): SdkSessionEndpoint {
|
|
39
|
+
if (!value || typeof value !== "object")
|
|
40
|
+
throw new SdkDiscoveryError(file, "SDK endpoint discovery record must be an object.");
|
|
41
|
+
const endpoint = value as { version?: unknown; url?: unknown; token?: unknown };
|
|
42
|
+
if (typeof endpoint.version === "number" && endpoint.version > 1)
|
|
43
|
+
throw new SdkDiscoveryError(file, "Unsupported SDK endpoint discovery state version.");
|
|
44
|
+
if (typeof endpoint.url !== "string" || typeof endpoint.token !== "string" || !endpoint.url || !endpoint.token)
|
|
45
|
+
throw new SdkDiscoveryError(file, "SDK endpoint discovery record is invalid.");
|
|
46
|
+
return { sessionId, url: endpoint.url, token: endpoint.token, path: file };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function discoveryError(file: string, error: unknown): SdkDiscoveryError {
|
|
50
|
+
if (error instanceof SdkDiscoveryError) return error;
|
|
51
|
+
return new SdkDiscoveryError(file, "Unable to read SDK discovery record.");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Lists endpoint files and returns individual malformed or unreadable records as warnings. */
|
|
55
|
+
export async function listSdkSessionEndpoints(repo: string): Promise<SdkSessionEndpointList> {
|
|
56
|
+
const directory = endpointDirectory(repo);
|
|
57
|
+
let entries: Array<{ name: string; isFile(): boolean }>;
|
|
58
|
+
try {
|
|
59
|
+
entries = (await fs.readdir(directory, { withFileTypes: true })) as Array<{ name: string; isFile(): boolean }>;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return { endpoints: [], warnings: [] };
|
|
62
|
+
throw discoveryError(directory, error);
|
|
63
|
+
}
|
|
64
|
+
const results = await Promise.all(
|
|
65
|
+
entries
|
|
66
|
+
.filter(entry => entry.isFile() && entry.name.endsWith(".json"))
|
|
67
|
+
.map(async entry => {
|
|
68
|
+
const sessionId = entry.name.slice(0, -".json".length);
|
|
69
|
+
const file = path.join(directory, entry.name);
|
|
70
|
+
try {
|
|
71
|
+
return { endpoint: parseEndpoint(sessionId, file, JSON.parse(await fs.readFile(file, "utf8"))) };
|
|
72
|
+
} catch (error) {
|
|
73
|
+
return { warning: discoveryError(file, error) };
|
|
74
|
+
}
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
return {
|
|
78
|
+
endpoints: results.flatMap(result => (result.endpoint ? [result.endpoint] : [])),
|
|
79
|
+
warnings: results.flatMap(result =>
|
|
80
|
+
result.warning
|
|
81
|
+
? [{ code: result.warning.code, path: result.warning.path, message: result.warning.message }]
|
|
82
|
+
: [],
|
|
83
|
+
),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Resolves one per-session SDK endpoint discovery file. */
|
|
88
|
+
export async function readSdkSessionEndpoint(repo: string, sessionId: string): Promise<SdkSessionEndpoint | null> {
|
|
89
|
+
if (!sessionId || sessionId.includes(path.sep) || sessionId.includes("/")) return null;
|
|
90
|
+
const file = path.join(endpointDirectory(repo), `${sessionId}.json`);
|
|
91
|
+
try {
|
|
92
|
+
return parseEndpoint(sessionId, file, JSON.parse(await fs.readFile(file, "utf8")));
|
|
93
|
+
} catch (error) {
|
|
94
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
95
|
+
throw discoveryError(file, error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Reads the agent-global broker discovery record. */
|
|
100
|
+
export async function readSdkBrokerDiscovery(agentDir: string): Promise<BrokerDiscovery | null> {
|
|
101
|
+
try {
|
|
102
|
+
return await readBrokerFile(agentDir);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
const file = path.join(agentDir, "sdk", "broker.json");
|
|
105
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
106
|
+
throw discoveryError(file, error);
|
|
107
|
+
}
|
|
108
|
+
}
|