@sayknow-cli/coding-agent 0.3.12 → 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 (1122) hide show
  1. package/package.json +116 -117
  2. package/scripts/g004-tmux-smoke.ts +196 -36
  3. package/scripts/generate-docs-index.ts +2 -0
  4. package/src/cli/daemon-cli.ts +19 -29
  5. package/src/cli/malloc-env-guard.test.ts +104 -0
  6. package/src/cli/malloc-env-guard.ts +149 -0
  7. package/src/cli/notify-cli.ts +78 -14
  8. package/src/cli/session-picker.ts +23 -40
  9. package/src/cli/update-cli.ts +56 -37
  10. package/src/cli.ts +50 -10
  11. package/src/commands/daemon.ts +19 -5
  12. package/src/commands/harness.ts +515 -47
  13. package/src/commands/launch.ts +11 -3
  14. package/src/commands/notify.ts +5 -1
  15. package/src/commands/session.ts +6 -1
  16. package/src/config/keybindings.ts +5 -0
  17. package/src/config/model-profile-activation.ts +1 -1
  18. package/src/config/model-profiles.ts +14 -14
  19. package/src/config/settings-schema.ts +41 -1
  20. package/src/coordinator-mcp/model-preset.ts +100 -0
  21. package/src/coordinator-mcp/server.ts +2735 -435
  22. package/src/daemon/control-types.ts +11 -0
  23. package/src/daemon/operator-contract.ts +121 -0
  24. package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
  25. package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
  26. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
  27. package/src/internal-urls/docs-index.generated.ts +7 -7
  28. package/src/internal-urls/local-protocol.ts +29 -10
  29. package/src/main.ts +298 -75
  30. package/src/modes/acp/acp-agent.ts +728 -98
  31. package/src/modes/acp/acp-mode.ts +29 -2
  32. package/src/modes/components/assistant-message.ts +32 -3
  33. package/src/modes/components/bash-execution.ts +43 -13
  34. package/src/modes/components/custom-editor.ts +5 -0
  35. package/src/modes/components/hook-selector.ts +12 -0
  36. package/src/modes/components/irc-sidebar.ts +206 -0
  37. package/src/modes/components/pet-selector.ts +55 -0
  38. package/src/modes/components/sayknow-pet-widget.ts +360 -0
  39. package/src/modes/components/session-selector.ts +222 -221
  40. package/src/modes/components/settings-selector.ts +10 -0
  41. package/src/modes/components/tool-execution.ts +47 -6
  42. package/src/modes/components/user-message.ts +26 -9
  43. package/src/modes/controllers/command-controller.ts +28 -2
  44. package/src/modes/controllers/event-controller.ts +159 -36
  45. package/src/modes/controllers/extension-ui-controller.ts +36 -17
  46. package/src/modes/controllers/input-controller.ts +8 -2
  47. package/src/modes/controllers/selector-controller.ts +62 -15
  48. package/src/modes/interactive-mode.ts +183 -7
  49. package/src/modes/irc-observation-ledger.ts +127 -0
  50. package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
  51. package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
  52. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
  53. package/src/modes/types.ts +34 -2
  54. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  55. package/src/modes/utils/irc-message.ts +138 -0
  56. package/src/modes/utils/ui-helpers.ts +216 -50
  57. package/src/notifications/config.ts +44 -0
  58. package/src/notifications/daemon-paths.ts +8 -0
  59. package/src/notifications/index.ts +535 -75
  60. package/src/notifications/lifecycle-control-runtime.ts +930 -77
  61. package/src/notifications/notification-service.ts +710 -0
  62. package/src/notifications/rate-limit-pool.ts +46 -12
  63. package/src/notifications/telegram-daemon-control.ts +27 -2
  64. package/src/notifications/telegram-daemon.ts +635 -94
  65. package/src/notifications/telegram-reference.ts +73 -13
  66. package/src/notifications/topic-registry.ts +86 -9
  67. package/src/prompts/system/irc-peer-roster.md +1 -0
  68. package/src/prompts/system/subagent-system-prompt.md +1 -0
  69. package/src/prompts/system/system-prompt.md +1 -0
  70. package/src/prompts/tools/irc.md +1 -1
  71. package/src/registry/agent-registry.ts +3 -0
  72. package/src/sdk.ts +52 -1
  73. package/src/secrets/obfuscator.ts +4 -2
  74. package/src/session/agent-session.ts +396 -145
  75. package/src/session/cache-economics.ts +275 -0
  76. package/src/session/provider-safety-stop.ts +9 -0
  77. package/src/session/session-dump-format.ts +6 -0
  78. package/src/session/session-manager.ts +809 -39
  79. package/src/session/session-storage.ts +582 -38
  80. package/src/skc-runtime/session-state-sidecar.ts +756 -135
  81. package/src/skc-runtime/tmux-common.ts +26 -7
  82. package/src/skc-runtime/tmux-gc.ts +52 -9
  83. package/src/skc-runtime/tmux-owner-isolation-cli.ts +185 -0
  84. package/src/skc-runtime/tmux-owner-isolation.ts +2060 -0
  85. package/src/skc-runtime/tmux-sessions.ts +871 -68
  86. package/src/slash-commands/builtin-registry.ts +143 -9
  87. package/src/task/executor.ts +12 -3
  88. package/src/task/index.ts +8 -0
  89. package/src/task/receipt.ts +7 -2
  90. package/src/task/types.ts +26 -0
  91. package/src/tools/ask-answer-registry.ts +25 -0
  92. package/src/tools/browser/tab-supervisor.ts +63 -6
  93. package/src/tools/browser.ts +8 -3
  94. package/src/tools/index.ts +81 -6
  95. package/src/tools/sqlite-reader.ts +8 -4
  96. package/src/tui/output-block.ts +18 -6
  97. package/src/utils/external-editor.ts +6 -1
  98. package/dist/types/append-only-mode.d.ts +0 -31
  99. package/dist/types/async/index.d.ts +0 -2
  100. package/dist/types/async/job-manager.d.ts +0 -328
  101. package/dist/types/async/support.d.ts +0 -2
  102. package/dist/types/autoresearch/dashboard.d.ts +0 -4
  103. package/dist/types/autoresearch/git.d.ts +0 -36
  104. package/dist/types/autoresearch/helpers.d.ts +0 -24
  105. package/dist/types/autoresearch/index.d.ts +0 -2
  106. package/dist/types/autoresearch/state.d.ts +0 -17
  107. package/dist/types/autoresearch/storage.d.ts +0 -142
  108. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  109. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  110. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  111. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  112. package/dist/types/autoresearch/types.d.ts +0 -154
  113. package/dist/types/build-metadata.d.ts +0 -7
  114. package/dist/types/capability/context-file.d.ts +0 -17
  115. package/dist/types/capability/extension-module.d.ts +0 -15
  116. package/dist/types/capability/extension.d.ts +0 -28
  117. package/dist/types/capability/fs.d.ts +0 -20
  118. package/dist/types/capability/hook.d.ts +0 -19
  119. package/dist/types/capability/index.d.ts +0 -80
  120. package/dist/types/capability/instruction.d.ts +0 -17
  121. package/dist/types/capability/mcp.d.ts +0 -49
  122. package/dist/types/capability/prompt.d.ts +0 -15
  123. package/dist/types/capability/rule.d.ts +0 -69
  124. package/dist/types/capability/settings.d.ts +0 -15
  125. package/dist/types/capability/skill.d.ts +0 -36
  126. package/dist/types/capability/slash-command.d.ts +0 -17
  127. package/dist/types/capability/ssh.d.ts +0 -23
  128. package/dist/types/capability/system-prompt.d.ts +0 -15
  129. package/dist/types/capability/tool.d.ts +0 -19
  130. package/dist/types/capability/types.d.ts +0 -154
  131. package/dist/types/cli/agents-cli.d.ts +0 -12
  132. package/dist/types/cli/args.d.ts +0 -57
  133. package/dist/types/cli/auth-broker-cli.d.ts +0 -25
  134. package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
  135. package/dist/types/cli/classify-install-target.d.ts +0 -18
  136. package/dist/types/cli/commands/init-xdg.d.ts +0 -1
  137. package/dist/types/cli/completion-cli.d.ts +0 -41
  138. package/dist/types/cli/config-cli.d.ts +0 -23
  139. package/dist/types/cli/daemon-cli.d.ts +0 -25
  140. package/dist/types/cli/fast-help.d.ts +0 -1
  141. package/dist/types/cli/file-processor.d.ts +0 -11
  142. package/dist/types/cli/fixture-report.d.ts +0 -20
  143. package/dist/types/cli/fixture-report.test.d.ts +0 -1
  144. package/dist/types/cli/grep-cli.d.ts +0 -17
  145. package/dist/types/cli/initial-message.d.ts +0 -17
  146. package/dist/types/cli/list-models.d.ts +0 -36
  147. package/dist/types/cli/local-provider-smoke.d.ts +0 -59
  148. package/dist/types/cli/mcp-cli.d.ts +0 -25
  149. package/dist/types/cli/migrate-cli.d.ts +0 -20
  150. package/dist/types/cli/nofile-limit.d.ts +0 -11
  151. package/dist/types/cli/notify-cli.d.ts +0 -37
  152. package/dist/types/cli/plugin-cli.d.ts +0 -34
  153. package/dist/types/cli/read-cli.d.ts +0 -4
  154. package/dist/types/cli/session-picker.d.ts +0 -3
  155. package/dist/types/cli/setup-cli.d.ts +0 -73
  156. package/dist/types/cli/shell-cli.d.ts +0 -8
  157. package/dist/types/cli/skills-cli.d.ts +0 -9
  158. package/dist/types/cli/ssh-cli.d.ts +0 -21
  159. package/dist/types/cli/stats-cli.d.ts +0 -17
  160. package/dist/types/cli/telegram-cli.d.ts +0 -13
  161. package/dist/types/cli/update-cli.d.ts +0 -89
  162. package/dist/types/cli/web-search-cli.d.ts +0 -32
  163. package/dist/types/cli/worktree-cli.d.ts +0 -26
  164. package/dist/types/cli.d.ts +0 -135
  165. package/dist/types/commands/acp.d.ts +0 -12
  166. package/dist/types/commands/agents.d.ts +0 -34
  167. package/dist/types/commands/auth-broker.d.ts +0 -54
  168. package/dist/types/commands/auth-gateway.d.ts +0 -32
  169. package/dist/types/commands/codex-native-hook.d.ts +0 -6
  170. package/dist/types/commands/commit.d.ts +0 -27
  171. package/dist/types/commands/completion.d.ts +0 -29
  172. package/dist/types/commands/config.d.ts +0 -33
  173. package/dist/types/commands/contribution-prep.d.ts +0 -18
  174. package/dist/types/commands/coordinator.d.ts +0 -19
  175. package/dist/types/commands/daemon.d.ts +0 -41
  176. package/dist/types/commands/deep-interview.d.ts +0 -54
  177. package/dist/types/commands/gc.d.ts +0 -26
  178. package/dist/types/commands/grep.d.ts +0 -42
  179. package/dist/types/commands/harness.d.ts +0 -43
  180. package/dist/types/commands/launch.d.ts +0 -130
  181. package/dist/types/commands/local-provider.d.ts +0 -34
  182. package/dist/types/commands/mcp-serve.d.ts +0 -24
  183. package/dist/types/commands/mcp.d.ts +0 -70
  184. package/dist/types/commands/migrate.d.ts +0 -33
  185. package/dist/types/commands/notify.d.ts +0 -41
  186. package/dist/types/commands/plugin.d.ts +0 -58
  187. package/dist/types/commands/ralplan.d.ts +0 -7
  188. package/dist/types/commands/read.d.ts +0 -15
  189. package/dist/types/commands/rlm.d.ts +0 -10
  190. package/dist/types/commands/session.d.ts +0 -30
  191. package/dist/types/commands/setup.d.ts +0 -105
  192. package/dist/types/commands/shell.d.ts +0 -21
  193. package/dist/types/commands/skills.d.ts +0 -26
  194. package/dist/types/commands/ssh.d.ts +0 -48
  195. package/dist/types/commands/state.d.ts +0 -7
  196. package/dist/types/commands/stats.d.ts +0 -25
  197. package/dist/types/commands/team.d.ts +0 -24
  198. package/dist/types/commands/telegram.d.ts +0 -22
  199. package/dist/types/commands/ultragoal.d.ts +0 -8
  200. package/dist/types/commands/update.d.ts +0 -20
  201. package/dist/types/commands/web-search.d.ts +0 -87
  202. package/dist/types/commands/worktree.d.ts +0 -34
  203. package/dist/types/commit/agentic/agent.d.ts +0 -31
  204. package/dist/types/commit/agentic/fallback.d.ts +0 -5
  205. package/dist/types/commit/agentic/index.d.ts +0 -2
  206. package/dist/types/commit/agentic/state.d.ts +0 -58
  207. package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
  208. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
  209. package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
  210. package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
  211. package/dist/types/commit/agentic/tools/index.d.ts +0 -16
  212. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
  213. package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
  214. package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
  215. package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
  216. package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
  217. package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
  218. package/dist/types/commit/agentic/trivial.d.ts +0 -7
  219. package/dist/types/commit/agentic/validation.d.ts +0 -20
  220. package/dist/types/commit/analysis/conventional.d.ts +0 -22
  221. package/dist/types/commit/analysis/index.d.ts +0 -4
  222. package/dist/types/commit/analysis/scope.d.ts +0 -6
  223. package/dist/types/commit/analysis/summary.d.ts +0 -19
  224. package/dist/types/commit/analysis/validation.d.ts +0 -8
  225. package/dist/types/commit/changelog/detect.d.ts +0 -2
  226. package/dist/types/commit/changelog/generate.d.ts +0 -30
  227. package/dist/types/commit/changelog/index.d.ts +0 -30
  228. package/dist/types/commit/changelog/parse.d.ts +0 -2
  229. package/dist/types/commit/cli.d.ts +0 -3
  230. package/dist/types/commit/git/diff.d.ts +0 -5
  231. package/dist/types/commit/index.d.ts +0 -4
  232. package/dist/types/commit/map-reduce/index.d.ts +0 -28
  233. package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
  234. package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
  235. package/dist/types/commit/map-reduce/utils.d.ts +0 -2
  236. package/dist/types/commit/message.d.ts +0 -2
  237. package/dist/types/commit/model-selection.d.ts +0 -15
  238. package/dist/types/commit/pipeline.d.ts +0 -5
  239. package/dist/types/commit/shared-llm.d.ts +0 -54
  240. package/dist/types/commit/types.d.ts +0 -78
  241. package/dist/types/commit/utils/exclusions.d.ts +0 -4
  242. package/dist/types/commit/utils.d.ts +0 -20
  243. package/dist/types/config/config-file.d.ts +0 -58
  244. package/dist/types/config/file-lock-gc.d.ts +0 -5
  245. package/dist/types/config/file-lock.d.ts +0 -36
  246. package/dist/types/config/keybindings.d.ts +0 -359
  247. package/dist/types/config/model-equivalence.d.ts +0 -24
  248. package/dist/types/config/model-profile-activation.d.ts +0 -64
  249. package/dist/types/config/model-profiles.d.ts +0 -39
  250. package/dist/types/config/model-registry.d.ts +0 -473
  251. package/dist/types/config/model-resolver.d.ts +0 -217
  252. package/dist/types/config/models-config-schema.d.ts +0 -700
  253. package/dist/types/config/prompt-templates.d.ts +0 -32
  254. package/dist/types/config/resolve-config-value.d.ts +0 -17
  255. package/dist/types/config/settings-schema.d.ts +0 -4183
  256. package/dist/types/config/settings.d.ts +0 -156
  257. package/dist/types/config/skill-settings-defaults.d.ts +0 -14
  258. package/dist/types/config/telegram-autostart.d.ts +0 -14
  259. package/dist/types/config/telegram-env-bridge.d.ts +0 -18
  260. package/dist/types/config.d.ts +0 -66
  261. package/dist/types/coordinator/contract.d.ts +0 -4
  262. package/dist/types/coordinator-mcp/policy.d.ts +0 -24
  263. package/dist/types/coordinator-mcp/safety.d.ts +0 -26
  264. package/dist/types/coordinator-mcp/server.d.ts +0 -66
  265. package/dist/types/cursor.d.ts +0 -24
  266. package/dist/types/daemon/builtin.d.ts +0 -20
  267. package/dist/types/daemon/control-types.d.ts +0 -57
  268. package/dist/types/daemon/runtime.d.ts +0 -25
  269. package/dist/types/dap/client.d.ts +0 -39
  270. package/dist/types/dap/config.d.ts +0 -6
  271. package/dist/types/dap/index.d.ts +0 -4
  272. package/dist/types/dap/session.d.ts +0 -108
  273. package/dist/types/dap/types.d.ts +0 -524
  274. package/dist/types/debug/crash-diagnostics.d.ts +0 -45
  275. package/dist/types/debug/index.d.ts +0 -15
  276. package/dist/types/debug/log-formatting.d.ts +0 -4
  277. package/dist/types/debug/log-viewer.d.ts +0 -68
  278. package/dist/types/debug/profiler.d.ts +0 -24
  279. package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
  280. package/dist/types/debug/raw-sse.d.ts +0 -16
  281. package/dist/types/debug/report-bundle.d.ts +0 -55
  282. package/dist/types/debug/runtime-gauges.d.ts +0 -6
  283. package/dist/types/debug/system-info.d.ts +0 -26
  284. package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
  285. package/dist/types/deep-interview/render-middleware.d.ts +0 -6
  286. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
  287. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
  288. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -25
  289. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
  290. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
  291. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
  292. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
  293. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
  294. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
  295. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
  296. package/dist/types/defaults/skc-defaults.d.ts +0 -64
  297. package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
  298. package/dist/types/discovery/agents-md.d.ts +0 -1
  299. package/dist/types/discovery/agents.d.ts +0 -12
  300. package/dist/types/discovery/builtin.d.ts +0 -1
  301. package/dist/types/discovery/claude-plugins.d.ts +0 -1
  302. package/dist/types/discovery/claude.d.ts +0 -1
  303. package/dist/types/discovery/cline.d.ts +0 -1
  304. package/dist/types/discovery/codex.d.ts +0 -1
  305. package/dist/types/discovery/cursor.d.ts +0 -19
  306. package/dist/types/discovery/gemini.d.ts +0 -1
  307. package/dist/types/discovery/github.d.ts +0 -1
  308. package/dist/types/discovery/helpers.d.ts +0 -271
  309. package/dist/types/discovery/index.d.ts +0 -48
  310. package/dist/types/discovery/mcp-json.d.ts +0 -1
  311. package/dist/types/discovery/opencode.d.ts +0 -1
  312. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  313. package/dist/types/discovery/ssh.d.ts +0 -1
  314. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -5
  315. package/dist/types/discovery/vscode.d.ts +0 -1
  316. package/dist/types/discovery/windsurf.d.ts +0 -15
  317. package/dist/types/edit/apply-patch/index.d.ts +0 -35
  318. package/dist/types/edit/apply-patch/parser.d.ts +0 -34
  319. package/dist/types/edit/diff.d.ts +0 -75
  320. package/dist/types/edit/file-read-cache.d.ts +0 -25
  321. package/dist/types/edit/index.d.ts +0 -58
  322. package/dist/types/edit/modes/apply-patch.d.ts +0 -24
  323. package/dist/types/edit/modes/patch.d.ts +0 -99
  324. package/dist/types/edit/modes/replace.d.ts +0 -149
  325. package/dist/types/edit/normalize.d.ts +0 -43
  326. package/dist/types/edit/notebook.d.ts +0 -26
  327. package/dist/types/edit/read-file.d.ts +0 -8
  328. package/dist/types/edit/renderer.d.ts +0 -110
  329. package/dist/types/edit/streaming.d.ts +0 -66
  330. package/dist/types/eval/backend.d.ts +0 -40
  331. package/dist/types/eval/index.d.ts +0 -4
  332. package/dist/types/eval/js/context-manager.d.ts +0 -27
  333. package/dist/types/eval/js/executor.d.ts +0 -29
  334. package/dist/types/eval/js/index.d.ts +0 -10
  335. package/dist/types/eval/js/shared/helpers.d.ts +0 -38
  336. package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
  337. package/dist/types/eval/js/shared/prelude.d.ts +0 -1
  338. package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
  339. package/dist/types/eval/js/shared/runtime.d.ts +0 -47
  340. package/dist/types/eval/js/shared/types.d.ts +0 -24
  341. package/dist/types/eval/js/tool-bridge.d.ts +0 -18
  342. package/dist/types/eval/js/worker-core.d.ts +0 -5
  343. package/dist/types/eval/js/worker-entry.d.ts +0 -1
  344. package/dist/types/eval/js/worker-protocol.d.ts +0 -77
  345. package/dist/types/eval/py/display.d.ts +0 -25
  346. package/dist/types/eval/py/executor.d.ts +0 -88
  347. package/dist/types/eval/py/index.d.ts +0 -10
  348. package/dist/types/eval/py/kernel.d.ts +0 -65
  349. package/dist/types/eval/py/prelude.d.ts +0 -1
  350. package/dist/types/eval/py/runtime.d.ts +0 -29
  351. package/dist/types/eval/py/tool-bridge.d.ts +0 -20
  352. package/dist/types/eval/types.d.ts +0 -52
  353. package/dist/types/exa/factory.d.ts +0 -13
  354. package/dist/types/exa/index.d.ts +0 -20
  355. package/dist/types/exa/mcp-client.d.ts +0 -45
  356. package/dist/types/exa/render.d.ts +0 -19
  357. package/dist/types/exa/researcher.d.ts +0 -9
  358. package/dist/types/exa/search.d.ts +0 -9
  359. package/dist/types/exa/types.d.ts +0 -155
  360. package/dist/types/exa/websets.d.ts +0 -9
  361. package/dist/types/exec/bash-executor.d.ts +0 -64
  362. package/dist/types/exec/exec.d.ts +0 -25
  363. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  364. package/dist/types/exec/non-interactive-env.d.ts +0 -1
  365. package/dist/types/export/custom-share.d.ts +0 -20
  366. package/dist/types/export/html/index.d.ts +0 -10
  367. package/dist/types/export/html/template.generated.d.ts +0 -1
  368. package/dist/types/export/html/template.macro.d.ts +0 -5
  369. package/dist/types/export/ttsr.d.ts +0 -55
  370. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
  371. package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
  372. package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
  373. package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
  374. package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
  375. package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
  376. package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
  377. package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
  378. package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
  379. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
  380. package/dist/types/extensibility/extensions/index.d.ts +0 -9
  381. package/dist/types/extensibility/extensions/loader.d.ts +0 -43
  382. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
  383. package/dist/types/extensibility/extensions/runner.d.ts +0 -135
  384. package/dist/types/extensibility/extensions/types.d.ts +0 -918
  385. package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
  386. package/dist/types/extensibility/hooks/index.d.ts +0 -5
  387. package/dist/types/extensibility/hooks/loader.d.ts +0 -89
  388. package/dist/types/extensibility/hooks/runner.d.ts +0 -126
  389. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
  390. package/dist/types/extensibility/hooks/types.d.ts +0 -431
  391. package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
  392. package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
  393. package/dist/types/extensibility/plugins/index.d.ts +0 -8
  394. package/dist/types/extensibility/plugins/installer.d.ts +0 -5
  395. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
  396. package/dist/types/extensibility/plugins/loader.d.ts +0 -31
  397. package/dist/types/extensibility/plugins/manager.d.ts +0 -65
  398. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
  399. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
  400. package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
  401. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
  402. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
  403. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
  404. package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
  405. package/dist/types/extensibility/plugins/parser.d.ts +0 -52
  406. package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
  407. package/dist/types/extensibility/plugins/types.d.ts +0 -149
  408. package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
  409. package/dist/types/extensibility/shared-events.d.ts +0 -281
  410. package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
  411. package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
  412. package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
  413. package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
  414. package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
  415. package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
  416. package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
  417. package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
  418. package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
  419. package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
  420. package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
  421. package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
  422. package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
  423. package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
  424. package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
  425. package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
  426. package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
  427. package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
  428. package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
  429. package/dist/types/extensibility/skills.d.ts +0 -82
  430. package/dist/types/extensibility/slash-commands.d.ts +0 -48
  431. package/dist/types/extensibility/tool-proxy.d.ts +0 -4
  432. package/dist/types/extensibility/typebox.d.ts +0 -155
  433. package/dist/types/extensibility/utils.d.ts +0 -12
  434. package/dist/types/goals/index.d.ts +0 -3
  435. package/dist/types/goals/runtime.d.ts +0 -63
  436. package/dist/types/goals/state.d.ts +0 -32
  437. package/dist/types/goals/tools/goal-tool.d.ts +0 -62
  438. package/dist/types/harness-control-plane/classifier.d.ts +0 -13
  439. package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
  440. package/dist/types/harness-control-plane/finalize.d.ts +0 -60
  441. package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
  442. package/dist/types/harness-control-plane/operate.d.ts +0 -35
  443. package/dist/types/harness-control-plane/owner.d.ts +0 -53
  444. package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
  445. package/dist/types/harness-control-plane/preserve.d.ts +0 -19
  446. package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
  447. package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
  448. package/dist/types/harness-control-plane/receipts.d.ts +0 -149
  449. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  450. package/dist/types/harness-control-plane/seams.d.ts +0 -21
  451. package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
  452. package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
  453. package/dist/types/harness-control-plane/storage.d.ts +0 -81
  454. package/dist/types/harness-control-plane/types.d.ts +0 -187
  455. package/dist/types/hashline/anchors.d.ts +0 -20
  456. package/dist/types/hashline/apply.d.ts +0 -14
  457. package/dist/types/hashline/constants.d.ts +0 -19
  458. package/dist/types/hashline/diff-preview.d.ts +0 -2
  459. package/dist/types/hashline/diff.d.ts +0 -17
  460. package/dist/types/hashline/execute.d.ts +0 -4
  461. package/dist/types/hashline/hash.d.ts +0 -123
  462. package/dist/types/hashline/index.d.ts +0 -13
  463. package/dist/types/hashline/input.d.ts +0 -11
  464. package/dist/types/hashline/parser.d.ts +0 -7
  465. package/dist/types/hashline/prefixes.d.ts +0 -7
  466. package/dist/types/hashline/recovery.d.ts +0 -27
  467. package/dist/types/hashline/stream.d.ts +0 -2
  468. package/dist/types/hashline/types.d.ts +0 -77
  469. package/dist/types/hindsight/backend.d.ts +0 -13
  470. package/dist/types/hindsight/bank.d.ts +0 -54
  471. package/dist/types/hindsight/client.d.ts +0 -224
  472. package/dist/types/hindsight/config.d.ts +0 -51
  473. package/dist/types/hindsight/content.d.ts +0 -70
  474. package/dist/types/hindsight/index.d.ts +0 -8
  475. package/dist/types/hindsight/mental-models.d.ts +0 -125
  476. package/dist/types/hindsight/state.d.ts +0 -99
  477. package/dist/types/hindsight/transcript.d.ts +0 -28
  478. package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
  479. package/dist/types/hooks/native-skill-hook.d.ts +0 -28
  480. package/dist/types/hooks/skill-keywords.d.ts +0 -18
  481. package/dist/types/hooks/skill-state.d.ts +0 -93
  482. package/dist/types/i18n/index.d.ts +0 -38
  483. package/dist/types/i18n/messages/de.d.ts +0 -2
  484. package/dist/types/i18n/messages/de.messages.d.ts +0 -1
  485. package/dist/types/i18n/messages/de.settings.d.ts +0 -1
  486. package/dist/types/i18n/messages/en.d.ts +0 -81
  487. package/dist/types/i18n/messages/es.d.ts +0 -2
  488. package/dist/types/i18n/messages/es.messages.d.ts +0 -1
  489. package/dist/types/i18n/messages/es.settings.d.ts +0 -1
  490. package/dist/types/i18n/messages/fr.d.ts +0 -2
  491. package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
  492. package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
  493. package/dist/types/i18n/messages/ja.d.ts +0 -2
  494. package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
  495. package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
  496. package/dist/types/i18n/messages/ko.d.ts +0 -2
  497. package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
  498. package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
  499. package/dist/types/i18n/messages/zh.d.ts +0 -2
  500. package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
  501. package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
  502. package/dist/types/index.d.ts +0 -33
  503. package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
  504. package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
  505. package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
  506. package/dist/types/internal-urls/index.d.ts +0 -20
  507. package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
  508. package/dist/types/internal-urls/json-query.d.ts +0 -30
  509. package/dist/types/internal-urls/local-protocol.d.ts +0 -39
  510. package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
  511. package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
  512. package/dist/types/internal-urls/parse.d.ts +0 -19
  513. package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
  514. package/dist/types/internal-urls/router.d.ts +0 -14
  515. package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
  516. package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
  517. package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
  518. package/dist/types/internal-urls/types.d.ts +0 -109
  519. package/dist/types/lsp/client.d.ts +0 -66
  520. package/dist/types/lsp/clients/biome-client.d.ts +0 -16
  521. package/dist/types/lsp/clients/index.d.ts +0 -19
  522. package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
  523. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
  524. package/dist/types/lsp/config.d.ts +0 -65
  525. package/dist/types/lsp/edits.d.ts +0 -23
  526. package/dist/types/lsp/index.d.ts +0 -130
  527. package/dist/types/lsp/lspmux.d.ts +0 -58
  528. package/dist/types/lsp/render.d.ts +0 -32
  529. package/dist/types/lsp/startup-events.d.ts +0 -12
  530. package/dist/types/lsp/types.d.ts +0 -306
  531. package/dist/types/lsp/utils.d.ts +0 -108
  532. package/dist/types/main.d.ts +0 -75
  533. package/dist/types/memories/index.d.ts +0 -28
  534. package/dist/types/memories/storage.d.ts +0 -110
  535. package/dist/types/memory-backend/index.d.ts +0 -4
  536. package/dist/types/memory-backend/local-backend.d.ts +0 -9
  537. package/dist/types/memory-backend/off-backend.d.ts +0 -7
  538. package/dist/types/memory-backend/resolve.d.ts +0 -15
  539. package/dist/types/memory-backend/types.d.ts +0 -61
  540. package/dist/types/migrate/action-planner.d.ts +0 -11
  541. package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
  542. package/dist/types/migrate/adapters/codex.d.ts +0 -5
  543. package/dist/types/migrate/adapters/index.d.ts +0 -45
  544. package/dist/types/migrate/adapters/opencode.d.ts +0 -2
  545. package/dist/types/migrate/executor.d.ts +0 -2
  546. package/dist/types/migrate/mcp-mapper.d.ts +0 -20
  547. package/dist/types/migrate/report.d.ts +0 -18
  548. package/dist/types/migrate/skill-normalizer.d.ts +0 -27
  549. package/dist/types/migrate/types.d.ts +0 -126
  550. package/dist/types/modes/acp/acp-agent.d.ts +0 -61
  551. package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
  552. package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -36
  553. package/dist/types/modes/acp/acp-mode.d.ts +0 -5
  554. package/dist/types/modes/acp/index.d.ts +0 -2
  555. package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
  556. package/dist/types/modes/bridge/auth.d.ts +0 -12
  557. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  558. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  559. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  560. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  561. package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
  562. package/dist/types/modes/components/assistant-message.d.ts +0 -20
  563. package/dist/types/modes/components/bash-execution.d.ts +0 -29
  564. package/dist/types/modes/components/bordered-loader.d.ts +0 -11
  565. package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
  566. package/dist/types/modes/components/btw-panel.d.ts +0 -16
  567. package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
  568. package/dist/types/modes/components/countdown-timer.d.ts +0 -14
  569. package/dist/types/modes/components/custom-editor.d.ts +0 -67
  570. package/dist/types/modes/components/custom-message.d.ts +0 -15
  571. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
  572. package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
  573. package/dist/types/modes/components/diff.d.ts +0 -11
  574. package/dist/types/modes/components/dynamic-border.d.ts +0 -14
  575. package/dist/types/modes/components/eval-execution.d.ts +0 -23
  576. package/dist/types/modes/components/execution-shared.d.ts +0 -46
  577. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
  578. package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
  579. package/dist/types/modes/components/extensions/index.d.ts +0 -8
  580. package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
  581. package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
  582. package/dist/types/modes/components/extensions/types.d.ts +0 -151
  583. package/dist/types/modes/components/footer.d.ts +0 -30
  584. package/dist/types/modes/components/history-search.d.ts +0 -7
  585. package/dist/types/modes/components/hook-editor.d.ts +0 -18
  586. package/dist/types/modes/components/hook-input.d.ts +0 -15
  587. package/dist/types/modes/components/hook-message.d.ts +0 -15
  588. package/dist/types/modes/components/hook-selector.d.ts +0 -54
  589. package/dist/types/modes/components/index.d.ts +0 -35
  590. package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
  591. package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
  592. package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
  593. package/dist/types/modes/components/login-dialog.d.ts +0 -32
  594. package/dist/types/modes/components/message-frame.d.ts +0 -42
  595. package/dist/types/modes/components/model-selector.d.ts +0 -60
  596. package/dist/types/modes/components/oauth-selector.d.ts +0 -17
  597. package/dist/types/modes/components/plugin-selector.d.ts +0 -26
  598. package/dist/types/modes/components/plugin-settings.d.ts +0 -66
  599. package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
  600. package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
  601. package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
  602. package/dist/types/modes/components/read-tool-group.d.ts +0 -30
  603. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
  604. package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
  605. package/dist/types/modes/components/session-selector.d.ts +0 -30
  606. package/dist/types/modes/components/settings-defs.d.ts +0 -50
  607. package/dist/types/modes/components/settings-selector.d.ts +0 -62
  608. package/dist/types/modes/components/show-images-selector.d.ts +0 -9
  609. package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
  610. package/dist/types/modes/components/skill-message.d.ts +0 -10
  611. package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
  612. package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
  613. package/dist/types/modes/components/status-line/index.d.ts +0 -4
  614. package/dist/types/modes/components/status-line/presets.d.ts +0 -3
  615. package/dist/types/modes/components/status-line/segments.d.ts +0 -5
  616. package/dist/types/modes/components/status-line/separators.d.ts +0 -3
  617. package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
  618. package/dist/types/modes/components/status-line/types.d.ts +0 -83
  619. package/dist/types/modes/components/status-line.d.ts +0 -104
  620. package/dist/types/modes/components/theme-selector.d.ts +0 -10
  621. package/dist/types/modes/components/thinking-selector.d.ts +0 -15
  622. package/dist/types/modes/components/todo-reminder.d.ts +0 -13
  623. package/dist/types/modes/components/tool-execution.d.ts +0 -54
  624. package/dist/types/modes/components/tree-selector.d.ts +0 -31
  625. package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
  626. package/dist/types/modes/components/two-column-body.d.ts +0 -9
  627. package/dist/types/modes/components/user-message-selector.d.ts +0 -28
  628. package/dist/types/modes/components/user-message.d.ts +0 -7
  629. package/dist/types/modes/components/visual-truncate.d.ts +0 -19
  630. package/dist/types/modes/components/welcome.d.ts +0 -46
  631. package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
  632. package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
  633. package/dist/types/modes/controllers/command-controller.d.ts +0 -40
  634. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  635. package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
  636. package/dist/types/modes/controllers/input-controller.d.ts +0 -42
  637. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
  638. package/dist/types/modes/controllers/selector-controller.d.ts +0 -67
  639. package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
  640. package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
  641. package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
  642. package/dist/types/modes/index.d.ts +0 -10
  643. package/dist/types/modes/interactive-mode.d.ts +0 -275
  644. package/dist/types/modes/jobs-observer.d.ts +0 -57
  645. package/dist/types/modes/oauth-manual-input.d.ts +0 -8
  646. package/dist/types/modes/print-mode.d.ts +0 -45
  647. package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
  648. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  649. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  650. package/dist/types/modes/rpc/rpc-client.d.ts +0 -293
  651. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -85
  652. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  653. package/dist/types/modes/rpc/rpc-types.d.ts +0 -794
  654. package/dist/types/modes/runtime-init.d.ts +0 -21
  655. package/dist/types/modes/session-observer-registry.d.ts +0 -26
  656. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
  657. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  658. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  659. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  660. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -94
  661. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
  662. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
  663. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
  664. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  665. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  666. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  667. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  668. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  669. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  670. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  671. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  672. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  673. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  674. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  675. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -161
  676. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -82
  677. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -114
  678. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
  679. package/dist/types/modes/shared.d.ts +0 -15
  680. package/dist/types/modes/slash-command-visibility.d.ts +0 -1
  681. package/dist/types/modes/theme/defaults/index.d.ts +0 -652
  682. package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
  683. package/dist/types/modes/theme/shimmer.d.ts +0 -38
  684. package/dist/types/modes/theme/theme.d.ts +0 -275
  685. package/dist/types/modes/tmux-scroll.d.ts +0 -18
  686. package/dist/types/modes/types.d.ts +0 -292
  687. package/dist/types/modes/utils/abort-message.d.ts +0 -4
  688. package/dist/types/modes/utils/context-usage.d.ts +0 -51
  689. package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
  690. package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
  691. package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
  692. package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
  693. package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
  694. package/dist/types/modes/utils/ui-helpers.d.ts +0 -66
  695. package/dist/types/notifications/attachment-registry.d.ts +0 -17
  696. package/dist/types/notifications/chat-adapters.d.ts +0 -9
  697. package/dist/types/notifications/config-commands.d.ts +0 -64
  698. package/dist/types/notifications/config.d.ts +0 -98
  699. package/dist/types/notifications/daemon-paths.d.ts +0 -10
  700. package/dist/types/notifications/engine.d.ts +0 -59
  701. package/dist/types/notifications/helpers.d.ts +0 -55
  702. package/dist/types/notifications/html-format.d.ts +0 -75
  703. package/dist/types/notifications/index.d.ts +0 -192
  704. package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
  705. package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -99
  706. package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
  707. package/dist/types/notifications/managed-daemon.d.ts +0 -48
  708. package/dist/types/notifications/operator-runtime.d.ts +0 -52
  709. package/dist/types/notifications/rate-limit-pool.d.ts +0 -95
  710. package/dist/types/notifications/recent-activity.d.ts +0 -39
  711. package/dist/types/notifications/reply-sent-store.d.ts +0 -53
  712. package/dist/types/notifications/rich-draft.d.ts +0 -68
  713. package/dist/types/notifications/rich-render.d.ts +0 -90
  714. package/dist/types/notifications/telegram-cli.d.ts +0 -19
  715. package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
  716. package/dist/types/notifications/telegram-daemon-control.d.ts +0 -64
  717. package/dist/types/notifications/telegram-daemon.d.ts +0 -431
  718. package/dist/types/notifications/telegram-reference.d.ts +0 -119
  719. package/dist/types/notifications/threaded-inbound.d.ts +0 -77
  720. package/dist/types/notifications/threaded-render.d.ts +0 -88
  721. package/dist/types/notifications/topic-registry.d.ts +0 -69
  722. package/dist/types/plan-mode/approved-plan.d.ts +0 -49
  723. package/dist/types/plan-mode/state.d.ts +0 -6
  724. package/dist/types/registry/agent-registry.d.ts +0 -62
  725. package/dist/types/reminders/star-reminder.d.ts +0 -115
  726. package/dist/types/research-plan/index.d.ts +0 -1
  727. package/dist/types/research-plan/ledger.d.ts +0 -33
  728. package/dist/types/rlm/artifacts.d.ts +0 -9
  729. package/dist/types/rlm/complete-research-tool.d.ts +0 -35
  730. package/dist/types/rlm/data-context.d.ts +0 -6
  731. package/dist/types/rlm/index.d.ts +0 -47
  732. package/dist/types/rlm/notebook.d.ts +0 -12
  733. package/dist/types/rlm/preset.d.ts +0 -23
  734. package/dist/types/rlm/python-tool.d.ts +0 -16
  735. package/dist/types/rlm/report.d.ts +0 -14
  736. package/dist/types/rlm/types.d.ts +0 -37
  737. package/dist/types/runtime/process-lifecycle.d.ts +0 -108
  738. package/dist/types/runtime-api-key.d.ts +0 -7
  739. package/dist/types/runtime-credential-selector.d.ts +0 -7
  740. package/dist/types/runtime-mcp/client.d.ts +0 -74
  741. package/dist/types/runtime-mcp/config-writer.d.ts +0 -89
  742. package/dist/types/runtime-mcp/config.d.ts +0 -77
  743. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  744. package/dist/types/runtime-mcp/index.d.ts +0 -18
  745. package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
  746. package/dist/types/runtime-mcp/loader.d.ts +0 -45
  747. package/dist/types/runtime-mcp/manager.d.ts +0 -195
  748. package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
  749. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
  750. package/dist/types/runtime-mcp/render.d.ts +0 -25
  751. package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
  752. package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
  753. package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
  754. package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
  755. package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
  756. package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
  757. package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
  758. package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
  759. package/dist/types/runtime-mcp/types.d.ts +0 -349
  760. package/dist/types/sdk.d.ts +0 -254
  761. package/dist/types/secrets/index.d.ts +0 -9
  762. package/dist/types/secrets/obfuscator.d.ts +0 -23
  763. package/dist/types/secrets/regex.d.ts +0 -2
  764. package/dist/types/session/agent-session.d.ts +0 -1201
  765. package/dist/types/session/agent-storage.d.ts +0 -101
  766. package/dist/types/session/artifacts.d.ts +0 -64
  767. package/dist/types/session/auth-broker-config.d.ts +0 -13
  768. package/dist/types/session/auth-storage.d.ts +0 -6
  769. package/dist/types/session/blob-store.d.ts +0 -160
  770. package/dist/types/session/client-bridge.d.ts +0 -88
  771. package/dist/types/session/contribution-prep.d.ts +0 -47
  772. package/dist/types/session/file-mention-pruning.d.ts +0 -8
  773. package/dist/types/session/history-storage.d.ts +0 -16
  774. package/dist/types/session/messages.d.ts +0 -169
  775. package/dist/types/session/session-dump-format.d.ts +0 -22
  776. package/dist/types/session/session-manager.d.ts +0 -661
  777. package/dist/types/session/session-storage.d.ts +0 -88
  778. package/dist/types/session/streaming-output.d.ts +0 -209
  779. package/dist/types/session/tool-choice-queue.d.ts +0 -84
  780. package/dist/types/session/yield-queue.d.ts +0 -24
  781. package/dist/types/setup/credential-auto-import.d.ts +0 -63
  782. package/dist/types/setup/credential-import.d.ts +0 -82
  783. package/dist/types/setup/hermes-setup.d.ts +0 -78
  784. package/dist/types/setup/host-plugin-setup.d.ts +0 -39
  785. package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
  786. package/dist/types/setup/provider-onboarding.d.ts +0 -52
  787. package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
  788. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
  789. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
  790. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
  791. package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
  792. package/dist/types/skc-runtime/gc-render.d.ts +0 -6
  793. package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
  794. package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
  795. package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
  796. package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
  797. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
  798. package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
  799. package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
  800. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
  801. package/dist/types/skc-runtime/session-layout.d.ts +0 -59
  802. package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
  803. package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -39
  804. package/dist/types/skc-runtime/state-graph.d.ts +0 -4
  805. package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
  806. package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
  807. package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
  808. package/dist/types/skc-runtime/state-schema.d.ts +0 -319
  809. package/dist/types/skc-runtime/state-validation.d.ts +0 -6
  810. package/dist/types/skc-runtime/state-writer.d.ts +0 -244
  811. package/dist/types/skc-runtime/team-gc.d.ts +0 -7
  812. package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
  813. package/dist/types/skc-runtime/tmux-common.d.ts +0 -105
  814. package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
  815. package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -62
  816. package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
  817. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
  818. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
  819. package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
  820. package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
  821. package/dist/types/skill-state/active-state.d.ts +0 -126
  822. package/dist/types/skill-state/canonical-skills.d.ts +0 -3
  823. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
  824. package/dist/types/skill-state/initial-phase.d.ts +0 -12
  825. package/dist/types/skill-state/workflow-hud.d.ts +0 -83
  826. package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
  827. package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
  828. package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
  829. package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
  830. package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
  831. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
  832. package/dist/types/slash-commands/helpers/format.d.ts +0 -10
  833. package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
  834. package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
  835. package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
  836. package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
  837. package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
  838. package/dist/types/slash-commands/types.d.ts +0 -120
  839. package/dist/types/ssh/config-writer.d.ts +0 -49
  840. package/dist/types/ssh/connection-manager.d.ts +0 -33
  841. package/dist/types/ssh/ssh-executor.d.ts +0 -37
  842. package/dist/types/ssh/sshfs-mount.d.ts +0 -6
  843. package/dist/types/ssh/utils.d.ts +0 -2
  844. package/dist/types/stt/downloader.d.ts +0 -9
  845. package/dist/types/stt/index.d.ts +0 -3
  846. package/dist/types/stt/recorder.d.ts +0 -13
  847. package/dist/types/stt/setup.d.ts +0 -18
  848. package/dist/types/stt/stt-controller.d.ts +0 -16
  849. package/dist/types/stt/transcriber.d.ts +0 -16
  850. package/dist/types/system-prompt.d.ts +0 -118
  851. package/dist/types/task/agents.d.ts +0 -28
  852. package/dist/types/task/commands.d.ts +0 -35
  853. package/dist/types/task/discovery.d.ts +0 -19
  854. package/dist/types/task/executor.d.ts +0 -124
  855. package/dist/types/task/fork-context-advisory.d.ts +0 -13
  856. package/dist/types/task/fork-context-budget.d.ts +0 -7
  857. package/dist/types/task/id.d.ts +0 -7
  858. package/dist/types/task/index.d.ts +0 -43
  859. package/dist/types/task/name-generator.d.ts +0 -16
  860. package/dist/types/task/output-manager.d.ts +0 -36
  861. package/dist/types/task/parallel.d.ts +0 -34
  862. package/dist/types/task/receipt.d.ts +0 -87
  863. package/dist/types/task/render.d.ts +0 -28
  864. package/dist/types/task/roi-reconciliation.d.ts +0 -27
  865. package/dist/types/task/simple-mode.d.ts +0 -8
  866. package/dist/types/task/skc-command.d.ts +0 -7
  867. package/dist/types/task/spawn-gate.d.ts +0 -29
  868. package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
  869. package/dist/types/task/token-log.d.ts +0 -30
  870. package/dist/types/task/token-log.test.d.ts +0 -1
  871. package/dist/types/task/types.d.ts +0 -508
  872. package/dist/types/task/worktree.d.ts +0 -94
  873. package/dist/types/thinking-metadata.d.ts +0 -16
  874. package/dist/types/thinking.d.ts +0 -22
  875. package/dist/types/tool-discovery/tool-index.d.ts +0 -112
  876. package/dist/types/tools/archive-reader.d.ts +0 -40
  877. package/dist/types/tools/ask-answer-registry.d.ts +0 -13
  878. package/dist/types/tools/ask.d.ts +0 -123
  879. package/dist/types/tools/ast-edit.d.ts +0 -77
  880. package/dist/types/tools/ast-grep.d.ts +0 -69
  881. package/dist/types/tools/auto-generated-guard.d.ts +0 -17
  882. package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
  883. package/dist/types/tools/bash-command-fixup.d.ts +0 -11
  884. package/dist/types/tools/bash-interactive.d.ts +0 -16
  885. package/dist/types/tools/bash-interceptor.d.ts +0 -24
  886. package/dist/types/tools/bash-pty-selection.d.ts +0 -7
  887. package/dist/types/tools/bash-skill-urls.d.ts +0 -31
  888. package/dist/types/tools/bash.d.ts +0 -157
  889. package/dist/types/tools/bisect.d.ts +0 -81
  890. package/dist/types/tools/browser/actions.d.ts +0 -54
  891. package/dist/types/tools/browser/attach.d.ts +0 -50
  892. package/dist/types/tools/browser/launch.d.ts +0 -62
  893. package/dist/types/tools/browser/readable.d.ts +0 -17
  894. package/dist/types/tools/browser/registry.d.ts +0 -57
  895. package/dist/types/tools/browser/render.d.ts +0 -53
  896. package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
  897. package/dist/types/tools/browser/tab-supervisor.d.ts +0 -103
  898. package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
  899. package/dist/types/tools/browser/tab-worker.d.ts +0 -19
  900. package/dist/types/tools/browser.d.ts +0 -211
  901. package/dist/types/tools/calculator.d.ts +0 -76
  902. package/dist/types/tools/checkpoint.d.ts +0 -63
  903. package/dist/types/tools/composer-bash-policy.d.ts +0 -14
  904. package/dist/types/tools/computer/render.d.ts +0 -17
  905. package/dist/types/tools/computer-gc.d.ts +0 -23
  906. package/dist/types/tools/computer.d.ts +0 -465
  907. package/dist/types/tools/conflict-detect.d.ts +0 -205
  908. package/dist/types/tools/context.d.ts +0 -19
  909. package/dist/types/tools/cron.d.ts +0 -91
  910. package/dist/types/tools/debug.d.ts +0 -209
  911. package/dist/types/tools/eval.d.ts +0 -108
  912. package/dist/types/tools/fetch.d.ts +0 -84
  913. package/dist/types/tools/file-recorder.d.ts +0 -13
  914. package/dist/types/tools/find.d.ts +0 -95
  915. package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
  916. package/dist/types/tools/gh-format.d.ts +0 -6
  917. package/dist/types/tools/gh-renderer.d.ts +0 -25
  918. package/dist/types/tools/gh.d.ts +0 -356
  919. package/dist/types/tools/github-cache.d.ts +0 -103
  920. package/dist/types/tools/grouped-file-output.d.ts +0 -36
  921. package/dist/types/tools/hindsight-recall.d.ts +0 -21
  922. package/dist/types/tools/hindsight-reflect.d.ts +0 -23
  923. package/dist/types/tools/hindsight-retain.d.ts +0 -27
  924. package/dist/types/tools/image-gen.d.ts +0 -79
  925. package/dist/types/tools/index.d.ts +0 -319
  926. package/dist/types/tools/irc.d.ts +0 -79
  927. package/dist/types/tools/job.d.ts +0 -78
  928. package/dist/types/tools/json-tree.d.ts +0 -23
  929. package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
  930. package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
  931. package/dist/types/tools/jtd-utils.d.ts +0 -42
  932. package/dist/types/tools/list-limit.d.ts +0 -12
  933. package/dist/types/tools/match-line-format.d.ts +0 -11
  934. package/dist/types/tools/monitor.d.ts +0 -54
  935. package/dist/types/tools/output-meta.d.ts +0 -204
  936. package/dist/types/tools/path-utils.d.ts +0 -147
  937. package/dist/types/tools/plan-mode-guard.d.ts +0 -18
  938. package/dist/types/tools/read.d.ts +0 -85
  939. package/dist/types/tools/recipe/index.d.ts +0 -45
  940. package/dist/types/tools/recipe/render.d.ts +0 -36
  941. package/dist/types/tools/recipe/runner.d.ts +0 -60
  942. package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
  943. package/dist/types/tools/recipe/runners/index.d.ts +0 -2
  944. package/dist/types/tools/recipe/runners/just.d.ts +0 -2
  945. package/dist/types/tools/recipe/runners/make.d.ts +0 -2
  946. package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
  947. package/dist/types/tools/recipe/runners/task.d.ts +0 -2
  948. package/dist/types/tools/render-mermaid.d.ts +0 -37
  949. package/dist/types/tools/render-utils.d.ts +0 -158
  950. package/dist/types/tools/renderers.d.ts +0 -26
  951. package/dist/types/tools/resolve.d.ts +0 -80
  952. package/dist/types/tools/resource-gc.d.ts +0 -54
  953. package/dist/types/tools/review.d.ts +0 -63
  954. package/dist/types/tools/search-tool-bm25.d.ts +0 -65
  955. package/dist/types/tools/search.d.ts +0 -93
  956. package/dist/types/tools/skill-discovery.d.ts +0 -40
  957. package/dist/types/tools/skill.d.ts +0 -48
  958. package/dist/types/tools/sqlite-reader.d.ts +0 -94
  959. package/dist/types/tools/ssh.d.ts +0 -67
  960. package/dist/types/tools/subagent-render.d.ts +0 -31
  961. package/dist/types/tools/subagent.d.ts +0 -117
  962. package/dist/types/tools/telegram-send.d.ts +0 -32
  963. package/dist/types/tools/todo-write.d.ts +0 -120
  964. package/dist/types/tools/tool-errors.d.ts +0 -33
  965. package/dist/types/tools/tool-result.d.ts +0 -30
  966. package/dist/types/tools/tool-timeouts.d.ts +0 -56
  967. package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
  968. package/dist/types/tools/vim.d.ts +0 -58
  969. package/dist/types/tools/write.d.ts +0 -59
  970. package/dist/types/tools/yield.d.ts +0 -25
  971. package/dist/types/tui/code-cell.d.ts +0 -32
  972. package/dist/types/tui/file-list.d.ts +0 -22
  973. package/dist/types/tui/hyperlink.d.ts +0 -42
  974. package/dist/types/tui/index.d.ts +0 -11
  975. package/dist/types/tui/output-block.d.ts +0 -28
  976. package/dist/types/tui/status-line.d.ts +0 -18
  977. package/dist/types/tui/tree-list.d.ts +0 -19
  978. package/dist/types/tui/types.d.ts +0 -13
  979. package/dist/types/tui/utils.d.ts +0 -36
  980. package/dist/types/utils/changelog.d.ts +0 -37
  981. package/dist/types/utils/clipboard.d.ts +0 -22
  982. package/dist/types/utils/cmux-workspace.d.ts +0 -52
  983. package/dist/types/utils/command-args.d.ts +0 -9
  984. package/dist/types/utils/commit-message-generator.d.ts +0 -7
  985. package/dist/types/utils/edit-mode.d.ts +0 -13
  986. package/dist/types/utils/event-bus.d.ts +0 -6
  987. package/dist/types/utils/external-editor.d.ts +0 -17
  988. package/dist/types/utils/file-display-mode.d.ts +0 -27
  989. package/dist/types/utils/file-mentions.d.ts +0 -25
  990. package/dist/types/utils/git.d.ts +0 -393
  991. package/dist/types/utils/image-loading.d.ts +0 -26
  992. package/dist/types/utils/image-resize.d.ts +0 -39
  993. package/dist/types/utils/lang-from-path.d.ts +0 -8
  994. package/dist/types/utils/linkedom.d.ts +0 -4
  995. package/dist/types/utils/markit.d.ts +0 -7
  996. package/dist/types/utils/open.d.ts +0 -2
  997. package/dist/types/utils/pasted-image-path.d.ts +0 -32
  998. package/dist/types/utils/session-color.d.ts +0 -10
  999. package/dist/types/utils/shell-snapshot.d.ts +0 -5
  1000. package/dist/types/utils/sixel.d.ts +0 -21
  1001. package/dist/types/utils/title-generator.d.ts +0 -31
  1002. package/dist/types/utils/tool-choice.d.ts +0 -20
  1003. package/dist/types/utils/tools-manager.d.ts +0 -9
  1004. package/dist/types/vim/buffer.d.ts +0 -41
  1005. package/dist/types/vim/commands.d.ts +0 -6
  1006. package/dist/types/vim/engine.d.ts +0 -47
  1007. package/dist/types/vim/parser.d.ts +0 -3
  1008. package/dist/types/vim/render.d.ts +0 -25
  1009. package/dist/types/vim/types.d.ts +0 -182
  1010. package/dist/types/web/insane/bridge.d.ts +0 -103
  1011. package/dist/types/web/insane/url-guard.d.ts +0 -25
  1012. package/dist/types/web/kagi.d.ts +0 -23
  1013. package/dist/types/web/parallel.d.ts +0 -58
  1014. package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
  1015. package/dist/types/web/scrapers/arxiv.d.ts +0 -5
  1016. package/dist/types/web/scrapers/aur.d.ts +0 -5
  1017. package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
  1018. package/dist/types/web/scrapers/bluesky.d.ts +0 -5
  1019. package/dist/types/web/scrapers/brew.d.ts +0 -5
  1020. package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
  1021. package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
  1022. package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
  1023. package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
  1024. package/dist/types/web/scrapers/clojars.d.ts +0 -5
  1025. package/dist/types/web/scrapers/coingecko.d.ts +0 -5
  1026. package/dist/types/web/scrapers/crates-io.d.ts +0 -5
  1027. package/dist/types/web/scrapers/crossref.d.ts +0 -2
  1028. package/dist/types/web/scrapers/devto.d.ts +0 -5
  1029. package/dist/types/web/scrapers/discogs.d.ts +0 -8
  1030. package/dist/types/web/scrapers/discourse.d.ts +0 -5
  1031. package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
  1032. package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
  1033. package/dist/types/web/scrapers/fdroid.d.ts +0 -5
  1034. package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
  1035. package/dist/types/web/scrapers/flathub.d.ts +0 -2
  1036. package/dist/types/web/scrapers/github-gist.d.ts +0 -5
  1037. package/dist/types/web/scrapers/github.d.ts +0 -12
  1038. package/dist/types/web/scrapers/gitlab.d.ts +0 -5
  1039. package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
  1040. package/dist/types/web/scrapers/hackage.d.ts +0 -5
  1041. package/dist/types/web/scrapers/hackernews.d.ts +0 -2
  1042. package/dist/types/web/scrapers/hex.d.ts +0 -5
  1043. package/dist/types/web/scrapers/huggingface.d.ts +0 -2
  1044. package/dist/types/web/scrapers/iacr.d.ts +0 -5
  1045. package/dist/types/web/scrapers/index.d.ts +0 -84
  1046. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
  1047. package/dist/types/web/scrapers/lemmy.d.ts +0 -2
  1048. package/dist/types/web/scrapers/lobsters.d.ts +0 -5
  1049. package/dist/types/web/scrapers/mastodon.d.ts +0 -5
  1050. package/dist/types/web/scrapers/maven.d.ts +0 -6
  1051. package/dist/types/web/scrapers/mdn.d.ts +0 -2
  1052. package/dist/types/web/scrapers/metacpan.d.ts +0 -5
  1053. package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
  1054. package/dist/types/web/scrapers/npm.d.ts +0 -5
  1055. package/dist/types/web/scrapers/nuget.d.ts +0 -5
  1056. package/dist/types/web/scrapers/nvd.d.ts +0 -5
  1057. package/dist/types/web/scrapers/ollama.d.ts +0 -2
  1058. package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
  1059. package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
  1060. package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
  1061. package/dist/types/web/scrapers/orcid.d.ts +0 -5
  1062. package/dist/types/web/scrapers/osv.d.ts +0 -5
  1063. package/dist/types/web/scrapers/packagist.d.ts +0 -5
  1064. package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
  1065. package/dist/types/web/scrapers/pubmed.d.ts +0 -5
  1066. package/dist/types/web/scrapers/pypi.d.ts +0 -5
  1067. package/dist/types/web/scrapers/rawg.d.ts +0 -2
  1068. package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
  1069. package/dist/types/web/scrapers/reddit.d.ts +0 -5
  1070. package/dist/types/web/scrapers/repology.d.ts +0 -5
  1071. package/dist/types/web/scrapers/rfc.d.ts +0 -5
  1072. package/dist/types/web/scrapers/rubygems.d.ts +0 -5
  1073. package/dist/types/web/scrapers/searchcode.d.ts +0 -2
  1074. package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
  1075. package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
  1076. package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
  1077. package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
  1078. package/dist/types/web/scrapers/spdx.d.ts +0 -5
  1079. package/dist/types/web/scrapers/spotify.d.ts +0 -8
  1080. package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
  1081. package/dist/types/web/scrapers/terraform.d.ts +0 -5
  1082. package/dist/types/web/scrapers/tldr.d.ts +0 -7
  1083. package/dist/types/web/scrapers/twitter.d.ts +0 -5
  1084. package/dist/types/web/scrapers/types.d.ts +0 -83
  1085. package/dist/types/web/scrapers/utils.d.ts +0 -32
  1086. package/dist/types/web/scrapers/vimeo.d.ts +0 -5
  1087. package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
  1088. package/dist/types/web/scrapers/w3c.d.ts +0 -2
  1089. package/dist/types/web/scrapers/wikidata.d.ts +0 -5
  1090. package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
  1091. package/dist/types/web/scrapers/youtube.d.ts +0 -13
  1092. package/dist/types/web/search/index.d.ts +0 -118
  1093. package/dist/types/web/search/provider.d.ts +0 -55
  1094. package/dist/types/web/search/providers/anthropic.d.ts +0 -32
  1095. package/dist/types/web/search/providers/base.d.ts +0 -90
  1096. package/dist/types/web/search/providers/brave.d.ts +0 -27
  1097. package/dist/types/web/search/providers/codex.d.ts +0 -35
  1098. package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
  1099. package/dist/types/web/search/providers/exa.d.ts +0 -52
  1100. package/dist/types/web/search/providers/gemini.d.ts +0 -57
  1101. package/dist/types/web/search/providers/insane.d.ts +0 -53
  1102. package/dist/types/web/search/providers/jina.d.ts +0 -26
  1103. package/dist/types/web/search/providers/kagi.d.ts +0 -24
  1104. package/dist/types/web/search/providers/kimi.d.ts +0 -27
  1105. package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
  1106. package/dist/types/web/search/providers/parallel.d.ts +0 -15
  1107. package/dist/types/web/search/providers/perplexity.d.ts +0 -38
  1108. package/dist/types/web/search/providers/searxng.d.ts +0 -44
  1109. package/dist/types/web/search/providers/synthetic.d.ts +0 -21
  1110. package/dist/types/web/search/providers/tavily.d.ts +0 -29
  1111. package/dist/types/web/search/providers/text-citations.d.ts +0 -23
  1112. package/dist/types/web/search/providers/utils.d.ts +0 -88
  1113. package/dist/types/web/search/providers/xai.d.ts +0 -64
  1114. package/dist/types/web/search/providers/zai.d.ts +0 -28
  1115. package/dist/types/web/search/render.d.ts +0 -36
  1116. package/dist/types/web/search/types.d.ts +0 -372
  1117. package/dist/types/web/search/utils.d.ts +0 -4
  1118. package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
  1119. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
  1120. package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
  1121. package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
  1122. 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
 
@@ -167,6 +196,10 @@ function endpointGenerationKey(url: string, token: string): string {
167
196
  return `${url}\0${token}`;
168
197
  }
169
198
 
199
+ function topicRenameApplied(response: unknown): boolean {
200
+ return !!response && typeof response === "object" && (response as { ok?: unknown }).ok === true;
201
+ }
202
+
170
203
  /**
171
204
  * Whether `err` is a transient network failure worth retrying. Telegram API
172
205
  * calls over HTTP/2 occasionally surface mid-stream `ECONNRESET` (and similar)
@@ -363,6 +396,7 @@ export async function acquireDaemonOwnership(input: {
363
396
  attached?: boolean;
364
397
  blocked?: boolean;
365
398
  reason?: "identity_mismatch";
399
+ reloadRequired?: boolean;
366
400
  }> {
367
401
  const fsImpl = input.fs ?? nodeFs;
368
402
  const now = input.now ?? Date.now;
@@ -372,6 +406,28 @@ export async function acquireDaemonOwnership(input: {
372
406
  await ensureDir(fsImpl, paths.dir);
373
407
  const ownerId = input.randomId?.() ?? `${pid}-${now().toString(36)}-${Math.random().toString(36).slice(2)}`;
374
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
+ };
375
431
  const existing = await readJson<DaemonState>(fsImpl, paths.state);
376
432
  if (
377
433
  liveOwnerUsesDifferentIdentity({
@@ -383,17 +439,8 @@ export async function acquireDaemonOwnership(input: {
383
439
  ) {
384
440
  return { acquired: false, blocked: true, reason: "identity_mismatch" };
385
441
  }
386
- if (
387
- isFreshLiveOwner({
388
- state: existing,
389
- now: now(),
390
- tokenFingerprint: input.tokenFingerprint,
391
- chatId: input.chatId,
392
- pidAlive,
393
- })
394
- ) {
395
- return { acquired: false, attached: true };
396
- }
442
+ const existingDecision = attachDecision(existing);
443
+ if (existingDecision) return existingDecision;
397
444
  if (await tryOpenWx(fsImpl, paths.lock)) {
398
445
  await writeJsonAtomic(fsImpl, paths.state, {
399
446
  pid,
@@ -404,6 +451,7 @@ export async function acquireDaemonOwnership(input: {
404
451
  heartbeatAt: now(),
405
452
  roots,
406
453
  version: DAEMON_VERSION,
454
+ generation: DAEMON_GENERATION,
407
455
  } satisfies DaemonState);
408
456
  return { acquired: true, ownerId };
409
457
  }
@@ -418,32 +466,14 @@ export async function acquireDaemonOwnership(input: {
418
466
  ) {
419
467
  return { acquired: false, blocked: true, reason: "identity_mismatch" };
420
468
  }
421
- if (
422
- isFreshLiveOwner({
423
- state: afterLock,
424
- now: now(),
425
- tokenFingerprint: input.tokenFingerprint,
426
- chatId: input.chatId,
427
- pidAlive,
428
- })
429
- ) {
430
- return { acquired: false, attached: true };
431
- }
469
+ const afterLockDecision = attachDecision(afterLock);
470
+ if (afterLockDecision) return afterLockDecision;
432
471
  if (!afterLock) return { acquired: false, attached: true };
433
472
  if (!(await tryOpenWx(fsImpl, paths.steal))) return { acquired: false, attached: true };
434
473
  try {
435
474
  const rechecked = await readJson<DaemonState>(fsImpl, paths.state);
436
- if (
437
- isFreshLiveOwner({
438
- state: rechecked,
439
- now: now(),
440
- tokenFingerprint: input.tokenFingerprint,
441
- chatId: input.chatId,
442
- pidAlive,
443
- })
444
- ) {
445
- return { acquired: false, attached: true };
446
- }
475
+ const recheckedDecision = attachDecision(rechecked);
476
+ if (recheckedDecision) return recheckedDecision;
447
477
  if (
448
478
  liveOwnerUsesDifferentIdentity({
449
479
  state: rechecked,
@@ -468,6 +498,7 @@ export async function acquireDaemonOwnership(input: {
468
498
  heartbeatAt: now(),
469
499
  roots,
470
500
  version: DAEMON_VERSION,
501
+ generation: DAEMON_GENERATION,
471
502
  } satisfies DaemonState);
472
503
  return { acquired: true, ownerId };
473
504
  } finally {
@@ -571,6 +602,12 @@ export interface TelegramSpawnOwnerResult {
571
602
  ownerId?: string;
572
603
  runtime: DaemonRuntimeInfo;
573
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;
574
611
  }
575
612
 
576
613
  /**
@@ -639,7 +676,7 @@ export async function spawnTelegramDaemonOwner(
639
676
  warnings: ["live telegram daemon uses a different bot token or chat; refusing to attach"],
640
677
  };
641
678
  }
642
- return { result: "attached", runtime, warnings: [] };
679
+ return { result: "attached", runtime, warnings: [], reloadRequired: ownership.reloadRequired };
643
680
  }
644
681
  const spawnImpl = deps.spawn ?? defaultDaemonSpawn;
645
682
  const child = spawnImpl(command, args, {
@@ -667,12 +704,45 @@ export async function ensureTelegramDaemonRunning(
667
704
  logger.warn(`notifications: failed to ensure Telegram daemon: ${spawned.warnings.join("; ")}`);
668
705
  return spawned.result;
669
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
+ }
670
718
  await registerNotificationRoot({ ...input, fs: deps.fs });
671
719
  return spawned.result;
672
720
  }
673
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
+
674
744
  export interface BotApi {
675
- call(method: string, body: unknown, opts?: { signal?: AbortSignal }): Promise<unknown>;
745
+ call(method: string, body: unknown, opts?: { signal?: AbortSignal; noRetry?: boolean }): Promise<unknown>;
676
746
  }
677
747
 
678
748
  export interface TelegramTransportOptions {
@@ -690,7 +760,7 @@ export class TelegramBotTransport implements BotApi {
690
760
  this.#opts = opts;
691
761
  }
692
762
 
693
- 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> {
694
764
  const apiBase = this.#opts.apiBase ?? "https://api.telegram.org";
695
765
  const url = `${apiBase}/bot${this.#opts.botToken}/${method}`;
696
766
  const fetchImpl = this.#opts.fetchImpl ?? fetch;
@@ -714,7 +784,13 @@ export class TelegramBotTransport implements BotApi {
714
784
  if (b.caption) form.set("caption", b.caption);
715
785
  if (b.parse_mode) form.set("parse_mode", String(b.parse_mode));
716
786
  form.set("photo", new Blob([Buffer.from(b.photo, "base64")], { type: b.mime ?? "image/png" }), "image");
717
- 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
+ );
718
794
  return res.json();
719
795
  }
720
796
  const docBody = body as { document?: unknown } | null;
@@ -738,7 +814,13 @@ export class TelegramBotTransport implements BotApi {
738
814
  new Blob([Buffer.from(b.document, "base64")], { type: b.mime ?? "application/octet-stream" }),
739
815
  b.fileName ?? "file",
740
816
  );
741
- 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
+ );
742
824
  return res.json();
743
825
  }
744
826
  const res = await fetchWithRetry(
@@ -751,16 +833,21 @@ export class TelegramBotTransport implements BotApi {
751
833
  signal: opts?.signal,
752
834
  },
753
835
  sleep,
836
+ opts?.noRetry ? 1 : undefined,
754
837
  );
755
838
  return res.json();
756
839
  }
757
840
  }
758
841
 
842
+ type PairedChatPrivacy = "private" | "non-private" | "indeterminate";
843
+
844
+ export type TelegramUpdateOutcome = "consumed" | "retry";
845
+
759
846
  export interface TelegramUpdatePollerOptions {
760
847
  botApi: BotApi;
761
848
  runtime: NotificationOperatorRuntime;
762
849
  backoff: OperatorBackoffPolicy;
763
- processUpdate: (update: unknown) => Promise<void>;
850
+ processUpdate: (update: unknown) => Promise<TelegramUpdateOutcome>;
764
851
  }
765
852
 
766
853
  /** Owns getUpdates offset, conflict backoff, and per-update error isolation. */
@@ -805,11 +892,16 @@ export class TelegramUpdatePoller {
805
892
  }
806
893
  this.#opts.backoff.reset();
807
894
  for (const update of body.result ?? []) {
808
- this.#offset = update.update_id + 1;
809
895
  try {
810
- 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;
811
902
  } catch (err) {
812
903
  logger.error("notifications daemon: handleTelegramUpdate failed", { error: String(err) });
904
+ this.#offset = update.update_id + 1;
813
905
  }
814
906
  }
815
907
  return body.result?.length ?? 0;
@@ -867,6 +959,12 @@ export interface TelegramDaemonOptions {
867
959
  rich?: { enabled: boolean };
868
960
  /** Opt-in rich-draft streaming of live turn previews (off by default; see rich-draft.ts). */
869
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 };
870
968
  }
871
969
 
872
970
  interface SessionSocket {
@@ -890,6 +988,29 @@ interface PendingThreadedFrame {
890
988
  msg: Record<string, unknown>;
891
989
  }
892
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
+
893
1014
  export class TelegramNotificationDaemon {
894
1015
  readonly aliasTable: AliasTable;
895
1016
  readonly messageRoutes = new Map<string | number, CallbackRoute | Omit<CallbackRoute, "answer">>();
@@ -904,7 +1025,12 @@ export class TelegramNotificationDaemon {
904
1025
  private readonly fsImpl: TelegramDaemonFs;
905
1026
  private readonly botApi: BotApi;
906
1027
  private readonly topics = new TopicRegistry();
907
- 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>;
908
1034
  private readonly poller: TelegramUpdatePoller;
909
1035
  private readonly dispatchState = new TelegramEventDispatchState();
910
1036
  /** Original markdown of rich messages we sent (chat+message_id), for restoring reply context on inbound replies. */
@@ -952,6 +1078,33 @@ export class TelegramNotificationDaemon {
952
1078
  >();
953
1079
  /** Monotonic counter for unique lifecycle request ids. */
954
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
+ }
955
1108
 
956
1109
  /**
957
1110
  * Cooperatively stop the daemon: set the stop flag and abort the in-flight
@@ -959,6 +1112,11 @@ export class TelegramNotificationDaemon {
959
1112
  * ~25s getUpdates timeout. Safe to call from a signal handler.
960
1113
  */
961
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
+ }
962
1120
  this.runtime.requestStop();
963
1121
  this.running = false;
964
1122
  }
@@ -1294,7 +1452,7 @@ export class TelegramNotificationDaemon {
1294
1452
  botApi: this.botApi,
1295
1453
  runtime: this.runtime,
1296
1454
  backoff: this.pollConflictBackoff,
1297
- processUpdate: update => this.handleTelegramUpdate(update),
1455
+ processUpdate: update => this.processTelegramUpdate(update),
1298
1456
  });
1299
1457
  }
1300
1458
 
@@ -1311,6 +1469,134 @@ export class TelegramNotificationDaemon {
1311
1469
  }
1312
1470
  },
1313
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
+ })
1314
1600
  .add({
1315
1601
  name: "pong",
1316
1602
  matches: msg => msg.type === "pong",
@@ -1484,7 +1770,7 @@ export class TelegramNotificationDaemon {
1484
1770
  JSON.stringify({
1485
1771
  type: "hello",
1486
1772
  protocolVersion: NOTIFICATION_PROTOCOL_VERSION,
1487
- capabilities: [CLIENT_PING_PONG_CAPABILITY],
1773
+ capabilities: [CLIENT_PING_PONG_CAPABILITY, ASK_CONTROLS_CAPABILITY, ASK_SELECTED_ACK_CAPABILITY],
1488
1774
  }),
1489
1775
  );
1490
1776
  } catch {}
@@ -1559,6 +1845,12 @@ export class TelegramNotificationDaemon {
1559
1845
  if (isCurrentSession) {
1560
1846
  this.sessions.delete(session.sessionId);
1561
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
+ }
1562
1854
  if (session.ws.readyState !== WebSocket.CLOSED) {
1563
1855
  try {
1564
1856
  session.ws.close();
@@ -1588,6 +1880,12 @@ export class TelegramNotificationDaemon {
1588
1880
  const repo = typeof msg?.repo === "string" && msg.repo ? msg.repo : undefined;
1589
1881
  const branch = typeof msg?.branch === "string" && msg.branch ? msg.branch : undefined;
1590
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;
1591
1889
  // Name the topic "{repo}/{branch}" before a session title exists, then
1592
1890
  // "{repo}/{branch} - {title}" once it does. Fall back to the session id
1593
1891
  // only when no repo identity is available.
@@ -1597,6 +1895,32 @@ export class TelegramNotificationDaemon {
1597
1895
  return `SKC ${sessionId.slice(-6)}`;
1598
1896
  }
1599
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
+
1600
1924
  private topicIdentityKey(msg: { repo?: unknown; branch?: unknown }): string | undefined {
1601
1925
  const repo = typeof msg?.repo === "string" && msg.repo.trim() ? msg.repo.trim() : undefined;
1602
1926
  if (!repo) return undefined;
@@ -1615,11 +1939,13 @@ export class TelegramNotificationDaemon {
1615
1939
  const identityKey = this.topicIdentityKey(msg);
1616
1940
  const remembered = identityKey ? this.topicOwnerByIdentity.get(identityKey) : undefined;
1617
1941
  if (remembered && this.topics.get(remembered)) return remembered;
1942
+ if (!identityKey) return undefined;
1618
1943
  const base = this.topicIdentityBase(msg);
1619
- if (!identityKey || !base) return undefined;
1620
1944
  for (const sessionId of this.topics.sessionIds()) {
1621
- const name = this.topics.get(sessionId)?.name;
1622
- 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) {
1623
1949
  this.topicOwnerByIdentity.set(identityKey, sessionId);
1624
1950
  return sessionId;
1625
1951
  }
@@ -1649,6 +1975,37 @@ export class TelegramNotificationDaemon {
1649
1975
  return this.topics.get(sessionId)?.topicId;
1650
1976
  }
1651
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
+
1652
2009
  private rememberPendingThreadedFrame(sessionId: string, send: ThreadedSend, msg: Record<string, unknown>): void {
1653
2010
  const frames = this.pendingThreadedFrames.get(sessionId) ?? [];
1654
2011
  frames.push({ send, msg });
@@ -1716,7 +2073,11 @@ export class TelegramNotificationDaemon {
1716
2073
  try {
1717
2074
  // Drop queued sends for this session before deleting the topic; otherwise
1718
2075
  // rate-limited frames can flush later into a deleted topic or across resume.
1719
- 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
+ }
1720
2081
  await this.flushPool();
1721
2082
  const res = (await this.botApi.call("deleteForumTopic", {
1722
2083
  chat_id: this.opts.chatId,
@@ -1737,10 +2098,14 @@ export class TelegramNotificationDaemon {
1737
2098
  }
1738
2099
  }
1739
2100
 
1740
- private async persistTopics(): Promise<void> {
1741
- const paths = daemonPaths(this.opts.settings.getAgentDir());
1742
- await ensureDir(this.fsImpl, paths.dir);
1743
- 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;
1744
2109
  }
1745
2110
 
1746
2111
  async loadTopics(): Promise<void> {
@@ -1871,7 +2236,12 @@ export class TelegramNotificationDaemon {
1871
2236
 
1872
2237
  /** Drain the shared rate-limit pool and deliver each granted send to its topic. */
1873
2238
  private async flushPoolInner(): Promise<void> {
1874
- 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
+ }
1875
2245
  // Within a batch a finalized frame supersedes any still-queued live frame for
1876
2246
  // the same streamed message (finalized outranks live), so drop the stale live
1877
2247
  // edit — otherwise the authoritative final text could be overwritten by an
@@ -1894,6 +2264,51 @@ export class TelegramNotificationDaemon {
1894
2264
  );
1895
2265
  }
1896
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
+ }
1897
2312
  const { send, topicId } = item.payload;
1898
2313
  if (topicId && !(await this.pairedChatIsPrivate())) continue;
1899
2314
  // Threaded topic when available; otherwise deliver flat to the paired chat.
@@ -2128,25 +2543,43 @@ export class TelegramNotificationDaemon {
2128
2543
  }
2129
2544
 
2130
2545
  /**
2131
- * Resolve (and cache successful resolution of) whether the paired `chatId` is a
2132
- * private chat. Topic and flat delivery are only safe in a private DM; any
2133
- * non-private chat fails closed, while a transient `getChat` failure fails closed
2134
- * 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.
2135
2550
  */
2136
- private async pairedChatIsPrivate(): Promise<boolean> {
2137
- if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate;
2551
+ private async resolvePairedChatPrivacy(): Promise<PairedChatPrivacy> {
2552
+ if (this.pairedChatPrivate !== undefined) return this.pairedChatPrivate ? "private" : "non-private";
2138
2553
  try {
2139
2554
  const res = (await this.botApi.call("getChat", { chat_id: this.opts.chatId })) as {
2140
- result?: { type?: string };
2555
+ ok?: unknown;
2556
+ result?: { type?: unknown };
2141
2557
  };
2142
- this.pairedChatPrivate = res.result?.type === "private";
2143
- return this.pairedChatPrivate;
2144
- } catch (e) {
2145
- logger.warn(`notifications: getChat failed while checking Telegram chat privacy: ${String(e)}`);
2146
- 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";
2147
2575
  }
2148
2576
  }
2149
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
+
2150
2583
  /** Tell the user once (per daemon run) how to enable Threaded Mode. */
2151
2584
  private async notifyThreadedFallback(): Promise<void> {
2152
2585
  if (this.threadedFallbackNoticeSent || !(await this.pairedChatIsPrivate())) return;
@@ -2257,26 +2690,37 @@ export class TelegramNotificationDaemon {
2257
2690
  }
2258
2691
  if (send.identity) {
2259
2692
  const identityKey = this.topicIdentityKey(msg);
2260
- if (identityKey) this.topicOwnerByIdentity.set(identityKey, session.sessionId);
2261
- // Rename the topic if the title changed (e.g. the session title was
2262
- // auto-generated after the topic was first created). This runs on
2263
- // every identity frame, but does NOT re-send the bulleted message.
2264
- // Only commit the new registry name after Telegram accepts the edit:
2265
- // a transient editForumTopic failure must remain retryable on the
2266
- // next identity re-assert instead of leaving the remote topic stuck
2267
- // 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);
2268
2701
  const name = this.topicNameFor(session.sessionId, msg);
2269
2702
  if (this.topics.needsRename(session.sessionId, name)) {
2703
+ this.daemonRenameAttempts.set(
2704
+ session.sessionId,
2705
+ (this.daemonRenameAttempts.get(session.sessionId) ?? 0) + 1,
2706
+ );
2270
2707
  try {
2271
- await this.botApi.call("editForumTopic", {
2708
+ const response = await this.botApi.call("editForumTopic", {
2272
2709
  chat_id: this.opts.chatId,
2273
2710
  message_thread_id: Number(topicId),
2274
2711
  name,
2275
2712
  });
2276
- this.topics.markNameApplied(session.sessionId, name);
2713
+ if (topicRenameApplied(response)) this.topics.markNameApplied(session.sessionId, name);
2277
2714
  } catch {
2278
- // Best-effort rename; never block delivery. Leave the old
2279
- // 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
+ }
2280
2724
  }
2281
2725
  }
2282
2726
  // Send the full bulleted identity header EXACTLY ONCE per topic.
@@ -2300,19 +2744,54 @@ export class TelegramNotificationDaemon {
2300
2744
  await this.notifyThreadedFallback();
2301
2745
  }
2302
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
+ : [];
2303
2771
  const rendered = buildActionMessage({
2304
2772
  kind: msg.kind ?? "ask",
2305
2773
  id: msg.id,
2306
2774
  question: msg.question,
2307
2775
  options: msg.options,
2776
+ controls,
2308
2777
  summary: msg.summary,
2309
2778
  });
2310
2779
  const options = Array.isArray(msg.options) ? msg.options : [];
2311
- // Daemon keyboards use alias callback data with compact one-based tap targets;
2312
- // full option text is rendered in the message body by buildActionMessage/buildActionMarkdown.
2313
- const inline_keyboard = buildCompactChoiceGrid(options, (i: number) =>
2314
- this.aliasTable.put({ sessionId: session.sessionId, actionId: msg.id, answer: i }),
2315
- );
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
+ ];
2316
2795
  // HTML delivery: one sendMessage per chunk, keyboard on the last chunk;
2317
2796
  // returns the last chunk's message_id (the reply-routable message).
2318
2797
  const sendHtmlChunks = async (): Promise<number | undefined> => {
@@ -2395,7 +2874,78 @@ export class TelegramNotificationDaemon {
2395
2874
  });
2396
2875
  }
2397
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
+
2398
2947
  async handleTelegramUpdate(update: unknown): Promise<void> {
2948
+ if ((await this.handleForumTopicEdited(update)) !== "not-topic") return;
2399
2949
  // Session-lifecycle command (/session_*): handled ONLY from the paired chat,
2400
2950
  // gated before any arg parsing or side effect, and routed through the control
2401
2951
  // endpoint. Must run before threaded-injection so commands are not treated as
@@ -2580,15 +3130,6 @@ export class TelegramNotificationDaemon {
2580
3130
  }),
2581
3131
  );
2582
3132
  await this.rememberSeenUpdateId(inbound.updateId);
2583
- await this.botApi
2584
- .call("sendMessage", {
2585
- chat_id: this.opts.chatId,
2586
- message_thread_id: Number(inbound.threadId),
2587
- text: "Received as an answer to the pending ask.",
2588
- })
2589
- .catch(error => {
2590
- logger.warn(`telegram: failed to acknowledge pending ask reply: ${String(error)}`);
2591
- });
2592
3133
  if (inbound.messageId !== undefined) await this.setReaction(inbound.messageId, QUEUED_REACTION);
2593
3134
  return;
2594
3135
  }