botmux 2.9.1 → 2.9.3

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 (330) hide show
  1. package/README.en.md +140 -76
  2. package/README.md +134 -75
  3. package/dist/adapters/backend/pty-backend.d.ts +6 -0
  4. package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
  5. package/dist/adapters/backend/pty-backend.js +10 -0
  6. package/dist/adapters/backend/pty-backend.js.map +1 -1
  7. package/dist/adapters/backend/session-backend-selector.d.ts +11 -0
  8. package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -0
  9. package/dist/adapters/backend/session-backend-selector.js +26 -0
  10. package/dist/adapters/backend/session-backend-selector.js.map +1 -0
  11. package/dist/adapters/backend/tmux-backend.d.ts +80 -3
  12. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
  13. package/dist/adapters/backend/tmux-backend.js +301 -49
  14. package/dist/adapters/backend/tmux-backend.js.map +1 -1
  15. package/dist/adapters/backend/tmux-pipe-backend.d.ts +100 -0
  16. package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -0
  17. package/dist/adapters/backend/tmux-pipe-backend.js +473 -0
  18. package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -0
  19. package/dist/adapters/cli/aiden.d.ts.map +1 -1
  20. package/dist/adapters/cli/aiden.js +5 -0
  21. package/dist/adapters/cli/aiden.js.map +1 -1
  22. package/dist/adapters/cli/claude-code.d.ts +40 -1
  23. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  24. package/dist/adapters/cli/claude-code.js +470 -49
  25. package/dist/adapters/cli/claude-code.js.map +1 -1
  26. package/dist/adapters/cli/coco.d.ts.map +1 -1
  27. package/dist/adapters/cli/coco.js +191 -9
  28. package/dist/adapters/cli/coco.js.map +1 -1
  29. package/dist/adapters/cli/codex.d.ts.map +1 -1
  30. package/dist/adapters/cli/codex.js +94 -17
  31. package/dist/adapters/cli/codex.js.map +1 -1
  32. package/dist/adapters/cli/shared-hints.d.ts +2 -2
  33. package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
  34. package/dist/adapters/cli/shared-hints.js +7 -5
  35. package/dist/adapters/cli/shared-hints.js.map +1 -1
  36. package/dist/adapters/cli/types.d.ts +38 -1
  37. package/dist/adapters/cli/types.d.ts.map +1 -1
  38. package/dist/autostart.d.ts +14 -0
  39. package/dist/autostart.d.ts.map +1 -0
  40. package/dist/autostart.js +357 -0
  41. package/dist/autostart.js.map +1 -0
  42. package/dist/bot-registry.d.ts +29 -3
  43. package/dist/bot-registry.d.ts.map +1 -1
  44. package/dist/bot-registry.js +91 -12
  45. package/dist/bot-registry.js.map +1 -1
  46. package/dist/cli/arg-utils.d.ts +11 -0
  47. package/dist/cli/arg-utils.d.ts.map +1 -0
  48. package/dist/cli/arg-utils.js +25 -0
  49. package/dist/cli/arg-utils.js.map +1 -0
  50. package/dist/cli/create-group-resolver.d.ts +32 -0
  51. package/dist/cli/create-group-resolver.d.ts.map +1 -0
  52. package/dist/cli/create-group-resolver.js +70 -0
  53. package/dist/cli/create-group-resolver.js.map +1 -0
  54. package/dist/cli/quoted-render.d.ts +30 -0
  55. package/dist/cli/quoted-render.d.ts.map +1 -0
  56. package/dist/cli/quoted-render.js +29 -0
  57. package/dist/cli/quoted-render.js.map +1 -0
  58. package/dist/cli.js +916 -272
  59. package/dist/cli.js.map +1 -1
  60. package/dist/config.d.ts +6 -0
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +18 -8
  63. package/dist/config.js.map +1 -1
  64. package/dist/core/command-handler.d.ts +43 -0
  65. package/dist/core/command-handler.d.ts.map +1 -1
  66. package/dist/core/command-handler.js +167 -64
  67. package/dist/core/command-handler.js.map +1 -1
  68. package/dist/core/dashboard-events.d.ts +57 -0
  69. package/dist/core/dashboard-events.d.ts.map +1 -0
  70. package/dist/core/dashboard-events.js +23 -0
  71. package/dist/core/dashboard-events.js.map +1 -0
  72. package/dist/core/dashboard-ipc-server.d.ts +43 -0
  73. package/dist/core/dashboard-ipc-server.d.ts.map +1 -0
  74. package/dist/core/dashboard-ipc-server.js +481 -0
  75. package/dist/core/dashboard-ipc-server.js.map +1 -0
  76. package/dist/core/dashboard-locate.d.ts +20 -0
  77. package/dist/core/dashboard-locate.d.ts.map +1 -0
  78. package/dist/core/dashboard-locate.js +26 -0
  79. package/dist/core/dashboard-locate.js.map +1 -0
  80. package/dist/core/dashboard-rows.d.ts +31 -0
  81. package/dist/core/dashboard-rows.d.ts.map +1 -0
  82. package/dist/core/dashboard-rows.js +65 -0
  83. package/dist/core/dashboard-rows.js.map +1 -0
  84. package/dist/core/inherit-peer.d.ts +14 -0
  85. package/dist/core/inherit-peer.d.ts.map +1 -0
  86. package/dist/core/inherit-peer.js +32 -0
  87. package/dist/core/inherit-peer.js.map +1 -0
  88. package/dist/core/scheduler.d.ts +24 -0
  89. package/dist/core/scheduler.d.ts.map +1 -1
  90. package/dist/core/scheduler.js +93 -2
  91. package/dist/core/scheduler.js.map +1 -1
  92. package/dist/core/session-activity.d.ts +3 -0
  93. package/dist/core/session-activity.d.ts.map +1 -0
  94. package/dist/core/session-activity.js +20 -0
  95. package/dist/core/session-activity.js.map +1 -0
  96. package/dist/core/session-discovery.d.ts +39 -0
  97. package/dist/core/session-discovery.d.ts.map +1 -1
  98. package/dist/core/session-discovery.js +114 -21
  99. package/dist/core/session-discovery.js.map +1 -1
  100. package/dist/core/session-manager.d.ts +72 -0
  101. package/dist/core/session-manager.d.ts.map +1 -1
  102. package/dist/core/session-manager.js +396 -106
  103. package/dist/core/session-manager.js.map +1 -1
  104. package/dist/core/types.d.ts +27 -2
  105. package/dist/core/types.d.ts.map +1 -1
  106. package/dist/core/types.js +14 -3
  107. package/dist/core/types.js.map +1 -1
  108. package/dist/core/worker-pool.d.ts +72 -3
  109. package/dist/core/worker-pool.d.ts.map +1 -1
  110. package/dist/core/worker-pool.js +459 -38
  111. package/dist/core/worker-pool.js.map +1 -1
  112. package/dist/daemon.d.ts.map +1 -1
  113. package/dist/daemon.js +645 -314
  114. package/dist/daemon.js.map +1 -1
  115. package/dist/dashboard/aggregator.d.ts +41 -0
  116. package/dist/dashboard/aggregator.d.ts.map +1 -0
  117. package/dist/dashboard/aggregator.js +125 -0
  118. package/dist/dashboard/aggregator.js.map +1 -0
  119. package/dist/dashboard/auth.d.ts +23 -0
  120. package/dist/dashboard/auth.d.ts.map +1 -0
  121. package/dist/dashboard/auth.js +66 -0
  122. package/dist/dashboard/auth.js.map +1 -0
  123. package/dist/dashboard/operator-selector.d.ts +20 -0
  124. package/dist/dashboard/operator-selector.d.ts.map +1 -0
  125. package/dist/dashboard/operator-selector.js +39 -0
  126. package/dist/dashboard/operator-selector.js.map +1 -0
  127. package/dist/dashboard/registry.d.ts +35 -0
  128. package/dist/dashboard/registry.d.ts.map +1 -0
  129. package/dist/dashboard/registry.js +74 -0
  130. package/dist/dashboard/registry.js.map +1 -0
  131. package/dist/dashboard/web/app.d.ts +2 -0
  132. package/dist/dashboard/web/app.d.ts.map +1 -0
  133. package/dist/dashboard/web/app.js +45 -0
  134. package/dist/dashboard/web/app.js.map +1 -0
  135. package/dist/dashboard/web/bot-defaults.d.ts +2 -0
  136. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -0
  137. package/dist/dashboard/web/bot-defaults.js +201 -0
  138. package/dist/dashboard/web/bot-defaults.js.map +1 -0
  139. package/dist/dashboard/web/groups.d.ts +16 -0
  140. package/dist/dashboard/web/groups.d.ts.map +1 -0
  141. package/dist/dashboard/web/groups.js +584 -0
  142. package/dist/dashboard/web/groups.js.map +1 -0
  143. package/dist/dashboard/web/schedules.d.ts +2 -0
  144. package/dist/dashboard/web/schedules.d.ts.map +1 -0
  145. package/dist/dashboard/web/schedules.js +105 -0
  146. package/dist/dashboard/web/schedules.js.map +1 -0
  147. package/dist/dashboard/web/sessions.d.ts +2 -0
  148. package/dist/dashboard/web/sessions.d.ts.map +1 -0
  149. package/dist/dashboard/web/sessions.js +374 -0
  150. package/dist/dashboard/web/sessions.js.map +1 -0
  151. package/dist/dashboard/web/store.d.ts +23 -0
  152. package/dist/dashboard/web/store.d.ts.map +1 -0
  153. package/dist/dashboard/web/store.js +82 -0
  154. package/dist/dashboard/web/store.js.map +1 -0
  155. package/dist/dashboard-web/app.js +263 -0
  156. package/dist/dashboard-web/index.html +23 -0
  157. package/dist/dashboard-web/style.css +93 -0
  158. package/dist/dashboard.d.ts +2 -0
  159. package/dist/dashboard.d.ts.map +1 -0
  160. package/dist/dashboard.js +639 -0
  161. package/dist/dashboard.js.map +1 -0
  162. package/dist/im/lark/card-builder.d.ts +18 -1
  163. package/dist/im/lark/card-builder.d.ts.map +1 -1
  164. package/dist/im/lark/card-builder.js +70 -9
  165. package/dist/im/lark/card-builder.js.map +1 -1
  166. package/dist/im/lark/card-handler.d.ts.map +1 -1
  167. package/dist/im/lark/card-handler.js +123 -109
  168. package/dist/im/lark/card-handler.js.map +1 -1
  169. package/dist/im/lark/client.d.ts +35 -0
  170. package/dist/im/lark/client.d.ts.map +1 -1
  171. package/dist/im/lark/client.js +114 -11
  172. package/dist/im/lark/client.js.map +1 -1
  173. package/dist/im/lark/event-dispatcher.d.ts +88 -6
  174. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  175. package/dist/im/lark/event-dispatcher.js +398 -62
  176. package/dist/im/lark/event-dispatcher.js.map +1 -1
  177. package/dist/im/lark/forwarded-renderer.d.ts +23 -0
  178. package/dist/im/lark/forwarded-renderer.d.ts.map +1 -0
  179. package/dist/im/lark/forwarded-renderer.js +105 -0
  180. package/dist/im/lark/forwarded-renderer.js.map +1 -0
  181. package/dist/im/lark/md-card.d.ts +73 -0
  182. package/dist/im/lark/md-card.d.ts.map +1 -0
  183. package/dist/im/lark/md-card.js +332 -0
  184. package/dist/im/lark/md-card.js.map +1 -0
  185. package/dist/im/lark/merge-forward.d.ts +32 -0
  186. package/dist/im/lark/merge-forward.d.ts.map +1 -0
  187. package/dist/im/lark/merge-forward.js +110 -0
  188. package/dist/im/lark/merge-forward.js.map +1 -0
  189. package/dist/im/lark/message-parser.d.ts +9 -3
  190. package/dist/im/lark/message-parser.d.ts.map +1 -1
  191. package/dist/im/lark/message-parser.js +48 -13
  192. package/dist/im/lark/message-parser.js.map +1 -1
  193. package/dist/im/lark/quote-hint.d.ts +18 -0
  194. package/dist/im/lark/quote-hint.d.ts.map +1 -0
  195. package/dist/im/lark/quote-hint.js +23 -0
  196. package/dist/im/lark/quote-hint.js.map +1 -0
  197. package/dist/services/bridge-fallback-gate.d.ts +42 -0
  198. package/dist/services/bridge-fallback-gate.d.ts.map +1 -0
  199. package/dist/services/bridge-fallback-gate.js +12 -0
  200. package/dist/services/bridge-fallback-gate.js.map +1 -0
  201. package/dist/services/bridge-rotation-policy.d.ts +139 -0
  202. package/dist/services/bridge-rotation-policy.d.ts.map +1 -0
  203. package/dist/services/bridge-rotation-policy.js +125 -0
  204. package/dist/services/bridge-rotation-policy.js.map +1 -0
  205. package/dist/services/bridge-turn-queue.d.ts +154 -0
  206. package/dist/services/bridge-turn-queue.d.ts.map +1 -0
  207. package/dist/services/bridge-turn-queue.js +316 -0
  208. package/dist/services/bridge-turn-queue.js.map +1 -0
  209. package/dist/services/chat-first-seen-store.d.ts +27 -0
  210. package/dist/services/chat-first-seen-store.d.ts.map +1 -0
  211. package/dist/services/chat-first-seen-store.js +114 -0
  212. package/dist/services/chat-first-seen-store.js.map +1 -0
  213. package/dist/services/claude-transcript.d.ts +268 -0
  214. package/dist/services/claude-transcript.d.ts.map +1 -0
  215. package/dist/services/claude-transcript.js +798 -0
  216. package/dist/services/claude-transcript.js.map +1 -0
  217. package/dist/services/coco-transcript.d.ts +35 -0
  218. package/dist/services/coco-transcript.d.ts.map +1 -0
  219. package/dist/services/coco-transcript.js +192 -0
  220. package/dist/services/coco-transcript.js.map +1 -0
  221. package/dist/services/codex-bridge-queue.d.ts +56 -0
  222. package/dist/services/codex-bridge-queue.d.ts.map +1 -0
  223. package/dist/services/codex-bridge-queue.js +150 -0
  224. package/dist/services/codex-bridge-queue.js.map +1 -0
  225. package/dist/services/codex-transcript.d.ts +84 -0
  226. package/dist/services/codex-transcript.d.ts.map +1 -0
  227. package/dist/services/codex-transcript.js +298 -0
  228. package/dist/services/codex-transcript.js.map +1 -0
  229. package/dist/services/group-creator.d.ts +23 -0
  230. package/dist/services/group-creator.d.ts.map +1 -0
  231. package/dist/services/group-creator.js +75 -0
  232. package/dist/services/group-creator.js.map +1 -0
  233. package/dist/services/groups-store.d.ts +98 -0
  234. package/dist/services/groups-store.d.ts.map +1 -0
  235. package/dist/services/groups-store.js +213 -0
  236. package/dist/services/groups-store.js.map +1 -0
  237. package/dist/services/oncall-store.d.ts +80 -8
  238. package/dist/services/oncall-store.d.ts.map +1 -1
  239. package/dist/services/oncall-store.js +265 -55
  240. package/dist/services/oncall-store.js.map +1 -1
  241. package/dist/services/project-scanner.d.ts +1 -2
  242. package/dist/services/project-scanner.d.ts.map +1 -1
  243. package/dist/services/project-scanner.js +118 -68
  244. package/dist/services/project-scanner.js.map +1 -1
  245. package/dist/services/schedule-store.d.ts +5 -0
  246. package/dist/services/schedule-store.d.ts.map +1 -1
  247. package/dist/services/schedule-store.js +77 -1
  248. package/dist/services/schedule-store.js.map +1 -1
  249. package/dist/services/session-store.d.ts +22 -0
  250. package/dist/services/session-store.d.ts.map +1 -1
  251. package/dist/services/session-store.js +62 -4
  252. package/dist/services/session-store.js.map +1 -1
  253. package/dist/setup/bots-store.d.ts +3 -0
  254. package/dist/setup/bots-store.d.ts.map +1 -0
  255. package/dist/setup/bots-store.js +24 -0
  256. package/dist/setup/bots-store.js.map +1 -0
  257. package/dist/setup/detect-platform.d.ts +14 -0
  258. package/dist/setup/detect-platform.d.ts.map +1 -0
  259. package/dist/setup/detect-platform.js +139 -0
  260. package/dist/setup/detect-platform.js.map +1 -0
  261. package/dist/setup/ensure-fonts.d.ts +13 -0
  262. package/dist/setup/ensure-fonts.d.ts.map +1 -0
  263. package/dist/setup/ensure-fonts.js +225 -0
  264. package/dist/setup/ensure-fonts.js.map +1 -0
  265. package/dist/setup/ensure-tmux.d.ts +60 -0
  266. package/dist/setup/ensure-tmux.d.ts.map +1 -0
  267. package/dist/setup/ensure-tmux.js +236 -0
  268. package/dist/setup/ensure-tmux.js.map +1 -0
  269. package/dist/setup/index.d.ts +9 -0
  270. package/dist/setup/index.d.ts.map +1 -0
  271. package/dist/setup/index.js +46 -0
  272. package/dist/setup/index.js.map +1 -0
  273. package/dist/setup/lark-scopes.json +301 -0
  274. package/dist/setup/register-app.d.ts +52 -0
  275. package/dist/setup/register-app.d.ts.map +1 -0
  276. package/dist/setup/register-app.js +91 -0
  277. package/dist/setup/register-app.js.map +1 -0
  278. package/dist/setup/verify-permissions.d.ts +115 -0
  279. package/dist/setup/verify-permissions.d.ts.map +1 -0
  280. package/dist/setup/verify-permissions.js +207 -0
  281. package/dist/setup/verify-permissions.js.map +1 -0
  282. package/dist/skills/definitions.d.ts +4 -0
  283. package/dist/skills/definitions.d.ts.map +1 -1
  284. package/dist/skills/definitions.js +133 -19
  285. package/dist/skills/definitions.js.map +1 -1
  286. package/dist/skills/installer.d.ts +3 -1
  287. package/dist/skills/installer.d.ts.map +1 -1
  288. package/dist/skills/installer.js +18 -3
  289. package/dist/skills/installer.js.map +1 -1
  290. package/dist/types.d.ts +44 -0
  291. package/dist/types.d.ts.map +1 -1
  292. package/dist/utils/bot-routing.d.ts +6 -0
  293. package/dist/utils/bot-routing.d.ts.map +1 -0
  294. package/dist/utils/bot-routing.js +50 -0
  295. package/dist/utils/bot-routing.js.map +1 -0
  296. package/dist/utils/file-lock.d.ts +2 -0
  297. package/dist/utils/file-lock.d.ts.map +1 -0
  298. package/dist/utils/file-lock.js +114 -0
  299. package/dist/utils/file-lock.js.map +1 -0
  300. package/dist/utils/font-installer.js +1 -1
  301. package/dist/utils/font-installer.js.map +1 -1
  302. package/dist/utils/idle-detector.d.ts +6 -0
  303. package/dist/utils/idle-detector.d.ts.map +1 -1
  304. package/dist/utils/idle-detector.js +25 -4
  305. package/dist/utils/idle-detector.js.map +1 -1
  306. package/dist/utils/logger.d.ts +10 -0
  307. package/dist/utils/logger.d.ts.map +1 -1
  308. package/dist/utils/logger.js +60 -8
  309. package/dist/utils/logger.js.map +1 -1
  310. package/dist/utils/render-dimensions.d.ts +48 -0
  311. package/dist/utils/render-dimensions.d.ts.map +1 -0
  312. package/dist/utils/render-dimensions.js +55 -0
  313. package/dist/utils/render-dimensions.js.map +1 -0
  314. package/dist/utils/screen-analyzer.d.ts.map +1 -1
  315. package/dist/utils/screen-analyzer.js +24 -0
  316. package/dist/utils/screen-analyzer.js.map +1 -1
  317. package/dist/utils/screenshot-renderer.d.ts.map +1 -1
  318. package/dist/utils/screenshot-renderer.js +67 -23
  319. package/dist/utils/screenshot-renderer.js.map +1 -1
  320. package/dist/utils/terminal-renderer.d.ts +16 -0
  321. package/dist/utils/terminal-renderer.d.ts.map +1 -1
  322. package/dist/utils/terminal-renderer.js +40 -23
  323. package/dist/utils/terminal-renderer.js.map +1 -1
  324. package/dist/utils/transient-snapshot.d.ts +28 -0
  325. package/dist/utils/transient-snapshot.d.ts.map +1 -0
  326. package/dist/utils/transient-snapshot.js +96 -0
  327. package/dist/utils/transient-snapshot.js.map +1 -0
  328. package/dist/worker.js +2248 -83
  329. package/dist/worker.js.map +1 -1
  330. package/package.json +12 -5
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Thin wrappers over Feishu IM v1 chat APIs for the dashboard's groups board.
3
+ *
4
+ * Phase B (Web Dashboard) — Task 24. These wrappers are stateless; they reuse
5
+ * the per-bot Lark SDK client created by `bot-registry`.
6
+ *
7
+ * The "proxy bot" pattern in `addBotToChat`: Feishu requires the inviter to
8
+ * already be a member of the chat, so the dashboard picks an existing-member
9
+ * bot to do the invite. This wrapper just exposes the underlying call —
10
+ * proxy selection happens at the route layer.
11
+ */
12
+ import { getBotClient } from '../bot-registry.js';
13
+ /**
14
+ * List chats the given bot is a member of, draining pagination internally.
15
+ * Uses /open-apis/im/v1/chats.
16
+ */
17
+ export async function listChats(larkAppId) {
18
+ const client = getBotClient(larkAppId);
19
+ const out = [];
20
+ let pageToken;
21
+ do {
22
+ const res = await client.im.v1.chat.list({
23
+ params: {
24
+ page_size: 100,
25
+ user_id_type: 'open_id',
26
+ ...(pageToken ? { page_token: pageToken } : {}),
27
+ },
28
+ });
29
+ if (res.code !== 0 && res.code !== undefined) {
30
+ throw new Error(`Failed to list chats: ${res.msg} (code: ${res.code})`);
31
+ }
32
+ for (const c of res.data?.items ?? []) {
33
+ out.push({
34
+ chatId: c.chat_id,
35
+ name: c.name,
36
+ description: c.description,
37
+ chatMode: c.chat_mode,
38
+ ownerId: c.owner_id,
39
+ });
40
+ }
41
+ pageToken = res.data?.has_more ? res.data?.page_token : undefined;
42
+ } while (pageToken);
43
+ return out;
44
+ }
45
+ /**
46
+ * Check whether the given bot is a member of the given chat.
47
+ * Uses /open-apis/im/v1/chats/:chat_id/members/is_in_chat — the bot's own
48
+ * access token implicitly identifies the bot being checked.
49
+ *
50
+ * Errors (chat not found, no permission, etc.) are swallowed and treated as
51
+ * "not in chat" so callers can use this as a simple boolean predicate.
52
+ */
53
+ export async function isInChat(larkAppId, chatId) {
54
+ const client = getBotClient(larkAppId);
55
+ try {
56
+ const res = await client.im.v1.chatMembers.isInChat({
57
+ path: { chat_id: chatId },
58
+ });
59
+ if (res.code !== 0 && res.code !== undefined)
60
+ return false;
61
+ return !!res.data?.is_in_chat;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ /**
68
+ * Create a brand-new chat with `bot_id_list` as initial bot members. The
69
+ * `creatorLarkAppId` bot becomes the chat's owner and an implicit member; the
70
+ * other bots in `botIds` are added in the same call. Used by the dashboard's
71
+ * "Create new group" flow.
72
+ *
73
+ * Returns the new chatId on success. Throws on any non-zero Lark response so
74
+ * the route can surface a real error. We deliberately don't soften failures
75
+ * here (unlike `isInChat`) because the caller wants to know whether the chat
76
+ * actually got created.
77
+ */
78
+ export async function createChat(creatorLarkAppId, opts) {
79
+ const client = getBotClient(creatorLarkAppId);
80
+ // Filter out the creator from bot_id_list — Lark errors if the inviter
81
+ // appears in their own invite list.
82
+ const otherBots = opts.botIds.filter(id => id !== creatorLarkAppId);
83
+ const userIds = (opts.userIds ?? []).filter(Boolean);
84
+ const data = {};
85
+ if (opts.name)
86
+ data.name = opts.name;
87
+ if (otherBots.length > 0)
88
+ data.bot_id_list = otherBots;
89
+ if (userIds.length > 0)
90
+ data.user_id_list = userIds;
91
+ const params = {};
92
+ if (userIds.length > 0)
93
+ params.user_id_type = 'open_id';
94
+ const res = await client.im.v1.chat.create({ data, params });
95
+ if (res.code !== 0 && res.code !== undefined) {
96
+ throw new Error(`Failed to create chat: ${res.msg ?? 'unknown'} (code: ${res.code})`);
97
+ }
98
+ return {
99
+ chatId: res.data?.chat_id,
100
+ invalidBotIds: res.data?.invalid_bot_id_list ?? [],
101
+ invalidUserIds: res.data?.invalid_user_id_list ?? [],
102
+ };
103
+ }
104
+ /**
105
+ * Transfer ownership of a chat from the calling bot to a Feishu user. Used
106
+ * after `createChat` so the dashboard operator (who's been invited as a
107
+ * member) ends up as the actual owner — otherwise the bot stays group owner
108
+ * and the user can't manage the chat.
109
+ *
110
+ * Calls /open-apis/im/v1/chats/:chat_id with `owner_id` in the body and
111
+ * `user_id_type=open_id`. The caller's bot must currently be the owner; this
112
+ * is the case right after createChat since the creator bot is the implicit
113
+ * owner.
114
+ *
115
+ * `newOwnerOpenId` must be in the calling bot's app scope — Lark open_ids are
116
+ * app-scoped, see operator-selector.ts for why.
117
+ */
118
+ export async function transferChatOwner(ownerLarkAppId, chatId, newOwnerOpenId) {
119
+ const client = getBotClient(ownerLarkAppId);
120
+ try {
121
+ const res = await client.im.v1.chat.update({
122
+ path: { chat_id: chatId },
123
+ params: { user_id_type: 'open_id' },
124
+ data: { owner_id: newOwnerOpenId },
125
+ });
126
+ if (res.code !== 0 && res.code !== undefined) {
127
+ return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
128
+ }
129
+ return { ok: true };
130
+ }
131
+ catch (e) {
132
+ return { ok: false, error: e?.message ?? String(e) };
133
+ }
134
+ }
135
+ /**
136
+ * Disband (delete) a chat. The Lark API only succeeds when the calling bot is
137
+ * the chat's current owner, OR is the creator AND the app holds
138
+ * `im:chat:operate_as_owner`. Routes that fan-out to multiple bots can use
139
+ * this best-effort: try each in-chat bot until one succeeds.
140
+ */
141
+ export async function disbandChat(larkAppId, chatId) {
142
+ const client = getBotClient(larkAppId);
143
+ try {
144
+ const res = await client.im.v1.chat.delete({ path: { chat_id: chatId } });
145
+ if (res.code !== 0 && res.code !== undefined) {
146
+ return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
147
+ }
148
+ return { ok: true };
149
+ }
150
+ catch (e) {
151
+ return { ok: false, error: e?.message ?? String(e) };
152
+ }
153
+ }
154
+ /**
155
+ * Make the calling bot leave a chat. Per Lark docs, self-removal succeeds
156
+ * regardless of role (owner/manager/member). Useful when the bot can't disband
157
+ * (not owner, no operate_as_owner scope) but still wants to detach.
158
+ */
159
+ export async function leaveChat(larkAppId, chatId) {
160
+ const client = getBotClient(larkAppId);
161
+ try {
162
+ const res = await client.im.v1.chatMembers.delete({
163
+ path: { chat_id: chatId },
164
+ params: { member_id_type: 'app_id' },
165
+ data: { id_list: [larkAppId] },
166
+ });
167
+ if (res.code !== 0 && res.code !== undefined) {
168
+ return { ok: false, error: `${res.msg ?? 'unknown'} (code: ${res.code})` };
169
+ }
170
+ return { ok: true };
171
+ }
172
+ catch (e) {
173
+ return { ok: false, error: e?.message ?? String(e) };
174
+ }
175
+ }
176
+ /**
177
+ * Add bot apps to a chat using a "proxy" bot that's already a member.
178
+ * Uses /open-apis/im/v1/chats/:chat_id/members with member_id_type=app_id.
179
+ * Returns per-id result derived from the API's invalid_id_list.
180
+ *
181
+ * On total failure (network error, non-zero code) every id reports the same
182
+ * error so the caller can present a uniform per-id status.
183
+ */
184
+ export async function addBotToChat(proxyLarkAppId, chatId, targetLarkAppIds) {
185
+ if (targetLarkAppIds.length === 0)
186
+ return [];
187
+ const client = getBotClient(proxyLarkAppId);
188
+ const out = [];
189
+ try {
190
+ const res = await client.im.v1.chatMembers.create({
191
+ path: { chat_id: chatId },
192
+ params: { member_id_type: 'app_id' },
193
+ data: { id_list: targetLarkAppIds },
194
+ });
195
+ if (res.code !== 0 && res.code !== undefined) {
196
+ const errMsg = `${res.msg ?? 'unknown'} (code: ${res.code})`;
197
+ for (const id of targetLarkAppIds)
198
+ out.push({ id, ok: false, error: errMsg });
199
+ return out;
200
+ }
201
+ const invalid = new Set(res.data?.invalid_id_list ?? []);
202
+ for (const id of targetLarkAppIds) {
203
+ out.push(invalid.has(id) ? { id, ok: false, error: 'invalid_id' } : { id, ok: true });
204
+ }
205
+ }
206
+ catch (e) {
207
+ const msg = e?.message ?? String(e);
208
+ for (const id of targetLarkAppIds)
209
+ out.push({ id, ok: false, error: msg });
210
+ }
211
+ return out;
212
+ }
213
+ //# sourceMappingURL=groups-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups-store.js","sourceRoot":"","sources":["../../src/services/groups-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,IAAI,SAA6B,CAAC;IAClC,GAAG,CAAC;QACF,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACrD,MAAM,EAAE;gBACN,SAAS,EAAE,GAAG;gBACd,YAAY,EAAE,SAAS;gBACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD;SACF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,CAAC,CAAC,OAAO;gBACjB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,OAAO,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC,CAAC;QACL,CAAC;QACD,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC,QAAQ,SAAS,EAAE;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,MAAc;IAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC;YAChE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC3D,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,gBAAwB,EACxB,IAA6D;IAE7D,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC9C,uEAAuE;IACvE,oCAAoC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,gBAAgB,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IACpD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC;IACxD,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACxF,CAAC;IACD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO;QACzB,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAI,EAAE;QAClD,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,oBAAoB,IAAI,EAAE;KACrD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,cAAsB,EACtB,MAAc,EACd,cAAsB;IAEtB,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACvD,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;YACnC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;SACnC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EAAE,MAAc;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACxF,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EAAE,MAAc;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9D,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;YACpC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;SAC/B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAAsB,EACtB,MAAc,EACd,gBAA0B;IAE1B,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAkD,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAQ,MAAO,MAAc,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9D,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YACzB,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE;YACpC,IAAI,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,SAAS,WAAW,GAAG,CAAC,IAAI,GAAG,CAAC;YAC7D,KAAK,MAAM,EAAE,IAAI,gBAAgB;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9E,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,GAAG,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,MAAM,EAAE,IAAI,gBAAgB;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,22 +1,94 @@
1
- import { type OncallChat } from '../bot-registry.js';
1
+ import { type BotDefaultOncall, type OncallChat } from '../bot-registry.js';
2
2
  /**
3
- * Upsert an oncall binding. If the chat is already bound, only existing owners
4
- * can update the workingDir (ownerOpenId must be in owners). First-time bind
5
- * puts the caller into owners automatically.
3
+ * Upsert an oncall binding. Returns whether it was newly created.
6
4
  */
7
- export declare function bindOncall(larkAppId: string, chatId: string, workingDir: string, ownerOpenId: string): {
5
+ export declare function bindOncall(larkAppId: string, chatId: string, workingDir: string): Promise<{
8
6
  ok: true;
9
7
  entry: OncallChat;
10
8
  created: boolean;
11
9
  } | {
12
10
  ok: false;
13
11
  reason: string;
14
- };
15
- export declare function unbindOncall(larkAppId: string, chatId: string, ownerOpenId: string): {
12
+ }>;
13
+ /**
14
+ * Unbind oncall for `chatId` and ALWAYS write a tombstone into
15
+ * `defaultOncallAutoboundChats`. The tombstone protects against the case
16
+ * where a user manually fiddled with a chat (bound then unbound, or just
17
+ * unbound) and we then mis-classify it as "new" on the next observation
18
+ * and re-auto-bind. Treating unbind as "default's one shot is spent" is
19
+ * symmetric with auto-bind already adding to the same list.
20
+ *
21
+ * Idempotent: never errors on "not bound". `wasBound` reports whether an
22
+ * existing binding was actually removed so callers can phrase UI text
23
+ * accordingly (the Lark `/oncall unbind` command still wants to say "未绑定"
24
+ * vs "已解绑").
25
+ */
26
+ export declare function unbindOncall(larkAppId: string, chatId: string): Promise<{
16
27
  ok: true;
28
+ wasBound: boolean;
17
29
  } | {
18
30
  ok: false;
19
31
  reason: string;
20
- };
32
+ }>;
21
33
  export declare function getOncallStatus(larkAppId: string, chatId: string): OncallChat | undefined;
34
+ /** Read the current defaultOncall config + autobound list for a bot. Used by
35
+ * the dashboard GET route and by the daemon's auto-bind judge. Sync because
36
+ * it only reads the in-memory snapshot — file-level consistency comes from
37
+ * the daemon never racing with itself on reads. */
38
+ export declare function getBotDefaultOncall(larkAppId: string): {
39
+ defaultOncall: BotDefaultOncall | undefined;
40
+ autoboundChats: string[];
41
+ };
42
+ /**
43
+ * Persist a defaultOncall change for the given bot. The dashboard PUT route
44
+ * is the only authorized caller — `since` is server-side authoritative so the
45
+ * frontend can't backdate the cut-off and accidentally include existing chats.
46
+ *
47
+ * `since` is stamped on every enabled save, not just the first transition.
48
+ * This matches the dashboard copy/requirement and prevents a later workingDir
49
+ * edit from reaching chats that were first observed before that edit.
50
+ *
51
+ * When disabled with an empty `workingDir`, the prior workingDir is preserved
52
+ * so the UI can round-trip (toggle off → toggle back on) without forcing the
53
+ * user to retype the path. Disable with a non-empty workingDir overwrites.
54
+ */
55
+ export declare function updateBotDefaultOncall(larkAppId: string, patch: {
56
+ enabled: boolean;
57
+ workingDir: string;
58
+ }): Promise<{
59
+ ok: true;
60
+ defaultOncall: BotDefaultOncall;
61
+ } | {
62
+ ok: false;
63
+ reason: string;
64
+ }>;
65
+ /**
66
+ * Auto-bind a chat as part of the defaultOncall flow. Atomically:
67
+ * 1. RE-CHECK tombstone + existing binding against the freshest on-disk
68
+ * snapshot. The daemon's fast-path tombstone check is informational —
69
+ * if a concurrent `unbindOncall` wrote a tombstone between then and
70
+ * now, the lock-internal view sees it and we skip.
71
+ * 2. Upsert the oncallChats entry (same shape as manual bindOncall).
72
+ * 3. Append chatId to defaultOncallAutoboundChats (idempotent).
73
+ *
74
+ * Returns `skipped: 'tombstoned'` when the lock-internal tombstone check
75
+ * trips, `skipped: 'already_bound'` when another writer (manual bind by
76
+ * the user, or a sibling daemon) bound the chat between the fast-path read
77
+ * and the lock acquisition. Neither is an error.
78
+ */
79
+ export declare function autoBindOncallFromDefault(larkAppId: string, chatId: string, workingDir: string): Promise<{
80
+ ok: true;
81
+ entry: OncallChat;
82
+ created: boolean;
83
+ skipped?: undefined;
84
+ } | {
85
+ ok: true;
86
+ skipped: 'tombstoned' | 'already_bound';
87
+ entry?: undefined;
88
+ created?: undefined;
89
+ } | {
90
+ ok: false;
91
+ reason: string;
92
+ }>;
93
+ export declare function _readRawConfigSyncForTesting(path: string): any[];
22
94
  //# sourceMappingURL=oncall-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oncall-store.d.ts","sourceRoot":"","sources":["../../src/services/oncall-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmBlF;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6BnF;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAkB9C;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEzF"}
1
+ {"version":3,"file":"oncall-store.d.ts","sourceRoot":"","sources":["../../src/services/oncall-store.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA+B,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsDzG;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB5F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B1E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAQzF;AAID;;;oDAGoD;AACpD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG;IACtD,aAAa,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CASA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCxF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,eAAe,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,GAC7F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAChC,CAiDA;AAGD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAEhE"}