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,268 @@
1
+ /** Subset of Claude Code's JSONL event shape we care about. */
2
+ export interface TranscriptEvent {
3
+ type?: string;
4
+ uuid?: string;
5
+ sessionId?: string;
6
+ timestamp?: string;
7
+ message?: {
8
+ role?: string;
9
+ content?: unknown;
10
+ };
11
+ /** Present on `type:"attachment"` lines. The bridge attribution queue
12
+ * treats `attachment.type === "queued_command"` as a turn-start signal —
13
+ * Claude writes one of these the moment it dequeues a type-ahead
14
+ * submission, immediately before the assistant's reply for that turn
15
+ * starts streaming. `prompt` carries the same content the user typed;
16
+ * shape is usually `string` but we tolerate the message-style array form
17
+ * via stringifyUserContent. */
18
+ attachment?: {
19
+ type?: string;
20
+ prompt?: unknown;
21
+ commandMode?: string;
22
+ };
23
+ }
24
+ /** Extract the user-typed prompt text for a "turn start" event — works for
25
+ * both legacy `role:user` events (text in `message.content`) and the
26
+ * type-ahead `attachment(queued_command)` form (text in `attachment.prompt`).
27
+ * Returns '' when neither shape carries usable content. Used at three
28
+ * layers: BridgeTurnQueue.ingest (fingerprint-match the right pending Lark
29
+ * turn), worker emit (local-turn user-text resolution), and tests. */
30
+ export declare function extractTurnStartText(ev: TranscriptEvent | null | undefined): string;
31
+ export interface DrainResult {
32
+ events: TranscriptEvent[];
33
+ /** Byte offset to pass back on the next drain. */
34
+ newOffset: number;
35
+ /** Trailing partial line (no newline yet) — kept so the next drain can
36
+ * prepend it. Internal helper for chained drains; callers usually only
37
+ * need to remember `newOffset`. */
38
+ pendingTail: string;
39
+ }
40
+ /**
41
+ * Read everything from `path` starting at `fromOffset` and return parsed
42
+ * JSONL events plus the new file offset.
43
+ *
44
+ * - Returns `{ events: [], newOffset: 0, pendingTail: '' }` if the file
45
+ * doesn't exist (caller treats this as "nothing yet").
46
+ * - Detects truncation (size < fromOffset): resets to 0 and re-drains so a
47
+ * rotated/cleared transcript doesn't silently swallow new lines.
48
+ * - Skips malformed JSON lines (logs nothing — robustness over noise).
49
+ * - The trailing partial line (no `\n` yet) is *not* parsed and *not*
50
+ * counted toward `newOffset`, so the next drain re-reads it.
51
+ */
52
+ export declare function drainTranscript(path: string, fromOffset: number): DrainResult;
53
+ /**
54
+ * Filter to assistant text events. Returns only events where:
55
+ * - type === 'assistant' OR message.role === 'assistant'
56
+ * - content has at least one text block
57
+ * - uuid is present
58
+ *
59
+ * Sub-agent / sidechain events (isSidechain === true) are excluded so that
60
+ * spawn-internal Task agent chatter doesn't leak to Lark.
61
+ */
62
+ export declare function pickAssistantTextEvents(events: TranscriptEvent[]): TranscriptEvent[];
63
+ /**
64
+ * Extract the visible text from one assistant event. Walks all `type:'text'`
65
+ * blocks in `message.content` (or the bare string) and joins them with
66
+ * blank lines. Returns '' if no text blocks.
67
+ */
68
+ export declare function extractAssistantText(event: TranscriptEvent): string;
69
+ /** Convenience: filter+extract a list of events into a single concatenated string. */
70
+ export declare function joinAssistantText(events: TranscriptEvent[]): string;
71
+ /** True when a `type:'user'` (or `message.role:'user'`) event represents a
72
+ * *real* prompt the human typed — not Claude Code's internal machinery
73
+ * (tool_result, slash-command wrappers, isMeta/isCompactSummary markers,
74
+ * sidechain spawn events). The bridge attribution queue and the adopt
75
+ * preamble extractor share this predicate to ensure they're seeing the
76
+ * same notion of "user input". */
77
+ export declare function isMeaningfulUserEvent(ev: TranscriptEvent | null | undefined): boolean;
78
+ /** True when a `type:'attachment'` line carries a queued-command payload
79
+ * representing a real submitted prompt. Claude writes one of these when it
80
+ * dequeues a type-ahead submission (right before the assistant's reply for
81
+ * that turn starts streaming) — the bridge attribution queue treats it
82
+ * exactly like a `role:user` event for turn-start purposes. Filters mirror
83
+ * isMeaningfulUserEvent's defenses (sidechain, empty / synthetic-prefix
84
+ * prompts) so a queued slash command can't false-start a Lark turn. */
85
+ export declare function isMeaningfulQueuedCommand(ev: TranscriptEvent | null | undefined): boolean;
86
+ export interface AdoptPreamble {
87
+ /** The most recent meaningful user prompt's text (post-stringify, no
88
+ * whitespace collapse — preserves the prompt's actual formatting). */
89
+ userText: string;
90
+ /** All assistant visible-text emitted between that user prompt and the
91
+ * end of the events list, joined with blank lines. tool_use blocks are
92
+ * excluded; sidechain assistant events are excluded. */
93
+ assistantText: string;
94
+ }
95
+ /** Walk the events forward and return the last *completed* user/assistant
96
+ * exchange. "Completed" here means: a meaningful user prompt followed by
97
+ * at least one assistant event with visible text. tool_use / tool_result
98
+ * events do NOT reset the turn — they're intra-turn machinery, so a
99
+ * prompt → tool_use → tool_result → assistant text sequence still counts
100
+ * as a single turn. Returns null when there's no meaningful user yet, or
101
+ * the last user wasn't followed by any visible assistant text (Claude is
102
+ * mid-tool-use when /adopt fired).
103
+ *
104
+ * Used by adopt-bridge to surface "the previous round" to the Lark thread
105
+ * so the user has context for continuing the conversation. */
106
+ export declare function extractLastAssistantTurn(events: TranscriptEvent[]): AdoptPreamble | null;
107
+ /**
108
+ * True when a user-role event carries ONLY tool_result blocks — Claude
109
+ * Code's representation of "tool returned this output" between an
110
+ * assistant tool_use and the assistant's continuation. Both the bridge
111
+ * attribution queue and the on-disk fingerprint search must skip these:
112
+ *
113
+ * - the queue would treat tool output as fresh local input and disable
114
+ * collection mid-turn,
115
+ * - the fingerprint search would false-positive on log content that
116
+ * happens to contain the Lark fingerprint substring (e.g. a short
117
+ * "hello" message hijacked by an unrelated jsonl whose tool_result
118
+ * dumped a log line containing "hello"). Re-exported by
119
+ * bridge-turn-queue.ts so both consumers share the same predicate
120
+ * and never drift apart.
121
+ */
122
+ export declare function isPureToolResultUserEvent(content: unknown): boolean;
123
+ /**
124
+ * Stringify a transcript user event's content to a flat string. Handles
125
+ * both legacy bare-string content and the array-of-blocks form.
126
+ *
127
+ * Lives here (not in bridge-turn-queue.ts) so the in-process attribution
128
+ * state machine and the on-disk fingerprint search use *exactly* the
129
+ * same text — otherwise multi-line / array-content Lark messages stop
130
+ * matching one path or the other and bridges silently break.
131
+ */
132
+ export declare function stringifyUserContent(content: unknown): string;
133
+ /**
134
+ * Collapse whitespace + trim. Same normalisation applied on both sides
135
+ * of the fingerprint compare (the Lark message that produces the
136
+ * fingerprint, and the transcript user content we search through),
137
+ * so newlines / tabs / double-spaces don't break the match.
138
+ */
139
+ export declare function normaliseForFingerprint(s: string): string;
140
+ /**
141
+ * Find the most recently-modified `.jsonl` file in a Claude Code project
142
+ * directory.
143
+ *
144
+ * `acceptCandidate` lets callers narrow the candidate set — the bridge's
145
+ * quiet-mtime fallback passes a trust-set predicate so a sibling Claude
146
+ * pane writing in the same project dir cannot hijack the watcher.
147
+ * Without it any actively-written sibling jsonl wins the mtime race and
148
+ * the bridge enters a flap loop with the pid resolver pulling it back.
149
+ *
150
+ * Returns null when the directory doesn't exist, has no jsonl files, or
151
+ * every candidate was rejected by `acceptCandidate`.
152
+ */
153
+ export declare function findLatestJsonl(dir: string, opts?: {
154
+ acceptCandidate?: (path: string) => boolean;
155
+ }): string | null;
156
+ /**
157
+ * Search every `.jsonl` file in `dir` for one whose contents include the
158
+ * given fingerprint. Used by the bridge watcher to detect a session
159
+ * switch (`/clear` / `/resume`) caused by the user's pane: when a Lark
160
+ * message is pending and its content fingerprint shows up in a NEW jsonl
161
+ * file, that file is the user's current session and we should switch.
162
+ *
163
+ * Pinning the switch decision to fingerprint match (rather than mtime)
164
+ * avoids hijacking by sibling Claude Code panes in the same project
165
+ * directory — they'll write busy jsonls but won't ever contain our Lark
166
+ * fingerprint.
167
+ *
168
+ * Optional `excludePath` skips the file we're already watching so the
169
+ * caller's "did it change?" comparison is cheap.
170
+ *
171
+ * Reads only the trailing 1 MB of each candidate (fingerprints land near
172
+ * the end of the jsonl when Claude has just written them) — long-lived
173
+ * sessions can grow to tens of MB so a full read would be wasteful.
174
+ * Callers should still gate on "an unstarted pending turn exists" rather
175
+ * than calling this on every poll tick.
176
+ */
177
+ export interface JsonlFingerprintSearchOptions {
178
+ /** Skip the file the caller is already watching/checking. */
179
+ excludePath?: string;
180
+ /** Ignore older files when the caller is looking for a just-written submit. */
181
+ minMtimeMs?: number;
182
+ /** Drop events whose `timestamp` field is older than this (millis since
183
+ * epoch). Defends against short fingerprints ("hello", "test") matching
184
+ * old user lines in unrelated sibling jsonls — file mtime alone isn't
185
+ * enough since a sibling Claude pane could be actively writing. */
186
+ minEventTimestampMs?: number;
187
+ /** Also match Claude Code type-ahead enqueue events, whose content is not role:user. */
188
+ includeQueueOperations?: boolean;
189
+ /** Called on each candidate that already passed the fingerprint match.
190
+ * Returning `false` skips the candidate and continues searching older
191
+ * files in the directory (mtime-descending walk). Used by the bridge
192
+ * watcher to reject sibling-pane jsonls whose sessionId we don't trust,
193
+ * without losing the chance to find a legitimate /clear rotation buried
194
+ * under a busier sibling. Default (no callback): accept the first
195
+ * fingerprint match like the original behaviour. */
196
+ acceptCandidate?: (path: string) => boolean;
197
+ }
198
+ /** Scan a single jsonl file's tail for a Lark message fingerprint. Same
199
+ * parsing rules as `findJsonlContainingFingerprint` (decode role:user content,
200
+ * optionally also queue-operation/enqueue, normalise whitespace, then
201
+ * substring-match the fingerprint). Used by the claude-code adapter when
202
+ * the pid resolver has just switched to a rotated jsonl that may already
203
+ * contain the just-submitted user event. */
204
+ export declare function jsonlContainsFingerprint(path: string, fingerprint: string, opts?: {
205
+ includeQueueOperations?: boolean;
206
+ minEventTimestampMs?: number;
207
+ }): boolean;
208
+ export declare function findJsonlContainingFingerprint(dir: string, fingerprint: string, excludePathOrOptions?: string | JsonlFingerprintSearchOptions): string | null;
209
+ /**
210
+ * Stronger sibling-pane recovery anchor than the substring fingerprint
211
+ * search. Walks every `.jsonl` in `dir` and returns the paths whose
212
+ * trailing 1MB contains a user/queue event whose normalised text is
213
+ * EXACTLY equal to `normalisedContent` (not a substring), respecting
214
+ * `excludePath`, `minMtimeMs`, `minEventTimestampMs`,
215
+ * `includeQueueOperations`, and `acceptCandidate` the same way as
216
+ * `findJsonlContainingFingerprint`.
217
+ *
218
+ * Returns *all* matches in mtime-descending order — callers must
219
+ * abstain when the result has length > 1, since multiple files containing
220
+ * the same exact normalised content cannot be disambiguated without
221
+ * stronger evidence (and forcing a switch would risk picking the wrong
222
+ * pane). The caller's typical pattern is:
223
+ *
224
+ * - 1 match → switch to it (legitimate post-/clear recovery)
225
+ * - 0 matches → no recovery this tick; wait for stronger signal
226
+ * - >1 match → log and abstain; surface a diagnostic to the user
227
+ *
228
+ * Used by the bridge fingerprint fallback's recovery path for in-pane
229
+ * `/clear`: substring matches risk hijacking on short fingerprints (the
230
+ * literal text "test" matches "run tests" / "test bridge"), but full
231
+ * equality on a Lark message we just wrote is a much stronger anchor.
232
+ */
233
+ export declare function findJsonlsContainingExactContent(dir: string, normalisedContent: string, options?: JsonlFingerprintSearchOptions): string[];
234
+ /**
235
+ * Partition transcript events into history (timestamp ≤ cutoff) and live
236
+ * (timestamp > cutoff, or no parseable timestamp). Used by the bridge
237
+ * watcher when it switches to a new jsonl that may contain pre-existing
238
+ * conversation: anything older than the cutoff (e.g. iTerm-typed turns
239
+ * the user produced before the Lark mark fired) belongs in the seen-set
240
+ * via `BridgeTurnQueue.absorb` so the worker doesn't replay them as
241
+ * "🖥️ 终端本地对话" cards. Anything newer is fed through `ingest()` so
242
+ * the freshly-written Lark user event can match its pending fingerprint.
243
+ *
244
+ * Events with malformed / missing timestamps fall into `live`: better
245
+ * to forward an unattributable event once than to silently drop a real
246
+ * reply because Claude omitted a timestamp.
247
+ */
248
+ export declare function splitTranscriptEventsByCutoff(events: TranscriptEvent[], cutoffMs: number): {
249
+ history: TranscriptEvent[];
250
+ live: TranscriptEvent[];
251
+ };
252
+ /**
253
+ * Read the first event timestamp out of a jsonl. Reads only the leading
254
+ * 4 KB — Claude's `file-history-snapshot` and `SessionStart` events both
255
+ * land in the first few hundred bytes. Returns the parsed millis, or
256
+ * undefined when no parseable timestamp is found in the leading chunk
257
+ * (corrupted file, partial first line, format change).
258
+ *
259
+ * NOTE: not currently wired into the bridge rotation flow. The bridge
260
+ * fingerprint fallback (`decideFingerprintSwitch` in
261
+ * `bridge-rotation-policy.ts`) deliberately rejects candidates outside
262
+ * the pid-derived trust set rather than relying on freshness heuristics
263
+ * — file-creation timestamps cannot prove ownership across panes in
264
+ * the same project dir. Kept here as a reusable primitive for
265
+ * diagnostics and future /clear-recovery work.
266
+ */
267
+ export declare function readFirstEventTimestamp(path: string): number | undefined;
268
+ //# sourceMappingURL=claude-transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-transcript.d.ts","sourceRoot":"","sources":["../../src/services/claude-transcript.ts"],"names":[],"mappings":"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"}