@sayknow-cli/coding-agent 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -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
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-scoped durable store for kind-aware invocation reconciliation (#3032/#3035).
|
|
3
|
+
*
|
|
4
|
+
* Path is always a private sibling of the transcript, never under artifactsDir:
|
|
5
|
+
* <dirname(sessionFile)>/.sdk-reconciliation/<safeSessionId>.json
|
|
6
|
+
*
|
|
7
|
+
* Safe session ids only: /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/
|
|
8
|
+
* Atomic write: temp + fsync + rename + 0600. Corrupt → quarantine + empty.
|
|
9
|
+
* Non-terminal records settle to failed/process_restart on bootstrap (recon incomplete).
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from "node:fs/promises";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import type { PromptCorrelation, PromptReconciliationStatus } from "./prompt-reconciliation";
|
|
14
|
+
|
|
15
|
+
export const RECONCILIATION_STORE_VERSION = 1;
|
|
16
|
+
export const RECONCILIATION_SESSION_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
17
|
+
export const RECONCILIATION_DIR_NAME = ".sdk-reconciliation";
|
|
18
|
+
|
|
19
|
+
export type ReconciliationKind = "prompt" | "skill";
|
|
20
|
+
|
|
21
|
+
export interface DurableReconciliationRecord extends PromptCorrelation {
|
|
22
|
+
kind: ReconciliationKind;
|
|
23
|
+
clientRef?: string;
|
|
24
|
+
status: PromptReconciliationStatus;
|
|
25
|
+
error?: { code: string; message: string };
|
|
26
|
+
acceptedAt: number;
|
|
27
|
+
startedAt?: number;
|
|
28
|
+
terminalAt?: number;
|
|
29
|
+
/** Skill-only safe token; never skill args bodies. */
|
|
30
|
+
skillName?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ReconciliationStoreDocument {
|
|
34
|
+
version: typeof RECONCILIATION_STORE_VERSION;
|
|
35
|
+
sessionId: string;
|
|
36
|
+
records: DurableReconciliationRecord[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ReconciliationStoreFs {
|
|
40
|
+
mkdir(directory: string, options: { recursive: true; mode: number }): Promise<unknown>;
|
|
41
|
+
readFile(file: string, encoding: "utf8"): Promise<string>;
|
|
42
|
+
writeFile(file: string, data: string, options: { mode: number }): Promise<void>;
|
|
43
|
+
rename(from: string, to: string): Promise<void>;
|
|
44
|
+
unlink(file: string): Promise<void>;
|
|
45
|
+
open(
|
|
46
|
+
file: string,
|
|
47
|
+
flags: string,
|
|
48
|
+
): Promise<{
|
|
49
|
+
sync(): Promise<void>;
|
|
50
|
+
close(): Promise<void>;
|
|
51
|
+
writeFile(data: string, encoding: "utf8"): Promise<void>;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const nodeFs: ReconciliationStoreFs = {
|
|
56
|
+
mkdir: fs.mkdir,
|
|
57
|
+
readFile: fs.readFile,
|
|
58
|
+
writeFile: fs.writeFile,
|
|
59
|
+
rename: fs.rename,
|
|
60
|
+
unlink: fs.unlink,
|
|
61
|
+
open: fs.open as ReconciliationStoreFs["open"],
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export function isSafeReconciliationSessionId(sessionId: string): boolean {
|
|
65
|
+
return RECONCILIATION_SESSION_ID_PATTERN.test(sessionId);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Derive private store path; throws if sessionId is unsafe (path escape). */
|
|
69
|
+
export function reconciliationStorePath(sessionFile: string, sessionId: string): string {
|
|
70
|
+
if (!isSafeReconciliationSessionId(sessionId))
|
|
71
|
+
throw Object.assign(new Error("Unsafe session id for reconciliation store path."), {
|
|
72
|
+
code: "invalid_input",
|
|
73
|
+
});
|
|
74
|
+
return path.join(path.dirname(sessionFile), RECONCILIATION_DIR_NAME, `${sessionId}.json`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
78
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function parseDocument(raw: string, expectedSessionId: string): ReconciliationStoreDocument {
|
|
82
|
+
const value = JSON.parse(raw) as unknown;
|
|
83
|
+
if (!isRecord(value) || value.version !== RECONCILIATION_STORE_VERSION)
|
|
84
|
+
throw new Error("invalid reconciliation store version");
|
|
85
|
+
if (value.sessionId !== expectedSessionId) throw new Error("session id mismatch");
|
|
86
|
+
if (!Array.isArray(value.records)) throw new Error("invalid records");
|
|
87
|
+
return value as unknown as ReconciliationStoreDocument;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Settle non-terminal durable records after process death: failed/process_restart.
|
|
92
|
+
* Meaning: reconciliation incomplete — not proof of agent failure.
|
|
93
|
+
*/
|
|
94
|
+
export function settleProcessRestart(
|
|
95
|
+
records: DurableReconciliationRecord[],
|
|
96
|
+
now: number,
|
|
97
|
+
): DurableReconciliationRecord[] {
|
|
98
|
+
return records.map(record => {
|
|
99
|
+
if (record.terminalAt !== undefined) return record;
|
|
100
|
+
return {
|
|
101
|
+
...record,
|
|
102
|
+
status: "failed",
|
|
103
|
+
terminalAt: now,
|
|
104
|
+
error: { code: "process_restart", message: "Reconciliation incomplete after process restart." },
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface ReconciliationStore {
|
|
110
|
+
readonly path: string | null;
|
|
111
|
+
readonly sessionId: string;
|
|
112
|
+
/** Serialize mutations; reload not required for single-process host (in-memory + write). */
|
|
113
|
+
transact(mutator: (records: DurableReconciliationRecord[]) => DurableReconciliationRecord[]): Promise<void>;
|
|
114
|
+
load(): Promise<DurableReconciliationRecord[]>;
|
|
115
|
+
/** Snapshot currently held in memory after last load/transact. */
|
|
116
|
+
snapshot(): DurableReconciliationRecord[];
|
|
117
|
+
delete(): Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function createReconciliationStore(options: {
|
|
121
|
+
sessionFile: string | null | undefined;
|
|
122
|
+
sessionId: string;
|
|
123
|
+
fs?: ReconciliationStoreFs;
|
|
124
|
+
now?: () => number;
|
|
125
|
+
}): ReconciliationStore {
|
|
126
|
+
const fileFs = options.fs ?? nodeFs;
|
|
127
|
+
const now = options.now ?? Date.now;
|
|
128
|
+
const sessionId = options.sessionId;
|
|
129
|
+
const filePath =
|
|
130
|
+
options.sessionFile && isSafeReconciliationSessionId(sessionId)
|
|
131
|
+
? reconciliationStorePath(options.sessionFile, sessionId)
|
|
132
|
+
: null;
|
|
133
|
+
|
|
134
|
+
let memory: DurableReconciliationRecord[] = [];
|
|
135
|
+
let chain: Promise<void> = Promise.resolve();
|
|
136
|
+
|
|
137
|
+
const writeAtomic = async (document: ReconciliationStoreDocument): Promise<void> => {
|
|
138
|
+
if (!filePath) return;
|
|
139
|
+
const directory = path.dirname(filePath);
|
|
140
|
+
await fileFs.mkdir(directory, { recursive: true, mode: 0o700 });
|
|
141
|
+
const temporary = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
142
|
+
try {
|
|
143
|
+
await fileFs.writeFile(temporary, `${JSON.stringify(document)}\n`, { mode: 0o600 });
|
|
144
|
+
try {
|
|
145
|
+
const handle = await fileFs.open(temporary, "r+");
|
|
146
|
+
try {
|
|
147
|
+
await handle.sync();
|
|
148
|
+
} finally {
|
|
149
|
+
await handle.close();
|
|
150
|
+
}
|
|
151
|
+
} catch {
|
|
152
|
+
// fsync optional on some fs seams
|
|
153
|
+
}
|
|
154
|
+
await fileFs.rename(temporary, filePath);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
await fileFs.unlink(temporary).catch(() => {});
|
|
157
|
+
throw Object.assign(error instanceof Error ? error : new Error("reconciliation persist failed"), {
|
|
158
|
+
code: "reconciliation_persist_failed",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const load = async (): Promise<DurableReconciliationRecord[]> => {
|
|
164
|
+
if (!filePath) {
|
|
165
|
+
memory = [];
|
|
166
|
+
return memory;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const raw = await fileFs.readFile(filePath, "utf8");
|
|
170
|
+
const document = parseDocument(raw, sessionId);
|
|
171
|
+
memory = settleProcessRestart(document.records, now());
|
|
172
|
+
// Persist settled state so restart is sticky.
|
|
173
|
+
if (memory.some((r, i) => r !== document.records[i]))
|
|
174
|
+
await writeAtomic({ version: RECONCILIATION_STORE_VERSION, sessionId, records: memory });
|
|
175
|
+
return memory;
|
|
176
|
+
} catch (error) {
|
|
177
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") {
|
|
178
|
+
memory = [];
|
|
179
|
+
return memory;
|
|
180
|
+
}
|
|
181
|
+
// Corrupt → quarantine
|
|
182
|
+
try {
|
|
183
|
+
await fileFs.rename(filePath, `${filePath}.corrupt.${now()}`);
|
|
184
|
+
} catch {
|
|
185
|
+
// ignore
|
|
186
|
+
}
|
|
187
|
+
memory = [];
|
|
188
|
+
return memory;
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const transact = async (
|
|
193
|
+
mutator: (records: DurableReconciliationRecord[]) => DurableReconciliationRecord[],
|
|
194
|
+
): Promise<void> => {
|
|
195
|
+
const run = async () => {
|
|
196
|
+
const next = mutator(memory.map(r => ({ ...r })));
|
|
197
|
+
memory = next;
|
|
198
|
+
await writeAtomic({ version: RECONCILIATION_STORE_VERSION, sessionId, records: memory });
|
|
199
|
+
};
|
|
200
|
+
const pending = chain.then(run, run);
|
|
201
|
+
chain = pending.then(
|
|
202
|
+
() => undefined,
|
|
203
|
+
() => undefined,
|
|
204
|
+
);
|
|
205
|
+
await pending;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const deleteStore = async (): Promise<void> => {
|
|
209
|
+
memory = [];
|
|
210
|
+
if (!filePath) return;
|
|
211
|
+
await fileFs.unlink(filePath).catch(error => {
|
|
212
|
+
if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
|
|
213
|
+
});
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
path: filePath,
|
|
218
|
+
sessionId,
|
|
219
|
+
transact,
|
|
220
|
+
load,
|
|
221
|
+
snapshot: () => memory.map(r => ({ ...r })),
|
|
222
|
+
delete: deleteStore,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
@@ -21,7 +21,7 @@ import * as fs from "node:fs";
|
|
|
21
21
|
import * as path from "node:path";
|
|
22
22
|
import { getAgentDir } from "@sayknow-cli/utils";
|
|
23
23
|
import { tokenFingerprint } from "./config";
|
|
24
|
-
import {
|
|
24
|
+
import { isFreshLiveOwner, readOwnerFreshnessSnapshot } from "./telegram-daemon";
|
|
25
25
|
import { runTelegramReferenceClient } from "./telegram-reference";
|
|
26
26
|
|
|
27
27
|
interface CliArgs {
|
|
@@ -134,17 +134,9 @@ function pidAlive(pid: number): boolean {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
function
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return JSON.parse(raw) as DaemonState;
|
|
141
|
-
} catch {
|
|
142
|
-
return undefined;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function activeDaemonOwnsToken(input: { botToken: string; chatId: string }): boolean {
|
|
147
|
-
const state = readDaemonState();
|
|
137
|
+
async function activeDaemonOwnsToken(input: { botToken: string; chatId: string }): Promise<boolean> {
|
|
138
|
+
const snapshot = await readOwnerFreshnessSnapshot({ settings: { getAgentDir } as never });
|
|
139
|
+
const state = snapshot.state;
|
|
148
140
|
if (!state) return false;
|
|
149
141
|
return isFreshLiveOwner({
|
|
150
142
|
state,
|
|
@@ -152,6 +144,7 @@ function activeDaemonOwnsToken(input: { botToken: string; chatId: string }): boo
|
|
|
152
144
|
tokenFingerprint: tokenFingerprint(input.botToken),
|
|
153
145
|
chatId: input.chatId,
|
|
154
146
|
pidAlive,
|
|
147
|
+
effectiveHeartbeatAt: snapshot.effectiveHeartbeatAt,
|
|
155
148
|
});
|
|
156
149
|
}
|
|
157
150
|
|
|
@@ -176,7 +169,7 @@ async function main(): Promise<void> {
|
|
|
176
169
|
}
|
|
177
170
|
|
|
178
171
|
const chatId = args.chatId ?? process.env.SKC_TG_CHAT_ID ?? (await resolveChatId(botToken, apiBase));
|
|
179
|
-
if (!args.force && activeDaemonOwnsToken({ botToken, chatId })) {
|
|
172
|
+
if (!args.force && (await activeDaemonOwnsToken({ botToken, chatId }))) {
|
|
180
173
|
process.stderr.write(
|
|
181
174
|
"an active skc notifications daemon already owns this bot token; running a second poller will cause Telegram 409 conflicts. Re-run with --force to override.\n",
|
|
182
175
|
);
|
|
@@ -14,6 +14,7 @@ import { daemonPaths, HEARTBEAT_TTL_MS } from "./daemon-paths";
|
|
|
14
14
|
import {
|
|
15
15
|
type DaemonState,
|
|
16
16
|
readDaemonState,
|
|
17
|
+
readOwnerFreshnessSnapshot,
|
|
17
18
|
type TelegramDaemonOptions,
|
|
18
19
|
TelegramNotificationDaemon,
|
|
19
20
|
} from "./telegram-daemon";
|
|
@@ -254,15 +255,19 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
|
|
|
254
255
|
if (!watchdogActive || watchdogTickInFlight || stopRequested) return;
|
|
255
256
|
watchdogTickInFlight = true;
|
|
256
257
|
try {
|
|
257
|
-
const
|
|
258
|
+
const snapshot = deps.readDaemonState
|
|
259
|
+
? { state: await readState(settings as Settings), effectiveHeartbeatAt: undefined }
|
|
260
|
+
: await readOwnerFreshnessSnapshot({ settings: settings as Settings });
|
|
261
|
+
const state = snapshot.state;
|
|
262
|
+
const heartbeatAt = snapshot.effectiveHeartbeatAt ?? state?.heartbeatAt;
|
|
258
263
|
if (!watchdogActive || !state) return;
|
|
259
264
|
if (state.ownerId !== ownerId) {
|
|
260
265
|
stopRequested = true;
|
|
261
266
|
daemon.requestStop("stop");
|
|
262
267
|
return;
|
|
263
268
|
}
|
|
264
|
-
if (lastHeartbeatAt === undefined ||
|
|
265
|
-
lastHeartbeatAt =
|
|
269
|
+
if (lastHeartbeatAt === undefined || heartbeatAt !== lastHeartbeatAt) {
|
|
270
|
+
lastHeartbeatAt = heartbeatAt;
|
|
266
271
|
stalledSince = now();
|
|
267
272
|
return;
|
|
268
273
|
}
|
|
@@ -7,12 +7,9 @@
|
|
|
7
7
|
export const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* freshly-upgraded host must still recognize an older, still-live daemon that
|
|
14
|
-
* predates capability-gated frame enforcement and trigger a reload. Bump this
|
|
15
|
-
* on every daemon-behavior change independent of the wire version.
|
|
10
|
+
* Guarded behavior-inventory version for the current daemon build. Bump this
|
|
11
|
+
* on every guarded daemon-behavior change independent of the wire version; it
|
|
12
|
+
* does not force a live daemon reload by itself.
|
|
16
13
|
* The current development baseline already includes #2299's generation 4,
|
|
17
14
|
* incarnation fencing in generation 5, owner-lock authority in generation 6,
|
|
18
15
|
* identity-atomic transition markers in generation 7, stable signaling plus
|
|
@@ -21,7 +18,35 @@ export const NOTIFICATION_PROTOCOL_VERSION = 3;
|
|
|
21
18
|
* confirmed-dead owner's lock in generation 10, legacy stopped-tombstone
|
|
22
19
|
* reclamation in generation 11, force-escalated SIGKILL of an unresponsive
|
|
23
20
|
* older-generation owner during automatic generation-upgrade reload in
|
|
24
|
-
* generation 12,
|
|
25
|
-
* incarnation recheck, replacing the darwin no-op) in generation 13
|
|
21
|
+
* generation 12, restored macOS daemon signaling (kill(2) with a start-time
|
|
22
|
+
* incarnation recheck, replacing the darwin no-op) in generation 13, retained
|
|
23
|
+
* legacy stopped-lock reclamation in generation 14, Windows expected-identity
|
|
24
|
+
* ACL verification and repair in generation 15, identity-fenced stale endpoint
|
|
25
|
+
* startup recovery in generation 16, Telegram topic recovery authority fencing
|
|
26
|
+
* in generation 17, fail-closed blank-token validation plus lifecycle-startup
|
|
27
|
+
* stop fencing in generation 18, recommended ask metadata rendering in
|
|
28
|
+
* generation 19, authoritative terminal session-close delivery and cleanup
|
|
29
|
+
* fencing, attested generation-bearing pre-incarnation owner handoff in
|
|
30
|
+
* generation 20, guarded modern generation-absent predecessor signaling in
|
|
31
|
+
* generation 21, dead Windows v0.10 owner replacement in generation 22, and
|
|
32
|
+
* retained native cleanup authority revalidation in generation 23, and typed
|
|
33
|
+
* retained exact-unlink cleanup authority acceptance (concrete detached
|
|
34
|
+
* quarantine plus proven canonical absence) in generation 24.
|
|
35
|
+
* Generation 25 adds startup dead-root prune + leak-artifact self-heal
|
|
36
|
+
* on TelegramNotificationDaemon.run (#2958). Generation 26 adds bounded reload
|
|
37
|
+
* cooldown and lazy Telegram topic lifecycle safeguards (#2956, #2960, #2984).
|
|
38
|
+
* Generation 27 refreshes retained native path and process authority semantics.
|
|
39
|
+
* Generation 28 rejects special files before retained native authority opens.
|
|
40
|
+
* Generation 29 adds serving-epoch compatibility, sidecar heartbeat, root GC,
|
|
41
|
+
* and Bot API cooldown structural fixes (#2956, #2960, #3048).
|
|
42
|
+
* Generation 30 adds opt-in tool activity delivery, closed lifecycle phases,
|
|
43
|
+
* and capability-versioned mixed-host compatibility.
|
|
26
44
|
*/
|
|
27
|
-
export const DAEMON_GENERATION =
|
|
45
|
+
export const DAEMON_GENERATION = 30;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Serving-compatibility boundary for daemon lifecycle requests. Epoch 1 covers
|
|
49
|
+
* all builds published before this field existed; epoch 2 covered generation 29;
|
|
50
|
+
* bump this to force serving convergence and reload of compatible live predecessors.
|
|
51
|
+
*/
|
|
52
|
+
export const SERVING_EPOCH = 3;
|