@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
|
@@ -4,11 +4,13 @@ import type { DaemonRuntimeInfo } from "../../daemon/control-types";
|
|
|
4
4
|
import { HEARTBEAT_TTL_MS } from "./daemon-paths";
|
|
5
5
|
import { type DaemonTransitionLock, type NotificationEndpointFile, type NotificationEndpointFileIdentity, type NotificationExactUnlinkResult } from "./notification-service";
|
|
6
6
|
import { type DaemonProcessReference } from "./telegram-daemon-control";
|
|
7
|
-
|
|
7
|
+
import { type TelegramSetupPreflight } from "./telegram-setup";
|
|
8
|
+
export { DAEMON_GENERATION, NOTIFICATION_PROTOCOL_VERSION, SERVING_EPOCH } from "./telegram-daemon-contract";
|
|
8
9
|
import { type ControlServerLike, type LifecycleControlServerFactory } from "./lifecycle-control-runtime";
|
|
9
10
|
import type { OrchestratorDeps } from "./lifecycle-orchestrator";
|
|
10
|
-
import { NotificationOperatorRuntime
|
|
11
|
+
import { NotificationOperatorRuntime } from "./operator-runtime";
|
|
11
12
|
import { type AliasTable, type CallbackRoute } from "./telegram-reference";
|
|
13
|
+
import { type TopicEndpointBinding } from "./topic-registry";
|
|
12
14
|
export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled" | "blocked";
|
|
13
15
|
/** Detailed result for orchestration that must distinguish a #2028 handoff from a fresh spawn. */
|
|
14
16
|
export type EnsureTelegramDaemonDetailedResult = "spawned" | "reloaded" | "attached" | "disabled" | "blocked_identity";
|
|
@@ -39,6 +41,8 @@ export interface DaemonState {
|
|
|
39
41
|
* notification wire protocol version. Absent on pre-generation state.
|
|
40
42
|
*/
|
|
41
43
|
generation?: number;
|
|
44
|
+
/** Lifecycle-serving compatibility epoch; absent pre-epoch records are epoch 1. */
|
|
45
|
+
servingEpoch?: number;
|
|
42
46
|
stoppedAt?: number;
|
|
43
47
|
}
|
|
44
48
|
export interface TelegramDaemonFs {
|
|
@@ -54,6 +58,10 @@ export interface TelegramDaemonFs {
|
|
|
54
58
|
chmod(path: string, mode: number): Promise<void>;
|
|
55
59
|
stat?(path: string): Promise<{
|
|
56
60
|
mtimeMs: number;
|
|
61
|
+
size?: number;
|
|
62
|
+
dev?: number;
|
|
63
|
+
ino?: number;
|
|
64
|
+
ctimeMs?: number;
|
|
57
65
|
}>;
|
|
58
66
|
readEndpointFile?(path: string): Promise<NotificationEndpointFile>;
|
|
59
67
|
exactUnlink?(path: string, identity: NotificationEndpointFileIdentity): Promise<NotificationExactUnlinkResult>;
|
|
@@ -99,8 +107,25 @@ export declare const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
|
|
|
99
107
|
/** Capability required for typed controls and semantic Selected acknowledgement frames. */
|
|
100
108
|
export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
|
|
101
109
|
export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
|
|
102
|
-
/** Capability
|
|
103
|
-
export declare const TOOL_ACTIVITY_CAPABILITY = "
|
|
110
|
+
/** Capability for the closed tool phase set: started, completed, failed, and cancelled. */
|
|
111
|
+
export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v2";
|
|
112
|
+
/** Receive-only compatibility capability for pre-v2 hosts. */
|
|
113
|
+
export declare const LEGACY_TOOL_ACTIVITY_CAPABILITY = "tool_activity_v1";
|
|
114
|
+
/**
|
|
115
|
+
* File-lock options whose acquisition budget covers the full reload-reservation
|
|
116
|
+
* critical section: the in-lock freshness poll plus the controller's
|
|
117
|
+
* graceful+kill+readiness sequence, with headroom. A contender must be able to
|
|
118
|
+
* wait out a legitimate slow reload and then attach, never fail startup.
|
|
119
|
+
*/
|
|
120
|
+
export declare function reloadReservationLockOptions(input: {
|
|
121
|
+
freshnessWaitMs: number;
|
|
122
|
+
readinessTimeoutMs: number;
|
|
123
|
+
retryDelayMs?: number;
|
|
124
|
+
}): {
|
|
125
|
+
staleMs: number;
|
|
126
|
+
retries: number;
|
|
127
|
+
retryDelayMs: number;
|
|
128
|
+
};
|
|
104
129
|
export declare const BTW_QUESTION_MAX_UNICODE_SCALARS = 4096;
|
|
105
130
|
export declare const BTW_QUESTION_MAX_UTF8_BYTES = 16384;
|
|
106
131
|
export declare function endpointAuthorityDigest(url: string, token: string, connectionIdentity?: string): string;
|
|
@@ -136,12 +161,22 @@ type LegacyOwnershipLockMetadata = {
|
|
|
136
161
|
incarnation?: string;
|
|
137
162
|
startedAt: number;
|
|
138
163
|
};
|
|
164
|
+
type V010OwnershipLockMetadata = {
|
|
165
|
+
size: 0;
|
|
166
|
+
mtimeMs?: number;
|
|
167
|
+
dev?: number;
|
|
168
|
+
ino?: number;
|
|
169
|
+
ctimeMs?: number;
|
|
170
|
+
};
|
|
139
171
|
type OwnershipLockRead = {
|
|
140
172
|
kind: "missing";
|
|
141
173
|
} | {
|
|
142
174
|
kind: "malformed";
|
|
143
175
|
raw: string;
|
|
144
176
|
mtimeMs?: number;
|
|
177
|
+
} | {
|
|
178
|
+
kind: "v010";
|
|
179
|
+
metadata: V010OwnershipLockMetadata;
|
|
145
180
|
} | {
|
|
146
181
|
kind: "legacy";
|
|
147
182
|
metadata: LegacyOwnershipLockMetadata;
|
|
@@ -170,15 +205,59 @@ export declare function liveOwnershipLockDecision(input: {
|
|
|
170
205
|
attached: false;
|
|
171
206
|
provisional: true;
|
|
172
207
|
} | undefined;
|
|
208
|
+
type OwnerHeartbeatSidecar = {
|
|
209
|
+
pid: number;
|
|
210
|
+
incarnation: string;
|
|
211
|
+
ownerId: string;
|
|
212
|
+
acquisitionId: string;
|
|
213
|
+
heartbeatAt: number;
|
|
214
|
+
};
|
|
215
|
+
export interface OwnerFreshnessSnapshot {
|
|
216
|
+
ownerTag: Pick<OwnerHeartbeatSidecar, "pid" | "incarnation" | "ownerId" | "acquisitionId"> | null;
|
|
217
|
+
effectiveHeartbeatAt: number | undefined;
|
|
218
|
+
legacyEmbedded: boolean;
|
|
219
|
+
state: DaemonState | undefined;
|
|
220
|
+
}
|
|
221
|
+
export declare function readOwnerFreshnessSnapshot(input: {
|
|
222
|
+
settings: Settings;
|
|
223
|
+
fs?: TelegramDaemonFs;
|
|
224
|
+
}): Promise<OwnerFreshnessSnapshot>;
|
|
225
|
+
/** Marker-free steady heartbeat renewal. The final lock reread fences a stale writer. */
|
|
226
|
+
export declare function renewOwnerHeartbeatSidecar(input: {
|
|
227
|
+
settings: Settings;
|
|
228
|
+
ownerId: string;
|
|
229
|
+
acquisitionId?: string;
|
|
230
|
+
fs?: TelegramDaemonFs;
|
|
231
|
+
now?: () => number;
|
|
232
|
+
pid?: number;
|
|
233
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
234
|
+
}): Promise<boolean>;
|
|
235
|
+
export interface NotificationRootRegistration {
|
|
236
|
+
root?: string;
|
|
237
|
+
managed?: boolean;
|
|
238
|
+
token?: string;
|
|
239
|
+
}
|
|
240
|
+
export declare function readNotificationRootRegistration(input: {
|
|
241
|
+
settings: Settings;
|
|
242
|
+
sessionId: string;
|
|
243
|
+
fs?: TelegramDaemonFs;
|
|
244
|
+
}): Promise<NotificationRootRegistration>;
|
|
245
|
+
export interface RegisterNotificationRootResult {
|
|
246
|
+
root: string;
|
|
247
|
+
/** Per-registration ownership token fencing a stale same-session cleanup from deleting a live replacement registration. */
|
|
248
|
+
token: string;
|
|
249
|
+
}
|
|
173
250
|
export declare function registerNotificationRoot(input: {
|
|
174
251
|
settings: Settings;
|
|
175
252
|
cwd: string;
|
|
176
253
|
sessionId: string;
|
|
177
254
|
fs?: TelegramDaemonFs;
|
|
178
|
-
}): Promise<
|
|
255
|
+
}): Promise<RegisterNotificationRootResult>;
|
|
179
256
|
export interface UnregisterNotificationRootResult {
|
|
180
257
|
root: string;
|
|
181
258
|
remainingRoots: number;
|
|
259
|
+
/** Opaque fingerprint of the exact registry written by this successful unregister. */
|
|
260
|
+
registryFingerprint?: string;
|
|
182
261
|
}
|
|
183
262
|
/** Remove one session's Telegram scan root without disturbing other live session roots. */
|
|
184
263
|
export declare function unregisterNotificationRoot(input: {
|
|
@@ -186,8 +265,94 @@ export declare function unregisterNotificationRoot(input: {
|
|
|
186
265
|
cwd: string;
|
|
187
266
|
sessionId: string;
|
|
188
267
|
fs?: TelegramDaemonFs;
|
|
268
|
+
/** Ownership token minted by this runtime's own registration; a stale cleanup presenting an older token never deletes a replacement registration. */
|
|
269
|
+
registrationToken?: string;
|
|
189
270
|
}): Promise<UnregisterNotificationRootResult>;
|
|
271
|
+
/** Run an action while the roots registry lock excludes any registration or unregister. */
|
|
272
|
+
export declare function withNotificationRootRegistryFence(input: {
|
|
273
|
+
settings: Settings;
|
|
274
|
+
registryFingerprint: string;
|
|
275
|
+
action: () => Promise<void>;
|
|
276
|
+
fs?: TelegramDaemonFs;
|
|
277
|
+
}): Promise<boolean>;
|
|
278
|
+
/**
|
|
279
|
+
* Leak artifact prefixes left when native exact-unlink cleanup is retained
|
|
280
|
+
* (#2956). Nothing previously reaped these; they accumulate in the notifications
|
|
281
|
+
* directory across ownership transitions.
|
|
282
|
+
*/
|
|
283
|
+
export declare const NOTIFICATION_LEAK_ARTIFACT_PREFIXES: readonly [".skc-delete-daemon-transition-", ".skc-exact-unlink-placeholder-", ".skc-delete-notification-endpoint-"];
|
|
284
|
+
/** Grace window before a leak artifact is reaped (covers in-flight unlinks). */
|
|
285
|
+
export declare const NOTIFICATION_LEAK_ARTIFACT_GRACE_MS: number;
|
|
286
|
+
/** True when a path is permanently gone (not a transient I/O blip). */
|
|
287
|
+
export declare function isPermanentMissingPathError(error: unknown): boolean;
|
|
288
|
+
export declare function isNotificationLeakArtifactName(name: string): boolean;
|
|
289
|
+
/**
|
|
290
|
+
* Drop permanently missing scan roots from the durable registry under the roots
|
|
291
|
+
* lock. Session map entries that pointed only at those roots are removed too.
|
|
292
|
+
*/
|
|
293
|
+
export declare function pruneMissingNotificationRoots(input: {
|
|
294
|
+
settings: Settings;
|
|
295
|
+
fs?: TelegramDaemonFs;
|
|
296
|
+
/** When set, only these roots are considered; otherwise every registered root is probed. */
|
|
297
|
+
candidates?: readonly string[];
|
|
298
|
+
}): Promise<{
|
|
299
|
+
pruned: string[];
|
|
300
|
+
remaining: number;
|
|
301
|
+
}>;
|
|
302
|
+
/**
|
|
303
|
+
* Reap retained exact-unlink / ownership-transition quarantine files older than
|
|
304
|
+
* the grace window from the notifications directory.
|
|
305
|
+
*/
|
|
306
|
+
export declare function reapStaleNotificationArtifacts(input: {
|
|
307
|
+
settings: Settings;
|
|
308
|
+
fs?: TelegramDaemonFs;
|
|
309
|
+
now?: () => number;
|
|
310
|
+
graceMs?: number;
|
|
311
|
+
}): Promise<{
|
|
312
|
+
removed: string[];
|
|
313
|
+
skipped: number;
|
|
314
|
+
}>;
|
|
315
|
+
/**
|
|
316
|
+
* Startup / ownership self-heal: prune dead roots and reap leak artifacts so
|
|
317
|
+
* `skc daemon reload` recovers a degraded install without manual surgery (#2956).
|
|
318
|
+
*/
|
|
319
|
+
export declare function healTelegramDaemonNotificationState(input: {
|
|
320
|
+
settings: Settings;
|
|
321
|
+
fs?: TelegramDaemonFs;
|
|
322
|
+
now?: () => number;
|
|
323
|
+
graceMs?: number;
|
|
324
|
+
}): Promise<{
|
|
325
|
+
prunedRoots: string[];
|
|
326
|
+
removedArtifacts: string[];
|
|
327
|
+
}>;
|
|
190
328
|
export declare function hasSafeDaemonStateShape(state: unknown): state is DaemonState;
|
|
329
|
+
type ParentDaemonStateBase = Omit<DaemonState, "incarnation" | "acquisitionId" | "ownershipPhase" | "generation" | "launcherPid"> & {
|
|
330
|
+
incarnation?: undefined;
|
|
331
|
+
acquisitionId?: undefined;
|
|
332
|
+
ownershipPhase?: undefined;
|
|
333
|
+
generation?: unknown;
|
|
334
|
+
launcherPid?: undefined;
|
|
335
|
+
};
|
|
336
|
+
type GenerationAbsentParentDaemonState = Omit<ParentDaemonStateBase, "generation"> & {
|
|
337
|
+
generation?: undefined;
|
|
338
|
+
};
|
|
339
|
+
type Generation3ReleaseDaemonState = Omit<ParentDaemonStateBase, "generation"> & {
|
|
340
|
+
generation: 3;
|
|
341
|
+
};
|
|
342
|
+
export type LegacyParentDaemonState = GenerationAbsentParentDaemonState | Generation3ReleaseDaemonState;
|
|
343
|
+
export interface AttestedLegacyDaemonOwner {
|
|
344
|
+
state: LegacyParentDaemonState;
|
|
345
|
+
incarnation: string;
|
|
346
|
+
}
|
|
347
|
+
/** Revalidate the exact two-observation legacy proof immediately before signaling. */
|
|
348
|
+
export declare function readAttestedLegacyDaemonOwner(input: {
|
|
349
|
+
settings: Settings;
|
|
350
|
+
fs?: TelegramDaemonFs;
|
|
351
|
+
now?: () => number;
|
|
352
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
353
|
+
tokenFingerprint: string;
|
|
354
|
+
chatId: string;
|
|
355
|
+
}): Promise<AttestedLegacyDaemonOwner | undefined>;
|
|
191
356
|
/** True for a physically live owner with this configuration, including legacy generations. */
|
|
192
357
|
export declare function isPhysicalMatchingOwner(input: {
|
|
193
358
|
state: DaemonState | undefined;
|
|
@@ -196,7 +361,7 @@ export declare function isPhysicalMatchingOwner(input: {
|
|
|
196
361
|
pidAlive: (pid: number) => boolean;
|
|
197
362
|
pidIncarnation?: (pid: number) => string | undefined;
|
|
198
363
|
}): boolean;
|
|
199
|
-
/** True only for a
|
|
364
|
+
/** True only for a fully-provenanced modern owner outside the generation-3 parent schema. */
|
|
200
365
|
export declare function isSignalableMatchingOwner(input: {
|
|
201
366
|
state: DaemonState | undefined;
|
|
202
367
|
tokenFingerprint: string;
|
|
@@ -211,6 +376,7 @@ export declare function isFreshLiveOwner(input: {
|
|
|
211
376
|
chatId: string;
|
|
212
377
|
pidAlive: (pid: number) => boolean;
|
|
213
378
|
pidIncarnation?: (pid: number) => string | undefined;
|
|
379
|
+
effectiveHeartbeatAt?: number;
|
|
214
380
|
}): boolean;
|
|
215
381
|
/** True only when a physically live matching owner can serve this build's daemon lifecycle contract. */
|
|
216
382
|
export declare function isCurrentCompatibleOwner(input: {
|
|
@@ -220,6 +386,7 @@ export declare function isCurrentCompatibleOwner(input: {
|
|
|
220
386
|
chatId: string;
|
|
221
387
|
pidAlive: (pid: number) => boolean;
|
|
222
388
|
pidIncarnation?: (pid: number) => string | undefined;
|
|
389
|
+
effectiveHeartbeatAt?: number;
|
|
223
390
|
}): boolean;
|
|
224
391
|
export declare function acquireDaemonOwnership(input: {
|
|
225
392
|
settings: Settings;
|
|
@@ -245,6 +412,7 @@ export declare function acquireDaemonOwnership(input: {
|
|
|
245
412
|
provisional?: boolean;
|
|
246
413
|
reason?: "identity_mismatch";
|
|
247
414
|
reloadRequired?: boolean;
|
|
415
|
+
legacyReloadRequired?: boolean;
|
|
248
416
|
}>;
|
|
249
417
|
export declare function renewDaemonHeartbeat(input: {
|
|
250
418
|
settings: Settings;
|
|
@@ -290,7 +458,7 @@ export declare function retireProvisionalDaemonOwnership(input: {
|
|
|
290
458
|
/** Only no-child confirmation may retire a ready-like launcher publication. */
|
|
291
459
|
allowReadyWithoutChildPid?: boolean;
|
|
292
460
|
}): Promise<boolean>;
|
|
293
|
-
/** Wait for a matching
|
|
461
|
+
/** Wait for a matching compatible owner to publish a ready state. Readiness is serving-epoch gated (same-epoch cross-generation owners attach, per isCurrentCompatibleOwner); generation is inventory-only here. Mutation paths still require exact current-generation equality. */
|
|
294
462
|
export declare function waitForTelegramDaemonReady(input: {
|
|
295
463
|
settings: Settings;
|
|
296
464
|
ownerId?: string;
|
|
@@ -321,6 +489,8 @@ export declare function confirmTelegramDaemonSpawn(input: {
|
|
|
321
489
|
sleep?: (ms: number) => Promise<void>;
|
|
322
490
|
waitStepMs?: number;
|
|
323
491
|
timeoutMs?: number;
|
|
492
|
+
/** Retain an unproven no-PID child lease during a successor handoff. */
|
|
493
|
+
preserveOnUnprovenChildExit?: boolean;
|
|
324
494
|
}): Promise<boolean>;
|
|
325
495
|
export declare function releaseDaemonOwnership(input: {
|
|
326
496
|
settings: Settings;
|
|
@@ -338,6 +508,22 @@ export declare function releaseDaemonOwnership(input: {
|
|
|
338
508
|
export declare function readDaemonState(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
|
|
339
509
|
/** Read the persisted notification roots list. */
|
|
340
510
|
export declare function readDaemonRoots(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<string[]>;
|
|
511
|
+
/** Injectable readers for {@link resolveTelegramSetupPreflight}, defaulting to the real OS/state probes. */
|
|
512
|
+
export interface ResolveTelegramSetupPreflightDeps {
|
|
513
|
+
readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
|
|
514
|
+
pidAlive?: (pid: number) => boolean;
|
|
515
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Build the Telegram setup preflight from persisted daemon state. The daemon is
|
|
519
|
+
* reported live ONLY when its PID is alive AND its current process incarnation
|
|
520
|
+
* still matches the persisted incarnation. Skipping the incarnation check makes
|
|
521
|
+
* a stale state file whose PID has been recycled by an unrelated process
|
|
522
|
+
* masquerade as a live owner, which wrongly blocks discovery pairing. Both the
|
|
523
|
+
* `notify setup` CLI and the /settings Notifications tab share this resolver so
|
|
524
|
+
* pairing behaves identically on both surfaces.
|
|
525
|
+
*/
|
|
526
|
+
export declare function resolveTelegramSetupPreflight(settings: Settings, deps?: ResolveTelegramSetupPreflightDeps): Promise<TelegramSetupPreflight>;
|
|
341
527
|
export interface TelegramSpawnOwnerInput {
|
|
342
528
|
settings: Settings;
|
|
343
529
|
roots?: string[];
|
|
@@ -362,6 +548,7 @@ export type TelegramSpawnOwnerResult = {
|
|
|
362
548
|
runtime: DaemonRuntimeInfo;
|
|
363
549
|
warnings: string[];
|
|
364
550
|
reloadRequired?: boolean;
|
|
551
|
+
legacyReloadRequired?: boolean;
|
|
365
552
|
} | {
|
|
366
553
|
result: "blocked";
|
|
367
554
|
runtime: DaemonRuntimeInfo;
|
|
@@ -389,6 +576,29 @@ export declare function buildTelegramDaemonSpawnArgs(input: {
|
|
|
389
576
|
* already-persisted roots.
|
|
390
577
|
*/
|
|
391
578
|
export declare function spawnTelegramDaemonOwner(input: TelegramSpawnOwnerInput, deps?: TelegramDaemonDeps): Promise<TelegramSpawnOwnerResult>;
|
|
579
|
+
/**
|
|
580
|
+
* Owner-bound reclamation of a confirmed-dead daemon owner, mirroring the
|
|
581
|
+
* daemon step of `skc notify recovery`. It returns a structured, actionable
|
|
582
|
+
* result and removes only identity-verified dead-owner artifacts while holding
|
|
583
|
+
* the transition fence; live, successor, unknown, or unreadable evidence is
|
|
584
|
+
* retained.
|
|
585
|
+
*/
|
|
586
|
+
export type DeadOwnerRecoveryResult = {
|
|
587
|
+
recovered: true;
|
|
588
|
+
reason: "cleared";
|
|
589
|
+
} | {
|
|
590
|
+
recovered: false;
|
|
591
|
+
reason: "not-confirmed-dead" | "unsafe-lock" | "transition-contended" | "owner-superseded" | "unsafe-endpoint" | "endpoint-changed" | "endpoint-directory-unreadable" | "lock-changed";
|
|
592
|
+
};
|
|
593
|
+
/** Preflight cleanup for a confirmed-dead owner, with identity-bound removal. */
|
|
594
|
+
export declare function reclaimDeadDaemonOwner(input: {
|
|
595
|
+
settings: Settings;
|
|
596
|
+
endpointDir?: string;
|
|
597
|
+
fs?: TelegramDaemonFs;
|
|
598
|
+
now?: () => number;
|
|
599
|
+
pidAlive?: (pid: number) => boolean;
|
|
600
|
+
pidIncarnation?: (pid: number) => string | undefined;
|
|
601
|
+
}): Promise<DeadOwnerRecoveryResult>;
|
|
392
602
|
/**
|
|
393
603
|
* Ensure a configured daemon owns this session root, preserving ownership safety
|
|
394
604
|
* while exposing whether a #2028 generation handoff was required.
|
|
@@ -397,6 +607,9 @@ export declare function ensureTelegramDaemonRunningDetailed(input: {
|
|
|
397
607
|
settings: Settings;
|
|
398
608
|
cwd: string;
|
|
399
609
|
sessionId: string;
|
|
610
|
+
registerRoot?: boolean;
|
|
611
|
+
/** Receives each registration this ensure operation minted so the caller can fence its own later cleanup. */
|
|
612
|
+
onRegistered?: (registration: RegisterNotificationRootResult) => void;
|
|
400
613
|
}, deps?: TelegramDaemonDeps): Promise<EnsureTelegramDaemonDetailedResult>;
|
|
401
614
|
/**
|
|
402
615
|
* Legacy compatibility mapping for callers that only distinguish ownership from
|
|
@@ -449,7 +662,10 @@ export type TelegramPollResult = {
|
|
|
449
662
|
export interface TelegramUpdatePollerOptions {
|
|
450
663
|
botApi: BotApi;
|
|
451
664
|
runtime: NotificationOperatorRuntime;
|
|
452
|
-
backoff:
|
|
665
|
+
backoff: {
|
|
666
|
+
next(): number;
|
|
667
|
+
reset(): void;
|
|
668
|
+
};
|
|
453
669
|
processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
|
|
454
670
|
health?: TelegramPollHealth;
|
|
455
671
|
}
|
|
@@ -469,6 +685,11 @@ export declare class TelegramEventDispatchState {
|
|
|
469
685
|
readonly busy: Set<string>;
|
|
470
686
|
readonly inboundReactions: Map<number, {
|
|
471
687
|
messageId: number;
|
|
688
|
+
socketLease?: {
|
|
689
|
+
session: SessionSocket;
|
|
690
|
+
token: number;
|
|
691
|
+
logicalSessionId: string;
|
|
692
|
+
};
|
|
472
693
|
}>;
|
|
473
694
|
readonly seenUpdateIds: Set<number>;
|
|
474
695
|
}
|
|
@@ -533,7 +754,7 @@ export interface TelegramDaemonOptions {
|
|
|
533
754
|
richDraft?: {
|
|
534
755
|
enabled: boolean;
|
|
535
756
|
};
|
|
536
|
-
/** Tool start/completion messages (
|
|
757
|
+
/** Tool start/completion messages (off by default; explicit opt-in only). */
|
|
537
758
|
toolActivity?: {
|
|
538
759
|
enabled: boolean;
|
|
539
760
|
};
|
|
@@ -551,11 +772,15 @@ interface SessionSocket {
|
|
|
551
772
|
sessionId: string;
|
|
552
773
|
/** Current logical session carried by valid threaded frames on this transport. */
|
|
553
774
|
logicalSessionId: string;
|
|
775
|
+
/** Endpoint metadata proved this logical id belongs to this discovery record. */
|
|
776
|
+
logicalSessionIdTrusted: boolean;
|
|
554
777
|
token: string;
|
|
555
778
|
endpointKey: string;
|
|
556
779
|
endpointDigest: string;
|
|
557
780
|
hostGeneration: number;
|
|
558
781
|
ws: WebSocket;
|
|
782
|
+
/** Timestamp (via opts.now) at which this socket began connecting. */
|
|
783
|
+
connectingSince: number;
|
|
559
784
|
pending: Map<string, {
|
|
560
785
|
sessionId: string;
|
|
561
786
|
actionId: string;
|
|
@@ -563,6 +788,8 @@ interface SessionSocket {
|
|
|
563
788
|
/** True once the server advertised the `client_ping_pong` capability. */
|
|
564
789
|
capable: boolean;
|
|
565
790
|
ephemeralCapable: boolean;
|
|
791
|
+
/** Tool activity contract advertised by the connected host. */
|
|
792
|
+
toolActivityCapability?: "v1" | "v2";
|
|
566
793
|
/** Timestamp (via opts.now) of the last received pong; seeds the TTL window. */
|
|
567
794
|
lastPongAt: number;
|
|
568
795
|
/** Nonce of the most recent in-flight ping, if any. */
|
|
@@ -574,6 +801,13 @@ interface SessionSocket {
|
|
|
574
801
|
/** Queues live frames until startup replay is applied. */
|
|
575
802
|
replayPending: boolean;
|
|
576
803
|
replayQueue: Record<string, unknown>[];
|
|
804
|
+
/** Trusted recovery may not route until its durable endpoint lease is committed. */
|
|
805
|
+
recoveryLease?: {
|
|
806
|
+
state: "pending" | "authorized" | "rejected";
|
|
807
|
+
logicalSessionId: string;
|
|
808
|
+
binding: TopicEndpointBinding;
|
|
809
|
+
token: number;
|
|
810
|
+
};
|
|
577
811
|
}
|
|
578
812
|
export declare class TelegramNotificationDaemon {
|
|
579
813
|
#private;
|
|
@@ -585,6 +819,9 @@ export declare class TelegramNotificationDaemon {
|
|
|
585
819
|
/** Endpoint-bound ownership for visible or dispatching tool bubbles. */
|
|
586
820
|
private readonly toolActivityOwners;
|
|
587
821
|
private readonly revokedToolEndpoints;
|
|
822
|
+
/** Exact settlement of each admitted legacy-v1 start; retained only while visible. */
|
|
823
|
+
private readonly legacyToolStarts;
|
|
824
|
+
private nextLegacyToolStartId;
|
|
588
825
|
private readonly unresolvedToolTerminalizations;
|
|
589
826
|
private toolTerminalizationChain;
|
|
590
827
|
private toolActivityPolicyEpoch;
|
|
@@ -598,28 +835,46 @@ export declare class TelegramNotificationDaemon {
|
|
|
598
835
|
private readonly pollConflictBackoff;
|
|
599
836
|
private readonly loopBackoff;
|
|
600
837
|
private running;
|
|
838
|
+
/** Once set, a concurrent startup await can never restore a running daemon. */
|
|
839
|
+
private stopRequested;
|
|
601
840
|
private readonly fsImpl;
|
|
602
841
|
private readonly botApi;
|
|
603
842
|
private readonly effects;
|
|
604
843
|
private readonly topics;
|
|
605
844
|
/** Serializes registry snapshots so an older atomic write cannot overwrite newer rename state. */
|
|
845
|
+
/** Legacy sockets have no durable token, so explicit teardown is their revocation fence. */
|
|
846
|
+
private readonly droppedSessions;
|
|
606
847
|
private topicsPersistQueue;
|
|
848
|
+
/** Serializes recovery compare/write/publish claims so competing endpoint migrations cannot durably diverge. */
|
|
849
|
+
private recoveryBindingClaimQueue;
|
|
850
|
+
/** Durable compensation fences retry under supervision until persistence succeeds. */
|
|
851
|
+
private readonly compensationFenceRetries;
|
|
607
852
|
/** Daemon edit attempts that can race an accepted user service message. */
|
|
608
853
|
private readonly daemonRenameAttempts;
|
|
609
854
|
private readonly selectedAckPending;
|
|
610
855
|
private readonly pool;
|
|
611
856
|
private readonly poller;
|
|
612
857
|
private readonly dispatchState;
|
|
858
|
+
/** Bot-wide flood-control window; inbound polling remains eligible during it. */
|
|
859
|
+
private botCooldownUntil;
|
|
860
|
+
private warnedBotCooldownUntil;
|
|
613
861
|
/** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
|
|
614
862
|
private readonly replyStore;
|
|
615
863
|
/** Per-session debounce + monotonic draft-id state for opt-in draft streaming. */
|
|
616
864
|
private readonly draftStream;
|
|
617
865
|
/** Identity-bearing sessions by repo/branch surface, used to avoid transient duplicate topics. */
|
|
618
866
|
private readonly topicOwnerByIdentity;
|
|
867
|
+
/** Ephemeral legacy topic owners retained across a same-socket config rekey. */
|
|
868
|
+
private readonly legacyTopicOwners;
|
|
869
|
+
/** Preserved initiator topics must not route through a rekeyed transport. */
|
|
870
|
+
private readonly preservedInitiatorTopics;
|
|
619
871
|
/** Non-identity frames held until identity creates the correct thread. */
|
|
620
872
|
private readonly pendingThreadedFrames;
|
|
621
|
-
/**
|
|
873
|
+
/** Durable endpoint leases for sessions that already sent an authorized session_closed. */
|
|
622
874
|
private readonly closedEndpointKeys;
|
|
875
|
+
/** Exactly one authorized transport may route each recovered logical session. */
|
|
876
|
+
private readonly logicalSessionOwners;
|
|
877
|
+
private nextSocketLeaseToken;
|
|
623
878
|
/** True once the daemon has nudged the user to enable Threaded Mode. */
|
|
624
879
|
private threadedFallbackNoticeSent;
|
|
625
880
|
/** Sessions whose identity header was already sent flat (Threaded Mode off). */
|
|
@@ -689,6 +944,9 @@ export declare class TelegramNotificationDaemon {
|
|
|
689
944
|
private refreshBotIdentity;
|
|
690
945
|
/** Map a lifecycle response/error to a user-facing message (G010 surfacing). */
|
|
691
946
|
private formatLifecycleResponse;
|
|
947
|
+
private callBotApi;
|
|
948
|
+
private readonly callBotApiClassified;
|
|
949
|
+
private botApiWithOutcomeCollector;
|
|
692
950
|
constructor(opts: TelegramDaemonOptions);
|
|
693
951
|
private createSessionRouter;
|
|
694
952
|
loadAliases(): Promise<void>;
|
|
@@ -698,6 +956,7 @@ export declare class TelegramNotificationDaemon {
|
|
|
698
956
|
private pruneSeenUpdateIds;
|
|
699
957
|
private rememberSeenUpdateId;
|
|
700
958
|
private reserveSeenUpdateId;
|
|
959
|
+
private releaseSeenUpdateId;
|
|
701
960
|
scanRoots(): Promise<void>;
|
|
702
961
|
connectSession(sessionId: string, url: string, token: string): void;
|
|
703
962
|
/**
|
|
@@ -734,9 +993,21 @@ export declare class TelegramNotificationDaemon {
|
|
|
734
993
|
private topicIdentityKey;
|
|
735
994
|
private topicIdentityBase;
|
|
736
995
|
private topicOwnerForIdentity;
|
|
737
|
-
private
|
|
996
|
+
private admitLegacyToolStart;
|
|
997
|
+
private legacyToolStartForTerminal;
|
|
998
|
+
private settleLegacyToolStart;
|
|
999
|
+
private cancelUnsentLegacyToolStart;
|
|
1000
|
+
private failLegacyToolStart;
|
|
1001
|
+
private settleRejectedLegacyToolSubmission;
|
|
1002
|
+
private cancelLegacyToolStartsForSession;
|
|
1003
|
+
private cleanLegacyToolStartsForCapabilityUpgrade;
|
|
1004
|
+
private cancelLegacyToolStartsForPolicyTransition;
|
|
738
1005
|
private toolActivityOwner;
|
|
1006
|
+
private renderThreadedFrame;
|
|
1007
|
+
private toolActivityFrameWithoutSummaries;
|
|
1008
|
+
private toolActivitySummariesAreCurrent;
|
|
739
1009
|
private toolActivityAuthorityIsCurrent;
|
|
1010
|
+
private toolActivityDeliveryIsCurrent;
|
|
740
1011
|
private submitThreadedFrame;
|
|
741
1012
|
private existingTopicForPrivateChat;
|
|
742
1013
|
private topicAuthorityLease;
|
|
@@ -759,7 +1030,9 @@ export declare class TelegramNotificationDaemon {
|
|
|
759
1030
|
private deleteTopic;
|
|
760
1031
|
private persistTopics;
|
|
761
1032
|
loadTopics(): Promise<void>;
|
|
762
|
-
/**
|
|
1033
|
+
/** Retry crash-interrupted topic deletes; only a definite Telegram result clears the durable fence. */
|
|
1034
|
+
private reconcilePendingTopicDeletes;
|
|
1035
|
+
/** Download one Telegram file with the Bot API's 20 MiB ceiling and one end-to-end deadline. */
|
|
763
1036
|
private downloadTelegramFile;
|
|
764
1037
|
/**
|
|
765
1038
|
* Per-session private temp directories (mode 0700) holding inbound non-image
|
|
@@ -781,6 +1054,7 @@ export declare class TelegramNotificationDaemon {
|
|
|
781
1054
|
* to append to the injected text.
|
|
782
1055
|
*/
|
|
783
1056
|
private resolveInboundAttachment;
|
|
1057
|
+
private resolveInboundAttachmentSerial;
|
|
784
1058
|
/**
|
|
785
1059
|
* Serialize all pool flushes. Every caller (`submitThreadedFrame`, the flat
|
|
786
1060
|
* fallback, the drain timer's `void this.flushPool()`, topic teardown) goes
|
|
@@ -73,6 +73,7 @@ export declare function buildActionMessage(action: {
|
|
|
73
73
|
id: string;
|
|
74
74
|
question?: string;
|
|
75
75
|
options?: string[];
|
|
76
|
+
recommendedIndex?: unknown;
|
|
76
77
|
controls?: readonly TelegramActionControl[];
|
|
77
78
|
summary?: string;
|
|
78
79
|
}): RenderedMessage;
|
|
@@ -81,6 +82,7 @@ export declare function buildActionMarkdown(action: {
|
|
|
81
82
|
kind: "ask" | "idle";
|
|
82
83
|
question?: string;
|
|
83
84
|
options?: string[];
|
|
85
|
+
recommendedIndex?: unknown;
|
|
84
86
|
summary?: string;
|
|
85
87
|
}): string;
|
|
86
88
|
/** Send Telegram HTML text chunks sequentially so long messages preserve order. */
|