@sayknow-cli/coding-agent 0.4.7 → 0.5.1

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