@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,83 @@
|
|
|
1
|
+
import { type NotificationConfig } from "./config";
|
|
2
|
+
/** Minimal session-manager surface shared by extension, TUI, and headless hosts. */
|
|
3
|
+
export interface NotificationSessionContext {
|
|
4
|
+
sessionManager: {
|
|
5
|
+
getCwd(): string;
|
|
6
|
+
getSessionId(): string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/** A snapshot of the current session, resolved from the session manager per operation. */
|
|
10
|
+
export interface BoundNotificationSession<Context extends NotificationSessionContext = NotificationSessionContext> {
|
|
11
|
+
readonly context: Context;
|
|
12
|
+
readonly cwd: string;
|
|
13
|
+
readonly sessionId: string;
|
|
14
|
+
unbind(): void;
|
|
15
|
+
}
|
|
16
|
+
export type NotificationEndpointStartResult = "started" | "already" | "disabled" | "failed";
|
|
17
|
+
export type TelegramDaemonPreflightResult = "ready" | "blocked_identity";
|
|
18
|
+
/**
|
|
19
|
+
* The endpoint implementation is deliberately injected. The controller owns
|
|
20
|
+
* policy and session-local state while the extension continues to own its
|
|
21
|
+
* concrete NotificationServer resources.
|
|
22
|
+
*/
|
|
23
|
+
export interface NotificationSessionRuntime<Context extends NotificationSessionContext = NotificationSessionContext> {
|
|
24
|
+
isRunning(binding: BoundNotificationSession<Context>): boolean;
|
|
25
|
+
start(binding: BoundNotificationSession<Context>): Promise<NotificationEndpointStartResult>;
|
|
26
|
+
stop(binding: BoundNotificationSession<Context>): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Proves the complete Telegram owner identity before a generic endpoint can
|
|
29
|
+
* emit a frame. `blocked_identity` is fail-closed and starts nothing.
|
|
30
|
+
*/
|
|
31
|
+
ensureTelegramDaemon?(binding: BoundNotificationSession<Context>): Promise<TelegramDaemonPreflightResult>;
|
|
32
|
+
}
|
|
33
|
+
export interface NotificationSessionStatus {
|
|
34
|
+
eligible: boolean;
|
|
35
|
+
locallyEnabled: boolean;
|
|
36
|
+
effectiveEnabled: boolean;
|
|
37
|
+
running: boolean;
|
|
38
|
+
environment: "off" | "explicit" | "token" | "default";
|
|
39
|
+
}
|
|
40
|
+
export interface NotificationSessionReconcileResult {
|
|
41
|
+
outcome: NotificationEndpointStartResult | "stopped";
|
|
42
|
+
status: NotificationSessionStatus;
|
|
43
|
+
}
|
|
44
|
+
export interface NotificationSessionControllerOptions {
|
|
45
|
+
/** Gate A result, resolved once by the SDK from the canonical host predicate. */
|
|
46
|
+
eligible: boolean;
|
|
47
|
+
/** Reads the global-only, schema-default-resolved notification configuration. */
|
|
48
|
+
getConfig(): NotificationConfig;
|
|
49
|
+
/** Kept as a reference so test and embedding hosts can supply their own environment. */
|
|
50
|
+
env?: NodeJS.ProcessEnv;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Shared owner of notification session policy.
|
|
54
|
+
*
|
|
55
|
+
* Gate A is captured at creation. Gate B is evaluated for each session
|
|
56
|
+
* operation with `isSessionNotificationsEnabled`. Gate C verifies complete
|
|
57
|
+
* Telegram ownership before a generic endpoint is allowed to start.
|
|
58
|
+
*/
|
|
59
|
+
export declare class NotificationSessionController {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: NotificationSessionControllerOptions);
|
|
62
|
+
/** Attach the concrete generic endpoint implementation used by this host. */
|
|
63
|
+
attachRuntime<Context extends NotificationSessionContext>(runtime: NotificationSessionRuntime<Context>): () => void;
|
|
64
|
+
/**
|
|
65
|
+
* Bind a fresh session snapshot. Callers should not cache it: cwd and session
|
|
66
|
+
* id may change on `/new`, fork, or resume.
|
|
67
|
+
*/
|
|
68
|
+
bind<Context extends NotificationSessionContext>(context: Context): BoundNotificationSession<Context>;
|
|
69
|
+
/** Preserve session-local safety state and pending-operation ownership across a session rekey. */
|
|
70
|
+
rekeySession(previousSessionId: string, nextSessionId: string): void;
|
|
71
|
+
query<Context extends NotificationSessionContext>(context: Context): NotificationSessionStatus;
|
|
72
|
+
/** Stop the current endpoint during host shutdown without changing local preference. */
|
|
73
|
+
stopCurrentSession<Context extends NotificationSessionContext>(context: Context): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* Hold this session's endpoint inactive after a foreign-daemon identity race.
|
|
76
|
+
* The block remains until an explicit same-identity reconnect or CAS restore clears it.
|
|
77
|
+
*/
|
|
78
|
+
enterBlockedRuntime<Context extends NotificationSessionContext>(context: Context): Promise<boolean>;
|
|
79
|
+
/** Clear a block only after the caller has verified a safe same-identity reconnect or restore. */
|
|
80
|
+
clearBlockedRuntime<Context extends NotificationSessionContext>(context: Context): Promise<void>;
|
|
81
|
+
setLocalEnabled<Context extends NotificationSessionContext>(context: Context, enabled: boolean): Promise<NotificationSessionReconcileResult>;
|
|
82
|
+
reconcileCurrentSession<Context extends NotificationSessionContext>(context: Context): Promise<NotificationSessionReconcileResult>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type ConversationRecord } from "./conversation-store";
|
|
2
|
+
export interface SlackInboundDispatchReceipt {
|
|
3
|
+
key: string;
|
|
4
|
+
eventId: string;
|
|
5
|
+
interactionId: string;
|
|
6
|
+
retryKey: string;
|
|
7
|
+
eventContext?: string;
|
|
8
|
+
kind: "action" | "command";
|
|
9
|
+
actionId?: string;
|
|
10
|
+
/** The endpoint generation and SDK effect captured before Socket Mode ACK. */
|
|
11
|
+
endpointGeneration: number;
|
|
12
|
+
/** Identifier of the protected journal payload; mappings never retain message bodies. */
|
|
13
|
+
effectId: string;
|
|
14
|
+
idempotencyKey: string;
|
|
15
|
+
}
|
|
16
|
+
export type SlackConversationState = "absent" | "posting_root" | "active" | "closed_marker" | "resumed_root" | "error";
|
|
17
|
+
/** Durable Slack mapping. It contains identifiers and receipt metadata only; protected journal effects own message bodies. */
|
|
18
|
+
export interface SlackConversation extends ConversationRecord {
|
|
19
|
+
state: SlackConversationState;
|
|
20
|
+
teamId: string;
|
|
21
|
+
channelId: string;
|
|
22
|
+
rootTs?: string;
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
endpointGeneration?: number;
|
|
25
|
+
clientMsgId?: string;
|
|
26
|
+
/** Exclusive, expiring authority for provider reconciliation/publication of the root intent. */
|
|
27
|
+
rootPublicationOwner?: string;
|
|
28
|
+
rootPublicationLeaseExpiresAt?: number;
|
|
29
|
+
/** Monotonic fencing token; stale root publishers may not commit after takeover. */
|
|
30
|
+
rootPublicationFence?: number;
|
|
31
|
+
/** Exclusive, expiring authority for provider reconciliation/publication of the outbound action intent. */
|
|
32
|
+
outboundActionOwner?: string;
|
|
33
|
+
outboundActionLeaseExpiresAt?: number;
|
|
34
|
+
/** Monotonic fencing token; stale action publishers may not commit after takeover. */
|
|
35
|
+
outboundActionFence?: number;
|
|
36
|
+
/** Action authority only; action bodies and endpoint credentials are never persisted. */
|
|
37
|
+
pendingActionId?: string;
|
|
38
|
+
/** Durable, unpublished action intent. The action body is supplied only by the caller. */
|
|
39
|
+
outboundActionId?: string;
|
|
40
|
+
outboundActionClientMsgId?: string;
|
|
41
|
+
lastError?: string;
|
|
42
|
+
updatedAt: number;
|
|
43
|
+
seenEventIds: string[];
|
|
44
|
+
seenContextIds: string[];
|
|
45
|
+
seenRetryKeys: string[];
|
|
46
|
+
seenInteractionIds: string[];
|
|
47
|
+
/** Durable inbound effect identifiers. The protected journal owns replay payloads. */
|
|
48
|
+
inboundDispatches?: SlackInboundDispatchReceipt[];
|
|
49
|
+
}
|
|
50
|
+
export declare function slackConversationKey(input: {
|
|
51
|
+
teamId: string;
|
|
52
|
+
channelId: string;
|
|
53
|
+
rootTs: string;
|
|
54
|
+
}): string;
|
|
55
|
+
export declare function normalizeSlackConversation(record: SlackConversation): SlackConversation;
|
|
56
|
+
export declare function acceptsSlackInbound(record: SlackConversation, rootTs: string, endpointGeneration: number): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type SdkSessionEndpoint } from "../client/discovery";
|
|
2
|
+
import { ConversationStore } from "./conversation-store";
|
|
3
|
+
import { type SlackConversation } from "./slack-conversation";
|
|
4
|
+
export declare class SlackEndpointBindingError extends Error {
|
|
5
|
+
constructor(message?: string);
|
|
6
|
+
}
|
|
7
|
+
import type { SlackProvider, SlackSocketEnvelope } from "./slack-provider";
|
|
8
|
+
export interface SlackEndpoint extends SdkSessionEndpoint {
|
|
9
|
+
generation: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SlackSdkClient {
|
|
12
|
+
send(frame: Record<string, unknown>): void;
|
|
13
|
+
}
|
|
14
|
+
export interface SlackNotificationDaemonOptions {
|
|
15
|
+
agentDir: string;
|
|
16
|
+
repo: string;
|
|
17
|
+
teamId: string;
|
|
18
|
+
channelId: string;
|
|
19
|
+
provider: SlackProvider;
|
|
20
|
+
botUserId?: string;
|
|
21
|
+
/** Fail-closed authorization for the paired Slack principal. */
|
|
22
|
+
authorizeActor?: (actorId: string) => boolean | Promise<boolean>;
|
|
23
|
+
store?: ConversationStore<SlackConversation>;
|
|
24
|
+
now?: () => number;
|
|
25
|
+
randomId?: () => string;
|
|
26
|
+
/** Stable identity for the process attempting durable provider publication. */
|
|
27
|
+
publicationOwnerId?: string;
|
|
28
|
+
publicationLeaseMs?: number;
|
|
29
|
+
resolveEndpoint?: (sessionId: string) => Promise<SlackEndpoint | null>;
|
|
30
|
+
createClient: (endpoint: SlackEndpoint) => SlackSdkClient;
|
|
31
|
+
onCommand?: (sessionId: string, content: string, endpoint: SlackEndpoint, idempotencyKey: string) => Promise<boolean>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Slack Socket Mode notification daemon. Accepted inbound SDK effects are
|
|
35
|
+
* persisted before acknowledgement, including their replay payload and captured
|
|
36
|
+
* endpoint generation; endpoint credentials and Socket Mode cursors are never
|
|
37
|
+
* written to disk.
|
|
38
|
+
*/
|
|
39
|
+
export declare class SlackNotificationDaemon {
|
|
40
|
+
#private;
|
|
41
|
+
private readonly options;
|
|
42
|
+
readonly store: ConversationStore<SlackConversation>;
|
|
43
|
+
constructor(options: SlackNotificationDaemonOptions);
|
|
44
|
+
start(): Promise<void>;
|
|
45
|
+
stop(): Promise<void>;
|
|
46
|
+
/** Accepted inbound effects are durably claimed before their Socket Mode ACK. */
|
|
47
|
+
handleEnvelope(envelope: SlackSocketEnvelope): Promise<boolean>;
|
|
48
|
+
postRoot(sessionId: string, body: string, endpointGeneration?: number): Promise<SlackConversation>;
|
|
49
|
+
/** Deliver a notification into the mapped root thread, creating that root once. */
|
|
50
|
+
notify(sessionId: string, body: string, actionId?: string, endpointGeneration?: number): Promise<SlackConversation>;
|
|
51
|
+
/** Posts a safe command outcome to the active mapped root thread. */
|
|
52
|
+
postCommandResult(sessionId: string, content: string): Promise<boolean>;
|
|
53
|
+
resolveAction(sessionId: string, actionId: string): Promise<void>;
|
|
54
|
+
close(sessionId: string, marker?: string): Promise<boolean>;
|
|
55
|
+
resume(sessionId: string, body: string, endpointGeneration?: number): Promise<SlackConversation>;
|
|
56
|
+
findSession(sessionId: string, includeInactive: boolean): Promise<{
|
|
57
|
+
key: string;
|
|
58
|
+
record: SlackConversation;
|
|
59
|
+
} | undefined>;
|
|
60
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { SlackMessageSearchResult, SlackPostedMessage, SlackProviderClient, SlackSocketEnvelope } from "./slack-provider";
|
|
2
|
+
export type SlackProviderErrorCode = "connection" | "protocol" | "web_api" | "rate_limited";
|
|
3
|
+
/** A Slack transport failure whose fields are safe to surface without credentials. */
|
|
4
|
+
export declare class SlackProviderError extends Error {
|
|
5
|
+
readonly code: SlackProviderErrorCode;
|
|
6
|
+
readonly operation: string;
|
|
7
|
+
readonly status?: number | undefined;
|
|
8
|
+
readonly retryAfterMs?: number | undefined;
|
|
9
|
+
/** The server may have accepted the request before its response became unusable. */
|
|
10
|
+
readonly mayHaveBeenAccepted: boolean;
|
|
11
|
+
readonly retryable: boolean;
|
|
12
|
+
constructor(code: SlackProviderErrorCode, operation: string, status?: number | undefined, retryAfterMs?: number | undefined,
|
|
13
|
+
/** The server may have accepted the request before its response became unusable. */
|
|
14
|
+
mayHaveBeenAccepted?: boolean);
|
|
15
|
+
}
|
|
16
|
+
export interface SlackWebSocket {
|
|
17
|
+
readonly readyState: number;
|
|
18
|
+
onopen: ((event: Event) => void) | null;
|
|
19
|
+
onmessage: ((event: MessageEvent) => void) | null;
|
|
20
|
+
onclose: ((event: CloseEvent) => void) | null;
|
|
21
|
+
onerror: ((event: Event) => void) | null;
|
|
22
|
+
send(data: string): void;
|
|
23
|
+
close(): void;
|
|
24
|
+
}
|
|
25
|
+
export interface SlackLiveProviderOptions {
|
|
26
|
+
appToken: string;
|
|
27
|
+
botToken: string;
|
|
28
|
+
fetch?: (input: string, init?: RequestInit) => Promise<Response>;
|
|
29
|
+
webSocket?: (url: string) => SlackWebSocket;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
sleep?: (milliseconds: number) => Promise<void>;
|
|
32
|
+
reconnectDelayMs?: number;
|
|
33
|
+
maxRateLimitRetries?: number;
|
|
34
|
+
maxRetryAfterMs?: number;
|
|
35
|
+
activityTimeoutMs?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Production Socket Mode and Web API client. It keeps all connection state in
|
|
39
|
+
* memory and deliberately never maintains a Slack cursor.
|
|
40
|
+
*/
|
|
41
|
+
export declare class SlackLiveProvider implements SlackProviderClient {
|
|
42
|
+
#private;
|
|
43
|
+
get transportHealthy(): boolean;
|
|
44
|
+
constructor(options: SlackLiveProviderOptions);
|
|
45
|
+
start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
|
|
46
|
+
stop(): Promise<void>;
|
|
47
|
+
ack(envelopeId: string): Promise<void>;
|
|
48
|
+
postMessage(input: {
|
|
49
|
+
channel: string;
|
|
50
|
+
text: string;
|
|
51
|
+
threadTs?: string;
|
|
52
|
+
clientMsgId: string;
|
|
53
|
+
}): Promise<SlackPostedMessage>;
|
|
54
|
+
findMessageByClientMsgId(input: {
|
|
55
|
+
channel: string;
|
|
56
|
+
clientMsgId: string;
|
|
57
|
+
threadTs?: string;
|
|
58
|
+
}): Promise<SlackMessageSearchResult | null>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface SlackSocketEnvelope {
|
|
2
|
+
envelope_id: string;
|
|
3
|
+
payload: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface SlackPostedMessage {
|
|
6
|
+
channel: string;
|
|
7
|
+
ts: string;
|
|
8
|
+
client_msg_id?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SlackMessageSearchResult {
|
|
11
|
+
channel: string;
|
|
12
|
+
ts: string;
|
|
13
|
+
client_msg_id?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal Socket Mode + Web API seam. Implementations may wrap the official Slack SDK. */
|
|
16
|
+
export interface SlackProviderClient {
|
|
17
|
+
start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
|
|
18
|
+
stop?(): Promise<void>;
|
|
19
|
+
ack(envelopeId: string): Promise<void>;
|
|
20
|
+
postMessage(input: {
|
|
21
|
+
channel: string;
|
|
22
|
+
text: string;
|
|
23
|
+
threadTs?: string;
|
|
24
|
+
clientMsgId: string;
|
|
25
|
+
}): Promise<SlackPostedMessage>;
|
|
26
|
+
findMessageByClientMsgId?(input: {
|
|
27
|
+
channel: string;
|
|
28
|
+
clientMsgId: string;
|
|
29
|
+
threadTs?: string;
|
|
30
|
+
}): Promise<SlackMessageSearchResult | null>;
|
|
31
|
+
readonly transportHealthy?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Transport wrapper deliberately limited to Slack SDK operations. Keeping it injectable
|
|
35
|
+
* makes Socket Mode acknowledgement and Web API failure cases deterministic in tests.
|
|
36
|
+
*/
|
|
37
|
+
export declare class SlackProvider {
|
|
38
|
+
private readonly client;
|
|
39
|
+
constructor(client: SlackProviderClient);
|
|
40
|
+
start(onEnvelope: (envelope: SlackSocketEnvelope) => void | Promise<void>): Promise<void>;
|
|
41
|
+
get transportHealthy(): boolean;
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
ack(envelopeId: string): Promise<void>;
|
|
44
|
+
postMessage(input: {
|
|
45
|
+
channel: string;
|
|
46
|
+
text: string;
|
|
47
|
+
threadTs?: string;
|
|
48
|
+
clientMsgId: string;
|
|
49
|
+
}): Promise<SlackPostedMessage>;
|
|
50
|
+
findMessageByClientMsgId(input: {
|
|
51
|
+
channel: string;
|
|
52
|
+
clientMsgId: string;
|
|
53
|
+
threadTs?: string;
|
|
54
|
+
}): Promise<SlackMessageSearchResult | null>;
|
|
55
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
|
-
* Reference CLI for the
|
|
3
|
+
* Reference CLI for the Gajae-Code SDK Telegram client.
|
|
4
4
|
*
|
|
5
5
|
* Bridges a running GJC session's notification endpoint to a Telegram bot so you
|
|
6
6
|
* can answer asks / see idle pings from your phone — no RPC mode required. This
|
|
7
|
-
* is an EXAMPLE/template (the SDK contract is in `docs/
|
|
7
|
+
* is an EXAMPLE/template (the SDK contract is in `docs/sdk.md`);
|
|
8
8
|
* Discord/Slack clients are written the same way.
|
|
9
9
|
*
|
|
10
10
|
* Usage:
|
|
11
|
-
* bun run packages/coding-agent/src/
|
|
11
|
+
* bun run packages/coding-agent/src/sdk/bus/telegram-cli.ts \
|
|
12
12
|
* --bot-token <token> [--chat-id <id>] [--endpoint-file <path> | --session-id <id>] [--repo <dir>]
|
|
13
13
|
*
|
|
14
14
|
* Env fallbacks: GJC_TG_BOT_TOKEN, GJC_TG_CHAT_ID.
|
|
15
15
|
* If --chat-id is omitted it is auto-resolved from getUpdates (message the bot once).
|
|
16
16
|
* If neither --endpoint-file nor --session-id is given, the newest endpoint file
|
|
17
|
-
* under <repo>/.gjc/state/
|
|
17
|
+
* under <repo>/.gjc/state/sdk/ is used.
|
|
18
18
|
*/
|
|
19
19
|
export {};
|
|
@@ -1,25 +1,34 @@
|
|
|
1
|
-
import type { Settings } from "
|
|
2
|
-
import type
|
|
1
|
+
import type { Settings } from "../../config/settings";
|
|
2
|
+
import { type NotificationSettingsReader } from "./config";
|
|
3
|
+
import { type DaemonState, type TelegramDaemonOptions } from "./telegram-daemon";
|
|
3
4
|
type TelegramDaemonRunner = {
|
|
4
5
|
run(): Promise<void>;
|
|
5
6
|
requestStop(reason?: "reload" | "signal" | "stop"): void;
|
|
6
7
|
};
|
|
7
8
|
type TelegramDaemonConstructor = new (opts: TelegramDaemonOptions) => TelegramDaemonRunner;
|
|
9
|
+
export type LightweightDaemonSettings = Pick<Settings, "get" | "getAgentDir" | "set" | "flush"> & NotificationSettingsReader;
|
|
8
10
|
export interface RunDaemonInternalDeps {
|
|
9
11
|
SettingsImpl?: {
|
|
10
12
|
init: (options?: {
|
|
11
13
|
agentDir?: string;
|
|
12
|
-
}) => Promise<
|
|
14
|
+
}) => Promise<LightweightDaemonSettings>;
|
|
13
15
|
};
|
|
14
16
|
DaemonImpl?: TelegramDaemonConstructor;
|
|
15
17
|
processPid?: number;
|
|
16
18
|
pidAlive?: (pid: number) => boolean;
|
|
19
|
+
/** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
|
|
20
|
+
now?: () => number;
|
|
21
|
+
/** Timer pair backing the ownership-progress watchdog; defaults to globals. */
|
|
22
|
+
setInterval?: (callback: () => void, ms: number) => Timer;
|
|
23
|
+
clearInterval?: (timer: Timer) => void;
|
|
24
|
+
/** Reads persisted daemon ownership state; defaults to the real reader. */
|
|
25
|
+
readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
|
|
17
26
|
}
|
|
18
27
|
export declare function createLightweightDaemonSettings(input: {
|
|
19
28
|
agentDir: string;
|
|
20
29
|
rawConfig?: unknown;
|
|
21
|
-
}):
|
|
22
|
-
export declare function loadLightweightDaemonSettings(agentDir: string): Promise<
|
|
30
|
+
}): LightweightDaemonSettings;
|
|
31
|
+
export declare function loadLightweightDaemonSettings(agentDir: string): Promise<LightweightDaemonSettings>;
|
|
23
32
|
export declare function ownerPidFromOwnerId(ownerId: string): number | undefined;
|
|
24
33
|
export declare function runDaemonSmoke(opts?: {
|
|
25
34
|
agentDir?: string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight daemon protocol contract for consumers that need generation
|
|
3
|
+
* metadata without loading the Telegram daemon runtime.
|
|
4
|
+
*/
|
|
5
|
+
/** Protocol version the daemon advertises in its ClientHello. */
|
|
6
|
+
export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
7
|
+
/**
|
|
8
|
+
* Operational generation the current daemon build speaks. It is tied to the
|
|
9
|
+
* wire protocol version so a freshly-upgraded host can identify an older,
|
|
10
|
+
* still-live daemon without coupling status readers to the daemon runtime.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DAEMON_GENERATION = 3;
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* keeps the single-poller invariant (no Telegram getUpdates 409 overlap) and
|
|
8
8
|
* never steals a still-live owner.
|
|
9
9
|
*/
|
|
10
|
-
import type { Settings } from "
|
|
11
|
-
import type { BuiltInDaemonController, DaemonOperationOptions, DaemonOperationResult, DaemonStatus } from "
|
|
10
|
+
import type { Settings } from "../../config/settings";
|
|
11
|
+
import type { BuiltInDaemonController, DaemonOperationOptions, DaemonOperationResult, DaemonStatus } from "../../daemon/control-types";
|
|
12
12
|
import { type TelegramDaemonDeps, type TelegramDaemonFs } from "./telegram-daemon";
|
|
13
13
|
export interface TelegramDaemonControlRequest {
|
|
14
14
|
version: 1;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
-
import type { Settings } from "
|
|
3
|
-
import type { DaemonRuntimeInfo } from "
|
|
2
|
+
import type { Settings } from "../../config/settings";
|
|
3
|
+
import type { DaemonRuntimeInfo } from "../../daemon/control-types";
|
|
4
4
|
import { HEARTBEAT_TTL_MS } from "./daemon-paths";
|
|
5
|
+
export { DAEMON_GENERATION, NOTIFICATION_PROTOCOL_VERSION } from "./telegram-daemon-contract";
|
|
5
6
|
import { type ControlServerLike, type LifecycleControlServerFactory } from "./lifecycle-control-runtime";
|
|
7
|
+
import type { OrchestratorDeps } from "./lifecycle-orchestrator";
|
|
6
8
|
import { NotificationOperatorRuntime, OperatorBackoffPolicy } from "./operator-runtime";
|
|
7
9
|
import { type AliasTable, type CallbackRoute } from "./telegram-reference";
|
|
8
10
|
export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled" | "blocked";
|
|
11
|
+
/** Detailed result for orchestration that must distinguish a #2028 handoff from a fresh spawn. */
|
|
12
|
+
export type EnsureTelegramDaemonDetailedResult = "spawned" | "reloaded" | "attached" | "disabled" | "blocked_identity";
|
|
9
13
|
export interface DaemonState {
|
|
10
14
|
pid: number;
|
|
11
15
|
ownerId: string;
|
|
@@ -66,22 +70,11 @@ export { HEARTBEAT_TTL_MS };
|
|
|
66
70
|
export declare const DAEMON_VERSION = 1;
|
|
67
71
|
/** Capability token advertised when the server supports app-level ping/pong. */
|
|
68
72
|
export declare const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
|
|
69
|
-
/** Protocol version the daemon advertises in its ClientHello. */
|
|
70
|
-
export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
71
73
|
/** Capability required for typed controls and semantic Selected acknowledgement frames. */
|
|
72
74
|
export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
|
|
73
75
|
export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
|
|
74
|
-
/**
|
|
75
|
-
* Operational generation the current daemon build speaks, persisted into
|
|
76
|
-
* {@link DaemonState.generation} on ownership acquisition. It is tied to the
|
|
77
|
-
* wire {@link NOTIFICATION_PROTOCOL_VERSION} so any protocol bump (which is what
|
|
78
|
-
* gates capabilities like {@link ASK_SELECTED_ACK_CAPABILITY}) also bumps the
|
|
79
|
-
* generation, letting a freshly-upgraded host recognise an older, still-live
|
|
80
|
-
* daemon and reload it instead of silently attaching to it. Distinct from the
|
|
81
|
-
* persisted schema {@link DAEMON_VERSION}, which did not change across #1999.
|
|
82
|
-
*/
|
|
83
|
-
export declare const DAEMON_GENERATION = 3;
|
|
84
76
|
export { type DaemonPaths, daemonPaths } from "./daemon-paths";
|
|
77
|
+
export declare function deriveLifecycleAuditRedactionKey(botToken: string): Uint8Array;
|
|
85
78
|
/**
|
|
86
79
|
* Attach session-lifecycle control (create/close/resume) to the running daemon.
|
|
87
80
|
*
|
|
@@ -96,14 +89,26 @@ export declare function startDaemonLifecycleControl(input: {
|
|
|
96
89
|
controlServer: ControlServerLike;
|
|
97
90
|
pairedChatId: string;
|
|
98
91
|
agentDir: string;
|
|
92
|
+
auditRedactionKey: Uint8Array;
|
|
99
93
|
env?: NodeJS.ProcessEnv;
|
|
100
|
-
}):
|
|
94
|
+
}): OrchestratorDeps;
|
|
101
95
|
export declare function registerNotificationRoot(input: {
|
|
102
96
|
settings: Settings;
|
|
103
97
|
cwd: string;
|
|
104
98
|
sessionId: string;
|
|
105
99
|
fs?: TelegramDaemonFs;
|
|
106
100
|
}): Promise<string>;
|
|
101
|
+
export interface UnregisterNotificationRootResult {
|
|
102
|
+
root: string;
|
|
103
|
+
remainingRoots: number;
|
|
104
|
+
}
|
|
105
|
+
/** Remove one session's Telegram scan root without disturbing other live session roots. */
|
|
106
|
+
export declare function unregisterNotificationRoot(input: {
|
|
107
|
+
settings: Settings;
|
|
108
|
+
cwd: string;
|
|
109
|
+
sessionId: string;
|
|
110
|
+
fs?: TelegramDaemonFs;
|
|
111
|
+
}): Promise<UnregisterNotificationRootResult>;
|
|
107
112
|
export declare function isFreshLiveOwner(input: {
|
|
108
113
|
state: DaemonState | undefined;
|
|
109
114
|
now: number;
|
|
@@ -143,9 +148,9 @@ export declare function releaseDaemonOwnership(input: {
|
|
|
143
148
|
now?: () => number;
|
|
144
149
|
}): Promise<void>;
|
|
145
150
|
/** Read the persisted daemon ownership state (or undefined when absent). */
|
|
146
|
-
export declare function readDaemonState(settings: Settings, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
|
|
151
|
+
export declare function readDaemonState(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
|
|
147
152
|
/** Read the persisted notification roots list. */
|
|
148
|
-
export declare function readDaemonRoots(settings: Settings, fs?: TelegramDaemonFs): Promise<string[]>;
|
|
153
|
+
export declare function readDaemonRoots(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<string[]>;
|
|
149
154
|
export interface TelegramSpawnOwnerInput {
|
|
150
155
|
settings: Settings;
|
|
151
156
|
roots?: string[];
|
|
@@ -185,6 +190,19 @@ export declare function buildTelegramDaemonSpawnArgs(input: {
|
|
|
185
190
|
* already-persisted roots.
|
|
186
191
|
*/
|
|
187
192
|
export declare function spawnTelegramDaemonOwner(input: TelegramSpawnOwnerInput, deps?: TelegramDaemonDeps): Promise<TelegramSpawnOwnerResult>;
|
|
193
|
+
/**
|
|
194
|
+
* Ensure a configured daemon owns this session root, preserving ownership safety
|
|
195
|
+
* while exposing whether a #2028 generation handoff was required.
|
|
196
|
+
*/
|
|
197
|
+
export declare function ensureTelegramDaemonRunningDetailed(input: {
|
|
198
|
+
settings: Settings;
|
|
199
|
+
cwd: string;
|
|
200
|
+
sessionId: string;
|
|
201
|
+
}, deps?: TelegramDaemonDeps): Promise<EnsureTelegramDaemonDetailedResult>;
|
|
202
|
+
/**
|
|
203
|
+
* Legacy compatibility mapping for callers that only distinguish ownership from
|
|
204
|
+
* attachment. New orchestration should use {@link ensureTelegramDaemonRunningDetailed}.
|
|
205
|
+
*/
|
|
188
206
|
export declare function ensureTelegramDaemonRunning(input: {
|
|
189
207
|
settings: Settings;
|
|
190
208
|
cwd: string;
|
|
@@ -271,6 +289,16 @@ export interface TelegramDaemonOptions {
|
|
|
271
289
|
* default applies (e.g. lifecycle control disabled), no control server starts.
|
|
272
290
|
*/
|
|
273
291
|
createLifecycleControlServer?: LifecycleControlServerFactory | null;
|
|
292
|
+
/**
|
|
293
|
+
* Test seam for observing the exact production lifecycle dependency input.
|
|
294
|
+
* Production defaults to {@link buildOrchestratorDeps}.
|
|
295
|
+
*/
|
|
296
|
+
createLifecycleOrchestratorDeps?: (input: {
|
|
297
|
+
pairedChatId: string;
|
|
298
|
+
agentNotificationsDir: string;
|
|
299
|
+
sessionsRoot: string;
|
|
300
|
+
auditRedactionKey: Uint8Array;
|
|
301
|
+
}) => OrchestratorDeps;
|
|
274
302
|
/** Rich text promotion (enabled by default; see rich-render.ts). */
|
|
275
303
|
rich?: {
|
|
276
304
|
enabled: boolean;
|
|
@@ -289,7 +317,10 @@ export interface TelegramDaemonOptions {
|
|
|
289
317
|
};
|
|
290
318
|
}
|
|
291
319
|
interface SessionSocket {
|
|
320
|
+
/** Immutable key of the transport endpoint that owns this socket. */
|
|
292
321
|
sessionId: string;
|
|
322
|
+
/** Current logical session carried by valid threaded frames on this transport. */
|
|
323
|
+
logicalSessionId: string;
|
|
293
324
|
token: string;
|
|
294
325
|
endpointKey: string;
|
|
295
326
|
ws: WebSocket;
|
|
@@ -305,8 +336,14 @@ interface SessionSocket {
|
|
|
305
336
|
awaitingNonce: string | undefined;
|
|
306
337
|
/** Per-session liveness interval handle (only set for capable sessions). */
|
|
307
338
|
pingTimer: ReturnType<typeof setInterval> | undefined;
|
|
339
|
+
/** Correlation id for the startup replay barrier. */
|
|
340
|
+
replayId: string;
|
|
341
|
+
/** Queues live frames until startup replay is applied. */
|
|
342
|
+
replayPending: boolean;
|
|
343
|
+
replayQueue: Record<string, unknown>[];
|
|
308
344
|
}
|
|
309
345
|
export declare class TelegramNotificationDaemon {
|
|
346
|
+
#private;
|
|
310
347
|
private readonly opts;
|
|
311
348
|
readonly aliasTable: AliasTable;
|
|
312
349
|
readonly messageRoutes: Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>;
|
|
@@ -416,6 +453,7 @@ export declare class TelegramNotificationDaemon {
|
|
|
416
453
|
persistSeenUpdateIds(): Promise<void>;
|
|
417
454
|
private pruneSeenUpdateIds;
|
|
418
455
|
private rememberSeenUpdateId;
|
|
456
|
+
private rememberSeenUpdateIdForUnavailableNotice;
|
|
419
457
|
scanRoots(): Promise<void>;
|
|
420
458
|
connectSession(sessionId: string, url: string, token: string): void;
|
|
421
459
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Telegram **reference** client for the
|
|
2
|
+
* Telegram **reference** client for the Gajae-Code SDK.
|
|
3
3
|
*
|
|
4
4
|
* This is an example/template, NOT an upstream-owned integration: it implements
|
|
5
|
-
* the documented WS protocol (see `docs/
|
|
5
|
+
* the documented WS protocol (see `docs/sdk.md`) so you can copy it
|
|
6
6
|
* to build Discord/Slack/etc. clients with zero upstream changes. The Bot API
|
|
7
7
|
* transport shape is salvaged from the removed `telegram-remote` package.
|
|
8
8
|
*
|