@sayknow-cli/coding-agent 0.4.6 → 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 +112 -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 +27 -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
|
@@ -483,20 +483,23 @@ export function assertDeepInterviewEnvelopeInputLimits(envelope: Record<string,
|
|
|
483
483
|
typeof envelope.state === "object" && envelope.state !== null && !Array.isArray(envelope.state)
|
|
484
484
|
? (envelope.state as Record<string, unknown>)
|
|
485
485
|
: {};
|
|
486
|
+
// `null` is legal everywhere prose is optional: the skill template seeds
|
|
487
|
+
// `initial_context_summary: null` and the merge treats `null` as a deletion
|
|
488
|
+
// marker, so only present non-null values are bounded.
|
|
486
489
|
for (const field of ["initial_idea", "initial_context", "initial_context_summary"] as const) {
|
|
487
490
|
const nestedValue = state[field];
|
|
488
|
-
if (nestedValue !== undefined)
|
|
491
|
+
if (nestedValue !== undefined && nestedValue !== null)
|
|
489
492
|
assertDeepInterviewInputWithinLimit(nestedValue as string, MAX_INITIAL_CONTEXT_LENGTH, `state.${field}`);
|
|
490
493
|
const topLevelValue = envelope[field];
|
|
491
|
-
if (topLevelValue !== undefined)
|
|
494
|
+
if (topLevelValue !== undefined && topLevelValue !== null)
|
|
492
495
|
assertDeepInterviewInputWithinLimit(topLevelValue as string, MAX_INITIAL_CONTEXT_LENGTH, field);
|
|
493
496
|
}
|
|
494
497
|
for (const field of ["user_response", "answer"] as const) {
|
|
495
498
|
const nestedValue = state[field];
|
|
496
|
-
if (nestedValue !== undefined)
|
|
499
|
+
if (nestedValue !== undefined && nestedValue !== null)
|
|
497
500
|
assertDeepInterviewInputWithinLimit(nestedValue as string, MAX_USER_RESPONSE_LENGTH, `state.${field}`);
|
|
498
501
|
const topLevelValue = envelope[field];
|
|
499
|
-
if (topLevelValue !== undefined)
|
|
502
|
+
if (topLevelValue !== undefined && topLevelValue !== null)
|
|
500
503
|
assertDeepInterviewInputWithinLimit(topLevelValue as string, MAX_USER_RESPONSE_LENGTH, field);
|
|
501
504
|
}
|
|
502
505
|
if (!Array.isArray(state.rounds)) return;
|
|
@@ -507,7 +510,7 @@ export function assertDeepInterviewEnvelopeInputLimits(envelope: Record<string,
|
|
|
507
510
|
const value = record[field];
|
|
508
511
|
// A structured scorer may use an unrelated object-valued `answer`; only prose
|
|
509
512
|
// values in a legacy answer slot are user input subject to this cap.
|
|
510
|
-
if (value === undefined || (field === "answer" && typeof value !== "string")) continue;
|
|
513
|
+
if (value === undefined || value === null || (field === "answer" && typeof value !== "string")) continue;
|
|
511
514
|
assertDeepInterviewInputWithinLimit(
|
|
512
515
|
value as string,
|
|
513
516
|
MAX_USER_RESPONSE_LENGTH,
|
|
@@ -12,6 +12,7 @@ const STORE_HEADINGS: Record<GcStore, string> = {
|
|
|
12
12
|
file_locks: "Config file-locks",
|
|
13
13
|
tmux_sessions: "Tmux sessions",
|
|
14
14
|
registry_entries: "Harness-root registry entries",
|
|
15
|
+
local_roots: "Session local roots",
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
function actionLabel(record: GcRecord): string {
|
|
@@ -19,7 +19,13 @@ import { UnsupportedStateVersionError } from "../sdk/broker/state-version";
|
|
|
19
19
|
|
|
20
20
|
import { buildGcReportText } from "./gc-render";
|
|
21
21
|
|
|
22
|
-
export type GcStore =
|
|
22
|
+
export type GcStore =
|
|
23
|
+
| "harness_leases"
|
|
24
|
+
| "team_workers"
|
|
25
|
+
| "file_locks"
|
|
26
|
+
| "tmux_sessions"
|
|
27
|
+
| "registry_entries"
|
|
28
|
+
| "local_roots";
|
|
23
29
|
|
|
24
30
|
export const GC_STORES: readonly GcStore[] = [
|
|
25
31
|
"harness_leases",
|
|
@@ -27,6 +33,7 @@ export const GC_STORES: readonly GcStore[] = [
|
|
|
27
33
|
"file_locks",
|
|
28
34
|
"tmux_sessions",
|
|
29
35
|
"registry_entries",
|
|
36
|
+
"local_roots",
|
|
30
37
|
] as const;
|
|
31
38
|
|
|
32
39
|
/** Why a probed pid is kept instead of treated as dead. */
|
|
@@ -452,11 +459,13 @@ export async function defaultGcAdapters(): Promise<GcStoreAdapter[]> {
|
|
|
452
459
|
{ fileLocksGcAdapter },
|
|
453
460
|
{ teamWorkersGcAdapter },
|
|
454
461
|
{ tmuxSessionsGcAdapter },
|
|
462
|
+
{ localRootsGcAdapter },
|
|
455
463
|
] = await Promise.all([
|
|
456
464
|
import("../harness-control-plane/gc-adapter"),
|
|
457
465
|
import("../config/file-lock-gc"),
|
|
458
466
|
import("./team-gc"),
|
|
459
467
|
import("./tmux-gc"),
|
|
468
|
+
import("../internal-urls/local-root-gc"),
|
|
460
469
|
]);
|
|
461
470
|
return [
|
|
462
471
|
harnessLeasesGcAdapter,
|
|
@@ -464,5 +473,6 @@ export async function defaultGcAdapters(): Promise<GcStoreAdapter[]> {
|
|
|
464
473
|
fileLocksGcAdapter,
|
|
465
474
|
tmuxSessionsGcAdapter,
|
|
466
475
|
registryEntriesGcAdapter,
|
|
476
|
+
localRootsGcAdapter,
|
|
467
477
|
];
|
|
468
478
|
}
|
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared helpers for reading Linux `/proc/<pid>/stat` process
|
|
2
|
+
* Shared helpers for reading Linux `/proc/<pid>/stat` process identity fields.
|
|
3
3
|
*
|
|
4
4
|
* The `comm` field (field 2, wrapped in parentheses) may itself contain spaces
|
|
5
5
|
* and parentheses, so the only robust anchor is the *last* `)` in the stat
|
|
6
6
|
* string. Field 22 (the process start time in clock ticks since boot) is the
|
|
7
|
-
* 20th whitespace-separated token after that closing paren (index 19).
|
|
8
|
-
*
|
|
9
|
-
* Every caller previously parsed this format independently, with subtly
|
|
10
|
-
* different failure handling. This module fails closed: any malformed input
|
|
11
|
-
* (missing `)`, non-numeric field 22, unreadable `/proc` file, non-Linux
|
|
12
|
-
* platform) yields `null` rather than an inconsistent sentinel.
|
|
7
|
+
* 20th whitespace-separated token after that closing paren (index 19). Field 7
|
|
8
|
+
* (`tty_nr`) is the 5th token after the closing paren (index 4).
|
|
13
9
|
*/
|
|
14
10
|
|
|
15
11
|
import * as nodeFsSync from "node:fs";
|
|
16
12
|
import * as nodeFs from "node:fs/promises";
|
|
17
13
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export
|
|
14
|
+
export interface LinuxProcStatIdentity {
|
|
15
|
+
startTime: string;
|
|
16
|
+
ttyDevice: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type LinuxProcPidProbeResult =
|
|
20
|
+
| ({ kind: "live" } & LinuxProcStatIdentity)
|
|
21
|
+
| { kind: "absent" }
|
|
22
|
+
| {
|
|
23
|
+
kind: "unverifiable";
|
|
24
|
+
reason: "unsupported_platform" | "invalid_pid" | "permission_denied" | "read_error" | "malformed_stat";
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function parseLinuxProcIdentity(stat: string | null | undefined): LinuxProcStatIdentity | null {
|
|
24
28
|
if (!stat || stat.includes("\0") || stat.includes("\r")) return null;
|
|
25
29
|
const record = stat.endsWith("\n") ? stat.slice(0, -1) : stat;
|
|
26
30
|
if (!record || record.includes("\n")) return null;
|
|
@@ -32,40 +36,70 @@ export function parseLinuxProcStartTime(stat: string | null | undefined): string
|
|
|
32
36
|
const suffix = record.slice(close + 1);
|
|
33
37
|
if (!/^[ \t]+/.test(suffix)) return null;
|
|
34
38
|
const fields = suffix.trim().split(/[ \t]+/);
|
|
35
|
-
if (fields.length < 20 || !/^[
|
|
36
|
-
|
|
39
|
+
if (fields.length < 20 || !/^[A-Za-z]$/.test(fields[0])) return null;
|
|
40
|
+
const ttyDevice = fields[4];
|
|
37
41
|
const startTime = fields[19];
|
|
38
|
-
|
|
42
|
+
if (!ttyDevice || !/^-?\d+$/.test(ttyDevice) || !/^\d+$/.test(startTime)) return null;
|
|
43
|
+
return { startTime, ttyDevice };
|
|
39
44
|
}
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
function classifyProcReadError(error: unknown): Extract<LinuxProcPidProbeResult, { kind: "absent" | "unverifiable" }> {
|
|
47
|
+
const code = (error as NodeJS.ErrnoException | undefined)?.code;
|
|
48
|
+
if (code === "ENOENT" || code === "ESRCH") return { kind: "absent" };
|
|
49
|
+
if (code === "EACCES" || code === "EPERM") return { kind: "unverifiable", reason: "permission_denied" };
|
|
50
|
+
return { kind: "unverifiable", reason: "read_error" };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Parse field 22 (start time) from a `/proc/<pid>/stat` record. */
|
|
54
|
+
export function parseLinuxProcStartTime(stat: string | null | undefined): string | null {
|
|
55
|
+
return parseLinuxProcIdentity(stat)?.startTime ?? null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Parse field 7 (`tty_nr`) from a `/proc/<pid>/stat` record. */
|
|
59
|
+
export function parseLinuxProcTtyDevice(stat: string | null | undefined): string | null {
|
|
60
|
+
return parseLinuxProcIdentity(stat)?.ttyDevice ?? null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function probeLinuxProcPidSync(pid: number): LinuxProcPidProbeResult {
|
|
64
|
+
if (!Number.isSafeInteger(pid) || pid <= 0) return { kind: "unverifiable", reason: "invalid_pid" };
|
|
65
|
+
if (process.platform !== "linux") return { kind: "unverifiable", reason: "unsupported_platform" };
|
|
48
66
|
let stat: string;
|
|
49
67
|
try {
|
|
50
68
|
stat = nodeFsSync.readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
51
|
-
} catch {
|
|
52
|
-
return
|
|
69
|
+
} catch (error) {
|
|
70
|
+
return classifyProcReadError(error);
|
|
53
71
|
}
|
|
54
|
-
|
|
72
|
+
const identity = parseLinuxProcIdentity(stat);
|
|
73
|
+
return identity ? { kind: "live", ...identity } : { kind: "unverifiable", reason: "malformed_stat" };
|
|
55
74
|
}
|
|
56
75
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
*/
|
|
61
|
-
export async function readLinuxProcStartTime(pid: number): Promise<string | null> {
|
|
62
|
-
if (process.platform !== "linux") return null;
|
|
63
|
-
if (!Number.isSafeInteger(pid) || pid <= 0) return null;
|
|
76
|
+
export async function probeLinuxProcPid(pid: number): Promise<LinuxProcPidProbeResult> {
|
|
77
|
+
if (!Number.isSafeInteger(pid) || pid <= 0) return { kind: "unverifiable", reason: "invalid_pid" };
|
|
78
|
+
if (process.platform !== "linux") return { kind: "unverifiable", reason: "unsupported_platform" };
|
|
64
79
|
let stat: string;
|
|
65
80
|
try {
|
|
66
81
|
stat = await nodeFs.readFile(`/proc/${pid}/stat`, "utf8");
|
|
67
|
-
} catch {
|
|
68
|
-
return
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return classifyProcReadError(error);
|
|
69
84
|
}
|
|
70
|
-
|
|
85
|
+
const identity = parseLinuxProcIdentity(stat);
|
|
86
|
+
return identity ? { kind: "live", ...identity } : { kind: "unverifiable", reason: "malformed_stat" };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Read `/proc/<pid>/stat` synchronously and return the parsed start time.
|
|
91
|
+
* Returns `null` when the probe is absent or unverifiable.
|
|
92
|
+
*/
|
|
93
|
+
export function readLinuxProcStartTimeSync(pid: number): string | null {
|
|
94
|
+
const probe = probeLinuxProcPidSync(pid);
|
|
95
|
+
return probe.kind === "live" ? probe.startTime : null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Read `/proc/<pid>/stat` asynchronously and return the parsed start time.
|
|
100
|
+
* Returns `null` when the probe is absent or unverifiable.
|
|
101
|
+
*/
|
|
102
|
+
export async function readLinuxProcStartTime(pid: number): Promise<string | null> {
|
|
103
|
+
const probe = await probeLinuxProcPid(pid);
|
|
104
|
+
return probe.kind === "live" ? probe.startTime : null;
|
|
71
105
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as crypto from "node:crypto";
|
|
2
|
+
import * as fsSync from "node:fs";
|
|
2
3
|
import * as fs from "node:fs/promises";
|
|
3
4
|
import * as path from "node:path";
|
|
5
|
+
import { Process } from "@sayknow-cli/natives";
|
|
4
6
|
import { readLinuxProcStartTime } from "./linux-proc";
|
|
5
7
|
import { assertSafePathComponent } from "./session-layout";
|
|
6
|
-
import { lifecyclePaths } from "./tmux-owner-isolation";
|
|
8
|
+
import { lifecyclePaths, type OwnerIntent, observeOwnerTerminal } from "./tmux-owner-isolation";
|
|
7
9
|
|
|
8
10
|
export const MANAGED_OWNER_SUPERVISOR_ARG = "--internal-managed-owner-supervisor";
|
|
9
11
|
export const MANAGED_OWNER_CHILD_TOKEN_ENV = "SKC_MANAGED_OWNER_CHILD_TOKEN";
|
|
@@ -14,6 +16,15 @@ export const MANAGED_OWNER_STATE_DIR_ENV = "SKC_TMUX_OWNER_STATE_DIR";
|
|
|
14
16
|
export const MANAGED_OWNER_RUN_ID_ENV = "SKC_MANAGED_OWNER_RUN_ID";
|
|
15
17
|
export const MANAGED_OWNER_INCARNATION_ENV = "SKC_MANAGED_OWNER_INCARNATION";
|
|
16
18
|
|
|
19
|
+
let bootstrapSigtermPending = false;
|
|
20
|
+
const captureBootstrapSigterm = () => {
|
|
21
|
+
bootstrapSigtermPending = true;
|
|
22
|
+
};
|
|
23
|
+
if (process.argv.includes(MANAGED_OWNER_SUPERVISOR_ARG)) {
|
|
24
|
+
process.removeAllListeners("SIGTERM");
|
|
25
|
+
process.on("SIGTERM", captureBootstrapSigterm);
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
export interface ManagedOwnerBinding {
|
|
18
29
|
schema_version: 2;
|
|
19
30
|
generation: string;
|
|
@@ -52,7 +63,14 @@ function requiredEnvironment(name: string): string {
|
|
|
52
63
|
return value;
|
|
53
64
|
}
|
|
54
65
|
|
|
55
|
-
function lifecycleRoot(): {
|
|
66
|
+
function lifecycleRoot(): {
|
|
67
|
+
root: string;
|
|
68
|
+
stateDir: string;
|
|
69
|
+
generation: string;
|
|
70
|
+
sessionId: string;
|
|
71
|
+
runId: string;
|
|
72
|
+
incarnation: string;
|
|
73
|
+
} {
|
|
56
74
|
const stateDir = requiredEnvironment(MANAGED_OWNER_STATE_DIR_ENV);
|
|
57
75
|
const sessionId = requiredEnvironment(MANAGED_OWNER_SESSION_ID_ENV);
|
|
58
76
|
const generation = requiredEnvironment(MANAGED_OWNER_GENERATION_ENV);
|
|
@@ -68,7 +86,7 @@ function lifecycleRoot(): { root: string; generation: string; sessionId: string;
|
|
|
68
86
|
if (!path.isAbsolute(stateDir)) throw new Error("managed_owner_lifecycle_path_unsafe");
|
|
69
87
|
const root = lifecyclePaths(stateDir, sessionId, generation).root;
|
|
70
88
|
if (!root.startsWith(`${path.resolve(stateDir)}${path.sep}`)) throw new Error("managed_owner_lifecycle_path_unsafe");
|
|
71
|
-
return { root, generation, sessionId, runId, incarnation };
|
|
89
|
+
return { root, stateDir, generation, sessionId, runId, incarnation };
|
|
72
90
|
}
|
|
73
91
|
|
|
74
92
|
function commandDigest(command: readonly string[]): string {
|
|
@@ -106,8 +124,14 @@ export function isManagedOwnerSupervisorArgv(args: readonly string[]): boolean {
|
|
|
106
124
|
|
|
107
125
|
/** Runs one exact child and publishes authority only for a directly observed Linux signal 6. */
|
|
108
126
|
export async function runManagedOwnerSupervisor(): Promise<void> {
|
|
109
|
-
const { root, generation, sessionId, runId, incarnation } = lifecycleRoot();
|
|
127
|
+
const { root, stateDir, generation, sessionId, runId, incarnation } = lifecycleRoot();
|
|
110
128
|
const command = childCommand();
|
|
129
|
+
let sigtermPending = bootstrapSigtermPending;
|
|
130
|
+
const captureEarlySigterm = () => {
|
|
131
|
+
sigtermPending = true;
|
|
132
|
+
};
|
|
133
|
+
process.removeAllListeners("SIGTERM");
|
|
134
|
+
process.on("SIGTERM", captureEarlySigterm);
|
|
111
135
|
const supervisorStartTime = await readLinuxProcStartTime(process.pid);
|
|
112
136
|
if (!supervisorStartTime) throw new Error("managed_owner_supervisor_start_time_unavailable");
|
|
113
137
|
await fs.mkdir(root, { recursive: true, mode: 0o700 });
|
|
@@ -135,7 +159,62 @@ export async function runManagedOwnerSupervisor(): Promise<void> {
|
|
|
135
159
|
});
|
|
136
160
|
const childStartTime = await readLinuxProcStartTime(child.pid);
|
|
137
161
|
if (!childStartTime) throw new Error("managed_owner_child_start_time_unavailable");
|
|
162
|
+
const childProcess = Process.fromPid(child.pid);
|
|
163
|
+
if (!childProcess) throw new Error("managed_owner_child_reference_unavailable");
|
|
164
|
+
if (process.platform === "linux" && childProcess.incarnation !== `linux:${childStartTime}`)
|
|
165
|
+
throw new Error("managed_owner_child_incarnation_mismatch");
|
|
166
|
+
let childExited = false;
|
|
167
|
+
let sigtermRelayed = false;
|
|
168
|
+
let relayedIntent: OwnerIntent | null = null;
|
|
169
|
+
let relayedAt: string | null = null;
|
|
170
|
+
const relaySigterm = () => {
|
|
171
|
+
if (childExited || sigtermRelayed) return;
|
|
172
|
+
let candidateIntent: OwnerIntent | null = null;
|
|
173
|
+
try {
|
|
174
|
+
const candidate = JSON.parse(
|
|
175
|
+
fsSync.readFileSync(lifecyclePaths(stateDir, sessionId, generation).intentFile, "utf8"),
|
|
176
|
+
) as Partial<OwnerIntent>;
|
|
177
|
+
candidateIntent = typeof candidate.dispatch_id === "string" ? (candidate as OwnerIntent) : null;
|
|
178
|
+
} catch {
|
|
179
|
+
candidateIntent = null;
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
if (!childProcess.signalRoot(15)) return;
|
|
183
|
+
} catch {
|
|
184
|
+
// The child exited between intent capture and delivery.
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
sigtermRelayed = true;
|
|
188
|
+
relayedAt = new Date().toISOString();
|
|
189
|
+
relayedIntent = candidateIntent;
|
|
190
|
+
};
|
|
191
|
+
sigtermPending ||= bootstrapSigtermPending;
|
|
192
|
+
process.removeListener("SIGTERM", captureBootstrapSigterm);
|
|
193
|
+
process.removeListener("SIGTERM", captureEarlySigterm);
|
|
194
|
+
process.on("SIGTERM", relaySigterm);
|
|
195
|
+
if (sigtermPending) relaySigterm();
|
|
138
196
|
const exitCode = await child.exited;
|
|
197
|
+
childExited = true;
|
|
198
|
+
process.removeListener("SIGTERM", relaySigterm);
|
|
199
|
+
const terminalIntent = relayedIntent as OwnerIntent | null;
|
|
200
|
+
const terminalObservedAt = relayedAt as string | null;
|
|
201
|
+
if (sigtermRelayed && terminalObservedAt && terminalIntent) {
|
|
202
|
+
await observeOwnerTerminal({
|
|
203
|
+
schema_version: 1,
|
|
204
|
+
op: "observe_terminal",
|
|
205
|
+
session_id: sessionId,
|
|
206
|
+
owner_generation: generation,
|
|
207
|
+
state_dir: stateDir,
|
|
208
|
+
socket_key: process.env.SKC_TMUX_OWNER_SERVER_KEY ?? "",
|
|
209
|
+
observer: "raw_monitor",
|
|
210
|
+
observed_at: terminalObservedAt,
|
|
211
|
+
signal: "SIGTERM",
|
|
212
|
+
exit_code: exitCode,
|
|
213
|
+
exit_kind: "supervisor_child_exit",
|
|
214
|
+
reason: "managed_owner_supervisor_exit",
|
|
215
|
+
operator_dispatch_id: terminalIntent.dispatch_id,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
139
218
|
if (child.signalCode === "SIGABRT") {
|
|
140
219
|
const receipt: ManagedOwnerSigabrtReceipt = {
|
|
141
220
|
schema_version: 2,
|