botmux 3.11.0 → 3.12.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 (343) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +18 -0
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +154 -2
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/cli/coco.js +3 -3
  7. package/dist/adapters/cli/coco.js.map +1 -1
  8. package/dist/adapters/cli/codex.js +2 -2
  9. package/dist/adapters/cli/codex.js.map +1 -1
  10. package/dist/adapters/cli/kimi.d.ts.map +1 -1
  11. package/dist/adapters/cli/kimi.js +22 -8
  12. package/dist/adapters/cli/kimi.js.map +1 -1
  13. package/dist/adapters/cli/pi.d.ts.map +1 -1
  14. package/dist/adapters/cli/pi.js +3 -1
  15. package/dist/adapters/cli/pi.js.map +1 -1
  16. package/dist/bot-registry.d.ts.map +1 -1
  17. package/dist/bot-registry.js +4 -1
  18. package/dist/bot-registry.js.map +1 -1
  19. package/dist/cli/dashboard-command.d.ts +23 -0
  20. package/dist/cli/dashboard-command.d.ts.map +1 -0
  21. package/dist/cli/dashboard-command.js +61 -0
  22. package/dist/cli/dashboard-command.js.map +1 -0
  23. package/dist/cli/dashboard-endpoint.d.ts +3 -3
  24. package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
  25. package/dist/cli/dashboard-endpoint.js +1 -1
  26. package/dist/cli.d.ts.map +1 -1
  27. package/dist/cli.js +101 -49
  28. package/dist/cli.js.map +1 -1
  29. package/dist/codex-rpc-engine.d.ts +33 -3
  30. package/dist/codex-rpc-engine.d.ts.map +1 -1
  31. package/dist/codex-rpc-engine.js +182 -20
  32. package/dist/codex-rpc-engine.js.map +1 -1
  33. package/dist/codex-rpc-lifecycle.d.ts +42 -7
  34. package/dist/codex-rpc-lifecycle.d.ts.map +1 -1
  35. package/dist/codex-rpc-lifecycle.js +73 -7
  36. package/dist/codex-rpc-lifecycle.js.map +1 -1
  37. package/dist/config.d.ts +1 -1
  38. package/dist/config.js +1 -1
  39. package/dist/core/command-handler.d.ts +3 -2
  40. package/dist/core/command-handler.d.ts.map +1 -1
  41. package/dist/core/command-handler.js +19 -4
  42. package/dist/core/command-handler.js.map +1 -1
  43. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  44. package/dist/core/dashboard-ipc-server.js +16 -11
  45. package/dist/core/dashboard-ipc-server.js.map +1 -1
  46. package/dist/core/dashboard-rows.d.ts +17 -1
  47. package/dist/core/dashboard-rows.d.ts.map +1 -1
  48. package/dist/core/dashboard-rows.js +13 -1
  49. package/dist/core/dashboard-rows.js.map +1 -1
  50. package/dist/core/dispatch.d.ts +9 -10
  51. package/dist/core/dispatch.d.ts.map +1 -1
  52. package/dist/core/dispatch.js +17 -10
  53. package/dist/core/dispatch.js.map +1 -1
  54. package/dist/core/maintenance.d.ts.map +1 -1
  55. package/dist/core/maintenance.js +5 -0
  56. package/dist/core/maintenance.js.map +1 -1
  57. package/dist/core/role-resolver.d.ts +5 -2
  58. package/dist/core/role-resolver.d.ts.map +1 -1
  59. package/dist/core/role-resolver.js +55 -23
  60. package/dist/core/role-resolver.js.map +1 -1
  61. package/dist/core/session-manager.d.ts +2 -0
  62. package/dist/core/session-manager.d.ts.map +1 -1
  63. package/dist/core/session-manager.js +20 -18
  64. package/dist/core/session-manager.js.map +1 -1
  65. package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
  66. package/dist/core/skills/cli-admin-command.js +142 -3
  67. package/dist/core/skills/cli-admin-command.js.map +1 -1
  68. package/dist/core/skills/frontmatter.d.ts.map +1 -1
  69. package/dist/core/skills/frontmatter.js +44 -7
  70. package/dist/core/skills/frontmatter.js.map +1 -1
  71. package/dist/core/skills/im-command.d.ts +6 -0
  72. package/dist/core/skills/im-command.d.ts.map +1 -1
  73. package/dist/core/skills/im-command.js +34 -7
  74. package/dist/core/skills/im-command.js.map +1 -1
  75. package/dist/core/skills/install-command.d.ts +4 -0
  76. package/dist/core/skills/install-command.d.ts.map +1 -0
  77. package/dist/core/skills/install-command.js +89 -0
  78. package/dist/core/skills/install-command.js.map +1 -0
  79. package/dist/core/skills/package.d.ts.map +1 -1
  80. package/dist/core/skills/package.js +10 -3
  81. package/dist/core/skills/package.js.map +1 -1
  82. package/dist/core/skills/policy.d.ts +5 -1
  83. package/dist/core/skills/policy.d.ts.map +1 -1
  84. package/dist/core/skills/policy.js +66 -3
  85. package/dist/core/skills/policy.js.map +1 -1
  86. package/dist/core/skills/references.d.ts +9 -1
  87. package/dist/core/skills/references.d.ts.map +1 -1
  88. package/dist/core/skills/references.js +35 -2
  89. package/dist/core/skills/references.js.map +1 -1
  90. package/dist/core/skills/registry-paths.d.ts +1 -0
  91. package/dist/core/skills/registry-paths.d.ts.map +1 -1
  92. package/dist/core/skills/registry-paths.js +3 -0
  93. package/dist/core/skills/registry-paths.js.map +1 -1
  94. package/dist/core/skills/session-resolver.d.ts +2 -1
  95. package/dist/core/skills/session-resolver.d.ts.map +1 -1
  96. package/dist/core/skills/session-resolver.js +1 -0
  97. package/dist/core/skills/session-resolver.js.map +1 -1
  98. package/dist/core/skills/session-runtime.d.ts.map +1 -1
  99. package/dist/core/skills/session-runtime.js +2 -0
  100. package/dist/core/skills/session-runtime.js.map +1 -1
  101. package/dist/core/skills/sources.d.ts +23 -0
  102. package/dist/core/skills/sources.d.ts.map +1 -1
  103. package/dist/core/skills/sources.js +128 -12
  104. package/dist/core/skills/sources.js.map +1 -1
  105. package/dist/core/skills/types.d.ts +22 -1
  106. package/dist/core/skills/types.d.ts.map +1 -1
  107. package/dist/core/terminal-write-auth.d.ts +4 -4
  108. package/dist/core/terminal-write-auth.d.ts.map +1 -1
  109. package/dist/core/terminal-write-auth.js +18 -6
  110. package/dist/core/terminal-write-auth.js.map +1 -1
  111. package/dist/core/types.d.ts +2 -0
  112. package/dist/core/types.d.ts.map +1 -1
  113. package/dist/core/types.js.map +1 -1
  114. package/dist/core/worker-pool.d.ts.map +1 -1
  115. package/dist/core/worker-pool.js +52 -1
  116. package/dist/core/worker-pool.js.map +1 -1
  117. package/dist/daemon.d.ts +1 -0
  118. package/dist/daemon.d.ts.map +1 -1
  119. package/dist/daemon.js +101 -12
  120. package/dist/daemon.js.map +1 -1
  121. package/dist/dashboard/auth.d.ts +21 -11
  122. package/dist/dashboard/auth.d.ts.map +1 -1
  123. package/dist/dashboard/auth.js +39 -25
  124. package/dist/dashboard/auth.js.map +1 -1
  125. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  126. package/dist/dashboard/bot-onboarding.js +2 -114
  127. package/dist/dashboard/bot-onboarding.js.map +1 -1
  128. package/dist/dashboard/bot-payload.d.ts +0 -1
  129. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  130. package/dist/dashboard/bot-payload.js +0 -1
  131. package/dist/dashboard/bot-payload.js.map +1 -1
  132. package/dist/dashboard/connector-api.d.ts.map +1 -1
  133. package/dist/dashboard/connector-api.js +66 -6
  134. package/dist/dashboard/connector-api.js.map +1 -1
  135. package/dist/dashboard/dashboard-summary-endpoint.d.ts +39 -0
  136. package/dist/dashboard/dashboard-summary-endpoint.d.ts.map +1 -0
  137. package/dist/dashboard/dashboard-summary-endpoint.js +50 -0
  138. package/dist/dashboard/dashboard-summary-endpoint.js.map +1 -0
  139. package/dist/dashboard/dashboard-summary.d.ts +62 -0
  140. package/dist/dashboard/dashboard-summary.d.ts.map +1 -0
  141. package/dist/dashboard/dashboard-summary.js +106 -0
  142. package/dist/dashboard/dashboard-summary.js.map +1 -0
  143. package/dist/dashboard/public-redact.d.ts.map +1 -1
  144. package/dist/dashboard/public-redact.js +3 -0
  145. package/dist/dashboard/public-redact.js.map +1 -1
  146. package/dist/dashboard/skill-install-request.js +10 -11
  147. package/dist/dashboard/skill-install-request.js.map +1 -1
  148. package/dist/dashboard/skill-pack-response.d.ts +15 -0
  149. package/dist/dashboard/skill-pack-response.d.ts.map +1 -0
  150. package/dist/dashboard/skill-pack-response.js +32 -0
  151. package/dist/dashboard/skill-pack-response.js.map +1 -0
  152. package/dist/dashboard/web/connectors-page.d.ts +69 -0
  153. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  154. package/dist/dashboard/web/connectors-page.js +47 -7
  155. package/dist/dashboard/web/connectors-page.js.map +1 -1
  156. package/dist/dashboard/web/feed-group-picker.d.ts +13 -0
  157. package/dist/dashboard/web/feed-group-picker.d.ts.map +1 -0
  158. package/dist/dashboard/web/feed-group-picker.js +45 -0
  159. package/dist/dashboard/web/feed-group-picker.js.map +1 -0
  160. package/dist/dashboard/web/groups-page.d.ts.map +1 -1
  161. package/dist/dashboard/web/groups-page.js +2 -5
  162. package/dist/dashboard/web/groups-page.js.map +1 -1
  163. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  164. package/dist/dashboard/web/i18n.js +309 -40
  165. package/dist/dashboard/web/i18n.js.map +1 -1
  166. package/dist/dashboard/web/preferences.d.ts +4 -2
  167. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  168. package/dist/dashboard/web/preferences.js +14 -6
  169. package/dist/dashboard/web/preferences.js.map +1 -1
  170. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  171. package/dist/dashboard/web/roles-page.js +36 -4
  172. package/dist/dashboard/web/roles-page.js.map +1 -1
  173. package/dist/dashboard/web/roles.d.ts +3 -1
  174. package/dist/dashboard/web/roles.d.ts.map +1 -1
  175. package/dist/dashboard/web/roles.js +10 -2
  176. package/dist/dashboard/web/roles.js.map +1 -1
  177. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  178. package/dist/dashboard/web/schedules-page.js +8 -2
  179. package/dist/dashboard/web/schedules-page.js.map +1 -1
  180. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  181. package/dist/dashboard/web/sessions-page.js +101 -5
  182. package/dist/dashboard/web/sessions-page.js.map +1 -1
  183. package/dist/dashboard/web/sessions.d.ts +3 -1
  184. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  185. package/dist/dashboard/web/sessions.js +13 -6
  186. package/dist/dashboard/web/sessions.js.map +1 -1
  187. package/dist/dashboard/web/skills/bot-assignments-tab.d.ts +27 -0
  188. package/dist/dashboard/web/skills/bot-assignments-tab.d.ts.map +1 -0
  189. package/dist/dashboard/web/skills/bot-assignments-tab.js +257 -0
  190. package/dist/dashboard/web/skills/bot-assignments-tab.js.map +1 -0
  191. package/dist/dashboard/web/skills/delivery-settings-tab.d.ts +25 -0
  192. package/dist/dashboard/web/skills/delivery-settings-tab.d.ts.map +1 -0
  193. package/dist/dashboard/web/skills/delivery-settings-tab.js +20 -0
  194. package/dist/dashboard/web/skills/delivery-settings-tab.js.map +1 -0
  195. package/dist/dashboard/web/skills/shared.d.ts +86 -0
  196. package/dist/dashboard/web/skills/shared.d.ts.map +1 -0
  197. package/dist/dashboard/web/skills/shared.js +178 -0
  198. package/dist/dashboard/web/skills/shared.js.map +1 -0
  199. package/dist/dashboard/web/skills/skill-library-tab.d.ts +75 -0
  200. package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -0
  201. package/dist/dashboard/web/skills/skill-library-tab.js +108 -0
  202. package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -0
  203. package/dist/dashboard/web/skills/skill-packs-tab.d.ts +21 -0
  204. package/dist/dashboard/web/skills/skill-packs-tab.d.ts.map +1 -0
  205. package/dist/dashboard/web/skills/skill-packs-tab.js +185 -0
  206. package/dist/dashboard/web/skills/skill-packs-tab.js.map +1 -0
  207. package/dist/dashboard/web/skills/types.d.ts +95 -0
  208. package/dist/dashboard/web/skills/types.d.ts.map +1 -0
  209. package/dist/dashboard/web/skills/types.js +2 -0
  210. package/dist/dashboard/web/skills/types.js.map +1 -0
  211. package/dist/dashboard/web/skills/use-skills-data.d.ts +31 -0
  212. package/dist/dashboard/web/skills/use-skills-data.d.ts.map +1 -0
  213. package/dist/dashboard/web/skills/use-skills-data.js +86 -0
  214. package/dist/dashboard/web/skills/use-skills-data.js.map +1 -0
  215. package/dist/dashboard/web/skills-page.d.ts +34 -31
  216. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  217. package/dist/dashboard/web/skills-page.js +321 -176
  218. package/dist/dashboard/web/skills-page.js.map +1 -1
  219. package/dist/dashboard/webhook-routes.d.ts +18 -0
  220. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  221. package/dist/dashboard/webhook-routes.js +35 -1
  222. package/dist/dashboard/webhook-routes.js.map +1 -1
  223. package/dist/dashboard-web/app.js +1 -1
  224. package/dist/dashboard-web/chunks/{bot-defaults-page-GED4FEMS.js → bot-defaults-page-HL655CNR.js} +1 -1
  225. package/dist/dashboard-web/chunks/{chunk-HK7NIBJG.js → chunk-5PAYQ3KT.js} +1 -1
  226. package/dist/dashboard-web/chunks/{chunk-KRHWZEXU.js → chunk-5ZL7NLR5.js} +1 -1
  227. package/dist/dashboard-web/chunks/chunk-6ALR252E.js +1 -0
  228. package/dist/dashboard-web/chunks/{chunk-VBXJOJFH.js → chunk-BFUTTYVK.js} +1 -1
  229. package/dist/dashboard-web/chunks/chunk-ELL53D62.js +55 -0
  230. package/dist/dashboard-web/chunks/connectors-page-3QQACF23.js +1 -0
  231. package/dist/dashboard-web/chunks/groups-page-SDZMJ7UV.js +8 -0
  232. package/dist/dashboard-web/chunks/{insights-page-54UBPPOC.js → insights-page-ZZ3JEJ6L.js} +1 -1
  233. package/dist/dashboard-web/chunks/{monitor-room-PORHVKRH.js → monitor-room-ROJ5GZ4N.js} +1 -1
  234. package/dist/dashboard-web/chunks/{monitoring-page-XGA7AXNL.js → monitoring-page-IATV7KJF.js} +1 -1
  235. package/dist/dashboard-web/chunks/{office-page-AO3AFG45.js → office-page-TYO5OIIT.js} +1 -1
  236. package/dist/dashboard-web/chunks/{overview-page-F5BUTYR6.js → overview-page-VJUULZF2.js} +1 -1
  237. package/dist/dashboard-web/chunks/roles-page-7RJJKZGK.js +1 -0
  238. package/dist/dashboard-web/chunks/schedules-page-JTEJ5IXW.js +1 -0
  239. package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +8 -0
  240. package/dist/dashboard-web/chunks/{settings-page-OJAZLZQT.js → settings-page-7CTTFBRS.js} +1 -1
  241. package/dist/dashboard-web/chunks/skills-page-57NZECJ3.js +4 -0
  242. package/dist/dashboard-web/chunks/{team-federation-page-ZJVAP7HW.js → team-federation-page-6YYIMJG3.js} +1 -1
  243. package/dist/dashboard-web/chunks/{v3-page-GYWTRGO2.js → v3-page-ZGKBSBK3.js} +1 -1
  244. package/dist/dashboard-web/chunks/{whiteboards-page-MSDAG6P7.js → whiteboards-page-AACJF6DB.js} +1 -1
  245. package/dist/dashboard-web/style.css +1952 -377
  246. package/dist/dashboard.js +316 -47
  247. package/dist/dashboard.js.map +1 -1
  248. package/dist/desktop/main/ipc.js +1 -1
  249. package/dist/desktop/main/runtime-service.js +2 -2
  250. package/dist/desktop/main/runtime-service.js.map +1 -1
  251. package/dist/desktop/shared/types.d.ts +1 -1
  252. package/dist/i18n/en.d.ts.map +1 -1
  253. package/dist/i18n/en.js +5 -1
  254. package/dist/i18n/en.js.map +1 -1
  255. package/dist/i18n/zh.d.ts.map +1 -1
  256. package/dist/i18n/zh.js +5 -1
  257. package/dist/i18n/zh.js.map +1 -1
  258. package/dist/index-daemon.js +6 -1
  259. package/dist/index-daemon.js.map +1 -1
  260. package/dist/services/adopt-input-sequence.d.ts +52 -0
  261. package/dist/services/adopt-input-sequence.d.ts.map +1 -0
  262. package/dist/services/adopt-input-sequence.js +50 -0
  263. package/dist/services/adopt-input-sequence.js.map +1 -0
  264. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  265. package/dist/services/bridge-fallback-gate.js +34 -11
  266. package/dist/services/bridge-fallback-gate.js.map +1 -1
  267. package/dist/services/codex-bridge-queue.d.ts +103 -7
  268. package/dist/services/codex-bridge-queue.d.ts.map +1 -1
  269. package/dist/services/codex-bridge-queue.js +291 -17
  270. package/dist/services/codex-bridge-queue.js.map +1 -1
  271. package/dist/services/codex-transcript.d.ts +4 -3
  272. package/dist/services/codex-transcript.d.ts.map +1 -1
  273. package/dist/services/codex-transcript.js.map +1 -1
  274. package/dist/services/connector-store.d.ts +14 -1
  275. package/dist/services/connector-store.d.ts.map +1 -1
  276. package/dist/services/connector-store.js.map +1 -1
  277. package/dist/services/connector-topic-template.d.ts +7 -0
  278. package/dist/services/connector-topic-template.d.ts.map +1 -0
  279. package/dist/services/connector-topic-template.js +210 -0
  280. package/dist/services/connector-topic-template.js.map +1 -0
  281. package/dist/services/project-scanner.d.ts +33 -0
  282. package/dist/services/project-scanner.d.ts.map +1 -1
  283. package/dist/services/project-scanner.js +40 -1
  284. package/dist/services/project-scanner.js.map +1 -1
  285. package/dist/services/skill-pack-store.d.ts +50 -0
  286. package/dist/services/skill-pack-store.d.ts.map +1 -0
  287. package/dist/services/skill-pack-store.js +270 -0
  288. package/dist/services/skill-pack-store.js.map +1 -0
  289. package/dist/services/skill-registry-store.d.ts +8 -0
  290. package/dist/services/skill-registry-store.d.ts.map +1 -1
  291. package/dist/services/skill-registry-store.js +100 -68
  292. package/dist/services/skill-registry-store.js.map +1 -1
  293. package/dist/services/structured-bridge-clis.d.ts +8 -1
  294. package/dist/services/structured-bridge-clis.d.ts.map +1 -1
  295. package/dist/services/structured-bridge-clis.js +13 -0
  296. package/dist/services/structured-bridge-clis.js.map +1 -1
  297. package/dist/services/submit-confirmation.d.ts +50 -0
  298. package/dist/services/submit-confirmation.d.ts.map +1 -1
  299. package/dist/services/submit-confirmation.js +82 -0
  300. package/dist/services/submit-confirmation.js.map +1 -1
  301. package/dist/services/todo-state.d.ts +74 -0
  302. package/dist/services/todo-state.d.ts.map +1 -0
  303. package/dist/services/todo-state.js +351 -0
  304. package/dist/services/todo-state.js.map +1 -0
  305. package/dist/setup/agent-preset.d.ts.map +1 -1
  306. package/dist/setup/agent-preset.js +2 -0
  307. package/dist/setup/agent-preset.js.map +1 -1
  308. package/dist/setup/owner-identity.d.ts +47 -0
  309. package/dist/setup/owner-identity.d.ts.map +1 -0
  310. package/dist/setup/owner-identity.js +196 -0
  311. package/dist/setup/owner-identity.js.map +1 -0
  312. package/dist/setup/register-app.d.ts +4 -3
  313. package/dist/setup/register-app.d.ts.map +1 -1
  314. package/dist/setup/register-app.js.map +1 -1
  315. package/dist/setup/setup-args.d.ts +1 -1
  316. package/dist/setup/setup-args.d.ts.map +1 -1
  317. package/dist/setup/setup-args.js +7 -3
  318. package/dist/setup/setup-args.js.map +1 -1
  319. package/dist/types.d.ts +11 -0
  320. package/dist/types.d.ts.map +1 -1
  321. package/dist/utils/async-serial-queue.d.ts +9 -0
  322. package/dist/utils/async-serial-queue.d.ts.map +1 -0
  323. package/dist/utils/async-serial-queue.js +13 -0
  324. package/dist/utils/async-serial-queue.js.map +1 -0
  325. package/dist/utils/child-env.d.ts +25 -0
  326. package/dist/utils/child-env.d.ts.map +1 -1
  327. package/dist/utils/child-env.js +47 -0
  328. package/dist/utils/child-env.js.map +1 -1
  329. package/dist/utils/runtime-screen-status.d.ts +52 -0
  330. package/dist/utils/runtime-screen-status.d.ts.map +1 -0
  331. package/dist/utils/runtime-screen-status.js +60 -0
  332. package/dist/utils/runtime-screen-status.js.map +1 -0
  333. package/dist/worker.js +1697 -468
  334. package/dist/worker.js.map +1 -1
  335. package/dist/workflows/definition.d.ts +44 -44
  336. package/package.json +1 -1
  337. package/dist/dashboard-web/chunks/chunk-6J5LS5AU.js +0 -51
  338. package/dist/dashboard-web/chunks/connectors-page-EELM66G3.js +0 -1
  339. package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +0 -8
  340. package/dist/dashboard-web/chunks/roles-page-M5GIASJU.js +0 -1
  341. package/dist/dashboard-web/chunks/schedules-page-O232WQRR.js +0 -1
  342. package/dist/dashboard-web/chunks/sessions-page-YFRPSTIL.js +0 -6
  343. package/dist/dashboard-web/chunks/skills-page-EFZQPWV4.js +0 -4
@@ -6,7 +6,7 @@ import { cliAuthBind, loadDashboardSecret, signCliAuth } from '../dashboard/auth
6
6
  * Classify a 404 from a `/__cli/*` request. A genuine "no token yet" only comes
7
7
  * from `/__cli/current` carrying `{ error: 'no_active_token' }`; everything else
8
8
  * means the port is answering for some other service (daemon IPC, a stray HTTP
9
- * server, …), not the dashboard rotate/current routes.
9
+ * server, …), not one of the dashboard CLI routes.
10
10
  */
11
11
  export function classifyDashboard404(path, bodyText) {
12
12
  let body = null;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAmmHA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAulPtE;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0I7B"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoqHA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAqmPtE;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0I7B"}
package/dist/cli.js CHANGED
@@ -37,7 +37,7 @@ import { validateWorkingDir } from './core/working-dir.js';
37
37
  import { findAncestorSessionContext as findLiveAncestorSessionContext, resolveSessionContext, } from './core/session-marker.js';
38
38
  import { resolveBotmuxDataDir } from './core/data-dir.js';
39
39
  import { dashboardSecretPath } from './core/dashboard-secret.js';
40
- import { acceptedDispatchBotAppIds, activeConversationBotOpenIds, appendDispatchReportProtocol, appendLegacyDispatchReportProtocol, parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, findDispatchRegistryEntry, foldableChatSessionAppIds, offTopicSubBotTopic, resolveReportPlacement, resolveReportRecipient, resolveReportTarget, resolveSendTarget, threadRootForReachability } from './core/dispatch.js';
40
+ import { acceptedDispatchBotAppIds, activeConversationBotOpenIds, buildDispatchCompletionBrief, parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, findDispatchRegistryEntry, foldableChatSessionAppIds, offTopicSubBotTopic, resolveReportPlacement, resolveReportRecipient, resolveReportTarget, resolveSendTarget, threadRootForReachability } from './core/dispatch.js';
41
41
  import { pickTurnReplyTarget, collectTurnWindowParticipants } from './core/reply-target.js';
42
42
  import { recordDispatchRegistryEntry } from './core/dispatch-registry.js';
43
43
  import { enableAutostart, disableAutostart, autostartStatus, refreshAutostart } from './autostart.js';
@@ -49,13 +49,14 @@ import { checkCliAvailability, hasAgentLaunchConfigChanged } from './setup/cli-a
49
49
  import { resolveSetupAppName } from './setup/app-name.js';
50
50
  import { blocksSetupBotStart, classifySetupOpenPlatformOutcome, scriptedSetupOpenPlatformReuseOnly, setupOpenPlatformOutcomeJson, setupOpenPlatformRetryCommand, } from './setup/open-platform-outcome.js';
51
51
  import { buildBotFromAddFlags, editInputFromFlags, isScriptedSetupInvocation, maskAppSecret, parseSetupCommand, SETUP_CLI_USAGE, } from './setup/setup-args.js';
52
+ import { detectUnusableOwnerEntries, normalizeManagedOwnerEntries, resolveScannerAllowedUser, } from './setup/owner-identity.js';
52
53
  import { interactiveSelect, pickChoice, pickCliSelection } from './setup/interactive-select.js';
53
54
  import { buildPreset, serializePreset, presetFilename } from './setup/agent-preset.js';
54
55
  import { validateCodexAppManagedSendOrigin, } from './utils/codex-app-dispatch-ledger.js';
55
56
  import { hasProtectedSessionMutationOwnership } from './core/session-mutation-guard.js';
56
57
  import { logger } from './utils/logger.js';
57
58
  import { withFileLock, withFileLockSync } from './utils/file-lock.js';
58
- import { scrubClaudeSessionMarkerEnv, scrubSessionCliHomeEnv } from './utils/child-env.js';
59
+ import { scrubClaudeSessionMarkerEnv, scrubSessionCliHomeEnv, scrubWorkflowWorkerEnv } from './utils/child-env.js';
59
60
  import { scheduleTimeZone } from './utils/timezone.js';
60
61
  import { expandHomePath, invalidWorkingDirs } from './utils/working-dir.js';
61
62
  import { firstPositional } from './cli/arg-utils.js';
@@ -82,6 +83,7 @@ import { assertIncludePm2RestartAdmission } from './cli/pm2-god-admission.js';
82
83
  import { requestAttestedDaemonShutdown, requestAttestedDaemonShutdownBatch, } from './cli/supervisor-shutdown-client.js';
83
84
  import { assertDaemonPm2GracefulExitPolicy, assertConfiguredPm2FleetReady, assertExactAttestedDaemonSet, classifyStartBotFleetAdmission, normalizeRawPm2StopExitCodes, reconcileLatePm2StartPublication, runBoundedPm2StartTransaction, } from './cli/pm2-start-transaction.js';
84
85
  import { callDashboard } from './cli/dashboard-endpoint.js';
86
+ import { DASHBOARD_COMMAND_USAGE, executeDashboardCommand, formatDashboardFallbackFailure, } from './cli/dashboard-command.js';
85
87
  import { globalInstallUpdateLockTargetIn, installLatestBotmuxSync } from './core/maintenance.js';
86
88
  import { formatGlobalInstallCommand, resolveGlobalInstallPlan, UnsupportedGlobalInstallError, } from './utils/global-install.js';
87
89
  import { loadDashboardSecret } from './dashboard/auth.js';
@@ -96,7 +98,7 @@ import { formatBotInfoEntriesForCli, formatChatBotsForCli, } from './cli/bots-li
96
98
  import { ensureBotChatGrantMatrix, requestExactChatGrant } from './cli/exact-chat-grant-client.js';
97
99
  import { buildFooterAddressing, hasKnownBotMention, knownBotOpenIdsFromCrossRef, orderedFooterRecipients, stripCodeSpans, } from './utils/bot-routing.js';
98
100
  import { isLocale, localeForBot, setDefaultLocale, SUPPORTED_LOCALES, t } from './i18n/index.js';
99
- import { chatAppLink, larkHosts, normalizeBrand, sdkDomain } from './im/lark/lark-hosts.js';
101
+ import { chatAppLink, larkHosts, normalizeBrand } from './im/lark/lark-hosts.js';
100
102
  import { mergeDashboardConfig, mergeGlobalConfig, readGlobalConfig, setGlobalLocale, globalConfigPath } from './global-config.js';
101
103
  import { createWhiteboard, ensureDefaultWhiteboard, getWhiteboard, listWhiteboards, readWhiteboard, whiteboardEnabled, whiteboardPath, } from './services/whiteboard-store.js';
102
104
  import { buildBridgeSendMarkerContent, buildBridgeSendPreviewText, } from './services/bridge-fallback-gate.js';
@@ -201,6 +203,10 @@ function pm2Env(home = PM2_HOME) {
201
203
  // they eventually flip transcript saving off fleet-wide once the tmux server
202
204
  // respawns from a poisoned daemon (see CLAUDE_SESSION_MARKER_ENV_KEYS).
203
205
  scrubClaudeSessionMarkerEnv(env);
206
+ // Workflow/goal markers identify one short-lived node worker. Persisting
207
+ // them in PM2 would make every daemon — and then every ordinary chat worker
208
+ // it forks — run in workflow mode after a restart initiated from that node.
209
+ scrubWorkflowWorkerEnv(env);
204
210
  return env;
205
211
  }
206
212
  function listPm2GodDaemonPids(home = PM2_HOME) {
@@ -1137,27 +1143,6 @@ async function obtainCredentials(rl) {
1137
1143
  return { ok: true, appId, appSecret, brand };
1138
1144
  }
1139
1145
  }
1140
- /**
1141
- * 用新应用自身凭证验证扫码链路拿到的 open_id。
1142
- * 能解析 union_id 时写 on_;没有 union_id 但 open_id 对当前 app 有效时写 ou_。
1143
- * 查询失败或用户不在当前 app 视角时返回 undefined,调用方不得 fallback 写入该 ou_。
1144
- */
1145
- async function resolveScannerAllowedUser(appId, appSecret, openId, brand = 'feishu') {
1146
- try {
1147
- const { Client } = await import('@larksuiteoapi/node-sdk');
1148
- // brand → 域名。Lark 扫码人 ou_→on_ 必须打 larksuite.com,否则失败丢掉 cross-app 稳定性。
1149
- const client = new Client({ appId, appSecret, domain: sdkDomain(brand) });
1150
- const res = await client.contact.v3.user.get({
1151
- path: { user_id: openId },
1152
- params: { user_id_type: 'open_id' },
1153
- });
1154
- if (res.code === 0 && res.data?.user) {
1155
- return res.data.user.union_id ?? openId;
1156
- }
1157
- }
1158
- catch { /* do not trust scanner open_id when verification fails */ }
1159
- return undefined;
1160
- }
1161
1146
  /**
1162
1147
  * 手动建 bot 时(没有扫码人 open_id)必须指定至少一个 owner.
1163
1148
  * 循环追问直到给出合法条目(邮箱、union_id on_xxx 或 open_id ou_xxx),拒绝裸邮箱前缀与空输入.
@@ -1559,6 +1544,10 @@ function failSetupScripted(json, message, details = {}) {
1559
1544
  console.error(`❌ ${message}`);
1560
1545
  process.exitCode = 1;
1561
1546
  }
1547
+ function setupAddContinuationCommand(appId, brand, ownerPlaceholder = '<OWNER_EMAIL>') {
1548
+ return `botmux setup add --app-id ${appId} --app-secret <APP_SECRET> ` +
1549
+ `--allowed-users ${ownerPlaceholder}${brand === 'lark' ? ' --brand lark' : ''} --open-platform-auto`;
1550
+ }
1562
1551
  /** 某个(可能带 ~ 前缀的)路径若不存在/不是目录,返回展开后的绝对路径;合法返回 null。 */
1563
1552
  function missingDirResolved(raw) {
1564
1553
  const resolved = resolve(expandHomePath(raw));
@@ -1683,6 +1672,7 @@ async function cmdSetupScripted(argv) {
1683
1672
  let migratedEnv = false;
1684
1673
  let createdAppId;
1685
1674
  let createdAppName;
1675
+ const requestedBrand = normalizeBrand(cmd.flags.brand);
1686
1676
  if (!existsSync(BOTS_JSON_FILE) && existsSync(ENV_FILE)) {
1687
1677
  const legacy = parseDotEnvToBotConfig();
1688
1678
  if (legacy.larkAppId && legacy.larkAppSecret) {
@@ -1690,6 +1680,34 @@ async function cmdSetupScripted(argv) {
1690
1680
  migratedEnv = true;
1691
1681
  }
1692
1682
  }
1683
+ // A managed Agent sees the daemon-frozen session owner as
1684
+ // BOTMUX_OWNER_OPEN_ID in the source bot's app scope; it is not the
1685
+ // current-turn sender. Copying that ou_ into a newly created/different app
1686
+ // locks the owner out. Convert only that exact injected identity to on_
1687
+ // through the source app before any real app is created.
1688
+ try {
1689
+ cmd.flags.allowedUsers = await normalizeManagedOwnerEntries(cmd.flags.allowedUsers, {
1690
+ sourceAppId: process.env.BOTMUX_LARK_APP_ID,
1691
+ sourceOwnerOpenId: process.env.BOTMUX_OWNER_OPEN_ID ?? process.env.__OWNER_OPEN_ID,
1692
+ creatingApp: cmd.createApp,
1693
+ targetAppId: cmd.createApp ? undefined : cmd.flags.appId?.trim(),
1694
+ }, async (sourceAppId, sourceOwnerOpenId) => {
1695
+ const sourceBot = existing.find(bot => bot?.larkAppId === sourceAppId);
1696
+ if (!sourceBot?.larkAppSecret)
1697
+ return undefined;
1698
+ // A deliberate account/platform switch may create under another
1699
+ // developer tenant, where the source app's union_id is not stable.
1700
+ // Require an explicit target-account identity before creating.
1701
+ if (cmd.switchAccount || cmd.compatibilityMode || botBrand(sourceBot) !== requestedBrand) {
1702
+ return undefined;
1703
+ }
1704
+ return resolveScannerAllowedUser(sourceAppId, sourceBot.larkAppSecret, sourceOwnerOpenId, botBrand(sourceBot));
1705
+ });
1706
+ }
1707
+ catch (err) {
1708
+ failSetupScripted(cmd.json, `${err instanceof Error ? err.message : String(err)} 未创建应用、未写入配置。`);
1709
+ return;
1710
+ }
1693
1711
  // --create-app 会产生真实开放平台应用;先用占位凭证完成纯本地字段、owner、
1694
1712
  // CLI 与目录预检,避免参数错误发生在扫码建应用之后而留下孤儿应用。
1695
1713
  if (cmd.createApp) {
@@ -1720,7 +1738,6 @@ async function cmdSetupScripted(argv) {
1720
1738
  return;
1721
1739
  }
1722
1740
  const appName = resolveSetupAppName(cmd.flags.appName, existing.length);
1723
- const requestedBrand = normalizeBrand(cmd.flags.brand);
1724
1741
  let credentials;
1725
1742
  let appliedAppName = false;
1726
1743
  if ((requestedBrand === 'lark' || cmd.compatibilityMode) && cmd.flags.appName?.trim()) {
@@ -1791,7 +1808,7 @@ async function cmdSetupScripted(argv) {
1791
1808
  }
1792
1809
  if (!credentials.ok) {
1793
1810
  const continueCommand = credentials.appId
1794
- ? `botmux setup add --app-id ${credentials.appId} --app-secret <APP_SECRET> --allowed-users <OWNER_EMAIL> --open-platform-auto`
1811
+ ? setupAddContinuationCommand(credentials.appId, requestedBrand)
1795
1812
  : undefined;
1796
1813
  failSetupScripted(cmd.json, `${credentials.message}${credentials.appId ? `;已创建 AppID ${credentials.appId},请从开放平台读取 App Secret 后运行 ${continueCommand} 继续,未重复创建。` : ''}`, credentials.appId ? { partial: true, appId: credentials.appId, appName, continueCommand } : {});
1797
1814
  return;
@@ -1836,17 +1853,39 @@ async function cmdSetupScripted(argv) {
1836
1853
  const v = await validateCredentials(bot.larkAppId, bot.larkAppSecret, botBrand(bot));
1837
1854
  if (!v.ok) {
1838
1855
  const continueCommand = createdAppId
1839
- ? `botmux setup add --app-id ${createdAppId} --app-secret <APP_SECRET> --allowed-users <OWNER_EMAIL> --open-platform-auto`
1856
+ ? setupAddContinuationCommand(createdAppId, botBrand(bot))
1840
1857
  : undefined;
1841
1858
  failSetupScripted(cmd.json, `凭证校验失败 (${v.error}): ${v.message}${createdAppId ? `;应用 ${createdAppId} 已创建,未重复创建。请运行 ${continueCommand} 继续。` : ''}`, createdAppId ? { partial: true, appId: createdAppId, ...(createdAppName ? { appName: createdAppName } : {}), continueCommand } : {});
1842
1859
  return;
1843
1860
  }
1861
+ // Scripted add historically accepted any syntactically valid ou_ and wrote
1862
+ // it verbatim. A source bot's open_id is syntactically valid but belongs to
1863
+ // the wrong app, so canTalk/canOperate can never match it in the new bot.
1864
+ // Match Dashboard onboarding: reject only identities the target app can
1865
+ // definitively prove unusable; transient/scope failures remain inconclusive.
1866
+ const unusableOwners = await detectUnusableOwnerEntries(bot.larkAppId, bot.larkAppSecret, botBrand(bot), bot.allowedUsers ?? []);
1867
+ if (unusableOwners.length > 0) {
1868
+ const continueCommand = createdAppId
1869
+ ? setupAddContinuationCommand(createdAppId, botBrand(bot), '<OWNER_EMAIL_OR_UNION_ID>')
1870
+ : undefined;
1871
+ failSetupScripted(cmd.json, `--allowed-users 包含当前应用无法使用的 owner: ${unusableOwners.join(', ')}。` +
1872
+ `open_id 仅对签发它的 Bot 有效,请改用完整邮箱、手机号或 on_ union_id。` +
1873
+ (continueCommand ? ` 应用已创建但未写入配置;请运行 ${continueCommand} 继续。` : ' 未写入配置。'), createdAppId
1874
+ ? {
1875
+ partial: true,
1876
+ appId: createdAppId,
1877
+ ...(createdAppName ? { appName: createdAppName } : {}),
1878
+ continueCommand,
1879
+ }
1880
+ : {});
1881
+ return;
1882
+ }
1844
1883
  try {
1845
1884
  writeBotsJsonAtomic([...existing, bot]);
1846
1885
  }
1847
1886
  catch (err) {
1848
1887
  const continueCommand = createdAppId
1849
- ? `botmux setup add --app-id ${createdAppId} --app-secret <APP_SECRET> --allowed-users <OWNER_EMAIL> --open-platform-auto`
1888
+ ? setupAddContinuationCommand(createdAppId, botBrand(bot))
1850
1889
  : undefined;
1851
1890
  failSetupScripted(cmd.json, `写入 bot 配置失败: ${err instanceof Error ? err.message : String(err)}${createdAppId ? `;应用 ${createdAppId} 已创建,未重复创建。请运行 ${continueCommand} 继续。` : ''}`, createdAppId ? { partial: true, appId: createdAppId, ...(createdAppName ? { appName: createdAppName } : {}), continueCommand } : {});
1852
1891
  return;
@@ -3658,7 +3697,7 @@ async function printDashboardHintWithRetry() {
3658
3697
  }
3659
3698
  // Soft fallback
3660
3699
  if (last?.reason === 'no-active-token') {
3661
- console.log(' 面板: 运行 `botmux dashboard` 获取链接');
3700
+ console.log(' 面板: 运行 `botmux dashboard` 创建登录链接');
3662
3701
  }
3663
3702
  else if (last?.reason === 'no-secret') {
3664
3703
  console.log(' 面板: dashboard 凭证未就绪,启动后可用 `botmux dashboard` 获取链接');
@@ -3670,13 +3709,22 @@ async function printDashboardHintWithRetry() {
3670
3709
  console.log(' 面板: `botmux dashboard`(daemon 启动中,稍后可获取链接)');
3671
3710
  }
3672
3711
  }
3673
- /**
3674
- * Print a fresh dashboard URL by HMAC-authing to the dashboard process's
3675
- * loopback rotation endpoint. Each call invalidates the previously-issued
3676
- * token, so sharing a URL is the same as sharing a one-shot session.
3677
- */
3678
- async function cmdDashboard() {
3679
- const r = await callDashboardEndpoint('/__cli/rotate');
3712
+ /** Get or create the current dashboard URL, or explicitly rotate it. Bare
3713
+ * `dashboard` is the non-rotating get-or-create form; help and invalid
3714
+ * subcommands never call either credential endpoint. */
3715
+ async function cmdDashboard(args) {
3716
+ const execution = await executeDashboardCommand(args, callDashboardEndpoint);
3717
+ if (execution.kind === 'help') {
3718
+ console.log(DASHBOARD_COMMAND_USAGE);
3719
+ return;
3720
+ }
3721
+ if (execution.kind === 'invalid') {
3722
+ console.error(`未知 dashboard 子命令: ${execution.argument}`);
3723
+ console.error(DASHBOARD_COMMAND_USAGE);
3724
+ process.exitCode = 2;
3725
+ return;
3726
+ }
3727
+ const { action, result: r } = execution;
3680
3728
  if (r.ok) {
3681
3729
  // 首行保持纯 URL(脚本/复制取第一行即可);走中心化平台时再补一行本地直连兜底。
3682
3730
  console.log(r.url);
@@ -3704,8 +3752,7 @@ async function cmdDashboard() {
3704
3752
  console.error(` 详情: ${r.detail}`);
3705
3753
  }
3706
3754
  else {
3707
- // `no-active-token` can't occur on rotate (it always mints); fall through.
3708
- console.error('Rotation failed:', r.detail ?? r.reason);
3755
+ console.error(formatDashboardFallbackFailure(action, r));
3709
3756
  }
3710
3757
  process.exit(1);
3711
3758
  }
@@ -6065,7 +6112,10 @@ botmux v${getVersion()} — IM ↔ AI 编程 CLI 桥接
6065
6112
  logs 查看 daemon 日志(--lines N, --bot <0-based-index|pm2-name|appId>)
6066
6113
  status 查看 daemon 状态
6067
6114
  upgrade 升级到最新版本(别名:update)
6068
- dashboard 打印新的 Web Dashboard 一次性登录 URL(旧 token 同时失效)
6115
+ dashboard current
6116
+ 获取当前 Web Dashboard 登录 URL(裸 \`dashboard\` 同义;没有则创建)
6117
+ dashboard rotate
6118
+ 显式轮换 token,并打印新的登录 URL
6069
6119
  device enroll|status|logout
6070
6120
  在宿主终端注册、查看或清除 desktop device 凭证(AI CLI 会话内拒绝)
6071
6121
  list 列出活跃会话(交互式选择并连接 tmux)
@@ -9536,18 +9586,20 @@ async function cmdDispatch(rest) {
9536
9586
  }
9537
9587
  const bots = [...legacyBots, ...appBots]
9538
9588
  .filter((bot, index, all) => all.findIndex(candidate => candidate.openId === bot.openId) === index);
9539
- // Only an all-local stable-app dispatch can rely on this host's registry being
9540
- // visible to every receiver. Legacy or mixed --bot dispatches may cross hosts,
9541
- // so keep their context-derived compatibility report protocol.
9589
+ const { readRoleDispatchCompletionEnabled } = await import('./core/role-resolver.js');
9590
+ const sameTopicSendEnabled = readRoleDispatchCompletionEnabled(appId, targetChatId);
9542
9591
  const exactReportRootEnabled = parsedBotApps.length > 0 && legacyBots.length === 0;
9543
- const briefWithReportProtocol = (dispatchRootId) => exactReportRootEnabled
9544
- ? appendDispatchReportProtocol(brief, dispatchRootId)
9545
- : appendLegacyDispatchReportProtocol(brief);
9592
+ const briefWithCompletionProtocol = (dispatchRootId) => buildDispatchCompletionBrief({
9593
+ brief,
9594
+ dispatchRootId,
9595
+ exactReportRootEnabled,
9596
+ sameTopicSendEnabled,
9597
+ });
9546
9598
  let built;
9547
9599
  try {
9548
9600
  built = buildDispatchMessages({
9549
9601
  title: title.trim() || '子项目',
9550
- brief: intoRoot ? briefWithReportProtocol(intoRoot) : brief,
9602
+ brief: intoRoot ? briefWithCompletionProtocol(intoRoot) : brief,
9551
9603
  bots,
9552
9604
  });
9553
9605
  }
@@ -9627,7 +9679,7 @@ async function cmdDispatch(rest) {
9627
9679
  // resident chat-scope session's mutable latest reply alias.
9628
9680
  const kickoffBuilt = buildDispatchMessages({
9629
9681
  title: title.trim() || '子项目',
9630
- brief: briefWithReportProtocol(seedId),
9682
+ brief: briefWithCompletionProtocol(seedId),
9631
9683
  bots,
9632
9684
  });
9633
9685
  const kickoffBriefJson = JSON.stringify({ zh_cn: { title: '', content: kickoffBuilt.threadContent } });
@@ -9926,7 +9978,7 @@ async function cmdReport(rest) {
9926
9978
  }
9927
9979
  let response;
9928
9980
  try {
9929
- response = await fetch(`http://127.0.0.1:${daemon.ipcPort}/api/trigger`, {
9981
+ response = await fetchDaemonIpc(daemon.ipcPort, '/api/trigger', {
9930
9982
  method: 'POST',
9931
9983
  headers: { 'content-type': 'application/json' },
9932
9984
  body: JSON.stringify({
@@ -12037,7 +12089,7 @@ switch (command) {
12037
12089
  cmdUpgrade();
12038
12090
  break;
12039
12091
  case 'dashboard':
12040
- await cmdDashboard();
12092
+ await cmdDashboard(process.argv.slice(3));
12041
12093
  break;
12042
12094
  case 'bind': {
12043
12095
  // `botmux bind <code>` — 把本机绑定到中心化平台