@gajae-code/coding-agent 0.10.2 → 0.11.1
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 +58 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/async/job-manager.d.ts +46 -7
- 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/ultragoal-receipt-freshness.d.ts +11 -0
- 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/command-controller.d.ts +2 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
- 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 +5 -2
- 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 +170 -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 +7 -2
- 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 +42 -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 +50 -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 +78 -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/dist/types/tools/subagent-render.d.ts +1 -0
- package/dist/types/tools/subagent.d.ts +6 -1
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +99 -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/async/job-manager.ts +406 -63
- 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 +108 -14
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
- package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
- 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 +10 -17
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +396 -28
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +87 -36
- 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 +1258 -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 +7 -2
- 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 +113 -0
- package/src/sdk/broker/ensure.ts +307 -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 +355 -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 +2292 -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 +3979 -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 +603 -63
- 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 +2650 -944
- 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/task/index.ts +26 -16
- 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/subagent-render.ts +19 -8
- package/src/tools/subagent.ts +84 -32
- 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
|
@@ -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;
|
|
@@ -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;
|