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,3274 +0,0 @@
1
- /**
2
- * Lark event dispatcher — handles WSClient setup, bot identity probing,
3
- * and message routing (group access checks, @mention detection).
4
- * Extracted from daemon.ts for modularity.
5
- */
6
- import * as Lark from '@larksuiteoapi/node-sdk';
7
- import { ProxyAgent } from 'proxy-agent';
8
- import { readFileSync, mkdirSync, existsSync } from 'node:fs';
9
- import { atomicWriteFileSync } from '../../utils/atomic-write.js';
10
- import { join } from 'node:path';
11
- import { getBot, getAllBots, findOncallChat, getOwnerOpenId, loadBotConfigs } from '../../bot-registry.js';
12
- import { config, isVcMeetingAgentGloballyEnabled, vcMeetingAgentGlobalListenerBotAppId } from '../../config.js';
13
- import { getChatInfo, getChatMode, getCachedChatMode, getUserProfile, listChatMessagesUntil, resolveSiblingBotBySenderOpenId, replyMessage, sendMessage, sendUserMessage, isHumanOpenId, updateMessage } from './client.js';
14
- import { logger } from '../../utils/logger.js';
15
- import { BoundedMap } from '../../utils/bounded-map.js';
16
- import { serializeByAnchor } from '../../utils/anchor-serializer.js';
17
- import { parseForceTopicInvocation } from '../../core/command-handler.js';
18
- import { shouldAutoStartOnNewTopic } from '../../core/auto-start.js';
19
- import { stripLeadingMentions, mentionOpenId, mentionAppId, extractMentionIdentities, messageMentionsBot } from './message-parser.js';
20
- import { recordObservedBots, listObservedBots } from '../../services/observed-bots-store.js';
21
- import { isTeamBot, recordTeamBot } from '../../services/team-bots-store.js';
22
- import { isTeamGroupChat } from '../../services/team-groups-store.js';
23
- import { isPlatformTeamBot, isPlatformHallChat, isPlatformTeamMemberChat } from '../../services/platform-team-store.js';
24
- import { getBotUnionId, recordBotUnionId, recordBotUnionIdFromMentions } from '../../services/bot-union-ids-store.js';
25
- import { getDocSubscription, putDocSubscription, removeDocSubscription, listAllDocSubscriptions } from '../../services/doc-subs-store.js';
26
- import { getDocComment, isBotAuthoredReply, hasBotSentinel, commentTriggerAllowed, BOT_REPLY_SENTINEL } from './doc-comment.js';
27
- import { BOTMUX_REQUIRED_SCOPES, DOC_FEATURE_SCOPES, DOC_WATCH_SCOPES, DOC_COMMENT_EVENT, VC_MEETING_BOT_EVENTS, VC_MEETING_FEATURE_SCOPES, VC_MEETING_REALTIME_VOICE_SCOPES, buildEventSubDeepLink, buildScopeDeepLink, } from '../../setup/verify-permissions.js';
28
- import { automateOpenPlatformSetup } from '../../setup/open-platform-automation.js';
29
- import { larkHosts, normalizeBrand, sdkDomain } from './lark-hosts.js';
30
- import { tryHandleGrantCommand } from './grant-command.js';
31
- import { tryHandleInviteCommand } from './invite-command.js';
32
- import { autoInviteOwnerOnGroupJoin } from '../../services/groups-store.js';
33
- import { tryHandleReplyModeCommand } from './reply-mode-command.js';
34
- import { tryHandleSubstituteCommand } from './substitute-command.js';
35
- import { buildGrantCard } from './card-builder.js';
36
- import { openPending, isThrottled, clearPending } from './grant-pending.js';
37
- import { localeForBot, t } from '../../i18n/index.js';
38
- import { chatQuotaKey, getGrantExpiresAt, globalQuotaKey, removeExpiredGrant, } from '../../services/grant-store.js';
39
- import { ForwardFollowupBuffer } from './forward-followup-buffer.js';
40
- import { listForwardFollowups, putForwardFollowup, removeForwardFollowup } from './forward-followup-store.js';
41
- import { claimMessageOnce, _resetCacheForTest as _resetSeenMessagesForTest } from '../../services/seen-message-store.js';
42
- import { ensureDefaultOncallBound } from '../../services/oncall-store.js';
43
- import { resolveRegularGroupMode, resolveGroupMentionMode } from '../../services/chat-reply-mode-store.js';
44
- import { buildSummaryCommandPrompt } from './summary-command.js';
45
- import { DEFAULT_SUMMARY_PROMPT, summaryRangeFromBotConfig } from '../../services/summary-range-store.js';
46
- import { isSubstituteEnabledForChat } from '../../services/substitute-chat-toggle-store.js';
47
- import { evaluateMessageListener, resolveListenerSenderIdentity, buildListenerBotAppIdToOpenId, collectListenerBotAppIds } from '../../services/message-listener.js';
48
- import { parseVcMeetingPushEvent, VC_BOT_MEETING_ACTIVITY_EVENT, VC_BOT_MEETING_ENDED_EVENT, VC_BOT_MEETING_INVITED_EVENT, VC_PARTICIPANT_MEETING_JOINED_EVENT, } from '../../vc-agent/push-source.js';
49
- import { DEFAULT_GRANT_DURATION_MS, DEFAULT_GRANT_QUOTA } from '../../services/grant-policy.js';
50
- // 大厅回执互教的防环闸:每进程对同一打卡者只回一次(见 hall swallow 分支)。
51
- const hallEchoReplied = new Set();
52
- function vcMeetingEventPayloadForLog(data) {
53
- try {
54
- return JSON.stringify(data?.event ?? data);
55
- }
56
- catch (err) {
57
- return `[unserializable:${err instanceof Error ? err.message : String(err)}]`;
58
- }
59
- }
60
- // ─── Bot identity ─────────────────────────────────────────────────────────
61
- /** Set the bot's open_id. Callers should also call writeBotInfoFile() to persist. */
62
- export function setBotOpenId(larkAppId, id) {
63
- getBot(larkAppId).botOpenId = id;
64
- }
65
- /** Persist bot registry info to disk for agent-facing CLI subcommands to read.
66
- * Merges current process's bot(s) into the existing file so that
67
- * multiple daemon processes (one per bot) don't overwrite each other. */
68
- export function writeBotInfoFile(dataDir) {
69
- const filePath = join(dataDir, 'bots-info.json');
70
- if (!existsSync(dataDir))
71
- mkdirSync(dataDir, { recursive: true });
72
- let existing = [];
73
- try {
74
- if (existsSync(filePath)) {
75
- existing = JSON.parse(readFileSync(filePath, 'utf-8'));
76
- }
77
- }
78
- catch { /* ignore corrupt file */ }
79
- // Build a map keyed by larkAppId, start with existing entries
80
- const map = new Map();
81
- for (const entry of existing) {
82
- if (entry.larkAppId)
83
- map.set(entry.larkAppId, entry);
84
- }
85
- // Upsert current process's bot(s)
86
- for (const b of getAllBots()) {
87
- map.set(b.config.larkAppId, {
88
- larkAppId: b.config.larkAppId,
89
- botOpenId: b.botOpenId ?? null,
90
- botName: b.botName ?? null,
91
- botAvatarUrl: b.botAvatarUrl ?? null,
92
- cliId: b.config.cliId,
93
- });
94
- }
95
- // 原子写:一 bot 一 daemon,多个 daemon 进程并发 upsert 同一个 bots-info.json,
96
- // 裸写会让并发读者看到半截 JSON。(read-merge-write 的 lost-update 仍存在,
97
- // 但每个 daemon 周期性重写自己的条目,可自愈。)
98
- atomicWriteFileSync(filePath, JSON.stringify([...map.values()], null, 2) + '\n');
99
- }
100
- /**
101
- * Probe the bot's own open_id at startup via the Lark bot info API.
102
- */
103
- /** Per-app in-flight open_id probe, so a startup burst of events shares one probe. */
104
- const inflightOpenIdProbes = new Map();
105
- /**
106
- * Ensure the bot's own open_id is resolved before @-detection. `probeBotOpenId`
107
- * is fired fire-and-forget at daemon startup, so events can arrive while
108
- * `botOpenId` is still undefined — `isBotMentioned` then can't recognize an @ as
109
- * ours and silently drops it. The WSClient still ACKs that dropped event, so
110
- * Lark never redelivers it (the @ is lost until manually re-sent). Awaiting the
111
- * deduped probe here closes that window: concurrent events share one probe, and
112
- * each is held only until the open_id lands, then processed normally.
113
- */
114
- export function ensureBotOpenId(larkAppId) {
115
- if (getBot(larkAppId).botOpenId)
116
- return Promise.resolve();
117
- let inflight = inflightOpenIdProbes.get(larkAppId);
118
- if (!inflight) {
119
- inflight = probeBotOpenId(larkAppId).finally(() => inflightOpenIdProbes.delete(larkAppId));
120
- inflightOpenIdProbes.set(larkAppId, inflight);
121
- }
122
- return inflight;
123
- }
124
- export async function probeBotOpenId(larkAppId) {
125
- const bot = getBot(larkAppId);
126
- if (bot.botOpenId)
127
- return; // already known
128
- const openApi = larkHosts(normalizeBrand(bot.config.brand)).openApi;
129
- // Call /bot/v3/info to get the bot's open_id using tenant_access_token
130
- const tokenRes = await fetch(`${openApi}/open-apis/auth/v3/tenant_access_token/internal`, {
131
- method: 'POST',
132
- headers: { 'Content-Type': 'application/json' },
133
- body: JSON.stringify({ app_id: bot.config.larkAppId, app_secret: bot.config.larkAppSecret }),
134
- });
135
- const tokenData = await tokenRes.json();
136
- if (tokenData.code !== 0) {
137
- throw new Error(`Failed to get tenant_access_token: ${tokenData.msg}`);
138
- }
139
- const botRes = await fetch(`${openApi}/open-apis/bot/v3/info/`, {
140
- headers: { Authorization: `Bearer ${tokenData.tenant_access_token}` },
141
- });
142
- const botData = await botRes.json();
143
- if (botData.code !== 0) {
144
- throw new Error(`Failed to get bot info: ${botData.msg}`);
145
- }
146
- const openId = botData.bot?.open_id;
147
- const appName = botData.bot?.app_name;
148
- const avatarUrl = botData.bot?.avatar_url;
149
- if (openId) {
150
- bot.botOpenId = openId;
151
- if (appName)
152
- bot.botName = appName;
153
- if (avatarUrl)
154
- bot.botAvatarUrl = avatarUrl;
155
- logger.info(`Bot open_id: ${bot.botOpenId}`);
156
- }
157
- else {
158
- throw new Error('No open_id in bot info response');
159
- }
160
- }
161
- // ─── Required-scope check ───────────────────────────────────────────────────
162
- //
163
- // Bot-to-bot @mention 投递依赖 "获取群组中其他机器人和用户@当前机器人的消息"
164
- // 权限(scope: im:message.group_at_msg.include_bot:readonly)。该权限关闭
165
- // 后飞书不会把跨 bot 的事件推到 WSClient,botmux 的 handleThreadReply 收
166
- // 不到,看上去就是"另一个 bot @ 我没反应"——而 botmux 已经把本地 signal-file
167
- // 转发删了,不再有兜底。启动时主动校验一下,缺了就向 allowedUsers[0] 私信
168
- // 提示。
169
- //
170
- // 校验通过飞书 "Get application info" API(应用身份):
171
- // GET /open-apis/application/v6/applications/{app_id}?lang=zh_cn
172
- // 返回的 data.app.scopes 是个 {scope, description, ...} 数组,遍历找
173
- // scope 字段是否包含目标 key。
174
- //
175
- // 鸡生蛋约束:调这个 API 自身需要 admin:app.info:readonly 或
176
- // application:application:self_manage 中任一权限。后者免审批,是
177
- // 推荐路径——拿不到 app info 时(飞书返回 99991672)我们就主动私信
178
- // admin 提示开通 self_manage,下次重启就能自检。
179
- const REQUIRED_BOT_AT_SCOPE = 'im:message.group_at_msg.include_bot:readonly';
180
- const SELF_MANAGE_SCOPE = 'application:application:self_manage';
181
- function getAdminOpenId(bot) {
182
- return bot.resolvedAllowedUsers.find(u => u.startsWith('ou_'));
183
- }
184
- async function dmAdmin(larkAppId, adminOpenId, content, contextTag) {
185
- try {
186
- await sendUserMessage(larkAppId, adminOpenId, content, 'text');
187
- logger.info(`[${larkAppId}] notified admin ${adminOpenId.substring(0, 12)} about ${contextTag}`);
188
- }
189
- catch (err) {
190
- logger.warn(`[${larkAppId}] failed to DM admin about ${contextTag}: ${err?.message ?? err}`);
191
- }
192
- }
193
- /**
194
- * Try to auto-fix missing scopes using the same Open Platform web-session
195
- * automation that powers `botmux setup`. If ~/.botmux/feishu-session.json holds
196
- * a valid cached session, this adds all botmux-required scopes and publishes
197
- * a new app version — no user interaction needed.
198
- *
199
- * Returns `true` if scopes were successfully applied (caller should stop),
200
- * `false` to fall through to the manual DM warning.
201
- *
202
- * `opts.disableQrLogin` — when the only thing missing is a non-critical scope,
203
- * we still try to grab it (the automation imports the full manifest), but must
204
- * NOT pop a second QR code if the cached session is gone. Passing this makes a
205
- * missing/expired session fail cleanly (reason `invalid_session`) instead of
206
- * prompting a login.
207
- * `opts.silent` — suppress the admin success DM (used for the opt-in / optional
208
- * path so a bot that never asked for the feature isn't pinged; the log line is
209
- * enough). Failures are always silent here regardless.
210
- */
211
- async function tryAutoFixScopes(larkAppId, bot, brand, missingCritical, missingOptional, opts) {
212
- if (brand !== 'feishu')
213
- return false;
214
- try {
215
- const totalMissing = missingCritical.length + missingOptional.length;
216
- logger.info(`[${larkAppId}] attempting auto-fix for ${totalMissing} missing scopes via Open Platform...`);
217
- const result = await automateOpenPlatformSetup({
218
- appId: bot.config.larkAppId,
219
- brand,
220
- maxWaitMs: 60_000,
221
- disableQrLogin: opts?.disableQrLogin,
222
- onStatus: (msg) => logger.info(`[${larkAppId}] auto-fix: ${msg}`),
223
- onQrCode: (info) => {
224
- logger.warn(`[${larkAppId}] auto-fix: cached Feishu web session expired, QR login needed. ` +
225
- `Run \`botmux setup\` to refresh session, or manually apply scopes from deep links below. ` +
226
- `QR text (first 80 chars): ${info.qrText.substring(0, 80)}...`);
227
- },
228
- });
229
- if (result.ok) {
230
- const scopeDetail = result.scopeCount > 0
231
- ? `${result.scopeCount} 项权限已导入${result.skippedScopeCount > 0 ? `(${result.skippedScopeCount} 项跳过)` : ''}`
232
- : '所有必需权限已在应用清单中';
233
- logger.info(`[${larkAppId}] auto-fix succeeded: ${scopeDetail}, ` +
234
- `version ${result.versionId ?? 'n/a'} published, ` +
235
- `${result.subscribedEventCount} events subscribed`);
236
- // opt-in / optional-only path: succeeded silently, no admin DM (a bot that
237
- // never enabled the feature must not be pinged just because a non-critical
238
- // scope was topped up in the background). The log line above is the record.
239
- if (opts?.silent)
240
- return true;
241
- // Notify admin that auto-fix worked — even if im:message was missing before,
242
- // the newly published version should now have it.
243
- const adminOpenId = getAdminOpenId(bot);
244
- if (adminOpenId) {
245
- const fixedList = [...missingCritical, ...missingOptional];
246
- const missingList = fixedList.map(s => `• ${s.desc} (\`${s.name}\`)`).join('\n');
247
- await dmAdmin(larkAppId, adminOpenId, `✅ botmux 已自动为机器人 "${bot.botName ?? larkAppId}" 修复了缺失的权限:\n\n${missingList}\n\n` +
248
- `${scopeDetail},新版本已发布。\n` +
249
- `权限变更可能需要 1-2 分钟生效。如仍有问题执行 \`botmux restart\`。`, `auto-fixed ${fixedList.length} scopes`);
250
- }
251
- return true;
252
- }
253
- // Auto-fix failed — log reason. Critical path falls through to a manual
254
- // deep-link DM; the silent optional-scope top-up path does NOT DM (it just
255
- // leaves the opt-in scope ungranted), so don't claim a DM fallback there.
256
- const reasons = {
257
- missing_session: '无可用的 Feishu Web session',
258
- invalid_session: 'Web session 已失效',
259
- login_failed: 'Web session 登录失败',
260
- qr_expired: '需要扫码但二维码已过期',
261
- timeout: '等待扫码超时',
262
- unsupported_brand: '仅支持 feishu.cn 租户',
263
- network: '网络错误',
264
- missing_csrf: '开放平台页面未返回 CSRF token',
265
- scope_mapping_failed: '权限映射失败',
266
- api_error: '开放平台 API 错误',
267
- };
268
- logger.warn(`[${larkAppId}] auto-fix not possible (${result.reason}: ${reasons[result.reason] ?? result.message}). ` +
269
- (opts?.silent ? 'Leaving opt-in scope ungranted (no DM).' : 'Falling back to manual deep-link DM.'));
270
- return false;
271
- }
272
- catch (err) {
273
- logger.warn(`[${larkAppId}] auto-fix error: ${err?.message ?? err}` +
274
- (opts?.silent ? ' — leaving opt-in scope ungranted (no DM)' : ' — falling back to manual DM'));
275
- return false;
276
- }
277
- }
278
- export async function checkRequiredScopes(larkAppId) {
279
- const bot = getBot(larkAppId);
280
- const brand = normalizeBrand(bot.config.brand);
281
- const openApi = larkHosts(brand).openApi;
282
- try {
283
- const tokenRes = await fetch(`${openApi}/open-apis/auth/v3/tenant_access_token/internal`, {
284
- method: 'POST',
285
- headers: { 'Content-Type': 'application/json' },
286
- body: JSON.stringify({ app_id: bot.config.larkAppId, app_secret: bot.config.larkAppSecret }),
287
- });
288
- const tokenData = await tokenRes.json();
289
- if (tokenData.code !== 0) {
290
- logger.debug(`[${larkAppId}] scope check skipped: tenant_access_token failed (${tokenData.msg})`);
291
- return;
292
- }
293
- const infoRes = await fetch(`${openApi}/open-apis/application/v6/applications/${bot.config.larkAppId}?lang=zh_cn`, { headers: { Authorization: `Bearer ${tokenData.tenant_access_token}` } });
294
- const infoData = await infoRes.json();
295
- // 99991672 = 应用身份缺权限。最常见就是 admin:app.info:readonly /
296
- // application:application:self_manage 都没拿到,导致根本查不到自己的
297
- // scope 列表。这种"鸡生蛋"情况单独提示:让 admin 开通免审批的
298
- // self_manage 后下次重启就能自检了。
299
- if (infoData.code === 99991672) {
300
- // Chicken-and-egg: app lacks self_manage so we can't even check what scopes
301
- // are missing. Try the Open Platform web-session auto-fix to add ALL
302
- // required scopes (including self_manage) in one shot.
303
- if (brand === 'feishu') {
304
- const fixed = await tryAutoFixScopes(larkAppId, bot, brand, [{ name: SELF_MANAGE_SCOPE, desc: '应用自查 (免审批)' }], []);
305
- if (fixed)
306
- return;
307
- }
308
- const selfManageAuthUrl = buildScopeDeepLink(bot.config.larkAppId, SELF_MANAGE_SCOPE, brand);
309
- const targetAuthUrl = buildScopeDeepLink(bot.config.larkAppId, REQUIRED_BOT_AT_SCOPE, brand);
310
- logger.warn(`[${larkAppId}] scope 自检 API 被拒(99991672):应用缺少 ${SELF_MANAGE_SCOPE}(免审批)。` +
311
- `开通后下次 daemon 重启即可自动核验跨 bot @ 必需权限 ${REQUIRED_BOT_AT_SCOPE}。申请链接:${selfManageAuthUrl}`);
312
- const adminOpenId = getAdminOpenId(bot);
313
- if (!adminOpenId) {
314
- logger.warn(`[${larkAppId}] 没有 resolved 的 admin open_id,self_manage 提示仅出现在 daemon 日志`);
315
- return;
316
- }
317
- const dm = `⚠️ botmux 想自动核验机器人 "${bot.botName ?? larkAppId}" 是否开通了跨 bot @ 必需权限,但发现应用自身缺少一个**免审批**的辅助权限,因此查不到 scope 列表。\n\n` +
318
- `**操作步骤(点链接 → 申请开通 → 重启 daemon)**:\n` +
319
- `1. 开通 ${SELF_MANAGE_SCOPE}(免审批,自动通过):\n ${selfManageAuthUrl}\n\n` +
320
- `2. 顺便确认/开通真正的目标权限 ${REQUIRED_BOT_AT_SCOPE}("获取群组中其他机器人和用户@当前机器人的消息",免审批,自动通过):\n ${targetAuthUrl}\n\n` +
321
- `3. \`botmux restart\`,启动后 botmux 会自动复核,结果会再次发到这里。\n\n` +
322
- `**为什么需要**:botmux 多机器人协作(A 机器人 @ B 机器人)依赖目标权限把跨 bot 事件推送过来;不开通则跨 bot @ 完全失效。`;
323
- await dmAdmin(larkAppId, adminOpenId, dm, 'self_manage scope (auto-approved) missing');
324
- return;
325
- }
326
- if (infoData.code !== 0) {
327
- logger.debug(`[${larkAppId}] scope check skipped: app info failed (code=${infoData.code} msg=${infoData.msg ?? ''})`);
328
- return;
329
- }
330
- // Lark 文档示例把 scopes 放在 data.app.scopes;为防响应结构变化,
331
- // 同时兜底 data.scopes / data.application.scopes,取到的第一个非空数组为准。
332
- const scopesRaw = infoData.data?.app?.scopes
333
- ?? infoData.data?.application?.scopes
334
- ?? infoData.data?.scopes
335
- ?? [];
336
- if (!Array.isArray(scopesRaw) || scopesRaw.length === 0) {
337
- logger.debug(`[${larkAppId}] scope check inconclusive: scopes array empty or shape unexpected — skipping`);
338
- return;
339
- }
340
- const grantedScopes = new Set(scopesRaw.map(s => typeof s === 'string' ? s : s?.scope).filter(Boolean));
341
- // 文档评论入口就绪自检:仅对「已订阅过文档」的 bot 生效(opt-in,不打扰其他 bot)。
342
- // ① 校验文档 app 权限是否开通(可查 → 缺则 DM 深链)② 提醒去后台订阅评论事件
343
- // drive.notice.comment_add_v1(飞书无 API 可查是否已订阅,只能提醒)——让「订阅
344
- // 成功却收不到评论」这类配置漏项在重启自检时暴露。
345
- try {
346
- const docSubs = listAllDocSubscriptions(config.session.dataDir, larkAppId);
347
- if (docSubs.length > 0) {
348
- const hasWatch = docSubs.some(s => s.managedBy === 'watch-comment');
349
- // Historical records have no managedBy and belong to the legacy
350
- // /subscribe-lark-doc flow, which still needs every OAuth/subscribe scope.
351
- const hasApiSubscribe = docSubs.some(s => s.managedBy !== 'watch-comment');
352
- const requiredDocScopes = [
353
- ...(hasWatch ? DOC_WATCH_SCOPES : []),
354
- ...(hasApiSubscribe ? DOC_FEATURE_SCOPES : []),
355
- ].filter((scope, index, all) => all.findIndex(s => s.name === scope.name) === index);
356
- const missingDoc = requiredDocScopes.filter(s => !grantedScopes.has(s.name));
357
- const featureLabel = [
358
- hasWatch ? '/watch-comment' : '',
359
- hasApiSubscribe ? '/subscribe-lark-doc' : '',
360
- ].filter(Boolean).join(' + ');
361
- if (missingDoc.length > 0) {
362
- const summary = missingDoc.map(s => `${s.name}(${s.desc})`).join('、');
363
- logger.error(`[${larkAppId}] ${featureLabel} 已在用(${docSubs.length} 个绑定)但缺 ${missingDoc.length} 项文档权限:${summary}。评论将收不到/回不了,请到权限管理开通后 botmux restart。`);
364
- const adminDoc = getAdminOpenId(bot);
365
- if (adminDoc) {
366
- const lines = missingDoc.map((s, i) => `${i + 1}. **${s.desc}** (\`${s.name}\`)\n ${buildScopeDeepLink(bot.config.larkAppId, s.name, brand)}`).join('\n\n');
367
- await dmAdmin(larkAppId, adminDoc, `⚠️ 机器人 "${bot.botName ?? larkAppId}" 已通过 ${featureLabel} 绑定 ${docSubs.length} 个飞书文档,但缺少对应权限:\n\n${lines}\n\n` +
368
- `另外请确认开发者后台「事件订阅」里已添加 **\`${DOC_COMMENT_EVENT}\`**(云文档新增评论)事件——该事件无法被自动检测,缺它则评论永远收不到。\n\n开通 + 订阅事件后执行 \`botmux restart\`。`, `missing doc-feature scopes: ${missingDoc.map(s => s.name).join(',')}`);
369
- }
370
- }
371
- else {
372
- // 权限齐了——事件订阅查不了,仅 info 记一条提醒(不 DM 免重启刷屏)。
373
- logger.info(`[${larkAppId}] ${featureLabel} 文档权限齐全(${docSubs.length} 绑定);请确保后台已订阅事件 ${DOC_COMMENT_EVENT}(无法自动检测)`);
374
- }
375
- }
376
- }
377
- catch (err) {
378
- logger.debug(`[${larkAppId}] doc-feature readiness check errored: ${err?.message ?? err}`);
379
- }
380
- // VC meeting agent readiness: app scopes can be checked; Open Platform event
381
- // subscription status cannot be listed via public API, so we surface the
382
- // exact required event keys as an explicit operator checklist.
383
- try {
384
- const globalVcListenerAppId = vcMeetingAgentGlobalListenerBotAppId();
385
- if (isVcMeetingAgentGloballyEnabled()
386
- && bot.config.vcMeetingAgent?.enabled === true
387
- && (!globalVcListenerAppId || globalVcListenerAppId === larkAppId)) {
388
- const requiredVcScopes = bot.config.vcMeetingAgent.realtimeVoice?.enabled === true
389
- ? [...VC_MEETING_FEATURE_SCOPES, ...VC_MEETING_REALTIME_VOICE_SCOPES]
390
- : VC_MEETING_FEATURE_SCOPES;
391
- const missingVc = requiredVcScopes.filter(s => !grantedScopes.has(s.name));
392
- const eventList = VC_MEETING_BOT_EVENTS.map(e => `\`${e}\``).join('、');
393
- const eventSubUrl = buildEventSubDeepLink(bot.config.larkAppId, brand);
394
- if (missingVc.length > 0) {
395
- const summary = missingVc.map(s => `${s.name}(${s.desc})`).join('、');
396
- logger.error(`[${larkAppId}] vcMeetingAgent 已启用但缺 ${missingVc.length} 项 VC 权限:${summary}。` +
397
- `会议智能体入会/读事件可能失败。请到权限管理开通,并确认事件订阅页包含 ${VC_MEETING_BOT_EVENTS.join(', ')}。`);
398
- const adminVc = getAdminOpenId(bot);
399
- if (adminVc) {
400
- const lines = missingVc.map((s, i) => `${i + 1}. **${s.desc}** (\`${s.name}\`)\n ${buildScopeDeepLink(bot.config.larkAppId, s.name, brand)}`).join('\n\n');
401
- await dmAdmin(larkAppId, adminVc, `⚠️ 机器人 "${bot.botName ?? larkAppId}" 已启用 \`vcMeetingAgent\`,但缺少会议智能体所需权限:\n\n${lines}\n\n` +
402
- `另外请确认开发者后台「事件订阅」里已添加这 3 个事件:${eventList}\n\n` +
403
- `事件订阅页:${eventSubUrl}\n\n` +
404
- `注意:飞书目前没有公开 API 可自动确认这 3 个事件是否已订阅/发布;缺事件时 daemon 只会收不到 push,不会有运行时错误。开通 + 发布后执行 \`botmux restart\`。`, `missing vc-meeting scopes: ${missingVc.map(s => s.name).join(',')}`);
405
- }
406
- }
407
- else {
408
- logger.info(`[${larkAppId}] vcMeetingAgent VC 权限齐全;请确保后台事件订阅页已添加 ${VC_MEETING_BOT_EVENTS.join(', ')} ` +
409
- `并已发布(无法自动检测):${eventSubUrl}`);
410
- }
411
- }
412
- }
413
- catch (err) {
414
- logger.debug(`[${larkAppId}] vc-meeting readiness check errored: ${err?.message ?? err}`);
415
- }
416
- // Diff against the canonical list. Critical-missing is the main signal;
417
- // non-critical is mentioned only when something critical is also missing,
418
- // so deployments don't get nagged about purely optional scopes like
419
- // `application:application:self_manage`.
420
- const missingCritical = BOTMUX_REQUIRED_SCOPES.filter(s => s.critical && !grantedScopes.has(s.name));
421
- const missingOptional = BOTMUX_REQUIRED_SCOPES.filter(s => !s.critical && !grantedScopes.has(s.name));
422
- if (missingCritical.length === 0) {
423
- // All critical scopes present. If an opt-in feature added a non-critical
424
- // scope that isn't granted yet, top it up SILENTLY — but only when a cached
425
- // Feishu web session already exists (disableQrLogin makes a missing session
426
- // fail cleanly with no second QR code and no DM). This makes `botmux restart`
427
- // actually pick up newly-declared optional scopes (e.g. the foreign-bot
428
- // group-message scope) without the admin having to visit the Open Platform,
429
- // while a bot with nothing missing — or no web session — behaves exactly as
430
- // before (no API call / no prompt / no nag).
431
- if (missingOptional.length > 0 && brand === 'feishu') {
432
- const toppedUp = await tryAutoFixScopes(larkAppId, bot, brand, [], missingOptional, { disableQrLogin: true, silent: true });
433
- if (toppedUp) {
434
- logger.info(`[${larkAppId}] auto-topped-up ${missingOptional.length} optional scope(s): ${missingOptional.map(s => s.name).join('、')}`);
435
- return;
436
- }
437
- logger.debug(`[${larkAppId}] optional scope(s) missing (${missingOptional.map(s => s.name).join('、')}); no cached web session to auto-apply — leaving to opt-in feature owner`);
438
- }
439
- logger.info(`[${larkAppId}] all critical scopes granted (${BOTMUX_REQUIRED_SCOPES.filter(s => s.critical).length} checked)`);
440
- return;
441
- }
442
- // Auto-fix: try the same Open Platform automation used by `botmux setup`.
443
- // If a cached Feishu web session exists (~/.botmux/feishu-session.json), we can
444
- // directly add missing scopes and publish a new version without user interaction.
445
- // Falls through to manual DM warning if session is missing/expired.
446
- const autoFixed = await tryAutoFixScopes(larkAppId, bot, brand, missingCritical, missingOptional);
447
- if (autoFixed)
448
- return;
449
- // Log + DM consolidated message listing all missing critical scopes.
450
- const summaryLine = missingCritical.map(s => `${s.name} (${s.desc})`).join('、');
451
- logger.error(`[${larkAppId}] 缺少 ${missingCritical.length} 项必需权限:${summaryLine}。` +
452
- `botmux 核心功能(消息收发、附件下载、用户名解析等)会受影响。请到飞书开放平台 → 应用 → 权限管理里申请,开通后 \`botmux restart\`。`);
453
- const adminOpenId = getAdminOpenId(bot);
454
- if (!adminOpenId) {
455
- logger.warn(`[${larkAppId}] no resolved admin open_id in allowedUsers; missing-scope warning visible only in daemon log`);
456
- return;
457
- }
458
- const criticalLines = missingCritical.map((s, i) => `${i + 1}. **${s.desc}** (\`${s.name}\`)\n ${buildScopeDeepLink(bot.config.larkAppId, s.name, brand)}`).join('\n\n');
459
- const optionalBlock = missingOptional.length > 0
460
- ? `\n\n**可选权限(建议一并开通)**:\n${missingOptional.map(s => `- ${s.desc} (\`${s.name}\`): ${buildScopeDeepLink(bot.config.larkAppId, s.name, brand)}`).join('\n')}`
461
- : '';
462
- const dm = `⚠️ botmux 启动检查发现机器人 "${bot.botName ?? larkAppId}" 缺少 ${missingCritical.length} 项必需权限\n\n` +
463
- `**操作步骤(点链接 → 申请开通 → 重启 daemon)**:\n\n` +
464
- `${criticalLines}\n\n` +
465
- `开通完成后执行 \`botmux restart\`,botmux 会再次自检并把结果发到这里。${optionalBlock}`;
466
- await dmAdmin(larkAppId, adminOpenId, dm, `missing scopes: ${missingCritical.map(s => s.name).join(',')}`);
467
- }
468
- catch (err) {
469
- logger.debug(`[${larkAppId}] scope check errored: ${err?.message ?? err}`);
470
- }
471
- }
472
- // ─── Group chat stats cache ───────────────────────────────────────────────
473
- //
474
- // chat.get returns both user_count (real users only) and bot_count (bots).
475
- // One API call, one cache — used to gate auto-replies in multi-bot/multi-user
476
- // groups (oncall chats often have 3rd-party oncall/form/AI-search bots).
477
- export const CHAT_CACHE_TTL = 5 * 60_000; // 5 minutes
478
- // Bounded: keyed per chat; TTL gates freshness on read, the cap stops the
479
- // entry count growing with every distinct chat the bot ever serves.
480
- const chatStatsCache = new BoundedMap(1000);
481
- // ─── Event callback ACK safety ──────────────────────────────────────────────
482
- //
483
- // The Lark WS SDK sends exactly one response frame per event and only AFTER the
484
- // registered handler's promise resolves (WSClient.handleEventData: it awaits
485
- // eventDispatcher.invoke, then sendMessage once). So that frame is the ACK: a
486
- // slow handler delays it past Feishu's 3s budget and triggers a timeout re-push.
487
- // The message path below can spend seconds on OpenAPI lookups + spawning a CLI,
488
- // so we return synchronously and run the heavy work behind setImmediate — the
489
- // handler resolves immediately, the ACK is prompt, and the work runs after.
490
- //
491
- // Dedupe: Feishu re-pushes an un-ACKed/non-200 event at 15s, 5min, 1h, 6h (max
492
- // 4 retries), and its pipeline is at-least-once, so a duplicate can arrive even
493
- // after a timely 200. Fast-ACK keeps us inside 3s so timeout-retries stop
494
- // firing — the realistic duplicate is then a near-simultaneous at-least-once
495
- // copy, which a short-lived claim per stable event key suppresses. The TTL
496
- // covers the 15s/5min/1h retry tiers with margin; the 6h tier is only reachable
497
- // after a sustained ACK failure that fast-ACK prevents, so we don't size for it.
498
- // (We claim-then-ack-success on purpose: a redelivery is always treated as a
499
- // duplicate, never as recovery — matching the prior swallow-and-ACK behavior.)
500
- const EVENT_CLAIM_TTL_MS = 2 * 60 * 60_000; // 2h — covers the 15s/5min/1h retry tiers
501
- const EVENT_CLAIM_PRUNE_INTERVAL_MS = 5 * 60_000;
502
- const EVENT_CLAIM_PRUNE_SIZE = 5000;
503
- const eventClaims = new Map();
504
- let eventClaimsLastPrunedAt = 0;
505
- function pruneEventClaims(now = Date.now()) {
506
- eventClaimsLastPrunedAt = now;
507
- for (const [key, expiresAt] of eventClaims) {
508
- if (expiresAt <= now)
509
- eventClaims.delete(key);
510
- }
511
- }
512
- function claimEventOnce(key) {
513
- const now = Date.now();
514
- // Prune under size pressure OR on a time interval, so a busy bot's map stays
515
- // bounded regardless of call cadence (the size gate alone never fires below
516
- // the threshold, leaving expired entries pinned for the full TTL).
517
- if (eventClaims.size > EVENT_CLAIM_PRUNE_SIZE || now - eventClaimsLastPrunedAt > EVENT_CLAIM_PRUNE_INTERVAL_MS) {
518
- pruneEventClaims(now);
519
- }
520
- const expiresAt = eventClaims.get(key);
521
- if (expiresAt && expiresAt > now)
522
- return false;
523
- eventClaims.set(key, now + EVENT_CLAIM_TTL_MS);
524
- return true;
525
- }
526
- // `claim` defaults to the in-memory event-id claim; the message path passes a
527
- // persistent message_id claim (claimMessageOnce) so a daemon restart or the 6h
528
- // re-push tier can't replay an already-handled message. The claim MUST be fully
529
- // synchronous (see INVARIANT below) — both claimEventOnce and claimMessageOnce are.
530
- function scheduleAckSafeEvent(key, work, label, claim = () => claimEventOnce(key)) {
531
- if (!claim()) {
532
- logger.info(`[event-dedupe] duplicate ${label} ignored: ${key}`);
533
- return false;
534
- }
535
- // INVARIANT: the claim above + this setImmediate scheduling must stay fully
536
- // synchronous (no await before we get here). WS events arrive in order and
537
- // setImmediate is FIFO, so same-anchor messages reach serializeByAnchor in
538
- // arrival order ONLY while nothing awaits ahead of the schedule. An await here
539
- // would reintroduce the kickoff-ordering bug serializeByAnchor guards against.
540
- setImmediate(() => {
541
- void work().catch(err => logger.error(`Error handling ${label}: ${err}`));
542
- });
543
- return true;
544
- }
545
- // Fallback for an event that carries no stable id at all. Dedupe must never
546
- // silently DROP a real message, so we hand back a unique key (process it, accept
547
- // a rare duplicate) rather than a content-prefix key that could collide with a
548
- // distinct message and suppress it for the whole TTL.
549
- let unkeyableEventSeq = 0;
550
- function unkeyableEventKey() {
551
- return `__unkeyable__:${++unkeyableEventSeq}`;
552
- }
553
- function eventIdForKey(data) {
554
- return data?.event_id ?? data?.uuid ?? data?.header?.event_id ?? data?.event?.event_id;
555
- }
556
- // card.action.trigger is a synchronous callback with a 3s deadline and NO
557
- // re-push (unlike events). If a handler (e.g. restart, which spawns a worker)
558
- // might exceed the budget, we ACK before 3s with a toast and patch the card
559
- // afterwards — missing the deadline otherwise surfaces error 200341 to the user.
560
- // 2500ms leaves headroom for the WS frame round-trip inside the 3s window.
561
- const CARD_ACTION_ACK_TIMEOUT_MS = 2500;
562
- const CARD_ACTION_TIMEOUT = Symbol('card-action-timeout');
563
- const cardActionInFlight = new Set();
564
- function cardActionMessageId(data) {
565
- return data?.context?.open_message_id ?? data?.open_message_id;
566
- }
567
- function cardActionKey(larkAppId, data) {
568
- const eventId = eventIdForKey(data);
569
- if (eventId)
570
- return `card.action.trigger:${larkAppId}:${eventId}`;
571
- const action = data?.action;
572
- const value = action?.value ?? {};
573
- return `card.action.trigger:${larkAppId}:${JSON.stringify({
574
- messageId: cardActionMessageId(data),
575
- operator: data?.operator?.open_id,
576
- action: value?.action ?? action?.option ?? action?.tag,
577
- rootId: value?.root_id,
578
- sessionId: value?.session_id,
579
- // Detail actions can share action labels across rows; include row ids so
580
- // rapid clicks on different rows do not collide in the in-flight dedupe key.
581
- scheduleId: value?.schedule_id,
582
- runId: value?.run_id,
583
- nonce: value?.card_nonce ?? value?.nonce,
584
- option: action?.option,
585
- key: value?.key,
586
- // Settings toggles share one action; distinguish the target field/value.
587
- field: value?.field,
588
- next_value: value?.next_value,
589
- // Pagination actions share one action; distinguish the target page.
590
- page: value?.page,
591
- // Navigation context and page size affect the card that will be rebuilt.
592
- origin: value?.origin,
593
- pageSize: value?.page_size,
594
- // `dashboard_scope` distinguishes the global tool-panel card from a
595
- // per-bot view that might happen to be open on the same module. Without
596
- // it a rapid global→per-bot click sequence within the dedupe window
597
- // would hash-collide and the second click would be silently dropped.
598
- dashboardScope: value?.dashboard_scope,
599
- // Groups detail/actions can share the same `dash_groups_*` action within
600
- // one card but target different chat/bot cells. Include both ids so
601
- // managing bot A in group X doesn't dedupe bot B in group Y.
602
- chatId: value?.chat_id,
603
- appId: value?.app_id,
604
- })}`;
605
- }
606
- function shapeCardActionResult(result) {
607
- // The handler may return:
608
- // - an already-shaped Lark response ({toast} and/or {card}) -> pass through;
609
- // - a raw card body (e.g. toggle_stream) -> wrap as an in-place card patch.
610
- if (result && (result.toast || result.card))
611
- return result;
612
- if (result)
613
- return { card: { type: 'raw', data: result } };
614
- // The Lark WS SDK only serializes callback `data` for truthy results. An
615
- // empty object therefore means "ACK with no UI update", while undefined
616
- // produces a code-only response that the client rejects as an invalid ACK.
617
- return {};
618
- }
619
- function serializeRawCardForPatch(cardData) {
620
- if (cardData === undefined || cardData === null)
621
- return undefined;
622
- return typeof cardData === 'string' ? cardData : JSON.stringify(cardData);
623
- }
624
- async function patchTimedOutCardActionResult(larkAppId, data, shapedResult) {
625
- const messageId = cardActionMessageId(data);
626
- if (!messageId || !shapedResult?.card)
627
- return;
628
- const card = shapedResult.card;
629
- const raw = card.type === 'raw' ? card.data : card;
630
- const body = serializeRawCardForPatch(raw);
631
- if (!body)
632
- return;
633
- await updateMessage(larkAppId, messageId, body);
634
- }
635
- async function handleCardActionAckSafe(data, larkAppId, handlers) {
636
- const eventId = eventIdForKey(data);
637
- const key = cardActionKey(larkAppId, data);
638
- // Durable dedupe ONLY when the platform gave a stable per-interaction id:
639
- // suppresses a same-interaction redelivery over the long-connection so a
640
- // non-idempotent action (restart/close) can't double-fire after the first
641
- // copy already finished — the in-flight Set alone clears in finally() and
642
- // would miss that. We deliberately do NOT durably claim the payload-based
643
- // fallback key: distinct clicks of the same button (e.g. toggling stream
644
- // on/off) legitimately repeat and must not be pinned for the whole TTL.
645
- if (eventId && !claimEventOnce(key)) {
646
- logger.info(`[event-dedupe] duplicate card action ignored (claimed): ${key}`);
647
- return { toast: { type: 'info', content: t('toast.action_received_no_repeat', undefined, localeForBot(larkAppId)) } };
648
- }
649
- if (cardActionInFlight.has(key)) {
650
- logger.info(`[event-dedupe] duplicate card action ignored while in-flight: ${key}`);
651
- return { toast: { type: 'info', content: t('toast.action_in_progress', undefined, localeForBot(larkAppId)) } };
652
- }
653
- cardActionInFlight.add(key);
654
- let timedOut = false;
655
- const work = handlers.handleCardAction(data, larkAppId)
656
- .then(shapeCardActionResult)
657
- .catch(err => {
658
- logger.error(`Error handling card action: ${err}`);
659
- return {};
660
- });
661
- void work.then(result => {
662
- if (!timedOut || !result)
663
- return;
664
- if (!result.card && result.toast) {
665
- // A toast-only result can't be re-surfaced after we already ACKed with the
666
- // generic "后台处理中" toast: toasts ride the synchronous callback response,
667
- // and the message-update API only patches the card. Log rather than drop.
668
- logger.warn(`[card-action] slow handler resolved to a toast-only result after ACK; not shown to user: ${JSON.stringify(result.toast)}`);
669
- return;
670
- }
671
- return patchTimedOutCardActionResult(larkAppId, data, result)
672
- .catch(err => logger.warn(`Failed to patch timed-out card action result: ${err}`));
673
- }).finally(() => {
674
- cardActionInFlight.delete(key);
675
- });
676
- const timeout = new Promise(resolve => setTimeout(resolve, CARD_ACTION_ACK_TIMEOUT_MS, CARD_ACTION_TIMEOUT));
677
- const result = await Promise.race([work, timeout]);
678
- if (result === CARD_ACTION_TIMEOUT) {
679
- timedOut = true;
680
- logger.warn(`[card-action] handler exceeded ${CARD_ACTION_ACK_TIMEOUT_MS}ms; ACKing first and continuing in background: ${key}`);
681
- return { toast: { type: 'info', content: t('toast.action_received_bg', undefined, localeForBot(larkAppId)) } };
682
- }
683
- return result;
684
- }
685
- /** Test-only: clear callback dedupe claims between cases. */
686
- export function __resetEventClaimsForTest() {
687
- eventClaims.clear();
688
- cardActionInFlight.clear();
689
- // The message path now dedupes via the persistent seen-message store; clear its
690
- // in-memory cache too so cases reusing the same message_id don't suppress each other.
691
- _resetSeenMessagesForTest();
692
- }
693
- export async function getGroupStats(larkAppId, chatId) {
694
- const cacheKey = `${larkAppId}:${chatId}`;
695
- const cached = chatStatsCache.get(cacheKey);
696
- if (cached && Date.now() - cached.fetchedAt < CHAT_CACHE_TTL) {
697
- return { userCount: cached.userCount, botCount: cached.botCount };
698
- }
699
- try {
700
- const info = await getChatInfo(larkAppId, chatId);
701
- chatStatsCache.set(cacheKey, { userCount: info.userCount, botCount: info.botCount, fetchedAt: Date.now() });
702
- return info;
703
- }
704
- catch (err) {
705
- // Soft failure — the fallback below assumes worst case (multi-user,
706
- // multi-bot → require @mention). No user-visible regression, so debug.
707
- logger.debug(`Failed to get chat stats for ${chatId}, using safe fallback: ${err}`);
708
- if (cached)
709
- return { userCount: cached.userCount, botCount: cached.botCount };
710
- // Fallback: assume multi-person, multi-bot → require @mention to be safe.
711
- return { userCount: 999, botCount: 999 };
712
- }
713
- }
714
- /**
715
- * Drop the cached group stats for one chat — called when a membership-change
716
- * event that is VISIBLE to this app arrives (user add/delete broadcast, or our
717
- * own bot being added/removed), so the 1v1 relax gate sees fresh counts on the
718
- * very next message instead of coasting on stale numbers for up to
719
- * CHAT_CACHE_TTL. TTL 继续保留,作为事件未订阅(老应用)时的兜底。
720
- * 注意跨进程边界:「别的 bot 进群/离群」事件只推给当事 bot 自己的 app,
721
- * 一 bot 一 daemon 部署下此函数够不到兄弟进程的缓存(见 handler 处注释)。
722
- */
723
- export function invalidateChatStats(larkAppId, chatId) {
724
- if (chatStatsCache.delete(`${larkAppId}:${chatId}`)) {
725
- logger.debug(`[group-stats] invalidated cached stats for ${chatId} (${larkAppId}): membership changed`);
726
- }
727
- }
728
- /** Test-only: clear the group-stats cache between cases. */
729
- export function __resetChatStatsForTest() {
730
- chatStatsCache.clear();
731
- }
732
- // ─── Cross-bot open_id mapping ──────────────────────────────────────────
733
- //
734
- // Lark open_id is per-app scoped: Bot A sees a different open_id for Bot B
735
- // than Bot B sees for itself. The self-reported botOpenId (from /bot/v3/info)
736
- // is useless for other bots to @mention.
737
- //
738
- // We build a per-bot cross-reference from event data: when Bot A's event
739
- // handler receives a message that @mentions Bot B, the mention includes
740
- // Bot B's open_id as seen by Bot A's app. We persist this mapping so that
741
- // listChatBotMembers can return correct open_ids.
742
- /** Read the per-bot cross-reference: botName(lowercase) → openId as seen by larkAppId's app */
743
- export function readBotOpenIdCrossRef(dataDir, larkAppId) {
744
- const map = new Map();
745
- try {
746
- const fp = join(dataDir, `bot-openids-${larkAppId}.json`);
747
- if (existsSync(fp)) {
748
- const data = JSON.parse(readFileSync(fp, 'utf-8'));
749
- for (const [name, openId] of Object.entries(data)) {
750
- map.set(name.toLowerCase(), openId);
751
- }
752
- }
753
- }
754
- catch { /* ignore */ }
755
- return map;
756
- }
757
- /** Is `senderOpenId` a registered botmux peer (from larkAppId's cross-ref)?
758
- * Used to gate chat-scope foreign-bot @mention spawning to vetted peers. */
759
- export function isKnownPeerBot(dataDir, larkAppId, senderOpenId) {
760
- if (!senderOpenId)
761
- return false;
762
- for (const openId of readBotOpenIdCrossRef(dataDir, larkAppId).values()) {
763
- if (openId === senderOpenId)
764
- return true;
765
- }
766
- return false;
767
- }
768
- /**
769
- * Auth-grade local sibling check for the narrow `/repo` exception.
770
- *
771
- * Cross-ref proves only "this receiver has seen this sender open_id as some
772
- * peer" and may be stale or name-poisoned. For authorization we additionally
773
- * require the Lark-stamped sender union_id to match exactly one currently
774
- * configured, transport-enabled sibling app's learned own union_id.
775
- */
776
- export function isVerifiedLocalSiblingBot(dataDir, larkAppId, senderOpenId, senderUnionId) {
777
- const openId = (senderOpenId ?? '').trim();
778
- const unionId = (senderUnionId ?? '').trim();
779
- if (!openId || !unionId)
780
- return false;
781
- if (!isKnownPeerBot(dataDir, larkAppId, openId))
782
- return false;
783
- let matchingConfiguredSiblings = 0;
784
- try {
785
- for (const cfg of loadBotConfigs()) {
786
- const appId = (cfg.larkAppId ?? '').trim();
787
- if (!appId || appId === larkAppId || cfg.apiOnly === true)
788
- continue;
789
- if (getBotUnionId(dataDir, appId) === unionId)
790
- matchingConfiguredSiblings += 1;
791
- if (matchingConfiguredSiblings > 1)
792
- return false;
793
- }
794
- }
795
- catch {
796
- return false;
797
- }
798
- return matchingConfiguredSiblings === 1;
799
- }
800
- /**
801
- * Should a FOREIGN bot sender be trusted to collaborate (route/spawn a session)
802
- * WITHOUT `/grant`, because it's a teammate? Two trust sources, both rooted in
803
- * tenant-stable identity or team-controlled group membership — never a name:
804
- *
805
- * 1. **Learned teammate** — its `union_id` (from the inbound event's
806
- * `sender.sender_id.union_id`) is in the team-bot store, i.e. we've seen it
807
- * vouched inside a team-assembled group before. Honoured in ANY chat.
808
- * 2. **Team-assembled group** — the chat itself is a 拉群 group (team-controlled
809
- * membership), so a botmux bot speaking there is a vouched teammate even on
810
- * first contact (mirrors the existing oncall-chat exemption).
811
- *
812
- * `isKnownPeerBot` (same-deployment siblings) is checked separately by callers;
813
- * this covers cross-deployment TEAM peers. Returns false when neither holds, so
814
- * the caller falls back to the /grant request card.
815
- *
816
- * 平台团队与旧版联邦团队同权:isPlatformTeamBot(平台 team-sync 下发的团队 bot
817
- * union_id roster)与 isTeamBot(团队群里学来的 union_id)都是 union_id 锚定的
818
- * bot 专属信任;平台拉的团队群则经 platform: 前缀镜像进 team-groups,走同一个
819
- * isTeamGroupChat。两条路都算团队模式,都不需要 /grant。
820
- *
821
- * 调用方只剩 {@link evaluateBotTalk} 一个(bot 闸门的唯一入口);(1) 的两条腿与
822
- * evaluateTalk 的 teamBot 腿重合,真正额外放行的是 (2)。保留本谓词是因为它是
823
- * 「bot 团队信任」的定义所在,且有专属单测(team-peer-trust / platform-team-trust)。
824
- */
825
- export function isTrustedTeamBotSender(dataDir, chatId, senderUnionId) {
826
- return isTeamBot(dataDir, senderUnionId)
827
- || isPlatformTeamBot(dataDir, senderUnionId)
828
- || isTeamGroupChat(dataDir, chatId);
829
- }
830
- /** Update the per-bot cross-reference from @mention data in an event.
831
- * mentionsList comes from Lark event message.mentions array. */
832
- export function updateBotOpenIdCrossRef(dataDir, larkAppId, mentionsList) {
833
- if (!mentionsList || mentionsList.length === 0)
834
- return;
835
- // Read known bot names from bots-info.json
836
- const knownBotNames = new Set();
837
- try {
838
- const infoPath = join(dataDir, 'bots-info.json');
839
- if (existsSync(infoPath)) {
840
- const entries = JSON.parse(readFileSync(infoPath, 'utf-8'));
841
- for (const e of entries) {
842
- if (e.botName)
843
- knownBotNames.add(e.botName.toLowerCase());
844
- }
845
- }
846
- }
847
- catch { /* ignore */ }
848
- if (knownBotNames.size === 0)
849
- return;
850
- // Read existing cross-reference
851
- const fp = join(dataDir, `bot-openids-${larkAppId}.json`);
852
- let existing = {};
853
- try {
854
- if (existsSync(fp))
855
- existing = JSON.parse(readFileSync(fp, 'utf-8'));
856
- }
857
- catch { /* ignore */ }
858
- // Update with new mentions that match known bot names
859
- let changed = false;
860
- for (const m of mentionsList) {
861
- const name = m.name;
862
- const openId = mentionOpenId(m);
863
- if (!name || !openId)
864
- continue;
865
- if (!knownBotNames.has(name.toLowerCase()))
866
- continue;
867
- if (existing[name] === openId)
868
- continue;
869
- existing[name] = openId;
870
- changed = true;
871
- }
872
- if (changed) {
873
- try {
874
- if (!existsSync(dataDir))
875
- mkdirSync(dataDir, { recursive: true });
876
- atomicWriteFileSync(fp, JSON.stringify(existing, null, 2) + '\n');
877
- logger.debug(`Updated bot open_id cross-ref for ${larkAppId}: ${JSON.stringify(existing)}`);
878
- }
879
- catch (err) {
880
- logger.debug(`Failed to write bot open_id cross-ref: ${err}`);
881
- }
882
- }
883
- }
884
- // ─── /introduce collaboration handshake ──────────────────────────────────
885
- //
886
- // 用户在群里发 `@A @B /introduce`(顺序任意,带不带额外文本都行),每个被
887
- // @ 的 bot 的 daemon 都会收到一份相同的 mentions[],里面自带每个被 @ 实体
888
- // 的 (open_id, name)。我们把这些登记进按 chatId 分文件的 observed-bots-store,
889
- // 后续 `botmux bots list` / `<available_bots>` 就能感知到非本机 daemon 启动
890
- // 的协作 bot,并能 @ 回去。
891
- //
892
- // 飞书没有任何公开接口能列出群里 bot 的 open_id(chat-members/get 明文跳过
893
- // bot 成员),这是当前条件下能拿到陌生 bot open_id 的唯一可靠路径。
894
- /** Command-position match: after stripping leading @mentions, the remaining
895
- * text must begin with `/introduce` (optionally followed by whitespace).
896
- * This is the same approach `parseForceTopicInvocation` takes for /t /topic.
897
- * Stricter than a bare token match — "please run /introduce" or similar
898
- * quoted/explanatory text won't trigger. */
899
- const INTRODUCE_RE = /^\/introduce(?:\s|$)/i;
900
- /**
901
- * If `message` is a /introduce command, side-effect it (record observed bots
902
- * + send ack) and return `true` so the caller skips normal CLI routing.
903
- *
904
- * /introduce 不需要任何授权:它只是把群里别的 bot 记进花名册(observed),不授予
905
- * 任何对话/操作权,所以群里任何人都能用(与 /grant 的 owner 强闸门相反)。
906
- *
907
- * Consumed without side effects (still returns true) when:
908
- * - mentions[] minus self is empty — nothing to learn, ignore quietly
909
- *
910
- * Writes ALL mentions including self to the store. Each receiving bot's
911
- * daemon owns its own per-observer file (see observed-bots-store), so the
912
- * self entry is the only authoritative record of this app's own open_id
913
- * in the per-observer view — useful for `botmux bots list` self-identification.
914
- */
915
- export async function tryHandleIntroduceCommand(larkAppId, message, senderOpenId) {
916
- const text = extractMessageTextForRouting(message);
917
- if (!text)
918
- return false;
919
- // Strip leading @<mention> tokens (using the message's mentions list to
920
- // tolerate names with spaces) before checking the command position.
921
- const stripped = stripLeadingMentions(text.trim(), message?.mentions ?? []);
922
- if (!INTRODUCE_RE.test(stripped))
923
- return false;
924
- logger.debug(`[${larkAppId}] /introduce from ${senderOpenId ?? 'unknown'} (no auth required)`);
925
- if (grantCommandRestriction(larkAppId, message.chat_id, senderOpenId).blocked) {
926
- const loc = localeForBot(larkAppId);
927
- await replyMessage(larkAppId, message.message_id, JSON.stringify({
928
- text: t('cmd.grant_restricted', { cmd: '/introduce' }, loc),
929
- })).catch(err => logger.debug(`introduce grant_restricted reply failed: ${err}`));
930
- return true;
931
- }
932
- const selfOpenId = getBot(larkAppId).botOpenId;
933
- const rawMentions = message.mentions ?? [];
934
- const all = rawMentions
935
- .map(m => ({ openId: mentionOpenId(m) ?? '', name: m.name ?? '' }))
936
- .filter(m => m.openId && m.name);
937
- const hasExternal = all.some(m => m.openId !== selfOpenId);
938
- if (!hasExternal) {
939
- logger.debug(`[${larkAppId}] /introduce ignored: no external bot in mentions`);
940
- return true;
941
- }
942
- const chatId = message.chat_id;
943
- // 查通讯录剔除真人:花名册只收 bot——真人混进去会污染 <available_bots> 误导模型,
944
- // 且不必再「靠人自觉」只 @ bot。self 始终保留(它是本 app open_id 的权威自记录)。
945
- // 缺 contact 读权限时 isHumanOpenId 一律返回 false → 退回「全部登记」旧行为(见其注释)。
946
- const humanFlags = await Promise.all(all.map(m => (m.openId === selfOpenId ? Promise.resolve(false) : isHumanOpenId(larkAppId, m.openId).catch(() => false))));
947
- const bots = all.filter((_, i) => !humanFlags[i]);
948
- try {
949
- // Persist to the observer-scoped store: these open_ids are scoped to the
950
- // receiving app (larkAppId), so they're correct for THIS daemon to use
951
- // when @-mentioning back.
952
- recordObservedBots(config.session.dataDir, larkAppId, chatId, bots, 'introduce');
953
- }
954
- catch (err) {
955
- logger.warn(`[${larkAppId}] /introduce: failed to persist observed bots: ${err}`);
956
- }
957
- const externalBots = bots.filter(m => m.openId !== selfOpenId);
958
- const ackText = externalBots.length
959
- ? `✅ 已认识本群 ${externalBots.length} 个伙伴:${externalBots.map(m => `@${m.name}`).join(' ')}`
960
- : `ℹ️ 没有可登记的机器人(/introduce 只登记机器人,@ 的若是真人会被忽略)`;
961
- try {
962
- await replyMessage(larkAppId, message.message_id, ackText);
963
- }
964
- catch (err) {
965
- logger.warn(`[${larkAppId}] /introduce ack failed: ${err}`);
966
- }
967
- return true;
968
- }
969
- // ─── @mention detection ──────────────────────────────────────────────────
970
- /** One-shot guard so the mention-shape early-warning logs at most once per
971
- * process instead of flooding once Lark converges the shapes (see below). */
972
- let warnedStringMentionShape = false;
973
- /** Check if the bot was @mentioned in this message */
974
- export function isBotMentioned(larkAppId, message, _senderOpenId) {
975
- const botOpenId = getBot(larkAppId).botOpenId;
976
- if (!botOpenId) {
977
- // Startup race: events can arrive before probeBotOpenId() resolves the
978
- // per-bot open_id. Subsequent events succeed once the probe completes,
979
- // so this is not a real warning — drop to debug to keep error.log clean.
980
- logger.debug(`[${larkAppId}] Bot open_id not yet known, skipping @mention check`);
981
- return false;
982
- }
983
- // Early-warning: today's WS events carry mention.id as an object; the REST
984
- // API carries a bare string. A string-form id on the event path means Lark
985
- // has converged the event onto the REST shape — surface it (once) so a silent
986
- // @-routing regression announces itself even though the shared gate absorbs it.
987
- const mentions = message?.mentions ?? [];
988
- if (!warnedStringMentionShape && mentions.some((m) => typeof m?.id === 'string')) {
989
- warnedStringMentionShape = true;
990
- logger.warn(`[${larkAppId}] mention.id arrived in string form on the event path — Lark may have converged the WS event onto the REST shape. mentionOpenId() absorbs it, but verify group @-routing. (logged once per process)`);
991
- }
992
- // Single source of truth shared with the poll + dashboard-preview legs.
993
- return messageMentionsBot(message, larkAppId, botOpenId);
994
- }
995
- /** Does this message @mention a *specific other member* (a person or bot that
996
- * is NOT this bot)? Used by the 'ambient' mention policy to decide whether to
997
- * back off: under 'ambient' the bot answers un-@ messages, but if the user
998
- * explicitly addresses SOMEONE ELSE it stays quiet (the redirect carve-out).
999
- * `@all` addresses everyone including this bot, so it is NOT an "other member"
1000
- * and does NOT trigger backoff. Mirrors isBotMentioned's two shapes:
1001
- * message.mentions[] (user text) and inline `at` nodes in post content. */
1002
- export function mentionsAnotherMember(larkAppId, message) {
1003
- const botOpenId = getBot(larkAppId).botOpenId;
1004
- // 1. message.mentions array (populated for user-sent text messages)
1005
- const mentions = message.mentions ?? [];
1006
- for (const m of mentions) {
1007
- // mentionOpenId() tolerates both the WS event object shape ({ open_id }) and
1008
- // the REST bare-string shape. Bot mentions may also arrive as app_id
1009
- // (id_type='app_id' / { app_id }) with no open_id; isBotMentioned handles
1010
- // that shape via mentionMatchesBot(), so the redirect/yield check must too.
1011
- const oid = mentionOpenId(m);
1012
- if (oid) {
1013
- if (oid === botOpenId)
1014
- continue; // that's me
1015
- if (oid === 'all')
1016
- continue; // @all → everyone incl. me
1017
- return true; // a specific other member
1018
- }
1019
- const appId = mentionAppId(m);
1020
- if (appId) {
1021
- if (appId === larkAppId)
1022
- continue; // that's me, addressed by app_id
1023
- if (appId === 'all')
1024
- continue;
1025
- return true; // another bot addressed by app_id
1026
- }
1027
- }
1028
- // 2. inline `at` nodes in post content (bot-sent / rich messages)
1029
- try {
1030
- const content = JSON.parse(message.content ?? '{}');
1031
- const inner = content.zh_cn ?? content.en_us ?? content;
1032
- if (Array.isArray(inner?.content)) {
1033
- for (const paragraph of inner.content) {
1034
- if (!Array.isArray(paragraph))
1035
- continue;
1036
- for (const node of paragraph) {
1037
- if (node.tag !== 'at')
1038
- continue;
1039
- const uid = node.user_id;
1040
- if (!uid || uid === botOpenId || uid === 'all')
1041
- continue;
1042
- return true;
1043
- }
1044
- }
1045
- }
1046
- }
1047
- catch { /* ignore parse errors */ }
1048
- return false;
1049
- }
1050
- function substituteTargetMatchesMention(target, mention) {
1051
- return Boolean((target.openId && mention.openId === target.openId) ||
1052
- (target.userId && mention.userId === target.userId) ||
1053
- (target.unionId && mention.unionId === target.unionId));
1054
- }
1055
- export function resolveSubstituteTrigger(larkAppId, message) {
1056
- const cfg = getBot(larkAppId).config.substituteMode;
1057
- if (!cfg?.enabled || !cfg.targets?.length)
1058
- return undefined;
1059
- const mentions = extractMentionIdentities(message);
1060
- for (const mention of mentions) {
1061
- const target = cfg.targets.find(t => substituteTargetMatchesMention(t, mention));
1062
- if (!target)
1063
- continue;
1064
- return {
1065
- target: {
1066
- name: target.name,
1067
- openId: target.openId,
1068
- userId: target.userId,
1069
- unionId: target.unionId,
1070
- },
1071
- observedMention: {
1072
- name: mention.name,
1073
- openId: mention.openId,
1074
- userId: mention.userId,
1075
- unionId: mention.unionId,
1076
- },
1077
- disclosure: cfg.disclosure ?? 'prefix',
1078
- };
1079
- }
1080
- return undefined;
1081
- }
1082
- function isSubstituteExcludedChat(cfg, chatId) {
1083
- return cfg?.excludedChats?.includes(chatId) ?? false;
1084
- }
1085
- function isSubstituteAllowedChat(cfg, chatId) {
1086
- // 黑名单先判且 deny-wins:命中即整段替身触发块短路(连带跳过其后的运行态
1087
- // 开关 isSubstituteEnabledForChat),因此配置黑名单 = 硬关闭,/substitute on
1088
- // 也翻不回来。对普通群与话题群一视同仁,与白名单同层。
1089
- if (isSubstituteExcludedChat(cfg, chatId))
1090
- return false;
1091
- if (!cfg?.chats?.length)
1092
- return true;
1093
- return cfg.chats.includes(chatId);
1094
- }
1095
- function mentionMatchesBot(m, larkAppId, botOpenId) {
1096
- const openId = mentionOpenId(m);
1097
- if (botOpenId && openId === botOpenId)
1098
- return true;
1099
- // Some Lark event payloads identify bot mentions by app_id:
1100
- // { id_type: "app_id", id: "cli_xxx" }
1101
- // Treat that as an explicit mention of this daemon, but do not let app_id
1102
- // flow through mentionOpenId(), which is persisted and used as an open_id.
1103
- const appId = mentionAppId(m);
1104
- return Boolean(larkAppId && appId === larkAppId);
1105
- }
1106
- /**
1107
- * 全部 talk 放行源的**运行时**枚举(TalkReason 由它派生)。
1108
- *
1109
- * 之所以是数组而不是纯 type:`test/bot-talk-parity.test.ts` 按它逐条核对
1110
- * 「这条腿对人和对 bot 分别是什么行为」,少一格就红。tsconfig 的 include 只有
1111
- * `src/**`,测试不过 tsc——纯类型层的穷尽约束在这里执行不了,必须落到运行时。
1112
- *
1113
- * 新增一条 talk 源时:改 evaluateTalk(人/bot 同时生效)+ 在那张表补一格说明,
1114
- * **不要**去 bot 路由闸里加 OR 腿(那正是 allowedChatGroups 漏掉的老路)。
1115
- */
1116
- export const TALK_REASONS = [
1117
- 'allowedUser',
1118
- 'oncall',
1119
- 'peer',
1120
- 'teamBot',
1121
- 'teamMember',
1122
- 'allowedChatGroup',
1123
- 'open',
1124
- 'chatGrant',
1125
- 'globalGrant',
1126
- 'p2pOpen',
1127
- 'none',
1128
- ];
1129
- export function grantCommandRestriction(larkAppId, chatId, senderOpenId) {
1130
- const bot = getBot(larkAppId);
1131
- if (bot.config.restrictGrantCommands !== true)
1132
- return { blocked: false };
1133
- const ev = evaluateTalk(larkAppId, chatId, senderOpenId);
1134
- if (ev.reason === 'chatGrant' || ev.reason === 'globalGrant') {
1135
- return { blocked: true, reason: ev.reason };
1136
- }
1137
- return { blocked: false };
1138
- }
1139
- /** per-chat per-user 授权命中判断(仅用于 canTalk —— 不给管理命令权)。 */
1140
- function hasChatGrant(larkAppId, chatId, openId) {
1141
- if (!chatId || !openId || !getBot(larkAppId).config.chatGrants?.[chatId]?.includes(openId))
1142
- return false;
1143
- return grantNotExpired(larkAppId, 'chat', chatId, openId, chatQuotaKey(chatId, openId));
1144
- }
1145
- /** 全局对话授权命中判断(人/bot 通用,仅用于 canTalk / bot 路由闸 —— 不给管理命令权)。 */
1146
- function hasGlobalGrant(larkAppId, openId) {
1147
- if (!openId || !getBot(larkAppId).config.globalGrants?.includes(openId))
1148
- return false;
1149
- return grantNotExpired(larkAppId, 'global', undefined, openId, globalQuotaKey(openId));
1150
- }
1151
- const expiryCleanupInFlight = new Set();
1152
- /**
1153
- * 到期判断是同步安全边界:过期后本条消息立即拒绝;持久化清理由带 observedExpiresAt
1154
- * 条件的原子 RMW 异步完成,避免误删刚续期的授权。
1155
- */
1156
- function grantNotExpired(larkAppId, scope, chatId, openId, grantKey) {
1157
- const expiresAt = getGrantExpiresAt(larkAppId, grantKey);
1158
- if (expiresAt === undefined || Date.now() < expiresAt)
1159
- return true;
1160
- const cleanupKey = `${larkAppId}:${grantKey}:${expiresAt}`;
1161
- if (!expiryCleanupInFlight.has(cleanupKey)) {
1162
- expiryCleanupInFlight.add(cleanupKey);
1163
- void removeExpiredGrant(larkAppId, scope, chatId, openId, expiresAt)
1164
- .then(result => {
1165
- if (!result.ok)
1166
- logger.warn(`[grant:${larkAppId}] expiry cleanup failed key=${grantKey} reason=${result.reason}`);
1167
- })
1168
- .catch(err => logger.warn(`[grant:${larkAppId}] expiry cleanup failed key=${grantKey}: ${err}`))
1169
- .finally(() => expiryCleanupInFlight.delete(cleanupKey));
1170
- }
1171
- return false;
1172
- }
1173
- /** 整群 talk 授权命中判断(裸 `/grant` 写入的 allowedChatGroups)。chat 维度、sender 无关,
1174
- * 与 oncall 同一个安全模型:只放行 canTalk / bot 路由闸,canOperate 绝不读它。 */
1175
- function hasAllowedChatGroup(larkAppId, chatId) {
1176
- return !!chatId && !!getBot(larkAppId).config.allowedChatGroups?.includes(chatId);
1177
- }
1178
- /**
1179
- * 是否配置了任何白名单(限制态)。判定用 **原始** config.allowedUsers, 不用
1180
- * resolvedAllowedUsers——否则「配了 owner 但启动时邮箱/union 解析失败 → resolved 为空」
1181
- * 会 fall through 成「无白名单 = 全开放」,把误配/解析失败 fail-open 成谁都能 operate。
1182
- * 配了就算限制态:解析为空时成员判定一律落空 → fail-closed(由 owner 修配置)。
1183
- */
1184
- function hasConfiguredAllowlist(bot) {
1185
- return (bot.config.allowedUsers?.length ?? 0) > 0
1186
- || (bot.config.allowedChatGroups?.length ?? 0) > 0
1187
- || (bot.config.globalGrants?.length ?? 0) > 0
1188
- // p2pOpen 也是一次显式的权限边界声明:配了它 = 进入限制态。否则「只配 p2pOpen、
1189
- // 没配 allowedUsers」会 fall through 到 open 模式,把**群聊**和 **canOperate** 一起
1190
- // 放开(陌生人能 /restart /cd),与 p2pOpen「只开私聊 talk」的语义正好相反。
1191
- // 此时若没配 allowedUsers → 谁都不能 operate(fail-closed),bot-registry 会告警。
1192
- || bot.config.p2pOpen === true;
1193
- }
1194
- export function canTalk(larkAppId, chatId, senderOpenId, senderUnionId, memberUnionId, chatType) {
1195
- return evaluateTalk(larkAppId, chatId, senderOpenId, senderUnionId, memberUnionId, chatType).allowed;
1196
- }
1197
- /**
1198
- * @param senderUnionId BOT-trust union(teamBot 腿)——调用方必须已按 sender_type
1199
- * 锁定为「飞书盖章的 bot 发送方」(daemon 的 teamTrustUnionId),否则恶意成员把
1200
- * 真人 union 报成 bot 就能让真人继承 bot 信任。
1201
- * @param memberUnionId 发送方 union(teamMember 腿)——可为真人 union(未锁 bot)。
1202
- * 仅授 chat 作用域内的 talk、不授 operate,且要求 union 在该团队的成员名单里
1203
- * (memberUnionIds 来自平台鉴权的团队成员,非机器自报),故喂真人 union 是安全的。
1204
- * @param chatType 当前会话类型。**仅 p2pOpen 腿读它**;省略时该腿不生效(fail-closed),
1205
- * 所以拿不到 chatType 的调用点保持原语义、不会误放行。
1206
- */
1207
- export function evaluateTalk(larkAppId, chatId, senderOpenId, senderUnionId, memberUnionId, chatType) {
1208
- const bot = getBot(larkAppId);
1209
- // allowedChatGroups 是"talk-open 的 chat_id 列表":当前消息来自其中之一即放行(仅 canTalk)。
1210
- // 成员关系隐含在"能在该 chat 发言"里 —— 退群者发不了言自动失权,新人进群即生效,无需成员快照。
1211
- const allowedUsers = bot.resolvedAllowedUsers;
1212
- if (senderOpenId && allowedUsers.includes(senderOpenId))
1213
- return { allowed: true, reason: 'allowedUser' };
1214
- // Oncall 群命中:默认不限额;仅当 bot 配了 messageQuota.defaultLimit 时,
1215
- // 才挂 chat:<chatId>:<openId> 这一 quotaKey(与 chatGrant 同键、同计数器,
1216
- // 便于 owner 后续 /grant @x N 续杯/重置)。
1217
- if (chatId && findOncallChat(larkAppId, chatId)) {
1218
- const def = bot.config.messageQuota?.defaultLimit;
1219
- if (typeof def === 'number' && Number.isInteger(def) && def > 0 && senderOpenId) {
1220
- // 交集处理:同群若还持有显式 chatGrant,额度由授权决定而非 oncall default。
1221
- // 三态:live 显式授权 → explicitGrantOverride(不兜 default);已过期 → expiredGrantCleanup
1222
- //(透传给 consumeQuota,锁内以当前 expiry 为准原子清成员+quota+expiry 并回落 default);
1223
- // 非成员 → 无覆盖,正常走 oncall default 懒初始化。
1224
- const gk = chatQuotaKey(chatId, senderOpenId);
1225
- const isMember = !!bot.config.chatGrants?.[chatId]?.includes(senderOpenId);
1226
- const exp = isMember ? getGrantExpiresAt(larkAppId, gk) : undefined;
1227
- if (isMember && exp !== undefined && Date.now() >= exp) {
1228
- return {
1229
- allowed: true, reason: 'oncall', quotaKey: gk,
1230
- expiredGrantCleanup: { scope: 'chat', chatId, openId: senderOpenId },
1231
- };
1232
- }
1233
- return { allowed: true, reason: 'oncall', quotaKey: gk, explicitGrantOverride: isMember };
1234
- }
1235
- return { allowed: true, reason: 'oncall' };
1236
- }
1237
- if (isKnownPeerBot(config.session.dataDir, larkAppId, senderOpenId))
1238
- return { allowed: true, reason: 'peer' };
1239
- // 跨部署团队 peer bot(旧版联邦学来的 union_id / 平台 roster 下发的 union_id)——
1240
- // 与 isKnownPeerBot 兄弟 bot 对等的 talk 放行。没有这一腿,外部 bot 闸门
1241
- //(isTrustedTeamBotSender)放进来的团队 bot 消息会在 enforceMessageQuotaForCliInput
1242
- // 的 evaluateTalk 复查处被静默丢弃(受限 bot 上 #332 的端到端断点)。仅认租户
1243
- // 稳定 union_id(bot 专属,人不会进这两张表),不看 chatId,不授 operate。
1244
- if (senderUnionId && (isTeamBot(config.session.dataDir, senderUnionId) || isPlatformTeamBot(config.session.dataDir, senderUnionId))) {
1245
- return { allowed: true, reason: 'teamBot' };
1246
- }
1247
- // 平台团队成员(人):发送者 union_id 是本群所属平台团队的成员 → talk 免 grant。
1248
- // 严格 chat 作用域(isPlatformTeamMemberChat 要求成员与群在同一团队),只放 talk:
1249
- // canOperate 不引这一腿,/restart 等仍限 allowedUsers。授权用户在团队群里 @ bot 即免卡。
1250
- if (memberUnionId && isPlatformTeamMemberChat(config.session.dataDir, chatId, memberUnionId)) {
1251
- return { allowed: true, reason: 'teamMember' };
1252
- }
1253
- if (hasAllowedChatGroup(larkAppId, chatId))
1254
- return { allowed: true, reason: 'allowedChatGroup' };
1255
- // p2pOpen:私聊维度的 talk-open,与 oncall(群维度)同一个安全模型——放行 canTalk,
1256
- // canOperate 一行不读它(管理仍限 allowedUsers)。谁能私聊由飞书应用「可用范围」控制。
1257
- // chatType 省略 → 该腿不生效(fail-closed),未接入 chatType 的调用点语义不变。
1258
- if (chatType === 'p2p' && bot.config.p2pOpen === true)
1259
- return { allowed: true, reason: 'p2pOpen' };
1260
- // globalGrants 与 allowedChatGroups 同样确立"有白名单"语义:只配 globalGrants 也算限制态,
1261
- // 不能 fall through 到"全开放"。用原始配置判定(见 hasConfiguredAllowlist):配了 owner
1262
- // 但解析失败时也保持限制态, 不 fail-open。
1263
- if (!hasConfiguredAllowlist(bot))
1264
- return { allowed: true, reason: 'open' };
1265
- if (hasChatGrant(larkAppId, chatId, senderOpenId)) {
1266
- return { allowed: true, reason: 'chatGrant', quotaKey: chatQuotaKey(chatId, senderOpenId) };
1267
- }
1268
- // 全局对话授权(talk-only,人/bot 通用):命中即在任意群放行,与 chatGrants 同级、不授 operate。
1269
- if (hasGlobalGrant(larkAppId, senderOpenId)) {
1270
- return { allowed: true, reason: 'globalGrant', quotaKey: globalQuotaKey(senderOpenId) };
1271
- }
1272
- return { allowed: false, reason: 'none' };
1273
- }
1274
- /**
1275
- * BOT 发送方的 talk 判定 —— bot 路由闸(外部 bot @ 本 bot)的**唯一**入口。
1276
- *
1277
- * = 人侧 evaluateTalk 的完整模型 + 一条 bot 专属腿。历史上 bot 侧手抄了一份
1278
- * talk 源子集(oncall / peer / teamBot / chatGrant / globalGrant 的 OR 链),
1279
- * 于是每加一条新 talk 源就漏一次、复发一次同类 bug:oncall 漏过一次、开放模式
1280
- * 漏过一次、allowedChatGroups 又漏一次(owner 整群 `/grant` 后真人能说话、外部 bot
1281
- * 一 @ 仍弹授权卡)。收敛成单一谓词后,**新增 talk 源只需改 evaluateTalk**;
1282
- * test/bot-talk-parity.test.ts 按 TALK_REASONS 逐条盯着这条约束。
1283
- *
1284
- * 与人侧仅有的两条差异,都是刻意的,改动前先读:
1285
- *
1286
- * 1. `isTrustedTeamBotSender`(+,bot 才有):其中真正额外放行的是**团队拉群**那条腿
1287
- * ——本群是团队拉群(团队掌控成员)→ 说话的 botmux bot 即视为背书队友,首次接触
1288
- * 也放行,与 oncall 群豁免同构。chat 维度、不看 union,覆盖 sender 事件没带
1289
- * `union_id` 的情况(此时 gate 前那次 `recordTeamBot` 被 `senderUnionId &&` 短路,
1290
- * evaluateTalk 的 teamBot 腿必然落空)。**这条不能下沉进 evaluateTalk**:那是人/bot
1291
- * 共用的,加进去等于团队群里任何真人都自动过 canTalk,绕开 teamMember 腿的成员校验
1292
- * (isPlatformTeamMemberChat 要求 union 在该团队成员名单里)。它另外两条 union 锚定
1293
- * 的腿与 evaluateTalk 的 teamBot 腿重合,留着是为了让「bot 团队信任」只有一处定义。
1294
- *
1295
- * 2. `p2pOpen`(−):不传 chatType → 该腿 fail-closed 不生效。飞书里 bot 之间不存在
1296
- * 私聊,开着只是白扩边界。
1297
- *
1298
- * @param senderUnionId 必须是飞书盖章的 bot 发送方 union(`sender_type ∈ app|bot`),
1299
- * 与 evaluateTalk 的 bot-trust 腿同一契约。真人 union 走 memberUnionId,本函数恒不传。
1300
- */
1301
- export function evaluateBotTalk(larkAppId, chatId, senderOpenId, senderUnionId) {
1302
- const ev = evaluateTalk(larkAppId, chatId, senderOpenId, senderUnionId);
1303
- if (ev.allowed)
1304
- return ev;
1305
- return isTrustedTeamBotSender(config.session.dataDir, chatId, senderUnionId)
1306
- ? { allowed: true, reason: 'teamBot' }
1307
- : ev;
1308
- }
1309
- /**
1310
- * `botmux ask` 答复者是否可作答(= 该 chat 的 canTalk 门)——ask-broker 注入的
1311
- * canTalkChecker 的**唯一生产实现**,daemon bootstrap 一行转调它。
1312
- *
1313
- * 抽成独立导出函数(而非把分派内联进 daemon setter 闭包)的意义:让**分派谓词本身**
1314
- * 能被回归测试直接咬住——测试对本函数喂真实 team store 状态断言三组行为,改坏这里的
1315
- * 分派逻辑(如退回旧 evaluateTalk / 不认 actor.botSender)会立刻红。注意测试只覆盖到
1316
- * 本函数;daemon setter 的一行转调与 submitCustomReply 的 actor 构造仍靠人工核对
1317
- * (setter 只有一行,不经测试机械覆盖)。
1318
- *
1319
- * - bot 发送方(actor.botSender)→ evaluateBotTalk(含团队拉群那条 chat 维度腿,
1320
- * 覆盖 sender 事件没带 union_id 的场景),与 dispatcher 外层闸 / quota 复查同源。
1321
- * - 人 / 无 actor(卡片点击路径)→ evaluateTalk 全模型:actor.senderUnionId 走
1322
- * teamBot 腿(人路径恒 undefined)、actor.memberUnionId 走 teamMember 腿。
1323
- * actor 省略时两者都是 undefined → 退化为纯 evaluateTalk(openId, chatType),
1324
- * 与本次改动前的卡片点击语义完全一致。
1325
- */
1326
- export function evaluateAskAnswerTalk(larkAppId, chatId, senderOpenId, chatType, actor) {
1327
- return actor?.botSender
1328
- ? evaluateBotTalk(larkAppId, chatId, senderOpenId, actor.senderUnionId).allowed
1329
- : evaluateTalk(larkAppId, chatId, senderOpenId, actor?.senderUnionId, actor?.memberUnionId, chatType).allowed;
1330
- }
1331
- export function canOperate(larkAppId, _chatId, senderOpenId, senderUnionId) {
1332
- const bot = getBot(larkAppId);
1333
- // 同部署 cross-ref / isKnownPeerBot 只证明「这是一个可路由的 bot 身份」,仅供
1334
- // evaluateTalk 的 peer 腿使用,绝不能隐式升级为管理权限。需要让编排者执行
1335
- // /repo /cd /restart 等命令时,必须命中下面显式支持 operate 的权限源。
1336
- //
1337
- // 跨部署「团队 peer bot」互信 operate(覆盖编排者给
1338
- // 队友派 /repo /cd 等)。**只认租户稳定的 union_id**(isTeamBot / 平台 roster),
1339
- // 不走 isTrustedTeamBotSender 的「团队群成员」分支——那条按 chat 放行是 sender
1340
- // 无关的,会把「团队群里的真人」也误放进 operate,破坏 allowedUsers 边界。union_id
1341
- // 是发送方专属、且必须先被团队背书(团队群学习 / 平台 roster)才进表,人不会命中。
1342
- if (isTeamBot(config.session.dataDir, senderUnionId))
1343
- return true;
1344
- if (isPlatformTeamBot(config.session.dataDir, senderUnionId))
1345
- return true;
1346
- const allowedUsers = bot.resolvedAllowedUsers;
1347
- // globalGrants(与 allowedChatGroups 同理)确立"有白名单"语义:只配 globalGrants 也算限制态,
1348
- // 否则 canOperate 会 fall through 到"全开放",把 talk-only 授权变成 operate 全开——正是 PR #46
1349
- // 要堵的洞。注意 globalGrants 只进 hasAllowlist 判定,operate 命中仍只认 allowedUsers。
1350
- // 用原始配置判定(hasConfiguredAllowlist):配了 owner 但解析为空时 fail-closed, 不 fail-open。
1351
- if (!hasConfiguredAllowlist(bot))
1352
- return true;
1353
- return !!senderOpenId && allowedUsers.includes(senderOpenId);
1354
- }
1355
- /**
1356
- * Daemon 命令统一闸:canOperate 恒放行;此外,bot 配置的 `canTalkDaemonCommands`
1357
- * 名单内的命令降到 canTalk 判定(oncall / allowedChatGroup / grant / p2pOpen 等
1358
- * 对话放行腿命中即可)。名单外或未配置 → 与 canOperate 完全等价(现状不变)。
1359
- *
1360
- * 只作用于 daemon.ts 两条路由的 DAEMON_COMMANDS 统一闸;在统一闸之前特判的命令
1361
- * (/vc-auth /term)与 handler 内部自带 owner 闸的命令(/card /insight)
1362
- * 不受影响——内部闸仍是最终权威(fail-closed)。
1363
- *
1364
- * chatType 省略时 p2pOpen 腿不生效(fail-closed),与 canTalk 语义一致——
1365
- * 私聊路径的调用点必须把 chatType 传进来。
1366
- *
1367
- * botSender:降权到 talk 判定这一段,必须与 dispatcher 外层闸 / quota 复查用**同一个**
1368
- * 谓词。bot 发送方走 evaluateBotTalk(含团队拉群那条 chat 维度腿,覆盖 sender 事件没带
1369
- * union_id 的情况);否则「团队拉群里外部 bot 能 talk 却执行不了降权到 canTalk 的命令
1370
- * (如 /status)」——单一 talk 谓词在这道 daemon 命令闸继续分叉。不传(人的路径)→
1371
- * 原样走 canTalk / evaluateTalk,语义不变。canOperate 那段人/bot 通用,不受影响。
1372
- *
1373
- * `/repo` 另有一个更窄的同部署 sibling bot 例外:仅当飞书事件把发送方盖章为 bot,
1374
- * receiver cross-ref 命中 sender open_id,且 sender union_id 精确匹配当前仍配置的唯一
1375
- * 本机 sibling app 已学习的自身 union_id 时放行;不把 sibling 提升为 canOperate,也不把其他 daemon 命令降权。
1376
- */
1377
- export function canRunDaemonCommand(larkAppId, chatId, senderOpenId, senderUnionId, cmd, memberUnionId, chatType, botSender, larkStampedBotSender) {
1378
- if (canOperate(larkAppId, chatId, senderOpenId, senderUnionId))
1379
- return true;
1380
- if (cmd === '/repo' && larkStampedBotSender === true
1381
- && isVerifiedLocalSiblingBot(config.session.dataDir, larkAppId, senderOpenId, senderUnionId)) {
1382
- return true;
1383
- }
1384
- const list = getBot(larkAppId).config.canTalkDaemonCommands;
1385
- if (!list?.includes(cmd))
1386
- return false;
1387
- return botSender
1388
- ? evaluateBotTalk(larkAppId, chatId, senderOpenId, senderUnionId).allowed
1389
- : canTalk(larkAppId, chatId, senderOpenId, senderUnionId, memberUnionId, chatType);
1390
- }
1391
- /**
1392
- * 入口 A:无权限者 @bot 时弹授权申请卡(正文 @owner,由 owner 处置)。
1393
- * 受 grant-pending 节流:pending 中 / deny 冷却期内静默不发。开放模式(无 owner)兜底不发。
1394
- */
1395
- async function maybeSendGrantRequestCard(larkAppId, message, chatId, requesterOpenId, messageData) {
1396
- if (getBot(larkAppId).config.autoGrantRequestCards === false)
1397
- return;
1398
- const owner = getOwnerOpenId(larkAppId);
1399
- if (!owner || !requesterOpenId)
1400
- return;
1401
- if (isThrottled(larkAppId, chatId, requesterOpenId))
1402
- return;
1403
- // 名字优先级:本消息 mentions(真人发送方、被 @ 目标都在此)→ observed-bots 花名册
1404
- // (/introduce 登记过的 (open_id,name))→ 裸 open_id 兜底。外部 bot 发送方不在自己
1405
- // 消息的 mentions 里(那是 @ 目标),只靠 mentions 会让 owner 只看到 open_id。
1406
- const mentionName = (message?.mentions ?? []).find((m) => mentionOpenId(m) === requesterOpenId)?.name;
1407
- const observedName = mentionName
1408
- ? undefined
1409
- : listObservedBots(config.session.dataDir, larkAppId, chatId).find(b => b.openId === requesterOpenId)?.name;
1410
- const profileName = mentionName || observedName
1411
- ? undefined
1412
- : (await getUserProfile(larkAppId, requesterOpenId).catch(() => null))?.name;
1413
- const shortRequester = `${requesterOpenId.slice(0, 10)}…${requesterOpenId.slice(-4)}`;
1414
- const name = mentionName ?? observedName ?? profileName ?? shortRequester;
1415
- // 把原始消息事件挂在 pending 上:授权成功后可重放,用户无需再 @ 一遍。
1416
- const quota = getBot(larkAppId).config.messageQuota?.defaultLimit ?? DEFAULT_GRANT_QUOTA;
1417
- const nonce = openPending(larkAppId, chatId, requesterOpenId, quota, messageData, DEFAULT_GRANT_DURATION_MS);
1418
- const card = buildGrantCard({
1419
- ownerOpenId: owner,
1420
- targets: [{ openId: requesterOpenId, name: String(name) }],
1421
- chatId,
1422
- nonce,
1423
- mode: 'request',
1424
- quota,
1425
- durationMs: DEFAULT_GRANT_DURATION_MS,
1426
- }, localeForBot(larkAppId));
1427
- await replyMessage(larkAppId, message.message_id, card, 'interactive')
1428
- .catch(err => {
1429
- // 发卡失败必须撤掉刚开的 pending,否则该发送方被节流压死、owner 永远看不到卡片,
1430
- // 只能等 daemon 重启或别的 target 触发全表 prune 才恢复。清掉后下次 @ 会重试发卡。
1431
- clearPending(larkAppId, chatId, requesterOpenId);
1432
- logger.debug(`grant request card send failed: ${err}`);
1433
- });
1434
- }
1435
- // ─── Group message access check ──────────────────────────────────────────
1436
- /**
1437
- * Check group message addressing:
1438
- * - 'allowed' -> sender is allowed, bot was @mentioned or solo group
1439
- * - 'not_allowed' -> bot was @mentioned but sender is not in allowlist
1440
- * - 'ignore' -> not addressed to bot at all
1441
- */
1442
- export async function checkGroupMessageAccess(larkAppId, message, chatId, senderOpenId, memberUnionId) {
1443
- const mentioned = isBotMentioned(larkAppId, message, senderOpenId);
1444
- // 群消息访问检查只在人路径调用,union 走 memberUnionId 腿(不进 bot-trust)。
1445
- const isAllowed = canTalk(larkAppId, chatId, senderOpenId, undefined, memberUnionId);
1446
- logger.debug(`Check group message access: mentioned=${mentioned}, isAllowed=${isAllowed}`);
1447
- if (mentioned) {
1448
- return isAllowed ? 'allowed' : 'not_allowed';
1449
- }
1450
- // No @mention — only allow if sender is the sole human in the group
1451
- // AND this is the only bot in the chat. With multiple bots, require @mention
1452
- // to disambiguate.
1453
- //
1454
- // 若消息 @ 了别的具体成员(mentionsAnotherMember),群必然不是 1人1bot——
1455
- // 只有群成员能被 @,多出的那个 @ 本身就是人数变化的证据。上游可能还抱着
1456
- // 陈旧缓存 {1,1}(刚拉了新 bot 的 TTL 窗口),这会直接跳过人数查询落到
1457
- // 'ignore',挡住「用户 @ 新 bot、老 bot 跟着回复」。群聊 @ 策略 never/ambient
1458
- // 在调用方(relax 条款)已先行结算,这里不受影响。
1459
- if (isAllowed && !mentionsAnotherMember(larkAppId, message)) {
1460
- const { userCount, botCount } = await getGroupStats(larkAppId, chatId);
1461
- logger.debug(`Group user count: ${userCount}, bot count: ${botCount}`);
1462
- if (userCount <= 1 && botCount <= 1) {
1463
- return 'allowed';
1464
- }
1465
- }
1466
- return 'ignore';
1467
- }
1468
- function listenerRoutingContext(input) {
1469
- return {
1470
- data: input.data,
1471
- ctx: {
1472
- chatId: input.chatId,
1473
- messageId: input.messageId,
1474
- chatType: input.chatType,
1475
- larkAppId: input.larkAppId,
1476
- scope: 'thread',
1477
- anchor: input.messageId,
1478
- messageListener: input.match,
1479
- },
1480
- ownsSession: false,
1481
- };
1482
- }
1483
- const MESSAGE_LISTENER_POLL_INTERVAL_MS = Math.max(5_000, Number(process.env.BOTMUX_MESSAGE_LISTENER_POLL_INTERVAL_MS) || 30_000);
1484
- const MESSAGE_LISTENER_BACKFILL_WINDOW_MS = Math.max(60_000, Number(process.env.BOTMUX_MESSAGE_LISTENER_BACKFILL_WINDOW_MS) || 30 * 60_000);
1485
- const MESSAGE_LISTENER_BACKFILL_SCAN_LIMIT = Math.max(1, Number(process.env.BOTMUX_MESSAGE_LISTENER_BACKFILL_SCAN_LIMIT) || 100);
1486
- const MESSAGE_LISTENER_BACKFILL_PAGE_SIZE = Math.min(50, Math.max(1, Number(process.env.BOTMUX_MESSAGE_LISTENER_BACKFILL_PAGE_SIZE) || 50));
1487
- function enabledMessageListenerChatIds(bot) {
1488
- return Object.entries(bot.config.messageListeners ?? {})
1489
- .filter(([, listener]) => listener?.enabled === true && !!listener.prompt?.trim())
1490
- .map(([chatId]) => chatId);
1491
- }
1492
- function messageCreateTimeMs(message) {
1493
- const raw = message?.create_time ?? message?.createTime;
1494
- const value = Number(raw);
1495
- return Number.isFinite(value) ? value : undefined;
1496
- }
1497
- function historyMessageSender(message) {
1498
- const sender = message?.sender ?? {};
1499
- // A bot sender is reported by app_id (cli_) in `sender.id`, but with
1500
- // `with_sender_name=true` (which listChatMessagesUntil always sets) Lark also
1501
- // returns `sender.open_bot_id` — the bot's per-app open_id, IDENTICAL to what
1502
- // /members/bots reports and to what the dashboard bot-picker stores. Prefer it
1503
- // so a third-party bot resolves to the same ou_ the include/exclude lists use
1504
- // (otherwise it stays an unresolvable cli_ and never matches an open_id list).
1505
- const senderId = sender.open_bot_id ?? sender.id ?? sender.open_id ?? sender.user_id ?? sender.app_id
1506
- ?? message?.sender_id?.open_id ?? message?.sender_id?.user_id ?? message?.sender_id?.app_id;
1507
- const rawIdType = sender.id_type ?? sender.sender_id_type;
1508
- // open_bot_id is an open_id even though the row's id_type still says app_id.
1509
- const senderIdType = sender.open_bot_id ? 'open_id' : rawIdType;
1510
- const inferredType = sender.sender_type
1511
- ?? message?.sender_type
1512
- ?? (rawIdType === 'app_id' ? 'app' : undefined);
1513
- return {
1514
- senderOpenId: typeof senderId === 'string' ? senderId : undefined,
1515
- senderTypeRaw: typeof inferredType === 'string' ? inferredType : undefined,
1516
- senderIdType: typeof senderIdType === 'string' ? senderIdType : undefined,
1517
- };
1518
- }
1519
- function larkReceiveEventFromHistoryMessage(message, chatId) {
1520
- const { senderOpenId, senderTypeRaw, senderIdType } = historyMessageSender(message);
1521
- // sender_type and the ID DOMAIN are independent axes. A bot sender keeps
1522
- // sender_type='app', but when we resolved its identity to an open_id (via
1523
- // sender.open_bot_id, senderIdType==='open_id'), the value MUST go in the
1524
- // open_id slot — the whole downstream chain (message-parser senderId,
1525
- // handleNewTopic owner/quote target, --mention-back) reads sender_id.open_id
1526
- // ONLY. Putting an ou_ into { app_id } both mislabels the field and drops the
1527
- // identity (senderId becomes ''). Choose the key by domain, not by type.
1528
- const isBotSenderType = senderIdType === 'app_id' || senderTypeRaw === 'app' || senderTypeRaw === 'bot';
1529
- const isOpenIdDomain = senderIdType === 'open_id'
1530
- || (typeof senderOpenId === 'string' && senderOpenId.startsWith('ou_'));
1531
- return {
1532
- message: {
1533
- ...message,
1534
- message_type: message?.message_type ?? message?.msg_type,
1535
- chat_id: message?.chat_id ?? chatId,
1536
- chat_type: message?.chat_type ?? 'group',
1537
- },
1538
- sender: {
1539
- // Preserve the bot sender_type (talk/quota gates and foreign-bot owner
1540
- // suppression key off it) even when the id itself is an open_id.
1541
- sender_type: senderTypeRaw ?? (isBotSenderType ? 'app' : 'user'),
1542
- sender_id: isOpenIdDomain
1543
- ? { open_id: senderOpenId }
1544
- : isBotSenderType
1545
- ? { app_id: senderOpenId }
1546
- : { open_id: senderOpenId },
1547
- },
1548
- };
1549
- }
1550
- async function dispatchHumanMessageViaHandlers(larkAppId, handlers, payload) {
1551
- await serializeByAnchor(payload.ctx.anchor, () => {
1552
- const ownsSession = handlers.isSessionOwner?.(payload.ctx.anchor, larkAppId) ?? payload.ownsSession;
1553
- return ownsSession
1554
- ? handlers.handleThreadReply(payload.data, payload.ctx)
1555
- : handlers.handleNewTopic(payload.data, payload.ctx);
1556
- });
1557
- }
1558
- async function dispatchPolledMessageListenerMatch(input) {
1559
- if (!claimMessageOnce(input.larkAppId, input.messageId)) {
1560
- logger.debug(`[message-listener:${input.larkAppId}] polled duplicate ignored msg=${input.messageId.substring(0, 12)}`);
1561
- return;
1562
- }
1563
- logger.info(`[message-listener:${input.larkAppId}] matched polled chat=${input.chatId.substring(0, 12)} ` +
1564
- `msg=${input.messageId.substring(0, 12)} sender=${input.match.senderOpenId?.substring(0, 12) ?? '-'}`);
1565
- await dispatchHumanMessageViaHandlers(input.larkAppId, input.handlers, listenerRoutingContext({
1566
- data: input.data,
1567
- match: input.match,
1568
- chatId: input.chatId,
1569
- messageId: input.messageId,
1570
- chatType: 'group',
1571
- larkAppId: input.larkAppId,
1572
- }));
1573
- }
1574
- async function pollMessageListenersOnce(larkAppId, handlers, now = Date.now()) {
1575
- const bot = getBot(larkAppId);
1576
- const chatIds = enabledMessageListenerChatIds(bot);
1577
- if (chatIds.length === 0)
1578
- return;
1579
- const cutoff = now - MESSAGE_LISTENER_BACKFILL_WINDOW_MS;
1580
- await ensureBotOpenId(larkAppId).catch(() => { });
1581
- for (const chatId of chatIds) {
1582
- let messages;
1583
- try {
1584
- messages = await listChatMessagesUntil(larkAppId, chatId, {
1585
- pageSize: MESSAGE_LISTENER_BACKFILL_PAGE_SIZE,
1586
- stopAfter: (message, seenCount) => {
1587
- const createdAt = messageCreateTimeMs(message);
1588
- return seenCount >= MESSAGE_LISTENER_BACKFILL_SCAN_LIMIT ||
1589
- (Number.isFinite(createdAt) && createdAt < cutoff);
1590
- },
1591
- });
1592
- }
1593
- catch (err) {
1594
- logger.warn(`[message-listener:${larkAppId}] failed to poll chat=${chatId.substring(0, 12)}: ${err instanceof Error ? err.message : String(err)}`);
1595
- continue;
1596
- }
1597
- // Build the app_id→open_id map once per chat (shared with the dashboard
1598
- // preview leg) so bot senders (reported by app_id in history) match sender
1599
- // filters keyed on open_id, and unprovable bots fail closed on exclusion.
1600
- const candidateBotAppIds = collectListenerBotAppIds(messages, historyMessageSender);
1601
- const appIdToOpenId = await buildListenerBotAppIdToOpenId(larkAppId, chatId, candidateBotAppIds);
1602
- for (const message of messages) {
1603
- const messageId = String(message?.message_id ?? '');
1604
- if (!messageId)
1605
- continue;
1606
- const createdAt = messageCreateTimeMs(message);
1607
- if (Number.isFinite(createdAt) && createdAt < cutoff)
1608
- continue;
1609
- const data = larkReceiveEventFromHistoryMessage(message, chatId);
1610
- const rawSender = historyMessageSender(message);
1611
- const resolved = resolveListenerSenderIdentity(rawSender, appIdToOpenId);
1612
- const match = evaluateMessageListener({
1613
- bot,
1614
- chatId,
1615
- message: data.message,
1616
- senderOpenId: resolved.senderOpenId,
1617
- senderTypeRaw: rawSender.senderTypeRaw,
1618
- senderIdentityUnverified: resolved.identityUnverified,
1619
- explicitlyMentionedThisBot: isBotMentioned(larkAppId, data.message, resolved.senderOpenId),
1620
- });
1621
- if (!match)
1622
- continue;
1623
- await dispatchPolledMessageListenerMatch({
1624
- larkAppId,
1625
- handlers,
1626
- data,
1627
- match,
1628
- chatId,
1629
- messageId,
1630
- }).catch(err => logger.error(`Error handling polled message listener event: ${err}`));
1631
- }
1632
- }
1633
- }
1634
- export async function __pollMessageListenersOnceForTest(larkAppId, handlers, now = Date.now()) {
1635
- await pollMessageListenersOnce(larkAppId, handlers, now);
1636
- }
1637
- function usesForwardFollowupDelay(mentionMode) {
1638
- return mentionMode === 'never' || mentionMode === 'ambient';
1639
- }
1640
- /**
1641
- * Per-app barriers that resolve once `restoreActiveSessions()` completes.
1642
- *
1643
- * Persisted forward-followup seeds are loaded into the in-memory buffer at
1644
- * dispatcher startup (so root-linked clarifications can still pair with them
1645
- * while the WS is already receiving events), but any flush — timer expiry or
1646
- * immediate dispatch — waits for this barrier. Without it, `isSessionOwner`
1647
- * would always return false before sessions are rehydrated, routing thread
1648
- * replies through `handleNewTopic` and potentially duplicating sessions.
1649
- */
1650
- const sessionsReadyBarriers = new Map();
1651
- const sessionsReadyApps = new Set();
1652
- /** Mark a bot's active sessions as restored so pending forward-followup seeds can flush. */
1653
- export function markForwardFollowupsSessionsReady(larkAppId) {
1654
- sessionsReadyApps.add(larkAppId);
1655
- const barrier = sessionsReadyBarriers.get(larkAppId);
1656
- if (barrier)
1657
- barrier.resolve();
1658
- }
1659
- /**
1660
- * Best-effort plain-text extraction from a Lark message for routing-level
1661
- * decisions (currently: `/t` / `/topic` detection). Handles the two common
1662
- * shapes — `text` (`{"text": "..."}`) and `post` (zh_cn/en_us nested
1663
- * paragraphs of `text` / `at` nodes). Other types (image, file, sticker,
1664
- * interactive, …) return null so the caller falls through to the default
1665
- * routing path.
1666
- *
1667
- * Kept deliberately tiny rather than reusing parseEventMessage: the dispatcher
1668
- * runs on every inbound event and we only need a quick text peek before the
1669
- * permission gates / scope override; full parseEventMessage still runs once
1670
- * inside the chosen handler.
1671
- */
1672
- export function extractMessageTextForRouting(message) {
1673
- if (!message?.content)
1674
- return null;
1675
- try {
1676
- const obj = JSON.parse(message.content);
1677
- // text shape: {"text":"..."}. Lark stuffs placeholder keys like "@_user_1"
1678
- // into obj.text; the human name only lives in message.mentions[].name. We
1679
- // must resolve keys → @${name} so stripLeadingMentions can strip them
1680
- // before parseForceTopicInvocation sees the content. Mirrors the
1681
- // resolveMentions logic in parseEventMessage.
1682
- if (typeof obj?.text === 'string') {
1683
- let text = obj.text;
1684
- const mentions = message?.mentions;
1685
- if (Array.isArray(mentions)) {
1686
- for (const m of mentions) {
1687
- if (m?.key && m?.name) {
1688
- text = text.split(m.key).join(`@${m.name}`);
1689
- }
1690
- }
1691
- }
1692
- return text;
1693
- }
1694
- // post shape: {"zh_cn":{"content":[[{tag:"text",text:"..."},{tag:"at",...}]]}}
1695
- // Post messages keep @mentions as separate `at` nodes (not embedded in
1696
- // text), so the joined text-node content is already clean of placeholders.
1697
- const inner = obj?.zh_cn ?? obj?.en_us ?? obj;
1698
- if (Array.isArray(inner?.content)) {
1699
- const parts = [];
1700
- for (const para of inner.content) {
1701
- if (!Array.isArray(para))
1702
- continue;
1703
- for (const node of para) {
1704
- if (node?.tag === 'text' && typeof node.text === 'string') {
1705
- parts.push(node.text);
1706
- }
1707
- }
1708
- }
1709
- return parts.length > 0 ? parts.join('') : null;
1710
- }
1711
- }
1712
- catch { /* malformed content — skip */ }
1713
- return null;
1714
- }
1715
- /**
1716
- * If the inbound message starts with `/t` / `/topic` AND the routing
1717
- * currently lands on chat-scope, override to thread-scope anchored at
1718
- * the inbound message_id. This makes "force topic mode" work even when
1719
- * the bot already owns a chat-scope session in the chat — the dispatcher
1720
- * routes to handleNewTopic at a fresh anchor instead of falling into
1721
- * handleThreadReply on the chat-scope owner.
1722
- *
1723
- * Already-thread messages (real Lark 话题, p2p, 话题群) are left alone:
1724
- * the prefix is still stripped downstream by handleNewTopic.
1725
- */
1726
- export function maybeApplyForceTopicOverride(routing, message, messageId) {
1727
- if (routing.scope !== 'chat')
1728
- return false;
1729
- const rawText = extractMessageTextForRouting(message);
1730
- if (!rawText)
1731
- return false;
1732
- const stripped = stripLeadingMentions(rawText.trim(), message?.mentions ?? []);
1733
- if (!parseForceTopicInvocation(stripped))
1734
- return false;
1735
- routing.scope = 'thread';
1736
- routing.anchor = messageId;
1737
- return true;
1738
- }
1739
- async function maybeApplySharedTopicSeed(input) {
1740
- const { larkAppId, chatId, chatType, message, senderOpenId, messageId, routing, forceTopicApplied, } = input;
1741
- if (forceTopicApplied)
1742
- return undefined;
1743
- // This helper only seeds a shared reply topic. A message with both fields is
1744
- // already a reply inside a native thread; folding it would divert an owned
1745
- // thread session back into the group lobby and split one topic's context.
1746
- if (message?.root_id && message?.thread_id)
1747
- return undefined;
1748
- if (chatType !== 'group')
1749
- return undefined;
1750
- if (resolveRegularGroupMode(larkAppId, chatId) !== 'shared')
1751
- return undefined;
1752
- // Seeding a shared topic normally needs an @mention. But the 'never' and
1753
- // 'ambient' mention policies answer non-@ messages too — and in shared mode it
1754
- // must still OPEN a topic (reply in a thread reusing the chat session), not
1755
- // fall back to a flat top-level reply. So allow non-@ seeding under 'never'
1756
- // (unconditional) or 'ambient' — but for 'ambient' NOT when the message
1757
- // @mentions another specific member (person/bot) without @ing us: that is a
1758
- // redirect to someone else, so we back off (mentionsAnotherMember).
1759
- const seedMentionMode = resolveGroupMentionMode(larkAppId);
1760
- if (!isBotMentioned(larkAppId, message, senderOpenId)
1761
- && !(seedMentionMode === 'never'
1762
- || (seedMentionMode === 'ambient' && !mentionsAnotherMember(larkAppId, message))))
1763
- return undefined;
1764
- const freshMode = routing.scope === 'thread'
1765
- ? await getChatMode(larkAppId, chatId, { forceRefresh: true })
1766
- : (getCachedChatMode(larkAppId, chatId) ?? 'group');
1767
- if (freshMode !== 'group')
1768
- return undefined;
1769
- routing.scope = 'chat';
1770
- routing.anchor = chatId;
1771
- logger.info(`[reply-mode] shared turn msg=${messageId.substring(0, 12)} routes through chat=${chatId.substring(0, 12)}`);
1772
- return messageId;
1773
- }
1774
- async function maybeFoldMentionedRegularGroupThreadToChat(input) {
1775
- const { larkAppId, chatId, chatType, message, routing, forceTopicApplied, mentionedThisBot, ownsThreadSession } = input;
1776
- if (forceTopicApplied || ownsThreadSession)
1777
- return undefined;
1778
- if (!mentionedThisBot)
1779
- return undefined;
1780
- if (chatType !== 'group')
1781
- return undefined;
1782
- const rootId = message?.root_id;
1783
- const threadId = message?.thread_id;
1784
- if (!rootId || !threadId)
1785
- return undefined;
1786
- // A genuine native Lark topic is an explicit user-created context boundary,
1787
- // even when this bot first enters on a later reply rather than on the seed.
1788
- // In `chat-topic` mode that boundary is honored — don't fold it into the group
1789
- // lobby. chat / shared are documented to fold native topics into the group
1790
- // session, so they must fall through to the regular-group fold below.
1791
- // Synthetic/shared reply aliases do not use an omt_* thread id and always
1792
- // continue through the fold below regardless of mode.
1793
- if (threadId.startsWith('omt_') && resolveRegularGroupMode(larkAppId, chatId) === 'chat-topic')
1794
- return undefined;
1795
- const rawText = extractMessageTextForRouting(message);
1796
- if (rawText) {
1797
- const stripped = stripLeadingMentions(rawText.trim(), message?.mentions ?? []);
1798
- if (parseForceTopicInvocation(stripped))
1799
- return undefined;
1800
- }
1801
- // In a regular group, `chat` and `shared` both mean "use the group's one
1802
- // chat-scope session/context". Lark still reports replies inside an existing
1803
- // topic as root_id+thread_id, so decideRouting's generic real-thread rule
1804
- // would otherwise fork a brand-new thread-scope session every time another
1805
- // human/bot @mentions us inside that topic. Keep the visible reply in the
1806
- // same topic (replyRootId=rootId), but route the turn through the group
1807
- // chat-scope session. `new-topic` and `chat-topic` are the modes that
1808
- // intentionally keep per-topic independent sessions — they must NOT fold:
1809
- // new-topic forks every top-level @ too, while chat-topic keeps top level
1810
- // flat but lets each native Lark topic run its own session.
1811
- const mode = resolveRegularGroupMode(larkAppId, chatId);
1812
- if (mode === 'new-topic' || mode === 'chat-topic')
1813
- return undefined;
1814
- const freshMode = await getChatMode(larkAppId, chatId, { forceRefresh: true });
1815
- if (freshMode !== 'group')
1816
- return undefined;
1817
- routing.scope = 'chat';
1818
- routing.anchor = chatId;
1819
- logger.info(`[reply-mode] mentioned thread root=${rootId.substring(0, 12)} folds into chat=${chatId.substring(0, 12)}`);
1820
- return rootId;
1821
- }
1822
- function regularGroupRouting(larkAppId, messageId, chatId) {
1823
- // Only `new-topic` forks a fresh thread-scope session for a TOP-LEVEL @.
1824
- // `shared` stays chat-scope here (the topic fold happens post-routing, see
1825
- // maybeApplySharedTopicSeed); `chat` is flat top-level; `chat-topic` (the
1826
- // default) is also flat at top level (it only diverges for native topics,
1827
- // where the fold is skipped — see maybeFoldMentionedRegularGroupThreadToChat). resolveRegularGroupMode
1828
- // is the single decision point so the modes never both fire.
1829
- if (resolveRegularGroupMode(larkAppId, chatId) === 'new-topic') {
1830
- return { scope: 'thread', anchor: messageId, source: 'regular-group-thread' };
1831
- }
1832
- return { scope: 'chat', anchor: chatId, source: 'regular-group-chat' };
1833
- }
1834
- async function decideRoutingWithSource(larkAppId, message) {
1835
- const rootId = message.root_id;
1836
- const threadId = message.thread_id;
1837
- const chatType = message.chat_type ?? 'group';
1838
- const messageId = message.message_id;
1839
- const chatId = message.chat_id;
1840
- // 私聊 chat 模式(默认):整段 DM 一律折进同一个扁平 chat-scope 会话。必须先于
1841
- // 下面的 real-thread(root_id+thread_id)分支判断 —— 否则用户在 DM 里"回复某条
1842
- // 消息"形成的 thread 形态消息会被提前分流到 thread-scope,破坏"连续单聊会话"
1843
- // 语义(典型触发:thread→chat 模式切换后回复旧 thread,或 Lark 给 DM 回复塞了
1844
- // thread_id)。p2pMode 默认 'chat';只有显式 'thread' 才回到每条 DM 独立话题的
1845
- // 旧行为。群聊不受影响。
1846
- if (chatType === 'p2p' && getBot(larkAppId)?.config?.p2pMode !== 'thread') {
1847
- return { scope: 'chat', anchor: chatId, source: 'p2p' };
1848
- }
1849
- if (rootId && threadId)
1850
- return { scope: 'thread', anchor: rootId, source: 'real-thread' };
1851
- // 私聊 thread 模式(显式 opt-out):每条 top-level DM 都视为新话题 — 跟话题群
1852
- // 同款,匹配 Lark DM 的话题化行为,把 1:1 对话按消息拆成独立 CLI 进程。
1853
- if (chatType === 'p2p') {
1854
- return { scope: 'thread', anchor: messageId, source: 'p2p' };
1855
- }
1856
- // Group chat — fetch chat_mode (cached) to disambiguate 话题群 from 普通群.
1857
- const mode = await getChatMode(larkAppId, chatId);
1858
- if (mode === 'topic') {
1859
- return { scope: 'thread', anchor: messageId, source: 'topic-chat' };
1860
- }
1861
- // A native topic root in a regular group carries thread_id=omt_* but no
1862
- // root_id. In `chat-topic` mode (顶层平铺连续会话;群内原生话题各自独立会话)
1863
- // this seed must start its own thread-scope session instead of folding into
1864
- // the group lobby — otherwise the topic's opening message lands in the shared
1865
- // chat session and only later replies (which carry root_id and hit the
1866
- // real-thread branch above) isolate, breaking chat-topic's own contract.
1867
- //
1868
- // Gated on `chat-topic` ONLY, by design (遵循 /reply-mode 配置):
1869
- // • chat / shared — documented to fold native topics into the group session
1870
- // (see /reply-mode help); must NOT isolate here.
1871
- // • new-topic — regularGroupRouting already returns thread-scope anchored
1872
- // at messageId for top-level messages, with the correct
1873
- // source=regular-group-thread; letting it fall through keeps
1874
- // that source (and its downstream summary/forward semantics).
1875
- // Keep this after the topic-chat check so 话题群 seeds retain source=topic-chat
1876
- // (and therefore autoStartOnNewTopic semantics).
1877
- if (threadId?.startsWith('omt_') && resolveRegularGroupMode(larkAppId, chatId) === 'chat-topic') {
1878
- return { scope: 'thread', anchor: messageId, source: 'real-thread' };
1879
- }
1880
- return regularGroupRouting(larkAppId, messageId, chatId);
1881
- }
1882
- export async function decideRouting(larkAppId, message) {
1883
- const { scope, anchor } = await decideRoutingWithSource(larkAppId, message);
1884
- return { scope, anchor };
1885
- }
1886
- async function classifySummaryChatKind(input) {
1887
- if (input.routingSource === 'topic-chat')
1888
- return 'topic';
1889
- if (input.routingSource === 'regular-group-chat' || input.routingSource === 'regular-group-thread')
1890
- return 'regularGroup';
1891
- // Real thread replies can occur in topic groups and in regular groups that
1892
- // use threaded replies. Ask Lark for the current chat mode only for explicit
1893
- // /summary so normal routing does not pay this extra lookup.
1894
- if (input.routingSource === 'real-thread') {
1895
- const mode = await getChatMode(input.larkAppId, input.chatId, { forceRefresh: true });
1896
- return mode === 'topic' ? 'topic' : 'regularGroup';
1897
- }
1898
- return undefined;
1899
- }
1900
- const SUMMARY_COMMAND_RE = /^\/summary(?:\s|$)/i;
1901
- function summaryCommandText(message) {
1902
- const text = extractMessageTextForRouting(message);
1903
- if (!text)
1904
- return undefined;
1905
- const stripped = stripLeadingMentions(text.trim(), message?.mentions ?? []).trim();
1906
- return SUMMARY_COMMAND_RE.test(stripped) ? stripped : undefined;
1907
- }
1908
- async function resolveSummaryCommandMatch(input) {
1909
- if (input.chatType !== 'group')
1910
- return undefined;
1911
- if (!isBotMentioned(input.larkAppId, input.message, input.senderOpenId))
1912
- return undefined;
1913
- const triggerText = summaryCommandText(input.message);
1914
- if (!triggerText)
1915
- return undefined;
1916
- const chatKind = await classifySummaryChatKind(input);
1917
- if (!chatKind)
1918
- return undefined;
1919
- const botConfig = getBot(input.larkAppId).config;
1920
- return {
1921
- chatKind,
1922
- triggerText,
1923
- range: summaryRangeFromBotConfig(botConfig),
1924
- prompt: DEFAULT_SUMMARY_PROMPT,
1925
- summaryMemory: botConfig.summaryMemory === true,
1926
- summaryMemoryPath: typeof botConfig.summaryMemoryPath === 'string' && botConfig.summaryMemoryPath.trim()
1927
- ? botConfig.summaryMemoryPath.trim()
1928
- : 'summary.md',
1929
- };
1930
- }
1931
- /** 从评论事件 payload 里挖出 { fileToken, fileType, commentId, replyId,
1932
- * noticeType, isMentioned, operatorOpenId }。
1933
- *
1934
- * 真机实测 drive.notice.comment_add_v1 的 event 体形如
1935
- * `{ comment_id, is_mentioned, notice_meta, reply_id }` —— **file_token 不在顶层,
1936
- * 藏在 notice_meta 里**(notice_meta 可能是对象或 JSON 字符串)。故这里展开
1937
- * notice_meta 并多路径兜底;file_type 拿不到无妨(后续用订阅表里的)。 */
1938
- function parseCommentEvent(data) {
1939
- const d = data?.event ?? data ?? {};
1940
- let meta = d.notice_meta ?? d.noticeMeta;
1941
- if (typeof meta === 'string') {
1942
- try {
1943
- meta = JSON.parse(meta);
1944
- }
1945
- catch { /* 保留原字符串 */ }
1946
- }
1947
- const m = (meta && typeof meta === 'object') ? meta : {};
1948
- const pick = (k) => d[k] ?? m[k] ?? m[k.replace(/_([a-z])/g, (_, c) => c.toUpperCase())];
1949
- return {
1950
- fileToken: pick('file_token') ?? pick('token') ?? pick('obj_token'),
1951
- fileType: pick('file_type') ?? pick('obj_type'),
1952
- commentId: pick('comment_id'),
1953
- replyId: pick('reply_id'),
1954
- noticeType: pick('notice_type'),
1955
- isMentioned: d.is_mentioned === true || m.is_mentioned === true,
1956
- operatorOpenId: d.operator_id?.open_id ?? d.user_id?.open_id ?? m.operator_id?.open_id,
1957
- meta,
1958
- };
1959
- }
1960
- /** 评论事件入口:去重 ACK-safe 包装 + 订阅匹配 + 自触发/触发范围过滤后转 daemon。 */
1961
- function handleCommentEventAckSafe(data, larkAppId, handlers) {
1962
- const parsed = parseCommentEvent(data);
1963
- const eventKey = `drive.comment_add:${larkAppId}:${eventIdForKey(data) ?? `${parsed.fileToken ?? '?'}:${parsed.replyId ?? parsed.commentId ?? '?'}`}`;
1964
- scheduleAckSafeEvent(eventKey, async () => {
1965
- try {
1966
- await processCommentEvent(parsed, larkAppId, handlers);
1967
- }
1968
- catch (err) {
1969
- logger.error(`Error handling doc-comment event: ${err}`);
1970
- }
1971
- }, 'doc-comment event');
1972
- }
1973
- function handleVcMeetingPushEventAckSafe(data, larkAppId, handlers, kind, eventType) {
1974
- const parsed = parseVcMeetingPushEvent({ data, larkAppId, kind, eventType });
1975
- const eventKey = `${eventType}:${larkAppId}:${parsed.eventId ?? unkeyableEventKey()}`;
1976
- scheduleAckSafeEvent(eventKey, async () => {
1977
- if (!handlers.handleVcMeetingPush) {
1978
- logger.info(`[vc-agent] ${eventType} ignored: daemon has no VC meeting handler`);
1979
- return;
1980
- }
1981
- await handlers.handleVcMeetingPush(parsed);
1982
- }, `vc-meeting ${kind} event`);
1983
- }
1984
- async function processCommentEvent(parsed, larkAppId, handlers) {
1985
- if (!handlers.handleDocComment)
1986
- return;
1987
- const { fileToken, commentId } = parsed;
1988
- if (!fileToken || !commentId) {
1989
- logger.info(`[doc-comment] event dropped: missing fileToken/commentId (fileToken=${fileToken ?? '?'} commentId=${commentId ?? '?'}) — payload 字段路径可能与解析不符`);
1990
- return;
1991
- }
1992
- // 1) 查订阅表;未订阅的文档 @bot 时自动创建 mention-only 订阅(任何人都可以
1993
- // 通过在文档里 @bot 触发 bot 回复,不需要 owner 预先订阅。/watch-comment 命令
1994
- // 管理持久订阅才需要 owner 权限)。
1995
- // 注意:auto-sub 先创建占位,但如果后续审计硬门失败会回滚(非 owner 触发
1996
- // 且通知 owner 失败时不允许留下订阅记录)。
1997
- let sub = getDocSubscription(config.session.dataDir, larkAppId, fileToken);
1998
- let autoCreatedSub = false;
1999
- if (!sub) {
2000
- const operatorOpenId = parsed.operatorOpenId;
2001
- const botCfg = getBot(larkAppId).config;
2002
- const mappedDir = botCfg.docRepoMap?.[fileToken];
2003
- const autoSub = {
2004
- fileToken,
2005
- fileType: parsed.fileType || 'docx',
2006
- sessionAnchor: `doc:${fileToken}`,
2007
- sessionId: undefined,
2008
- scope: 'chat',
2009
- chatId: `doc:${fileToken}`,
2010
- commentTriggerMode: 'mention-only',
2011
- managedBy: 'watch-comment',
2012
- ownerOpenId: operatorOpenId || getOwnerOpenId(larkAppId),
2013
- workingDir: mappedDir,
2014
- createdAt: Date.now(),
2015
- };
2016
- putDocSubscription(config.session.dataDir, larkAppId, autoSub);
2017
- sub = autoSub;
2018
- autoCreatedSub = true;
2019
- logger.info(`[doc-comment] auto-subscribed file=${fileToken.slice(0, 12)} by @mention (mention-only${mappedDir ? `, wd=${mappedDir}` : ''}, anchor=doc:${fileToken.slice(0, 12)}, requester=${operatorOpenId?.slice(0, 12) || '?'})`);
2020
- }
2021
- // 关掉 open_id 启动竞态:probeBotOpenId 在启动时 fire-and-forget,若评论事件
2022
- // 在该窗口内到达,下面 mention-only 闸 / 自触发过滤会拿到 undefined 的 botOpenId
2023
- // → 合法的 @bot 评论被误丢(事件已被 ACK,飞书不会重投,@ 永久丢失)。await
2024
- // 去重后的探针把 open_id 补齐;探针失败则降级(心跳会重试)。
2025
- await ensureBotOpenId(larkAppId).catch(() => { });
2026
- // 2) 拉评论 thread 取权威正文 / 作者 / @ 列表(事件 payload 不保证带全),
2027
- // 同时用最新一条回复作为"触发回复"。
2028
- const comment = await getDocComment(larkAppId, { fileToken, fileType: sub.fileType }, commentId);
2029
- if (!comment || comment.replies.length === 0) {
2030
- logger.info(`[doc-comment] event dropped: 取不到评论内容 comment=${commentId.slice(0, 12)}(replies=${comment ? comment.replies.length : 'null'})`);
2031
- return;
2032
- }
2033
- const trigger = parsed.replyId
2034
- ? comment.replies.find(r => r.replyId === parsed.replyId) ?? comment.replies[comment.replies.length - 1]
2035
- : comment.replies[comment.replies.length - 1];
2036
- const triggerIndex = Math.max(0, comment.replies.indexOf(trigger));
2037
- // 3) 自触发过滤(防死循环):bot 的回复可能以应用身份(作者=bot open_id)或回退
2038
- // 用户身份(作者=授权用户,无法靠作者区分)发出。三重保险:①作者==本 bot
2039
- // ②reply_id 在 bot 创建集合 ③文本含隐形哨兵。任一命中即跳过。
2040
- const selfBotOpenId = getBot(larkAppId).botOpenId;
2041
- if ((selfBotOpenId && trigger.userId === selfBotOpenId) || isBotAuthoredReply(trigger.replyId) || hasBotSentinel(trigger.text))
2042
- return;
2043
- // 4) 触发范围闸(mention-only 仅当评论真的 @ 了本 bot 才触发)。
2044
- // ⚠️ 必须以拉到的评论正文 @person(open_id) 列表为准,不能信事件自带的
2045
- // `is_mentioned`——它表示「评论里存在任意 @」,@ 别人时也是 true,曾导致
2046
- // 「@ 同事的评论也被误触发」。详见 commentTriggerAllowed 注释。
2047
- if (!commentTriggerAllowed(sub.commentTriggerMode, trigger.mentions, selfBotOpenId)) {
2048
- logger.info(`[doc-comment] event dropped: mention-only 但未 @ 本 bot (comment=${commentId.slice(0, 12)} isMentioned=${parsed.isMentioned} mentions=${trigger.mentions.length} self=${selfBotOpenId ? selfBotOpenId.slice(0, 10) : '?'})`);
2049
- return;
2050
- }
2051
- const text = trigger.text.trim();
2052
- if (!text)
2053
- return;
2054
- // 审计硬门:非 owner @bot 触发时,必须成功通知 owner 才允许回复。
2055
- // 通知失败 = owner 无法感知 = 越权,直接拒绝响应并回滚 auto-sub。
2056
- // (owner 自己触发的不通知,直接放行。)
2057
- const ownerOpenId = getOwnerOpenId(larkAppId);
2058
- const requesterOpenId = parsed.operatorOpenId;
2059
- const isOwnerTrigger = ownerOpenId && requesterOpenId && requesterOpenId === ownerOpenId;
2060
- if (!isOwnerTrigger) {
2061
- const rollbackAutoSub = () => { if (autoCreatedSub)
2062
- removeDocSubscription(config.session.dataDir, larkAppId, fileToken); };
2063
- if (!ownerOpenId) {
2064
- logger.warn(`[doc-comment] non-owner @mention but no ownerOpenId configured — rejecting (audit gate) file=${fileToken.slice(0, 12)} requester=${requesterOpenId?.slice(0, 12) || '?'}`);
2065
- rollbackAutoSub();
2066
- return;
2067
- }
2068
- try {
2069
- const loc = localeForBot(larkAppId);
2070
- const requesterName = requesterOpenId?.slice(0, 12) || '?';
2071
- const notifyText = [
2072
- t('daemon.doc_mention_notify_title', undefined, loc),
2073
- '',
2074
- t('daemon.doc_mention_notify_body', { requester: requesterName, token: fileToken.slice(0, 12) }, loc),
2075
- '',
2076
- `📄 \`${fileToken}\``,
2077
- `💬 ${text.slice(0, 200)}${text.length > 200 ? '…' : ''}`,
2078
- ].join('\n');
2079
- await sendUserMessage(larkAppId, ownerOpenId, notifyText);
2080
- }
2081
- catch (e) {
2082
- logger.warn(`[doc-comment] non-owner @mention but owner notification failed — rejecting (audit gate) file=${fileToken.slice(0, 12)} requester=${requesterOpenId?.slice(0, 12) || '?'} err=${e instanceof Error ? e.message : String(e)}`);
2083
- rollbackAutoSub();
2084
- return;
2085
- }
2086
- }
2087
- logger.info(`[doc-comment] dispatch file=${fileToken.slice(0, 12)} comment=${commentId.slice(0, 12)} mode=${sub.commentTriggerMode} → session anchor=${sub.sessionAnchor.slice(0, 12)}`);
2088
- await handlers.handleDocComment({
2089
- larkAppId,
2090
- sub,
2091
- commentId,
2092
- replyId: trigger.replyId || commentId,
2093
- text,
2094
- selectedText: comment.quote,
2095
- priorReplies: comment.replies.slice(0, triggerIndex).map(reply => ({
2096
- authorOpenId: reply.userId,
2097
- text: reply.text.replaceAll(BOT_REPLY_SENTINEL, '').trim(),
2098
- })).filter(reply => reply.text.length > 0),
2099
- isWhole: comment.isWhole,
2100
- authorOpenId: trigger.userId,
2101
- });
2102
- }
2103
- const LARK_WS_PROXY_ENV_KEYS = [
2104
- 'npm_config_https_proxy',
2105
- 'NPM_CONFIG_HTTPS_PROXY',
2106
- 'https_proxy',
2107
- 'HTTPS_PROXY',
2108
- 'npm_config_proxy',
2109
- 'NPM_CONFIG_PROXY',
2110
- 'all_proxy',
2111
- 'ALL_PROXY',
2112
- ];
2113
- function createLarkWsAgent() {
2114
- const hasSecureProxy = LARK_WS_PROXY_ENV_KEYS.some(key => process.env[key]?.trim());
2115
- if (!hasSecureProxy)
2116
- return undefined;
2117
- const agent = new ProxyAgent();
2118
- const resolveEnvProxy = agent.getProxyForUrl;
2119
- agent.getProxyForUrl = (url, req) => {
2120
- const target = new URL(url);
2121
- if (target.protocol === 'wss:')
2122
- target.protocol = 'https:';
2123
- else if (target.protocol === 'ws:')
2124
- target.protocol = 'http:';
2125
- return resolveEnvProxy(target.href, req);
2126
- };
2127
- return agent;
2128
- }
2129
- /**
2130
- * Create and start the Lark WSClient with event dispatching.
2131
- * Returns the WSClient instance for lifecycle management.
2132
- */
2133
- export function startLarkEventDispatcher(larkAppId, larkAppSecret, handlers, brand = 'feishu') {
2134
- const forwardFollowups = new ForwardFollowupBuffer(config.daemon.forwardFollowupWaitMs, err => logger.error(`Error flushing delayed topic seed: ${err}`));
2135
- // Barrier that resolves once restoreActiveSessions() completes. Flushes wait
2136
- // on it so isSessionOwner reads the populated activeSessions map. If the app
2137
- // was already marked ready (e.g. tests or a restart within the same process),
2138
- // resolve immediately.
2139
- let resolveSessionsReady;
2140
- const sessionsReady = new Promise(resolve => { resolveSessionsReady = resolve; });
2141
- if (sessionsReadyApps.has(larkAppId))
2142
- resolveSessionsReady();
2143
- sessionsReadyBarriers.set(larkAppId, { promise: sessionsReady, resolve: resolveSessionsReady });
2144
- const dispatchHumanMessage = async (payload) => {
2145
- await dispatchHumanMessageViaHandlers(larkAppId, handlers, payload);
2146
- };
2147
- const dispatchPersistedForwardFollowup = async (seedMessageId, payload) => {
2148
- // Wait for activeSessions to be rehydrated before checking ownership, so a
2149
- // thread reply isn't misrouted to handleNewTopic during daemon startup.
2150
- await sessionsReady;
2151
- await dispatchHumanMessage(payload);
2152
- removeForwardFollowup(larkAppId, seedMessageId);
2153
- };
2154
- // Load persisted seeds into the buffer immediately so root-linked
2155
- // clarifications can pair with them while the WS is already receiving
2156
- // events. Flushes (timer expiry or immediate) wait on sessionsReady above.
2157
- for (const record of listForwardFollowups(larkAppId)) {
2158
- const senderOpenId = record.payload?.data?.sender?.sender_id?.open_id;
2159
- const chatId = record.payload?.ctx?.chatId;
2160
- if (!senderOpenId || !chatId || !record.payload?.ctx?.anchor) {
2161
- removeForwardFollowup(larkAppId, record.messageId);
2162
- continue;
2163
- }
2164
- const flush = (payload) => dispatchPersistedForwardFollowup(record.messageId, payload);
2165
- const remainingMs = record.dueAt - Date.now();
2166
- const isUnpairedSeed = !record.payload.ctx.forwardSeedData;
2167
- const delayStillEnabled = usesForwardFollowupDelay(resolveGroupMentionMode(larkAppId));
2168
- if (isUnpairedSeed && delayStillEnabled && remainingMs > 0 && forwardFollowups.hold({
2169
- larkAppId,
2170
- chatId,
2171
- senderOpenId,
2172
- messageId: record.messageId,
2173
- payload: record.payload,
2174
- flush,
2175
- }, remainingMs)) {
2176
- logger.info(`[forward-followup] restored pending seed=${record.messageId.substring(0, 12)} remaining=${remainingMs}ms`);
2177
- }
2178
- else {
2179
- void flush(record.payload).catch(err => logger.error(`Error restoring delayed topic seed: ${err}`));
2180
- }
2181
- }
2182
- const seedRoutingGates = new Map();
2183
- const registerSeedRoutingGate = (messageId) => {
2184
- let resolveReady;
2185
- const ready = new Promise(resolve => { resolveReady = resolve; });
2186
- let completed = false;
2187
- const gate = {
2188
- ready,
2189
- complete: () => {
2190
- if (completed)
2191
- return;
2192
- completed = true;
2193
- resolveReady();
2194
- setTimeout(() => {
2195
- if (seedRoutingGates.get(messageId) === gate)
2196
- seedRoutingGates.delete(messageId);
2197
- }, config.daemon.forwardFollowupWaitMs);
2198
- },
2199
- };
2200
- seedRoutingGates.set(messageId, gate);
2201
- return gate;
2202
- };
2203
- async function processMessageEvent(data, seedRoutingGate) {
2204
- try {
2205
- const message = data.message;
2206
- const sender = data.sender;
2207
- if (!message)
2208
- return;
2209
- // Close the open_id startup race: probeBotOpenId is fire-and-forget at
2210
- // startup, so an @ arriving in that window would hit isBotMentioned with
2211
- // an undefined botOpenId and be silently dropped (the WSClient still ACKs
2212
- // it, so Lark never redelivers → the @ is lost). Await the deduped probe
2213
- // so the @ is recognized. Best-effort: on probe failure we degrade to the
2214
- // prior behavior (the periodic heartbeat retries the probe).
2215
- await ensureBotOpenId(larkAppId).catch(() => { });
2216
- // Learn other bots' open_ids from @mentions in this event.
2217
- // Lark open_id is per-app: these IDs are correct for our app context.
2218
- if (message.mentions?.length > 0) {
2219
- updateBotOpenIdCrossRef(config.session.dataDir, larkAppId, message.mentions);
2220
- // Learn our OWN union_id from any @ of ourselves: Lark stamps every
2221
- // mention with the target's union_id, and mention-driven delivery
2222
- // works even where the self-message echo never arrives(无 receive-all
2223
- // scope 的应用收不到自己发的消息;bot-only 大厅实测完全不推事件)。
2224
- if (recordBotUnionIdFromMentions(config.session.dataDir, larkAppId, getBot(larkAppId).botOpenId, message.mentions)) {
2225
- logger.info(`[${larkAppId}] learned own bot union_id from @mention`);
2226
- }
2227
- }
2228
- const chatId = message.chat_id;
2229
- const chatType = (message.chat_type === 'p2p' ? 'p2p' : 'group');
2230
- const messageId = message.message_id;
2231
- // Bot-originated messages — bots historically only post inside threads
2232
- // (their own thread replies). With chat-scope sessions a bot can also
2233
- // post top-level (its first reply in a chat-scope group), so we still
2234
- // route them through `decideRouting` rather than gating on root_id.
2235
- //
2236
- // 飞书在跨 bot 卡片消息场景实测会把发送方标成 sender_type='bot'(不是
2237
- // 文档里写的 'app'),所以这里两个值都接受,否则那条路径会落到下面的
2238
- // user-message 通用分支,绕开 /close self-message 特判、foreign-bot
2239
- // chat-scope gate(isKnownPeerBot)和"Bot-to-bot @mention detected"
2240
- // 日志。
2241
- const senderType = sender?.sender_type;
2242
- const isBotSenderType = senderType === 'app' || senderType === 'bot';
2243
- if (isBotSenderType) {
2244
- const senderOpenId = sender.sender_id?.open_id ?? sender.sender_id?.app_id;
2245
- // When Feishu gave us only an app_id (no open_id), this bot sender's
2246
- // identity is not in the open_id domain the listener filters use, so
2247
- // the matcher must fail closed on open_id-based exclusion. Realtime
2248
- // events normally carry open_id; the app_id fallback is the rare case.
2249
- const senderIdentityUnverified = !sender.sender_id?.open_id && !!sender.sender_id?.app_id;
2250
- const isSelfMessage = senderOpenId === getBot(larkAppId).botOpenId;
2251
- // Self messages: learn our OWN union_id from the echo first (the only
2252
- // reliable source — see bot-union-ids-store; reported to the platform
2253
- // on heartbeat for the team roster), then only echoed `/close` matters.
2254
- if (isSelfMessage) {
2255
- const selfUnionId = sender.sender_id?.union_id;
2256
- if (selfUnionId && recordBotUnionId(config.session.dataDir, larkAppId, selfUnionId)) {
2257
- logger.info(`[${larkAppId}] learned own bot union_id from self-message echo`);
2258
- }
2259
- try {
2260
- const body = JSON.parse(message.content ?? '{}');
2261
- if (body.text?.trim() !== '/close')
2262
- return;
2263
- }
2264
- catch {
2265
- return;
2266
- }
2267
- const ctx = await decideRouting(larkAppId, message);
2268
- // Serialize per anchor so back-to-back messages to the same thread
2269
- // (e.g. dispatch's /repo prime + brief kickoff) don't interleave with
2270
- // the first's async session-spawn. See anchor-serializer.ts.
2271
- await serializeByAnchor(ctx.anchor, () => handlers.handleThreadReply(data, { ...ctx, chatId, messageId, chatType, larkAppId }))
2272
- .catch(err => logger.error(`Error handling message event: ${err}`));
2273
- return;
2274
- }
2275
- // Learn teammate identity from team-assembled groups (the trust root):
2276
- // any bot talking in a 拉群 group is a vouched teammate, so capture its
2277
- // tenant-stable union_id — we then honour it as a teammate in ANY chat
2278
- // (see team-bots-store). Done BEFORE the @mention gate so even a non-@
2279
- // message in a team group teaches us the teammate. Cheap + idempotent.
2280
- const senderUnionId = sender.sender_id?.union_id;
2281
- if (senderUnionId && isTeamGroupChat(config.session.dataDir, chatId)) {
2282
- recordTeamBot(config.session.dataDir, { unionId: senderUnionId });
2283
- }
2284
- // 机器人大厅:bot 消息只用于身份登记(上面已学 sender union / mentions
2285
- // 自学 / cross-ref),绝不当任务路由——大厅打卡会点名 @ 同伴,不吞掉的话
2286
- // 接收 bot 会把打卡当任务拉起会话在大厅里回话(实测)。只吞 bot 发送方:
2287
- // 人类经隐藏入口进大厅后 @ bot 仍正常应答。
2288
- if (isPlatformHallChat(config.session.dataDir, chatId)) {
2289
- // 回执互教:打卡者点名了我们且带 #hall-echo(= 它还没学到自己的
2290
- // union_id)→ @ 回它一次。open_id 直接取事件 sender_id(本 app 视角,
2291
- // 无需 cross-ref),打卡者从回执的 mentions[] 学到自己。每进程每发送者
2292
- // 只回一次;回执不带标记,链路必然终止。
2293
- try {
2294
- const text = JSON.parse(message.content ?? '{}')?.text;
2295
- if (typeof text === 'string' && text.includes('#hall-echo') && senderOpenId &&
2296
- isBotMentioned(larkAppId, message, undefined) &&
2297
- !hallEchoReplied.has(`${larkAppId}::${senderOpenId}`)) {
2298
- hallEchoReplied.add(`${larkAppId}::${senderOpenId}`);
2299
- void sendMessage(larkAppId, chatId, `<at user_id="${senderOpenId}"></at> 已登记`, 'text')
2300
- .then(() => logger.info(`[${larkAppId}] hall echo reply sent to ${senderOpenId.substring(0, 12)}`))
2301
- .catch((e) => logger.warn(`[${larkAppId}] hall echo reply failed: ${e.message}`));
2302
- }
2303
- }
2304
- catch { /* content 非 JSON → 忽略 */ }
2305
- logger.debug(`[${larkAppId}] hall bot message swallowed after learning (chat=${chatId.substring(0, 12)})`);
2306
- return;
2307
- }
2308
- const botMessageListener = chatType === 'group'
2309
- ? evaluateMessageListener({
2310
- bot: getBot(larkAppId),
2311
- chatId,
2312
- message,
2313
- senderOpenId,
2314
- senderTypeRaw: sender?.sender_type,
2315
- senderIdentityUnverified,
2316
- explicitlyMentionedThisBot: isBotMentioned(larkAppId, message, senderOpenId),
2317
- })
2318
- : undefined;
2319
- if (botMessageListener) {
2320
- logger.info(`[message-listener:${larkAppId}] matched bot-sender chat=${chatId.substring(0, 12)} ` +
2321
- `msg=${messageId.substring(0, 12)} sender=${senderOpenId?.substring(0, 12) ?? '-'}`);
2322
- await dispatchHumanMessage(listenerRoutingContext({
2323
- data,
2324
- match: botMessageListener,
2325
- chatId,
2326
- messageId,
2327
- chatType,
2328
- larkAppId,
2329
- })).catch(err => logger.error(`Error handling bot message listener event: ${err}`));
2330
- return;
2331
- }
2332
- // Foreign bot: only route on @mention of us — with one exception.
2333
- //
2334
- // 主动开工 — 场景② (bot sender): 「话题群新话题自动开工」(autoStartOnNewTopic)
2335
- // 覆盖到「其他机器人开的新话题」。人分支在 3271 对非 @ 的话题群新话题种子做
2336
- // 同一判定;bot 消息走本分支,若不在这里补一个等价出口,就会在下面这行 return
2337
- // 掉——所以 bot 开的新话题永远到不了人分支的场景②。判定复用同一个纯函数
2338
- // shouldAutoStartOnNewTopic(形态门:thread-scope + anchor===本消息 + 无会话
2339
- // 占用,天然只认「全新话题种子」,不认话题内回复,故不会自我循环——回复锚定在
2340
- // 话题根 anchor≠messageId),并要求飞书真的把这条非 @ 的 bot 消息推过来
2341
- //(依赖 im:message.group_msg.include_bot:read scope;缺则事件根本不到,静默降级)。
2342
- // sender 受授权门约束(与人分支 + 下游 enforceMessageQuotaForCliInput 同源):
2343
- // 授权/peer/团队/oncall/开放腿放行的 sender 才自动开工,restricted 下未授权陌生
2344
- // bot 改发授权卡(详见下方 autoTopic 分支)。
2345
- //
2346
- // 收到 im:message.group_msg.include_bot:read 推来的「其他用户/机器人发的群消息」后,
2347
- // 只有满足形态门才免 @ 自动开工;否则保持原有「未 @ 即忽略」语义。
2348
- if (!isBotMentioned(larkAppId, message, undefined)) {
2349
- if (getBot(larkAppId).config.autoStartOnNewTopic === true && chatType === 'group') {
2350
- const seedDecision = await decideRoutingWithSource(larkAppId, message);
2351
- // P3 — 镜像人分支「话题群 → 普通群 (reverse conversion)」那道 forceRefresh
2352
- // 守卫:decideRoutingWithSource 判 topic-chat 种子靠的是**缓存** chat_mode
2353
- //(5min TTL)。管理员把话题群翻回普通群后缓存可能仍是 'topic',于是一条本该
2354
- // 是普通群顶层的 bot 消息被误判成话题种子,起 thread-scope 会话把回复裹进
2355
- //「其实已是普通群」的新 Lark 话题。无真实 thread_id(= 种子形态,非既有话题内
2356
- // 回复,权威信号不会 stale)时用 forceRefresh 再确认;飞书现在报 'group' 就当
2357
- // 它不是话题种子(降级),不自动开工。这道 API 往返只落在「已呈现 topic 种子
2358
- // 形态的 opt-in 候选」上——与人分支同样的成本取舍(宁可多一次调用,也不用
2359
- // 一个 5min 错建 session 的窗口换省一次调用)。
2360
- let seedIsTopicChat = seedDecision.source === 'topic-chat';
2361
- if (seedIsTopicChat && !message.thread_id) {
2362
- const freshMode = await getChatMode(larkAppId, chatId, { forceRefresh: true });
2363
- if (freshMode === 'group') {
2364
- logger.info(`[chat-mode-converted] ${chatId.substring(0, 12)} chat_mode flipped 'topic' → 'group'; ` +
2365
- `跳过 bot 新话题自动开工 msg=${messageId.substring(0, 12)}`);
2366
- seedIsTopicChat = false;
2367
- }
2368
- }
2369
- // 与人分支同源:只有真正的话题群顶层种子(source==='topic-chat' 且经 forceRefresh
2370
- // 复核仍是话题群)才是自动开工候选;普通群 /t / 新话题模式产生的同形
2371
- // {thread, anchor=msg} 不算。
2372
- const seedScope = seedIsTopicChat ? seedDecision.scope : 'chat';
2373
- const seedAnchor = seedIsTopicChat ? seedDecision.anchor : chatId;
2374
- const seedOwnsSession = seedScope === 'thread'
2375
- ? (handlers.isSessionOwner?.(seedAnchor, larkAppId) ?? false)
2376
- : false;
2377
- const autoTopic = shouldAutoStartOnNewTopic({
2378
- enabled: true,
2379
- scope: seedScope,
2380
- anchor: seedAnchor,
2381
- messageId,
2382
- chatType,
2383
- ownsSession: seedOwnsSession,
2384
- });
2385
- // Sender 授权门(与人分支 + 下游 enforceMessageQuotaForCliInput 一致):
2386
- // 自动开工最终仍要经 handleNewTopic 里的 enforceMessageQuotaForCliInput →
2387
- // evaluateBotTalk 复查,restricted 模式(配了 allowlist)下未授权的陌生 bot
2388
- // 会在那里被静默 drop、session 根本不建。所以在这里**先判同一个谓词**:
2389
- // • allowed → 正常免 @ 自动开工(open 模式 / oncall / 整群授权 / peer /
2390
- // 团队 bot 等任一放行腿命中,与人/下游同源)。
2391
- // • !allowed(restricted 下的陌生 bot)→ 不建 session,改发一次授权申请卡
2392
- // 给 owner(节流复用 maybeSendGrantRequestCard 内的 isThrottled),让
2393
- // owner 决定是否把它加进 allowlist——与人分支 @bot 被挡时的 not_allowed
2394
- // 体验一致、可发现,而不是静默吞掉。
2395
- // 只在「真未授权」发卡;已授权但额度耗尽是另一回事(走下游 quota exhausted
2396
- // 语义),不在这里混。授权卡的申请对象是触发 bot 的 open_id,但审批/操作权限
2397
- // 仍只归 owner;此刻不建 session,绝不把触发 bot 写成 owner,也不 --mention-back
2398
- // 回唤它(dispatchHumanMessage 那条才建 session,本分支只发卡后 return)。
2399
- if (autoTopic) {
2400
- const seedBotTalk = evaluateBotTalk(larkAppId, chatId, senderOpenId, senderUnionId);
2401
- if (!seedBotTalk.allowed) {
2402
- logger.info(`[auto-start:新话题] ${chatId.substring(0, 12)} 其他机器人开新话题但未授权(restricted)→ 发授权卡不自动开工 ` +
2403
- `msg=${messageId.substring(0, 12)} sender=${senderOpenId?.substring(0, 12) ?? '-'}`);
2404
- await maybeSendGrantRequestCard(larkAppId, message, chatId, senderOpenId, data)
2405
- .catch(err => logger.error(`Error sending grant card for foreign-bot new topic: ${err}`));
2406
- return;
2407
- }
2408
- logger.info(`[auto-start:新话题] ${chatId.substring(0, 12)} 其他机器人开新话题免@自动开工 ` +
2409
- `msg=${messageId.substring(0, 12)} sender=${senderOpenId?.substring(0, 12) ?? '-'} reason=${seedBotTalk.reason}`);
2410
- const seedCtx = { chatId, messageId, chatType, larkAppId, scope: seedScope, anchor: seedAnchor };
2411
- await dispatchHumanMessage({ data, ctx: seedCtx, ownsSession: false })
2412
- .catch(err => logger.error(`Error auto-starting on foreign-bot new topic: ${err}`));
2413
- return;
2414
- }
2415
- }
2416
- return;
2417
- }
2418
- const decision = await decideRoutingWithSource(larkAppId, message);
2419
- const ctx = { scope: decision.scope, anchor: decision.anchor };
2420
- // Honor `/t` / `/topic` from bot senders too, aligning with the human
2421
- // path so an explicit `@bot /t …` handoff seeds a fresh topic instead of
2422
- // sticking to chat-scope. Applied BEFORE the gate (and the shared-topic
2423
- // fold) so vetting keys on the FINAL routing: `/t` rewrites ctx to a
2424
- // brand-new {thread, messageId} anchor. forceTopicApplied also suppresses
2425
- // the shared-topic fold below — a `/t` seed wins over shared, same
2426
- // precedence as the human path.
2427
- const forcedTopic = maybeApplyForceTopicOverride(ctx, message, messageId);
2428
- if (forcedTopic) {
2429
- logger.info(`[/t] Force-topic override (bot sender): msg=${messageId.substring(0, 12)} → thread-scope, anchor=msg`);
2430
- }
2431
- const ownsThreadSession = ctx.scope === 'thread'
2432
- ? (handlers.isSessionOwner?.(ctx.anchor, larkAppId) ?? false)
2433
- : false;
2434
- // 这个 bot 能不能在本群跟我们说话 —— 判定一次,fold 与下面的 gate 共用同一个
2435
- // 结论(二者之间只有 fold / shared-seed 的路由计算,不改任何授权状态)。
2436
- // 曾经这里是两条手抄的 OR 链,靠人肉保持同步;漏一处就是「能路由但不能 fold」
2437
- // 或「fold 了却弹卡」的二次分裂。
2438
- const botTalk = evaluateBotTalk(larkAppId, chatId, senderOpenId, senderUnionId);
2439
- let replyRootId = await maybeFoldMentionedRegularGroupThreadToChat({
2440
- larkAppId, chatId, chatType, message, routing: ctx, forceTopicApplied: forcedTopic, mentionedThisBot: botTalk.allowed, ownsThreadSession,
2441
- });
2442
- if (!replyRootId) {
2443
- replyRootId = await maybeApplySharedTopicSeed({
2444
- larkAppId, chatId, chatType, message, senderOpenId, messageId, routing: ctx, forceTopicApplied: forcedTopic,
2445
- });
2446
- }
2447
- // Foreign-bot @mention gate: apply the same vetted-peer/talk-only
2448
- // boundary to chat scope, regular-group threads, and native topic
2449
- // threads. Previously native topic replies skipped this outer gate and
2450
- // were silently dropped by daemon's second evaluateTalk check, so the
2451
- // owner never saw a grant card. Owning an existing session is not an
2452
- // authorization source; a revoked/unknown bot must still pass
2453
- // evaluateBotTalk (the single talk predicate — see its doc for the two
2454
- // deliberate human/bot deltas) or prove itself a sibling below.
2455
- //
2456
- // 这里**只判 evaluateBotTalk**。以前是手抄的 OR 链,每加一条 talk 源就漏一次:
2457
- // oncall 漏过、开放模式漏过、allowedChatGroups 又漏过(整群 /grant 后人通 bot 卡)。
2458
- // 要加新的 talk 放行源,改 evaluateTalk(人/bot 同时生效),不要在这里加腿;
2459
- // test/bot-talk-parity.test.ts 会盯着这条约束。
2460
- //
2461
- // 唯一留在闸门里的 bot 专属逻辑是下面的 cross-ref 冷启动自愈:它不是一条
2462
- // 授权来源,而是「同部署兄弟 bot 的身份还没学到」这个**识别**问题的补救。
2463
- if (!botTalk.allowed) {
2464
- // Cold-start self-heal: the cross-ref (bot-openids-<appId>.json) is
2465
- // learned lazily from observed mentions[], so the FIRST bot→bot
2466
- // direct @ from a same-deployment sibling can arrive before the
2467
- // receiver has learned that sibling's receiver-scoped open_id
2468
- // (Lark open_id is per-app). That raced a real sibling into this
2469
- // "unknown external bot" branch and mis-fired a /grant card
2470
- // (regression from ec146a49). Before deciding unknown, confirm the
2471
- // sender against the group's LIVE `/members/bots` roster: accept
2472
- // only when it binds to exactly one locally-configured sibling of
2473
- // the same unique name that independently confirms is_in_chat.
2474
- // Fails closed to the grant card on any API error / ambiguity /
2475
- // genuine external bot — never a name-only shortcut.
2476
- const sibling = await resolveSiblingBotBySenderOpenId(larkAppId, chatId, senderOpenId)
2477
- .catch((err) => ({ ok: false, reason: `resolve_threw: ${err?.message ?? String(err)}` }));
2478
- if (sibling.ok) {
2479
- // Persist the newly-proven mapping so subsequent @s from this
2480
- // sibling hit isKnownPeerBot directly (no live API roundtrip).
2481
- updateBotOpenIdCrossRef(config.session.dataDir, larkAppId, [
2482
- { name: sibling.botName, id: { open_id: sibling.senderOpenId } },
2483
- ]);
2484
- logger.info(`Lazy sibling cross-ref backfill: ${sibling.botName} → ${senderOpenId?.substring(0, 12)} (was cold; skipping /grant)`);
2485
- }
2486
- else {
2487
- logger.info(`Foreign bot @mention not a known sibling (${sibling.reason}); sending grant request card`);
2488
- await maybeSendGrantRequestCard(larkAppId, message, chatId, senderOpenId, data);
2489
- return;
2490
- }
2491
- }
2492
- logger.info(`Bot-to-bot @mention detected (scope=${ctx.scope}): routing to handleThreadReply`);
2493
- // Serialize per anchor — a sub-bot dispatched a /repo prime + kickoff
2494
- // back-to-back into this thread must be handled in order, not raced.
2495
- await serializeByAnchor(ctx.anchor, () => handlers.handleThreadReply(data, { ...ctx, chatId, messageId, chatType, larkAppId, replyRootId }))
2496
- .catch(err => logger.error(`Error handling bot @mention: ${err}`));
2497
- return;
2498
- }
2499
- const senderOpenId = sender?.sender_id?.open_id;
2500
- // 人的 union_id:平台团队成员 talk-免grant 腿(isPlatformTeamMemberChat)要用。
2501
- const humanSenderUnionId = sender?.sender_id?.union_id;
2502
- // defaultOncall 自动绑定必须在 canTalk 权限判断前完成,否则已开 defaultOncall
2503
- // 的群首次 @bot 时 oncallChats 中还没有该 chat → evaluateTalk 判无权限 → 误弹
2504
- // 自助授权申请卡。ensureDefaultOncallBound 本身带 fast-path 短路且 idempotent。
2505
- await ensureDefaultOncallBound(larkAppId, chatId, chatType).catch(err => logger.warn(`[oncall:${larkAppId}] pre-permission auto-bind failed for ${chatId.substring(0, 12)}: ${err}`));
2506
- // 人的路径(bot 发送方已在上面的分支 return):union 走 memberUnionId 腿,
2507
- // 不进 bot-trust 腿——teamBot 只认 bot-locked union。
2508
- const isAllowed = canTalk(larkAppId, chatId, senderOpenId, undefined, humanSenderUnionId, chatType);
2509
- // /introduce — collaboration handshake. Intercept before any routing
2510
- // so the command never reaches a CLI session (each @ed bot's daemon
2511
- // independently records the mentions[] open_ids + names). 无需授权:
2512
- // 任何人都能登记花名册(只记 observed,不授予任何权限)。
2513
- if (await tryHandleIntroduceCommand(larkAppId, message, senderOpenId)) {
2514
- return;
2515
- }
2516
- if (await tryHandleReplyModeCommand(larkAppId, message, senderOpenId, isAllowed)) {
2517
- return;
2518
- }
2519
- if (await tryHandleSubstituteCommand(larkAppId, message, senderOpenId)) {
2520
- return;
2521
- }
2522
- // /grant、/revoke — 群内授权元命令。在路由/spawn 之前拦截(仅 owner,需明确 @ 本 bot),
2523
- // 否则会被当成 prompt 喂给 CLI 会话。
2524
- if (await tryHandleGrantCommand(larkAppId, message, senderOpenId)) {
2525
- return;
2526
- }
2527
- // /invite — 把群外 bot 拉进本群的元命令。与 /grant 同款拦截模型(仅 owner,
2528
- // 需明确 @ 本 bot),防止进路由/spawn,也防多 bot 重复执行拉人。
2529
- if (await tryHandleInviteCommand(larkAppId, message, senderOpenId)) {
2530
- return;
2531
- }
2532
- logger.debug('Received message:', message);
2533
- // Diagnostic: record the Lark quote-bubble UI quirk where root_id
2534
- // appears without thread_id. decideRouting now treats this as
2535
- // "no thread" (chat-scope / topic / new-topic depending on context),
2536
- // which is the authoritative behavior. Logging it here so we can spot
2537
- // any future surprise in the wild.
2538
- if (message.root_id && !message.thread_id) {
2539
- logger.info(`[routing] root_id w/o thread_id (Lark UI quirk, treating as top-level): ` +
2540
- `msg=${messageId.substring(0, 12)} chat=${chatId.substring(0, 12)} ` +
2541
- `type=${chatType} root=${String(message.root_id).substring(0, 12)} ` +
2542
- `parent=${String(message.parent_id ?? '').substring(0, 12)}`);
2543
- }
2544
- const decision = await decideRoutingWithSource(larkAppId, message);
2545
- const routing = {
2546
- scope: decision.scope,
2547
- anchor: decision.anchor,
2548
- };
2549
- let routingSource = decision.source;
2550
- let replyRootId;
2551
- // 私聊 chat 模式:会话是扁平连续的(整段 DM 一个 chat-scope 会话),但如果这条
2552
- // 消息本身是在某个已存在的话题里回复的(root_id+thread_id),可见回复必须落回
2553
- // 那个话题里,而不是漏到 DM 顶层。decideRouting 已把 scope 折成 chat(会话扁平
2554
- // 语义不变),这里只补 replyRootId 让 sendReply 用 reply_in_thread 锚回话题根。
2555
- // 群聊侧的同类保留由 maybeFold / alias 分支处理(它们 gate chatType==='group',
2556
- // 私聊走不到),故私聊必须在此单独补。仅 p2p:群顶层消息不该被强行塞进话题。
2557
- if (routing.scope === 'chat' && chatType === 'p2p' && message.root_id && message.thread_id) {
2558
- replyRootId = message.root_id;
2559
- }
2560
- const explicitlyMentionedThisBot = isBotMentioned(larkAppId, message, senderOpenId);
2561
- const messageListener = chatType === 'group'
2562
- ? evaluateMessageListener({
2563
- bot: getBot(larkAppId),
2564
- chatId,
2565
- message,
2566
- senderOpenId,
2567
- senderTypeRaw: sender?.sender_type,
2568
- explicitlyMentionedThisBot,
2569
- })
2570
- : undefined;
2571
- if (messageListener) {
2572
- routing.scope = 'thread';
2573
- routing.anchor = messageId;
2574
- routingSource = 'topic-chat';
2575
- replyRootId = undefined;
2576
- logger.info(`[message-listener:${larkAppId}] matched chat=${chatId.substring(0, 12)} ` +
2577
- `msg=${messageId.substring(0, 12)} sender=${senderOpenId?.substring(0, 12) ?? '-'}`);
2578
- }
2579
- // Cheap in-memory gate FIRST: skip the getChatMode roundtrip and the
2580
- // per-chat toggle disk read entirely for bots that never configured a
2581
- // substitute target (the overwhelming majority on the hot path).
2582
- const substituteCfg = getBot(larkAppId).config.substituteMode;
2583
- let substituteChatMode;
2584
- // chats 白名单在 getChatMode 之前(纯内存判断走在 API roundtrip 前),
2585
- // 对普通群与话题群统一生效:白名单是「替身可触发的群」清单,与群形态无关。
2586
- if (substituteCfg?.enabled === true && chatType === 'group' && isSubstituteAllowedChat(substituteCfg, chatId)) {
2587
- const chatMode = await getChatMode(larkAppId, chatId);
2588
- const modeSupported = chatMode === 'group'
2589
- // 话题群支持默认开(缺省=开,normalize 只在显式 false 时关)。
2590
- || (chatMode === 'topic' && substituteCfg.topicGroups !== false);
2591
- if (modeSupported && isSubstituteEnabledForChat(larkAppId, chatId)) {
2592
- substituteChatMode = chatMode;
2593
- }
2594
- }
2595
- // 黑名单硬静默:命中黑名单的群里,一条「本该触发替身」的消息(@ 到了配置的
2596
- // 替身对象、但没有直接 @ 本 bot)必须当作没读到——直接 return,不只是清 trigger。
2597
- // 只清 trigger 不够:消息会继续 fall-through 到通用群消息门,若 bot 在该群有活跃
2598
- // 会话 / 是 solo 群 / mentionMode 放开,仍会被喂进去并弹卡片(用户实测现象)。
2599
- // 直接 @ 本 bot(explicitlyMentionedThisBot)不受影响:黑名单只静音替身代答,
2600
- // 不静音「直接找 bot 问问题」。/substitute 命令已在上方 command 处理器拦截。
2601
- if (substituteCfg?.enabled === true
2602
- && chatType === 'group'
2603
- && !explicitlyMentionedThisBot
2604
- && isSubstituteExcludedChat(substituteCfg, chatId)
2605
- && resolveSubstituteTrigger(larkAppId, message)) {
2606
- logger.info(`[substitute:${larkAppId}] excluded chat — dropping @target message ` +
2607
- `msg=${messageId.substring(0, 12)} chat=${chatId.substring(0, 12)}`);
2608
- return;
2609
- }
2610
- let substituteTrigger = substituteChatMode
2611
- ? resolveSubstituteTrigger(larkAppId, message)
2612
- : undefined;
2613
- if (substituteTrigger && !explicitlyMentionedThisBot) {
2614
- const rawText = extractMessageTextForRouting(message);
2615
- const stripped = rawText ? stripLeadingMentions(rawText.trim(), message?.mentions ?? []).trim() : '';
2616
- if (stripped.startsWith('/'))
2617
- substituteTrigger = undefined;
2618
- }
2619
- if (substituteTrigger && substituteChatMode === 'topic'
2620
- && substituteCfg?.topicActiveSessionTrigger === false
2621
- && (handlers.isSessionOwner?.(routing.anchor, larkAppId) ?? false)) {
2622
- // 话题里已有本 bot 活跃会话 + 用户关掉了「活跃话题也触发」:
2623
- // 单独 @替身对象 是明确转交,必须在任何通用免 @ 规则前直接让路;
2624
- // 只清掉 metadata 不够,1v1 群/mentionMode=never 仍会把消息喂给 bot。
2625
- substituteTrigger = undefined;
2626
- if (!explicitlyMentionedThisBot) {
2627
- logger.debug(`[substitute:${larkAppId}] active-topic trigger disabled; backing off ` +
2628
- `msg=${messageId.substring(0, 12)} thread=${String(routing.anchor).substring(0, 12)}`);
2629
- return;
2630
- }
2631
- }
2632
- if (substituteTrigger) {
2633
- if (substituteChatMode === 'group') {
2634
- routing.scope = 'chat';
2635
- routing.anchor = chatId;
2636
- routingSource = 'regular-group-chat';
2637
- // Top-level substitute messages need their own reply anchor so that
2638
- // concurrent triggers from different users in the same chat-scope
2639
- // session don't collapse or thread under the wrong message. Existing
2640
- // real threads keep their root_id.
2641
- replyRootId = (message.root_id && message.thread_id) ? message.root_id : messageId;
2642
- }
2643
- // 话题群:保持 decideRouting 的 thread-scope/话题锚点不动——替身回合
2644
- // 直接搭该话题自己的会话(无会话则由 handleNewTopic 新开),与普通群
2645
- // 「搭群 chat-scope 会话」同构;回复天然落回本话题,无需 replyRootId。
2646
- const configuredTargetId = substituteTrigger.target.openId
2647
- ?? substituteTrigger.target.userId
2648
- ?? substituteTrigger.target.unionId
2649
- ?? 'unknown';
2650
- const configuredTargetForLog = JSON.stringify(configuredTargetId.slice(0, 128));
2651
- logger.info(`[substitute:${larkAppId}] mention target=${configuredTargetForLog} ` +
2652
- `msg=${messageId.substring(0, 12)} chat=${chatId.substring(0, 12)} → ${substituteChatMode === 'group' ? 'chat-scope' : `topic thread=${String(routing.anchor).substring(0, 12)}`}`);
2653
- }
2654
- // Shared-mode follow-up: a non-@ message inside a Lark thread can belong
2655
- // to the regular group's chat-scope session when that root was registered
2656
- // as a shared-topic alias. Whether a 普通群 answers it without an @mention
2657
- // is governed by the bot-global mention policy: 'always' (default) keeps
2658
- // "@ required" so this fold-back is skipped (non-@ thread chatter falls
2659
- // through to the gate below and is ignored — only an explicit @ continues
2660
- // a shared topic); 'topic', 'never' and 'ambient' enable the seamless
2661
- // no-@ fold-back. Carve-out: under 'topic' / 'ambient', a non-@ reply
2662
- // that @mentions another specific member (person/bot) is a redirect to
2663
- // someone else → back off, don't fold it in (mentionsAnotherMember).
2664
- // 'never' stays unconditional by design.
2665
- const mentionModeForAlias = resolveGroupMentionMode(larkAppId);
2666
- if (!explicitlyMentionedThisBot
2667
- && mentionModeForAlias !== 'always'
2668
- && !((mentionModeForAlias === 'topic' || mentionModeForAlias === 'ambient') && mentionsAnotherMember(larkAppId, message))
2669
- && routing.scope === 'thread' && message.root_id && message.thread_id && chatType === 'group') {
2670
- const alias = handlers.resolveReplyThreadAlias?.(message.root_id, chatId, larkAppId) ?? null;
2671
- if (alias) {
2672
- const freshMode = await getChatMode(larkAppId, chatId, { forceRefresh: true });
2673
- if (freshMode === 'group') {
2674
- routing.scope = 'chat';
2675
- routing.anchor = alias.anchor ?? alias.chatId;
2676
- replyRootId = message.root_id;
2677
- logger.info(`[reply-mode] alias root=${message.root_id.substring(0, 12)} → chat=${alias.chatId.substring(0, 12)} session=${alias.sessionId.substring(0, 8)}`);
2678
- }
2679
- }
2680
- }
2681
- // 话题群 → 普通群 (reverse conversion). Symmetric to the forward check
2682
- // below: when decideRouting lands on thread-scope purely because the
2683
- // *cached* chat_mode said 'topic' (no real thread_id on the message
2684
- // either — i.e. this would seed a brand-new thread), our 5-min cache
2685
- // may be stale from before a flip-back to 普通群. Re-verify with
2686
- // forceRefresh; if Lark now reports 'group', flatten to chat-scope so
2687
- // the bot doesn't keep wrapping every top-level reply in a fresh
2688
- // Lark topic via reply_in_thread.
2689
- //
2690
- // Skip when there's a real thread_id (authoritative thread signal,
2691
- // can't be cache-stale) or when chatType is p2p (DMs always thread).
2692
- // Runs BEFORE /t override so a `@bot /t …` in a now-flat 普通群 still
2693
- // gets the explicit topic seed it asked for.
2694
- if (!messageListener &&
2695
- routing.scope === 'thread' &&
2696
- routing.anchor === messageId &&
2697
- !message.thread_id &&
2698
- chatType === 'group') {
2699
- const freshMode = await getChatMode(larkAppId, chatId, { forceRefresh: true });
2700
- if (freshMode === 'group') {
2701
- const rerouted = regularGroupRouting(larkAppId, messageId, chatId);
2702
- logger.info(`[chat-mode-converted] ${chatId.substring(0, 12)} chat_mode flipped 'topic' → 'group'; ` +
2703
- `rerouting msg=${messageId.substring(0, 12)} as ${rerouted.scope}-scope`);
2704
- routing.scope = rerouted.scope;
2705
- routing.anchor = rerouted.anchor;
2706
- routingSource = rerouted.source;
2707
- }
2708
- }
2709
- // 主动开工 — 场景②: capture only genuine topic-group seeds NOW, before
2710
- // `/t` or the regular-group new-topic mode can create the same
2711
- // {thread, anchor=messageId} shape in a regular group. autoStartOnNewTopic
2712
- // is deliberately limited to 话题群.
2713
- const autoTopicSeedScope = routingSource === 'topic-chat' ? routing.scope : 'chat';
2714
- const autoTopicSeedAnchor = routingSource === 'topic-chat' ? routing.anchor : chatId;
2715
- // /t / /topic in 普通群: flip routing to thread-scope so the bot's
2716
- // first reply seeds a fresh Lark thread, even if a chat-scope session
2717
- // is currently active in this chat.
2718
- const forceTopicApplied = substituteTrigger ? false : maybeApplyForceTopicOverride(routing, message, messageId);
2719
- if (forceTopicApplied) {
2720
- logger.info(`[/t] Force-topic override: msg=${messageId.substring(0, 12)} → thread-scope, anchor=msg`);
2721
- }
2722
- let ownsSession = handlers.isSessionOwner?.(routing.anchor, larkAppId) ?? false;
2723
- const ownsThreadSessionBeforeFold = routing.scope === 'thread'
2724
- ? (handlers.isSessionOwner?.(routing.anchor, larkAppId) ?? false)
2725
- : false;
2726
- const foldedReplyRootId = await maybeFoldMentionedRegularGroupThreadToChat({
2727
- larkAppId, chatId, chatType, message, routing, forceTopicApplied, mentionedThisBot: explicitlyMentionedThisBot, ownsThreadSession: ownsThreadSessionBeforeFold,
2728
- });
2729
- if (foldedReplyRootId) {
2730
- replyRootId = foldedReplyRootId;
2731
- ownsSession = handlers.isSessionOwner?.(routing.anchor, larkAppId) ?? false;
2732
- }
2733
- else {
2734
- const seedReplyRootId = await maybeApplySharedTopicSeed({
2735
- larkAppId, chatId, chatType, message, senderOpenId, messageId, routing, forceTopicApplied,
2736
- });
2737
- if (seedReplyRootId) {
2738
- replyRootId = seedReplyRootId;
2739
- ownsSession = handlers.isSessionOwner?.(routing.anchor, larkAppId) ?? false;
2740
- }
2741
- }
2742
- // 普通群 → 话题群 conversion detection. Lark group admins can flip
2743
- // chat_mode at any time; our 30/5-min cache lags. If routing landed on
2744
- // chat-scope AND we own a session at this chat, the chat-scope session
2745
- // may be stale from before a conversion. Re-fetch chat_mode with
2746
- // forceRefresh to confirm. If it's now 'topic', the session is dead:
2747
- // sendMessage(chatId) at dispatch time would wrap each reply in a new
2748
- // Lark topic (the user-reported bug). Evict the stale session, then
2749
- // route this message as if it were a brand-new thread seed so
2750
- // handleNewTopic spawns a thread-scope session anchored at messageId.
2751
- // Gate on ownsSession to avoid an API roundtrip on every fresh inbound.
2752
- // Skip p2p: a DM is always 'p2p' and can never be a topic group, so the
2753
- // check can only waste a forceRefresh roundtrip (relevant now that
2754
- // p2pMode==='chat' makes DMs land on chat-scope).
2755
- if (routing.scope === 'chat' && ownsSession && chatType !== 'p2p') {
2756
- const freshMode = await getChatMode(larkAppId, chatId, { forceRefresh: true });
2757
- if (freshMode === 'topic') {
2758
- logger.info(`[chat-mode-converted] ${chatId.substring(0, 12)} chat_mode flipped 'group' → 'topic'; ` +
2759
- `evicting stale chat-scope session and rerouting msg=${messageId.substring(0, 12)} as thread seed`);
2760
- try {
2761
- handlers.onChatModeConverted?.(chatId, larkAppId);
2762
- }
2763
- catch (err) {
2764
- logger.warn(`onChatModeConverted handler threw: ${err}`);
2765
- }
2766
- routing.scope = 'thread';
2767
- routing.anchor = messageId;
2768
- routingSource = 'topic-chat';
2769
- // ownsSession was true on the stale chatId anchor; the new anchor
2770
- // (messageId) is brand-new, so no current session owns it.
2771
- ownsSession = false;
2772
- }
2773
- }
2774
- const summaryCommandMatch = await resolveSummaryCommandMatch({
2775
- larkAppId,
2776
- chatId,
2777
- chatType,
2778
- routingSource,
2779
- message,
2780
- senderOpenId,
2781
- });
2782
- const summaryCommandTriggered = !!summaryCommandMatch && isAllowed;
2783
- const routingText = extractMessageTextForRouting(message);
2784
- const strippedRoutingText = routingText
2785
- ? stripLeadingMentions(routingText.trim(), message?.mentions ?? []).trim()
2786
- : '';
2787
- const isControlCommand = strippedRoutingText.startsWith('/');
2788
- let pairedForwardSeed;
2789
- // Require isAllowed before pairing: a root-linked clarification from a
2790
- // sender who was /revoked within the grace window must not consume the
2791
- // seed from the buffer or overwrite the durable paired record. The seed
2792
- // stays in the buffer and flushes on its original timer. Paired seeds
2793
- // only arise under never/ambient modes, where a legitimate merge always
2794
- // requires isAllowed anyway.
2795
- if (senderOpenId && isAllowed && message.root_id && !isControlCommand) {
2796
- await seedRoutingGates.get(message.root_id)?.ready;
2797
- const pairingInput = {
2798
- larkAppId,
2799
- chatId,
2800
- senderOpenId,
2801
- rootId: message.root_id,
2802
- };
2803
- const pairingMentionMode = resolveGroupMentionMode(larkAppId);
2804
- const ambientRedirect = pairingMentionMode === 'ambient'
2805
- && !explicitlyMentionedThisBot
2806
- && mentionsAnotherMember(larkAppId, message);
2807
- const pairingDelayEnabled = usesForwardFollowupDelay(pairingMentionMode);
2808
- if (pairingDelayEnabled && !ambientRedirect) {
2809
- pairedForwardSeed = forwardFollowups.take(pairingInput);
2810
- }
2811
- else if (!pairingDelayEnabled) {
2812
- const stalePendingSeed = forwardFollowups.take(pairingInput);
2813
- if (stalePendingSeed) {
2814
- try {
2815
- await dispatchPersistedForwardFollowup(stalePendingSeed.messageId, stalePendingSeed.payload);
2816
- }
2817
- catch (err) {
2818
- logger.warn(`[forward-followup] failed to flush stale seed=${stalePendingSeed.messageId.substring(0, 12)}; ` +
2819
- `continuing current msg=${messageId.substring(0, 12)}: ${err}`);
2820
- }
2821
- }
2822
- }
2823
- }
2824
- if (pairedForwardSeed) {
2825
- // The clarification becomes the visible Lark topic root. The earlier
2826
- // forwarded seed is retained only as prompt context, so the bot never
2827
- // emits a reply under the forwarding bubble itself.
2828
- routing.scope = 'thread';
2829
- routing.anchor = messageId;
2830
- routingSource = 'topic-chat';
2831
- replyRootId = undefined;
2832
- ownsSession = false;
2833
- try {
2834
- putForwardFollowup(larkAppId, {
2835
- messageId: pairedForwardSeed.messageId,
2836
- dueAt: Date.now(),
2837
- payload: {
2838
- data,
2839
- ctx: {
2840
- ...pairedForwardSeed.payload.ctx,
2841
- chatId,
2842
- messageId,
2843
- chatType,
2844
- larkAppId,
2845
- scope: 'thread',
2846
- anchor: messageId,
2847
- replyRootId: undefined,
2848
- forwardSeedData: pairedForwardSeed.payload.data,
2849
- },
2850
- ownsSession: false,
2851
- },
2852
- });
2853
- }
2854
- catch (err) {
2855
- logger.warn(`[forward-followup] failed to persist provisional paired payload: ${err}`);
2856
- }
2857
- logger.info(`[forward-followup] merged seed=${pairedForwardSeed.messageId.substring(0, 12)} ` +
2858
- `into msg=${messageId.substring(0, 12)} chat=${chatId.substring(0, 12)}`);
2859
- }
2860
- // Permission gating — same shape as before, just keyed on
2861
- // `ownsSession` (anchor-aware) instead of "rootId presence":
2862
- //
2863
- // ownsSession + 1v1 group → relax (no @mention required)
2864
- // ownsSession + multi → require @mention
2865
- // !ownsSession (group) → require @mention + allowlist
2866
- // p2p → allowlist only
2867
- if (chatType === 'group') {
2868
- const mentionMode = resolveGroupMentionMode(larkAppId);
2869
- // 消息里 @ 了别的具体成员,就已经证明群不是 1人1bot(只有群成员能被 @)——
2870
- // 此刻末条 solo 放行必然不成立,而 stats 只被末条消费,直接跳过这次(可能
2871
- // 昂贵的)人数查询。这在「刚拉了新 bot、用户 @ 新 bot」窗口里尤为重要:
2872
- // 拦截老 bot 的同时不再为它反复刷新陈旧缓存。
2873
- const mentionsOther = mentionsAnotherMember(larkAppId, message);
2874
- let stats = null;
2875
- if (ownsSession && !replyRootId && !mentionsOther && mentionMode !== 'never') {
2876
- stats = await getGroupStats(larkAppId, chatId);
2877
- }
2878
- // replyRootId means this turn has already been explicitly addressed
2879
- // to the bot by shared-topic logic (possibly from inside an existing
2880
- // Lark thread). Do not re-run the generic group @ gate, which would
2881
- // reject multi-bot thread replies simply because `routing.scope` was
2882
- // folded back to chat-scope.
2883
- //
2884
- // The bot-global mention policy drops the @ requirement:
2885
- // • 'never' — answer EVERY un-@ message from talk-allowed senders
2886
- // (incl. brand-new non-@ top-level → spawns/continues a session),
2887
- // unconditionally. Intended for dedicated / on-call groups.
2888
- // • 'ambient' — like 'never' (answer un-@ messages), EXCEPT when the
2889
- // message @mentions another specific member (person/bot) without
2890
- // @ing us — that is a redirect to someone else, so we back off and
2891
- // stay quiet (mentionsAnotherMember). @all does not count as a
2892
- // redirect. Best for multi-bot / multi-person groups that want a
2893
- // default responder which yields the moment you address someone else.
2894
- // • 'topic' — only inside a topic the bot already owns: a non-@ reply
2895
- // INSIDE such a thread (new-topic / 话题群 thread the bot owns, or a
2896
- // shared-topic alias via replyRootId) continues without @, while a
2897
- // brand-new top-level conversation still requires @. If the user
2898
- // explicitly @mentions another member/bot without @ing this bot,
2899
- // treat it as a hand-off and stay quiet.
2900
- // Both gated on isAllowed so restricted groups still only react to
2901
- // permitted senders. (The shared fold-back's replyRootId is already
2902
- // handled by the first clause. `mentionMode` 已在块首解析,用于 stats
2903
- // 惰性获取。)
2904
- // 话题群 owned-topic 免@续话不再无条件放行(#336 引入的默认行为回归:
2905
- // 多人群里旁人不 @ 也会触发 bot)。现在与普通群共用同一套「群聊 @ 策略」:
2906
- // 默认 'always' 在多人群里必须 @,想要话题内免@续话就把 mentionMode 配成
2907
- // 'topic'(下方条款已同时覆盖话题群 thread 与普通群 shared topic),
2908
- // 'never'/'ambient' 亦按各自语义生效。1人1bot 的 solo 群仍走末条放行。
2909
- // 注:pairedForwardSeed 仅在 never/ambient 模式下产生,且 ambient redirect
2910
- // 已在配对前排除,故 isAllowed=true 时下方 never/ambient 条款必然放行;
2911
- // 不在此单独加 clause,以免 isAllowed=false 时绕过权限检查。
2912
- // 末条 solo 放行另有 `!mentionsOther` 守卫:消息 @ 了别的具体成员时,
2913
- // 群必然不是 1人1bot(只有群成员能被 @),且是指给别人的——拦住「刚拉新 bot、
2914
- // 缓存仍是陈旧 {1,1} 时老 bot 跟着回复」的误放行。never 条款在前已短路,
2915
- // 故该守卫不影响「群聊 @ 策略」配置的 never 语义。
2916
- const relax = (!!replyRootId && isAllowed)
2917
- || (!!substituteTrigger && isAllowed)
2918
- || !!messageListener
2919
- || (isAllowed && mentionMode === 'never')
2920
- || (isAllowed && mentionMode === 'ambient' && !mentionsOther)
2921
- || (isAllowed && mentionMode === 'topic' && ownsSession && !!message.thread_id && !mentionsOther)
2922
- || (ownsSession && isAllowed && !!stats && !mentionsOther && stats.userCount <= 1 && stats.botCount <= 1);
2923
- if (!relax) {
2924
- const access = await checkGroupMessageAccess(larkAppId, message, chatId, senderOpenId, humanSenderUnionId);
2925
- if (access === 'not_allowed') {
2926
- // 入口 A:无权限者 @bot → 弹授权申请卡(@owner),代替「无操作权限」。
2927
- // 覆盖 ownsSession 真假两种情况,但绝不把该消息喂进已有 session。
2928
- await maybeSendGrantRequestCard(larkAppId, message, chatId, senderOpenId, data);
2929
- logger.debug(`Ignoring group message from non-allowed user: ${senderOpenId} (grant request card path)`);
2930
- return;
2931
- }
2932
- if (access === 'ignore') {
2933
- // 主动开工 — 场景②: a non-@ message that seeds a brand-new topic in
2934
- // a 话题群 auto-starts a session when the bot opted in. Everything
2935
- // else (regular-group chatter, thread replies, disabled bots) keeps
2936
- // the original ignore. Sender is intentionally not gated (D4).
2937
- const autoTopic = shouldAutoStartOnNewTopic({
2938
- enabled: getBot(larkAppId).config.autoStartOnNewTopic === true,
2939
- scope: autoTopicSeedScope,
2940
- anchor: autoTopicSeedAnchor,
2941
- messageId,
2942
- chatType,
2943
- ownsSession,
2944
- });
2945
- if (!autoTopic) {
2946
- logger.debug(`Ignoring group message not addressed to bot: ${messageId}`);
2947
- return;
2948
- }
2949
- logger.info(`[auto-start:新话题] ${chatId.substring(0, 12)} 新话题免@自动开工 msg=${messageId.substring(0, 12)}`);
2950
- }
2951
- }
2952
- }
2953
- else if (!isAllowed) {
2954
- // 私聊被挡目前是静默丢弃:owner 不在这个 p2p 会话里,把授权申请卡 reply 回来只会
2955
- // 发给陌生人自己(卡上的按钮又是 owner 专属),既不可用又泄露 owner —— 所以不发。
2956
- // 真正的修法是把申请发到 owner 自己的 DM 并加 owner 维度节流,单独一个 PR 做。
2957
- logger.debug(`Ignoring p2p message from non-allowed user: ${senderOpenId}`);
2958
- return;
2959
- }
2960
- const promptOverride = summaryCommandTriggered && summaryCommandMatch
2961
- ? await buildSummaryCommandPrompt({ larkAppId, chatId, message, match: summaryCommandMatch })
2962
- : undefined;
2963
- if (promptOverride && summaryCommandMatch) {
2964
- logger.info(`[summary-command] matched msg=${messageId.substring(0, 12)} ` +
2965
- `chat=${chatId.substring(0, 12)} kind=${summaryCommandMatch.chatKind}`);
2966
- }
2967
- const ctx = {
2968
- chatId,
2969
- messageId,
2970
- chatType,
2971
- larkAppId,
2972
- ...routing,
2973
- replyRootId,
2974
- promptOverride,
2975
- summaryCommand: summaryCommandTriggered && summaryCommandMatch
2976
- ? { name: 'summary-command', chatKind: summaryCommandMatch.chatKind }
2977
- : undefined,
2978
- substituteTrigger,
2979
- messageListener,
2980
- forwardSeedData: pairedForwardSeed?.payload.data,
2981
- };
2982
- if (explicitlyMentionedThisBot) {
2983
- const before = await handlers.beforeSessionTurn?.(data, ctx, { senderOpenId, explicitlyMentionedThisBot });
2984
- if (before?.block)
2985
- return;
2986
- if (before?.anchorOverride)
2987
- ctx.anchor = before.anchorOverride;
2988
- ownsSession = handlers.isSessionOwner?.(ctx.anchor, larkAppId) ?? ownsSession;
2989
- }
2990
- const payload = { data, ctx, ownsSession };
2991
- const groupMentionMode = resolveGroupMentionMode(larkAppId);
2992
- const shouldDelayTopicSeed = usesForwardFollowupDelay(groupMentionMode)
2993
- && !pairedForwardSeed
2994
- && !isControlCommand
2995
- && !!senderOpenId
2996
- && routingSource === 'topic-chat'
2997
- && ctx.scope === 'thread'
2998
- && ctx.anchor === messageId
2999
- && !ownsSession;
3000
- if (shouldDelayTopicSeed) {
3001
- try {
3002
- putForwardFollowup(larkAppId, {
3003
- messageId,
3004
- dueAt: Date.now() + config.daemon.forwardFollowupWaitMs,
3005
- payload,
3006
- });
3007
- if (forwardFollowups.hold({
3008
- larkAppId,
3009
- chatId,
3010
- senderOpenId,
3011
- messageId,
3012
- payload,
3013
- flush: delayedPayload => dispatchPersistedForwardFollowup(messageId, delayedPayload),
3014
- })) {
3015
- logger.debug(`[forward-followup] holding topic seed msg=${messageId.substring(0, 12)} ` +
3016
- `for ${config.daemon.forwardFollowupWaitMs}ms`);
3017
- return;
3018
- }
3019
- removeForwardFollowup(larkAppId, messageId);
3020
- }
3021
- catch (err) {
3022
- logger.warn(`[forward-followup] persistence unavailable, dispatching immediately: ${err}`);
3023
- }
3024
- }
3025
- if (pairedForwardSeed) {
3026
- try {
3027
- putForwardFollowup(larkAppId, {
3028
- messageId: pairedForwardSeed.messageId,
3029
- dueAt: Date.now(),
3030
- payload,
3031
- });
3032
- }
3033
- catch (err) {
3034
- logger.warn(`[forward-followup] failed to persist paired payload before dispatch: ${err}`);
3035
- }
3036
- await dispatchPersistedForwardFollowup(pairedForwardSeed.messageId, payload)
3037
- .catch(err => logger.error(`Error handling paired message event: ${err}`));
3038
- return;
3039
- }
3040
- // Serialize per anchor so two messages to the same thread/chat are
3041
- // processed in arrival order — never concurrently. Without this a fast
3042
- // second message interleaves with the first's async session-spawn and is
3043
- // dropped (worker-not-ready → re-fork branch). See anchor-serializer.ts.
3044
- await dispatchHumanMessage(payload)
3045
- .catch(err => logger.error(`Error handling message event: ${err}`));
3046
- }
3047
- catch (err) {
3048
- logger.error(`Error handling message event: ${err}`);
3049
- }
3050
- finally {
3051
- seedRoutingGate?.complete();
3052
- }
3053
- }
3054
- /** 授权成功后重放之前被拦截的消息,让用户无需再 @ 一遍。
3055
- * 绕过消息去重(原消息在拦截时已 claim 过),直接重新走消息处理流程。
3056
- * 用 setImmediate 异步执行,不阻塞卡片回调。 */
3057
- function replayMessageEvent(data) {
3058
- setImmediate(() => {
3059
- void processMessageEvent(data)
3060
- .catch(err => logger.error(`Error replaying message event after grant: ${err}`));
3061
- });
3062
- }
3063
- // 暴露给 daemon 的 cardDeps.replayGrantedMessage 调用。
3064
- handlers.replayMessageEvent = replayMessageEvent;
3065
- const eventDispatcher = new Lark.EventDispatcher({}).register({
3066
- // 主动开工 — 场景①: the bot was added to a chat. Hand off to the daemon,
3067
- // which gates on the autoStartOnGroupJoin toggle + allowedUser membership.
3068
- // Requires this event to be subscribed for the app in the Feishu console.
3069
- 'im.chat.member.bot.added_v1': (data) => {
3070
- const chatIdForKey = data?.chat_id;
3071
- const operatorForKey = data?.operator_id?.open_id;
3072
- const eventKey = `im.chat.member.bot.added_v1:${larkAppId}:${eventIdForKey(data) ?? `${chatIdForKey ?? 'unknown'}:${operatorForKey ?? 'unknown'}`}`;
3073
- // 飞书只把 bot.added 推给「进群的那个 bot 自己的 app」(官方文档语義,
3074
- // codex 复审证实),且生产是 PM2「一 bot 一 daemon 进程」(daemon.ts
3075
- // "Load the assigned bot (one daemon per bot)")——同群其他 bot 的缓存在
3076
- // 别的进程,这里够不到,只能清自己的 key。覆盖增量其实很小:新添进群
3077
- // 时本 bot 此前若恰有该群条目(曾被移出又拉回),避免带着上轮陈旧数放行。
3078
- // 「拉了别的 bot 进群→存量 bot 陈旧」方向无事件信号,靠 relax 末条款的
3079
- // mentionsAnotherMember 守卫 + TTL 兜底。
3080
- if (chatIdForKey)
3081
- invalidateChatStats(larkAppId, chatIdForKey);
3082
- scheduleAckSafeEvent(eventKey, async () => {
3083
- try {
3084
- const chatId = data?.chat_id;
3085
- const operatorOpenId = data?.operator_id?.open_id;
3086
- if (!chatId)
3087
- return;
3088
- logger.info(`[auto-start:入群] bot added to chat=${chatId.substring(0, 12)} by ${String(operatorOpenId ?? '?').substring(0, 12)}`);
3089
- // 进群先自动拉 owner(不受任何开工开关影响,失败仅日志):bot 应始终
3090
- // 处于 owner 可见的群里。放在 handleBotAdded 之前,让 autoStart 的
3091
- // D7「群内需有 allowedUser」闸能吃到刚拉进来的 owner。
3092
- await autoInviteOwnerOnGroupJoin(larkAppId, chatId, operatorOpenId)
3093
- .catch(err => logger.warn(`[groups] autoInviteOwner error (bot=${larkAppId} chat=${chatId}): ${err?.message ?? err}`));
3094
- await handlers.handleBotAdded?.(chatId, operatorOpenId, larkAppId);
3095
- }
3096
- catch (err) {
3097
- logger.error(`Error handling bot-added event: ${err}`);
3098
- }
3099
- }, 'bot-added event');
3100
- },
3101
- // bot.deleted 同样只推给被移出的 bot 自己的 app——清自己的 key 即可(语义
3102
- // 同 bot.added:进程边界上够不到兄弟 daemon;「别的 bot 离群→存量 bot
3103
- // 陈旧」靠①守卫+TTL)。user.added/deleted_v1 推给群内已订阅的所有 bot
3104
- // app,每个 bot 自己的 WS 都收到,各自清自己那条。纯本地 map 删除,同步
3105
- // 处理、即时 ACK,不进 work 队列;去重也不必要——失效是幂等的。
3106
- 'im.chat.member.bot.deleted_v1': (data) => {
3107
- const chatId = data?.chat_id;
3108
- if (chatId)
3109
- invalidateChatStats(larkAppId, chatId);
3110
- },
3111
- 'im.chat.member.user.added_v1': (data) => {
3112
- const chatId = data?.chat_id;
3113
- if (chatId)
3114
- invalidateChatStats(larkAppId, chatId);
3115
- },
3116
- 'im.chat.member.user.deleted_v1': (data) => {
3117
- const chatId = data?.chat_id;
3118
- if (chatId)
3119
- invalidateChatStats(larkAppId, chatId);
3120
- },
3121
- // 文档评论入口(/watch-comment / /subscribe-lark-doc)。notice 事件主要覆盖 @Bot
3122
- // 通知;普通评论由 daemon 应用身份轮询补齐,不依赖逐文件 subscribe API。
3123
- 'drive.notice.comment_add_v1': (data) => handleCommentEventAckSafe(data, larkAppId, handlers),
3124
- [VC_BOT_MEETING_INVITED_EVENT]: (data) => handleVcMeetingPushEventAckSafe(data, larkAppId, handlers, 'meeting_invited', VC_BOT_MEETING_INVITED_EVENT),
3125
- [VC_BOT_MEETING_ACTIVITY_EVENT]: (data) => handleVcMeetingPushEventAckSafe(data, larkAppId, handlers, 'meeting_activity', VC_BOT_MEETING_ACTIVITY_EVENT),
3126
- [VC_BOT_MEETING_ENDED_EVENT]: (data) => handleVcMeetingPushEventAckSafe(data, larkAppId, handlers, 'meeting_ended', VC_BOT_MEETING_ENDED_EVENT),
3127
- [VC_PARTICIPANT_MEETING_JOINED_EVENT]: (data) => handleVcMeetingPushEventAckSafe(data, larkAppId, handlers, 'participant_meeting_joined', VC_PARTICIPANT_MEETING_JOINED_EVENT),
3128
- 'card.action.trigger': (data) => handleCardActionAckSafe(data, larkAppId, handlers),
3129
- // 表情回复事件——一旦在开发者后台订阅了 reaction,SDK 每收到一次都会因
3130
- // 没有 handler 打 "no im.message.reaction.created_v1 handle" 警告刷屏。
3131
- // botmux 不消费表情事件,注册显式 no-op 把这条噪声静默掉。
3132
- 'im.message.reaction.created_v1': () => { },
3133
- 'im.message.reaction.deleted_v1': () => { },
3134
- 'im.message.receive_v1': (data) => {
3135
- // Dedupe by message_id (stable across re-pushes / event_id re-mints /
3136
- // daemon restarts), persisted so the 6h re-push tier or a restart can't
3137
- // replay an already-handled message. Fall back to the in-memory event-id
3138
- // claim only when message_id is absent (shouldn't happen for real messages).
3139
- const messageIdForKey = data?.message?.message_id;
3140
- const eventKey = `im.message.receive_v1:${larkAppId}:${messageIdForKey ?? eventIdForKey(data) ?? unkeyableEventKey()}`;
3141
- const claim = messageIdForKey
3142
- ? () => claimMessageOnce(larkAppId, messageIdForKey)
3143
- : () => claimEventOnce(eventKey);
3144
- let seedRoutingGate;
3145
- const scheduled = scheduleAckSafeEvent(eventKey, () => processMessageEvent(data, seedRoutingGate), 'message event', claim);
3146
- const rawMessage = data?.message;
3147
- const rawSenderType = data?.sender?.sender_type;
3148
- if (scheduled
3149
- && config.daemon.forwardFollowupWaitMs > 0
3150
- && rawMessage?.message_id
3151
- && rawMessage.chat_type !== 'p2p'
3152
- && !rawMessage.root_id
3153
- && !rawMessage.thread_id
3154
- && rawSenderType !== 'app'
3155
- && rawSenderType !== 'bot') {
3156
- seedRoutingGate = registerSeedRoutingGate(rawMessage.message_id);
3157
- }
3158
- },
3159
- });
3160
- // 诊断:包一层 invoke,记录长连接收到的**每一个**事件类型(含未注册的)。
3161
- // 排查云文档评论事件是否真送达 / 实际事件名用——comment 类一律连 payload 关键字段
3162
- // 一起打。日常其它事件只在 DEBUG 下打,避免刷屏。
3163
- // 仅当 dispatcher 真有 invoke 方法时才包(单测里 Lark.EventDispatcher 是 mock,
3164
- // register() 返回的对象没有 invoke → 不包,避免 undefined.bind 抛错)。
3165
- const __origInvoke = typeof eventDispatcher.invoke === 'function'
3166
- ? eventDispatcher.invoke.bind(eventDispatcher)
3167
- : undefined;
3168
- if (__origInvoke) {
3169
- eventDispatcher.invoke = (data) => {
3170
- try {
3171
- const et = data?.header?.event_type ?? data?.event_type ?? data?.type ?? 'unknown';
3172
- const isCommentish = typeof et === 'string' && et.includes('comment');
3173
- const isVcMeeting = typeof et === 'string' && (et.startsWith('vc.bot.meeting_') || et === VC_PARTICIPANT_MEETING_JOINED_EVENT);
3174
- if (isCommentish) {
3175
- const ev = data?.event ?? data;
3176
- const p = parseCommentEvent(data);
3177
- logger.info(`[ws-event] ${larkAppId} event_type=${et} → parsed fileToken=${p.fileToken ?? '?'} commentId=${p.commentId ?? '?'} replyId=${p.replyId ?? '?'} isMentioned=${p.isMentioned} | notice_meta=${JSON.stringify(ev?.notice_meta ?? ev?.noticeMeta ?? null)}`);
3178
- }
3179
- else if (isVcMeeting) {
3180
- const kind = et === VC_BOT_MEETING_INVITED_EVENT
3181
- ? 'meeting_invited'
3182
- : et === VC_BOT_MEETING_ENDED_EVENT
3183
- ? 'meeting_ended'
3184
- : et === VC_PARTICIPANT_MEETING_JOINED_EVENT
3185
- ? 'participant_meeting_joined'
3186
- : 'meeting_activity';
3187
- const parsed = parseVcMeetingPushEvent({ data, larkAppId, kind, eventType: et });
3188
- logger.info(`[ws-event] ${larkAppId} event_type=${et} eventId=${parsed.eventId ?? '?'} meetingId=${parsed.meeting.id || '?'} items=${Array.isArray((data?.event ?? data)?.meeting_actitivty_items) ? (data?.event ?? data).meeting_actitivty_items.length : '?'}`);
3189
- if (et === VC_BOT_MEETING_ACTIVITY_EVENT && process.env.DEBUG) {
3190
- logger.info(`[ws-event:raw] ${larkAppId} event_type=${et} eventId=${parsed.eventId ?? '?'} payload=${vcMeetingEventPayloadForLog(data)}`);
3191
- }
3192
- }
3193
- else if (process.env.DEBUG) {
3194
- logger.info(`[ws-event] ${larkAppId} event_type=${et}`);
3195
- }
3196
- }
3197
- catch { /* 诊断不阻断分发 */ }
3198
- return __origInvoke(data);
3199
- };
3200
- }
3201
- // Start WSClient
3202
- const wsClient = new Lark.WSClient({
3203
- appId: larkAppId,
3204
- appSecret: larkAppSecret,
3205
- // brand → 长连接域名。国际版租户必须连 larksuite.com,否则收不到任何事件。
3206
- domain: sdkDomain(brand),
3207
- // `proxy-from-env` treats WSS_PROXY as distinct from HTTPS_PROXY, while
3208
- // Lark's preceding Axios bootstrap request uses HTTPS proxy semantics.
3209
- // The custom resolver keeps both phases aligned and still honors NO_PROXY.
3210
- agent: createLarkWsAgent(),
3211
- // Default to warn — the SDK is chatty at info ("client ready", reconnect
3212
- // heartbeats, etc.) and floods pm2 error.log when stderr is the only sink.
3213
- // DEBUG=1 widens the level back to info for troubleshooting.
3214
- loggerLevel: process.env.DEBUG ? Lark.LoggerLevel.info : Lark.LoggerLevel.warn,
3215
- // 主机长断网(夜间合盖睡眠、Wi-Fi 切换、VPN 重连)后,SDK 重连要先用 HTTPS 去
3216
- // 飞书换 ws 接入点,这步会 ENOTFOUND / 15s 超时;重连次数由服务端下发且有限,
3217
- // 耗尽后 SDK 置 terminalError 永久放弃,但进程仍 online、PM2 不会兜底 —— 表现为
3218
- // 「必须手动 botmux restart 才能恢复收消息」。下面两道防线让长连接死后自愈。
3219
- //
3220
- // ① pingTimeout:发 ping 后 30s 内无任何 inbound 帧即掐断 socket,触发 close →
3221
- // SDK 自身重连。专治 TCP 半开连接(没收到 FIN/RST、close 事件不触发)的静默卡死。
3222
- wsConfig: { pingTimeout: 30 },
3223
- // 重连握手卡死(DNS/代理/NAT)兜底,避免单次握手永久 pending。
3224
- handshakeTimeoutMs: 15_000,
3225
- // 重连过程打日志,便于事后从 `pnpm daemon:logs` 复盘(warn 默认看不到这些)。
3226
- onReconnecting: () => logger.warn(`[ws] ${larkAppId} reconnecting…`),
3227
- onReconnected: () => logger.info(`[ws] ${larkAppId} reconnected`),
3228
- onError: (err) => logger.error(`[ws] ${larkAppId} terminal error: ${err.message}`),
3229
- });
3230
- wsClient.start({ eventDispatcher });
3231
- logger.info('Daemon WSClient started');
3232
- let listenerPollInFlight = false;
3233
- const listenerPollTimer = setInterval(() => {
3234
- if (listenerPollInFlight)
3235
- return;
3236
- listenerPollInFlight = true;
3237
- void pollMessageListenersOnce(larkAppId, handlers)
3238
- .catch(err => logger.error(`[message-listener:${larkAppId}] poll failed: ${err instanceof Error ? err.message : String(err)}`))
3239
- .finally(() => { listenerPollInFlight = false; });
3240
- }, MESSAGE_LISTENER_POLL_INTERVAL_MS);
3241
- listenerPollTimer.unref();
3242
- const hasListenerBackfill = enabledMessageListenerChatIds(getBot(larkAppId)).length > 0;
3243
- if (hasListenerBackfill) {
3244
- setTimeout(() => {
3245
- if (listenerPollInFlight)
3246
- return;
3247
- listenerPollInFlight = true;
3248
- void pollMessageListenersOnce(larkAppId, handlers)
3249
- .catch(err => logger.error(`[message-listener:${larkAppId}] initial poll failed: ${err instanceof Error ? err.message : String(err)}`))
3250
- .finally(() => { listenerPollInFlight = false; });
3251
- }, 2_000).unref();
3252
- logger.info(`[message-listener:${larkAppId}] polling backfill enabled interval=${MESSAGE_LISTENER_POLL_INTERVAL_MS}ms ` +
3253
- `window=${MESSAGE_LISTENER_BACKFILL_WINDOW_MS}ms chats=${enabledMessageListenerChatIds(getBot(larkAppId)).length}`);
3254
- }
3255
- // ② SDK 重连耗尽后停在 terminalError(getConnectionStatus().state === 'failed')并
3256
- // 永久放弃。每分钟探测一次,发现已放弃就 start() 重新发起一轮全新握手 —— start()
3257
- // 会清掉 terminalError 并重新 pullConnectConfig + connect,无需手动重启 daemon。
3258
- // 只在 'failed' 时介入,不打断 SDK 正在进行的 'reconnecting' / 'connecting'。
3259
- let reviving = false;
3260
- const reviveTimer = setInterval(() => {
3261
- if (reviving)
3262
- return;
3263
- if (wsClient.getConnectionStatus().state !== 'failed')
3264
- return;
3265
- reviving = true;
3266
- logger.warn(`[ws] ${larkAppId} connection failed (reconnect exhausted), restarting WSClient`);
3267
- wsClient.start({ eventDispatcher })
3268
- .catch(err => logger.error(`[ws] ${larkAppId} WSClient restart failed: ${err?.message ?? err}`))
3269
- .finally(() => { reviving = false; });
3270
- }, 60_000);
3271
- reviveTimer.unref();
3272
- return wsClient;
3273
- }
3274
- //# sourceMappingURL=event-dispatcher.js.map