@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
|
@@ -4,6 +4,7 @@ import { logger, postmortem } from "@gajae-code/utils";
|
|
|
4
4
|
import { YAML } from "bun";
|
|
5
5
|
import { applyAtomicYamlPatches, setByPath } from "../../config/atomic-yaml-patch";
|
|
6
6
|
import type { Settings } from "../../config/settings";
|
|
7
|
+
import { isProcessIncarnation, processIncarnation } from "../broker/process-incarnation";
|
|
7
8
|
import {
|
|
8
9
|
getNotificationConfig,
|
|
9
10
|
isProviderEffectivelyEnabled,
|
|
@@ -12,9 +13,11 @@ import {
|
|
|
12
13
|
parseNotificationSettingsSnapshot,
|
|
13
14
|
} from "./config";
|
|
14
15
|
import { daemonPaths, HEARTBEAT_TTL_MS } from "./daemon-paths";
|
|
16
|
+
import { type NotificationDebrisSweepReport, sweepNotificationDebris } from "./notification-service";
|
|
15
17
|
import {
|
|
16
18
|
type DaemonState,
|
|
17
19
|
FilesystemTopicRegistryCasAuthority,
|
|
20
|
+
hasSafeDaemonStateShape,
|
|
18
21
|
loadInstallationHostId,
|
|
19
22
|
markDaemonOwnerStopped,
|
|
20
23
|
readDaemonState,
|
|
@@ -41,6 +44,7 @@ export interface RunDaemonInternalDeps {
|
|
|
41
44
|
DaemonImpl?: TelegramDaemonConstructor;
|
|
42
45
|
processPid?: number;
|
|
43
46
|
pidAlive?: (pid: number) => boolean;
|
|
47
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
44
48
|
/** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
|
|
45
49
|
now?: () => number;
|
|
46
50
|
/** Timer pair backing the ownership-progress watchdog; defaults to globals. */
|
|
@@ -50,6 +54,57 @@ export interface RunDaemonInternalDeps {
|
|
|
50
54
|
readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
|
|
51
55
|
/** Loads the verified machine-local identity; injectable so daemon tests do not touch the host. */
|
|
52
56
|
loadInstallationHostId?: () => Promise<string>;
|
|
57
|
+
/**
|
|
58
|
+
* Startup hygiene sweep over the notifications dir; injectable so tests can
|
|
59
|
+
* prove it is fired, is never awaited by startup, and that a rejection is
|
|
60
|
+
* logged instead of failing the daemon.
|
|
61
|
+
*/
|
|
62
|
+
sweepNotificationDebris?: (input: { dir: string }) => Promise<NotificationDebrisSweepReport>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type DaemonOwnerTuple = {
|
|
66
|
+
ownerId: string;
|
|
67
|
+
acquisitionId: string;
|
|
68
|
+
pid: number;
|
|
69
|
+
incarnation: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
function readyOwnerTuple(state: DaemonState | undefined): DaemonOwnerTuple | undefined {
|
|
73
|
+
if (
|
|
74
|
+
!state ||
|
|
75
|
+
!hasSafeDaemonStateShape(state) ||
|
|
76
|
+
state.stoppedAt !== undefined ||
|
|
77
|
+
typeof state.ownerId !== "string" ||
|
|
78
|
+
state.ownerId.length === 0 ||
|
|
79
|
+
typeof state.acquisitionId !== "string" ||
|
|
80
|
+
state.acquisitionId.length === 0 ||
|
|
81
|
+
!Number.isSafeInteger(state.pid) ||
|
|
82
|
+
state.pid <= 0 ||
|
|
83
|
+
!isProcessIncarnation(state.incarnation)
|
|
84
|
+
)
|
|
85
|
+
return undefined;
|
|
86
|
+
return {
|
|
87
|
+
ownerId: state.ownerId,
|
|
88
|
+
acquisitionId: state.acquisitionId,
|
|
89
|
+
pid: state.pid,
|
|
90
|
+
incarnation: state.incarnation,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function ownerTuplesEqual(left: DaemonOwnerTuple, right: DaemonOwnerTuple): boolean {
|
|
95
|
+
return (
|
|
96
|
+
left.ownerId === right.ownerId &&
|
|
97
|
+
left.acquisitionId === right.acquisitionId &&
|
|
98
|
+
left.pid === right.pid &&
|
|
99
|
+
left.incarnation === right.incarnation
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function daemonOwnerTuple(ownerId: string, deps: RunDaemonInternalDeps): DaemonOwnerTuple | undefined {
|
|
104
|
+
const pid = deps.processPid ?? process.pid;
|
|
105
|
+
const incarnation = (deps.pidIncarnation ?? processIncarnation)(pid);
|
|
106
|
+
if (!Number.isSafeInteger(pid) || pid <= 0 || !isProcessIncarnation(incarnation)) return undefined;
|
|
107
|
+
return { ownerId, acquisitionId: ownerId, pid, incarnation };
|
|
53
108
|
}
|
|
54
109
|
|
|
55
110
|
/** Ownership-watchdog cadence while the daemon process is running. */
|
|
@@ -236,6 +291,22 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
|
|
|
236
291
|
const settings = await resolveDaemonSettings(resolvedAgentDir, deps);
|
|
237
292
|
const cfg = getNotificationConfig(settings);
|
|
238
293
|
if (!isProviderEffectivelyEnabled(cfg, "telegram") || !isTelegramComplete(cfg)) return;
|
|
294
|
+
// Startup hygiene: reclaim inert quarantine/staging debris left by crashed
|
|
295
|
+
// writers so the notifications dir cannot grow unboundedly and slow every
|
|
296
|
+
// later endpoint scan. Never awaited by startup; a rejection is logged and
|
|
297
|
+
// never fails the daemon, because hygiene must not own daemon availability.
|
|
298
|
+
void (deps.sweepNotificationDebris ?? sweepNotificationDebris)({
|
|
299
|
+
dir: daemonPaths(resolvedAgentDir).dir,
|
|
300
|
+
})
|
|
301
|
+
.then(report => {
|
|
302
|
+
// A resolved report can still carry operational failures; surfacing only
|
|
303
|
+
// a rejected promise would hide exactly the evidence the sweep records.
|
|
304
|
+
if (report.failures > 0 || report.scanFailed === true)
|
|
305
|
+
logger.warn(
|
|
306
|
+
`telegram-daemon: startup debris sweep incomplete: removed ${report.removed.length}, failed ${report.failures}${report.scanFailed ? ", scan failed" : ""}`,
|
|
307
|
+
);
|
|
308
|
+
})
|
|
309
|
+
.catch(error => logger.warn(`telegram-daemon: startup debris sweep failed: ${String(error)}`));
|
|
239
310
|
const installationHostId = await (deps.loadInstallationHostId ?? loadInstallationHostId)();
|
|
240
311
|
const topicRegistryAuthority = new FilesystemTopicRegistryCasAuthority(
|
|
241
312
|
path.join(daemonPaths(resolvedAgentDir).dir, "telegram-topics.json"),
|
|
@@ -243,6 +314,71 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
|
|
|
243
314
|
);
|
|
244
315
|
const Daemon: TelegramDaemonConstructor = deps.DaemonImpl ?? TelegramNotificationDaemon;
|
|
245
316
|
const readState = deps.readDaemonState ?? readDaemonState;
|
|
317
|
+
// The daemon owns periodic orphan-owner reconciliation: it fences stale
|
|
318
|
+
// pollers before becoming poll-capable and re-runs the reap on a fixed
|
|
319
|
+
// cadence so late strays converge. The callback reads the current owner
|
|
320
|
+
// identity from the durable state (not from this process's volatile
|
|
321
|
+
// ownerId) so the reap targets only superseded owners, never itself.
|
|
322
|
+
const orphanReap = async (): Promise<void> => {
|
|
323
|
+
const { reapTelegramDaemonOrphans, writeTelegramOrphanRecoveryReceipt } = await import(
|
|
324
|
+
"./telegram-daemon-orphan-reap"
|
|
325
|
+
);
|
|
326
|
+
const snapshot = await readOwnerFreshnessSnapshot({ settings: settings as Settings });
|
|
327
|
+
const state = snapshot.state;
|
|
328
|
+
if (!state || !hasSafeDaemonStateShape(state) || state.ownershipPhase !== "ready") return;
|
|
329
|
+
const { nativeProcessBindings } = await import("@gajae-code/utils/native-process");
|
|
330
|
+
const incarnation = state.incarnation;
|
|
331
|
+
const { receipt } = await reapTelegramDaemonOrphans({
|
|
332
|
+
agentDir: resolvedAgentDir,
|
|
333
|
+
currentOwnerId: state.ownerId,
|
|
334
|
+
currentAcquisitionId: state.acquisitionId ?? state.ownerId,
|
|
335
|
+
currentPid: state.pid,
|
|
336
|
+
currentIncarnation: incarnation,
|
|
337
|
+
fsImpl: fs.promises as unknown as import("./telegram-daemon").TelegramDaemonFs,
|
|
338
|
+
deps: {
|
|
339
|
+
pidAlive:
|
|
340
|
+
deps.pidAlive ??
|
|
341
|
+
((pid: number) => {
|
|
342
|
+
try {
|
|
343
|
+
process.kill(pid, 0);
|
|
344
|
+
return true;
|
|
345
|
+
} catch (e) {
|
|
346
|
+
return (e as NodeJS.ErrnoException).code !== "ESRCH";
|
|
347
|
+
}
|
|
348
|
+
}),
|
|
349
|
+
pidIncarnation: deps.pidIncarnation ?? processIncarnation,
|
|
350
|
+
processReference: (pid: number) => {
|
|
351
|
+
try {
|
|
352
|
+
const r = nativeProcessBindings().Process.fromPid(pid) as {
|
|
353
|
+
incarnation?: unknown;
|
|
354
|
+
killTree?: (signal?: number) => number;
|
|
355
|
+
} | null;
|
|
356
|
+
if (!r || typeof r.incarnation !== "string" || !isProcessIncarnation(r.incarnation)) return undefined;
|
|
357
|
+
return {
|
|
358
|
+
incarnation: r.incarnation,
|
|
359
|
+
terminateTree: (sig?: NodeJS.Signals) => {
|
|
360
|
+
const os = require("node:os") as typeof import("node:os");
|
|
361
|
+
const code = sig === "SIGKILL" ? os.constants.signals.SIGKILL : os.constants.signals.SIGTERM;
|
|
362
|
+
const count = (r as { killTree: (signal?: number) => number }).killTree(code);
|
|
363
|
+
return count > 0;
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
} catch {
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
now: deps.now,
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
if (receipt.refused > 0) {
|
|
374
|
+
logger.warn(`notifications: daemon orphan reap had ${receipt.refused} refused candidate(s)`);
|
|
375
|
+
}
|
|
376
|
+
await writeTelegramOrphanRecoveryReceipt(
|
|
377
|
+
fs.promises as unknown as import("./telegram-daemon").TelegramDaemonFs,
|
|
378
|
+
resolvedAgentDir,
|
|
379
|
+
receipt,
|
|
380
|
+
).catch(() => undefined);
|
|
381
|
+
};
|
|
246
382
|
const daemon = new Daemon({
|
|
247
383
|
settings: settings as Settings,
|
|
248
384
|
ownerId,
|
|
@@ -259,6 +395,8 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
|
|
|
259
395
|
control: createDaemonControlHooks(settings as Settings),
|
|
260
396
|
topicRegistryAuthority,
|
|
261
397
|
installationHostId,
|
|
398
|
+
requireTelegramTopicEligibility: true,
|
|
399
|
+
orphanReap,
|
|
262
400
|
});
|
|
263
401
|
// Signals are a process concern: install them at the daemon-internal boundary,
|
|
264
402
|
// not inside the embeddable daemon class. SIGTERM is the reload wakeup path.
|
|
@@ -275,16 +413,65 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
|
|
|
275
413
|
if (!watchdogActive || watchdogTickInFlight || stopRequested) return;
|
|
276
414
|
watchdogTickInFlight = true;
|
|
277
415
|
try {
|
|
278
|
-
const
|
|
279
|
-
|
|
416
|
+
const isInjectedState = Boolean(deps.readDaemonState);
|
|
417
|
+
const snapshot = isInjectedState
|
|
418
|
+
? {
|
|
419
|
+
state: await readState(settings as Settings),
|
|
420
|
+
effectiveHeartbeatAt: undefined,
|
|
421
|
+
ownerTag: undefined as unknown as {
|
|
422
|
+
ownerId: string;
|
|
423
|
+
acquisitionId: string;
|
|
424
|
+
pid: number;
|
|
425
|
+
incarnation: string;
|
|
426
|
+
} | null,
|
|
427
|
+
}
|
|
280
428
|
: await readOwnerFreshnessSnapshot({ settings: settings as Settings });
|
|
281
429
|
const state = snapshot.state;
|
|
282
|
-
const heartbeatAt = snapshot.effectiveHeartbeatAt ?? state?.heartbeatAt;
|
|
430
|
+
const heartbeatAt = (snapshot as { effectiveHeartbeatAt?: number }).effectiveHeartbeatAt ?? state?.heartbeatAt;
|
|
283
431
|
if (!watchdogActive || !state) return;
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
432
|
+
// Self-fencing: prove the complete lock/state tuple (ownerId, acquisitionId, pid, incarnation).
|
|
433
|
+
// Product-owned proof uses the lock/state tuple; a bare ownerId equality alone is not authorization.
|
|
434
|
+
const publishedOwner = readyOwnerTuple(state);
|
|
435
|
+
if (isInjectedState) {
|
|
436
|
+
// Test seam path: deps.readDaemonState injects state without lock. Prove full tuple against daemon's own stable identity.
|
|
437
|
+
const expectedOwner = daemonOwnerTuple(ownerId, deps);
|
|
438
|
+
// Without stable self incarnation authority, fail closed (Windows or unavailable probe).
|
|
439
|
+
if (!publishedOwner || !expectedOwner) return;
|
|
440
|
+
if (!ownerTuplesEqual(publishedOwner, expectedOwner)) {
|
|
441
|
+
stopRequested = true;
|
|
442
|
+
daemon.requestStop("stop");
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
} else {
|
|
446
|
+
// Production path: prove the published state matches the lock-backed ownerTag; then prove supersession against current tuple.
|
|
447
|
+
if (!publishedOwner) return;
|
|
448
|
+
const snapshotTag = (
|
|
449
|
+
snapshot as {
|
|
450
|
+
ownerTag?: { ownerId: string; acquisitionId: string; pid: number; incarnation: string } | null;
|
|
451
|
+
}
|
|
452
|
+
).ownerTag;
|
|
453
|
+
if (!snapshotTag) return;
|
|
454
|
+
// Lock/state mismatch or missing lock is ambiguous — fail closed, do not selfterminate on noise.
|
|
455
|
+
if (
|
|
456
|
+
snapshotTag.ownerId !== publishedOwner.ownerId ||
|
|
457
|
+
snapshotTag.acquisitionId !== publishedOwner.acquisitionId ||
|
|
458
|
+
snapshotTag.pid !== publishedOwner.pid ||
|
|
459
|
+
snapshotTag.incarnation !== publishedOwner.incarnation
|
|
460
|
+
)
|
|
461
|
+
return;
|
|
462
|
+
// Positive supersession: published authoritative tuple no longer matches this daemon's acquisition.
|
|
463
|
+
// We prove via exact tuple comparison; acquisitionId == ownerId for daemon-spawned owners.
|
|
464
|
+
const selfTuple = daemonOwnerTuple(ownerId, deps);
|
|
465
|
+
if (selfTuple && !ownerTuplesEqual(publishedOwner, selfTuple)) {
|
|
466
|
+
stopRequested = true;
|
|
467
|
+
daemon.requestStop("stop");
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// No stable self incarnation proof available (e.g. Windows native
|
|
471
|
+
// unavailable). Fail closed: do NOT self-terminate on ownerId alone.
|
|
472
|
+
// A bare ownerId equality is not sufficient authority to terminate a
|
|
473
|
+
// running daemon — a stale or reused PID could match, killing a
|
|
474
|
+
// foreign process. The stall watchdog below handles non-progress.
|
|
288
475
|
}
|
|
289
476
|
if (lastHeartbeatAt === undefined || heartbeatAt !== lastHeartbeatAt) {
|
|
290
477
|
lastHeartbeatAt = heartbeatAt;
|
|
@@ -6,6 +6,15 @@
|
|
|
6
6
|
/** Protocol version the daemon advertises in its ClientHello. */
|
|
7
7
|
export const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
8
8
|
|
|
9
|
+
/** Telegram transport generation; independent from SDK lifecycle protocol changes. */
|
|
10
|
+
export const TELEGRAM_TRANSPORT_GENERATION = 1;
|
|
11
|
+
|
|
12
|
+
/** Notification event schema version; payload compatibility is versioned separately. */
|
|
13
|
+
export const NOTIFICATION_EVENT_SCHEMA_VERSION = 1;
|
|
14
|
+
|
|
15
|
+
/** SDK Router/lifecycle protocol negotiated by core, not by Telegram transport. */
|
|
16
|
+
export const SDK_LIFECYCLE_ROUTER_PROTOCOL_VERSION = 1;
|
|
17
|
+
|
|
9
18
|
/**
|
|
10
19
|
* Guarded behavior-inventory version for the current daemon build. Bump this
|
|
11
20
|
* on every guarded daemon-behavior change independent of the wire version; it
|
|
@@ -93,26 +102,263 @@ export const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
|
93
102
|
* later session from creating a topic or replaying notifications. Generation
|
|
94
103
|
* 58 preserves that invariant during durable-fence load promotion and restores
|
|
95
104
|
* the exact grace deadline when a failed archive publication rolls back.
|
|
96
|
-
* Generation 59
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
105
|
+
* Generation 59 moves lifecycle and attachment authority into SDK core,
|
|
106
|
+
* removes provider root scanning and direct endpoint credentials, and rebuilds
|
|
107
|
+
* Telegram presentation bindings from SessionRouter attachments. Generation 60
|
|
108
|
+
* persists Router publication receipts, awaits inbound attachment dispatch,
|
|
109
|
+
* restores actor-scoped create throttling, and exact-unlinks ownership locks.
|
|
110
|
+
* Generation 61 durably claims provider publication identities before dispatch
|
|
111
|
+
* and retains ambiguous claims across restart to prevent duplicate effects.
|
|
112
|
+
* Generation 62 confirms receipts only from accepted provider outcomes,
|
|
113
|
+
* retains queued/fallback claims, and quarantines legacy v1 confirmations.
|
|
114
|
+
* Generation 63 applies the same deferred confirmation boundary while draining
|
|
115
|
+
* replay-state and live-held frames during attachment recovery.
|
|
116
|
+
* Generation 64 additionally defers stale-lease frames, requires authoritative
|
|
117
|
+
* model message IDs, and retains claims when continuation admission fails.
|
|
118
|
+
* Generation 65 treats malformed or unknown Bot API responses as ambiguous
|
|
119
|
+
* rather than accepting them without a provider receipt.
|
|
120
|
+
* Generation 66 propagates publication identity through selected and ephemeral
|
|
121
|
+
* direct effects, retries definite pre-send route failures, and aggregates the
|
|
122
|
+
* worst continuation disposition before confirmation.
|
|
123
|
+
* Generation 67 quarantines oversized persisted receipt maps and retains claims
|
|
124
|
+
* for pending-topic frames evicted before provider delivery.
|
|
125
|
+
* Generation 68 releases claimed BTW publications when shutdown prevents dispatch.
|
|
126
|
+
* Generation 69 settles selected acknowledgements and queued BTW publications
|
|
127
|
+
* only from positive Telegram message receipts.
|
|
128
|
+
* Generation 70 separates queued claims from provider-attempt ambiguity so
|
|
129
|
+
* pre-send work remains replayable after daemon restart.
|
|
130
|
+
* Generation 71 preserves queued state through cooldown/shutdown suppression and
|
|
131
|
+
* never converts replay-suppressed ambiguity into delivered confirmation.
|
|
132
|
+
* Generation 72 keeps invalid selected publications queued and mirrors attempted
|
|
133
|
+
* BTW rejection outcomes across duplicate publication identities.
|
|
134
|
+
* Generation 73 reports queued publication disposition to SessionRouter so
|
|
135
|
+
* same-process reconnect retains the unadvanced replay cursor.
|
|
136
|
+
* Generation 74 serializes each Router frame until its durable publication state
|
|
137
|
+
* becomes attempted or delivered, preserving sequence order without cursor gaps.
|
|
138
|
+
* Generation 75 routes every direct effect through the suppression-aware adapter
|
|
139
|
+
* and gives each publication queue item a non-coalescing identity.
|
|
140
|
+
* Generation 76 adds durable terminal rejection for invalid direct frames and
|
|
141
|
+
* confirms accepted non-OK BTW status publications before returning.
|
|
142
|
+
* Generation 77 bounds terminal rejection receipts alongside delivered receipts.
|
|
143
|
+
* Generation 78 retries stale direct authority before dispatch and terminalizes
|
|
144
|
+
* intentionally superseded queued live publications.
|
|
145
|
+
* Generation 79 preserves rejected state through outer/replay confirmation and
|
|
146
|
+
* settles publication-level continuation and retry barriers.
|
|
147
|
+
* Generation 80 terminalizes every no-dispatch queue branch and revalidates
|
|
148
|
+
* terminal publication state after cooldown waits.
|
|
149
|
+
* Generation 81 terminalizes flat, pending, and stopped-pool no-dispatch work
|
|
150
|
+
* and removes the raw Router Broker mutation tunnel.
|
|
151
|
+
* Generation 82 terminalizes expired and out-of-band queue removals, defers BTW
|
|
152
|
+
* completion across all chunks, and classifies definitive direct rejections.
|
|
153
|
+
* Generation 83 terminalizes pending frames discarded during topic flush.
|
|
154
|
+
* Generation 84 closes policy/archive/selected direct waiter cleanup and routes
|
|
155
|
+
* pre-identity threaded output through flat delivery instead of a blocked queue.
|
|
156
|
+
* Generation 85 removes the obsolete pending-frame admission path entirely.
|
|
157
|
+
* Generation 86 terminalizes queued selected acknowledgements during shutdown.
|
|
158
|
+
* Generation 87 routes every run-loop exit through the publication stop boundary.
|
|
159
|
+
* Generation 88 rejects all queued publications before Router shutdown, disables
|
|
160
|
+
* implicit provider retries, and durably joins receipt persistence.
|
|
161
|
+
* Generation 89 rejects all pool submissions once a stop is requested.
|
|
162
|
+
* Generation 90 terminalizes replay-queued publications before Router shutdown.
|
|
163
|
+
* Generation 91 routes selected-ack retries through the stop admission fence.
|
|
164
|
+
* Generation 92 rejects Router waiters when terminal receipt persistence fails.
|
|
165
|
+
* Generation 93 aborts provider delivery immediately and resets failed settlement
|
|
166
|
+
* resolvers before same-daemon replay.
|
|
167
|
+
* Generation 94 wires the immediate delivery abort into every publication call.
|
|
168
|
+
* Generation 95 propagates selected-ack receipt persistence failure to Router.
|
|
169
|
+
* Generation 96 routes rich-draft delivery through the publication abort boundary.
|
|
170
|
+
* Generation 97 bounds strict tool terminalization with shutdown abort authority.
|
|
171
|
+
* Generation 98 applies delivery abort authority to every supervised Bot API call.
|
|
172
|
+
* Generation 99 propagates generic terminal receipt persistence failure to Router.
|
|
173
|
+
* Generation 100 centralizes terminal receipt failure propagation in state transitions.
|
|
174
|
+
* Generation 101 isolates batch terminal failures and replays rejected rollback.
|
|
175
|
+
* Generation 102 isolates expired and superseded pre-batch receipt failures.
|
|
176
|
+
* Generation 103 fences and joins Router reconciliation during stop.
|
|
177
|
+
* Generation 104 prevents Router timer installation after concurrent stop.
|
|
178
|
+
* Generation 105 revokes attachment capabilities immediately when Router stop begins.
|
|
179
|
+
* Generation 106 isolates every Router client close attempt during shutdown.
|
|
180
|
+
* Generation 107 joins reconnect replay within Router pending shutdown work.
|
|
181
|
+
* Generation 108 interrupts replay requests immediately when Router stop begins.
|
|
182
|
+
* Generation 109 isolates stale attachment client and provider cleanup failures.
|
|
183
|
+
* Generation 110 installs replay stop handling before starting the request.
|
|
184
|
+
* Generation 111 isolates replacement client and provider cleanup failures.
|
|
185
|
+
* Generation 112 preserves provider handoff while isolating replacement close failure.
|
|
186
|
+
* Generation 113 removes old provider authority when replacement races stop.
|
|
187
|
+
* Generation 114 removes successor provider authority when handoff races stop.
|
|
188
|
+
* Generation 115 removes provider authority for every attachment disposed by stop.
|
|
189
|
+
* Generation 116 creates publication waiters only after claim admission succeeds.
|
|
190
|
+
* Generation 117 exposes tentative claims to concurrent teardown and aborts revoked admission.
|
|
191
|
+
* Generation 118 prevents failed concurrent rejection from reviving tentative claims.
|
|
192
|
+
* Generation 119 bounds Router stop and preserves rejected failed continuations.
|
|
193
|
+
* Generation 120 awaits provisional rejection durability before replay suppression.
|
|
194
|
+
* Generation 121 fences bounded-stop continuations from later Router runs.
|
|
195
|
+
* Generation 122 fences every nested replay suppression on rejection durability.
|
|
196
|
+
* Generation 123 scopes stale Router errors to their originating run epoch.
|
|
197
|
+
* Generation 124 detaches restart tails and restores rejected rollback as replayable.
|
|
198
|
+
* Generation 125 prevents stale run cleanup from deleting restarted attachments.
|
|
199
|
+
* Generation 126 fences stale callback bookkeeping and distinguishes definitive rejection.
|
|
200
|
+
* Generation 127 keeps malformed accepted selected sends transport-ambiguous.
|
|
201
|
+
* Generation 128 bounds Discord provider work before Router revocation.
|
|
202
|
+
* Generation 129 bounds every Discord REST operation across retries.
|
|
203
|
+
* Generation 130 invalidates Discord effect lease renewal when shutdown drain expires.
|
|
204
|
+
* Generation 131 invalidates Discord effect leases at the journal mutation boundary.
|
|
205
|
+
* Generation 132 invalidates Discord create-intent leases at drain expiry.
|
|
206
|
+
* Generation 133 serializes Discord creator invalidation with in-flight admission.
|
|
207
|
+
* Generation 134 durably restores replay after definitive provider rejection.
|
|
208
|
+
* Generation 135 revokes attachments whose provider publication hook rejects.
|
|
209
|
+
* Generation 136 keeps provider attachment publication provisional until recovery succeeds.
|
|
210
|
+
* Generation 137 fences stale reconciliation, frame tails, and identity-less replay rejection.
|
|
211
|
+
* Generation 138 starts provider handshakes only after Router publication.
|
|
212
|
+
* Generation 139 privatizes raw SDK clients and removes the Python transport package.
|
|
213
|
+
* Generation 140 retires failed handshakes and holds provisional frames until publication.
|
|
214
|
+
* Generation 141 awaits the provider handshake before Router replay to prevent retained-event deadlock.
|
|
215
|
+
* Generation 142 migrates live adoption reservations and applies create throttling to topic adoption.
|
|
216
|
+
* Generation 143 preserves topic presentation continuity across exact Router endpoint replacement.
|
|
217
|
+
* Generation 144 revalidates endpoint authority before exact publication-time requests.
|
|
218
|
+
* Generation 145 distinguishes transport reconnect from a changed same-generation endpoint successor.
|
|
219
|
+
* Generation 146 revokes token-zero and callback leases before endpoint replacement while retaining topic presentation.
|
|
220
|
+
* Generation 147 uses a restart-stable opaque Router endpoint-incarnation identity.
|
|
221
|
+
* Generation 148 classifies reconnect-time endpoint successors before attachment retirement.
|
|
222
|
+
* Generation 149 serializes successor attachment behind predecessor provider retirement.
|
|
223
|
+
* Generation 150 version-fences attaches already in flight when retirement begins.
|
|
224
|
+
* Generation 151 preserves provider continuity for endpoint-before-index replacement cleanup.
|
|
225
|
+
* Generation 152 contains a thrown steady heartbeat renewal in the run loop
|
|
226
|
+
* (a transient EPERM/EACCES/EBUSY on the state or ownership-lock read) the
|
|
227
|
+
* same way instead of terminating the daemon (#4200).
|
|
228
|
+
* Generation 153 restricts Telegram forum-topic ownership, replay, routing, callbacks,
|
|
229
|
+
* and lease renewal to identities with coordinator or lifecycle provenance.
|
|
230
|
+
* Generation 154 archives private-chat topics through deleteForumTopic, settles
|
|
231
|
+
* TOPIC_ID_INVALID as definitive, and drains durable archive retries periodically.
|
|
232
|
+
* Generation 155 unifies the duplicated durable terminal-retention write path
|
|
233
|
+
* (bus and SDK-only host runtimes) into a single `boundTerminalRetentionState`
|
|
234
|
+
* helper in `session/terminal-abort.ts` (#4329).
|
|
235
|
+
* Generation 156 derives Telegram session eligibility from configuration
|
|
236
|
+
* (Telegram configured and effectively enabled) instead of coordinator or
|
|
237
|
+
* lifecycle launch provenance, and stops consulting a session's self-declared
|
|
238
|
+
* eligibility for topic admission: threaded mode always uses threads. Before
|
|
239
|
+
* this, every ordinary interactive session declared itself ineligible, the
|
|
240
|
+
* daemon rejected its identity header, no topic was created, and nothing was
|
|
241
|
+
* delivered while attachments still looked healthy.
|
|
242
|
+
* Generation 157 adds orphan-topic reconciliation: FORUM_TOPIC_NOT_FOUND is
|
|
243
|
+
* settled as definitive, and the unsupported-method fallback closes when
|
|
244
|
+
* deleteForumTopic is unavailable on older Bot API deployments.
|
|
245
|
+
* Generation 158 updates terminal-abort notification admission and cleanup semantics.
|
|
246
|
+
* Generation 159 fences the Windows process-incarnation authority: the native
|
|
247
|
+
* binding fallback no longer spawns powershell.exe when it cannot bind a pid,
|
|
248
|
+
* so older daemons that may still flash a console window during liveness polling
|
|
249
|
+
* are fenced off (#4362).
|
|
250
|
+
* Generation 160 introduces provider-local Telegram subscriptions, detached
|
|
251
|
+
* cleanup, stable topic bindings, and explicit archive authority. Older daemons
|
|
252
|
+
* retain attachment-level lifecycle coupling and may not serve this contract.
|
|
253
|
+
* Generation 161 completes that authority split: archive reasons and cleanup
|
|
254
|
+
* receipts are durable, topic recovery no longer reconstructs SDK endpoint
|
|
255
|
+
* authority, and replay generation cannot mutate lifecycle authority.
|
|
256
|
+
* Generation 162 removes chat-daemon ownership from the session-open critical
|
|
257
|
+
* path: the host acquires provider ownership only AFTER publishing its core
|
|
258
|
+
* endpoint, through a single-flight coordinator keyed to the full provider
|
|
259
|
+
* identity, and never awaits it on a lifecycle path. The daemon also sweeps
|
|
260
|
+
* inert notification-dir debris at startup. Older daemons assume ownership is
|
|
261
|
+
* proved before publication and do not perform that sweep. Generation 165
|
|
262
|
+
* preserves a bounded lean settlement window across autonomous continuations,
|
|
263
|
+
* so the Telegram terminal receipt cannot lose a prior user-request result.
|
|
264
|
+
* Generation 166 introduces complete owned process-group cleanup (killTree
|
|
265
|
+
* instead of root-only signalRoot), identity-fenced orphan-owner reconciliation
|
|
266
|
+
* in the daemon run loop, pre-poll stale-poller fencing, and fail-closed
|
|
267
|
+
* watchdog behavior when stable identity authority is unavailable (#4403).
|
|
268
|
+
* Generation 167 repairs the telegram daemon generation guard bootstrap so the
|
|
269
|
+
* generator's post-fix manifest check always byte-compares the regenerated disk
|
|
270
|
+
* manifest against the current tree, and auto-reaps pre-registry legacy stray
|
|
271
|
+
* Telegram daemons (#4533).
|
|
272
|
+
* Generation 168 adds per-update inbound acknowledgement authority and monotonic
|
|
273
|
+
* reaction settlement for Telegram notification delivery (#4528).
|
|
274
|
+
* Generation 169 delivers every ring-positioned session event live through the
|
|
275
|
+
* bounded, capability-gated directed subscriber leg used by replay.
|
|
110
276
|
*/
|
|
111
|
-
export const DAEMON_GENERATION =
|
|
277
|
+
export const DAEMON_GENERATION = 169;
|
|
112
278
|
|
|
113
279
|
/**
|
|
114
|
-
* Serving-compatibility boundary for daemon lifecycle requests. Epoch
|
|
115
|
-
* requires
|
|
116
|
-
* epoch-
|
|
280
|
+
* Serving-compatibility boundary for daemon lifecycle requests. Epoch 7
|
|
281
|
+
* requires durable publication receipts and acknowledged attachment dispatch,
|
|
282
|
+
* so epoch-6 daemons cannot serve across the delivery-safety cutover. Epoch 8
|
|
283
|
+
* requires the durable claimed/confirmed publication receipt format. Epoch 9
|
|
284
|
+
* requires accepted-only confirmation and legacy receipt quarantine. Epoch 10
|
|
285
|
+
* requires replay admission to retain deferred publication claims. Epoch 11
|
|
286
|
+
* requires strict direct receipts and fail-closed continuation admission. Epoch 12
|
|
287
|
+
* requires malformed provider responses to remain unconfirmed claims.
|
|
288
|
+
* Epoch 13 requires complete direct-effect identity and pre-send retry semantics.
|
|
289
|
+
* Epoch 14 requires bounded receipt loading and fail-closed pending eviction.
|
|
290
|
+
* Epoch 15 requires BTW shutdown to preserve Router replay authority.
|
|
291
|
+
* Epoch 16 requires accepted-only settlement for special provider queues.
|
|
292
|
+
* Epoch 17 requires durable queued/attempted/confirmed publication states.
|
|
293
|
+
* Epoch 18 requires suppression-aware attempt transitions and replay confirmation.
|
|
294
|
+
* Epoch 19 requires direct invalid/rejected outcomes to retain exact receipt state.
|
|
295
|
+
* Epoch 20 requires Router cursor advancement to follow settled publication state.
|
|
296
|
+
* Epoch 21 requires ordered Router settlement waiters for queued publications.
|
|
297
|
+
* Epoch 22 requires unified dispatch guards and non-coalescing publication work.
|
|
298
|
+
* Epoch 23 requires explicit rejected state and terminal direct settlement.
|
|
299
|
+
* Epoch 24 requires bounded terminal rejection retention.
|
|
300
|
+
* Epoch 25 requires stale-dispatch retry and superseded publication settlement.
|
|
301
|
+
* Epoch 26 requires terminal-state exclusivity and complete publication barriers.
|
|
302
|
+
* Epoch 27 requires no-dispatch terminalization and post-wait revalidation.
|
|
303
|
+
* Epoch 28 requires terminal flat/pending admission and list-only Broker routing.
|
|
304
|
+
* Epoch 29 requires complete removal terminalization and direct rejection state.
|
|
305
|
+
* Epoch 30 requires terminal settlement for pending-frame flush discards.
|
|
306
|
+
* Epoch 31 requires complete direct waiter closure and pre-identity delivery.
|
|
307
|
+
* Epoch 32 removes identity-gated pending publication admission.
|
|
308
|
+
* Epoch 33 requires selected-ack shutdown removal to settle publication state.
|
|
309
|
+
* Epoch 34 requires control-file exits to terminalize queued publications first.
|
|
310
|
+
* Epoch 35 requires complete publication teardown and single-attempt dispatch.
|
|
311
|
+
* Epoch 36 closes the retry-after-stop queue race.
|
|
312
|
+
* Epoch 37 closes replay-queue settlement during stop.
|
|
313
|
+
* Epoch 38 closes selected-ack retry-after-stop settlement.
|
|
314
|
+
* Epoch 39 propagates terminal receipt persistence failure to Router shutdown.
|
|
315
|
+
* Epoch 40 closes hanging-delivery shutdown and transient persistence replay.
|
|
316
|
+
* Epoch 41 closes ordinary publication hangs during shutdown.
|
|
317
|
+
* Epoch 42 closes selected terminal receipt persistence settlement.
|
|
318
|
+
* Epoch 43 closes rich-draft transport hangs during shutdown.
|
|
319
|
+
* Epoch 44 closes terminal tool transport hangs during shutdown.
|
|
320
|
+
* Epoch 45 closes raw topic and callback transport hangs during shutdown.
|
|
321
|
+
* Epoch 46 closes timer-finalized publication persistence settlement.
|
|
322
|
+
* Epoch 47 covers every delivered/rejected persistence rollback path.
|
|
323
|
+
* Epoch 48 preserves unrelated batch settlement and rejected replayability.
|
|
324
|
+
* Epoch 49 preserves every removed inventory settlement after individual failure.
|
|
325
|
+
* Epoch 50 prevents attachment resurrection after provider shutdown.
|
|
326
|
+
* Epoch 51 fully fences Router startup and reconciliation after stop.
|
|
327
|
+
* Epoch 52 prevents provider dispatch throughout the Router stop window.
|
|
328
|
+
* Epoch 53 prevents one transport close timeout from skipping later cleanup.
|
|
329
|
+
* Epoch 54 prevents Router return before replay callbacks complete.
|
|
330
|
+
* Epoch 55 closes pending reconnect replay without hanging Router shutdown.
|
|
331
|
+
* Epoch 56 guarantees provider authority cleanup despite transport close failure.
|
|
332
|
+
* Epoch 57 prevents orphaned replay request rejection during stop.
|
|
333
|
+
* Epoch 58 guarantees old authority cleanup before replacement attachment.
|
|
334
|
+
* Epoch 59 drops old provider authority only when replacement creation fails.
|
|
335
|
+
* Epoch 60 closes provider cleanup for replacement creation interrupted by stop.
|
|
336
|
+
* Epoch 61 closes provider cleanup after published replacement handoff.
|
|
337
|
+
* Epoch 62 covers stop during recovered-frame and replay awaits.
|
|
338
|
+
* Epoch 63 prevents capacity and claim-persistence waiter leaks.
|
|
339
|
+
* Epoch 64 closes attachment replacement during claim persistence.
|
|
340
|
+
* Epoch 65 closes dual persistence failure during tentative claim teardown.
|
|
341
|
+
* Epoch 66 prevents callback shutdown deadlock and false ambiguous rejection.
|
|
342
|
+
* Epoch 67 closes concurrent claim/rejection persistence cursor concession.
|
|
343
|
+
* Epoch 68 prevents pre-stop reconciliation authority after same-instance restart.
|
|
344
|
+
* Epoch 69 prevents provisional nested replay cursor concession.
|
|
345
|
+
* Epoch 70 prevents stale run failures from stopping a restarted Router.
|
|
346
|
+
* Epoch 71 restores bounded Router restart and rejected publication replay.
|
|
347
|
+
* Epoch 72 identity-fences provider cleanup after bounded restart.
|
|
348
|
+
* Epoch 73 preserves successor retry state and ambiguous dispatched cleanup.
|
|
349
|
+
* Epoch 74 prevents replay after accepted responses lacking message identity.
|
|
350
|
+
* Epoch 75 prevents hung Discord REST work from blocking daemon shutdown.
|
|
351
|
+
* Epoch 76 cancels hung Discord REST before active-work drain expires.
|
|
352
|
+
* Epoch 77 fences late Discord effect commits after Router revocation.
|
|
353
|
+
* Epoch 78 atomically marks timed-out Discord work uncertain before Router revocation.
|
|
354
|
+
* Epoch 79 releases timed-out Discord creator ownership for successor recovery.
|
|
355
|
+
* Epoch 80 terminalizes leases admitted after shutdown invalidator snapshot.
|
|
356
|
+
* Epoch 81 preserves definitive provider rejection across persistence failure and restart.
|
|
357
|
+
* Epoch 82 fails closed before exposing provider attachments after cleanup recovery failure.
|
|
358
|
+
* Epoch 83 binds provider commands to the exact opaque attachment identity.
|
|
359
|
+
* Epoch 84 prohibits provider lifecycle-equivalent controls and detaches replacement work.
|
|
360
|
+
* Epoch 85 removes direct relay attachment and prohibits lifecycle controls on every adapter.
|
|
361
|
+
* Epoch 86 removes public discovery/client exports and retires cross-process raw transports.
|
|
362
|
+
* Epoch 87 preserves accepted Telegram delivery ambiguity and advances poisoned poll cursors.
|
|
117
363
|
*/
|
|
118
|
-
export const SERVING_EPOCH =
|
|
364
|
+
export const SERVING_EPOCH = 87;
|
|
@@ -27,7 +27,6 @@ import { resolveGjcRuntimeSpawnInfo } from "../../daemon/runtime";
|
|
|
27
27
|
import { isProcessIncarnation } from "../broker/process-incarnation";
|
|
28
28
|
|
|
29
29
|
import { getNotificationConfig, isTelegramComplete, tokenFingerprint } from "./config";
|
|
30
|
-
import { exactUnlinkNotificationFile, readNotificationEndpointFile } from "./notification-service";
|
|
31
30
|
import {
|
|
32
31
|
type AttestedLegacyDaemonOwner,
|
|
33
32
|
confirmTelegramDaemonSpawn,
|
|
@@ -38,7 +37,6 @@ import {
|
|
|
38
37
|
isFreshLiveOwner,
|
|
39
38
|
isSignalableMatchingOwner,
|
|
40
39
|
readAttestedLegacyDaemonOwner,
|
|
41
|
-
readDaemonRoots,
|
|
42
40
|
readDaemonState,
|
|
43
41
|
readOwnerFreshnessSnapshot,
|
|
44
42
|
spawnTelegramDaemonOwner,
|
|
@@ -49,9 +47,6 @@ import {
|
|
|
49
47
|
|
|
50
48
|
const nodeFs: TelegramDaemonFs = {
|
|
51
49
|
...(fs.promises as unknown as TelegramDaemonFs),
|
|
52
|
-
readEndpointFile: readNotificationEndpointFile,
|
|
53
|
-
exactUnlink: async (file, identity) =>
|
|
54
|
-
exactUnlinkNotificationFile(file, identity, `.gjc-delete-daemon-transition-${crypto.randomUUID()}.json`),
|
|
55
50
|
};
|
|
56
51
|
const DEFAULT_GRACEFUL_TIMEOUT_MS = 8_000;
|
|
57
52
|
const DEFAULT_KILL_TIMEOUT_MS = 3_000;
|
|
@@ -227,7 +222,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
227
222
|
}
|
|
228
223
|
const snapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
|
|
229
224
|
const state = snapshot.state;
|
|
230
|
-
const roots = await readDaemonRoots(this.settings, this.fsImpl);
|
|
231
225
|
const health: DaemonHealth =
|
|
232
226
|
!state || state.stoppedAt !== undefined || !this.pidAlive(state.pid)
|
|
233
227
|
? "stopped"
|
|
@@ -250,8 +244,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
250
244
|
ownerId: state?.ownerId,
|
|
251
245
|
startedAt: state?.startedAt,
|
|
252
246
|
heartbeatAt: snapshot.effectiveHeartbeatAt,
|
|
253
|
-
roots,
|
|
254
|
-
rootCount: roots.length,
|
|
255
247
|
runtime,
|
|
256
248
|
};
|
|
257
249
|
}
|
|
@@ -270,12 +262,11 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
270
262
|
}
|
|
271
263
|
|
|
272
264
|
private async spawnAndWait(
|
|
273
|
-
roots: string[],
|
|
274
265
|
token: string,
|
|
275
266
|
chatId: string,
|
|
276
267
|
): Promise<{ spawned: TelegramSpawnOwnerResult; ready: boolean }> {
|
|
277
268
|
const spawned = await spawnTelegramDaemonOwner(
|
|
278
|
-
{ settings: this.settings,
|
|
269
|
+
{ settings: this.settings, tokenFingerprint: token, chatId },
|
|
279
270
|
this.spawnDeps(),
|
|
280
271
|
);
|
|
281
272
|
const ready = await confirmTelegramDaemonSpawn({
|
|
@@ -479,7 +470,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
479
470
|
const cfg = getNotificationConfig(this.settings);
|
|
480
471
|
const fp = tokenFingerprint(cfg.botToken as string);
|
|
481
472
|
const chatId = cfg.chatId as string;
|
|
482
|
-
const roots = before.roots ?? (await readDaemonRoots(this.settings, this.fsImpl));
|
|
483
473
|
const gracefulTimeoutMs = opts.gracefulTimeoutMs ?? DEFAULT_GRACEFUL_TIMEOUT_MS;
|
|
484
474
|
const killTimeoutMs = opts.killTimeoutMs ?? DEFAULT_KILL_TIMEOUT_MS;
|
|
485
475
|
|
|
@@ -544,7 +534,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
544
534
|
if (!(opts.spawnIfStopped ?? true)) {
|
|
545
535
|
return this.result(action, true, "no running telegram daemon to reload", before, before, warnings);
|
|
546
536
|
}
|
|
547
|
-
const { spawned, ready } = await this.spawnAndWait(
|
|
537
|
+
const { spawned, ready } = await this.spawnAndWait(fp, chatId);
|
|
548
538
|
warnings.push(...spawned.warnings);
|
|
549
539
|
const after = await this.status();
|
|
550
540
|
if (spawned.result === "blocked") {
|
|
@@ -704,7 +694,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
704
694
|
warnings,
|
|
705
695
|
);
|
|
706
696
|
}
|
|
707
|
-
const { spawned, ready } = await this.spawnAndWait(
|
|
697
|
+
const { spawned, ready } = await this.spawnAndWait(fp, chatId);
|
|
708
698
|
warnings.push(...spawned.warnings);
|
|
709
699
|
const after = await this.status();
|
|
710
700
|
if (spawned.result === "attached") {
|