@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,85 @@
|
|
|
1
|
+
/** Injectable Discord boundary. The daemon owns all persistence and SDK routing. */
|
|
2
|
+
export interface DiscordThread {
|
|
3
|
+
id: string;
|
|
4
|
+
guildId: string;
|
|
5
|
+
parentId: string;
|
|
6
|
+
archived: boolean;
|
|
7
|
+
locked?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface DiscordInboundEvent {
|
|
10
|
+
id: string;
|
|
11
|
+
guildId: string;
|
|
12
|
+
parentId: string;
|
|
13
|
+
threadId: string;
|
|
14
|
+
authorId: string;
|
|
15
|
+
bot?: boolean;
|
|
16
|
+
content?: string;
|
|
17
|
+
interaction?: {
|
|
18
|
+
id: string;
|
|
19
|
+
token: string;
|
|
20
|
+
customId: string;
|
|
21
|
+
value?: string | number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** Discord API message components used for action-needed controls. */
|
|
25
|
+
export interface DiscordMessageComponent {
|
|
26
|
+
type: 1;
|
|
27
|
+
components: Array<{
|
|
28
|
+
type: 3;
|
|
29
|
+
customId: string;
|
|
30
|
+
placeholder?: string;
|
|
31
|
+
minValues?: number;
|
|
32
|
+
maxValues?: number;
|
|
33
|
+
options: Array<{
|
|
34
|
+
label: string;
|
|
35
|
+
value: string;
|
|
36
|
+
}>;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface DiscordProvider {
|
|
40
|
+
readonly applicationId: string;
|
|
41
|
+
readonly botUserId: string;
|
|
42
|
+
readonly transportHealthy?: boolean;
|
|
43
|
+
/** Starts a generic text-channel thread from a nonce-bearing parent starter message. */
|
|
44
|
+
createThread(input: {
|
|
45
|
+
guildId: string;
|
|
46
|
+
parentId: string;
|
|
47
|
+
name: string;
|
|
48
|
+
nonce: string;
|
|
49
|
+
}): Promise<DiscordThread>;
|
|
50
|
+
/** Finds a thread created with a caller-generated nonce after an uncertain create. */
|
|
51
|
+
findThreadByNonce(input: {
|
|
52
|
+
guildId: string;
|
|
53
|
+
parentId: string;
|
|
54
|
+
nonce: string;
|
|
55
|
+
}): Promise<DiscordThread | null>;
|
|
56
|
+
/** Finds a posted message by its caller-generated nonce after an uncertain post. */
|
|
57
|
+
findMessageByNonce(input: {
|
|
58
|
+
threadId: string;
|
|
59
|
+
nonce: string;
|
|
60
|
+
}): Promise<{
|
|
61
|
+
id: string;
|
|
62
|
+
} | null>;
|
|
63
|
+
postMessage(input: {
|
|
64
|
+
threadId: string;
|
|
65
|
+
content: string;
|
|
66
|
+
nonce?: string;
|
|
67
|
+
components?: DiscordMessageComponent[];
|
|
68
|
+
}): Promise<{
|
|
69
|
+
id: string;
|
|
70
|
+
}>;
|
|
71
|
+
/** Defers an accepted component interaction before SDK routing can exceed Discord's response deadline. */
|
|
72
|
+
deferInteraction(input: {
|
|
73
|
+
id: string;
|
|
74
|
+
token: string;
|
|
75
|
+
}): Promise<void>;
|
|
76
|
+
archiveThread(input: {
|
|
77
|
+
threadId: string;
|
|
78
|
+
locked?: boolean;
|
|
79
|
+
}): Promise<void>;
|
|
80
|
+
unarchiveThread(input: {
|
|
81
|
+
threadId: string;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
start(onEvent: (event: DiscordInboundEvent) => Promise<void>, onError?: (error: unknown) => void): Promise<void>;
|
|
84
|
+
stop(): Promise<void>;
|
|
85
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Telegram HTML formatting helpers for the
|
|
2
|
+
* Telegram HTML formatting helpers for the Gajae-Code SDK.
|
|
3
3
|
*
|
|
4
|
-
* All
|
|
4
|
+
* All Gajae-Code SDK Telegram output is sent with `parse_mode: "HTML"`. This
|
|
5
5
|
* module is the single source of truth for: escaping dynamic text, converting a
|
|
6
6
|
* bounded markdown subset into Telegram HTML, safely truncating a finished
|
|
7
7
|
* message to Telegram's 4096-char limit without breaking tags/entities, and
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Hosts a per-session loopback WebSocket notification server (the Rust core via
|
|
5
5
|
* N-API) and bridges GJC session events + the `ask` tool to it so a remote client
|
|
6
|
-
* (e.g. a Telegram bot) can both see action-needed signals and
|
|
7
|
-
*
|
|
6
|
+
* (e.g. a Telegram bot) can both see action-needed signals and answer them
|
|
7
|
+
* through SDK-native session capabilities:
|
|
8
8
|
*
|
|
9
9
|
* - `ask` (interactive): registers an {@link AskAnswerSource}; the ask tool races
|
|
10
10
|
* the local UI against a remote reply. First valid answer wins; a local answer
|
|
11
11
|
* aborts the remote wait (and broadcasts `action_resolved` resolvedBy=local).
|
|
12
|
-
* - `ask` (
|
|
12
|
+
* - `ask` (workflow gate): observes emitted workflow gates and resolves the real
|
|
13
13
|
* gate on a remote reply via `ctx.workflowGate`.
|
|
14
14
|
* - `turn_end` -> `action_needed` (kind `idle`, deduped per turn).
|
|
15
15
|
* - `session_shutdown` -> `session_closed` frame, stop server, deregister answer source.
|
|
@@ -17,8 +17,13 @@
|
|
|
17
17
|
* Enable with Settings notifications config, `GJC_NOTIFICATIONS=1` (a token is
|
|
18
18
|
* generated), or `GJC_NOTIFICATIONS_TOKEN`.
|
|
19
19
|
*/
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
20
|
+
import { NotificationServer } from "@gajae-code/natives";
|
|
21
|
+
import { Settings } from "../../config/settings";
|
|
22
|
+
import type { ExtensionAPI, ExtensionContext } from "../../extensibility/extensions";
|
|
23
|
+
import type { WorkflowGateTerminalProof } from "../../modes/shared/agent-wire/workflow-gate-broker";
|
|
24
|
+
import type { AskRemoteControl } from "../../tools";
|
|
25
|
+
import { NotificationSessionController } from "./session-control";
|
|
26
|
+
import { type EnsureDaemonResult } from "./telegram-daemon";
|
|
22
27
|
/** Where a `session_create` should run. Discriminated by `kind`. */
|
|
23
28
|
export type SessionCreateTarget = {
|
|
24
29
|
kind: "existing_path";
|
|
@@ -59,7 +64,7 @@ export interface SessionCreateFrame {
|
|
|
59
64
|
/** Control-endpoint token authorizing this frame. */
|
|
60
65
|
token: string;
|
|
61
66
|
target: SessionCreateTarget;
|
|
62
|
-
/**
|
|
67
|
+
/** Reserved for a future capability transport; any supplied value is rejected before lifecycle acceptance. */
|
|
63
68
|
startupPromptRef?: string;
|
|
64
69
|
/** Model profile preset to activate for the spawned session (--mpreset). */
|
|
65
70
|
modelPreset?: string;
|
|
@@ -83,6 +88,7 @@ export interface SessionResumeFrame {
|
|
|
83
88
|
chatId: string;
|
|
84
89
|
token: string;
|
|
85
90
|
target: SessionResumeTarget;
|
|
91
|
+
/** Reserved for a future capability transport; any supplied value is rejected before lifecycle acceptance. */
|
|
86
92
|
startupPromptRef?: string;
|
|
87
93
|
}
|
|
88
94
|
/** Any client -> ingress lifecycle request frame. */
|
|
@@ -136,7 +142,7 @@ export interface SessionResumeResponseFrame {
|
|
|
136
142
|
topic: LifecycleTopic;
|
|
137
143
|
}
|
|
138
144
|
/** Machine-readable reason a lifecycle request failed. */
|
|
139
|
-
export type LifecycleErrorReason = "unauthorized" | "rate_limited" | "duplicate_conflict" | "invalid_target" | "ambiguous_target" | "spawn_failed" | "discovery_timeout" | "readiness_timeout" | "close_refused" | "not_found" | "terminal_uncertain";
|
|
145
|
+
export type LifecycleErrorReason = "unauthorized" | "rate_limited" | "duplicate_conflict" | "invalid_target" | "ambiguous_target" | "spawn_failed" | "discovery_timeout" | "readiness_timeout" | "close_refused" | "not_found" | "terminal_uncertain" | "unsupported_platform";
|
|
140
146
|
/** A candidate returned with an `ambiguous_target` resume error. */
|
|
141
147
|
export interface ResumeCandidate {
|
|
142
148
|
sessionId: string;
|
|
@@ -175,8 +181,86 @@ export interface SessionReadyFrame {
|
|
|
175
181
|
* instead of the worktree directory (e.g. `feat-foo-01047f11`).
|
|
176
182
|
*/
|
|
177
183
|
export declare function readGitRepoName(cwd: string): string | undefined;
|
|
184
|
+
interface UnattendedGatePresentation {
|
|
185
|
+
gateId: string;
|
|
186
|
+
sessionId: string;
|
|
187
|
+
question: string;
|
|
188
|
+
options: string[];
|
|
189
|
+
controls: readonly AskRemoteControl[];
|
|
190
|
+
multi: boolean;
|
|
191
|
+
allowEmpty: boolean;
|
|
192
|
+
navigationLabel?: "Next" | "Done";
|
|
193
|
+
selectedOptions: string[];
|
|
194
|
+
workflowGateId?: string;
|
|
195
|
+
onActivated?: (actionId: string, lease: {
|
|
196
|
+
actionId: string;
|
|
197
|
+
registrationEpoch: number;
|
|
198
|
+
}) => void;
|
|
199
|
+
onClosed?: () => void;
|
|
200
|
+
}
|
|
201
|
+
type RetireStatus = "retired" | "already_terminal" | "claimed" | "stale";
|
|
202
|
+
type DirectControlOutcome = "accepted" | "rejected" | "unknown";
|
|
203
|
+
export declare class PresentationArbiter {
|
|
204
|
+
#private;
|
|
205
|
+
private readonly server;
|
|
206
|
+
private readonly redact;
|
|
207
|
+
private readonly tag;
|
|
208
|
+
private readonly presentations;
|
|
209
|
+
private readonly routes;
|
|
210
|
+
private active;
|
|
211
|
+
private readonly queue;
|
|
212
|
+
private readonly retries;
|
|
213
|
+
private readonly retiredProofs;
|
|
214
|
+
private readonly directControls;
|
|
215
|
+
/** Explicit terminal proof for a direct control fenced before native publication. */
|
|
216
|
+
private readonly queuedDirectControls;
|
|
217
|
+
private retryTimer;
|
|
218
|
+
private retryTimerGateId;
|
|
219
|
+
private retryTimerGeneration;
|
|
220
|
+
private readonly terminalCancellationTimers;
|
|
221
|
+
private headGeneration;
|
|
222
|
+
private observedHead;
|
|
223
|
+
static readonly maxRegistrationAttempts = 3;
|
|
224
|
+
static readonly retryBaseDelayMs = 50;
|
|
225
|
+
static readonly retryMaxDelayMs = 1000;
|
|
226
|
+
/** Bound an unavailable interactive answer source without discarding its head silently. */
|
|
227
|
+
static readonly terminalCancellationDelayMs = 250;
|
|
228
|
+
/** Revalidates the live endpoint queue head before bounded recovery. */
|
|
229
|
+
reconcile(): void;
|
|
230
|
+
/** Explicit production recovery for a previously exhausted endpoint queue head. */
|
|
231
|
+
recover(gateId?: string): void;
|
|
232
|
+
hasActivePresentation(): boolean;
|
|
233
|
+
retireForDirectControl(gateId: string): RetireStatus;
|
|
234
|
+
prepareDirectControl(gateId: string): {
|
|
235
|
+
status: "retired" | "queued";
|
|
236
|
+
ordinal: number;
|
|
237
|
+
} | {
|
|
238
|
+
status: "claimed" | "stale";
|
|
239
|
+
};
|
|
240
|
+
finishDirectControl(gateId: string, prepared: {
|
|
241
|
+
status: "retired" | "queued";
|
|
242
|
+
ordinal: number;
|
|
243
|
+
}, outcome: DirectControlOutcome): void;
|
|
244
|
+
constructor(server: NotificationServer, redact: () => boolean, tag: string);
|
|
245
|
+
retain(presentation: UnattendedGatePresentation): void;
|
|
246
|
+
routeFor(actionId: string): string | undefined;
|
|
247
|
+
presentationFor(actionId: string): UnattendedGatePresentation | undefined;
|
|
248
|
+
/** The native generic claim has already resolved this old action. */
|
|
249
|
+
toggle(actionId: string, label: string): boolean;
|
|
250
|
+
/** Clears an interactive route only when it is still the route that settled. */
|
|
251
|
+
completeInteractive(gateId: string, actionId: string): void;
|
|
252
|
+
/** Clears an interactive presentation after its route was retired for direct control. */
|
|
253
|
+
completeDirect(gateId: string): void;
|
|
254
|
+
reissueAfterFailure(actionId: string): void;
|
|
255
|
+
reissue(gateId: string): string | undefined;
|
|
256
|
+
closeInteraction(actionId: string, reason: string): boolean;
|
|
257
|
+
complete(gateId: string): WorkflowGateTerminalProof;
|
|
258
|
+
cancelInteractive(): void;
|
|
259
|
+
cancel(gateId: string, reason: string): void;
|
|
260
|
+
dispose(): void;
|
|
261
|
+
}
|
|
178
262
|
export declare function notificationsEnabled(): boolean;
|
|
179
|
-
/** Workflow-gate answer shape
|
|
263
|
+
/** Workflow-gate answer shape. */
|
|
180
264
|
interface GateAnswer {
|
|
181
265
|
selected: string[];
|
|
182
266
|
other?: boolean;
|
|
@@ -195,11 +279,11 @@ type GateAnswerResult = {
|
|
|
195
279
|
reason: string;
|
|
196
280
|
};
|
|
197
281
|
/**
|
|
198
|
-
* Map a client answer to the workflow-gate answer shape
|
|
282
|
+
* Map a client answer to the workflow-gate answer shape.
|
|
199
283
|
*
|
|
200
284
|
* The protocol defines a numeric reply as an option index, so a number outside
|
|
201
|
-
* `options` is invalid
|
|
202
|
-
*
|
|
285
|
+
* `options` is invalid: it must NOT be converted into free text that passes the
|
|
286
|
+
* ask schema and triggers a misleading success acknowledgement.
|
|
203
287
|
* Only JSON strings enter the free-text/Other path.
|
|
204
288
|
*/
|
|
205
289
|
export declare function mapAnswerToGate(answerJson: string, options: string[]): GateAnswerResult;
|
|
@@ -207,13 +291,29 @@ interface NotificationControlCommandPayload {
|
|
|
207
291
|
name?: unknown;
|
|
208
292
|
action?: unknown;
|
|
209
293
|
level?: unknown;
|
|
294
|
+
global?: unknown;
|
|
295
|
+
selector?: unknown;
|
|
210
296
|
instructions?: unknown;
|
|
211
297
|
}
|
|
212
|
-
export
|
|
298
|
+
export interface NotificationControlCommandResult {
|
|
213
299
|
status: "ok" | "error" | "unavailable";
|
|
214
300
|
message: string;
|
|
215
|
-
|
|
301
|
+
modelChoices?: Array<{
|
|
302
|
+
selector: string;
|
|
303
|
+
label: string;
|
|
304
|
+
}>;
|
|
305
|
+
}
|
|
306
|
+
export declare function executeNotificationControlCommand(command: NotificationControlCommandPayload | undefined, ctx: ExtensionContext, api: ExtensionAPI, expectedSessionId?: string): Promise<NotificationControlCommandResult>;
|
|
216
307
|
export declare function createNotificationsExtension(api: ExtensionAPI, options?: {
|
|
217
308
|
settings?: Settings;
|
|
309
|
+
ensureTelegramDaemon?: (input: {
|
|
310
|
+
settings: Settings;
|
|
311
|
+
cwd: string;
|
|
312
|
+
sessionId: string;
|
|
313
|
+
}) => Promise<EnsureDaemonResult>;
|
|
314
|
+
/** Suppress auto-delivery for a GJC-spawned child under `sessionScope=primary`. */
|
|
315
|
+
spawnedByGjc?: boolean;
|
|
316
|
+
controller?: NotificationSessionController;
|
|
317
|
+
onSdkRequest?: (kind: "control" | "query", connectionId: string, frame: Record<string, unknown>) => void;
|
|
218
318
|
}): void;
|
|
219
319
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type OwnerIsolationProbe } from "
|
|
2
|
-
import { type GjcTmuxSessionStatus } from "
|
|
1
|
+
import { type OwnerIsolationProbe } from "../../gjc-runtime/tmux-owner-isolation";
|
|
2
|
+
import { type GjcTmuxSessionStatus } from "../../gjc-runtime/tmux-sessions";
|
|
3
3
|
import type { ResumeCandidate, SessionCreateFrame, SessionLifecycleRequest, SessionLifecycleResponse } from "./index";
|
|
4
4
|
import { type AuditEvent, type CreateEffectResult, type LedgerStore, type LifecycleOutcome, type OrchestratorDeps, type ResumeEffectResult } from "./lifecycle-orchestrator";
|
|
5
5
|
/** Minimal view of the native control server this runtime depends on. */
|
|
@@ -96,6 +96,8 @@ export declare function attachLifecycleControl(server: ControlServerLike, deps:
|
|
|
96
96
|
export declare function buildOrchestratorDeps(input: {
|
|
97
97
|
pairedChatId: string;
|
|
98
98
|
agentNotificationsDir: string;
|
|
99
|
+
/** Required in-memory, 32-byte audit-v2 redaction key. */
|
|
100
|
+
auditRedactionKey: Uint8Array;
|
|
99
101
|
/** Root of saved session histories (`<agentDir>/sessions`), for resume resolution. */
|
|
100
102
|
sessionsRoot?: string;
|
|
101
103
|
env?: NodeJS.ProcessEnv;
|
|
@@ -19,6 +19,7 @@ export interface LedgerEntry {
|
|
|
19
19
|
/** Close effect outcome: whether the tmux process is confirmed gone. */
|
|
20
20
|
processGone?: boolean;
|
|
21
21
|
reason?: LifecycleErrorReason;
|
|
22
|
+
resumeMode?: ResumeEffectResult["mode"];
|
|
22
23
|
}
|
|
23
24
|
/** The full on-disk ledger document. */
|
|
24
25
|
export interface LedgerDoc {
|
|
@@ -31,23 +32,18 @@ export interface LedgerStore {
|
|
|
31
32
|
/** Write atomically (temp + fsync + rename) under a per-ledger lock. */
|
|
32
33
|
write(doc: LedgerDoc): Promise<void>;
|
|
33
34
|
}
|
|
34
|
-
/**
|
|
35
|
+
/** Redacted audit-v2 event. */
|
|
35
36
|
export interface AuditEvent {
|
|
37
|
+
schemaVersion: 2;
|
|
36
38
|
ts: string;
|
|
37
39
|
event: "accepted" | "rejected" | "duplicate_reack" | "rate_limited" | "spawn_started" | "recovered_in_progress" | "success" | "failure" | "terminal_uncertain";
|
|
38
|
-
|
|
40
|
+
chatRef: string;
|
|
39
41
|
updateId: number;
|
|
40
|
-
|
|
41
|
-
requestHash: string;
|
|
42
|
+
requestRef: string;
|
|
42
43
|
verb: SessionLifecycleRequest["type"];
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
tmuxSession?: string;
|
|
44
|
+
targetKind: CanonicalTargetKind;
|
|
45
|
+
targetRef: string;
|
|
46
46
|
reason?: LifecycleErrorReason;
|
|
47
|
-
/** Prompt byte length only (never the prompt text). */
|
|
48
|
-
promptBytes?: number;
|
|
49
|
-
/** Prompt content hash only (never the prompt text). */
|
|
50
|
-
promptHash?: string;
|
|
51
47
|
}
|
|
52
48
|
export interface CreateEffectResult {
|
|
53
49
|
sessionId: string;
|
|
@@ -63,13 +59,17 @@ export interface ResumeEffectResult extends CreateEffectResult {
|
|
|
63
59
|
export interface OrchestratorDeps {
|
|
64
60
|
/** The single paired chat id. Anything else is rejected before parsing. */
|
|
65
61
|
pairedChatId: string;
|
|
62
|
+
/** In-memory, derived 32-byte audit-v2 HMAC key. */
|
|
63
|
+
auditRedactionKey: Uint8Array;
|
|
66
64
|
now: () => number;
|
|
67
65
|
store: LedgerStore;
|
|
68
66
|
audit: (event: AuditEvent) => Promise<void> | void;
|
|
67
|
+
/** Resolves the returned tmux provider once per request for psmux preflight. */
|
|
68
|
+
isPsmuxProvider: () => boolean;
|
|
69
69
|
/** Per-chat create rate limiter: returns true when allowed. */
|
|
70
70
|
allowCreate: (chatId: string, nowMs: number) => boolean;
|
|
71
|
-
/** Persist the once-consumed 0600 startup-prompt file
|
|
72
|
-
writeStartupPrompt: (requestId: string, prompt: string | undefined) => Promise<string | undefined>;
|
|
71
|
+
/** Persist the once-consumed 0600 startup-prompt file after durably recording its ref. */
|
|
72
|
+
writeStartupPrompt: (requestId: string, prompt: string | undefined, persistRef: (ref: string) => Promise<void>) => Promise<string | undefined>;
|
|
73
73
|
/** Spawn a session for a create/cold-restart. */
|
|
74
74
|
spawnCreate: (frame: SessionCreateFrame, ids: {
|
|
75
75
|
lifecycleRequestId: string;
|
|
@@ -91,16 +91,13 @@ export interface OrchestratorDeps {
|
|
|
91
91
|
} | {
|
|
92
92
|
notFound: true;
|
|
93
93
|
}>;
|
|
94
|
-
newLifecycleRequestId: () => string;
|
|
95
|
-
newSessionId: () => string;
|
|
96
94
|
}
|
|
97
|
-
|
|
98
|
-
export declare function
|
|
99
|
-
|
|
100
|
-
* Stable request hash over the meaningful (non-token) request content. Used to
|
|
101
|
-
* detect a duplicate update id reused with a DIFFERENT body (conflict).
|
|
102
|
-
*/
|
|
95
|
+
export type CanonicalTargetKind = "existing_path" | "worktree" | "plain_dir" | "session_close" | "session_resume";
|
|
96
|
+
export declare function canonicalTarget(frame: SessionLifecycleRequest): string;
|
|
97
|
+
export declare function canonicalRequest(frame: SessionLifecycleRequest): string;
|
|
103
98
|
export declare function requestHash(frame: SessionLifecycleRequest): string;
|
|
99
|
+
export declare function auditRedactionRef(key: Uint8Array, domain: string, value: string): string;
|
|
100
|
+
export declare function summarizeTarget(frame: SessionLifecycleRequest): Record<string, unknown>;
|
|
104
101
|
export declare function ledgerKey(chatId: string, updateId: number): string;
|
|
105
102
|
/** How a freshly-arrived request relates to the durable ledger. */
|
|
106
103
|
export type DuplicateClass = {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NativeRuntimeCompatibilityError extends Error {
|
|
2
|
+
readonly runtimeVersion: string;
|
|
3
|
+
readonly nativeVersion: string;
|
|
4
|
+
readonly workflowArbitrationAvailable: boolean;
|
|
5
|
+
readonly code = "native_runtime_incompatible";
|
|
6
|
+
readonly retryable = false;
|
|
7
|
+
constructor(runtimeVersion: string, nativeVersion: string, workflowArbitrationAvailable: boolean);
|
|
8
|
+
}
|
|
9
|
+
export declare function assertNativeRuntimeCompatibility(input: {
|
|
10
|
+
runtimeVersion: string;
|
|
11
|
+
nativeVersion: string;
|
|
12
|
+
notificationServer: unknown;
|
|
13
|
+
}): void;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type { RawSettings, SettingsAtomicPatch, SettingsAtomicReceipt } from "../../config/settings";
|
|
2
|
+
import { type NotificationSettingsReader, type TelegramActivationMarker, type TelegramActivationMarkers, type TelegramActivationReason, type TelegramActivationState, telegramActivationIdentity } from "./config";
|
|
3
|
+
import { type EnsureTelegramDaemonDetailedResult, type TelegramDaemonFs } from "./telegram-daemon";
|
|
4
|
+
export type { TelegramActivationMarker, TelegramActivationMarkers, TelegramActivationReason, TelegramActivationState };
|
|
5
|
+
export { telegramActivationIdentity };
|
|
6
|
+
/** The identity relationship between a proposed Telegram configuration and a live daemon owner. */
|
|
7
|
+
export type ProposedTelegramIdentityStatus = "absent" | "same" | "foreign" | "unknown";
|
|
8
|
+
/**
|
|
9
|
+
* Non-secret metadata about a daemon owner. Token fingerprints and the owner's
|
|
10
|
+
* chat ID intentionally never cross this boundary. `chatDisplay`, when present,
|
|
11
|
+
* is supplied by the caller from an already-approved proposed-chat display.
|
|
12
|
+
*/
|
|
13
|
+
export interface TelegramDaemonOwnerMetadata {
|
|
14
|
+
ownerId: string;
|
|
15
|
+
pid: number;
|
|
16
|
+
generation?: number;
|
|
17
|
+
chatDisplay?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Secret-safe proposed-identity preflight outcome. */
|
|
20
|
+
export interface ProposedTelegramIdentity {
|
|
21
|
+
status: ProposedTelegramIdentityStatus;
|
|
22
|
+
owner?: TelegramDaemonOwnerMetadata;
|
|
23
|
+
}
|
|
24
|
+
export interface ProposedTelegramIdentityPreflightInput {
|
|
25
|
+
settings: NotificationSettingsReader;
|
|
26
|
+
botToken: string;
|
|
27
|
+
chatId: string;
|
|
28
|
+
/** A UI-approved display value for the proposed chat; never inferred from a foreign daemon state. */
|
|
29
|
+
chatDisplay?: string;
|
|
30
|
+
deps?: {
|
|
31
|
+
fs?: TelegramDaemonFs;
|
|
32
|
+
pidAlive?: (pid: number) => boolean;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compare a proposed identity with the current daemon owner without exposing a
|
|
37
|
+
* token or token fingerprint. Invalid/unreadable state is deliberately
|
|
38
|
+
* `unknown`, which callers must treat as cancel-by-default.
|
|
39
|
+
*/
|
|
40
|
+
export declare function proposedTelegramIdentity(input: ProposedTelegramIdentityPreflightInput): Promise<ProposedTelegramIdentity>;
|
|
41
|
+
export interface NotificationConfigurationWriter extends NotificationSettingsReader {
|
|
42
|
+
commitAtomicBatch(patches: readonly SettingsAtomicPatch[]): Promise<SettingsAtomicReceipt>;
|
|
43
|
+
commitAtomicBatchWithCurrent?(buildPatches: (current: Readonly<RawSettings>) => Promise<readonly SettingsAtomicPatch[]> | readonly SettingsAtomicPatch[]): Promise<SettingsAtomicReceipt>;
|
|
44
|
+
}
|
|
45
|
+
export declare function createTelegramActivationMarker(input: {
|
|
46
|
+
botToken: string;
|
|
47
|
+
chatId: string;
|
|
48
|
+
state: TelegramActivationState;
|
|
49
|
+
reason?: TelegramActivationReason;
|
|
50
|
+
now?: Date;
|
|
51
|
+
}): TelegramActivationMarker;
|
|
52
|
+
export declare function observedTelegramActivationMarker(settings: NotificationSettingsReader, botToken: string, chatId: string): TelegramActivationMarker | undefined;
|
|
53
|
+
/** Persist one durable marker without discarding markers for other identities. */
|
|
54
|
+
export declare function persistTelegramActivationMarker(settings: NotificationConfigurationWriter, marker: TelegramActivationMarker): Promise<SettingsAtomicReceipt>;
|
|
55
|
+
/** Clear only the exact marker that was safely reconciled. */
|
|
56
|
+
export declare function clearTelegramActivationMarker(settings: NotificationConfigurationWriter, marker: TelegramActivationMarker): Promise<void>;
|
|
57
|
+
export type CompleteNonTelegramAdapter = "discord" | "slack";
|
|
58
|
+
export type SaveTelegramInactiveAvailability = {
|
|
59
|
+
available: true;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Telegram-specific activation markers let Save inactive preserve globally
|
|
63
|
+
* enabled Discord and Slack adapters, so the action is always available.
|
|
64
|
+
*/
|
|
65
|
+
export declare function getSaveTelegramInactiveAvailability(_settings: NotificationSettingsReader): SaveTelegramInactiveAvailability;
|
|
66
|
+
export type SaveTelegramInactiveResult = {
|
|
67
|
+
status: "saved_inactive";
|
|
68
|
+
receipt: SettingsAtomicReceipt;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Atomically persist Telegram credentials with a non-secret inactive marker.
|
|
72
|
+
* Global notifications are disabled only when Telegram is the sole complete adapter.
|
|
73
|
+
*/
|
|
74
|
+
export declare function saveTelegramInactive(input: {
|
|
75
|
+
settings: NotificationConfigurationWriter;
|
|
76
|
+
botToken: string;
|
|
77
|
+
chatId: string;
|
|
78
|
+
}): Promise<SaveTelegramInactiveResult>;
|
|
79
|
+
export interface TelegramRemovalRuntime {
|
|
80
|
+
/** Stops the local endpoint, unregisters its root, and stops an unreferenced old daemon. */
|
|
81
|
+
stopAndUnregister(): Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Remove Telegram credentials without disturbing other adapters. Runtime
|
|
85
|
+
* teardown is intentionally first: a failed teardown leaves durable credentials
|
|
86
|
+
* untouched rather than orphaning an old daemon/root behind a successful delete.
|
|
87
|
+
*/
|
|
88
|
+
export declare function removeTelegramConfiguration(input: {
|
|
89
|
+
settings: NotificationConfigurationWriter;
|
|
90
|
+
removal: TelegramRemovalRuntime;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
receipt: SettingsAtomicReceipt;
|
|
93
|
+
globallyDisabled: boolean;
|
|
94
|
+
}>;
|
|
95
|
+
/** Detailed outcome of checking or reconnecting the Telegram daemon after a durable commit. */
|
|
96
|
+
export type TelegramDaemonReconnectOutcome = EnsureTelegramDaemonDetailedResult;
|
|
97
|
+
/**
|
|
98
|
+
* The session controller must not resolve `enterBlockedRuntime` until its
|
|
99
|
+
* current endpoint has stopped and been removed. This lets callers report a
|
|
100
|
+
* blocked save only after no further frames can reach the foreign owner.
|
|
101
|
+
*/
|
|
102
|
+
export interface NotificationRuntimeController {
|
|
103
|
+
/** Resolves only after the current endpoint is stopped and removed. */
|
|
104
|
+
enterBlockedRuntime(): Promise<unknown>;
|
|
105
|
+
clearBlockedRuntime(): Promise<unknown>;
|
|
106
|
+
reconcileCurrentSession(): Promise<unknown>;
|
|
107
|
+
}
|
|
108
|
+
export interface TelegramPostCommitActivation {
|
|
109
|
+
controller: NotificationRuntimeController;
|
|
110
|
+
reconnect: () => Promise<TelegramDaemonReconnectOutcome>;
|
|
111
|
+
/** Durable Telegram-only marker write after the endpoint has stopped. */
|
|
112
|
+
persistInactive(marker: TelegramActivationMarker): Promise<SettingsAtomicReceipt>;
|
|
113
|
+
/** Remove the exact activation marker only after a safe reconnect. */
|
|
114
|
+
clearInactive(marker: TelegramActivationMarker): Promise<void>;
|
|
115
|
+
marker: TelegramActivationMarker;
|
|
116
|
+
}
|
|
117
|
+
export type PostCommitTelegramActivationResult = {
|
|
118
|
+
status: "activated";
|
|
119
|
+
reconnect: Exclude<TelegramDaemonReconnectOutcome, "blocked_identity">;
|
|
120
|
+
} | {
|
|
121
|
+
status: "blocked_identity";
|
|
122
|
+
message: string;
|
|
123
|
+
restore(): Promise<BlockedTelegramRestoreResult>;
|
|
124
|
+
retainCommitted(): void;
|
|
125
|
+
};
|
|
126
|
+
export type BlockedTelegramRestoreResult = {
|
|
127
|
+
status: "restored";
|
|
128
|
+
reconnect: TelegramDaemonReconnectOutcome;
|
|
129
|
+
} | {
|
|
130
|
+
status: "conflict";
|
|
131
|
+
paths: readonly string[];
|
|
132
|
+
} | {
|
|
133
|
+
status: "discarded";
|
|
134
|
+
} | {
|
|
135
|
+
status: "still_blocked";
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Complete a committed Telegram update in the required order: identity
|
|
139
|
+
* reconnect first, normal session reconciliation second. A post-commit foreign
|
|
140
|
+
* owner race stops the endpoint, durably marks only that Telegram identity
|
|
141
|
+
* inactive, then exposes an ordered CAS restore/retain choice.
|
|
142
|
+
*/
|
|
143
|
+
export declare function reconcileCommittedTelegramConfiguration(input: {
|
|
144
|
+
receipt: SettingsAtomicReceipt;
|
|
145
|
+
activation: TelegramPostCommitActivation;
|
|
146
|
+
inactiveMarkerToClear?: TelegramActivationMarker;
|
|
147
|
+
}): Promise<PostCommitTelegramActivationResult>;
|
|
148
|
+
export type SaveTelegramConfigurationResult = {
|
|
149
|
+
status: "cancelled";
|
|
150
|
+
preflight: ProposedTelegramIdentity;
|
|
151
|
+
guidance: string;
|
|
152
|
+
} | SaveTelegramInactiveResult | {
|
|
153
|
+
status: "saved";
|
|
154
|
+
receipt: SettingsAtomicReceipt;
|
|
155
|
+
preflight: ProposedTelegramIdentity;
|
|
156
|
+
} | PostCommitTelegramActivationResult;
|
|
157
|
+
/**
|
|
158
|
+
* Guard a Telegram setup commit with proposed-identity preflight. Foreign and
|
|
159
|
+
* unreadable ownership are cancel-by-default and make no configuration changes.
|
|
160
|
+
*/
|
|
161
|
+
export declare function saveTelegramConfiguration(input: {
|
|
162
|
+
settings: NotificationConfigurationWriter;
|
|
163
|
+
botToken: string;
|
|
164
|
+
chatId: string;
|
|
165
|
+
chatDisplay?: string;
|
|
166
|
+
/** Explicitly persist credentials disabled after a foreign/unknown preflight; otherwise cancel remains the default. */
|
|
167
|
+
saveInactive: boolean;
|
|
168
|
+
preflight?: (input: Omit<ProposedTelegramIdentityPreflightInput, "settings">) => Promise<ProposedTelegramIdentity>;
|
|
169
|
+
activation?: TelegramPostCommitActivation;
|
|
170
|
+
}): Promise<SaveTelegramConfigurationResult>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Settings } from "
|
|
1
|
+
import type { Settings } from "../../config/settings";
|
|
2
2
|
/**
|
|
3
3
|
* Strip secrets from a human-facing diagnostic string. Redacts the configured
|
|
4
4
|
* bot token (exact match) and any token-shaped substring so health/test details
|
|
@@ -60,7 +60,13 @@ export interface DaemonHealth {
|
|
|
60
60
|
heartbeatFresh: boolean;
|
|
61
61
|
identityMatches: boolean;
|
|
62
62
|
stopped: boolean;
|
|
63
|
+
heartbeatAt: number | undefined;
|
|
64
|
+
heartbeatAgeMs: number | undefined;
|
|
65
|
+
generation: number | undefined;
|
|
66
|
+
currentGeneration: number;
|
|
67
|
+
generationRelation: DaemonGenerationRelation;
|
|
63
68
|
}
|
|
69
|
+
export type DaemonGenerationRelation = "pre_generation" | "older" | "current" | "newer" | "unknown";
|
|
64
70
|
export interface EndpointHealth {
|
|
65
71
|
total: number;
|
|
66
72
|
live: number;
|