@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.
Files changed (428) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/dist/types/capability/index.d.ts +10 -20
  3. package/dist/types/capability/types.d.ts +3 -0
  4. package/dist/types/cli/args.d.ts +0 -2
  5. package/dist/types/cli/read-cli.d.ts +1 -0
  6. package/dist/types/cli.d.ts +9 -1
  7. package/dist/types/commands/daemon.d.ts +2 -2
  8. package/dist/types/commands/deep-interview.d.ts +9 -0
  9. package/dist/types/commands/harness.d.ts +22 -0
  10. package/dist/types/commands/read.d.ts +6 -0
  11. package/dist/types/commands/sdk.d.ts +20 -2
  12. package/dist/types/config/keybindings.d.ts +34 -4
  13. package/dist/types/config/model-profile-contract.d.ts +40 -0
  14. package/dist/types/config/model-profiles.d.ts +2 -3
  15. package/dist/types/config/model-registry.d.ts +5 -0
  16. package/dist/types/config/provider-auth-health.d.ts +14 -0
  17. package/dist/types/config/provider-ranking.d.ts +59 -0
  18. package/dist/types/config/settings-schema.d.ts +156 -10
  19. package/dist/types/config/settings.d.ts +3 -0
  20. package/dist/types/edit/modes/patch.d.ts +13 -0
  21. package/dist/types/edit/path-mutation-lock.d.ts +15 -0
  22. package/dist/types/eval/py/executor.d.ts +1 -1
  23. package/dist/types/eval/py/runner-artifact.d.ts +8 -0
  24. package/dist/types/eval/py/tool-bridge.d.ts +1 -2
  25. package/dist/types/extensibility/extensions/types.d.ts +43 -2
  26. package/dist/types/extensibility/shared-events.d.ts +6 -0
  27. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  28. package/dist/types/main.d.ts +33 -2
  29. package/dist/types/memories/index.d.ts +2 -0
  30. package/dist/types/modes/acp/acp-agent.d.ts +22 -9
  31. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  32. package/dist/types/modes/components/btw-panel.d.ts +1 -0
  33. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  34. package/dist/types/modes/components/queue-pane.d.ts +8 -0
  35. package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
  36. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  37. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
  38. package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
  39. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  40. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  41. package/dist/types/modes/components/tool-status-header.d.ts +4 -2
  42. package/dist/types/modes/components/welcome.d.ts +5 -0
  43. package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
  44. package/dist/types/modes/controllers/command-controller.d.ts +2 -0
  45. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  46. package/dist/types/modes/interactive-mode.d.ts +13 -2
  47. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  48. package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
  49. package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
  50. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
  51. package/dist/types/modes/types.d.ts +6 -0
  52. package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
  53. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  54. package/dist/types/runtime/memory-domain.d.ts +9 -0
  55. package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
  56. package/dist/types/runtime/memory-guard.d.ts +39 -0
  57. package/dist/types/runtime/memory-limit.d.ts +11 -0
  58. package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
  59. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
  60. package/dist/types/runtime-mcp/manager.d.ts +9 -1
  61. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
  62. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
  63. package/dist/types/runtime-mcp/redaction.d.ts +2 -0
  64. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  65. package/dist/types/sdk/acp/final-text.d.ts +19 -0
  66. package/dist/types/sdk/acp/mcp.d.ts +23 -0
  67. package/dist/types/sdk/broker/broker.d.ts +2 -0
  68. package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
  69. package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
  70. package/dist/types/sdk/bus/config-commands.d.ts +2 -2
  71. package/dist/types/sdk/bus/config.d.ts +2 -0
  72. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  73. package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
  74. package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
  75. package/dist/types/sdk/bus/index.d.ts +52 -4
  76. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
  77. package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
  78. package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
  79. package/dist/types/sdk/bus/notification-service.d.ts +34 -0
  80. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
  81. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
  82. package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
  83. package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
  84. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
  85. package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
  86. package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
  87. package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
  88. package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
  89. package/dist/types/sdk/client/discovery.d.ts +2 -0
  90. package/dist/types/sdk/client/liveness.d.ts +7 -0
  91. package/dist/types/sdk/host/control/operations.d.ts +3 -2
  92. package/dist/types/sdk/host/host.d.ts +3 -1
  93. package/dist/types/sdk/host/query/handlers.d.ts +14 -0
  94. package/dist/types/sdk/index.d.ts +2 -0
  95. package/dist/types/sdk/lifecycle-session.d.ts +10 -1
  96. package/dist/types/sdk/prompt-status.d.ts +88 -0
  97. package/dist/types/sdk/session-directory.d.ts +1 -1
  98. package/dist/types/sdk/session.d.ts +7 -0
  99. package/dist/types/sdk/startup-capability.d.ts +9 -0
  100. package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
  101. package/dist/types/sdk/transport/index.d.ts +12 -0
  102. package/dist/types/sdk/transport/relay.d.ts +43 -0
  103. package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
  104. package/dist/types/sdk/transport/socket.d.ts +7 -0
  105. package/dist/types/sdk/transport/stdio.d.ts +3 -0
  106. package/dist/types/session/agent-session.d.ts +83 -24
  107. package/dist/types/session/btw-contract.d.ts +16 -0
  108. package/dist/types/session/fallback-chain-controller.d.ts +18 -2
  109. package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
  110. package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
  111. package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
  112. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  113. package/dist/types/session/session-manager.d.ts +89 -18
  114. package/dist/types/session/session-storage.d.ts +31 -0
  115. package/dist/types/session/streaming-output.d.ts +60 -5
  116. package/dist/types/setup/credential-import.d.ts +5 -1
  117. package/dist/types/setup/provider-onboarding.d.ts +2 -0
  118. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
  119. package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
  120. package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
  121. package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
  122. package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
  123. package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
  124. package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
  125. package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
  126. package/dist/types/skc-runtime/state-writer.d.ts +5 -1
  127. package/dist/types/skc-runtime/team-launch.d.ts +1 -1
  128. package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
  129. package/dist/types/skc-runtime/team-store.d.ts +12 -0
  130. package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
  131. package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
  132. package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
  133. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
  134. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
  135. package/dist/types/skill-state/workflow-hud.d.ts +3 -0
  136. package/dist/types/ssh/utils.d.ts +1 -0
  137. package/dist/types/task/discovery.d.ts +3 -1
  138. package/dist/types/task/executor.d.ts +6 -0
  139. package/dist/types/task/index.d.ts +3 -1
  140. package/dist/types/task/provider-retry-status.d.ts +13 -0
  141. package/dist/types/task/receipt.d.ts +2 -0
  142. package/dist/types/task/types.d.ts +133 -0
  143. package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
  144. package/dist/types/tools/browser/launch.d.ts +7 -0
  145. package/dist/types/tools/fetch.d.ts +22 -9
  146. package/dist/types/tools/image-gen.d.ts +63 -1
  147. package/dist/types/tools/index.d.ts +7 -1
  148. package/dist/types/tools/output-meta.d.ts +21 -1
  149. package/dist/types/tools/read-internals.d.ts +12 -0
  150. package/dist/types/tools/read.d.ts +45 -1
  151. package/dist/types/tools/resource-gc.d.ts +23 -0
  152. package/dist/types/tools/skill-discovery.d.ts +7 -0
  153. package/dist/types/tools/sqlite-reader.d.ts +7 -0
  154. package/dist/types/tools/tool-result.d.ts +7 -1
  155. package/dist/types/utils/prompt-suggestion.d.ts +33 -0
  156. package/dist/types/utils/shell-snapshot.d.ts +12 -0
  157. package/dist/types/web/insane/bridge.d.ts +1 -0
  158. package/dist/types/web/insane/url-guard.d.ts +17 -0
  159. package/package.json +8 -12
  160. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  161. package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
  162. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  163. package/scripts/compile-args.ts +0 -1
  164. package/scripts/dogfood-repository-binding.ts +209 -0
  165. package/scripts/generate-docs-index.ts +4 -1
  166. package/scripts/generate-sdk-operation-inventory.ts +9 -0
  167. package/scripts/run-test-manifest.ts +6 -4
  168. package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
  169. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  170. package/src/capability/index.ts +58 -42
  171. package/src/capability/types.ts +3 -0
  172. package/src/cli/args.ts +16 -100
  173. package/src/cli/fast-help.ts +1 -1
  174. package/src/cli/mcp-cli.ts +4 -21
  175. package/src/cli/notify-cli.ts +6 -38
  176. package/src/cli/read-cli.ts +2 -1
  177. package/src/cli/setup-cli.ts +10 -4
  178. package/src/cli.ts +133 -11
  179. package/src/commands/daemon.ts +22 -5
  180. package/src/commands/deep-interview.ts +26 -1
  181. package/src/commands/harness.ts +35 -12
  182. package/src/commands/read.ts +11 -2
  183. package/src/commands/sdk.ts +134 -17
  184. package/src/commands/team.ts +1 -1
  185. package/src/commit/agentic/index.ts +3 -3
  186. package/src/commit/map-reduce/index.ts +2 -2
  187. package/src/config/keybindings.ts +158 -25
  188. package/src/config/model-profile-contract.ts +174 -0
  189. package/src/config/model-profiles.ts +51 -10
  190. package/src/config/model-registry.ts +24 -4
  191. package/src/config/model-resolver.ts +2 -2
  192. package/src/config/provider-auth-health.ts +42 -0
  193. package/src/config/provider-ranking.ts +119 -0
  194. package/src/config/settings-schema.ts +157 -10
  195. package/src/config/settings.ts +254 -108
  196. package/src/coordinator-mcp/model-preset.ts +21 -74
  197. package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
  198. package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
  199. package/src/defaults/skc/skills/team/SKILL.md +1 -1
  200. package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
  201. package/src/discovery/ssh.ts +12 -1
  202. package/src/edit/index.ts +3 -6
  203. package/src/edit/modes/patch.ts +38 -1
  204. package/src/edit/modes/replace.ts +42 -0
  205. package/src/edit/path-mutation-lock.ts +112 -0
  206. package/src/eval/js/tool-bridge.ts +1 -1
  207. package/src/eval/py/executor.ts +37 -13
  208. package/src/eval/py/kernel.ts +1 -21
  209. package/src/eval/py/prelude.py +2 -2
  210. package/src/eval/py/runner-artifact.ts +84 -0
  211. package/src/eval/py/tool-bridge.ts +34 -18
  212. package/src/extensibility/extensions/runner.ts +4 -0
  213. package/src/extensibility/extensions/types.ts +42 -4
  214. package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
  215. package/src/extensibility/shared-events.ts +5 -0
  216. package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
  217. package/src/hooks/native-skill-hook.ts +17 -4
  218. package/src/internal-urls/docs-index.generated.ts +17 -16
  219. package/src/internal-urls/local-protocol.ts +87 -25
  220. package/src/internal-urls/local-root-gc.ts +127 -0
  221. package/src/internal-urls/mcp-protocol.ts +73 -11
  222. package/src/main.ts +120 -42
  223. package/src/memories/index.ts +10 -0
  224. package/src/modes/DESIGN.md +52 -0
  225. package/src/modes/acp/acp-agent.ts +647 -83
  226. package/src/modes/acp/acp-event-mapper.ts +106 -12
  227. package/src/modes/acp/acp-mode.ts +39 -3
  228. package/src/modes/action-registry.ts +1 -1
  229. package/src/modes/components/assistant-message.ts +123 -22
  230. package/src/modes/components/btw-panel.ts +82 -16
  231. package/src/modes/components/irc-sidebar.ts +176 -62
  232. package/src/modes/components/model-selector.ts +61 -4
  233. package/src/modes/components/notifications-settings-editor.ts +1 -1
  234. package/src/modes/components/oauth-selector.ts +42 -12
  235. package/src/modes/components/plan-preview-overlay.ts +1 -1
  236. package/src/modes/components/queue-pane.ts +55 -9
  237. package/src/modes/components/queued-message-selector.ts +53 -10
  238. package/src/modes/components/read-tool-group.ts +82 -14
  239. package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
  240. package/src/modes/components/sayknow-pet-widget.ts +27 -8
  241. package/src/modes/components/session-observer-overlay.ts +187 -32
  242. package/src/modes/components/settings-selector.ts +60 -18
  243. package/src/modes/components/tool-execution.ts +138 -27
  244. package/src/modes/components/tool-status-header.ts +26 -8
  245. package/src/modes/components/welcome.ts +50 -23
  246. package/src/modes/controllers/btw-controller.ts +119 -36
  247. package/src/modes/controllers/command-controller.ts +101 -54
  248. package/src/modes/controllers/event-controller.ts +119 -27
  249. package/src/modes/controllers/extension-ui-controller.ts +23 -12
  250. package/src/modes/controllers/input-controller.ts +100 -8
  251. package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
  252. package/src/modes/controllers/selector-controller.ts +4 -1
  253. package/src/modes/interactive-mode.ts +201 -60
  254. package/src/modes/irc-observation-ledger.ts +71 -15
  255. package/src/modes/prompt-action-autocomplete.ts +32 -13
  256. package/src/modes/prompt-suggestion-controller.ts +96 -0
  257. package/src/modes/runtime-init.ts +20 -2
  258. package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
  259. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
  260. package/src/modes/types.ts +6 -0
  261. package/src/modes/utils/hotkeys-markdown.ts +64 -36
  262. package/src/modes/utils/ui-helpers.ts +99 -4
  263. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  264. package/src/prompts/agents/architect.md +17 -3
  265. package/src/prompts/agents/critic.md +17 -2
  266. package/src/prompts/agents/executor.md +1 -1
  267. package/src/prompts/agents/planner.md +8 -1
  268. package/src/prompts/system/btw-user.md +3 -8
  269. package/src/prompts/system/prompt-suggestion-system.md +32 -0
  270. package/src/prompts/system/system-prompt.md +6 -3
  271. package/src/prompts/tools/cron.md +3 -1
  272. package/src/prompts/tools/read.md +4 -2
  273. package/src/prompts/tools/skill-discovery.md +1 -0
  274. package/src/runtime/memory-domain.ts +66 -0
  275. package/src/runtime/memory-guard-contract.ts +73 -0
  276. package/src/runtime/memory-guard.ts +292 -0
  277. package/src/runtime/memory-limit.ts +50 -0
  278. package/src/runtime-mcp/client.ts +41 -55
  279. package/src/runtime-mcp/content-limits.ts +71 -0
  280. package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
  281. package/src/runtime-mcp/json-rpc.ts +28 -11
  282. package/src/runtime-mcp/manager.ts +77 -59
  283. package/src/runtime-mcp/oauth-flow.ts +0 -72
  284. package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
  285. package/src/runtime-mcp/redaction.ts +30 -0
  286. package/src/runtime-mcp/smithery-auth.ts +17 -2
  287. package/src/runtime-mcp/smithery-connect.ts +11 -1
  288. package/src/runtime-mcp/transports/http.ts +63 -22
  289. package/src/sdk/acp/adapter.ts +8 -1
  290. package/src/sdk/acp/final-text.ts +40 -0
  291. package/src/sdk/acp/mcp.ts +26 -0
  292. package/src/sdk/broker/broker.ts +34 -20
  293. package/src/sdk/broker/identity.ts +22 -12
  294. package/src/sdk/broker/lifecycle.ts +293 -43
  295. package/src/sdk/broker/session-index.ts +11 -1
  296. package/src/sdk/bus/chat-daemon-cli.ts +2 -2
  297. package/src/sdk/bus/chat-daemon-control.ts +22 -5
  298. package/src/sdk/bus/config-commands.ts +2 -2
  299. package/src/sdk/bus/config.ts +10 -2
  300. package/src/sdk/bus/control-drain-lease.ts +104 -0
  301. package/src/sdk/bus/conversation-store.ts +40 -6
  302. package/src/sdk/bus/daemon-paths.ts +2 -0
  303. package/src/sdk/bus/index.ts +793 -121
  304. package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
  305. package/src/sdk/bus/lifecycle-commands.ts +63 -10
  306. package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
  307. package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
  308. package/src/sdk/bus/notification-orchestration.ts +12 -0
  309. package/src/sdk/bus/notification-service.ts +87 -25
  310. package/src/sdk/bus/operator-runtime.ts +31 -5
  311. package/src/sdk/bus/prompt-reconciliation.ts +240 -0
  312. package/src/sdk/bus/rate-limit-pool.ts +8 -0
  313. package/src/sdk/bus/recent-activity.ts +90 -26
  314. package/src/sdk/bus/reconciliation-store.ts +224 -0
  315. package/src/sdk/bus/telegram-cli.ts +6 -13
  316. package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
  317. package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
  318. package/src/sdk/bus/telegram-daemon-control.ts +161 -40
  319. package/src/sdk/bus/telegram-daemon.ts +3649 -593
  320. package/src/sdk/bus/telegram-reference.ts +20 -2
  321. package/src/sdk/bus/topic-registry.ts +451 -12
  322. package/src/sdk/cli/session-cli.ts +15 -2
  323. package/src/sdk/client/discovery.ts +19 -3
  324. package/src/sdk/client/liveness.ts +49 -0
  325. package/src/sdk/host/control/dispatch.ts +8 -2
  326. package/src/sdk/host/control/operations.ts +3 -2
  327. package/src/sdk/host/host.ts +27 -9
  328. package/src/sdk/host/query/handlers.ts +125 -5
  329. package/src/sdk/index.ts +12 -0
  330. package/src/sdk/lifecycle-session.ts +19 -3
  331. package/src/sdk/mcp/server.ts +46 -18
  332. package/src/sdk/prompt-status.ts +97 -0
  333. package/src/sdk/protocol/operation-inventory.generated.json +145 -0
  334. package/src/sdk/protocol/operation-registry.ts +24 -4
  335. package/src/sdk/session-directory.ts +5 -1
  336. package/src/sdk/session.ts +69 -8
  337. package/src/sdk/startup-capability.ts +15 -1
  338. package/src/sdk/transport/auth-preface.ts +82 -0
  339. package/src/sdk/transport/index.ts +18 -0
  340. package/src/sdk/transport/relay.ts +252 -0
  341. package/src/sdk/transport/serve-cli.ts +105 -0
  342. package/src/sdk/transport/socket.ts +197 -0
  343. package/src/sdk/transport/stdio.ts +17 -0
  344. package/src/session/agent-session.ts +1112 -314
  345. package/src/session/blob-store.ts +25 -7
  346. package/src/session/btw-contract.ts +59 -0
  347. package/src/session/fallback-chain-controller.ts +47 -8
  348. package/src/session/internal/managed-session-scope.ts +1426 -259
  349. package/src/session/internal/managed-session-storage.ts +414 -238
  350. package/src/session/internal/native-publish-outcome.ts +271 -0
  351. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  352. package/src/session/session-manager.ts +2079 -469
  353. package/src/session/session-storage.ts +151 -11
  354. package/src/session/streaming-output.ts +262 -43
  355. package/src/setup/credential-import.ts +28 -3
  356. package/src/setup/provider-onboarding.ts +49 -5
  357. package/src/setup/provider-presets.json +2 -1
  358. package/src/skc-runtime/deep-interview-runtime.ts +303 -36
  359. package/src/skc-runtime/deep-interview-stage.ts +1016 -0
  360. package/src/skc-runtime/deep-interview-state.ts +8 -5
  361. package/src/skc-runtime/gc-render.ts +1 -0
  362. package/src/skc-runtime/gc-runtime.ts +11 -1
  363. package/src/skc-runtime/linux-proc.ts +70 -36
  364. package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
  365. package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
  366. package/src/skc-runtime/ralplan-runtime.ts +1057 -75
  367. package/src/skc-runtime/repository-binding.ts +267 -0
  368. package/src/skc-runtime/session-state-sidecar.ts +25 -9
  369. package/src/skc-runtime/state-runtime.ts +50 -12
  370. package/src/skc-runtime/state-writer.ts +68 -56
  371. package/src/skc-runtime/team-launch.ts +34 -5
  372. package/src/skc-runtime/team-runtime.ts +41 -1
  373. package/src/skc-runtime/team-store.ts +32 -0
  374. package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
  375. package/src/skc-runtime/team-workers.ts +1 -0
  376. package/src/skc-runtime/tmux-common.ts +13 -2
  377. package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
  378. package/src/skc-runtime/tmux-sessions.ts +45 -6
  379. package/src/skc-runtime/ultragoal-guard.ts +93 -15
  380. package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
  381. package/src/skc-runtime/ultragoal-runtime.ts +469 -38
  382. package/src/skc-runtime/workflow-manifest.generated.json +195 -5
  383. package/src/skc-runtime/workflow-manifest.ts +67 -3
  384. package/src/skill-state/workflow-hud.ts +25 -2
  385. package/src/skill-state/workflow-mutation-guard.ts +104 -12
  386. package/src/slash-commands/builtin-registry.ts +1 -1
  387. package/src/ssh/utils.ts +14 -0
  388. package/src/task/discovery.ts +8 -2
  389. package/src/task/executor.ts +165 -47
  390. package/src/task/index.ts +123 -15
  391. package/src/task/provider-retry-status.ts +88 -0
  392. package/src/task/receipt.ts +3 -0
  393. package/src/task/render.ts +45 -26
  394. package/src/task/skc-command.ts +2 -2
  395. package/src/task/types.ts +55 -10
  396. package/src/task/ultragoal-redteam-activation.ts +75 -0
  397. package/src/tools/ask.ts +1 -1
  398. package/src/tools/ast-edit.ts +2 -2
  399. package/src/tools/bash-allowed-prefixes.ts +45 -1
  400. package/src/tools/bash-pty-selection.ts +2 -2
  401. package/src/tools/browser/launch.ts +41 -6
  402. package/src/tools/browser/screenshot-format.ts +6 -1
  403. package/src/tools/cron.ts +1 -1
  404. package/src/tools/fetch.ts +127 -154
  405. package/src/tools/image-gen.ts +476 -23
  406. package/src/tools/index.ts +7 -1
  407. package/src/tools/output-meta.ts +176 -9
  408. package/src/tools/path-utils.ts +5 -1
  409. package/src/tools/read-internals.ts +44 -0
  410. package/src/tools/read.ts +1544 -310
  411. package/src/tools/resource-gc.ts +665 -125
  412. package/src/tools/skill-discovery.ts +39 -3
  413. package/src/tools/sqlite-reader.ts +63 -5
  414. package/src/tools/subagent-render.ts +74 -16
  415. package/src/tools/subagent.ts +2 -0
  416. package/src/tools/tool-result.ts +14 -1
  417. package/src/utils/edit-mode.ts +2 -2
  418. package/src/utils/pasted-image-path.ts +15 -6
  419. package/src/utils/prompt-suggestion.ts +265 -0
  420. package/src/utils/shell-snapshot.ts +173 -63
  421. package/src/utils/sixel.ts +3 -3
  422. package/src/web/insane/bridge.ts +5 -1
  423. package/src/web/insane/url-guard.ts +140 -27
  424. package/src/web/scrapers/docs-rs.ts +30 -5
  425. package/src/web/scrapers/types.ts +19 -49
  426. package/src/web/scrapers/utils.ts +12 -26
  427. package/src/web/search/providers/codex.ts +1 -1
  428. 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 type EphemeralTurnArgs = (EphemeralTurnBaseArgs & {
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: RecoveryHydrationPromotionFence): Promise<void>;
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(): Array<{
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 are durable or rolled back.
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 are durable or rolled back.
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 against this session's current
1276
- * model + system prompt + history. No tools are used and session history is
1277
- * not modified. Background turns retain the IRC/session behavior used by
1278
- * autoreplies; `/btw` turns use an isolated committed-context policy.
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): Promise<boolean>;
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 when credential rotation permits a retry.
51
- * The chain-wide budget and failure history remain charged.
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): import("./managed-session-storage").ManagedDirectoryRoot;
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
- export declare function resolveManagedScope(input: {
110
+ interface ManagedScopeInput {
90
111
  cwd: string;
91
112
  agentDir: string;
92
113
  sessionsRoot: string;
93
- }): ManagedScopeResolution;
94
- export declare function ensureManagedScope(scope: ManagedScope): Promise<ManagedScopeResolution>;
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 = 10000;
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 type ManagedStorageFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "durability_failed" | "migration_retired" | "managed_storage_unsupported";
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): void;
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 {};