@sayknow-cli/coding-agent 0.4.7 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CHANGELOG.md +97 -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 +20 -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
@@ -0,0 +1,69 @@
1
+ import type { RecoveryFsRoot } from "@sayknow-cli/natives";
2
+ import type { RecoveryHydrationContext, ResumeSessionIdentity, SessionDestinationInput, SessionManager, SessionManagerCheckpointRevisionStrings, StrictSessionOpenFailure } from "./session-manager";
3
+ export interface MemoryGuardTranscriptDescriptorV1 {
4
+ bytes: string;
5
+ relative_path: string;
6
+ sha256: string;
7
+ }
8
+ export interface MemoryGuardCheckpointBlobAuthorityV1 {
9
+ kind: "checkpoint_blob_tree_v1";
10
+ manifest_relative_path: string;
11
+ manifest_sha256: string;
12
+ root_relative_path: string;
13
+ }
14
+ export interface MemoryGuardCheckpointBlobManifestEntryV1 {
15
+ bytes: string;
16
+ relative_path: string;
17
+ sha256: string;
18
+ }
19
+ export interface MemoryGuardCheckpointBlobManifestV1 {
20
+ entries: MemoryGuardCheckpointBlobManifestEntryV1[];
21
+ schema_version: 1;
22
+ }
23
+ export interface MemoryGuardSessionManagerCheckpointV1 {
24
+ blob_authority: MemoryGuardCheckpointBlobAuthorityV1;
25
+ revisions: SessionManagerCheckpointRevisionStrings;
26
+ schema_version: 1;
27
+ session_id: string;
28
+ session_name: string | null;
29
+ transcript: MemoryGuardTranscriptDescriptorV1;
30
+ }
31
+ export interface MemoryGuardParticipantDescriptorV1 {
32
+ ordinal: number;
33
+ checkpoint: MemoryGuardCheckpointBlobAuthorityV1;
34
+ revisions: SessionManagerCheckpointRevisionStrings;
35
+ session_id: string;
36
+ session_name: string | null;
37
+ transcript: MemoryGuardTranscriptDescriptorV1;
38
+ }
39
+ export interface MemoryGuardParticipantIngressLease {
40
+ readonly token: symbol;
41
+ release(): void;
42
+ }
43
+ export interface MemoryGuardCreateCheckpointInput {
44
+ ingressLease: MemoryGuardParticipantIngressLease;
45
+ checkpointRoot: string;
46
+ }
47
+ export type MemoryGuardRestoreBlockedReason = StrictSessionOpenFailure["reason"] | "checkpoint-mismatch" | "participant-mismatch" | "transcript-mismatch" | "blob-manifest-mismatch" | "blob-missing" | "blob-hash-mismatch" | "blob-authority-mismatch" | "destination-unavailable";
48
+ export interface MemoryGuardRestoreInput {
49
+ incidentAuthority: RecoveryFsRoot;
50
+ participant: MemoryGuardParticipantDescriptorV1;
51
+ checkpoint: MemoryGuardSessionManagerCheckpointV1;
52
+ destination: SessionDestinationInput;
53
+ }
54
+ export type MemoryGuardRestoreResult = {
55
+ kind: "staged";
56
+ manager: SessionManager;
57
+ hydrationContext: RecoveryHydrationContext;
58
+ transcriptIdentity: ResumeSessionIdentity;
59
+ cleanup: () => Promise<void>;
60
+ } | {
61
+ kind: "blocked";
62
+ reason: MemoryGuardRestoreBlockedReason;
63
+ };
64
+ export declare function memoryGuardCanonicalJson(value: unknown): string;
65
+ export declare function memoryGuardSha256Hex(value: Uint8Array | string): string;
66
+ export declare function isMemoryGuardDecimalString(value: unknown): value is string;
67
+ export declare function isMemoryGuardSha256Hex(value: unknown): value is string;
68
+ export declare function isMemoryGuardRelativePath(value: unknown): value is string;
69
+ export declare function hasOnlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean;
@@ -8,6 +8,7 @@ import { ArtifactManager } from "./artifacts";
8
8
  import { type BlobPutResult, BlobStore } from "./blob-store";
9
9
  import { type ManagedMigrationPolicy } from "./internal/managed-session-scope";
10
10
  import { type ManagedDirectoryRoot, ManagedSessionDescendantStore } from "./internal/managed-session-storage";
11
+ import { type MemoryGuardCreateCheckpointInput, type MemoryGuardParticipantIngressLease, type MemoryGuardRestoreInput, type MemoryGuardRestoreResult, type MemoryGuardSessionManagerCheckpointV1 } from "./memory-guard-checkpoint-participant";
11
12
  import { type BashExecutionMessage, type CustomMessage, type FileMentionMessage, type HookMessage, type PythonExecutionMessage } from "./messages";
12
13
  import { type SessionManagerReadAccess, sessionManagerReadCapability } from "./session-manager-internal";
13
14
  import type { ManagedSessionSecurityContext, SessionStorage, SessionStorageStat, VerifiedSessionDeleteResult, VerifiedSessionDeleteTarget } from "./session-storage";
@@ -27,6 +28,13 @@ export interface NewSessionOptions {
27
28
  /** Skip flushing the current session and delete it instead of saving. */
28
29
  drop?: boolean;
29
30
  }
31
+ /** Internal successor prepared without changing the manager's visible identity. */
32
+ export interface PreparedNewSession {
33
+ readonly sessionId: string;
34
+ readonly sessionFile: string | undefined;
35
+ readonly artifactsDir: string | null;
36
+ readonly managedLegacyLocalMigrationSource: ManagedLegacyLocalMigrationSource | null;
37
+ }
30
38
  export interface SessionEntryBase {
31
39
  type: string;
32
40
  id: string;
@@ -252,6 +260,21 @@ export type DefaultModelSelectionStage = {
252
260
  readonly tempPath: string | undefined;
253
261
  readonly persistsToExistingFile: boolean;
254
262
  };
263
+ export interface SessionManagerRevisionSnapshot {
264
+ entry: number;
265
+ leaf: number;
266
+ headerExport: number;
267
+ label: number;
268
+ replayMetadata: number;
269
+ }
270
+ export interface SessionManagerCheckpointRevisionStrings {
271
+ entry: string;
272
+ leaf: string;
273
+ headerExport: string;
274
+ label: string;
275
+ replayMetadata: string;
276
+ }
277
+ export declare function toSessionManagerCheckpointRevisionStrings(snapshot: SessionManagerRevisionSnapshot): SessionManagerCheckpointRevisionStrings;
255
278
  export type DefaultModelSelectionPromotion = {
256
279
  readonly kind: "promoted";
257
280
  } | {
@@ -327,6 +350,9 @@ export declare class SessionMigrationPolicyError extends Error {
327
350
  readonly code = "legacy_migration_disabled";
328
351
  constructor();
329
352
  }
353
+ export declare class SessionArtifactCapacityError extends Error {
354
+ constructor(message: string);
355
+ }
330
356
  export type ResumeTailInspection = ResumeTailResumable | ResumeTailTerminal | ResumeTailError;
331
357
  export interface StrictSessionOpenSuccess {
332
358
  kind: "opened";
@@ -334,7 +360,8 @@ export interface StrictSessionOpenSuccess {
334
360
  }
335
361
  export interface StrictSessionOpenFailure {
336
362
  kind: "error";
337
- reason: ResumeTailError["reason"] | "identity-mismatch" | "migration-required";
363
+ reason: ResumeTailError["reason"] | "identity-mismatch" | "migration-required" | "artifact_capacity_exceeded";
364
+ message?: string;
338
365
  }
339
366
  /** Exact transcript bytes and authority captured from one descriptor-bound read. */
340
367
  export interface CapturedSessionTranscriptSnapshot {
@@ -530,6 +557,10 @@ export declare function residentBlobSentinelForTests(kind: ResidentBlobKind, ref
530
557
  export declare function materializeResidentEntriesForPersistenceForTests<T>(entries: T[], textStore: BlobStore, imageStore?: BlobStore): T[];
531
558
  /** Get recent sessions for display in welcome screen */
532
559
  export declare function getRecentSessions(sessionDir: string, limit?: number, storage?: SessionStorage): Promise<RecentSessionInfo[]>;
560
+ export declare function getRecentSessionDisplay(sessions: readonly SessionInfo[], limit?: number): Array<{
561
+ name: string;
562
+ timeAgo: string;
563
+ }>;
533
564
  /**
534
565
  * Manages conversation sessions as append-only trees stored in JSONL files.
535
566
  *
@@ -553,7 +584,7 @@ export interface ResolvedSessionMatch {
553
584
  session: SessionInfo;
554
585
  scope: "local" | "global";
555
586
  }
556
- export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<ResolvedSessionMatch | undefined>;
587
+ export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage, managedAgentDir?: string): Promise<ResolvedSessionMatch | undefined>;
557
588
  interface SessionManagerStateSnapshot {
558
589
  sessionId: string;
559
590
  sessionName: string | undefined;
@@ -578,13 +609,7 @@ export declare class SessionManager {
578
609
  * revision contract). Tests assert the invalidation mapping through this;
579
610
  * future export/label-view caches key off their respective domains.
580
611
  */
581
- revisionSnapshot(): {
582
- entry: number;
583
- leaf: number;
584
- headerExport: number;
585
- label: number;
586
- replayMetadata: number;
587
- };
612
+ revisionSnapshot(): SessionManagerRevisionSnapshot;
588
613
  /** Puts a binary blob into the blob store and returns the blob reference */
589
614
  putBlob(data: Buffer): Promise<BlobPutResult>;
590
615
  captureState(): SessionManagerStateSnapshot;
@@ -593,6 +618,33 @@ export declare class SessionManager {
593
618
  setSessionFile(sessionFile: string): Promise<void>;
594
619
  /** Start a new session. Closes any existing writer first. */
595
620
  newSession(options?: NewSessionOptions): Promise<string | undefined>;
621
+ /**
622
+ * Allocate a fresh successor without publishing it through the manager's public
623
+ * getters. The returned authority is deliberately immutable so readiness work
624
+ * can resolve local:// against the successor while the predecessor stays live.
625
+ * @internal
626
+ */
627
+ prepareNewSession(options?: NewSessionOptions): Promise<PreparedNewSession>;
628
+ /** Append a model selection to an unpublished successor. @internal */
629
+ appendPreparedModelChange(prepared: PreparedNewSession, model: string): string;
630
+ /** Append a thinking-level selection to an unpublished successor. @internal */
631
+ appendPreparedThinkingLevelChange(prepared: PreparedNewSession, thinkingLevel?: string): string;
632
+ /** Append a service-tier selection to an unpublished successor. @internal */
633
+ appendPreparedServiceTierChange(prepared: PreparedNewSession, serviceTier: ServiceTier | null): string;
634
+ /** Append a displayable custom message to an unpublished successor. @internal */
635
+ appendPreparedCustomMessageEntry<T = unknown>(prepared: PreparedNewSession, customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details?: T, attribution?: MessageAttribution): string;
636
+ /** Persist an unpublished successor without adopting it. @internal */
637
+ ensurePreparedNewSessionOnDisk(prepared: PreparedNewSession): Promise<void>;
638
+ /** Build context from an unpublished successor without reading active manager state. @internal */
639
+ buildPreparedNewSessionContext(prepared: PreparedNewSession): SessionContext;
640
+ /** Prepare a forked successor without publishing it through public manager state. @internal */
641
+ prepareFork(): Promise<PreparedNewSession | undefined>;
642
+ /** Prepare a path-only branch successor without publishing it through public manager state. @internal */
643
+ prepareBranchedSession(leafId: string): Promise<PreparedNewSession>;
644
+ /** Publish a prepared successor synchronously after all readiness awaits succeed. @internal */
645
+ commitPreparedNewSession(prepared: PreparedNewSession): void;
646
+ /** Exact-discard only an uncommitted successor prepared by this manager. @internal */
647
+ discardPreparedNewSession(prepared: PreparedNewSession): Promise<void>;
596
648
  /** Tombstone and exact-delete managed transcripts, detaching the active transcript first. */
597
649
  dropSession(sessionPath: string): Promise<void>;
598
650
  /**
@@ -649,8 +701,12 @@ export declare class SessionManager {
649
701
  /** Get usage statistics across all assistant messages in the session. */
650
702
  getUsageStatistics(): UsageStatistics;
651
703
  getSessionDir(): string;
704
+ /** Lists picker candidates within this manager's captured destination authority. */
705
+ listForResumePickerReadOnly(): Promise<SessionInfo[]>;
652
706
  getSessionId(): string;
653
707
  getSessionFile(): string | undefined;
708
+ acquireMemoryGuardParticipantIngressLease(): MemoryGuardParticipantIngressLease;
709
+ createMemoryGuardCheckpoint(input: MemoryGuardCreateCheckpointInput): Promise<MemoryGuardSessionManagerCheckpointV1>;
654
710
  /**
655
711
  * Returns the session artifacts directory path (session file path without .jsonl).
656
712
  * Returns null when the session is not persisted to a file.
@@ -707,11 +763,6 @@ export declare class SessionManager {
707
763
  /** The source that set the session name: "user" (manual /rename or RPC) or "auto" (generated title). */
708
764
  get titleSource(): "auto" | "user" | undefined;
709
765
  getSessionName(): string | undefined;
710
- /**
711
- * Set the session display name.
712
- * @param source - "user" for explicit renames (/rename command, RPC); "auto" for generated titles.
713
- * Auto-generated titles are silently ignored when the user has already set a name.
714
- */
715
766
  setSessionName(name: string, source?: "auto" | "user"): Promise<boolean>;
716
767
  _persist(entry: SessionEntry): void;
717
768
  /** Append a configured fallback chain as child of current leaf, then advance leaf. Returns entry id. */
@@ -901,8 +952,12 @@ export declare class SessionManager {
901
952
  static managedDestination(cwd: string, agentDir?: string, storage?: SessionStorage): SessionDestination;
902
953
  static explicitDestination(directory: string): SessionDestination;
903
954
  static create(cwd: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage): SessionManager;
955
+ /** Prepare a selected candidate using this manager's captured managed destination authority. */
956
+ prepareManagedCandidateForWrite(filePath: string, migrationPolicy: SessionDirectoryMigrationPolicy, expectedIdentity?: ResumeSessionIdentity): Promise<string>;
957
+ /** Prepare a managed candidate and retain its exact post-preparation identity for the next adoption. */
958
+ prepareManagedCandidateForStrictAdoption(filePath: string, migrationPolicy: SessionDirectoryMigrationPolicy, expectedIdentity: ResumeSessionIdentity): Promise<string>;
904
959
  /** Resolve a default-managed candidate through binding validation and copy-retain migration before mutation. */
905
- static prepareManagedCandidateForWrite(filePath: string, migrationPolicy: SessionDirectoryMigrationPolicy): Promise<string>;
960
+ static prepareManagedCandidateForWrite(filePath: string, migrationPolicy: SessionDirectoryMigrationPolicy, destination: SessionDestination, expectedIdentity?: ResumeSessionIdentity): Promise<string>;
906
961
  /**
907
962
  * Fork a session into the current project directory.
908
963
  * Copies history from another session file while creating a new session file in the current sessionDir.
@@ -916,10 +971,18 @@ export declare class SessionManager {
916
971
  static open(filePath: string, destinationInput?: SessionDestinationInput, storage?: SessionStorage, migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<SessionManager>;
917
972
  static openNestedManaged(filePath: string, destination: SessionDestination, store: ManagedSessionDescendantStore, storage?: SessionStorage): Promise<SessionManager>;
918
973
  /**
919
- * List sessions for the resume picker without recovery or other maintenance writes.
974
+ * List default-managed sessions for the resume picker without recovery or other
975
+ * maintenance writes. This is the only picker inventory that includes legacy
976
+ * sibling directories.
977
+ */
978
+ static listManagedForResumePickerReadOnly(cwd: string, managedAgentDir?: string, storage?: SessionStorage): Promise<SessionInfo[]>;
979
+ /**
980
+ * List sessions from an explicitly supplied picker directory without recovery
981
+ * or other maintenance writes. Unlike managed inventory, this never scans
982
+ * legacy sibling directories.
920
983
  */
921
984
  static listForResumePickerReadOnly(cwd: string, sessionDir?: string, storage?: SessionStorage): Promise<SessionInfo[]>;
922
- /** Tombstone and exact-delete a default-managed candidate. */
985
+ /** Delete an authorized managed or project-local picker candidate. */
923
986
  static deleteManagedCandidate(sessionPath: string): Promise<void>;
924
987
  /** Capture exact source content for a strict fork without granting write ownership. */
925
988
  static captureTranscriptStrict(filePath: string, storage?: SessionStorage): StrictSessionCaptureResult;
@@ -929,6 +992,7 @@ export declare class SessionManager {
929
992
  * persistence; destination history always comes from the captured bytes.
930
993
  */
931
994
  static forkFromCaptured(snapshot: CapturedSessionTranscriptSnapshot, cwd: string, destinationInput?: SessionDestinationInput, _migrationPolicy?: SessionDirectoryMigrationPolicy): Promise<StrictSessionForkResult>;
995
+ static restoreMemoryGuardCheckpoint(input: MemoryGuardRestoreInput): Promise<MemoryGuardRestoreResult>;
932
996
  /** Inspect a selected session without acquiring write-capable ownership. */
933
997
  static inspectSessionTailReadOnly(filePath: string, storage?: SessionStorage): Promise<ResumeTailInspection>;
934
998
  /**
@@ -966,7 +1030,13 @@ export declare class SessionManager {
966
1030
  /**
967
1031
  * List all sessions across all project directories.
968
1032
  */
969
- static listAll(storage?: SessionStorage): Promise<SessionInfo[]>;
1033
+ static listAll(storage?: SessionStorage, managedAgentDir?: string): Promise<SessionInfo[]>;
1034
+ /**
1035
+ * Strict inventory bound to this manager's captured session authority. Managed
1036
+ * managers include authorized legacy and current candidates; explicit managers
1037
+ * authorize only their exact directory.
1038
+ */
1039
+ inventorySessionsStrict(): StrictInventoryResult;
970
1040
  /**
971
1041
  * Strict raw scoped inventory for ACP authorization. Enumerates the scoped
972
1042
  * session directory without suppressing any root/scan/lstat/read/parse/stat/
@@ -977,6 +1047,7 @@ export declare class SessionManager {
977
1047
  static inventorySessionsStrict(cwd: string, options?: {
978
1048
  sessionDir?: string;
979
1049
  storage?: SessionStorage;
1050
+ destination?: SessionDestination;
980
1051
  }): StrictInventoryResult;
981
1052
  /**
982
1053
  * Propagate the storage-layer verified hard delete bound to exact identity evidence.
@@ -112,6 +112,11 @@ export interface SessionStorage {
112
112
  readSnapshotSync?(path: string): SessionStorageSnapshot;
113
113
  statSync(path: string): SessionStorageStat;
114
114
  listFilesSync(dir: string, pattern: string): string[];
115
+ /** List matching files with mtimes without issuing one JavaScript stat call per path. */
116
+ listFilesByMtime?(dir: string, pattern: string): Promise<Array<{
117
+ path: string;
118
+ mtimeMs: number;
119
+ }>>;
115
120
  /**
116
121
  * Strict directory scan that never suppresses scan/root errors. Used by strict
117
122
  * authorization inventory; the forgiving {@link listFilesSync} stays display-only.
@@ -184,6 +189,18 @@ export interface VerifiedSessionDeleteTarget {
184
189
  detachedArtifactsPath?: string;
185
190
  /** Identity-bound quarantine path retained when transcript unlink deferred cleanup. */
186
191
  detachedTranscriptPath?: string;
192
+ /** Native-retained publisher successor observed during transcript cleanup. */
193
+ retainedTranscriptSuccessorPath?: string;
194
+ /** Native-retained exchange placeholder observed during transcript cleanup. */
195
+ retainedTranscriptPlaceholderPath?: string;
196
+ /** Native-retained transcript entry whose identity could not be verified. */
197
+ retainedTranscriptUnknownPath?: string;
198
+ /** Native-retained publisher successor observed during cleanup. */
199
+ retainedArtifactsSuccessorPath?: string;
200
+ /** Native-retained exchange placeholder observed during cleanup. */
201
+ retainedArtifactsPlaceholderPath?: string;
202
+ /** Native-retained entry whose identity could not be verified. */
203
+ retainedArtifactsUnknownPath?: string;
187
204
  /** Caller-published, no-replace quarantine pathname for the next artifact detach. */
188
205
  plannedArtifactsPath?: string;
189
206
  /** Caller-published, no-replace quarantine pathname for the next transcript detach. */
@@ -215,6 +232,9 @@ export type VerifiedSessionDeleteResult = {
215
232
  artifactsTree: NativeDirectoryTreeSnapshot;
216
233
  /** Transcript identity (unchanged) for retry binding. */
217
234
  transcriptIdentity: SessionStorageFileIdentity;
235
+ retainedSuccessorPath?: string;
236
+ retainedPlaceholderPath?: string;
237
+ retainedUnknownPath?: string;
218
238
  } | {
219
239
  kind: "cleanup_pending";
220
240
  phase: "transcript";
@@ -223,6 +243,9 @@ export type VerifiedSessionDeleteResult = {
223
243
  transcriptIdentity: SessionStorageFileIdentity;
224
244
  /** Optional identity-bound transcript quarantine path for restart cleanup. */
225
245
  detachedTranscriptPath?: string;
246
+ retainedSuccessorPath?: string;
247
+ retainedPlaceholderPath?: string;
248
+ retainedUnknownPath?: string;
226
249
  };
227
250
  type NativeDirectoryTreeEntry = {
228
251
  relativePath: string;
@@ -249,6 +272,10 @@ export declare class FileSessionStorage implements SessionStorage {
249
272
  readSnapshotSync(fpath: string): SessionStorageSnapshot;
250
273
  statSync(path: string): SessionStorageStat;
251
274
  listFilesSync(dir: string, pattern: string): string[];
275
+ listFilesByMtime(dir: string, pattern: string): Promise<Array<{
276
+ path: string;
277
+ mtimeMs: number;
278
+ }>>;
252
279
  listFilesStrictSync(dir: string, pattern: string): string[];
253
280
  exists(path: string): Promise<boolean>;
254
281
  readText(path: string): Promise<string>;
@@ -281,6 +308,10 @@ export declare class MemorySessionStorage implements SessionStorage {
281
308
  readSnapshotSync(path: string): SessionStorageSnapshot;
282
309
  statSync(path: string): SessionStorageStat;
283
310
  listFilesSync(dir: string, pattern: string): string[];
311
+ listFilesByMtime(dir: string, pattern: string): Promise<Array<{
312
+ path: string;
313
+ mtimeMs: number;
314
+ }>>;
284
315
  listFilesStrictSync(dir: string, pattern: string): string[];
285
316
  exists(path: string): Promise<boolean>;
286
317
  readText(path: string): Promise<string>;
@@ -83,7 +83,10 @@ export interface TruncationResult {
83
83
  elidedLines?: number;
84
84
  lastLinePartial?: boolean;
85
85
  firstLineExceedsLimit?: boolean;
86
+ lastLineExceedsLimit?: boolean;
86
87
  }
88
+ /** Direction vocabulary used by callers that select which end of content to retain. */
89
+ export type TruncationDirection = "head" | "last" | "both";
87
90
  export interface TruncationOptions {
88
91
  /** Maximum number of lines (default: 3000) */
89
92
  maxLines?: number;
@@ -99,6 +102,8 @@ export interface TruncationOptions {
99
102
  * window receives `maxLines - maxHeadLines`. Default `floor(maxLines/2)`.
100
103
  */
101
104
  maxHeadLines?: number;
105
+ /** Direction to dispatch through truncateContent (head, last, or both). */
106
+ direction?: TruncationDirection;
102
107
  }
103
108
  /** Result from byte-level truncation helpers. */
104
109
  export interface ByteTruncationResult {
@@ -155,14 +160,64 @@ export declare function truncateTail(content: string, options?: TruncationOption
155
160
  */
156
161
  export declare function formatMiddleElisionMarker(elidedLines: number, elidedBytes: number): string;
157
162
  /**
158
- * Truncate content keeping a head window and a tail window, eliding the middle.
163
+ * A retained source segment returned by {@link truncateMiddleWindows}.
164
+ * Line coordinates are 1-indexed and inclusive.
165
+ */
166
+ export type ReadSegment = {
167
+ kind: "lines";
168
+ content: string;
169
+ lines: number;
170
+ bytes: number;
171
+ origin: {
172
+ startLine: number;
173
+ endLine: number;
174
+ };
175
+ lastLinePartial: false;
176
+ } | {
177
+ kind: "partial-line";
178
+ content: string;
179
+ lines: 1;
180
+ bytes: number;
181
+ origin: {
182
+ startLine: number;
183
+ endLine: number;
184
+ };
185
+ sourceLineBytes: number;
186
+ lastLinePartial: true;
187
+ };
188
+ /** The actual windows retained by middle truncation. */
189
+ export interface ReadWindow {
190
+ kind: "full" | "head-only" | "tail-only" | "middle";
191
+ head?: ReadSegment;
192
+ tail?: ReadSegment;
193
+ overlap: "disjoint" | "adjacent" | "overlapping";
194
+ elidedLines: number;
195
+ elidedBytes: number;
196
+ totalLines: number;
197
+ totalBytes: number;
198
+ /** @deprecated Non-enumerable compatibility reason for older consumers. */
199
+ truncatedBy?: "lines" | "bytes" | "middle";
200
+ }
201
+ /**
202
+ * Truncate content while exposing the exact retained head/tail windows.
159
203
  *
160
- * The combined output is `<head>\n<marker>\n<tail>` when truncation is needed.
161
- * `maxHeadBytes` defaults to `floor(maxBytes / 2)`; the tail receives the
162
- * remainder. Falls back to `truncateTail` / `truncateHead` if either side's
163
- * budget is empty or the content already fits.
204
+ * The budget split and fallback ordering intentionally mirror truncateMiddle.
205
+ * The overlap classification is performed before resolving an overlap to a
206
+ * full window, so callers can distinguish disjoint, adjacent and overlapping
207
+ * candidate windows even when no marker is needed.
208
+ */
209
+ export declare function truncateMiddleWindows(content: string, options?: TruncationOptions): ReadWindow;
210
+ /**
211
+ * Truncate content keeping a head window and a tail window, eliding the middle.
212
+ * The composed return shape remains field-for-field compatible with the
213
+ * historical implementation; callers that need coordinates use
214
+ * truncateMiddleWindows directly.
164
215
  */
165
216
  export declare function truncateMiddle(content: string, options?: TruncationOptions): TruncationResult;
217
+ /**
218
+ * Dispatch truncation using the caller-facing direction vocabulary.
219
+ */
220
+ export declare function truncateContent(content: string, options?: TruncationOptions): TruncationResult;
166
221
  export declare class TailBuffer {
167
222
  #private;
168
223
  readonly maxBytes: number;
@@ -73,7 +73,11 @@ export declare function discoverExternalCredentials(options?: DiscoveryOptions):
73
73
  export declare function formatCredentialSummary(credential: ImportableCredential): string;
74
74
  /** Redacted summary lines for an entire discovery result. Never includes secrets. */
75
75
  export declare function formatDiscoverySummary(result: CredentialDiscoveryResult): string[];
76
- export declare function isAutoImportOAuthCredential(credential: ImportableCredential): boolean;
76
+ /** Reason shown when automatic OAuth import rejects an unusable discovery record. */
77
+ export declare const INVALID_AUTO_IMPORT_OAUTH_EXPIRY_REASON = "OAuth credential has no valid future expiry";
78
+ export declare function isAutoImportOAuthCredential(credential: ImportableCredential, now?: number): boolean;
79
+ /** Keep rejected OAuth discoveries visible to operators without offering them for automatic import. */
80
+ export declare function getAutoImportOAuthCredentialSkips(credentials: readonly ImportableCredential[], now?: number): SkippedCredential[];
77
81
  export declare function filterAutoImportOAuthCredentials(credentials: readonly ImportableCredential[]): ImportableCredential[];
78
82
  /**
79
83
  * Persist discovered credentials via `upsert`. Each credential is imported
@@ -37,6 +37,7 @@ interface ProviderPreset {
37
37
  baseUrl: string;
38
38
  apiKeyEnv: string;
39
39
  models: readonly string[];
40
+ modelApi?: Readonly<Record<string, ProviderSetupApi>>;
40
41
  compat?: ProviderCompatConfig;
41
42
  }
42
43
  export declare const PROVIDER_PRESETS: readonly ProviderPreset[];
@@ -47,6 +48,7 @@ export declare function findProviderPreset(value: string | undefined): ProviderP
47
48
  export declare function formatProviderPresetList(): string;
48
49
  export declare function parseModelList(values: readonly string[]): string[];
49
50
  export declare function redactSecret(secret: string): string;
51
+ export declare function validateModelApi(modelApi: Readonly<Record<string, string>> | undefined, models: readonly string[], presetId: string): void;
50
52
  export declare function addApiCompatibleProvider(input: ProviderSetupInput): Promise<ProviderSetupResult>;
51
53
  export declare function formatProviderSetupResult(result: ProviderSetupResult): string;
52
54
  export {};
@@ -4,7 +4,7 @@ export * from "./deep-interview-recorder";
4
4
  *
5
5
  * The CLI itself does not run the Socratic interview; that lives inside the `/skill:deep-interview`
6
6
  * skill executed by the agent. This handler validates the documented argument-hint surface
7
- * (`[--quick|--standard|--deep] <idea>`), seeds `.skc/state/deep-interview-state.json`, and
7
+ * (`[--trace] [--quick|--standard|--deep] <idea>`), seeds `.skc/state/deep-interview-state.json`, and
8
8
  * updates the shared HUD rail via `syncSkillActiveState` so the active interview is visible to
9
9
  * the TUI.
10
10
  */
@@ -0,0 +1,37 @@
1
+ import { CommandError } from "./workflow-cli-common";
2
+ export declare const DEEP_INTERVIEW_STAGE_TRANSITIONS: readonly ["initialize-context", "record-round", "update-facts", "merge-state"];
3
+ export type DeepInterviewStageTransition = (typeof DEEP_INTERVIEW_STAGE_TRANSITIONS)[number];
4
+ declare const DRAFT_VERSION = 1;
5
+ export type DeepInterviewStageErrorCode = "DI_STAGE_USAGE" | "DI_STAGE_INPUT_INVALID" | "DI_STAGE_SESSION_REQUIRED" | "DI_STAGE_DRAFT_EXISTS" | "DI_STAGE_NO_DRAFT" | "DI_STAGE_DRAFT_CORRUPT" | "DI_STAGE_STATE_MISSING" | "DI_STAGE_STATE_CORRUPT" | "DI_STAGE_REVISION_CONFLICT" | "DI_STAGE_MERGE_REJECTED";
6
+ export declare class DeepInterviewStageError extends CommandError {
7
+ readonly code: DeepInterviewStageErrorCode;
8
+ readonly recovery?: string | undefined;
9
+ constructor(code: DeepInterviewStageErrorCode, message: string, recovery?: string | undefined);
10
+ }
11
+ export interface DeepInterviewStageDraft {
12
+ version: typeof DRAFT_VERSION;
13
+ draft_id: string;
14
+ session_id: string;
15
+ transition: DeepInterviewStageTransition;
16
+ /** State revision the draft was staged against; `apply` CAS-checks this. */
17
+ staged_against_revision: number;
18
+ /**
19
+ * Canonical content SHA-256 of the state the draft was staged against. Revision
20
+ * alone cannot catch sanctioned writers that do not bump `state_revision`
21
+ * (seed/spec-persistence), so `apply` requires BOTH to match.
22
+ */
23
+ staged_against_sha256: string;
24
+ payload: Record<string, unknown>;
25
+ created_at: string;
26
+ }
27
+ export interface DeepInterviewStageCommandResult {
28
+ status: number;
29
+ stdout?: string;
30
+ stderr?: string;
31
+ }
32
+ export declare function deepInterviewDraftPath(cwd: string, sessionId: string): string;
33
+ export declare const DEEP_INTERVIEW_STAGE_VERBS: readonly ["stage", "check", "apply", "discard", "read", "write", "clear", "handoff"];
34
+ export type DeepInterviewStageVerb = (typeof DEEP_INTERVIEW_STAGE_VERBS)[number];
35
+ export declare function isDeepInterviewStageVerb(value: string | undefined): value is DeepInterviewStageVerb;
36
+ export declare function runDeepInterviewStageCommand(verb: DeepInterviewStageVerb, args: readonly string[], cwd?: string): Promise<DeepInterviewStageCommandResult>;
37
+ export {};
@@ -12,7 +12,7 @@
12
12
  * error all mean KEEP — a live process is never signalled or killed.
13
13
  * - Dry-run by default: nothing is deleted unless `--prune`/`--force`.
14
14
  */
15
- export type GcStore = "harness_leases" | "team_workers" | "file_locks" | "tmux_sessions" | "registry_entries";
15
+ export type GcStore = "harness_leases" | "team_workers" | "file_locks" | "tmux_sessions" | "registry_entries" | "local_roots";
16
16
  export declare const GC_STORES: readonly GcStore[];
17
17
  /** Why a probed pid is kept instead of treated as dead. */
18
18
  export type GcPidKeepReason = "alive" | "eperm" | "unknown";
@@ -1,29 +1,37 @@
1
1
  /**
2
- * Shared helpers for reading Linux `/proc/<pid>/stat` process start time.
2
+ * Shared helpers for reading Linux `/proc/<pid>/stat` process identity fields.
3
3
  *
4
4
  * The `comm` field (field 2, wrapped in parentheses) may itself contain spaces
5
5
  * and parentheses, so the only robust anchor is the *last* `)` in the stat
6
6
  * string. Field 22 (the process start time in clock ticks since boot) is the
7
- * 20th whitespace-separated token after that closing paren (index 19).
8
- *
9
- * Every caller previously parsed this format independently, with subtly
10
- * different failure handling. This module fails closed: any malformed input
11
- * (missing `)`, non-numeric field 22, unreadable `/proc` file, non-Linux
12
- * platform) yields `null` rather than an inconsistent sentinel.
13
- */
14
- /**
15
- * Parse field 22 (process start time, in clock ticks since boot) from one
16
- * `/proc/<pid>/stat` record. Returns the raw numeric token, or `null` when the
17
- * record shape is malformed or field 22 is absent/non-numeric.
7
+ * 20th whitespace-separated token after that closing paren (index 19). Field 7
8
+ * (`tty_nr`) is the 5th token after the closing paren (index 4).
18
9
  */
10
+ export interface LinuxProcStatIdentity {
11
+ startTime: string;
12
+ ttyDevice: string;
13
+ }
14
+ export type LinuxProcPidProbeResult = ({
15
+ kind: "live";
16
+ } & LinuxProcStatIdentity) | {
17
+ kind: "absent";
18
+ } | {
19
+ kind: "unverifiable";
20
+ reason: "unsupported_platform" | "invalid_pid" | "permission_denied" | "read_error" | "malformed_stat";
21
+ };
22
+ /** Parse field 22 (start time) from a `/proc/<pid>/stat` record. */
19
23
  export declare function parseLinuxProcStartTime(stat: string | null | undefined): string | null;
24
+ /** Parse field 7 (`tty_nr`) from a `/proc/<pid>/stat` record. */
25
+ export declare function parseLinuxProcTtyDevice(stat: string | null | undefined): string | null;
26
+ export declare function probeLinuxProcPidSync(pid: number): LinuxProcPidProbeResult;
27
+ export declare function probeLinuxProcPid(pid: number): Promise<LinuxProcPidProbeResult>;
20
28
  /**
21
29
  * Read `/proc/<pid>/stat` synchronously and return the parsed start time.
22
- * Returns `null` on non-Linux platforms, unreadable files, or malformed input.
30
+ * Returns `null` when the probe is absent or unverifiable.
23
31
  */
24
32
  export declare function readLinuxProcStartTimeSync(pid: number): string | null;
25
33
  /**
26
34
  * Read `/proc/<pid>/stat` asynchronously and return the parsed start time.
27
- * Returns `null` on non-Linux platforms, unreadable files, or malformed input.
35
+ * Returns `null` when the probe is absent or unverifiable.
28
36
  */
29
37
  export declare function readLinuxProcStartTime(pid: number): Promise<string | null>;
@@ -0,0 +1,47 @@
1
+ import { type LinuxProcPidProbeResult } from "./linux-proc";
2
+ declare const MEMORY_GUARD_CLAIM_RESOURCES: readonly ["writer", "tty"];
3
+ type MemoryGuardClaimResource = (typeof MEMORY_GUARD_CLAIM_RESOURCES)[number];
4
+ export interface MemoryGuardClaimOwner {
5
+ sessionId: string;
6
+ generation: string;
7
+ runId: string;
8
+ childToken: string;
9
+ pid: number;
10
+ processStartTime: string;
11
+ ttyDevice: string;
12
+ }
13
+ export interface MemoryGuardClaimsLease {
14
+ writerEpoch: number;
15
+ ttyEpoch: number;
16
+ owner: MemoryGuardClaimOwner;
17
+ claimStorePath: string;
18
+ }
19
+ export declare function isMemoryGuardClaimsLease(value: unknown): value is MemoryGuardClaimsLease;
20
+ export declare function isMemoryGuardClaimsLeaseForStateDir(value: unknown, stateDir: string): value is MemoryGuardClaimsLease;
21
+ export type MemoryGuardClaimsReleasedProof = MemoryGuardClaimsLease;
22
+ interface PersistedMemoryGuardClaimRow {
23
+ resource: MemoryGuardClaimResource;
24
+ epoch: number;
25
+ session_id: string;
26
+ generation: string;
27
+ run_id: string;
28
+ child_token: string;
29
+ pid: number;
30
+ process_start_time: string;
31
+ tty_device: string;
32
+ acquired_at: string;
33
+ }
34
+ export interface MemoryGuardOwnerClaimsDeps {
35
+ probePid(pid: number): Promise<LinuxProcPidProbeResult>;
36
+ now(): string;
37
+ }
38
+ export declare function memoryGuardClaimsDatabaseFile(stateDir: string, sessionId: string): string;
39
+ export declare function acquireMemoryGuardClaims(stateDir: string, owner: MemoryGuardClaimOwner, deps?: MemoryGuardOwnerClaimsDeps): Promise<MemoryGuardClaimsLease>;
40
+ export declare function releaseMemoryGuardClaims(stateDir: string, claim: MemoryGuardClaimsLease): Promise<void>;
41
+ export declare function probeMemoryGuardClaimsReleased(stateDir: string, owner: MemoryGuardClaimOwner, deps?: MemoryGuardOwnerClaimsDeps): Promise<MemoryGuardClaimsReleasedProof>;
42
+ export interface PersistedMemoryGuardClaimsSnapshot {
43
+ epoch: number;
44
+ claims: PersistedMemoryGuardClaimRow[];
45
+ }
46
+ export declare function readMemoryGuardClaimsForTest(stateDir: string, sessionId: string): Promise<PersistedMemoryGuardClaimsSnapshot>;
47
+ export {};