botmux 3.10.0 → 3.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3338) hide show
  1. package/README.en.md +57 -4
  2. package/README.md +89 -4
  3. package/package.json +47 -31
  4. package/scripts/install-path-entry.mjs +263 -0
  5. package/scripts/postinstall-bin.mjs +388 -0
  6. package/dist/.runtime-build-id +0 -1
  7. package/dist/adapters/adopt-route.d.ts +0 -63
  8. package/dist/adapters/adopt-route.d.ts.map +0 -1
  9. package/dist/adapters/adopt-route.js +0 -196
  10. package/dist/adapters/adopt-route.js.map +0 -1
  11. package/dist/adapters/backend/capabilities.d.ts +0 -17
  12. package/dist/adapters/backend/capabilities.d.ts.map +0 -1
  13. package/dist/adapters/backend/capabilities.js +0 -22
  14. package/dist/adapters/backend/capabilities.js.map +0 -1
  15. package/dist/adapters/backend/critical-control-key.d.ts +0 -19
  16. package/dist/adapters/backend/critical-control-key.d.ts.map +0 -1
  17. package/dist/adapters/backend/critical-control-key.js +0 -34
  18. package/dist/adapters/backend/critical-control-key.js.map +0 -1
  19. package/dist/adapters/backend/herdr-backend.d.ts +0 -164
  20. package/dist/adapters/backend/herdr-backend.d.ts.map +0 -1
  21. package/dist/adapters/backend/herdr-backend.js +0 -1073
  22. package/dist/adapters/backend/herdr-backend.js.map +0 -1
  23. package/dist/adapters/backend/liveness-gate.d.ts +0 -38
  24. package/dist/adapters/backend/liveness-gate.d.ts.map +0 -1
  25. package/dist/adapters/backend/liveness-gate.js +0 -53
  26. package/dist/adapters/backend/liveness-gate.js.map +0 -1
  27. package/dist/adapters/backend/pty-backend.d.ts +0 -23
  28. package/dist/adapters/backend/pty-backend.d.ts.map +0 -1
  29. package/dist/adapters/backend/pty-backend.js +0 -70
  30. package/dist/adapters/backend/pty-backend.js.map +0 -1
  31. package/dist/adapters/backend/reproduce-command.d.ts +0 -39
  32. package/dist/adapters/backend/reproduce-command.d.ts.map +0 -1
  33. package/dist/adapters/backend/reproduce-command.js +0 -63
  34. package/dist/adapters/backend/reproduce-command.js.map +0 -1
  35. package/dist/adapters/backend/riff-backend.d.ts +0 -272
  36. package/dist/adapters/backend/riff-backend.d.ts.map +0 -1
  37. package/dist/adapters/backend/riff-backend.js +0 -1017
  38. package/dist/adapters/backend/riff-backend.js.map +0 -1
  39. package/dist/adapters/backend/sandbox.d.ts +0 -298
  40. package/dist/adapters/backend/sandbox.d.ts.map +0 -1
  41. package/dist/adapters/backend/sandbox.js +0 -1196
  42. package/dist/adapters/backend/sandbox.js.map +0 -1
  43. package/dist/adapters/backend/session-backend-selector.d.ts +0 -113
  44. package/dist/adapters/backend/session-backend-selector.d.ts.map +0 -1
  45. package/dist/adapters/backend/session-backend-selector.js +0 -344
  46. package/dist/adapters/backend/session-backend-selector.js.map +0 -1
  47. package/dist/adapters/backend/tmux-backend.d.ts +0 -292
  48. package/dist/adapters/backend/tmux-backend.d.ts.map +0 -1
  49. package/dist/adapters/backend/tmux-backend.js +0 -821
  50. package/dist/adapters/backend/tmux-backend.js.map +0 -1
  51. package/dist/adapters/backend/tmux-pipe-backend.d.ts +0 -237
  52. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +0 -1
  53. package/dist/adapters/backend/tmux-pipe-backend.js +0 -786
  54. package/dist/adapters/backend/tmux-pipe-backend.js.map +0 -1
  55. package/dist/adapters/backend/types.d.ts +0 -183
  56. package/dist/adapters/backend/types.d.ts.map +0 -1
  57. package/dist/adapters/backend/types.js +0 -19
  58. package/dist/adapters/backend/types.js.map +0 -1
  59. package/dist/adapters/backend/zellij-backend.d.ts +0 -173
  60. package/dist/adapters/backend/zellij-backend.d.ts.map +0 -1
  61. package/dist/adapters/backend/zellij-backend.js +0 -466
  62. package/dist/adapters/backend/zellij-backend.js.map +0 -1
  63. package/dist/adapters/backend/zellij-observe-backend.d.ts +0 -95
  64. package/dist/adapters/backend/zellij-observe-backend.d.ts.map +0 -1
  65. package/dist/adapters/backend/zellij-observe-backend.js +0 -301
  66. package/dist/adapters/backend/zellij-observe-backend.js.map +0 -1
  67. package/dist/adapters/backend/zellij-socket-probe.d.ts +0 -18
  68. package/dist/adapters/backend/zellij-socket-probe.d.ts.map +0 -1
  69. package/dist/adapters/backend/zellij-socket-probe.js +0 -146
  70. package/dist/adapters/backend/zellij-socket-probe.js.map +0 -1
  71. package/dist/adapters/backend/zmx-backend.d.ts +0 -284
  72. package/dist/adapters/backend/zmx-backend.d.ts.map +0 -1
  73. package/dist/adapters/backend/zmx-backend.js +0 -2387
  74. package/dist/adapters/backend/zmx-backend.js.map +0 -1
  75. package/dist/adapters/cli/aiden.d.ts +0 -4
  76. package/dist/adapters/cli/aiden.d.ts.map +0 -1
  77. package/dist/adapters/cli/aiden.js +0 -46
  78. package/dist/adapters/cli/aiden.js.map +0 -1
  79. package/dist/adapters/cli/antigravity.d.ts +0 -4
  80. package/dist/adapters/cli/antigravity.d.ts.map +0 -1
  81. package/dist/adapters/cli/antigravity.js +0 -274
  82. package/dist/adapters/cli/antigravity.js.map +0 -1
  83. package/dist/adapters/cli/claude-code.d.ts +0 -121
  84. package/dist/adapters/cli/claude-code.d.ts.map +0 -1
  85. package/dist/adapters/cli/claude-code.js +0 -1128
  86. package/dist/adapters/cli/claude-code.js.map +0 -1
  87. package/dist/adapters/cli/coco.d.ts +0 -4
  88. package/dist/adapters/cli/coco.d.ts.map +0 -1
  89. package/dist/adapters/cli/coco.js +0 -315
  90. package/dist/adapters/cli/coco.js.map +0 -1
  91. package/dist/adapters/cli/codex-app-turn.d.ts +0 -59
  92. package/dist/adapters/cli/codex-app-turn.d.ts.map +0 -1
  93. package/dist/adapters/cli/codex-app-turn.js +0 -136
  94. package/dist/adapters/cli/codex-app-turn.js.map +0 -1
  95. package/dist/adapters/cli/codex-app.d.ts +0 -4
  96. package/dist/adapters/cli/codex-app.d.ts.map +0 -1
  97. package/dist/adapters/cli/codex-app.js +0 -88
  98. package/dist/adapters/cli/codex-app.js.map +0 -1
  99. package/dist/adapters/cli/codex.d.ts +0 -4
  100. package/dist/adapters/cli/codex.d.ts.map +0 -1
  101. package/dist/adapters/cli/codex.js +0 -439
  102. package/dist/adapters/cli/codex.js.map +0 -1
  103. package/dist/adapters/cli/copilot.d.ts +0 -10
  104. package/dist/adapters/cli/copilot.d.ts.map +0 -1
  105. package/dist/adapters/cli/copilot.js +0 -73
  106. package/dist/adapters/cli/copilot.js.map +0 -1
  107. package/dist/adapters/cli/cursor.d.ts +0 -4
  108. package/dist/adapters/cli/cursor.d.ts.map +0 -1
  109. package/dist/adapters/cli/cursor.js +0 -104
  110. package/dist/adapters/cli/cursor.js.map +0 -1
  111. package/dist/adapters/cli/fs-policy.d.ts +0 -385
  112. package/dist/adapters/cli/fs-policy.d.ts.map +0 -1
  113. package/dist/adapters/cli/fs-policy.js +0 -889
  114. package/dist/adapters/cli/fs-policy.js.map +0 -1
  115. package/dist/adapters/cli/gemini.d.ts +0 -4
  116. package/dist/adapters/cli/gemini.d.ts.map +0 -1
  117. package/dist/adapters/cli/gemini.js +0 -53
  118. package/dist/adapters/cli/gemini.js.map +0 -1
  119. package/dist/adapters/cli/genius.d.ts +0 -4
  120. package/dist/adapters/cli/genius.d.ts.map +0 -1
  121. package/dist/adapters/cli/genius.js +0 -230
  122. package/dist/adapters/cli/genius.js.map +0 -1
  123. package/dist/adapters/cli/grok.d.ts +0 -76
  124. package/dist/adapters/cli/grok.d.ts.map +0 -1
  125. package/dist/adapters/cli/grok.js +0 -310
  126. package/dist/adapters/cli/grok.js.map +0 -1
  127. package/dist/adapters/cli/hermes.d.ts +0 -4
  128. package/dist/adapters/cli/hermes.d.ts.map +0 -1
  129. package/dist/adapters/cli/hermes.js +0 -83
  130. package/dist/adapters/cli/hermes.js.map +0 -1
  131. package/dist/adapters/cli/kimi.d.ts +0 -4
  132. package/dist/adapters/cli/kimi.d.ts.map +0 -1
  133. package/dist/adapters/cli/kimi.js +0 -54
  134. package/dist/adapters/cli/kimi.js.map +0 -1
  135. package/dist/adapters/cli/kiro-cli.d.ts +0 -4
  136. package/dist/adapters/cli/kiro-cli.d.ts.map +0 -1
  137. package/dist/adapters/cli/kiro-cli.js +0 -73
  138. package/dist/adapters/cli/kiro-cli.js.map +0 -1
  139. package/dist/adapters/cli/mir.d.ts +0 -4
  140. package/dist/adapters/cli/mir.d.ts.map +0 -1
  141. package/dist/adapters/cli/mir.js +0 -81
  142. package/dist/adapters/cli/mir.js.map +0 -1
  143. package/dist/adapters/cli/mira.d.ts +0 -4
  144. package/dist/adapters/cli/mira.d.ts.map +0 -1
  145. package/dist/adapters/cli/mira.js +0 -54
  146. package/dist/adapters/cli/mira.js.map +0 -1
  147. package/dist/adapters/cli/mtr.d.ts +0 -5
  148. package/dist/adapters/cli/mtr.d.ts.map +0 -1
  149. package/dist/adapters/cli/mtr.js +0 -69
  150. package/dist/adapters/cli/mtr.js.map +0 -1
  151. package/dist/adapters/cli/oh-my-pi.d.ts +0 -5
  152. package/dist/adapters/cli/oh-my-pi.d.ts.map +0 -1
  153. package/dist/adapters/cli/oh-my-pi.js +0 -186
  154. package/dist/adapters/cli/oh-my-pi.js.map +0 -1
  155. package/dist/adapters/cli/opencode.d.ts +0 -4
  156. package/dist/adapters/cli/opencode.d.ts.map +0 -1
  157. package/dist/adapters/cli/opencode.js +0 -305
  158. package/dist/adapters/cli/opencode.js.map +0 -1
  159. package/dist/adapters/cli/pi-initial-prompt-extension.d.ts +0 -27
  160. package/dist/adapters/cli/pi-initial-prompt-extension.d.ts.map +0 -1
  161. package/dist/adapters/cli/pi-initial-prompt-extension.js +0 -38
  162. package/dist/adapters/cli/pi-initial-prompt-extension.js.map +0 -1
  163. package/dist/adapters/cli/pi-initial-prompt.d.ts +0 -21
  164. package/dist/adapters/cli/pi-initial-prompt.d.ts.map +0 -1
  165. package/dist/adapters/cli/pi-initial-prompt.js +0 -59
  166. package/dist/adapters/cli/pi-initial-prompt.js.map +0 -1
  167. package/dist/adapters/cli/pi.d.ts +0 -58
  168. package/dist/adapters/cli/pi.d.ts.map +0 -1
  169. package/dist/adapters/cli/pi.js +0 -121
  170. package/dist/adapters/cli/pi.js.map +0 -1
  171. package/dist/adapters/cli/read-isolation.d.ts +0 -198
  172. package/dist/adapters/cli/read-isolation.d.ts.map +0 -1
  173. package/dist/adapters/cli/read-isolation.js +0 -335
  174. package/dist/adapters/cli/read-isolation.js.map +0 -1
  175. package/dist/adapters/cli/reasonix.d.ts +0 -35
  176. package/dist/adapters/cli/reasonix.d.ts.map +0 -1
  177. package/dist/adapters/cli/reasonix.js +0 -236
  178. package/dist/adapters/cli/reasonix.js.map +0 -1
  179. package/dist/adapters/cli/registry.d.ts +0 -51
  180. package/dist/adapters/cli/registry.d.ts.map +0 -1
  181. package/dist/adapters/cli/registry.js +0 -192
  182. package/dist/adapters/cli/registry.js.map +0 -1
  183. package/dist/adapters/cli/relay.d.ts +0 -26
  184. package/dist/adapters/cli/relay.d.ts.map +0 -1
  185. package/dist/adapters/cli/relay.js +0 -55
  186. package/dist/adapters/cli/relay.js.map +0 -1
  187. package/dist/adapters/cli/riff.d.ts +0 -14
  188. package/dist/adapters/cli/riff.d.ts.map +0 -1
  189. package/dist/adapters/cli/riff.js +0 -35
  190. package/dist/adapters/cli/riff.js.map +0 -1
  191. package/dist/adapters/cli/runner-control-channel.d.ts +0 -32
  192. package/dist/adapters/cli/runner-control-channel.d.ts.map +0 -1
  193. package/dist/adapters/cli/runner-control-channel.js +0 -104
  194. package/dist/adapters/cli/runner-control-channel.js.map +0 -1
  195. package/dist/adapters/cli/runner-input.d.ts +0 -67
  196. package/dist/adapters/cli/runner-input.d.ts.map +0 -1
  197. package/dist/adapters/cli/runner-input.js +0 -131
  198. package/dist/adapters/cli/runner-input.js.map +0 -1
  199. package/dist/adapters/cli/runtime.d.ts +0 -81
  200. package/dist/adapters/cli/runtime.d.ts.map +0 -1
  201. package/dist/adapters/cli/runtime.js +0 -243
  202. package/dist/adapters/cli/runtime.js.map +0 -1
  203. package/dist/adapters/cli/seed.d.ts +0 -29
  204. package/dist/adapters/cli/seed.d.ts.map +0 -1
  205. package/dist/adapters/cli/seed.js +0 -68
  206. package/dist/adapters/cli/seed.js.map +0 -1
  207. package/dist/adapters/cli/shared-hints.d.ts +0 -45
  208. package/dist/adapters/cli/shared-hints.d.ts.map +0 -1
  209. package/dist/adapters/cli/shared-hints.js +0 -144
  210. package/dist/adapters/cli/shared-hints.js.map +0 -1
  211. package/dist/adapters/cli/strict-input-handle.d.ts +0 -13
  212. package/dist/adapters/cli/strict-input-handle.d.ts.map +0 -1
  213. package/dist/adapters/cli/strict-input-handle.js +0 -39
  214. package/dist/adapters/cli/strict-input-handle.js.map +0 -1
  215. package/dist/adapters/cli/traex.d.ts +0 -28
  216. package/dist/adapters/cli/traex.d.ts.map +0 -1
  217. package/dist/adapters/cli/traex.js +0 -343
  218. package/dist/adapters/cli/traex.js.map +0 -1
  219. package/dist/adapters/cli/types.d.ts +0 -460
  220. package/dist/adapters/cli/types.d.ts.map +0 -1
  221. package/dist/adapters/cli/types.js +0 -2
  222. package/dist/adapters/cli/types.js.map +0 -1
  223. package/dist/adapters/coco-ask-plugin.d.ts +0 -25
  224. package/dist/adapters/coco-ask-plugin.d.ts.map +0 -1
  225. package/dist/adapters/coco-ask-plugin.js +0 -73
  226. package/dist/adapters/coco-ask-plugin.js.map +0 -1
  227. package/dist/adapters/hook-command.d.ts +0 -27
  228. package/dist/adapters/hook-command.d.ts.map +0 -1
  229. package/dist/adapters/hook-command.js +0 -50
  230. package/dist/adapters/hook-command.js.map +0 -1
  231. package/dist/adapters/hook-installer.d.ts +0 -37
  232. package/dist/adapters/hook-installer.d.ts.map +0 -1
  233. package/dist/adapters/hook-installer.js +0 -494
  234. package/dist/adapters/hook-installer.js.map +0 -1
  235. package/dist/autostart.d.ts +0 -14
  236. package/dist/autostart.d.ts.map +0 -1
  237. package/dist/autostart.js +0 -516
  238. package/dist/autostart.js.map +0 -1
  239. package/dist/bot-registry.d.ts +0 -942
  240. package/dist/bot-registry.d.ts.map +0 -1
  241. package/dist/bot-registry.js +0 -1909
  242. package/dist/bot-registry.js.map +0 -1
  243. package/dist/cli/arg-utils.d.ts +0 -11
  244. package/dist/cli/arg-utils.d.ts.map +0 -1
  245. package/dist/cli/arg-utils.js +0 -25
  246. package/dist/cli/arg-utils.js.map +0 -1
  247. package/dist/cli/bots-list-output.d.ts +0 -29
  248. package/dist/cli/bots-list-output.d.ts.map +0 -1
  249. package/dist/cli/bots-list-output.js +0 -32
  250. package/dist/cli/bots-list-output.js.map +0 -1
  251. package/dist/cli/capabilities.d.ts +0 -24
  252. package/dist/cli/capabilities.d.ts.map +0 -1
  253. package/dist/cli/capabilities.js +0 -25
  254. package/dist/cli/capabilities.js.map +0 -1
  255. package/dist/cli/create-group-resolver.d.ts +0 -75
  256. package/dist/cli/create-group-resolver.d.ts.map +0 -1
  257. package/dist/cli/create-group-resolver.js +0 -123
  258. package/dist/cli/create-group-resolver.js.map +0 -1
  259. package/dist/cli/daemon-lifecycle-env.d.ts +0 -9
  260. package/dist/cli/daemon-lifecycle-env.d.ts.map +0 -1
  261. package/dist/cli/daemon-lifecycle-env.js +0 -43
  262. package/dist/cli/daemon-lifecycle-env.js.map +0 -1
  263. package/dist/cli/dashboard-endpoint.d.ts +0 -76
  264. package/dist/cli/dashboard-endpoint.d.ts.map +0 -1
  265. package/dist/cli/dashboard-endpoint.js +0 -161
  266. package/dist/cli/dashboard-endpoint.js.map +0 -1
  267. package/dist/cli/deferred-topic-send.d.ts +0 -48
  268. package/dist/cli/deferred-topic-send.d.ts.map +0 -1
  269. package/dist/cli/deferred-topic-send.js +0 -86
  270. package/dist/cli/deferred-topic-send.js.map +0 -1
  271. package/dist/cli/exact-chat-grant-client.d.ts +0 -48
  272. package/dist/cli/exact-chat-grant-client.d.ts.map +0 -1
  273. package/dist/cli/exact-chat-grant-client.js +0 -108
  274. package/dist/cli/exact-chat-grant-client.js.map +0 -1
  275. package/dist/cli/exact-chat-grant.d.ts +0 -18
  276. package/dist/cli/exact-chat-grant.d.ts.map +0 -1
  277. package/dist/cli/exact-chat-grant.js +0 -97
  278. package/dist/cli/exact-chat-grant.js.map +0 -1
  279. package/dist/cli/pm2-command.d.ts +0 -7
  280. package/dist/cli/pm2-command.d.ts.map +0 -1
  281. package/dist/cli/pm2-command.js +0 -25
  282. package/dist/cli/pm2-command.js.map +0 -1
  283. package/dist/cli/quoted-render.d.ts +0 -41
  284. package/dist/cli/quoted-render.d.ts.map +0 -1
  285. package/dist/cli/quoted-render.js +0 -44
  286. package/dist/cli/quoted-render.js.map +0 -1
  287. package/dist/cli/saved-workflow.d.ts +0 -25
  288. package/dist/cli/saved-workflow.d.ts.map +0 -1
  289. package/dist/cli/saved-workflow.js +0 -338
  290. package/dist/cli/saved-workflow.js.map +0 -1
  291. package/dist/cli/send-dispatch.d.ts +0 -125
  292. package/dist/cli/send-dispatch.d.ts.map +0 -1
  293. package/dist/cli/send-dispatch.js +0 -320
  294. package/dist/cli/send-dispatch.js.map +0 -1
  295. package/dist/cli/session-list-liveness.d.ts +0 -41
  296. package/dist/cli/session-list-liveness.d.ts.map +0 -1
  297. package/dist/cli/session-list-liveness.js +0 -48
  298. package/dist/cli/session-list-liveness.js.map +0 -1
  299. package/dist/cli/stdin-encoding.d.ts +0 -24
  300. package/dist/cli/stdin-encoding.d.ts.map +0 -1
  301. package/dist/cli/stdin-encoding.js +0 -56
  302. package/dist/cli/stdin-encoding.js.map +0 -1
  303. package/dist/cli/v3-run-cancel.d.ts +0 -47
  304. package/dist/cli/v3-run-cancel.d.ts.map +0 -1
  305. package/dist/cli/v3-run-cancel.js +0 -96
  306. package/dist/cli/v3-run-cancel.js.map +0 -1
  307. package/dist/cli/vc-agent.d.ts +0 -2
  308. package/dist/cli/vc-agent.d.ts.map +0 -1
  309. package/dist/cli/vc-agent.js +0 -384
  310. package/dist/cli/vc-agent.js.map +0 -1
  311. package/dist/cli/workflow-migration.d.ts +0 -39
  312. package/dist/cli/workflow-migration.d.ts.map +0 -1
  313. package/dist/cli/workflow-migration.js +0 -302
  314. package/dist/cli/workflow-migration.js.map +0 -1
  315. package/dist/cli/workflow-run-archive.d.ts +0 -29
  316. package/dist/cli/workflow-run-archive.d.ts.map +0 -1
  317. package/dist/cli/workflow-run-archive.js +0 -183
  318. package/dist/cli/workflow-run-archive.js.map +0 -1
  319. package/dist/cli/workflow.d.ts +0 -8
  320. package/dist/cli/workflow.d.ts.map +0 -1
  321. package/dist/cli/workflow.js +0 -109
  322. package/dist/cli/workflow.js.map +0 -1
  323. package/dist/cli/zmx-managed-attach.d.ts +0 -41
  324. package/dist/cli/zmx-managed-attach.d.ts.map +0 -1
  325. package/dist/cli/zmx-managed-attach.js +0 -72
  326. package/dist/cli/zmx-managed-attach.js.map +0 -1
  327. package/dist/cli.d.ts +0 -35
  328. package/dist/cli.d.ts.map +0 -1
  329. package/dist/cli.js +0 -10769
  330. package/dist/cli.js.map +0 -1
  331. package/dist/codex-app-runner.d.ts +0 -3
  332. package/dist/codex-app-runner.d.ts.map +0 -1
  333. package/dist/codex-app-runner.js +0 -565
  334. package/dist/codex-app-runner.js.map +0 -1
  335. package/dist/codex-rpc-engine.d.ts +0 -136
  336. package/dist/codex-rpc-engine.d.ts.map +0 -1
  337. package/dist/codex-rpc-engine.js +0 -640
  338. package/dist/codex-rpc-engine.js.map +0 -1
  339. package/dist/codex-rpc-lifecycle.d.ts +0 -157
  340. package/dist/codex-rpc-lifecycle.d.ts.map +0 -1
  341. package/dist/codex-rpc-lifecycle.js +0 -238
  342. package/dist/codex-rpc-lifecycle.js.map +0 -1
  343. package/dist/config.d.ts +0 -146
  344. package/dist/config.d.ts.map +0 -1
  345. package/dist/config.js +0 -293
  346. package/dist/config.js.map +0 -1
  347. package/dist/core/ask-api.d.ts +0 -29
  348. package/dist/core/ask-api.d.ts.map +0 -1
  349. package/dist/core/ask-api.js +0 -116
  350. package/dist/core/ask-api.js.map +0 -1
  351. package/dist/core/ask-args.d.ts +0 -53
  352. package/dist/core/ask-args.d.ts.map +0 -1
  353. package/dist/core/ask-args.js +0 -122
  354. package/dist/core/ask-args.js.map +0 -1
  355. package/dist/core/ask-broker.d.ts +0 -166
  356. package/dist/core/ask-broker.d.ts.map +0 -1
  357. package/dist/core/ask-broker.js +0 -451
  358. package/dist/core/ask-broker.js.map +0 -1
  359. package/dist/core/ask-hook/claude-code.d.ts +0 -50
  360. package/dist/core/ask-hook/claude-code.d.ts.map +0 -1
  361. package/dist/core/ask-hook/claude-code.js +0 -151
  362. package/dist/core/ask-hook/claude-code.js.map +0 -1
  363. package/dist/core/ask-hook/coco.d.ts +0 -22
  364. package/dist/core/ask-hook/coco.d.ts.map +0 -1
  365. package/dist/core/ask-hook/coco.js +0 -35
  366. package/dist/core/ask-hook/coco.js.map +0 -1
  367. package/dist/core/ask-hook/codex.d.ts +0 -43
  368. package/dist/core/ask-hook/codex.d.ts.map +0 -1
  369. package/dist/core/ask-hook/codex.js +0 -70
  370. package/dist/core/ask-hook/codex.js.map +0 -1
  371. package/dist/core/ask-hook/opencode.d.ts +0 -39
  372. package/dist/core/ask-hook/opencode.d.ts.map +0 -1
  373. package/dist/core/ask-hook/opencode.js +0 -109
  374. package/dist/core/ask-hook/opencode.js.map +0 -1
  375. package/dist/core/ask-hook/registry.d.ts +0 -3
  376. package/dist/core/ask-hook/registry.d.ts.map +0 -1
  377. package/dist/core/ask-hook/registry.js +0 -25
  378. package/dist/core/ask-hook/registry.js.map +0 -1
  379. package/dist/core/ask-hook/types.d.ts +0 -28
  380. package/dist/core/ask-hook/types.d.ts.map +0 -1
  381. package/dist/core/ask-hook/types.js +0 -2
  382. package/dist/core/ask-hook/types.js.map +0 -1
  383. package/dist/core/ask-types.d.ts +0 -157
  384. package/dist/core/ask-types.d.ts.map +0 -1
  385. package/dist/core/ask-types.js +0 -28
  386. package/dist/core/ask-types.js.map +0 -1
  387. package/dist/core/attachment-path.d.ts +0 -3
  388. package/dist/core/attachment-path.d.ts.map +0 -1
  389. package/dist/core/attachment-path.js +0 -8
  390. package/dist/core/attachment-path.js.map +0 -1
  391. package/dist/core/auto-start.d.ts +0 -84
  392. package/dist/core/auto-start.d.ts.map +0 -1
  393. package/dist/core/auto-start.js +0 -92
  394. package/dist/core/auto-start.js.map +0 -1
  395. package/dist/core/bot-live-control.d.ts +0 -41
  396. package/dist/core/bot-live-control.d.ts.map +0 -1
  397. package/dist/core/bot-live-control.js +0 -135
  398. package/dist/core/bot-live-control.js.map +0 -1
  399. package/dist/core/bot-turn-mutation-gate.d.ts +0 -24
  400. package/dist/core/bot-turn-mutation-gate.d.ts.map +0 -1
  401. package/dist/core/bot-turn-mutation-gate.js +0 -369
  402. package/dist/core/bot-turn-mutation-gate.js.map +0 -1
  403. package/dist/core/botmux-wrapper.d.ts +0 -41
  404. package/dist/core/botmux-wrapper.d.ts.map +0 -1
  405. package/dist/core/botmux-wrapper.js +0 -63
  406. package/dist/core/botmux-wrapper.js.map +0 -1
  407. package/dist/core/chat-rename.d.ts +0 -27
  408. package/dist/core/chat-rename.d.ts.map +0 -1
  409. package/dist/core/chat-rename.js +0 -53
  410. package/dist/core/chat-rename.js.map +0 -1
  411. package/dist/core/cli-runtime-display.d.ts +0 -19
  412. package/dist/core/cli-runtime-display.d.ts.map +0 -1
  413. package/dist/core/cli-runtime-display.js +0 -28
  414. package/dist/core/cli-runtime-display.js.map +0 -1
  415. package/dist/core/cli-runtime-update.d.ts +0 -129
  416. package/dist/core/cli-runtime-update.d.ts.map +0 -1
  417. package/dist/core/cli-runtime-update.js +0 -737
  418. package/dist/core/cli-runtime-update.js.map +0 -1
  419. package/dist/core/closed-session-card.d.ts +0 -16
  420. package/dist/core/closed-session-card.d.ts.map +0 -1
  421. package/dist/core/closed-session-card.js +0 -80
  422. package/dist/core/closed-session-card.js.map +0 -1
  423. package/dist/core/coco-picker-keys.d.ts +0 -31
  424. package/dist/core/coco-picker-keys.d.ts.map +0 -1
  425. package/dist/core/coco-picker-keys.js +0 -60
  426. package/dist/core/coco-picker-keys.js.map +0 -1
  427. package/dist/core/command-discovery.d.ts +0 -33
  428. package/dist/core/command-discovery.d.ts.map +0 -1
  429. package/dist/core/command-discovery.js +0 -261
  430. package/dist/core/command-discovery.js.map +0 -1
  431. package/dist/core/command-handler.d.ts +0 -163
  432. package/dist/core/command-handler.d.ts.map +0 -1
  433. package/dist/core/command-handler.js +0 -4108
  434. package/dist/core/command-handler.js.map +0 -1
  435. package/dist/core/cost-calculator.d.ts +0 -69
  436. package/dist/core/cost-calculator.d.ts.map +0 -1
  437. package/dist/core/cost-calculator.js +0 -603
  438. package/dist/core/cost-calculator.js.map +0 -1
  439. package/dist/core/current-turn-provenance.d.ts +0 -39
  440. package/dist/core/current-turn-provenance.d.ts.map +0 -1
  441. package/dist/core/current-turn-provenance.js +0 -122
  442. package/dist/core/current-turn-provenance.js.map +0 -1
  443. package/dist/core/daemon-config-fence.d.ts +0 -8
  444. package/dist/core/daemon-config-fence.d.ts.map +0 -1
  445. package/dist/core/daemon-config-fence.js +0 -13
  446. package/dist/core/daemon-config-fence.js.map +0 -1
  447. package/dist/core/daemon-heartbeat.d.ts +0 -15
  448. package/dist/core/daemon-heartbeat.d.ts.map +0 -1
  449. package/dist/core/daemon-heartbeat.js +0 -83
  450. package/dist/core/daemon-heartbeat.js.map +0 -1
  451. package/dist/core/daemon-ipc-auth.d.ts +0 -20
  452. package/dist/core/daemon-ipc-auth.d.ts.map +0 -1
  453. package/dist/core/daemon-ipc-auth.js +0 -44
  454. package/dist/core/daemon-ipc-auth.js.map +0 -1
  455. package/dist/core/daemon-ipc-session-auth.d.ts +0 -37
  456. package/dist/core/daemon-ipc-session-auth.d.ts.map +0 -1
  457. package/dist/core/daemon-ipc-session-auth.js +0 -35
  458. package/dist/core/daemon-ipc-session-auth.js.map +0 -1
  459. package/dist/core/dashboard-command/groups.d.ts +0 -20
  460. package/dist/core/dashboard-command/groups.d.ts.map +0 -1
  461. package/dist/core/dashboard-command/groups.js +0 -52
  462. package/dist/core/dashboard-command/groups.js.map +0 -1
  463. package/dist/core/dashboard-command/index.d.ts +0 -28
  464. package/dist/core/dashboard-command/index.d.ts.map +0 -1
  465. package/dist/core/dashboard-command/index.js +0 -81
  466. package/dist/core/dashboard-command/index.js.map +0 -1
  467. package/dist/core/dashboard-command/overview.d.ts +0 -29
  468. package/dist/core/dashboard-command/overview.d.ts.map +0 -1
  469. package/dist/core/dashboard-command/overview.js +0 -61
  470. package/dist/core/dashboard-command/overview.js.map +0 -1
  471. package/dist/core/dashboard-command/owner-gate.d.ts +0 -41
  472. package/dist/core/dashboard-command/owner-gate.d.ts.map +0 -1
  473. package/dist/core/dashboard-command/owner-gate.js +0 -40
  474. package/dist/core/dashboard-command/owner-gate.js.map +0 -1
  475. package/dist/core/dashboard-command/schedules.d.ts +0 -20
  476. package/dist/core/dashboard-command/schedules.d.ts.map +0 -1
  477. package/dist/core/dashboard-command/schedules.js +0 -47
  478. package/dist/core/dashboard-command/schedules.js.map +0 -1
  479. package/dist/core/dashboard-command/sessions.d.ts +0 -22
  480. package/dist/core/dashboard-command/sessions.d.ts.map +0 -1
  481. package/dist/core/dashboard-command/sessions.js +0 -43
  482. package/dist/core/dashboard-command/sessions.js.map +0 -1
  483. package/dist/core/dashboard-command/settings.d.ts +0 -21
  484. package/dist/core/dashboard-command/settings.d.ts.map +0 -1
  485. package/dist/core/dashboard-command/settings.js +0 -55
  486. package/dist/core/dashboard-command/settings.js.map +0 -1
  487. package/dist/core/dashboard-command/stub.d.ts +0 -16
  488. package/dist/core/dashboard-command/stub.d.ts.map +0 -1
  489. package/dist/core/dashboard-command/stub.js +0 -27
  490. package/dist/core/dashboard-command/stub.js.map +0 -1
  491. package/dist/core/dashboard-events.d.ts +0 -67
  492. package/dist/core/dashboard-events.d.ts.map +0 -1
  493. package/dist/core/dashboard-events.js +0 -23
  494. package/dist/core/dashboard-events.js.map +0 -1
  495. package/dist/core/dashboard-images.d.ts +0 -29
  496. package/dist/core/dashboard-images.d.ts.map +0 -1
  497. package/dist/core/dashboard-images.js +0 -113
  498. package/dist/core/dashboard-images.js.map +0 -1
  499. package/dist/core/dashboard-ipc-server.d.ts +0 -114
  500. package/dist/core/dashboard-ipc-server.d.ts.map +0 -1
  501. package/dist/core/dashboard-ipc-server.js +0 -4398
  502. package/dist/core/dashboard-ipc-server.js.map +0 -1
  503. package/dist/core/dashboard-locate.d.ts +0 -20
  504. package/dist/core/dashboard-locate.d.ts.map +0 -1
  505. package/dist/core/dashboard-locate.js +0 -26
  506. package/dist/core/dashboard-locate.js.map +0 -1
  507. package/dist/core/dashboard-rows.d.ts +0 -117
  508. package/dist/core/dashboard-rows.d.ts.map +0 -1
  509. package/dist/core/dashboard-rows.js +0 -206
  510. package/dist/core/dashboard-rows.js.map +0 -1
  511. package/dist/core/dashboard-secret.d.ts +0 -3
  512. package/dist/core/dashboard-secret.d.ts.map +0 -1
  513. package/dist/core/dashboard-secret.js +0 -7
  514. package/dist/core/dashboard-secret.js.map +0 -1
  515. package/dist/core/dashboard-url.d.ts +0 -79
  516. package/dist/core/dashboard-url.d.ts.map +0 -1
  517. package/dist/core/dashboard-url.js +0 -107
  518. package/dist/core/dashboard-url.js.map +0 -1
  519. package/dist/core/data-dir.d.ts +0 -24
  520. package/dist/core/data-dir.d.ts.map +0 -1
  521. package/dist/core/data-dir.js +0 -48
  522. package/dist/core/data-dir.js.map +0 -1
  523. package/dist/core/deferred-schedule-settlement.d.ts +0 -20
  524. package/dist/core/deferred-schedule-settlement.d.ts.map +0 -1
  525. package/dist/core/deferred-schedule-settlement.js +0 -18
  526. package/dist/core/deferred-schedule-settlement.js.map +0 -1
  527. package/dist/core/deferred-topic-binding.d.ts +0 -19
  528. package/dist/core/deferred-topic-binding.d.ts.map +0 -1
  529. package/dist/core/deferred-topic-binding.js +0 -55
  530. package/dist/core/deferred-topic-binding.js.map +0 -1
  531. package/dist/core/device-isolation-activation.d.ts +0 -56
  532. package/dist/core/device-isolation-activation.d.ts.map +0 -1
  533. package/dist/core/device-isolation-activation.js +0 -110
  534. package/dist/core/device-isolation-activation.js.map +0 -1
  535. package/dist/core/device-isolation-daemon.d.ts +0 -106
  536. package/dist/core/device-isolation-daemon.d.ts.map +0 -1
  537. package/dist/core/device-isolation-daemon.js +0 -674
  538. package/dist/core/device-isolation-daemon.js.map +0 -1
  539. package/dist/core/dispatch-registry.d.ts +0 -12
  540. package/dist/core/dispatch-registry.d.ts.map +0 -1
  541. package/dist/core/dispatch-registry.js +0 -33
  542. package/dist/core/dispatch-registry.js.map +0 -1
  543. package/dist/core/dispatch.d.ts +0 -364
  544. package/dist/core/dispatch.d.ts.map +0 -1
  545. package/dist/core/dispatch.js +0 -527
  546. package/dist/core/dispatch.js.map +0 -1
  547. package/dist/core/doc-comment-poller.d.ts +0 -36
  548. package/dist/core/doc-comment-poller.d.ts.map +0 -1
  549. package/dist/core/doc-comment-poller.js +0 -60
  550. package/dist/core/doc-comment-poller.js.map +0 -1
  551. package/dist/core/doc-comment-prompt.d.ts +0 -90
  552. package/dist/core/doc-comment-prompt.d.ts.map +0 -1
  553. package/dist/core/doc-comment-prompt.js +0 -252
  554. package/dist/core/doc-comment-prompt.js.map +0 -1
  555. package/dist/core/doc-watch-command.d.ts +0 -22
  556. package/dist/core/doc-watch-command.d.ts.map +0 -1
  557. package/dist/core/doc-watch-command.js +0 -41
  558. package/dist/core/doc-watch-command.js.map +0 -1
  559. package/dist/core/github-auth.d.ts +0 -13
  560. package/dist/core/github-auth.d.ts.map +0 -1
  561. package/dist/core/github-auth.js +0 -82
  562. package/dist/core/github-auth.js.map +0 -1
  563. package/dist/core/host-overload-alert.d.ts +0 -232
  564. package/dist/core/host-overload-alert.d.ts.map +0 -1
  565. package/dist/core/host-overload-alert.js +0 -354
  566. package/dist/core/host-overload-alert.js.map +0 -1
  567. package/dist/core/idle-worker-sweeper.d.ts +0 -39
  568. package/dist/core/idle-worker-sweeper.d.ts.map +0 -1
  569. package/dist/core/idle-worker-sweeper.js +0 -63
  570. package/dist/core/idle-worker-sweeper.js.map +0 -1
  571. package/dist/core/inflight-input-tracker.d.ts +0 -54
  572. package/dist/core/inflight-input-tracker.d.ts.map +0 -1
  573. package/dist/core/inflight-input-tracker.js +0 -64
  574. package/dist/core/inflight-input-tracker.js.map +0 -1
  575. package/dist/core/inherit-peer.d.ts +0 -19
  576. package/dist/core/inherit-peer.d.ts.map +0 -1
  577. package/dist/core/inherit-peer.js +0 -55
  578. package/dist/core/inherit-peer.js.map +0 -1
  579. package/dist/core/initial-user-turn.d.ts +0 -14
  580. package/dist/core/initial-user-turn.d.ts.map +0 -1
  581. package/dist/core/initial-user-turn.js +0 -65
  582. package/dist/core/initial-user-turn.js.map +0 -1
  583. package/dist/core/inject-queue-policy.d.ts +0 -70
  584. package/dist/core/inject-queue-policy.d.ts.map +0 -1
  585. package/dist/core/inject-queue-policy.js +0 -30
  586. package/dist/core/inject-queue-policy.js.map +0 -1
  587. package/dist/core/input-turn-dedupe.d.ts +0 -20
  588. package/dist/core/input-turn-dedupe.d.ts.map +0 -1
  589. package/dist/core/input-turn-dedupe.js +0 -57
  590. package/dist/core/input-turn-dedupe.js.map +0 -1
  591. package/dist/core/local-terminal-opener.d.ts +0 -43
  592. package/dist/core/local-terminal-opener.d.ts.map +0 -1
  593. package/dist/core/local-terminal-opener.js +0 -230
  594. package/dist/core/local-terminal-opener.js.map +0 -1
  595. package/dist/core/maintenance-schedule.d.ts +0 -34
  596. package/dist/core/maintenance-schedule.d.ts.map +0 -1
  597. package/dist/core/maintenance-schedule.js +0 -72
  598. package/dist/core/maintenance-schedule.js.map +0 -1
  599. package/dist/core/maintenance.d.ts +0 -114
  600. package/dist/core/maintenance.d.ts.map +0 -1
  601. package/dist/core/maintenance.js +0 -340
  602. package/dist/core/maintenance.js.map +0 -1
  603. package/dist/core/managed-origin-capability.d.ts +0 -37
  604. package/dist/core/managed-origin-capability.d.ts.map +0 -1
  605. package/dist/core/managed-origin-capability.js +0 -100
  606. package/dist/core/managed-origin-capability.js.map +0 -1
  607. package/dist/core/passthrough-commands.d.ts +0 -56
  608. package/dist/core/passthrough-commands.d.ts.map +0 -1
  609. package/dist/core/passthrough-commands.js +0 -120
  610. package/dist/core/passthrough-commands.js.map +0 -1
  611. package/dist/core/pending-response.d.ts +0 -4
  612. package/dist/core/pending-response.d.ts.map +0 -1
  613. package/dist/core/pending-response.js +0 -11
  614. package/dist/core/pending-response.js.map +0 -1
  615. package/dist/core/per-bot-env.d.ts +0 -38
  616. package/dist/core/per-bot-env.d.ts.map +0 -1
  617. package/dist/core/per-bot-env.js +0 -94
  618. package/dist/core/per-bot-env.js.map +0 -1
  619. package/dist/core/persistent-backend.d.ts +0 -107
  620. package/dist/core/persistent-backend.d.ts.map +0 -1
  621. package/dist/core/persistent-backend.js +0 -235
  622. package/dist/core/persistent-backend.js.map +0 -1
  623. package/dist/core/plugins/cli-generation.d.ts +0 -30
  624. package/dist/core/plugins/cli-generation.d.ts.map +0 -1
  625. package/dist/core/plugins/cli-generation.js +0 -62
  626. package/dist/core/plugins/cli-generation.js.map +0 -1
  627. package/dist/core/plugins/convention-scanner.d.ts +0 -4
  628. package/dist/core/plugins/convention-scanner.d.ts.map +0 -1
  629. package/dist/core/plugins/convention-scanner.js +0 -202
  630. package/dist/core/plugins/convention-scanner.js.map +0 -1
  631. package/dist/core/plugins/dependencies.d.ts +0 -5
  632. package/dist/core/plugins/dependencies.d.ts.map +0 -1
  633. package/dist/core/plugins/dependencies.js +0 -50
  634. package/dist/core/plugins/dependencies.js.map +0 -1
  635. package/dist/core/plugins/effective.d.ts +0 -5
  636. package/dist/core/plugins/effective.d.ts.map +0 -1
  637. package/dist/core/plugins/effective.js +0 -16
  638. package/dist/core/plugins/effective.js.map +0 -1
  639. package/dist/core/plugins/ids.d.ts +0 -4
  640. package/dist/core/plugins/ids.d.ts.map +0 -1
  641. package/dist/core/plugins/ids.js +0 -30
  642. package/dist/core/plugins/ids.js.map +0 -1
  643. package/dist/core/plugins/init.d.ts +0 -23
  644. package/dist/core/plugins/init.d.ts.map +0 -1
  645. package/dist/core/plugins/init.js +0 -332
  646. package/dist/core/plugins/init.js.map +0 -1
  647. package/dist/core/plugins/install.d.ts +0 -14
  648. package/dist/core/plugins/install.d.ts.map +0 -1
  649. package/dist/core/plugins/install.js +0 -234
  650. package/dist/core/plugins/install.js.map +0 -1
  651. package/dist/core/plugins/manifest.d.ts +0 -4
  652. package/dist/core/plugins/manifest.d.ts.map +0 -1
  653. package/dist/core/plugins/manifest.js +0 -78
  654. package/dist/core/plugins/manifest.js.map +0 -1
  655. package/dist/core/plugins/materializer.d.ts +0 -16
  656. package/dist/core/plugins/materializer.d.ts.map +0 -1
  657. package/dist/core/plugins/materializer.js +0 -73
  658. package/dist/core/plugins/materializer.js.map +0 -1
  659. package/dist/core/plugins/mcp/environment.d.ts +0 -12
  660. package/dist/core/plugins/mcp/environment.d.ts.map +0 -1
  661. package/dist/core/plugins/mcp/environment.js +0 -17
  662. package/dist/core/plugins/mcp/environment.js.map +0 -1
  663. package/dist/core/plugins/mcp/gateway-installer.d.ts +0 -16
  664. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +0 -1
  665. package/dist/core/plugins/mcp/gateway-installer.js +0 -273
  666. package/dist/core/plugins/mcp/gateway-installer.js.map +0 -1
  667. package/dist/core/plugins/mcp/gateway.d.ts +0 -63
  668. package/dist/core/plugins/mcp/gateway.d.ts.map +0 -1
  669. package/dist/core/plugins/mcp/gateway.js +0 -620
  670. package/dist/core/plugins/mcp/gateway.js.map +0 -1
  671. package/dist/core/plugins/mcp/host.d.ts +0 -18
  672. package/dist/core/plugins/mcp/host.d.ts.map +0 -1
  673. package/dist/core/plugins/mcp/host.js +0 -126
  674. package/dist/core/plugins/mcp/host.js.map +0 -1
  675. package/dist/core/plugins/mcp/private-store.d.ts +0 -15
  676. package/dist/core/plugins/mcp/private-store.d.ts.map +0 -1
  677. package/dist/core/plugins/mcp/private-store.js +0 -162
  678. package/dist/core/plugins/mcp/private-store.js.map +0 -1
  679. package/dist/core/plugins/mcp/session-runtime.d.ts +0 -25
  680. package/dist/core/plugins/mcp/session-runtime.d.ts.map +0 -1
  681. package/dist/core/plugins/mcp/session-runtime.js +0 -76
  682. package/dist/core/plugins/mcp/session-runtime.js.map +0 -1
  683. package/dist/core/plugins/mcp/socket-auth.d.ts +0 -9
  684. package/dist/core/plugins/mcp/socket-auth.d.ts.map +0 -1
  685. package/dist/core/plugins/mcp/socket-auth.js +0 -94
  686. package/dist/core/plugins/mcp/socket-auth.js.map +0 -1
  687. package/dist/core/plugins/paths.d.ts +0 -17
  688. package/dist/core/plugins/paths.d.ts.map +0 -1
  689. package/dist/core/plugins/paths.js +0 -71
  690. package/dist/core/plugins/paths.js.map +0 -1
  691. package/dist/core/plugins/pm2.d.ts +0 -13
  692. package/dist/core/plugins/pm2.d.ts.map +0 -1
  693. package/dist/core/plugins/pm2.js +0 -73
  694. package/dist/core/plugins/pm2.js.map +0 -1
  695. package/dist/core/plugins/runtime.d.ts +0 -54
  696. package/dist/core/plugins/runtime.d.ts.map +0 -1
  697. package/dist/core/plugins/runtime.js +0 -158
  698. package/dist/core/plugins/runtime.js.map +0 -1
  699. package/dist/core/plugins/service-manager.d.ts +0 -46
  700. package/dist/core/plugins/service-manager.d.ts.map +0 -1
  701. package/dist/core/plugins/service-manager.js +0 -403
  702. package/dist/core/plugins/service-manager.js.map +0 -1
  703. package/dist/core/plugins/session-manifest.d.ts +0 -25
  704. package/dist/core/plugins/session-manifest.d.ts.map +0 -1
  705. package/dist/core/plugins/session-manifest.js +0 -58
  706. package/dist/core/plugins/session-manifest.js.map +0 -1
  707. package/dist/core/plugins/skills.d.ts +0 -7
  708. package/dist/core/plugins/skills.d.ts.map +0 -1
  709. package/dist/core/plugins/skills.js +0 -36
  710. package/dist/core/plugins/skills.js.map +0 -1
  711. package/dist/core/plugins/types.d.ts +0 -139
  712. package/dist/core/plugins/types.d.ts.map +0 -1
  713. package/dist/core/plugins/types.js +0 -2
  714. package/dist/core/plugins/types.js.map +0 -1
  715. package/dist/core/reply-target.d.ts +0 -62
  716. package/dist/core/reply-target.d.ts.map +0 -1
  717. package/dist/core/reply-target.js +0 -122
  718. package/dist/core/reply-target.js.map +0 -1
  719. package/dist/core/resource-monitor/attribution.d.ts +0 -70
  720. package/dist/core/resource-monitor/attribution.d.ts.map +0 -1
  721. package/dist/core/resource-monitor/attribution.js +0 -238
  722. package/dist/core/resource-monitor/attribution.js.map +0 -1
  723. package/dist/core/resource-monitor/darwin.d.ts +0 -145
  724. package/dist/core/resource-monitor/darwin.d.ts.map +0 -1
  725. package/dist/core/resource-monitor/darwin.js +0 -360
  726. package/dist/core/resource-monitor/darwin.js.map +0 -1
  727. package/dist/core/resource-monitor/procfs.d.ts +0 -22
  728. package/dist/core/resource-monitor/procfs.d.ts.map +0 -1
  729. package/dist/core/resource-monitor/procfs.js +0 -140
  730. package/dist/core/resource-monitor/procfs.js.map +0 -1
  731. package/dist/core/resource-monitor/ring-buffer.d.ts +0 -15
  732. package/dist/core/resource-monitor/ring-buffer.d.ts.map +0 -1
  733. package/dist/core/resource-monitor/ring-buffer.js +0 -61
  734. package/dist/core/resource-monitor/ring-buffer.js.map +0 -1
  735. package/dist/core/resource-monitor/runtime.d.ts +0 -31
  736. package/dist/core/resource-monitor/runtime.d.ts.map +0 -1
  737. package/dist/core/resource-monitor/runtime.js +0 -92
  738. package/dist/core/resource-monitor/runtime.js.map +0 -1
  739. package/dist/core/resource-monitor/top-selector.d.ts +0 -18
  740. package/dist/core/resource-monitor/top-selector.d.ts.map +0 -1
  741. package/dist/core/resource-monitor/top-selector.js +0 -57
  742. package/dist/core/resource-monitor/top-selector.js.map +0 -1
  743. package/dist/core/resource-monitor/types.d.ts +0 -181
  744. package/dist/core/resource-monitor/types.d.ts.map +0 -1
  745. package/dist/core/resource-monitor/types.js +0 -2
  746. package/dist/core/resource-monitor/types.js.map +0 -1
  747. package/dist/core/restart-coordinator.d.ts +0 -28
  748. package/dist/core/restart-coordinator.d.ts.map +0 -1
  749. package/dist/core/restart-coordinator.js +0 -82
  750. package/dist/core/restart-coordinator.js.map +0 -1
  751. package/dist/core/restart-followup-policy.d.ts +0 -112
  752. package/dist/core/restart-followup-policy.d.ts.map +0 -1
  753. package/dist/core/restart-followup-policy.js +0 -49
  754. package/dist/core/restart-followup-policy.js.map +0 -1
  755. package/dist/core/restart-report.d.ts +0 -63
  756. package/dist/core/restart-report.d.ts.map +0 -1
  757. package/dist/core/restart-report.js +0 -122
  758. package/dist/core/restart-report.js.map +0 -1
  759. package/dist/core/role-library.d.ts +0 -62
  760. package/dist/core/role-library.d.ts.map +0 -1
  761. package/dist/core/role-library.js +0 -183
  762. package/dist/core/role-library.js.map +0 -1
  763. package/dist/core/role-resolver.d.ts +0 -81
  764. package/dist/core/role-resolver.d.ts.map +0 -1
  765. package/dist/core/role-resolver.js +0 -306
  766. package/dist/core/role-resolver.js.map +0 -1
  767. package/dist/core/scheduler.d.ts +0 -173
  768. package/dist/core/scheduler.d.ts.map +0 -1
  769. package/dist/core/scheduler.js +0 -799
  770. package/dist/core/scheduler.js.map +0 -1
  771. package/dist/core/session-activity.d.ts +0 -43
  772. package/dist/core/session-activity.d.ts.map +0 -1
  773. package/dist/core/session-activity.js +0 -131
  774. package/dist/core/session-activity.js.map +0 -1
  775. package/dist/core/session-board.d.ts +0 -13
  776. package/dist/core/session-board.d.ts.map +0 -1
  777. package/dist/core/session-board.js +0 -28
  778. package/dist/core/session-board.js.map +0 -1
  779. package/dist/core/session-create.d.ts +0 -109
  780. package/dist/core/session-create.d.ts.map +0 -1
  781. package/dist/core/session-create.js +0 -183
  782. package/dist/core/session-create.js.map +0 -1
  783. package/dist/core/session-cwd.d.ts +0 -14
  784. package/dist/core/session-cwd.d.ts.map +0 -1
  785. package/dist/core/session-cwd.js +0 -25
  786. package/dist/core/session-cwd.js.map +0 -1
  787. package/dist/core/session-discovery.d.ts +0 -241
  788. package/dist/core/session-discovery.d.ts.map +0 -1
  789. package/dist/core/session-discovery.js +0 -1127
  790. package/dist/core/session-discovery.js.map +0 -1
  791. package/dist/core/session-liveness.d.ts +0 -41
  792. package/dist/core/session-liveness.d.ts.map +0 -1
  793. package/dist/core/session-liveness.js +0 -50
  794. package/dist/core/session-liveness.js.map +0 -1
  795. package/dist/core/session-manager.d.ts +0 -383
  796. package/dist/core/session-manager.d.ts.map +0 -1
  797. package/dist/core/session-manager.js +0 -2545
  798. package/dist/core/session-manager.js.map +0 -1
  799. package/dist/core/session-marker.d.ts +0 -56
  800. package/dist/core/session-marker.d.ts.map +0 -1
  801. package/dist/core/session-marker.js +0 -240
  802. package/dist/core/session-marker.js.map +0 -1
  803. package/dist/core/session-message-preview.d.ts +0 -20
  804. package/dist/core/session-message-preview.d.ts.map +0 -1
  805. package/dist/core/session-message-preview.js +0 -188
  806. package/dist/core/session-message-preview.js.map +0 -1
  807. package/dist/core/session-ready-handshake.d.ts +0 -11
  808. package/dist/core/session-ready-handshake.d.ts.map +0 -1
  809. package/dist/core/session-ready-handshake.js +0 -41
  810. package/dist/core/session-ready-handshake.js.map +0 -1
  811. package/dist/core/session-rename.d.ts +0 -25
  812. package/dist/core/session-rename.d.ts.map +0 -1
  813. package/dist/core/session-rename.js +0 -43
  814. package/dist/core/session-rename.js.map +0 -1
  815. package/dist/core/session-row-enrichment.d.ts +0 -15
  816. package/dist/core/session-row-enrichment.d.ts.map +0 -1
  817. package/dist/core/session-row-enrichment.js +0 -93
  818. package/dist/core/session-row-enrichment.js.map +0 -1
  819. package/dist/core/session-title.d.ts +0 -23
  820. package/dist/core/session-title.d.ts.map +0 -1
  821. package/dist/core/session-title.js +0 -88
  822. package/dist/core/session-title.js.map +0 -1
  823. package/dist/core/silent-schedule-turns.d.ts +0 -5
  824. package/dist/core/silent-schedule-turns.d.ts.map +0 -1
  825. package/dist/core/silent-schedule-turns.js +0 -47
  826. package/dist/core/silent-schedule-turns.js.map +0 -1
  827. package/dist/core/skills/claude-plugin-delivery.d.ts +0 -6
  828. package/dist/core/skills/claude-plugin-delivery.d.ts.map +0 -1
  829. package/dist/core/skills/claude-plugin-delivery.js +0 -21
  830. package/dist/core/skills/claude-plugin-delivery.js.map +0 -1
  831. package/dist/core/skills/cli-admin-command.d.ts +0 -7
  832. package/dist/core/skills/cli-admin-command.d.ts.map +0 -1
  833. package/dist/core/skills/cli-admin-command.js +0 -359
  834. package/dist/core/skills/cli-admin-command.js.map +0 -1
  835. package/dist/core/skills/cli-session-command.d.ts +0 -7
  836. package/dist/core/skills/cli-session-command.d.ts.map +0 -1
  837. package/dist/core/skills/cli-session-command.js +0 -72
  838. package/dist/core/skills/cli-session-command.js.map +0 -1
  839. package/dist/core/skills/delivery.d.ts +0 -11
  840. package/dist/core/skills/delivery.d.ts.map +0 -1
  841. package/dist/core/skills/delivery.js +0 -22
  842. package/dist/core/skills/delivery.js.map +0 -1
  843. package/dist/core/skills/discovery.d.ts +0 -26
  844. package/dist/core/skills/discovery.d.ts.map +0 -1
  845. package/dist/core/skills/discovery.js +0 -131
  846. package/dist/core/skills/discovery.js.map +0 -1
  847. package/dist/core/skills/frontmatter.d.ts +0 -9
  848. package/dist/core/skills/frontmatter.d.ts.map +0 -1
  849. package/dist/core/skills/frontmatter.js +0 -42
  850. package/dist/core/skills/frontmatter.js.map +0 -1
  851. package/dist/core/skills/im-command.d.ts +0 -9
  852. package/dist/core/skills/im-command.d.ts.map +0 -1
  853. package/dist/core/skills/im-command.js +0 -109
  854. package/dist/core/skills/im-command.js.map +0 -1
  855. package/dist/core/skills/manifest-store.d.ts +0 -5
  856. package/dist/core/skills/manifest-store.d.ts.map +0 -1
  857. package/dist/core/skills/manifest-store.js +0 -29
  858. package/dist/core/skills/manifest-store.js.map +0 -1
  859. package/dist/core/skills/package.d.ts +0 -13
  860. package/dist/core/skills/package.d.ts.map +0 -1
  861. package/dist/core/skills/package.js +0 -35
  862. package/dist/core/skills/package.js.map +0 -1
  863. package/dist/core/skills/policy.d.ts +0 -19
  864. package/dist/core/skills/policy.d.ts.map +0 -1
  865. package/dist/core/skills/policy.js +0 -73
  866. package/dist/core/skills/policy.js.map +0 -1
  867. package/dist/core/skills/prompt.d.ts +0 -3
  868. package/dist/core/skills/prompt.d.ts.map +0 -1
  869. package/dist/core/skills/prompt.js +0 -25
  870. package/dist/core/skills/prompt.js.map +0 -1
  871. package/dist/core/skills/references.d.ts +0 -21
  872. package/dist/core/skills/references.d.ts.map +0 -1
  873. package/dist/core/skills/references.js +0 -27
  874. package/dist/core/skills/references.js.map +0 -1
  875. package/dist/core/skills/registry-paths.d.ts +0 -5
  876. package/dist/core/skills/registry-paths.d.ts.map +0 -1
  877. package/dist/core/skills/registry-paths.js +0 -15
  878. package/dist/core/skills/registry-paths.js.map +0 -1
  879. package/dist/core/skills/resource-reader.d.ts +0 -9
  880. package/dist/core/skills/resource-reader.d.ts.map +0 -1
  881. package/dist/core/skills/resource-reader.js +0 -97
  882. package/dist/core/skills/resource-reader.js.map +0 -1
  883. package/dist/core/skills/session-resolver.d.ts +0 -15
  884. package/dist/core/skills/session-resolver.d.ts.map +0 -1
  885. package/dist/core/skills/session-resolver.js +0 -25
  886. package/dist/core/skills/session-resolver.js.map +0 -1
  887. package/dist/core/skills/session-runtime.d.ts +0 -15
  888. package/dist/core/skills/session-runtime.d.ts.map +0 -1
  889. package/dist/core/skills/session-runtime.js +0 -37
  890. package/dist/core/skills/session-runtime.js.map +0 -1
  891. package/dist/core/skills/sources.d.ts +0 -53
  892. package/dist/core/skills/sources.d.ts.map +0 -1
  893. package/dist/core/skills/sources.js +0 -257
  894. package/dist/core/skills/sources.js.map +0 -1
  895. package/dist/core/skills/types.d.ts +0 -83
  896. package/dist/core/skills/types.d.ts.map +0 -1
  897. package/dist/core/skills/types.js +0 -2
  898. package/dist/core/skills/types.js.map +0 -1
  899. package/dist/core/slash-inject.d.ts +0 -15
  900. package/dist/core/slash-inject.d.ts.map +0 -1
  901. package/dist/core/slash-inject.js +0 -25
  902. package/dist/core/slash-inject.js.map +0 -1
  903. package/dist/core/startup-commands.d.ts +0 -57
  904. package/dist/core/startup-commands.d.ts.map +0 -1
  905. package/dist/core/startup-commands.js +0 -85
  906. package/dist/core/startup-commands.js.map +0 -1
  907. package/dist/core/terminal-proxy.d.ts +0 -39
  908. package/dist/core/terminal-proxy.d.ts.map +0 -1
  909. package/dist/core/terminal-proxy.js +0 -160
  910. package/dist/core/terminal-proxy.js.map +0 -1
  911. package/dist/core/terminal-url.d.ts +0 -47
  912. package/dist/core/terminal-url.d.ts.map +0 -1
  913. package/dist/core/terminal-url.js +0 -87
  914. package/dist/core/terminal-url.js.map +0 -1
  915. package/dist/core/terminal-write-auth.d.ts +0 -75
  916. package/dist/core/terminal-write-auth.d.ts.map +0 -1
  917. package/dist/core/terminal-write-auth.js +0 -149
  918. package/dist/core/terminal-write-auth.js.map +0 -1
  919. package/dist/core/tmux-recovery.d.ts +0 -11
  920. package/dist/core/tmux-recovery.d.ts.map +0 -1
  921. package/dist/core/tmux-recovery.js +0 -19
  922. package/dist/core/tmux-recovery.js.map +0 -1
  923. package/dist/core/trigger-final-suppression.d.ts +0 -24
  924. package/dist/core/trigger-final-suppression.d.ts.map +0 -1
  925. package/dist/core/trigger-final-suppression.js +0 -97
  926. package/dist/core/trigger-final-suppression.js.map +0 -1
  927. package/dist/core/trigger-session.d.ts +0 -56
  928. package/dist/core/trigger-session.d.ts.map +0 -1
  929. package/dist/core/trigger-session.js +0 -637
  930. package/dist/core/trigger-session.js.map +0 -1
  931. package/dist/core/types.d.ts +0 -441
  932. package/dist/core/types.d.ts.map +0 -1
  933. package/dist/core/types.js +0 -128
  934. package/dist/core/types.js.map +0 -1
  935. package/dist/core/update-check.d.ts +0 -94
  936. package/dist/core/update-check.d.ts.map +0 -1
  937. package/dist/core/update-check.js +0 -216
  938. package/dist/core/update-check.js.map +0 -1
  939. package/dist/core/vc-meeting-prepare-command.d.ts +0 -22
  940. package/dist/core/vc-meeting-prepare-command.d.ts.map +0 -1
  941. package/dist/core/vc-meeting-prepare-command.js +0 -50
  942. package/dist/core/vc-meeting-prepare-command.js.map +0 -1
  943. package/dist/core/worker-ipc.d.ts +0 -11
  944. package/dist/core/worker-ipc.d.ts.map +0 -1
  945. package/dist/core/worker-ipc.js +0 -26
  946. package/dist/core/worker-ipc.js.map +0 -1
  947. package/dist/core/worker-pool.d.ts +0 -788
  948. package/dist/core/worker-pool.d.ts.map +0 -1
  949. package/dist/core/worker-pool.js +0 -6914
  950. package/dist/core/worker-pool.js.map +0 -1
  951. package/dist/core/working-dir.d.ts +0 -27
  952. package/dist/core/working-dir.d.ts.map +0 -1
  953. package/dist/core/working-dir.js +0 -52
  954. package/dist/core/working-dir.js.map +0 -1
  955. package/dist/core/zellij-adopt-discovery.d.ts +0 -42
  956. package/dist/core/zellij-adopt-discovery.d.ts.map +0 -1
  957. package/dist/core/zellij-adopt-discovery.js +0 -259
  958. package/dist/core/zellij-adopt-discovery.js.map +0 -1
  959. package/dist/core/zellij-session-discovery.d.ts +0 -76
  960. package/dist/core/zellij-session-discovery.d.ts.map +0 -1
  961. package/dist/core/zellij-session-discovery.js +0 -260
  962. package/dist/core/zellij-session-discovery.js.map +0 -1
  963. package/dist/daemon-internal-client-wrapper.d.ts +0 -41
  964. package/dist/daemon-internal-client-wrapper.d.ts.map +0 -1
  965. package/dist/daemon-internal-client-wrapper.js +0 -65
  966. package/dist/daemon-internal-client-wrapper.js.map +0 -1
  967. package/dist/daemon.d.ts +0 -610
  968. package/dist/daemon.d.ts.map +0 -1
  969. package/dist/daemon.js +0 -16756
  970. package/dist/daemon.js.map +0 -1
  971. package/dist/dashboard/aggregator.d.ts +0 -59
  972. package/dist/dashboard/aggregator.d.ts.map +0 -1
  973. package/dist/dashboard/aggregator.js +0 -176
  974. package/dist/dashboard/aggregator.js.map +0 -1
  975. package/dist/dashboard/auth.d.ts +0 -106
  976. package/dist/dashboard/auth.d.ts.map +0 -1
  977. package/dist/dashboard/auth.js +0 -253
  978. package/dist/dashboard/auth.js.map +0 -1
  979. package/dist/dashboard/bot-onboarding.d.ts +0 -320
  980. package/dist/dashboard/bot-onboarding.d.ts.map +0 -1
  981. package/dist/dashboard/bot-onboarding.js +0 -1666
  982. package/dist/dashboard/bot-onboarding.js.map +0 -1
  983. package/dist/dashboard/bot-payload.d.ts +0 -94
  984. package/dist/dashboard/bot-payload.d.ts.map +0 -1
  985. package/dist/dashboard/bot-payload.js +0 -96
  986. package/dist/dashboard/bot-payload.js.map +0 -1
  987. package/dist/dashboard/card-model-types.d.ts +0 -50
  988. package/dist/dashboard/card-model-types.d.ts.map +0 -1
  989. package/dist/dashboard/card-model-types.js +0 -9
  990. package/dist/dashboard/card-model-types.js.map +0 -1
  991. package/dist/dashboard/compat.d.ts +0 -119
  992. package/dist/dashboard/compat.d.ts.map +0 -1
  993. package/dist/dashboard/compat.js +0 -102
  994. package/dist/dashboard/compat.js.map +0 -1
  995. package/dist/dashboard/connector-api.d.ts +0 -3
  996. package/dist/dashboard/connector-api.d.ts.map +0 -1
  997. package/dist/dashboard/connector-api.js +0 -453
  998. package/dist/dashboard/connector-api.js.map +0 -1
  999. package/dist/dashboard/daemon-internal-api.d.ts +0 -88
  1000. package/dist/dashboard/daemon-internal-api.d.ts.map +0 -1
  1001. package/dist/dashboard/daemon-internal-api.js +0 -476
  1002. package/dist/dashboard/daemon-internal-api.js.map +0 -1
  1003. package/dist/dashboard/daemon-internal-auth.d.ts +0 -124
  1004. package/dist/dashboard/daemon-internal-auth.d.ts.map +0 -1
  1005. package/dist/dashboard/daemon-internal-auth.js +0 -188
  1006. package/dist/dashboard/daemon-internal-auth.js.map +0 -1
  1007. package/dist/dashboard/daemon-internal-client.d.ts +0 -67
  1008. package/dist/dashboard/daemon-internal-client.d.ts.map +0 -1
  1009. package/dist/dashboard/daemon-internal-client.js +0 -156
  1010. package/dist/dashboard/daemon-internal-client.js.map +0 -1
  1011. package/dist/dashboard/dashboard-admins.d.ts +0 -8
  1012. package/dist/dashboard/dashboard-admins.d.ts.map +0 -1
  1013. package/dist/dashboard/dashboard-admins.js +0 -15
  1014. package/dist/dashboard/dashboard-admins.js.map +0 -1
  1015. package/dist/dashboard/debug-terminal.d.ts +0 -18
  1016. package/dist/dashboard/debug-terminal.d.ts.map +0 -1
  1017. package/dist/dashboard/debug-terminal.js +0 -338
  1018. package/dist/dashboard/debug-terminal.js.map +0 -1
  1019. package/dist/dashboard/desktop-asks.d.ts +0 -21
  1020. package/dist/dashboard/desktop-asks.d.ts.map +0 -1
  1021. package/dist/dashboard/desktop-asks.js +0 -49
  1022. package/dist/dashboard/desktop-asks.js.map +0 -1
  1023. package/dist/dashboard/federated-group-core.d.ts +0 -75
  1024. package/dist/dashboard/federated-group-core.d.ts.map +0 -1
  1025. package/dist/dashboard/federated-group-core.js +0 -236
  1026. package/dist/dashboard/federated-group-core.js.map +0 -1
  1027. package/dist/dashboard/federation-api.d.ts +0 -43
  1028. package/dist/dashboard/federation-api.d.ts.map +0 -1
  1029. package/dist/dashboard/federation-api.js +0 -580
  1030. package/dist/dashboard/federation-api.js.map +0 -1
  1031. package/dist/dashboard/federation-spoke-api.d.ts +0 -129
  1032. package/dist/dashboard/federation-spoke-api.d.ts.map +0 -1
  1033. package/dist/dashboard/federation-spoke-api.js +0 -809
  1034. package/dist/dashboard/federation-spoke-api.js.map +0 -1
  1035. package/dist/dashboard/feishu-login.d.ts +0 -64
  1036. package/dist/dashboard/feishu-login.d.ts.map +0 -1
  1037. package/dist/dashboard/feishu-login.js +0 -99
  1038. package/dist/dashboard/feishu-login.js.map +0 -1
  1039. package/dist/dashboard/groups-action-helpers.d.ts +0 -71
  1040. package/dist/dashboard/groups-action-helpers.d.ts.map +0 -1
  1041. package/dist/dashboard/groups-action-helpers.js +0 -150
  1042. package/dist/dashboard/groups-action-helpers.js.map +0 -1
  1043. package/dist/dashboard/groups-card-model.d.ts +0 -120
  1044. package/dist/dashboard/groups-card-model.d.ts.map +0 -1
  1045. package/dist/dashboard/groups-card-model.js +0 -175
  1046. package/dist/dashboard/groups-card-model.js.map +0 -1
  1047. package/dist/dashboard/groups-matrix-snapshot.d.ts +0 -56
  1048. package/dist/dashboard/groups-matrix-snapshot.d.ts.map +0 -1
  1049. package/dist/dashboard/groups-matrix-snapshot.js +0 -127
  1050. package/dist/dashboard/groups-matrix-snapshot.js.map +0 -1
  1051. package/dist/dashboard/hd2d-assets.d.ts +0 -20
  1052. package/dist/dashboard/hd2d-assets.d.ts.map +0 -1
  1053. package/dist/dashboard/hd2d-assets.js +0 -216
  1054. package/dist/dashboard/hd2d-assets.js.map +0 -1
  1055. package/dist/dashboard/history-senders.d.ts +0 -40
  1056. package/dist/dashboard/history-senders.d.ts.map +0 -1
  1057. package/dist/dashboard/history-senders.js +0 -60
  1058. package/dist/dashboard/history-senders.js.map +0 -1
  1059. package/dist/dashboard/http.d.ts +0 -4
  1060. package/dist/dashboard/http.d.ts.map +0 -1
  1061. package/dist/dashboard/http.js +0 -6
  1062. package/dist/dashboard/http.js.map +0 -1
  1063. package/dist/dashboard/operator-selector.d.ts +0 -20
  1064. package/dist/dashboard/operator-selector.d.ts.map +0 -1
  1065. package/dist/dashboard/operator-selector.js +0 -39
  1066. package/dist/dashboard/operator-selector.js.map +0 -1
  1067. package/dist/dashboard/public-redact.d.ts +0 -32
  1068. package/dist/dashboard/public-redact.d.ts.map +0 -1
  1069. package/dist/dashboard/public-redact.js +0 -137
  1070. package/dist/dashboard/public-redact.js.map +0 -1
  1071. package/dist/dashboard/registry.d.ts +0 -56
  1072. package/dist/dashboard/registry.d.ts.map +0 -1
  1073. package/dist/dashboard/registry.js +0 -99
  1074. package/dist/dashboard/registry.js.map +0 -1
  1075. package/dist/dashboard/resource-monitor-service.d.ts +0 -56
  1076. package/dist/dashboard/resource-monitor-service.d.ts.map +0 -1
  1077. package/dist/dashboard/resource-monitor-service.js +0 -462
  1078. package/dist/dashboard/resource-monitor-service.js.map +0 -1
  1079. package/dist/dashboard/roles-batch.d.ts +0 -31
  1080. package/dist/dashboard/roles-batch.d.ts.map +0 -1
  1081. package/dist/dashboard/roles-batch.js +0 -87
  1082. package/dist/dashboard/roles-batch.js.map +0 -1
  1083. package/dist/dashboard/schedule-card-model.d.ts +0 -185
  1084. package/dist/dashboard/schedule-card-model.d.ts.map +0 -1
  1085. package/dist/dashboard/schedule-card-model.js +0 -320
  1086. package/dist/dashboard/schedule-card-model.js.map +0 -1
  1087. package/dist/dashboard/session-card-model.d.ts +0 -83
  1088. package/dist/dashboard/session-card-model.d.ts.map +0 -1
  1089. package/dist/dashboard/session-card-model.js +0 -207
  1090. package/dist/dashboard/session-card-model.js.map +0 -1
  1091. package/dist/dashboard/session-cleanup.d.ts +0 -31
  1092. package/dist/dashboard/session-cleanup.d.ts.map +0 -1
  1093. package/dist/dashboard/session-cleanup.js +0 -49
  1094. package/dist/dashboard/session-cleanup.js.map +0 -1
  1095. package/dist/dashboard/session-presentation.d.ts +0 -16
  1096. package/dist/dashboard/session-presentation.d.ts.map +0 -1
  1097. package/dist/dashboard/session-presentation.js +0 -62
  1098. package/dist/dashboard/session-presentation.js.map +0 -1
  1099. package/dist/dashboard/settings-card-model.d.ts +0 -76
  1100. package/dist/dashboard/settings-card-model.d.ts.map +0 -1
  1101. package/dist/dashboard/settings-card-model.js +0 -109
  1102. package/dist/dashboard/settings-card-model.js.map +0 -1
  1103. package/dist/dashboard/settings-owner-resolver.d.ts +0 -32
  1104. package/dist/dashboard/settings-owner-resolver.d.ts.map +0 -1
  1105. package/dist/dashboard/settings-owner-resolver.js +0 -43
  1106. package/dist/dashboard/settings-owner-resolver.js.map +0 -1
  1107. package/dist/dashboard/settings-write-applier.d.ts +0 -219
  1108. package/dist/dashboard/settings-write-applier.d.ts.map +0 -1
  1109. package/dist/dashboard/settings-write-applier.js +0 -467
  1110. package/dist/dashboard/settings-write-applier.js.map +0 -1
  1111. package/dist/dashboard/skill-install-request.d.ts +0 -46
  1112. package/dist/dashboard/skill-install-request.d.ts.map +0 -1
  1113. package/dist/dashboard/skill-install-request.js +0 -150
  1114. package/dist/dashboard/skill-install-request.js.map +0 -1
  1115. package/dist/dashboard/stale-chunk-module.d.ts +0 -3
  1116. package/dist/dashboard/stale-chunk-module.d.ts.map +0 -1
  1117. package/dist/dashboard/stale-chunk-module.js +0 -55
  1118. package/dist/dashboard/stale-chunk-module.js.map +0 -1
  1119. package/dist/dashboard/team-group.d.ts +0 -39
  1120. package/dist/dashboard/team-group.d.ts.map +0 -1
  1121. package/dist/dashboard/team-group.js +0 -23
  1122. package/dist/dashboard/team-group.js.map +0 -1
  1123. package/dist/dashboard/trigger-api.d.ts +0 -25
  1124. package/dist/dashboard/trigger-api.d.ts.map +0 -1
  1125. package/dist/dashboard/trigger-api.js +0 -153
  1126. package/dist/dashboard/trigger-api.js.map +0 -1
  1127. package/dist/dashboard/v3-runs-api.d.ts +0 -29
  1128. package/dist/dashboard/v3-runs-api.d.ts.map +0 -1
  1129. package/dist/dashboard/v3-runs-api.js +0 -184
  1130. package/dist/dashboard/v3-runs-api.js.map +0 -1
  1131. package/dist/dashboard/vc-consumer-profiles-api.d.ts +0 -110
  1132. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +0 -1
  1133. package/dist/dashboard/vc-consumer-profiles-api.js +0 -325
  1134. package/dist/dashboard/vc-consumer-profiles-api.js.map +0 -1
  1135. package/dist/dashboard/web/app.d.ts +0 -3
  1136. package/dist/dashboard/web/app.d.ts.map +0 -1
  1137. package/dist/dashboard/web/app.js +0 -962
  1138. package/dist/dashboard/web/app.js.map +0 -1
  1139. package/dist/dashboard/web/auth-login.d.ts +0 -3
  1140. package/dist/dashboard/web/auth-login.d.ts.map +0 -1
  1141. package/dist/dashboard/web/auth-login.js +0 -19
  1142. package/dist/dashboard/web/auth-login.js.map +0 -1
  1143. package/dist/dashboard/web/bot-defaults-page.d.ts +0 -78
  1144. package/dist/dashboard/web/bot-defaults-page.d.ts.map +0 -1
  1145. package/dist/dashboard/web/bot-defaults-page.js +0 -2486
  1146. package/dist/dashboard/web/bot-defaults-page.js.map +0 -1
  1147. package/dist/dashboard/web/bot-defaults.d.ts +0 -163
  1148. package/dist/dashboard/web/bot-defaults.d.ts.map +0 -1
  1149. package/dist/dashboard/web/bot-defaults.js +0 -127
  1150. package/dist/dashboard/web/bot-defaults.js.map +0 -1
  1151. package/dist/dashboard/web/bot-onboarding.d.ts +0 -9
  1152. package/dist/dashboard/web/bot-onboarding.d.ts.map +0 -1
  1153. package/dist/dashboard/web/bot-onboarding.js +0 -421
  1154. package/dist/dashboard/web/bot-onboarding.js.map +0 -1
  1155. package/dist/dashboard/web/client-shell.d.ts +0 -29
  1156. package/dist/dashboard/web/client-shell.d.ts.map +0 -1
  1157. package/dist/dashboard/web/client-shell.js +0 -89
  1158. package/dist/dashboard/web/client-shell.js.map +0 -1
  1159. package/dist/dashboard/web/clipboard.d.ts +0 -2
  1160. package/dist/dashboard/web/clipboard.d.ts.map +0 -1
  1161. package/dist/dashboard/web/clipboard.js +0 -42
  1162. package/dist/dashboard/web/clipboard.js.map +0 -1
  1163. package/dist/dashboard/web/connectors-page.d.ts +0 -23
  1164. package/dist/dashboard/web/connectors-page.d.ts.map +0 -1
  1165. package/dist/dashboard/web/connectors-page.js +0 -516
  1166. package/dist/dashboard/web/connectors-page.js.map +0 -1
  1167. package/dist/dashboard/web/create-session-composer.d.ts +0 -35
  1168. package/dist/dashboard/web/create-session-composer.d.ts.map +0 -1
  1169. package/dist/dashboard/web/create-session-composer.js +0 -70
  1170. package/dist/dashboard/web/create-session-composer.js.map +0 -1
  1171. package/dist/dashboard/web/create-session-entry.d.ts +0 -4
  1172. package/dist/dashboard/web/create-session-entry.d.ts.map +0 -1
  1173. package/dist/dashboard/web/create-session-entry.js +0 -17
  1174. package/dist/dashboard/web/create-session-entry.js.map +0 -1
  1175. package/dist/dashboard/web/cyber-fx.d.ts +0 -6
  1176. package/dist/dashboard/web/cyber-fx.d.ts.map +0 -1
  1177. package/dist/dashboard/web/cyber-fx.js +0 -289
  1178. package/dist/dashboard/web/cyber-fx.js.map +0 -1
  1179. package/dist/dashboard/web/dashboard-api.d.ts +0 -9
  1180. package/dist/dashboard/web/dashboard-api.d.ts.map +0 -1
  1181. package/dist/dashboard/web/dashboard-api.js +0 -18
  1182. package/dist/dashboard/web/dashboard-api.js.map +0 -1
  1183. package/dist/dashboard/web/dashboard-components.d.ts +0 -105
  1184. package/dist/dashboard/web/dashboard-components.d.ts.map +0 -1
  1185. package/dist/dashboard/web/dashboard-components.js +0 -284
  1186. package/dist/dashboard/web/dashboard-components.js.map +0 -1
  1187. package/dist/dashboard/web/dashboard-routes.d.ts +0 -14
  1188. package/dist/dashboard/web/dashboard-routes.d.ts.map +0 -1
  1189. package/dist/dashboard/web/dashboard-routes.js +0 -49
  1190. package/dist/dashboard/web/dashboard-routes.js.map +0 -1
  1191. package/dist/dashboard/web/floating-scrollbars.d.ts +0 -2
  1192. package/dist/dashboard/web/floating-scrollbars.d.ts.map +0 -1
  1193. package/dist/dashboard/web/floating-scrollbars.js +0 -264
  1194. package/dist/dashboard/web/floating-scrollbars.js.map +0 -1
  1195. package/dist/dashboard/web/groups-api.d.ts +0 -36
  1196. package/dist/dashboard/web/groups-api.d.ts.map +0 -1
  1197. package/dist/dashboard/web/groups-api.js +0 -44
  1198. package/dist/dashboard/web/groups-api.js.map +0 -1
  1199. package/dist/dashboard/web/groups-page.d.ts +0 -3
  1200. package/dist/dashboard/web/groups-page.d.ts.map +0 -1
  1201. package/dist/dashboard/web/groups-page.js +0 -761
  1202. package/dist/dashboard/web/groups-page.js.map +0 -1
  1203. package/dist/dashboard/web/groups.d.ts +0 -58
  1204. package/dist/dashboard/web/groups.d.ts.map +0 -1
  1205. package/dist/dashboard/web/groups.js +0 -203
  1206. package/dist/dashboard/web/groups.js.map +0 -1
  1207. package/dist/dashboard/web/i18n.d.ts +0 -7
  1208. package/dist/dashboard/web/i18n.d.ts.map +0 -1
  1209. package/dist/dashboard/web/i18n.js +0 -4295
  1210. package/dist/dashboard/web/i18n.js.map +0 -1
  1211. package/dist/dashboard/web/icon-tooltip.d.ts +0 -3
  1212. package/dist/dashboard/web/icon-tooltip.d.ts.map +0 -1
  1213. package/dist/dashboard/web/icon-tooltip.js +0 -123
  1214. package/dist/dashboard/web/icon-tooltip.js.map +0 -1
  1215. package/dist/dashboard/web/insights-page.d.ts +0 -3
  1216. package/dist/dashboard/web/insights-page.d.ts.map +0 -1
  1217. package/dist/dashboard/web/insights-page.js +0 -1059
  1218. package/dist/dashboard/web/insights-page.js.map +0 -1
  1219. package/dist/dashboard/web/insights.d.ts +0 -189
  1220. package/dist/dashboard/web/insights.d.ts.map +0 -1
  1221. package/dist/dashboard/web/insights.js +0 -519
  1222. package/dist/dashboard/web/insights.js.map +0 -1
  1223. package/dist/dashboard/web/kanban-model.d.ts +0 -19
  1224. package/dist/dashboard/web/kanban-model.d.ts.map +0 -1
  1225. package/dist/dashboard/web/kanban-model.js +0 -40
  1226. package/dist/dashboard/web/kanban-model.js.map +0 -1
  1227. package/dist/dashboard/web/listener-filters.d.ts +0 -54
  1228. package/dist/dashboard/web/listener-filters.d.ts.map +0 -1
  1229. package/dist/dashboard/web/listener-filters.js +0 -94
  1230. package/dist/dashboard/web/listener-filters.js.map +0 -1
  1231. package/dist/dashboard/web/monitor-room-store.d.ts +0 -20
  1232. package/dist/dashboard/web/monitor-room-store.d.ts.map +0 -1
  1233. package/dist/dashboard/web/monitor-room-store.js +0 -80
  1234. package/dist/dashboard/web/monitor-room-store.js.map +0 -1
  1235. package/dist/dashboard/web/monitor-room.d.ts +0 -31
  1236. package/dist/dashboard/web/monitor-room.d.ts.map +0 -1
  1237. package/dist/dashboard/web/monitor-room.js +0 -395
  1238. package/dist/dashboard/web/monitor-room.js.map +0 -1
  1239. package/dist/dashboard/web/monitoring-page.d.ts +0 -155
  1240. package/dist/dashboard/web/monitoring-page.d.ts.map +0 -1
  1241. package/dist/dashboard/web/monitoring-page.js +0 -363
  1242. package/dist/dashboard/web/monitoring-page.js.map +0 -1
  1243. package/dist/dashboard/web/office-page.d.ts +0 -3
  1244. package/dist/dashboard/web/office-page.d.ts.map +0 -1
  1245. package/dist/dashboard/web/office-page.js +0 -137
  1246. package/dist/dashboard/web/office-page.js.map +0 -1
  1247. package/dist/dashboard/web/overview-page.d.ts +0 -3
  1248. package/dist/dashboard/web/overview-page.d.ts.map +0 -1
  1249. package/dist/dashboard/web/overview-page.js +0 -253
  1250. package/dist/dashboard/web/overview-page.js.map +0 -1
  1251. package/dist/dashboard/web/overview.d.ts +0 -23
  1252. package/dist/dashboard/web/overview.d.ts.map +0 -1
  1253. package/dist/dashboard/web/overview.js +0 -81
  1254. package/dist/dashboard/web/overview.js.map +0 -1
  1255. package/dist/dashboard/web/plugin-events.d.ts +0 -2
  1256. package/dist/dashboard/web/plugin-events.d.ts.map +0 -1
  1257. package/dist/dashboard/web/plugin-events.js +0 -2
  1258. package/dist/dashboard/web/plugin-events.js.map +0 -1
  1259. package/dist/dashboard/web/plugin-page.d.ts +0 -3
  1260. package/dist/dashboard/web/plugin-page.d.ts.map +0 -1
  1261. package/dist/dashboard/web/plugin-page.js +0 -467
  1262. package/dist/dashboard/web/plugin-page.js.map +0 -1
  1263. package/dist/dashboard/web/preferences.d.ts +0 -42
  1264. package/dist/dashboard/web/preferences.d.ts.map +0 -1
  1265. package/dist/dashboard/web/preferences.js +0 -162
  1266. package/dist/dashboard/web/preferences.js.map +0 -1
  1267. package/dist/dashboard/web/preview-markdown.d.ts +0 -5
  1268. package/dist/dashboard/web/preview-markdown.d.ts.map +0 -1
  1269. package/dist/dashboard/web/preview-markdown.js +0 -52
  1270. package/dist/dashboard/web/preview-markdown.js.map +0 -1
  1271. package/dist/dashboard/web/react-hooks.d.ts +0 -8
  1272. package/dist/dashboard/web/react-hooks.d.ts.map +0 -1
  1273. package/dist/dashboard/web/react-hooks.js +0 -43
  1274. package/dist/dashboard/web/react-hooks.js.map +0 -1
  1275. package/dist/dashboard/web/react-mount.d.ts +0 -4
  1276. package/dist/dashboard/web/react-mount.d.ts.map +0 -1
  1277. package/dist/dashboard/web/react-mount.js +0 -7
  1278. package/dist/dashboard/web/react-mount.js.map +0 -1
  1279. package/dist/dashboard/web/role-batch.d.ts +0 -9
  1280. package/dist/dashboard/web/role-batch.d.ts.map +0 -1
  1281. package/dist/dashboard/web/role-batch.js +0 -42
  1282. package/dist/dashboard/web/role-batch.js.map +0 -1
  1283. package/dist/dashboard/web/role-profile-match.d.ts +0 -31
  1284. package/dist/dashboard/web/role-profile-match.d.ts.map +0 -1
  1285. package/dist/dashboard/web/role-profile-match.js +0 -58
  1286. package/dist/dashboard/web/role-profile-match.js.map +0 -1
  1287. package/dist/dashboard/web/roles-page.d.ts +0 -4
  1288. package/dist/dashboard/web/roles-page.d.ts.map +0 -1
  1289. package/dist/dashboard/web/roles-page.js +0 -1120
  1290. package/dist/dashboard/web/roles-page.js.map +0 -1
  1291. package/dist/dashboard/web/roles.d.ts +0 -177
  1292. package/dist/dashboard/web/roles.d.ts.map +0 -1
  1293. package/dist/dashboard/web/roles.js +0 -272
  1294. package/dist/dashboard/web/roles.js.map +0 -1
  1295. package/dist/dashboard/web/route-lifecycle.d.ts +0 -14
  1296. package/dist/dashboard/web/route-lifecycle.d.ts.map +0 -1
  1297. package/dist/dashboard/web/route-lifecycle.js +0 -29
  1298. package/dist/dashboard/web/route-lifecycle.js.map +0 -1
  1299. package/dist/dashboard/web/schedules-page.d.ts +0 -16
  1300. package/dist/dashboard/web/schedules-page.d.ts.map +0 -1
  1301. package/dist/dashboard/web/schedules-page.js +0 -303
  1302. package/dist/dashboard/web/schedules-page.js.map +0 -1
  1303. package/dist/dashboard/web/session-terminal.d.ts +0 -7
  1304. package/dist/dashboard/web/session-terminal.d.ts.map +0 -1
  1305. package/dist/dashboard/web/session-terminal.js +0 -23
  1306. package/dist/dashboard/web/session-terminal.js.map +0 -1
  1307. package/dist/dashboard/web/sessions-kanban.d.ts +0 -70
  1308. package/dist/dashboard/web/sessions-kanban.d.ts.map +0 -1
  1309. package/dist/dashboard/web/sessions-kanban.js +0 -481
  1310. package/dist/dashboard/web/sessions-kanban.js.map +0 -1
  1311. package/dist/dashboard/web/sessions-page.d.ts +0 -27
  1312. package/dist/dashboard/web/sessions-page.d.ts.map +0 -1
  1313. package/dist/dashboard/web/sessions-page.js +0 -2085
  1314. package/dist/dashboard/web/sessions-page.js.map +0 -1
  1315. package/dist/dashboard/web/sessions.d.ts +0 -116
  1316. package/dist/dashboard/web/sessions.d.ts.map +0 -1
  1317. package/dist/dashboard/web/sessions.js +0 -390
  1318. package/dist/dashboard/web/sessions.js.map +0 -1
  1319. package/dist/dashboard/web/settings-page.d.ts +0 -119
  1320. package/dist/dashboard/web/settings-page.d.ts.map +0 -1
  1321. package/dist/dashboard/web/settings-page.js +0 -772
  1322. package/dist/dashboard/web/settings-page.js.map +0 -1
  1323. package/dist/dashboard/web/skills-page.d.ts +0 -90
  1324. package/dist/dashboard/web/skills-page.d.ts.map +0 -1
  1325. package/dist/dashboard/web/skills-page.js +0 -1004
  1326. package/dist/dashboard/web/skills-page.js.map +0 -1
  1327. package/dist/dashboard/web/stale-chunk-reload.d.ts +0 -16
  1328. package/dist/dashboard/web/stale-chunk-reload.d.ts.map +0 -1
  1329. package/dist/dashboard/web/stale-chunk-reload.js +0 -51
  1330. package/dist/dashboard/web/stale-chunk-reload.js.map +0 -1
  1331. package/dist/dashboard/web/store.d.ts +0 -39
  1332. package/dist/dashboard/web/store.d.ts.map +0 -1
  1333. package/dist/dashboard/web/store.js +0 -177
  1334. package/dist/dashboard/web/store.js.map +0 -1
  1335. package/dist/dashboard/web/substitute-targets.d.ts +0 -30
  1336. package/dist/dashboard/web/substitute-targets.d.ts.map +0 -1
  1337. package/dist/dashboard/web/substitute-targets.js +0 -99
  1338. package/dist/dashboard/web/substitute-targets.js.map +0 -1
  1339. package/dist/dashboard/web/team-federation-page.d.ts +0 -4
  1340. package/dist/dashboard/web/team-federation-page.d.ts.map +0 -1
  1341. package/dist/dashboard/web/team-federation-page.js +0 -465
  1342. package/dist/dashboard/web/team-federation-page.js.map +0 -1
  1343. package/dist/dashboard/web/team-federation.d.ts +0 -92
  1344. package/dist/dashboard/web/team-federation.d.ts.map +0 -1
  1345. package/dist/dashboard/web/team-federation.js +0 -106
  1346. package/dist/dashboard/web/team-federation.js.map +0 -1
  1347. package/dist/dashboard/web/theme-menu.d.ts +0 -4
  1348. package/dist/dashboard/web/theme-menu.d.ts.map +0 -1
  1349. package/dist/dashboard/web/theme-menu.js +0 -173
  1350. package/dist/dashboard/web/theme-menu.js.map +0 -1
  1351. package/dist/dashboard/web/ui.d.ts +0 -81
  1352. package/dist/dashboard/web/ui.d.ts.map +0 -1
  1353. package/dist/dashboard/web/ui.js +0 -330
  1354. package/dist/dashboard/web/ui.js.map +0 -1
  1355. package/dist/dashboard/web/update-action.d.ts +0 -16
  1356. package/dist/dashboard/web/update-action.d.ts.map +0 -1
  1357. package/dist/dashboard/web/update-action.js +0 -64
  1358. package/dist/dashboard/web/update-action.js.map +0 -1
  1359. package/dist/dashboard/web/v3-api.d.ts +0 -26
  1360. package/dist/dashboard/web/v3-api.d.ts.map +0 -1
  1361. package/dist/dashboard/web/v3-api.js +0 -49
  1362. package/dist/dashboard/web/v3-api.js.map +0 -1
  1363. package/dist/dashboard/web/v3-components.d.ts +0 -9
  1364. package/dist/dashboard/web/v3-components.d.ts.map +0 -1
  1365. package/dist/dashboard/web/v3-components.js +0 -333
  1366. package/dist/dashboard/web/v3-components.js.map +0 -1
  1367. package/dist/dashboard/web/v3-model.d.ts +0 -80
  1368. package/dist/dashboard/web/v3-model.d.ts.map +0 -1
  1369. package/dist/dashboard/web/v3-model.js +0 -240
  1370. package/dist/dashboard/web/v3-model.js.map +0 -1
  1371. package/dist/dashboard/web/v3-page.d.ts +0 -3
  1372. package/dist/dashboard/web/v3-page.d.ts.map +0 -1
  1373. package/dist/dashboard/web/v3-page.js +0 -7
  1374. package/dist/dashboard/web/v3-page.js.map +0 -1
  1375. package/dist/dashboard/web/v3-terminal.d.ts +0 -25
  1376. package/dist/dashboard/web/v3-terminal.d.ts.map +0 -1
  1377. package/dist/dashboard/web/v3-terminal.js +0 -155
  1378. package/dist/dashboard/web/v3-terminal.js.map +0 -1
  1379. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +0 -29
  1380. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +0 -1
  1381. package/dist/dashboard/web/vc-consumer-profiles-section.js +0 -459
  1382. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +0 -1
  1383. package/dist/dashboard/web/webhook-logs-page.d.ts +0 -17
  1384. package/dist/dashboard/web/webhook-logs-page.d.ts.map +0 -1
  1385. package/dist/dashboard/web/webhook-logs-page.js +0 -198
  1386. package/dist/dashboard/web/webhook-logs-page.js.map +0 -1
  1387. package/dist/dashboard/web/whiteboards-page.d.ts +0 -3
  1388. package/dist/dashboard/web/whiteboards-page.d.ts.map +0 -1
  1389. package/dist/dashboard/web/whiteboards-page.js +0 -198
  1390. package/dist/dashboard/web/whiteboards-page.js.map +0 -1
  1391. package/dist/dashboard/webhook-routes.d.ts +0 -19
  1392. package/dist/dashboard/webhook-routes.d.ts.map +0 -1
  1393. package/dist/dashboard/webhook-routes.js +0 -618
  1394. package/dist/dashboard/webhook-routes.js.map +0 -1
  1395. package/dist/dashboard-web/app.js +0 -1
  1396. package/dist/dashboard-web/apple-touch-icon.png +0 -0
  1397. package/dist/dashboard-web/brand-logo.png +0 -0
  1398. package/dist/dashboard-web/chunks/bot-defaults-page-LTVOUDIS.js +0 -10
  1399. package/dist/dashboard-web/chunks/chunk-3UE7S77S.js +0 -1
  1400. package/dist/dashboard-web/chunks/chunk-5CJMHTT4.js +0 -1
  1401. package/dist/dashboard-web/chunks/chunk-5THX4DI2.js +0 -66
  1402. package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
  1403. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +0 -1
  1404. package/dist/dashboard-web/chunks/chunk-BD3PZGH2.js +0 -1
  1405. package/dist/dashboard-web/chunks/chunk-DCS35UMD.js +0 -1
  1406. package/dist/dashboard-web/chunks/chunk-EVK77ASG.js +0 -1
  1407. package/dist/dashboard-web/chunks/chunk-FDZ7WOBW.js +0 -16
  1408. package/dist/dashboard-web/chunks/chunk-MFQPCVHY.js +0 -51
  1409. package/dist/dashboard-web/chunks/chunk-R3FXBFQH.js +0 -1
  1410. package/dist/dashboard-web/chunks/chunk-SYC6D5XU.js +0 -1
  1411. package/dist/dashboard-web/chunks/chunk-XJ7BGPJH.js +0 -1
  1412. package/dist/dashboard-web/chunks/chunk-ZJVTGU5X.js +0 -1
  1413. package/dist/dashboard-web/chunks/chunk-ZU3UUKAR.js +0 -1
  1414. package/dist/dashboard-web/chunks/connectors-page-5KWDIMKC.js +0 -1
  1415. package/dist/dashboard-web/chunks/groups-page-FHOKYXMW.js +0 -8
  1416. package/dist/dashboard-web/chunks/insights-page-T2ZX2RWL.js +0 -7
  1417. package/dist/dashboard-web/chunks/monitor-room-YNVBAGR6.js +0 -53
  1418. package/dist/dashboard-web/chunks/monitoring-page-LHM55YWN.js +0 -2
  1419. package/dist/dashboard-web/chunks/office-page-ATXVP7PW.js +0 -1
  1420. package/dist/dashboard-web/chunks/overview-page-QYI3KBDD.js +0 -1
  1421. package/dist/dashboard-web/chunks/plugin-page-VEGTCEAS.js +0 -1
  1422. package/dist/dashboard-web/chunks/roles-page-56VWM6CD.js +0 -1
  1423. package/dist/dashboard-web/chunks/schedules-page-S5K6U4EO.js +0 -1
  1424. package/dist/dashboard-web/chunks/sessions-page-WBP4N7D2.js +0 -6
  1425. package/dist/dashboard-web/chunks/settings-page-QUZDQARR.js +0 -2
  1426. package/dist/dashboard-web/chunks/skills-page-IFY7AEND.js +0 -4
  1427. package/dist/dashboard-web/chunks/team-federation-page-C7FJQPFZ.js +0 -1
  1428. package/dist/dashboard-web/chunks/v3-page-2LMF3WWR.js +0 -94
  1429. package/dist/dashboard-web/chunks/whiteboards-page-3XC6QRMY.js +0 -1
  1430. package/dist/dashboard-web/favicon.png +0 -0
  1431. package/dist/dashboard-web/game/index.apple-touch-icon.png +0 -0
  1432. package/dist/dashboard-web/game/index.audio.position.worklet.js +0 -66
  1433. package/dist/dashboard-web/game/index.audio.worklet.js +0 -213
  1434. package/dist/dashboard-web/game/index.html +0 -224
  1435. package/dist/dashboard-web/game/index.icon.png +0 -0
  1436. package/dist/dashboard-web/game/index.js +0 -909
  1437. package/dist/dashboard-web/game/index.png +0 -0
  1438. package/dist/dashboard-web/index.html +0 -17
  1439. package/dist/dashboard-web/skins/fallout-vaultboy.webp +0 -0
  1440. package/dist/dashboard-web/style.css +0 -25771
  1441. package/dist/dashboard.d.ts +0 -2
  1442. package/dist/dashboard.d.ts.map +0 -1
  1443. package/dist/dashboard.js +0 -5487
  1444. package/dist/dashboard.js.map +0 -1
  1445. package/dist/desktop/main/auto-start.d.ts +0 -19
  1446. package/dist/desktop/main/auto-start.d.ts.map +0 -1
  1447. package/dist/desktop/main/auto-start.js +0 -41
  1448. package/dist/desktop/main/auto-start.js.map +0 -1
  1449. package/dist/desktop/main/bundled-runtime.d.ts +0 -12
  1450. package/dist/desktop/main/bundled-runtime.d.ts.map +0 -1
  1451. package/dist/desktop/main/bundled-runtime.js +0 -30
  1452. package/dist/desktop/main/bundled-runtime.js.map +0 -1
  1453. package/dist/desktop/main/dashboard-compat.d.ts +0 -25
  1454. package/dist/desktop/main/dashboard-compat.d.ts.map +0 -1
  1455. package/dist/desktop/main/dashboard-compat.js +0 -117
  1456. package/dist/desktop/main/dashboard-compat.js.map +0 -1
  1457. package/dist/desktop/main/device-status.d.ts +0 -15
  1458. package/dist/desktop/main/device-status.d.ts.map +0 -1
  1459. package/dist/desktop/main/device-status.js +0 -94
  1460. package/dist/desktop/main/device-status.js.map +0 -1
  1461. package/dist/desktop/main/external-runtime.d.ts +0 -38
  1462. package/dist/desktop/main/external-runtime.d.ts.map +0 -1
  1463. package/dist/desktop/main/external-runtime.js +0 -272
  1464. package/dist/desktop/main/external-runtime.js.map +0 -1
  1465. package/dist/desktop/main/ipc.d.ts +0 -20
  1466. package/dist/desktop/main/ipc.d.ts.map +0 -1
  1467. package/dist/desktop/main/ipc.js +0 -242
  1468. package/dist/desktop/main/ipc.js.map +0 -1
  1469. package/dist/desktop/main/log-service.d.ts +0 -4
  1470. package/dist/desktop/main/log-service.d.ts.map +0 -1
  1471. package/dist/desktop/main/log-service.js +0 -53
  1472. package/dist/desktop/main/log-service.js.map +0 -1
  1473. package/dist/desktop/main/login-item.d.ts +0 -10
  1474. package/dist/desktop/main/login-item.d.ts.map +0 -1
  1475. package/dist/desktop/main/login-item.js +0 -11
  1476. package/dist/desktop/main/login-item.js.map +0 -1
  1477. package/dist/desktop/main/node-command.d.ts +0 -43
  1478. package/dist/desktop/main/node-command.d.ts.map +0 -1
  1479. package/dist/desktop/main/node-command.js +0 -97
  1480. package/dist/desktop/main/node-command.js.map +0 -1
  1481. package/dist/desktop/main/paths.d.ts +0 -11
  1482. package/dist/desktop/main/paths.d.ts.map +0 -1
  1483. package/dist/desktop/main/paths.js +0 -13
  1484. package/dist/desktop/main/paths.js.map +0 -1
  1485. package/dist/desktop/main/pm2-apps.d.ts +0 -17
  1486. package/dist/desktop/main/pm2-apps.d.ts.map +0 -1
  1487. package/dist/desktop/main/pm2-apps.js +0 -105
  1488. package/dist/desktop/main/pm2-apps.js.map +0 -1
  1489. package/dist/desktop/main/runtime-service.d.ts +0 -65
  1490. package/dist/desktop/main/runtime-service.d.ts.map +0 -1
  1491. package/dist/desktop/main/runtime-service.js +0 -381
  1492. package/dist/desktop/main/runtime-service.js.map +0 -1
  1493. package/dist/desktop/main/runtime-source.d.ts +0 -19
  1494. package/dist/desktop/main/runtime-source.d.ts.map +0 -1
  1495. package/dist/desktop/main/runtime-source.js +0 -67
  1496. package/dist/desktop/main/runtime-source.js.map +0 -1
  1497. package/dist/desktop/main/tray.d.ts +0 -11
  1498. package/dist/desktop/main/tray.d.ts.map +0 -1
  1499. package/dist/desktop/main/tray.js +0 -27
  1500. package/dist/desktop/main/tray.js.map +0 -1
  1501. package/dist/desktop/main/window.d.ts +0 -16
  1502. package/dist/desktop/main/window.d.ts.map +0 -1
  1503. package/dist/desktop/main/window.js +0 -113
  1504. package/dist/desktop/main/window.js.map +0 -1
  1505. package/dist/desktop/main.d.ts +0 -2
  1506. package/dist/desktop/main.d.ts.map +0 -1
  1507. package/dist/desktop/main.js +0 -195
  1508. package/dist/desktop/main.js.map +0 -1
  1509. package/dist/desktop/preload.d.ts +0 -2
  1510. package/dist/desktop/preload.d.ts.map +0 -1
  1511. package/dist/desktop/preload.js +0 -27
  1512. package/dist/desktop/preload.js.map +0 -1
  1513. package/dist/desktop/renderer/app.d.ts +0 -36
  1514. package/dist/desktop/renderer/app.d.ts.map +0 -1
  1515. package/dist/desktop/renderer/app.js +0 -950
  1516. package/dist/desktop/renderer/app.js.map +0 -1
  1517. package/dist/desktop/renderer/dashboard-url.d.ts +0 -13
  1518. package/dist/desktop/renderer/dashboard-url.d.ts.map +0 -1
  1519. package/dist/desktop/renderer/dashboard-url.js +0 -98
  1520. package/dist/desktop/renderer/dashboard-url.js.map +0 -1
  1521. package/dist/desktop/renderer/runtime-state.d.ts +0 -8
  1522. package/dist/desktop/renderer/runtime-state.d.ts.map +0 -1
  1523. package/dist/desktop/renderer/runtime-state.js +0 -69
  1524. package/dist/desktop/renderer/runtime-state.js.map +0 -1
  1525. package/dist/desktop/shared/shell-path-probes.d.ts +0 -24
  1526. package/dist/desktop/shared/shell-path-probes.d.ts.map +0 -1
  1527. package/dist/desktop/shared/shell-path-probes.js +0 -38
  1528. package/dist/desktop/shared/shell-path-probes.js.map +0 -1
  1529. package/dist/desktop/shared/types.d.ts +0 -68
  1530. package/dist/desktop/shared/types.d.ts.map +0 -1
  1531. package/dist/desktop/shared/types.js +0 -2
  1532. package/dist/desktop/shared/types.js.map +0 -1
  1533. package/dist/desktop/smoke.d.ts +0 -29
  1534. package/dist/desktop/smoke.d.ts.map +0 -1
  1535. package/dist/desktop/smoke.js +0 -273
  1536. package/dist/desktop/smoke.js.map +0 -1
  1537. package/dist/features/codex-notifier/adoption.d.ts +0 -11
  1538. package/dist/features/codex-notifier/adoption.d.ts.map +0 -1
  1539. package/dist/features/codex-notifier/adoption.js +0 -11
  1540. package/dist/features/codex-notifier/adoption.js.map +0 -1
  1541. package/dist/features/codex-notifier/app-opener.d.ts +0 -21
  1542. package/dist/features/codex-notifier/app-opener.d.ts.map +0 -1
  1543. package/dist/features/codex-notifier/app-opener.js +0 -33
  1544. package/dist/features/codex-notifier/app-opener.js.map +0 -1
  1545. package/dist/features/codex-notifier/card-action.d.ts +0 -27
  1546. package/dist/features/codex-notifier/card-action.d.ts.map +0 -1
  1547. package/dist/features/codex-notifier/card-action.js +0 -84
  1548. package/dist/features/codex-notifier/card-action.js.map +0 -1
  1549. package/dist/features/codex-notifier/card.d.ts +0 -12
  1550. package/dist/features/codex-notifier/card.d.ts.map +0 -1
  1551. package/dist/features/codex-notifier/card.js +0 -150
  1552. package/dist/features/codex-notifier/card.js.map +0 -1
  1553. package/dist/features/codex-notifier/codex-context.d.ts +0 -12
  1554. package/dist/features/codex-notifier/codex-context.d.ts.map +0 -1
  1555. package/dist/features/codex-notifier/codex-context.js +0 -161
  1556. package/dist/features/codex-notifier/codex-context.js.map +0 -1
  1557. package/dist/features/codex-notifier/config.d.ts +0 -9
  1558. package/dist/features/codex-notifier/config.d.ts.map +0 -1
  1559. package/dist/features/codex-notifier/config.js +0 -11
  1560. package/dist/features/codex-notifier/config.js.map +0 -1
  1561. package/dist/features/codex-notifier/confirmed-turn.d.ts +0 -20
  1562. package/dist/features/codex-notifier/confirmed-turn.d.ts.map +0 -1
  1563. package/dist/features/codex-notifier/confirmed-turn.js +0 -130
  1564. package/dist/features/codex-notifier/confirmed-turn.js.map +0 -1
  1565. package/dist/features/codex-notifier/emitter.d.ts +0 -13
  1566. package/dist/features/codex-notifier/emitter.d.ts.map +0 -1
  1567. package/dist/features/codex-notifier/emitter.js +0 -33
  1568. package/dist/features/codex-notifier/emitter.js.map +0 -1
  1569. package/dist/features/codex-notifier/event-store.d.ts +0 -29
  1570. package/dist/features/codex-notifier/event-store.d.ts.map +0 -1
  1571. package/dist/features/codex-notifier/event-store.js +0 -217
  1572. package/dist/features/codex-notifier/event-store.js.map +0 -1
  1573. package/dist/features/codex-notifier/event.d.ts +0 -46
  1574. package/dist/features/codex-notifier/event.d.ts.map +0 -1
  1575. package/dist/features/codex-notifier/event.js +0 -188
  1576. package/dist/features/codex-notifier/event.js.map +0 -1
  1577. package/dist/features/codex-notifier/hook-cli.d.ts +0 -23
  1578. package/dist/features/codex-notifier/hook-cli.d.ts.map +0 -1
  1579. package/dist/features/codex-notifier/hook-cli.js +0 -130
  1580. package/dist/features/codex-notifier/hook-cli.js.map +0 -1
  1581. package/dist/features/codex-notifier/hook-installer.d.ts +0 -19
  1582. package/dist/features/codex-notifier/hook-installer.d.ts.map +0 -1
  1583. package/dist/features/codex-notifier/hook-installer.js +0 -158
  1584. package/dist/features/codex-notifier/hook-installer.js.map +0 -1
  1585. package/dist/features/codex-notifier/index.d.ts +0 -21
  1586. package/dist/features/codex-notifier/index.d.ts.map +0 -1
  1587. package/dist/features/codex-notifier/index.js +0 -19
  1588. package/dist/features/codex-notifier/index.js.map +0 -1
  1589. package/dist/features/codex-notifier/internal-turn.d.ts +0 -5
  1590. package/dist/features/codex-notifier/internal-turn.d.ts.map +0 -1
  1591. package/dist/features/codex-notifier/internal-turn.js +0 -43
  1592. package/dist/features/codex-notifier/internal-turn.js.map +0 -1
  1593. package/dist/features/codex-notifier/outbox-worker.d.ts +0 -71
  1594. package/dist/features/codex-notifier/outbox-worker.d.ts.map +0 -1
  1595. package/dist/features/codex-notifier/outbox-worker.js +0 -290
  1596. package/dist/features/codex-notifier/outbox-worker.js.map +0 -1
  1597. package/dist/features/codex-notifier/outbox.d.ts +0 -25
  1598. package/dist/features/codex-notifier/outbox.d.ts.map +0 -1
  1599. package/dist/features/codex-notifier/outbox.js +0 -225
  1600. package/dist/features/codex-notifier/outbox.js.map +0 -1
  1601. package/dist/features/codex-notifier/paths.d.ts +0 -7
  1602. package/dist/features/codex-notifier/paths.d.ts.map +0 -1
  1603. package/dist/features/codex-notifier/paths.js +0 -20
  1604. package/dist/features/codex-notifier/paths.js.map +0 -1
  1605. package/dist/features/codex-notifier/screen-lock.d.ts +0 -12
  1606. package/dist/features/codex-notifier/screen-lock.d.ts.map +0 -1
  1607. package/dist/features/codex-notifier/screen-lock.js +0 -47
  1608. package/dist/features/codex-notifier/screen-lock.js.map +0 -1
  1609. package/dist/features/codex-notifier/side-conversation-monitor.d.ts +0 -102
  1610. package/dist/features/codex-notifier/side-conversation-monitor.d.ts.map +0 -1
  1611. package/dist/features/codex-notifier/side-conversation-monitor.js +0 -774
  1612. package/dist/features/codex-notifier/side-conversation-monitor.js.map +0 -1
  1613. package/dist/features/codex-notifier/types.d.ts +0 -42
  1614. package/dist/features/codex-notifier/types.d.ts.map +0 -1
  1615. package/dist/features/codex-notifier/types.js +0 -2
  1616. package/dist/features/codex-notifier/types.js.map +0 -1
  1617. package/dist/features/codex-notifier/worker-lock.d.ts +0 -8
  1618. package/dist/features/codex-notifier/worker-lock.d.ts.map +0 -1
  1619. package/dist/features/codex-notifier/worker-lock.js +0 -108
  1620. package/dist/features/codex-notifier/worker-lock.js.map +0 -1
  1621. package/dist/global-config.d.ts +0 -264
  1622. package/dist/global-config.d.ts.map +0 -1
  1623. package/dist/global-config.js +0 -504
  1624. package/dist/global-config.js.map +0 -1
  1625. package/dist/i18n/en.d.ts +0 -3
  1626. package/dist/i18n/en.d.ts.map +0 -1
  1627. package/dist/i18n/en.js +0 -1211
  1628. package/dist/i18n/en.js.map +0 -1
  1629. package/dist/i18n/index.d.ts +0 -33
  1630. package/dist/i18n/index.d.ts.map +0 -1
  1631. package/dist/i18n/index.js +0 -74
  1632. package/dist/i18n/index.js.map +0 -1
  1633. package/dist/i18n/types.d.ts +0 -4
  1634. package/dist/i18n/types.d.ts.map +0 -1
  1635. package/dist/i18n/types.js +0 -5
  1636. package/dist/i18n/types.js.map +0 -1
  1637. package/dist/i18n/zh.d.ts +0 -6
  1638. package/dist/i18n/zh.d.ts.map +0 -1
  1639. package/dist/i18n/zh.js +0 -1212
  1640. package/dist/i18n/zh.js.map +0 -1
  1641. package/dist/im/lark/ask-card.d.ts +0 -55
  1642. package/dist/im/lark/ask-card.d.ts.map +0 -1
  1643. package/dist/im/lark/ask-card.js +0 -392
  1644. package/dist/im/lark/ask-card.js.map +0 -1
  1645. package/dist/im/lark/brand-template.d.ts +0 -15
  1646. package/dist/im/lark/brand-template.d.ts.map +0 -1
  1647. package/dist/im/lark/brand-template.js +0 -114
  1648. package/dist/im/lark/brand-template.js.map +0 -1
  1649. package/dist/im/lark/callback-button-marker.d.ts +0 -34
  1650. package/dist/im/lark/callback-button-marker.d.ts.map +0 -1
  1651. package/dist/im/lark/callback-button-marker.js +0 -99
  1652. package/dist/im/lark/callback-button-marker.js.map +0 -1
  1653. package/dist/im/lark/card-builder.d.ts +0 -367
  1654. package/dist/im/lark/card-builder.d.ts.map +0 -1
  1655. package/dist/im/lark/card-builder.js +0 -2238
  1656. package/dist/im/lark/card-builder.js.map +0 -1
  1657. package/dist/im/lark/card-handler.d.ts +0 -158
  1658. package/dist/im/lark/card-handler.d.ts.map +0 -1
  1659. package/dist/im/lark/card-handler.js +0 -2923
  1660. package/dist/im/lark/card-handler.js.map +0 -1
  1661. package/dist/im/lark/client.d.ts +0 -471
  1662. package/dist/im/lark/client.d.ts.map +0 -1
  1663. package/dist/im/lark/client.js +0 -1943
  1664. package/dist/im/lark/client.js.map +0 -1
  1665. package/dist/im/lark/doc-comment.d.ts +0 -164
  1666. package/dist/im/lark/doc-comment.d.ts.map +0 -1
  1667. package/dist/im/lark/doc-comment.js +0 -611
  1668. package/dist/im/lark/doc-comment.js.map +0 -1
  1669. package/dist/im/lark/event-dispatcher.d.ts +0 -420
  1670. package/dist/im/lark/event-dispatcher.d.ts.map +0 -1
  1671. package/dist/im/lark/event-dispatcher.js +0 -3274
  1672. package/dist/im/lark/event-dispatcher.js.map +0 -1
  1673. package/dist/im/lark/forward-followup-buffer.d.ts +0 -26
  1674. package/dist/im/lark/forward-followup-buffer.d.ts.map +0 -1
  1675. package/dist/im/lark/forward-followup-buffer.js +0 -48
  1676. package/dist/im/lark/forward-followup-buffer.js.map +0 -1
  1677. package/dist/im/lark/forward-followup-content.d.ts +0 -6
  1678. package/dist/im/lark/forward-followup-content.d.ts.map +0 -1
  1679. package/dist/im/lark/forward-followup-content.js +0 -46
  1680. package/dist/im/lark/forward-followup-content.js.map +0 -1
  1681. package/dist/im/lark/forward-followup-store.d.ts +0 -9
  1682. package/dist/im/lark/forward-followup-store.d.ts.map +0 -1
  1683. package/dist/im/lark/forward-followup-store.js +0 -48
  1684. package/dist/im/lark/forward-followup-store.js.map +0 -1
  1685. package/dist/im/lark/forwarded-renderer.d.ts +0 -23
  1686. package/dist/im/lark/forwarded-renderer.d.ts.map +0 -1
  1687. package/dist/im/lark/forwarded-renderer.js +0 -112
  1688. package/dist/im/lark/forwarded-renderer.js.map +0 -1
  1689. package/dist/im/lark/grant-command.d.ts +0 -51
  1690. package/dist/im/lark/grant-command.d.ts.map +0 -1
  1691. package/dist/im/lark/grant-command.js +0 -215
  1692. package/dist/im/lark/grant-command.js.map +0 -1
  1693. package/dist/im/lark/grant-pending.d.ts +0 -31
  1694. package/dist/im/lark/grant-pending.d.ts.map +0 -1
  1695. package/dist/im/lark/grant-pending.js +0 -122
  1696. package/dist/im/lark/grant-pending.js.map +0 -1
  1697. package/dist/im/lark/groups-card.d.ts +0 -90
  1698. package/dist/im/lark/groups-card.d.ts.map +0 -1
  1699. package/dist/im/lark/groups-card.js +0 -832
  1700. package/dist/im/lark/groups-card.js.map +0 -1
  1701. package/dist/im/lark/identity-cache.d.ts +0 -88
  1702. package/dist/im/lark/identity-cache.d.ts.map +0 -1
  1703. package/dist/im/lark/identity-cache.js +0 -310
  1704. package/dist/im/lark/identity-cache.js.map +0 -1
  1705. package/dist/im/lark/inline-mentions.d.ts +0 -42
  1706. package/dist/im/lark/inline-mentions.d.ts.map +0 -1
  1707. package/dist/im/lark/inline-mentions.js +0 -27
  1708. package/dist/im/lark/inline-mentions.js.map +0 -1
  1709. package/dist/im/lark/invite-command.d.ts +0 -20
  1710. package/dist/im/lark/invite-command.d.ts.map +0 -1
  1711. package/dist/im/lark/invite-command.js +0 -292
  1712. package/dist/im/lark/invite-command.js.map +0 -1
  1713. package/dist/im/lark/issue-card.d.ts +0 -223
  1714. package/dist/im/lark/issue-card.d.ts.map +0 -1
  1715. package/dist/im/lark/issue-card.js +0 -542
  1716. package/dist/im/lark/issue-card.js.map +0 -1
  1717. package/dist/im/lark/issue-command-deps.d.ts +0 -41
  1718. package/dist/im/lark/issue-command-deps.d.ts.map +0 -1
  1719. package/dist/im/lark/issue-command-deps.js +0 -195
  1720. package/dist/im/lark/issue-command-deps.js.map +0 -1
  1721. package/dist/im/lark/issue-command.d.ts +0 -137
  1722. package/dist/im/lark/issue-command.d.ts.map +0 -1
  1723. package/dist/im/lark/issue-command.js +0 -335
  1724. package/dist/im/lark/issue-command.js.map +0 -1
  1725. package/dist/im/lark/lark-hosts.d.ts +0 -49
  1726. package/dist/im/lark/lark-hosts.d.ts.map +0 -1
  1727. package/dist/im/lark/lark-hosts.js +0 -59
  1728. package/dist/im/lark/lark-hosts.js.map +0 -1
  1729. package/dist/im/lark/md-card.d.ts +0 -192
  1730. package/dist/im/lark/md-card.d.ts.map +0 -1
  1731. package/dist/im/lark/md-card.js +0 -872
  1732. package/dist/im/lark/md-card.js.map +0 -1
  1733. package/dist/im/lark/mention-targets.d.ts +0 -43
  1734. package/dist/im/lark/mention-targets.d.ts.map +0 -1
  1735. package/dist/im/lark/mention-targets.js +0 -190
  1736. package/dist/im/lark/mention-targets.js.map +0 -1
  1737. package/dist/im/lark/merge-forward.d.ts +0 -32
  1738. package/dist/im/lark/merge-forward.d.ts.map +0 -1
  1739. package/dist/im/lark/merge-forward.js +0 -140
  1740. package/dist/im/lark/merge-forward.js.map +0 -1
  1741. package/dist/im/lark/message-parser.d.ts +0 -272
  1742. package/dist/im/lark/message-parser.d.ts.map +0 -1
  1743. package/dist/im/lark/message-parser.js +0 -1261
  1744. package/dist/im/lark/message-parser.js.map +0 -1
  1745. package/dist/im/lark/overload-nonce.d.ts +0 -19
  1746. package/dist/im/lark/overload-nonce.d.ts.map +0 -1
  1747. package/dist/im/lark/overload-nonce.js +0 -72
  1748. package/dist/im/lark/overload-nonce.js.map +0 -1
  1749. package/dist/im/lark/overview-card.d.ts +0 -100
  1750. package/dist/im/lark/overview-card.d.ts.map +0 -1
  1751. package/dist/im/lark/overview-card.js +0 -428
  1752. package/dist/im/lark/overview-card.js.map +0 -1
  1753. package/dist/im/lark/quote-hint.d.ts +0 -19
  1754. package/dist/im/lark/quote-hint.d.ts.map +0 -1
  1755. package/dist/im/lark/quote-hint.js +0 -24
  1756. package/dist/im/lark/quote-hint.js.map +0 -1
  1757. package/dist/im/lark/relay-target-routing.d.ts +0 -17
  1758. package/dist/im/lark/relay-target-routing.d.ts.map +0 -1
  1759. package/dist/im/lark/relay-target-routing.js +0 -74
  1760. package/dist/im/lark/relay-target-routing.js.map +0 -1
  1761. package/dist/im/lark/reply-card-footer-signature.d.ts +0 -7
  1762. package/dist/im/lark/reply-card-footer-signature.d.ts.map +0 -1
  1763. package/dist/im/lark/reply-card-footer-signature.js +0 -7
  1764. package/dist/im/lark/reply-card-footer-signature.js.map +0 -1
  1765. package/dist/im/lark/reply-mode-command.d.ts +0 -2
  1766. package/dist/im/lark/reply-mode-command.d.ts.map +0 -1
  1767. package/dist/im/lark/reply-mode-command.js +0 -108
  1768. package/dist/im/lark/reply-mode-command.js.map +0 -1
  1769. package/dist/im/lark/schedules-card.d.ts +0 -96
  1770. package/dist/im/lark/schedules-card.d.ts.map +0 -1
  1771. package/dist/im/lark/schedules-card.js +0 -910
  1772. package/dist/im/lark/schedules-card.js.map +0 -1
  1773. package/dist/im/lark/sessions-card.d.ts +0 -117
  1774. package/dist/im/lark/sessions-card.d.ts.map +0 -1
  1775. package/dist/im/lark/sessions-card.js +0 -876
  1776. package/dist/im/lark/sessions-card.js.map +0 -1
  1777. package/dist/im/lark/settings-card.d.ts +0 -125
  1778. package/dist/im/lark/settings-card.d.ts.map +0 -1
  1779. package/dist/im/lark/settings-card.js +0 -434
  1780. package/dist/im/lark/settings-card.js.map +0 -1
  1781. package/dist/im/lark/substitute-command.d.ts +0 -2
  1782. package/dist/im/lark/substitute-command.d.ts.map +0 -1
  1783. package/dist/im/lark/substitute-command.js +0 -68
  1784. package/dist/im/lark/substitute-command.js.map +0 -1
  1785. package/dist/im/lark/summary-command.d.ts +0 -21
  1786. package/dist/im/lark/summary-command.d.ts.map +0 -1
  1787. package/dist/im/lark/summary-command.js +0 -335
  1788. package/dist/im/lark/summary-command.js.map +0 -1
  1789. package/dist/im/lark/topic-root-context.d.ts +0 -35
  1790. package/dist/im/lark/topic-root-context.d.ts.map +0 -1
  1791. package/dist/im/lark/topic-root-context.js +0 -37
  1792. package/dist/im/lark/topic-root-context.js.map +0 -1
  1793. package/dist/im/lark/v3-blocked-card-handler.d.ts +0 -28
  1794. package/dist/im/lark/v3-blocked-card-handler.d.ts.map +0 -1
  1795. package/dist/im/lark/v3-blocked-card-handler.js +0 -134
  1796. package/dist/im/lark/v3-blocked-card-handler.js.map +0 -1
  1797. package/dist/im/lark/v3-blocked-card.d.ts +0 -76
  1798. package/dist/im/lark/v3-blocked-card.d.ts.map +0 -1
  1799. package/dist/im/lark/v3-blocked-card.js +0 -224
  1800. package/dist/im/lark/v3-blocked-card.js.map +0 -1
  1801. package/dist/im/lark/v3-distillation-card-handler.d.ts +0 -12
  1802. package/dist/im/lark/v3-distillation-card-handler.d.ts.map +0 -1
  1803. package/dist/im/lark/v3-distillation-card-handler.js +0 -107
  1804. package/dist/im/lark/v3-distillation-card-handler.js.map +0 -1
  1805. package/dist/im/lark/v3-distillation-card.d.ts +0 -42
  1806. package/dist/im/lark/v3-distillation-card.d.ts.map +0 -1
  1807. package/dist/im/lark/v3-distillation-card.js +0 -206
  1808. package/dist/im/lark/v3-distillation-card.js.map +0 -1
  1809. package/dist/im/lark/v3-gate-card-handler.d.ts +0 -31
  1810. package/dist/im/lark/v3-gate-card-handler.d.ts.map +0 -1
  1811. package/dist/im/lark/v3-gate-card-handler.js +0 -111
  1812. package/dist/im/lark/v3-gate-card-handler.js.map +0 -1
  1813. package/dist/im/lark/v3-gate-card.d.ts +0 -56
  1814. package/dist/im/lark/v3-gate-card.d.ts.map +0 -1
  1815. package/dist/im/lark/v3-gate-card.js +0 -153
  1816. package/dist/im/lark/v3-gate-card.js.map +0 -1
  1817. package/dist/im/lark/v3-loop-grant-card-handler.d.ts +0 -28
  1818. package/dist/im/lark/v3-loop-grant-card-handler.d.ts.map +0 -1
  1819. package/dist/im/lark/v3-loop-grant-card-handler.js +0 -89
  1820. package/dist/im/lark/v3-loop-grant-card-handler.js.map +0 -1
  1821. package/dist/im/lark/v3-loop-grant-card.d.ts +0 -46
  1822. package/dist/im/lark/v3-loop-grant-card.d.ts.map +0 -1
  1823. package/dist/im/lark/v3-loop-grant-card.js +0 -120
  1824. package/dist/im/lark/v3-loop-grant-card.js.map +0 -1
  1825. package/dist/im/lark/v3-progress-card-manager.d.ts +0 -79
  1826. package/dist/im/lark/v3-progress-card-manager.d.ts.map +0 -1
  1827. package/dist/im/lark/v3-progress-card-manager.js +0 -444
  1828. package/dist/im/lark/v3-progress-card-manager.js.map +0 -1
  1829. package/dist/im/lark/v3-progress-card.d.ts +0 -26
  1830. package/dist/im/lark/v3-progress-card.d.ts.map +0 -1
  1831. package/dist/im/lark/v3-progress-card.js +0 -217
  1832. package/dist/im/lark/v3-progress-card.js.map +0 -1
  1833. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts +0 -29
  1834. package/dist/im/lark/v3-revisit-grant-card-handler.d.ts.map +0 -1
  1835. package/dist/im/lark/v3-revisit-grant-card-handler.js +0 -95
  1836. package/dist/im/lark/v3-revisit-grant-card-handler.js.map +0 -1
  1837. package/dist/im/lark/v3-revisit-grant-card.d.ts +0 -52
  1838. package/dist/im/lark/v3-revisit-grant-card.d.ts.map +0 -1
  1839. package/dist/im/lark/v3-revisit-grant-card.js +0 -124
  1840. package/dist/im/lark/v3-revisit-grant-card.js.map +0 -1
  1841. package/dist/im/lark/v3-run-save-card-handler.d.ts +0 -12
  1842. package/dist/im/lark/v3-run-save-card-handler.d.ts.map +0 -1
  1843. package/dist/im/lark/v3-run-save-card-handler.js +0 -160
  1844. package/dist/im/lark/v3-run-save-card-handler.js.map +0 -1
  1845. package/dist/im/lark/v3-run-save-card.d.ts +0 -38
  1846. package/dist/im/lark/v3-run-save-card.d.ts.map +0 -1
  1847. package/dist/im/lark/v3-run-save-card.js +0 -125
  1848. package/dist/im/lark/v3-run-save-card.js.map +0 -1
  1849. package/dist/im/lark/v3-saved-workflow-command.d.ts +0 -36
  1850. package/dist/im/lark/v3-saved-workflow-command.d.ts.map +0 -1
  1851. package/dist/im/lark/v3-saved-workflow-command.js +0 -186
  1852. package/dist/im/lark/v3-saved-workflow-command.js.map +0 -1
  1853. package/dist/im/lark/v3-saved-workflow-handler.d.ts +0 -89
  1854. package/dist/im/lark/v3-saved-workflow-handler.d.ts.map +0 -1
  1855. package/dist/im/lark/v3-saved-workflow-handler.js +0 -212
  1856. package/dist/im/lark/v3-saved-workflow-handler.js.map +0 -1
  1857. package/dist/im/lark/workflow-slash-command.d.ts +0 -18
  1858. package/dist/im/lark/workflow-slash-command.d.ts.map +0 -1
  1859. package/dist/im/lark/workflow-slash-command.js +0 -36
  1860. package/dist/im/lark/workflow-slash-command.js.map +0 -1
  1861. package/dist/im/types.d.ts +0 -79
  1862. package/dist/im/types.d.ts.map +0 -1
  1863. package/dist/im/types.js +0 -2
  1864. package/dist/im/types.js.map +0 -1
  1865. package/dist/index-core-only.d.ts +0 -3
  1866. package/dist/index-core-only.d.ts.map +0 -1
  1867. package/dist/index-core-only.js +0 -118
  1868. package/dist/index-core-only.js.map +0 -1
  1869. package/dist/index-daemon.d.ts +0 -3
  1870. package/dist/index-daemon.d.ts.map +0 -1
  1871. package/dist/index-daemon.js +0 -64
  1872. package/dist/index-daemon.js.map +0 -1
  1873. package/dist/mir-local-runtime.d.ts +0 -60
  1874. package/dist/mir-local-runtime.d.ts.map +0 -1
  1875. package/dist/mir-local-runtime.js +0 -362
  1876. package/dist/mir-local-runtime.js.map +0 -1
  1877. package/dist/mir-prompt.d.ts +0 -16
  1878. package/dist/mir-prompt.d.ts.map +0 -1
  1879. package/dist/mir-prompt.js +0 -170
  1880. package/dist/mir-prompt.js.map +0 -1
  1881. package/dist/mir-runner.d.ts +0 -3
  1882. package/dist/mir-runner.d.ts.map +0 -1
  1883. package/dist/mir-runner.js +0 -369
  1884. package/dist/mir-runner.js.map +0 -1
  1885. package/dist/mira-output.d.ts +0 -3
  1886. package/dist/mira-output.d.ts.map +0 -1
  1887. package/dist/mira-output.js +0 -136
  1888. package/dist/mira-output.js.map +0 -1
  1889. package/dist/mira-runner.d.ts +0 -3
  1890. package/dist/mira-runner.d.ts.map +0 -1
  1891. package/dist/mira-runner.js +0 -530
  1892. package/dist/mira-runner.js.map +0 -1
  1893. package/dist/platform/bind.d.ts +0 -5
  1894. package/dist/platform/bind.d.ts.map +0 -1
  1895. package/dist/platform/bind.js +0 -157
  1896. package/dist/platform/bind.js.map +0 -1
  1897. package/dist/platform/binding.d.ts +0 -47
  1898. package/dist/platform/binding.d.ts.map +0 -1
  1899. package/dist/platform/binding.js +0 -84
  1900. package/dist/platform/binding.js.map +0 -1
  1901. package/dist/platform/device-command.d.ts +0 -35
  1902. package/dist/platform/device-command.d.ts.map +0 -1
  1903. package/dist/platform/device-command.js +0 -187
  1904. package/dist/platform/device-command.js.map +0 -1
  1905. package/dist/platform/device-enroll.d.ts +0 -156
  1906. package/dist/platform/device-enroll.d.ts.map +0 -1
  1907. package/dist/platform/device-enroll.js +0 -781
  1908. package/dist/platform/device-enroll.js.map +0 -1
  1909. package/dist/platform/device-isolation-activation-client.d.ts +0 -28
  1910. package/dist/platform/device-isolation-activation-client.d.ts.map +0 -1
  1911. package/dist/platform/device-isolation-activation-client.js +0 -279
  1912. package/dist/platform/device-isolation-activation-client.js.map +0 -1
  1913. package/dist/platform/device-isolation.d.ts +0 -35
  1914. package/dist/platform/device-isolation.d.ts.map +0 -1
  1915. package/dist/platform/device-isolation.js +0 -90
  1916. package/dist/platform/device-isolation.js.map +0 -1
  1917. package/dist/platform/device-paths.d.ts +0 -9
  1918. package/dist/platform/device-paths.d.ts.map +0 -1
  1919. package/dist/platform/device-paths.js +0 -14
  1920. package/dist/platform/device-paths.js.map +0 -1
  1921. package/dist/platform/device.d.ts +0 -77
  1922. package/dist/platform/device.d.ts.map +0 -1
  1923. package/dist/platform/device.js +0 -212
  1924. package/dist/platform/device.js.map +0 -1
  1925. package/dist/platform/host-command-context.d.ts +0 -15
  1926. package/dist/platform/host-command-context.d.ts.map +0 -1
  1927. package/dist/platform/host-command-context.js +0 -26
  1928. package/dist/platform/host-command-context.js.map +0 -1
  1929. package/dist/platform/issue-client.d.ts +0 -201
  1930. package/dist/platform/issue-client.d.ts.map +0 -1
  1931. package/dist/platform/issue-client.js +0 -142
  1932. package/dist/platform/issue-client.js.map +0 -1
  1933. package/dist/platform/platform-http.d.ts +0 -15
  1934. package/dist/platform/platform-http.d.ts.map +0 -1
  1935. package/dist/platform/platform-http.js +0 -77
  1936. package/dist/platform/platform-http.js.map +0 -1
  1937. package/dist/platform/secure-host-file.d.ts +0 -12
  1938. package/dist/platform/secure-host-file.d.ts.map +0 -1
  1939. package/dist/platform/secure-host-file.js +0 -301
  1940. package/dist/platform/secure-host-file.js.map +0 -1
  1941. package/dist/platform/tunnel-client.d.ts +0 -41
  1942. package/dist/platform/tunnel-client.d.ts.map +0 -1
  1943. package/dist/platform/tunnel-client.js +0 -493
  1944. package/dist/platform/tunnel-client.js.map +0 -1
  1945. package/dist/pm2-graceful-exit.d.ts +0 -28
  1946. package/dist/pm2-graceful-exit.d.ts.map +0 -1
  1947. package/dist/pm2-graceful-exit.js +0 -39
  1948. package/dist/pm2-graceful-exit.js.map +0 -1
  1949. package/dist/services/adopt-picker.d.ts +0 -41
  1950. package/dist/services/adopt-picker.d.ts.map +0 -1
  1951. package/dist/services/adopt-picker.js +0 -70
  1952. package/dist/services/adopt-picker.js.map +0 -1
  1953. package/dist/services/aiden-checkpoints.d.ts +0 -5
  1954. package/dist/services/aiden-checkpoints.d.ts.map +0 -1
  1955. package/dist/services/aiden-checkpoints.js +0 -91
  1956. package/dist/services/aiden-checkpoints.js.map +0 -1
  1957. package/dist/services/allowed-chat-groups.d.ts +0 -11
  1958. package/dist/services/allowed-chat-groups.d.ts.map +0 -1
  1959. package/dist/services/allowed-chat-groups.js +0 -20
  1960. package/dist/services/allowed-chat-groups.js.map +0 -1
  1961. package/dist/services/async-trigger-state.d.ts +0 -90
  1962. package/dist/services/async-trigger-state.d.ts.map +0 -1
  1963. package/dist/services/async-trigger-state.js +0 -96
  1964. package/dist/services/async-trigger-state.js.map +0 -1
  1965. package/dist/services/async-trigger-store.d.ts +0 -36
  1966. package/dist/services/async-trigger-store.d.ts.map +0 -1
  1967. package/dist/services/async-trigger-store.js +0 -121
  1968. package/dist/services/async-trigger-store.js.map +0 -1
  1969. package/dist/services/backend-availability.d.ts +0 -29
  1970. package/dist/services/backend-availability.d.ts.map +0 -1
  1971. package/dist/services/backend-availability.js +0 -55
  1972. package/dist/services/backend-availability.js.map +0 -1
  1973. package/dist/services/backend-type-store.d.ts +0 -33
  1974. package/dist/services/backend-type-store.d.ts.map +0 -1
  1975. package/dist/services/backend-type-store.js +0 -43
  1976. package/dist/services/backend-type-store.js.map +0 -1
  1977. package/dist/services/bot-config-store.d.ts +0 -155
  1978. package/dist/services/bot-config-store.d.ts.map +0 -1
  1979. package/dist/services/bot-config-store.js +0 -384
  1980. package/dist/services/bot-config-store.js.map +0 -1
  1981. package/dist/services/bot-owner-store.d.ts +0 -28
  1982. package/dist/services/bot-owner-store.d.ts.map +0 -1
  1983. package/dist/services/bot-owner-store.js +0 -82
  1984. package/dist/services/bot-owner-store.js.map +0 -1
  1985. package/dist/services/bot-profile-store.d.ts +0 -16
  1986. package/dist/services/bot-profile-store.d.ts.map +0 -1
  1987. package/dist/services/bot-profile-store.js +0 -98
  1988. package/dist/services/bot-profile-store.js.map +0 -1
  1989. package/dist/services/bot-union-ids-store.d.ts +0 -24
  1990. package/dist/services/bot-union-ids-store.d.ts.map +0 -1
  1991. package/dist/services/bot-union-ids-store.js +0 -79
  1992. package/dist/services/bot-union-ids-store.js.map +0 -1
  1993. package/dist/services/brand-store.d.ts +0 -15
  1994. package/dist/services/brand-store.d.ts.map +0 -1
  1995. package/dist/services/brand-store.js +0 -47
  1996. package/dist/services/brand-store.js.map +0 -1
  1997. package/dist/services/bridge-fallback-gate.d.ts +0 -72
  1998. package/dist/services/bridge-fallback-gate.d.ts.map +0 -1
  1999. package/dist/services/bridge-fallback-gate.js +0 -190
  2000. package/dist/services/bridge-fallback-gate.js.map +0 -1
  2001. package/dist/services/bridge-rotation-policy.d.ts +0 -179
  2002. package/dist/services/bridge-rotation-policy.d.ts.map +0 -1
  2003. package/dist/services/bridge-rotation-policy.js +0 -163
  2004. package/dist/services/bridge-rotation-policy.js.map +0 -1
  2005. package/dist/services/bridge-turn-queue.d.ts +0 -198
  2006. package/dist/services/bridge-turn-queue.d.ts.map +0 -1
  2007. package/dist/services/bridge-turn-queue.js +0 -430
  2008. package/dist/services/bridge-turn-queue.js.map +0 -1
  2009. package/dist/services/card-mode-store.d.ts +0 -13
  2010. package/dist/services/card-mode-store.d.ts.map +0 -1
  2011. package/dist/services/card-mode-store.js +0 -52
  2012. package/dist/services/card-mode-store.js.map +0 -1
  2013. package/dist/services/card-prefs-store.d.ts +0 -55
  2014. package/dist/services/card-prefs-store.d.ts.map +0 -1
  2015. package/dist/services/card-prefs-store.js +0 -269
  2016. package/dist/services/card-prefs-store.js.map +0 -1
  2017. package/dist/services/chat-first-seen-store.d.ts +0 -27
  2018. package/dist/services/chat-first-seen-store.d.ts.map +0 -1
  2019. package/dist/services/chat-first-seen-store.js +0 -114
  2020. package/dist/services/chat-first-seen-store.js.map +0 -1
  2021. package/dist/services/chat-reply-mode-store.d.ts +0 -30
  2022. package/dist/services/chat-reply-mode-store.d.ts.map +0 -1
  2023. package/dist/services/chat-reply-mode-store.js +0 -135
  2024. package/dist/services/chat-reply-mode-store.js.map +0 -1
  2025. package/dist/services/claude-transcript.d.ts +0 -323
  2026. package/dist/services/claude-transcript.d.ts.map +0 -1
  2027. package/dist/services/claude-transcript.js +0 -930
  2028. package/dist/services/claude-transcript.js.map +0 -1
  2029. package/dist/services/coco-paths.d.ts +0 -10
  2030. package/dist/services/coco-paths.d.ts.map +0 -1
  2031. package/dist/services/coco-paths.js +0 -16
  2032. package/dist/services/coco-paths.js.map +0 -1
  2033. package/dist/services/coco-transcript.d.ts +0 -35
  2034. package/dist/services/coco-transcript.d.ts.map +0 -1
  2035. package/dist/services/coco-transcript.js +0 -183
  2036. package/dist/services/coco-transcript.js.map +0 -1
  2037. package/dist/services/codex-app-runner-protocol.d.ts +0 -70
  2038. package/dist/services/codex-app-runner-protocol.d.ts.map +0 -1
  2039. package/dist/services/codex-app-runner-protocol.js +0 -187
  2040. package/dist/services/codex-app-runner-protocol.js.map +0 -1
  2041. package/dist/services/codex-app-threads.d.ts +0 -67
  2042. package/dist/services/codex-app-threads.d.ts.map +0 -1
  2043. package/dist/services/codex-app-threads.js +0 -657
  2044. package/dist/services/codex-app-threads.js.map +0 -1
  2045. package/dist/services/codex-app-token-usage.d.ts +0 -93
  2046. package/dist/services/codex-app-token-usage.d.ts.map +0 -1
  2047. package/dist/services/codex-app-token-usage.js +0 -190
  2048. package/dist/services/codex-app-token-usage.js.map +0 -1
  2049. package/dist/services/codex-app-turn-controller.d.ts +0 -72
  2050. package/dist/services/codex-app-turn-controller.d.ts.map +0 -1
  2051. package/dist/services/codex-app-turn-controller.js +0 -524
  2052. package/dist/services/codex-app-turn-controller.js.map +0 -1
  2053. package/dist/services/codex-bridge-queue.d.ts +0 -73
  2054. package/dist/services/codex-bridge-queue.d.ts.map +0 -1
  2055. package/dist/services/codex-bridge-queue.js +0 -273
  2056. package/dist/services/codex-bridge-queue.js.map +0 -1
  2057. package/dist/services/codex-composer-state.d.ts +0 -27
  2058. package/dist/services/codex-composer-state.d.ts.map +0 -1
  2059. package/dist/services/codex-composer-state.js +0 -53
  2060. package/dist/services/codex-composer-state.js.map +0 -1
  2061. package/dist/services/codex-paths.d.ts +0 -7
  2062. package/dist/services/codex-paths.d.ts.map +0 -1
  2063. package/dist/services/codex-paths.js +0 -19
  2064. package/dist/services/codex-paths.js.map +0 -1
  2065. package/dist/services/codex-runner-freshness.d.ts +0 -39
  2066. package/dist/services/codex-runner-freshness.d.ts.map +0 -1
  2067. package/dist/services/codex-runner-freshness.js +0 -78
  2068. package/dist/services/codex-runner-freshness.js.map +0 -1
  2069. package/dist/services/codex-service-tier.d.ts +0 -44
  2070. package/dist/services/codex-service-tier.d.ts.map +0 -1
  2071. package/dist/services/codex-service-tier.js +0 -63
  2072. package/dist/services/codex-service-tier.js.map +0 -1
  2073. package/dist/services/codex-transcript.d.ts +0 -140
  2074. package/dist/services/codex-transcript.d.ts.map +0 -1
  2075. package/dist/services/codex-transcript.js +0 -631
  2076. package/dist/services/codex-transcript.js.map +0 -1
  2077. package/dist/services/config-store.d.ts +0 -19
  2078. package/dist/services/config-store.d.ts.map +0 -1
  2079. package/dist/services/config-store.js +0 -52
  2080. package/dist/services/config-store.js.map +0 -1
  2081. package/dist/services/connector-store.d.ts +0 -71
  2082. package/dist/services/connector-store.d.ts.map +0 -1
  2083. package/dist/services/connector-store.js +0 -79
  2084. package/dist/services/connector-store.js.map +0 -1
  2085. package/dist/services/cursor-resume-policy.d.ts +0 -12
  2086. package/dist/services/cursor-resume-policy.d.ts.map +0 -1
  2087. package/dist/services/cursor-resume-policy.js +0 -15
  2088. package/dist/services/cursor-resume-policy.js.map +0 -1
  2089. package/dist/services/cursor-transcript.d.ts +0 -47
  2090. package/dist/services/cursor-transcript.d.ts.map +0 -1
  2091. package/dist/services/cursor-transcript.js +0 -324
  2092. package/dist/services/cursor-transcript.js.map +0 -1
  2093. package/dist/services/default-worktree.d.ts +0 -28
  2094. package/dist/services/default-worktree.d.ts.map +0 -1
  2095. package/dist/services/default-worktree.js +0 -102
  2096. package/dist/services/default-worktree.js.map +0 -1
  2097. package/dist/services/deployment-identity.d.ts +0 -22
  2098. package/dist/services/deployment-identity.d.ts.map +0 -1
  2099. package/dist/services/deployment-identity.js +0 -67
  2100. package/dist/services/deployment-identity.js.map +0 -1
  2101. package/dist/services/doc-subs-store.d.ts +0 -63
  2102. package/dist/services/doc-subs-store.d.ts.map +0 -1
  2103. package/dist/services/doc-subs-store.js +0 -95
  2104. package/dist/services/doc-subs-store.js.map +0 -1
  2105. package/dist/services/exact-chat-grant.d.ts +0 -83
  2106. package/dist/services/exact-chat-grant.d.ts.map +0 -1
  2107. package/dist/services/exact-chat-grant.js +0 -249
  2108. package/dist/services/exact-chat-grant.js.map +0 -1
  2109. package/dist/services/federation-membership-store.d.ts +0 -23
  2110. package/dist/services/federation-membership-store.d.ts.map +0 -1
  2111. package/dist/services/federation-membership-store.js +0 -66
  2112. package/dist/services/federation-membership-store.js.map +0 -1
  2113. package/dist/services/federation-roster.d.ts +0 -58
  2114. package/dist/services/federation-roster.d.ts.map +0 -1
  2115. package/dist/services/federation-roster.js +0 -59
  2116. package/dist/services/federation-roster.js.map +0 -1
  2117. package/dist/services/federation-store.d.ts +0 -87
  2118. package/dist/services/federation-store.d.ts.map +0 -1
  2119. package/dist/services/federation-store.js +0 -143
  2120. package/dist/services/federation-store.js.map +0 -1
  2121. package/dist/services/file-bridge-path.d.ts +0 -8
  2122. package/dist/services/file-bridge-path.d.ts.map +0 -1
  2123. package/dist/services/file-bridge-path.js +0 -75
  2124. package/dist/services/file-bridge-path.js.map +0 -1
  2125. package/dist/services/frozen-card-store.d.ts +0 -8
  2126. package/dist/services/frozen-card-store.d.ts.map +0 -1
  2127. package/dist/services/frozen-card-store.js +0 -66
  2128. package/dist/services/frozen-card-store.js.map +0 -1
  2129. package/dist/services/git-worktree.d.ts +0 -63
  2130. package/dist/services/git-worktree.d.ts.map +0 -1
  2131. package/dist/services/git-worktree.js +0 -246
  2132. package/dist/services/git-worktree.js.map +0 -1
  2133. package/dist/services/grant-policy.d.ts +0 -13
  2134. package/dist/services/grant-policy.d.ts.map +0 -1
  2135. package/dist/services/grant-policy.js +0 -40
  2136. package/dist/services/grant-policy.js.map +0 -1
  2137. package/dist/services/grant-prefs-store.d.ts +0 -26
  2138. package/dist/services/grant-prefs-store.d.ts.map +0 -1
  2139. package/dist/services/grant-prefs-store.js +0 -109
  2140. package/dist/services/grant-prefs-store.js.map +0 -1
  2141. package/dist/services/grant-store.d.ts +0 -103
  2142. package/dist/services/grant-store.d.ts.map +0 -1
  2143. package/dist/services/grant-store.js +0 -580
  2144. package/dist/services/grant-store.js.map +0 -1
  2145. package/dist/services/grok-paths.d.ts +0 -27
  2146. package/dist/services/grok-paths.d.ts.map +0 -1
  2147. package/dist/services/grok-paths.js +0 -106
  2148. package/dist/services/grok-paths.js.map +0 -1
  2149. package/dist/services/grok-transcript.d.ts +0 -68
  2150. package/dist/services/grok-transcript.d.ts.map +0 -1
  2151. package/dist/services/grok-transcript.js +0 -681
  2152. package/dist/services/grok-transcript.js.map +0 -1
  2153. package/dist/services/group-creator.d.ts +0 -87
  2154. package/dist/services/group-creator.d.ts.map +0 -1
  2155. package/dist/services/group-creator.js +0 -288
  2156. package/dist/services/group-creator.js.map +0 -1
  2157. package/dist/services/groups-store.d.ts +0 -194
  2158. package/dist/services/groups-store.d.ts.map +0 -1
  2159. package/dist/services/groups-store.js +0 -493
  2160. package/dist/services/groups-store.js.map +0 -1
  2161. package/dist/services/hermes-session-filter.d.ts +0 -28
  2162. package/dist/services/hermes-session-filter.d.ts.map +0 -1
  2163. package/dist/services/hermes-session-filter.js +0 -53
  2164. package/dist/services/hermes-session-filter.js.map +0 -1
  2165. package/dist/services/hermes-transcript.d.ts +0 -11
  2166. package/dist/services/hermes-transcript.d.ts.map +0 -1
  2167. package/dist/services/hermes-transcript.js +0 -184
  2168. package/dist/services/hermes-transcript.js.map +0 -1
  2169. package/dist/services/hook-runner.d.ts +0 -53
  2170. package/dist/services/hook-runner.d.ts.map +0 -1
  2171. package/dist/services/hook-runner.js +0 -451
  2172. package/dist/services/hook-runner.js.map +0 -1
  2173. package/dist/services/insight/antigravity-span-reader.d.ts +0 -3
  2174. package/dist/services/insight/antigravity-span-reader.d.ts.map +0 -1
  2175. package/dist/services/insight/antigravity-span-reader.js +0 -249
  2176. package/dist/services/insight/antigravity-span-reader.js.map +0 -1
  2177. package/dist/services/insight/classify.d.ts +0 -9
  2178. package/dist/services/insight/classify.d.ts.map +0 -1
  2179. package/dist/services/insight/classify.js +0 -71
  2180. package/dist/services/insight/classify.js.map +0 -1
  2181. package/dist/services/insight/claude-span-reader.d.ts +0 -3
  2182. package/dist/services/insight/claude-span-reader.d.ts.map +0 -1
  2183. package/dist/services/insight/claude-span-reader.js +0 -276
  2184. package/dist/services/insight/claude-span-reader.js.map +0 -1
  2185. package/dist/services/insight/codex-span-reader.d.ts +0 -3
  2186. package/dist/services/insight/codex-span-reader.d.ts.map +0 -1
  2187. package/dist/services/insight/codex-span-reader.js +0 -306
  2188. package/dist/services/insight/codex-span-reader.js.map +0 -1
  2189. package/dist/services/insight/intent.d.ts +0 -5
  2190. package/dist/services/insight/intent.d.ts.map +0 -1
  2191. package/dist/services/insight/intent.js +0 -145
  2192. package/dist/services/insight/intent.js.map +0 -1
  2193. package/dist/services/insight/jsonl.d.ts +0 -10
  2194. package/dist/services/insight/jsonl.d.ts.map +0 -1
  2195. package/dist/services/insight/jsonl.js +0 -36
  2196. package/dist/services/insight/jsonl.js.map +0 -1
  2197. package/dist/services/insight/prompt.d.ts +0 -3
  2198. package/dist/services/insight/prompt.d.ts.map +0 -1
  2199. package/dist/services/insight/prompt.js +0 -99
  2200. package/dist/services/insight/prompt.js.map +0 -1
  2201. package/dist/services/insight/redact.d.ts +0 -4
  2202. package/dist/services/insight/redact.d.ts.map +0 -1
  2203. package/dist/services/insight/redact.js +0 -67
  2204. package/dist/services/insight/redact.js.map +0 -1
  2205. package/dist/services/insight/report.d.ts +0 -29
  2206. package/dist/services/insight/report.d.ts.map +0 -1
  2207. package/dist/services/insight/report.js +0 -1247
  2208. package/dist/services/insight/report.js.map +0 -1
  2209. package/dist/services/insight/safe-detail.d.ts +0 -5
  2210. package/dist/services/insight/safe-detail.d.ts.map +0 -1
  2211. package/dist/services/insight/safe-detail.js +0 -59
  2212. package/dist/services/insight/safe-detail.js.map +0 -1
  2213. package/dist/services/insight/scrub.d.ts +0 -22
  2214. package/dist/services/insight/scrub.d.ts.map +0 -1
  2215. package/dist/services/insight/scrub.js +0 -70
  2216. package/dist/services/insight/scrub.js.map +0 -1
  2217. package/dist/services/insight/subagent-reader.d.ts +0 -19
  2218. package/dist/services/insight/subagent-reader.d.ts.map +0 -1
  2219. package/dist/services/insight/subagent-reader.js +0 -111
  2220. package/dist/services/insight/subagent-reader.js.map +0 -1
  2221. package/dist/services/insight/types.d.ts +0 -448
  2222. package/dist/services/insight/types.d.ts.map +0 -1
  2223. package/dist/services/insight/types.js +0 -2
  2224. package/dist/services/insight/types.js.map +0 -1
  2225. package/dist/services/invite-store.d.ts +0 -28
  2226. package/dist/services/invite-store.d.ts.map +0 -1
  2227. package/dist/services/invite-store.js +0 -85
  2228. package/dist/services/invite-store.js.map +0 -1
  2229. package/dist/services/issue-board-store.d.ts +0 -214
  2230. package/dist/services/issue-board-store.d.ts.map +0 -1
  2231. package/dist/services/issue-board-store.js +0 -472
  2232. package/dist/services/issue-board-store.js.map +0 -1
  2233. package/dist/services/issue-claim-flow.d.ts +0 -160
  2234. package/dist/services/issue-claim-flow.d.ts.map +0 -1
  2235. package/dist/services/issue-claim-flow.js +0 -222
  2236. package/dist/services/issue-claim-flow.js.map +0 -1
  2237. package/dist/services/issue-outbox-pump.d.ts +0 -25
  2238. package/dist/services/issue-outbox-pump.d.ts.map +0 -1
  2239. package/dist/services/issue-outbox-pump.js +0 -102
  2240. package/dist/services/issue-outbox-pump.js.map +0 -1
  2241. package/dist/services/issue-release.d.ts +0 -78
  2242. package/dist/services/issue-release.d.ts.map +0 -1
  2243. package/dist/services/issue-release.js +0 -89
  2244. package/dist/services/issue-release.js.map +0 -1
  2245. package/dist/services/issue-report.d.ts +0 -72
  2246. package/dist/services/issue-report.d.ts.map +0 -1
  2247. package/dist/services/issue-report.js +0 -84
  2248. package/dist/services/issue-report.js.map +0 -1
  2249. package/dist/services/issue-status-view.d.ts +0 -52
  2250. package/dist/services/issue-status-view.d.ts.map +0 -1
  2251. package/dist/services/issue-status-view.js +0 -42
  2252. package/dist/services/issue-status-view.js.map +0 -1
  2253. package/dist/services/issue-status-writer.d.ts +0 -98
  2254. package/dist/services/issue-status-writer.d.ts.map +0 -1
  2255. package/dist/services/issue-status-writer.js +0 -123
  2256. package/dist/services/issue-status-writer.js.map +0 -1
  2257. package/dist/services/jsonl-cursor.d.ts +0 -24
  2258. package/dist/services/jsonl-cursor.d.ts.map +0 -1
  2259. package/dist/services/jsonl-cursor.js +0 -110
  2260. package/dist/services/jsonl-cursor.js.map +0 -1
  2261. package/dist/services/kiro-session.d.ts +0 -2
  2262. package/dist/services/kiro-session.d.ts.map +0 -1
  2263. package/dist/services/kiro-session.js +0 -19
  2264. package/dist/services/kiro-session.js.map +0 -1
  2265. package/dist/services/local-cli-opener.d.ts +0 -65
  2266. package/dist/services/local-cli-opener.d.ts.map +0 -1
  2267. package/dist/services/local-cli-opener.js +0 -426
  2268. package/dist/services/local-cli-opener.js.map +0 -1
  2269. package/dist/services/message-listener-run-preview-store.d.ts +0 -43
  2270. package/dist/services/message-listener-run-preview-store.d.ts.map +0 -1
  2271. package/dist/services/message-listener-run-preview-store.js +0 -152
  2272. package/dist/services/message-listener-run-preview-store.js.map +0 -1
  2273. package/dist/services/message-listener-store.d.ts +0 -44
  2274. package/dist/services/message-listener-store.d.ts.map +0 -1
  2275. package/dist/services/message-listener-store.js +0 -179
  2276. package/dist/services/message-listener-store.js.map +0 -1
  2277. package/dist/services/message-listener.d.ts +0 -129
  2278. package/dist/services/message-listener.d.ts.map +0 -1
  2279. package/dist/services/message-listener.js +0 -441
  2280. package/dist/services/message-listener.js.map +0 -1
  2281. package/dist/services/message-queue.d.ts +0 -9
  2282. package/dist/services/message-queue.d.ts.map +0 -1
  2283. package/dist/services/message-queue.js +0 -79
  2284. package/dist/services/message-queue.js.map +0 -1
  2285. package/dist/services/mtr-transcript.d.ts +0 -14
  2286. package/dist/services/mtr-transcript.d.ts.map +0 -1
  2287. package/dist/services/mtr-transcript.js +0 -291
  2288. package/dist/services/mtr-transcript.js.map +0 -1
  2289. package/dist/services/observed-bots-store.d.ts +0 -33
  2290. package/dist/services/observed-bots-store.d.ts.map +0 -1
  2291. package/dist/services/observed-bots-store.js +0 -103
  2292. package/dist/services/observed-bots-store.js.map +0 -1
  2293. package/dist/services/oncall-store.d.ts +0 -140
  2294. package/dist/services/oncall-store.d.ts.map +0 -1
  2295. package/dist/services/oncall-store.js +0 -403
  2296. package/dist/services/oncall-store.js.map +0 -1
  2297. package/dist/services/open-platform-rename.d.ts +0 -73
  2298. package/dist/services/open-platform-rename.d.ts.map +0 -1
  2299. package/dist/services/open-platform-rename.js +0 -396
  2300. package/dist/services/open-platform-rename.js.map +0 -1
  2301. package/dist/services/opencode-paths.d.ts +0 -7
  2302. package/dist/services/opencode-paths.d.ts.map +0 -1
  2303. package/dist/services/opencode-paths.js +0 -18
  2304. package/dist/services/opencode-paths.js.map +0 -1
  2305. package/dist/services/overload-alert-migration.d.ts +0 -15
  2306. package/dist/services/overload-alert-migration.d.ts.map +0 -1
  2307. package/dist/services/overload-alert-migration.js +0 -115
  2308. package/dist/services/overload-alert-migration.js.map +0 -1
  2309. package/dist/services/pairing-store.d.ts +0 -47
  2310. package/dist/services/pairing-store.d.ts.map +0 -1
  2311. package/dist/services/pairing-store.js +0 -132
  2312. package/dist/services/pairing-store.js.map +0 -1
  2313. package/dist/services/pi-transcript.d.ts +0 -26
  2314. package/dist/services/pi-transcript.d.ts.map +0 -1
  2315. package/dist/services/pi-transcript.js +0 -327
  2316. package/dist/services/pi-transcript.js.map +0 -1
  2317. package/dist/services/platform-team-store.d.ts +0 -52
  2318. package/dist/services/platform-team-store.d.ts.map +0 -1
  2319. package/dist/services/platform-team-store.js +0 -159
  2320. package/dist/services/platform-team-store.js.map +0 -1
  2321. package/dist/services/plugin-registry-store.d.ts +0 -8
  2322. package/dist/services/plugin-registry-store.d.ts.map +0 -1
  2323. package/dist/services/plugin-registry-store.js +0 -153
  2324. package/dist/services/plugin-registry-store.js.map +0 -1
  2325. package/dist/services/project-scanner.d.ts +0 -28
  2326. package/dist/services/project-scanner.d.ts.map +0 -1
  2327. package/dist/services/project-scanner.js +0 -203
  2328. package/dist/services/project-scanner.js.map +0 -1
  2329. package/dist/services/quota-dedup.d.ts +0 -33
  2330. package/dist/services/quota-dedup.d.ts.map +0 -1
  2331. package/dist/services/quota-dedup.js +0 -67
  2332. package/dist/services/quota-dedup.js.map +0 -1
  2333. package/dist/services/relay-picker.d.ts +0 -27
  2334. package/dist/services/relay-picker.d.ts.map +0 -1
  2335. package/dist/services/relay-picker.js +0 -88
  2336. package/dist/services/relay-picker.js.map +0 -1
  2337. package/dist/services/restart-intent-store.d.ts +0 -41
  2338. package/dist/services/restart-intent-store.d.ts.map +0 -1
  2339. package/dist/services/restart-intent-store.js +0 -194
  2340. package/dist/services/restart-intent-store.js.map +0 -1
  2341. package/dist/services/resumable-session-discovery.d.ts +0 -15
  2342. package/dist/services/resumable-session-discovery.d.ts.map +0 -1
  2343. package/dist/services/resumable-session-discovery.js +0 -357
  2344. package/dist/services/resumable-session-discovery.js.map +0 -1
  2345. package/dist/services/role-profile-store.d.ts +0 -25
  2346. package/dist/services/role-profile-store.d.ts.map +0 -1
  2347. package/dist/services/role-profile-store.js +0 -176
  2348. package/dist/services/role-profile-store.js.map +0 -1
  2349. package/dist/services/sandbox-migration.d.ts +0 -14
  2350. package/dist/services/sandbox-migration.d.ts.map +0 -1
  2351. package/dist/services/sandbox-migration.js +0 -85
  2352. package/dist/services/sandbox-migration.js.map +0 -1
  2353. package/dist/services/sandbox-store.d.ts +0 -50
  2354. package/dist/services/sandbox-store.d.ts.map +0 -1
  2355. package/dist/services/sandbox-store.js +0 -155
  2356. package/dist/services/sandbox-store.js.map +0 -1
  2357. package/dist/services/schedule-split-migration.d.ts +0 -2
  2358. package/dist/services/schedule-split-migration.d.ts.map +0 -1
  2359. package/dist/services/schedule-split-migration.js +0 -159
  2360. package/dist/services/schedule-split-migration.js.map +0 -1
  2361. package/dist/services/schedule-store.d.ts +0 -138
  2362. package/dist/services/schedule-store.d.ts.map +0 -1
  2363. package/dist/services/schedule-store.js +0 -619
  2364. package/dist/services/schedule-store.js.map +0 -1
  2365. package/dist/services/seen-message-store.d.ts +0 -12
  2366. package/dist/services/seen-message-store.d.ts.map +0 -1
  2367. package/dist/services/seen-message-store.js +0 -119
  2368. package/dist/services/seen-message-store.js.map +0 -1
  2369. package/dist/services/send-policy.d.ts +0 -182
  2370. package/dist/services/send-policy.d.ts.map +0 -1
  2371. package/dist/services/send-policy.js +0 -189
  2372. package/dist/services/send-policy.js.map +0 -1
  2373. package/dist/services/session-lifecycle-hooks.d.ts +0 -10
  2374. package/dist/services/session-lifecycle-hooks.d.ts.map +0 -1
  2375. package/dist/services/session-lifecycle-hooks.js +0 -78
  2376. package/dist/services/session-lifecycle-hooks.js.map +0 -1
  2377. package/dist/services/session-store.d.ts +0 -68
  2378. package/dist/services/session-store.d.ts.map +0 -1
  2379. package/dist/services/session-store.js +0 -419
  2380. package/dist/services/session-store.js.map +0 -1
  2381. package/dist/services/skill-registry-store.d.ts +0 -121
  2382. package/dist/services/skill-registry-store.d.ts.map +0 -1
  2383. package/dist/services/skill-registry-store.js +0 -1240
  2384. package/dist/services/skill-registry-store.js.map +0 -1
  2385. package/dist/services/structured-bridge-clis.d.ts +0 -29
  2386. package/dist/services/structured-bridge-clis.d.ts.map +0 -1
  2387. package/dist/services/structured-bridge-clis.js +0 -76
  2388. package/dist/services/structured-bridge-clis.js.map +0 -1
  2389. package/dist/services/submit-confirmation.d.ts +0 -22
  2390. package/dist/services/submit-confirmation.d.ts.map +0 -1
  2391. package/dist/services/submit-confirmation.js +0 -12
  2392. package/dist/services/submit-confirmation.js.map +0 -1
  2393. package/dist/services/substitute-chat-toggle-store.d.ts +0 -3
  2394. package/dist/services/substitute-chat-toggle-store.d.ts.map +0 -1
  2395. package/dist/services/substitute-chat-toggle-store.js +0 -58
  2396. package/dist/services/substitute-chat-toggle-store.js.map +0 -1
  2397. package/dist/services/substitute-mode-normalize.d.ts +0 -25
  2398. package/dist/services/substitute-mode-normalize.d.ts.map +0 -1
  2399. package/dist/services/substitute-mode-normalize.js +0 -80
  2400. package/dist/services/substitute-mode-normalize.js.map +0 -1
  2401. package/dist/services/substitute-mode-store.d.ts +0 -69
  2402. package/dist/services/substitute-mode-store.d.ts.map +0 -1
  2403. package/dist/services/substitute-mode-store.js +0 -142
  2404. package/dist/services/substitute-mode-store.js.map +0 -1
  2405. package/dist/services/summary-range-store.d.ts +0 -21
  2406. package/dist/services/summary-range-store.d.ts.map +0 -1
  2407. package/dist/services/summary-range-store.js +0 -89
  2408. package/dist/services/summary-range-store.js.map +0 -1
  2409. package/dist/services/team-board-store.d.ts +0 -33
  2410. package/dist/services/team-board-store.d.ts.map +0 -1
  2411. package/dist/services/team-board-store.js +0 -88
  2412. package/dist/services/team-board-store.js.map +0 -1
  2413. package/dist/services/team-bot-directory.d.ts +0 -29
  2414. package/dist/services/team-bot-directory.d.ts.map +0 -1
  2415. package/dist/services/team-bot-directory.js +0 -118
  2416. package/dist/services/team-bot-directory.js.map +0 -1
  2417. package/dist/services/team-bots-store.d.ts +0 -34
  2418. package/dist/services/team-bots-store.d.ts.map +0 -1
  2419. package/dist/services/team-bots-store.js +0 -111
  2420. package/dist/services/team-bots-store.js.map +0 -1
  2421. package/dist/services/team-groups-store.d.ts +0 -29
  2422. package/dist/services/team-groups-store.d.ts.map +0 -1
  2423. package/dist/services/team-groups-store.js +0 -70
  2424. package/dist/services/team-groups-store.js.map +0 -1
  2425. package/dist/services/team-roster.d.ts +0 -64
  2426. package/dist/services/team-roster.d.ts.map +0 -1
  2427. package/dist/services/team-roster.js +0 -108
  2428. package/dist/services/team-roster.js.map +0 -1
  2429. package/dist/services/team-store.d.ts +0 -54
  2430. package/dist/services/team-store.d.ts.map +0 -1
  2431. package/dist/services/team-store.js +0 -156
  2432. package/dist/services/team-store.js.map +0 -1
  2433. package/dist/services/traex-paths.d.ts +0 -26
  2434. package/dist/services/traex-paths.d.ts.map +0 -1
  2435. package/dist/services/traex-paths.js +0 -40
  2436. package/dist/services/traex-paths.js.map +0 -1
  2437. package/dist/services/traex-transcript.d.ts +0 -59
  2438. package/dist/services/traex-transcript.d.ts.map +0 -1
  2439. package/dist/services/traex-transcript.js +0 -370
  2440. package/dist/services/traex-transcript.js.map +0 -1
  2441. package/dist/services/traex-user-input.d.ts +0 -19
  2442. package/dist/services/traex-user-input.d.ts.map +0 -1
  2443. package/dist/services/traex-user-input.js +0 -57
  2444. package/dist/services/traex-user-input.js.map +0 -1
  2445. package/dist/services/transcript-resolver.d.ts +0 -35
  2446. package/dist/services/transcript-resolver.d.ts.map +0 -1
  2447. package/dist/services/transcript-resolver.js +0 -297
  2448. package/dist/services/transcript-resolver.js.map +0 -1
  2449. package/dist/services/trigger-log-store.d.ts +0 -105
  2450. package/dist/services/trigger-log-store.d.ts.map +0 -1
  2451. package/dist/services/trigger-log-store.js +0 -203
  2452. package/dist/services/trigger-log-store.js.map +0 -1
  2453. package/dist/services/trigger-types.d.ts +0 -124
  2454. package/dist/services/trigger-types.d.ts.map +0 -1
  2455. package/dist/services/trigger-types.js +0 -72
  2456. package/dist/services/trigger-types.js.map +0 -1
  2457. package/dist/services/turn-terminal-deduper.d.ts +0 -14
  2458. package/dist/services/turn-terminal-deduper.d.ts.map +0 -1
  2459. package/dist/services/turn-terminal-deduper.js +0 -34
  2460. package/dist/services/turn-terminal-deduper.js.map +0 -1
  2461. package/dist/services/usage-ledger.d.ts +0 -112
  2462. package/dist/services/usage-ledger.d.ts.map +0 -1
  2463. package/dist/services/usage-ledger.js +0 -485
  2464. package/dist/services/usage-ledger.js.map +0 -1
  2465. package/dist/services/vc-meeting-action-gate.d.ts +0 -246
  2466. package/dist/services/vc-meeting-action-gate.d.ts.map +0 -1
  2467. package/dist/services/vc-meeting-action-gate.js +0 -756
  2468. package/dist/services/vc-meeting-action-gate.js.map +0 -1
  2469. package/dist/services/vc-meeting-action-store.d.ts +0 -222
  2470. package/dist/services/vc-meeting-action-store.d.ts.map +0 -1
  2471. package/dist/services/vc-meeting-action-store.js +0 -806
  2472. package/dist/services/vc-meeting-action-store.js.map +0 -1
  2473. package/dist/services/vc-meeting-consumer-isolation.d.ts +0 -29
  2474. package/dist/services/vc-meeting-consumer-isolation.d.ts.map +0 -1
  2475. package/dist/services/vc-meeting-consumer-isolation.js +0 -39
  2476. package/dist/services/vc-meeting-consumer-isolation.js.map +0 -1
  2477. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +0 -72
  2478. package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +0 -1
  2479. package/dist/services/vc-meeting-consumer-profile-bootstrap.js +0 -343
  2480. package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +0 -1
  2481. package/dist/services/vc-meeting-consumer-profile-store.d.ts +0 -39
  2482. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +0 -1
  2483. package/dist/services/vc-meeting-consumer-profile-store.js +0 -191
  2484. package/dist/services/vc-meeting-consumer-profile-store.js.map +0 -1
  2485. package/dist/services/vc-meeting-consumer-profile-templates.d.ts +0 -32
  2486. package/dist/services/vc-meeting-consumer-profile-templates.d.ts.map +0 -1
  2487. package/dist/services/vc-meeting-consumer-profile-templates.js +0 -106
  2488. package/dist/services/vc-meeting-consumer-profile-templates.js.map +0 -1
  2489. package/dist/services/vc-meeting-daemon-auth.d.ts +0 -29
  2490. package/dist/services/vc-meeting-daemon-auth.d.ts.map +0 -1
  2491. package/dist/services/vc-meeting-daemon-auth.js +0 -117
  2492. package/dist/services/vc-meeting-daemon-auth.js.map +0 -1
  2493. package/dist/services/vc-meeting-delivery-feed.d.ts +0 -52
  2494. package/dist/services/vc-meeting-delivery-feed.d.ts.map +0 -1
  2495. package/dist/services/vc-meeting-delivery-feed.js +0 -232
  2496. package/dist/services/vc-meeting-delivery-feed.js.map +0 -1
  2497. package/dist/services/vc-meeting-delivery-hub-store.d.ts +0 -215
  2498. package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +0 -1
  2499. package/dist/services/vc-meeting-delivery-hub-store.js +0 -1241
  2500. package/dist/services/vc-meeting-delivery-hub-store.js.map +0 -1
  2501. package/dist/services/vc-meeting-delivery-protocol.d.ts +0 -166
  2502. package/dist/services/vc-meeting-delivery-protocol.d.ts.map +0 -1
  2503. package/dist/services/vc-meeting-delivery-protocol.js +0 -452
  2504. package/dist/services/vc-meeting-delivery-protocol.js.map +0 -1
  2505. package/dist/services/vc-meeting-delivery-receiver.d.ts +0 -80
  2506. package/dist/services/vc-meeting-delivery-receiver.d.ts.map +0 -1
  2507. package/dist/services/vc-meeting-delivery-receiver.js +0 -552
  2508. package/dist/services/vc-meeting-delivery-receiver.js.map +0 -1
  2509. package/dist/services/vc-meeting-delivery-store.d.ts +0 -349
  2510. package/dist/services/vc-meeting-delivery-store.d.ts.map +0 -1
  2511. package/dist/services/vc-meeting-delivery-store.js +0 -1036
  2512. package/dist/services/vc-meeting-delivery-store.js.map +0 -1
  2513. package/dist/services/vc-meeting-feed-metadata-store.d.ts +0 -58
  2514. package/dist/services/vc-meeting-feed-metadata-store.d.ts.map +0 -1
  2515. package/dist/services/vc-meeting-feed-metadata-store.js +0 -356
  2516. package/dist/services/vc-meeting-feed-metadata-store.js.map +0 -1
  2517. package/dist/services/vc-meeting-im-reply.d.ts +0 -56
  2518. package/dist/services/vc-meeting-im-reply.d.ts.map +0 -1
  2519. package/dist/services/vc-meeting-im-reply.js +0 -295
  2520. package/dist/services/vc-meeting-im-reply.js.map +0 -1
  2521. package/dist/services/vc-meeting-im-routing.d.ts +0 -131
  2522. package/dist/services/vc-meeting-im-routing.d.ts.map +0 -1
  2523. package/dist/services/vc-meeting-im-routing.js +0 -449
  2524. package/dist/services/vc-meeting-im-routing.js.map +0 -1
  2525. package/dist/services/vc-meeting-listener-message-store.d.ts +0 -23
  2526. package/dist/services/vc-meeting-listener-message-store.d.ts.map +0 -1
  2527. package/dist/services/vc-meeting-listener-message-store.js +0 -142
  2528. package/dist/services/vc-meeting-listener-message-store.js.map +0 -1
  2529. package/dist/services/vc-meeting-listener-output-protocol.d.ts +0 -27
  2530. package/dist/services/vc-meeting-listener-output-protocol.d.ts.map +0 -1
  2531. package/dist/services/vc-meeting-listener-output-protocol.js +0 -58
  2532. package/dist/services/vc-meeting-listener-output-protocol.js.map +0 -1
  2533. package/dist/services/vc-meeting-listener-topic-store.d.ts +0 -31
  2534. package/dist/services/vc-meeting-listener-topic-store.d.ts.map +0 -1
  2535. package/dist/services/vc-meeting-listener-topic-store.js +0 -120
  2536. package/dist/services/vc-meeting-listener-topic-store.js.map +0 -1
  2537. package/dist/services/vc-meeting-member-policy.d.ts +0 -37
  2538. package/dist/services/vc-meeting-member-policy.d.ts.map +0 -1
  2539. package/dist/services/vc-meeting-member-policy.js +0 -102
  2540. package/dist/services/vc-meeting-member-policy.js.map +0 -1
  2541. package/dist/services/vc-meeting-preparations-store.d.ts +0 -22
  2542. package/dist/services/vc-meeting-preparations-store.d.ts.map +0 -1
  2543. package/dist/services/vc-meeting-preparations-store.js +0 -131
  2544. package/dist/services/vc-meeting-preparations-store.js.map +0 -1
  2545. package/dist/services/vc-meeting-profile-instructions.d.ts +0 -22
  2546. package/dist/services/vc-meeting-profile-instructions.d.ts.map +0 -1
  2547. package/dist/services/vc-meeting-profile-instructions.js +0 -64
  2548. package/dist/services/vc-meeting-profile-instructions.js.map +0 -1
  2549. package/dist/services/vc-meeting-runtime-store.d.ts +0 -132
  2550. package/dist/services/vc-meeting-runtime-store.d.ts.map +0 -1
  2551. package/dist/services/vc-meeting-runtime-store.js +0 -852
  2552. package/dist/services/vc-meeting-runtime-store.js.map +0 -1
  2553. package/dist/services/vc-meeting-send-policy.d.ts +0 -96
  2554. package/dist/services/vc-meeting-send-policy.d.ts.map +0 -1
  2555. package/dist/services/vc-meeting-send-policy.js +0 -158
  2556. package/dist/services/vc-meeting-send-policy.js.map +0 -1
  2557. package/dist/services/vc-meeting-terminal-reconciler.d.ts +0 -93
  2558. package/dist/services/vc-meeting-terminal-reconciler.d.ts.map +0 -1
  2559. package/dist/services/vc-meeting-terminal-reconciler.js +0 -198
  2560. package/dist/services/vc-meeting-terminal-reconciler.js.map +0 -1
  2561. package/dist/services/voice/audio.d.ts +0 -32
  2562. package/dist/services/voice/audio.d.ts.map +0 -1
  2563. package/dist/services/voice/audio.js +0 -114
  2564. package/dist/services/voice/audio.js.map +0 -1
  2565. package/dist/services/voice/index.d.ts +0 -37
  2566. package/dist/services/voice/index.d.ts.map +0 -1
  2567. package/dist/services/voice/index.js +0 -105
  2568. package/dist/services/voice/index.js.map +0 -1
  2569. package/dist/services/voice/openai.d.ts +0 -24
  2570. package/dist/services/voice/openai.d.ts.map +0 -1
  2571. package/dist/services/voice/openai.js +0 -47
  2572. package/dist/services/voice/openai.js.map +0 -1
  2573. package/dist/services/voice/sami.d.ts +0 -22
  2574. package/dist/services/voice/sami.d.ts.map +0 -1
  2575. package/dist/services/voice/sami.js +0 -128
  2576. package/dist/services/voice/sami.js.map +0 -1
  2577. package/dist/services/voice/types.d.ts +0 -32
  2578. package/dist/services/voice/types.d.ts.map +0 -1
  2579. package/dist/services/voice/types.js +0 -2
  2580. package/dist/services/voice/types.js.map +0 -1
  2581. package/dist/services/webhook-audit.d.ts +0 -10
  2582. package/dist/services/webhook-audit.d.ts.map +0 -1
  2583. package/dist/services/webhook-audit.js +0 -116
  2584. package/dist/services/webhook-audit.js.map +0 -1
  2585. package/dist/services/webhook-key.d.ts +0 -16
  2586. package/dist/services/webhook-key.d.ts.map +0 -1
  2587. package/dist/services/webhook-key.js +0 -123
  2588. package/dist/services/webhook-key.js.map +0 -1
  2589. package/dist/services/webhook-lifecycle-extractors.d.ts +0 -6
  2590. package/dist/services/webhook-lifecycle-extractors.d.ts.map +0 -1
  2591. package/dist/services/webhook-lifecycle-extractors.js +0 -44
  2592. package/dist/services/webhook-lifecycle-extractors.js.map +0 -1
  2593. package/dist/services/webhook-lifecycle-store.d.ts +0 -45
  2594. package/dist/services/webhook-lifecycle-store.d.ts.map +0 -1
  2595. package/dist/services/webhook-lifecycle-store.js +0 -159
  2596. package/dist/services/webhook-lifecycle-store.js.map +0 -1
  2597. package/dist/services/whiteboard-store.d.ts +0 -67
  2598. package/dist/services/whiteboard-store.d.ts.map +0 -1
  2599. package/dist/services/whiteboard-store.js +0 -450
  2600. package/dist/services/whiteboard-store.js.map +0 -1
  2601. package/dist/services/worktree-slug-ai.d.ts +0 -3
  2602. package/dist/services/worktree-slug-ai.d.ts.map +0 -1
  2603. package/dist/services/worktree-slug-ai.js +0 -82
  2604. package/dist/services/worktree-slug-ai.js.map +0 -1
  2605. package/dist/setup/agent-preset.d.ts +0 -78
  2606. package/dist/setup/agent-preset.d.ts.map +0 -1
  2607. package/dist/setup/agent-preset.js +0 -127
  2608. package/dist/setup/agent-preset.js.map +0 -1
  2609. package/dist/setup/app-name.d.ts +0 -7
  2610. package/dist/setup/app-name.d.ts.map +0 -1
  2611. package/dist/setup/app-name.js +0 -10
  2612. package/dist/setup/app-name.js.map +0 -1
  2613. package/dist/setup/bot-config-editor.d.ts +0 -160
  2614. package/dist/setup/bot-config-editor.d.ts.map +0 -1
  2615. package/dist/setup/bot-config-editor.js +0 -459
  2616. package/dist/setup/bot-config-editor.js.map +0 -1
  2617. package/dist/setup/bots-store.d.ts +0 -3
  2618. package/dist/setup/bots-store.d.ts.map +0 -1
  2619. package/dist/setup/bots-store.js +0 -24
  2620. package/dist/setup/bots-store.js.map +0 -1
  2621. package/dist/setup/cli-availability.d.ts +0 -26
  2622. package/dist/setup/cli-availability.d.ts.map +0 -1
  2623. package/dist/setup/cli-availability.js +0 -77
  2624. package/dist/setup/cli-availability.js.map +0 -1
  2625. package/dist/setup/cli-selection.d.ts +0 -145
  2626. package/dist/setup/cli-selection.d.ts.map +0 -1
  2627. package/dist/setup/cli-selection.js +0 -402
  2628. package/dist/setup/cli-selection.js.map +0 -1
  2629. package/dist/setup/detect-platform.d.ts +0 -14
  2630. package/dist/setup/detect-platform.d.ts.map +0 -1
  2631. package/dist/setup/detect-platform.js +0 -139
  2632. package/dist/setup/detect-platform.js.map +0 -1
  2633. package/dist/setup/ensure-fonts.d.ts +0 -13
  2634. package/dist/setup/ensure-fonts.d.ts.map +0 -1
  2635. package/dist/setup/ensure-fonts.js +0 -225
  2636. package/dist/setup/ensure-fonts.js.map +0 -1
  2637. package/dist/setup/ensure-herdr-integrations.d.ts +0 -102
  2638. package/dist/setup/ensure-herdr-integrations.d.ts.map +0 -1
  2639. package/dist/setup/ensure-herdr-integrations.js +0 -432
  2640. package/dist/setup/ensure-herdr-integrations.js.map +0 -1
  2641. package/dist/setup/ensure-herdr.d.ts +0 -12
  2642. package/dist/setup/ensure-herdr.d.ts.map +0 -1
  2643. package/dist/setup/ensure-herdr.js +0 -70
  2644. package/dist/setup/ensure-herdr.js.map +0 -1
  2645. package/dist/setup/ensure-opus.d.ts +0 -13
  2646. package/dist/setup/ensure-opus.d.ts.map +0 -1
  2647. package/dist/setup/ensure-opus.js +0 -64
  2648. package/dist/setup/ensure-opus.js.map +0 -1
  2649. package/dist/setup/ensure-tmux.d.ts +0 -91
  2650. package/dist/setup/ensure-tmux.d.ts.map +0 -1
  2651. package/dist/setup/ensure-tmux.js +0 -418
  2652. package/dist/setup/ensure-tmux.js.map +0 -1
  2653. package/dist/setup/ensure-zellij.d.ts +0 -48
  2654. package/dist/setup/ensure-zellij.d.ts.map +0 -1
  2655. package/dist/setup/ensure-zellij.js +0 -94
  2656. package/dist/setup/ensure-zellij.js.map +0 -1
  2657. package/dist/setup/ensure-zmx.d.ts +0 -31
  2658. package/dist/setup/ensure-zmx.d.ts.map +0 -1
  2659. package/dist/setup/ensure-zmx.js +0 -161
  2660. package/dist/setup/ensure-zmx.js.map +0 -1
  2661. package/dist/setup/index.d.ts +0 -38
  2662. package/dist/setup/index.d.ts.map +0 -1
  2663. package/dist/setup/index.js +0 -194
  2664. package/dist/setup/index.js.map +0 -1
  2665. package/dist/setup/interactive-select.d.ts +0 -52
  2666. package/dist/setup/interactive-select.d.ts.map +0 -1
  2667. package/dist/setup/interactive-select.js +0 -271
  2668. package/dist/setup/interactive-select.js.map +0 -1
  2669. package/dist/setup/lark-scopes.json +0 -305
  2670. package/dist/setup/open-platform-automation.d.ts +0 -417
  2671. package/dist/setup/open-platform-automation.d.ts.map +0 -1
  2672. package/dist/setup/open-platform-automation.js +0 -1610
  2673. package/dist/setup/open-platform-automation.js.map +0 -1
  2674. package/dist/setup/open-platform-outcome.d.ts +0 -50
  2675. package/dist/setup/open-platform-outcome.d.ts.map +0 -1
  2676. package/dist/setup/open-platform-outcome.js +0 -56
  2677. package/dist/setup/open-platform-outcome.js.map +0 -1
  2678. package/dist/setup/register-app.d.ts +0 -52
  2679. package/dist/setup/register-app.d.ts.map +0 -1
  2680. package/dist/setup/register-app.js +0 -91
  2681. package/dist/setup/register-app.js.map +0 -1
  2682. package/dist/setup/setup-args.d.ts +0 -89
  2683. package/dist/setup/setup-args.d.ts.map +0 -1
  2684. package/dist/setup/setup-args.js +0 -387
  2685. package/dist/setup/setup-args.js.map +0 -1
  2686. package/dist/setup/verify-permissions.d.ts +0 -150
  2687. package/dist/setup/verify-permissions.d.ts.map +0 -1
  2688. package/dist/setup/verify-permissions.js +0 -353
  2689. package/dist/setup/verify-permissions.js.map +0 -1
  2690. package/dist/skills/definitions.d.ts +0 -31
  2691. package/dist/skills/definitions.d.ts.map +0 -1
  2692. package/dist/skills/definitions.js +0 -1510
  2693. package/dist/skills/definitions.js.map +0 -1
  2694. package/dist/skills/injection-mode.d.ts +0 -93
  2695. package/dist/skills/injection-mode.d.ts.map +0 -1
  2696. package/dist/skills/injection-mode.js +0 -204
  2697. package/dist/skills/injection-mode.js.map +0 -1
  2698. package/dist/skills/installer.d.ts +0 -60
  2699. package/dist/skills/installer.d.ts.map +0 -1
  2700. package/dist/skills/installer.js +0 -217
  2701. package/dist/skills/installer.js.map +0 -1
  2702. package/dist/types.d.ts +0 -1131
  2703. package/dist/types.d.ts.map +0 -1
  2704. package/dist/types.js +0 -2
  2705. package/dist/types.js.map +0 -1
  2706. package/dist/utils/allowed-users-apply.d.ts +0 -76
  2707. package/dist/utils/allowed-users-apply.d.ts.map +0 -1
  2708. package/dist/utils/allowed-users-apply.js +0 -124
  2709. package/dist/utils/allowed-users-apply.js.map +0 -1
  2710. package/dist/utils/allowed-users-cache.d.ts +0 -29
  2711. package/dist/utils/allowed-users-cache.d.ts.map +0 -1
  2712. package/dist/utils/allowed-users-cache.js +0 -82
  2713. package/dist/utils/allowed-users-cache.js.map +0 -1
  2714. package/dist/utils/anchor-serializer.d.ts +0 -12
  2715. package/dist/utils/anchor-serializer.d.ts.map +0 -1
  2716. package/dist/utils/anchor-serializer.js +0 -64
  2717. package/dist/utils/anchor-serializer.js.map +0 -1
  2718. package/dist/utils/atomic-write.d.ts +0 -34
  2719. package/dist/utils/atomic-write.d.ts.map +0 -1
  2720. package/dist/utils/atomic-write.js +0 -183
  2721. package/dist/utils/atomic-write.js.map +0 -1
  2722. package/dist/utils/bot-routing.d.ts +0 -80
  2723. package/dist/utils/bot-routing.d.ts.map +0 -1
  2724. package/dist/utils/bot-routing.js +0 -167
  2725. package/dist/utils/bot-routing.js.map +0 -1
  2726. package/dist/utils/bounded-map.d.ts +0 -15
  2727. package/dist/utils/bounded-map.d.ts.map +0 -1
  2728. package/dist/utils/bounded-map.js +0 -29
  2729. package/dist/utils/bounded-map.js.map +0 -1
  2730. package/dist/utils/canonical-input-hash.d.ts +0 -5
  2731. package/dist/utils/canonical-input-hash.d.ts.map +0 -1
  2732. package/dist/utils/canonical-input-hash.js +0 -43
  2733. package/dist/utils/canonical-input-hash.js.map +0 -1
  2734. package/dist/utils/canonical-json.d.ts +0 -10
  2735. package/dist/utils/canonical-json.d.ts.map +0 -1
  2736. package/dist/utils/canonical-json.js +0 -23
  2737. package/dist/utils/canonical-json.js.map +0 -1
  2738. package/dist/utils/child-env.d.ts +0 -147
  2739. package/dist/utils/child-env.d.ts.map +0 -1
  2740. package/dist/utils/child-env.js +0 -299
  2741. package/dist/utils/child-env.js.map +0 -1
  2742. package/dist/utils/cli-usage-limit.d.ts +0 -62
  2743. package/dist/utils/cli-usage-limit.d.ts.map +0 -1
  2744. package/dist/utils/cli-usage-limit.js +0 -169
  2745. package/dist/utils/cli-usage-limit.js.map +0 -1
  2746. package/dist/utils/codex-app-context.d.ts +0 -9
  2747. package/dist/utils/codex-app-context.d.ts.map +0 -1
  2748. package/dist/utils/codex-app-context.js +0 -47
  2749. package/dist/utils/codex-app-context.js.map +0 -1
  2750. package/dist/utils/codex-update-dialog.d.ts +0 -17
  2751. package/dist/utils/codex-update-dialog.d.ts.map +0 -1
  2752. package/dist/utils/codex-update-dialog.js +0 -33
  2753. package/dist/utils/codex-update-dialog.js.map +0 -1
  2754. package/dist/utils/crash-log.d.ts +0 -22
  2755. package/dist/utils/crash-log.d.ts.map +0 -1
  2756. package/dist/utils/crash-log.js +0 -37
  2757. package/dist/utils/crash-log.js.map +0 -1
  2758. package/dist/utils/daemon-discovery.d.ts +0 -25
  2759. package/dist/utils/daemon-discovery.d.ts.map +0 -1
  2760. package/dist/utils/daemon-discovery.js +0 -86
  2761. package/dist/utils/daemon-discovery.js.map +0 -1
  2762. package/dist/utils/effort-confirm-dialog.d.ts +0 -40
  2763. package/dist/utils/effort-confirm-dialog.d.ts.map +0 -1
  2764. package/dist/utils/effort-confirm-dialog.js +0 -74
  2765. package/dist/utils/effort-confirm-dialog.js.map +0 -1
  2766. package/dist/utils/executable.d.ts +0 -3
  2767. package/dist/utils/executable.d.ts.map +0 -1
  2768. package/dist/utils/executable.js +0 -24
  2769. package/dist/utils/executable.js.map +0 -1
  2770. package/dist/utils/file-lock.d.ts +0 -19
  2771. package/dist/utils/file-lock.d.ts.map +0 -1
  2772. package/dist/utils/file-lock.js +0 -1038
  2773. package/dist/utils/file-lock.js.map +0 -1
  2774. package/dist/utils/font-installer.d.ts +0 -2
  2775. package/dist/utils/font-installer.d.ts.map +0 -1
  2776. package/dist/utils/font-installer.js +0 -60
  2777. package/dist/utils/font-installer.js.map +0 -1
  2778. package/dist/utils/fs-durability.d.ts +0 -20
  2779. package/dist/utils/fs-durability.d.ts.map +0 -1
  2780. package/dist/utils/fs-durability.js +0 -84
  2781. package/dist/utils/fs-durability.js.map +0 -1
  2782. package/dist/utils/global-install.d.ts +0 -27
  2783. package/dist/utils/global-install.d.ts.map +0 -1
  2784. package/dist/utils/global-install.js +0 -184
  2785. package/dist/utils/global-install.js.map +0 -1
  2786. package/dist/utils/herdr-web-history.d.ts +0 -12
  2787. package/dist/utils/herdr-web-history.d.ts.map +0 -1
  2788. package/dist/utils/herdr-web-history.js +0 -74
  2789. package/dist/utils/herdr-web-history.js.map +0 -1
  2790. package/dist/utils/herdr-web-terminal-binding.d.ts +0 -39
  2791. package/dist/utils/herdr-web-terminal-binding.d.ts.map +0 -1
  2792. package/dist/utils/herdr-web-terminal-binding.js +0 -56
  2793. package/dist/utils/herdr-web-terminal-binding.js.map +0 -1
  2794. package/dist/utils/idle-detector.d.ts +0 -39
  2795. package/dist/utils/idle-detector.d.ts.map +0 -1
  2796. package/dist/utils/idle-detector.js +0 -159
  2797. package/dist/utils/idle-detector.js.map +0 -1
  2798. package/dist/utils/input-gate.d.ts +0 -103
  2799. package/dist/utils/input-gate.d.ts.map +0 -1
  2800. package/dist/utils/input-gate.js +0 -96
  2801. package/dist/utils/input-gate.js.map +0 -1
  2802. package/dist/utils/install-diagnostics.d.ts +0 -52
  2803. package/dist/utils/install-diagnostics.d.ts.map +0 -1
  2804. package/dist/utils/install-diagnostics.js +0 -157
  2805. package/dist/utils/install-diagnostics.js.map +0 -1
  2806. package/dist/utils/install-info.d.ts +0 -19
  2807. package/dist/utils/install-info.d.ts.map +0 -1
  2808. package/dist/utils/install-info.js +0 -68
  2809. package/dist/utils/install-info.js.map +0 -1
  2810. package/dist/utils/lark-upload.d.ts +0 -3
  2811. package/dist/utils/lark-upload.d.ts.map +0 -1
  2812. package/dist/utils/lark-upload.js +0 -31
  2813. package/dist/utils/lark-upload.js.map +0 -1
  2814. package/dist/utils/listen-with-probe.d.ts +0 -47
  2815. package/dist/utils/listen-with-probe.d.ts.map +0 -1
  2816. package/dist/utils/listen-with-probe.js +0 -142
  2817. package/dist/utils/listen-with-probe.js.map +0 -1
  2818. package/dist/utils/logger.d.ts +0 -17
  2819. package/dist/utils/logger.d.ts.map +0 -1
  2820. package/dist/utils/logger.js +0 -80
  2821. package/dist/utils/logger.js.map +0 -1
  2822. package/dist/utils/pending-input-queue.d.ts +0 -122
  2823. package/dist/utils/pending-input-queue.d.ts.map +0 -1
  2824. package/dist/utils/pending-input-queue.js +0 -170
  2825. package/dist/utils/pending-input-queue.js.map +0 -1
  2826. package/dist/utils/process-identity.d.ts +0 -7
  2827. package/dist/utils/process-identity.d.ts.map +0 -1
  2828. package/dist/utils/process-identity.js +0 -62
  2829. package/dist/utils/process-identity.js.map +0 -1
  2830. package/dist/utils/ready-gate.d.ts +0 -90
  2831. package/dist/utils/ready-gate.d.ts.map +0 -1
  2832. package/dist/utils/ready-gate.js +0 -104
  2833. package/dist/utils/ready-gate.js.map +0 -1
  2834. package/dist/utils/render-dimensions.d.ts +0 -56
  2835. package/dist/utils/render-dimensions.d.ts.map +0 -1
  2836. package/dist/utils/render-dimensions.js +0 -65
  2837. package/dist/utils/render-dimensions.js.map +0 -1
  2838. package/dist/utils/runtime-build-id.d.ts +0 -21
  2839. package/dist/utils/runtime-build-id.d.ts.map +0 -1
  2840. package/dist/utils/runtime-build-id.js +0 -83
  2841. package/dist/utils/runtime-build-id.js.map +0 -1
  2842. package/dist/utils/screenshot-renderer.d.ts +0 -11
  2843. package/dist/utils/screenshot-renderer.d.ts.map +0 -1
  2844. package/dist/utils/screenshot-renderer.js +0 -267
  2845. package/dist/utils/screenshot-renderer.js.map +0 -1
  2846. package/dist/utils/stdio-epipe-guard.d.ts +0 -39
  2847. package/dist/utils/stdio-epipe-guard.d.ts.map +0 -1
  2848. package/dist/utils/stdio-epipe-guard.js +0 -67
  2849. package/dist/utils/stdio-epipe-guard.js.map +0 -1
  2850. package/dist/utils/stuck-detector.d.ts +0 -45
  2851. package/dist/utils/stuck-detector.d.ts.map +0 -1
  2852. package/dist/utils/stuck-detector.js +0 -188
  2853. package/dist/utils/stuck-detector.js.map +0 -1
  2854. package/dist/utils/stuck-key-guard.d.ts +0 -76
  2855. package/dist/utils/stuck-key-guard.d.ts.map +0 -1
  2856. package/dist/utils/stuck-key-guard.js +0 -77
  2857. package/dist/utils/stuck-key-guard.js.map +0 -1
  2858. package/dist/utils/terminal-favicon.d.ts +0 -2
  2859. package/dist/utils/terminal-favicon.d.ts.map +0 -1
  2860. package/dist/utils/terminal-favicon.js +0 -5
  2861. package/dist/utils/terminal-favicon.js.map +0 -1
  2862. package/dist/utils/terminal-renderer.d.ts +0 -59
  2863. package/dist/utils/terminal-renderer.d.ts.map +0 -1
  2864. package/dist/utils/terminal-renderer.js +0 -121
  2865. package/dist/utils/terminal-renderer.js.map +0 -1
  2866. package/dist/utils/timezone.d.ts +0 -51
  2867. package/dist/utils/timezone.d.ts.map +0 -1
  2868. package/dist/utils/timezone.js +0 -110
  2869. package/dist/utils/timezone.js.map +0 -1
  2870. package/dist/utils/timing.d.ts +0 -30
  2871. package/dist/utils/timing.d.ts.map +0 -1
  2872. package/dist/utils/timing.js +0 -41
  2873. package/dist/utils/timing.js.map +0 -1
  2874. package/dist/utils/transient-snapshot.d.ts +0 -53
  2875. package/dist/utils/transient-snapshot.d.ts.map +0 -1
  2876. package/dist/utils/transient-snapshot.js +0 -123
  2877. package/dist/utils/transient-snapshot.js.map +0 -1
  2878. package/dist/utils/tui-input-delivery.d.ts +0 -32
  2879. package/dist/utils/tui-input-delivery.d.ts.map +0 -1
  2880. package/dist/utils/tui-input-delivery.js +0 -53
  2881. package/dist/utils/tui-input-delivery.js.map +0 -1
  2882. package/dist/utils/user-token.d.ts +0 -53
  2883. package/dist/utils/user-token.d.ts.map +0 -1
  2884. package/dist/utils/user-token.js +0 -296
  2885. package/dist/utils/user-token.js.map +0 -1
  2886. package/dist/utils/version-info.d.ts +0 -25
  2887. package/dist/utils/version-info.d.ts.map +0 -1
  2888. package/dist/utils/version-info.js +0 -48
  2889. package/dist/utils/version-info.js.map +0 -1
  2890. package/dist/utils/web-terminal-listen.d.ts +0 -30
  2891. package/dist/utils/web-terminal-listen.d.ts.map +0 -1
  2892. package/dist/utils/web-terminal-listen.js +0 -81
  2893. package/dist/utils/web-terminal-listen.js.map +0 -1
  2894. package/dist/utils/web-terminal-seed.d.ts +0 -40
  2895. package/dist/utils/web-terminal-seed.d.ts.map +0 -1
  2896. package/dist/utils/web-terminal-seed.js +0 -46
  2897. package/dist/utils/web-terminal-seed.js.map +0 -1
  2898. package/dist/utils/worker-http.d.ts +0 -7
  2899. package/dist/utils/worker-http.d.ts.map +0 -1
  2900. package/dist/utils/worker-http.js +0 -27
  2901. package/dist/utils/worker-http.js.map +0 -1
  2902. package/dist/utils/working-dir.d.ts +0 -11
  2903. package/dist/utils/working-dir.d.ts.map +0 -1
  2904. package/dist/utils/working-dir.js +0 -45
  2905. package/dist/utils/working-dir.js.map +0 -1
  2906. package/dist/utils/xml.d.ts +0 -19
  2907. package/dist/utils/xml.d.ts.map +0 -1
  2908. package/dist/utils/xml.js +0 -26
  2909. package/dist/utils/xml.js.map +0 -1
  2910. package/dist/vc-agent/cards.d.ts +0 -94
  2911. package/dist/vc-agent/cards.d.ts.map +0 -1
  2912. package/dist/vc-agent/cards.js +0 -927
  2913. package/dist/vc-agent/cards.js.map +0 -1
  2914. package/dist/vc-agent/meeting-state.d.ts +0 -39
  2915. package/dist/vc-agent/meeting-state.d.ts.map +0 -1
  2916. package/dist/vc-agent/meeting-state.js +0 -186
  2917. package/dist/vc-agent/meeting-state.js.map +0 -1
  2918. package/dist/vc-agent/normalizer.d.ts +0 -13
  2919. package/dist/vc-agent/normalizer.d.ts.map +0 -1
  2920. package/dist/vc-agent/normalizer.js +0 -470
  2921. package/dist/vc-agent/normalizer.js.map +0 -1
  2922. package/dist/vc-agent/polling-source.d.ts +0 -69
  2923. package/dist/vc-agent/polling-source.d.ts.map +0 -1
  2924. package/dist/vc-agent/polling-source.js +0 -194
  2925. package/dist/vc-agent/polling-source.js.map +0 -1
  2926. package/dist/vc-agent/push-source.d.ts +0 -13
  2927. package/dist/vc-agent/push-source.d.ts.map +0 -1
  2928. package/dist/vc-agent/push-source.js +0 -109
  2929. package/dist/vc-agent/push-source.js.map +0 -1
  2930. package/dist/vc-agent/realtime/audio-source.d.ts +0 -6
  2931. package/dist/vc-agent/realtime/audio-source.d.ts.map +0 -1
  2932. package/dist/vc-agent/realtime/audio-source.js +0 -17
  2933. package/dist/vc-agent/realtime/audio-source.js.map +0 -1
  2934. package/dist/vc-agent/realtime/endpoint.d.ts +0 -6
  2935. package/dist/vc-agent/realtime/endpoint.d.ts.map +0 -1
  2936. package/dist/vc-agent/realtime/endpoint.js +0 -25
  2937. package/dist/vc-agent/realtime/endpoint.js.map +0 -1
  2938. package/dist/vc-agent/realtime/errors.d.ts +0 -9
  2939. package/dist/vc-agent/realtime/errors.d.ts.map +0 -1
  2940. package/dist/vc-agent/realtime/errors.js +0 -17
  2941. package/dist/vc-agent/realtime/errors.js.map +0 -1
  2942. package/dist/vc-agent/realtime/events.d.ts +0 -24
  2943. package/dist/vc-agent/realtime/events.d.ts.map +0 -1
  2944. package/dist/vc-agent/realtime/events.js +0 -190
  2945. package/dist/vc-agent/realtime/events.js.map +0 -1
  2946. package/dist/vc-agent/realtime/frontier.d.ts +0 -34
  2947. package/dist/vc-agent/realtime/frontier.d.ts.map +0 -1
  2948. package/dist/vc-agent/realtime/frontier.js +0 -40
  2949. package/dist/vc-agent/realtime/frontier.js.map +0 -1
  2950. package/dist/vc-agent/realtime/index.d.ts +0 -11
  2951. package/dist/vc-agent/realtime/index.d.ts.map +0 -1
  2952. package/dist/vc-agent/realtime/index.js +0 -11
  2953. package/dist/vc-agent/realtime/index.js.map +0 -1
  2954. package/dist/vc-agent/realtime/pacer.d.ts +0 -21
  2955. package/dist/vc-agent/realtime/pacer.d.ts.map +0 -1
  2956. package/dist/vc-agent/realtime/pacer.js +0 -80
  2957. package/dist/vc-agent/realtime/pacer.js.map +0 -1
  2958. package/dist/vc-agent/realtime/protobuf.d.ts +0 -33
  2959. package/dist/vc-agent/realtime/protobuf.d.ts.map +0 -1
  2960. package/dist/vc-agent/realtime/protobuf.js +0 -159
  2961. package/dist/vc-agent/realtime/protobuf.js.map +0 -1
  2962. package/dist/vc-agent/realtime/protocol.d.ts +0 -4
  2963. package/dist/vc-agent/realtime/protocol.d.ts.map +0 -1
  2964. package/dist/vc-agent/realtime/protocol.js +0 -59
  2965. package/dist/vc-agent/realtime/protocol.js.map +0 -1
  2966. package/dist/vc-agent/realtime/session.d.ts +0 -39
  2967. package/dist/vc-agent/realtime/session.d.ts.map +0 -1
  2968. package/dist/vc-agent/realtime/session.js +0 -221
  2969. package/dist/vc-agent/realtime/session.js.map +0 -1
  2970. package/dist/vc-agent/realtime/transport.d.ts +0 -23
  2971. package/dist/vc-agent/realtime/transport.d.ts.map +0 -1
  2972. package/dist/vc-agent/realtime/transport.js +0 -112
  2973. package/dist/vc-agent/realtime/transport.js.map +0 -1
  2974. package/dist/vc-agent/realtime/types.d.ts +0 -84
  2975. package/dist/vc-agent/realtime/types.d.ts.map +0 -1
  2976. package/dist/vc-agent/realtime/types.js +0 -5
  2977. package/dist/vc-agent/realtime/types.js.map +0 -1
  2978. package/dist/vc-agent/types.d.ts +0 -143
  2979. package/dist/vc-agent/types.d.ts.map +0 -1
  2980. package/dist/vc-agent/types.js +0 -2
  2981. package/dist/vc-agent/types.js.map +0 -1
  2982. package/dist/worker.d.ts +0 -3
  2983. package/dist/worker.d.ts.map +0 -1
  2984. package/dist/worker.js +0 -12831
  2985. package/dist/worker.js.map +0 -1
  2986. package/dist/workflows/attempt-terminal.d.ts +0 -25
  2987. package/dist/workflows/attempt-terminal.d.ts.map +0 -1
  2988. package/dist/workflows/attempt-terminal.js +0 -7
  2989. package/dist/workflows/attempt-terminal.js.map +0 -1
  2990. package/dist/workflows/definition.d.ts +0 -1705
  2991. package/dist/workflows/definition.d.ts.map +0 -1
  2992. package/dist/workflows/definition.js +0 -552
  2993. package/dist/workflows/definition.js.map +0 -1
  2994. package/dist/workflows/events/payloads.d.ts +0 -1116
  2995. package/dist/workflows/events/payloads.d.ts.map +0 -1
  2996. package/dist/workflows/events/payloads.js +0 -397
  2997. package/dist/workflows/events/payloads.js.map +0 -1
  2998. package/dist/workflows/events/replay.d.ts +0 -265
  2999. package/dist/workflows/events/replay.d.ts.map +0 -1
  3000. package/dist/workflows/events/replay.js +0 -716
  3001. package/dist/workflows/events/replay.js.map +0 -1
  3002. package/dist/workflows/events/schema.d.ts +0 -6093
  3003. package/dist/workflows/events/schema.d.ts.map +0 -1
  3004. package/dist/workflows/events/schema.js +0 -328
  3005. package/dist/workflows/events/schema.js.map +0 -1
  3006. package/dist/workflows/events/types.d.ts +0 -38
  3007. package/dist/workflows/events/types.d.ts.map +0 -1
  3008. package/dist/workflows/events/types.js +0 -2
  3009. package/dist/workflows/events/types.js.map +0 -1
  3010. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +0 -47
  3011. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +0 -1
  3012. package/dist/workflows/hostExecutors/botmux-schedule.js +0 -198
  3013. package/dist/workflows/hostExecutors/botmux-schedule.js.map +0 -1
  3014. package/dist/workflows/hostExecutors/feishu-im.d.ts +0 -12
  3015. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +0 -1
  3016. package/dist/workflows/hostExecutors/feishu-im.js +0 -49
  3017. package/dist/workflows/hostExecutors/feishu-im.js.map +0 -1
  3018. package/dist/workflows/hostExecutors/feishu-reply.d.ts +0 -24
  3019. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +0 -1
  3020. package/dist/workflows/hostExecutors/feishu-reply.js +0 -88
  3021. package/dist/workflows/hostExecutors/feishu-reply.js.map +0 -1
  3022. package/dist/workflows/hostExecutors/feishu-send.d.ts +0 -23
  3023. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +0 -1
  3024. package/dist/workflows/hostExecutors/feishu-send.js +0 -124
  3025. package/dist/workflows/hostExecutors/feishu-send.js.map +0 -1
  3026. package/dist/workflows/hostExecutors/index.d.ts +0 -7
  3027. package/dist/workflows/hostExecutors/index.d.ts.map +0 -1
  3028. package/dist/workflows/hostExecutors/index.js +0 -7
  3029. package/dist/workflows/hostExecutors/index.js.map +0 -1
  3030. package/dist/workflows/hostExecutors/registry.d.ts +0 -5
  3031. package/dist/workflows/hostExecutors/registry.d.ts.map +0 -1
  3032. package/dist/workflows/hostExecutors/registry.js +0 -36
  3033. package/dist/workflows/hostExecutors/registry.js.map +0 -1
  3034. package/dist/workflows/hostExecutors/types.d.ts +0 -70
  3035. package/dist/workflows/hostExecutors/types.d.ts.map +0 -1
  3036. package/dist/workflows/hostExecutors/types.js +0 -2
  3037. package/dist/workflows/hostExecutors/types.js.map +0 -1
  3038. package/dist/workflows/migration/v2-definition-paths.d.ts +0 -3
  3039. package/dist/workflows/migration/v2-definition-paths.d.ts.map +0 -1
  3040. package/dist/workflows/migration/v2-definition-paths.js +0 -10
  3041. package/dist/workflows/migration/v2-definition-paths.js.map +0 -1
  3042. package/dist/workflows/migration/v2-ledger.d.ts +0 -138
  3043. package/dist/workflows/migration/v2-ledger.d.ts.map +0 -1
  3044. package/dist/workflows/migration/v2-ledger.js +0 -599
  3045. package/dist/workflows/migration/v2-ledger.js.map +0 -1
  3046. package/dist/workflows/migration/v2-migration-service.d.ts +0 -40
  3047. package/dist/workflows/migration/v2-migration-service.d.ts.map +0 -1
  3048. package/dist/workflows/migration/v2-migration-service.js +0 -454
  3049. package/dist/workflows/migration/v2-migration-service.js.map +0 -1
  3050. package/dist/workflows/migration/v2-read-only-ids.d.ts +0 -7
  3051. package/dist/workflows/migration/v2-read-only-ids.d.ts.map +0 -1
  3052. package/dist/workflows/migration/v2-read-only-ids.js +0 -9
  3053. package/dist/workflows/migration/v2-read-only-ids.js.map +0 -1
  3054. package/dist/workflows/migration/v2-run-archive-schema.d.ts +0 -976
  3055. package/dist/workflows/migration/v2-run-archive-schema.d.ts.map +0 -1
  3056. package/dist/workflows/migration/v2-run-archive-schema.js +0 -113
  3057. package/dist/workflows/migration/v2-run-archive-schema.js.map +0 -1
  3058. package/dist/workflows/migration/v2-run-archive.d.ts +0 -92
  3059. package/dist/workflows/migration/v2-run-archive.d.ts.map +0 -1
  3060. package/dist/workflows/migration/v2-run-archive.js +0 -1220
  3061. package/dist/workflows/migration/v2-run-archive.js.map +0 -1
  3062. package/dist/workflows/migration/v2-scanner.d.ts +0 -22
  3063. package/dist/workflows/migration/v2-scanner.d.ts.map +0 -1
  3064. package/dist/workflows/migration/v2-scanner.js +0 -114
  3065. package/dist/workflows/migration/v2-scanner.js.map +0 -1
  3066. package/dist/workflows/migration/v2-to-v3.d.ts +0 -32
  3067. package/dist/workflows/migration/v2-to-v3.d.ts.map +0 -1
  3068. package/dist/workflows/migration/v2-to-v3.js +0 -498
  3069. package/dist/workflows/migration/v2-to-v3.js.map +0 -1
  3070. package/dist/workflows/ops-projection.d.ts +0 -226
  3071. package/dist/workflows/ops-projection.d.ts.map +0 -1
  3072. package/dist/workflows/ops-projection.js +0 -804
  3073. package/dist/workflows/ops-projection.js.map +0 -1
  3074. package/dist/workflows/shared/idempotency-key.d.ts +0 -19
  3075. package/dist/workflows/shared/idempotency-key.d.ts.map +0 -1
  3076. package/dist/workflows/shared/idempotency-key.js +0 -23
  3077. package/dist/workflows/shared/idempotency-key.js.map +0 -1
  3078. package/dist/workflows/shared/params.d.ts +0 -97
  3079. package/dist/workflows/shared/params.d.ts.map +0 -1
  3080. package/dist/workflows/shared/params.js +0 -282
  3081. package/dist/workflows/shared/params.js.map +0 -1
  3082. package/dist/workflows/shared/provider-reconciler.d.ts +0 -18
  3083. package/dist/workflows/shared/provider-reconciler.d.ts.map +0 -1
  3084. package/dist/workflows/shared/provider-reconciler.js +0 -17
  3085. package/dist/workflows/shared/provider-reconciler.js.map +0 -1
  3086. package/dist/workflows/shared/sandbox-policy.d.ts +0 -23
  3087. package/dist/workflows/shared/sandbox-policy.d.ts.map +0 -1
  3088. package/dist/workflows/shared/sandbox-policy.js +0 -21
  3089. package/dist/workflows/shared/sandbox-policy.js.map +0 -1
  3090. package/dist/workflows/shared/worker-process.d.ts +0 -29
  3091. package/dist/workflows/shared/worker-process.d.ts.map +0 -1
  3092. package/dist/workflows/shared/worker-process.js +0 -56
  3093. package/dist/workflows/shared/worker-process.js.map +0 -1
  3094. package/dist/workflows/v3/architect.d.ts +0 -37
  3095. package/dist/workflows/v3/architect.d.ts.map +0 -1
  3096. package/dist/workflows/v3/architect.js +0 -239
  3097. package/dist/workflows/v3/architect.js.map +0 -1
  3098. package/dist/workflows/v3/artifact-contract.d.ts +0 -41
  3099. package/dist/workflows/v3/artifact-contract.d.ts.map +0 -1
  3100. package/dist/workflows/v3/artifact-contract.js +0 -20
  3101. package/dist/workflows/v3/artifact-contract.js.map +0 -1
  3102. package/dist/workflows/v3/attempt-ledger.d.ts +0 -23
  3103. package/dist/workflows/v3/attempt-ledger.d.ts.map +0 -1
  3104. package/dist/workflows/v3/attempt-ledger.js +0 -74
  3105. package/dist/workflows/v3/attempt-ledger.js.map +0 -1
  3106. package/dist/workflows/v3/bot-resolve.d.ts +0 -39
  3107. package/dist/workflows/v3/bot-resolve.d.ts.map +0 -1
  3108. package/dist/workflows/v3/bot-resolve.js +0 -214
  3109. package/dist/workflows/v3/bot-resolve.js.map +0 -1
  3110. package/dist/workflows/v3/botmux-attempt-lease.d.ts +0 -7
  3111. package/dist/workflows/v3/botmux-attempt-lease.d.ts.map +0 -1
  3112. package/dist/workflows/v3/botmux-attempt-lease.js +0 -189
  3113. package/dist/workflows/v3/botmux-attempt-lease.js.map +0 -1
  3114. package/dist/workflows/v3/botmux-host-policy.d.ts +0 -7
  3115. package/dist/workflows/v3/botmux-host-policy.d.ts.map +0 -1
  3116. package/dist/workflows/v3/botmux-host-policy.js +0 -34
  3117. package/dist/workflows/v3/botmux-host-policy.js.map +0 -1
  3118. package/dist/workflows/v3/cli-daemon-command-authority.d.ts +0 -59
  3119. package/dist/workflows/v3/cli-daemon-command-authority.d.ts.map +0 -1
  3120. package/dist/workflows/v3/cli-daemon-command-authority.js +0 -175
  3121. package/dist/workflows/v3/cli-daemon-command-authority.js.map +0 -1
  3122. package/dist/workflows/v3/cli-run.d.ts +0 -60
  3123. package/dist/workflows/v3/cli-run.d.ts.map +0 -1
  3124. package/dist/workflows/v3/cli-run.js +0 -368
  3125. package/dist/workflows/v3/cli-run.js.map +0 -1
  3126. package/dist/workflows/v3/contract.d.ts +0 -243
  3127. package/dist/workflows/v3/contract.d.ts.map +0 -1
  3128. package/dist/workflows/v3/contract.js +0 -89
  3129. package/dist/workflows/v3/contract.js.map +0 -1
  3130. package/dist/workflows/v3/core-control.d.ts +0 -16
  3131. package/dist/workflows/v3/core-control.d.ts.map +0 -1
  3132. package/dist/workflows/v3/core-control.js +0 -60
  3133. package/dist/workflows/v3/core-control.js.map +0 -1
  3134. package/dist/workflows/v3/daemon-ipc-auth.d.ts +0 -113
  3135. package/dist/workflows/v3/daemon-ipc-auth.d.ts.map +0 -1
  3136. package/dist/workflows/v3/daemon-ipc-auth.js +0 -294
  3137. package/dist/workflows/v3/daemon-ipc-auth.js.map +0 -1
  3138. package/dist/workflows/v3/daemon-ipc-body.d.ts +0 -30
  3139. package/dist/workflows/v3/daemon-ipc-body.d.ts.map +0 -1
  3140. package/dist/workflows/v3/daemon-ipc-body.js +0 -65
  3141. package/dist/workflows/v3/daemon-ipc-body.js.map +0 -1
  3142. package/dist/workflows/v3/daemon-ipc-client.d.ts +0 -32
  3143. package/dist/workflows/v3/daemon-ipc-client.d.ts.map +0 -1
  3144. package/dist/workflows/v3/daemon-ipc-client.js +0 -74
  3145. package/dist/workflows/v3/daemon-ipc-client.js.map +0 -1
  3146. package/dist/workflows/v3/daemon-run.d.ts +0 -396
  3147. package/dist/workflows/v3/daemon-run.d.ts.map +0 -1
  3148. package/dist/workflows/v3/daemon-run.js +0 -1573
  3149. package/dist/workflows/v3/daemon-run.js.map +0 -1
  3150. package/dist/workflows/v3/dag-loader.d.ts +0 -5
  3151. package/dist/workflows/v3/dag-loader.d.ts.map +0 -1
  3152. package/dist/workflows/v3/dag-loader.js +0 -22
  3153. package/dist/workflows/v3/dag-loader.js.map +0 -1
  3154. package/dist/workflows/v3/dag.d.ts +0 -342
  3155. package/dist/workflows/v3/dag.d.ts.map +0 -1
  3156. package/dist/workflows/v3/dag.js +0 -1210
  3157. package/dist/workflows/v3/dag.js.map +0 -1
  3158. package/dist/workflows/v3/distillation-compiler.d.ts +0 -36
  3159. package/dist/workflows/v3/distillation-compiler.d.ts.map +0 -1
  3160. package/dist/workflows/v3/distillation-compiler.js +0 -704
  3161. package/dist/workflows/v3/distillation-compiler.js.map +0 -1
  3162. package/dist/workflows/v3/distillation-private-root.d.ts +0 -10
  3163. package/dist/workflows/v3/distillation-private-root.d.ts.map +0 -1
  3164. package/dist/workflows/v3/distillation-private-root.js +0 -34
  3165. package/dist/workflows/v3/distillation-private-root.js.map +0 -1
  3166. package/dist/workflows/v3/distillation-runner.d.ts +0 -68
  3167. package/dist/workflows/v3/distillation-runner.d.ts.map +0 -1
  3168. package/dist/workflows/v3/distillation-runner.js +0 -1030
  3169. package/dist/workflows/v3/distillation-runner.js.map +0 -1
  3170. package/dist/workflows/v3/distillation-schema.d.ts +0 -63
  3171. package/dist/workflows/v3/distillation-schema.d.ts.map +0 -1
  3172. package/dist/workflows/v3/distillation-schema.js +0 -184
  3173. package/dist/workflows/v3/distillation-schema.js.map +0 -1
  3174. package/dist/workflows/v3/distillation-service.d.ts +0 -78
  3175. package/dist/workflows/v3/distillation-service.d.ts.map +0 -1
  3176. package/dist/workflows/v3/distillation-service.js +0 -416
  3177. package/dist/workflows/v3/distillation-service.js.map +0 -1
  3178. package/dist/workflows/v3/distillation-source.d.ts +0 -35
  3179. package/dist/workflows/v3/distillation-source.d.ts.map +0 -1
  3180. package/dist/workflows/v3/distillation-source.js +0 -118
  3181. package/dist/workflows/v3/distillation-source.js.map +0 -1
  3182. package/dist/workflows/v3/distillation-store.d.ts +0 -185
  3183. package/dist/workflows/v3/distillation-store.d.ts.map +0 -1
  3184. package/dist/workflows/v3/distillation-store.js +0 -1127
  3185. package/dist/workflows/v3/distillation-store.js.map +0 -1
  3186. package/dist/workflows/v3/drive-lease.d.ts +0 -7
  3187. package/dist/workflows/v3/drive-lease.d.ts.map +0 -1
  3188. package/dist/workflows/v3/drive-lease.js +0 -10
  3189. package/dist/workflows/v3/drive-lease.js.map +0 -1
  3190. package/dist/workflows/v3/ephemeral-pool.d.ts +0 -29
  3191. package/dist/workflows/v3/ephemeral-pool.d.ts.map +0 -1
  3192. package/dist/workflows/v3/ephemeral-pool.js +0 -536
  3193. package/dist/workflows/v3/ephemeral-pool.js.map +0 -1
  3194. package/dist/workflows/v3/event-contract.d.ts +0 -273
  3195. package/dist/workflows/v3/event-contract.d.ts.map +0 -1
  3196. package/dist/workflows/v3/event-contract.js +0 -8
  3197. package/dist/workflows/v3/event-contract.js.map +0 -1
  3198. package/dist/workflows/v3/gate-policy.d.ts +0 -12
  3199. package/dist/workflows/v3/gate-policy.d.ts.map +0 -1
  3200. package/dist/workflows/v3/gate-policy.js +0 -20
  3201. package/dist/workflows/v3/gate-policy.js.map +0 -1
  3202. package/dist/workflows/v3/gate-wait-store.d.ts +0 -99
  3203. package/dist/workflows/v3/gate-wait-store.d.ts.map +0 -1
  3204. package/dist/workflows/v3/gate-wait-store.js +0 -263
  3205. package/dist/workflows/v3/gate-wait-store.js.map +0 -1
  3206. package/dist/workflows/v3/goal-cli.d.ts +0 -58
  3207. package/dist/workflows/v3/goal-cli.d.ts.map +0 -1
  3208. package/dist/workflows/v3/goal-cli.js +0 -430
  3209. package/dist/workflows/v3/goal-cli.js.map +0 -1
  3210. package/dist/workflows/v3/grill-state.d.ts +0 -107
  3211. package/dist/workflows/v3/grill-state.d.ts.map +0 -1
  3212. package/dist/workflows/v3/grill-state.js +0 -168
  3213. package/dist/workflows/v3/grill-state.js.map +0 -1
  3214. package/dist/workflows/v3/host-bindings.d.ts +0 -40
  3215. package/dist/workflows/v3/host-bindings.d.ts.map +0 -1
  3216. package/dist/workflows/v3/host-bindings.js +0 -272
  3217. package/dist/workflows/v3/host-bindings.js.map +0 -1
  3218. package/dist/workflows/v3/host-effect-ledger.d.ts +0 -22
  3219. package/dist/workflows/v3/host-effect-ledger.d.ts.map +0 -1
  3220. package/dist/workflows/v3/host-effect-ledger.js +0 -110
  3221. package/dist/workflows/v3/host-effect-ledger.js.map +0 -1
  3222. package/dist/workflows/v3/host-execution.d.ts +0 -142
  3223. package/dist/workflows/v3/host-execution.d.ts.map +0 -1
  3224. package/dist/workflows/v3/host-execution.js +0 -424
  3225. package/dist/workflows/v3/host-execution.js.map +0 -1
  3226. package/dist/workflows/v3/host.d.ts +0 -124
  3227. package/dist/workflows/v3/host.d.ts.map +0 -1
  3228. package/dist/workflows/v3/host.js +0 -628
  3229. package/dist/workflows/v3/host.js.map +0 -1
  3230. package/dist/workflows/v3/human-gate.d.ts +0 -8
  3231. package/dist/workflows/v3/human-gate.d.ts.map +0 -1
  3232. package/dist/workflows/v3/human-gate.js +0 -8
  3233. package/dist/workflows/v3/human-gate.js.map +0 -1
  3234. package/dist/workflows/v3/in-process-attempt-lease.d.ts +0 -10
  3235. package/dist/workflows/v3/in-process-attempt-lease.d.ts.map +0 -1
  3236. package/dist/workflows/v3/in-process-attempt-lease.js +0 -47
  3237. package/dist/workflows/v3/in-process-attempt-lease.js.map +0 -1
  3238. package/dist/workflows/v3/journal.d.ts +0 -52
  3239. package/dist/workflows/v3/journal.d.ts.map +0 -1
  3240. package/dist/workflows/v3/journal.js +0 -190
  3241. package/dist/workflows/v3/journal.js.map +0 -1
  3242. package/dist/workflows/v3/library-materialize.d.ts +0 -88
  3243. package/dist/workflows/v3/library-materialize.d.ts.map +0 -1
  3244. package/dist/workflows/v3/library-materialize.js +0 -298
  3245. package/dist/workflows/v3/library-materialize.js.map +0 -1
  3246. package/dist/workflows/v3/library-schema.d.ts +0 -159
  3247. package/dist/workflows/v3/library-schema.d.ts.map +0 -1
  3248. package/dist/workflows/v3/library-schema.js +0 -667
  3249. package/dist/workflows/v3/library-schema.js.map +0 -1
  3250. package/dist/workflows/v3/library-service.d.ts +0 -126
  3251. package/dist/workflows/v3/library-service.d.ts.map +0 -1
  3252. package/dist/workflows/v3/library-service.js +0 -542
  3253. package/dist/workflows/v3/library-service.js.map +0 -1
  3254. package/dist/workflows/v3/library-store.d.ts +0 -124
  3255. package/dist/workflows/v3/library-store.d.ts.map +0 -1
  3256. package/dist/workflows/v3/library-store.js +0 -665
  3257. package/dist/workflows/v3/library-store.js.map +0 -1
  3258. package/dist/workflows/v3/manifest.d.ts +0 -17
  3259. package/dist/workflows/v3/manifest.d.ts.map +0 -1
  3260. package/dist/workflows/v3/manifest.js +0 -266
  3261. package/dist/workflows/v3/manifest.js.map +0 -1
  3262. package/dist/workflows/v3/ops-projection.d.ts +0 -110
  3263. package/dist/workflows/v3/ops-projection.d.ts.map +0 -1
  3264. package/dist/workflows/v3/ops-projection.js +0 -0
  3265. package/dist/workflows/v3/ops-projection.js.map +0 -1
  3266. package/dist/workflows/v3/orchestrator.d.ts +0 -175
  3267. package/dist/workflows/v3/orchestrator.d.ts.map +0 -1
  3268. package/dist/workflows/v3/orchestrator.js +0 -418
  3269. package/dist/workflows/v3/orchestrator.js.map +0 -1
  3270. package/dist/workflows/v3/portable-artifact-snapshot.d.ts +0 -15
  3271. package/dist/workflows/v3/portable-artifact-snapshot.d.ts.map +0 -1
  3272. package/dist/workflows/v3/portable-artifact-snapshot.js +0 -76
  3273. package/dist/workflows/v3/portable-artifact-snapshot.js.map +0 -1
  3274. package/dist/workflows/v3/portable-final-outputs.d.ts +0 -37
  3275. package/dist/workflows/v3/portable-final-outputs.d.ts.map +0 -1
  3276. package/dist/workflows/v3/portable-final-outputs.js +0 -137
  3277. package/dist/workflows/v3/portable-final-outputs.js.map +0 -1
  3278. package/dist/workflows/v3/portable-run-snapshot.d.ts +0 -14
  3279. package/dist/workflows/v3/portable-run-snapshot.d.ts.map +0 -1
  3280. package/dist/workflows/v3/portable-run-snapshot.js +0 -176
  3281. package/dist/workflows/v3/portable-run-snapshot.js.map +0 -1
  3282. package/dist/workflows/v3/portable-runtime.d.ts +0 -83
  3283. package/dist/workflows/v3/portable-runtime.d.ts.map +0 -1
  3284. package/dist/workflows/v3/portable-runtime.js +0 -135
  3285. package/dist/workflows/v3/portable-runtime.js.map +0 -1
  3286. package/dist/workflows/v3/progress-projection.d.ts +0 -102
  3287. package/dist/workflows/v3/progress-projection.d.ts.map +0 -1
  3288. package/dist/workflows/v3/progress-projection.js +0 -219
  3289. package/dist/workflows/v3/progress-projection.js.map +0 -1
  3290. package/dist/workflows/v3/run-envelope.d.ts +0 -1324
  3291. package/dist/workflows/v3/run-envelope.d.ts.map +0 -1
  3292. package/dist/workflows/v3/run-envelope.js +0 -712
  3293. package/dist/workflows/v3/run-envelope.js.map +0 -1
  3294. package/dist/workflows/v3/runtime-host-contract.d.ts +0 -182
  3295. package/dist/workflows/v3/runtime-host-contract.d.ts.map +0 -1
  3296. package/dist/workflows/v3/runtime-host-contract.js +0 -9
  3297. package/dist/workflows/v3/runtime-host-contract.js.map +0 -1
  3298. package/dist/workflows/v3/runtime.d.ts +0 -16
  3299. package/dist/workflows/v3/runtime.d.ts.map +0 -1
  3300. package/dist/workflows/v3/runtime.js +0 -18
  3301. package/dist/workflows/v3/runtime.js.map +0 -1
  3302. package/dist/workflows/v3/session-relay-client.d.ts +0 -61
  3303. package/dist/workflows/v3/session-relay-client.d.ts.map +0 -1
  3304. package/dist/workflows/v3/session-relay-client.js +0 -92
  3305. package/dist/workflows/v3/session-relay-client.js.map +0 -1
  3306. package/dist/workflows/v3/session-relay.d.ts +0 -66
  3307. package/dist/workflows/v3/session-relay.d.ts.map +0 -1
  3308. package/dist/workflows/v3/session-relay.js +0 -157
  3309. package/dist/workflows/v3/session-relay.js.map +0 -1
  3310. package/dist/workflows/v3/shared-node-runtime.d.ts +0 -203
  3311. package/dist/workflows/v3/shared-node-runtime.d.ts.map +0 -1
  3312. package/dist/workflows/v3/shared-node-runtime.js +0 -2978
  3313. package/dist/workflows/v3/shared-node-runtime.js.map +0 -1
  3314. package/dist/workflows/v3/shared-runtime.d.ts +0 -17
  3315. package/dist/workflows/v3/shared-runtime.d.ts.map +0 -1
  3316. package/dist/workflows/v3/shared-runtime.js +0 -12
  3317. package/dist/workflows/v3/shared-runtime.js.map +0 -1
  3318. package/dist/workflows/v3/spec.d.ts +0 -32
  3319. package/dist/workflows/v3/spec.d.ts.map +0 -1
  3320. package/dist/workflows/v3/spec.js +0 -173
  3321. package/dist/workflows/v3/spec.js.map +0 -1
  3322. package/dist/workflows/v3/start-intent.d.ts +0 -8
  3323. package/dist/workflows/v3/start-intent.d.ts.map +0 -1
  3324. package/dist/workflows/v3/start-intent.js +0 -34
  3325. package/dist/workflows/v3/start-intent.js.map +0 -1
  3326. package/dist/workflows/v3/state.d.ts +0 -83
  3327. package/dist/workflows/v3/state.d.ts.map +0 -1
  3328. package/dist/workflows/v3/state.js +0 -525
  3329. package/dist/workflows/v3/state.js.map +0 -1
  3330. package/dist/workflows/v3/template-bindings.d.ts +0 -22
  3331. package/dist/workflows/v3/template-bindings.d.ts.map +0 -1
  3332. package/dist/workflows/v3/template-bindings.js +0 -204
  3333. package/dist/workflows/v3/template-bindings.js.map +0 -1
  3334. package/dist/workflows/v3/worker-fence.d.ts +0 -158
  3335. package/dist/workflows/v3/worker-fence.d.ts.map +0 -1
  3336. package/dist/workflows/v3/worker-fence.js +0 -690
  3337. package/dist/workflows/v3/worker-fence.js.map +0 -1
  3338. package/ecosystem.config.cjs +0 -15
@@ -1,4108 +0,0 @@
1
- /**
2
- * Command handler — processes /slash commands from users.
3
- * Extracted from daemon.ts for modularity.
4
- */
5
- import { existsSync, readFileSync, statSync } from 'node:fs';
6
- import { join, resolve, basename } from 'node:path';
7
- import { config } from '../config.js';
8
- import { buildTerminalUrl } from './terminal-url.js';
9
- import { getBot, getAllBots, getBotOpenId, getOwnerOpenId, findOncallChat, effectiveDefaultWorkingDir } from '../bot-registry.js';
10
- import { readGlobalConfig, repoPickerScanOptions } from '../global-config.js';
11
- import * as sessionStore from '../services/session-store.js';
12
- import * as scheduleStore from '../services/schedule-store.js';
13
- import * as scheduler from './scheduler.js';
14
- import { scanMultipleProjects, describeProjectDir } from '../services/project-scanner.js';
15
- import { createRepoWorktree, pushWorktreeBranch } from '../services/git-worktree.js';
16
- import { worktreeSlugFromContextAI } from '../services/worktree-slug-ai.js';
17
- import { resolvePairedSpawnBackendType } from './persistent-backend.js';
18
- import { buildRepoSelectCard, buildAdoptSelectCard, buildCodexAppThreadSelectCard, buildSlashListCard, getCliDisplayName, buildConfigCard, buildForkPanelCard, buildAdoptBlockedCard } from '../im/lark/card-builder.js';
19
- import { handleDashboardCommand } from './dashboard-command/index.js';
20
- import { createCliAdapterSync } from '../adapters/cli/registry.js';
21
- import { resolveCliRuntime, runtimeInstallationKey } from '../adapters/cli/runtime.js';
22
- import { deleteMessage, sendMessage, sendUserMessage, replyMessage, listChatBotMembers, resolveUserUnionId, getChatModeStrict, getMessageThreadId, UserTokenMissingError } from '../im/lark/client.js';
23
- import { chatAppLink, threadAppLink, normalizeBrand } from '../im/lark/lark-hosts.js';
24
- import { claimPairing } from '../services/pairing-store.js';
25
- import { logger } from '../utils/logger.js';
26
- import { scheduleTimeZone } from '../utils/timezone.js';
27
- import { closeSession, killWorker, teardownAuthoritativePersistentBackingBeforeClose, suspendWorker, forkWorker, forkAdoptWorker, adoptSandboxBlocked, getCurrentCliVersion, postFreshStreamingCard, postPrivateSnapshotCard, resolvePrivateCardAudience, deliverEphemeralOrReply, deliverWritableTerminalCardTo, requestSessionRestart, isSessionTransferring } from './worker-pool.js';
28
- import { expandHome, getSessionWorkingDir, getProjectScanDirs, rememberLastCliInput, buildNewTopicCliInput, ensureSessionWhiteboard, getAvailableBots, } from './session-manager.js';
29
- import { markInitialUserTurnPending } from './initial-user-turn.js';
30
- import { discoverSlashCommandsForAdapter, listMcpServerNames, supportsFilesystemCommandDiscovery } from './command-discovery.js';
31
- import { validateWorkingDir } from './working-dir.js';
32
- import { repinSessionWorkingDir } from './session-cwd.js';
33
- import { validateAdoptTarget, adoptTargetKey, adoptTargetLabel } from './session-discovery.js';
34
- import { validateZellijAdoptTarget } from './zellij-adopt-discovery.js';
35
- import { listCodexAppThreads } from '../services/codex-app-threads.js';
36
- import { generateAuthUrl, getTokenStatus, resolveUserToken, DOC_COMMENT_OAUTH_SCOPES } from '../utils/user-token.js';
37
- import { DocSubscriptionPermissionError, listDocComments, resolveDocFile, subscribeDocFile, unsubscribeDocFile } from '../im/lark/doc-comment.js';
38
- import { parseDocWatchCommand } from './doc-watch-command.js';
39
- import { parseVcMeetingPrepareCommand } from './vc-meeting-prepare-command.js';
40
- import { latestDocCommentPollCursor } from './doc-comment-poller.js';
41
- import { putDocSubscription, removeDocSubscription, listDocSubscriptionsForSession, listAllDocSubscriptions, getDocSubscription, } from '../services/doc-subs-store.js';
42
- import { findVcMeetingPreparationByChat, getVcMeetingPreparation, listVcMeetingPreparations, putVcMeetingPreparation, removeVcMeetingPreparation, removeVcMeetingPreparationsByChat, } from '../services/vc-meeting-preparations-store.js';
43
- import { bindOncall, unbindOncall, getOncallStatus } from '../services/oncall-store.js';
44
- import { CONFIG_FIELDS, findConfigField, settableFieldKeys, parseBooleanValue, applyConfigField, setBotAllowedUsers, getConfigSnapshot, getConfigCardData, coerceConfigValue, } from '../services/bot-config-store.js';
45
- import { resolveCliId, findInvalidAllowedUserEntries } from '../setup/bot-config-editor.js';
46
- import { buildClosedSessionCard } from './closed-session-card.js';
47
- import { ttadkConfigModelChoices } from '../setup/cli-selection.js';
48
- import { publishAttentionPatch, publishClosedSessionPatch, announcePendingRepoSession } from './session-activity.js';
49
- import { setCardMode } from '../services/card-mode-store.js';
50
- import { canOperate } from '../im/lark/event-dispatcher.js';
51
- import { buildSafeInsightReport } from '../services/insight/report.js';
52
- import { invalidWorkingDirs } from '../utils/working-dir.js';
53
- import { writeRoleFile, deleteRoleFile, resolveRole, resolveRoleFile, resolveTeamRoleFile, writeTeamRoleFile, deleteTeamRoleFile, MAX_ROLE_BYTES } from './role-resolver.js';
54
- import { getBotCapability, setBotCapability, clearBotCapability } from '../services/bot-profile-store.js';
55
- import { deleteRoleProfileEntry, deleteRoleProfileIfEmpty, isValidRoleProfileId, listRoleProfileEntries, listRoleProfiles, MAX_ROLE_PROFILE_ENTRY_BYTES, readRoleProfileEntry, writeRoleProfileEntry, } from '../services/role-profile-store.js';
56
- import { sessionKey, sessionAnchorId, markRepoCardConsumed, claimCurrentRepoCard } from './types.js';
57
- import { t, localeForBot } from '../i18n/index.js';
58
- import { runSkillsImCommand } from './skills/im-command.js';
59
- import { fetchDaemonIpc } from './daemon-ipc-auth.js';
60
- import { updateSessionTitle } from './session-title.js';
61
- import { requestAgentSessionRename } from './session-rename.js';
62
- import { configuredRuntimeDisplayName, sessionConfiguredRuntimeDisplayName, } from './cli-runtime-display.js';
63
- // ─── Exported constants ──────────────────────────────────────────────────────
64
- // DAEMON_COMMANDS / PASSTHROUGH_COMMANDS / normalizePassthroughCommand now live
65
- // in the leaf ./passthrough-commands.js so the config store can share the
66
- // normalization without a circular import; imported for internal use and
67
- // re-exported to keep callers (daemon.ts, tests) importing from command-handler
68
- // unchanged.
69
- import { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS, normalizePassthroughCommand, parseCustomPassthroughInput } from './passthrough-commands.js';
70
- export { DAEMON_COMMANDS, PASSTHROUGH_COMMANDS };
71
- /**
72
- * Daemon commands that act on the chat itself rather than opening a
73
- * conversation. `/group` (`/g`) just creates a Lark group and replies once —
74
- * no follow-up turns, no CLI worker. The new-topic spawn path normally
75
- * pre-creates a sessionStore record so a command can attach state and keep
76
- * card buttons routable, but for these that record is a phantom conversation
77
- * that pollutes the dashboard's session list. Handle them without a session.
78
- */
79
- export const SESSIONLESS_DAEMON_COMMANDS = new Set(['/group', '/g', '/list-slash-command', '/slash', '/botconfig', '/dashboard', '/skills', '/vc-auth', '/watch-comment', '/issue']);
80
- const SLASH_GROUP_NAME_MAX_UTF16_LENGTH = 50;
81
- /** Apply the machine-wide prefix used only by `/group` and `/g`, then keep the
82
- * existing Lark headroom. The legacy limit is measured in UTF-16 code units;
83
- * iterating by code point keeps that limit without slicing an emoji's
84
- * surrogate pair. */
85
- export function formatSlashGroupName(name, prefix = '') {
86
- const prefixed = prefix && !name.startsWith(prefix) ? `${prefix}${name}` : name;
87
- if (prefixed.length <= SLASH_GROUP_NAME_MAX_UTF16_LENGTH)
88
- return prefixed;
89
- let truncated = '';
90
- for (const character of prefixed) {
91
- if (truncated.length + character.length > SLASH_GROUP_NAME_MAX_UTF16_LENGTH)
92
- break;
93
- truncated += character;
94
- }
95
- return `${truncated}…`;
96
- }
97
- /**
98
- * Daemon commands that operate on an ALREADY-EXISTING session and must never
99
- * pre-create one. With no real session to operate on, the daemon routes must skip their generic
100
- * "createSession + activeSessions.set(worker:null)" pre-create block and let
101
- * handleCommand's `!ds` branch reply no_active_session. Without this, one of these commands
102
- * in a brand-new topic (or a thread with no session) would spawn a phantom
103
- * worker:null session just to handle it, polluting the dashboard. (Same class
104
- * of fix as the `/card` / `/term` special cases in daemon.ts.)
105
- */
106
- export const EXISTING_SESSION_ONLY_DAEMON_COMMANDS = new Set(['/rename', '/fork', '/forklist']);
107
- export function resolveAdapterDefaultPassthroughCommands(larkAppId) {
108
- if (!larkAppId)
109
- return [];
110
- try {
111
- const bot = getBot(larkAppId);
112
- const adapter = createCliAdapterSync(bot.config.cliId, bot.config.cliPathOverride);
113
- const normalized = (adapter.defaultPassthroughCommands ?? [])
114
- .map(normalizePassthroughCommand)
115
- .filter((c) => !!c);
116
- return [...new Set(normalized)];
117
- }
118
- catch {
119
- return [];
120
- }
121
- }
122
- /**
123
- * Effective passthrough set for a bot: the fixed {@link PASSTHROUGH_COMMANDS}
124
- * plus adapter-scoped defaults and the bot's `customPassthroughCommands`
125
- * (bots.json). Entries that would shadow a botmux daemon command are dropped —
126
- * daemon commands must keep their daemon semantics, and passthrough is checked
127
- * BEFORE DAEMON_COMMANDS in the router, so an un-filtered custom `/status`
128
- * would hijack the daemon's own.
129
- * Unknown / no bot → falls back to the builtin set unchanged.
130
- */
131
- export function resolvePassthroughCommands(larkAppId) {
132
- const effective = new Set(PASSTHROUGH_COMMANDS);
133
- if (!larkAppId)
134
- return effective;
135
- for (const c of resolveAdapterDefaultPassthroughCommands(larkAppId)) {
136
- effective.add(c);
137
- }
138
- try {
139
- for (const c of getBot(larkAppId).config.customPassthroughCommands ?? []) {
140
- const normalized = normalizePassthroughCommand(c);
141
- if (normalized)
142
- effective.add(normalized);
143
- }
144
- }
145
- catch {
146
- /* unknown bot — builtin set only */
147
- }
148
- return effective;
149
- }
150
- const MULTILINE_COMMANDS = new Set(['/schedule', '/role', '/fork']);
151
- // `validateWorkingDir` now lives in ./working-dir.js (leaf module the CLI can
152
- // import without the daemon graph); re-exported here for existing callers.
153
- export { validateWorkingDir };
154
- /**
155
- * Resolve a non-numeric `/repo <arg>` into a concrete repo path + display name.
156
- * `arg` is either a path (absolute or relative) or a first-level project name
157
- * under one of the bot's scan dirs — letting the user skip the selection card.
158
- *
159
- * Resolution:
160
- * 1. Build candidate absolute paths — absolute / `~` taken as-is; relative or
161
- * bare names resolved against each scan dir, then the daemon cwd (mirrors
162
- * how the card's project list is rooted).
163
- * 2. Return the first directly existing candidate, describing its git ref
164
- * without scanning unrelated roots. This is lenient like `/cd`, whose trust
165
- * model is "owner explicitly chose a dir"; the CLI already runs with full
166
- * FS access.
167
- * 3. Only for a bare name that did not directly resolve, scan projects and
168
- * match by basename (covers projects nested deeper than the scan-dir top
169
- * level).
170
- * Returns null when nothing resolves to an existing directory.
171
- */
172
- export function resolveRepoSelection(repoArg, scanDirs) {
173
- const isExplicitPath = repoArg.startsWith('/') ||
174
- repoArg.startsWith('~') ||
175
- repoArg.startsWith('.') ||
176
- repoArg.includes('/');
177
- const candidates = [];
178
- if (repoArg.startsWith('/') || repoArg.startsWith('~')) {
179
- candidates.push(resolve(expandHome(repoArg)));
180
- }
181
- else {
182
- for (const d of scanDirs)
183
- candidates.push(resolve(d, repoArg));
184
- candidates.push(resolve(expandHome(repoArg))); // daemon-cwd fallback (matches /cd)
185
- }
186
- // Direct candidates must win before any recursive scan. Besides avoiding
187
- // unnecessary traversal (especially a legacy HOME fallback), describing just
188
- // the selected directory preserves the same "name (branch)" label for repos.
189
- for (const cand of candidates) {
190
- try {
191
- if (!statSync(cand).isDirectory())
192
- continue;
193
- }
194
- catch {
195
- continue; // missing / not a dir — try next candidate
196
- }
197
- const desc = describeProjectDir(cand);
198
- return desc
199
- ? { path: cand, displayName: `${desc.name} (${desc.branch})` }
200
- : { path: cand, displayName: basename(cand) };
201
- }
202
- // Explicit and relative paths have no basename-search semantics: when their
203
- // concrete candidates do not exist, a recursive project scan cannot resolve
204
- // them. Bare names alone may refer to a repo nested below a scan root.
205
- if (isExplicitPath)
206
- return null;
207
- const existingScanDirs = scanDirs.filter((d) => existsSync(d));
208
- const projects = existingScanDirs.length > 0 ? scanMultipleProjects(existingScanDirs) : [];
209
- const byName = projects.find((p) => p.name === repoArg);
210
- if (byName)
211
- return { path: byName.path, displayName: `${byName.name} (${byName.branch})` };
212
- return null;
213
- }
214
- /**
215
- * Parse a force-topic invocation: `/t [prompt]` or `/topic [prompt]`.
216
- *
217
- * This is a routing meta-command, distinct from `parseSlashCommandInvocation`
218
- * (which routes to daemon command handlers). The match conditions are
219
- * deliberately tighter than the regular slash parser:
220
- *
221
- * - exact-prefix match (`/t` / `/topic`, case-insensitive); `/tea` / `/topical`
222
- * must NOT match, otherwise we'd false-trigger on common /-prefixed words.
223
- * - tolerates leading whitespace (mention-stripping can leave a space).
224
- * - prompt is whatever follows the prefix (verbatim, including newlines).
225
- * - `/t` alone (no args) is allowed → empty prompt; the user can fill it in
226
- * while the repo selection card is still pending.
227
- *
228
- * Returns null for anything else, so callers can fall through to the regular
229
- * `parseSlashCommandInvocation` / message-handling path.
230
- */
231
- export function parseForceTopicInvocation(content) {
232
- const trimmed = content.replace(/^\s+/, '');
233
- const match = /^\/(t|topic)(?:\s+([\s\S]*))?$/i.exec(trimmed);
234
- if (!match)
235
- return null;
236
- return { prompt: (match[2] ?? '').trim() };
237
- }
238
- /** Parse a user-authored slash command after leading @mentions have already
239
- * been stripped. Messages that look like command examples or command lists
240
- * are intentionally left for the CLI instead of being intercepted by the
241
- * daemon; otherwise discussion text such as `/adopt <pane>` can accidentally
242
- * trigger real daemon actions. */
243
- export function parseSlashCommandInvocation(content) {
244
- // trim BOTH ends: a trailing newline/space rides into the returned `content`
245
- // and, for a passthrough command relayed verbatim to the CLI (raw_input), gets
246
- // typed as a literal trailing newline — which breaks the CLI's slash-command
247
- // detection (it sees a multi-line message, not a `/cmd`). Internal newlines for
248
- // MULTILINE_COMMANDS are preserved (trim only touches the ends).
249
- const trimmed = content.trim();
250
- if (!trimmed.startsWith('/'))
251
- return null;
252
- const lines = trimmed.split(/\r?\n/);
253
- const firstLine = (lines[0] ?? '').trimEnd();
254
- const [cmdRaw] = firstLine.split(/\s+/);
255
- const cmd = cmdRaw?.toLowerCase();
256
- if (!cmd)
257
- return null;
258
- // Treat angle-bracket placeholders as documentation, not an invocation.
259
- if (/<[^>\r\n]+>/.test(firstLine))
260
- return null;
261
- const restNonBlank = lines.slice(1).map(l => l.trim()).filter(Boolean);
262
- if (restNonBlank.length > 0) {
263
- // A list of slash commands is almost certainly discussion / planning text.
264
- if (restNonBlank.some(l => l.startsWith('/')))
265
- return null;
266
- if (!MULTILINE_COMMANDS.has(cmd))
267
- return null;
268
- }
269
- return { cmd, content: trimmed };
270
- }
271
- function tag(ds) {
272
- return ds.session.sessionId.substring(0, 8);
273
- }
274
- /**
275
- * Lowercased display names of ALL bots known to the deployment, read from the
276
- * shared bots-info.json. This is the only globally-complete, process-stable
277
- * source of "is this @-mention a bot?": production runs one daemon per bot, so
278
- * getAllBots() only sees this process's own bot, and the live chat-member roster
279
- * (listChatBotMembers) can transiently miss a bot — either would let competing
280
- * bot processes disagree on who the first @-mentioned bot is and double-create.
281
- * bots-info.json is a local file merge-written by every daemon at startup.
282
- */
283
- function globalKnownBotNames() {
284
- try {
285
- const p = join(config.session.dataDir, 'bots-info.json');
286
- if (!existsSync(p))
287
- return new Set();
288
- const entries = JSON.parse(readFileSync(p, 'utf-8'));
289
- return new Set(entries.map(e => e.botName?.toLowerCase()).filter((n) => !!n));
290
- }
291
- catch {
292
- return new Set();
293
- }
294
- }
295
- /** Human-friendly name for a bot larkAppId — Lark app display name, else cliId, else the raw id. */
296
- function botDisplayName(larkAppId) {
297
- try {
298
- const bot = getBot(larkAppId);
299
- return bot.botName ?? getCliDisplayName(bot.config.cliId) ?? larkAppId;
300
- }
301
- catch {
302
- return larkAppId;
303
- }
304
- }
305
- function sessionCliDisplayName(ds) {
306
- const botCfg = getBot(ds.larkAppId).config;
307
- const configured = sessionConfiguredRuntimeDisplayName(ds.session, botCfg.cliRuntime);
308
- if (configured)
309
- return configured;
310
- return getCliDisplayName(ds.session.cliId ?? botCfg.cliId);
311
- }
312
- function formatUptime(ms) {
313
- const s = Math.floor(ms / 1000);
314
- if (s < 60)
315
- return `${s}s`;
316
- const m = Math.floor(s / 60);
317
- if (m < 60)
318
- return `${m}m${s % 60}s`;
319
- const h = Math.floor(m / 60);
320
- return `${h}h${m % 60}m`;
321
- }
322
- function codexAppThreadTitle(thread) {
323
- const raw = (thread.name || thread.preview || thread.threadId).replace(/\s+/g, ' ').trim();
324
- return raw.length > 80 ? raw.slice(0, 79) + '…' : raw;
325
- }
326
- function invalidConfiguredWorkingDirs(ds, larkAppId) {
327
- if (ds?.workingDir)
328
- return invalidWorkingDirs({ workingDir: ds.workingDir });
329
- if (larkAppId) {
330
- const bot = getBot(larkAppId);
331
- return invalidWorkingDirs({
332
- workingDir: bot.config.workingDir ?? '~',
333
- workingDirs: bot.config.workingDirs,
334
- });
335
- }
336
- return invalidWorkingDirs({
337
- workingDir: config.daemon.workingDir ?? '~',
338
- workingDirs: config.daemon.workingDirs,
339
- });
340
- }
341
- // ─── Schedule command ────────────────────────────────────────────────────────
342
- async function handleRoleCommand(args, rootId, chatId, larkAppId, senderId, deps) {
343
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
344
- const trimmed = args.trim();
345
- const loc = localeForBot(larkAppId);
346
- const dataDir = config.session.dataDir;
347
- // /role profile [...] — reusable suites of per-bot chat roles. Profiles are
348
- // not a runtime role layer; applying one materializes this bot's entry into
349
- // the current chat role.
350
- const profileMatch = trimmed.match(/^profile\b([\s\S]*)$/);
351
- if (profileMatch) {
352
- const profileArgs = profileMatch[1].trim();
353
- const subMatch = profileArgs.match(/^(\S+)(?:\s+([\s\S]*))?$/);
354
- const sub = (subMatch?.[1] ?? '').toLowerCase();
355
- const subBody = subMatch?.[2]?.trim() ?? '';
356
- if (!sub || sub === 'help') {
357
- await sessionReply(rootId, t('role.profile.help', undefined, loc));
358
- return;
359
- }
360
- if (sub === 'list' || sub === 'ls') {
361
- const profiles = listRoleProfiles(dataDir);
362
- if (profiles.length === 0) {
363
- await sessionReply(rootId, t('role.profile.list_empty', undefined, loc));
364
- return;
365
- }
366
- const lines = profiles.map(p => {
367
- const hasEntry = readRoleProfileEntry(dataDir, p.profileId, larkAppId) !== null;
368
- const status = hasEntry
369
- ? t('role.profile.current_configured', undefined, loc)
370
- : t('role.profile.current_missing', undefined, loc);
371
- return `• ${p.profileId} — ${p.entryCount} ${t('role.profile.entries', undefined, loc)}; ${status}`;
372
- });
373
- await sessionReply(rootId, `${t('role.profile.list_header', undefined, loc)}\n${lines.join('\n')}`);
374
- return;
375
- }
376
- const [profileId = '', ...afterProfile] = subBody.split(/\s+/);
377
- if (!profileId || !isValidRoleProfileId(profileId)) {
378
- await sessionReply(rootId, t('role.profile.invalid', undefined, loc));
379
- return;
380
- }
381
- if (sub === 'show') {
382
- const showAll = afterProfile.includes('--all');
383
- if (showAll) {
384
- const entries = listRoleProfileEntries(dataDir, profileId);
385
- if (entries.length === 0) {
386
- await sessionReply(rootId, t('role.profile.no_entries', { profile: profileId }, loc));
387
- return;
388
- }
389
- const body = entries.map(entry => `### ${entry.larkAppId}\n${t('role.byte_count', { bytes: entry.byteLength, max: MAX_ROLE_PROFILE_ENTRY_BYTES }, loc)}\n\`\`\`markdown\n${entry.content}\n\`\`\``).join('\n\n');
390
- await sessionReply(rootId, `${t('role.profile.show_all_header', { profile: profileId }, loc)}\n${body}`);
391
- return;
392
- }
393
- const content = readRoleProfileEntry(dataDir, profileId, larkAppId);
394
- if (content === null) {
395
- await sessionReply(rootId, t('role.profile.entry_empty', { profile: profileId }, loc));
396
- return;
397
- }
398
- await sessionReply(rootId, `${t('role.profile.entry_current', { profile: profileId }, loc)}\n\`\`\`markdown\n${content}\n\`\`\`\n${t('role.byte_count', { bytes: Buffer.byteLength(content, 'utf-8'), max: MAX_ROLE_PROFILE_ENTRY_BYTES }, loc)}`);
399
- return;
400
- }
401
- if (sub === 'set') {
402
- const content = subBody.slice(profileId.length).trim();
403
- if (!content) {
404
- await sessionReply(rootId, t('role.profile.set_empty', undefined, loc));
405
- return;
406
- }
407
- writeRoleProfileEntry(dataDir, profileId, larkAppId, content);
408
- await sessionReply(rootId, t('role.profile.entry_saved', {
409
- profile: profileId,
410
- bytes: Math.min(Buffer.byteLength(content.trim(), 'utf-8'), MAX_ROLE_PROFILE_ENTRY_BYTES),
411
- max: MAX_ROLE_PROFILE_ENTRY_BYTES,
412
- }, loc));
413
- return;
414
- }
415
- if (sub === 'save') {
416
- const { content, source } = resolveRole(larkAppId, chatId);
417
- if (!content) {
418
- await sessionReply(rootId, t('role.profile.save_no_effective', { profile: profileId }, loc));
419
- return;
420
- }
421
- writeRoleProfileEntry(dataDir, profileId, larkAppId, content);
422
- await sessionReply(rootId, t('role.profile.saved_effective', {
423
- profile: profileId,
424
- source,
425
- bytes: Buffer.byteLength(content, 'utf-8'),
426
- max: MAX_ROLE_PROFILE_ENTRY_BYTES,
427
- }, loc));
428
- return;
429
- }
430
- if (sub === 'delete' || sub === 'del' || sub === 'rm' || sub === '删除') {
431
- const existed = deleteRoleProfileEntry(dataDir, profileId, larkAppId);
432
- deleteRoleProfileIfEmpty(dataDir, profileId);
433
- await sessionReply(rootId, existed
434
- ? t('role.profile.entry_deleted', { profile: profileId }, loc)
435
- : t('role.profile.entry_nothing', { profile: profileId }, loc));
436
- return;
437
- }
438
- if (sub === 'apply') {
439
- const flags = new Set(afterProfile);
440
- const preview = flags.has('--preview');
441
- const force = flags.has('--force');
442
- const quiet = flags.has('--quiet');
443
- const content = readRoleProfileEntry(dataDir, profileId, larkAppId);
444
- if (content === null) {
445
- await sessionReply(rootId, t('role.profile.apply_missing', { profile: profileId }, loc));
446
- return;
447
- }
448
- const existing = resolveRoleFile(larkAppId, chatId);
449
- const bytes = Buffer.byteLength(content, 'utf-8');
450
- if (preview) {
451
- const overwriteLine = existing && !force
452
- ? `\n${t('role.profile.apply_would_refuse', undefined, loc)}`
453
- : '';
454
- await sessionReply(rootId, `${t('role.profile.apply_preview', { profile: profileId, bytes, max: MAX_ROLE_PROFILE_ENTRY_BYTES }, loc)}${overwriteLine}\n\`\`\`markdown\n${content}\n\`\`\``);
455
- return;
456
- }
457
- if (existing && !force) {
458
- // An empty entry would *clear* the chat role, not overwrite it — phrase
459
- // the --force refusal accordingly so the intent is not misread.
460
- const refusedKey = content ? 'role.profile.apply_refused' : 'role.profile.apply_refused_clear';
461
- await sessionReply(rootId, t(refusedKey, { profile: profileId }, loc));
462
- return;
463
- }
464
- if (!content) {
465
- deleteRoleFile(larkAppId, chatId);
466
- if (!quiet) {
467
- await sessionReply(rootId, t('role.profile.applied', { profile: profileId, bytes, max: MAX_ROLE_PROFILE_ENTRY_BYTES }, loc));
468
- }
469
- return;
470
- }
471
- writeRoleFile(larkAppId, chatId, content);
472
- if (!quiet) {
473
- await sessionReply(rootId, t('role.profile.applied', { profile: profileId, bytes, max: MAX_ROLE_PROFILE_ENTRY_BYTES }, loc));
474
- }
475
- return;
476
- }
477
- await sessionReply(rootId, t('role.profile.help', undefined, loc));
478
- return;
479
- }
480
- // /role team [...] — manage the team-level (per-bot, cross-chat) role
481
- const teamMatch = trimmed.match(/^team\b([\s\S]*)$/);
482
- if (teamMatch) {
483
- const teamArgs = teamMatch[1].trim();
484
- const teamSet = teamArgs.match(/^set\s+([\s\S]+)/);
485
- if (teamSet) {
486
- const content = teamSet[1].trim();
487
- if (!content) {
488
- await sessionReply(rootId, t('role.set_empty', undefined, loc));
489
- return;
490
- }
491
- writeTeamRoleFile(larkAppId, content);
492
- await sessionReply(rootId, t('role.team_saved', { bytes: Buffer.byteLength(content, 'utf-8'), max: MAX_ROLE_BYTES }, loc));
493
- return;
494
- }
495
- if (teamArgs === 'delete' || teamArgs === '删除') {
496
- await sessionReply(rootId, deleteTeamRoleFile(larkAppId) ? t('role.team_deleted', undefined, loc) : t('role.team_nothing', undefined, loc));
497
- return;
498
- }
499
- const content = resolveTeamRoleFile(larkAppId);
500
- if (content) {
501
- await sessionReply(rootId, `${t('role.team_current', undefined, loc)}\n\`\`\`markdown\n${content}\n\`\`\`\n${t('role.byte_count', { bytes: Buffer.byteLength(content, 'utf-8'), max: MAX_ROLE_BYTES }, loc)}`);
502
- }
503
- else {
504
- await sessionReply(rootId, t('role.team_empty', undefined, loc));
505
- }
506
- return;
507
- }
508
- // /role cap [...] — manage the short capability label shown in the roster
509
- const capMatch = trimmed.match(/^cap\b([\s\S]*)$/);
510
- if (capMatch) {
511
- const capArgs = capMatch[1].trim();
512
- const capSet = capArgs.match(/^set\s+([\s\S]+)/);
513
- if (capSet) {
514
- const label = capSet[1].trim();
515
- if (!label) {
516
- await sessionReply(rootId, t('role.cap_set_empty', undefined, loc));
517
- return;
518
- }
519
- setBotCapability(dataDir, larkAppId, label, senderId);
520
- await sessionReply(rootId, t('role.cap_saved', { cap: getBotCapability(dataDir, larkAppId) ?? label }, loc));
521
- return;
522
- }
523
- if (capArgs === 'clear' || capArgs === '清除') {
524
- await sessionReply(rootId, clearBotCapability(dataDir, larkAppId) ? t('role.cap_cleared', undefined, loc) : t('role.cap_empty', undefined, loc));
525
- return;
526
- }
527
- const cap = getBotCapability(dataDir, larkAppId);
528
- await sessionReply(rootId, cap ? t('role.cap_current', { cap }, loc) : t('role.cap_empty', undefined, loc));
529
- return;
530
- }
531
- // /role → show the EFFECTIVE role + where it comes from (chat override > team > none)
532
- if (!trimmed) {
533
- const { content, source } = resolveRole(larkAppId, chatId);
534
- if (content) {
535
- const len = Buffer.byteLength(content, 'utf-8');
536
- const srcLabel = source === 'chat' ? t('role.src_chat', undefined, loc) : t('role.src_team', undefined, loc);
537
- await sessionReply(rootId, `${t('role.current', undefined, loc)} ${srcLabel}\n\`\`\`markdown\n${content}\n\`\`\`\n${t('role.byte_count', { bytes: len, max: MAX_ROLE_BYTES }, loc)}`);
538
- }
539
- else {
540
- await sessionReply(rootId, t('role.empty', undefined, loc));
541
- }
542
- return;
543
- }
544
- // /role set <content> — write role file
545
- const setMatch = trimmed.match(/^set\s+([\s\S]+)/);
546
- if (setMatch) {
547
- const content = setMatch[1].trim();
548
- if (!content) {
549
- await sessionReply(rootId, t('role.set_empty', undefined, loc));
550
- return;
551
- }
552
- writeRoleFile(larkAppId, chatId, content);
553
- const len = Buffer.byteLength(content, 'utf-8');
554
- await sessionReply(rootId, t('role.saved_via_cmd', { bytes: len, max: MAX_ROLE_BYTES }, loc));
555
- return;
556
- }
557
- // /role delete
558
- if (trimmed === 'delete' || trimmed === '删除') {
559
- const existed = deleteRoleFile(larkAppId, chatId);
560
- if (existed) {
561
- await sessionReply(rootId, t('role.deleted_via_cmd', undefined, loc));
562
- }
563
- else {
564
- await sessionReply(rootId, t('role.nothing_to_delete', undefined, loc));
565
- }
566
- return;
567
- }
568
- // /role help — fallback
569
- await sessionReply(rootId, t('role.help', undefined, loc));
570
- }
571
- /**
572
- * Resolve the workingDir for a newly created scheduled task, mirroring the
573
- * layered lookup used by the normal new-session spawn path (see
574
- * `resolvePinnedWorkingDir` in daemon.ts) but STRICTLY read-only: it never
575
- * triggers the defaultOncall auto-bind side effect (which writes to bots.json).
576
- * Creating a schedule must not mutate oncall binding state.
577
- *
578
- * Priority:
579
- * 1) existing session workingDir (ds.workingDir — already pinned via /cd or
580
- * a previously-applied oncall bind)
581
- * 2) this bot/chat oncall binding (read-only findOncallChat, no auto-bind)
582
- * 3) this bot's effective default working dir (defaultWorkingDir, or
583
- * defaultOncall.workingDir when Oncall 模式 is on)
584
- * 4) legacy bot.config.workingDir
585
- * 5) '~'
586
- *
587
- * Deliberate deltas vs `resolvePinnedWorkingDir` (do NOT "sync" them away):
588
- * - no sibling-inherit layer (findInheritablePeer) — a schedule needs a
589
- * deterministic dir at create time, not whatever peer session happens to
590
- * be open at that moment;
591
- * - extra layers 4/5 — a schedule has no interactive repo-select card to
592
- * fall back on, so it must always resolve to something;
593
- * - every layer validates the candidate dir and falls through when it is
594
- * stale (deleted/renamed): a dead path would otherwise be baked into
595
- * schedules.json (workingDir is not editable afterwards) and every fire
596
- * would silently spawn in $HOME. This includes layer 1 — a ds restored
597
- * by restoreActiveSessions (worker:null) or idle-suspended keeps a
598
- * workingDir no live process is running in, so it can be stale too.
599
- */
600
- function resolveScheduleWorkingDir(ds, chatId, larkAppId) {
601
- // Validate candidates and fall through (returning the RAW form — keep `~`;
602
- // expansion happens at fire time via getSessionWorkingDir), matching the
603
- // other copies of this ladder (daemon resolveBotDefaultWorkingDir,
604
- // trigger-session).
605
- const usable = (dir, layer) => {
606
- const v = validateWorkingDir(dir);
607
- if (v.ok)
608
- return true;
609
- logger.warn(`[schedule] ${layer} workingDir "${dir}" invalid — falling through: ${v.error}`);
610
- return false;
611
- };
612
- // Layer 1: existing session dir already pinned.
613
- if (ds?.workingDir && usable(ds.workingDir, 'session'))
614
- return ds.workingDir;
615
- const appId = ds?.larkAppId ?? larkAppId;
616
- // getBot() throws for unregistered ids — degrade to the '~' fallback
617
- // instead of aborting the whole /schedule command.
618
- let bot;
619
- try {
620
- bot = appId ? getBot(appId) : getAllBots()[0];
621
- }
622
- catch {
623
- bot = undefined;
624
- }
625
- if (!bot)
626
- return '~';
627
- // Layer 2: oncall binding for this chat (read-only — does NOT auto-bind).
628
- const oncallEntry = findOncallChat(bot.config.larkAppId, ds?.chatId ?? chatId);
629
- if (oncallEntry?.workingDir && usable(oncallEntry.workingDir, 'oncall-binding')) {
630
- return oncallEntry.workingDir;
631
- }
632
- // Layer 3: effective default working dir (defaultWorkingDir or
633
- // defaultOncall.workingDir). Read-only — never writes state.
634
- const effectiveDefault = effectiveDefaultWorkingDir(bot.config);
635
- if (effectiveDefault && usable(effectiveDefault, 'effective-default'))
636
- return effectiveDefault;
637
- // Layer 4: legacy workingDir field.
638
- if (bot.config.workingDir && usable(bot.config.workingDir, 'legacy'))
639
- return bot.config.workingDir;
640
- // Layer 5: home fallback.
641
- return '~';
642
- }
643
- async function handleScheduleCommand(args, rootId, chatId, deps, larkAppId) {
644
- const { activeSessions } = deps;
645
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
646
- const trimmed = args.trim();
647
- const loc = localeForBot(larkAppId);
648
- // Format dates using a locale that matches the user's UI choice. Both
649
- // forms include the wall-clock components the user cares about; the
650
- // difference is just punctuation and digit order.
651
- const timeLocale = loc === 'en' ? 'en-US' : 'zh-CN';
652
- const timeZone = scheduleTimeZone();
653
- // /schedule list | /schedule 列表
654
- if (!trimmed || trimmed === 'list' || trimmed === '列表') {
655
- const tasks = scheduleStore.listTasks();
656
- if (tasks.length === 0) {
657
- await sessionReply(rootId, t('schedule.empty_with_examples', undefined, loc));
658
- return;
659
- }
660
- const lines = tasks.map(task => {
661
- const status = task.enabled ? '✅' : '⏸️';
662
- const next = task.enabled ? scheduler.getNextRun(task.id) : null;
663
- const nextStr = next ? t('schedule.next_label', { time: next.toLocaleString(timeLocale, { timeZone }) }, loc) : '';
664
- const lastStr = task.lastRunAt ? t('schedule.last_label', { time: new Date(task.lastRunAt).toLocaleString(timeLocale, { timeZone }) }, loc) : '';
665
- const display = task.parsed?.display ?? task.schedule;
666
- return `${status} [${task.id}] ${display} | ${task.name}${task.silent ? ' 🔇' : ''}\n prompt: ${task.prompt.substring(0, 50)}${task.prompt.length > 50 ? '...' : ''}${nextStr}${lastStr}`;
667
- });
668
- await sessionReply(rootId, `${t('schedule.list_header', { count: tasks.length }, loc)}\n\n${lines.join('\n\n')}`);
669
- return;
670
- }
671
- // /schedule remove <id> | /schedule 删除 <id>
672
- const removeMatch = trimmed.match(/^(?:remove|删除)\s+(\S+)/);
673
- if (removeMatch) {
674
- const id = removeMatch[1];
675
- if (scheduler.removeTask(id)) {
676
- await sessionReply(rootId, t('schedule.removed', { id }, loc));
677
- }
678
- else {
679
- await sessionReply(rootId, t('schedule.not_found', { id }, loc));
680
- }
681
- return;
682
- }
683
- // /schedule enable <id> | /schedule 启用 <id>
684
- const enableMatch = trimmed.match(/^(?:enable|启用)\s+(\S+)/);
685
- if (enableMatch) {
686
- const id = enableMatch[1];
687
- if (scheduler.enableTask(id)) {
688
- await sessionReply(rootId, t('schedule.enabled', { id }, loc));
689
- }
690
- else {
691
- await sessionReply(rootId, t('schedule.not_found', { id }, loc));
692
- }
693
- return;
694
- }
695
- // /schedule disable <id> | /schedule 禁用 <id>
696
- const disableMatch = trimmed.match(/^(?:disable|禁用)\s+(\S+)/);
697
- if (disableMatch) {
698
- const id = disableMatch[1];
699
- if (scheduler.disableTask(id)) {
700
- await sessionReply(rootId, t('schedule.disabled', { id }, loc));
701
- }
702
- else {
703
- await sessionReply(rootId, t('schedule.not_found', { id }, loc));
704
- }
705
- return;
706
- }
707
- // /schedule run <id> | /schedule 执行 <id>
708
- const runMatch = trimmed.match(/^(?:run|执行)\s+(\S+)/);
709
- if (runMatch) {
710
- const id = runMatch[1];
711
- if (scheduler.runTaskNow(id)) {
712
- await sessionReply(rootId, t('schedule.triggered_now', { id }, loc));
713
- }
714
- else {
715
- await sessionReply(rootId, t('schedule.not_found', { id }, loc));
716
- }
717
- return;
718
- }
719
- // Natural language: /schedule 每日17:50给我"帮我看看AI新闻"
720
- const parsed = scheduler.parseNaturalSchedule(trimmed);
721
- if (parsed) {
722
- const ds = larkAppId ? activeSessions.get(sessionKey(rootId, larkAppId)) : undefined;
723
- const workingDir = resolveScheduleWorkingDir(ds, chatId, larkAppId);
724
- const capturedScope = ds?.scope === 'chat' ? 'chat' : 'thread';
725
- const capturedRootMessageId = capturedScope === 'thread' ? rootId : undefined;
726
- const { executionPosition: requestedPosition, silent, prompt: schedPrompt } = scheduler.extractScheduleModifiers(parsed.prompt);
727
- const executionPosition = requestedPosition
728
- ?? (capturedScope === 'thread' ? 'topic' : 'top-level');
729
- const taskScope = executionPosition === 'topic' ? 'thread' : 'chat';
730
- const schedName = schedPrompt !== parsed.prompt
731
- ? (schedPrompt.length > 20 ? schedPrompt.slice(0, 20) + '...' : schedPrompt)
732
- : parsed.name;
733
- const task = scheduler.addTask({
734
- name: schedName,
735
- schedule: trimmed,
736
- parsed: parsed.parsed,
737
- prompt: schedPrompt,
738
- workingDir,
739
- chatId,
740
- // Retain the captured root even when top-level is selected so the task
741
- // can later switch back to topic execution without losing its anchor.
742
- rootMessageId: capturedRootMessageId,
743
- scope: taskScope,
744
- executionPosition,
745
- chatType: ds?.chatType === 'p2p' ? 'p2p' : 'topic_group',
746
- larkAppId,
747
- deliver: 'origin',
748
- silent,
749
- });
750
- const next = scheduler.getNextRun(task.id);
751
- const nextStr = next ? next.toLocaleString(timeLocale, { timeZone }) : 'N/A';
752
- const createdMsg = t('schedule.created', {
753
- id: task.id,
754
- name: task.name,
755
- rule: parsed.parsed.display,
756
- prompt: task.prompt,
757
- dir: expandHome(workingDir),
758
- next: nextStr,
759
- }, loc);
760
- const positionNote = '\n' + t(executionPosition === 'new-topic'
761
- ? 'schedule.deliver_new_topic'
762
- : executionPosition === 'top-level'
763
- ? 'schedule.position_top_level'
764
- : 'schedule.position_topic', undefined, loc);
765
- const silentNote = silent ? '\n' + t('schedule.silent_note', undefined, loc) : '';
766
- await sessionReply(rootId, createdMsg + positionNote + silentNote);
767
- return;
768
- }
769
- // Unrecognized format
770
- await sessionReply(rootId, t('schedule.parse_failed', undefined, loc));
771
- }
772
- // ─── Config command ──────────────────────────────────────────────────────────
773
- function configEffectNote(effect, loc) {
774
- return effect === 'immediate'
775
- ? t('cmd.config.effect_immediate', undefined, loc)
776
- : t('cmd.config.effect_next_session', undefined, loc);
777
- }
778
- /** `/botconfig zh|en`(及常见别名)→ 卡片显示语言;非语言参数 → undefined(按子命令走)。 */
779
- function cardLocaleArg(sub) {
780
- if (!sub)
781
- return undefined;
782
- if (sub === 'zh' || sub === 'cn' || sub === '中文' || sub === '中')
783
- return 'zh';
784
- if (sub === 'en' || sub === 'english' || sub === '英文' || sub === '英')
785
- return 'en';
786
- return undefined;
787
- }
788
- function buildConfigHelp(loc) {
789
- const fields = CONFIG_FIELDS.map(f => `• ${f.key} — ${f.hint}`).join('\n');
790
- return t('cmd.config.help', { fields }, loc);
791
- }
792
- function buildConfigSnapshot(larkAppId, loc) {
793
- const snap = getConfigSnapshot(larkAppId);
794
- if (!snap.ok)
795
- return t('cmd.config.no_bot', undefined, loc);
796
- const lines = snap.rows.map(r => `• ${r.key} = ${r.value}`).join('\n');
797
- return t('cmd.config.snapshot', {
798
- cli: snap.info.cliId,
799
- brand: snap.info.brand,
800
- admins: snap.info.resolvedAdmins,
801
- dirs: snap.info.workingDirs.join(', ') || '∅',
802
- fields: lines,
803
- }, loc);
804
- }
805
- /**
806
- * `/botconfig set allowedUsers ...` —— 动信任根的敏感路径,与普通字段分开:
807
- * 末尾的 `确认`/`confirm` 才真正落盘;缺确认 → 回显预览要求二次确认。
808
- * 非法条目(裸邮箱前缀等)先挡;防自锁 / 解析空由 {@link setBotAllowedUsers} 兜底。
809
- */
810
- async function applyAllowedUsersSet(tokens, rootId, larkAppId, senderId, deps, loc) {
811
- const reply = (c) => deps.sessionReply(rootId, c, undefined, larkAppId);
812
- let list = [...tokens];
813
- let confirmed = false;
814
- if (list.length && /^(confirm|确认|yes|--yes)$/i.test(list[list.length - 1])) {
815
- confirmed = true;
816
- list = list.slice(0, -1);
817
- }
818
- const entries = list.join(' ').split(/[,\s]+/).map(s => s.trim()).filter(Boolean);
819
- if (entries.length === 0) {
820
- await reply(t('cmd.config.allow_usage', undefined, loc));
821
- return;
822
- }
823
- const invalid = findInvalidAllowedUserEntries(entries);
824
- if (invalid.length) {
825
- await reply(t('cmd.config.allow_invalid', { items: invalid.join(', ') }, loc));
826
- return;
827
- }
828
- if (!confirmed) {
829
- await reply(t('cmd.config.allow_confirm', { list: entries.join(', ') }, loc));
830
- return;
831
- }
832
- const r = await setBotAllowedUsers(larkAppId, entries, senderId);
833
- if (!r.ok) {
834
- if (r.reason === 'self_lockout') {
835
- await reply(t('cmd.config.allow_lockout', undefined, loc));
836
- return;
837
- }
838
- if (r.reason === 'empty_resolved') {
839
- await reply(t('cmd.config.allow_empty', undefined, loc));
840
- return;
841
- }
842
- await reply(t('cmd.config.write_failed', { reason: r.reason }, loc));
843
- return;
844
- }
845
- await reply(t('cmd.config.allow_ok', { count: r.resolved.length, total: r.raw.length }, loc));
846
- }
847
- /**
848
- * `/botconfig` —— owner/allowedUsers 远程改本 bot 运营字段。sessionless:只认 larkAppId,
849
- * 不需活跃会话。严格 admin 闸(拒绝开放模式 bot),写盘 + 内存热更新,无需重启。
850
- */
851
- async function handleConfigCommand(message, rootId, larkAppId, deps) {
852
- const loc = localeForBot(larkAppId);
853
- const reply = (c) => deps.sessionReply(rootId, c, undefined, larkAppId);
854
- const senderId = message.senderId;
855
- // Admin 闸:严格限定 allowedUsers,**拒绝开放模式**(无 allowlist 的 bot 没有可
856
- // 授权的 owner,不能凭聊天改配置)。上游 canOperate 对开放模式 / 兄弟 bot 也放行,
857
- // 改配置比一般 daemon 命令敏感,这里收紧到「本 bot 的 allowedUsers」。
858
- let bot;
859
- try {
860
- bot = getBot(larkAppId);
861
- }
862
- catch {
863
- await reply(t('cmd.config.no_bot', undefined, loc));
864
- return;
865
- }
866
- const admins = bot.resolvedAllowedUsers;
867
- if (admins.length === 0) {
868
- await reply(t('cmd.config.no_owner', undefined, loc));
869
- return;
870
- }
871
- if (!senderId || !admins.includes(senderId)) {
872
- await reply(t('cmd.config.not_admin', undefined, loc));
873
- return;
874
- }
875
- const trimmed = message.content.replace(/^\/botconfig\s*/i, '').trim();
876
- const parts = trimmed ? trimmed.split(/\s+/) : [];
877
- const sub = parts[0]?.toLowerCase();
878
- // 裸 /botconfig → 交互配置卡片;`/botconfig zh|en` → 指定卡片显示语言(覆盖 bot 默认)。
879
- const cardLoc = cardLocaleArg(sub);
880
- if (!sub || cardLoc) {
881
- const renderLoc = cardLoc ?? loc;
882
- // ttadk 网关 bot:模型候选用 ttadk 网关模型(glm-5.1…),不是底层适配器的
883
- // opus/gpt-5(那会被 worker 注入成 `ttadk -m opus` 用错模型启动失败);CoCo 无候选。
884
- // 非 ttadk(返回 null)才回落底层适配器自己的 modelChoices。
885
- const ttadkChoices = ttadkConfigModelChoices(bot.config.wrapperCli);
886
- let modelChoices = ttadkChoices ?? [];
887
- if (ttadkChoices === null) {
888
- try {
889
- modelChoices = createCliAdapterSync(bot.config.cliId, bot.config.cliPathOverride).modelChoices ?? [];
890
- }
891
- catch { /* 无候选 → 不渲染 model 下拉 */ }
892
- }
893
- const data = getConfigCardData(larkAppId, modelChoices);
894
- if (!data) {
895
- await reply(buildConfigHelp(renderLoc));
896
- return;
897
- }
898
- const cardJson = buildConfigCard(data, renderLoc);
899
- // 始终把卡片**私信**给 owner,群里不留任何回复:
900
- // • 私聊(单发给 bot)→ sendUserMessage 落在当前私聊 = 直接返回配置;
901
- // • 群 / 话题群 → 卡片落在 owner 私聊,群内不产生「话题回复」、也只他可见。
902
- // 不再依赖 getChatModeStrict(它会偶发 500 → 误判)。
903
- // 私信失败(owner 从未与 bot 开过单聊等):**绝不**把整张配置卡回退到会话内——
904
- // 在群/话题群里那会让 owner-only 的运营配置卡全员可见(按钮虽仍重验 admin 无法提权,
905
- // 但卡片本身就违背「始终私信」意图)。只回一句简短文字引导去单聊后重试。
906
- try {
907
- await sendUserMessage(larkAppId, senderId, cardJson, 'interactive');
908
- }
909
- catch {
910
- await reply(t('cmd.config.card_dm_failed', undefined, renderLoc));
911
- }
912
- return;
913
- }
914
- if (sub === 'help' || sub === '帮助') {
915
- await reply(buildConfigHelp(loc));
916
- return;
917
- }
918
- if (sub === 'get' || sub === 'show' || sub === 'list' || sub === '查看') {
919
- await reply(buildConfigSnapshot(larkAppId, loc));
920
- return;
921
- }
922
- if (sub === 'set' || sub === 'unset') {
923
- const fieldKey = parts[1];
924
- if (!fieldKey) {
925
- await reply(t('cmd.config.set_usage', undefined, loc));
926
- return;
927
- }
928
- const spec = findConfigField(fieldKey);
929
- if (!spec) {
930
- await reply(t('cmd.config.unknown_field', { field: fieldKey, fields: settableFieldKeys().join(', ') }, loc));
931
- return;
932
- }
933
- if (sub === 'unset') {
934
- if (!spec.clearable) {
935
- await reply(t('cmd.config.not_clearable', { field: spec.key }, loc));
936
- return;
937
- }
938
- const r = await applyConfigField(larkAppId, spec, null);
939
- if (!r.ok) {
940
- await reply(t('cmd.config.write_failed', { reason: r.reason }, loc));
941
- return;
942
- }
943
- await reply(t('cmd.config.unset_ok', { field: spec.key, old: r.oldText, effect: configEffectNote(r.effect, loc) }, loc));
944
- return;
945
- }
946
- // set
947
- if (spec.kind === 'allowedUsers') {
948
- await applyAllowedUsersSet(parts.slice(2), rootId, larkAppId, senderId, deps, loc);
949
- return;
950
- }
951
- const rawValue = parts.slice(2).join(' ').trim();
952
- if (!rawValue) {
953
- await reply(t('cmd.config.value_required', { field: spec.key }, loc));
954
- return;
955
- }
956
- let value;
957
- switch (spec.kind) {
958
- case 'stringList': {
959
- // 与 card/config-store 路径(bot-config-store.ts 的 coerce)同口径:优先用
960
- // 字段自带的 parseList——canTalkDaemonCommands / startupCommands 的解析规则
961
- // 与默认的 parseCustomPassthroughInput 相反或不同,硬编码默认解析器会把
962
- // 合法输入静默滤光成"空值"。
963
- const arr = (spec.parseList ?? parseCustomPassthroughInput)(rawValue);
964
- if (arr.length === 0) {
965
- await reply(t('cmd.config.value_required', { field: spec.key }, loc));
966
- return;
967
- }
968
- value = arr;
969
- break;
970
- }
971
- case 'number': {
972
- // 统一走 coerceConfigValue 的 number 校验(正整数),避免文字路径把 '6'
973
- // 当字符串写进 maxLiveWorkers(与 card/API 路径同口径)。
974
- const coerced = coerceConfigValue(spec, rawValue);
975
- if (!coerced.ok) {
976
- await reply(t('cmd.config.invalid_number', { field: spec.key, value: rawValue }, loc));
977
- return;
978
- }
979
- value = coerced.value;
980
- break;
981
- }
982
- case 'boolean': {
983
- const b = parseBooleanValue(rawValue);
984
- if (b === undefined) {
985
- await reply(t('cmd.config.invalid_bool', { field: spec.key, value: rawValue }, loc));
986
- return;
987
- }
988
- value = b;
989
- break;
990
- }
991
- case 'enum': {
992
- const v = rawValue.toLowerCase();
993
- if (!spec.enumValues?.includes(v)) {
994
- await reply(t('cmd.config.invalid_enum', { field: spec.key, values: (spec.enumValues ?? []).join('|') }, loc));
995
- return;
996
- }
997
- value = v;
998
- break;
999
- }
1000
- case 'cli': {
1001
- try {
1002
- const id = resolveCliId(rawValue);
1003
- if (!id) {
1004
- await reply(t('cmd.config.value_required', { field: spec.key }, loc));
1005
- return;
1006
- }
1007
- value = id;
1008
- }
1009
- catch (e) {
1010
- await reply(t('cmd.config.invalid_cli', { msg: e?.message ?? String(e) }, loc));
1011
- return;
1012
- }
1013
- break;
1014
- }
1015
- case 'dir': {
1016
- const v = validateWorkingDir(rawValue, loc);
1017
- if (!v.ok) {
1018
- await reply(v.error);
1019
- return;
1020
- }
1021
- value = rawValue; // 存原始(保留 ~),与 workingDir 落盘一致;使用处再 expandHome
1022
- break;
1023
- }
1024
- case 'json': {
1025
- const coerced = coerceConfigValue(spec, rawValue);
1026
- if (!coerced.ok) {
1027
- await reply(t('cmd.config.write_failed', { reason: coerced.reason }, loc));
1028
- return;
1029
- }
1030
- value = coerced.value;
1031
- break;
1032
- }
1033
- default: { // 'string'
1034
- // 与 dashboard PUT 同口径:string 字段也过 coerceConfigValue(长度上限
1035
- // maxLen 等约束在 spec 上,避免 IM 文本入口绕过校验)。
1036
- const coerced = coerceConfigValue(spec, rawValue);
1037
- if (!coerced.ok) {
1038
- await reply(t('cmd.config.write_failed', { reason: coerced.reason }, loc));
1039
- return;
1040
- }
1041
- value = coerced.value;
1042
- }
1043
- }
1044
- const r = await applyConfigField(larkAppId, spec, value);
1045
- if (!r.ok) {
1046
- await reply(t('cmd.config.write_failed', { reason: r.reason }, loc));
1047
- return;
1048
- }
1049
- await reply(t('cmd.config.set_ok', { field: spec.key, old: r.oldText, new: r.newText, effect: configEffectNote(r.effect, loc) }, loc));
1050
- return;
1051
- }
1052
- await reply(t('cmd.config.unknown_sub', { sub }, loc));
1053
- }
1054
- // ─── Main command handler ────────────────────────────────────────────────────
1055
- /**
1056
- * Handle `/card` (operator-only). Resolves the active session itself, so off/on
1057
- * work WITHOUT one -- they only toggle the per-chat `noCardChats` config. A
1058
- * summon (show/bare) needs a live session.
1059
- *
1060
- * off -> suppress the live streaming card for this chat (add to noCardChats);
1061
- * status falls back to master's pending-card morph.
1062
- * on -> restore cards for this chat (remove from noCardChats).
1063
- * ''/show -> summon a live card. privateCard -> private ephemeral snapshot
1064
- * (fail closed on non-group); otherwise a group-visible live card.
1065
- * off/on also clear `streamingCardForced` so a prior summon does not
1066
- * short-circuit `streamingCardDisabled()`.
1067
- */
1068
- export async function handleCardCommand(rootId, larkAppId, chatId, senderOpenId, content, deps) {
1069
- const loc = localeForBot(larkAppId);
1070
- const reply = (c) => deps.sessionReply(rootId, c, undefined, larkAppId);
1071
- // /card is an operator command — gate on canOperate, the same model every other
1072
- // daemon command uses. Open mode (no owner/allowlist) → canOperate passes for
1073
- // everyone; configured → any allowedUser (owner or co-owner); talk-only grantees
1074
- // (chatGrant/globalGrant/oncall members) are never operators.
1075
- if (!canOperate(larkAppId, chatId, senderOpenId)) {
1076
- await reply(t('cmd.card.operator_only', undefined, loc));
1077
- return;
1078
- }
1079
- const ds = deps.activeSessions.get(sessionKey(rootId, larkAppId));
1080
- const sub = content.replace(/^\/card\s*/i, '').trim().toLowerCase();
1081
- if (sub === 'off') {
1082
- const r = await setCardMode(larkAppId, chatId, true);
1083
- if (ds)
1084
- ds.streamingCardForced = undefined;
1085
- await reply(r.ok ? t('cmd.card.off_ok', undefined, loc) : t('cmd.card.fail', { reason: r.reason }, loc));
1086
- return;
1087
- }
1088
- if (sub === 'on') {
1089
- const r = await setCardMode(larkAppId, chatId, false);
1090
- if (ds)
1091
- ds.streamingCardForced = undefined;
1092
- await reply(r.ok ? t('cmd.card.on_ok', undefined, loc) : t('cmd.card.fail', { reason: r.reason }, loc));
1093
- return;
1094
- }
1095
- if (sub === '' || sub === 'show') {
1096
- if (!ds) {
1097
- await reply(t('cmd.no_active_session', undefined, loc));
1098
- return;
1099
- }
1100
- if (getBot(ds.larkAppId).config.privateCard) {
1101
- const mode = await getChatModeStrict(ds.larkAppId, ds.chatId);
1102
- if (mode !== 'group') {
1103
- await reply(t('cmd.card.private_not_group', undefined, loc));
1104
- return;
1105
- }
1106
- const audience = resolvePrivateCardAudience(ds);
1107
- if (audience.length === 0) {
1108
- await reply(t('cmd.card.private_no_audience', undefined, loc));
1109
- return;
1110
- }
1111
- const r = await postPrivateSnapshotCard(ds, audience);
1112
- if (r.notReady) {
1113
- await reply(t('cmd.card.private_not_ready', undefined, loc));
1114
- }
1115
- else if (r.sent === 0) {
1116
- await reply(t('cmd.card.private_failed', undefined, loc));
1117
- }
1118
- else if (r.sent < r.total) {
1119
- await reply(t('cmd.card.private_partial', { sent: r.sent, total: r.total }, loc));
1120
- }
1121
- return;
1122
- }
1123
- ds.streamingCardForced = true;
1124
- const posted = await postFreshStreamingCard(ds, deps.sessionReply);
1125
- if (!posted)
1126
- await reply(t('cmd.card.not_ready', undefined, loc));
1127
- return;
1128
- }
1129
- await reply(t('cmd.card.usage', undefined, loc));
1130
- }
1131
- /**
1132
- * Handle `/term` (operator-only) — the slash-command twin of the "🔑 获取操作链接"
1133
- * card button. Privately hands the operator a writable (token-bearing) terminal
1134
- * card: an in-chat visible-to-you ephemeral card in plain groups, auto-falling back
1135
- * to a DM in topic / p2p chats. The link rides only that private channel — never the
1136
- * group. Gated identically to /card (`canOperate`), and strictly needs a live
1137
- * session whose terminal is up. Routed for both the new-topic path (daemon.ts) and
1138
- * the existing-session switch below.
1139
- */
1140
- export async function handleTermLinkCommand(rootId, larkAppId, chatId, senderOpenId, _content, deps) {
1141
- const loc = localeForBot(larkAppId);
1142
- const reply = (c) => deps.sessionReply(rootId, c, undefined, larkAppId);
1143
- // /term is an operator command that hands out a *writable* terminal link — gate
1144
- // on canOperate (same model as other daemon commands). senderOpenId must be
1145
- // present: open-mode canOperate passes even an undefined sender, but the writable
1146
- // card is delivered privately to that exact open_id.
1147
- if (!senderOpenId || !canOperate(larkAppId, chatId, senderOpenId)) {
1148
- await reply(t('cmd.term.operator_only', undefined, loc));
1149
- return;
1150
- }
1151
- const ds = deps.activeSessions.get(sessionKey(rootId, larkAppId));
1152
- if (!ds) {
1153
- await reply(t('cmd.term.no_session', undefined, loc));
1154
- return;
1155
- }
1156
- const channel = await deliverWritableTerminalCardTo(ds, senderOpenId);
1157
- if (channel === 'unsupported') {
1158
- await reply(t('cmd.term.unsupported', undefined, loc));
1159
- }
1160
- else if (channel === 'not_ready') {
1161
- await reply(t('cmd.term.not_ready', undefined, loc));
1162
- }
1163
- else if (channel === 'failed') {
1164
- await reply(t('cmd.term.failed', undefined, loc));
1165
- }
1166
- else if (channel === 'dm') {
1167
- // The card landed in DM (topic / p2p) — nothing showed in the topic, so drop a
1168
- // visible breadcrumb pointing the owner at their DM. (No token, safe to show.)
1169
- await reply(t('cmd.term.sent_dm', undefined, loc));
1170
- }
1171
- // channel === 'ephemeral': the visible-to-you card IS the response; no extra msg.
1172
- }
1173
- /** Format a SafeInsightReport into a compact owner-facing summary for the
1174
- * `/insight` command. Spans are never rendered here — the dashboard Insight tab
1175
- * owns span detail; the chat card stays a one-glance summary (aggregate + the
1176
- * severity-sorted rule suggestions, top first). */
1177
- function formatInsightCard(report, loc) {
1178
- if (report.status === 'unsupported_cli')
1179
- return t('cmd.insight.unsupported', undefined, loc);
1180
- if (report.status === 'transcript_missing')
1181
- return t('cmd.insight.no_transcript', undefined, loc);
1182
- if (report.status !== 'ok')
1183
- return t('cmd.insight.parse_error', undefined, loc);
1184
- const a = report.agg;
1185
- if (a.totalSpans === 0)
1186
- return t('cmd.insight.no_spans', undefined, loc);
1187
- const icon = (s) => (s === 'bad' ? '🔴' : s === 'warn' ? '🟡' : 'ℹ️');
1188
- const header = t('cmd.insight.header', undefined, loc);
1189
- const lines = [report.meta.asOf ? `${header} · ${report.meta.asOf}` : header];
1190
- lines.push(t('cmd.insight.metrics_line', {
1191
- total: String(a.totalSpans),
1192
- failed: String(a.failedSpans),
1193
- slow: String(a.slowSpans),
1194
- rw: a.readWriteRatio === null ? '—' : String(a.readWriteRatio),
1195
- compactions: String(a.compactions),
1196
- }, loc));
1197
- lines.push('', `${t('cmd.insight.suggestions_label', undefined, loc)}:`);
1198
- for (const s of report.suggestions) {
1199
- lines.push(`${icon(s.severity)} ${s.title} — ${s.action}`);
1200
- if (s.evidence.length)
1201
- lines.push(` · ${s.evidence.join(';')}`);
1202
- }
1203
- return lines.join('\n');
1204
- }
1205
- export async function handleCommand(cmd, rootId, message, deps, larkAppId) {
1206
- const { activeSessions, getActiveCount, lastRepoScan } = deps;
1207
- // Command replies carry the triggering messageId as the turnId so a shared
1208
- // (chat-scope) session triggered from inside a Lark thread anchors them into
1209
- // that thread (resolveSessionReplyTarget turnId gate) instead of leaking a
1210
- // plain top-level message.
1211
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId, message.messageId);
1212
- const ds = larkAppId ? activeSessions.get(sessionKey(rootId, larkAppId)) : undefined;
1213
- const logTag = ds ? tag(ds) : rootId.substring(0, 12);
1214
- const loc = localeForBot(ds?.larkAppId ?? larkAppId);
1215
- logger.info(`[${logTag}] Command: ${cmd}`);
1216
- logger.debug(`repo command`, message);
1217
- try {
1218
- switch (cmd) {
1219
- case '/close': {
1220
- if (ds) {
1221
- // Capture the closed-session card BEFORE killWorker/closeSession —
1222
- // it reads the live session's identity off `ds`.
1223
- const card = buildClosedSessionCard(ds, loc);
1224
- const activeKey = sessionKey(rootId, larkAppId);
1225
- try {
1226
- await closeSession(ds.session.sessionId);
1227
- }
1228
- catch (err) {
1229
- logger.error(`[${logTag}] Refused /close because backing teardown was not verified: ${err}`);
1230
- await sessionReply(rootId, `⚠️ 会话关闭失败,已保留 active 记录以便重试:${err instanceof Error ? err.message : String(err)}`);
1231
- break;
1232
- }
1233
- if (activeSessions.get(activeKey) === ds)
1234
- activeSessions.delete(activeKey);
1235
- // 「会话已关闭」卡片优先「仅自己可见」:普通群里走 ephemeral 只发给执行
1236
- // /close 的本人;话题群不支持 ephemeral(18053) 时回退为正常的群内可见回复
1237
- // ——与流式卡片上「关闭会话」按钮的送达方式保持一致。
1238
- await deliverEphemeralOrReply(ds, message.senderId, card, 'interactive', () => sessionReply(rootId, card, 'interactive'));
1239
- logger.info(`[${logTag}] Session closed by /close command`);
1240
- }
1241
- else {
1242
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1243
- }
1244
- break;
1245
- }
1246
- case '/insight': {
1247
- if (!ds) {
1248
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1249
- break;
1250
- }
1251
- // owner-only:与 /card /term 同一 operator 门(开放模式下 owner 通过;
1252
- // 仅对话授权的 grantee 不算 operator)。无权限直接不回内容。
1253
- if (!canOperate(larkAppId, ds.chatId, message.senderId)) {
1254
- await sessionReply(rootId, t('cmd.insight.operator_only', undefined, loc));
1255
- break;
1256
- }
1257
- // 卡片只取 summary(聚合 + 规则建议);span 明细留给 dashboard Insight tab。
1258
- // buildSafeInsightReport 同步、只读、自带 fail-closed 脱敏,raw 永不进结构。
1259
- const report = buildSafeInsightReport({
1260
- cliId: ds.session.cliId ?? 'unknown',
1261
- sessionId: ds.session.sessionId,
1262
- cliSessionId: ds.session.cliSessionId,
1263
- cwd: ds.session.workingDir,
1264
- larkAppId: ds.larkAppId ?? ds.session.larkAppId,
1265
- }, { detail: 'summary' });
1266
- await sessionReply(rootId, formatInsightCard(report, loc));
1267
- break;
1268
- }
1269
- case '/detach':
1270
- case '/disconnect': {
1271
- // 文字版的"⏏ 断开"按钮:仅 adopt 会话适用——botmux 只是观察用户原本在
1272
- // 跑的 CLI,断开只清掉 botmux 这一侧的 worker / polling,绝不结束 CLI
1273
- // 进程本身。等价于 card-handler 里 `actionType === 'disconnect'` 那段。
1274
- if (!ds) {
1275
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1276
- break;
1277
- }
1278
- if (!ds.adoptedFrom) {
1279
- await sessionReply(rootId, t('cmd.detach.not_adopted', undefined, loc));
1280
- break;
1281
- }
1282
- const closedSessionId = ds.session.sessionId;
1283
- killWorker(ds);
1284
- sessionStore.closeSession(closedSessionId);
1285
- publishClosedSessionPatch(closedSessionId, ds.session.closedAt ? Date.parse(ds.session.closedAt) : undefined);
1286
- activeSessions.delete(sessionKey(rootId, larkAppId));
1287
- await sessionReply(rootId, t('cmd.detach.success', undefined, loc));
1288
- logger.info(`[${logTag}] Detached (adopt) by ${cmd} command`);
1289
- break;
1290
- }
1291
- case '/restart': {
1292
- if (ds) {
1293
- if (ds.adoptedFrom) {
1294
- await sessionReply(rootId, t('card.action.adopt_no_restart', undefined, loc));
1295
- break;
1296
- }
1297
- if (isSessionTransferring(ds)) {
1298
- await sessionReply(rootId, t('cmd.session.transfer_in_progress', undefined, loc));
1299
- break;
1300
- }
1301
- const cliName = sessionCliDisplayName(ds);
1302
- requestSessionRestart(ds, {
1303
- source: 'slash',
1304
- notify: async (status) => {
1305
- await sessionReply(rootId, t(`cmd.restart.${status}`, { cliName }, loc));
1306
- },
1307
- });
1308
- logger.info(`[${logTag}] Restart by /restart command`);
1309
- }
1310
- else {
1311
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1312
- }
1313
- break;
1314
- }
1315
- case '/cd': {
1316
- const targetPath = message.content.replace(/^\/cd\s*/, '').trim();
1317
- if (!targetPath) {
1318
- await sessionReply(rootId, t('cmd.cd.usage', undefined, loc));
1319
- break;
1320
- }
1321
- if (!ds) {
1322
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1323
- break;
1324
- }
1325
- if (isSessionTransferring(ds)) {
1326
- await sessionReply(rootId, t('cmd.session.transfer_in_progress', undefined, loc));
1327
- break;
1328
- }
1329
- const validation = validateWorkingDir(targetPath, loc, { autoCreate: true });
1330
- if (!validation.ok) {
1331
- await sessionReply(rootId, validation.error);
1332
- break;
1333
- }
1334
- const resolvedPath = validation.resolvedPath;
1335
- // Persistent backends can cold-resume without treating a cwd switch as
1336
- // a real session close. This also preserves a sandbox upper long enough
1337
- // for the next worker to relocate Claude's cwd-scoped transcript.
1338
- // Adopted sessions are observers of a user-owned CLI and keep the old
1339
- // detach/kill behavior; PTY falls back to killWorker, while its normal
1340
- // on-disk transcript remains available for the resume-sync preflight.
1341
- const suspended = !ds.adoptedFrom && suspendWorker(ds, 'working_dir_changed');
1342
- if (!suspended)
1343
- killWorker(ds);
1344
- repinSessionWorkingDir(ds, resolvedPath);
1345
- if (validation.created) {
1346
- await sessionReply(rootId, t('cmd.cd.created_switched', { path: resolvedPath }, loc));
1347
- }
1348
- else {
1349
- await sessionReply(rootId, t('cmd.cd.switched', { path: resolvedPath }, loc));
1350
- }
1351
- logger.info(`[${logTag}] Working directory changed to ${resolvedPath} by /cd command${validation.created ? ' (auto-created)' : ''}`);
1352
- break;
1353
- }
1354
- case '/rename': {
1355
- if (!ds) {
1356
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
1357
- break;
1358
- }
1359
- const rawTitle = message.content.replace(/^\/rename\s*/i, '').trim();
1360
- if (!rawTitle) {
1361
- await sessionReply(rootId, t('cmd.rename.usage', undefined, loc));
1362
- break;
1363
- }
1364
- const updated = updateSessionTitle(ds.session, rawTitle, 'user');
1365
- if (!updated.ok) {
1366
- await sessionReply(rootId, t('cmd.rename.usage', undefined, loc));
1367
- break;
1368
- }
1369
- const agentSync = requestAgentSessionRename(ds, updated.title);
1370
- const cliName = sessionCliDisplayName(ds);
1371
- if (agentSync.status === 'requested') {
1372
- await sessionReply(rootId, t('cmd.rename.updated_requested', { title: updated.title, cliName }, loc));
1373
- }
1374
- else if (agentSync.status === 'not_running') {
1375
- await sessionReply(rootId, t('cmd.rename.updated_not_running', { title: updated.title }, loc));
1376
- }
1377
- else if (agentSync.status === 'unsupported') {
1378
- await sessionReply(rootId, t('cmd.rename.updated_unsupported', { title: updated.title, cliName }, loc));
1379
- }
1380
- else {
1381
- await sessionReply(rootId, t('cmd.rename.updated_failed', { title: updated.title, cliName }, loc));
1382
- logger.warn(`[${logTag}] Native session rename request failed for ${cliName}: ${agentSync.error}`);
1383
- }
1384
- logger.info(`[${logTag}] Session renamed by /rename: ${updated.title} (agentSync=${agentSync.status})`);
1385
- break;
1386
- }
1387
- case '/repo': {
1388
- const repoArg = message.content.replace(/^\/repo\s*/, '').trim();
1389
- // First-spawn fork: consume the buffered prompt/attachments and start the
1390
- // CLI in whatever workingDir is currently set on the session. Shared by
1391
- // `commitRepoSelection` (a repo was named) and the bare-`/repo` launch
1392
- // (use the default workingDir) — both only run while `pendingRepo`.
1393
- const forkPendingCli = async (replyText, claimAlready = false) => {
1394
- if (!claimAlready) {
1395
- if (ds.pendingRepoCommitInFlight) {
1396
- await sessionReply(rootId, t('cmd.repo.worktree_in_progress', undefined, loc));
1397
- return false;
1398
- }
1399
- ds.pendingRepoCommitInFlight = true;
1400
- }
1401
- const selfBot = getBot(ds.larkAppId);
1402
- const botCfg = selfBot.config;
1403
- const commitGenSessionId = ds.session.sessionId;
1404
- let committed = false;
1405
- try {
1406
- // Keep pendingRepo=true while prompt context is awaited. Incoming
1407
- // messages stay in the same buffer and card selections see the
1408
- // shared in-flight claim instead of treating this as a repo switch.
1409
- const initiallyBuffered = (ds.pendingPrompt?.trim().length ?? 0) > 0 ||
1410
- (ds.pendingAttachments?.length ?? 0) > 0 ||
1411
- (ds.pendingFollowUps?.length ?? 0) > 0 ||
1412
- ds.pendingChatContext !== undefined;
1413
- const availableBots = initiallyBuffered
1414
- ? await getAvailableBots(ds.larkAppId, ds.chatId)
1415
- : [];
1416
- const stillActive = activeSessions.get(sessionKey(rootId, larkAppId)) === ds;
1417
- if (!stillActive || ds.session.sessionId !== commitGenSessionId ||
1418
- !ds.pendingRepo || (ds.worker && !ds.worker.killed)) {
1419
- logger.warn(`[${logTag}] Session changed while preparing the pending CLI (${commitGenSessionId} → ${ds.session.sessionId}, active=${stillActive}, pending=${!!ds.pendingRepo}, worker=${!!ds.worker})`);
1420
- return false;
1421
- }
1422
- const pendingPrompt = ds.pendingPrompt ?? '';
1423
- const pendingRawInput = ds.pendingRawInput;
1424
- const hasBufferedInput = pendingPrompt.trim().length > 0 ||
1425
- (ds.pendingAttachments?.length ?? 0) > 0 ||
1426
- (ds.pendingFollowUps?.length ?? 0) > 0 ||
1427
- ds.pendingChatContext !== undefined;
1428
- // Nothing to submit at all (bare `/repo`: the message IS the command).
1429
- // The CLI boots idle, so the user's NEXT real message is its first
1430
- // turn and must carry the full new-topic opening — see
1431
- // markInitialUserTurnPending below.
1432
- const emptyStart = !pendingRawInput && !hasBufferedInput;
1433
- if (hasBufferedInput)
1434
- ensureSessionWhiteboard(ds);
1435
- const wrappedInput = hasBufferedInput
1436
- ? buildNewTopicCliInput(pendingPrompt, ds.session.sessionId, ds.session.cliId ?? botCfg.cliId, ds.session.cliPathOverride ?? botCfg.cliPathOverride, ds.pendingAttachments, ds.pendingMentions, availableBots, ds.pendingFollowUps, { name: selfBot.botName, openId: selfBot.botOpenId }, loc, ds.pendingSender, {
1437
- larkAppId,
1438
- chatId: ds.chatId,
1439
- whiteboardId: ds.session.whiteboardId,
1440
- substituteTrigger: ds.pendingSubstituteTrigger,
1441
- codexAppText: ds.pendingCodexAppText,
1442
- codexAppApplicationContext: ds.pendingCodexAppApplicationContext,
1443
- codexAppMessageContext: ds.pendingCodexAppMessageContext,
1444
- codexAppFollowUps: ds.pendingCodexAppFollowUps,
1445
- codexAppFollowUpContexts: ds.pendingCodexAppFollowUpContexts,
1446
- chatContext: ds.pendingChatContext,
1447
- })
1448
- : { content: '' };
1449
- const pendingTurnId = ds.pendingTurnId;
1450
- const previousPendingFollowUpInput = ds.pendingFollowUpInput;
1451
- if (pendingRawInput && hasBufferedInput) {
1452
- ds.pendingFollowUpInput = {
1453
- userPrompt: ds.pendingCodexAppText !== undefined || ds.pendingCodexAppFollowUps
1454
- ? [ds.pendingCodexAppText ?? '', ...(ds.pendingCodexAppFollowUps ?? [])].filter(Boolean).join('\n\n')
1455
- : pendingPrompt || ds.pendingFollowUps?.join('\n\n') || '',
1456
- cliInput: wrappedInput.content,
1457
- ...(ds.pendingFollowUpTurnId ? { turnId: ds.pendingFollowUpTurnId } : {}),
1458
- ...((ds.session.cliId ?? botCfg.cliId) === 'codex-app' && botCfg.codexAppCleanInput === true && wrappedInput.codexAppInput
1459
- ? { codexAppInput: wrappedInput.codexAppInput }
1460
- : {}),
1461
- codexAppInputGateFrozen: true,
1462
- };
1463
- }
1464
- ds.pendingRepo = false;
1465
- publishAttentionPatch(ds);
1466
- try {
1467
- if (pendingRawInput)
1468
- forkWorker(ds, '', false);
1469
- else if (pendingTurnId && hasBufferedInput)
1470
- forkWorker(ds, wrappedInput, { turnId: pendingTurnId });
1471
- else if (hasBufferedInput)
1472
- forkWorker(ds, wrappedInput);
1473
- else
1474
- forkWorker(ds, '', false);
1475
- }
1476
- catch (e) {
1477
- ds.pendingRepo = true;
1478
- ds.pendingFollowUpInput = previousPendingFollowUpInput;
1479
- publishAttentionPatch(ds);
1480
- throw e;
1481
- }
1482
- if (pendingRawInput || hasBufferedInput) {
1483
- rememberLastCliInput(ds, pendingRawInput ?? pendingPrompt, pendingRawInput ?? wrappedInput);
1484
- }
1485
- // Durable, one-shot: the CLI is up but has never received a real user
1486
- // turn, so the next business message must be built as a NEW TOPIC
1487
- // (routing + built-in skill discovery + identity), not a follow-up.
1488
- // Set after the fork so a throwing fork leaves the session untouched.
1489
- if (emptyStart)
1490
- markInitialUserTurnPending(ds);
1491
- ds.pendingPrompt = undefined;
1492
- ds.pendingCodexAppText = undefined;
1493
- ds.pendingCodexAppApplicationContext = undefined;
1494
- ds.pendingCodexAppMessageContext = undefined;
1495
- ds.pendingChatContext = undefined;
1496
- ds.pendingAttachments = undefined;
1497
- ds.pendingMentions = undefined;
1498
- ds.pendingSubstituteTrigger = undefined;
1499
- ds.pendingSender = undefined;
1500
- ds.pendingFollowUps = undefined;
1501
- ds.pendingCodexAppFollowUps = undefined;
1502
- ds.pendingCodexAppFollowUpContexts = undefined;
1503
- ds.pendingFollowUpTurnId = undefined;
1504
- ds.pendingTurnId = undefined;
1505
- committed = true;
1506
- // Local one-shot consume BEFORE network awaits. Feishu withdraw is
1507
- // best-effort; stale card clicks must be rejected via this mark even
1508
- // if sessionReply throws or deleteMessage lags/fails.
1509
- const cardToWithdraw = ds.repoCardMessageId;
1510
- markRepoCardConsumed(ds, cardToWithdraw);
1511
- ds.repoCardMessageId = undefined;
1512
- // Hold the claim through confirmation + best-effort card withdraw.
1513
- try {
1514
- await sessionReply(rootId, replyText);
1515
- }
1516
- catch (e) {
1517
- logger.warn(`[${logTag}] Confirm reply after pending repo commit failed: ${e instanceof Error ? e.message : e}`);
1518
- }
1519
- if (cardToWithdraw) {
1520
- try {
1521
- await deleteMessage(ds.larkAppId, cardToWithdraw);
1522
- }
1523
- catch { /* best-effort */ }
1524
- }
1525
- }
1526
- finally {
1527
- ds.pendingRepoCommitInFlight = false;
1528
- }
1529
- return committed;
1530
- };
1531
- // Shared commit path for an already-resolved repo: update the session's
1532
- // working dir, then either fork into the pending CLI (first spawn) or
1533
- // close + recreate the session (mid-session switch). Used by both the
1534
- // numeric `/repo <N>` form and the `/repo <path|name>` form.
1535
- const commitRepoSelection = async (selectedPath, displayName, how) => {
1536
- if (ds.pendingRepo) {
1537
- if (ds.pendingRepoCommitInFlight) {
1538
- await sessionReply(rootId, t('cmd.repo.worktree_in_progress', undefined, loc));
1539
- return false;
1540
- }
1541
- ds.pendingRepoCommitInFlight = true;
1542
- try {
1543
- // Claim before changing cwd so a card selection cannot overwrite
1544
- // this choice while the pending prompt is prepared.
1545
- ds.workingDir = selectedPath;
1546
- ds.session.workingDir = selectedPath;
1547
- ds.session.riffRepoDirs = undefined;
1548
- sessionStore.updateSession(ds.session);
1549
- // forkPendingCli owns claim release + confirm reply + card withdraw.
1550
- if (!await forkPendingCli(t('cmd.repo.selected_in_pending', { name: displayName }, loc), true)) {
1551
- return false;
1552
- }
1553
- }
1554
- catch (e) {
1555
- ds.pendingRepoCommitInFlight = false;
1556
- throw e;
1557
- }
1558
- }
1559
- else {
1560
- // Safety net: a mid-session `/repo` switch closes the running
1561
- // session and spawns a fresh one on the SAME anchor. Without a
1562
- // trace, the old context silently vanishes (relay/adopt/resume all
1563
- // hit `anchor_occupied` once the new session holds the anchor).
1564
- // So, before displacing it, post the same "session closed" card
1565
- // `/close` emits — it keeps the old session visible and carries the
1566
- // terminal `claude --resume` command. (Its in-card resume button
1567
- // still hits anchor_occupied while the new session occupies this
1568
- // anchor — expected; `/close` the new one first, or use the
1569
- // command.) Mirrors the `/close` case above.
1570
- //
1571
- // ZMX close is identity/generation verified and may refuse. Prove
1572
- // teardown before claiming the card or mutating any state so a
1573
- // refusal leaves the current session fully retryable.
1574
- try {
1575
- teardownAuthoritativePersistentBackingBeforeClose(ds);
1576
- }
1577
- catch (err) {
1578
- const reason = err instanceof Error ? err.message : String(err);
1579
- logger.warn(`[${logTag}] Repo switch refused because backing teardown was not proven: ${reason}`);
1580
- await sessionReply(rootId, t('cmd.repo.switch_close_failed', { error: reason }, loc));
1581
- return false;
1582
- }
1583
- // Claim any open repo card BEFORE killWorker / await so a concurrent
1584
- // card click cannot double-switch while this text path runs.
1585
- //
1586
- // The new cwd is NOT written onto the old session here — it would
1587
- // pollute the displaced session's stored workingDir (and the closed
1588
- // card), so `claude --resume` later would reopen the old context in
1589
- // the new repo's cwd. The new repo is pinned onto the fresh session
1590
- // below instead.
1591
- const claimedCard = claimCurrentRepoCard(ds, undefined);
1592
- const oldSession = ds.session;
1593
- const oldSessionId = oldSession.sessionId;
1594
- const closedCard = buildClosedSessionCard(ds, loc);
1595
- killWorker(ds);
1596
- sessionStore.closeSession(ds.session.sessionId);
1597
- publishClosedSessionPatch(ds.session.sessionId, ds.session.closedAt ? Date.parse(ds.session.closedAt) : undefined);
1598
- await deliverEphemeralOrReply(ds, message.senderId, closedCard, 'interactive', () => sessionReply(rootId, closedCard, 'interactive'));
1599
- const stillOwnsGeneration = activeSessions.get(sessionKey(rootId, larkAppId)) === ds
1600
- && ds.session === oldSession;
1601
- if (!stillOwnsGeneration) {
1602
- logger.warn(`[${logTag}] Repo switch cancelled after closing ${oldSessionId.substring(0, 8)}; routing generation changed during card delivery`);
1603
- return false;
1604
- }
1605
- // `rootId` is the routing anchor. For chat-scope sessions it is the
1606
- // `oc_...` chat id, not the traceable `om_...` message root stored on
1607
- // Session. Preserve the old identity and explicitly persist scope so
1608
- // repo switches cannot turn a chat session into a legacy scope-less
1609
- // record that the CLI later mistakes for a thread.
1610
- const session = sessionStore.createSession(ds.chatId, ds.scope === 'chat' ? oldSession.rootMessageId : rootId, displayName, ds.chatType, ds.scope);
1611
- ds.session = session;
1612
- ds.lastUserPrompt = undefined;
1613
- ds.lastCliInput = undefined;
1614
- ds.workingDir = selectedPath;
1615
- ds.session.workingDir = selectedPath;
1616
- ds.session.larkAppId = ds.larkAppId;
1617
- ds.session.chatDisplayName = oldSession.chatDisplayName;
1618
- ds.session.ownerOpenId = oldSession.ownerOpenId;
1619
- ds.session.creatorOpenId = oldSession.creatorOpenId;
1620
- ds.session.lastCallerOpenId = oldSession.lastCallerOpenId;
1621
- sessionStore.updateSession(ds.session);
1622
- ds.hasHistory = false;
1623
- forkWorker(ds, '', false);
1624
- // Brand-new CLI in a brand-new session record: it has never seen the
1625
- // botmux opening context either, so the next real business message
1626
- // is its new-topic first turn (same invariant as the pending path).
1627
- markInitialUserTurnPending(ds);
1628
- try {
1629
- await sessionReply(rootId, t('cmd.repo.switched_to', { name: displayName }, loc));
1630
- }
1631
- catch (e) {
1632
- logger.warn(`[${logTag}] Confirm reply after mid-session repo switch failed: ${e instanceof Error ? e.message : e}`);
1633
- }
1634
- if (claimedCard) {
1635
- try {
1636
- await deleteMessage(ds.larkAppId, claimedCard);
1637
- }
1638
- catch { /* best-effort */ }
1639
- }
1640
- }
1641
- logger.info(`[${logTag}] Repo selected via ${how}: ${selectedPath}`);
1642
- return true;
1643
- };
1644
- // `/repo wt <N|name|path> [branch]` → create a worktree off the repo's
1645
- // remote default branch and open THAT as the session repo. Without a
1646
- // branch arg the branch/dir are auto-named from the topic title / first
1647
- // pending prompt when possible (fallback: wt/N, <repo>-wt-N).
1648
- if (ds && /^wt(\s|$)/i.test(repoArg)) {
1649
- const rest = repoArg.replace(/^wt\s*/i, '').trim().split(/\s+/).filter(Boolean);
1650
- if (rest.length < 1 || rest.length > 2) {
1651
- await sessionReply(rootId, t('cmd.repo.worktree_usage', undefined, loc));
1652
- break;
1653
- }
1654
- const [targetArg, branchArg] = rest;
1655
- let repoPath;
1656
- if (/^\d+$/.test(targetArg)) {
1657
- const cached = lastRepoScan.get(ds.chatId);
1658
- if (!cached || cached.length === 0) {
1659
- await sessionReply(rootId, t('cmd.repo.no_prior_scan', undefined, loc));
1660
- break;
1661
- }
1662
- const repoIndex = parseInt(targetArg, 10);
1663
- if (repoIndex < 1 || repoIndex > cached.length) {
1664
- await sessionReply(rootId, t('cmd.repo.index_out_of_range', { max: cached.length }, loc));
1665
- break;
1666
- }
1667
- repoPath = cached[repoIndex - 1].path;
1668
- }
1669
- else {
1670
- const resolved = resolveRepoSelection(targetArg, getProjectScanDirs(ds));
1671
- if (!resolved) {
1672
- await sessionReply(rootId, t('cmd.repo.path_not_found', { arg: targetArg }, loc));
1673
- break;
1674
- }
1675
- repoPath = resolved.path;
1676
- }
1677
- if (ds.worktreeCreating || ds.pendingRepoCommitInFlight) {
1678
- await sessionReply(rootId, t('cmd.repo.worktree_in_progress', undefined, loc));
1679
- break;
1680
- }
1681
- ds.worktreeCreating = true;
1682
- // Session generation snapshot — another selection can land while the
1683
- // (awaited) git fetch runs; committing afterwards would kill the
1684
- // session it just spawned. Mirror of the card-side guard.
1685
- const startSessionId = ds.session.sessionId;
1686
- const wasPending = !!ds.pendingRepo;
1687
- // Identity against the active map catches `/close` (which deletes
1688
- // the entry without touching sessionId/pendingRepo) alongside the
1689
- // generation snapshots.
1690
- const wtSessionChanged = () => activeSessions.get(sessionKey(rootId, larkAppId)) !== ds ||
1691
- ds.session.sessionId !== startSessionId || !!ds.pendingRepo !== wasPending;
1692
- // Hold the in-flight lock through commit (matching the card path) —
1693
- // releasing it right after `git` would let a second `/repo wt` start
1694
- // while this one is still replying/committing.
1695
- try {
1696
- await sessionReply(rootId, t('cmd.repo.worktree_creating', { repo: repoPath }, loc));
1697
- let creation;
1698
- try {
1699
- const slug = branchArg ? undefined : await worktreeSlugFromContextAI(ds.session.title, ds.pendingPrompt);
1700
- creation = await createRepoWorktree(repoPath, {
1701
- branch: branchArg,
1702
- slug,
1703
- });
1704
- }
1705
- catch (e) {
1706
- await sessionReply(rootId, t('cmd.repo.worktree_failed', { error: e instanceof Error ? e.message : String(e) }, loc));
1707
- break;
1708
- }
1709
- if (wtSessionChanged()) {
1710
- logger.info(`[${logTag}] Worktree ${creation.path} created but session changed mid-flight — not switching`);
1711
- await sessionReply(rootId, t('cmd.repo.worktree_created_not_switched', { path: creation.path, branch: creation.branch }, loc));
1712
- break;
1713
- }
1714
- const botCfg = getBot(ds.larkAppId).config;
1715
- const effectiveBackend = resolvePairedSpawnBackendType(wasPending ? (ds.session.cliId ?? botCfg.cliId) : botCfg.cliId, wasPending ? ds.session.backendType : undefined, botCfg.backendType, config.daemon.backendType);
1716
- if (effectiveBackend === 'riff') {
1717
- try {
1718
- await pushWorktreeBranch(creation.path, creation.branch);
1719
- }
1720
- catch (e) {
1721
- const errMsg = e instanceof Error ? e.message : String(e);
1722
- logger.warn(`[${logTag}] riff worktree branch push failed (${creation.branch}): ${errMsg}`);
1723
- await sessionReply(rootId, t('card.repo.riff_worktree_push_failed', { branch: creation.branch, error: errMsg }, loc));
1724
- }
1725
- }
1726
- await sessionReply(rootId, t('cmd.repo.worktree_created', {
1727
- path: creation.path, branch: creation.branch, base: creation.baseRef,
1728
- }, loc));
1729
- // The reply above awaited a Lark round-trip — a plain selection
1730
- // (not gated by worktreeCreating) can land in that window. Re-check
1731
- // right before committing. Mirror of the card-side double guard.
1732
- if (wtSessionChanged()) {
1733
- logger.info(`[${logTag}] Worktree ${creation.path} created but session changed during reply — not switching`);
1734
- await sessionReply(rootId, t('cmd.repo.worktree_created_not_switched', { path: creation.path, branch: creation.branch }, loc));
1735
- break;
1736
- }
1737
- try {
1738
- await commitRepoSelection(creation.path, `${basename(creation.path)} (${creation.branch})`, `/repo wt`);
1739
- }
1740
- catch (e) {
1741
- // The worktree DOES exist — only the switch failed. Don't report
1742
- // it as a creation failure, or a retry trips over "already exists".
1743
- logger.warn(`[${logTag}] Worktree ${creation.path} created but switching failed: ${e instanceof Error ? e.message : e}`);
1744
- await sessionReply(rootId, t('cmd.repo.worktree_switch_failed', { path: creation.path, error: e instanceof Error ? e.message : String(e) }, loc));
1745
- }
1746
- }
1747
- finally {
1748
- ds.worktreeCreating = false;
1749
- }
1750
- break;
1751
- }
1752
- // Plain selections are blocked while a worktree creation/commit is in
1753
- // flight: the worktree commit awaits (Lark replies, prompt prep) after
1754
- // its generation checks, and a plain selection interleaving there
1755
- // would double-fork. One lock gates both kinds until the commit
1756
- // settles. (Bare `/repo` without pending only posts the picker card —
1757
- // harmless, so it stays open.)
1758
- if ((ds?.worktreeCreating || ds?.pendingRepoCommitInFlight) && (repoArg || ds?.pendingRepo)) {
1759
- await sessionReply(rootId, t('cmd.repo.worktree_in_progress', undefined, loc));
1760
- break;
1761
- }
1762
- // Numeric arg → pick by 1-based index from the last scan.
1763
- if (repoArg && ds && /^\d+$/.test(repoArg)) {
1764
- const repoIndex = parseInt(repoArg, 10);
1765
- const cached = lastRepoScan.get(ds.chatId);
1766
- if (!cached || cached.length === 0) {
1767
- await sessionReply(rootId, t('cmd.repo.no_prior_scan', undefined, loc));
1768
- break;
1769
- }
1770
- if (repoIndex < 1 || repoIndex > cached.length) {
1771
- await sessionReply(rootId, t('cmd.repo.index_out_of_range', { max: cached.length }, loc));
1772
- break;
1773
- }
1774
- const project = cached[repoIndex - 1];
1775
- await commitRepoSelection(project.path, `${project.name} (${project.branch})`, `/repo ${repoIndex}`);
1776
- break;
1777
- }
1778
- // Non-numeric arg → a path (relative/absolute) or first-level project
1779
- // name under workingDir; resolve it directly and skip the card.
1780
- if (repoArg && ds) {
1781
- const resolved = resolveRepoSelection(repoArg, getProjectScanDirs(ds));
1782
- if (!resolved) {
1783
- await sessionReply(rootId, t('cmd.repo.path_not_found', { arg: repoArg }, loc));
1784
- break;
1785
- }
1786
- await commitRepoSelection(resolved.path, resolved.displayName, `/repo ${repoArg}`);
1787
- break;
1788
- }
1789
- // Bare `/repo` while a repo card is pending → launch right away in the
1790
- // default workingDir. This is the text-command twin of the card's
1791
- // "start directly" button (and replaces the old `/skip` command).
1792
- // Mid-session bare `/repo` (no pending) still falls through to the card.
1793
- if (!repoArg && ds?.pendingRepo) {
1794
- // Validate the configured workingDir before spawning — `forkWorker`
1795
- // doesn't, so a dead cwd would otherwise spawn-and-fail silently. Same
1796
- // guard the card path runs below. On failure we keep the pending state
1797
- // so the user can recover with `/repo <valid-path>` (no card here).
1798
- const invalidDirs = invalidConfiguredWorkingDirs(ds, ds.larkAppId ?? larkAppId);
1799
- if (invalidDirs.length > 0) {
1800
- await sessionReply(rootId, t('cmd.repo.working_dir_not_exist', { dirs: invalidDirs.map(d => `\`${d}\``).join(', ') }, loc));
1801
- break;
1802
- }
1803
- const cwd = getSessionWorkingDir(ds);
1804
- // bare /repo is the text twin of skip_repo: launch in the default
1805
- // cwd without pinning it (forkPendingCli does not write workingDir).
1806
- // Confirmation + card withdraw run under the claim inside forkPendingCli.
1807
- await forkPendingCli(t('cmd.skip.opened', { cwd }, loc));
1808
- logger.info(`[${logTag}] Bare /repo while pending → launch in workingDir ${cwd}`);
1809
- break;
1810
- }
1811
- if (ds?.worker && !ds.worker.killed) {
1812
- await sessionReply(rootId, t('cmd.repo.warning_running', undefined, loc));
1813
- }
1814
- const scanDirs = getProjectScanDirs(ds);
1815
- const invalidDirs = invalidConfiguredWorkingDirs(ds, ds?.larkAppId ?? larkAppId);
1816
- if (invalidDirs.length > 0) {
1817
- await sessionReply(rootId, t('cmd.repo.working_dir_not_exist', { dirs: invalidDirs.map(d => `\`${d}\``).join(', ') }, loc));
1818
- break;
1819
- }
1820
- const validDirs = scanDirs.filter(d => existsSync(d));
1821
- if (validDirs.length === 0) {
1822
- await sessionReply(rootId, t('cmd.repo.scan_dir_not_exist', { dirs: scanDirs.join(', ') }, loc));
1823
- break;
1824
- }
1825
- const projects = scanMultipleProjects(validDirs, 3, repoPickerScanOptions());
1826
- if (projects.length === 0) {
1827
- await sessionReply(rootId, t('cmd.repo.no_git_repos', { dirs: validDirs.join(', ') }, loc));
1828
- break;
1829
- }
1830
- if (ds)
1831
- lastRepoScan.set(ds.chatId, projects);
1832
- const currentCwd = getSessionWorkingDir(ds);
1833
- const cardJson = buildRepoSelectCard(projects, currentCwd, rootId, loc, ds ? getBot(ds.larkAppId).config.worktreeMultiPicker : undefined);
1834
- const repoCardMsgId = await sessionReply(rootId, cardJson, 'interactive');
1835
- if (ds) {
1836
- ds.repoCardMessageId = repoCardMsgId;
1837
- announcePendingRepoSession(ds);
1838
- }
1839
- logger.info(`[${logTag}] Sent repo card with ${projects.length} project(s)`);
1840
- break;
1841
- }
1842
- case '/status': {
1843
- if (ds) {
1844
- const alive = ds.worker && !ds.worker.killed;
1845
- const idle = formatUptime(Date.now() - ds.lastMessageAt);
1846
- const termUrl = ds.workerPort ? buildTerminalUrl(ds) : '-';
1847
- const botCfg = getBot(ds.larkAppId).config;
1848
- const migratedFrozenRuntime = ds.session.agentFrozen && !ds.session.cliRuntime
1849
- ? resolveCliRuntime({
1850
- cliId: ds.session.cliId ?? botCfg.cliId,
1851
- cliPathOverride: ds.session.cliPathOverride,
1852
- context: 'status session cliRuntime',
1853
- })
1854
- : undefined;
1855
- const effectiveRuntime = ds.session.cliRuntime
1856
- ?? migratedFrozenRuntime
1857
- ?? (!ds.session.agentFrozen ? botCfg.cliRuntime : undefined);
1858
- const effectivePath = ds.session.agentFrozen
1859
- ? ds.session.cliPathOverride
1860
- : ds.session.cliPathOverride ?? botCfg.cliPathOverride;
1861
- const runtimeName = configuredRuntimeDisplayName(effectiveRuntime)
1862
- ?? getCliDisplayName(ds.session.cliId ?? botCfg.cliId);
1863
- const latestRuntimeVersion = getCurrentCliVersion(runtimeInstallationKey({
1864
- cliId: ds.session.cliId ?? botCfg.cliId,
1865
- cliRuntime: effectiveRuntime,
1866
- cliPathOverride: effectivePath,
1867
- }));
1868
- const lines = [
1869
- `Session: ${ds.session.sessionId}`,
1870
- `Status: ${alive ? t('cmd.status.running', undefined, loc) : t('cmd.status.waiting', undefined, loc)}`,
1871
- `Terminal: ${termUrl}`,
1872
- `CWD: ${getSessionWorkingDir(ds)}`,
1873
- `${runtimeName}: v${ds.cliVersion}${latestRuntimeVersion !== 'unknown' && ds.cliVersion !== latestRuntimeVersion ? ` (latest: v${latestRuntimeVersion})` : ''}`,
1874
- ...(alive ? [`Uptime: ${formatUptime(Date.now() - ds.spawnedAt)}`] : []),
1875
- `Last message: ${idle} ago`,
1876
- `Active sessions: ${getActiveCount()}`,
1877
- ];
1878
- await sessionReply(rootId, lines.join('\n'));
1879
- }
1880
- else {
1881
- const fallbackCfg = larkAppId ? getBot(larkAppId).config : undefined;
1882
- const fallbackCliName = configuredRuntimeDisplayName(fallbackCfg?.cliRuntime)
1883
- ?? (fallbackCfg ? getCliDisplayName(fallbackCfg.cliId) : 'CLI');
1884
- const fallbackVersion = fallbackCfg
1885
- ? getCurrentCliVersion(runtimeInstallationKey({
1886
- cliId: fallbackCfg.cliId,
1887
- cliRuntime: fallbackCfg.cliRuntime,
1888
- cliPathOverride: fallbackCfg.cliPathOverride,
1889
- }))
1890
- : getCurrentCliVersion();
1891
- await sessionReply(rootId, t('cmd.status.fallback_no_session', {
1892
- count: getActiveCount(),
1893
- cliName: fallbackCliName,
1894
- version: fallbackVersion,
1895
- }, loc));
1896
- }
1897
- break;
1898
- }
1899
- case '/schedule': {
1900
- const scheduleArgs = message.content.replace(/^\/schedule\s*/, '');
1901
- const chatId = ds?.chatId;
1902
- await handleScheduleCommand(scheduleArgs, rootId, chatId, deps, larkAppId);
1903
- logger.info(`[${logTag}] Schedule command handled`);
1904
- break;
1905
- }
1906
- case '/dashboard': {
1907
- const dashboardArgs = message.content.replace(/^\/dashboard\s*/, '');
1908
- const chatId = ds?.chatId ?? message.chatId ?? '';
1909
- await handleDashboardCommand(message, dashboardArgs, rootId, chatId, deps, larkAppId);
1910
- logger.info(`[${logTag}] Dashboard command handled (sub=${dashboardArgs.trim().split(/\s+/)[0] || 'overview'})`);
1911
- break;
1912
- }
1913
- case '/role': {
1914
- const chatId = ds?.chatId;
1915
- if (!chatId || !larkAppId) {
1916
- await sessionReply(rootId, t('role.no_chat', undefined, loc));
1917
- break;
1918
- }
1919
- const roleArgs = message.content.replace(/^\/role\s*/, '');
1920
- await handleRoleCommand(roleArgs, rootId, chatId, larkAppId, message.senderId, deps);
1921
- logger.info(`[${logTag}] Role command handled`);
1922
- break;
1923
- }
1924
- case '/botconfig': {
1925
- const appId = larkAppId ?? ds?.larkAppId;
1926
- if (!appId) {
1927
- await sessionReply(rootId, t('cmd.config.no_bot', undefined, loc));
1928
- break;
1929
- }
1930
- await handleConfigCommand(message, rootId, appId, deps);
1931
- logger.info(`[${logTag}] Config command handled`);
1932
- break;
1933
- }
1934
- // Issue Board:`/issue` 出看板卡片,后续都在卡片上就地操作(见 issue-command)。
1935
- // 权限门(allowedUsers + invoker lock)在 handler 里,命令入口和每次回调各跑一遍。
1936
- case '/issue': {
1937
- const appId = larkAppId ?? ds?.larkAppId;
1938
- if (!appId) {
1939
- await sessionReply(rootId, t('cmd.config.no_bot', undefined, loc));
1940
- break;
1941
- }
1942
- const sub = message.content.replace(/^\/issue\s*/i, '').trim().split(/\s+/, 1)[0]?.toLowerCase();
1943
- const { handleIssueCommand, handleIssueDone, handleIssueRelease, handleIssueStatus } = await import('../im/lark/issue-command.js');
1944
- const { buildIssueCommandDeps } = await import('../im/lark/issue-command-deps.js');
1945
- // 这三个子命令都在**领取时建出来的那个群里**发,锚点从当前会话推。两个候选按
1946
- // sessionAnchorId 的语义给(拉群 → chatId,话题 → rootMessageId),由 handler 依次试。
1947
- const anchors = [message.chatId, rootId];
1948
- if (sub === 'release' || sub === 'done') {
1949
- const handler = sub === 'done' ? handleIssueDone : handleIssueRelease;
1950
- const rel = await handler(appId, message.senderId, anchors, buildIssueCommandDeps());
1951
- await sessionReply(rootId, rel.toast.content);
1952
- logger.info(`[${logTag}] Issue ${sub} handled: ${rel.toast.type}`);
1953
- break;
1954
- }
1955
- if (sub === 'status') {
1956
- const st = await handleIssueStatus(appId, message.senderId, anchors, buildIssueCommandDeps());
1957
- if ('card' in st)
1958
- await sessionReply(rootId, st.card, 'interactive');
1959
- else
1960
- await sessionReply(rootId, st.toast.content);
1961
- logger.info(`[${logTag}] Issue status handled: ${'card' in st ? 'card' : 'toast'}`);
1962
- break;
1963
- }
1964
- const r = await handleIssueCommand(appId, message.senderId, buildIssueCommandDeps());
1965
- if ('card' in r)
1966
- await sessionReply(rootId, r.card, 'interactive');
1967
- else
1968
- await sessionReply(rootId, r.toast.content);
1969
- logger.info(`[${logTag}] Issue command handled: ${'card' in r ? 'card' : 'toast'}`);
1970
- break;
1971
- }
1972
- case '/skills': {
1973
- const appId = larkAppId ?? ds?.larkAppId;
1974
- if (!appId) {
1975
- await sessionReply(rootId, t('cmd.config.no_bot', undefined, loc));
1976
- break;
1977
- }
1978
- const sub = message.content.replace(/^\/skills\s*/i, '').trim().split(/\s+/, 1)[0]?.toLowerCase();
1979
- if (sub === 'attach' || sub === 'detach') {
1980
- let bot;
1981
- try {
1982
- bot = getBot(appId);
1983
- }
1984
- catch {
1985
- await sessionReply(rootId, t('cmd.config.no_bot', undefined, loc));
1986
- break;
1987
- }
1988
- const admins = bot.resolvedAllowedUsers ?? [];
1989
- if (admins.length === 0) {
1990
- await sessionReply(rootId, t('cmd.config.no_owner', undefined, loc));
1991
- break;
1992
- }
1993
- if (!message.senderId || !admins.includes(message.senderId)) {
1994
- await sessionReply(rootId, t('cmd.config.not_admin', undefined, loc));
1995
- break;
1996
- }
1997
- }
1998
- const result = await runSkillsImCommand(appId, message.content);
1999
- await sessionReply(rootId, result.message);
2000
- logger.info(`[${logTag}] Skills command handled: ${result.ok ? 'ok' : 'error'}`);
2001
- break;
2002
- }
2003
- case '/pair': {
2004
- const code = message.content.replace(/^\/pair\s*/, '').trim();
2005
- if (!larkAppId) {
2006
- await sessionReply(rootId, t('role.no_chat', undefined, loc));
2007
- break;
2008
- }
2009
- if (!code) {
2010
- await sessionReply(rootId, t('pair.usage', undefined, loc));
2011
- break;
2012
- }
2013
- // Resolve the sender's canonical union_id (best-effort) so the web
2014
- // session is keyed stably across apps; degrade to open_id-only.
2015
- const who = await resolveUserUnionId(larkAppId, message.senderId);
2016
- const result = claimPairing(config.session.dataDir, code, { openId: message.senderId, unionId: who.unionId, name: who.name, larkAppId });
2017
- if (result.ok)
2018
- await sessionReply(rootId, t('pair.ok', undefined, loc));
2019
- else if (result.reason === 'expired')
2020
- await sessionReply(rootId, t('pair.expired', undefined, loc));
2021
- else if (result.reason === 'already_claimed')
2022
- await sessionReply(rootId, t('pair.already', undefined, loc));
2023
- else
2024
- await sessionReply(rootId, t('pair.not_found', undefined, loc));
2025
- logger.info(`[${logTag}] Pair command handled: ${result.ok ? 'ok' : result.reason}`);
2026
- break;
2027
- }
2028
- case '/login': {
2029
- const subCmd = message.content.replace(/^\/login\s*/, '').trim();
2030
- // 先定位本 bot 配置——token 状态与 OAuth URL 都按 per-bot appId/brand 走。
2031
- const botCfg2 = ds ? getBot(ds.larkAppId).config : (larkAppId ? getBot(larkAppId).config : getAllBots()[0]?.config);
2032
- if (!botCfg2?.larkAppId || !botCfg2?.larkAppSecret) {
2033
- await sessionReply(rootId, t('cmd.login.no_credentials', undefined, loc));
2034
- break;
2035
- }
2036
- if (subCmd === 'status' || subCmd === '状态') {
2037
- await sessionReply(rootId, getTokenStatus(botCfg2.larkAppId, normalizeBrand(botCfg2.brand)));
2038
- break;
2039
- }
2040
- const { authUrl } = generateAuthUrl(botCfg2.larkAppId, botCfg2.larkAppSecret, normalizeBrand(botCfg2.brand));
2041
- await sessionReply(rootId, [
2042
- t('cmd.login.title', undefined, loc),
2043
- '',
2044
- t('cmd.login.step1', undefined, loc),
2045
- authUrl,
2046
- '',
2047
- t('cmd.login.step2', undefined, loc),
2048
- t('cmd.login.step3', undefined, loc),
2049
- '',
2050
- t('cmd.login.footer', undefined, loc),
2051
- t('cmd.login.status_hint', undefined, loc),
2052
- ].join('\n'));
2053
- break;
2054
- }
2055
- case '/subscribe-lark-doc': {
2056
- // 保留 origin/master 的既有语义:显式获取文档 scope 的 User Token,调用
2057
- // 飞书逐文件 subscribe API,再把文档绑定到当前会话。新增的评论监听、自动
2058
- // 会话和审批能力走独立的 /watch-comment,不改变这个远端已有命令。
2059
- if (!ds || !larkAppId) {
2060
- await sessionReply(rootId, t('cmd.subdoc.no_session', undefined, loc));
2061
- break;
2062
- }
2063
- const arg = message.content.replace(/^\/subscribe-lark-doc\s*/i, '').trim();
2064
- const anchor = sessionAnchorId(ds);
2065
- const dataDir = config.session.dataDir;
2066
- const modeLabel = (m) => t(m === 'all' ? 'cmd.subdoc.mode_all' : 'cmd.subdoc.mode_mention', undefined, loc);
2067
- if (arg === 'list' || arg === '列表') {
2068
- const subs = listDocSubscriptionsForSession(dataDir, larkAppId, anchor)
2069
- .filter(s => s.managedBy !== 'watch-comment');
2070
- if (!subs.length) {
2071
- await sessionReply(rootId, t('cmd.subdoc.none', undefined, loc));
2072
- break;
2073
- }
2074
- const lines = subs.map(s => `• ${s.docTitle || s.fileToken}(${modeLabel(s.commentTriggerMode)})`);
2075
- await sessionReply(rootId, [t('cmd.subdoc.list_title', undefined, loc), ...lines].join('\n'));
2076
- break;
2077
- }
2078
- if (arg === 'off' || arg === 'stop' || arg === '退订') {
2079
- const subs = listDocSubscriptionsForSession(dataDir, larkAppId, anchor)
2080
- .filter(s => s.managedBy !== 'watch-comment');
2081
- for (const s of subs) {
2082
- await unsubscribeDocFile(larkAppId, { fileToken: s.fileToken, fileType: s.fileType });
2083
- removeDocSubscription(dataDir, larkAppId, s.fileToken);
2084
- }
2085
- await sessionReply(rootId, t('cmd.subdoc.unsubscribed', { count: subs.length }, loc));
2086
- break;
2087
- }
2088
- if (!arg) {
2089
- await sessionReply(rootId, t('cmd.subdoc.usage', undefined, loc));
2090
- break;
2091
- }
2092
- // 旧流程:文档 scope 不污染通用 /login;缺少时由本命令发专用 OAuth 链接。
2093
- const subCfg = getBot(larkAppId).config;
2094
- const replyDocLogin = async () => {
2095
- const { authUrl } = generateAuthUrl(subCfg.larkAppId, subCfg.larkAppSecret, normalizeBrand(subCfg.brand), DOC_COMMENT_OAUTH_SCOPES);
2096
- await sessionReply(rootId, [
2097
- t('cmd.subdoc.need_login', undefined, loc),
2098
- '',
2099
- t('cmd.login.step1', undefined, loc),
2100
- authUrl,
2101
- '',
2102
- t('cmd.login.step2', undefined, loc),
2103
- t('cmd.login.step3', undefined, loc),
2104
- ].join('\n'));
2105
- };
2106
- const userTok = await resolveUserToken(subCfg.larkAppId, subCfg.larkAppSecret, normalizeBrand(subCfg.brand));
2107
- if (!userTok) {
2108
- await replyDocLogin();
2109
- break;
2110
- }
2111
- try {
2112
- const file = await resolveDocFile(larkAppId, arg);
2113
- await subscribeDocFile(larkAppId, file);
2114
- const mode = subCfg.docSubscribeDefaultMode === 'all' ? 'all' : 'mention-only';
2115
- const { previous } = putDocSubscription(dataDir, larkAppId, {
2116
- fileToken: file.fileToken,
2117
- fileType: file.fileType,
2118
- sessionAnchor: anchor,
2119
- sessionId: ds.session.sessionId,
2120
- scope: ds.scope,
2121
- chatId: ds.chatId,
2122
- commentTriggerMode: mode,
2123
- managedBy: 'subscribe-lark-doc',
2124
- ownerOpenId: message.senderId,
2125
- createdAt: Date.now(),
2126
- });
2127
- const title = file.fileToken.slice(0, 12);
2128
- const rebound = previous && previous.sessionAnchor !== anchor;
2129
- await sessionReply(rootId, t(rebound ? 'cmd.subdoc.subscribed_moved' : 'cmd.subdoc.subscribed', { title, mode: modeLabel(mode) }, loc));
2130
- logger.info(`[${logTag}] /subscribe-lark-doc → ${file.fileType}:${file.fileToken.slice(0, 12)} mode=${mode}${rebound ? ' (rebound)' : ''}`);
2131
- }
2132
- catch (err) {
2133
- // 1069603 重新 OAuth 无法修复;保留实际返回该业务码的身份,避免把
2134
- // tenant-only 失败误归因到当前用户。只有 token 缺失 / 失效才重新授权。
2135
- if (err instanceof DocSubscriptionPermissionError) {
2136
- const identity = err.source === 'user'
2137
- ? t('cmd.subdoc.permission_identity_user', undefined, loc)
2138
- : err.source === 'tenant'
2139
- ? t('cmd.subdoc.permission_identity_tenant', undefined, loc)
2140
- : err.source === 'both'
2141
- ? t('cmd.subdoc.permission_identity_both', undefined, loc)
2142
- : t('cmd.subdoc.permission_identity_unknown', undefined, loc);
2143
- await sessionReply(rootId, t('cmd.subdoc.manage_required', {
2144
- code: err.larkCode,
2145
- identity,
2146
- }, loc));
2147
- }
2148
- else if (err instanceof UserTokenMissingError) {
2149
- await replyDocLogin();
2150
- }
2151
- else {
2152
- await sessionReply(rootId, t('cmd.subdoc.failed', { err: err instanceof Error ? err.message : String(err) }, loc));
2153
- }
2154
- }
2155
- break;
2156
- }
2157
- case '/watch-comment': {
2158
- if (!larkAppId) {
2159
- await sessionReply(rootId, t('cmd.watch.no_session', undefined, loc));
2160
- break;
2161
- }
2162
- const request = parseDocWatchCommand(message.content);
2163
- const dataDir = config.session.dataDir;
2164
- const modeLabel = (m) => t(m === 'all' ? 'cmd.subdoc.mode_all' : 'cmd.subdoc.mode_mention', undefined, loc);
2165
- if (request.kind === 'usage' || request.kind === 'invalid') {
2166
- const prefix = request.kind === 'invalid' && request.reason === 'conflicting_modes'
2167
- ? `${t('cmd.watch.conflicting_modes', undefined, loc)}\n\n`
2168
- : '';
2169
- await sessionReply(rootId, prefix + t('cmd.watch.usage', undefined, loc));
2170
- break;
2171
- }
2172
- // 设计:只有 bot owner 能管理文档评论监听(watch / list / off)。非 owner 无法
2173
- // 主动发起监听,只能在文档里 @bot 触发回复——那条路径会私信通知 owner 审计
2174
- // (notify-not-approve,见 event-dispatcher.processCommentEvent),不经这里。
2175
- const ownerOpenId = getOwnerOpenId(larkAppId);
2176
- if (!ownerOpenId || message.senderId !== ownerOpenId) {
2177
- await sessionReply(rootId, t('cmd.watch.owner_only', undefined, loc));
2178
- break;
2179
- }
2180
- if (request.kind === 'list') {
2181
- // 命令已收归 owner-only,无 session 时直接列全部(不再按 ownerOpenId 过滤),
2182
- // 否则非 owner @bot 触发的 auto-sub 对 owner 不可见。
2183
- const subs = (ds
2184
- ? listDocSubscriptionsForSession(dataDir, larkAppId, sessionAnchorId(ds))
2185
- : listAllDocSubscriptions(dataDir, larkAppId))
2186
- .filter(s => s.managedBy === 'watch-comment');
2187
- if (!subs.length) {
2188
- await sessionReply(rootId, t(ds ? 'cmd.watch.none' : 'cmd.watch.none_owned', undefined, loc));
2189
- break;
2190
- }
2191
- const lines = subs.map(s => {
2192
- const wd = s.workingDir ? ` 📂${s.workingDir}` : '';
2193
- return `• ${s.docTitle || s.fileToken}(${modeLabel(s.commentTriggerMode)})${wd}`;
2194
- });
2195
- await sessionReply(rootId, [t(ds ? 'cmd.watch.list_title' : 'cmd.watch.list_title_owned', undefined, loc), ...lines].join('\n'));
2196
- break;
2197
- }
2198
- if (request.kind === 'off') {
2199
- if (request.docRef) {
2200
- try {
2201
- const file = await resolveDocFile(larkAppId, request.docRef);
2202
- const existing = getDocSubscription(dataDir, larkAppId, file.fileToken);
2203
- if (!existing || existing.managedBy !== 'watch-comment') {
2204
- await sessionReply(rootId, t('cmd.watch.not_found', undefined, loc));
2205
- break;
2206
- }
2207
- removeDocSubscription(dataDir, larkAppId, file.fileToken);
2208
- await sessionReply(rootId, t('cmd.watch.stopped_one', { title: file.fileToken.slice(0, 12) }, loc));
2209
- }
2210
- catch (err) {
2211
- await sessionReply(rootId, t('cmd.watch.failed', { err: err instanceof Error ? err.message : String(err) }, loc));
2212
- }
2213
- break;
2214
- }
2215
- // 命令已收归 owner-only,无 session 时直接列全部(不再按 ownerOpenId 过滤)。
2216
- const subs = (ds
2217
- ? listDocSubscriptionsForSession(dataDir, larkAppId, sessionAnchorId(ds))
2218
- : listAllDocSubscriptions(dataDir, larkAppId))
2219
- .filter(s => s.managedBy === 'watch-comment');
2220
- for (const s of subs) {
2221
- removeDocSubscription(dataDir, larkAppId, s.fileToken);
2222
- }
2223
- await sessionReply(rootId, t(ds ? 'cmd.watch.stopped_all' : 'cmd.watch.stopped_owned', { count: subs.length }, loc));
2224
- break;
2225
- }
2226
- if (request.kind !== 'watch') {
2227
- await sessionReply(rootId, t('cmd.watch.usage', undefined, loc));
2228
- break;
2229
- }
2230
- let validatedDir;
2231
- if (request.workingDir) {
2232
- const v = validateWorkingDir(request.workingDir, loc);
2233
- if (!v.ok) {
2234
- await sessionReply(rootId, v.error);
2235
- break;
2236
- }
2237
- validatedDir = v.resolvedPath;
2238
- }
2239
- const botCfg = getBot(larkAppId).config;
2240
- try {
2241
- const file = await resolveDocFile(larkAppId, request.docRef);
2242
- const existing = getDocSubscription(dataDir, larkAppId, file.fileToken);
2243
- const mode = request.requestedMode
2244
- ?? (botCfg.docSubscribeDefaultMode === 'all' ? 'all' : 'mention-only');
2245
- const anchor = ds ? sessionAnchorId(ds) : `doc:${file.fileToken}`;
2246
- // Existing chat/thread sessions own their project binding. A watch
2247
- // without an explicit --dir inherits that binding; session-less
2248
- // document watches keep their own stored/mapped directory fallback.
2249
- const effectiveDir = ds
2250
- ? (validatedDir ?? ds.workingDir ?? ds.session.workingDir)
2251
- : (validatedDir ?? existing?.workingDir ?? botCfg.docRepoMap?.[file.fileToken]);
2252
- let pollCursorAt;
2253
- let pollCursorReplyId;
2254
- let pollBaselineReady;
2255
- if (mode === 'all') {
2256
- const canReuseBaseline = existing?.managedBy === 'watch-comment'
2257
- && existing.commentTriggerMode === 'all'
2258
- && existing.pollBaselineReady === true;
2259
- if (canReuseBaseline) {
2260
- pollCursorAt = existing.pollCursorAt;
2261
- pollCursorReplyId = existing.pollCursorReplyId;
2262
- pollBaselineReady = true;
2263
- }
2264
- else {
2265
- try {
2266
- const latest = latestDocCommentPollCursor(await listDocComments(larkAppId, file));
2267
- pollCursorAt = latest?.createdAt ?? Math.floor(Date.now() / 1000);
2268
- pollCursorReplyId = latest?.replyId ?? '';
2269
- pollBaselineReady = true;
2270
- }
2271
- catch (err) {
2272
- // 不让一次读取失败阻塞登记。poller 首次成功时只建立基线,不重放历史。
2273
- pollBaselineReady = false;
2274
- logger.warn(`[${logTag}] /watch-comment baseline failed for ${file.fileToken.slice(0, 12)}: ${err instanceof Error ? err.message : String(err)}`);
2275
- }
2276
- }
2277
- }
2278
- const subscription = {
2279
- fileToken: file.fileToken,
2280
- fileType: file.fileType,
2281
- sessionAnchor: anchor,
2282
- sessionId: ds?.session.sessionId,
2283
- scope: ds?.scope ?? 'chat',
2284
- chatId: ds?.chatId ?? `doc:${file.fileToken}`,
2285
- commentTriggerMode: mode,
2286
- managedBy: 'watch-comment',
2287
- ownerOpenId: message.senderId,
2288
- workingDir: effectiveDir,
2289
- pollCursorAt,
2290
- pollCursorReplyId,
2291
- pollBaselineReady,
2292
- createdAt: existing?.createdAt ?? Date.now(),
2293
- };
2294
- const { previous } = putDocSubscription(dataDir, larkAppId, subscription);
2295
- const rebound = previous && previous.sessionAnchor !== anchor;
2296
- let replyText = t(!ds ? 'cmd.watch.started_lazy' : rebound ? 'cmd.watch.started_moved' : 'cmd.watch.started', {
2297
- title: file.fileToken.slice(0, 12),
2298
- mode: modeLabel(mode),
2299
- }, loc);
2300
- if (effectiveDir)
2301
- replyText += `\n📂 ${t('cmd.watch.working_dir', { dir: effectiveDir }, loc)}`;
2302
- else
2303
- replyText += `\n\n${t(ds ? 'cmd.watch.project_optional_session' : 'cmd.watch.project_optional_lazy', undefined, loc)}`;
2304
- if (ds && deps.prewarmDocCommentSession) {
2305
- try {
2306
- await deps.prewarmDocCommentSession(ds, subscription);
2307
- replyText += `\n\n${t('cmd.watch.prewarming', undefined, loc)}`;
2308
- }
2309
- catch (err) {
2310
- logger.warn(`[${logTag}] /watch-comment prewarm failed for ${file.fileToken.slice(0, 12)}: ${err instanceof Error ? err.message : String(err)}`);
2311
- replyText += `\n\n${t('cmd.watch.prewarm_failed', undefined, loc)}`;
2312
- }
2313
- }
2314
- await sessionReply(rootId, replyText);
2315
- logger.info(`[${logTag}] /watch-comment → ${file.fileType}:${file.fileToken.slice(0, 12)} mode=${mode}${effectiveDir ? ` wd=${effectiveDir}` : ''}${rebound ? ' (rebound)' : ''}${ds ? '' : ' (doc-native lazy session)'}`);
2316
- }
2317
- catch (err) {
2318
- await sessionReply(rootId, t('cmd.watch.failed', { err: err instanceof Error ? err.message : String(err) }, loc));
2319
- }
2320
- break;
2321
- }
2322
- case '/vc': {
2323
- if (!larkAppId) {
2324
- await sessionReply(rootId, t('cmd.vc.no_session', undefined, loc));
2325
- break;
2326
- }
2327
- const ownerOpenId = getOwnerOpenId(larkAppId);
2328
- if (!ownerOpenId || message.senderId !== ownerOpenId) {
2329
- await sessionReply(rootId, t('cmd.vc.owner_only', undefined, loc));
2330
- break;
2331
- }
2332
- const request = parseVcMeetingPrepareCommand(message.content);
2333
- const dataDir = config.session.dataDir;
2334
- if (request.kind === 'usage' || request.kind === 'invalid') {
2335
- const prefix = request.kind === 'invalid'
2336
- ? `${t('cmd.vc.invalid', undefined, loc)}\n\n`
2337
- : '';
2338
- await sessionReply(rootId, prefix + t('cmd.vc.usage', undefined, loc));
2339
- break;
2340
- }
2341
- if (request.kind === 'status') {
2342
- const requestedRecord = request.meetingNo
2343
- ? getVcMeetingPreparation(dataDir, larkAppId, request.meetingNo)
2344
- : undefined;
2345
- const records = request.meetingNo
2346
- ? (requestedRecord ? [requestedRecord] : [])
2347
- : listVcMeetingPreparations(dataDir, larkAppId);
2348
- if (records.length === 0) {
2349
- await sessionReply(rootId, t('cmd.vc.none', undefined, loc));
2350
- break;
2351
- }
2352
- const lines = records.map(record => [
2353
- `• ${record.topic || record.meetingNo}`,
2354
- ` meetingNo: \`${record.meetingNo}\``,
2355
- ` chat: \`${record.prepChatId}\``,
2356
- ` agent: \`${record.agentAppId}\``,
2357
- ` Q&A: ${record.qaMode}`,
2358
- ].join('\n'));
2359
- await sessionReply(rootId, [t('cmd.vc.status_title', undefined, loc), '', ...lines].join('\n'));
2360
- break;
2361
- }
2362
- if (request.kind === 'off') {
2363
- let count = 0;
2364
- if (request.all) {
2365
- for (const record of listVcMeetingPreparations(dataDir, larkAppId)) {
2366
- if (removeVcMeetingPreparation(dataDir, larkAppId, record.meetingNo))
2367
- count += 1;
2368
- }
2369
- }
2370
- else if (request.meetingNo) {
2371
- count = removeVcMeetingPreparation(dataDir, larkAppId, request.meetingNo) ? 1 : 0;
2372
- }
2373
- else if (ds) {
2374
- count = removeVcMeetingPreparationsByChat(dataDir, larkAppId, ds.chatId);
2375
- }
2376
- await sessionReply(rootId, count > 0
2377
- ? t('cmd.vc.stopped', { count }, loc)
2378
- : t('cmd.vc.none', undefined, loc));
2379
- break;
2380
- }
2381
- if (!ds || ds.chatType !== 'group' || ds.scope !== 'chat') {
2382
- await sessionReply(rootId, t('cmd.vc.need_group_chat', undefined, loc));
2383
- break;
2384
- }
2385
- const existingInChat = findVcMeetingPreparationByChat(dataDir, larkAppId, ds.chatId);
2386
- const record = putVcMeetingPreparation(dataDir, {
2387
- larkAppId,
2388
- meetingNo: request.meetingNo,
2389
- ...(request.meetingLink ? { meetingLink: request.meetingLink } : {}),
2390
- prepChatId: ds.chatId,
2391
- agentAppId: larkAppId,
2392
- agentSessionId: ds.session.sessionId,
2393
- ownerOpenId: message.senderId,
2394
- qaMode: request.qaMode,
2395
- });
2396
- const replaced = existingInChat && existingInChat.meetingNo !== record.meetingNo
2397
- ? `\n${t('cmd.vc.replaced', { meetingNo: existingInChat.meetingNo }, loc)}`
2398
- : '';
2399
- let preparedText = t('cmd.vc.prepared', {
2400
- meetingNo: record.meetingNo,
2401
- qaMode: record.qaMode,
2402
- }, loc) + replaced;
2403
- const meetingProjectDir = ds.workingDir ?? ds.session.workingDir;
2404
- preparedText += meetingProjectDir
2405
- ? `\n\n${t('cmd.vc.project_bound', { dir: meetingProjectDir }, loc)}`
2406
- : `\n\n${t('cmd.vc.project_optional', undefined, loc)}`;
2407
- await sessionReply(rootId, preparedText);
2408
- logger.info(`[${logTag}] /vc prepare meetingNo=${record.meetingNo} chat=${record.prepChatId} agent=${record.agentAppId} qa=${record.qaMode}`);
2409
- break;
2410
- }
2411
- case '/adopt': {
2412
- const adoptArgs = message.content.replace(/^\/adopt\s*/i, '').trim();
2413
- if (ds && isSessionTransferring(ds)) {
2414
- await sessionReply(rootId, t('cmd.session.transfer_in_progress', undefined, loc));
2415
- break;
2416
- }
2417
- if (ds?.adoptedFrom) {
2418
- const adopted = ds.adoptedFrom;
2419
- const cliName = sessionCliDisplayName(ds);
2420
- const project = adopted.cwd ? (adopted.cwd.split('/').pop() || adopted.cwd) : '';
2421
- const label = project ? `${cliName} · ${project}` : cliName;
2422
- await sessionReply(rootId, t('cmd.adopt.already_adopted', { label, pane: adoptTargetLabel(adopted) }, loc));
2423
- break;
2424
- }
2425
- const botCfgForAdopt = ds ? getBot(ds.larkAppId).config : (larkAppId ? getBot(larkAppId).config : undefined);
2426
- if (botCfgForAdopt?.cliId === 'codex-app') {
2427
- if (!ds) {
2428
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
2429
- break;
2430
- }
2431
- await handleCodexAppAdoptCommand(adoptArgs, rootId, ds, deps, larkAppId);
2432
- break;
2433
- }
2434
- const botCliId = botCfgForAdopt?.cliId;
2435
- const adoptSession = ds?.session;
2436
- const adoptAnchor = ds ? sessionAnchorId(ds) : undefined;
2437
- // Discover every supported backend, but only offer live sessions for
2438
- // this bot's configured CLI. A Pi bot must not show Codex/TRAE panes:
2439
- // adopting one would unexpectedly change the agent behind the bot.
2440
- // collectAdoptCandidates folds live-pane + disk-resume discovery into
2441
- // one snapshot; we cache it (by root message id) so the V2 picker's
2442
- // search / page re-renders don't re-shell-out to tmux each click.
2443
- const { collectAdoptCandidates, cacheAdoptCandidates } = await import('../services/adopt-picker.js');
2444
- const candidates = await collectAdoptCandidates(botCliId, botCfgForAdopt?.cliPathOverride, activeSessions, discoverResumableSessionsForBot, ADOPT_RESUME_LIMIT, botCfgForAdopt?.cliRuntime?.executable);
2445
- const sessions = candidates.sessions;
2446
- const resumable = candidates.resumable;
2447
- if (ds
2448
- && adoptSession
2449
- && adoptAnchor
2450
- && (ds.session !== adoptSession
2451
- || ds.session.status !== 'active'
2452
- || activeSessions.get(sessionKey(adoptAnchor, ds.larkAppId)) !== ds
2453
- || isSessionTransferring(ds))) {
2454
- await sessionReply(rootId, t('cmd.session.transfer_in_progress', undefined, loc));
2455
- break;
2456
- }
2457
- if (sessions.length === 0 && resumable.length === 0) {
2458
- await sessionReply(rootId, t('cmd.adopt.no_sessions', undefined, loc));
2459
- break;
2460
- }
2461
- const directTarget = adoptArgs;
2462
- if (directTarget) {
2463
- // Match a tmux address ("session:window.pane") OR a zellij target
2464
- // ("session:paneId" / "session/paneId") against the merged list.
2465
- const zellijNorm = directTarget.replace('/', ':');
2466
- const target = sessions.find(s => 'zellijPaneId' in s
2467
- ? `${s.zellijSession}:${s.zellijPaneId}` === zellijNorm
2468
- : adoptTargetLabel(s) === directTarget || adoptTargetKey(s) === directTarget || s.tmuxTarget === directTarget || s.herdrPaneId === directTarget);
2469
- if (target) {
2470
- if (ds)
2471
- await startAdoptSession(target, ds, deps, larkAppId);
2472
- break;
2473
- }
2474
- // Fall back to a resumable session matched by its CLI-native id.
2475
- const resumeTarget = resumable.find(r => r.cliSessionId === directTarget);
2476
- if (resumeTarget) {
2477
- if (ds)
2478
- await startResumeImportSession(resumeTarget, ds, deps, larkAppId);
2479
- break;
2480
- }
2481
- await sessionReply(rootId, t('cmd.adopt.pane_not_found', { pane: directTarget }, loc));
2482
- break;
2483
- }
2484
- // Cache the snapshot so the picker's search / page clicks reuse it
2485
- // (confirm re-discovers to re-validate the live pane).
2486
- cacheAdoptCandidates(rootId, candidates, Date.now());
2487
- const cardJson = buildAdoptSelectCard(sessions, rootId, loc, resumable, undefined, message.senderId, candidates.resumeLimit, botCliId, ds
2488
- ? sessionConfiguredRuntimeDisplayName(ds.session, getBot(ds.larkAppId).config.cliRuntime)
2489
- : configuredRuntimeDisplayName(botCfgForAdopt?.cliRuntime));
2490
- await sessionReply(rootId, cardJson, 'interactive');
2491
- break;
2492
- }
2493
- case '/oncall': {
2494
- const args = message.content.replace(/^\/oncall\s*/i, '').trim();
2495
- const [sub, ...rest] = args.length > 0 ? args.split(/\s+/) : [];
2496
- const appId = larkAppId ?? ds?.larkAppId;
2497
- const chatId = ds?.chatId;
2498
- if (!appId || !chatId) {
2499
- await sessionReply(rootId, t('cmd.oncall.need_group', undefined, loc));
2500
- break;
2501
- }
2502
- if (!sub || sub === 'status' || sub === '状态') {
2503
- const entry = getOncallStatus(appId, chatId);
2504
- if (!entry) {
2505
- await sessionReply(rootId, t('cmd.oncall.not_bound', undefined, loc));
2506
- }
2507
- else {
2508
- await sessionReply(rootId, t('cmd.oncall.bound', { dir: entry.workingDir }, loc));
2509
- }
2510
- break;
2511
- }
2512
- if (sub === 'bind' || sub === '绑定') {
2513
- const target = rest.join(' ').trim();
2514
- if (!target) {
2515
- await sessionReply(rootId, t('cmd.oncall.bind_usage', undefined, loc));
2516
- break;
2517
- }
2518
- const validation = validateWorkingDir(target, loc, { autoCreate: true });
2519
- if (!validation.ok) {
2520
- await sessionReply(rootId, validation.error);
2521
- break;
2522
- }
2523
- const resolvedPath = validation.resolvedPath;
2524
- const result = await bindOncall(appId, chatId, target);
2525
- if (!result.ok) {
2526
- if (result.reason === 'bot_not_in_config') {
2527
- await sessionReply(rootId, t('cmd.oncall.bind_failed_no_bot', undefined, loc));
2528
- }
2529
- else {
2530
- await sessionReply(rootId, t('cmd.oncall.bind_failed', { reason: result.reason }, loc));
2531
- }
2532
- break;
2533
- }
2534
- const verb = result.created
2535
- ? t('cmd.oncall.verb_bound', undefined, loc)
2536
- : t('cmd.oncall.verb_updated', undefined, loc);
2537
- const createdNote = validation.created ? `\n\n${t('cmd.oncall.bind_created_note', undefined, loc)}` : '';
2538
- await sessionReply(rootId, t('cmd.oncall.bind_success', {
2539
- verb,
2540
- chatId,
2541
- target,
2542
- resolved: resolvedPath,
2543
- }, loc) + createdNote);
2544
- logger.info(`[${logTag}] /oncall bind chat=${chatId} dir=${target}${validation.created ? ' (auto-created)' : ''}`);
2545
- break;
2546
- }
2547
- if (sub === 'unbind' || sub === '解绑') {
2548
- const result = await unbindOncall(appId, chatId);
2549
- if (!result.ok) {
2550
- await sessionReply(rootId, t('cmd.oncall.unbind_failed', { reason: result.reason }, loc));
2551
- break;
2552
- }
2553
- if (!result.wasBound) {
2554
- await sessionReply(rootId, t('cmd.oncall.unbind_not_bound', undefined, loc));
2555
- }
2556
- else {
2557
- await sessionReply(rootId, t('cmd.oncall.unbind_success', undefined, loc));
2558
- }
2559
- logger.info(`[${logTag}] /oncall unbind chat=${chatId} wasBound=${result.wasBound}`);
2560
- break;
2561
- }
2562
- await sessionReply(rootId, t('cmd.oncall.unknown_sub', { sub }, loc));
2563
- break;
2564
- }
2565
- case '/group':
2566
- case '/g': {
2567
- const creatorAppId = larkAppId ?? ds?.larkAppId;
2568
- if (!creatorAppId) {
2569
- await sessionReply(rootId, t('cmd.group.no_bot', undefined, loc));
2570
- break;
2571
- }
2572
- const senderOpenId = message.senderId;
2573
- if (!senderOpenId) {
2574
- await sessionReply(rootId, t('cmd.group.no_sender', undefined, loc));
2575
- break;
2576
- }
2577
- // Each @-mentioned bot independently receives this same event and reaches
2578
- // this handler, so exactly one must create the group and the rest must
2579
- // stay silent. Intent: pull every @-mentioned bot into a new group, with
2580
- // the FIRST mentioned bot doing the creating.
2581
- //
2582
- // Two distinct sources, each used for what it's reliable at:
2583
- // • DETECTION ("is this @-mention a bot, and which is first?") uses
2584
- // globalKnownBotNames() from bots-info.json — process-stable and
2585
- // complete. getAllBots() can't be used (one daemon per bot ⇒ it only
2586
- // sees self), and the live roster can transiently miss a bot; either
2587
- // would let competing processes disagree on the first bot → split
2588
- // brain. The name set + my own open_id give every process the same
2589
- // leadership verdict with no API/cross-ref dependency.
2590
- // • RESOLUTION (bot → larkAppId for the invite) uses the live roster
2591
- // listChatBotMembers(), failing CLOSED on any miss.
2592
- const mentions = message.mentions ?? [];
2593
- // `/group` runs without a pre-created session (see
2594
- // SESSIONLESS_DAEMON_COMMANDS), so the source chat comes from the
2595
- // message; fall back to the active session when invoked mid-session.
2596
- const sourceChatId = message.chatId ?? ds?.chatId;
2597
- const knownBotNames = globalKnownBotNames();
2598
- // Degraded-state guard: if the user @-mentioned someone but the global bot
2599
- // registry is empty (bots-info.json missing/corrupt/not-yet-written), we
2600
- // can't tell bots from users — so we can't elect a creator. Fail CLOSED
2601
- // rather than fall through to "no bot mentions" → per-bot solo group,
2602
- // which would let every @-mentioned bot create its own group.
2603
- if (knownBotNames.size === 0 && mentions.some(m => !!m.name)) {
2604
- logger.warn(`[${logTag}] /group: global bot registry empty (bots-info.json missing/corrupt); cannot elect a creator`);
2605
- await sessionReply(rootId, t('cmd.group.resolve_failed', undefined, loc));
2606
- break;
2607
- }
2608
- // The @-mentioned bots, in mention order. The first one is the creator.
2609
- const botMentions = mentions.filter(m => m.name && knownBotNames.has(m.name.toLowerCase()));
2610
- // ── Leader election ──────────────────────────────────────────────────
2611
- const mentionedBotAppIds = [];
2612
- const appIdToName = new Map();
2613
- if (botMentions.length > 0) {
2614
- const firstBot = botMentions[0];
2615
- const myOpenId = getBotOpenId(creatorAppId);
2616
- // Am I the first @-mentioned bot? My own open_id is always reliable in
2617
- // my own app scope (Lark reports a bot its own open_id consistently),
2618
- // so this needs no cross-ref. Name fallback only when my open_id isn't
2619
- // probed yet AND my display name is globally unambiguous.
2620
- const myName = getBot(creatorAppId).botName?.toLowerCase();
2621
- const myNameAmbiguous = !!myName && botMentions.filter(m => m.name?.toLowerCase() === myName).length > 1;
2622
- const iAmFirstBot = (!!myOpenId && firstBot.openId === myOpenId) ||
2623
- (!myOpenId && !!myName && !myNameAmbiguous && firstBot.name?.toLowerCase() === myName);
2624
- if (!iAmFirstBot) {
2625
- logger.info(`[${logTag}] /group: not the first @-mentioned bot (first="${firstBot.name}"), staying silent`);
2626
- break;
2627
- }
2628
- // I'm the creator. Resolving invitees needs the chat roster — fail
2629
- // CLOSED if it's missing rather than fall through to a per-bot solo
2630
- // group (which would let every mentioned bot create one).
2631
- if (!sourceChatId) {
2632
- logger.warn(`[${logTag}] /group: missing source chatId, cannot resolve @-mentioned bots`);
2633
- await sessionReply(rootId, t('cmd.group.resolve_failed', undefined, loc));
2634
- break;
2635
- }
2636
- let members = [];
2637
- try {
2638
- members = await listChatBotMembers(creatorAppId, sourceChatId);
2639
- }
2640
- catch (e) {
2641
- logger.warn(`[${logTag}] /group failed to list chat bot members: ${e?.message ?? e}`);
2642
- }
2643
- const memberByOpenId = new Map(members.map(m => [m.openId, m]));
2644
- for (const m of members) {
2645
- if (m.larkAppId && m.displayName)
2646
- appIdToName.set(m.larkAppId, m.displayName);
2647
- }
2648
- // Resolve each bot mention → larkAppId by open_id (our scope; reliable
2649
- // for distinct bots, and disambiguates duplicate display names), in
2650
- // mention order, deduped. Fail CLOSED on any unresolved bot rather than
2651
- // build a group missing an intended one.
2652
- const seen = new Set();
2653
- let unresolved;
2654
- for (const bm of botMentions) {
2655
- const mem = bm.openId ? memberByOpenId.get(bm.openId) : undefined;
2656
- if (!mem || !mem.larkAppId) {
2657
- unresolved = bm.name;
2658
- break;
2659
- }
2660
- if (!seen.has(mem.larkAppId)) {
2661
- seen.add(mem.larkAppId);
2662
- mentionedBotAppIds.push(mem.larkAppId);
2663
- }
2664
- }
2665
- if (unresolved) {
2666
- logger.warn(`[${logTag}] /group: could not resolve @-mentioned bot "${unresolved}" to an app id; aborting`);
2667
- await sessionReply(rootId, t('cmd.group.resolve_failed', undefined, loc));
2668
- break;
2669
- }
2670
- }
2671
- // Extract the requested group name. Strip whichever alias was used, then
2672
- // remove any `@<name>` mention tokens that leaked into the body (Lark
2673
- // renders mentions as literal `@Name` text in content), then take the
2674
- // first non-blank line so multi-line pastes don't smear into the name.
2675
- let rawArgs = message.content.replace(/^\/(group|g)\s*/i, '');
2676
- for (const m of mentions) {
2677
- if (m.name)
2678
- rawArgs = rawArgs.split(`@${m.name}`).join(' ');
2679
- }
2680
- let roleProfileId;
2681
- const roleProfileArg = rawArgs.match(/(?:^|\s)--role-profile(?:=|\s+)(\S+)/);
2682
- if (roleProfileArg) {
2683
- if (!isValidRoleProfileId(roleProfileArg[1])) {
2684
- await sessionReply(rootId, t('role.profile.invalid', undefined, loc));
2685
- break;
2686
- }
2687
- roleProfileId = roleProfileArg[1];
2688
- rawArgs = rawArgs.replace(roleProfileArg[0], ' ');
2689
- }
2690
- const firstLine = rawArgs.split(/\r?\n/).map(s => s.trim()).find(Boolean) ?? '';
2691
- let baseGroupName;
2692
- if (firstLine) {
2693
- baseGroupName = firstLine;
2694
- }
2695
- else {
2696
- const now = new Date();
2697
- const ts = `${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
2698
- baseGroupName = t('cmd.group.empty_fallback', { ts }, loc);
2699
- }
2700
- const groupName = formatSlashGroupName(baseGroupName, readGlobalConfig().groupNamePrefix);
2701
- // Bots to invite: every @-mentioned bot (creator filtered out internally
2702
- // by the service). Empty mentions → solo group (creator only).
2703
- const larkAppIdsForGroup = mentionedBotAppIds.length > 0 ? mentionedBotAppIds : [creatorAppId];
2704
- try {
2705
- const { createGroupWithBots } = await import('../services/group-creator.js');
2706
- const result = await createGroupWithBots({
2707
- creatorLarkAppId: creatorAppId,
2708
- larkAppIds: larkAppIdsForGroup,
2709
- name: groupName,
2710
- userOpenIds: [senderOpenId],
2711
- transferOwnerTo: senderOpenId,
2712
- notifyOwnerOpenId: senderOpenId,
2713
- roleProfileId,
2714
- });
2715
- // Prefer the shareable join link (others can click to *join*); fall
2716
- // back to the member-only applink URL when Lark's link API failed.
2717
- const applink = chatAppLink(result.chatId, normalizeBrand(getBot(creatorAppId).config.brand));
2718
- const link = result.shareLink ?? applink;
2719
- // Partial failures are non-fatal — the chat exists; surface them as
2720
- // hints so the user knows whether to expect to be auto-invited.
2721
- const hints = [];
2722
- if (result.invalidUserIds.includes(senderOpenId)) {
2723
- hints.push(t('cmd.group.warn_invite_rejected', undefined, loc));
2724
- }
2725
- else if (result.transferError) {
2726
- hints.push(t('cmd.group.warn_transfer_failed', { reason: result.transferError }, loc));
2727
- }
2728
- // Share-link fetch failed → the displayed link is the member-only
2729
- // applink; warn the user so they don't expect non-members to join via it.
2730
- if (!result.shareLink && result.shareLinkError) {
2731
- logger.warn(`[${logTag}] /group share-link unavailable, using applink: ${result.shareLinkError}`);
2732
- hints.push(t('cmd.group.warn_share_link_failed', undefined, loc));
2733
- }
2734
- // List every bot in the new group (creator included), and warn about
2735
- // any Feishu rejected. Names come from the chat roster (members) since
2736
- // getBot() only knows this process's own bot in the one-daemon-per-bot
2737
- // model; fall back to the registry/raw id for anything not in the map.
2738
- const nameOf = (id) => appIdToName.get(id) ?? botDisplayName(id);
2739
- const groupBotIds = larkAppIdsForGroup.filter(id => !result.invalidBotIds.includes(id));
2740
- if (groupBotIds.length > 1) {
2741
- hints.push(t('cmd.group.bots_invited', { bots: groupBotIds.map(nameOf).join('、') }, loc));
2742
- }
2743
- if (result.invalidBotIds.length > 0) {
2744
- hints.push(t('cmd.group.warn_bots_rejected', { bots: result.invalidBotIds.map(nameOf).join('、') }, loc));
2745
- }
2746
- if (roleProfileId) {
2747
- if (result.roleProfileBootstrapError) {
2748
- hints.push(t('cmd.group.role_profile_bootstrap_failed', { profile: roleProfileId, reason: result.roleProfileBootstrapError ?? 'unknown' }, loc));
2749
- }
2750
- else {
2751
- hints.push(t('cmd.group.role_profile_bootstrap_sent', { profile: roleProfileId }, loc));
2752
- }
2753
- }
2754
- const hintsText = hints.length > 0 ? '\n' + hints.join('\n') : '';
2755
- await sessionReply(rootId, t('cmd.group.created', { name: groupName, link, hints: hintsText }, loc));
2756
- logger.info(`[${logTag}] /group created chat=${result.chatId} name="${groupName}" bots=[${larkAppIdsForGroup.join(',')}] invitee=${senderOpenId}`);
2757
- // Intentionally NO auto-bootstrap (repo-select card / chat-scope
2758
- // session) here: the group name rarely carries enough context to seed
2759
- // a useful prompt. The user starts a real conversation with the bot in
2760
- // the new group, which spawns the session on first message.
2761
- }
2762
- catch (err) {
2763
- logger.error(`[${logTag}] /group failed: ${err?.message ?? err}`);
2764
- await sessionReply(rootId, t('cmd.group.failed', { error: err?.message ?? String(err) }, loc));
2765
- }
2766
- break;
2767
- }
2768
- /**
2769
- * `/relay --create <群名> @bot [@bot...]` — create a new chat, invite
2770
- * the @-mentioned bots, then migrate every bot's session in this
2771
- * thread (including the leader's) into the new chat.
2772
- *
2773
- * p2p (私聊) variant: `/relay --create [群名]` with NO mentions — DMs
2774
- * have no member roster so @-ing a bot is impossible there. The bot
2775
- * itself is the sole participant and leader; the new group is user +
2776
- * this bot, and the DM session migrates over (solo relay, no peers).
2777
- *
2778
- * Two-path command:
2779
- * • `--create` (PR2) — implemented below; creates a new chat.
2780
- * • no flag (PR3) — picker card listing user's relayable sessions
2781
- * in OTHER chats so the user can pull one into
2782
- * the current chat. Stubbed for now.
2783
- *
2784
- * Leader election is `mentions[0]` (identical to /group). The leader
2785
- * is the only daemon that:
2786
- * 1. Creates the new chat (createGroupWithBots)
2787
- * 2. Sends the M1 announcement message (its message_id becomes the
2788
- * shared rootMessageId for all relayed sessions — multi-bot
2789
- * sessions co-anchor on the same root via different larkAppIds)
2790
- * 3. Transfers its own session (if any) via local transferSession()
2791
- * 4. POSTs /api/sessions/migrate-to-chat to every peer daemon to
2792
- * ask them to transfer their own session at the same anchor
2793
- * 5. Aggregates results into a single reply in the source thread
2794
- *
2795
- * Owner-only: only the source session's `ownerOpenId` may invoke. Peers
2796
- * enforce the same check independently inside the migrate endpoint.
2797
- *
2798
- * Failure mode: best-effort, no rollback. Peers that timeout / fail /
2799
- * are offline simply appear in the report as "skipped". The new chat
2800
- * and any successful transfers stand.
2801
- */
2802
- case '/relay': {
2803
- const argsLine = message.content.replace(/^\/relay\s*/i, '').trim();
2804
- if (!/^--create\b/i.test(argsLine)) {
2805
- // ── Pull picker ───────────────────────────────────────────────────
2806
- // /relay (no flag) lives in the *target* chat — list the operator's
2807
- // own active sessions in OTHER chats so they can pull one in.
2808
- //
2809
- // Filter:
2810
- // • same bot (this larkAppId)
2811
- // • session is active (has a worker / appears in activeSessions)
2812
- // • session NOT in the current chat (can't relay to yourself)
2813
- // • operator IS the session owner (owner-only access)
2814
- //
2815
- // The button's `target_chat_id` / `target_root_id` are the chat we're
2816
- // pulling INTO (the chat hosting this command). card-handler uses
2817
- // them to invoke transferSession after sending the M1 announcement.
2818
- const operatorOpenId = message.senderId;
2819
- if (!operatorOpenId) {
2820
- await sessionReply(rootId, t('cmd.relay.no_sender', undefined, loc));
2821
- break;
2822
- }
2823
- const myAppId = larkAppId ?? ds?.larkAppId;
2824
- if (!myAppId) {
2825
- await sessionReply(rootId, t('cmd.group.no_bot', undefined, loc));
2826
- break;
2827
- }
2828
- const targetChatId = ds?.chatId;
2829
- if (!targetChatId) {
2830
- await sessionReply(rootId, t('cmd.relay.no_session', undefined, loc));
2831
- break;
2832
- }
2833
- // ── Target-routing resolution ─────────────────────────────────────
2834
- // Resolve the chat mode once, then compute WHERE the relayed session
2835
- // should land via resolveRelayTargetRouting (mirrors decideRouting;
2836
- // 话题群 / 线程内 / 普通群 new-topic·shared → thread-scope, 普通群
2837
- // flat → chat-scope; DM 扁平(p2pMode chat) → chat-scope, DM 话题模式
2838
- // → thread-scope seeded on the /relay message).
2839
- // p2p is authoritative from `ds.chatType` (recorded off the Lark
2840
- // event payload — doesn't drift, and the API's safe-default 'group'
2841
- // on failure would misclassify a DM); only group chats need the API
2842
- // call to split topic-vs-regular (both record chatType 'group').
2843
- const targetIsP2p = ds?.chatType === 'p2p';
2844
- const targetChatType = targetIsP2p ? 'p2p' : 'group';
2845
- let targetChatMode = 'p2p';
2846
- if (!targetIsP2p) {
2847
- const { getChatNameAndMode } = await import('../im/lark/client.js');
2848
- const info = await getChatNameAndMode(myAppId, targetChatId).catch(() => null);
2849
- targetChatMode = info?.mode ?? 'group';
2850
- }
2851
- const { resolveRelayTargetRouting } = await import('../im/lark/relay-target-routing.js');
2852
- const targetRouting = resolveRelayTargetRouting({
2853
- larkAppId: myAppId,
2854
- chatId: targetChatId,
2855
- message: { messageId: message.messageId, rootId: message.rootId || undefined, threadId: message.threadId },
2856
- chatMode: targetChatMode,
2857
- });
2858
- const targetScope = targetRouting.scope;
2859
- const targetAnchor = targetRouting.anchor;
2860
- // ── Reply WHERE the user typed /relay ─────────────────────────────
2861
- // Not through sessionReply: in chat-scope groups (普通群扁平 /
2862
- // chat-topic / shared) that path either leaks to the chat top level
2863
- // (the /relay scratch has no turn state to fold back into) or lands
2864
- // in the CURRENT turn's 话题 (a real chat-scope session) — both away
2865
- // from the 话题 the user invoked in (申晗 live 反馈). The target
2866
- // routing already encodes the invocation spot:
2867
- // thread → reply_in_thread into that 话题 (for 话题群 / DM-thread
2868
- // top-level this seeds the 话题 on the /relay message —
2869
- // same place the relayed session will land);
2870
- // chat → quote-reply the /relay message at the top level.
2871
- // Fallback to sessionReply if the reply API refuses (e.g. the
2872
- // command message was withdrawn mid-flight).
2873
- const replyAtInvocation = async (content, msgType) => {
2874
- try {
2875
- await replyMessage(myAppId, targetScope === 'thread' ? targetAnchor : message.messageId, content, msgType ?? 'text',
2876
- /*replyInThread*/ targetScope === 'thread');
2877
- }
2878
- catch (err) {
2879
- logger.warn(`[${logTag}] /relay reply-at-invocation failed (${err instanceof Error ? err.message : err}); falling back to sessionReply`);
2880
- await sessionReply(rootId, content, msgType);
2881
- }
2882
- };
2883
- // ── Existing-session guard (anchor-based) ─────────────────────────
2884
- // A real session already sitting AT the target anchor would collide
2885
- // on sessionKey(targetAnchor, larkAppId) after transfer — Map.set
2886
- // would orphan its worker. Scratch placeholders (worker:null, e.g.
2887
- // the /relay command's own record at this anchor) are NOT a conflict;
2888
- // transferSession closes them inline. We do NOT exclude `ds`: if
2889
- // /relay rides an existing real session at the anchor, `ds` itself IS
2890
- // the conflict. Anchor-based so同群 other-topic sessions (different
2891
- // anchor) don't false-positive — that's what enables 同群话题间搬运.
2892
- const conflict = [...activeSessions.values()].find(c => c.larkAppId === myAppId
2893
- && sessionAnchorId(c) === targetAnchor
2894
- && !!c.worker // real running session, not a placeholder
2895
- );
2896
- if (conflict) {
2897
- await replyAtInvocation(t('cmd.relay.target_has_session', { title: conflict.session.title || conflict.session.sessionId.substring(0, 8) }, loc));
2898
- break;
2899
- }
2900
- // Shared candidate-collection logic — used here at initial render
2901
- // and again in card-handler when the user clicks a card to switch
2902
- // selection (the card re-render needs the same filtered list).
2903
- // Excludes (by anchor) the target itself; keeps cross-group + 同群
2904
- // other-topic sessions. Resolves friendly chat names + modes.
2905
- const { collectRelayPickerEntries } = await import('../services/relay-picker.js');
2906
- const entries = await collectRelayPickerEntries(activeSessions, myAppId, targetAnchor, operatorOpenId);
2907
- const { buildRelayPickerCard } = await import('../im/lark/card-builder.js');
2908
- // ── Ephemeral (仅邀请者可见) picker ────────────────────────────────
2909
- // The picker exposes session metadata — title + source-chat name — to
2910
- // everyone who can see the message. When the bot runs in privateCard
2911
- // mode we hide it: send the picker as an ephemeral card visible only to
2912
- // the invoker.
2913
- //
2914
- // Gate on group + privateCard + **chat-scope**. The chat-scope clause
2915
- // is load-bearing: the ephemeral API (`ephemeral/v1/send`) takes a
2916
- // `chat_id` only — it has NO thread/root anchor — so a thread-scope
2917
- // target (话题群 / 话题 inside a 普通群 / new-topic·shared) can't keep the
2918
- // card in its 话题. A 话题群 rejects with 18053 (→ fall back below), but
2919
- // a 话题 inside a 普通群 SUCCEEDS and the card escapes to the group top
2920
- // level. This is the same trap `deliverEphemeralOrReply` (worker-pool)
2921
- // guards against with a REGRESSION test; PR #164 was the original live
2922
- // fix. Per 申晗 (2026-07-29): 话题内公开可接受 — so thread-scope pickers
2923
- // stay on the visible in-thread reply (public card in the 话题), and
2924
- // ephemeral is scoped to flat 普通群 only, mirroring /card & /close
2925
- // private cards. p2p has no ephemeral option; an unexpected reject
2926
- // (18053 etc.) still falls back to the visible reply below.
2927
- const privatePicker = targetChatType === 'group'
2928
- && targetScope === 'chat'
2929
- && getBot(myAppId).config.privateCard === true;
2930
- const card = buildRelayPickerCard(entries, targetChatId, targetAnchor, operatorOpenId, loc, undefined, targetScope, targetChatType, privatePicker ? 'private' : 'public');
2931
- if (privatePicker) {
2932
- const { sendEphemeralCard } = await import('../im/lark/client.js');
2933
- try {
2934
- await sendEphemeralCard(myAppId, targetChatId, operatorOpenId, card);
2935
- }
2936
- catch (err) {
2937
- // Ephemeral unavailable here (18053 topic / permission / network):
2938
- // fall back to the visible reply so the picker still works — the
2939
- // privacy win is best-effort, correctness is not.
2940
- logger.warn(`[${logTag}] /relay ephemeral picker failed (${err instanceof Error ? err.message : err}); sending visible picker`);
2941
- const visibleCard = buildRelayPickerCard(entries, targetChatId, targetAnchor, operatorOpenId, loc, undefined, targetScope, targetChatType, 'public');
2942
- await replyAtInvocation(visibleCard, 'interactive');
2943
- }
2944
- }
2945
- else {
2946
- await replyAtInvocation(card, 'interactive');
2947
- }
2948
- break;
2949
- }
2950
- const afterFlag = argsLine.replace(/^--create\s*/i, '').trim();
2951
- const creatorAppId = larkAppId ?? ds?.larkAppId;
2952
- if (!creatorAppId) {
2953
- await sessionReply(rootId, t('cmd.group.no_bot', undefined, loc));
2954
- break;
2955
- }
2956
- const senderOpenId = message.senderId;
2957
- // Cross-app stable identity — peer daemons can't compare against
2958
- // leader's open_id directly because the same user has a different
2959
- // open_id in each bot's namespace. union_id is shared per tenant.
2960
- // We pass it through the migrate-to-chat HTTP body; peers compare
2961
- // against their session's `ownerUnionId` (with fallback to
2962
- // open_id for sessions persisted before this field existed).
2963
- const senderUnionId = message.senderUnionId;
2964
- if (!senderOpenId) {
2965
- await sessionReply(rootId, t('cmd.relay.no_sender', undefined, loc));
2966
- break;
2967
- }
2968
- // `--create` must be invoked inside an existing thread — the source
2969
- // anchor for peer transfers comes from `ds`. (Picker mode in PR3 is
2970
- // allowed without a session.)
2971
- if (!ds) {
2972
- await sessionReply(rootId, t('cmd.relay.no_session', undefined, loc));
2973
- break;
2974
- }
2975
- // Front-loaded guards — transferSession refuses adoptedFrom /
2976
- // pendingRepo too, but only after createGroupWithBots has already
2977
- // built a new chat. Failing here keeps relay clean and avoids
2978
- // orphan-chat garbage when the operation can't possibly succeed.
2979
- if (ds.session.adoptedFrom) {
2980
- await sessionReply(rootId, t('cmd.relay.adopt_not_relayable', undefined, loc));
2981
- break;
2982
- }
2983
- if (ds.pendingRepo) {
2984
- await sessionReply(rootId, t('cmd.relay.not_started_yet', undefined, loc));
2985
- break;
2986
- }
2987
- // ── p2p (私聊) solo relay: no mention gate, no leader election ──────
2988
- // 飞书私聊里 @ 不到任何机器人(DM 没有成员列表),mention 门与 leader
2989
- // 选举在这里没有意义 —— 本 bot 就是唯一参与者兼 leader,新群 = 用户 +
2990
- // 本 bot,无 peer 协调(peerAppIds 自然为空)。群聊路径语义不变。
2991
- // chatType 取自 ds(会话创建时从 Lark 事件记录,权威、不漂移)。
2992
- const sourceIsP2p = ds.chatType === 'p2p';
2993
- // ── Mention parsing & leader election (mirror of /group) ───────────
2994
- const mentions = message.mentions ?? [];
2995
- const knownBotNames = globalKnownBotNames();
2996
- const botMentions = sourceIsP2p ? [] : mentions.filter(m => m.name && knownBotNames.has(m.name.toLowerCase()));
2997
- if (!sourceIsP2p) {
2998
- if (knownBotNames.size === 0 && mentions.some(m => !!m.name)) {
2999
- logger.warn(`[${logTag}] /relay --create: global bot registry empty; cannot elect a creator`);
3000
- await sessionReply(rootId, t('cmd.relay.resolve_failed', undefined, loc));
3001
- break;
3002
- }
3003
- if (botMentions.length === 0) {
3004
- await sessionReply(rootId, t('cmd.relay.no_mentions', undefined, loc));
3005
- break;
3006
- }
3007
- // Am I `mentions[0]`?
3008
- const firstBot = botMentions[0];
3009
- const myOpenId = getBotOpenId(creatorAppId);
3010
- const myName = getBot(creatorAppId).botName?.toLowerCase();
3011
- const myNameAmbiguous = !!myName
3012
- && botMentions.filter(m => m.name?.toLowerCase() === myName).length > 1;
3013
- const iAmFirstBot = (!!myOpenId && firstBot.openId === myOpenId) ||
3014
- (!myOpenId && !!myName && !myNameAmbiguous && firstBot.name?.toLowerCase() === myName);
3015
- if (!iAmFirstBot) {
3016
- logger.info(`[${logTag}] /relay --create: not the first @-mentioned bot, staying silent`);
3017
- break;
3018
- }
3019
- }
3020
- // Owner-only — only the source session owner may relay this session.
3021
- if (ds.session.ownerOpenId && ds.session.ownerOpenId !== senderOpenId) {
3022
- await sessionReply(rootId, t('cmd.relay.not_owner', undefined, loc));
3023
- break;
3024
- }
3025
- // ── Resolve @-bots to larkAppIds via the source chat's bot roster ──
3026
- // p2p: 跳过成员表解析(DM 没有 bot roster,listChatBotMembers 会失败),
3027
- // 参与者就是本 bot 自己;名字兜底走 botDisplayName(nameOf)。
3028
- const sourceChatId = ds.chatId;
3029
- const appIdToName = new Map();
3030
- const mentionedBotAppIds = [];
3031
- if (sourceIsP2p) {
3032
- mentionedBotAppIds.push(creatorAppId);
3033
- }
3034
- else {
3035
- let members = [];
3036
- try {
3037
- members = await listChatBotMembers(creatorAppId, sourceChatId);
3038
- }
3039
- catch (e) {
3040
- logger.warn(`[${logTag}] /relay --create: failed to list source chat members: ${e?.message ?? e}`);
3041
- }
3042
- const memberByOpenId = new Map(members.map(m => [m.openId, m]));
3043
- for (const m of members) {
3044
- if (m.larkAppId && m.displayName)
3045
- appIdToName.set(m.larkAppId, m.displayName);
3046
- }
3047
- const seenApp = new Set();
3048
- let unresolved;
3049
- for (const bm of botMentions) {
3050
- const mem = bm.openId ? memberByOpenId.get(bm.openId) : undefined;
3051
- if (!mem || !mem.larkAppId) {
3052
- unresolved = bm.name;
3053
- break;
3054
- }
3055
- if (!seenApp.has(mem.larkAppId)) {
3056
- seenApp.add(mem.larkAppId);
3057
- mentionedBotAppIds.push(mem.larkAppId);
3058
- }
3059
- }
3060
- if (unresolved) {
3061
- logger.warn(`[${logTag}] /relay --create: unresolved bot "${unresolved}"`);
3062
- await sessionReply(rootId, t('cmd.relay.resolve_failed', undefined, loc));
3063
- break;
3064
- }
3065
- }
3066
- // ── Group name extraction (mirror of /group) ───────────────────────
3067
- let rawArgs = afterFlag;
3068
- for (const m of mentions) {
3069
- if (m.name)
3070
- rawArgs = rawArgs.split(`@${m.name}`).join(' ');
3071
- }
3072
- const firstLine = rawArgs.split(/\r?\n/).map(s => s.trim()).find(Boolean) ?? '';
3073
- const MAX_NAME = 50;
3074
- let groupName;
3075
- if (firstLine) {
3076
- groupName = firstLine.length > MAX_NAME ? firstLine.slice(0, MAX_NAME) + '…' : firstLine;
3077
- }
3078
- else {
3079
- const now = new Date();
3080
- const ts = `${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
3081
- groupName = t('cmd.relay.empty_group_name', { ts }, loc);
3082
- }
3083
- // ── Create the new chat ────────────────────────────────────────────
3084
- const nameOf = (id) => appIdToName.get(id) ?? botDisplayName(id);
3085
- let newChatId;
3086
- let inviteLink;
3087
- try {
3088
- const { createGroupWithBots } = await import('../services/group-creator.js');
3089
- const result = await createGroupWithBots({
3090
- creatorLarkAppId: creatorAppId,
3091
- larkAppIds: mentionedBotAppIds,
3092
- name: groupName,
3093
- userOpenIds: [senderOpenId],
3094
- transferOwnerTo: senderOpenId,
3095
- });
3096
- newChatId = result.chatId;
3097
- const applink = chatAppLink(result.chatId, normalizeBrand(getBot(creatorAppId).config.brand));
3098
- inviteLink = result.shareLink ?? applink;
3099
- }
3100
- catch (err) {
3101
- logger.error(`[${logTag}] /relay --create: createGroup failed: ${err?.message ?? err}`);
3102
- await sessionReply(rootId, t('cmd.relay.failed', { error: err?.message ?? String(err) }, loc));
3103
- break;
3104
- }
3105
- // Snapshot the pre-transfer source anchor — peers locate their own
3106
- // session by this value, and `transferSession()` will overwrite
3107
- // `ds.session.rootMessageId` once it runs. Must capture BEFORE the
3108
- // leader transfer call (caught in review).
3109
- const sourceAnchor = ds.session.rootMessageId;
3110
- // ── M1 deferred: post the announcement AFTER all transfers settle ──
3111
- // Previous flow sent an optimistic "已接力" M1 before running any
3112
- // transfer. When leader/peers later failed, that M1 was a lie — and
3113
- // the --create path had no orphan-cleanup (picker path did).
3114
- //
3115
- // New flow: pass `newChatId` as a placeholder for targetRootMessageId
3116
- // into transferSession. Chat-scope routing ignores rootMessageId
3117
- // (worker-pool transferSession only stores it for audit/UX), so the
3118
- // placeholder doesn't break routing. Once all outcomes are in, we
3119
- // post the real M1 with success/failure breakdown, then patch the
3120
- // leader's session.rootMessageId to that final M1 id. Peer sessions
3121
- // keep newChatId as a cosmetic placeholder — fixing them would
3122
- // require another round-trip; chat-scope doesn't actually care.
3123
- const placeholderRootMessageId = newChatId;
3124
- // Resolve friendly source-chat label for the M1 body — falls back to
3125
- // raw chatId if Lark can't return a name. Mirrors picker-path
3126
- // (card-handler.ts relay_confirm) so the message reads the same in
3127
- // both UX entry points; p2p source has no chat name (chat.get often
3128
- // fails/returns empty for DMs) — use the locale-aware 单聊 label
3129
- // instead of leaking a raw oc_ id into the M1.
3130
- const { getChatName } = await import('../im/lark/client.js');
3131
- const sourceLabel = sourceIsP2p
3132
- ? t('card.relay.type_p2p', undefined, loc)
3133
- : (await getChatName(creatorAppId, sourceChatId).catch(() => null)) ?? sourceChatId;
3134
- // ── Step 1: leader transfers its own session (if any) ───────────────
3135
- // Empty-leader handling: daemon auto-creates a placeholder ds for any
3136
- // DAEMON_COMMAND (worker:null + hasHistory:false). If the user typed
3137
- // `/relay --create` in a chat where they never actually chatted with
3138
- // the bot, ds IS that placeholder — there's no real session to
3139
- // migrate. Pre-Codex-review we'd happily transferSession the empty
3140
- // shell and report "已就绪:leader" as a lie. Now we detect this,
3141
- // skip transferSession, mark leader as `no_session`, and close the
3142
- // scratch so it doesn't linger as a ghost.
3143
- //
3144
- // The new chat is still created (createGroupWithBots already ran
3145
- // above) — that itself is a valuable product outcome since the
3146
- // mentioned bots were invited. Peers continue through their normal
3147
- // path; the final M1 template adapts to "all_fresh" when no bot
3148
- // actually had a session to bring along.
3149
- const reportLines = [];
3150
- const leaderName = nameOf(creatorAppId);
3151
- const successBotNames = [];
3152
- const failedBotNames = [];
3153
- // Use the persisted-marker predicate, not runtime ds.hasHistory:
3154
- // restoreActiveSessions sets hasHistory:true UNCONDITIONALLY on
3155
- // restart (session-manager.ts:618), so a scratch that survives a
3156
- // restart comes back with hasHistory:true and would defeat a
3157
- // naive `!!ds.worker || ds.hasHistory` check. cliId / lastCliInput
3158
- // are only written after a real worker started the CLI, so they
3159
- // survive restart correctly.
3160
- const { isRelayableRealSession } = await import('./worker-pool.js');
3161
- const leaderHasRealSession = isRelayableRealSession(ds);
3162
- if (leaderHasRealSession) {
3163
- const { transferSession } = await import('./worker-pool.js');
3164
- // Target chat was just built by createGroupWithBots — by
3165
- // construction a regular group, chat-scope.
3166
- const leaderResult = await transferSession(ds.session.sessionId, newChatId, placeholderRootMessageId, 'group', 'chat');
3167
- if (!leaderResult.ok) {
3168
- // Real session, real failure (worker busy / unsupported target
3169
- // / tmux issue). Abort the entire --create flow — the new chat
3170
- // exists but is empty of any migrated session; we don't post
3171
- // an M1 because there's nothing to announce.
3172
- reportLines.push(t('cmd.relay.report_leader_failed', { bot: leaderName, error: leaderResult.error }, loc));
3173
- await sessionReply(rootId, t('cmd.relay.created', { name: groupName, link: inviteLink, report: reportLines.join('\n') }, loc));
3174
- break;
3175
- }
3176
- reportLines.push(t('cmd.relay.report_leader_ok', { bot: leaderName }, loc));
3177
- successBotNames.push(leaderName);
3178
- }
3179
- else {
3180
- // Empty leader: no real session to migrate.
3181
- reportLines.push(t('cmd.relay.report_leader_no_session', { bot: leaderName }, loc));
3182
- failedBotNames.push(leaderName);
3183
- // Close the daemon-command scratch so it doesn't linger as a
3184
- // ghost active row at the source anchor (same hygiene that
3185
- // transferSession's pre-flight applies to target-chat scratches).
3186
- const { closeSession } = await import('./worker-pool.js');
3187
- await closeSession(ds.session.sessionId).catch(err => {
3188
- logger.warn(`[${logTag}] /relay --create: failed to close empty-leader scratch: ${err instanceof Error ? err.message : err}`);
3189
- });
3190
- }
3191
- // ── Step 2: coordinate peer daemons (parallel) ─────────────────────
3192
- const { findOnlineDaemon } = await import('../utils/daemon-discovery.js');
3193
- const peerAppIds = mentionedBotAppIds.filter(id => id !== creatorAppId);
3194
- const peerOutcomes = await Promise.all(peerAppIds.map(async (peerAppId) => {
3195
- const botName = nameOf(peerAppId);
3196
- const daemon = findOnlineDaemon(peerAppId);
3197
- if (!daemon)
3198
- return { peerAppId, botName, status: 'offline' };
3199
- try {
3200
- const ctrl = new AbortController();
3201
- const tt = setTimeout(() => ctrl.abort(), 5000);
3202
- const res = await fetchDaemonIpc(daemon.ipcPort, '/api/sessions/migrate-to-chat', {
3203
- method: 'POST',
3204
- headers: { 'content-type': 'application/json' },
3205
- body: JSON.stringify({
3206
- sourceAnchor,
3207
- targetChatId: newChatId,
3208
- targetRootMessageId: placeholderRootMessageId,
3209
- requesterLarkAppId: creatorAppId,
3210
- requestingUserOpenId: senderOpenId,
3211
- // union_id is cross-app stable within a tenant — peer
3212
- // compares against its own session.ownerUnionId rather
3213
- // than translating open_ids per bot. Optional for
3214
- // backward compat with daemons older than this commit.
3215
- requestingUserUnionId: senderUnionId,
3216
- }),
3217
- signal: ctrl.signal,
3218
- }).finally(() => clearTimeout(tt));
3219
- const body = await res.json().catch(() => ({}));
3220
- if (res.ok && body.ok)
3221
- return { peerAppId, botName, status: 'ok' };
3222
- if (body.error === 'no_session_at_anchor')
3223
- return { peerAppId, botName, status: 'no_session' };
3224
- if (body.error === 'not_session_owner')
3225
- return { peerAppId, botName, status: 'not_owner' };
3226
- if (body.error === 'worker_busy')
3227
- return { peerAppId, botName, status: 'busy' };
3228
- return { peerAppId, botName, status: 'failed', error: body.error ?? `http_${res.status}` };
3229
- }
3230
- catch (err) {
3231
- const reason = err?.name === 'AbortError' ? 'busy' : 'failed';
3232
- return { peerAppId, botName, status: reason, error: err?.message ?? String(err) };
3233
- }
3234
- }));
3235
- // Bucket peer outcomes for the final M1 (success / failure) AND extend the
3236
- // source-chat report with per-peer detail. Leader was already bucketed
3237
- // above (real-success → successBotNames; real-fail or empty-leader →
3238
- // failedBotNames), so we only iterate peers here.
3239
- for (const r of peerOutcomes) {
3240
- if (r.status === 'ok') {
3241
- successBotNames.push(r.botName);
3242
- reportLines.push(t('cmd.relay.report_peer_ok', { bot: r.botName }, loc));
3243
- }
3244
- else {
3245
- failedBotNames.push(r.botName);
3246
- switch (r.status) {
3247
- case 'no_session':
3248
- reportLines.push(t('cmd.relay.report_peer_no_session', { bot: r.botName }, loc));
3249
- break;
3250
- case 'not_owner':
3251
- reportLines.push(t('cmd.relay.report_peer_not_owner', { bot: r.botName }, loc));
3252
- break;
3253
- case 'offline':
3254
- reportLines.push(t('cmd.relay.report_peer_offline', { bot: r.botName }, loc));
3255
- break;
3256
- case 'busy':
3257
- reportLines.push(t('cmd.relay.report_peer_busy', { bot: r.botName }, loc));
3258
- break;
3259
- case 'failed':
3260
- reportLines.push(t('cmd.relay.report_peer_failed', { bot: r.botName, error: r.error ?? 'unknown' }, loc));
3261
- break;
3262
- }
3263
- }
3264
- }
3265
- // ── Step 3: post the real M1 with status breakdown ─────────────────
3266
- // Three templates:
3267
- // - all_ok : every bot migrated cleanly
3268
- // - partial : some migrated, some didn't (failed list explains)
3269
- // - all_fresh : nobody had a session to migrate (group's still
3270
- // useful — bots were invited; user just @s to start)
3271
- // Pass the raw text — sendMessage wraps `'text'` msgType bodies into
3272
- // { text: content } itself.
3273
- let finalM1Text;
3274
- if (successBotNames.length === 0) {
3275
- finalM1Text = t('cmd.relay.m1_final_all_fresh', { sourceChat: sourceLabel }, loc);
3276
- }
3277
- else if (failedBotNames.length === 0) {
3278
- finalM1Text = t('cmd.relay.m1_final_all_ok', {
3279
- sourceChat: sourceLabel,
3280
- successBots: successBotNames.join('、'),
3281
- }, loc);
3282
- }
3283
- else {
3284
- finalM1Text = t('cmd.relay.m1_final_partial', {
3285
- sourceChat: sourceLabel,
3286
- successBots: successBotNames.join('、'),
3287
- failedBots: failedBotNames.join('、'),
3288
- }, loc);
3289
- }
3290
- try {
3291
- const finalM1Id = await sendMessage(creatorAppId, newChatId, finalM1Text, 'text');
3292
- // Patch the leader's session.rootMessageId to the real M1 id, but
3293
- // only if the leader was actually transferred — for the empty-
3294
- // leader / all_fresh path, ds was either closed or never moved,
3295
- // so we don't touch it (would write to a closed/stale record).
3296
- if (leaderHasRealSession && successBotNames.includes(leaderName)) {
3297
- ds.session.rootMessageId = finalM1Id;
3298
- sessionStore.updateSession(ds.session);
3299
- }
3300
- }
3301
- catch (err) {
3302
- // Non-fatal: transfers already succeeded. The source-chat report
3303
- // (sessionReply below) is the user's authoritative status.
3304
- logger.warn(`[${logTag}] /relay --create: final M1 send failed: ${err?.message ?? err}`);
3305
- }
3306
- await sessionReply(rootId, t('cmd.relay.created', { name: groupName, link: inviteLink, report: reportLines.join('\n') }, loc));
3307
- logger.info(`[${logTag}] /relay --create completed: chat=${newChatId} leader=${creatorAppId} peers=[${peerAppIds.join(',')}]`);
3308
- break;
3309
- }
3310
- case '/fork': {
3311
- // Session fork (Bot 分身): non-destructive copy of a running session
3312
- // into a SECOND independent session at a new anchor; source untouched.
3313
- // `/fork <task>` hosts it in a new sub-topic of the same topic group;
3314
- // `/fork --create <name>` keeps the existing new-group destination.
3315
- const argsLine = message.content.replace(/^\/fork\s*/i, '').trim();
3316
- const forkAppId = larkAppId ?? ds?.larkAppId;
3317
- if (!forkAppId) {
3318
- await sessionReply(rootId, t('cmd.fork.no_bot', undefined, loc));
3319
- break;
3320
- }
3321
- if (!ds) {
3322
- await sessionReply(rootId, t('cmd.fork.no_session', undefined, loc));
3323
- break;
3324
- }
3325
- const forkSenderOpenId = message.senderId;
3326
- if (!forkSenderOpenId) {
3327
- await sessionReply(rootId, t('cmd.fork.no_sender', undefined, loc));
3328
- break;
3329
- }
3330
- // Owner-only.
3331
- if (ds.session.ownerOpenId && ds.session.ownerOpenId !== forkSenderOpenId) {
3332
- await sessionReply(rootId, t('cmd.fork.not_owner', undefined, loc));
3333
- break;
3334
- }
3335
- // Capability gate — refuse non-forkable backends up front with a clear,
3336
- // typed message (mirrors the design doc §4 refusal). Cheap check before
3337
- // we create any group.
3338
- const { isForkCapableSession } = await import('./worker-pool.js');
3339
- if (!isForkCapableSession(ds)) {
3340
- const cliName = getCliDisplayName((ds.session.cliId ?? getBot(forkAppId).config.cliId ?? 'claude-code'));
3341
- await sessionReply(rootId, t('cmd.fork.unsupported_backend', { cli: cliName }, loc));
3342
- break;
3343
- }
3344
- // Front guards (fork needs a clean, real, idle source — same as relay).
3345
- // These MUST run before creating either a topic root or a new group.
3346
- if (ds.session.adoptedFrom) {
3347
- await sessionReply(rootId, t('cmd.fork.adopt_not_forkable', undefined, loc));
3348
- break;
3349
- }
3350
- if (ds.pendingRepo) {
3351
- await sessionReply(rootId, t('cmd.fork.not_started_yet', undefined, loc));
3352
- break;
3353
- }
3354
- // Real, resumable source session? A bare /fork scratch (worker:null, no
3355
- // persisted CLI markers) is not forkable — most commonly this fires when
3356
- // /fork was invoked at the group top-level while the session lives in a
3357
- // 话题 (thread-scope). Refuse BEFORE creating any group.
3358
- const { isRelayableRealSession: forkIsRealSession } = await import('./worker-pool.js');
3359
- if (!forkIsRealSession(ds)) {
3360
- await sessionReply(rootId, t('cmd.fork.no_source_here', undefined, loc));
3361
- break;
3362
- }
3363
- // Idle check up front — mid-turn source can't be forked cleanly.
3364
- const forkSt = ds.lastScreenStatus;
3365
- if (ds.worker && !ds.worker.killed && forkSt !== 'idle' && forkSt !== 'limited') {
3366
- await sessionReply(rootId, t('cmd.fork.mid_turn', undefined, loc));
3367
- break;
3368
- }
3369
- if (!/^--create\b/i.test(argsLine)) {
3370
- if (!argsLine) {
3371
- await sessionReply(rootId, t('cmd.fork.subtopic_usage', undefined, loc));
3372
- break;
3373
- }
3374
- if (ds.scope !== 'thread' || !ds.session.rootMessageId?.startsWith('om_')) {
3375
- await sessionReply(rootId, t('cmd.fork.subtopic_thread_only', undefined, loc));
3376
- break;
3377
- }
3378
- let chatMode;
3379
- try {
3380
- chatMode = await getChatModeStrict(forkAppId, ds.chatId);
3381
- }
3382
- catch {
3383
- // Treat an unknown mode as unsupported: sending a top-level message
3384
- // to a regular group would not create the isolated topic we promise.
3385
- }
3386
- if (chatMode !== 'topic') {
3387
- await sessionReply(rootId, t('cmd.fork.subtopic_thread_only', undefined, loc));
3388
- break;
3389
- }
3390
- const result = await startForkSubtopicSession(argsLine, ds, message, forkAppId);
3391
- if (!result.ok) {
3392
- const errKey = result.error === 'worker_busy' ? 'cmd.fork.mid_turn'
3393
- : result.error === 'adopt_not_forkable' ? 'cmd.fork.adopt_not_forkable'
3394
- : result.error === 'fork_unsupported_backend' ? 'cmd.fork.unsupported_backend'
3395
- : result.error === 'not_started_yet' ? 'cmd.fork.not_started_yet'
3396
- : undefined;
3397
- if (errKey === 'cmd.fork.unsupported_backend') {
3398
- const cliName = getCliDisplayName((ds.session.cliId ?? getBot(forkAppId).config.cliId ?? 'claude-code'));
3399
- await sessionReply(rootId, t(errKey, { cli: cliName }, loc));
3400
- }
3401
- else if (errKey) {
3402
- await sessionReply(rootId, t(errKey, undefined, loc));
3403
- }
3404
- else {
3405
- await sessionReply(rootId, t('cmd.fork.failed', { error: result.error }, loc));
3406
- }
3407
- if (result.orphanTopic) {
3408
- await sessionReply(rootId, t('cmd.fork.orphan_topic_left', undefined, loc));
3409
- }
3410
- break;
3411
- }
3412
- await sessionReply(rootId, t('cmd.fork.subtopic_created', { link: result.link }, loc));
3413
- logger.info(`[${logTag}] /fork sub-topic completed: child=${result.childSessionId.substring(0, 8)} anchor=${result.anchorId.substring(0, 12)} (source ${ds.session.sessionId.substring(0, 8)} untouched)`);
3414
- break;
3415
- }
3416
- // ── /fork --create <群名> @bot ──────────────────────────────────────
3417
- const afterFlag = argsLine.replace(/^--create\s*/i, '').trim();
3418
- // Resolve the bot to invite into the new group. Fork copies THIS
3419
- // session's transcript, so the child MUST run the same bot as the
3420
- // source — i.e. the invited bot is always this bot. Therefore:
3421
- // • no @mention → default to the current bot (the common "fork myself
3422
- // to a new group" case — no need to @ the bot you're already talking to);
3423
- // • an explicit @mention → must resolve to THIS bot, else refuse.
3424
- const forkSourceIsP2p = ds.chatType === 'p2p';
3425
- const targetBotAppId = forkAppId;
3426
- let targetBotName = botDisplayName(forkAppId);
3427
- if (!forkSourceIsP2p) {
3428
- const forkMentions = message.mentions ?? [];
3429
- const knownBotNames = globalKnownBotNames();
3430
- const forkBotMentions = forkMentions.filter(m => m.name && knownBotNames.has(m.name.toLowerCase()));
3431
- // Only validate WHEN the user explicitly @'d a bot. An explicit
3432
- // mention that resolves to a DIFFERENT bot is a real error (fork can't
3433
- // hand this session's transcript to another CLI). No mention → just
3434
- // use the current bot.
3435
- if (forkBotMentions.length > 0) {
3436
- const firstBot = forkBotMentions[0];
3437
- const myOpenId = getBotOpenId(forkAppId);
3438
- const myName = getBot(forkAppId).botName?.toLowerCase();
3439
- const mentionIsThisBot = (!!myOpenId && firstBot.openId === myOpenId) ||
3440
- (!myOpenId && !!myName && firstBot.name?.toLowerCase() === myName);
3441
- if (!mentionIsThisBot) {
3442
- await sessionReply(rootId, t('cmd.fork.wrong_bot', undefined, loc));
3443
- break;
3444
- }
3445
- }
3446
- }
3447
- // Group name = first non-empty line after --create (mention text stripped).
3448
- let forkRawArgs = afterFlag;
3449
- for (const m of (message.mentions ?? [])) {
3450
- if (m.name)
3451
- forkRawArgs = forkRawArgs.split(`@${m.name}`).join(' ');
3452
- }
3453
- const forkFirstLine = forkRawArgs.split(/\r?\n/).map(s => s.trim()).find(Boolean) ?? '';
3454
- const FORK_MAX_NAME = 50;
3455
- let forkGroupName;
3456
- if (forkFirstLine) {
3457
- forkGroupName = forkFirstLine.length > FORK_MAX_NAME ? forkFirstLine.slice(0, FORK_MAX_NAME) + '…' : forkFirstLine;
3458
- }
3459
- else {
3460
- const src = ds.session.title || ds.session.sessionId.substring(0, 8);
3461
- forkGroupName = `🔱 ${src}`.slice(0, FORK_MAX_NAME);
3462
- }
3463
- // Create the new chat (single bot + the invoking user).
3464
- let forkChatId;
3465
- let forkInviteLink;
3466
- try {
3467
- const { createGroupWithBots } = await import('../services/group-creator.js');
3468
- const result = await createGroupWithBots({
3469
- creatorLarkAppId: forkAppId,
3470
- larkAppIds: [targetBotAppId],
3471
- name: forkGroupName,
3472
- userOpenIds: [forkSenderOpenId],
3473
- transferOwnerTo: forkSenderOpenId,
3474
- });
3475
- forkChatId = result.chatId;
3476
- const applink = chatAppLink(result.chatId, normalizeBrand(getBot(forkAppId).config.brand));
3477
- forkInviteLink = result.shareLink ?? applink;
3478
- }
3479
- catch (err) {
3480
- logger.error(`[${logTag}] /fork --create: createGroup failed: ${err?.message ?? err}`);
3481
- await sessionReply(rootId, t('cmd.fork.failed', { error: err?.message ?? String(err) }, loc));
3482
- break;
3483
- }
3484
- // Fork the session into the new chat (chat-scope, group). The new chat
3485
- // is empty by construction, so no target-anchor conflict. Source is
3486
- // never touched.
3487
- const { forkSession } = await import('./worker-pool.js');
3488
- const forkResult = await forkSession(ds.session.sessionId, forkChatId, forkChatId, 'group', 'chat');
3489
- if (!forkResult.ok) {
3490
- // Residual-orphan cleanup: the front guards already ran before
3491
- // createGroupWithBots, so this only fires on a narrow TOCTOU race
3492
- // (source went busy / closed in the sub-second between guard and
3493
- // fork). Best-effort disband the just-created empty group so a failed
3494
- // fork never leaves an orphan chat. May fail if ownership already
3495
- // transferred to the user (transferOwnerTo) — then we just tell them.
3496
- let orphanCleaned = false;
3497
- try {
3498
- const { disbandChat } = await import('../services/groups-store.js');
3499
- const dis = await disbandChat(forkAppId, forkChatId);
3500
- orphanCleaned = dis.ok;
3501
- if (!dis.ok)
3502
- logger.warn(`[${logTag}] /fork --create: orphan group ${forkChatId} disband failed: ${dis.error}`);
3503
- }
3504
- catch (e) {
3505
- logger.warn(`[${logTag}] /fork --create: orphan group ${forkChatId} disband threw: ${e?.message ?? e}`);
3506
- }
3507
- const errKey = forkResult.error === 'worker_busy' ? 'cmd.fork.mid_turn'
3508
- : forkResult.error === 'adopt_not_forkable' ? 'cmd.fork.adopt_not_forkable'
3509
- : forkResult.error === 'fork_unsupported_backend' ? 'cmd.fork.unsupported_backend'
3510
- : forkResult.error === 'not_started_yet' ? 'cmd.fork.not_started_yet'
3511
- : undefined;
3512
- if (errKey === 'cmd.fork.unsupported_backend') {
3513
- const cliName = getCliDisplayName((ds.session.cliId ?? getBot(forkAppId).config.cliId ?? 'claude-code'));
3514
- await sessionReply(rootId, t(errKey, { cli: cliName }, loc));
3515
- }
3516
- else if (errKey) {
3517
- await sessionReply(rootId, t(errKey, undefined, loc));
3518
- }
3519
- else {
3520
- await sessionReply(rootId, t('cmd.fork.failed', { error: forkResult.error }, loc));
3521
- }
3522
- if (!orphanCleaned) {
3523
- await sessionReply(rootId, t('cmd.fork.orphan_group_left', { name: forkGroupName }, loc));
3524
- }
3525
- logger.warn(`[${logTag}] /fork --create: forkSession failed (${forkResult.error}); new chat ${forkChatId} ${orphanCleaned ? 'disbanded' : 'LEFT (disband failed)'}`);
3526
- break;
3527
- }
3528
- await sessionReply(rootId, t('cmd.fork.created', { name: forkGroupName, link: forkInviteLink }, loc));
3529
- logger.info(`[${logTag}] /fork --create completed: chat=${forkChatId} child=${forkResult.childSessionId.substring(0, 8)} bot=${targetBotAppId} (source ${ds.session.sessionId.substring(0, 8)} untouched)`);
3530
- break;
3531
- }
3532
- case '/forklist': {
3533
- if (!ds) {
3534
- await sessionReply(rootId, t('cmd.fork.no_session', undefined, loc));
3535
- break;
3536
- }
3537
- await upsertForkPanelCard(ds, loc, { allowEmpty: true });
3538
- break;
3539
- }
3540
- case '/card': {
3541
- // Existing-session path. New topics route /card via handleCardCommand at
3542
- // the router (so no phantom session is created). off/on work without a
3543
- // live worker; show/bare summons a card.
3544
- const appId = ds?.larkAppId ?? larkAppId;
3545
- const cardChatId = ds?.chatId;
3546
- if (!appId || !cardChatId) {
3547
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
3548
- break;
3549
- }
3550
- await handleCardCommand(rootId, appId, cardChatId, message.senderId, message.content, deps);
3551
- break;
3552
- }
3553
- case '/term': {
3554
- // Existing-session path. New topics route /term via handleTermLinkCommand
3555
- // at the router (daemon.ts) so no phantom worker=null session is created.
3556
- const appId = ds?.larkAppId ?? larkAppId;
3557
- if (!appId) {
3558
- await sessionReply(rootId, t('cmd.no_active_session', undefined, loc));
3559
- break;
3560
- }
3561
- await handleTermLinkCommand(rootId, appId, ds?.chatId ?? '', message.senderId, message.content, deps);
3562
- break;
3563
- }
3564
- case '/list-slash-command':
3565
- case '/slash': {
3566
- // 列出本 bot 当前可用的 slash 命令,分四段:
3567
- // ① botmux 固定放行的透传白名单(PASSTHROUGH_COMMANDS)
3568
- // ② 当前 CLI adapter 默认透传命令(defaultPassthroughCommands)
3569
- // ③ 用户在 bots.json 自定义配置的额外透传命令(customPassthroughCommands)
3570
- // ④ 文件系统自动发现的 CLI 自定义命令 / skill / 插件
3571
- // MCP 的 /mcp__<server>__<prompt> 需运行时握手才能枚举,这里仅按 .mcp.json 提示 server 名。
3572
- const botCfg = ds
3573
- ? getBot(ds.larkAppId).config
3574
- : (larkAppId ? getBot(larkAppId).config : getAllBots()[0]?.config);
3575
- const cliId = botCfg?.cliId ?? 'claude-code';
3576
- const cliName = ds
3577
- ? sessionCliDisplayName(ds)
3578
- : configuredRuntimeDisplayName(botCfg?.cliRuntime) ?? getCliDisplayName(cliId);
3579
- const workingDir = getSessionWorkingDir(ds);
3580
- const builtin = [...PASSTHROUGH_COMMANDS];
3581
- const adapterDefaults = resolveAdapterDefaultPassthroughCommands(larkAppId);
3582
- // 只展示「实际生效」的 custom 命令:用与 resolvePassthroughCommands 同一套
3583
- // normalize 过滤掉手写 bots.json 里遮蔽 daemon 命令 / 非法的项(parser 出于
3584
- // 兼容会保留它们,但路由会丢弃),避免 `/status` 之类被展示成可用却走 daemon。
3585
- const custom = [...new Set((botCfg?.customPassthroughCommands ?? [])
3586
- .map(normalizePassthroughCommand)
3587
- .filter((c) => !!c))];
3588
- let cliAdapter;
3589
- try {
3590
- cliAdapter = createCliAdapterSync(cliId, botCfg?.cliPathOverride);
3591
- }
3592
- catch (err) {
3593
- logger.warn(`[${logTag}] /list-slash-command could not create adapter for ${cliId}: ${err instanceof Error ? err.message : String(err)}`);
3594
- }
3595
- const discoverySupported = supportsFilesystemCommandDiscovery(cliAdapter);
3596
- const discovered = cliAdapter && discoverySupported
3597
- ? discoverSlashCommandsForAdapter(workingDir, cliAdapter)
3598
- : [];
3599
- const mcpServers = listMcpServerNames(workingDir);
3600
- const card = buildSlashListCard({ cliName, builtin, adapterDefaults, custom, discovered, workingDir, mcpServers, discoverySupported }, loc);
3601
- await sessionReply(rootId, card, 'interactive');
3602
- logger.info(`[${logTag}] /list-slash-command builtin=${builtin.length} custom=${custom.length} discovered=${discovered.length}`);
3603
- break;
3604
- }
3605
- case '/help': {
3606
- const helpAppId = ds?.larkAppId ?? larkAppId;
3607
- const botCfg = ds ? getBot(ds.larkAppId).config : (helpAppId ? getBot(helpAppId).config : getAllBots()[0]?.config);
3608
- const cliName = ds
3609
- ? sessionCliDisplayName(ds)
3610
- : configuredRuntimeDisplayName(botCfg?.cliRuntime)
3611
- ?? getCliDisplayName(botCfg?.cliId ?? 'claude-code');
3612
- const passthroughCommands = [...resolvePassthroughCommands(helpAppId)];
3613
- const help = [
3614
- t('help.heading_session', undefined, loc),
3615
- t('help.close', { cliName }, loc),
3616
- t('help.restart', { cliName }, loc),
3617
- t('help.topic', undefined, loc),
3618
- t('help.cd', { cliName }, loc),
3619
- t('help.repo_list', undefined, loc),
3620
- t('help.repo_n', undefined, loc),
3621
- t('help.repo_path', undefined, loc),
3622
- t('help.repo_wt', undefined, loc),
3623
- t('help.rename', undefined, loc),
3624
- t('help.status', undefined, loc),
3625
- t('help.card', undefined, loc),
3626
- t('help.term', undefined, loc),
3627
- t('help.dashboard', undefined, loc),
3628
- t('help.issue', undefined, loc),
3629
- t('help.insight', undefined, loc),
3630
- t('help.subscribe_doc', undefined, loc),
3631
- t('help.watch_comment', undefined, loc),
3632
- t('help.vc', undefined, loc),
3633
- t('help.summary', undefined, loc),
3634
- '',
3635
- t('help.heading_passthrough', { cliName }, loc),
3636
- // 展示当前 bot 实际生效的透传集合:固定白名单 + adapter 默认 + 有效自定义项。
3637
- passthroughCommands.join(' '),
3638
- '',
3639
- t('help.heading_schedule', undefined, loc),
3640
- t('help.schedule_create', undefined, loc),
3641
- t('help.schedule_list', undefined, loc),
3642
- t('help.schedule_remove', undefined, loc),
3643
- t('help.schedule_toggle', undefined, loc),
3644
- t('help.schedule_run', undefined, loc),
3645
- '',
3646
- t('help.schedule_formats', undefined, loc),
3647
- '',
3648
- t('help.heading_adopt', undefined, loc),
3649
- t('help.adopt', undefined, loc),
3650
- t('help.adopt_pane', undefined, loc),
3651
- t('help.detach', undefined, loc),
3652
- '',
3653
- t('help.heading_collab', undefined, loc),
3654
- t('help.introduce', undefined, loc),
3655
- t('help.relay', undefined, loc),
3656
- t('help.relay_create', undefined, loc),
3657
- t('help.fork', undefined, loc),
3658
- t('help.forklist', undefined, loc),
3659
- '',
3660
- t('help.heading_login', undefined, loc),
3661
- t('help.login', undefined, loc),
3662
- t('help.login_status', undefined, loc),
3663
- t('help.pair', undefined, loc),
3664
- '',
3665
- t('help.heading_workflow', undefined, loc),
3666
- t('help.workflow_run', undefined, loc),
3667
- t('help.workflow_cancel', undefined, loc),
3668
- '',
3669
- t('help.heading_role', undefined, loc),
3670
- t('help.role_show', undefined, loc),
3671
- t('help.role_set', undefined, loc),
3672
- t('help.role_team', undefined, loc),
3673
- t('help.role_cap', undefined, loc),
3674
- t('help.role_profile', undefined, loc),
3675
- '',
3676
- t('help.heading_oncall', undefined, loc),
3677
- t('help.oncall_bind', undefined, loc),
3678
- t('help.oncall_unbind', undefined, loc),
3679
- t('help.oncall_status', undefined, loc),
3680
- '',
3681
- t('help.heading_grant', undefined, loc),
3682
- t('help.grant', undefined, loc),
3683
- t('help.revoke', undefined, loc),
3684
- t('help.vc_auth', undefined, loc),
3685
- t('help.invite', undefined, loc),
3686
- '',
3687
- t('help.heading_config', undefined, loc),
3688
- t('help.config_get', undefined, loc),
3689
- t('help.config_set', undefined, loc),
3690
- t('help.skills', undefined, loc),
3691
- t('help.reply_mode', undefined, loc),
3692
- '',
3693
- t('help.heading_group', undefined, loc),
3694
- t('help.group', undefined, loc),
3695
- '',
3696
- t('help.list_slash', undefined, loc),
3697
- t('help.help', undefined, loc),
3698
- ];
3699
- await sessionReply(rootId, help.join('\n'));
3700
- break;
3701
- }
3702
- }
3703
- }
3704
- catch (err) {
3705
- logger.error(`[${logTag}] Command ${cmd} error: ${err.message}`);
3706
- }
3707
- }
3708
- async function handleCodexAppAdoptCommand(args, rootId, ds, deps, larkAppId) {
3709
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
3710
- const loc = localeForBot(ds.larkAppId ?? larkAppId);
3711
- const botCfg = getBot(ds.larkAppId).config;
3712
- const sourceSession = ds.session;
3713
- const sourceAnchor = sessionAnchorId(ds);
3714
- let threads;
3715
- try {
3716
- threads = await listCodexAppThreads({
3717
- codexBin: botCfg.cliPathOverride,
3718
- cwd: getSessionWorkingDir(ds),
3719
- limit: 50,
3720
- });
3721
- }
3722
- catch (err) {
3723
- await sessionReply(rootId, t('cmd.codex_app_adopt.list_failed', { error: err?.message ?? String(err) }, loc));
3724
- return;
3725
- }
3726
- if (ds.session !== sourceSession
3727
- || ds.session.status !== 'active'
3728
- || deps.activeSessions.get(sessionKey(sourceAnchor, ds.larkAppId)) !== ds
3729
- || isSessionTransferring(ds)) {
3730
- await sessionReply(rootId, t('cmd.session.transfer_in_progress', undefined, loc));
3731
- return;
3732
- }
3733
- if (threads.length === 0) {
3734
- await sessionReply(rootId, t('cmd.codex_app_adopt.no_threads', undefined, loc));
3735
- return;
3736
- }
3737
- if (args) {
3738
- const target = threads.find(t => t.threadId === args || t.threadId.startsWith(args));
3739
- if (!target) {
3740
- await sessionReply(rootId, t('cmd.codex_app_adopt.thread_not_found', { threadId: args }, loc));
3741
- return;
3742
- }
3743
- await startCodexAppThreadSession(target, ds, deps, larkAppId);
3744
- return;
3745
- }
3746
- const cardJson = buildCodexAppThreadSelectCard(threads, rootId, loc);
3747
- await sessionReply(rootId, cardJson, 'interactive');
3748
- }
3749
- // ─── Adopt session helper ────────────────────────────────────────────────────
3750
- /** Discriminate a zellij adopt candidate from tmux/herdr candidates. */
3751
- function isZellijTarget(t) {
3752
- return 'zellijPaneId' in t;
3753
- }
3754
- /**
3755
- * Refuse a takeover (`/adopt`, Codex App thread, disk resume import) while the
3756
- * session is still on the first-spawn repo-select gate (`pendingRepo`).
3757
- *
3758
- * Adopt/import attaches to an already-running CLI, so it cannot double as a way
3759
- * to finish that gate — the two states are mutually exclusive by design. Rather
3760
- * than migrate the pending placeholder in place (which used to leave a
3761
- * contradictory `adopt` + "待选仓库" session, and risked folding botmux
3762
- * envelopes into the external CLI), we post a card that explains the refusal
3763
- * and offers a one-tap "close session". After the user closes it, a fresh
3764
- * `/adopt` runs as a clean first message (which never enters pendingRepo).
3765
- *
3766
- * Returns true when the takeover was blocked (caller must return immediately).
3767
- * Note pendingRepo is in-memory only, so this can never wrongly fire on a
3768
- * daemon-restored session.
3769
- */
3770
- async function blockTakeoverWhilePendingRepo(ds, sessionReply) {
3771
- if (!ds.pendingRepo)
3772
- return false;
3773
- const loc = localeForBot(ds.larkAppId);
3774
- const card = buildAdoptBlockedCard(sessionAnchorId(ds), ds.session.sessionId, getBot(ds.larkAppId).config.cliId, loc);
3775
- await sessionReply(sessionAnchorId(ds), card, 'interactive');
3776
- logger.info(`[${tag(ds)}] Takeover refused: session still on pendingRepo gate — posted close-session card`);
3777
- return true;
3778
- }
3779
- export async function startCodexAppThreadSession(thread, ds, deps, larkAppId) {
3780
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
3781
- const loc = localeForBot(ds.larkAppId ?? larkAppId);
3782
- const title = codexAppThreadTitle(thread);
3783
- if (isSessionTransferring(ds)) {
3784
- await sessionReply(sessionAnchorId(ds), t('cmd.session.transfer_in_progress', undefined, loc));
3785
- return;
3786
- }
3787
- if (await blockTakeoverWhilePendingRepo(ds, sessionReply))
3788
- return;
3789
- ds.adoptedFrom = undefined;
3790
- ds.workingDir = thread.cwd;
3791
- ds.hasHistory = true;
3792
- ds.currentTurnTitle = undefined;
3793
- ds.lastScreenContent = undefined;
3794
- ds.lastScreenStatus = undefined;
3795
- ds.session.workingDir = thread.cwd;
3796
- ds.session.title = `Codex App: ${title}`;
3797
- ds.session.cliId = 'codex-app';
3798
- ds.session.cliSessionId = thread.threadId;
3799
- ds.session.adoptedFrom = undefined;
3800
- sessionStore.updateSession(ds.session);
3801
- forkWorker(ds, '', true);
3802
- await sessionReply(sessionAnchorId(ds), t('cmd.codex_app_adopt.success', { title }, loc));
3803
- }
3804
- export async function startAdoptSession(target, ds, deps, larkAppId) {
3805
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
3806
- const loc = localeForBot(ds.larkAppId ?? larkAppId);
3807
- if (isSessionTransferring(ds)) {
3808
- await sessionReply(sessionAnchorId(ds), t('cmd.session.transfer_in_progress', undefined, loc));
3809
- return;
3810
- }
3811
- const zellij = isZellijTarget(target);
3812
- if (!zellij && target.source === 'herdr' && target.herdrSessionName && target.herdrAgentName) {
3813
- const occupied = [...deps.activeSessions.values()].some(active => {
3814
- if (active.session.sessionId === ds.session.sessionId || active.session.status !== 'active' || active.adoptedFrom)
3815
- return false;
3816
- const owned = active.session.persistentBackendTarget;
3817
- return owned?.backendType === 'herdr'
3818
- && owned.sessionName === target.herdrSessionName
3819
- && owned.agentName === target.herdrAgentName;
3820
- });
3821
- if (occupied) {
3822
- await sessionReply(sessionAnchorId(ds), t('cmd.adopt.target_exited', undefined, loc));
3823
- return;
3824
- }
3825
- }
3826
- // Fail-closed at the ENTRY point, BEFORE any target validation or state
3827
- // mutation: a sandbox-enabled bot can't wrap an already-running CLI
3828
- // (confinement is spawn-time only). Reject here so `adoptedFrom` is never
3829
- // persisted and "adopted" is never replied — otherwise the session would
3830
- // become a worker=null pseudo-adopt whose next message still routes as a
3831
- // bridge/adopt session. Covers both real host-process adopt entries
3832
- // (`/adopt <pane>` and the adopt_select card, which both route here). Checks
3833
- // the live bot flag AND the session's frozen sandbox decision (union).
3834
- const adoptBotCfg = getBot(ds.larkAppId ?? larkAppId).config;
3835
- const adoptRuntimeExecutable = ds.session.agentFrozen
3836
- ? ds.session.cliRuntime?.source === 'configured' ? ds.session.cliRuntime.executable : undefined
3837
- : adoptBotCfg.cliRuntime?.executable;
3838
- if (adoptSandboxBlocked(adoptBotCfg, ds.session)) {
3839
- await sessionReply(sessionAnchorId(ds), t('cmd.adopt.sandbox_blocked', undefined, loc));
3840
- return;
3841
- }
3842
- // A session still on the repo-select gate can't be adopted in place — refuse
3843
- // and offer a one-tap close so the user retires it and re-adopts cleanly.
3844
- if (await blockTakeoverWhilePendingRepo(ds, sessionReply))
3845
- return;
3846
- const valid = zellij
3847
- ? validateZellijAdoptTarget(target.zellijSession, target.zellijPaneId, target.cliPid, target.cliId, adoptRuntimeExecutable)
3848
- : validateAdoptTarget(target, adoptRuntimeExecutable);
3849
- if (!valid) {
3850
- await sessionReply(sessionAnchorId(ds), t('cmd.adopt.target_exited', undefined, loc));
3851
- return;
3852
- }
3853
- const project = target.cwd.split('/').pop() || target.cwd;
3854
- const pane = zellij ? `${target.zellijSession}/${target.zellijPaneId}` : adoptTargetLabel(target);
3855
- ds.workingDir = target.cwd;
3856
- ds.session.workingDir = target.cwd;
3857
- ds.session.title = `Adopt: ${project}`;
3858
- ds.adoptedFrom = {
3859
- source: zellij ? 'zellij' : target.source,
3860
- tmuxTarget: zellij ? undefined : target.tmuxTarget,
3861
- zellijSession: zellij ? target.zellijSession : undefined,
3862
- zellijPaneId: zellij ? target.zellijPaneId : undefined,
3863
- herdrSessionName: zellij ? undefined : target.herdrSessionName,
3864
- herdrTarget: zellij ? undefined : target.herdrTarget,
3865
- herdrPaneId: zellij ? undefined : target.herdrPaneId,
3866
- herdrAgentName: zellij ? undefined : target.herdrAgentName,
3867
- herdrTerminalId: zellij ? undefined : target.herdrTerminalId,
3868
- originalCliPid: target.cliPid,
3869
- sessionId: target.sessionId,
3870
- cliId: target.cliId,
3871
- cwd: target.cwd,
3872
- paneCols: target.paneCols,
3873
- paneRows: target.paneRows,
3874
- };
3875
- ds.session.adoptedFrom = { ...ds.adoptedFrom };
3876
- sessionStore.updateSession(ds.session);
3877
- forkAdoptWorker(ds);
3878
- const cliName = sessionCliDisplayName(ds);
3879
- await sessionReply(sessionAnchorId(ds), t('cmd.adopt.success', { cliName, project, pane }, loc));
3880
- }
3881
- /** Cap on resume candidates surfaced by the /adopt picker. Kept at the legacy
3882
- * 20 (per product call: the V2 card is a display change, not a scope change).
3883
- * When the cap is hit the card shows a hint pointing at search + the
3884
- * `/adopt <id>` direct path, so history beyond the cap is still reachable. */
3885
- export const ADOPT_RESUME_LIMIT = 20;
3886
- /** Discover the sessions resumable from disk for `cliId`, excluding any whose
3887
- * CLI-native id is already live in a botmux session (so a session botmux
3888
- * already runs isn't offered for re-import). Returns [] when the adapter has
3889
- * no on-disk store. */
3890
- export async function discoverResumableSessionsForBot(cliId, cliPathOverride, activeSessions, limit = ADOPT_RESUME_LIMIT) {
3891
- let adapter;
3892
- try {
3893
- adapter = createCliAdapterSync(cliId, cliPathOverride);
3894
- }
3895
- catch {
3896
- return [];
3897
- }
3898
- if (!adapter.listResumableSessions)
3899
- return [];
3900
- // Exclude every session botmux already manages — live OR closed — so the
3901
- // picker surfaces only genuinely external sessions (a CLI the user ran
3902
- // standalone). botmux's own closed sessions stay resumable via their
3903
- // session-closed cards, so hiding them here avoids a redundant, confusing
3904
- // duplicate. The identity set spans all bot stores and includes both the
3905
- // botmux sessionId (= the claude jsonl filename) and the cliSessionId
3906
- // (codex/traex rollout id), covering every CLI's id shape. Passed INTO the
3907
- // adapter so exclusion happens BEFORE the `limit` truncation.
3908
- const exclude = sessionStore.collectBotmuxSessionIdentities() ?? new Set();
3909
- // Belt-and-suspenders: also fold in the in-memory active map (freshest).
3910
- for (const ds of activeSessions.values()) {
3911
- if (ds.session.sessionId)
3912
- exclude.add(ds.session.sessionId);
3913
- if (ds.session.cliSessionId)
3914
- exclude.add(ds.session.cliSessionId);
3915
- }
3916
- try {
3917
- return await adapter.listResumableSessions({ limit, exclude });
3918
- }
3919
- catch {
3920
- return [];
3921
- }
3922
- }
3923
- /** Import (resume) a stored session into the current topic: re-spawn the bot's
3924
- * CLI via `--resume <cliSessionId>` in `cwd`. Mirrors the manual resume path —
3925
- * the worker owns the CLI (NOT an observe-adopt), so no `adoptedFrom` is set. */
3926
- export async function startResumeImportSession(target, ds, deps, larkAppId) {
3927
- const sessionReply = (rid, content, msgType) => deps.sessionReply(rid, content, msgType, larkAppId);
3928
- const loc = localeForBot(ds.larkAppId ?? larkAppId);
3929
- const project = target.cwd.split('/').pop() || target.cwd;
3930
- if (isSessionTransferring(ds)) {
3931
- await sessionReply(sessionAnchorId(ds), t('cmd.session.transfer_in_progress', undefined, loc));
3932
- return;
3933
- }
3934
- if (await blockTakeoverWhilePendingRepo(ds, sessionReply))
3935
- return;
3936
- ds.workingDir = target.cwd;
3937
- ds.session.workingDir = target.cwd;
3938
- ds.session.cliSessionId = target.cliSessionId;
3939
- ds.session.title = target.title || `Import: ${project}`;
3940
- // Resume sandbox decision is left to forkWorker (resume=true → not sandboxed,
3941
- // matching restore semantics). Mark history so the session is treated as a
3942
- // resume, not a fresh spawn.
3943
- ds.hasHistory = true;
3944
- sessionStore.updateSession(ds.session);
3945
- forkWorker(ds, '', true);
3946
- const cliName = sessionCliDisplayName(ds);
3947
- await sessionReply(sessionAnchorId(ds), t('cmd.adopt.resume_success', { cliName, project, title: target.title || target.cliSessionId.slice(0, 8) }, loc));
3948
- }
3949
- /** Fork the current session into a new sub-topic of the same topic group.
3950
- * The session copy itself stays in worker-pool's generic `forkSession()`;
3951
- * this layer only creates the Lark destination, supplies the first task turn,
3952
- * and records display-only lineage for the parent panel. */
3953
- export async function startForkSubtopicSession(taskText, parentDs, message, larkAppId) {
3954
- const appId = parentDs.larkAppId ?? larkAppId;
3955
- if (!appId)
3956
- return { ok: false, error: 'missing_lark_app_id', orphanTopic: false };
3957
- const loc = localeForBot(appId);
3958
- const bot = getBot(appId);
3959
- const botCfg = bot.config;
3960
- const parentSession = parentDs.session;
3961
- const chatId = parentDs.chatId;
3962
- const brand = normalizeBrand(botCfg.brand);
3963
- const taskTitle = taskText.split(/\r?\n/).map(line => line.trim()).find(Boolean)?.slice(0, 60)
3964
- ?? taskText.slice(0, 60);
3965
- const senderIsBot = message.senderType === 'app' || message.senderType === 'bot';
3966
- const triggerSender = {
3967
- openId: message.senderId,
3968
- type: senderIsBot ? 'bot' : 'user',
3969
- ...(message.senderName ? { name: message.senderName } : {}),
3970
- };
3971
- let anchorId;
3972
- const recallAnchor = async () => {
3973
- if (!anchorId)
3974
- return true;
3975
- try {
3976
- return await deleteMessage(appId, anchorId);
3977
- }
3978
- catch (err) {
3979
- logger.warn(`[${parentSession.sessionId.substring(0, 8)}] /fork sub-topic recall failed: `
3980
- + `${err instanceof Error ? err.message : String(err)}`);
3981
- return false;
3982
- }
3983
- };
3984
- try {
3985
- let parentThreadId = parentSession.larkThreadId ?? message.threadId;
3986
- if (!parentThreadId) {
3987
- parentThreadId = (await getMessageThreadId(appId, parentSession.rootMessageId)) ?? undefined;
3988
- }
3989
- if (parentThreadId && parentSession.larkThreadId !== parentThreadId) {
3990
- parentSession.larkThreadId = parentThreadId;
3991
- sessionStore.updateSession(parentSession);
3992
- }
3993
- const parentLink = parentThreadId
3994
- ? threadAppLink(chatId, parentThreadId, brand)
3995
- : chatAppLink(chatId, brand);
3996
- const localeKey = loc === 'en' ? 'en_us' : 'zh_cn';
3997
- const seedPost = JSON.stringify({
3998
- [localeKey]: {
3999
- title: `${t('cmd.fork.badge', undefined, loc)} ${taskText.replace(/\s*\n+\s*/g, ' ').slice(0, 300)}`,
4000
- content: [[
4001
- ...(senderIsBot ? [] : [{ tag: 'at', user_id: message.senderId }]),
4002
- {
4003
- tag: 'text',
4004
- text: `${senderIsBot ? '' : ' '}${t('cmd.fork.seed_parent_line', { title: parentSession.title || '' }, loc)} `,
4005
- },
4006
- { tag: 'a', text: t('cmd.fork.seed_back_link', undefined, loc), href: parentLink },
4007
- ]],
4008
- },
4009
- });
4010
- anchorId = await sendMessage(appId, chatId, seedPost, 'post');
4011
- const childThreadId = (await getMessageThreadId(appId, anchorId)) ?? undefined;
4012
- const childIntro = t('cmd.fork.child_intro', {
4013
- parentTitle: parentSession.title || '',
4014
- parentSessionId: parentSession.sessionId,
4015
- parentRootId: parentSession.rootMessageId,
4016
- }, loc);
4017
- const availableBots = await getAvailableBots(appId, chatId);
4018
- const childCliId = parentSession.cliId ?? botCfg.cliId;
4019
- const { forkSession } = await import('./worker-pool.js');
4020
- const forkResult = await forkSession(parentSession.sessionId, chatId, anchorId, 'group', 'thread', {
4021
- childTitle: `${t('cmd.fork.badge', undefined, loc)} ${taskTitle}`,
4022
- forkTaskText: taskText,
4023
- larkThreadId: childThreadId,
4024
- turnId: message.messageId,
4025
- senderOpenId: triggerSender.openId,
4026
- senderIsBot,
4027
- buildInitialPrompt: childSessionId => buildNewTopicCliInput(`${childIntro}\n\n${taskText}`, childSessionId, childCliId, botCfg.cliPathOverride, undefined, undefined, availableBots, undefined, { name: bot.botName, openId: bot.botOpenId }, loc, triggerSender, { larkAppId: appId, chatId }),
4028
- });
4029
- if (!forkResult.ok) {
4030
- const orphanTopic = !await recallAnchor();
4031
- return { ok: false, error: forkResult.error, orphanTopic };
4032
- }
4033
- if (!parentSession.forkChildSessionIds?.includes(forkResult.childSessionId)) {
4034
- parentSession.forkChildSessionIds = [
4035
- ...(parentSession.forkChildSessionIds ?? []),
4036
- forkResult.childSessionId,
4037
- ];
4038
- try {
4039
- sessionStore.updateSession(parentSession);
4040
- }
4041
- catch (err) {
4042
- logger.warn(`[${parentSession.sessionId.substring(0, 8)}] /fork parent lineage update failed: `
4043
- + `${err instanceof Error ? err.message : String(err)}`);
4044
- }
4045
- }
4046
- try {
4047
- await upsertForkPanelCard(parentDs, loc);
4048
- }
4049
- catch (err) {
4050
- logger.warn(`[${parentSession.sessionId.substring(0, 8)}] /fork panel refresh failed: `
4051
- + `${err instanceof Error ? err.message : String(err)}`);
4052
- }
4053
- return {
4054
- ok: true,
4055
- childSessionId: forkResult.childSessionId,
4056
- anchorId,
4057
- link: childThreadId ? threadAppLink(chatId, childThreadId, brand) : chatAppLink(chatId, brand),
4058
- };
4059
- }
4060
- catch (err) {
4061
- logger.error(`[${parentSession.sessionId.substring(0, 8)}] /fork sub-topic failed: `
4062
- + `${err instanceof Error ? err.message : String(err)}`);
4063
- return {
4064
- ok: false,
4065
- error: anchorId ? 'fork_subtopic_failed' : 'topic_creation_failed',
4066
- orphanTopic: anchorId ? !await recallAnchor() : false,
4067
- };
4068
- }
4069
- }
4070
- /** Re-post the parent session's fork panel at the bottom of the topic. Reading
4071
- * each child row from the store keeps `/forklist` status current without
4072
- * coupling child lifecycle to its parent. */
4073
- async function upsertForkPanelCard(parentDs, loc, opts) {
4074
- const appId = parentDs.larkAppId;
4075
- const chatId = parentDs.chatId;
4076
- const brand = normalizeBrand(getBot(appId).config.brand);
4077
- const children = (parentDs.session.forkChildSessionIds ?? [])
4078
- .map(sessionId => sessionStore.getSession(sessionId))
4079
- .filter((session) => !!session)
4080
- .map(session => ({
4081
- instruction: session.forkTaskText ?? session.title,
4082
- status: (session.status === 'active' ? 'active' : 'closed'),
4083
- link: session.larkThreadId
4084
- ? threadAppLink(chatId, session.larkThreadId, brand)
4085
- : chatAppLink(chatId, brand),
4086
- }));
4087
- if (children.length === 0 && !opts?.allowEmpty)
4088
- return;
4089
- const staleCardId = parentDs.session.forkPanelCardId;
4090
- if (staleCardId) {
4091
- try {
4092
- await deleteMessage(appId, staleCardId);
4093
- }
4094
- catch {
4095
- // It may already be withdrawn or past Lark's recall window. Posting the
4096
- // fresh panel is still more useful than keeping the command silent.
4097
- }
4098
- }
4099
- try {
4100
- const cardId = await replyMessage(appId, parentDs.session.rootMessageId, buildForkPanelCard(children, loc), 'interactive', true);
4101
- parentDs.session.forkPanelCardId = cardId;
4102
- sessionStore.updateSession(parentDs.session);
4103
- }
4104
- catch (err) {
4105
- logger.warn(`[fork-panel] failed to post panel card: ${err instanceof Error ? err.message : err}`);
4106
- }
4107
- }
4108
- //# sourceMappingURL=command-handler.js.map