@gajae-code/coding-agent 0.13.3 → 0.14.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 +184 -2
- package/README.md +2 -0
- package/bin/gajaessi.js +4 -0
- package/dist/types/async/job-manager.d.ts +55 -2
- package/dist/types/async/support.d.ts +14 -0
- package/dist/types/capability/mcp.d.ts +6 -0
- package/dist/types/capability/types.d.ts +6 -0
- package/dist/types/cli/accounts-cli.d.ts +19 -0
- package/dist/types/cli/args.d.ts +3 -0
- package/dist/types/cli/config-cli.d.ts +6 -0
- package/dist/types/cli/crash-cli.d.ts +10 -0
- package/dist/types/cli/customize-doctor.d.ts +145 -0
- package/dist/types/cli/daemon-cli.d.ts +3 -1
- package/dist/types/cli/mcp-cli.d.ts +11 -0
- package/dist/types/cli/notify-cli.d.ts +1 -1
- package/dist/types/cli/root-flags.d.ts +12 -0
- package/dist/types/cli/setup-cli.d.ts +3 -1
- package/dist/types/cli/skills-cli.d.ts +2 -1
- package/dist/types/cli/update-cli.d.ts +19 -1
- package/dist/types/cli.d.ts +6 -0
- package/dist/types/commands/accounts.d.ts +40 -0
- package/dist/types/commands/crash.d.ts +24 -0
- package/dist/types/commands/customize.d.ts +22 -0
- package/dist/types/commands/daemon.d.ts +1 -1
- package/dist/types/commands/launch.d.ts +6 -0
- package/dist/types/commands/setup.d.ts +6 -0
- package/dist/types/commands/skills.d.ts +6 -1
- package/dist/types/commands/update.d.ts +7 -0
- package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
- package/dist/types/config/config-schema-version.d.ts +10 -0
- package/dist/types/config/file-lock.d.ts +18 -0
- package/dist/types/config/model-profile-activation.d.ts +3 -1
- package/dist/types/config/model-registry.d.ts +9 -1
- package/dist/types/config/models-config-schema.d.ts +2 -0
- package/dist/types/config/settings-schema.d.ts +70 -6
- package/dist/types/config/settings.d.ts +63 -0
- package/dist/types/config/skill-settings-defaults.d.ts +26 -0
- package/dist/types/config/task-delegation.d.ts +39 -0
- package/dist/types/config/update-channel.d.ts +10 -0
- package/dist/types/coordinator-mcp/server.d.ts +5 -1
- package/dist/types/crash/index-store.d.ts +87 -0
- package/dist/types/crash/nudge.d.ts +50 -0
- package/dist/types/crash/record-loader.d.ts +17 -0
- package/dist/types/crash/report.d.ts +134 -0
- package/dist/types/crash/sanitize.d.ts +25 -0
- package/dist/types/cursor.d.ts +13 -2
- package/dist/types/customization/import.d.ts +37 -0
- package/dist/types/customization/index.d.ts +4 -0
- package/dist/types/customization/inventory.d.ts +25 -0
- package/dist/types/customization/mutations.d.ts +32 -0
- package/dist/types/customization/types.d.ts +115 -0
- package/dist/types/daemon/control-types.d.ts +8 -1
- package/dist/types/daemon/operator-contract.d.ts +4 -4
- package/dist/types/discovery/claude.d.ts +39 -1
- package/dist/types/discovery/codex.d.ts +39 -1
- package/dist/types/discovery/index.d.ts +2 -0
- package/dist/types/discovery/mcp-compat.d.ts +30 -0
- package/dist/types/edit/renderer.d.ts +23 -0
- package/dist/types/extensibility/extensions/runner.d.ts +3 -0
- package/dist/types/extensibility/extensions/types.d.ts +21 -4
- package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
- package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
- package/dist/types/extensibility/hooks/loader.d.ts +19 -5
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
- package/dist/types/extensibility/skill-management.d.ts +107 -0
- package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
- package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
- package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
- package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
- package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
- package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
- package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
- package/dist/types/hooks/events.d.ts +60 -0
- package/dist/types/hooks/normalize.d.ts +83 -0
- package/dist/types/hooks/skill-state.d.ts +9 -2
- package/dist/types/main.d.ts +1 -1
- package/dist/types/modes/acp/abort-scope.d.ts +13 -0
- package/dist/types/modes/acp/acp-agent.d.ts +7 -4
- package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
- package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
- package/dist/types/modes/components/customization/index.d.ts +1 -0
- package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
- package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
- package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
- package/dist/types/modes/components/oauth-selector.d.ts +10 -4
- package/dist/types/modes/components/pet-capability.d.ts +11 -25
- package/dist/types/modes/components/status-line/gh.d.ts +6 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
- package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
- package/dist/types/modes/interactive-mode.d.ts +1 -0
- package/dist/types/modes/types.d.ts +1 -0
- package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
- package/dist/types/runtime-mcp/config.d.ts +9 -0
- package/dist/types/runtime-mcp/manager.d.ts +26 -1
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
- package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
- package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
- package/dist/types/runtime-mcp/protocol.d.ts +278 -0
- package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
- package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
- package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
- package/dist/types/runtime-mcp/types.d.ts +102 -10
- package/dist/types/sdk/acp/adapter.d.ts +26 -5
- package/dist/types/sdk/broker/broker.d.ts +3 -55
- package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
- package/dist/types/sdk/broker/session-index.d.ts +14 -5
- package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
- package/dist/types/sdk/bus/config.d.ts +11 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
- package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
- package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
- package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
- package/dist/types/sdk/bus/index.d.ts +85 -99
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
- package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
- package/dist/types/sdk/bus/notification-service.d.ts +52 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
- package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
- package/dist/types/sdk/bus/session-control.d.ts +25 -1
- package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
- package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
- package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
- package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
- package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
- package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
- package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
- package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
- package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
- package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
- package/dist/types/sdk/cli/rows.d.ts +2 -11
- package/dist/types/sdk/cli/session-cli.d.ts +15 -25
- package/dist/types/sdk/client/client.d.ts +97 -1
- package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
- package/dist/types/sdk/host/control/index.d.ts +1 -1
- package/dist/types/sdk/host/control/operations.d.ts +18 -5
- package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
- package/dist/types/sdk/host/host.d.ts +15 -1
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/host/session-runtime.d.ts +127 -7
- package/dist/types/sdk/host/types.d.ts +1 -1
- package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +2 -1
- package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
- package/dist/types/sdk/lifecycle/client.d.ts +59 -0
- package/dist/types/sdk/lifecycle/index.d.ts +3 -0
- package/dist/types/sdk/lifecycle/service.d.ts +232 -0
- package/dist/types/sdk/mcp/server.d.ts +9 -6
- package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
- package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
- package/dist/types/sdk/prompt-status.d.ts +10 -3
- package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
- package/dist/types/sdk/receipt-state.d.ts +17 -0
- package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
- package/dist/types/sdk/router/index.d.ts +1 -0
- package/dist/types/sdk/router/session-router.d.ts +152 -0
- package/dist/types/sdk/session-list.d.ts +22 -0
- package/dist/types/sdk/session-reconnect.d.ts +43 -1
- package/dist/types/sdk/session.d.ts +34 -1
- package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
- package/dist/types/session/account-inventory.d.ts +86 -0
- package/dist/types/session/agent-session.d.ts +145 -6
- package/dist/types/session/agent-storage.d.ts +10 -0
- package/dist/types/session/coordinator-tool-label.d.ts +28 -0
- package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
- package/dist/types/session/messages.d.ts +1 -1
- package/dist/types/session/secure-token-file.d.ts +3 -0
- package/dist/types/session/session-manager.d.ts +40 -1
- package/dist/types/session/startup-auth-config.d.ts +44 -0
- package/dist/types/session/terminal-abort.d.ts +378 -0
- package/dist/types/session/yield-queue.d.ts +7 -0
- package/dist/types/session-import/claude.d.ts +26 -0
- package/dist/types/session-import/codex.d.ts +88 -0
- package/dist/types/session-import/command.d.ts +35 -0
- package/dist/types/session-import/detect.d.ts +22 -0
- package/dist/types/session-import/index.d.ts +7 -0
- package/dist/types/session-import/provider-codex.d.ts +22 -0
- package/dist/types/session-import/provider-service.d.ts +38 -0
- package/dist/types/session-import/redact.d.ts +23 -0
- package/dist/types/session-import/service.d.ts +47 -0
- package/dist/types/session-import/types.d.ts +120 -0
- package/dist/types/setup/paseo/check.d.ts +16 -0
- package/dist/types/setup/paseo/install-saga.d.ts +115 -0
- package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
- package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
- package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
- package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
- package/dist/types/setup/paseo/provider-config.d.ts +35 -0
- package/dist/types/setup/paseo/remove.d.ts +14 -0
- package/dist/types/setup/paseo/result-types.d.ts +59 -0
- package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
- package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
- package/dist/types/skill-state/active-state.d.ts +5 -1
- package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
- package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
- package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
- package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
- package/dist/types/slash-commands/types.d.ts +7 -1
- package/dist/types/task/executor.d.ts +10 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/tools/ask-answer-registry.d.ts +6 -3
- package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
- package/dist/types/tools/bash.d.ts +2 -6
- package/dist/types/tools/browser/attach.d.ts +11 -0
- package/dist/types/tools/browser/launch.d.ts +20 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
- package/dist/types/tools/browser/render.d.ts +1 -0
- package/dist/types/tools/browser.d.ts +3 -1
- package/dist/types/tools/image-gen.d.ts +9 -2
- package/dist/types/tools/index.d.ts +8 -0
- package/dist/types/tools/monitor.d.ts +1 -1
- package/dist/types/tools/skill-discovery.d.ts +8 -1
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
- package/dist/types/utils/herdr-pane.d.ts +76 -0
- package/package.json +19 -9
- package/scripts/build-binary.ts +2 -1
- package/scripts/build-sdk-package-smoke.ts +2 -13
- package/scripts/capture-sticky-viewport-showcase.ts +0 -1
- package/scripts/compile-args.ts +2 -0
- package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
- package/scripts/generate-sdk-operation-inventory.ts +28 -0
- package/scripts/generate-telegram-baseline-manifest.ts +1 -0
- package/scripts/generate-tool-catalog.ts +6 -4
- package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
- package/src/async/job-manager.ts +352 -17
- package/src/async/support.ts +25 -0
- package/src/autoresearch/dashboard.ts +28 -13
- package/src/capability/index.ts +3 -1
- package/src/capability/mcp.ts +6 -0
- package/src/capability/types.ts +6 -0
- package/src/cli/accounts-cli.ts +395 -0
- package/src/cli/args.ts +23 -0
- package/src/cli/auth-broker-cli.ts +136 -66
- package/src/cli/auth-gateway-cli.ts +94 -70
- package/src/cli/config-cli.ts +27 -2
- package/src/cli/crash-cli.ts +78 -0
- package/src/cli/customize-doctor.ts +1605 -0
- package/src/cli/daemon-cli.ts +12 -3
- package/src/cli/fast-help.ts +1 -0
- package/src/cli/mcp-cli.ts +128 -60
- package/src/cli/notify-cli.ts +8 -14
- package/src/cli/root-flags.ts +8 -0
- package/src/cli/setup-cli.ts +145 -0
- package/src/cli/skills-cli.ts +38 -2
- package/src/cli/update-cli.ts +167 -12
- package/src/cli.ts +4 -0
- package/src/commands/accounts.ts +71 -0
- package/src/commands/crash.ts +35 -0
- package/src/commands/customize.ts +84 -0
- package/src/commands/daemon.ts +2 -2
- package/src/commands/deep-interview.ts +2 -0
- package/src/commands/launch.ts +1 -0
- package/src/commands/mcp.ts +12 -7
- package/src/commands/ralplan.ts +2 -0
- package/src/commands/sdk.ts +65 -32
- package/src/commands/setup.ts +5 -0
- package/src/commands/skills.ts +14 -4
- package/src/commands/ultragoal.ts +10 -1
- package/src/commands/update.ts +26 -15
- package/src/config/atomic-yaml-patch-worker.ts +57 -0
- package/src/config/atomic-yaml-patch.ts +769 -29
- package/src/config/config-schema-version.ts +10 -0
- package/src/config/file-lock.ts +70 -1
- package/src/config/mcp-schema.json +52 -14
- package/src/config/model-profile-activation.ts +20 -1
- package/src/config/model-profiles.ts +29 -19
- package/src/config/model-registry.ts +132 -21
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +76 -6
- package/src/config/settings.ts +4038 -199
- package/src/config/skill-settings-defaults.ts +41 -3
- package/src/config/task-delegation.ts +87 -0
- package/src/config/update-channel.ts +23 -0
- package/src/coordinator-mcp/server.ts +377 -308
- package/src/crash/index-store.ts +723 -0
- package/src/crash/nudge.ts +89 -0
- package/src/crash/record-loader.ts +149 -0
- package/src/crash/report.ts +551 -0
- package/src/crash/sanitize.ts +129 -0
- package/src/cursor.ts +36 -10
- package/src/customization/import.ts +946 -0
- package/src/customization/index.ts +4 -0
- package/src/customization/inventory.ts +335 -0
- package/src/customization/mutations.ts +141 -0
- package/src/customization/types.ts +223 -0
- package/src/daemon/control-types.ts +8 -1
- package/src/daemon/operator-contract.ts +6 -6
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
- package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
- package/src/discovery/claude-hooks.ts +38 -0
- package/src/discovery/claude.ts +142 -209
- package/src/discovery/codex-hooks.ts +38 -0
- package/src/discovery/codex.ts +132 -198
- package/src/discovery/helpers.ts +8 -1
- package/src/discovery/index.ts +2 -0
- package/src/discovery/mcp-compat.ts +234 -0
- package/src/discovery/mcp-json.ts +6 -0
- package/src/edit/renderer.ts +40 -0
- package/src/edit/streaming.ts +4 -2
- package/src/exec/bash-executor.ts +24 -20
- package/src/export/html/index.ts +51 -2
- package/src/extensibility/extensions/loader.ts +9 -1
- package/src/extensibility/extensions/runner.ts +17 -4
- package/src/extensibility/extensions/types.ts +31 -6
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
- package/src/extensibility/gjc-plugins/installer.ts +9 -5
- package/src/extensibility/gjc-plugins/observability.ts +8 -2
- package/src/extensibility/gjc-plugins/registry.ts +13 -2
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
- package/src/extensibility/gjc-plugins/schema.ts +222 -39
- package/src/extensibility/hooks/loader.ts +154 -10
- package/src/extensibility/runtime-skill-discovery.ts +257 -60
- package/src/extensibility/skill-management.ts +368 -0
- package/src/extensibility/skills.ts +52 -16
- package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
- package/src/gjc-runtime/launch-worktree.ts +56 -2
- package/src/gjc-runtime/linux-proc.ts +7 -1
- package/src/gjc-runtime/ralplan-runtime.ts +100 -164
- package/src/gjc-runtime/session-state-lock.ts +992 -0
- package/src/gjc-runtime/session-state-sidecar.ts +644 -142
- package/src/gjc-runtime/state-writer.ts +39 -14
- package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
- package/src/gjc-runtime/ultragoal-guard.ts +11 -4
- package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
- package/src/gjc-runtime/workflow-settings.ts +596 -0
- package/src/goals/tools/goal-tool.ts +6 -1
- package/src/hooks/events.ts +291 -0
- package/src/hooks/native-skill-hook.ts +4 -0
- package/src/hooks/normalize.ts +369 -0
- package/src/hooks/skill-state.ts +165 -46
- package/src/internal-urls/docs-index.generated.ts +40 -32
- package/src/main.ts +32 -5
- package/src/migrate/mcp-mapper.ts +25 -2
- package/src/modes/acp/abort-scope.ts +29 -0
- package/src/modes/acp/acp-agent.ts +423 -98
- package/src/modes/components/assistant-message.ts +6 -1
- package/src/modes/components/customization/customization-dashboard.ts +443 -0
- package/src/modes/components/customization/import-wizard.ts +372 -0
- package/src/modes/components/customization/index.ts +1 -0
- package/src/modes/components/gajae-pet-widget.ts +539 -213
- package/src/modes/components/irc-sidebar.ts +11 -0
- package/src/modes/components/iterm-pet-transport.ts +585 -0
- package/src/modes/components/oauth-selector.ts +277 -86
- package/src/modes/components/pet-capability.ts +39 -40
- package/src/modes/components/settings-selector.ts +9 -0
- package/src/modes/components/status-line/gh.ts +45 -1
- package/src/modes/components/status-line/segments.ts +16 -1
- package/src/modes/components/tool-status-header.ts +13 -3
- package/src/modes/controllers/command-controller.ts +20 -8
- package/src/modes/controllers/extension-ui-controller.ts +56 -257
- package/src/modes/controllers/input-controller.ts +10 -0
- package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
- package/src/modes/controllers/selector-controller.ts +177 -72
- package/src/modes/controllers/stt-controller.ts +3 -3
- package/src/modes/interactive-mode.ts +88 -16
- package/src/modes/print-mode.ts +35 -6
- package/src/modes/runtime-init.ts +21 -68
- package/src/modes/types.ts +1 -0
- package/src/modes/utils/injected-user-submission.ts +25 -0
- package/src/modes/utils/terminal-bell.ts +15 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/critic.md +1 -1
- package/src/prompts/system/rlm-research.md +1 -1
- package/src/prompts/system/system-prompt.md +0 -2
- package/src/prompts/tools/bash.md +7 -1
- package/src/prompts/tools/browser.md +1 -1
- package/src/prompts/tools/cron.md +6 -6
- package/src/prompts/tools/read.md +0 -2
- package/src/prompts/tools/skill-discovery.md +4 -2
- package/src/runtime-mcp/client.ts +427 -23
- package/src/runtime-mcp/config.ts +37 -5
- package/src/runtime-mcp/manager-pool.test.ts +56 -0
- package/src/runtime-mcp/manager.ts +52 -2
- package/src/runtime-mcp/oauth-discovery.ts +13 -0
- package/src/runtime-mcp/oauth-flow.ts +46 -1
- package/src/runtime-mcp/pool-key.ts +5 -1
- package/src/runtime-mcp/pool.test.ts +9 -0
- package/src/runtime-mcp/protocol.test.ts +353 -0
- package/src/runtime-mcp/protocol.ts +624 -0
- package/src/runtime-mcp/scope-config.ts +78 -0
- package/src/runtime-mcp/tool-bridge.ts +44 -10
- package/src/runtime-mcp/transports/http.ts +84 -13
- package/src/runtime-mcp/types.ts +123 -12
- package/src/sdk/acp/adapter.ts +328 -97
- package/src/sdk/broker/broker.ts +160 -741
- package/src/sdk/broker/ensure.ts +9 -1
- package/src/sdk/broker/lifecycle.ts +510 -116
- package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
- package/src/sdk/broker/process-incarnation.ts +19 -0
- package/src/sdk/broker/session-index.ts +516 -117
- package/src/sdk/broker/startup-failure.ts +28 -5
- package/src/sdk/broker/transport.ts +1 -13
- package/src/sdk/bus/chat-daemon-cli.ts +4 -2
- package/src/sdk/bus/chat-daemon-control.ts +67 -6
- package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
- package/src/sdk/bus/config.ts +13 -0
- package/src/sdk/bus/conversation-store.ts +59 -171
- package/src/sdk/bus/daemon-paths.ts +20 -0
- package/src/sdk/bus/discord-conversation.ts +2 -0
- package/src/sdk/bus/discord-daemon.ts +524 -126
- package/src/sdk/bus/discord-live-provider.ts +206 -79
- package/src/sdk/bus/existing-thread-readiness.ts +4 -97
- package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
- package/src/sdk/bus/index.ts +2480 -456
- package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
- package/src/sdk/bus/lifecycle-commands.ts +2 -2
- package/src/sdk/bus/managed-daemon.ts +2 -145
- package/src/sdk/bus/notification-service.ts +196 -0
- package/src/sdk/bus/operator-runtime.ts +1 -1
- package/src/sdk/bus/prompt-reconciliation.ts +24 -15
- package/src/sdk/bus/reconciliation-store.ts +553 -24
- package/src/sdk/bus/session-control.ts +49 -3
- package/src/sdk/bus/slack-conversation.ts +4 -0
- package/src/sdk/bus/slack-daemon.ts +733 -134
- package/src/sdk/bus/slack-live-provider.ts +65 -15
- package/src/sdk/bus/slack-provider.ts +4 -0
- package/src/sdk/bus/slack-thread-binding.ts +9 -104
- package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
- package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
- package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
- package/src/sdk/bus/telegram-daemon-control.ts +3 -13
- package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
- package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
- package/src/sdk/bus/telegram-daemon.ts +2552 -2280
- package/src/sdk/bus/telegram-reference.ts +1 -226
- package/src/sdk/bus/telegram-setup.ts +2 -2
- package/src/sdk/bus/threaded-render.ts +1 -0
- package/src/sdk/bus/topic-registry.ts +279 -146
- package/src/sdk/cli/rows.ts +2 -35
- package/src/sdk/cli/session-cli.ts +776 -700
- package/src/sdk/client/client.ts +892 -1
- package/src/sdk/host/control/dispatch.ts +93 -58
- package/src/sdk/host/control/index.ts +1 -1
- package/src/sdk/host/control/operations.ts +18 -10
- package/src/sdk/host/control/runtime-gate.ts +40 -0
- package/src/sdk/host/host.ts +63 -12
- package/src/sdk/host/query/handlers.ts +66 -7
- package/src/sdk/host/reverse-leases.ts +2 -2
- package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
- package/src/sdk/host/session-runtime.test.ts +2787 -34
- package/src/sdk/host/session-runtime.ts +1489 -101
- package/src/sdk/host/surface-policy.ts +12 -8
- package/src/sdk/host/types.ts +1 -1
- package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
- package/src/sdk/host/websocket-transport.ts +85 -50
- package/src/sdk/index.ts +2 -1
- package/src/sdk/lifecycle/broker-client.ts +53 -0
- package/src/sdk/lifecycle/client.ts +234 -0
- package/src/sdk/lifecycle/index.ts +3 -0
- package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
- package/src/sdk/lifecycle/service.ts +720 -0
- package/src/sdk/mcp/server.ts +226 -188
- package/src/sdk/prompt-deadline-lease.ts +55 -0
- package/src/sdk/prompt-deadline-manager.ts +148 -0
- package/src/sdk/prompt-status.ts +11 -3
- package/src/sdk/protocol/operation-inventory.generated.json +272 -129
- package/src/sdk/protocol/operation-registry.ts +71 -8
- package/src/sdk/receipt-state.ts +43 -0
- package/src/sdk/reconciliation-extensions.ts +14 -0
- package/src/sdk/router/index.ts +1 -0
- package/src/sdk/router/session-router.ts +1658 -0
- package/src/sdk/session-list.ts +93 -0
- package/src/sdk/session-reconnect.ts +45 -1
- package/src/sdk/session.ts +716 -120
- package/src/sdk/transport/serve-cli.ts +18 -34
- package/src/session/account-inventory.ts +603 -0
- package/src/session/agent-session.ts +2857 -582
- package/src/session/agent-storage.ts +35 -0
- package/src/session/blob-store.ts +32 -1
- package/src/session/coordinator-tool-label.ts +40 -0
- package/src/session/internal/managed-session-scope.ts +4 -0
- package/src/session/internal/managed-session-storage.ts +173 -12
- package/src/session/messages.ts +1 -1
- package/src/session/secure-token-file.ts +80 -0
- package/src/session/session-manager.ts +730 -58
- package/src/session/session-storage.ts +25 -16
- package/src/session/startup-auth-config.ts +297 -0
- package/src/session/terminal-abort.ts +1253 -0
- package/src/session/yield-queue.ts +57 -15
- package/src/session-import/claude.ts +334 -0
- package/src/session-import/codex.ts +1033 -0
- package/src/session-import/command.ts +77 -0
- package/src/session-import/detect.ts +133 -0
- package/src/session-import/index.ts +7 -0
- package/src/session-import/provider-codex.ts +327 -0
- package/src/session-import/provider-service.ts +457 -0
- package/src/session-import/redact.ts +128 -0
- package/src/session-import/service.ts +1264 -0
- package/src/session-import/types.ts +148 -0
- package/src/setup/paseo/check.ts +213 -0
- package/src/setup/paseo/install-saga.ts +293 -0
- package/src/setup/paseo/json-publisher.ts +263 -0
- package/src/setup/paseo/orchestration-preferences.ts +86 -0
- package/src/setup/paseo/paseo-ownership.ts +224 -0
- package/src/setup/paseo/paseo-setup.ts +253 -0
- package/src/setup/paseo/provider-config.ts +139 -0
- package/src/setup/paseo/remove.ts +183 -0
- package/src/setup/paseo/result-types.ts +79 -0
- package/src/setup/paseo/setup-deps.ts +175 -0
- package/src/setup/paseo/skills-bridge.ts +260 -0
- package/src/skill-state/active-state.ts +21 -11
- package/src/slash-commands/acp-builtins.ts +9 -1
- package/src/slash-commands/builtin-registry.ts +98 -16
- package/src/slash-commands/helpers/credential-switch.ts +143 -0
- package/src/slash-commands/helpers/mcp.ts +9 -3
- package/src/slash-commands/helpers/usage-report.ts +61 -56
- package/src/slash-commands/types.ts +7 -2
- package/src/task/executor.ts +30 -11
- package/src/task/index.ts +66 -7
- package/src/task/render.ts +23 -9
- package/src/tools/ask-answer-registry.ts +23 -7
- package/src/tools/ask.ts +8 -4
- package/src/tools/bash-sleep-advisory.ts +115 -0
- package/src/tools/bash.ts +98 -18
- package/src/tools/browser/attach.ts +71 -3
- package/src/tools/browser/launch.ts +86 -13
- package/src/tools/browser/profile-discovery.ts +57 -7
- package/src/tools/browser/render.ts +8 -1
- package/src/tools/browser.ts +130 -21
- package/src/tools/computer.enforcement.test.ts +1 -1
- package/src/tools/computer.ts +3 -2
- package/src/tools/cron.ts +12 -1
- package/src/tools/image-gen.ts +27 -16
- package/src/tools/index.ts +8 -0
- package/src/tools/job.ts +33 -6
- package/src/tools/monitor.ts +41 -2
- package/src/tools/skill-discovery.ts +21 -29
- package/src/tools/subagent.ts +142 -24
- package/src/tools/tool-catalog.generated.ts +6 -6
- package/src/tools/ultragoal-ask-guard.ts +10 -3
- package/src/utils/herdr-pane.ts +345 -0
- package/src/utils/title-generator.ts +2 -0
- package/src/web/scrapers/index.ts +6 -4
- package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
- package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
- package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
- package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
- package/dist/types/runtime/lazy-service.test.d.ts +0 -1
- package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
- package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
- package/dist/types/runtime-mcp/config.test.d.ts +0 -1
- package/dist/types/runtime-mcp/http.test.d.ts +0 -1
- package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
- package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
- package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
- package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
- package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
- package/dist/types/sdk/elevation/audit.d.ts +0 -93
- package/dist/types/sdk/elevation/capability.d.ts +0 -3
- package/dist/types/sdk/elevation/digest.d.ts +0 -72
- package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
- package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
- package/dist/types/sdk/elevation/owner.d.ts +0 -48
- package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
- package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
- package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
- package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
- package/dist/types/skills/skills.test.d.ts +0 -1
- package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
- package/dist/types/tools/descriptors.test.d.ts +0 -1
- package/scripts/g005-daemon-smoke.ts +0 -180
- package/scripts/g011-daemon-path-smoke.ts +0 -153
- package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
- package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
- package/src/sdk/bus/telegram-cli.ts +0 -212
- package/src/sdk/elevation/allowlist.ts +0 -54
- package/src/sdk/elevation/audit.ts +0 -208
- package/src/sdk/elevation/capability.ts +0 -41
- package/src/sdk/elevation/digest.ts +0 -129
- package/src/sdk/elevation/dispatch-receipt.ts +0 -184
- package/src/sdk/elevation/grant-ledger.ts +0 -1142
- package/src/sdk/elevation/owner.ts +0 -109
- package/src/session/auth-broker-config.ts +0 -109
- /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
- /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
- /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { PromptReconciliationStatus, SdkPromptTerminalOutcome } from "../prompt-status";
|
|
2
|
+
import type { ReceiptState } from "../receipt-state";
|
|
2
3
|
import { type TurnResultContent } from "../turn-result";
|
|
3
4
|
import type { PromptCorrelation } from "./prompt-reconciliation";
|
|
4
|
-
export declare const RECONCILIATION_STORE_VERSION =
|
|
5
|
+
export declare const RECONCILIATION_STORE_VERSION = 2;
|
|
6
|
+
export declare const RECONCILIATION_STORE_VERSION_V1 = 1;
|
|
5
7
|
export declare const RECONCILIATION_SESSION_ID_PATTERN: RegExp;
|
|
6
8
|
export declare const RECONCILIATION_DIR_NAME = ".sdk-reconciliation";
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
+
export declare function resolveReconciliationSessionFile(sessionFile: string | undefined | null, stateRoot: string, sessionId: string): string;
|
|
10
|
+
export type ReconciliationKind = "prompt" | "skill" | "terminal";
|
|
11
|
+
export interface DurableExecutionReconciliationRecord extends PromptCorrelation {
|
|
9
12
|
kind: ReconciliationKind;
|
|
10
13
|
clientRef?: string;
|
|
11
14
|
status: PromptReconciliationStatus;
|
|
@@ -17,15 +20,98 @@ export interface DurableReconciliationRecord extends PromptCorrelation {
|
|
|
17
20
|
startedAt?: number;
|
|
18
21
|
terminalAt?: number;
|
|
19
22
|
outcome?: SdkPromptTerminalOutcome;
|
|
23
|
+
receiptState?: Exclude<ReceiptState, "absent">;
|
|
20
24
|
pendingOutcome?: SdkPromptTerminalOutcome;
|
|
25
|
+
pendingReceiptState?: Extract<ReceiptState, "present" | "missing">;
|
|
21
26
|
/** Skill-only safe token; never skill args bodies. */
|
|
22
27
|
skillName?: string;
|
|
23
28
|
content?: TurnResultContent;
|
|
24
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Durable terminal scope record (approved abort-SDK plan, v2 document).
|
|
32
|
+
* Bounded origin/fence and owned-settlement fields only; no prompt text and no
|
|
33
|
+
* suppressed/deferred receipts for left-running turn work.
|
|
34
|
+
*/
|
|
35
|
+
export interface DurableTerminalScopeRecord {
|
|
36
|
+
selection: "turn" | "owned";
|
|
37
|
+
/** SHA-256 of the bounded idempotency key; the raw key is never persisted. */
|
|
38
|
+
idempotencyKeyHash?: string;
|
|
39
|
+
/** SHA-256 of the canonicalized normalized input; raw input is never persisted. */
|
|
40
|
+
idempotencyInputHash?: string;
|
|
41
|
+
turnDisposition: "pending" | "stopped" | "uncertain" | "no_effect" | "no_effect_reserved" | "no_effect_marker_failure";
|
|
42
|
+
/** Whether the correlated agent_end event was published (AC 19). */
|
|
43
|
+
terminalPublished?: boolean;
|
|
44
|
+
ownedWorkDisposition: "not_requested" | "left_running" | "stopped" | "uncertain";
|
|
45
|
+
automaticDeliveryDisposition: "enabled" | "none";
|
|
46
|
+
resumeOnOwnedCompletion: boolean;
|
|
47
|
+
turnContinuationFence: {
|
|
48
|
+
state: "retained" | "released";
|
|
49
|
+
abortedAttemptEpoch: number;
|
|
50
|
+
blockedContinuationIds: string[];
|
|
51
|
+
predecessorTombstones: string[];
|
|
52
|
+
ownedCompletionPolicy: "enabled" | "disabled";
|
|
53
|
+
};
|
|
54
|
+
ownedDeliverySettlements?: Array<{
|
|
55
|
+
keyHash: string;
|
|
56
|
+
entryIdHash: string;
|
|
57
|
+
status: "settled" | "absent" | "uncertain";
|
|
58
|
+
observedAt: number;
|
|
59
|
+
}>;
|
|
60
|
+
responseState: "pending" | "sent" | "delivered" | "failed";
|
|
61
|
+
responsePayloadHash: string;
|
|
62
|
+
/** Hash of the replay-shaped public result a same-key retry delivers, when
|
|
63
|
+
* it differs from the original response (the replay appends metadata). */
|
|
64
|
+
replayPayloadHash?: string;
|
|
65
|
+
acceptedAt: number;
|
|
66
|
+
terminalAt?: number;
|
|
67
|
+
}
|
|
68
|
+
/** Compact evicted-key tombstone with enough disposition metadata to
|
|
69
|
+
* reconstruct the original terminal replay result (review thread P2). */
|
|
70
|
+
export interface EvictedTerminalKeyEntry {
|
|
71
|
+
keyHash: string;
|
|
72
|
+
inputHash: string;
|
|
73
|
+
turnDisposition?: "stopped" | "uncertain" | "no_effect" | "no_effect_reserved" | "no_effect_marker_failure";
|
|
74
|
+
ownedWorkDisposition?: "not_requested" | "left_running" | "stopped" | "uncertain";
|
|
75
|
+
responseState?: "pending" | "sent" | "delivered" | "failed";
|
|
76
|
+
responsePayloadHash?: string;
|
|
77
|
+
replayPayloadHash?: string;
|
|
78
|
+
terminalPublished?: boolean;
|
|
79
|
+
}
|
|
80
|
+
export interface DurableSteerReconciliationRecord {
|
|
81
|
+
kind: "steer";
|
|
82
|
+
clientRef: string;
|
|
83
|
+
textDigest: string;
|
|
84
|
+
createdAt: number;
|
|
85
|
+
status: "dispatching" | "accepted" | "rejected" | "uncertain";
|
|
86
|
+
settledAt?: number;
|
|
87
|
+
error?: {
|
|
88
|
+
code: string;
|
|
89
|
+
message: string;
|
|
90
|
+
};
|
|
91
|
+
commandId: string;
|
|
92
|
+
turnId: string;
|
|
93
|
+
acceptedAt: number;
|
|
94
|
+
startedAt?: never;
|
|
95
|
+
terminalAt?: never;
|
|
96
|
+
outcome?: never;
|
|
97
|
+
receiptState?: never;
|
|
98
|
+
pendingOutcome?: never;
|
|
99
|
+
pendingReceiptState?: never;
|
|
100
|
+
skillName?: never;
|
|
101
|
+
}
|
|
102
|
+
export type DurableReconciliationRecord = DurableExecutionReconciliationRecord | DurableSteerReconciliationRecord;
|
|
25
103
|
export interface ReconciliationStoreDocument {
|
|
26
104
|
version: typeof RECONCILIATION_STORE_VERSION;
|
|
27
105
|
sessionId: string;
|
|
28
106
|
records: DurableReconciliationRecord[];
|
|
107
|
+
terminalScopes?: DurableTerminalScopeRecord[];
|
|
108
|
+
/**
|
|
109
|
+
* Compact key tombstones for completed terminal rows evicted by the
|
|
110
|
+
* retention cap: the key hash is retained durably so a same-key retry
|
|
111
|
+
* after dispatch-cache expiry/restart still replays instead of aborting an
|
|
112
|
+
* unrelated later prompt (review thread P2).
|
|
113
|
+
*/
|
|
114
|
+
evictedTerminalKeys?: EvictedTerminalKeyEntry[];
|
|
29
115
|
}
|
|
30
116
|
export interface ReconciliationStoreFs {
|
|
31
117
|
mkdir(directory: string, options: {
|
|
@@ -49,9 +135,15 @@ export declare function isSafeReconciliationSessionId(sessionId: string): boolea
|
|
|
49
135
|
export declare function reconciliationStorePath(sessionFile: string, sessionId: string): string;
|
|
50
136
|
/**
|
|
51
137
|
* Settle non-terminal durable records after process death.
|
|
52
|
-
*
|
|
53
|
-
* reconciliation-incomplete result.
|
|
138
|
+
* Any record with a durable pending outcome preserves that exact terminal claim;
|
|
139
|
+
* outcome-less skills retain the existing reconciliation-incomplete result.
|
|
140
|
+
*/
|
|
141
|
+
/**
|
|
142
|
+
* Settle incomplete terminal scopes (turnDisposition "pending") to safe
|
|
143
|
+
* uncertainty after process death. A terminal scope that never finalized its
|
|
144
|
+
* semantic CAS replays as uncertainty, never as success.
|
|
54
145
|
*/
|
|
146
|
+
export declare function settleTerminalScopeRestart(scopes: DurableTerminalScopeRecord[], now: number): DurableTerminalScopeRecord[];
|
|
55
147
|
export declare function settleProcessRestart(records: DurableReconciliationRecord[], now: number): DurableReconciliationRecord[];
|
|
56
148
|
export interface ReconciliationStore {
|
|
57
149
|
readonly path: string | null;
|
|
@@ -61,6 +153,22 @@ export interface ReconciliationStore {
|
|
|
61
153
|
load(): Promise<DurableReconciliationRecord[]>;
|
|
62
154
|
/** Snapshot currently held in memory after last load/transact. */
|
|
63
155
|
snapshot(): DurableReconciliationRecord[];
|
|
156
|
+
/** Terminal-scope mutations through the same serialized full-document owner. */
|
|
157
|
+
transactTerminalScopes(mutator: (scopes: DurableTerminalScopeRecord[]) => DurableTerminalScopeRecord[]): Promise<void>;
|
|
158
|
+
transactTerminalState(mutator: (state: {
|
|
159
|
+
scopes: DurableTerminalScopeRecord[];
|
|
160
|
+
keys: EvictedTerminalKeyEntry[];
|
|
161
|
+
}) => {
|
|
162
|
+
scopes: DurableTerminalScopeRecord[];
|
|
163
|
+
keys: EvictedTerminalKeyEntry[];
|
|
164
|
+
}): Promise<void>;
|
|
165
|
+
/** Wait until every previously admitted reconciliation transaction settles. */
|
|
166
|
+
drain?(): Promise<void>;
|
|
167
|
+
transactTerminalKeys(mutator: (keys: EvictedTerminalKeyEntry[]) => EvictedTerminalKeyEntry[]): Promise<void>;
|
|
168
|
+
snapshotTerminalKeys(): EvictedTerminalKeyEntry[];
|
|
169
|
+
loadTerminalScopes(): Promise<DurableTerminalScopeRecord[]>;
|
|
170
|
+
/** Snapshot of terminal scopes currently held in memory. */
|
|
171
|
+
snapshotTerminalScopes(): DurableTerminalScopeRecord[];
|
|
64
172
|
delete(): Promise<void>;
|
|
65
173
|
}
|
|
66
174
|
export declare function createReconciliationStore(options: {
|
|
@@ -14,7 +14,17 @@ export interface BoundNotificationSession<Context extends NotificationSessionCon
|
|
|
14
14
|
unbind(): void;
|
|
15
15
|
}
|
|
16
16
|
export type NotificationEndpointStartResult = "started" | "already" | "disabled" | "failed";
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Outcome of the Telegram daemon preflight.
|
|
19
|
+
*
|
|
20
|
+
* `pending` means ownership acquisition is in flight and was deliberately NOT
|
|
21
|
+
* awaited: chat daemons are optional notification adapters, never session
|
|
22
|
+
* authority, so reconciliation on an awaited session-lifecycle path must never
|
|
23
|
+
* block on one. A pending preflight neither stops the runtime nor marks it
|
|
24
|
+
* blocked — the runtime starts, adapters stay withheld while the owner state is
|
|
25
|
+
* not ready, and the ensure's settle callback re-reconciles.
|
|
26
|
+
*/
|
|
27
|
+
export type TelegramDaemonPreflightResult = "ready" | "pending" | "blocked_identity" | "failed";
|
|
18
28
|
/**
|
|
19
29
|
* The endpoint implementation is deliberately injected. The controller owns
|
|
20
30
|
* policy and session-local state while the extension continues to own its
|
|
@@ -24,6 +34,20 @@ export interface NotificationSessionRuntime<Context extends NotificationSessionC
|
|
|
24
34
|
isRunning(binding: BoundNotificationSession<Context>): boolean;
|
|
25
35
|
start(binding: BoundNotificationSession<Context>): Promise<NotificationEndpointStartResult>;
|
|
26
36
|
stop(binding: BoundNotificationSession<Context>): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Provider-neutral ownership re-proof, called for ANY effective chat
|
|
39
|
+
* provider before the Telegram-specific preflight.
|
|
40
|
+
*
|
|
41
|
+
* A credential, destination, or actor-authorization change invalidates the
|
|
42
|
+
* ownership proof that authorized this runtime's adapters. The runtime must
|
|
43
|
+
* withhold its LOCAL adapters until the new identity is proved. It does NOT
|
|
44
|
+
* revoke an already-attached external chat daemon's SessionRouter
|
|
45
|
+
* attachment, so such a daemon can still observe host events and reach the
|
|
46
|
+
* host's inbound/control paths during the window; closing that requires an
|
|
47
|
+
* authenticated chat-attachment authority boundary at the Router layer.
|
|
48
|
+
* Implementations must not await the daemon ensure itself.
|
|
49
|
+
*/
|
|
50
|
+
reproveOwnership?(binding: BoundNotificationSession<Context>): Promise<void>;
|
|
27
51
|
/**
|
|
28
52
|
* Proves the complete Telegram owner identity before a generic endpoint can
|
|
29
53
|
* emit a frame. `blocked_identity` is fail-closed and starts nothing.
|
|
@@ -9,6 +9,7 @@ export interface SlackInboundDispatchReceipt {
|
|
|
9
9
|
actionId?: string;
|
|
10
10
|
/** The endpoint generation and SDK effect captured before Socket Mode ACK. */
|
|
11
11
|
endpointGeneration: number;
|
|
12
|
+
attachmentAuthorityId?: string;
|
|
12
13
|
/** Identifier of the protected journal payload; mappings never retain message bodies. */
|
|
13
14
|
effectId: string;
|
|
14
15
|
idempotencyKey: string;
|
|
@@ -22,7 +23,10 @@ export interface SlackConversation extends ConversationRecord {
|
|
|
22
23
|
rootTs?: string;
|
|
23
24
|
sessionId?: string;
|
|
24
25
|
endpointGeneration?: number;
|
|
26
|
+
attachmentAuthorityId?: string;
|
|
25
27
|
clientMsgId?: string;
|
|
28
|
+
/** Exact pending Router-removal cleanup; cleared only after the mapping close CAS commits. */
|
|
29
|
+
cleanupEffectId?: string;
|
|
26
30
|
/** Exclusive, expiring authority for provider reconciliation/publication of the root intent. */
|
|
27
31
|
rootPublicationOwner?: string;
|
|
28
32
|
rootPublicationLeaseExpiresAt?: number;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type SessionAttachment } from "../router";
|
|
2
2
|
import { ConversationStore } from "./conversation-store";
|
|
3
3
|
import { type SlackConversation } from "./slack-conversation";
|
|
4
4
|
export type { SlackThreadBindingErrorCode } from "./slack-thread-binding";
|
|
@@ -7,16 +7,10 @@ export declare class SlackEndpointBindingError extends Error {
|
|
|
7
7
|
constructor(message?: string);
|
|
8
8
|
}
|
|
9
9
|
import type { SlackProvider, SlackSocketEnvelope } from "./slack-provider";
|
|
10
|
-
export interface SlackEndpoint extends SdkSessionEndpoint {
|
|
11
|
-
generation: number;
|
|
12
|
-
}
|
|
13
|
-
export interface SlackSdkClient {
|
|
14
|
-
send(frame: Record<string, unknown>): void;
|
|
15
|
-
}
|
|
16
|
-
/** Proven right to bind one session at one endpoint generation. */
|
|
17
10
|
export interface SlackBindingAuthority {
|
|
18
11
|
sessionId: string;
|
|
19
12
|
endpointGeneration: number;
|
|
13
|
+
attachmentAuthorityId?: string;
|
|
20
14
|
}
|
|
21
15
|
export interface SlackNotificationDaemonOptions {
|
|
22
16
|
agentDir: string;
|
|
@@ -33,15 +27,10 @@ export interface SlackNotificationDaemonOptions {
|
|
|
33
27
|
/** Stable identity for the process attempting durable provider publication. */
|
|
34
28
|
publicationOwnerId?: string;
|
|
35
29
|
publicationLeaseMs?: number;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Exact discovery/attachment authority for adopting an existing root. The
|
|
39
|
-
* runtime supplies index, endpoint, and attachment proof; without it only the
|
|
40
|
-
* resolvable endpoint generation can be proven.
|
|
41
|
-
*/
|
|
30
|
+
resolveAttachment: (sessionId: string) => Promise<SessionAttachment | null>;
|
|
31
|
+
/** Exact Router proof for adopting an existing root. */
|
|
42
32
|
resolveBindingAuthority?: (sessionId: string) => Promise<SlackBindingAuthority | undefined>;
|
|
43
|
-
|
|
44
|
-
onCommand?: (sessionId: string, content: string, endpoint: SlackEndpoint, idempotencyKey: string) => Promise<boolean>;
|
|
33
|
+
onCommand?: (sessionId: string, content: string, attachment: SessionAttachment, idempotencyKey: string) => Promise<boolean>;
|
|
45
34
|
}
|
|
46
35
|
/**
|
|
47
36
|
* Slack Socket Mode notification daemon. Accepted inbound SDK effects are
|
|
@@ -54,6 +43,7 @@ export declare class SlackNotificationDaemon {
|
|
|
54
43
|
private readonly options;
|
|
55
44
|
readonly store: ConversationStore<SlackConversation>;
|
|
56
45
|
constructor(options: SlackNotificationDaemonOptions);
|
|
46
|
+
restartBlocked(): boolean;
|
|
57
47
|
start(): Promise<void>;
|
|
58
48
|
stop(): Promise<void>;
|
|
59
49
|
/** Accepted inbound effects are durably claimed before their Socket Mode ACK. */
|
|
@@ -78,7 +68,9 @@ export declare class SlackNotificationDaemon {
|
|
|
78
68
|
/** Posts a safe command outcome to the active mapped root thread. */
|
|
79
69
|
postCommandResult(sessionId: string, content: string): Promise<boolean>;
|
|
80
70
|
resolveAction(sessionId: string, actionId: string): Promise<void>;
|
|
81
|
-
close(sessionId: string, marker?: string): Promise<boolean>;
|
|
71
|
+
close(sessionId: string, marker?: string, endpointGeneration?: number): Promise<boolean>;
|
|
72
|
+
recoverCleanup(sessionId: string, endpointGeneration: number): Promise<void>;
|
|
73
|
+
retireAttachment(sessionId: string, endpointGeneration: number): Promise<void>;
|
|
82
74
|
resume(sessionId: string, body: string, endpointGeneration?: number, publicationId?: string): Promise<SlackConversation>;
|
|
83
75
|
findSession(sessionId: string, includeInactive: boolean): Promise<{
|
|
84
76
|
key: string;
|
|
@@ -28,7 +28,7 @@ export interface SlackLiveProviderOptions {
|
|
|
28
28
|
fetch?: (input: string, init?: RequestInit) => Promise<Response>;
|
|
29
29
|
webSocket?: (url: string) => SlackWebSocket;
|
|
30
30
|
now?: () => number;
|
|
31
|
-
sleep?: (milliseconds: number) => Promise<void>;
|
|
31
|
+
sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
|
|
32
32
|
reconnectDelayMs?: number;
|
|
33
33
|
maxRateLimitRetries?: number;
|
|
34
34
|
maxRetryAfterMs?: number;
|
|
@@ -57,11 +57,13 @@ export declare class SlackLiveProvider implements SlackProviderClient, SlackDiag
|
|
|
57
57
|
text: string;
|
|
58
58
|
threadTs?: string;
|
|
59
59
|
clientMsgId: string;
|
|
60
|
+
signal?: AbortSignal;
|
|
60
61
|
}): Promise<SlackPostedMessage>;
|
|
61
62
|
findMessageByClientMsgId(input: {
|
|
62
63
|
channel: string;
|
|
63
64
|
clientMsgId: string;
|
|
64
65
|
threadTs?: string;
|
|
66
|
+
signal?: AbortSignal;
|
|
65
67
|
}): Promise<SlackMessageSearchResult | null>;
|
|
66
68
|
/**
|
|
67
69
|
* Confirm that `ts` addresses a real message in `channel`. Slack answers
|
|
@@ -44,11 +44,13 @@ export interface SlackProviderClient {
|
|
|
44
44
|
text: string;
|
|
45
45
|
threadTs?: string;
|
|
46
46
|
clientMsgId: string;
|
|
47
|
+
signal?: AbortSignal;
|
|
47
48
|
}): Promise<SlackPostedMessage>;
|
|
48
49
|
findMessageByClientMsgId?(input: {
|
|
49
50
|
channel: string;
|
|
50
51
|
clientMsgId: string;
|
|
51
52
|
threadTs?: string;
|
|
53
|
+
signal?: AbortSignal;
|
|
52
54
|
}): Promise<SlackMessageSearchResult | null>;
|
|
53
55
|
/**
|
|
54
56
|
* Prove that an operator-supplied timestamp addresses a real message in the
|
|
@@ -77,11 +79,13 @@ export declare class SlackProvider {
|
|
|
77
79
|
text: string;
|
|
78
80
|
threadTs?: string;
|
|
79
81
|
clientMsgId: string;
|
|
82
|
+
signal?: AbortSignal;
|
|
80
83
|
}): Promise<SlackPostedMessage>;
|
|
81
84
|
findMessageByClientMsgId(input: {
|
|
82
85
|
channel: string;
|
|
83
86
|
clientMsgId: string;
|
|
84
87
|
threadTs?: string;
|
|
88
|
+
signal?: AbortSignal;
|
|
85
89
|
}): Promise<SlackMessageSearchResult | null>;
|
|
86
90
|
/** Fail-closed root verification: a client without this capability can never confirm a root. */
|
|
87
91
|
findMessageByTimestamp(input: {
|
|
@@ -7,17 +7,15 @@
|
|
|
7
7
|
* 2. *Daemon*: only the running owner may mutate mappings, and only while it is
|
|
8
8
|
* still the exact owner (`ownerId`/`pid`/`incarnation`/daemon generation)
|
|
9
9
|
* captured before the request was published.
|
|
10
|
-
* 3. *Session*: the
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* 3. *Session*: the running daemon supplies a redacted Router authority proving
|
|
11
|
+
* the exact session and endpoint generation; this module never resolves an
|
|
12
|
+
* endpoint or retains its credentials.
|
|
13
13
|
*
|
|
14
14
|
* Provider verification happens before any lock is taken, and the mapping commit
|
|
15
|
-
* re-proves session authority inside the store lock, so an authority
|
|
16
|
-
* changes mid-flight leaves no mapping behind.
|
|
15
|
+
* re-proves daemon and session authority inside the store lock, so an authority
|
|
16
|
+
* that changes mid-flight leaves no mapping behind.
|
|
17
17
|
*/
|
|
18
18
|
import type { Settings } from "../../config/settings";
|
|
19
|
-
import type { SessionIndex } from "../broker/session-index";
|
|
20
|
-
import { type SdkSessionEndpoint, type SdkSessionEndpointScope } from "../client/discovery";
|
|
21
19
|
import { type EnsureChatDaemonResult } from "./chat-daemon-control";
|
|
22
20
|
import { ConversationStore } from "./conversation-store";
|
|
23
21
|
import { type SlackConversation } from "./slack-conversation";
|
|
@@ -30,39 +28,6 @@ export declare class SlackThreadBindingError extends Error {
|
|
|
30
28
|
export declare function isBoundedSlackRootTs(value: string): boolean;
|
|
31
29
|
/** Reject a non-addressable root before any authority read or persistence. */
|
|
32
30
|
export declare function assertBoundedSlackRootTs(rootTs: string): void;
|
|
33
|
-
export interface SlackSessionBindingAuthority {
|
|
34
|
-
sessionId: string;
|
|
35
|
-
endpointGeneration: number;
|
|
36
|
-
pid: number;
|
|
37
|
-
repo: string;
|
|
38
|
-
/**
|
|
39
|
-
* The exact endpoint this authority was proven against. Callers must use it
|
|
40
|
-
* rather than re-reading discovery: a second read can observe a different
|
|
41
|
-
* process whose endpoint generation happens to repeat, and the numeric
|
|
42
|
-
* generation alone cannot tell the two apart.
|
|
43
|
-
*/
|
|
44
|
-
endpoint: SdkSessionEndpoint;
|
|
45
|
-
scope: SdkSessionEndpointScope;
|
|
46
|
-
endpointMtimeMs: number;
|
|
47
|
-
}
|
|
48
|
-
export interface SessionBindingAuthorityInput {
|
|
49
|
-
sessionIndex: SessionIndex;
|
|
50
|
-
sessionId: string;
|
|
51
|
-
readEndpoint?: (repo: string, sessionId: string, scope?: SdkSessionEndpointScope) => Promise<SdkSessionEndpoint | null>;
|
|
52
|
-
statEndpoint?: (endpointPath: string) => Promise<{
|
|
53
|
-
mtimeMs: number;
|
|
54
|
-
} | undefined>;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Resolve exact discovery/attachment authority for one session.
|
|
58
|
-
*
|
|
59
|
-
* `IndexedSession.live` alone is only pid liveness, which a terminated or
|
|
60
|
-
* unregistered session can still satisfy through pid reuse or a stale record.
|
|
61
|
-
* Adoption additionally requires an intact index replay, a non-terminal record,
|
|
62
|
-
* and a discovery endpoint that is present, well-formed, not marked stale, and
|
|
63
|
-
* owned by the same host pid the index recorded.
|
|
64
|
-
*/
|
|
65
|
-
export declare function resolveSessionBindingAuthority(input: SessionBindingAuthorityInput): Promise<SlackSessionBindingAuthority | undefined>;
|
|
66
31
|
export interface SlackThreadClaimInput {
|
|
67
32
|
store: ConversationStore<SlackConversation>;
|
|
68
33
|
/** The session root-claim key shared with stock root publication. */
|
|
@@ -72,6 +37,7 @@ export interface SlackThreadClaimInput {
|
|
|
72
37
|
sessionId: string;
|
|
73
38
|
rootTs: string;
|
|
74
39
|
endpointGeneration: number;
|
|
40
|
+
attachmentAuthorityId?: string;
|
|
75
41
|
/**
|
|
76
42
|
* Re-proves session authority inside the store lock, immediately before
|
|
77
43
|
* commit. It may be invoked more than once for one claim: authority here is
|
|
@@ -1,41 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Durable
|
|
3
|
-
* topic into a preallocated session" intents.
|
|
2
|
+
* Durable provider-local reservations for Telegram topic adoption.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* returns the user's existing topicId to `TopicRegistry.getOrCreateTopic`, which
|
|
10
|
-
* is the only authority that commits a topic binding. This keeps the intent out
|
|
11
|
-
* of routing/endpoint authority until commit, so a failed spawn or a late socket
|
|
12
|
-
* never deletes the user's topic and never strands a duplicate.
|
|
13
|
-
*
|
|
14
|
-
* Invariants (see `pending-approval.md`):
|
|
15
|
-
* - One file per intent, named `<intendedSessionId>.adoption-intent.json` under
|
|
16
|
-
* the daemon notifications dir. Sweep touches files only; never the Telegram API.
|
|
17
|
-
* - Only `{ intendedSessionId, topicId, chatId, target, createdAt, expiresAt }`
|
|
18
|
-
* is persisted. Bot/control tokens and endpoint digests are never stored.
|
|
19
|
-
* - Owner-only dir (0o700) and 0o600 files; atomic temp→fsync→chmod→rename→parent sync.
|
|
20
|
-
* - `tryClaim` is a synchronous, in-memory claim keyed by topicId; it excludes a
|
|
21
|
-
* second `intendedSessionId` from winning the same topic across awaits. It
|
|
22
|
-
* does not delete the sidecar; `releaseClaim` re-enables retry on commit failure.
|
|
4
|
+
* A reservation is keyed by the stable provider request identity, never by a
|
|
5
|
+
* preallocated Broker SessionId. Broker allocates the SessionId; the daemon
|
|
6
|
+
* CAS-binds that opaque value only after the lifecycle service returns it.
|
|
7
|
+
* This store owns only presentation mappings and pending-topic authorization.
|
|
23
8
|
*/
|
|
24
9
|
import type { SessionCreateTarget } from "./index";
|
|
25
|
-
|
|
26
|
-
export declare const TELEGRAM_ADOPTION_INTENT_VERSION = 1;
|
|
10
|
+
export declare const TELEGRAM_ADOPTION_INTENT_VERSION = 2;
|
|
27
11
|
export type TelegramAdoptionTarget = Extract<SessionCreateTarget, {
|
|
28
12
|
kind: "existing_path";
|
|
29
13
|
}>;
|
|
30
|
-
/** Default intent TTL (configurable at write time). Plan starts at 10 minutes. */
|
|
31
14
|
export declare const DEFAULT_ADOPTION_INTENT_TTL_MS: number;
|
|
32
|
-
/**
|
|
33
|
-
* Minimal async filesystem surface the store needs. Structurally a subset of the
|
|
34
|
-
* daemon's `TelegramDaemonFs` / `ConversationStoreFs`, so the daemon can pass its
|
|
35
|
-
* own `fs` straight through and tests can inject a fake. `open`/`sync`/`close`
|
|
36
|
-
* mirror `ConversationStoreFileHandle` so the atomic fsync path reuses the same
|
|
37
|
-
* shape as the conversation store.
|
|
38
|
-
*/
|
|
39
15
|
export interface AdoptionIntentFs {
|
|
40
16
|
mkdir(directory: string, options: {
|
|
41
17
|
recursive: true;
|
|
@@ -55,43 +31,34 @@ export interface AdoptionIntentFileHandle {
|
|
|
55
31
|
sync(): Promise<void>;
|
|
56
32
|
close(): Promise<void>;
|
|
57
33
|
}
|
|
58
|
-
/**
|
|
34
|
+
/** Persisted before create; `sessionId` is added only by bindSession. */
|
|
59
35
|
export interface TelegramAdoptionIntent {
|
|
60
|
-
|
|
61
|
-
topicId: number;
|
|
62
|
-
chatId: string;
|
|
63
|
-
target: TelegramAdoptionTarget;
|
|
64
|
-
createdAt: number;
|
|
65
|
-
expiresAt: number;
|
|
36
|
+
readonly providerRequestKey: string;
|
|
37
|
+
readonly topicId: number;
|
|
38
|
+
readonly chatId: string;
|
|
39
|
+
readonly target: TelegramAdoptionTarget;
|
|
40
|
+
readonly createdAt: number;
|
|
41
|
+
readonly expiresAt: number;
|
|
42
|
+
readonly sessionId?: string;
|
|
66
43
|
}
|
|
67
|
-
/** Durable authorization that a topic was observed through forum_topic_created. */
|
|
68
44
|
export interface TelegramPendingTopic {
|
|
69
|
-
topicId: number;
|
|
70
|
-
chatId: string;
|
|
71
|
-
createdAt: number;
|
|
72
|
-
expiresAt: number;
|
|
45
|
+
readonly topicId: number;
|
|
46
|
+
readonly chatId: string;
|
|
47
|
+
readonly createdAt: number;
|
|
48
|
+
readonly expiresAt: number;
|
|
73
49
|
}
|
|
74
|
-
|
|
75
|
-
export declare function adoptionIntentFilePath(agentDir: string, intendedSessionId: string): string;
|
|
76
|
-
/** Compose the sidecar path for a user-created topic awaiting a folder choice. */
|
|
50
|
+
export declare function adoptionIntentFilePath(agentDir: string, providerRequestKey: string): string;
|
|
77
51
|
export declare function pendingTopicFilePath(agentDir: string, topicId: number): string;
|
|
78
|
-
/** Build a fresh intent with `createdAt`/`expiresAt` derived from `now`/`ttlMs`. */
|
|
79
52
|
export declare function buildAdoptionIntent(input: {
|
|
80
|
-
|
|
53
|
+
providerRequestKey: string;
|
|
81
54
|
topicId: number;
|
|
82
55
|
chatId: string;
|
|
83
56
|
target: TelegramAdoptionTarget;
|
|
84
57
|
now?: number;
|
|
85
58
|
ttlMs?: number;
|
|
86
59
|
}): TelegramAdoptionIntent;
|
|
87
|
-
/** Test-only: filename suffix used to recognize intent sidecars in a directory listing. */
|
|
88
60
|
export declare const ADOPTION_INTENT_FILENAME_SUFFIX = ".adoption-intent.json";
|
|
89
61
|
export declare const PENDING_TOPIC_FILENAME_SUFFIX = ".pending-topic.json";
|
|
90
|
-
/**
|
|
91
|
-
* Durable, non-routable adoption-intent store. Owns durable sidecar files and
|
|
92
|
-
* the synchronous in-memory topicId claim table. The daemon owns Telegram and
|
|
93
|
-
* lifecycle wiring; this store never calls the Telegram API.
|
|
94
|
-
*/
|
|
95
62
|
export declare class TelegramAdoptionIntentStore {
|
|
96
63
|
#private;
|
|
97
64
|
constructor(input: {
|
|
@@ -100,66 +67,25 @@ export declare class TelegramAdoptionIntentStore {
|
|
|
100
67
|
now?: () => number;
|
|
101
68
|
platform?: NodeJS.Platform;
|
|
102
69
|
});
|
|
103
|
-
/** Directory holding the sidecar files. */
|
|
104
70
|
get directory(): string;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
71
|
+
byProviderRequestKey(providerRequestKey: string): TelegramAdoptionIntent | undefined;
|
|
72
|
+
/** Only a post-create CAS binding makes a reservation visible by SessionId. */
|
|
73
|
+
bySession(sessionId: string): TelegramAdoptionIntent | undefined;
|
|
108
74
|
byTopic(topicId: number): TelegramAdoptionIntent | undefined;
|
|
109
|
-
/** `true` if a non-expired intent already references `topicId`. */
|
|
110
75
|
hasNonExpiredTopic(topicId: number): boolean;
|
|
111
|
-
/** Durable authorization for an observed user-created topic, if still live. */
|
|
112
76
|
pendingTopic(topicId: number): TelegramPendingTopic | undefined;
|
|
113
77
|
hasPendingTopic(topicId: number, chatId: string): boolean;
|
|
114
|
-
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
* non-expired intent for the topic). Same intendedSessionId re-claiming its
|
|
118
|
-
* own topic is idempotent and succeeds. The claim is in-memory only; it never
|
|
119
|
-
* deletes the sidecar, so a commit failure can `releaseClaim` and retry.
|
|
120
|
-
*/
|
|
121
|
-
tryClaim(topicId: number, intendedSessionId: string): boolean;
|
|
122
|
-
/** Release a claim held by `intendedSessionId` on `topicId`. No-op otherwise. */
|
|
123
|
-
releaseClaim(topicId: number, intendedSessionId: string): void;
|
|
124
|
-
/**
|
|
125
|
-
* Durable write of one intent: temp→write→fsync→chmod(0600)→atomic rename→
|
|
126
|
-
* chmod(final, 0600)→parent-dir fsync, then track it in memory. The dir is
|
|
127
|
-
* created owner-only (0700). chmod-ing the final path after the rename makes
|
|
128
|
-
* the 0600 contract durable regardless of whether the platform's rename
|
|
129
|
-
* preserves the source mode (POSIX does; some test/network filesystems and
|
|
130
|
-
* the in-memory test double model rename as copy+delete and would otherwise
|
|
131
|
-
* drop it). The rename is still the atomic commit point; the final chmod only
|
|
132
|
-
* tightens permissions on the already-durable file. The in-memory map is only
|
|
133
|
-
* mutated after the atomic persist succeeds. Rejects (does not swallow) so the
|
|
134
|
-
* daemon can decide fail-closed behavior.
|
|
135
|
-
*/
|
|
78
|
+
/** Synchronous fail-closed topic claim keyed by provider request identity. */
|
|
79
|
+
tryClaim(topicId: number, providerRequestKey: string): boolean;
|
|
80
|
+
releaseClaim(topicId: number, providerRequestKey: string): void;
|
|
136
81
|
put(intent: TelegramAdoptionIntent): Promise<void>;
|
|
137
|
-
/**
|
|
82
|
+
/** CAS-bind the Broker-returned opaque SessionId exactly once. */
|
|
83
|
+
bindSession(providerRequestKey: string, sessionId: string): Promise<boolean>;
|
|
138
84
|
putPendingTopic(pendingTopic: TelegramPendingTopic): Promise<void>;
|
|
139
|
-
|
|
140
|
-
* Read a single intent sidecar from disk and track it if it is non-expired
|
|
141
|
-
* and well-formed. Returns the parsed intent (or undefined). Used by
|
|
142
|
-
* `rehydrate`; callers normally use `rehydrate` / `bySession`.
|
|
143
|
-
*/
|
|
144
|
-
readIntent(intendedSessionId: string): Promise<TelegramAdoptionIntent | undefined>;
|
|
85
|
+
readIntent(providerRequestKey: string): Promise<TelegramAdoptionIntent | undefined>;
|
|
145
86
|
readPendingTopic(topicId: number): Promise<TelegramPendingTopic | undefined>;
|
|
146
|
-
/**
|
|
147
|
-
* Rehydrate all non-expired intents from the notifications dir. Files are the
|
|
148
|
-
* only source: missing/corrupt/expired entries are skipped (never thrown).
|
|
149
|
-
* Returns the count of live intents loaded.
|
|
150
|
-
*/
|
|
151
87
|
rehydrate(): Promise<number>;
|
|
152
|
-
|
|
153
|
-
* Remove a single intent sidecar and drop its in-memory entry. Safe to call
|
|
154
|
-
* after a successful registry commit or a definite spawn failure. Missing
|
|
155
|
-
* files are not an error. Never calls the Telegram API.
|
|
156
|
-
*/
|
|
157
|
-
remove(intendedSessionId: string): Promise<void>;
|
|
158
|
-
/** Remove a pending-topic authorization after an adoption intent is durable. */
|
|
88
|
+
remove(providerRequestKey: string): Promise<void>;
|
|
159
89
|
removePendingTopic(topicId: number): Promise<void>;
|
|
160
|
-
/**
|
|
161
|
-
* Sweep expired intent sidecars from disk. Touches files only. Returns the
|
|
162
|
-
* count of expired sidecars removed. Safe to run at startup and periodically.
|
|
163
|
-
*/
|
|
164
90
|
sweepExpired(): Promise<number>;
|
|
165
91
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Settings } from "../../config/settings";
|
|
2
2
|
import { type NotificationSettingsReader } from "./config";
|
|
3
|
+
import { type NotificationDebrisSweepReport } from "./notification-service";
|
|
3
4
|
import { type DaemonState, type TelegramDaemonOptions } from "./telegram-daemon";
|
|
4
5
|
type TelegramDaemonRunner = {
|
|
5
6
|
run(): Promise<void>;
|
|
@@ -16,6 +17,7 @@ export interface RunDaemonInternalDeps {
|
|
|
16
17
|
DaemonImpl?: TelegramDaemonConstructor;
|
|
17
18
|
processPid?: number;
|
|
18
19
|
pidAlive?: (pid: number) => boolean;
|
|
20
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
19
21
|
/** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
|
|
20
22
|
now?: () => number;
|
|
21
23
|
/** Timer pair backing the ownership-progress watchdog; defaults to globals. */
|
|
@@ -25,6 +27,14 @@ export interface RunDaemonInternalDeps {
|
|
|
25
27
|
readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
|
|
26
28
|
/** Loads the verified machine-local identity; injectable so daemon tests do not touch the host. */
|
|
27
29
|
loadInstallationHostId?: () => Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Startup hygiene sweep over the notifications dir; injectable so tests can
|
|
32
|
+
* prove it is fired, is never awaited by startup, and that a rejection is
|
|
33
|
+
* logged instead of failing the daemon.
|
|
34
|
+
*/
|
|
35
|
+
sweepNotificationDebris?: (input: {
|
|
36
|
+
dir: string;
|
|
37
|
+
}) => Promise<NotificationDebrisSweepReport>;
|
|
28
38
|
}
|
|
29
39
|
export declare function createLightweightDaemonSettings(input: {
|
|
30
40
|
agentDir: string;
|