@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
@@ -4,11 +4,13 @@ import type { DaemonRuntimeInfo } from "../../daemon/control-types";
4
4
  import { HEARTBEAT_TTL_MS } from "./daemon-paths";
5
5
  import { type DaemonTransitionLock, type NotificationEndpointFile, type NotificationEndpointFileIdentity, type NotificationExactUnlinkResult } from "./notification-service";
6
6
  import { type DaemonProcessReference } from "./telegram-daemon-control";
7
- export { DAEMON_GENERATION, NOTIFICATION_PROTOCOL_VERSION } from "./telegram-daemon-contract";
7
+ import { type TelegramSetupPreflight } from "./telegram-setup";
8
+ export { DAEMON_GENERATION, NOTIFICATION_PROTOCOL_VERSION, SERVING_EPOCH } from "./telegram-daemon-contract";
8
9
  import { type ControlServerLike, type LifecycleControlServerFactory } from "./lifecycle-control-runtime";
9
10
  import type { OrchestratorDeps } from "./lifecycle-orchestrator";
10
- import { NotificationOperatorRuntime, OperatorBackoffPolicy } from "./operator-runtime";
11
+ import { NotificationOperatorRuntime } from "./operator-runtime";
11
12
  import { type AliasTable, type CallbackRoute } from "./telegram-reference";
13
+ import { type TopicEndpointBinding } from "./topic-registry";
12
14
  export type EnsureDaemonResult = "owner_spawned" | "attached" | "disabled" | "blocked";
13
15
  /** Detailed result for orchestration that must distinguish a #2028 handoff from a fresh spawn. */
14
16
  export type EnsureTelegramDaemonDetailedResult = "spawned" | "reloaded" | "attached" | "disabled" | "blocked_identity";
@@ -39,6 +41,8 @@ export interface DaemonState {
39
41
  * notification wire protocol version. Absent on pre-generation state.
40
42
  */
41
43
  generation?: number;
44
+ /** Lifecycle-serving compatibility epoch; absent pre-epoch records are epoch 1. */
45
+ servingEpoch?: number;
42
46
  stoppedAt?: number;
43
47
  }
44
48
  export interface TelegramDaemonFs {
@@ -54,6 +58,10 @@ export interface TelegramDaemonFs {
54
58
  chmod(path: string, mode: number): Promise<void>;
55
59
  stat?(path: string): Promise<{
56
60
  mtimeMs: number;
61
+ size?: number;
62
+ dev?: number;
63
+ ino?: number;
64
+ ctimeMs?: number;
57
65
  }>;
58
66
  readEndpointFile?(path: string): Promise<NotificationEndpointFile>;
59
67
  exactUnlink?(path: string, identity: NotificationEndpointFileIdentity): Promise<NotificationExactUnlinkResult>;
@@ -99,8 +107,25 @@ export declare const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
99
107
  /** Capability required for typed controls and semantic Selected acknowledgement frames. */
100
108
  export declare const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
101
109
  export declare const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
102
- /** Capability required for tool lifecycle and reasoning-summary frames. */
103
- export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v1";
110
+ /** Capability for the closed tool phase set: started, completed, failed, and cancelled. */
111
+ export declare const TOOL_ACTIVITY_CAPABILITY = "tool_activity_v2";
112
+ /** Receive-only compatibility capability for pre-v2 hosts. */
113
+ export declare const LEGACY_TOOL_ACTIVITY_CAPABILITY = "tool_activity_v1";
114
+ /**
115
+ * File-lock options whose acquisition budget covers the full reload-reservation
116
+ * critical section: the in-lock freshness poll plus the controller's
117
+ * graceful+kill+readiness sequence, with headroom. A contender must be able to
118
+ * wait out a legitimate slow reload and then attach, never fail startup.
119
+ */
120
+ export declare function reloadReservationLockOptions(input: {
121
+ freshnessWaitMs: number;
122
+ readinessTimeoutMs: number;
123
+ retryDelayMs?: number;
124
+ }): {
125
+ staleMs: number;
126
+ retries: number;
127
+ retryDelayMs: number;
128
+ };
104
129
  export declare const BTW_QUESTION_MAX_UNICODE_SCALARS = 4096;
105
130
  export declare const BTW_QUESTION_MAX_UTF8_BYTES = 16384;
106
131
  export declare function endpointAuthorityDigest(url: string, token: string, connectionIdentity?: string): string;
@@ -136,12 +161,22 @@ type LegacyOwnershipLockMetadata = {
136
161
  incarnation?: string;
137
162
  startedAt: number;
138
163
  };
164
+ type V010OwnershipLockMetadata = {
165
+ size: 0;
166
+ mtimeMs?: number;
167
+ dev?: number;
168
+ ino?: number;
169
+ ctimeMs?: number;
170
+ };
139
171
  type OwnershipLockRead = {
140
172
  kind: "missing";
141
173
  } | {
142
174
  kind: "malformed";
143
175
  raw: string;
144
176
  mtimeMs?: number;
177
+ } | {
178
+ kind: "v010";
179
+ metadata: V010OwnershipLockMetadata;
145
180
  } | {
146
181
  kind: "legacy";
147
182
  metadata: LegacyOwnershipLockMetadata;
@@ -170,15 +205,59 @@ export declare function liveOwnershipLockDecision(input: {
170
205
  attached: false;
171
206
  provisional: true;
172
207
  } | undefined;
208
+ type OwnerHeartbeatSidecar = {
209
+ pid: number;
210
+ incarnation: string;
211
+ ownerId: string;
212
+ acquisitionId: string;
213
+ heartbeatAt: number;
214
+ };
215
+ export interface OwnerFreshnessSnapshot {
216
+ ownerTag: Pick<OwnerHeartbeatSidecar, "pid" | "incarnation" | "ownerId" | "acquisitionId"> | null;
217
+ effectiveHeartbeatAt: number | undefined;
218
+ legacyEmbedded: boolean;
219
+ state: DaemonState | undefined;
220
+ }
221
+ export declare function readOwnerFreshnessSnapshot(input: {
222
+ settings: Settings;
223
+ fs?: TelegramDaemonFs;
224
+ }): Promise<OwnerFreshnessSnapshot>;
225
+ /** Marker-free steady heartbeat renewal. The final lock reread fences a stale writer. */
226
+ export declare function renewOwnerHeartbeatSidecar(input: {
227
+ settings: Settings;
228
+ ownerId: string;
229
+ acquisitionId?: string;
230
+ fs?: TelegramDaemonFs;
231
+ now?: () => number;
232
+ pid?: number;
233
+ pidIncarnation?: (pid: number) => string | undefined;
234
+ }): Promise<boolean>;
235
+ export interface NotificationRootRegistration {
236
+ root?: string;
237
+ managed?: boolean;
238
+ token?: string;
239
+ }
240
+ export declare function readNotificationRootRegistration(input: {
241
+ settings: Settings;
242
+ sessionId: string;
243
+ fs?: TelegramDaemonFs;
244
+ }): Promise<NotificationRootRegistration>;
245
+ export interface RegisterNotificationRootResult {
246
+ root: string;
247
+ /** Per-registration ownership token fencing a stale same-session cleanup from deleting a live replacement registration. */
248
+ token: string;
249
+ }
173
250
  export declare function registerNotificationRoot(input: {
174
251
  settings: Settings;
175
252
  cwd: string;
176
253
  sessionId: string;
177
254
  fs?: TelegramDaemonFs;
178
- }): Promise<string>;
255
+ }): Promise<RegisterNotificationRootResult>;
179
256
  export interface UnregisterNotificationRootResult {
180
257
  root: string;
181
258
  remainingRoots: number;
259
+ /** Opaque fingerprint of the exact registry written by this successful unregister. */
260
+ registryFingerprint?: string;
182
261
  }
183
262
  /** Remove one session's Telegram scan root without disturbing other live session roots. */
184
263
  export declare function unregisterNotificationRoot(input: {
@@ -186,8 +265,94 @@ export declare function unregisterNotificationRoot(input: {
186
265
  cwd: string;
187
266
  sessionId: string;
188
267
  fs?: TelegramDaemonFs;
268
+ /** Ownership token minted by this runtime's own registration; a stale cleanup presenting an older token never deletes a replacement registration. */
269
+ registrationToken?: string;
189
270
  }): Promise<UnregisterNotificationRootResult>;
271
+ /** Run an action while the roots registry lock excludes any registration or unregister. */
272
+ export declare function withNotificationRootRegistryFence(input: {
273
+ settings: Settings;
274
+ registryFingerprint: string;
275
+ action: () => Promise<void>;
276
+ fs?: TelegramDaemonFs;
277
+ }): Promise<boolean>;
278
+ /**
279
+ * Leak artifact prefixes left when native exact-unlink cleanup is retained
280
+ * (#2956). Nothing previously reaped these; they accumulate in the notifications
281
+ * directory across ownership transitions.
282
+ */
283
+ export declare const NOTIFICATION_LEAK_ARTIFACT_PREFIXES: readonly [".skc-delete-daemon-transition-", ".skc-exact-unlink-placeholder-", ".skc-delete-notification-endpoint-"];
284
+ /** Grace window before a leak artifact is reaped (covers in-flight unlinks). */
285
+ export declare const NOTIFICATION_LEAK_ARTIFACT_GRACE_MS: number;
286
+ /** True when a path is permanently gone (not a transient I/O blip). */
287
+ export declare function isPermanentMissingPathError(error: unknown): boolean;
288
+ export declare function isNotificationLeakArtifactName(name: string): boolean;
289
+ /**
290
+ * Drop permanently missing scan roots from the durable registry under the roots
291
+ * lock. Session map entries that pointed only at those roots are removed too.
292
+ */
293
+ export declare function pruneMissingNotificationRoots(input: {
294
+ settings: Settings;
295
+ fs?: TelegramDaemonFs;
296
+ /** When set, only these roots are considered; otherwise every registered root is probed. */
297
+ candidates?: readonly string[];
298
+ }): Promise<{
299
+ pruned: string[];
300
+ remaining: number;
301
+ }>;
302
+ /**
303
+ * Reap retained exact-unlink / ownership-transition quarantine files older than
304
+ * the grace window from the notifications directory.
305
+ */
306
+ export declare function reapStaleNotificationArtifacts(input: {
307
+ settings: Settings;
308
+ fs?: TelegramDaemonFs;
309
+ now?: () => number;
310
+ graceMs?: number;
311
+ }): Promise<{
312
+ removed: string[];
313
+ skipped: number;
314
+ }>;
315
+ /**
316
+ * Startup / ownership self-heal: prune dead roots and reap leak artifacts so
317
+ * `skc daemon reload` recovers a degraded install without manual surgery (#2956).
318
+ */
319
+ export declare function healTelegramDaemonNotificationState(input: {
320
+ settings: Settings;
321
+ fs?: TelegramDaemonFs;
322
+ now?: () => number;
323
+ graceMs?: number;
324
+ }): Promise<{
325
+ prunedRoots: string[];
326
+ removedArtifacts: string[];
327
+ }>;
190
328
  export declare function hasSafeDaemonStateShape(state: unknown): state is DaemonState;
329
+ type ParentDaemonStateBase = Omit<DaemonState, "incarnation" | "acquisitionId" | "ownershipPhase" | "generation" | "launcherPid"> & {
330
+ incarnation?: undefined;
331
+ acquisitionId?: undefined;
332
+ ownershipPhase?: undefined;
333
+ generation?: unknown;
334
+ launcherPid?: undefined;
335
+ };
336
+ type GenerationAbsentParentDaemonState = Omit<ParentDaemonStateBase, "generation"> & {
337
+ generation?: undefined;
338
+ };
339
+ type Generation3ReleaseDaemonState = Omit<ParentDaemonStateBase, "generation"> & {
340
+ generation: 3;
341
+ };
342
+ export type LegacyParentDaemonState = GenerationAbsentParentDaemonState | Generation3ReleaseDaemonState;
343
+ export interface AttestedLegacyDaemonOwner {
344
+ state: LegacyParentDaemonState;
345
+ incarnation: string;
346
+ }
347
+ /** Revalidate the exact two-observation legacy proof immediately before signaling. */
348
+ export declare function readAttestedLegacyDaemonOwner(input: {
349
+ settings: Settings;
350
+ fs?: TelegramDaemonFs;
351
+ now?: () => number;
352
+ pidIncarnation?: (pid: number) => string | undefined;
353
+ tokenFingerprint: string;
354
+ chatId: string;
355
+ }): Promise<AttestedLegacyDaemonOwner | undefined>;
191
356
  /** True for a physically live owner with this configuration, including legacy generations. */
192
357
  export declare function isPhysicalMatchingOwner(input: {
193
358
  state: DaemonState | undefined;
@@ -196,7 +361,7 @@ export declare function isPhysicalMatchingOwner(input: {
196
361
  pidAlive: (pid: number) => boolean;
197
362
  pidIncarnation?: (pid: number) => string | undefined;
198
363
  }): boolean;
199
- /** True only for a signalable legacy owner or this generation's ready bound child. */
364
+ /** True only for a fully-provenanced modern owner outside the generation-3 parent schema. */
200
365
  export declare function isSignalableMatchingOwner(input: {
201
366
  state: DaemonState | undefined;
202
367
  tokenFingerprint: string;
@@ -211,6 +376,7 @@ export declare function isFreshLiveOwner(input: {
211
376
  chatId: string;
212
377
  pidAlive: (pid: number) => boolean;
213
378
  pidIncarnation?: (pid: number) => string | undefined;
379
+ effectiveHeartbeatAt?: number;
214
380
  }): boolean;
215
381
  /** True only when a physically live matching owner can serve this build's daemon lifecycle contract. */
216
382
  export declare function isCurrentCompatibleOwner(input: {
@@ -220,6 +386,7 @@ export declare function isCurrentCompatibleOwner(input: {
220
386
  chatId: string;
221
387
  pidAlive: (pid: number) => boolean;
222
388
  pidIncarnation?: (pid: number) => string | undefined;
389
+ effectiveHeartbeatAt?: number;
223
390
  }): boolean;
224
391
  export declare function acquireDaemonOwnership(input: {
225
392
  settings: Settings;
@@ -245,6 +412,7 @@ export declare function acquireDaemonOwnership(input: {
245
412
  provisional?: boolean;
246
413
  reason?: "identity_mismatch";
247
414
  reloadRequired?: boolean;
415
+ legacyReloadRequired?: boolean;
248
416
  }>;
249
417
  export declare function renewDaemonHeartbeat(input: {
250
418
  settings: Settings;
@@ -290,7 +458,7 @@ export declare function retireProvisionalDaemonOwnership(input: {
290
458
  /** Only no-child confirmation may retire a ready-like launcher publication. */
291
459
  allowReadyWithoutChildPid?: boolean;
292
460
  }): Promise<boolean>;
293
- /** Wait for a matching current-generation daemon to publish a ready state. */
461
+ /** Wait for a matching compatible owner to publish a ready state. Readiness is serving-epoch gated (same-epoch cross-generation owners attach, per isCurrentCompatibleOwner); generation is inventory-only here. Mutation paths still require exact current-generation equality. */
294
462
  export declare function waitForTelegramDaemonReady(input: {
295
463
  settings: Settings;
296
464
  ownerId?: string;
@@ -321,6 +489,8 @@ export declare function confirmTelegramDaemonSpawn(input: {
321
489
  sleep?: (ms: number) => Promise<void>;
322
490
  waitStepMs?: number;
323
491
  timeoutMs?: number;
492
+ /** Retain an unproven no-PID child lease during a successor handoff. */
493
+ preserveOnUnprovenChildExit?: boolean;
324
494
  }): Promise<boolean>;
325
495
  export declare function releaseDaemonOwnership(input: {
326
496
  settings: Settings;
@@ -338,6 +508,22 @@ export declare function releaseDaemonOwnership(input: {
338
508
  export declare function readDaemonState(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<DaemonState | undefined>;
339
509
  /** Read the persisted notification roots list. */
340
510
  export declare function readDaemonRoots(settings: Pick<Settings, "getAgentDir">, fs?: TelegramDaemonFs): Promise<string[]>;
511
+ /** Injectable readers for {@link resolveTelegramSetupPreflight}, defaulting to the real OS/state probes. */
512
+ export interface ResolveTelegramSetupPreflightDeps {
513
+ readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
514
+ pidAlive?: (pid: number) => boolean;
515
+ pidIncarnation?: (pid: number) => string | undefined;
516
+ }
517
+ /**
518
+ * Build the Telegram setup preflight from persisted daemon state. The daemon is
519
+ * reported live ONLY when its PID is alive AND its current process incarnation
520
+ * still matches the persisted incarnation. Skipping the incarnation check makes
521
+ * a stale state file whose PID has been recycled by an unrelated process
522
+ * masquerade as a live owner, which wrongly blocks discovery pairing. Both the
523
+ * `notify setup` CLI and the /settings Notifications tab share this resolver so
524
+ * pairing behaves identically on both surfaces.
525
+ */
526
+ export declare function resolveTelegramSetupPreflight(settings: Settings, deps?: ResolveTelegramSetupPreflightDeps): Promise<TelegramSetupPreflight>;
341
527
  export interface TelegramSpawnOwnerInput {
342
528
  settings: Settings;
343
529
  roots?: string[];
@@ -362,6 +548,7 @@ export type TelegramSpawnOwnerResult = {
362
548
  runtime: DaemonRuntimeInfo;
363
549
  warnings: string[];
364
550
  reloadRequired?: boolean;
551
+ legacyReloadRequired?: boolean;
365
552
  } | {
366
553
  result: "blocked";
367
554
  runtime: DaemonRuntimeInfo;
@@ -389,6 +576,29 @@ export declare function buildTelegramDaemonSpawnArgs(input: {
389
576
  * already-persisted roots.
390
577
  */
391
578
  export declare function spawnTelegramDaemonOwner(input: TelegramSpawnOwnerInput, deps?: TelegramDaemonDeps): Promise<TelegramSpawnOwnerResult>;
579
+ /**
580
+ * Owner-bound reclamation of a confirmed-dead daemon owner, mirroring the
581
+ * daemon step of `skc notify recovery`. It returns a structured, actionable
582
+ * result and removes only identity-verified dead-owner artifacts while holding
583
+ * the transition fence; live, successor, unknown, or unreadable evidence is
584
+ * retained.
585
+ */
586
+ export type DeadOwnerRecoveryResult = {
587
+ recovered: true;
588
+ reason: "cleared";
589
+ } | {
590
+ recovered: false;
591
+ reason: "not-confirmed-dead" | "unsafe-lock" | "transition-contended" | "owner-superseded" | "unsafe-endpoint" | "endpoint-changed" | "endpoint-directory-unreadable" | "lock-changed";
592
+ };
593
+ /** Preflight cleanup for a confirmed-dead owner, with identity-bound removal. */
594
+ export declare function reclaimDeadDaemonOwner(input: {
595
+ settings: Settings;
596
+ endpointDir?: string;
597
+ fs?: TelegramDaemonFs;
598
+ now?: () => number;
599
+ pidAlive?: (pid: number) => boolean;
600
+ pidIncarnation?: (pid: number) => string | undefined;
601
+ }): Promise<DeadOwnerRecoveryResult>;
392
602
  /**
393
603
  * Ensure a configured daemon owns this session root, preserving ownership safety
394
604
  * while exposing whether a #2028 generation handoff was required.
@@ -397,6 +607,9 @@ export declare function ensureTelegramDaemonRunningDetailed(input: {
397
607
  settings: Settings;
398
608
  cwd: string;
399
609
  sessionId: string;
610
+ registerRoot?: boolean;
611
+ /** Receives each registration this ensure operation minted so the caller can fence its own later cleanup. */
612
+ onRegistered?: (registration: RegisterNotificationRootResult) => void;
400
613
  }, deps?: TelegramDaemonDeps): Promise<EnsureTelegramDaemonDetailedResult>;
401
614
  /**
402
615
  * Legacy compatibility mapping for callers that only distinguish ownership from
@@ -449,7 +662,10 @@ export type TelegramPollResult = {
449
662
  export interface TelegramUpdatePollerOptions {
450
663
  botApi: BotApi;
451
664
  runtime: NotificationOperatorRuntime;
452
- backoff: OperatorBackoffPolicy;
665
+ backoff: {
666
+ next(): number;
667
+ reset(): void;
668
+ };
453
669
  processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
454
670
  health?: TelegramPollHealth;
455
671
  }
@@ -469,6 +685,11 @@ export declare class TelegramEventDispatchState {
469
685
  readonly busy: Set<string>;
470
686
  readonly inboundReactions: Map<number, {
471
687
  messageId: number;
688
+ socketLease?: {
689
+ session: SessionSocket;
690
+ token: number;
691
+ logicalSessionId: string;
692
+ };
472
693
  }>;
473
694
  readonly seenUpdateIds: Set<number>;
474
695
  }
@@ -533,7 +754,7 @@ export interface TelegramDaemonOptions {
533
754
  richDraft?: {
534
755
  enabled: boolean;
535
756
  };
536
- /** Tool start/completion messages (enabled by default). */
757
+ /** Tool start/completion messages (off by default; explicit opt-in only). */
537
758
  toolActivity?: {
538
759
  enabled: boolean;
539
760
  };
@@ -551,11 +772,15 @@ interface SessionSocket {
551
772
  sessionId: string;
552
773
  /** Current logical session carried by valid threaded frames on this transport. */
553
774
  logicalSessionId: string;
775
+ /** Endpoint metadata proved this logical id belongs to this discovery record. */
776
+ logicalSessionIdTrusted: boolean;
554
777
  token: string;
555
778
  endpointKey: string;
556
779
  endpointDigest: string;
557
780
  hostGeneration: number;
558
781
  ws: WebSocket;
782
+ /** Timestamp (via opts.now) at which this socket began connecting. */
783
+ connectingSince: number;
559
784
  pending: Map<string, {
560
785
  sessionId: string;
561
786
  actionId: string;
@@ -563,6 +788,8 @@ interface SessionSocket {
563
788
  /** True once the server advertised the `client_ping_pong` capability. */
564
789
  capable: boolean;
565
790
  ephemeralCapable: boolean;
791
+ /** Tool activity contract advertised by the connected host. */
792
+ toolActivityCapability?: "v1" | "v2";
566
793
  /** Timestamp (via opts.now) of the last received pong; seeds the TTL window. */
567
794
  lastPongAt: number;
568
795
  /** Nonce of the most recent in-flight ping, if any. */
@@ -574,6 +801,13 @@ interface SessionSocket {
574
801
  /** Queues live frames until startup replay is applied. */
575
802
  replayPending: boolean;
576
803
  replayQueue: Record<string, unknown>[];
804
+ /** Trusted recovery may not route until its durable endpoint lease is committed. */
805
+ recoveryLease?: {
806
+ state: "pending" | "authorized" | "rejected";
807
+ logicalSessionId: string;
808
+ binding: TopicEndpointBinding;
809
+ token: number;
810
+ };
577
811
  }
578
812
  export declare class TelegramNotificationDaemon {
579
813
  #private;
@@ -585,6 +819,9 @@ export declare class TelegramNotificationDaemon {
585
819
  /** Endpoint-bound ownership for visible or dispatching tool bubbles. */
586
820
  private readonly toolActivityOwners;
587
821
  private readonly revokedToolEndpoints;
822
+ /** Exact settlement of each admitted legacy-v1 start; retained only while visible. */
823
+ private readonly legacyToolStarts;
824
+ private nextLegacyToolStartId;
588
825
  private readonly unresolvedToolTerminalizations;
589
826
  private toolTerminalizationChain;
590
827
  private toolActivityPolicyEpoch;
@@ -598,28 +835,46 @@ export declare class TelegramNotificationDaemon {
598
835
  private readonly pollConflictBackoff;
599
836
  private readonly loopBackoff;
600
837
  private running;
838
+ /** Once set, a concurrent startup await can never restore a running daemon. */
839
+ private stopRequested;
601
840
  private readonly fsImpl;
602
841
  private readonly botApi;
603
842
  private readonly effects;
604
843
  private readonly topics;
605
844
  /** Serializes registry snapshots so an older atomic write cannot overwrite newer rename state. */
845
+ /** Legacy sockets have no durable token, so explicit teardown is their revocation fence. */
846
+ private readonly droppedSessions;
606
847
  private topicsPersistQueue;
848
+ /** Serializes recovery compare/write/publish claims so competing endpoint migrations cannot durably diverge. */
849
+ private recoveryBindingClaimQueue;
850
+ /** Durable compensation fences retry under supervision until persistence succeeds. */
851
+ private readonly compensationFenceRetries;
607
852
  /** Daemon edit attempts that can race an accepted user service message. */
608
853
  private readonly daemonRenameAttempts;
609
854
  private readonly selectedAckPending;
610
855
  private readonly pool;
611
856
  private readonly poller;
612
857
  private readonly dispatchState;
858
+ /** Bot-wide flood-control window; inbound polling remains eligible during it. */
859
+ private botCooldownUntil;
860
+ private warnedBotCooldownUntil;
613
861
  /** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
614
862
  private readonly replyStore;
615
863
  /** Per-session debounce + monotonic draft-id state for opt-in draft streaming. */
616
864
  private readonly draftStream;
617
865
  /** Identity-bearing sessions by repo/branch surface, used to avoid transient duplicate topics. */
618
866
  private readonly topicOwnerByIdentity;
867
+ /** Ephemeral legacy topic owners retained across a same-socket config rekey. */
868
+ private readonly legacyTopicOwners;
869
+ /** Preserved initiator topics must not route through a rekeyed transport. */
870
+ private readonly preservedInitiatorTopics;
619
871
  /** Non-identity frames held until identity creates the correct thread. */
620
872
  private readonly pendingThreadedFrames;
621
- /** Endpoint generation tombstones for sessions that already sent session_closed. */
873
+ /** Durable endpoint leases for sessions that already sent an authorized session_closed. */
622
874
  private readonly closedEndpointKeys;
875
+ /** Exactly one authorized transport may route each recovered logical session. */
876
+ private readonly logicalSessionOwners;
877
+ private nextSocketLeaseToken;
623
878
  /** True once the daemon has nudged the user to enable Threaded Mode. */
624
879
  private threadedFallbackNoticeSent;
625
880
  /** Sessions whose identity header was already sent flat (Threaded Mode off). */
@@ -689,6 +944,9 @@ export declare class TelegramNotificationDaemon {
689
944
  private refreshBotIdentity;
690
945
  /** Map a lifecycle response/error to a user-facing message (G010 surfacing). */
691
946
  private formatLifecycleResponse;
947
+ private callBotApi;
948
+ private readonly callBotApiClassified;
949
+ private botApiWithOutcomeCollector;
692
950
  constructor(opts: TelegramDaemonOptions);
693
951
  private createSessionRouter;
694
952
  loadAliases(): Promise<void>;
@@ -698,6 +956,7 @@ export declare class TelegramNotificationDaemon {
698
956
  private pruneSeenUpdateIds;
699
957
  private rememberSeenUpdateId;
700
958
  private reserveSeenUpdateId;
959
+ private releaseSeenUpdateId;
701
960
  scanRoots(): Promise<void>;
702
961
  connectSession(sessionId: string, url: string, token: string): void;
703
962
  /**
@@ -734,9 +993,21 @@ export declare class TelegramNotificationDaemon {
734
993
  private topicIdentityKey;
735
994
  private topicIdentityBase;
736
995
  private topicOwnerForIdentity;
737
- private sessionCanClaimIdentity;
996
+ private admitLegacyToolStart;
997
+ private legacyToolStartForTerminal;
998
+ private settleLegacyToolStart;
999
+ private cancelUnsentLegacyToolStart;
1000
+ private failLegacyToolStart;
1001
+ private settleRejectedLegacyToolSubmission;
1002
+ private cancelLegacyToolStartsForSession;
1003
+ private cleanLegacyToolStartsForCapabilityUpgrade;
1004
+ private cancelLegacyToolStartsForPolicyTransition;
738
1005
  private toolActivityOwner;
1006
+ private renderThreadedFrame;
1007
+ private toolActivityFrameWithoutSummaries;
1008
+ private toolActivitySummariesAreCurrent;
739
1009
  private toolActivityAuthorityIsCurrent;
1010
+ private toolActivityDeliveryIsCurrent;
740
1011
  private submitThreadedFrame;
741
1012
  private existingTopicForPrivateChat;
742
1013
  private topicAuthorityLease;
@@ -759,7 +1030,9 @@ export declare class TelegramNotificationDaemon {
759
1030
  private deleteTopic;
760
1031
  private persistTopics;
761
1032
  loadTopics(): Promise<void>;
762
- /** Download a Telegram file by its file_path (from getFile) into memory. */
1033
+ /** Retry crash-interrupted topic deletes; only a definite Telegram result clears the durable fence. */
1034
+ private reconcilePendingTopicDeletes;
1035
+ /** Download one Telegram file with the Bot API's 20 MiB ceiling and one end-to-end deadline. */
763
1036
  private downloadTelegramFile;
764
1037
  /**
765
1038
  * Per-session private temp directories (mode 0700) holding inbound non-image
@@ -781,6 +1054,7 @@ export declare class TelegramNotificationDaemon {
781
1054
  * to append to the injected text.
782
1055
  */
783
1056
  private resolveInboundAttachment;
1057
+ private resolveInboundAttachmentSerial;
784
1058
  /**
785
1059
  * Serialize all pool flushes. Every caller (`submitThreadedFrame`, the flat
786
1060
  * fallback, the drain timer's `void this.flushPool()`, topic teardown) goes
@@ -73,6 +73,7 @@ export declare function buildActionMessage(action: {
73
73
  id: string;
74
74
  question?: string;
75
75
  options?: string[];
76
+ recommendedIndex?: unknown;
76
77
  controls?: readonly TelegramActionControl[];
77
78
  summary?: string;
78
79
  }): RenderedMessage;
@@ -81,6 +82,7 @@ export declare function buildActionMarkdown(action: {
81
82
  kind: "ask" | "idle";
82
83
  question?: string;
83
84
  options?: string[];
85
+ recommendedIndex?: unknown;
84
86
  summary?: string;
85
87
  }): string;
86
88
  /** Send Telegram HTML text chunks sequentially so long messages preserve order. */