@sayknow-cli/coding-agent 0.3.11 → 0.3.13

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 (1161) hide show
  1. package/CHANGELOG.md +0 -21
  2. package/package.json +116 -117
  3. package/scripts/build-binary.ts +2 -43
  4. package/scripts/compile-args.ts +106 -0
  5. package/scripts/g004-tmux-smoke.ts +196 -36
  6. package/scripts/generate-docs-index.ts +3 -0
  7. package/src/build-metadata.ts +104 -0
  8. package/src/capability/mcp.ts +3 -1
  9. package/src/cli/daemon-cli.ts +19 -29
  10. package/src/cli/malloc-env-guard.test.ts +104 -0
  11. package/src/cli/malloc-env-guard.ts +149 -0
  12. package/src/cli/mcp-cli.ts +108 -26
  13. package/src/cli/notify-cli.ts +78 -14
  14. package/src/cli/session-picker.ts +23 -40
  15. package/src/cli/update-cli.ts +56 -37
  16. package/src/cli.ts +71 -10
  17. package/src/commands/daemon.ts +19 -5
  18. package/src/commands/harness.ts +515 -47
  19. package/src/commands/launch.ts +11 -3
  20. package/src/commands/mcp.ts +8 -8
  21. package/src/commands/notify.ts +5 -1
  22. package/src/commands/session.ts +6 -1
  23. package/src/commands/stats.ts +6 -2
  24. package/src/config/keybindings.ts +7 -2
  25. package/src/config/mcp-schema.json +21 -17
  26. package/src/config/model-profile-activation.ts +1 -1
  27. package/src/config/model-profiles.ts +23 -23
  28. package/src/config/settings-schema.ts +41 -1
  29. package/src/coordinator-mcp/model-preset.ts +100 -0
  30. package/src/coordinator-mcp/server.ts +2735 -435
  31. package/src/daemon/control-types.ts +11 -0
  32. package/src/daemon/operator-contract.ts +121 -0
  33. package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
  34. package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
  35. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
  36. package/src/discovery/builtin.ts +14 -0
  37. package/src/discovery/mcp-json.ts +14 -0
  38. package/src/eval/js/executor.ts +7 -1
  39. package/src/internal-urls/docs-index.generated.ts +10 -9
  40. package/src/internal-urls/local-protocol.ts +29 -10
  41. package/src/internal-urls/skc-protocol.ts +14 -1
  42. package/src/main.ts +298 -75
  43. package/src/modes/acp/acp-agent.ts +800 -114
  44. package/src/modes/acp/acp-client-bridge.ts +27 -5
  45. package/src/modes/acp/acp-event-mapper.ts +39 -1
  46. package/src/modes/acp/acp-mode.ts +29 -2
  47. package/src/modes/components/assistant-message.ts +33 -4
  48. package/src/modes/components/bash-execution.ts +43 -13
  49. package/src/modes/components/custom-editor.ts +5 -0
  50. package/src/modes/components/hook-selector.ts +16 -0
  51. package/src/modes/components/irc-sidebar.ts +206 -0
  52. package/src/modes/components/model-selector.ts +17 -6
  53. package/src/modes/components/pet-selector.ts +55 -0
  54. package/src/modes/components/sayknow-pet-widget.ts +360 -0
  55. package/src/modes/components/session-selector.ts +223 -222
  56. package/src/modes/components/settings-selector.ts +10 -0
  57. package/src/modes/components/status-line/presets.ts +5 -19
  58. package/src/modes/components/status-line/segments.ts +14 -0
  59. package/src/modes/components/status-line/types.ts +6 -0
  60. package/src/modes/components/status-line.ts +13 -6
  61. package/src/modes/components/tool-execution.ts +48 -7
  62. package/src/modes/components/user-message.ts +26 -9
  63. package/src/modes/components/welcome.ts +4 -1
  64. package/src/modes/controllers/command-controller.ts +29 -3
  65. package/src/modes/controllers/event-controller.ts +168 -45
  66. package/src/modes/controllers/extension-ui-controller.ts +36 -17
  67. package/src/modes/controllers/input-controller.ts +16 -4
  68. package/src/modes/controllers/selector-controller.ts +69 -18
  69. package/src/modes/interactive-mode.ts +194 -10
  70. package/src/modes/irc-observation-ledger.ts +127 -0
  71. package/src/modes/rpc/rpc-client.ts +30 -6
  72. package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
  73. package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
  74. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
  75. package/src/modes/types.ts +34 -2
  76. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  77. package/src/modes/utils/irc-message.ts +138 -0
  78. package/src/modes/utils/ui-helpers.ts +368 -80
  79. package/src/notifications/config.ts +44 -0
  80. package/src/notifications/daemon-paths.ts +8 -0
  81. package/src/notifications/index.ts +535 -75
  82. package/src/notifications/lifecycle-control-runtime.ts +930 -77
  83. package/src/notifications/notification-service.ts +710 -0
  84. package/src/notifications/rate-limit-pool.ts +46 -12
  85. package/src/notifications/telegram-daemon-control.ts +27 -2
  86. package/src/notifications/telegram-daemon.ts +663 -96
  87. package/src/notifications/telegram-reference.ts +73 -13
  88. package/src/notifications/topic-registry.ts +86 -9
  89. package/src/prompts/system/irc-peer-roster.md +1 -0
  90. package/src/prompts/system/subagent-system-prompt.md +1 -0
  91. package/src/prompts/system/system-prompt.md +1 -0
  92. package/src/prompts/tools/irc.md +1 -1
  93. package/src/prompts/tools/skill.md +2 -2
  94. package/src/registry/agent-registry.ts +3 -0
  95. package/src/runtime-mcp/config-writer.ts +4 -3
  96. package/src/runtime-mcp/config.ts +1 -0
  97. package/src/runtime-mcp/types.ts +4 -3
  98. package/src/sdk.ts +52 -1
  99. package/src/secrets/obfuscator.ts +4 -2
  100. package/src/session/agent-session.ts +513 -148
  101. package/src/session/cache-economics.ts +275 -0
  102. package/src/session/provider-safety-stop.ts +9 -0
  103. package/src/session/session-dump-format.ts +6 -0
  104. package/src/session/session-manager.ts +877 -79
  105. package/src/session/session-storage.ts +582 -38
  106. package/src/skc-runtime/session-state-sidecar.ts +756 -135
  107. package/src/skc-runtime/state-runtime.ts +105 -12
  108. package/src/skc-runtime/tmux-common.ts +26 -7
  109. package/src/skc-runtime/tmux-gc.ts +52 -9
  110. package/src/skc-runtime/tmux-owner-isolation-cli.ts +185 -0
  111. package/src/skc-runtime/tmux-owner-isolation.ts +2060 -0
  112. package/src/skc-runtime/tmux-sessions.ts +871 -68
  113. package/src/skc-runtime/workflow-manifest.generated.json +4 -28
  114. package/src/skc-runtime/workflow-manifest.ts +1 -7
  115. package/src/slash-commands/builtin-registry.ts +152 -13
  116. package/src/task/executor.ts +12 -3
  117. package/src/task/index.ts +8 -0
  118. package/src/task/receipt.ts +7 -2
  119. package/src/task/types.ts +26 -0
  120. package/src/tools/ask-answer-registry.ts +25 -0
  121. package/src/tools/bash-interactive.ts +9 -4
  122. package/src/tools/browser/readable.ts +2 -2
  123. package/src/tools/browser/tab-supervisor.ts +63 -6
  124. package/src/tools/browser.ts +8 -3
  125. package/src/tools/fetch.ts +5 -5
  126. package/src/tools/index.ts +81 -6
  127. package/src/tools/skill.ts +14 -11
  128. package/src/tools/sqlite-reader.ts +8 -4
  129. package/src/tui/output-block.ts +18 -6
  130. package/src/utils/external-editor.ts +6 -1
  131. package/src/utils/linkedom.ts +14 -0
  132. package/src/utils/pasted-image-path.ts +23 -9
  133. package/src/web/scrapers/arxiv.ts +2 -2
  134. package/src/web/scrapers/go-pkg.ts +2 -2
  135. package/src/web/scrapers/iacr.ts +2 -2
  136. package/src/web/scrapers/readthedocs.ts +2 -2
  137. package/src/web/scrapers/twitter.ts +3 -2
  138. package/src/web/scrapers/wikipedia.ts +2 -2
  139. package/dist/types/append-only-mode.d.ts +0 -31
  140. package/dist/types/async/index.d.ts +0 -2
  141. package/dist/types/async/job-manager.d.ts +0 -328
  142. package/dist/types/async/support.d.ts +0 -2
  143. package/dist/types/autoresearch/dashboard.d.ts +0 -4
  144. package/dist/types/autoresearch/git.d.ts +0 -36
  145. package/dist/types/autoresearch/helpers.d.ts +0 -24
  146. package/dist/types/autoresearch/index.d.ts +0 -2
  147. package/dist/types/autoresearch/state.d.ts +0 -17
  148. package/dist/types/autoresearch/storage.d.ts +0 -142
  149. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  150. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  151. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  152. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  153. package/dist/types/autoresearch/types.d.ts +0 -154
  154. package/dist/types/capability/context-file.d.ts +0 -17
  155. package/dist/types/capability/extension-module.d.ts +0 -15
  156. package/dist/types/capability/extension.d.ts +0 -28
  157. package/dist/types/capability/fs.d.ts +0 -20
  158. package/dist/types/capability/hook.d.ts +0 -19
  159. package/dist/types/capability/index.d.ts +0 -80
  160. package/dist/types/capability/instruction.d.ts +0 -17
  161. package/dist/types/capability/mcp.d.ts +0 -47
  162. package/dist/types/capability/prompt.d.ts +0 -15
  163. package/dist/types/capability/rule.d.ts +0 -69
  164. package/dist/types/capability/settings.d.ts +0 -15
  165. package/dist/types/capability/skill.d.ts +0 -36
  166. package/dist/types/capability/slash-command.d.ts +0 -17
  167. package/dist/types/capability/ssh.d.ts +0 -23
  168. package/dist/types/capability/system-prompt.d.ts +0 -15
  169. package/dist/types/capability/tool.d.ts +0 -19
  170. package/dist/types/capability/types.d.ts +0 -154
  171. package/dist/types/cli/agents-cli.d.ts +0 -12
  172. package/dist/types/cli/args.d.ts +0 -57
  173. package/dist/types/cli/auth-broker-cli.d.ts +0 -25
  174. package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
  175. package/dist/types/cli/classify-install-target.d.ts +0 -18
  176. package/dist/types/cli/commands/init-xdg.d.ts +0 -1
  177. package/dist/types/cli/completion-cli.d.ts +0 -41
  178. package/dist/types/cli/config-cli.d.ts +0 -23
  179. package/dist/types/cli/daemon-cli.d.ts +0 -25
  180. package/dist/types/cli/fast-help.d.ts +0 -1
  181. package/dist/types/cli/file-processor.d.ts +0 -11
  182. package/dist/types/cli/fixture-report.d.ts +0 -20
  183. package/dist/types/cli/fixture-report.test.d.ts +0 -1
  184. package/dist/types/cli/grep-cli.d.ts +0 -17
  185. package/dist/types/cli/initial-message.d.ts +0 -17
  186. package/dist/types/cli/list-models.d.ts +0 -36
  187. package/dist/types/cli/local-provider-smoke.d.ts +0 -59
  188. package/dist/types/cli/mcp-cli.d.ts +0 -25
  189. package/dist/types/cli/migrate-cli.d.ts +0 -20
  190. package/dist/types/cli/nofile-limit.d.ts +0 -11
  191. package/dist/types/cli/notify-cli.d.ts +0 -37
  192. package/dist/types/cli/plugin-cli.d.ts +0 -34
  193. package/dist/types/cli/read-cli.d.ts +0 -4
  194. package/dist/types/cli/session-picker.d.ts +0 -3
  195. package/dist/types/cli/setup-cli.d.ts +0 -73
  196. package/dist/types/cli/shell-cli.d.ts +0 -8
  197. package/dist/types/cli/skills-cli.d.ts +0 -9
  198. package/dist/types/cli/ssh-cli.d.ts +0 -21
  199. package/dist/types/cli/stats-cli.d.ts +0 -17
  200. package/dist/types/cli/telegram-cli.d.ts +0 -13
  201. package/dist/types/cli/update-cli.d.ts +0 -89
  202. package/dist/types/cli/web-search-cli.d.ts +0 -32
  203. package/dist/types/cli/worktree-cli.d.ts +0 -26
  204. package/dist/types/cli.d.ts +0 -135
  205. package/dist/types/commands/acp.d.ts +0 -12
  206. package/dist/types/commands/agents.d.ts +0 -34
  207. package/dist/types/commands/auth-broker.d.ts +0 -54
  208. package/dist/types/commands/auth-gateway.d.ts +0 -32
  209. package/dist/types/commands/codex-native-hook.d.ts +0 -6
  210. package/dist/types/commands/commit.d.ts +0 -27
  211. package/dist/types/commands/completion.d.ts +0 -29
  212. package/dist/types/commands/config.d.ts +0 -33
  213. package/dist/types/commands/contribution-prep.d.ts +0 -18
  214. package/dist/types/commands/coordinator.d.ts +0 -19
  215. package/dist/types/commands/daemon.d.ts +0 -41
  216. package/dist/types/commands/deep-interview.d.ts +0 -54
  217. package/dist/types/commands/gc.d.ts +0 -26
  218. package/dist/types/commands/grep.d.ts +0 -42
  219. package/dist/types/commands/harness.d.ts +0 -43
  220. package/dist/types/commands/launch.d.ts +0 -130
  221. package/dist/types/commands/local-provider.d.ts +0 -34
  222. package/dist/types/commands/mcp-serve.d.ts +0 -24
  223. package/dist/types/commands/mcp.d.ts +0 -70
  224. package/dist/types/commands/migrate.d.ts +0 -33
  225. package/dist/types/commands/notify.d.ts +0 -41
  226. package/dist/types/commands/plugin.d.ts +0 -58
  227. package/dist/types/commands/ralplan.d.ts +0 -7
  228. package/dist/types/commands/read.d.ts +0 -15
  229. package/dist/types/commands/rlm.d.ts +0 -10
  230. package/dist/types/commands/session.d.ts +0 -30
  231. package/dist/types/commands/setup.d.ts +0 -105
  232. package/dist/types/commands/shell.d.ts +0 -21
  233. package/dist/types/commands/skills.d.ts +0 -26
  234. package/dist/types/commands/ssh.d.ts +0 -48
  235. package/dist/types/commands/state.d.ts +0 -7
  236. package/dist/types/commands/stats.d.ts +0 -25
  237. package/dist/types/commands/team.d.ts +0 -24
  238. package/dist/types/commands/telegram.d.ts +0 -22
  239. package/dist/types/commands/ultragoal.d.ts +0 -8
  240. package/dist/types/commands/update.d.ts +0 -20
  241. package/dist/types/commands/web-search.d.ts +0 -87
  242. package/dist/types/commands/worktree.d.ts +0 -34
  243. package/dist/types/commit/agentic/agent.d.ts +0 -31
  244. package/dist/types/commit/agentic/fallback.d.ts +0 -5
  245. package/dist/types/commit/agentic/index.d.ts +0 -2
  246. package/dist/types/commit/agentic/state.d.ts +0 -58
  247. package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
  248. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
  249. package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
  250. package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
  251. package/dist/types/commit/agentic/tools/index.d.ts +0 -16
  252. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
  253. package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
  254. package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
  255. package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
  256. package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
  257. package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
  258. package/dist/types/commit/agentic/trivial.d.ts +0 -7
  259. package/dist/types/commit/agentic/validation.d.ts +0 -20
  260. package/dist/types/commit/analysis/conventional.d.ts +0 -22
  261. package/dist/types/commit/analysis/index.d.ts +0 -4
  262. package/dist/types/commit/analysis/scope.d.ts +0 -6
  263. package/dist/types/commit/analysis/summary.d.ts +0 -19
  264. package/dist/types/commit/analysis/validation.d.ts +0 -8
  265. package/dist/types/commit/changelog/detect.d.ts +0 -2
  266. package/dist/types/commit/changelog/generate.d.ts +0 -30
  267. package/dist/types/commit/changelog/index.d.ts +0 -30
  268. package/dist/types/commit/changelog/parse.d.ts +0 -2
  269. package/dist/types/commit/cli.d.ts +0 -3
  270. package/dist/types/commit/git/diff.d.ts +0 -5
  271. package/dist/types/commit/index.d.ts +0 -4
  272. package/dist/types/commit/map-reduce/index.d.ts +0 -28
  273. package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
  274. package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
  275. package/dist/types/commit/map-reduce/utils.d.ts +0 -2
  276. package/dist/types/commit/message.d.ts +0 -2
  277. package/dist/types/commit/model-selection.d.ts +0 -15
  278. package/dist/types/commit/pipeline.d.ts +0 -5
  279. package/dist/types/commit/shared-llm.d.ts +0 -54
  280. package/dist/types/commit/types.d.ts +0 -78
  281. package/dist/types/commit/utils/exclusions.d.ts +0 -4
  282. package/dist/types/commit/utils.d.ts +0 -20
  283. package/dist/types/config/config-file.d.ts +0 -58
  284. package/dist/types/config/file-lock-gc.d.ts +0 -5
  285. package/dist/types/config/file-lock.d.ts +0 -36
  286. package/dist/types/config/keybindings.d.ts +0 -359
  287. package/dist/types/config/model-equivalence.d.ts +0 -24
  288. package/dist/types/config/model-profile-activation.d.ts +0 -64
  289. package/dist/types/config/model-profiles.d.ts +0 -39
  290. package/dist/types/config/model-registry.d.ts +0 -473
  291. package/dist/types/config/model-resolver.d.ts +0 -217
  292. package/dist/types/config/models-config-schema.d.ts +0 -700
  293. package/dist/types/config/prompt-templates.d.ts +0 -32
  294. package/dist/types/config/resolve-config-value.d.ts +0 -17
  295. package/dist/types/config/settings-schema.d.ts +0 -4183
  296. package/dist/types/config/settings.d.ts +0 -156
  297. package/dist/types/config/skill-settings-defaults.d.ts +0 -14
  298. package/dist/types/config/telegram-autostart.d.ts +0 -14
  299. package/dist/types/config/telegram-env-bridge.d.ts +0 -18
  300. package/dist/types/config.d.ts +0 -66
  301. package/dist/types/coordinator/contract.d.ts +0 -4
  302. package/dist/types/coordinator-mcp/policy.d.ts +0 -24
  303. package/dist/types/coordinator-mcp/safety.d.ts +0 -26
  304. package/dist/types/coordinator-mcp/server.d.ts +0 -66
  305. package/dist/types/cursor.d.ts +0 -24
  306. package/dist/types/daemon/builtin.d.ts +0 -20
  307. package/dist/types/daemon/control-types.d.ts +0 -57
  308. package/dist/types/daemon/runtime.d.ts +0 -25
  309. package/dist/types/dap/client.d.ts +0 -39
  310. package/dist/types/dap/config.d.ts +0 -6
  311. package/dist/types/dap/index.d.ts +0 -4
  312. package/dist/types/dap/session.d.ts +0 -108
  313. package/dist/types/dap/types.d.ts +0 -524
  314. package/dist/types/debug/crash-diagnostics.d.ts +0 -45
  315. package/dist/types/debug/index.d.ts +0 -15
  316. package/dist/types/debug/log-formatting.d.ts +0 -4
  317. package/dist/types/debug/log-viewer.d.ts +0 -68
  318. package/dist/types/debug/profiler.d.ts +0 -24
  319. package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
  320. package/dist/types/debug/raw-sse.d.ts +0 -16
  321. package/dist/types/debug/report-bundle.d.ts +0 -55
  322. package/dist/types/debug/runtime-gauges.d.ts +0 -6
  323. package/dist/types/debug/system-info.d.ts +0 -26
  324. package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
  325. package/dist/types/deep-interview/render-middleware.d.ts +0 -6
  326. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
  327. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
  328. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -25
  329. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
  330. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
  331. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
  332. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
  333. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
  334. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
  335. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
  336. package/dist/types/defaults/skc-defaults.d.ts +0 -64
  337. package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
  338. package/dist/types/discovery/agents-md.d.ts +0 -1
  339. package/dist/types/discovery/agents.d.ts +0 -12
  340. package/dist/types/discovery/builtin.d.ts +0 -1
  341. package/dist/types/discovery/claude-plugins.d.ts +0 -1
  342. package/dist/types/discovery/claude.d.ts +0 -1
  343. package/dist/types/discovery/cline.d.ts +0 -1
  344. package/dist/types/discovery/codex.d.ts +0 -1
  345. package/dist/types/discovery/cursor.d.ts +0 -19
  346. package/dist/types/discovery/gemini.d.ts +0 -1
  347. package/dist/types/discovery/github.d.ts +0 -1
  348. package/dist/types/discovery/helpers.d.ts +0 -271
  349. package/dist/types/discovery/index.d.ts +0 -48
  350. package/dist/types/discovery/mcp-json.d.ts +0 -1
  351. package/dist/types/discovery/opencode.d.ts +0 -1
  352. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  353. package/dist/types/discovery/ssh.d.ts +0 -1
  354. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -5
  355. package/dist/types/discovery/vscode.d.ts +0 -1
  356. package/dist/types/discovery/windsurf.d.ts +0 -15
  357. package/dist/types/edit/apply-patch/index.d.ts +0 -35
  358. package/dist/types/edit/apply-patch/parser.d.ts +0 -34
  359. package/dist/types/edit/diff.d.ts +0 -75
  360. package/dist/types/edit/file-read-cache.d.ts +0 -25
  361. package/dist/types/edit/index.d.ts +0 -58
  362. package/dist/types/edit/modes/apply-patch.d.ts +0 -24
  363. package/dist/types/edit/modes/patch.d.ts +0 -99
  364. package/dist/types/edit/modes/replace.d.ts +0 -149
  365. package/dist/types/edit/normalize.d.ts +0 -43
  366. package/dist/types/edit/notebook.d.ts +0 -26
  367. package/dist/types/edit/read-file.d.ts +0 -8
  368. package/dist/types/edit/renderer.d.ts +0 -110
  369. package/dist/types/edit/streaming.d.ts +0 -66
  370. package/dist/types/eval/backend.d.ts +0 -40
  371. package/dist/types/eval/index.d.ts +0 -4
  372. package/dist/types/eval/js/context-manager.d.ts +0 -27
  373. package/dist/types/eval/js/executor.d.ts +0 -29
  374. package/dist/types/eval/js/index.d.ts +0 -10
  375. package/dist/types/eval/js/shared/helpers.d.ts +0 -38
  376. package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
  377. package/dist/types/eval/js/shared/prelude.d.ts +0 -1
  378. package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
  379. package/dist/types/eval/js/shared/runtime.d.ts +0 -47
  380. package/dist/types/eval/js/shared/types.d.ts +0 -24
  381. package/dist/types/eval/js/tool-bridge.d.ts +0 -18
  382. package/dist/types/eval/js/worker-core.d.ts +0 -5
  383. package/dist/types/eval/js/worker-entry.d.ts +0 -1
  384. package/dist/types/eval/js/worker-protocol.d.ts +0 -77
  385. package/dist/types/eval/py/display.d.ts +0 -25
  386. package/dist/types/eval/py/executor.d.ts +0 -88
  387. package/dist/types/eval/py/index.d.ts +0 -10
  388. package/dist/types/eval/py/kernel.d.ts +0 -65
  389. package/dist/types/eval/py/prelude.d.ts +0 -1
  390. package/dist/types/eval/py/runtime.d.ts +0 -29
  391. package/dist/types/eval/py/tool-bridge.d.ts +0 -20
  392. package/dist/types/eval/types.d.ts +0 -52
  393. package/dist/types/exa/factory.d.ts +0 -13
  394. package/dist/types/exa/index.d.ts +0 -20
  395. package/dist/types/exa/mcp-client.d.ts +0 -45
  396. package/dist/types/exa/render.d.ts +0 -19
  397. package/dist/types/exa/researcher.d.ts +0 -9
  398. package/dist/types/exa/search.d.ts +0 -9
  399. package/dist/types/exa/types.d.ts +0 -155
  400. package/dist/types/exa/websets.d.ts +0 -9
  401. package/dist/types/exec/bash-executor.d.ts +0 -64
  402. package/dist/types/exec/exec.d.ts +0 -25
  403. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  404. package/dist/types/exec/non-interactive-env.d.ts +0 -1
  405. package/dist/types/export/custom-share.d.ts +0 -20
  406. package/dist/types/export/html/index.d.ts +0 -10
  407. package/dist/types/export/html/template.generated.d.ts +0 -1
  408. package/dist/types/export/html/template.macro.d.ts +0 -5
  409. package/dist/types/export/ttsr.d.ts +0 -55
  410. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
  411. package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
  412. package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
  413. package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
  414. package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
  415. package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
  416. package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
  417. package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
  418. package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
  419. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
  420. package/dist/types/extensibility/extensions/index.d.ts +0 -9
  421. package/dist/types/extensibility/extensions/loader.d.ts +0 -43
  422. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
  423. package/dist/types/extensibility/extensions/runner.d.ts +0 -135
  424. package/dist/types/extensibility/extensions/types.d.ts +0 -918
  425. package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
  426. package/dist/types/extensibility/hooks/index.d.ts +0 -5
  427. package/dist/types/extensibility/hooks/loader.d.ts +0 -89
  428. package/dist/types/extensibility/hooks/runner.d.ts +0 -126
  429. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
  430. package/dist/types/extensibility/hooks/types.d.ts +0 -431
  431. package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
  432. package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
  433. package/dist/types/extensibility/plugins/index.d.ts +0 -8
  434. package/dist/types/extensibility/plugins/installer.d.ts +0 -5
  435. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
  436. package/dist/types/extensibility/plugins/loader.d.ts +0 -31
  437. package/dist/types/extensibility/plugins/manager.d.ts +0 -65
  438. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
  439. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
  440. package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
  441. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
  442. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
  443. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
  444. package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
  445. package/dist/types/extensibility/plugins/parser.d.ts +0 -52
  446. package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
  447. package/dist/types/extensibility/plugins/types.d.ts +0 -149
  448. package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
  449. package/dist/types/extensibility/shared-events.d.ts +0 -281
  450. package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
  451. package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
  452. package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
  453. package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
  454. package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
  455. package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
  456. package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
  457. package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
  458. package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
  459. package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
  460. package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
  461. package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
  462. package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
  463. package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
  464. package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
  465. package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
  466. package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
  467. package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
  468. package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
  469. package/dist/types/extensibility/skills.d.ts +0 -82
  470. package/dist/types/extensibility/slash-commands.d.ts +0 -48
  471. package/dist/types/extensibility/tool-proxy.d.ts +0 -4
  472. package/dist/types/extensibility/typebox.d.ts +0 -155
  473. package/dist/types/extensibility/utils.d.ts +0 -12
  474. package/dist/types/goals/index.d.ts +0 -3
  475. package/dist/types/goals/runtime.d.ts +0 -63
  476. package/dist/types/goals/state.d.ts +0 -32
  477. package/dist/types/goals/tools/goal-tool.d.ts +0 -62
  478. package/dist/types/harness-control-plane/classifier.d.ts +0 -13
  479. package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
  480. package/dist/types/harness-control-plane/finalize.d.ts +0 -60
  481. package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
  482. package/dist/types/harness-control-plane/operate.d.ts +0 -35
  483. package/dist/types/harness-control-plane/owner.d.ts +0 -53
  484. package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
  485. package/dist/types/harness-control-plane/preserve.d.ts +0 -19
  486. package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
  487. package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
  488. package/dist/types/harness-control-plane/receipts.d.ts +0 -149
  489. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  490. package/dist/types/harness-control-plane/seams.d.ts +0 -21
  491. package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
  492. package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
  493. package/dist/types/harness-control-plane/storage.d.ts +0 -81
  494. package/dist/types/harness-control-plane/types.d.ts +0 -187
  495. package/dist/types/hashline/anchors.d.ts +0 -20
  496. package/dist/types/hashline/apply.d.ts +0 -14
  497. package/dist/types/hashline/constants.d.ts +0 -19
  498. package/dist/types/hashline/diff-preview.d.ts +0 -2
  499. package/dist/types/hashline/diff.d.ts +0 -17
  500. package/dist/types/hashline/execute.d.ts +0 -4
  501. package/dist/types/hashline/hash.d.ts +0 -123
  502. package/dist/types/hashline/index.d.ts +0 -13
  503. package/dist/types/hashline/input.d.ts +0 -11
  504. package/dist/types/hashline/parser.d.ts +0 -7
  505. package/dist/types/hashline/prefixes.d.ts +0 -7
  506. package/dist/types/hashline/recovery.d.ts +0 -27
  507. package/dist/types/hashline/stream.d.ts +0 -2
  508. package/dist/types/hashline/types.d.ts +0 -77
  509. package/dist/types/hindsight/backend.d.ts +0 -13
  510. package/dist/types/hindsight/bank.d.ts +0 -54
  511. package/dist/types/hindsight/client.d.ts +0 -224
  512. package/dist/types/hindsight/config.d.ts +0 -51
  513. package/dist/types/hindsight/content.d.ts +0 -70
  514. package/dist/types/hindsight/index.d.ts +0 -8
  515. package/dist/types/hindsight/mental-models.d.ts +0 -125
  516. package/dist/types/hindsight/state.d.ts +0 -99
  517. package/dist/types/hindsight/transcript.d.ts +0 -28
  518. package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
  519. package/dist/types/hooks/native-skill-hook.d.ts +0 -28
  520. package/dist/types/hooks/skill-keywords.d.ts +0 -18
  521. package/dist/types/hooks/skill-state.d.ts +0 -93
  522. package/dist/types/i18n/index.d.ts +0 -38
  523. package/dist/types/i18n/messages/de.d.ts +0 -2
  524. package/dist/types/i18n/messages/de.messages.d.ts +0 -1
  525. package/dist/types/i18n/messages/de.settings.d.ts +0 -1
  526. package/dist/types/i18n/messages/en.d.ts +0 -81
  527. package/dist/types/i18n/messages/es.d.ts +0 -2
  528. package/dist/types/i18n/messages/es.messages.d.ts +0 -1
  529. package/dist/types/i18n/messages/es.settings.d.ts +0 -1
  530. package/dist/types/i18n/messages/fr.d.ts +0 -2
  531. package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
  532. package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
  533. package/dist/types/i18n/messages/ja.d.ts +0 -2
  534. package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
  535. package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
  536. package/dist/types/i18n/messages/ko.d.ts +0 -2
  537. package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
  538. package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
  539. package/dist/types/i18n/messages/zh.d.ts +0 -2
  540. package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
  541. package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
  542. package/dist/types/index.d.ts +0 -33
  543. package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
  544. package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
  545. package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
  546. package/dist/types/internal-urls/index.d.ts +0 -20
  547. package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
  548. package/dist/types/internal-urls/json-query.d.ts +0 -30
  549. package/dist/types/internal-urls/local-protocol.d.ts +0 -39
  550. package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
  551. package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
  552. package/dist/types/internal-urls/parse.d.ts +0 -19
  553. package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
  554. package/dist/types/internal-urls/router.d.ts +0 -14
  555. package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
  556. package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
  557. package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
  558. package/dist/types/internal-urls/types.d.ts +0 -109
  559. package/dist/types/lsp/client.d.ts +0 -66
  560. package/dist/types/lsp/clients/biome-client.d.ts +0 -16
  561. package/dist/types/lsp/clients/index.d.ts +0 -19
  562. package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
  563. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
  564. package/dist/types/lsp/config.d.ts +0 -65
  565. package/dist/types/lsp/edits.d.ts +0 -23
  566. package/dist/types/lsp/index.d.ts +0 -130
  567. package/dist/types/lsp/lspmux.d.ts +0 -58
  568. package/dist/types/lsp/render.d.ts +0 -32
  569. package/dist/types/lsp/startup-events.d.ts +0 -12
  570. package/dist/types/lsp/types.d.ts +0 -306
  571. package/dist/types/lsp/utils.d.ts +0 -108
  572. package/dist/types/main.d.ts +0 -75
  573. package/dist/types/memories/index.d.ts +0 -28
  574. package/dist/types/memories/storage.d.ts +0 -110
  575. package/dist/types/memory-backend/index.d.ts +0 -4
  576. package/dist/types/memory-backend/local-backend.d.ts +0 -9
  577. package/dist/types/memory-backend/off-backend.d.ts +0 -7
  578. package/dist/types/memory-backend/resolve.d.ts +0 -15
  579. package/dist/types/memory-backend/types.d.ts +0 -61
  580. package/dist/types/migrate/action-planner.d.ts +0 -11
  581. package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
  582. package/dist/types/migrate/adapters/codex.d.ts +0 -5
  583. package/dist/types/migrate/adapters/index.d.ts +0 -45
  584. package/dist/types/migrate/adapters/opencode.d.ts +0 -2
  585. package/dist/types/migrate/executor.d.ts +0 -2
  586. package/dist/types/migrate/mcp-mapper.d.ts +0 -20
  587. package/dist/types/migrate/report.d.ts +0 -18
  588. package/dist/types/migrate/skill-normalizer.d.ts +0 -27
  589. package/dist/types/migrate/types.d.ts +0 -126
  590. package/dist/types/modes/acp/acp-agent.d.ts +0 -61
  591. package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
  592. package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -34
  593. package/dist/types/modes/acp/acp-mode.d.ts +0 -5
  594. package/dist/types/modes/acp/index.d.ts +0 -2
  595. package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
  596. package/dist/types/modes/bridge/auth.d.ts +0 -12
  597. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  598. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  599. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  600. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  601. package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
  602. package/dist/types/modes/components/assistant-message.d.ts +0 -20
  603. package/dist/types/modes/components/bash-execution.d.ts +0 -29
  604. package/dist/types/modes/components/bordered-loader.d.ts +0 -11
  605. package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
  606. package/dist/types/modes/components/btw-panel.d.ts +0 -16
  607. package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
  608. package/dist/types/modes/components/countdown-timer.d.ts +0 -14
  609. package/dist/types/modes/components/custom-editor.d.ts +0 -67
  610. package/dist/types/modes/components/custom-message.d.ts +0 -15
  611. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
  612. package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
  613. package/dist/types/modes/components/diff.d.ts +0 -11
  614. package/dist/types/modes/components/dynamic-border.d.ts +0 -14
  615. package/dist/types/modes/components/eval-execution.d.ts +0 -23
  616. package/dist/types/modes/components/execution-shared.d.ts +0 -46
  617. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
  618. package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
  619. package/dist/types/modes/components/extensions/index.d.ts +0 -8
  620. package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
  621. package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
  622. package/dist/types/modes/components/extensions/types.d.ts +0 -151
  623. package/dist/types/modes/components/footer.d.ts +0 -30
  624. package/dist/types/modes/components/history-search.d.ts +0 -7
  625. package/dist/types/modes/components/hook-editor.d.ts +0 -18
  626. package/dist/types/modes/components/hook-input.d.ts +0 -15
  627. package/dist/types/modes/components/hook-message.d.ts +0 -15
  628. package/dist/types/modes/components/hook-selector.d.ts +0 -53
  629. package/dist/types/modes/components/index.d.ts +0 -35
  630. package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
  631. package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
  632. package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
  633. package/dist/types/modes/components/login-dialog.d.ts +0 -32
  634. package/dist/types/modes/components/message-frame.d.ts +0 -42
  635. package/dist/types/modes/components/model-selector.d.ts +0 -60
  636. package/dist/types/modes/components/oauth-selector.d.ts +0 -17
  637. package/dist/types/modes/components/plugin-selector.d.ts +0 -26
  638. package/dist/types/modes/components/plugin-settings.d.ts +0 -66
  639. package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
  640. package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
  641. package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
  642. package/dist/types/modes/components/read-tool-group.d.ts +0 -30
  643. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
  644. package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
  645. package/dist/types/modes/components/session-selector.d.ts +0 -30
  646. package/dist/types/modes/components/settings-defs.d.ts +0 -50
  647. package/dist/types/modes/components/settings-selector.d.ts +0 -62
  648. package/dist/types/modes/components/show-images-selector.d.ts +0 -9
  649. package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
  650. package/dist/types/modes/components/skill-message.d.ts +0 -10
  651. package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
  652. package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
  653. package/dist/types/modes/components/status-line/index.d.ts +0 -4
  654. package/dist/types/modes/components/status-line/presets.d.ts +0 -3
  655. package/dist/types/modes/components/status-line/segments.d.ts +0 -5
  656. package/dist/types/modes/components/status-line/separators.d.ts +0 -3
  657. package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
  658. package/dist/types/modes/components/status-line/types.d.ts +0 -77
  659. package/dist/types/modes/components/status-line.d.ts +0 -103
  660. package/dist/types/modes/components/theme-selector.d.ts +0 -10
  661. package/dist/types/modes/components/thinking-selector.d.ts +0 -15
  662. package/dist/types/modes/components/todo-reminder.d.ts +0 -13
  663. package/dist/types/modes/components/tool-execution.d.ts +0 -54
  664. package/dist/types/modes/components/tree-selector.d.ts +0 -31
  665. package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
  666. package/dist/types/modes/components/two-column-body.d.ts +0 -9
  667. package/dist/types/modes/components/user-message-selector.d.ts +0 -28
  668. package/dist/types/modes/components/user-message.d.ts +0 -7
  669. package/dist/types/modes/components/visual-truncate.d.ts +0 -19
  670. package/dist/types/modes/components/welcome.d.ts +0 -45
  671. package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
  672. package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
  673. package/dist/types/modes/controllers/command-controller.d.ts +0 -40
  674. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  675. package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
  676. package/dist/types/modes/controllers/input-controller.d.ts +0 -42
  677. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
  678. package/dist/types/modes/controllers/selector-controller.d.ts +0 -67
  679. package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
  680. package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
  681. package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
  682. package/dist/types/modes/index.d.ts +0 -10
  683. package/dist/types/modes/interactive-mode.d.ts +0 -275
  684. package/dist/types/modes/jobs-observer.d.ts +0 -57
  685. package/dist/types/modes/oauth-manual-input.d.ts +0 -8
  686. package/dist/types/modes/print-mode.d.ts +0 -45
  687. package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
  688. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  689. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  690. package/dist/types/modes/rpc/rpc-client.d.ts +0 -288
  691. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -85
  692. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  693. package/dist/types/modes/rpc/rpc-types.d.ts +0 -794
  694. package/dist/types/modes/runtime-init.d.ts +0 -21
  695. package/dist/types/modes/session-observer-registry.d.ts +0 -26
  696. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
  697. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  698. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  699. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  700. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -94
  701. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
  702. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
  703. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
  704. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  705. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  706. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  707. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  708. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  709. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  710. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  711. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  712. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  713. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  714. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  715. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -161
  716. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -82
  717. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -114
  718. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
  719. package/dist/types/modes/shared.d.ts +0 -15
  720. package/dist/types/modes/slash-command-visibility.d.ts +0 -1
  721. package/dist/types/modes/theme/defaults/index.d.ts +0 -652
  722. package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
  723. package/dist/types/modes/theme/shimmer.d.ts +0 -38
  724. package/dist/types/modes/theme/theme.d.ts +0 -275
  725. package/dist/types/modes/tmux-scroll.d.ts +0 -18
  726. package/dist/types/modes/types.d.ts +0 -292
  727. package/dist/types/modes/utils/abort-message.d.ts +0 -4
  728. package/dist/types/modes/utils/context-usage.d.ts +0 -51
  729. package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
  730. package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
  731. package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
  732. package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
  733. package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
  734. package/dist/types/modes/utils/ui-helpers.d.ts +0 -54
  735. package/dist/types/notifications/attachment-registry.d.ts +0 -17
  736. package/dist/types/notifications/chat-adapters.d.ts +0 -9
  737. package/dist/types/notifications/config-commands.d.ts +0 -64
  738. package/dist/types/notifications/config.d.ts +0 -98
  739. package/dist/types/notifications/daemon-paths.d.ts +0 -10
  740. package/dist/types/notifications/engine.d.ts +0 -59
  741. package/dist/types/notifications/helpers.d.ts +0 -55
  742. package/dist/types/notifications/html-format.d.ts +0 -75
  743. package/dist/types/notifications/index.d.ts +0 -192
  744. package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
  745. package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -99
  746. package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
  747. package/dist/types/notifications/managed-daemon.d.ts +0 -48
  748. package/dist/types/notifications/operator-runtime.d.ts +0 -52
  749. package/dist/types/notifications/rate-limit-pool.d.ts +0 -95
  750. package/dist/types/notifications/recent-activity.d.ts +0 -39
  751. package/dist/types/notifications/reply-sent-store.d.ts +0 -53
  752. package/dist/types/notifications/rich-draft.d.ts +0 -68
  753. package/dist/types/notifications/rich-render.d.ts +0 -90
  754. package/dist/types/notifications/telegram-cli.d.ts +0 -19
  755. package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
  756. package/dist/types/notifications/telegram-daemon-control.d.ts +0 -64
  757. package/dist/types/notifications/telegram-daemon.d.ts +0 -429
  758. package/dist/types/notifications/telegram-reference.d.ts +0 -119
  759. package/dist/types/notifications/threaded-inbound.d.ts +0 -77
  760. package/dist/types/notifications/threaded-render.d.ts +0 -88
  761. package/dist/types/notifications/topic-registry.d.ts +0 -69
  762. package/dist/types/plan-mode/approved-plan.d.ts +0 -49
  763. package/dist/types/plan-mode/state.d.ts +0 -6
  764. package/dist/types/registry/agent-registry.d.ts +0 -62
  765. package/dist/types/reminders/star-reminder.d.ts +0 -115
  766. package/dist/types/research-plan/index.d.ts +0 -1
  767. package/dist/types/research-plan/ledger.d.ts +0 -33
  768. package/dist/types/rlm/artifacts.d.ts +0 -9
  769. package/dist/types/rlm/complete-research-tool.d.ts +0 -35
  770. package/dist/types/rlm/data-context.d.ts +0 -6
  771. package/dist/types/rlm/index.d.ts +0 -47
  772. package/dist/types/rlm/notebook.d.ts +0 -12
  773. package/dist/types/rlm/preset.d.ts +0 -23
  774. package/dist/types/rlm/python-tool.d.ts +0 -16
  775. package/dist/types/rlm/report.d.ts +0 -14
  776. package/dist/types/rlm/types.d.ts +0 -37
  777. package/dist/types/runtime/process-lifecycle.d.ts +0 -108
  778. package/dist/types/runtime-api-key.d.ts +0 -7
  779. package/dist/types/runtime-credential-selector.d.ts +0 -7
  780. package/dist/types/runtime-mcp/client.d.ts +0 -74
  781. package/dist/types/runtime-mcp/config-writer.d.ts +0 -88
  782. package/dist/types/runtime-mcp/config.d.ts +0 -77
  783. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  784. package/dist/types/runtime-mcp/index.d.ts +0 -18
  785. package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
  786. package/dist/types/runtime-mcp/loader.d.ts +0 -45
  787. package/dist/types/runtime-mcp/manager.d.ts +0 -195
  788. package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
  789. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
  790. package/dist/types/runtime-mcp/render.d.ts +0 -25
  791. package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
  792. package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
  793. package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
  794. package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
  795. package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
  796. package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
  797. package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
  798. package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
  799. package/dist/types/runtime-mcp/types.d.ts +0 -348
  800. package/dist/types/sdk.d.ts +0 -254
  801. package/dist/types/secrets/index.d.ts +0 -9
  802. package/dist/types/secrets/obfuscator.d.ts +0 -23
  803. package/dist/types/secrets/regex.d.ts +0 -2
  804. package/dist/types/session/agent-session.d.ts +0 -1185
  805. package/dist/types/session/agent-storage.d.ts +0 -101
  806. package/dist/types/session/artifacts.d.ts +0 -64
  807. package/dist/types/session/auth-broker-config.d.ts +0 -13
  808. package/dist/types/session/auth-storage.d.ts +0 -6
  809. package/dist/types/session/blob-store.d.ts +0 -160
  810. package/dist/types/session/client-bridge.d.ts +0 -88
  811. package/dist/types/session/contribution-prep.d.ts +0 -47
  812. package/dist/types/session/file-mention-pruning.d.ts +0 -8
  813. package/dist/types/session/history-storage.d.ts +0 -16
  814. package/dist/types/session/messages.d.ts +0 -169
  815. package/dist/types/session/session-dump-format.d.ts +0 -22
  816. package/dist/types/session/session-manager.d.ts +0 -660
  817. package/dist/types/session/session-storage.d.ts +0 -88
  818. package/dist/types/session/streaming-output.d.ts +0 -209
  819. package/dist/types/session/tool-choice-queue.d.ts +0 -84
  820. package/dist/types/session/yield-queue.d.ts +0 -24
  821. package/dist/types/setup/credential-auto-import.d.ts +0 -63
  822. package/dist/types/setup/credential-import.d.ts +0 -82
  823. package/dist/types/setup/hermes-setup.d.ts +0 -78
  824. package/dist/types/setup/host-plugin-setup.d.ts +0 -39
  825. package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
  826. package/dist/types/setup/provider-onboarding.d.ts +0 -52
  827. package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
  828. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
  829. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
  830. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
  831. package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
  832. package/dist/types/skc-runtime/gc-render.d.ts +0 -6
  833. package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
  834. package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
  835. package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
  836. package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
  837. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
  838. package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
  839. package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
  840. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
  841. package/dist/types/skc-runtime/session-layout.d.ts +0 -59
  842. package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
  843. package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -39
  844. package/dist/types/skc-runtime/state-graph.d.ts +0 -4
  845. package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
  846. package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
  847. package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
  848. package/dist/types/skc-runtime/state-schema.d.ts +0 -319
  849. package/dist/types/skc-runtime/state-validation.d.ts +0 -6
  850. package/dist/types/skc-runtime/state-writer.d.ts +0 -244
  851. package/dist/types/skc-runtime/team-gc.d.ts +0 -7
  852. package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
  853. package/dist/types/skc-runtime/tmux-common.d.ts +0 -105
  854. package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
  855. package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -62
  856. package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
  857. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
  858. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
  859. package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
  860. package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
  861. package/dist/types/skill-state/active-state.d.ts +0 -126
  862. package/dist/types/skill-state/canonical-skills.d.ts +0 -3
  863. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
  864. package/dist/types/skill-state/initial-phase.d.ts +0 -12
  865. package/dist/types/skill-state/workflow-hud.d.ts +0 -83
  866. package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
  867. package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
  868. package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
  869. package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
  870. package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
  871. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
  872. package/dist/types/slash-commands/helpers/format.d.ts +0 -10
  873. package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
  874. package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
  875. package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
  876. package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
  877. package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
  878. package/dist/types/slash-commands/types.d.ts +0 -120
  879. package/dist/types/ssh/config-writer.d.ts +0 -49
  880. package/dist/types/ssh/connection-manager.d.ts +0 -33
  881. package/dist/types/ssh/ssh-executor.d.ts +0 -37
  882. package/dist/types/ssh/sshfs-mount.d.ts +0 -6
  883. package/dist/types/ssh/utils.d.ts +0 -2
  884. package/dist/types/stt/downloader.d.ts +0 -9
  885. package/dist/types/stt/index.d.ts +0 -3
  886. package/dist/types/stt/recorder.d.ts +0 -13
  887. package/dist/types/stt/setup.d.ts +0 -18
  888. package/dist/types/stt/stt-controller.d.ts +0 -16
  889. package/dist/types/stt/transcriber.d.ts +0 -16
  890. package/dist/types/system-prompt.d.ts +0 -118
  891. package/dist/types/task/agents.d.ts +0 -28
  892. package/dist/types/task/commands.d.ts +0 -35
  893. package/dist/types/task/discovery.d.ts +0 -19
  894. package/dist/types/task/executor.d.ts +0 -124
  895. package/dist/types/task/fork-context-advisory.d.ts +0 -13
  896. package/dist/types/task/fork-context-budget.d.ts +0 -7
  897. package/dist/types/task/id.d.ts +0 -7
  898. package/dist/types/task/index.d.ts +0 -43
  899. package/dist/types/task/name-generator.d.ts +0 -16
  900. package/dist/types/task/output-manager.d.ts +0 -36
  901. package/dist/types/task/parallel.d.ts +0 -34
  902. package/dist/types/task/receipt.d.ts +0 -87
  903. package/dist/types/task/render.d.ts +0 -28
  904. package/dist/types/task/roi-reconciliation.d.ts +0 -27
  905. package/dist/types/task/simple-mode.d.ts +0 -8
  906. package/dist/types/task/skc-command.d.ts +0 -7
  907. package/dist/types/task/spawn-gate.d.ts +0 -29
  908. package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
  909. package/dist/types/task/token-log.d.ts +0 -30
  910. package/dist/types/task/token-log.test.d.ts +0 -1
  911. package/dist/types/task/types.d.ts +0 -508
  912. package/dist/types/task/worktree.d.ts +0 -94
  913. package/dist/types/thinking-metadata.d.ts +0 -16
  914. package/dist/types/thinking.d.ts +0 -22
  915. package/dist/types/tool-discovery/tool-index.d.ts +0 -112
  916. package/dist/types/tools/archive-reader.d.ts +0 -40
  917. package/dist/types/tools/ask-answer-registry.d.ts +0 -13
  918. package/dist/types/tools/ask.d.ts +0 -123
  919. package/dist/types/tools/ast-edit.d.ts +0 -77
  920. package/dist/types/tools/ast-grep.d.ts +0 -69
  921. package/dist/types/tools/auto-generated-guard.d.ts +0 -17
  922. package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
  923. package/dist/types/tools/bash-command-fixup.d.ts +0 -11
  924. package/dist/types/tools/bash-interactive.d.ts +0 -16
  925. package/dist/types/tools/bash-interceptor.d.ts +0 -24
  926. package/dist/types/tools/bash-pty-selection.d.ts +0 -7
  927. package/dist/types/tools/bash-skill-urls.d.ts +0 -31
  928. package/dist/types/tools/bash.d.ts +0 -157
  929. package/dist/types/tools/bisect.d.ts +0 -81
  930. package/dist/types/tools/browser/actions.d.ts +0 -54
  931. package/dist/types/tools/browser/attach.d.ts +0 -50
  932. package/dist/types/tools/browser/launch.d.ts +0 -62
  933. package/dist/types/tools/browser/readable.d.ts +0 -17
  934. package/dist/types/tools/browser/registry.d.ts +0 -57
  935. package/dist/types/tools/browser/render.d.ts +0 -53
  936. package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
  937. package/dist/types/tools/browser/tab-supervisor.d.ts +0 -103
  938. package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
  939. package/dist/types/tools/browser/tab-worker.d.ts +0 -19
  940. package/dist/types/tools/browser.d.ts +0 -211
  941. package/dist/types/tools/calculator.d.ts +0 -76
  942. package/dist/types/tools/checkpoint.d.ts +0 -63
  943. package/dist/types/tools/composer-bash-policy.d.ts +0 -14
  944. package/dist/types/tools/computer/render.d.ts +0 -17
  945. package/dist/types/tools/computer-gc.d.ts +0 -23
  946. package/dist/types/tools/computer.d.ts +0 -465
  947. package/dist/types/tools/conflict-detect.d.ts +0 -205
  948. package/dist/types/tools/context.d.ts +0 -19
  949. package/dist/types/tools/cron.d.ts +0 -91
  950. package/dist/types/tools/debug.d.ts +0 -209
  951. package/dist/types/tools/eval.d.ts +0 -108
  952. package/dist/types/tools/fetch.d.ts +0 -84
  953. package/dist/types/tools/file-recorder.d.ts +0 -13
  954. package/dist/types/tools/find.d.ts +0 -95
  955. package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
  956. package/dist/types/tools/gh-format.d.ts +0 -6
  957. package/dist/types/tools/gh-renderer.d.ts +0 -25
  958. package/dist/types/tools/gh.d.ts +0 -356
  959. package/dist/types/tools/github-cache.d.ts +0 -103
  960. package/dist/types/tools/grouped-file-output.d.ts +0 -36
  961. package/dist/types/tools/hindsight-recall.d.ts +0 -21
  962. package/dist/types/tools/hindsight-reflect.d.ts +0 -23
  963. package/dist/types/tools/hindsight-retain.d.ts +0 -27
  964. package/dist/types/tools/image-gen.d.ts +0 -79
  965. package/dist/types/tools/index.d.ts +0 -319
  966. package/dist/types/tools/irc.d.ts +0 -79
  967. package/dist/types/tools/job.d.ts +0 -78
  968. package/dist/types/tools/json-tree.d.ts +0 -23
  969. package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
  970. package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
  971. package/dist/types/tools/jtd-utils.d.ts +0 -42
  972. package/dist/types/tools/list-limit.d.ts +0 -12
  973. package/dist/types/tools/match-line-format.d.ts +0 -11
  974. package/dist/types/tools/monitor.d.ts +0 -54
  975. package/dist/types/tools/output-meta.d.ts +0 -204
  976. package/dist/types/tools/path-utils.d.ts +0 -147
  977. package/dist/types/tools/plan-mode-guard.d.ts +0 -18
  978. package/dist/types/tools/read.d.ts +0 -85
  979. package/dist/types/tools/recipe/index.d.ts +0 -45
  980. package/dist/types/tools/recipe/render.d.ts +0 -36
  981. package/dist/types/tools/recipe/runner.d.ts +0 -60
  982. package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
  983. package/dist/types/tools/recipe/runners/index.d.ts +0 -2
  984. package/dist/types/tools/recipe/runners/just.d.ts +0 -2
  985. package/dist/types/tools/recipe/runners/make.d.ts +0 -2
  986. package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
  987. package/dist/types/tools/recipe/runners/task.d.ts +0 -2
  988. package/dist/types/tools/render-mermaid.d.ts +0 -37
  989. package/dist/types/tools/render-utils.d.ts +0 -158
  990. package/dist/types/tools/renderers.d.ts +0 -26
  991. package/dist/types/tools/resolve.d.ts +0 -80
  992. package/dist/types/tools/resource-gc.d.ts +0 -54
  993. package/dist/types/tools/review.d.ts +0 -63
  994. package/dist/types/tools/search-tool-bm25.d.ts +0 -65
  995. package/dist/types/tools/search.d.ts +0 -93
  996. package/dist/types/tools/skill-discovery.d.ts +0 -40
  997. package/dist/types/tools/skill.d.ts +0 -47
  998. package/dist/types/tools/sqlite-reader.d.ts +0 -94
  999. package/dist/types/tools/ssh.d.ts +0 -67
  1000. package/dist/types/tools/subagent-render.d.ts +0 -31
  1001. package/dist/types/tools/subagent.d.ts +0 -117
  1002. package/dist/types/tools/telegram-send.d.ts +0 -32
  1003. package/dist/types/tools/todo-write.d.ts +0 -120
  1004. package/dist/types/tools/tool-errors.d.ts +0 -33
  1005. package/dist/types/tools/tool-result.d.ts +0 -30
  1006. package/dist/types/tools/tool-timeouts.d.ts +0 -56
  1007. package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
  1008. package/dist/types/tools/vim.d.ts +0 -58
  1009. package/dist/types/tools/write.d.ts +0 -59
  1010. package/dist/types/tools/yield.d.ts +0 -25
  1011. package/dist/types/tui/code-cell.d.ts +0 -32
  1012. package/dist/types/tui/file-list.d.ts +0 -22
  1013. package/dist/types/tui/hyperlink.d.ts +0 -42
  1014. package/dist/types/tui/index.d.ts +0 -11
  1015. package/dist/types/tui/output-block.d.ts +0 -28
  1016. package/dist/types/tui/status-line.d.ts +0 -18
  1017. package/dist/types/tui/tree-list.d.ts +0 -19
  1018. package/dist/types/tui/types.d.ts +0 -13
  1019. package/dist/types/tui/utils.d.ts +0 -36
  1020. package/dist/types/utils/changelog.d.ts +0 -37
  1021. package/dist/types/utils/clipboard.d.ts +0 -22
  1022. package/dist/types/utils/cmux-workspace.d.ts +0 -52
  1023. package/dist/types/utils/command-args.d.ts +0 -9
  1024. package/dist/types/utils/commit-message-generator.d.ts +0 -7
  1025. package/dist/types/utils/edit-mode.d.ts +0 -13
  1026. package/dist/types/utils/event-bus.d.ts +0 -6
  1027. package/dist/types/utils/external-editor.d.ts +0 -17
  1028. package/dist/types/utils/file-display-mode.d.ts +0 -27
  1029. package/dist/types/utils/file-mentions.d.ts +0 -25
  1030. package/dist/types/utils/git.d.ts +0 -393
  1031. package/dist/types/utils/image-loading.d.ts +0 -26
  1032. package/dist/types/utils/image-resize.d.ts +0 -39
  1033. package/dist/types/utils/lang-from-path.d.ts +0 -8
  1034. package/dist/types/utils/markit.d.ts +0 -7
  1035. package/dist/types/utils/open.d.ts +0 -2
  1036. package/dist/types/utils/pasted-image-path.d.ts +0 -30
  1037. package/dist/types/utils/session-color.d.ts +0 -10
  1038. package/dist/types/utils/shell-snapshot.d.ts +0 -5
  1039. package/dist/types/utils/sixel.d.ts +0 -21
  1040. package/dist/types/utils/title-generator.d.ts +0 -31
  1041. package/dist/types/utils/tool-choice.d.ts +0 -20
  1042. package/dist/types/utils/tools-manager.d.ts +0 -9
  1043. package/dist/types/vim/buffer.d.ts +0 -41
  1044. package/dist/types/vim/commands.d.ts +0 -6
  1045. package/dist/types/vim/engine.d.ts +0 -47
  1046. package/dist/types/vim/parser.d.ts +0 -3
  1047. package/dist/types/vim/render.d.ts +0 -25
  1048. package/dist/types/vim/types.d.ts +0 -182
  1049. package/dist/types/web/insane/bridge.d.ts +0 -103
  1050. package/dist/types/web/insane/url-guard.d.ts +0 -25
  1051. package/dist/types/web/kagi.d.ts +0 -23
  1052. package/dist/types/web/parallel.d.ts +0 -58
  1053. package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
  1054. package/dist/types/web/scrapers/arxiv.d.ts +0 -5
  1055. package/dist/types/web/scrapers/aur.d.ts +0 -5
  1056. package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
  1057. package/dist/types/web/scrapers/bluesky.d.ts +0 -5
  1058. package/dist/types/web/scrapers/brew.d.ts +0 -5
  1059. package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
  1060. package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
  1061. package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
  1062. package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
  1063. package/dist/types/web/scrapers/clojars.d.ts +0 -5
  1064. package/dist/types/web/scrapers/coingecko.d.ts +0 -5
  1065. package/dist/types/web/scrapers/crates-io.d.ts +0 -5
  1066. package/dist/types/web/scrapers/crossref.d.ts +0 -2
  1067. package/dist/types/web/scrapers/devto.d.ts +0 -5
  1068. package/dist/types/web/scrapers/discogs.d.ts +0 -8
  1069. package/dist/types/web/scrapers/discourse.d.ts +0 -5
  1070. package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
  1071. package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
  1072. package/dist/types/web/scrapers/fdroid.d.ts +0 -5
  1073. package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
  1074. package/dist/types/web/scrapers/flathub.d.ts +0 -2
  1075. package/dist/types/web/scrapers/github-gist.d.ts +0 -5
  1076. package/dist/types/web/scrapers/github.d.ts +0 -12
  1077. package/dist/types/web/scrapers/gitlab.d.ts +0 -5
  1078. package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
  1079. package/dist/types/web/scrapers/hackage.d.ts +0 -5
  1080. package/dist/types/web/scrapers/hackernews.d.ts +0 -2
  1081. package/dist/types/web/scrapers/hex.d.ts +0 -5
  1082. package/dist/types/web/scrapers/huggingface.d.ts +0 -2
  1083. package/dist/types/web/scrapers/iacr.d.ts +0 -5
  1084. package/dist/types/web/scrapers/index.d.ts +0 -84
  1085. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
  1086. package/dist/types/web/scrapers/lemmy.d.ts +0 -2
  1087. package/dist/types/web/scrapers/lobsters.d.ts +0 -5
  1088. package/dist/types/web/scrapers/mastodon.d.ts +0 -5
  1089. package/dist/types/web/scrapers/maven.d.ts +0 -6
  1090. package/dist/types/web/scrapers/mdn.d.ts +0 -2
  1091. package/dist/types/web/scrapers/metacpan.d.ts +0 -5
  1092. package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
  1093. package/dist/types/web/scrapers/npm.d.ts +0 -5
  1094. package/dist/types/web/scrapers/nuget.d.ts +0 -5
  1095. package/dist/types/web/scrapers/nvd.d.ts +0 -5
  1096. package/dist/types/web/scrapers/ollama.d.ts +0 -2
  1097. package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
  1098. package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
  1099. package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
  1100. package/dist/types/web/scrapers/orcid.d.ts +0 -5
  1101. package/dist/types/web/scrapers/osv.d.ts +0 -5
  1102. package/dist/types/web/scrapers/packagist.d.ts +0 -5
  1103. package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
  1104. package/dist/types/web/scrapers/pubmed.d.ts +0 -5
  1105. package/dist/types/web/scrapers/pypi.d.ts +0 -5
  1106. package/dist/types/web/scrapers/rawg.d.ts +0 -2
  1107. package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
  1108. package/dist/types/web/scrapers/reddit.d.ts +0 -5
  1109. package/dist/types/web/scrapers/repology.d.ts +0 -5
  1110. package/dist/types/web/scrapers/rfc.d.ts +0 -5
  1111. package/dist/types/web/scrapers/rubygems.d.ts +0 -5
  1112. package/dist/types/web/scrapers/searchcode.d.ts +0 -2
  1113. package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
  1114. package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
  1115. package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
  1116. package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
  1117. package/dist/types/web/scrapers/spdx.d.ts +0 -5
  1118. package/dist/types/web/scrapers/spotify.d.ts +0 -8
  1119. package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
  1120. package/dist/types/web/scrapers/terraform.d.ts +0 -5
  1121. package/dist/types/web/scrapers/tldr.d.ts +0 -7
  1122. package/dist/types/web/scrapers/twitter.d.ts +0 -5
  1123. package/dist/types/web/scrapers/types.d.ts +0 -83
  1124. package/dist/types/web/scrapers/utils.d.ts +0 -32
  1125. package/dist/types/web/scrapers/vimeo.d.ts +0 -5
  1126. package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
  1127. package/dist/types/web/scrapers/w3c.d.ts +0 -2
  1128. package/dist/types/web/scrapers/wikidata.d.ts +0 -5
  1129. package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
  1130. package/dist/types/web/scrapers/youtube.d.ts +0 -13
  1131. package/dist/types/web/search/index.d.ts +0 -118
  1132. package/dist/types/web/search/provider.d.ts +0 -55
  1133. package/dist/types/web/search/providers/anthropic.d.ts +0 -32
  1134. package/dist/types/web/search/providers/base.d.ts +0 -90
  1135. package/dist/types/web/search/providers/brave.d.ts +0 -27
  1136. package/dist/types/web/search/providers/codex.d.ts +0 -35
  1137. package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
  1138. package/dist/types/web/search/providers/exa.d.ts +0 -52
  1139. package/dist/types/web/search/providers/gemini.d.ts +0 -57
  1140. package/dist/types/web/search/providers/insane.d.ts +0 -53
  1141. package/dist/types/web/search/providers/jina.d.ts +0 -26
  1142. package/dist/types/web/search/providers/kagi.d.ts +0 -24
  1143. package/dist/types/web/search/providers/kimi.d.ts +0 -27
  1144. package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
  1145. package/dist/types/web/search/providers/parallel.d.ts +0 -15
  1146. package/dist/types/web/search/providers/perplexity.d.ts +0 -38
  1147. package/dist/types/web/search/providers/searxng.d.ts +0 -44
  1148. package/dist/types/web/search/providers/synthetic.d.ts +0 -21
  1149. package/dist/types/web/search/providers/tavily.d.ts +0 -29
  1150. package/dist/types/web/search/providers/text-citations.d.ts +0 -23
  1151. package/dist/types/web/search/providers/utils.d.ts +0 -88
  1152. package/dist/types/web/search/providers/xai.d.ts +0 -64
  1153. package/dist/types/web/search/providers/zai.d.ts +0 -28
  1154. package/dist/types/web/search/render.d.ts +0 -36
  1155. package/dist/types/web/search/types.d.ts +0 -372
  1156. package/dist/types/web/search/utils.d.ts +0 -4
  1157. package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
  1158. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
  1159. package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
  1160. package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
  1161. package/dist/types/workspace-tree.d.ts +0 -42
@@ -10,7 +10,7 @@ import type { DaemonRuntimeInfo } from "../daemon/control-types";
10
10
  import { resolveSkcRuntimeSpawnInfo } from "../daemon/runtime";
11
11
  import { getNotificationConfig, isTelegramConfigured, tokenFingerprint } from "./config";
12
12
  import { parseInThreadConfigCommand, parseRichToggleCommand, parseTelegramControlCommand } from "./config-commands";
13
- import { daemonPaths } from "./daemon-paths";
13
+ import { daemonPaths, HEARTBEAT_TTL_MS } from "./daemon-paths";
14
14
  import {
15
15
  buildCompactChoiceGrid,
16
16
  code,
@@ -71,6 +71,14 @@ export interface DaemonState {
71
71
  heartbeatAt: number;
72
72
  roots: string[];
73
73
  version: 1;
74
+ /**
75
+ * Operational daemon generation of the process that owns the lock, distinct
76
+ * from the persisted state-schema {@link DaemonState.version}. It records the
77
+ * wire generation ({@link DAEMON_GENERATION}) the owning daemon speaks so a
78
+ * freshly-upgraded host can detect — and reload — a still-live pre-upgrade
79
+ * daemon whose schema version is unchanged. Absent on pre-generation state.
80
+ */
81
+ generation?: number;
74
82
  stoppedAt?: number;
75
83
  }
76
84
  export interface TelegramDaemonFs {
@@ -100,15 +108,36 @@ export interface TelegramDaemonDeps {
100
108
  ) => SpawnResult;
101
109
  execPath?: string;
102
110
  randomId?: () => string;
111
+ /**
112
+ * Signal delivery + poll timing for the stale-generation reload handoff in
113
+ * {@link ensureTelegramDaemonRunning}. Defaults use real signals/timers; tests
114
+ * inject them to drive the handoff deterministically.
115
+ */
116
+ sendSignal?: (pid: number, signal: NodeJS.Signals) => void;
117
+ sleep?: (ms: number) => Promise<void>;
118
+ waitStepMs?: number;
103
119
  }
104
120
 
105
121
  export const HEARTBEAT_INTERVAL_MS = 5_000;
106
- export const HEARTBEAT_TTL_MS = 20_000;
122
+ export { HEARTBEAT_TTL_MS };
107
123
  export const DAEMON_VERSION = 1;
108
124
  /** Capability token advertised when the server supports app-level ping/pong. */
109
125
  export const CLIENT_PING_PONG_CAPABILITY = "client_ping_pong";
110
126
  /** Protocol version the daemon advertises in its ClientHello. */
111
- export const NOTIFICATION_PROTOCOL_VERSION = 2;
127
+ export const NOTIFICATION_PROTOCOL_VERSION = 3;
128
+ /** Capability required for typed controls and semantic Selected acknowledgement frames. */
129
+ export const ASK_SELECTED_ACK_CAPABILITY = "ask_selected_ack_v1";
130
+ export const ASK_CONTROLS_CAPABILITY = "ask_controls_v1";
131
+ /**
132
+ * Operational generation the current daemon build speaks, persisted into
133
+ * {@link DaemonState.generation} on ownership acquisition. It is tied to the
134
+ * wire {@link NOTIFICATION_PROTOCOL_VERSION} so any protocol bump (which is what
135
+ * gates capabilities like {@link ASK_SELECTED_ACK_CAPABILITY}) also bumps the
136
+ * generation, letting a freshly-upgraded host recognise an older, still-live
137
+ * daemon and reload it instead of silently attaching to it. Distinct from the
138
+ * persisted schema {@link DAEMON_VERSION}, which did not change across #1999.
139
+ */
140
+ export const DAEMON_GENERATION = NOTIFICATION_PROTOCOL_VERSION;
112
141
 
113
142
  const nodeFs: TelegramDaemonFs = fs.promises as unknown as TelegramDaemonFs;
114
143
 
@@ -146,6 +175,7 @@ const TYPING_REFRESH_INTERVAL_MS = 4_000;
146
175
  const QUEUED_REACTION = "👀";
147
176
  const PENDING_TOPIC_FRAME_LIMIT = 20;
148
177
  const SEEN_UPDATE_ID_LIMIT = 1_000;
178
+ const ORPHAN_TOPIC_GRACE_MS = 60_000;
149
179
  const CONSUMED_REACTION = "✅";
150
180
 
151
181
  function splitTelegramPlainText(text: string, max = TELEGRAM_MESSAGE_LIMIT): string[] {
@@ -166,6 +196,10 @@ function endpointGenerationKey(url: string, token: string): string {
166
196
  return `${url}\0${token}`;
167
197
  }
168
198
 
199
+ function topicRenameApplied(response: unknown): boolean {
200
+ return !!response && typeof response === "object" && (response as { ok?: unknown }).ok === true;
201
+ }
202
+
169
203
  /**
170
204
  * Whether `err` is a transient network failure worth retrying. Telegram API
171
205
  * calls over HTTP/2 occasionally surface mid-stream `ECONNRESET` (and similar)
@@ -362,6 +396,7 @@ export async function acquireDaemonOwnership(input: {
362
396
  attached?: boolean;
363
397
  blocked?: boolean;
364
398
  reason?: "identity_mismatch";
399
+ reloadRequired?: boolean;
365
400
  }> {
366
401
  const fsImpl = input.fs ?? nodeFs;
367
402
  const now = input.now ?? Date.now;
@@ -371,6 +406,28 @@ export async function acquireDaemonOwnership(input: {
371
406
  await ensureDir(fsImpl, paths.dir);
372
407
  const ownerId = input.randomId?.() ?? `${pid}-${now().toString(36)}-${Math.random().toString(36).slice(2)}`;
373
408
  const roots = input.roots ?? (await readJson<{ roots?: string[] }>(fsImpl, paths.roots))?.roots ?? [];
409
+
410
+ // A fresh, identity-matching live owner running an OLDER generation than this
411
+ // build cannot serve our newer wire frames; signal a reload instead of a
412
+ // silent attach. Newer/equal generations attach as before (no downgrade).
413
+ const attachDecision = (
414
+ state: DaemonState | undefined,
415
+ ): { acquired: false; attached: boolean; reloadRequired?: boolean } | undefined => {
416
+ if (
417
+ !isFreshLiveOwner({
418
+ state,
419
+ now: now(),
420
+ tokenFingerprint: input.tokenFingerprint,
421
+ chatId: input.chatId,
422
+ pidAlive,
423
+ })
424
+ ) {
425
+ return undefined;
426
+ }
427
+ return (state?.generation ?? 0) < DAEMON_GENERATION
428
+ ? { acquired: false, attached: false, reloadRequired: true }
429
+ : { acquired: false, attached: true };
430
+ };
374
431
  const existing = await readJson<DaemonState>(fsImpl, paths.state);
375
432
  if (
376
433
  liveOwnerUsesDifferentIdentity({
@@ -382,17 +439,8 @@ export async function acquireDaemonOwnership(input: {
382
439
  ) {
383
440
  return { acquired: false, blocked: true, reason: "identity_mismatch" };
384
441
  }
385
- if (
386
- isFreshLiveOwner({
387
- state: existing,
388
- now: now(),
389
- tokenFingerprint: input.tokenFingerprint,
390
- chatId: input.chatId,
391
- pidAlive,
392
- })
393
- ) {
394
- return { acquired: false, attached: true };
395
- }
442
+ const existingDecision = attachDecision(existing);
443
+ if (existingDecision) return existingDecision;
396
444
  if (await tryOpenWx(fsImpl, paths.lock)) {
397
445
  await writeJsonAtomic(fsImpl, paths.state, {
398
446
  pid,
@@ -403,6 +451,7 @@ export async function acquireDaemonOwnership(input: {
403
451
  heartbeatAt: now(),
404
452
  roots,
405
453
  version: DAEMON_VERSION,
454
+ generation: DAEMON_GENERATION,
406
455
  } satisfies DaemonState);
407
456
  return { acquired: true, ownerId };
408
457
  }
@@ -417,32 +466,14 @@ export async function acquireDaemonOwnership(input: {
417
466
  ) {
418
467
  return { acquired: false, blocked: true, reason: "identity_mismatch" };
419
468
  }
420
- if (
421
- isFreshLiveOwner({
422
- state: afterLock,
423
- now: now(),
424
- tokenFingerprint: input.tokenFingerprint,
425
- chatId: input.chatId,
426
- pidAlive,
427
- })
428
- ) {
429
- return { acquired: false, attached: true };
430
- }
469
+ const afterLockDecision = attachDecision(afterLock);
470
+ if (afterLockDecision) return afterLockDecision;
431
471
  if (!afterLock) return { acquired: false, attached: true };
432
472
  if (!(await tryOpenWx(fsImpl, paths.steal))) return { acquired: false, attached: true };
433
473
  try {
434
474
  const rechecked = await readJson<DaemonState>(fsImpl, paths.state);
435
- if (
436
- isFreshLiveOwner({
437
- state: rechecked,
438
- now: now(),
439
- tokenFingerprint: input.tokenFingerprint,
440
- chatId: input.chatId,
441
- pidAlive,
442
- })
443
- ) {
444
- return { acquired: false, attached: true };
445
- }
475
+ const recheckedDecision = attachDecision(rechecked);
476
+ if (recheckedDecision) return recheckedDecision;
446
477
  if (
447
478
  liveOwnerUsesDifferentIdentity({
448
479
  state: rechecked,
@@ -467,6 +498,7 @@ export async function acquireDaemonOwnership(input: {
467
498
  heartbeatAt: now(),
468
499
  roots,
469
500
  version: DAEMON_VERSION,
501
+ generation: DAEMON_GENERATION,
470
502
  } satisfies DaemonState);
471
503
  return { acquired: true, ownerId };
472
504
  } finally {
@@ -570,6 +602,12 @@ export interface TelegramSpawnOwnerResult {
570
602
  ownerId?: string;
571
603
  runtime: DaemonRuntimeInfo;
572
604
  warnings: string[];
605
+ /**
606
+ * Set when ownership was NOT acquired because a still-live owner is running an
607
+ * older daemon generation. The caller must hand off via a reload rather than
608
+ * attach; see {@link ensureTelegramDaemonRunning}.
609
+ */
610
+ reloadRequired?: boolean;
573
611
  }
574
612
 
575
613
  /**
@@ -638,7 +676,7 @@ export async function spawnTelegramDaemonOwner(
638
676
  warnings: ["live telegram daemon uses a different bot token or chat; refusing to attach"],
639
677
  };
640
678
  }
641
- return { result: "attached", runtime, warnings: [] };
679
+ return { result: "attached", runtime, warnings: [], reloadRequired: ownership.reloadRequired };
642
680
  }
643
681
  const spawnImpl = deps.spawn ?? defaultDaemonSpawn;
644
682
  const child = spawnImpl(command, args, {
@@ -666,12 +704,45 @@ export async function ensureTelegramDaemonRunning(
666
704
  logger.warn(`notifications: failed to ensure Telegram daemon: ${spawned.warnings.join("; ")}`);
667
705
  return spawned.result;
668
706
  }
707
+ if (spawned.reloadRequired) {
708
+ // A still-live owner is running an OLDER daemon generation than this host
709
+ // (e.g. a pre-upgrade daemon reused in place across an in-place upgrade).
710
+ // Attaching would silently drop this host's newer ask-ack / control frames,
711
+ // so register this session's root first — so the replacement daemon serves
712
+ // it — then hand off through the tested SIGTERM/control reload path to bring
713
+ // up a fresh current-generation daemon.
714
+ await registerNotificationRoot({ ...input, fs: deps.fs });
715
+ await reloadStaleGenerationOwner(input.settings, deps);
716
+ return "owner_spawned";
717
+ }
669
718
  await registerNotificationRoot({ ...input, fs: deps.fs });
670
719
  return spawned.result;
671
720
  }
672
721
 
722
+ /**
723
+ * Reload a still-live owner running an older daemon generation through the
724
+ * cooperative SIGTERM/control handoff. Lazily imports the controller to avoid a
725
+ * static import cycle (the controller module imports ownership helpers here).
726
+ */
727
+ async function reloadStaleGenerationOwner(settings: Settings, deps: TelegramDaemonDeps): Promise<void> {
728
+ const { TelegramDaemonController } = await import("./telegram-daemon-control");
729
+ const controller = new TelegramDaemonController(settings, {
730
+ fs: deps.fs,
731
+ now: deps.now,
732
+ pidAlive: deps.pidAlive,
733
+ sendSignal: deps.sendSignal,
734
+ spawn: deps.spawn,
735
+ execPath: deps.execPath,
736
+ ownerPid: deps.pid,
737
+ randomId: deps.randomId,
738
+ sleep: deps.sleep,
739
+ waitStepMs: deps.waitStepMs,
740
+ });
741
+ await controller.reload();
742
+ }
743
+
673
744
  export interface BotApi {
674
- call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown>;
745
+ call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown>;
675
746
  }
676
747
 
677
748
  export interface TelegramTransportOptions {
@@ -689,7 +760,7 @@ export class TelegramBotTransport implements BotApi {
689
760
  this.#opts = opts;
690
761
  }
691
762
 
692
- async call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown> {
763
+ async call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown> {
693
764
  const apiBase = this.#opts.apiBase ?? "https://api.telegram.org";
694
765
  const url = `${apiBase}/bot${this.#opts.botToken}/${method}`;
695
766
  const fetchImpl = this.#opts.fetchImpl ?? fetch;
@@ -713,7 +784,13 @@ export class TelegramBotTransport implements BotApi {
713
784
  if (b.caption) form.set("caption", b.caption);
714
785
  if (b.parse_mode) form.set("parse_mode", String(b.parse_mode));
715
786
  form.set("photo", new Blob([Buffer.from(b.photo, "base64")], { type: b.mime ?? "image/png" }), "image");
716
- const res = await fetchWithRetry(fetchImpl, url, { method: "POST", body: form, signal: opts?.signal }, sleep);
787
+ const res = await fetchWithRetry(
788
+ fetchImpl,
789
+ url,
790
+ { method: "POST", body: form, signal: opts?.signal },
791
+ sleep,
792
+ opts?.noRetry ? 1 : undefined,
793
+ );
717
794
  return res.json();
718
795
  }
719
796
  const docBody = body as { document?: unknown } | null;
@@ -737,7 +814,13 @@ export class TelegramBotTransport implements BotApi {
737
814
  new Blob([Buffer.from(b.document, "base64")], { type: b.mime ?? "application/octet-stream" }),
738
815
  b.fileName ?? "file",
739
816
  );
740
- const res = await fetchWithRetry(fetchImpl, url, { method: "POST", body: form, signal: opts?.signal }, sleep);
817
+ const res = await fetchWithRetry(
818
+ fetchImpl,
819
+ url,
820
+ { method: "POST", body: form, signal: opts?.signal },
821
+ sleep,
822
+ opts?.noRetry ? 1 : undefined,
823
+ );
741
824
  return res.json();
742
825
  }
743
826
  const res = await fetchWithRetry(
@@ -750,16 +833,21 @@ export class TelegramBotTransport implements BotApi {
750
833
  signal: opts?.signal,
751
834
  },
752
835
  sleep,
836
+ opts?.noRetry ? 1 : undefined,
753
837
  );
754
838
  return res.json();
755
839
  }
756
840
  }
757
841
 
842
+ type PairedChatPrivacy = "private" | "non-private" | "indeterminate";
843
+
844
+ export type TelegramUpdateOutcome = "consumed" | "retry";
845
+
758
846
  export interface TelegramUpdatePollerOptions {
759
847
  botApi: BotApi;
760
848
  runtime: NotificationOperatorRuntime;
761
849
  backoff: OperatorBackoffPolicy;
762
- processUpdate: (update: unknown) => Promise<void>;
850
+ processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
763
851
  }
764
852
 
765
853
  /** Owns getUpdates offset, conflict backoff, and per-update error isolation. */
@@ -804,11 +892,16 @@ export class TelegramUpdatePoller {
804
892
  }
805
893
  this.#opts.backoff.reset();
806
894
  for (const update of body.result ?? []) {
807
- this.#offset = update.update_id + 1;
808
895
  try {
809
- await this.#opts.processUpdate(update);
896
+ const outcome = await this.#opts.processUpdate(update);
897
+ if (outcome === "retry") {
898
+ await this.#opts.runtime.sleep(this.#opts.backoff.next(), signal);
899
+ break;
900
+ }
901
+ this.#offset = update.update_id + 1;
810
902
  } catch (err) {
811
903
  logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
904
+ this.#offset = update.update_id + 1;
812
905
  }
813
906
  }
814
907
  return body.result?.length ?? 0;
@@ -866,6 +959,12 @@ export interface TelegramDaemonOptions {
866
959
  rich?: { enabled: boolean };
867
960
  /** Opt-in rich-draft streaming of live turn previews (off by default; see rich-draft.ts). */
868
961
  richDraft?: { enabled: boolean };
962
+ /**
963
+ * Per-session Telegram forum-topic naming. `nameTemplate` supports the
964
+ * `{repo}`, `{branch}`, and `{title}` placeholders; unset preserves the
965
+ * built-in `{repo}/{branch} - {title}` composition and its fallbacks.
966
+ */
967
+ topics?: { nameTemplate?: string };
869
968
  }
870
969
 
871
970
  interface SessionSocket {
@@ -889,6 +988,29 @@ interface PendingThreadedFrame {
889
988
  msg: Record<string, unknown>;
890
989
  }
891
990
 
991
+ type SelectedAckOutcome =
992
+ | { status: "delivered"; messageId: number }
993
+ | { status: "failed"; reason: "route_missing" | "expired" | "cancelled" | "telegram_rejected" }
994
+ | { status: "unknown"; reason: "transport_ambiguous" | "shutdown" };
995
+
996
+ interface SelectedAckQueueItem {
997
+ pendingKey: string;
998
+ cacheKey: string;
999
+ itemId: string;
1000
+ requestId: string;
1001
+ commitKey: string;
1002
+ session: SessionSocket;
1003
+ state: "queued" | "dispatching" | "sending";
1004
+ controller?: AbortController;
1005
+ followers: Array<{ pendingKey: string; requestId: string; commitKey: string }>;
1006
+ }
1007
+
1008
+ interface TelegramQueuePayload {
1009
+ send: ThreadedSend;
1010
+ topicId?: string;
1011
+ selectedAck?: SelectedAckQueueItem;
1012
+ }
1013
+
892
1014
  export class TelegramNotificationDaemon {
893
1015
  readonly aliasTable: AliasTable;
894
1016
  readonly messageRoutes = new Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>();
@@ -903,7 +1025,12 @@ export class TelegramNotificationDaemon {
903
1025
  private readonly fsImpl: TelegramDaemonFs;
904
1026
  private readonly botApi: BotApi;
905
1027
  private readonly topics = new TopicRegistry();
906
- private readonly pool: RateLimitPool<{ send: ThreadedSend; topicId?: string }>;
1028
+ /** Serializes registry snapshots so an older atomic write cannot overwrite newer rename state. */
1029
+ private topicsPersistQueue: Promise<void> = Promise.resolve();
1030
+ /** Daemon edit attempts that can race an accepted user service message. */
1031
+ private readonly daemonRenameAttempts = new Map<string, number>();
1032
+ private readonly selectedAckPending = new Map<string, SelectedAckQueueItem>();
1033
+ private readonly pool: RateLimitPool<TelegramQueuePayload>;
907
1034
  private readonly poller: TelegramUpdatePoller;
908
1035
  private readonly dispatchState = new TelegramEventDispatchState();
909
1036
  /** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
@@ -951,6 +1078,33 @@ export class TelegramNotificationDaemon {
951
1078
  >();
952
1079
  /** Monotonic counter for unique lifecycle request ids. */
953
1080
  private lifecycleSeq = 0;
1081
+ /** Attempt tombstones live for the daemon lifetime so a commit key can never send twice. */
1082
+ private readonly selectedAckCache = new Map<string, SelectedAckOutcome>();
1083
+ private cacheSelectedAck(cacheKey: string, outcome: SelectedAckOutcome): void {
1084
+ this.selectedAckCache.set(cacheKey, outcome);
1085
+ }
1086
+
1087
+ private getCachedSelectedAck(cacheKey: string): SelectedAckOutcome | undefined {
1088
+ return this.selectedAckCache.get(cacheKey);
1089
+ }
1090
+ private finishSelectedAck(item: SelectedAckQueueItem, outcome: SelectedAckOutcome): void {
1091
+ if (this.selectedAckPending.get(item.pendingKey) !== item) return;
1092
+ this.selectedAckPending.delete(item.pendingKey);
1093
+ for (const follower of item.followers) this.selectedAckPending.delete(follower.pendingKey);
1094
+ this.cacheSelectedAck(item.cacheKey, outcome);
1095
+ if (item.session.ws.readyState === WebSocket.OPEN) {
1096
+ for (const result of [{ requestId: item.requestId, commitKey: item.commitKey }, ...item.followers]) {
1097
+ item.session.ws.send(
1098
+ JSON.stringify({
1099
+ type: "ask_selected_ack_result",
1100
+ requestId: result.requestId,
1101
+ commitKey: result.commitKey,
1102
+ outcome,
1103
+ }),
1104
+ );
1105
+ }
1106
+ }
1107
+ }
954
1108
 
955
1109
  /**
956
1110
  * Cooperatively stop the daemon: set the stop flag and abort the in-flight
@@ -958,6 +1112,11 @@ export class TelegramNotificationDaemon {
958
1112
  * ~25s getUpdates timeout. Safe to call from a signal handler.
959
1113
  */
960
1114
  requestStop(_reason?: "reload" | "stop" | "signal"): void {
1115
+ for (const item of new Set(this.selectedAckPending.values())) {
1116
+ if (item.state === "queued") this.pool.removeById(item.itemId);
1117
+ else item.controller?.abort();
1118
+ this.finishSelectedAck(item, { status: "unknown", reason: "shutdown" });
1119
+ }
961
1120
  this.runtime.requestStop();
962
1121
  this.running = false;
963
1122
  }
@@ -1293,7 +1452,7 @@ export class TelegramNotificationDaemon {
1293
1452
  botApi: this.botApi,
1294
1453
  runtime: this.runtime,
1295
1454
  backoff: this.pollConflictBackoff,
1296
- processUpdate: update => this.handleTelegramUpdate(update),
1455
+ processUpdate: update => this.processTelegramUpdate(update),
1297
1456
  });
1298
1457
  }
1299
1458
 
@@ -1310,6 +1469,134 @@ export class TelegramNotificationDaemon {
1310
1469
  }
1311
1470
  },
1312
1471
  })
1472
+ .add({
1473
+ name: "ask-selected-ack",
1474
+ matches: msg => msg.type === "ask_selected_ack_request",
1475
+ handle: async (session, msg) => {
1476
+ const requestId = typeof msg.requestId === "string" ? msg.requestId : undefined;
1477
+ const commitKey = typeof msg.commitKey === "string" ? msg.commitKey : undefined;
1478
+ const mode = msg.mode === "live" || msg.mode === "recovery" ? msg.mode : undefined;
1479
+ const deadlineAt = typeof msg.deadlineAt === "number" ? msg.deadlineAt : undefined;
1480
+ if (!requestId || !commitKey || !mode || !deadlineAt) return;
1481
+ const cacheKey = `${session.sessionId}\0${commitKey}`;
1482
+ const cached = this.getCachedSelectedAck(cacheKey);
1483
+ if (cached) {
1484
+ session.ws.send(
1485
+ JSON.stringify({ type: "ask_selected_ack_result", requestId, commitKey, outcome: cached }),
1486
+ );
1487
+ return;
1488
+ }
1489
+ const finishImmediately = (outcome: SelectedAckOutcome): void => {
1490
+ this.cacheSelectedAck(cacheKey, outcome);
1491
+ if (session.ws.readyState === WebSocket.OPEN) {
1492
+ session.ws.send(
1493
+ JSON.stringify({ type: "ask_selected_ack_result", requestId, commitKey, outcome }),
1494
+ );
1495
+ }
1496
+ };
1497
+ if (deadlineAt <= this.runtime.now()) {
1498
+ finishImmediately({ status: "failed", reason: "expired" });
1499
+ return;
1500
+ }
1501
+ if (mode === "live" && (typeof msg.actionId !== "string" || !session.pending.has(msg.actionId))) {
1502
+ finishImmediately({ status: "failed", reason: "route_missing" });
1503
+ return;
1504
+ }
1505
+ const topicId = this.topics.get(session.sessionId)?.topicId;
1506
+ if (mode === "recovery" && (!topicId || msg.sessionId !== session.sessionId)) {
1507
+ finishImmediately({ status: "failed", reason: "route_missing" });
1508
+ return;
1509
+ }
1510
+ const existing = [...new Set(this.selectedAckPending.values())].find(item => item.cacheKey === cacheKey);
1511
+ if (existing) {
1512
+ if (
1513
+ existing.requestId === requestId ||
1514
+ existing.followers.some(follower => follower.requestId === requestId)
1515
+ )
1516
+ return;
1517
+ const pendingKey = `${session.endpointKey}\0${requestId}`;
1518
+ existing.followers.push({ pendingKey, requestId, commitKey });
1519
+ this.selectedAckPending.set(pendingKey, existing);
1520
+ return;
1521
+ }
1522
+ const pendingKey = `${session.endpointKey}\0${requestId}`;
1523
+ if (this.selectedAckPending.has(pendingKey)) return;
1524
+ const item: SelectedAckQueueItem = {
1525
+ pendingKey,
1526
+ cacheKey,
1527
+ itemId: `selected-ack:${session.endpointKey}:${requestId}`,
1528
+ requestId,
1529
+ commitKey,
1530
+ session,
1531
+ state: "queued",
1532
+ followers: [],
1533
+ };
1534
+ this.selectedAckPending.set(pendingKey, item);
1535
+ this.pool.submit({
1536
+ sessionId: session.sessionId,
1537
+ lane: "ask",
1538
+ itemId: item.itemId,
1539
+ deadlineAt,
1540
+ payload: {
1541
+ send: { method: "sendMessage", lane: "ask", text: "Selected!" },
1542
+ topicId,
1543
+ selectedAck: item,
1544
+ },
1545
+ });
1546
+ await this.flushPool();
1547
+ },
1548
+ })
1549
+ .add({
1550
+ name: "ask-selected-ack-cancel",
1551
+ matches: msg => msg.type === "ask_selected_ack_cancel",
1552
+ handle: (session, msg) => {
1553
+ const requestId = typeof msg.requestId === "string" ? msg.requestId : undefined;
1554
+ const commitKey = typeof msg.commitKey === "string" ? msg.commitKey : undefined;
1555
+ if (!requestId || !commitKey) return;
1556
+ const item = this.selectedAckPending.get(`${session.endpointKey}\0${requestId}`);
1557
+ if (!item || item.commitKey !== commitKey) return;
1558
+ if (item.requestId !== requestId) {
1559
+ item.followers = item.followers.filter(follower => follower.requestId !== requestId);
1560
+ this.selectedAckPending.delete(`${session.endpointKey}\0${requestId}`);
1561
+ if (session.ws.readyState === WebSocket.OPEN) {
1562
+ session.ws.send(
1563
+ JSON.stringify({
1564
+ type: "ask_selected_ack_result",
1565
+ requestId,
1566
+ commitKey,
1567
+ outcome: { status: "failed", reason: "cancelled" },
1568
+ }),
1569
+ );
1570
+ }
1571
+ return;
1572
+ }
1573
+ if (item.followers.length > 0) {
1574
+ const promoted = item.followers.shift()!;
1575
+ this.selectedAckPending.delete(item.pendingKey);
1576
+ item.pendingKey = promoted.pendingKey;
1577
+ item.requestId = promoted.requestId;
1578
+ item.commitKey = promoted.commitKey;
1579
+ if (session.ws.readyState === WebSocket.OPEN) {
1580
+ session.ws.send(
1581
+ JSON.stringify({
1582
+ type: "ask_selected_ack_result",
1583
+ requestId,
1584
+ commitKey,
1585
+ outcome: { status: "failed", reason: "cancelled" },
1586
+ }),
1587
+ );
1588
+ }
1589
+ return;
1590
+ }
1591
+ if (item.state !== "sending") {
1592
+ this.pool.removeById(item.itemId);
1593
+ this.finishSelectedAck(item, { status: "failed", reason: "cancelled" });
1594
+ return;
1595
+ }
1596
+ item.controller?.abort();
1597
+ this.finishSelectedAck(item, { status: "unknown", reason: "transport_ambiguous" });
1598
+ },
1599
+ })
1313
1600
  .add({
1314
1601
  name: "pong",
1315
1602
  matches: msg => msg.type === "pong",
@@ -1414,24 +1701,33 @@ export class TelegramNotificationDaemon {
1414
1701
  async scanRoots(): Promise<void> {
1415
1702
  const paths = daemonPaths(this.opts.settings.getAgentDir());
1416
1703
  const rootState = await readJson<{ roots?: string[] }>(this.fsImpl, paths.roots);
1704
+ const endpointSessionIds = new Set<string>();
1705
+ let allRootsReadable = true;
1417
1706
  for (const root of rootState?.roots ?? []) {
1418
1707
  const dir = path.join(root, "notifications");
1419
1708
  let files: string[];
1420
1709
  try {
1421
1710
  files = await this.fsImpl.readdir(dir);
1422
1711
  } catch {
1712
+ allRootsReadable = false;
1423
1713
  continue;
1424
1714
  }
1425
1715
  for (const file of files.filter(item => item.endsWith(".json"))) {
1426
1716
  const sessionId = path.basename(file, ".json");
1717
+ endpointSessionIds.add(sessionId);
1427
1718
  if (this.sessions.has(sessionId)) continue;
1428
1719
  try {
1429
1720
  const endpoint = readEndpoint(path.join(dir, file));
1430
1721
  // Skip endpoint files whose owning process is gone or that are
1431
1722
  // explicitly stale (e.g. a hard-closed session): reconnecting
1432
- // would chase a dead, token-bearing record forever.
1723
+ // would chase a dead, token-bearing record forever. Once the
1724
+ // associated topic is past the grace window, reap it through the
1725
+ // same best-effort delete path as graceful session shutdown.
1433
1726
  const pidAlive = this.opts.pidAlive ?? defaultPidAlive;
1434
- if (endpoint.stale || (endpoint.pid !== undefined && !pidAlive(endpoint.pid))) continue;
1727
+ if (endpoint.stale || (endpoint.pid !== undefined && !pidAlive(endpoint.pid))) {
1728
+ await this.deleteOrphanedTopic(sessionId);
1729
+ continue;
1730
+ }
1435
1731
  const endpointKey = endpointGenerationKey(endpoint.url, endpoint.token);
1436
1732
  if (this.closedEndpointKeys.get(sessionId) === endpointKey) continue;
1437
1733
  this.closedEndpointKeys.delete(sessionId);
@@ -1439,6 +1735,12 @@ export class TelegramNotificationDaemon {
1439
1735
  } catch {}
1440
1736
  }
1441
1737
  }
1738
+ if (allRootsReadable) {
1739
+ for (const sessionId of this.topics.sessionIds()) {
1740
+ if (!this.sessions.has(sessionId) && !endpointSessionIds.has(sessionId))
1741
+ await this.deleteOrphanedTopic(sessionId);
1742
+ }
1743
+ }
1442
1744
  }
1443
1745
 
1444
1746
  connectSession(sessionId: string, url: string, token: string): void {
@@ -1468,7 +1770,7 @@ export class TelegramNotificationDaemon {
1468
1770
  JSON.stringify({
1469
1771
  type: "hello",
1470
1772
  protocolVersion: NOTIFICATION_PROTOCOL_VERSION,
1471
- capabilities: [CLIENT_PING_PONG_CAPABILITY],
1773
+ capabilities: [CLIENT_PING_PONG_CAPABILITY, ASK_CONTROLS_CAPABILITY, ASK_SELECTED_ACK_CAPABILITY],
1472
1774
  }),
1473
1775
  );
1474
1776
  } catch {}
@@ -1543,6 +1845,12 @@ export class TelegramNotificationDaemon {
1543
1845
  if (isCurrentSession) {
1544
1846
  this.sessions.delete(session.sessionId);
1545
1847
  }
1848
+ for (const item of new Set(this.selectedAckPending.values())) {
1849
+ if (item.session !== session) continue;
1850
+ if (item.state === "queued") this.pool.removeById(item.itemId);
1851
+ else item.controller?.abort();
1852
+ this.finishSelectedAck(item, { status: "unknown", reason: "transport_ambiguous" });
1853
+ }
1546
1854
  if (session.ws.readyState !== WebSocket.CLOSED) {
1547
1855
  try {
1548
1856
  session.ws.close();
@@ -1572,6 +1880,12 @@ export class TelegramNotificationDaemon {
1572
1880
  const repo = typeof msg?.repo === "string" && msg.repo ? msg.repo : undefined;
1573
1881
  const branch = typeof msg?.branch === "string" && msg.branch ? msg.branch : undefined;
1574
1882
  const title = typeof msg?.title === "string" && msg.title ? msg.title : undefined;
1883
+ // A configured `nameTemplate` (e.g. "{title} · {repo}/{branch}") wins only
1884
+ // when every placeholder it references resolves for this session; otherwise
1885
+ // we fall through to the built-in composition so provisional/edge names
1886
+ // (missing title, repo, or branch) never render with dangling separators.
1887
+ const templated = this.renderTopicNameTemplate({ repo, branch, title });
1888
+ if (templated !== undefined) return templated;
1575
1889
  // Name the topic "{repo}/{branch}" before a session title exists, then
1576
1890
  // "{repo}/{branch} - {title}" once it does. Fall back to the session id
1577
1891
  // only when no repo identity is available.
@@ -1581,6 +1895,32 @@ export class TelegramNotificationDaemon {
1581
1895
  return `SKC ${sessionId.slice(-6)}`;
1582
1896
  }
1583
1897
 
1898
+ /**
1899
+ * Render the operator-configured topic name template, or `undefined` when no
1900
+ * usable template applies so the caller uses the built-in composition. The
1901
+ * template is honored only if it is non-blank AND every placeholder it
1902
+ * references (`{repo}`, `{branch}`, `{title}`) has a value for this session,
1903
+ * which preserves the default title/repo/branch fallbacks and prevents
1904
+ * half-filled names with dangling separators. Unknown placeholders are left
1905
+ * verbatim.
1906
+ */
1907
+ private renderTopicNameTemplate(values: { repo?: string; branch?: string; title?: string }): string | undefined {
1908
+ const template = this.opts.topics?.nameTemplate?.trim();
1909
+ if (!template) return undefined;
1910
+ let missing = false;
1911
+ const rendered = template.replace(/\{(repo|branch|title)\}/g, (_match, key: "repo" | "branch" | "title") => {
1912
+ const value = values[key];
1913
+ if (!value) {
1914
+ missing = true;
1915
+ return "";
1916
+ }
1917
+ return value;
1918
+ });
1919
+ if (missing) return undefined;
1920
+ const trimmed = rendered.trim();
1921
+ return trimmed.length > 0 ? trimmed : undefined;
1922
+ }
1923
+
1584
1924
  private topicIdentityKey(msg: { repo?: unknown; branch?: unknown }): string | undefined {
1585
1925
  const repo = typeof msg?.repo === "string" && msg.repo.trim() ? msg.repo.trim() : undefined;
1586
1926
  if (!repo) return undefined;
@@ -1599,11 +1939,13 @@ export class TelegramNotificationDaemon {
1599
1939
  const identityKey = this.topicIdentityKey(msg);
1600
1940
  const remembered = identityKey ? this.topicOwnerByIdentity.get(identityKey) : undefined;
1601
1941
  if (remembered && this.topics.get(remembered)) return remembered;
1942
+ if (!identityKey) return undefined;
1602
1943
  const base = this.topicIdentityBase(msg);
1603
- if (!identityKey || !base) return undefined;
1604
1944
  for (const sessionId of this.topics.sessionIds()) {
1605
- const name = this.topics.get(sessionId)?.name;
1606
- if (name === base || name?.startsWith(`${base} - `)) {
1945
+ const topic = this.topics.get(sessionId);
1946
+ const nameMatchesLegacyIdentity =
1947
+ base !== undefined && (topic?.name === base || topic?.name?.startsWith(`${base} - `));
1948
+ if (topic?.identityKey === identityKey || nameMatchesLegacyIdentity) {
1607
1949
  this.topicOwnerByIdentity.set(identityKey, sessionId);
1608
1950
  return sessionId;
1609
1951
  }
@@ -1633,6 +1975,37 @@ export class TelegramNotificationDaemon {
1633
1975
  return this.topics.get(sessionId)?.topicId;
1634
1976
  }
1635
1977
 
1978
+ /** Best-effort re-assertion for a durable user-owned topic name. */
1979
+ private async reconcileUserTopicName(sessionId: string, topicId: string): Promise<void> {
1980
+ if ((this.daemonRenameAttempts.get(sessionId) ?? 0) > 0) return;
1981
+ let userName = this.topics.userNameToReconcile(sessionId);
1982
+ while (userName) {
1983
+ try {
1984
+ const response = await this.botApi.call("editForumTopic", {
1985
+ chat_id: this.opts.chatId,
1986
+ message_thread_id: Number(topicId),
1987
+ name: userName,
1988
+ });
1989
+ if (!topicRenameApplied(response)) return;
1990
+ const latestUserName = this.topics.userOwnedName(sessionId);
1991
+ if (latestUserName === userName) {
1992
+ if (this.topics.markUserNameReconciled(sessionId, userName)) {
1993
+ try {
1994
+ await this.persistTopics();
1995
+ } catch {
1996
+ this.topics.markUserNamePending(sessionId, userName);
1997
+ }
1998
+ }
1999
+ return;
2000
+ }
2001
+ userName = this.topics.userNameToReconcile(sessionId);
2002
+ } catch {
2003
+ // Keep the durable pending flag so the next identity frame retries.
2004
+ return;
2005
+ }
2006
+ }
2007
+ }
2008
+
1636
2009
  private rememberPendingThreadedFrame(sessionId: string, send: ThreadedSend, msg: Record<string, unknown>): void {
1637
2010
  const frames = this.pendingThreadedFrames.get(sessionId) ?? [];
1638
2011
  frames.push({ send, msg });
@@ -1683,6 +2056,16 @@ export class TelegramNotificationDaemon {
1683
2056
  }
1684
2057
  }
1685
2058
 
2059
+ private topicPastOrphanGrace(sessionId: string): boolean {
2060
+ const record = this.topics.get(sessionId);
2061
+ return record !== undefined && this.runtime.now() - record.createdAt >= ORPHAN_TOPIC_GRACE_MS;
2062
+ }
2063
+
2064
+ private async deleteOrphanedTopic(sessionId: string): Promise<void> {
2065
+ if (!this.topicPastOrphanGrace(sessionId)) return;
2066
+ await this.deleteTopic(sessionId);
2067
+ }
2068
+
1686
2069
  /** Best-effort delete of a session topic once its local notification endpoint shuts down. */
1687
2070
  private async deleteTopic(sessionId: string): Promise<void> {
1688
2071
  const record = this.topics.get(sessionId);
@@ -1690,7 +2073,11 @@ export class TelegramNotificationDaemon {
1690
2073
  try {
1691
2074
  // Drop queued sends for this session before deleting the topic; otherwise
1692
2075
  // rate-limited frames can flush later into a deleted topic or across resume.
1693
- this.pool.removeWhere(item => item.sessionId === sessionId);
2076
+ const removed = this.pool.removeWhere(item => item.sessionId === sessionId);
2077
+ for (const item of removed) {
2078
+ if (item.payload.selectedAck)
2079
+ this.finishSelectedAck(item.payload.selectedAck, { status: "failed", reason: "cancelled" });
2080
+ }
1694
2081
  await this.flushPool();
1695
2082
  const res = (await this.botApi.call("deleteForumTopic", {
1696
2083
  chat_id: this.opts.chatId,
@@ -1711,10 +2098,14 @@ export class TelegramNotificationDaemon {
1711
2098
  }
1712
2099
  }
1713
2100
 
1714
- private async persistTopics(): Promise<void> {
1715
- const paths = daemonPaths(this.opts.settings.getAgentDir());
1716
- await ensureDir(this.fsImpl, paths.dir);
1717
- await writeJsonAtomic(this.fsImpl, path.join(paths.dir, "telegram-topics.json"), this.topics.serialize());
2101
+ private persistTopics(): Promise<void> {
2102
+ const pending = this.topicsPersistQueue.then(async () => {
2103
+ const paths = daemonPaths(this.opts.settings.getAgentDir());
2104
+ await ensureDir(this.fsImpl, paths.dir);
2105
+ await writeJsonAtomic(this.fsImpl, path.join(paths.dir, "telegram-topics.json"), this.topics.serialize());
2106
+ });
2107
+ this.topicsPersistQueue = pending.catch(() => undefined);
2108
+ return pending;
1718
2109
  }
1719
2110
 
1720
2111
  async loadTopics(): Promise<void> {
@@ -1845,7 +2236,12 @@ export class TelegramNotificationDaemon {
1845
2236
 
1846
2237
  /** Drain the shared rate-limit pool and deliver each granted send to its topic. */
1847
2238
  private async flushPoolInner(): Promise<void> {
1848
- const batch = this.pool.drain();
2239
+ const { granted: batch, expired } = this.pool.drainWithExpired();
2240
+ for (const expiredItem of expired) {
2241
+ if (expiredItem.payload.selectedAck) {
2242
+ this.finishSelectedAck(expiredItem.payload.selectedAck, { status: "failed", reason: "expired" });
2243
+ }
2244
+ }
1849
2245
  // Within a batch a finalized frame supersedes any still-queued live frame for
1850
2246
  // the same streamed message (finalized outranks live), so drop the stale live
1851
2247
  // edit — otherwise the authoritative final text could be overwritten by an
@@ -1868,6 +2264,51 @@ export class TelegramNotificationDaemon {
1868
2264
  );
1869
2265
  }
1870
2266
  for (const item of batch) {
2267
+ const selectedAck = item.payload.selectedAck;
2268
+ if (selectedAck) {
2269
+ const { topicId } = item.payload;
2270
+ selectedAck.state = "dispatching";
2271
+ const controller = new AbortController();
2272
+ selectedAck.controller = controller;
2273
+ const routeAvailable = !topicId || (await this.pairedChatIsPrivate());
2274
+ if (this.selectedAckPending.get(selectedAck.pendingKey) !== selectedAck) continue;
2275
+ if (!routeAvailable) {
2276
+ this.finishSelectedAck(selectedAck, { status: "failed", reason: "route_missing" });
2277
+ continue;
2278
+ }
2279
+ if (item.deadlineAt !== undefined && item.deadlineAt <= this.runtime.now()) {
2280
+ this.finishSelectedAck(selectedAck, { status: "failed", reason: "expired" });
2281
+ continue;
2282
+ }
2283
+ selectedAck.state = "sending";
2284
+ const remaining = Math.max(0, (item.deadlineAt ?? this.runtime.now()) - this.runtime.now());
2285
+ const timer = (this.opts.setTimeoutImpl ?? setTimeout)(
2286
+ () => controller.abort(),
2287
+ Math.min(8_000, remaining),
2288
+ );
2289
+ try {
2290
+ const response = (await this.botApi.call(
2291
+ "sendMessage",
2292
+ {
2293
+ chat_id: this.opts.chatId,
2294
+ ...(topicId ? { message_thread_id: Number(topicId) } : {}),
2295
+ text: "Selected!",
2296
+ },
2297
+ { signal: controller.signal, noRetry: true },
2298
+ )) as { ok?: unknown; result?: { message_id?: unknown } };
2299
+ this.finishSelectedAck(
2300
+ selectedAck,
2301
+ response.ok === true && typeof response.result?.message_id === "number"
2302
+ ? { status: "delivered", messageId: response.result.message_id }
2303
+ : { status: "failed", reason: "telegram_rejected" },
2304
+ );
2305
+ } catch {
2306
+ this.finishSelectedAck(selectedAck, { status: "unknown", reason: "transport_ambiguous" });
2307
+ } finally {
2308
+ (this.opts.clearTimeoutImpl ?? clearTimeout)(timer);
2309
+ }
2310
+ continue;
2311
+ }
1871
2312
  const { send, topicId } = item.payload;
1872
2313
  if (topicId && !(await this.pairedChatIsPrivate())) continue;
1873
2314
  // Threaded topic when available; otherwise deliver flat to the paired chat.
@@ -2102,25 +2543,43 @@ export class TelegramNotificationDaemon {
2102
2543
  }
2103
2544
 
2104
2545
  /**
2105
- * Resolve (and cache successful resolution of) whether the paired `chatId` is a
2106
- * private chat. Topic and flat delivery are only safe in a private DM; any
2107
- * non-private chat fails closed, while a transient `getChat` failure fails closed
2108
- * for the current attempt and is retried later.
2546
+ * Resolve (and cache definitive resolution of) whether the paired `chatId` is
2547
+ * a private chat. Topic and flat delivery are only safe in a private DM; an
2548
+ * indeterminate `getChat` result fails closed for this attempt and is retried
2549
+ * later.
2109
2550
  */
2110
- private async pairedChatIsPrivate(): Promise<boolean> {
2111
- if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate;
2551
+ private async resolvePairedChatPrivacy(): Promise<PairedChatPrivacy> {
2552
+ if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate ? "private" : "non-private";
2112
2553
  try {
2113
2554
  const res = (await this.botApi.call("getChat", { chat_id: this.opts.chatId })) as {
2114
- result?: { type?: string };
2555
+ ok?: unknown;
2556
+ result?: { type?: unknown };
2115
2557
  };
2116
- this.pairedChatPrivate = res.result?.type === "private";
2117
- return this.pairedChatPrivate;
2118
- } catch (e) {
2119
- logger.warn(`notifications: getChat failed while checking Telegram chat privacy: ${String(e)}`);
2120
- return false;
2558
+ if (res?.ok !== true) {
2559
+ logger.warn("notifications: getChat privacy check indeterminate (non-success response)");
2560
+ return "indeterminate";
2561
+ }
2562
+ if (res.result?.type === "private") {
2563
+ this.pairedChatPrivate = true;
2564
+ return "private";
2565
+ }
2566
+ if (res.result?.type === "group" || res.result?.type === "supergroup" || res.result?.type === "channel") {
2567
+ this.pairedChatPrivate = false;
2568
+ return "non-private";
2569
+ }
2570
+ logger.warn("notifications: getChat privacy check indeterminate (missing or invalid chat type)");
2571
+ return "indeterminate";
2572
+ } catch {
2573
+ logger.warn("notifications: getChat privacy check indeterminate (request failed)");
2574
+ return "indeterminate";
2121
2575
  }
2122
2576
  }
2123
2577
 
2578
+ /** Keep existing outbound callers fail-closed for indeterminate privacy. */
2579
+ private async pairedChatIsPrivate(): Promise<boolean> {
2580
+ return (await this.resolvePairedChatPrivacy()) === "private";
2581
+ }
2582
+
2124
2583
  /** Tell the user once (per daemon run) how to enable Threaded Mode. */
2125
2584
  private async notifyThreadedFallback(): Promise<void> {
2126
2585
  if (this.threadedFallbackNoticeSent || !(await this.pairedChatIsPrivate())) return;
@@ -2231,26 +2690,37 @@ export class TelegramNotificationDaemon {
2231
2690
  }
2232
2691
  if (send.identity) {
2233
2692
  const identityKey = this.topicIdentityKey(msg);
2234
- if (identityKey) this.topicOwnerByIdentity.set(identityKey, session.sessionId);
2235
- // Rename the topic if the title changed (e.g. the session title was
2236
- // auto-generated after the topic was first created). This runs on
2237
- // every identity frame, but does NOT re-send the bulleted message.
2238
- // Only commit the new registry name after Telegram accepts the edit:
2239
- // a transient editForumTopic failure must remain retryable on the
2240
- // next identity re-assert instead of leaving the remote topic stuck
2241
- // at the provisional "SKC <id>" name forever.
2693
+ if (identityKey) {
2694
+ this.topicOwnerByIdentity.set(identityKey, session.sessionId);
2695
+ if (this.topics.markIdentityKey(session.sessionId, identityKey)) await this.persistTopics();
2696
+ }
2697
+ // Explicit Telegram-side user renames own the topic title. Pending user
2698
+ // reconciliation runs before daemon identity naming, so retries and daemon
2699
+ // restarts cannot silently replace the preserved name.
2700
+ await this.reconcileUserTopicName(session.sessionId, topicId);
2242
2701
  const name = this.topicNameFor(session.sessionId, msg);
2243
2702
  if (this.topics.needsRename(session.sessionId, name)) {
2703
+ this.daemonRenameAttempts.set(
2704
+ session.sessionId,
2705
+ (this.daemonRenameAttempts.get(session.sessionId) ?? 0) + 1,
2706
+ );
2244
2707
  try {
2245
- await this.botApi.call("editForumTopic", {
2708
+ const response = await this.botApi.call("editForumTopic", {
2246
2709
  chat_id: this.opts.chatId,
2247
2710
  message_thread_id: Number(topicId),
2248
2711
  name,
2249
2712
  });
2250
- this.topics.markNameApplied(session.sessionId, name);
2713
+ if (topicRenameApplied(response)) this.topics.markNameApplied(session.sessionId, name);
2251
2714
  } catch {
2252
- // Best-effort rename; never block delivery. Leave the old
2253
- // registry name intact so a later identity frame retries.
2715
+ // Best-effort rename; leave daemon-owned names unchanged so a
2716
+ // later identity frame retries.
2717
+ } finally {
2718
+ const remaining = (this.daemonRenameAttempts.get(session.sessionId) ?? 1) - 1;
2719
+ if (remaining > 0) this.daemonRenameAttempts.set(session.sessionId, remaining);
2720
+ else {
2721
+ this.daemonRenameAttempts.delete(session.sessionId);
2722
+ await this.reconcileUserTopicName(session.sessionId, topicId);
2723
+ }
2254
2724
  }
2255
2725
  }
2256
2726
  // Send the full bulleted identity header EXACTLY ONCE per topic.
@@ -2274,19 +2744,54 @@ export class TelegramNotificationDaemon {
2274
2744
  await this.notifyThreadedFallback();
2275
2745
  }
2276
2746
  const threadField = topicId ? { message_thread_id: Number(topicId) } : {};
2747
+ const controls: Array<{
2748
+ id: "navigation_forward";
2749
+ kind: "navigation";
2750
+ label: "Next" | "Done";
2751
+ enabled: boolean;
2752
+ }> = Array.isArray(msg.controls)
2753
+ ? msg.controls.filter(
2754
+ (
2755
+ control: unknown,
2756
+ ): control is {
2757
+ id: "navigation_forward";
2758
+ kind: "navigation";
2759
+ label: "Next" | "Done";
2760
+ enabled: boolean;
2761
+ } =>
2762
+ !!control &&
2763
+ typeof control === "object" &&
2764
+ (control as { id?: unknown }).id === "navigation_forward" &&
2765
+ (control as { kind?: unknown }).kind === "navigation" &&
2766
+ ((control as { label?: unknown }).label === "Next" ||
2767
+ (control as { label?: unknown }).label === "Done") &&
2768
+ (control as { enabled?: unknown }).enabled === true,
2769
+ )
2770
+ : [];
2277
2771
  const rendered = buildActionMessage({
2278
2772
  kind: msg.kind ?? "ask",
2279
2773
  id: msg.id,
2280
2774
  question: msg.question,
2281
2775
  options: msg.options,
2776
+ controls,
2282
2777
  summary: msg.summary,
2283
2778
  });
2284
2779
  const options = Array.isArray(msg.options) ? msg.options : [];
2285
- // Daemon keyboards use alias callback data with compact one-based tap targets;
2286
- // full option text is rendered in the message body by buildActionMessage/buildActionMarkdown.
2287
- const inline_keyboard = buildCompactChoiceGrid(options, (i: number) =>
2288
- this.aliasTable.put({ sessionId: session.sessionId, actionId: msg.id, answer: i }),
2289
- );
2780
+ const inline_keyboard = [
2781
+ ...buildCompactChoiceGrid(options, (i: number) =>
2782
+ this.aliasTable.put({ sessionId: session.sessionId, actionId: msg.id, answer: i }),
2783
+ ),
2784
+ ...controls.map(control => [
2785
+ {
2786
+ text: control.label,
2787
+ callback_data: this.aliasTable.put({
2788
+ sessionId: session.sessionId,
2789
+ actionId: msg.id,
2790
+ answer: { controlId: control.id },
2791
+ }),
2792
+ },
2793
+ ]),
2794
+ ];
2290
2795
  // HTML delivery: one sendMessage per chunk, keyboard on the last chunk;
2291
2796
  // returns the last chunk's message_id (the reply-routable message).
2292
2797
  const sendHtmlChunks = async (): Promise<number | undefined> => {
@@ -2369,7 +2874,78 @@ export class TelegramNotificationDaemon {
2369
2874
  });
2370
2875
  }
2371
2876
 
2877
+ /** Consume Telegram forum-topic rename service messages before text routing. */
2878
+ private async handleForumTopicEdited(update: unknown): Promise<"not-topic" | TelegramUpdateOutcome> {
2879
+ const parsed = update as {
2880
+ update_id?: unknown;
2881
+ message?: {
2882
+ chat?: { id?: unknown };
2883
+ from?: { id?: unknown; is_bot?: unknown };
2884
+ message_thread_id?: unknown;
2885
+ forum_topic_edited?: { name?: unknown };
2886
+ };
2887
+ };
2888
+ const message = parsed.message;
2889
+ if (!message?.forum_topic_edited) return "not-topic";
2890
+ const updateId = parsed.update_id;
2891
+ if (typeof updateId !== "number" || !Number.isSafeInteger(updateId) || updateId < 0) return "consumed";
2892
+ if (this.dispatchState.seenUpdateIds.has(updateId)) return "consumed";
2893
+ const configuredUserId = Number(this.opts.chatId);
2894
+ if (
2895
+ !Number.isSafeInteger(configuredUserId) ||
2896
+ typeof message.chat?.id !== "number" ||
2897
+ message.chat.id !== configuredUserId ||
2898
+ message.from?.id !== configuredUserId ||
2899
+ message.from?.is_bot !== false
2900
+ )
2901
+ return "consumed";
2902
+ const privacy = await this.resolvePairedChatPrivacy();
2903
+ if (privacy === "indeterminate") return "retry";
2904
+ if (privacy !== "private") return "consumed";
2905
+ const threadId = message.message_thread_id;
2906
+ if (typeof threadId !== "number" || !Number.isSafeInteger(threadId)) return "consumed";
2907
+ const sessionId = this.topics.sessionForTopic(String(threadId));
2908
+ if (!sessionId) return "consumed";
2909
+ const name = message.forum_topic_edited.name;
2910
+ if (typeof name !== "string" || name.trim().length === 0) return "consumed";
2911
+ const result = this.topics.markUserName(sessionId, name, updateId);
2912
+ if (result === "stale") {
2913
+ await this.rememberSeenUpdateId(updateId);
2914
+ return "consumed";
2915
+ }
2916
+ if (result === "duplicate") {
2917
+ try {
2918
+ await this.persistTopics();
2919
+ } catch {
2920
+ return "retry";
2921
+ }
2922
+ await this.reconcileUserTopicName(sessionId, String(threadId));
2923
+ await this.rememberSeenUpdateId(updateId);
2924
+ return "consumed";
2925
+ }
2926
+ try {
2927
+ await this.persistTopics();
2928
+ } catch {
2929
+ return "retry";
2930
+ }
2931
+ await this.reconcileUserTopicName(sessionId, String(threadId));
2932
+ await this.rememberSeenUpdateId(updateId);
2933
+ return "consumed";
2934
+ }
2935
+
2936
+ private async processTelegramUpdate(update: unknown): Promise<TelegramUpdateOutcome> {
2937
+ const topicOutcome = await this.handleForumTopicEdited(update);
2938
+ if (topicOutcome !== "not-topic") return topicOutcome;
2939
+ try {
2940
+ await this.handleTelegramUpdate(update);
2941
+ } catch (err) {
2942
+ logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
2943
+ }
2944
+ return "consumed";
2945
+ }
2946
+
2372
2947
  async handleTelegramUpdate(update: unknown): Promise<void> {
2948
+ if ((await this.handleForumTopicEdited(update)) !== "not-topic") return;
2373
2949
  // Session-lifecycle command (/session_*): handled ONLY from the paired chat,
2374
2950
  // gated before any arg parsing or side effect, and routed through the control
2375
2951
  // endpoint. Must run before threaded-injection so commands are not treated as
@@ -2554,15 +3130,6 @@ export class TelegramNotificationDaemon {
2554
3130
  }),
2555
3131
  );
2556
3132
  await this.rememberSeenUpdateId(inbound.updateId);
2557
- await this.botApi
2558
- .call("sendMessage", {
2559
- chat_id: this.opts.chatId,
2560
- message_thread_id: Number(inbound.threadId),
2561
- text: "Received as an answer to the pending ask.",
2562
- })
2563
- .catch(error => {
2564
- logger.warn(`telegram: failed to acknowledge pending ask reply: ${String(error)}`);
2565
- });
2566
3133
  if (inbound.messageId !== undefined) await this.setReaction(inbound.messageId, QUEUED_REACTION);
2567
3134
  return;
2568
3135
  }