@sayknow-cli/coding-agent 0.4.7 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +122 -0
- package/dist/types/capability/index.d.ts +10 -20
- package/dist/types/capability/types.d.ts +3 -0
- package/dist/types/cli/args.d.ts +0 -2
- package/dist/types/cli/read-cli.d.ts +1 -0
- package/dist/types/cli.d.ts +9 -1
- package/dist/types/commands/daemon.d.ts +2 -2
- package/dist/types/commands/deep-interview.d.ts +9 -0
- package/dist/types/commands/harness.d.ts +22 -0
- package/dist/types/commands/read.d.ts +6 -0
- package/dist/types/commands/sdk.d.ts +20 -2
- package/dist/types/config/keybindings.d.ts +34 -4
- package/dist/types/config/model-profile-contract.d.ts +40 -0
- package/dist/types/config/model-profiles.d.ts +2 -3
- package/dist/types/config/model-registry.d.ts +5 -0
- package/dist/types/config/provider-auth-health.d.ts +14 -0
- package/dist/types/config/provider-ranking.d.ts +59 -0
- package/dist/types/config/settings-schema.d.ts +156 -10
- package/dist/types/config/settings.d.ts +3 -0
- package/dist/types/edit/modes/patch.d.ts +13 -0
- package/dist/types/edit/path-mutation-lock.d.ts +15 -0
- package/dist/types/eval/py/executor.d.ts +1 -1
- package/dist/types/eval/py/runner-artifact.d.ts +8 -0
- package/dist/types/eval/py/tool-bridge.d.ts +1 -2
- package/dist/types/extensibility/extensions/types.d.ts +43 -2
- package/dist/types/extensibility/shared-events.d.ts +6 -0
- package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
- package/dist/types/main.d.ts +33 -2
- package/dist/types/memories/index.d.ts +2 -0
- package/dist/types/modes/acp/acp-agent.d.ts +22 -9
- package/dist/types/modes/components/assistant-message.d.ts +3 -1
- package/dist/types/modes/components/btw-panel.d.ts +1 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
- package/dist/types/modes/components/queue-pane.d.ts +8 -0
- package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
- package/dist/types/modes/components/read-tool-group.d.ts +4 -4
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
- package/dist/types/modes/components/settings-selector.d.ts +2 -0
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/components/tool-status-header.d.ts +4 -2
- package/dist/types/modes/components/welcome.d.ts +5 -0
- package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -0
- package/dist/types/modes/controllers/event-controller.d.ts +3 -0
- package/dist/types/modes/interactive-mode.d.ts +13 -2
- package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
- package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
- package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
- package/dist/types/modes/types.d.ts +6 -0
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
- package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
- package/dist/types/runtime/memory-domain.d.ts +9 -0
- package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
- package/dist/types/runtime/memory-guard.d.ts +39 -0
- package/dist/types/runtime/memory-limit.d.ts +11 -0
- package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
- package/dist/types/runtime-mcp/manager.d.ts +9 -1
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
- package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
- package/dist/types/runtime-mcp/redaction.d.ts +2 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
- package/dist/types/sdk/acp/final-text.d.ts +19 -0
- package/dist/types/sdk/acp/mcp.d.ts +23 -0
- package/dist/types/sdk/broker/broker.d.ts +2 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
- package/dist/types/sdk/bus/config-commands.d.ts +2 -2
- package/dist/types/sdk/bus/config.d.ts +2 -0
- package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
- package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
- package/dist/types/sdk/bus/index.d.ts +52 -4
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
- package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
- package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
- package/dist/types/sdk/bus/notification-service.d.ts +34 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
- package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
- package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
- package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
- package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
- package/dist/types/sdk/client/discovery.d.ts +2 -0
- package/dist/types/sdk/client/liveness.d.ts +7 -0
- package/dist/types/sdk/host/control/operations.d.ts +3 -2
- package/dist/types/sdk/host/host.d.ts +3 -1
- package/dist/types/sdk/host/query/handlers.d.ts +14 -0
- package/dist/types/sdk/index.d.ts +2 -0
- package/dist/types/sdk/lifecycle-session.d.ts +10 -1
- package/dist/types/sdk/prompt-status.d.ts +88 -0
- package/dist/types/sdk/session-directory.d.ts +1 -1
- package/dist/types/sdk/session.d.ts +7 -0
- package/dist/types/sdk/startup-capability.d.ts +9 -0
- package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
- package/dist/types/sdk/transport/index.d.ts +12 -0
- package/dist/types/sdk/transport/relay.d.ts +43 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
- package/dist/types/sdk/transport/socket.d.ts +7 -0
- package/dist/types/sdk/transport/stdio.d.ts +3 -0
- package/dist/types/session/agent-session.d.ts +83 -24
- package/dist/types/session/btw-contract.d.ts +16 -0
- package/dist/types/session/fallback-chain-controller.d.ts +18 -2
- package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
- package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
- package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
- package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
- package/dist/types/session/session-manager.d.ts +89 -18
- package/dist/types/session/session-storage.d.ts +31 -0
- package/dist/types/session/streaming-output.d.ts +60 -5
- package/dist/types/setup/credential-import.d.ts +5 -1
- package/dist/types/setup/provider-onboarding.d.ts +2 -0
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
- package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
- package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
- package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
- package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
- package/dist/types/skc-runtime/state-writer.d.ts +5 -1
- package/dist/types/skc-runtime/team-launch.d.ts +1 -1
- package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
- package/dist/types/skc-runtime/team-store.d.ts +12 -0
- package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
- package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
- package/dist/types/skill-state/workflow-hud.d.ts +3 -0
- package/dist/types/ssh/utils.d.ts +1 -0
- package/dist/types/task/discovery.d.ts +3 -1
- package/dist/types/task/executor.d.ts +6 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/provider-retry-status.d.ts +13 -0
- package/dist/types/task/receipt.d.ts +2 -0
- package/dist/types/task/types.d.ts +133 -0
- package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
- package/dist/types/tools/browser/launch.d.ts +7 -0
- package/dist/types/tools/fetch.d.ts +22 -9
- package/dist/types/tools/image-gen.d.ts +63 -1
- package/dist/types/tools/index.d.ts +7 -1
- package/dist/types/tools/output-meta.d.ts +21 -1
- package/dist/types/tools/read-internals.d.ts +12 -0
- package/dist/types/tools/read.d.ts +45 -1
- package/dist/types/tools/resource-gc.d.ts +23 -0
- package/dist/types/tools/skill-discovery.d.ts +7 -0
- package/dist/types/tools/sqlite-reader.d.ts +7 -0
- package/dist/types/tools/tool-result.d.ts +7 -1
- package/dist/types/utils/prompt-suggestion.d.ts +33 -0
- package/dist/types/utils/shell-snapshot.d.ts +12 -0
- package/dist/types/web/insane/bridge.d.ts +1 -0
- package/dist/types/web/insane/url-guard.d.ts +17 -0
- package/package.json +8 -12
- package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
- package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
- package/scripts/capture-sticky-viewport-showcase.ts +292 -0
- package/scripts/compile-args.ts +0 -1
- package/scripts/dogfood-repository-binding.ts +209 -0
- package/scripts/generate-docs-index.ts +4 -1
- package/scripts/generate-sdk-operation-inventory.ts +9 -0
- package/scripts/run-test-manifest.ts +6 -4
- package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
- package/scripts/verify-sticky-viewport-showcase.ts +611 -0
- package/src/capability/index.ts +58 -42
- package/src/capability/types.ts +3 -0
- package/src/cli/args.ts +16 -100
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/mcp-cli.ts +4 -21
- package/src/cli/notify-cli.ts +6 -38
- package/src/cli/read-cli.ts +2 -1
- package/src/cli/setup-cli.ts +10 -4
- package/src/cli.ts +133 -11
- package/src/commands/daemon.ts +22 -5
- package/src/commands/deep-interview.ts +26 -1
- package/src/commands/harness.ts +35 -12
- package/src/commands/read.ts +11 -2
- package/src/commands/sdk.ts +134 -17
- package/src/commands/team.ts +1 -1
- package/src/commit/agentic/index.ts +3 -3
- package/src/commit/map-reduce/index.ts +2 -2
- package/src/config/keybindings.ts +158 -25
- package/src/config/model-profile-contract.ts +174 -0
- package/src/config/model-profiles.ts +51 -10
- package/src/config/model-registry.ts +24 -4
- package/src/config/model-resolver.ts +2 -2
- package/src/config/provider-auth-health.ts +42 -0
- package/src/config/provider-ranking.ts +119 -0
- package/src/config/settings-schema.ts +157 -10
- package/src/config/settings.ts +254 -108
- package/src/coordinator-mcp/model-preset.ts +21 -74
- package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
- package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
- package/src/defaults/skc/skills/team/SKILL.md +1 -1
- package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
- package/src/discovery/ssh.ts +12 -1
- package/src/edit/index.ts +3 -6
- package/src/edit/modes/patch.ts +38 -1
- package/src/edit/modes/replace.ts +42 -0
- package/src/edit/path-mutation-lock.ts +112 -0
- package/src/eval/js/tool-bridge.ts +1 -1
- package/src/eval/py/executor.ts +37 -13
- package/src/eval/py/kernel.ts +1 -21
- package/src/eval/py/prelude.py +2 -2
- package/src/eval/py/runner-artifact.ts +84 -0
- package/src/eval/py/tool-bridge.ts +34 -18
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +42 -4
- package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
- package/src/extensibility/shared-events.ts +5 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
- package/src/hooks/native-skill-hook.ts +17 -4
- package/src/internal-urls/docs-index.generated.ts +17 -16
- package/src/internal-urls/local-protocol.ts +87 -25
- package/src/internal-urls/local-root-gc.ts +127 -0
- package/src/internal-urls/mcp-protocol.ts +73 -11
- package/src/main.ts +120 -42
- package/src/memories/index.ts +10 -0
- package/src/modes/DESIGN.md +52 -0
- package/src/modes/acp/acp-agent.ts +647 -83
- package/src/modes/acp/acp-event-mapper.ts +106 -12
- package/src/modes/acp/acp-mode.ts +39 -3
- package/src/modes/action-registry.ts +1 -1
- package/src/modes/components/assistant-message.ts +123 -22
- package/src/modes/components/btw-panel.ts +82 -16
- package/src/modes/components/irc-sidebar.ts +176 -62
- package/src/modes/components/model-selector.ts +61 -4
- package/src/modes/components/notifications-settings-editor.ts +1 -1
- package/src/modes/components/oauth-selector.ts +42 -12
- package/src/modes/components/plan-preview-overlay.ts +1 -1
- package/src/modes/components/queue-pane.ts +55 -9
- package/src/modes/components/queued-message-selector.ts +53 -10
- package/src/modes/components/read-tool-group.ts +82 -14
- package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
- package/src/modes/components/sayknow-pet-widget.ts +20 -8
- package/src/modes/components/session-observer-overlay.ts +187 -32
- package/src/modes/components/settings-selector.ts +60 -18
- package/src/modes/components/tool-execution.ts +138 -27
- package/src/modes/components/tool-status-header.ts +26 -8
- package/src/modes/components/welcome.ts +50 -23
- package/src/modes/controllers/btw-controller.ts +119 -36
- package/src/modes/controllers/command-controller.ts +101 -54
- package/src/modes/controllers/event-controller.ts +119 -27
- package/src/modes/controllers/extension-ui-controller.ts +23 -12
- package/src/modes/controllers/input-controller.ts +100 -8
- package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
- package/src/modes/controllers/selector-controller.ts +4 -1
- package/src/modes/interactive-mode.ts +201 -60
- package/src/modes/irc-observation-ledger.ts +71 -15
- package/src/modes/prompt-action-autocomplete.ts +32 -13
- package/src/modes/prompt-suggestion-controller.ts +96 -0
- package/src/modes/runtime-init.ts +20 -2
- package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
- package/src/modes/types.ts +6 -0
- package/src/modes/utils/hotkeys-markdown.ts +64 -36
- package/src/modes/utils/ui-helpers.ts +99 -4
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/architect.md +17 -3
- package/src/prompts/agents/critic.md +17 -2
- package/src/prompts/agents/executor.md +1 -1
- package/src/prompts/agents/planner.md +8 -1
- package/src/prompts/system/btw-user.md +3 -8
- package/src/prompts/system/prompt-suggestion-system.md +32 -0
- package/src/prompts/system/system-prompt.md +6 -3
- package/src/prompts/tools/cron.md +3 -1
- package/src/prompts/tools/read.md +4 -2
- package/src/prompts/tools/skill-discovery.md +1 -0
- package/src/runtime/memory-domain.ts +66 -0
- package/src/runtime/memory-guard-contract.ts +73 -0
- package/src/runtime/memory-guard.ts +292 -0
- package/src/runtime/memory-limit.ts +50 -0
- package/src/runtime-mcp/client.ts +41 -55
- package/src/runtime-mcp/content-limits.ts +71 -0
- package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
- package/src/runtime-mcp/json-rpc.ts +28 -11
- package/src/runtime-mcp/manager.ts +77 -59
- package/src/runtime-mcp/oauth-flow.ts +0 -72
- package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
- package/src/runtime-mcp/redaction.ts +30 -0
- package/src/runtime-mcp/smithery-auth.ts +17 -2
- package/src/runtime-mcp/smithery-connect.ts +11 -1
- package/src/runtime-mcp/transports/http.ts +63 -22
- package/src/sdk/acp/adapter.ts +8 -1
- package/src/sdk/acp/final-text.ts +40 -0
- package/src/sdk/acp/mcp.ts +26 -0
- package/src/sdk/broker/broker.ts +34 -20
- package/src/sdk/broker/identity.ts +22 -12
- package/src/sdk/broker/lifecycle.ts +293 -43
- package/src/sdk/broker/session-index.ts +11 -1
- package/src/sdk/bus/chat-daemon-cli.ts +2 -2
- package/src/sdk/bus/chat-daemon-control.ts +22 -5
- package/src/sdk/bus/config-commands.ts +2 -2
- package/src/sdk/bus/config.ts +10 -2
- package/src/sdk/bus/control-drain-lease.ts +104 -0
- package/src/sdk/bus/conversation-store.ts +40 -6
- package/src/sdk/bus/daemon-paths.ts +2 -0
- package/src/sdk/bus/index.ts +793 -121
- package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
- package/src/sdk/bus/lifecycle-commands.ts +63 -10
- package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
- package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
- package/src/sdk/bus/notification-orchestration.ts +12 -0
- package/src/sdk/bus/notification-service.ts +87 -25
- package/src/sdk/bus/operator-runtime.ts +31 -5
- package/src/sdk/bus/prompt-reconciliation.ts +240 -0
- package/src/sdk/bus/rate-limit-pool.ts +8 -0
- package/src/sdk/bus/recent-activity.ts +90 -26
- package/src/sdk/bus/reconciliation-store.ts +224 -0
- package/src/sdk/bus/telegram-cli.ts +6 -13
- package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
- package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
- package/src/sdk/bus/telegram-daemon-control.ts +161 -40
- package/src/sdk/bus/telegram-daemon.ts +3649 -593
- package/src/sdk/bus/telegram-reference.ts +20 -2
- package/src/sdk/bus/topic-registry.ts +451 -12
- package/src/sdk/cli/session-cli.ts +15 -2
- package/src/sdk/client/discovery.ts +19 -3
- package/src/sdk/client/liveness.ts +49 -0
- package/src/sdk/host/control/dispatch.ts +8 -2
- package/src/sdk/host/control/operations.ts +3 -2
- package/src/sdk/host/host.ts +27 -9
- package/src/sdk/host/query/handlers.ts +125 -5
- package/src/sdk/index.ts +12 -0
- package/src/sdk/lifecycle-session.ts +19 -3
- package/src/sdk/mcp/server.ts +46 -18
- package/src/sdk/prompt-status.ts +97 -0
- package/src/sdk/protocol/operation-inventory.generated.json +145 -0
- package/src/sdk/protocol/operation-registry.ts +24 -4
- package/src/sdk/session-directory.ts +5 -1
- package/src/sdk/session.ts +69 -8
- package/src/sdk/startup-capability.ts +15 -1
- package/src/sdk/transport/auth-preface.ts +82 -0
- package/src/sdk/transport/index.ts +18 -0
- package/src/sdk/transport/relay.ts +252 -0
- package/src/sdk/transport/serve-cli.ts +105 -0
- package/src/sdk/transport/socket.ts +197 -0
- package/src/sdk/transport/stdio.ts +17 -0
- package/src/session/agent-session.ts +1112 -314
- package/src/session/blob-store.ts +25 -7
- package/src/session/btw-contract.ts +59 -0
- package/src/session/fallback-chain-controller.ts +47 -8
- package/src/session/internal/managed-session-scope.ts +1426 -259
- package/src/session/internal/managed-session-storage.ts +414 -238
- package/src/session/internal/native-publish-outcome.ts +271 -0
- package/src/session/memory-guard-checkpoint-participant.ts +131 -0
- package/src/session/session-manager.ts +2079 -469
- package/src/session/session-storage.ts +151 -11
- package/src/session/streaming-output.ts +262 -43
- package/src/setup/credential-import.ts +28 -3
- package/src/setup/provider-onboarding.ts +49 -5
- package/src/setup/provider-presets.json +2 -1
- package/src/skc-runtime/deep-interview-runtime.ts +303 -36
- package/src/skc-runtime/deep-interview-stage.ts +1016 -0
- package/src/skc-runtime/deep-interview-state.ts +8 -5
- package/src/skc-runtime/gc-render.ts +1 -0
- package/src/skc-runtime/gc-runtime.ts +11 -1
- package/src/skc-runtime/linux-proc.ts +70 -36
- package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
- package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
- package/src/skc-runtime/ralplan-runtime.ts +1057 -75
- package/src/skc-runtime/repository-binding.ts +267 -0
- package/src/skc-runtime/session-state-sidecar.ts +25 -9
- package/src/skc-runtime/state-runtime.ts +50 -12
- package/src/skc-runtime/state-writer.ts +68 -56
- package/src/skc-runtime/team-launch.ts +34 -5
- package/src/skc-runtime/team-runtime.ts +41 -1
- package/src/skc-runtime/team-store.ts +32 -0
- package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
- package/src/skc-runtime/team-workers.ts +1 -0
- package/src/skc-runtime/tmux-common.ts +13 -2
- package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
- package/src/skc-runtime/tmux-sessions.ts +45 -6
- package/src/skc-runtime/ultragoal-guard.ts +93 -15
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
- package/src/skc-runtime/ultragoal-runtime.ts +469 -38
- package/src/skc-runtime/workflow-manifest.generated.json +195 -5
- package/src/skc-runtime/workflow-manifest.ts +67 -3
- package/src/skill-state/workflow-hud.ts +25 -2
- package/src/skill-state/workflow-mutation-guard.ts +104 -12
- package/src/slash-commands/builtin-registry.ts +1 -1
- package/src/ssh/utils.ts +14 -0
- package/src/task/discovery.ts +8 -2
- package/src/task/executor.ts +165 -47
- package/src/task/index.ts +123 -15
- package/src/task/provider-retry-status.ts +88 -0
- package/src/task/receipt.ts +3 -0
- package/src/task/render.ts +45 -26
- package/src/task/skc-command.ts +2 -2
- package/src/task/types.ts +55 -10
- package/src/task/ultragoal-redteam-activation.ts +75 -0
- package/src/tools/ask.ts +1 -1
- package/src/tools/ast-edit.ts +2 -2
- package/src/tools/bash-allowed-prefixes.ts +45 -1
- package/src/tools/bash-pty-selection.ts +2 -2
- package/src/tools/browser/launch.ts +41 -6
- package/src/tools/browser/screenshot-format.ts +6 -1
- package/src/tools/cron.ts +1 -1
- package/src/tools/fetch.ts +127 -154
- package/src/tools/image-gen.ts +476 -23
- package/src/tools/index.ts +7 -1
- package/src/tools/output-meta.ts +176 -9
- package/src/tools/path-utils.ts +5 -1
- package/src/tools/read-internals.ts +44 -0
- package/src/tools/read.ts +1544 -310
- package/src/tools/resource-gc.ts +665 -125
- package/src/tools/skill-discovery.ts +39 -3
- package/src/tools/sqlite-reader.ts +63 -5
- package/src/tools/subagent-render.ts +74 -16
- package/src/tools/subagent.ts +2 -0
- package/src/tools/tool-result.ts +14 -1
- package/src/utils/edit-mode.ts +2 -2
- package/src/utils/pasted-image-path.ts +15 -6
- package/src/utils/prompt-suggestion.ts +265 -0
- package/src/utils/shell-snapshot.ts +173 -63
- package/src/utils/sixel.ts +3 -3
- package/src/web/insane/bridge.ts +5 -1
- package/src/web/insane/url-guard.ts +140 -27
- package/src/web/scrapers/docs-rs.ts +30 -5
- package/src/web/scrapers/types.ts +19 -49
- package/src/web/scrapers/utils.ts +12 -26
- package/src/web/search/providers/codex.ts +1 -1
- package/src/workflow/workflow-intent-diff.ts +4 -1
|
@@ -25,9 +25,11 @@ import type {
|
|
|
25
25
|
import { OWNERSHIP_MISMATCH_MESSAGE, ownershipMismatchRecovery } from "../../daemon/operator-contract";
|
|
26
26
|
import { resolveSkcRuntimeSpawnInfo } from "../../daemon/runtime";
|
|
27
27
|
import { isProcessIncarnation } from "../broker/process-incarnation";
|
|
28
|
+
|
|
28
29
|
import { getNotificationConfig, isTelegramConfigured, tokenFingerprint } from "./config";
|
|
29
30
|
import { exactUnlinkNotificationFile, readNotificationEndpointFile } from "./notification-service";
|
|
30
31
|
import {
|
|
32
|
+
type AttestedLegacyDaemonOwner,
|
|
31
33
|
confirmTelegramDaemonSpawn,
|
|
32
34
|
type DaemonState,
|
|
33
35
|
daemonPaths,
|
|
@@ -35,8 +37,10 @@ import {
|
|
|
35
37
|
isCurrentCompatibleOwner,
|
|
36
38
|
isFreshLiveOwner,
|
|
37
39
|
isSignalableMatchingOwner,
|
|
40
|
+
readAttestedLegacyDaemonOwner,
|
|
38
41
|
readDaemonRoots,
|
|
39
42
|
readDaemonState,
|
|
43
|
+
readOwnerFreshnessSnapshot,
|
|
40
44
|
spawnTelegramDaemonOwner,
|
|
41
45
|
type TelegramDaemonDeps,
|
|
42
46
|
type TelegramDaemonFs,
|
|
@@ -109,16 +113,19 @@ export async function clearTelegramControlRequest(
|
|
|
109
113
|
|
|
110
114
|
export interface DaemonProcessReference {
|
|
111
115
|
incarnation: string;
|
|
116
|
+
/** Whether the platform delivers the requested signal cooperatively or as a hard termination. */
|
|
117
|
+
termination: "cooperative" | "hard";
|
|
112
118
|
signalRoot(signal: NodeJS.Signals): void;
|
|
113
119
|
}
|
|
114
120
|
|
|
115
|
-
function defaultProcessReference(pid: number, platform = os.platform()): DaemonProcessReference | undefined {
|
|
121
|
+
export function defaultProcessReference(pid: number, platform = os.platform()): DaemonProcessReference | undefined {
|
|
116
122
|
try {
|
|
117
123
|
const processRef = Process.fromPid(pid);
|
|
118
124
|
if (!processRef || !isProcessIncarnation(processRef.incarnation)) return undefined;
|
|
119
125
|
const incarnation = processRef.incarnation;
|
|
120
126
|
return {
|
|
121
127
|
incarnation,
|
|
128
|
+
termination: platform === "win32" ? "hard" : "cooperative",
|
|
122
129
|
signalRoot: signal => {
|
|
123
130
|
const nativeSignal = os.constants.signals[signal];
|
|
124
131
|
if (nativeSignal === undefined) throw new Error(`Unsupported signal: ${signal}`);
|
|
@@ -178,8 +185,8 @@ function defaultPidAlive(pid: number): boolean {
|
|
|
178
185
|
try {
|
|
179
186
|
process.kill(pid, 0);
|
|
180
187
|
return true;
|
|
181
|
-
} catch {
|
|
182
|
-
return
|
|
188
|
+
} catch (error) {
|
|
189
|
+
return (error as NodeJS.ErrnoException).code !== "ESRCH";
|
|
183
190
|
}
|
|
184
191
|
}
|
|
185
192
|
|
|
@@ -190,7 +197,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
190
197
|
private readonly now: () => number;
|
|
191
198
|
private readonly processReference: (pid: number) => DaemonProcessReference | undefined;
|
|
192
199
|
private readonly waitStepMs: number;
|
|
193
|
-
|
|
194
200
|
constructor(
|
|
195
201
|
private readonly settings: Settings,
|
|
196
202
|
private readonly deps: TelegramDaemonControlDeps = {},
|
|
@@ -219,7 +225,8 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
219
225
|
if (!configured) {
|
|
220
226
|
return { kind: this.kind, configured: false, health: "not_configured", runtime };
|
|
221
227
|
}
|
|
222
|
-
const
|
|
228
|
+
const snapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
|
|
229
|
+
const state = snapshot.state;
|
|
223
230
|
const roots = await readDaemonRoots(this.settings, this.fsImpl);
|
|
224
231
|
const health: DaemonHealth =
|
|
225
232
|
!state || state.stoppedAt !== undefined || !this.pidAlive(state.pid)
|
|
@@ -231,6 +238,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
231
238
|
chatId: cfg.chatId as string,
|
|
232
239
|
pidAlive: this.pidAlive,
|
|
233
240
|
pidIncarnation: this.deps.pidIncarnation,
|
|
241
|
+
effectiveHeartbeatAt: snapshot.effectiveHeartbeatAt,
|
|
234
242
|
})
|
|
235
243
|
? "running"
|
|
236
244
|
: "stale";
|
|
@@ -241,7 +249,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
241
249
|
pid: state?.pid,
|
|
242
250
|
ownerId: state?.ownerId,
|
|
243
251
|
startedAt: state?.startedAt,
|
|
244
|
-
heartbeatAt:
|
|
252
|
+
heartbeatAt: snapshot.effectiveHeartbeatAt,
|
|
245
253
|
roots,
|
|
246
254
|
rootCount: roots.length,
|
|
247
255
|
runtime,
|
|
@@ -315,31 +323,28 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
315
323
|
tokenFingerprint: string,
|
|
316
324
|
chatId: string,
|
|
317
325
|
signal: NodeJS.Signals,
|
|
318
|
-
): Promise<"signaled" | "already_gone" | "ownership_changed"> {
|
|
326
|
+
): Promise<"signaled" | "already_gone" | "ownership_changed" | "hard_termination"> {
|
|
319
327
|
const current = await readDaemonState(this.settings, this.fsImpl);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
current.
|
|
326
|
-
current.
|
|
327
|
-
current.
|
|
328
|
-
current.
|
|
329
|
-
current.
|
|
330
|
-
current.tokenFingerprint
|
|
331
|
-
current.chatId
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
// A matching captured owner that exited between the request and recheck has
|
|
337
|
-
// completed the handoff. A live owner with changed or unavailable provenance
|
|
338
|
-
// remains ambiguous and must not be treated as stopped.
|
|
328
|
+
|
|
329
|
+
const modernCurrentMatches =
|
|
330
|
+
hasSafeDaemonStateShape(current) &&
|
|
331
|
+
current.ownerId === captured.ownerId &&
|
|
332
|
+
current.acquisitionId === captured.acquisitionId &&
|
|
333
|
+
current.pid === captured.pid &&
|
|
334
|
+
current.generation === captured.generation &&
|
|
335
|
+
current.incarnation === captured.incarnation &&
|
|
336
|
+
current.tokenFingerprint === captured.tokenFingerprint &&
|
|
337
|
+
current.chatId === captured.chatId &&
|
|
338
|
+
current.tokenFingerprint === tokenFingerprint &&
|
|
339
|
+
current.chatId === chatId;
|
|
340
|
+
// The signal is privileged: the persisted record must still be the exact
|
|
341
|
+
// modern owner. Legacy generation-3 records remain migration evidence only;
|
|
342
|
+
// this controller never upgrades or signals them.
|
|
343
|
+
if (!modernCurrentMatches) return "ownership_changed";
|
|
339
344
|
if (!this.pidAlive(captured.pid)) return "already_gone";
|
|
340
345
|
if (
|
|
341
346
|
!isSignalableMatchingOwner({
|
|
342
|
-
state: current,
|
|
347
|
+
state: modernCurrentMatches ? current : captured,
|
|
343
348
|
tokenFingerprint,
|
|
344
349
|
chatId,
|
|
345
350
|
pidAlive: this.pidAlive,
|
|
@@ -352,6 +357,69 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
352
357
|
// the exit-and-reuse window between ordinary provenance checks and signaling.
|
|
353
358
|
// Its identity must still be the exact persisted incarnation before use.
|
|
354
359
|
if (!processRef || processRef.incarnation !== captured.incarnation) return "ownership_changed";
|
|
360
|
+
if (signal === "SIGTERM" && processRef.termination === "hard") return "hard_termination";
|
|
361
|
+
try {
|
|
362
|
+
processRef.signalRoot(signal);
|
|
363
|
+
} catch {
|
|
364
|
+
return "already_gone";
|
|
365
|
+
}
|
|
366
|
+
return "signaled";
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
#currentConfigurationMatches(tokenFingerprintValue: string, chatId: string): boolean {
|
|
370
|
+
const current = getNotificationConfig(this.settings);
|
|
371
|
+
return (
|
|
372
|
+
isTelegramConfigured(current) &&
|
|
373
|
+
tokenFingerprint(current.botToken) === tokenFingerprintValue &&
|
|
374
|
+
current.chatId === chatId
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
async #signalAttestedLegacyOwner(
|
|
379
|
+
captured: AttestedLegacyDaemonOwner,
|
|
380
|
+
tokenFingerprint: string,
|
|
381
|
+
chatId: string,
|
|
382
|
+
signal: NodeJS.Signals,
|
|
383
|
+
): Promise<"signaled" | "already_gone" | "ownership_changed" | "hard_termination"> {
|
|
384
|
+
if (!this.#currentConfigurationMatches(tokenFingerprint, chatId)) return "ownership_changed";
|
|
385
|
+
const current = await readAttestedLegacyDaemonOwner({
|
|
386
|
+
settings: this.settings,
|
|
387
|
+
fs: this.fsImpl,
|
|
388
|
+
now: this.now,
|
|
389
|
+
pidIncarnation: this.deps.pidIncarnation,
|
|
390
|
+
tokenFingerprint,
|
|
391
|
+
chatId,
|
|
392
|
+
});
|
|
393
|
+
if (
|
|
394
|
+
!current ||
|
|
395
|
+
current.state.pid !== captured.state.pid ||
|
|
396
|
+
current.state.ownerId !== captured.state.ownerId ||
|
|
397
|
+
current.state.startedAt !== captured.state.startedAt ||
|
|
398
|
+
current.incarnation !== captured.incarnation
|
|
399
|
+
)
|
|
400
|
+
return "ownership_changed";
|
|
401
|
+
if (!this.pidAlive(captured.state.pid)) return "already_gone";
|
|
402
|
+
const processRef = this.processReference(captured.state.pid);
|
|
403
|
+
if (!processRef || processRef.incarnation !== captured.incarnation) return "ownership_changed";
|
|
404
|
+
const rechecked = await readAttestedLegacyDaemonOwner({
|
|
405
|
+
settings: this.settings,
|
|
406
|
+
fs: this.fsImpl,
|
|
407
|
+
now: this.now,
|
|
408
|
+
pidIncarnation: this.deps.pidIncarnation,
|
|
409
|
+
tokenFingerprint,
|
|
410
|
+
chatId,
|
|
411
|
+
});
|
|
412
|
+
if (
|
|
413
|
+
!rechecked ||
|
|
414
|
+
rechecked.state.pid !== current.state.pid ||
|
|
415
|
+
rechecked.state.ownerId !== current.state.ownerId ||
|
|
416
|
+
rechecked.state.startedAt !== current.state.startedAt ||
|
|
417
|
+
rechecked.incarnation !== current.incarnation ||
|
|
418
|
+
!this.#currentConfigurationMatches(tokenFingerprint, chatId) ||
|
|
419
|
+
!this.pidAlive(captured.state.pid)
|
|
420
|
+
)
|
|
421
|
+
return "ownership_changed";
|
|
422
|
+
if (signal === "SIGTERM" && processRef.termination === "hard") return "hard_termination";
|
|
355
423
|
try {
|
|
356
424
|
processRef.signalRoot(signal);
|
|
357
425
|
} catch {
|
|
@@ -376,7 +444,10 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
376
444
|
return this.stopOrReload("reload", opts);
|
|
377
445
|
}
|
|
378
446
|
|
|
379
|
-
async reloadForGenerationUpgrade(
|
|
447
|
+
async reloadForGenerationUpgrade(
|
|
448
|
+
opts: DaemonOperationOptions = {},
|
|
449
|
+
attestedLegacyUpgrade = false,
|
|
450
|
+
): Promise<TelegramGenerationReloadResult> {
|
|
380
451
|
// A generation upgrade MUST replace an incompatible older-generation owner to
|
|
381
452
|
// avoid a permanent single-poller deadlock. Unlike a manual `skc daemon
|
|
382
453
|
// reload`, this automatic path force-escalates to SIGKILL when the old owner
|
|
@@ -384,7 +455,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
384
455
|
// self-recovers instead of failing closed and asking the operator to rerun
|
|
385
456
|
// with --force. The SIGKILL remains fenced to the still-live, still-matching
|
|
386
457
|
// captured owner (same ownerId + pid), so a fresh replacement is never killed.
|
|
387
|
-
const operation = await this.stopOrReload("reload", { ...opts, force: true });
|
|
458
|
+
const operation = await this.stopOrReload("reload", { ...opts, force: true }, attestedLegacyUpgrade);
|
|
388
459
|
if (!operation.ok) return { outcome: "failed", operation };
|
|
389
460
|
const after = await this.status();
|
|
390
461
|
return after.health === "running" ? { outcome: "ready", operation } : { outcome: "failed", operation };
|
|
@@ -394,7 +465,11 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
394
465
|
return this.stopOrReload("stop", opts);
|
|
395
466
|
}
|
|
396
467
|
|
|
397
|
-
private async stopOrReload(
|
|
468
|
+
private async stopOrReload(
|
|
469
|
+
action: "stop" | "reload",
|
|
470
|
+
opts: DaemonOperationOptions,
|
|
471
|
+
attestedLegacyUpgrade = false,
|
|
472
|
+
): Promise<DaemonOperationResult> {
|
|
398
473
|
const before = await this.status();
|
|
399
474
|
const warnings: string[] = [];
|
|
400
475
|
if (before.runtime.warning) warnings.push(before.runtime.warning);
|
|
@@ -408,7 +483,18 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
408
483
|
const gracefulTimeoutMs = opts.gracefulTimeoutMs ?? DEFAULT_GRACEFUL_TIMEOUT_MS;
|
|
409
484
|
const killTimeoutMs = opts.killTimeoutMs ?? DEFAULT_KILL_TIMEOUT_MS;
|
|
410
485
|
|
|
411
|
-
const
|
|
486
|
+
const ownerSnapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
|
|
487
|
+
const state = ownerSnapshot.state;
|
|
488
|
+
const attestedLegacyOwner = attestedLegacyUpgrade
|
|
489
|
+
? await readAttestedLegacyDaemonOwner({
|
|
490
|
+
settings: this.settings,
|
|
491
|
+
fs: this.fsImpl,
|
|
492
|
+
now: this.now,
|
|
493
|
+
pidIncarnation: this.deps.pidIncarnation,
|
|
494
|
+
tokenFingerprint: fp,
|
|
495
|
+
chatId,
|
|
496
|
+
})
|
|
497
|
+
: undefined;
|
|
412
498
|
const replaceableLiveOwner =
|
|
413
499
|
(action === "reload" &&
|
|
414
500
|
state !== undefined &&
|
|
@@ -419,6 +505,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
419
505
|
chatId,
|
|
420
506
|
pidAlive: this.pidAlive,
|
|
421
507
|
pidIncarnation: this.deps.pidIncarnation,
|
|
508
|
+
effectiveHeartbeatAt: ownerSnapshot.effectiveHeartbeatAt,
|
|
422
509
|
}) &&
|
|
423
510
|
isSignalableMatchingOwner({
|
|
424
511
|
state,
|
|
@@ -427,6 +514,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
427
514
|
pidAlive: this.pidAlive,
|
|
428
515
|
pidIncarnation: this.deps.pidIncarnation,
|
|
429
516
|
})) ||
|
|
517
|
+
(action === "reload" && attestedLegacyOwner !== undefined && this.pidAlive(attestedLegacyOwner.state.pid)) ||
|
|
430
518
|
// A physically-live matching owner whose heartbeat is stale (hung) may be
|
|
431
519
|
// past-TTL yet still holding the poller. Autostart/generation-upgrade reloads
|
|
432
520
|
// stay conservative and refuse it, but an explicit `reload --force` must be
|
|
@@ -483,16 +571,18 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
483
571
|
}
|
|
484
572
|
|
|
485
573
|
// Running owner: capture identity, request cooperative stop, signal, wait.
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
574
|
+
const modernCapturedOwner =
|
|
575
|
+
hasSafeDaemonStateShape(state) &&
|
|
576
|
+
isSignalableMatchingOwner({
|
|
489
577
|
state,
|
|
490
578
|
tokenFingerprint: fp,
|
|
491
579
|
chatId,
|
|
492
580
|
pidAlive: this.pidAlive,
|
|
493
581
|
pidIncarnation: this.deps.pidIncarnation,
|
|
494
582
|
})
|
|
495
|
-
|
|
583
|
+
? state
|
|
584
|
+
: undefined;
|
|
585
|
+
if (!modernCapturedOwner && !attestedLegacyOwner) {
|
|
496
586
|
return this.result(
|
|
497
587
|
action,
|
|
498
588
|
false,
|
|
@@ -502,7 +592,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
502
592
|
warnings,
|
|
503
593
|
);
|
|
504
594
|
}
|
|
505
|
-
const capturedOwner = state;
|
|
595
|
+
const capturedOwner = modernCapturedOwner ?? attestedLegacyOwner!.state;
|
|
506
596
|
const oldOwnerId = capturedOwner.ownerId;
|
|
507
597
|
const oldPid = capturedOwner.pid;
|
|
508
598
|
const requestId = this.deps.randomId?.() ?? `${this.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
|
|
@@ -511,7 +601,21 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
511
601
|
{ version: 1, requestId, action, ownerId: oldOwnerId, pid: oldPid, createdAt: this.now() },
|
|
512
602
|
this.fsImpl,
|
|
513
603
|
);
|
|
514
|
-
|
|
604
|
+
const signalResult = attestedLegacyOwner
|
|
605
|
+
? await this.#signalAttestedLegacyOwner(attestedLegacyOwner, fp, chatId, "SIGTERM")
|
|
606
|
+
: await this.signalCapturedOwner(modernCapturedOwner!, fp, chatId, "SIGTERM");
|
|
607
|
+
if (signalResult === "hard_termination") {
|
|
608
|
+
await this.clearOwnRequest(requestId);
|
|
609
|
+
return this.result(
|
|
610
|
+
action,
|
|
611
|
+
false,
|
|
612
|
+
"telegram daemon has hard process authority; refusing cooperative SIGTERM",
|
|
613
|
+
before,
|
|
614
|
+
await this.status(),
|
|
615
|
+
warnings,
|
|
616
|
+
);
|
|
617
|
+
}
|
|
618
|
+
if (signalResult === "ownership_changed") {
|
|
515
619
|
await this.clearOwnRequest(requestId);
|
|
516
620
|
return this.result(
|
|
517
621
|
action,
|
|
@@ -529,7 +633,8 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
529
633
|
let dead = await this.waitForPidDeath(oldPid, gracefulTimeoutMs);
|
|
530
634
|
if (!dead) {
|
|
531
635
|
// Old pid still alive after the cooperative SIGTERM. Inspect current ownership.
|
|
532
|
-
const
|
|
636
|
+
const currentSnapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
|
|
637
|
+
const current = currentSnapshot.state;
|
|
533
638
|
const changedToLiveOwner =
|
|
534
639
|
current !== undefined &&
|
|
535
640
|
current.ownerId !== oldOwnerId &&
|
|
@@ -540,6 +645,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
540
645
|
chatId,
|
|
541
646
|
pidAlive: this.pidAlive,
|
|
542
647
|
pidIncarnation: this.deps.pidIncarnation,
|
|
648
|
+
effectiveHeartbeatAt: currentSnapshot.effectiveHeartbeatAt,
|
|
543
649
|
});
|
|
544
650
|
if (changedToLiveOwner) {
|
|
545
651
|
await this.clearOwnRequest(requestId);
|
|
@@ -559,7 +665,9 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
559
665
|
// the captured owner/pid still matches, so we never kill a different owner.
|
|
560
666
|
const stillSameOwner = current !== undefined && current.ownerId === oldOwnerId && current.pid === oldPid;
|
|
561
667
|
if (opts.force && stillSameOwner) {
|
|
562
|
-
const killResult =
|
|
668
|
+
const killResult = attestedLegacyOwner
|
|
669
|
+
? await this.#signalAttestedLegacyOwner(attestedLegacyOwner, fp, chatId, "SIGKILL")
|
|
670
|
+
: await this.signalCapturedOwner(modernCapturedOwner!, fp, chatId, "SIGKILL");
|
|
563
671
|
// Kill only a still-live matching owner; an owner that exited between the
|
|
564
672
|
// graceful timeout and this recheck ("already_gone") is confirmed dead by
|
|
565
673
|
// waitForPidDeath, while a real ownership change stays fenced.
|
|
@@ -585,11 +693,23 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
585
693
|
return this.result(action, true, "stopped telegram daemon", before, after, warnings);
|
|
586
694
|
}
|
|
587
695
|
|
|
696
|
+
if (!this.#currentConfigurationMatches(fp, chatId)) {
|
|
697
|
+
const after = await this.status();
|
|
698
|
+
return this.result(
|
|
699
|
+
action,
|
|
700
|
+
false,
|
|
701
|
+
"telegram notification configuration changed during reload; refusing to spawn",
|
|
702
|
+
before,
|
|
703
|
+
after,
|
|
704
|
+
warnings,
|
|
705
|
+
);
|
|
706
|
+
}
|
|
588
707
|
const { spawned, ready } = await this.spawnAndWait(roots, fp, chatId);
|
|
589
708
|
warnings.push(...spawned.warnings);
|
|
590
709
|
const after = await this.status();
|
|
591
710
|
if (spawned.result === "attached") {
|
|
592
|
-
const
|
|
711
|
+
const attachedSnapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
|
|
712
|
+
const attachedState = attachedSnapshot.state;
|
|
593
713
|
if (
|
|
594
714
|
!isCurrentCompatibleOwner({
|
|
595
715
|
state: attachedState,
|
|
@@ -598,6 +718,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
|
|
|
598
718
|
chatId,
|
|
599
719
|
pidAlive: this.pidAlive,
|
|
600
720
|
pidIncarnation: this.deps.pidIncarnation,
|
|
721
|
+
effectiveHeartbeatAt: attachedSnapshot.effectiveHeartbeatAt,
|
|
601
722
|
})
|
|
602
723
|
) {
|
|
603
724
|
return this.result(
|