@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
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { type Agent, type AgentContext, type AgentEvent, type AgentLoopConfig, type AgentMessage, type AgentState, type AgentTool, type MidRunMaintenanceOutcome, type StablePrefixSnapshot, ThinkingLevel } from "@sayknow-cli/agent-core";
|
|
16
16
|
import { type CompactionResult, type EmergencyCompactionSample } from "@sayknow-cli/agent-core/compaction";
|
|
17
17
|
import type { AssistantMessage, Effort, ImageContent, Message, MessageAttribution, Model, ProviderSessionState, ServiceTier, SimpleStreamOptions, TextContent, ToolCall, ToolChoice, Usage, UsageReport } from "@sayknow-cli/ai";
|
|
18
|
+
import { type BtwTextExchange } from "./btw-contract";
|
|
18
19
|
export interface ForkContextSeedMetadata {
|
|
19
20
|
sourceSessionId: string;
|
|
20
21
|
parentMessageCount: number;
|
|
@@ -79,7 +80,8 @@ import type { TtsrManager } from "../export/ttsr";
|
|
|
79
80
|
import type { LoadedCustomCommand } from "../extensibility/custom-commands";
|
|
80
81
|
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
81
82
|
import type { ExtensionRunner } from "../extensibility/extensions";
|
|
82
|
-
import type { CompactOptions, ContextUsage } from "../extensibility/extensions/types";
|
|
83
|
+
import type { CompactOptions, ContextUsage, ExtensionTranscriptEntry } from "../extensibility/extensions/types";
|
|
84
|
+
import type { SessionSwitchEvent } from "../extensibility/shared-events";
|
|
83
85
|
import { type Skill, type SkillWarning } from "../extensibility/skills";
|
|
84
86
|
import { type FileSlashCommand } from "../extensibility/slash-commands";
|
|
85
87
|
import { GoalRuntime } from "../goals/runtime";
|
|
@@ -91,6 +93,7 @@ import { type AgentRegistry } from "../registry/agent-registry";
|
|
|
91
93
|
import { MCPManager } from "../runtime-mcp/manager";
|
|
92
94
|
import type { NotificationSessionController } from "../sdk/bus/session-control";
|
|
93
95
|
import { type SecretObfuscator } from "../secrets/obfuscator";
|
|
96
|
+
import { type MemoryGuardClaimsLease } from "../skc-runtime/memory-guard-owner-claims";
|
|
94
97
|
import { type DiscoverableTool, type DiscoverableToolSearchIndex } from "../tool-discovery/tool-index";
|
|
95
98
|
import type { AskAnswerSource, ToolSession } from "../tools";
|
|
96
99
|
import type { CheckpointState } from "../tools/checkpoint";
|
|
@@ -100,8 +103,9 @@ import { type DefaultModelSelectionResult } from "./default-model-selection";
|
|
|
100
103
|
export { DefaultModelSelectionRecoveryError } from "./default-model-selection";
|
|
101
104
|
import type { ClientBridge, ClientBridgePermissionOption, ClientBridgePermissionOutcome, ClientBridgePermissionToolCall } from "./client-bridge";
|
|
102
105
|
import { type ContributionPrepOptions, type ContributionPrepResult } from "./contribution-prep";
|
|
106
|
+
import type { MemoryGuardRestoreResult } from "./memory-guard-checkpoint-participant";
|
|
103
107
|
import { type CustomMessage } from "./messages";
|
|
104
|
-
import type { BranchSummaryEntry, CompactionEntry, NewSessionOptions, RecoveryHydrationContext, RecoveryHydrationPromotionFence, SessionContext, SessionManager, SessionManagerCloseOutcome } from "./session-manager";
|
|
108
|
+
import type { BranchSummaryEntry, CompactionEntry, NewSessionOptions, PreparedNewSession, RecoveryHydrationContext, RecoveryHydrationPromotionFence, SessionContext, SessionManager, SessionManagerCloseOutcome } from "./session-manager";
|
|
105
109
|
import { ToolChoiceQueue } from "./tool-choice-queue";
|
|
106
110
|
import { YieldQueue } from "./yield-queue";
|
|
107
111
|
/** Session-specific events that extend the core AgentEvent */
|
|
@@ -313,6 +317,24 @@ export interface AgentSessionConfig {
|
|
|
313
317
|
/** Optional provider-facing cache identity, distinct from logical session identity. */
|
|
314
318
|
providerCacheSessionId?: string;
|
|
315
319
|
}
|
|
320
|
+
export interface AgentSessionMemoryGuardRestoreInput extends Omit<AgentSessionConfig, "sessionManager" | "recoveryHydrationContext"> {
|
|
321
|
+
staged: Extract<MemoryGuardRestoreResult, {
|
|
322
|
+
kind: "staged";
|
|
323
|
+
}>;
|
|
324
|
+
claimsLease: MemoryGuardClaimsLease;
|
|
325
|
+
claimsStateDir: string;
|
|
326
|
+
}
|
|
327
|
+
export interface AgentMemoryGuardPromotionFence extends RecoveryHydrationPromotionFence {
|
|
328
|
+
readonly claimsLease: MemoryGuardClaimsLease;
|
|
329
|
+
}
|
|
330
|
+
export type AgentMemoryGuardRestoreResult = {
|
|
331
|
+
kind: "staged";
|
|
332
|
+
session: AgentSession;
|
|
333
|
+
promotionFence: AgentMemoryGuardPromotionFence;
|
|
334
|
+
} | {
|
|
335
|
+
kind: "blocked";
|
|
336
|
+
reason: "transcript-mismatch" | "hydration-context-mismatch" | "claim-mismatch" | "agent-messages-mismatch";
|
|
337
|
+
};
|
|
316
338
|
type MidRunMaintenanceLifecycle = Parameters<NonNullable<AgentLoopConfig["maintainContext"]>>[1];
|
|
317
339
|
/** Options for AgentSession.prompt() */
|
|
318
340
|
export interface PromptOptions {
|
|
@@ -335,8 +357,21 @@ export interface PromptOptions {
|
|
|
335
357
|
/**
|
|
336
358
|
* Invoked after all prompt preflight checks pass and immediately before agent execution begins.
|
|
337
359
|
* Cancellation before this callback rejects the prompt.
|
|
360
|
+
* Prefer `onPreflightAcceptCommit` for async durable acceptance (#3031/#3032).
|
|
338
361
|
*/
|
|
339
362
|
onPreflightAccepted?: () => void;
|
|
363
|
+
/**
|
|
364
|
+
* Awaitable durable-accept fence. Called after preflight and before queue mutation
|
|
365
|
+
* or `#promptAgentWithIdleRetry`. SDK bus installs a closure that fsyncs acceptance.
|
|
366
|
+
*/
|
|
367
|
+
onPreflightAcceptCommit?: () => void | Promise<void>;
|
|
368
|
+
/** Skill-only: prepared metadata before the durable fence (path/lineCount/cleanedArgs). */
|
|
369
|
+
onSkillPrepared?: (meta: {
|
|
370
|
+
name: string;
|
|
371
|
+
path: string;
|
|
372
|
+
lineCount?: number;
|
|
373
|
+
cleanedArgs?: string;
|
|
374
|
+
}) => void;
|
|
340
375
|
}
|
|
341
376
|
/** Result from a handoff operation. */
|
|
342
377
|
export interface HandoffResult {
|
|
@@ -392,8 +427,29 @@ interface EphemeralTurnBaseArgs {
|
|
|
392
427
|
onTextDelta?: (delta: string) => void;
|
|
393
428
|
signal?: AbortSignal;
|
|
394
429
|
}
|
|
395
|
-
export
|
|
430
|
+
export interface BtwRoleTextMessage {
|
|
431
|
+
role: "user" | "assistant";
|
|
432
|
+
text: string;
|
|
433
|
+
}
|
|
434
|
+
export interface BtwConversationScope {
|
|
435
|
+
model: Model;
|
|
436
|
+
systemPrompt: string[];
|
|
437
|
+
messages: BtwRoleTextMessage[];
|
|
438
|
+
thinkingLevel: ThinkingLevel;
|
|
439
|
+
hideThinkingSummary: boolean;
|
|
440
|
+
serviceTier: ServiceTier | undefined;
|
|
441
|
+
credentialSessionId: string;
|
|
442
|
+
providerAffinitySessionId: string;
|
|
443
|
+
sideSessionId: string;
|
|
444
|
+
}
|
|
445
|
+
export interface BtwTurnCapture {
|
|
446
|
+
question: string;
|
|
447
|
+
scope: BtwConversationScope | undefined;
|
|
448
|
+
}
|
|
449
|
+
export type EphemeralTurnArgs = (Omit<EphemeralTurnBaseArgs, "promptText"> & {
|
|
396
450
|
purpose: "btw";
|
|
451
|
+
turn: BtwTurnCapture;
|
|
452
|
+
contextExchanges?: readonly BtwTextExchange[];
|
|
397
453
|
}) | (EphemeralTurnBaseArgs & {
|
|
398
454
|
purpose?: "background";
|
|
399
455
|
/** Internal caller-supplied, non-persistent context such as the IRC roster. */
|
|
@@ -520,6 +576,8 @@ export declare class AgentSession {
|
|
|
520
576
|
* recorded or the mode-state file is missing/unreadable; callers should
|
|
521
577
|
* treat undefined as a non-terminal phase (refuses to chain). */
|
|
522
578
|
getActiveSkillPhase(): string | undefined;
|
|
579
|
+
/** Provider-facing ask metadata must expose only the active deep-interview phase. */
|
|
580
|
+
getDeepInterviewAskStage(): "topology" | "post-topology" | undefined;
|
|
523
581
|
/** Peek the in-flight directive's invocation handler for use by the resolve tool. */
|
|
524
582
|
peekQueueInvoker(): ((input: unknown) => Promise<unknown> | unknown) | undefined;
|
|
525
583
|
peekStandingResolveHandler(): ((input: unknown) => Promise<unknown> | unknown) | undefined;
|
|
@@ -653,6 +711,8 @@ export declare class AgentSession {
|
|
|
653
711
|
* Get a tool by name from the registry.
|
|
654
712
|
*/
|
|
655
713
|
getToolByName(name: string): AgentTool | undefined;
|
|
714
|
+
/** Get a registered tool with the same guards used for model-facing execution. */
|
|
715
|
+
getToolForExecution(name: string): AgentTool | undefined;
|
|
656
716
|
/**
|
|
657
717
|
* Register a UI/control-plane request handler for a currently foregrounded
|
|
658
718
|
* managed bash execution. This is intentionally narrower than generic
|
|
@@ -729,13 +789,16 @@ export declare class AgentSession {
|
|
|
729
789
|
/** All messages including custom types like BashExecutionMessage */
|
|
730
790
|
get messages(): AgentMessage[];
|
|
731
791
|
get transcriptPromptGeneration(): number;
|
|
792
|
+
static restoreFromMemoryGuardCheckpoint(input: AgentSessionMemoryGuardRestoreInput): Promise<AgentMemoryGuardRestoreResult>;
|
|
732
793
|
/** The immutable recovery authority, present only before external ownership promotion. */
|
|
733
794
|
get recoveryHydrationContext(): RecoveryHydrationContext | undefined;
|
|
734
795
|
/** Enables normal session mutations after the owner has published its durable fence and writer lease. */
|
|
735
|
-
promoteRecoveryHydrationAfterOwnershipReadyFence(fence:
|
|
796
|
+
promoteRecoveryHydrationAfterOwnershipReadyFence(fence: AgentMemoryGuardPromotionFence): Promise<void>;
|
|
736
797
|
/** Main startup calls this exactly once, after a strict open returned `kind: "opened"`. */
|
|
737
798
|
continuePersistedHistory(): Promise<void>;
|
|
738
799
|
buildDisplaySessionContext(): SessionContext;
|
|
800
|
+
/** Build display context from an unpublished successor without changing active session state. @internal */
|
|
801
|
+
buildPreparedDisplaySessionContext(prepared: PreparedNewSession): SessionContext;
|
|
739
802
|
/** Convert session messages using the same pre-LLM pipeline as the active session. */
|
|
740
803
|
convertMessagesToLlm(messages: AgentMessage[], signal?: AbortSignal): Promise<Message[]>;
|
|
741
804
|
/** Apply session-level stream hooks to a direct side request. */
|
|
@@ -759,7 +822,7 @@ export declare class AgentSession {
|
|
|
759
822
|
/** Live SDK configuration values exposed through the session query surface. */
|
|
760
823
|
getSdkConfigItems(): Record<string, string>;
|
|
761
824
|
setPlanModeState(state: PlanModeState | undefined): void;
|
|
762
|
-
invokeSkill(name: string, args?: string): Promise<{
|
|
825
|
+
invokeSkill(name: string, args?: string, options?: Pick<PromptOptions, "onPreflightAccepted" | "onPreflightAcceptCommit" | "onSkillPrepared">): Promise<{
|
|
763
826
|
name: string;
|
|
764
827
|
path: string;
|
|
765
828
|
args?: string;
|
|
@@ -767,13 +830,7 @@ export declare class AgentSession {
|
|
|
767
830
|
}>;
|
|
768
831
|
setSdkPlanMode(on: boolean): Promise<PlanModeState | undefined>;
|
|
769
832
|
operateGoal(op: "create" | "get" | "resume" | "pause" | "complete" | "drop", objective?: string): Promise<unknown>;
|
|
770
|
-
getTranscript():
|
|
771
|
-
id: string;
|
|
772
|
-
role: string;
|
|
773
|
-
textSummary: string;
|
|
774
|
-
ts: string;
|
|
775
|
-
body: string;
|
|
776
|
-
}>;
|
|
833
|
+
getTranscript(): ExtensionTranscriptEntry[];
|
|
777
834
|
getTranscriptBody(entryId: string): string | undefined;
|
|
778
835
|
getGoalModeState(): GoalModeState | undefined;
|
|
779
836
|
setGoalModeState(state: GoalModeState | undefined): void;
|
|
@@ -820,7 +877,7 @@ export declare class AgentSession {
|
|
|
820
877
|
* @throws Error if no model selected or no API key available (when not streaming)
|
|
821
878
|
*/
|
|
822
879
|
prompt(text: string, options?: PromptOptions): Promise<void>;
|
|
823
|
-
promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice" | "followUpQueuePolicy">): Promise<void>;
|
|
880
|
+
promptCustomMessage<T = unknown>(message: Pick<CustomMessage<T>, "customType" | "content" | "display" | "details" | "attribution">, options?: Pick<PromptOptions, "streamingBehavior" | "toolChoice" | "followUpQueuePolicy" | "onPreflightAccepted" | "onPreflightAcceptCommit">): Promise<void>;
|
|
824
881
|
/**
|
|
825
882
|
* Queue a steering message to interrupt the agent mid-run.
|
|
826
883
|
*/
|
|
@@ -860,6 +917,7 @@ export declare class AgentSession {
|
|
|
860
917
|
sendUserMessage(content: string | (TextContent | ImageContent)[], options?: {
|
|
861
918
|
deliverAs?: "steer" | "followUp";
|
|
862
919
|
onPreflightAccepted?: () => void;
|
|
920
|
+
onPreflightAcceptCommit?: () => void | Promise<void>;
|
|
863
921
|
}): Promise<void>;
|
|
864
922
|
/**
|
|
865
923
|
* Clear queued messages and return them.
|
|
@@ -962,6 +1020,8 @@ export declare class AgentSession {
|
|
|
962
1020
|
}): Promise<void>;
|
|
963
1021
|
setActiveModelProfile(name: string | undefined): void;
|
|
964
1022
|
getActiveModelProfile(): string | undefined;
|
|
1023
|
+
/** Activate a complete model profile through a nonvisual session control. */
|
|
1024
|
+
activateModelProfileForControl(profileName: string): Promise<boolean>;
|
|
965
1025
|
/** Return the persisted configured fallback selectors for a model role. */
|
|
966
1026
|
getConfiguredModelChain(role: string): readonly string[] | undefined;
|
|
967
1027
|
/** Persist the configured fallback selectors for a model role. */
|
|
@@ -1041,20 +1101,16 @@ export declare class AgentSession {
|
|
|
1041
1101
|
* Get all available models with valid API keys.
|
|
1042
1102
|
*/
|
|
1043
1103
|
getAvailableModels(): Model[];
|
|
1044
|
-
/**
|
|
1045
|
-
* Set thinking level.
|
|
1046
|
-
* Saves the effective metadata-clamped level to the session, and to settings when requested.
|
|
1047
|
-
*/
|
|
1048
1104
|
setThinkingLevel(level: ThinkingLevel | undefined, persist?: boolean): void;
|
|
1049
1105
|
/**
|
|
1050
|
-
* Set thinking level from a control surface. Global changes
|
|
1106
|
+
* Set thinking level from a control surface. Global changes commit before affecting live state.
|
|
1051
1107
|
*/
|
|
1052
1108
|
setThinkingLevelForControl(level: ThinkingLevel, persist: boolean): Promise<void>;
|
|
1053
1109
|
getThinkingScopeForControl(): "session" | "global config";
|
|
1054
1110
|
getThinkingVisibility(): "visible" | "hidden";
|
|
1055
1111
|
setThinkingVisibility(visibility: "visible" | "hidden", persist?: boolean): void;
|
|
1056
1112
|
/**
|
|
1057
|
-
* Set thinking visibility from a control surface. Global changes
|
|
1113
|
+
* Set thinking visibility from a control surface. Global changes commit before affecting live state.
|
|
1058
1114
|
*/
|
|
1059
1115
|
setThinkingVisibilityForControl(visibility: "visible" | "hidden", persist: boolean): Promise<void>;
|
|
1060
1116
|
/**
|
|
@@ -1271,11 +1327,12 @@ export declare class AgentSession {
|
|
|
1271
1327
|
timestamp?: number;
|
|
1272
1328
|
}): void;
|
|
1273
1329
|
emitSubagentSteerRelayObservation(record: CustomMessage): void;
|
|
1330
|
+
createBtwConversationScope(instruction: string): BtwConversationScope;
|
|
1274
1331
|
/**
|
|
1275
|
-
* Run a single ephemeral side-channel turn
|
|
1276
|
-
*
|
|
1277
|
-
*
|
|
1278
|
-
*
|
|
1332
|
+
* Run a single ephemeral side-channel turn without modifying session history.
|
|
1333
|
+
* Background turns retain IRC/session behavior. `/btw` turns require a
|
|
1334
|
+
* pre-frozen, visible-text-only scope and bypass extension context transforms,
|
|
1335
|
+
* provider observability hooks, and session persistence surfaces.
|
|
1279
1336
|
*/
|
|
1280
1337
|
runEphemeralTurn(args: EphemeralTurnArgs): Promise<EphemeralTurnResult>;
|
|
1281
1338
|
/**
|
|
@@ -1291,7 +1348,9 @@ export declare class AgentSession {
|
|
|
1291
1348
|
* Listeners are preserved and will continue receiving events.
|
|
1292
1349
|
* @returns true if switch completed, false if cancelled by hook
|
|
1293
1350
|
*/
|
|
1294
|
-
switchSession(sessionPath: string
|
|
1351
|
+
switchSession(sessionPath: string, options?: {
|
|
1352
|
+
transition?: SessionSwitchEvent["transition"];
|
|
1353
|
+
}): Promise<boolean>;
|
|
1295
1354
|
/**
|
|
1296
1355
|
* Create a branch from a specific entry.
|
|
1297
1356
|
* Emits before_branch/branch session events to hooks.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const BTW_MAX_CONTEXT_TURNS = 12;
|
|
2
|
+
export declare const BTW_MAX_CONTEXT_UTF8_BYTES: number;
|
|
3
|
+
export declare const BTW_MAX_QUESTION_UTF8_BYTES: number;
|
|
4
|
+
export declare const BTW_MAX_ANSWER_UTF8_BYTES: number;
|
|
5
|
+
export declare const BTW_MAX_ERROR_UTF8_BYTES: number;
|
|
6
|
+
export declare const BTW_STREAM_IDLE_TIMEOUT_MS = 30000;
|
|
7
|
+
export declare const BTW_STREAM_TOTAL_TIMEOUT_MS = 120000;
|
|
8
|
+
export interface BtwTextExchange {
|
|
9
|
+
question: string;
|
|
10
|
+
answer: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function utf8ByteLength(text: string): number;
|
|
13
|
+
export declare function truncateUtf8(text: string, maxBytes: number): string;
|
|
14
|
+
export declare function sanitizeBtwError(text: string): string;
|
|
15
|
+
export declare function exchangeUtf8Bytes(exchange: BtwTextExchange): number;
|
|
16
|
+
export declare function boundBtwExchanges(exchanges: readonly BtwTextExchange[]): BtwTextExchange[];
|
|
@@ -47,8 +47,9 @@ export declare class FallbackChainController {
|
|
|
47
47
|
onAttemptFailure(triggerClass: FallbackTriggerClass, reason: string): FallbackFailureResult;
|
|
48
48
|
advance(): boolean;
|
|
49
49
|
/**
|
|
50
|
-
* Restore the entry that just advanced
|
|
51
|
-
*
|
|
50
|
+
* Restore the entry that just advanced for one attempt with a rotated credential.
|
|
51
|
+
* Each non-terminal entry may be restored once, so credential rotation remains
|
|
52
|
+
* bounded and cannot consume the attempts reserved for downstream entries.
|
|
52
53
|
*/
|
|
53
54
|
restorePreviousEntryForRetry(): boolean;
|
|
54
55
|
isExhausted(): boolean;
|
|
@@ -56,5 +57,20 @@ export declare class FallbackChainController {
|
|
|
56
57
|
resetSticky(): void;
|
|
57
58
|
}
|
|
58
59
|
export declare function cappedExponentialWithFullJitter(baseDelayMs: number, maxDelayMs: number, attemptK: number, random?: () => number): number;
|
|
60
|
+
/**
|
|
61
|
+
* Legacy auto-compaction retry delay.
|
|
62
|
+
*
|
|
63
|
+
* Deliberately the mirror image of `effectiveFallbackDelay`: this path recovers
|
|
64
|
+
* Retry-After by regex over provider error prose (`#parseRetryAfterMsFromError`),
|
|
65
|
+
* so it follows the documented legacy rule — `retry.maxDelayMs` caps every
|
|
66
|
+
* legacy session retry delay, including provider retry-after hints. Managed
|
|
67
|
+
* fallback stays uncapped because it retries within its own per-entry budget;
|
|
68
|
+
* compaction has no such budget, so the final candidate would otherwise sleep
|
|
69
|
+
* for the full server-suggested duration.
|
|
70
|
+
*
|
|
71
|
+
* `maxDelayMs <= 0` means "no cap", matching `cappedExponentialWithFullJitter`.
|
|
72
|
+
* A missing, NaN, or infinite hint collapses to "no usable hint".
|
|
73
|
+
*/
|
|
74
|
+
export declare function compactionRetryDelay(baseDelayMs: number, maxDelayMs: number, attempt: number, retryAfterMs: number | undefined): number;
|
|
59
75
|
/** Retry-After is intentionally uncapped. */
|
|
60
76
|
export declare function effectiveFallbackDelay(baseDelayMs: number, maxDelayMs: number, attemptK: number, retryAfterMs: number | undefined, random?: () => number): number;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as native from "@sayknow-cli/natives";
|
|
2
2
|
import type { ResumeSessionIdentity } from "../session-manager";
|
|
3
|
+
import { type NativeDirectoryTreeSnapshot } from "../session-storage";
|
|
4
|
+
import { type ManagedDirectoryRoot, type ManagedSessionSecurityPolicy, type ManagedStorageLock } from "./managed-session-storage";
|
|
3
5
|
export declare const MANAGED_SESSION_LAYOUT_VERSION: 2;
|
|
4
6
|
export declare const MANAGED_SESSION_IDENTITY_VERSION: 1;
|
|
5
7
|
export declare const MANAGED_SESSION_BINDING_FILE = ".skc-managed-session-scope.v2.json";
|
|
@@ -15,14 +17,24 @@ export interface ManagedScope {
|
|
|
15
17
|
directoryPath: string;
|
|
16
18
|
platform: "posix" | "win32";
|
|
17
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Opaque managed writer authority captured by a trusted destination. The open
|
|
22
|
+
* transaction must use this authority rather than reacquiring its root from a
|
|
23
|
+
* pathname after resume inspection.
|
|
24
|
+
*/
|
|
25
|
+
export interface ManagedCandidateWriteAuthority {
|
|
26
|
+
readonly rootAuthority: ManagedDirectoryRoot;
|
|
27
|
+
readonly retainedAuthority?: native.RecoveryFsRoot;
|
|
28
|
+
readonly retainedDirectory?: string;
|
|
29
|
+
}
|
|
18
30
|
export declare function managedDirectoryAuthorityForScope(scope: ManagedScope): native.RecoveryFsRoot | undefined;
|
|
19
31
|
export declare function managedDirectoryIdentityForScope(scope: ManagedScope): {
|
|
20
32
|
dev: bigint;
|
|
21
33
|
ino: bigint;
|
|
22
34
|
};
|
|
23
|
-
export declare function managedRootForScope(scope: ManagedScope):
|
|
35
|
+
export declare function managedRootForScope(scope: ManagedScope): ManagedDirectoryRoot;
|
|
24
36
|
export type ManagedMigrationPolicy = "copy-retain" | "disabled";
|
|
25
|
-
export type ManagedScopeErrorCode = "cwd_missing" | "cwd_not_directory" | "identity_unavailable" | "network_unsupported" | "sessions_root_unavailable" | "binding_conflict" | "binding_invalid";
|
|
37
|
+
export type ManagedScopeErrorCode = "cwd_missing" | "cwd_not_directory" | "identity_unavailable" | "network_unsupported" | "sessions_root_unavailable" | "binding_conflict" | "binding_invalid" | "atomic_unavailable" | "invalid_request" | "durability_failed" | "durability_not_provable";
|
|
26
38
|
export type ManagedScopeResolution = {
|
|
27
39
|
kind: "resolved";
|
|
28
40
|
scope: ManagedScope;
|
|
@@ -30,6 +42,10 @@ export type ManagedScopeResolution = {
|
|
|
30
42
|
kind: "error";
|
|
31
43
|
code: ManagedScopeErrorCode;
|
|
32
44
|
message: string;
|
|
45
|
+
cause?: {
|
|
46
|
+
readonly classification: string;
|
|
47
|
+
readonly diagnostic?: string;
|
|
48
|
+
};
|
|
33
49
|
};
|
|
34
50
|
export interface ManagedCandidate {
|
|
35
51
|
sessionId: string;
|
|
@@ -52,7 +68,7 @@ export type ManagedCandidateListing = {
|
|
|
52
68
|
code: "scan_failed" | "unsafe_root" | "invalid_candidate";
|
|
53
69
|
message: string;
|
|
54
70
|
};
|
|
55
|
-
export type ManagedOpenFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "durability_failed" | "migration_retired" | "legacy_migration_disabled" | "managed_storage_unsupported";
|
|
71
|
+
export type ManagedOpenFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "artifact_capacity_exceeded" | "durability_failed" | "atomic_unavailable" | "invalid_request" | "durability_not_provable" | "migration_retired" | "legacy_migration_disabled" | "managed_storage_unsupported";
|
|
56
72
|
export type ManagedOpenCandidateResult = {
|
|
57
73
|
kind: "opened";
|
|
58
74
|
path: string;
|
|
@@ -69,6 +85,11 @@ export type ManagedDeleteCandidateResult = {
|
|
|
69
85
|
} | {
|
|
70
86
|
kind: "already_deleted";
|
|
71
87
|
tombstonePath: string;
|
|
88
|
+
} | {
|
|
89
|
+
kind: "cleanup_pending";
|
|
90
|
+
tombstonePath: string;
|
|
91
|
+
phase: "artifacts" | "transcript";
|
|
92
|
+
message: string;
|
|
72
93
|
} | {
|
|
73
94
|
kind: "error";
|
|
74
95
|
code: ManagedOpenFailure;
|
|
@@ -86,24 +107,63 @@ export declare const computeManagedScopeDigest: typeof scopeDigest;
|
|
|
86
107
|
* attacker-plantable component below the root.
|
|
87
108
|
*/
|
|
88
109
|
export declare function canonicalizeTrustedPath(target: string): string;
|
|
89
|
-
|
|
110
|
+
interface ManagedScopeInput {
|
|
90
111
|
cwd: string;
|
|
91
112
|
agentDir: string;
|
|
92
113
|
sessionsRoot: string;
|
|
93
|
-
}
|
|
94
|
-
export declare function
|
|
114
|
+
}
|
|
115
|
+
export declare function resolveManagedScope(input: ManagedScopeInput): ManagedScopeResolution;
|
|
116
|
+
/** Resolve a scope for a synchronous write without mutating an existing ACL mismatch. */
|
|
117
|
+
export declare function resolveManagedScopeForWrite(input: ManagedScopeInput): ManagedScopeResolution;
|
|
118
|
+
export declare function canonicalBindingOpenFlags(platform?: NodeJS.Platform): number;
|
|
119
|
+
export declare function fsyncCanonicalBinding(bindingPath: string, expected: string): void;
|
|
120
|
+
export declare function ensureManagedScope(scope: ManagedScope, policy?: ManagedSessionSecurityPolicy): Promise<ManagedScopeResolution>;
|
|
95
121
|
/** Synchronously create and validate the v2 binding before a default session writer exists. */
|
|
96
|
-
export declare function prepareManagedSessionScopeForWriteSync(scope: ManagedScope): ManagedScopeResolution;
|
|
122
|
+
export declare function prepareManagedSessionScopeForWriteSync(scope: ManagedScope, policy?: ManagedSessionSecurityPolicy, authority?: ManagedCandidateWriteAuthority): ManagedScopeResolution;
|
|
97
123
|
export declare function listManagedCandidates(scope: ManagedScope): ManagedCandidateListing;
|
|
124
|
+
type DetachedArtifactRoot = {
|
|
125
|
+
originalPath: string;
|
|
126
|
+
detachedPath: string;
|
|
127
|
+
identity: {
|
|
128
|
+
dev: bigint;
|
|
129
|
+
ino: bigint;
|
|
130
|
+
size: bigint;
|
|
131
|
+
mtimeNs: bigint;
|
|
132
|
+
};
|
|
133
|
+
tree: NativeDirectoryTreeSnapshot;
|
|
134
|
+
};
|
|
135
|
+
export declare function matchesMigrationArtifactRoot(pathname: string, identity: {
|
|
136
|
+
dev: bigint;
|
|
137
|
+
ino: bigint;
|
|
138
|
+
size: bigint;
|
|
139
|
+
mtimeNs: bigint;
|
|
140
|
+
}, expectedTree: NativeDirectoryTreeSnapshot, platform?: NodeJS.Platform): boolean;
|
|
141
|
+
type SourceArtifactCleanup = {
|
|
142
|
+
state: "cleanup_pending";
|
|
143
|
+
role: "exchange_placeholder";
|
|
144
|
+
retainedPath: string;
|
|
145
|
+
identity: DetachedArtifactRoot["identity"];
|
|
146
|
+
tree: NativeDirectoryTreeSnapshot;
|
|
147
|
+
};
|
|
148
|
+
export declare function cleanupAuthorityMatches(cleanup: SourceArtifactCleanup, parent: string, platform?: NodeJS.Platform): boolean;
|
|
149
|
+
export declare function detachArtifactRootForMigration(plan: DetachedArtifactRoot, platform?: NodeJS.Platform): {
|
|
150
|
+
detached: DetachedArtifactRoot;
|
|
151
|
+
detachOutcome: "clean";
|
|
152
|
+
} | {
|
|
153
|
+
detached: DetachedArtifactRoot;
|
|
154
|
+
detachOutcome: "cleanup_pending";
|
|
155
|
+
cleanup: SourceArtifactCleanup;
|
|
156
|
+
};
|
|
157
|
+
export declare function restorePreparedArtifactRoot(scope: ManagedScope, source: ManagedCandidate, lock?: ManagedStorageLock): void;
|
|
98
158
|
/** Resume tombstoned cleanup under its original operation lease without restoring retired candidates. */
|
|
99
|
-
export declare function reconcileManagedTombstones(scope: ManagedScope): Promise<void>;
|
|
159
|
+
export declare function reconcileManagedTombstones(scope: ManagedScope, expectedCandidate?: ManagedCandidate): Promise<void>;
|
|
100
160
|
/** Create the v2 binding and private write protocol directories before managed writes. */
|
|
101
|
-
export declare function prepareManagedSessionScopeForWrite(scope: ManagedScope): Promise<ManagedScopeResolution>;
|
|
161
|
+
export declare function prepareManagedSessionScopeForWrite(scope: ManagedScope, policy?: ManagedSessionSecurityPolicy, authority?: ManagedCandidateWriteAuthority, expectedCandidate?: ManagedCandidate, expectedIdentity?: ResumeSessionIdentity): Promise<ManagedScopeResolution>;
|
|
102
162
|
/**
|
|
103
163
|
* Open a validated candidate for mutation. Legacy transcripts are copied exactly once
|
|
104
164
|
* into v2 and retained at their original location; no transcript data is merged.
|
|
105
165
|
*/
|
|
106
|
-
export declare function openManagedCandidateForWrite(scope: ManagedScope, candidate: ManagedCandidate, migrationPolicy?: ManagedMigrationPolicy): Promise<ManagedOpenCandidateResult>;
|
|
166
|
+
export declare function openManagedCandidateForWrite(scope: ManagedScope, candidate: ManagedCandidate, expectedIdentityOrMigrationPolicy?: ResumeSessionIdentity | ManagedMigrationPolicy, migrationPolicy?: ManagedMigrationPolicy, authority?: ManagedCandidateWriteAuthority): Promise<ManagedOpenCandidateResult>;
|
|
107
167
|
/** Tombstone a verified managed candidate before exact-identity deletion. */
|
|
108
168
|
export declare function deleteManagedSessionCandidate(scope: ManagedScope, candidate: ManagedCandidate): Promise<ManagedDeleteCandidateResult>;
|
|
109
169
|
export {};
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { type NativeDirectoryTreeSnapshot, type NativeOwnerOnlySecurityResult, type RecoveryFsRoot } from "@sayknow-cli/natives";
|
|
2
|
+
import { type NativePublishOutcome } from "./native-publish-outcome";
|
|
2
3
|
export declare const MANAGED_ARTIFACT_MAX_DEPTH = 32;
|
|
3
|
-
export declare const MANAGED_ARTIFACT_MAX_FILES =
|
|
4
|
+
export declare const MANAGED_ARTIFACT_MAX_FILES = 50000;
|
|
4
5
|
export declare const MANAGED_ARTIFACT_MAX_FILE_BYTES: number;
|
|
5
6
|
export declare const MANAGED_ARTIFACT_MAX_TOTAL_BYTES: number;
|
|
6
|
-
export
|
|
7
|
+
export declare const MANAGED_ARTIFACT_COPY_BATCH_SIZE = 256;
|
|
8
|
+
export declare class ManagedPublishError extends Error {
|
|
9
|
+
readonly classification: "destination_conflict" | "atomic_unavailable" | "invalid_request" | "durability_not_provable" | "identity_mismatch" | "io_error" | "durability_failed";
|
|
10
|
+
readonly diagnostic: string;
|
|
11
|
+
constructor(classification: ManagedPublishError["classification"], outcome: NativePublishOutcome);
|
|
12
|
+
}
|
|
13
|
+
/** Cleanup is safe only when the native move reports that it did not commit. */
|
|
14
|
+
export declare function mayCleanManagedTreeStaging(error: unknown): boolean;
|
|
15
|
+
export type ManagedSessionSecurityPolicy = "default" | "windows-existing-verify-first";
|
|
16
|
+
export type ManagedStorageFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "artifact_capacity_exceeded" | "durability_failed" | "atomic_unavailable" | "durability_not_provable" | "migration_retired" | "managed_storage_unsupported";
|
|
7
17
|
export interface ManagedStorageLock {
|
|
8
18
|
path: string;
|
|
9
19
|
attemptId: string;
|
|
@@ -28,6 +38,13 @@ export interface ManagedDirectoryRoot {
|
|
|
28
38
|
readonly dev: bigint;
|
|
29
39
|
readonly ino: bigint;
|
|
30
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Establish the first managed directory beneath a potentially shared ancestor.
|
|
43
|
+
* The ancestor is used only to create the managed chain; every component from
|
|
44
|
+
* `configuredRoot` downward is independently type, symlink, owner, mode, and
|
|
45
|
+
* ACL checked. This deliberately does not impose owner-only policy on `/tmp`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function prepareManagedDirectoryRoot(configuredRoot: string, policy?: ManagedSessionSecurityPolicy): ManagedDirectoryRoot;
|
|
31
48
|
export declare function managedDirectoryRoot(configuredRoot: string): ManagedDirectoryRoot;
|
|
32
49
|
export declare function retainManagedDirectoryAuthority(root: ManagedDirectoryRoot, directory: string, expected?: {
|
|
33
50
|
dev: bigint;
|
|
@@ -40,10 +57,11 @@ export declare class ManagedSessionDescendantStore {
|
|
|
40
57
|
constructor(root: ManagedDirectoryRoot, baseDir: string, retained?: {
|
|
41
58
|
authority: RecoveryFsRoot;
|
|
42
59
|
authorityBaseDir: string;
|
|
43
|
-
});
|
|
60
|
+
}, policy?: ManagedSessionSecurityPolicy);
|
|
44
61
|
get dir(): string;
|
|
45
62
|
get rootAuthority(): ManagedDirectoryRoot;
|
|
46
63
|
get subtreeRootAuthority(): ManagedDirectoryRoot;
|
|
64
|
+
get securityPolicy(): ManagedSessionSecurityPolicy;
|
|
47
65
|
deriveSubtree(relativePath: string): ManagedSessionDescendantStore;
|
|
48
66
|
retainAuthority(): RecoveryFsRoot | undefined;
|
|
49
67
|
assertBound(): void;
|
|
@@ -66,29 +84,33 @@ export declare class ManagedSessionDescendantStore {
|
|
|
66
84
|
captureTree(relativePath: string): NativeDirectoryTreeSnapshot;
|
|
67
85
|
/** Copy an exact captured tree into an absent managed destination. */
|
|
68
86
|
importTree(sourceRelativePath: string, destinationRelativePath: string, snapshot: NativeDirectoryTreeSnapshot): Promise<void>;
|
|
69
|
-
moveTreeNoReplace(sourceRelativePath: string, destinationRelativePath: string, expected: NativeDirectoryTreeSnapshot):
|
|
87
|
+
moveTreeNoReplace(sourceRelativePath: string, destinationRelativePath: string, expected: NativeDirectoryTreeSnapshot): NativeDirectoryTreeSnapshot;
|
|
70
88
|
removeTreeExpected(relativePath: string, expected: NativeDirectoryTreeSnapshot): void;
|
|
71
89
|
fsyncTree(): NativeDirectoryTreeSnapshot;
|
|
72
90
|
}
|
|
73
91
|
export declare function shouldFsyncManagedDirectory(platform?: NodeJS.Platform): boolean;
|
|
74
92
|
/** Create a managed directory and fail closed unless its owner-only mode/ACL verifies. */
|
|
75
|
-
export declare function ensureManagedDirectory(pathname: string, root?: ManagedDirectoryRoot): void;
|
|
93
|
+
export declare function ensureManagedDirectory(pathname: string, root?: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): void;
|
|
76
94
|
/** Captures a bounded prefix from one no-follow descriptor and rechecks the pathname before use. */
|
|
77
95
|
export declare function captureManagedFilePrefixNoFollow(pathname: string, maxBytes: number): ManagedFileSnapshot;
|
|
78
96
|
/** Captures header/hash/copy input from one no-follow descriptor and rechecks the pathname before use. */
|
|
79
97
|
export declare function captureManagedFileNoFollow(pathname: string): ManagedFileSnapshot;
|
|
80
98
|
/** Atomically publishes bytes without replacing an existing destination. */
|
|
81
|
-
export declare function publishManagedFileNoReplace(destination: string, bytes: Uint8Array, assertOwned?: () => void, root?: ManagedDirectoryRoot): Promise<void>;
|
|
82
|
-
export declare function publishManagedFileNoReplaceSync(destination: string, bytes: Uint8Array, root?: ManagedDirectoryRoot): void;
|
|
99
|
+
export declare function publishManagedFileNoReplace(destination: string, bytes: Uint8Array, assertOwned?: () => void, root?: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): Promise<void>;
|
|
100
|
+
export declare function publishManagedFileNoReplaceSync(destination: string, bytes: Uint8Array, root?: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): void;
|
|
83
101
|
/** Replace one managed regular file while retaining the secured staging fd through publication. */
|
|
84
|
-
export declare function replaceManagedFileSync(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot): void;
|
|
85
|
-
export declare function replaceManagedFile(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot): Promise<void>;
|
|
102
|
+
export declare function replaceManagedFileSync(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): void;
|
|
103
|
+
export declare function replaceManagedFile(destination: string, bytes: Uint8Array, root: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): Promise<void>;
|
|
86
104
|
/** Copy the exact bytes captured from one no-follow source descriptor. */
|
|
87
|
-
export declare function copyManagedFileNoReplace(source: string, destination: string, snapshot?: ManagedFileSnapshot, root?: ManagedDirectoryRoot): Promise<void>;
|
|
105
|
+
export declare function copyManagedFileNoReplace(source: string, destination: string, snapshot?: ManagedFileSnapshot, root?: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): Promise<void>;
|
|
88
106
|
/** Acquire a lease lock with bounded wait, heartbeats, conservative stale reclaim, and fencing. */
|
|
89
|
-
export declare function acquireManagedLock(locksDirectory: string, name: string, root?: ManagedDirectoryRoot): Promise<ManagedStorageLock>;
|
|
107
|
+
export declare function acquireManagedLock(locksDirectory: string, name: string, root?: ManagedDirectoryRoot, policy?: ManagedSessionSecurityPolicy): Promise<ManagedStorageLock>;
|
|
108
|
+
export interface ManagedArtifactTreeLimits {
|
|
109
|
+
maxFiles?: number;
|
|
110
|
+
maxTotalBytes?: number;
|
|
111
|
+
}
|
|
90
112
|
/** Bounds a no-follow artifact tree before it can be copied or deleted. */
|
|
91
|
-
export declare function validateManagedArtifactTree(root: string): void;
|
|
113
|
+
export declare function validateManagedArtifactTree(root: string, limits?: ManagedArtifactTreeLimits): void;
|
|
92
114
|
/** Flush a copied managed artifact tree, including empty directories, before publishing its receipt. */
|
|
93
115
|
export declare function fsyncManagedArtifactTree(root: string): NativeDirectoryTreeSnapshot;
|
|
94
116
|
export declare function publishManagedTombstone(destination: string, record: Record<string, unknown>, assertOwned?: () => void): Promise<void>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type NativePublishMutationState = "not_committed" | "committed" | "unknown";
|
|
2
|
+
export type NativePublishDurabilityState = "not_attempted" | "proven" | "not_provable";
|
|
3
|
+
export type NativePublishReason = "none" | "destination_exists" | "atomic_unavailable" | "cross_device" | "permission_denied" | "io_failure" | "interrupted" | "invalid_request" | "identity_violation" | "durability_not_provable" | "unknown";
|
|
4
|
+
export type NativePublishOperation = "direct_rename" | "retained_file" | "retained_tree";
|
|
5
|
+
export type NativePublishPrimitive = "renameat2_noreplace" | "renameatx_np_excl" | "windows_rename_noreplace" | "unsupported" | "unknown";
|
|
6
|
+
export type NativePublishPhase = "preflight" | "file_sync" | "rename" | "source_parent_sync" | "destination_parent_sync" | "terminal_identity" | "complete" | "unknown";
|
|
7
|
+
type SyncFailure = {
|
|
8
|
+
phase: Exclude<NativePublishPhase, "preflight" | "file_sync" | "rename" | "complete" | "unknown">;
|
|
9
|
+
parentRole: "source" | "destination" | "shared" | "staged_file";
|
|
10
|
+
osCode?: number;
|
|
11
|
+
kind: "unsupported" | "io" | "permission" | "other";
|
|
12
|
+
};
|
|
13
|
+
type PublishDiagnostic = {
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
collectionState: "complete" | "partial" | "unavailable";
|
|
16
|
+
osCode?: number;
|
|
17
|
+
syncFailures?: readonly SyncFailure[];
|
|
18
|
+
};
|
|
19
|
+
export type NativePublishIdentity = {
|
|
20
|
+
readonly dev: string;
|
|
21
|
+
readonly ino: string;
|
|
22
|
+
readonly size: string;
|
|
23
|
+
readonly mtimeNs: string;
|
|
24
|
+
readonly ctimeNs: string;
|
|
25
|
+
readonly sha256?: string;
|
|
26
|
+
};
|
|
27
|
+
export type NativePublishOutcome = {
|
|
28
|
+
readonly ok: boolean;
|
|
29
|
+
readonly code?: string;
|
|
30
|
+
readonly identity?: NativePublishIdentity;
|
|
31
|
+
readonly mutationState: NativePublishMutationState;
|
|
32
|
+
readonly durabilityState: NativePublishDurabilityState;
|
|
33
|
+
readonly reason: NativePublishReason;
|
|
34
|
+
readonly primitive: NativePublishPrimitive;
|
|
35
|
+
readonly phase: NativePublishPhase;
|
|
36
|
+
readonly diagnostic: PublishDiagnostic;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Treat incompatible native results as an unknown mutation; never infer safety from legacy fields.
|
|
40
|
+
* Retained descriptor operations have a stricter contract than direct rename: a reported success
|
|
41
|
+
* includes the terminal identity and all required durability evidence.
|
|
42
|
+
*/
|
|
43
|
+
export declare function classifyNativePublishOutcome(value: unknown, operation?: NativePublishOperation): NativePublishOutcome;
|
|
44
|
+
/** Only a fully validated pre-mutation result permits exact cleanup of current staging. */
|
|
45
|
+
export declare function mayCleanCurrentStaging(outcome: NativePublishOutcome): boolean;
|
|
46
|
+
/** Stable, bounded text for startup errors. Native paths and messages are intentionally excluded. */
|
|
47
|
+
export declare function formatNativePublishDiagnostic(outcome: NativePublishOutcome): string;
|
|
48
|
+
export {};
|