botmux 2.47.0 → 2.47.2

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 (472) hide show
  1. package/README.en.md +10 -5
  2. package/README.md +10 -5
  3. package/dist/adapters/adopt-route.d.ts +63 -0
  4. package/dist/adapters/adopt-route.d.ts.map +1 -0
  5. package/dist/adapters/adopt-route.js +195 -0
  6. package/dist/adapters/adopt-route.js.map +1 -0
  7. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  8. package/dist/adapters/backend/tmux-backend.js +11 -0
  9. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  10. package/dist/adapters/backend/tmux-pipe-backend.d.ts +11 -0
  11. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
  12. package/dist/adapters/backend/tmux-pipe-backend.js +17 -1
  13. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
  14. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  15. package/dist/adapters/cli/claude-code.js +36 -9
  16. package/dist/adapters/cli/claude-code.js.map +1 -1
  17. package/dist/adapters/cli/coco.d.ts.map +1 -1
  18. package/dist/adapters/cli/coco.js +26 -1
  19. package/dist/adapters/cli/coco.js.map +1 -1
  20. package/dist/adapters/cli/codex-app.d.ts +4 -0
  21. package/dist/adapters/cli/codex-app.d.ts.map +1 -0
  22. package/dist/adapters/cli/codex-app.js +72 -0
  23. package/dist/adapters/cli/codex-app.js.map +1 -0
  24. package/dist/adapters/cli/codex.d.ts.map +1 -1
  25. package/dist/adapters/cli/codex.js +34 -17
  26. package/dist/adapters/cli/codex.js.map +1 -1
  27. package/dist/adapters/cli/cursor.d.ts.map +1 -1
  28. package/dist/adapters/cli/cursor.js +58 -12
  29. package/dist/adapters/cli/cursor.js.map +1 -1
  30. package/dist/adapters/cli/gemini.d.ts.map +1 -1
  31. package/dist/adapters/cli/gemini.js +5 -1
  32. package/dist/adapters/cli/gemini.js.map +1 -1
  33. package/dist/adapters/cli/hermes.d.ts +4 -0
  34. package/dist/adapters/cli/hermes.d.ts.map +1 -0
  35. package/dist/adapters/cli/hermes.js +40 -0
  36. package/dist/adapters/cli/hermes.js.map +1 -0
  37. package/dist/adapters/cli/mira.d.ts +4 -0
  38. package/dist/adapters/cli/mira.d.ts.map +1 -0
  39. package/dist/adapters/cli/mira.js +67 -0
  40. package/dist/adapters/cli/mira.js.map +1 -0
  41. package/dist/adapters/cli/mtr.d.ts +5 -0
  42. package/dist/adapters/cli/mtr.d.ts.map +1 -0
  43. package/dist/adapters/cli/mtr.js +62 -0
  44. package/dist/adapters/cli/mtr.js.map +1 -0
  45. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  46. package/dist/adapters/cli/opencode.js +19 -1
  47. package/dist/adapters/cli/opencode.js.map +1 -1
  48. package/dist/adapters/cli/registry.d.ts +5 -1
  49. package/dist/adapters/cli/registry.d.ts.map +1 -1
  50. package/dist/adapters/cli/registry.js +22 -2
  51. package/dist/adapters/cli/registry.js.map +1 -1
  52. package/dist/adapters/cli/shared-hints.d.ts +1 -1
  53. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  54. package/dist/adapters/cli/shared-hints.js +2 -1
  55. package/dist/adapters/cli/shared-hints.js.map +1 -1
  56. package/dist/adapters/cli/types.d.ts +35 -2
  57. package/dist/adapters/cli/types.d.ts.map +1 -1
  58. package/dist/adapters/hook-command.d.ts +18 -0
  59. package/dist/adapters/hook-command.d.ts.map +1 -0
  60. package/dist/adapters/hook-command.js +38 -0
  61. package/dist/adapters/hook-command.js.map +1 -0
  62. package/dist/adapters/hook-installer.d.ts +14 -0
  63. package/dist/adapters/hook-installer.d.ts.map +1 -0
  64. package/dist/adapters/hook-installer.js +192 -0
  65. package/dist/adapters/hook-installer.js.map +1 -0
  66. package/dist/bot-registry.d.ts +59 -0
  67. package/dist/bot-registry.d.ts.map +1 -1
  68. package/dist/bot-registry.js +67 -0
  69. package/dist/bot-registry.js.map +1 -1
  70. package/dist/cli/bots-list-output.d.ts +8 -0
  71. package/dist/cli/bots-list-output.d.ts.map +1 -1
  72. package/dist/cli/bots-list-output.js +9 -0
  73. package/dist/cli/bots-list-output.js.map +1 -1
  74. package/dist/cli.d.ts +15 -1
  75. package/dist/cli.d.ts.map +1 -1
  76. package/dist/cli.js +603 -106
  77. package/dist/cli.js.map +1 -1
  78. package/dist/codex-app-runner.d.ts +3 -0
  79. package/dist/codex-app-runner.d.ts.map +1 -0
  80. package/dist/codex-app-runner.js +512 -0
  81. package/dist/codex-app-runner.js.map +1 -0
  82. package/dist/config.d.ts +11 -2
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +17 -4
  85. package/dist/config.js.map +1 -1
  86. package/dist/core/ask-api.d.ts +47 -0
  87. package/dist/core/ask-api.d.ts.map +1 -0
  88. package/dist/core/ask-api.js +139 -0
  89. package/dist/core/ask-api.js.map +1 -0
  90. package/dist/core/ask-args.d.ts +53 -0
  91. package/dist/core/ask-args.d.ts.map +1 -0
  92. package/dist/core/ask-args.js +122 -0
  93. package/dist/core/ask-args.js.map +1 -0
  94. package/dist/core/ask-broker.d.ts +98 -0
  95. package/dist/core/ask-broker.d.ts.map +1 -0
  96. package/dist/core/ask-broker.js +329 -0
  97. package/dist/core/ask-broker.js.map +1 -0
  98. package/dist/core/ask-hook/claude-code.d.ts +50 -0
  99. package/dist/core/ask-hook/claude-code.d.ts.map +1 -0
  100. package/dist/core/ask-hook/claude-code.js +145 -0
  101. package/dist/core/ask-hook/claude-code.js.map +1 -0
  102. package/dist/core/ask-hook/codex.d.ts +43 -0
  103. package/dist/core/ask-hook/codex.d.ts.map +1 -0
  104. package/dist/core/ask-hook/codex.js +69 -0
  105. package/dist/core/ask-hook/codex.js.map +1 -0
  106. package/dist/core/ask-hook/opencode.d.ts +41 -0
  107. package/dist/core/ask-hook/opencode.d.ts.map +1 -0
  108. package/dist/core/ask-hook/opencode.js +108 -0
  109. package/dist/core/ask-hook/opencode.js.map +1 -0
  110. package/dist/core/ask-hook/registry.d.ts +3 -0
  111. package/dist/core/ask-hook/registry.d.ts.map +1 -0
  112. package/dist/core/ask-hook/registry.js +12 -0
  113. package/dist/core/ask-hook/registry.js.map +1 -0
  114. package/dist/core/ask-hook/types.d.ts +26 -0
  115. package/dist/core/ask-hook/types.d.ts.map +1 -0
  116. package/dist/core/ask-hook/types.js +2 -0
  117. package/dist/core/ask-hook/types.js.map +1 -0
  118. package/dist/core/ask-types.d.ts +146 -0
  119. package/dist/core/ask-types.d.ts.map +1 -0
  120. package/dist/core/ask-types.js +18 -0
  121. package/dist/core/ask-types.js.map +1 -0
  122. package/dist/core/command-handler.d.ts +29 -0
  123. package/dist/core/command-handler.d.ts.map +1 -1
  124. package/dist/core/command-handler.js +787 -312
  125. package/dist/core/command-handler.js.map +1 -1
  126. package/dist/core/dashboard-ipc-server.d.ts +2 -0
  127. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  128. package/dist/core/dashboard-ipc-server.js +222 -2
  129. package/dist/core/dashboard-ipc-server.js.map +1 -1
  130. package/dist/core/role-resolver.d.ts +17 -1
  131. package/dist/core/role-resolver.d.ts.map +1 -1
  132. package/dist/core/role-resolver.js +64 -10
  133. package/dist/core/role-resolver.js.map +1 -1
  134. package/dist/core/session-discovery.d.ts.map +1 -1
  135. package/dist/core/session-discovery.js +19 -5
  136. package/dist/core/session-discovery.js.map +1 -1
  137. package/dist/core/session-manager.d.ts +1 -1
  138. package/dist/core/session-manager.d.ts.map +1 -1
  139. package/dist/core/session-manager.js +37 -20
  140. package/dist/core/session-manager.js.map +1 -1
  141. package/dist/core/trigger-session.d.ts +9 -0
  142. package/dist/core/trigger-session.d.ts.map +1 -0
  143. package/dist/core/trigger-session.js +158 -0
  144. package/dist/core/trigger-session.js.map +1 -0
  145. package/dist/core/types.d.ts +5 -0
  146. package/dist/core/types.d.ts.map +1 -1
  147. package/dist/core/types.js.map +1 -1
  148. package/dist/core/worker-pool.d.ts +141 -0
  149. package/dist/core/worker-pool.d.ts.map +1 -1
  150. package/dist/core/worker-pool.js +543 -24
  151. package/dist/core/worker-pool.js.map +1 -1
  152. package/dist/daemon.d.ts.map +1 -1
  153. package/dist/daemon.js +224 -60
  154. package/dist/daemon.js.map +1 -1
  155. package/dist/dashboard/auth.d.ts +6 -1
  156. package/dist/dashboard/auth.d.ts.map +1 -1
  157. package/dist/dashboard/auth.js +9 -1
  158. package/dist/dashboard/auth.js.map +1 -1
  159. package/dist/dashboard/connector-api.d.ts +3 -0
  160. package/dist/dashboard/connector-api.d.ts.map +1 -0
  161. package/dist/dashboard/connector-api.js +351 -0
  162. package/dist/dashboard/connector-api.js.map +1 -0
  163. package/dist/dashboard/federated-group-core.d.ts +54 -0
  164. package/dist/dashboard/federated-group-core.d.ts.map +1 -0
  165. package/dist/dashboard/federated-group-core.js +165 -0
  166. package/dist/dashboard/federated-group-core.js.map +1 -0
  167. package/dist/dashboard/federation-api.d.ts +42 -0
  168. package/dist/dashboard/federation-api.d.ts.map +1 -0
  169. package/dist/dashboard/federation-api.js +408 -0
  170. package/dist/dashboard/federation-api.js.map +1 -0
  171. package/dist/dashboard/federation-spoke-api.d.ts +76 -0
  172. package/dist/dashboard/federation-spoke-api.d.ts.map +1 -0
  173. package/dist/dashboard/federation-spoke-api.js +618 -0
  174. package/dist/dashboard/federation-spoke-api.js.map +1 -0
  175. package/dist/dashboard/team-group.d.ts +18 -0
  176. package/dist/dashboard/team-group.d.ts.map +1 -0
  177. package/dist/dashboard/team-group.js +7 -0
  178. package/dist/dashboard/team-group.js.map +1 -0
  179. package/dist/dashboard/trigger-api.d.ts +13 -0
  180. package/dist/dashboard/trigger-api.d.ts.map +1 -0
  181. package/dist/dashboard/trigger-api.js +77 -0
  182. package/dist/dashboard/trigger-api.js.map +1 -0
  183. package/dist/dashboard/web/app.js +8 -0
  184. package/dist/dashboard/web/app.js.map +1 -1
  185. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  186. package/dist/dashboard/web/bot-defaults.js +205 -21
  187. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  188. package/dist/dashboard/web/connectors.d.ts +2 -0
  189. package/dist/dashboard/web/connectors.d.ts.map +1 -0
  190. package/dist/dashboard/web/connectors.js +187 -0
  191. package/dist/dashboard/web/connectors.js.map +1 -0
  192. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  193. package/dist/dashboard/web/i18n.js +43 -5
  194. package/dist/dashboard/web/i18n.js.map +1 -1
  195. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  196. package/dist/dashboard/web/sessions.js +4 -0
  197. package/dist/dashboard/web/sessions.js.map +1 -1
  198. package/dist/dashboard/web/team-federation.d.ts +3 -0
  199. package/dist/dashboard/web/team-federation.d.ts.map +1 -0
  200. package/dist/dashboard/web/team-federation.js +487 -0
  201. package/dist/dashboard/web/team-federation.js.map +1 -0
  202. package/dist/dashboard/web/workflows.js +3 -3
  203. package/dist/dashboard/web/workflows.js.map +1 -1
  204. package/dist/dashboard/webhook-routes.d.ts +19 -0
  205. package/dist/dashboard/webhook-routes.d.ts.map +1 -0
  206. package/dist/dashboard/webhook-routes.js +321 -0
  207. package/dist/dashboard/webhook-routes.js.map +1 -0
  208. package/dist/dashboard/workflow-api.d.ts +8 -1
  209. package/dist/dashboard/workflow-api.d.ts.map +1 -1
  210. package/dist/dashboard/workflow-api.js +19 -4
  211. package/dist/dashboard/workflow-api.js.map +1 -1
  212. package/dist/dashboard-web/app.js +539 -375
  213. package/dist/dashboard-web/index.html +3 -1
  214. package/dist/dashboard-web/style.css +22 -0
  215. package/dist/dashboard.js +199 -2
  216. package/dist/dashboard.js.map +1 -1
  217. package/dist/i18n/en.d.ts.map +1 -1
  218. package/dist/i18n/en.js +104 -11
  219. package/dist/i18n/en.js.map +1 -1
  220. package/dist/i18n/zh.d.ts.map +1 -1
  221. package/dist/i18n/zh.js +104 -11
  222. package/dist/i18n/zh.js.map +1 -1
  223. package/dist/im/lark/ask-card.d.ts +55 -0
  224. package/dist/im/lark/ask-card.d.ts.map +1 -0
  225. package/dist/im/lark/ask-card.js +328 -0
  226. package/dist/im/lark/ask-card.js.map +1 -0
  227. package/dist/im/lark/card-builder.d.ts +108 -3
  228. package/dist/im/lark/card-builder.d.ts.map +1 -1
  229. package/dist/im/lark/card-builder.js +480 -50
  230. package/dist/im/lark/card-builder.js.map +1 -1
  231. package/dist/im/lark/card-handler.d.ts.map +1 -1
  232. package/dist/im/lark/card-handler.js +241 -18
  233. package/dist/im/lark/card-handler.js.map +1 -1
  234. package/dist/im/lark/client.d.ts +83 -0
  235. package/dist/im/lark/client.d.ts.map +1 -1
  236. package/dist/im/lark/client.js +286 -70
  237. package/dist/im/lark/client.js.map +1 -1
  238. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  239. package/dist/im/lark/event-dispatcher.js +29 -4
  240. package/dist/im/lark/event-dispatcher.js.map +1 -1
  241. package/dist/im/lark/grant-command.d.ts +2 -1
  242. package/dist/im/lark/grant-command.d.ts.map +1 -1
  243. package/dist/im/lark/grant-command.js +3 -2
  244. package/dist/im/lark/grant-command.js.map +1 -1
  245. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  246. package/dist/im/lark/identity-cache.js +3 -3
  247. package/dist/im/lark/identity-cache.js.map +1 -1
  248. package/dist/im/lark/md-card.d.ts +20 -2
  249. package/dist/im/lark/md-card.d.ts.map +1 -1
  250. package/dist/im/lark/md-card.js +49 -17
  251. package/dist/im/lark/md-card.js.map +1 -1
  252. package/dist/im/lark/message-parser.d.ts.map +1 -1
  253. package/dist/im/lark/message-parser.js +87 -31
  254. package/dist/im/lark/message-parser.js.map +1 -1
  255. package/dist/im/lark/workflow-card-handler.d.ts +2 -2
  256. package/dist/im/lark/workflow-card-handler.d.ts.map +1 -1
  257. package/dist/im/lark/workflow-card-handler.js +12 -1
  258. package/dist/im/lark/workflow-card-handler.js.map +1 -1
  259. package/dist/im/lark/workflow-progress-card.d.ts.map +1 -1
  260. package/dist/im/lark/workflow-progress-card.js +53 -0
  261. package/dist/im/lark/workflow-progress-card.js.map +1 -1
  262. package/dist/mira-output.d.ts +3 -0
  263. package/dist/mira-output.d.ts.map +1 -0
  264. package/dist/mira-output.js +136 -0
  265. package/dist/mira-output.js.map +1 -0
  266. package/dist/mira-runner.d.ts +3 -0
  267. package/dist/mira-runner.d.ts.map +1 -0
  268. package/dist/mira-runner.js +534 -0
  269. package/dist/mira-runner.js.map +1 -0
  270. package/dist/services/bot-owner-store.d.ts +28 -0
  271. package/dist/services/bot-owner-store.d.ts.map +1 -0
  272. package/dist/services/bot-owner-store.js +82 -0
  273. package/dist/services/bot-owner-store.js.map +1 -0
  274. package/dist/services/bot-profile-store.d.ts +16 -0
  275. package/dist/services/bot-profile-store.d.ts.map +1 -0
  276. package/dist/services/bot-profile-store.js +98 -0
  277. package/dist/services/bot-profile-store.js.map +1 -0
  278. package/dist/services/brand-store.d.ts +15 -0
  279. package/dist/services/brand-store.d.ts.map +1 -0
  280. package/dist/services/brand-store.js +47 -0
  281. package/dist/services/brand-store.js.map +1 -0
  282. package/dist/services/card-prefs-store.d.ts +20 -0
  283. package/dist/services/card-prefs-store.d.ts.map +1 -0
  284. package/dist/services/card-prefs-store.js +82 -0
  285. package/dist/services/card-prefs-store.js.map +1 -0
  286. package/dist/services/codex-bridge-queue.d.ts +1 -0
  287. package/dist/services/codex-bridge-queue.d.ts.map +1 -1
  288. package/dist/services/codex-bridge-queue.js +23 -0
  289. package/dist/services/codex-bridge-queue.js.map +1 -1
  290. package/dist/services/codex-transcript.d.ts +1 -0
  291. package/dist/services/codex-transcript.d.ts.map +1 -1
  292. package/dist/services/codex-transcript.js.map +1 -1
  293. package/dist/services/connector-store.d.ts +58 -0
  294. package/dist/services/connector-store.d.ts.map +1 -0
  295. package/dist/services/connector-store.js +79 -0
  296. package/dist/services/connector-store.js.map +1 -0
  297. package/dist/services/deployment-identity.d.ts +22 -0
  298. package/dist/services/deployment-identity.d.ts.map +1 -0
  299. package/dist/services/deployment-identity.js +67 -0
  300. package/dist/services/deployment-identity.js.map +1 -0
  301. package/dist/services/federation-membership-store.d.ts +23 -0
  302. package/dist/services/federation-membership-store.d.ts.map +1 -0
  303. package/dist/services/federation-membership-store.js +66 -0
  304. package/dist/services/federation-membership-store.js.map +1 -0
  305. package/dist/services/federation-roster.d.ts +54 -0
  306. package/dist/services/federation-roster.d.ts.map +1 -0
  307. package/dist/services/federation-roster.js +51 -0
  308. package/dist/services/federation-roster.js.map +1 -0
  309. package/dist/services/federation-store.d.ts +76 -0
  310. package/dist/services/federation-store.d.ts.map +1 -0
  311. package/dist/services/federation-store.js +133 -0
  312. package/dist/services/federation-store.js.map +1 -0
  313. package/dist/services/grant-store.d.ts +12 -2
  314. package/dist/services/grant-store.d.ts.map +1 -1
  315. package/dist/services/grant-store.js +51 -4
  316. package/dist/services/grant-store.js.map +1 -1
  317. package/dist/services/group-creator.d.ts +10 -0
  318. package/dist/services/group-creator.d.ts.map +1 -1
  319. package/dist/services/group-creator.js +26 -1
  320. package/dist/services/group-creator.js.map +1 -1
  321. package/dist/services/groups-store.d.ts +30 -0
  322. package/dist/services/groups-store.d.ts.map +1 -1
  323. package/dist/services/groups-store.js +85 -12
  324. package/dist/services/groups-store.js.map +1 -1
  325. package/dist/services/hermes-transcript.d.ts +7 -0
  326. package/dist/services/hermes-transcript.d.ts.map +1 -0
  327. package/dist/services/hermes-transcript.js +117 -0
  328. package/dist/services/hermes-transcript.js.map +1 -0
  329. package/dist/services/invite-store.d.ts +28 -0
  330. package/dist/services/invite-store.d.ts.map +1 -0
  331. package/dist/services/invite-store.js +85 -0
  332. package/dist/services/invite-store.js.map +1 -0
  333. package/dist/services/pairing-store.d.ts +47 -0
  334. package/dist/services/pairing-store.d.ts.map +1 -0
  335. package/dist/services/pairing-store.js +132 -0
  336. package/dist/services/pairing-store.js.map +1 -0
  337. package/dist/services/project-scanner.d.ts +10 -0
  338. package/dist/services/project-scanner.d.ts.map +1 -1
  339. package/dist/services/project-scanner.js +11 -0
  340. package/dist/services/project-scanner.js.map +1 -1
  341. package/dist/services/relay-picker.d.ts +22 -0
  342. package/dist/services/relay-picker.d.ts.map +1 -0
  343. package/dist/services/relay-picker.js +62 -0
  344. package/dist/services/relay-picker.js.map +1 -0
  345. package/dist/services/send-policy.d.ts +55 -0
  346. package/dist/services/send-policy.d.ts.map +1 -0
  347. package/dist/services/send-policy.js +47 -0
  348. package/dist/services/send-policy.js.map +1 -0
  349. package/dist/services/session-store.js +1 -1
  350. package/dist/services/session-store.js.map +1 -1
  351. package/dist/services/team-roster.d.ts +38 -0
  352. package/dist/services/team-roster.d.ts.map +1 -0
  353. package/dist/services/team-roster.js +82 -0
  354. package/dist/services/team-roster.js.map +1 -0
  355. package/dist/services/team-store.d.ts +54 -0
  356. package/dist/services/team-store.d.ts.map +1 -0
  357. package/dist/services/team-store.js +156 -0
  358. package/dist/services/team-store.js.map +1 -0
  359. package/dist/services/trigger-log-store.d.ts +46 -0
  360. package/dist/services/trigger-log-store.d.ts.map +1 -0
  361. package/dist/services/trigger-log-store.js +132 -0
  362. package/dist/services/trigger-log-store.js.map +1 -0
  363. package/dist/services/trigger-types.d.ts +57 -0
  364. package/dist/services/trigger-types.d.ts.map +1 -0
  365. package/dist/services/trigger-types.js +28 -0
  366. package/dist/services/trigger-types.js.map +1 -0
  367. package/dist/services/webhook-key.d.ts +16 -0
  368. package/dist/services/webhook-key.d.ts.map +1 -0
  369. package/dist/services/webhook-key.js +123 -0
  370. package/dist/services/webhook-key.js.map +1 -0
  371. package/dist/services/webhook-lifecycle-extractors.d.ts +15 -0
  372. package/dist/services/webhook-lifecycle-extractors.d.ts.map +1 -0
  373. package/dist/services/webhook-lifecycle-extractors.js +59 -0
  374. package/dist/services/webhook-lifecycle-extractors.js.map +1 -0
  375. package/dist/services/webhook-lifecycle-store.d.ts +45 -0
  376. package/dist/services/webhook-lifecycle-store.d.ts.map +1 -0
  377. package/dist/services/webhook-lifecycle-store.js +159 -0
  378. package/dist/services/webhook-lifecycle-store.js.map +1 -0
  379. package/dist/setup/bot-config-editor.d.ts +8 -1
  380. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  381. package/dist/setup/bot-config-editor.js +20 -2
  382. package/dist/setup/bot-config-editor.js.map +1 -1
  383. package/dist/setup/ensure-tmux.d.ts +0 -22
  384. package/dist/setup/ensure-tmux.d.ts.map +1 -1
  385. package/dist/setup/ensure-tmux.js +25 -1
  386. package/dist/setup/ensure-tmux.js.map +1 -1
  387. package/dist/setup/verify-permissions.d.ts.map +1 -1
  388. package/dist/setup/verify-permissions.js +15 -1
  389. package/dist/setup/verify-permissions.js.map +1 -1
  390. package/dist/skills/definitions.d.ts +2 -0
  391. package/dist/skills/definitions.d.ts.map +1 -1
  392. package/dist/skills/definitions.js +178 -12
  393. package/dist/skills/definitions.js.map +1 -1
  394. package/dist/skills/installer.d.ts +34 -0
  395. package/dist/skills/installer.d.ts.map +1 -1
  396. package/dist/skills/installer.js +119 -2
  397. package/dist/skills/installer.js.map +1 -1
  398. package/dist/types.d.ts +29 -0
  399. package/dist/types.d.ts.map +1 -1
  400. package/dist/utils/bot-routing.d.ts +50 -0
  401. package/dist/utils/bot-routing.d.ts.map +1 -1
  402. package/dist/utils/bot-routing.js +83 -0
  403. package/dist/utils/bot-routing.js.map +1 -1
  404. package/dist/utils/daemon-discovery.d.ts +11 -0
  405. package/dist/utils/daemon-discovery.d.ts.map +1 -0
  406. package/dist/utils/daemon-discovery.js +59 -0
  407. package/dist/utils/daemon-discovery.js.map +1 -0
  408. package/dist/utils/user-token.d.ts.map +1 -1
  409. package/dist/utils/user-token.js +0 -2
  410. package/dist/utils/user-token.js.map +1 -1
  411. package/dist/worker.js +233 -51
  412. package/dist/worker.js.map +1 -1
  413. package/dist/workflows/attempt-resume.d.ts.map +1 -1
  414. package/dist/workflows/attempt-resume.js +2 -2
  415. package/dist/workflows/attempt-resume.js.map +1 -1
  416. package/dist/workflows/definition.d.ts +412 -9
  417. package/dist/workflows/definition.d.ts.map +1 -1
  418. package/dist/workflows/definition.js +238 -3
  419. package/dist/workflows/definition.js.map +1 -1
  420. package/dist/workflows/events/payloads.d.ts +114 -11
  421. package/dist/workflows/events/payloads.d.ts.map +1 -1
  422. package/dist/workflows/events/payloads.js +46 -0
  423. package/dist/workflows/events/payloads.js.map +1 -1
  424. package/dist/workflows/events/replay.d.ts +21 -0
  425. package/dist/workflows/events/replay.d.ts.map +1 -1
  426. package/dist/workflows/events/replay.js +103 -0
  427. package/dist/workflows/events/replay.js.map +1 -1
  428. package/dist/workflows/events/schema.d.ts +1301 -606
  429. package/dist/workflows/events/schema.d.ts.map +1 -1
  430. package/dist/workflows/events/schema.js +37 -1
  431. package/dist/workflows/events/schema.js.map +1 -1
  432. package/dist/workflows/events/types.d.ts +5 -1
  433. package/dist/workflows/events/types.d.ts.map +1 -1
  434. package/dist/workflows/loader.d.ts +14 -0
  435. package/dist/workflows/loader.d.ts.map +1 -1
  436. package/dist/workflows/loader.js +27 -0
  437. package/dist/workflows/loader.js.map +1 -1
  438. package/dist/workflows/loop.js +58 -0
  439. package/dist/workflows/loop.js.map +1 -1
  440. package/dist/workflows/ops-projection.d.ts +58 -0
  441. package/dist/workflows/ops-projection.d.ts.map +1 -1
  442. package/dist/workflows/ops-projection.js +74 -0
  443. package/dist/workflows/ops-projection.js.map +1 -1
  444. package/dist/workflows/orchestrator.d.ts +65 -1
  445. package/dist/workflows/orchestrator.d.ts.map +1 -1
  446. package/dist/workflows/orchestrator.js +486 -74
  447. package/dist/workflows/orchestrator.js.map +1 -1
  448. package/dist/workflows/output-binding.d.ts +8 -1
  449. package/dist/workflows/output-binding.d.ts.map +1 -1
  450. package/dist/workflows/output-binding.js +75 -11
  451. package/dist/workflows/output-binding.js.map +1 -1
  452. package/dist/workflows/runtime.d.ts +1 -1
  453. package/dist/workflows/runtime.d.ts.map +1 -1
  454. package/dist/workflows/runtime.js +39 -4
  455. package/dist/workflows/runtime.js.map +1 -1
  456. package/dist/workflows/trigger-from-envelope.d.ts +13 -0
  457. package/dist/workflows/trigger-from-envelope.d.ts.map +1 -0
  458. package/dist/workflows/trigger-from-envelope.js +67 -0
  459. package/dist/workflows/trigger-from-envelope.js.map +1 -0
  460. package/dist/workflows/wait.d.ts +23 -2
  461. package/dist/workflows/wait.d.ts.map +1 -1
  462. package/dist/workflows/wait.js +39 -17
  463. package/dist/workflows/wait.js.map +1 -1
  464. package/package.json +1 -1
  465. package/dist/services/feishu-task-client.d.ts +0 -28
  466. package/dist/services/feishu-task-client.d.ts.map +0 -1
  467. package/dist/services/feishu-task-client.js +0 -123
  468. package/dist/services/feishu-task-client.js.map +0 -1
  469. package/dist/services/task-store.d.ts +0 -37
  470. package/dist/services/task-store.d.ts.map +0 -1
  471. package/dist/services/task-store.js +0 -115
  472. package/dist/services/task-store.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Pure helpers for the daemon's `POST /api/asks` IPC route.
3
+ *
4
+ * Kept separate from daemon.ts so the body-validator and the approver
5
+ * fallback chain (§6) are unit-testable without spinning up an HTTP server,
6
+ * registering bots, or mounting a full session map.
7
+ */
8
+ import type { AskQuestion } from './ask-types.js';
9
+ export interface AskApiBody {
10
+ sessionId: string;
11
+ chatId: string;
12
+ larkAppId: string;
13
+ rootMessageId: string | null;
14
+ /** v0.1.8:替换旧的 options/prompt,支持多问多选。 */
15
+ questions: AskQuestion[];
16
+ /** Already in milliseconds. CLI side converts from `--timeout` seconds. */
17
+ timeoutMs: number;
18
+ /** Empty array → use the §6 fallback chain. */
19
+ approvers: string[];
20
+ }
21
+ export type AskApiBodyError = 'bad_body' | 'bad_sessionId' | 'bad_chatId' | 'bad_larkAppId' | 'bad_rootMessageId' | 'bad_prompt' | 'bad_timeoutMs' | 'bad_options' | 'bad_option_shape' | 'bad_option_key' | 'bad_option_label' | 'duplicate_option_key' | 'bad_questions' | 'bad_question_shape' | 'bad_multiSelect';
22
+ /** Validate the request body. Returns either the parsed body or an error code
23
+ * ready to be sent back as `{ ok: false, error }` with HTTP 400.
24
+ *
25
+ * v0.1.8:
26
+ * - 优先识别 `questions[]` 新格式(多问多选)。
27
+ * - 兼容旧的 `options[]` + `prompt` 格式,归一化为单问单选的 questions[]。
28
+ * - 两者都没有则返回 `bad_options`。 */
29
+ export declare function parseAskBody(raw: unknown): AskApiBody | {
30
+ error: AskApiBodyError;
31
+ };
32
+ /** Resolve the approver allowlist per §6 fallback chain:
33
+ * 1. explicit `--approver` list from CLI args (non-empty wins outright)
34
+ * 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
35
+ * 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
36
+ *
37
+ * Pure function: caller injects the lookups. The daemon wires
38
+ * `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
39
+ * `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
40
+ export declare function resolveAskApprovers(args: {
41
+ larkAppId: string;
42
+ sessionId: string;
43
+ explicit: ReadonlyArray<string>;
44
+ getBotAllowedUsers: (larkAppId: string) => ReadonlyArray<string>;
45
+ getSessionOwner: (sessionId: string) => string | undefined;
46
+ }): Set<string>;
47
+ //# sourceMappingURL=ask-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-api.d.ts","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,yCAAyC;IACzC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,eAAe,GACf,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,oBAAoB,GACpB,iBAAiB,CAAC;AAkCtB;;;;;;gCAMgC;AAChC,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,eAAe,CAAA;CAAE,CA4DlF;AAED;;;;;;;2EAO2E;AAC3E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC5D,GAAG,GAAG,CAAC,MAAM,CAAC,CAQd"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Pure helpers for the daemon's `POST /api/asks` IPC route.
3
+ *
4
+ * Kept separate from daemon.ts so the body-validator and the approver
5
+ * fallback chain (§6) are unit-testable without spinning up an HTTP server,
6
+ * registering bots, or mounting a full session map.
7
+ */
8
+ /** 校验单个 option 对象,返回解析后的 AskOption 或错误码。 */
9
+ function parseOption(o) {
10
+ if (!o || typeof o !== 'object')
11
+ return 'bad_option_shape';
12
+ const oo = o;
13
+ if (typeof oo.key !== 'string' || !oo.key.trim())
14
+ return 'bad_option_key';
15
+ if (typeof oo.label !== 'string')
16
+ return 'bad_option_label';
17
+ return { key: oo.key, label: oo.label };
18
+ }
19
+ /** 校验 questions[] 数组,返回解析后的 AskQuestion[] 或错误码。 */
20
+ function parseQuestions(arr) {
21
+ const result = [];
22
+ for (const q of arr) {
23
+ if (!q || typeof q !== 'object' || Array.isArray(q))
24
+ return 'bad_question_shape';
25
+ const qq = q;
26
+ if (typeof qq.prompt !== 'string' || !qq.prompt.trim())
27
+ return 'bad_question_shape';
28
+ if (typeof qq.multiSelect !== 'boolean')
29
+ return 'bad_multiSelect';
30
+ if (!Array.isArray(qq.options) || qq.options.length < 2)
31
+ return 'bad_options';
32
+ const opts = [];
33
+ const seen = new Set();
34
+ for (const o of qq.options) {
35
+ const parsed = parseOption(o);
36
+ if (typeof parsed === 'string')
37
+ return parsed;
38
+ if (seen.has(parsed.key))
39
+ return 'duplicate_option_key';
40
+ seen.add(parsed.key);
41
+ opts.push(parsed);
42
+ }
43
+ result.push({ prompt: qq.prompt, multiSelect: qq.multiSelect, options: opts });
44
+ }
45
+ return result;
46
+ }
47
+ /** Validate the request body. Returns either the parsed body or an error code
48
+ * ready to be sent back as `{ ok: false, error }` with HTTP 400.
49
+ *
50
+ * v0.1.8:
51
+ * - 优先识别 `questions[]` 新格式(多问多选)。
52
+ * - 兼容旧的 `options[]` + `prompt` 格式,归一化为单问单选的 questions[]。
53
+ * - 两者都没有则返回 `bad_options`。 */
54
+ export function parseAskBody(raw) {
55
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
56
+ return { error: 'bad_body' };
57
+ const r = raw;
58
+ if (typeof r.sessionId !== 'string' || !r.sessionId.trim())
59
+ return { error: 'bad_sessionId' };
60
+ if (typeof r.chatId !== 'string' || !r.chatId.trim())
61
+ return { error: 'bad_chatId' };
62
+ if (typeof r.larkAppId !== 'string' || !r.larkAppId.trim())
63
+ return { error: 'bad_larkAppId' };
64
+ if (r.rootMessageId !== null && typeof r.rootMessageId !== 'string') {
65
+ return { error: 'bad_rootMessageId' };
66
+ }
67
+ if (typeof r.timeoutMs !== 'number' ||
68
+ !Number.isFinite(r.timeoutMs) ||
69
+ r.timeoutMs < 1000) {
70
+ return { error: 'bad_timeoutMs' };
71
+ }
72
+ const approvers = Array.isArray(r.approvers)
73
+ ? r.approvers.filter((s) => typeof s === 'string' && s.trim().length > 0)
74
+ : [];
75
+ let questions;
76
+ if (Array.isArray(r.questions)) {
77
+ // 新格式:questions[] 多问多选
78
+ if (r.questions.length === 0)
79
+ return { error: 'bad_questions' };
80
+ const parsed = parseQuestions(r.questions);
81
+ if (typeof parsed === 'string')
82
+ return { error: parsed };
83
+ questions = parsed;
84
+ }
85
+ else if (Array.isArray(r.options) && typeof r.prompt === 'string' && r.prompt.trim()) {
86
+ // 旧格式兼容:options[] + prompt → 归一化为单问单选
87
+ if (r.options.length < 2)
88
+ return { error: 'bad_options' };
89
+ const opts = [];
90
+ const seen = new Set();
91
+ for (const o of r.options) {
92
+ const parsed = parseOption(o);
93
+ if (typeof parsed === 'string')
94
+ return { error: parsed };
95
+ if (seen.has(parsed.key))
96
+ return { error: 'duplicate_option_key' };
97
+ seen.add(parsed.key);
98
+ opts.push(parsed);
99
+ }
100
+ questions = [{ prompt: r.prompt, multiSelect: false, options: opts }];
101
+ }
102
+ else {
103
+ // 旧格式:仅有 prompt 校验(无 options 或 options 不合法)
104
+ if (typeof r.prompt !== 'string' || !r.prompt.trim())
105
+ return { error: 'bad_prompt' };
106
+ if (!Array.isArray(r.options) || r.options.length < 2)
107
+ return { error: 'bad_options' };
108
+ // 走到这里说明 options 是数组但长度不足,上面已处理,此处不可达
109
+ return { error: 'bad_options' };
110
+ }
111
+ return {
112
+ sessionId: r.sessionId,
113
+ chatId: r.chatId,
114
+ larkAppId: r.larkAppId,
115
+ rootMessageId: r.rootMessageId,
116
+ questions,
117
+ timeoutMs: r.timeoutMs,
118
+ approvers,
119
+ };
120
+ }
121
+ /** Resolve the approver allowlist per §6 fallback chain:
122
+ * 1. explicit `--approver` list from CLI args (non-empty wins outright)
123
+ * 2. session.ownerOpenId ∩ bot.allowedUsers (single-owner topic chats)
124
+ * 3. bot.allowedUsers (shared chats / no owner / owner not in allow)
125
+ *
126
+ * Pure function: caller injects the lookups. The daemon wires
127
+ * `getBotAllowedUsers = (id) => getBot(id).resolvedAllowedUsers` and
128
+ * `getSessionOwner` = scan over activeSessions; tests pass stub funcs. */
129
+ export function resolveAskApprovers(args) {
130
+ const explicit = args.explicit.filter((s) => s.trim().length > 0);
131
+ if (explicit.length > 0)
132
+ return new Set(explicit);
133
+ const allow = args.getBotAllowedUsers(args.larkAppId);
134
+ const owner = args.getSessionOwner(args.sessionId);
135
+ if (owner && allow.includes(owner))
136
+ return new Set([owner]);
137
+ return new Set(allow);
138
+ }
139
+ //# sourceMappingURL=ask-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-api.js","sourceRoot":"","sources":["../../src/core/ask-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pure helpers for `botmux ask` argument parsing.
3
+ *
4
+ * Kept in its own file (no I/O, no env reads) so the CSV / timeout / approver
5
+ * parsing can be unit-tested without spinning up a daemon. The actual CLI
6
+ * dispatch (`cmdAsk`) lives in cli.ts and calls these helpers.
7
+ */
8
+ import type { AskOption } from './ask-types.js';
9
+ export declare class AskArgsError extends Error {
10
+ readonly code: 'options_missing' | 'options_too_few' | 'options_empty_key' | 'options_duplicate_key' | 'timeout_out_of_range' | 'timeout_not_number';
11
+ constructor(code: 'options_missing' | 'options_too_few' | 'options_empty_key' | 'options_duplicate_key' | 'timeout_out_of_range' | 'timeout_not_number', message: string);
12
+ }
13
+ /** Parse `--options` CSV. Each item is either `key` (key==label) or `key=label`.
14
+ *
15
+ * Rules:
16
+ * - Trims whitespace around each item and around `key=label` halves.
17
+ * - Drops empty items (trailing commas / `"a,,b"`); does not count them.
18
+ * - Requires ≥ 2 distinct keys after parsing.
19
+ * - Empty `key` (e.g. `"=label"`) is rejected.
20
+ * - Duplicate keys are rejected — let the caller surface a clear error rather
21
+ * than silently de-duping (which would change observable button count).
22
+ * - The first `=` splits key/label; subsequent `=` are part of the label, so
23
+ * `"go=继续=右"` → key=`go`, label=`继续=右`. */
24
+ export declare function parseAskOptions(raw: string | undefined): AskOption[];
25
+ /** Parse `--timeout <seconds>` → milliseconds. Bounds match §7:
26
+ * - lower bound: 10s (sub-10s asks are almost always a bug)
27
+ * - upper bound: 3600s (1h — past that, recovery should kick in v0.1.8)
28
+ * - default: 300s (caller passes `undefined` to use it) */
29
+ export declare function parseAskTimeoutSeconds(raw: string | undefined, defaults?: {
30
+ default: number;
31
+ min: number;
32
+ max: number;
33
+ }): number;
34
+ /** Resolve the `(sub, rest)` pair for `botmux ask`'s top-level dispatch.
35
+ *
36
+ * Input: positional args *after* the `ask` token. So for the user typing
37
+ * `botmux ask buttons --options yes,no "prompt"` we get
38
+ * `['buttons', '--options', 'yes,no', 'prompt']`; for the bare alias
39
+ * `botmux ask --options yes,no "prompt"` we get
40
+ * `['--options', 'yes,no', 'prompt']`.
41
+ *
42
+ * The first positional starting with `--` means the user skipped the
43
+ * subcommand and went straight to flags — that's the bare-alias path; we
44
+ * return `sub=''` and let `cmdAsk` apply its v0.1.7 `buttons` default.
45
+ * Otherwise the first positional is the subcommand. */
46
+ export declare function normalizeAskDispatch(tail: ReadonlyArray<string>): {
47
+ sub: string;
48
+ rest: string[];
49
+ };
50
+ /** Required env vars on the CLI side (§5). Returns the first missing one so
51
+ * the caller can produce a single, specific error message. */
52
+ export declare function findMissingAskEnv(env: NodeJS.ProcessEnv): string | null;
53
+ //# sourceMappingURL=ask-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-args.d.ts","sourceRoot":"","sources":["../../src/core/ask-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,YAAa,SAAQ,KAAK;aAEnB,IAAI,EAChB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB;gBANR,IAAI,EAChB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,EACxB,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;;;;;;+CAU+C;AAC/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,CA8CpE;AAED;;;6DAG6D;AAC7D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAIpD,GACA,MAAM,CAkBR;AAED;;;;;;;;;;;wDAWwD;AACxD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAC1B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAMjC;AAED;+DAC+D;AAC/D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,GAAG,IAAI,CAWf"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Pure helpers for `botmux ask` argument parsing.
3
+ *
4
+ * Kept in its own file (no I/O, no env reads) so the CSV / timeout / approver
5
+ * parsing can be unit-tested without spinning up a daemon. The actual CLI
6
+ * dispatch (`cmdAsk`) lives in cli.ts and calls these helpers.
7
+ */
8
+ export class AskArgsError extends Error {
9
+ code;
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.code = code;
13
+ this.name = 'AskArgsError';
14
+ }
15
+ }
16
+ /** Parse `--options` CSV. Each item is either `key` (key==label) or `key=label`.
17
+ *
18
+ * Rules:
19
+ * - Trims whitespace around each item and around `key=label` halves.
20
+ * - Drops empty items (trailing commas / `"a,,b"`); does not count them.
21
+ * - Requires ≥ 2 distinct keys after parsing.
22
+ * - Empty `key` (e.g. `"=label"`) is rejected.
23
+ * - Duplicate keys are rejected — let the caller surface a clear error rather
24
+ * than silently de-duping (which would change observable button count).
25
+ * - The first `=` splits key/label; subsequent `=` are part of the label, so
26
+ * `"go=继续=右"` → key=`go`, label=`继续=右`. */
27
+ export function parseAskOptions(raw) {
28
+ if (raw === undefined || raw.trim() === '') {
29
+ throw new AskArgsError('options_missing', '缺少 --options(需要 ≥ 2 项,例如 --options "yes,no" 或 --options "yes=继续,no=回滚")');
30
+ }
31
+ const items = raw
32
+ .split(',')
33
+ .map((s) => s.trim())
34
+ .filter((s) => s.length > 0);
35
+ const out = [];
36
+ const seen = new Set();
37
+ for (const item of items) {
38
+ const eq = item.indexOf('=');
39
+ let key;
40
+ let label;
41
+ if (eq < 0) {
42
+ key = item;
43
+ label = item;
44
+ }
45
+ else {
46
+ key = item.slice(0, eq).trim();
47
+ label = item.slice(eq + 1).trim();
48
+ if (label === '')
49
+ label = key; // `"yes="` → label falls back to key
50
+ }
51
+ if (key === '') {
52
+ throw new AskArgsError('options_empty_key', `--options 项的 key 不能为空("${item}")`);
53
+ }
54
+ if (seen.has(key)) {
55
+ throw new AskArgsError('options_duplicate_key', `--options 出现重复 key: ${key}`);
56
+ }
57
+ seen.add(key);
58
+ out.push({ key, label });
59
+ }
60
+ if (out.length < 2) {
61
+ throw new AskArgsError('options_too_few', `--options 至少需要 2 项,收到 ${out.length}`);
62
+ }
63
+ return out;
64
+ }
65
+ /** Parse `--timeout <seconds>` → milliseconds. Bounds match §7:
66
+ * - lower bound: 10s (sub-10s asks are almost always a bug)
67
+ * - upper bound: 3600s (1h — past that, recovery should kick in v0.1.8)
68
+ * - default: 300s (caller passes `undefined` to use it) */
69
+ export function parseAskTimeoutSeconds(raw, defaults = {
70
+ default: 300,
71
+ min: 10,
72
+ max: 3600,
73
+ }) {
74
+ if (raw === undefined)
75
+ return defaults.default * 1000;
76
+ const trimmed = raw.trim();
77
+ if (trimmed === '')
78
+ return defaults.default * 1000;
79
+ const n = Number(trimmed);
80
+ if (!Number.isFinite(n) || !Number.isInteger(n)) {
81
+ throw new AskArgsError('timeout_not_number', `--timeout 必须是整数秒数,收到 "${raw}"`);
82
+ }
83
+ if (n < defaults.min || n > defaults.max) {
84
+ throw new AskArgsError('timeout_out_of_range', `--timeout 范围 [${defaults.min}, ${defaults.max}] 秒,收到 ${n}`);
85
+ }
86
+ return n * 1000;
87
+ }
88
+ /** Resolve the `(sub, rest)` pair for `botmux ask`'s top-level dispatch.
89
+ *
90
+ * Input: positional args *after* the `ask` token. So for the user typing
91
+ * `botmux ask buttons --options yes,no "prompt"` we get
92
+ * `['buttons', '--options', 'yes,no', 'prompt']`; for the bare alias
93
+ * `botmux ask --options yes,no "prompt"` we get
94
+ * `['--options', 'yes,no', 'prompt']`.
95
+ *
96
+ * The first positional starting with `--` means the user skipped the
97
+ * subcommand and went straight to flags — that's the bare-alias path; we
98
+ * return `sub=''` and let `cmdAsk` apply its v0.1.7 `buttons` default.
99
+ * Otherwise the first positional is the subcommand. */
100
+ export function normalizeAskDispatch(tail) {
101
+ const next = tail[0] ?? '';
102
+ if (next.startsWith('--')) {
103
+ return { sub: '', rest: tail.slice(0) };
104
+ }
105
+ return { sub: next, rest: tail.slice(1) };
106
+ }
107
+ /** Required env vars on the CLI side (§5). Returns the first missing one so
108
+ * the caller can produce a single, specific error message. */
109
+ export function findMissingAskEnv(env) {
110
+ const required = [
111
+ 'BOTMUX_SESSION_ID',
112
+ 'BOTMUX_CHAT_ID',
113
+ 'BOTMUX_LARK_APP_ID',
114
+ 'BOTMUX_ROOT_MESSAGE_ID',
115
+ ];
116
+ for (const k of required) {
117
+ if (!env[k] || !env[k].trim())
118
+ return k;
119
+ }
120
+ return null;
121
+ }
122
+ //# sourceMappingURL=ask-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-args.js","sourceRoot":"","sources":["../../src/core/ask-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEnB;IADlB,YACkB,IAMQ,EACxB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QATC,SAAI,GAAJ,IAAI,CAMI;QAIxB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;;;;+CAU+C;AAC/C,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,yEAAyE,CAAC,CAAC;IACvH,CAAC;IACD,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAW,CAAC;QAChB,IAAI,KAAa,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,GAAG,GAAG,IAAI,CAAC;YACX,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,KAAK,EAAE;gBAAE,KAAK,GAAG,GAAG,CAAC,CAAC,qCAAqC;QACtE,CAAC;QACD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,0BAA0B,IAAI,IAAI,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,YAAY,CACpB,uBAAuB,EACvB,uBAAuB,GAAG,EAAE,CAC7B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,YAAY,CACpB,iBAAiB,EACjB,yBAAyB,GAAG,CAAC,MAAM,EAAE,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;6DAG6D;AAC7D,MAAM,UAAU,sBAAsB,CACpC,GAAuB,EACvB,WAA0D;IACxD,OAAO,EAAE,GAAG;IACZ,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,IAAI;CACV;IAED,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,yBAAyB,GAAG,GAAG,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,IAAI,YAAY,CACpB,sBAAsB,EACtB,iBAAiB,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;wDAWwD;AACxD,MAAM,UAAU,oBAAoB,CAClC,IAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,iBAAiB,CAC/B,GAAsB;IAEtB,MAAM,QAAQ,GAAG;QACf,mBAAmB;QACnB,gBAAgB;QAChB,oBAAoB;QACpB,wBAAwB;KACzB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * In-memory broker for `botmux ask` (v0.1.8).
3
+ *
4
+ * Holds the pending-ask registry, runs the deadline timers, and arbitrates
5
+ * click resolution. IM-agnostic: the im/lark side wires a dispatcher via
6
+ * `setCardDispatcher` so the broker doesn't import Lark types.
7
+ *
8
+ * §3 / §6 / §7 / §8 of /tmp/botmux-ask.md.
9
+ */
10
+ import type { AskCardDispatcher, AskClickOutcome, AskResult, CreateAskInput, PendingAsk } from './ask-types.js';
11
+ /** Wire the IM-side dispatcher. Called once during daemon bootstrap from
12
+ * daemon.ts after im/lark/ask-card.ts is constructed. */
13
+ export declare function setCardDispatcher(d: AskCardDispatcher): void;
14
+ /** Register a new pending ask. Returns a Promise that settles when:
15
+ * - a valid click arrives (`kind:'answered'`)
16
+ * - the deadline elapses (`kind:'timedOut'`)
17
+ * - the broker invalidates the ask (`kind:'invalidated'`)
18
+ *
19
+ * Side effects:
20
+ * - generates askId + nonce
21
+ * - starts the deadline timer
22
+ * - dispatches the card; if the card send fails, the ask is immediately
23
+ * invalidated and the Promise settles with `kind:'invalidated'`.
24
+ *
25
+ * Throws synchronously only if no dispatcher has been wired — that's a
26
+ * daemon-misconfiguration bug, not a runtime ask failure.
27
+ */
28
+ export declare function registerAsk(input: CreateAskInput): Promise<AskResult>;
29
+ /**
30
+ * 勾选/取消勾选某问题的某个选项(累积模式,不 settle)。
31
+ *
32
+ * 校验同 `tryResolveAsk`:askId 存在 / nonce 匹配 / 未 settle / 已授权 /
33
+ * questionIndex 合法 / key 在该问题的 options 中。
34
+ *
35
+ * 对于单选问题(multiSelect:false),翻转时 Set 内只保留该 key(相当于"换选")。
36
+ * 对于多选问题(multiSelect:true),翻转规则:已在 Set 中则移除,否则添加。
37
+ *
38
+ * 成功返回 `'toggled'`;非法返回对应 AskClickOutcome。
39
+ */
40
+ export declare function toggleAsk(args: {
41
+ askId: string;
42
+ nonce: string;
43
+ questionIndex: number;
44
+ key: string;
45
+ by: string;
46
+ }): AskClickOutcome;
47
+ /**
48
+ * 提交答案并 settle。
49
+ *
50
+ * `selections` 显式传入时直接使用(按钮单选 / 一次性表单提交场景);
51
+ * 否则使用 `toggleAsk` 累积的勾选状态。
52
+ *
53
+ * 对于 `multiSelect:false` 的问题,要求恰好 1 个选中,否则返回 `'stale'`。
54
+ * 校验通过则 settle 并返回 `'accepted'`;非法返回对应 AskClickOutcome。
55
+ */
56
+ export declare function submitAsk(args: {
57
+ askId: string;
58
+ nonce: string;
59
+ by: string;
60
+ selections?: ReadonlyArray<ReadonlyArray<string>>;
61
+ }): AskClickOutcome;
62
+ /** Resolve attempt from a card-button click. Returns one of the §10 outcomes;
63
+ * caller (card click handler) maps to user-facing toast.
64
+ *
65
+ * v0.1.8 起退化为单问单选的便捷封装:等价于
66
+ * `submitAsk({..., selections:[[selected]]})`.
67
+ * 使 `botmux ask buttons` 与其已有测试零回归。
68
+ *
69
+ * All four "no-op" outcomes (`unauthorized`/`stale`/`already_settled`) leave
70
+ * the broker state unchanged so the original CLI Promise keeps waiting for
71
+ * the real winner or the deadline. */
72
+ export declare function tryResolveAsk(args: {
73
+ askId: string;
74
+ nonce: string;
75
+ selected: string;
76
+ by: string;
77
+ }): AskClickOutcome;
78
+ /** Invalidate every pending ask. Intended for daemon shutdown / restart paths
79
+ * so CLI subprocesses unblock with `kind:'invalidated'` instead of waiting
80
+ * forever on a dead daemon. Returns the number of asks actually settled
81
+ * (settled-but-retained entries from the race window are skipped). */
82
+ export declare function invalidateAll(reason: string): number;
83
+ /** Count of asks still awaiting a click / timeout — excludes settled entries
84
+ * retained within the race-loser feedback window. For tests and metrics only. */
85
+ export declare function _pendingCount(): number;
86
+ /** Read a pending ask by id. Returns a snapshot; mutating it has no effect on
87
+ * broker state. Used by the card handler to PATCH toggle state. */
88
+ export declare function getAskSnapshot(askId: string): PendingAsk | undefined;
89
+ /** Read a pending ask by id — for tests only. Returns a snapshot; mutating it
90
+ * has no effect on broker state. */
91
+ export declare function _getPending(askId: string): PendingAsk | undefined;
92
+ /** 返回当前 pending map 中所有 askId 列表(含 settled 但仍在 retention 内的条目)。
93
+ * 仅供测试使用。 */
94
+ export declare function _allAskIds(): string[];
95
+ /** Reset broker state — for tests only. Does NOT resolve outstanding promises,
96
+ * so tests must not call this while real CLI processes might be waiting. */
97
+ export declare function _resetForTest(): void;
98
+ //# sourceMappingURL=ask-broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-broker.d.ts","sourceRoot":"","sources":["../../src/core/ask-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,cAAc,EACd,UAAU,EACX,MAAM,gBAAgB,CAAC;AAwBxB;0DAC0D;AAC1D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAE5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAmErE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CA4BlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;CACnD,GAAG,eAAe,CA2ClB;AAED;;;;;;;;;uCASuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,eAAe,CAOlB;AAED;;;uEAGuE;AACvE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBpD;AA8DD;kFACkF;AAClF,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED;oEACoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGpE;AAED;qCACqC;AACrC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEjE;AAED;cACc;AACd,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED;6EAC6E;AAC7E,wBAAgB,aAAa,IAAI,IAAI,CAIpC"}