botmux 2.33.0 → 2.33.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 (281) hide show
  1. package/README.en.md +12 -1
  2. package/README.md +45 -1
  3. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  4. package/dist/adapters/cli/claude-code.js +11 -0
  5. package/dist/adapters/cli/claude-code.js.map +1 -1
  6. package/dist/cli/bots-list-output.d.ts +21 -0
  7. package/dist/cli/bots-list-output.d.ts.map +1 -0
  8. package/dist/cli/bots-list-output.js +23 -0
  9. package/dist/cli/bots-list-output.js.map +1 -0
  10. package/dist/cli/workflow.d.ts +13 -0
  11. package/dist/cli/workflow.d.ts.map +1 -0
  12. package/dist/cli/workflow.js +781 -0
  13. package/dist/cli/workflow.js.map +1 -0
  14. package/dist/cli.js +69 -14
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/command-handler.d.ts.map +1 -1
  17. package/dist/core/command-handler.js +211 -4
  18. package/dist/core/command-handler.js.map +1 -1
  19. package/dist/core/session-manager.d.ts +6 -1
  20. package/dist/core/session-manager.d.ts.map +1 -1
  21. package/dist/core/session-manager.js +22 -12
  22. package/dist/core/session-manager.js.map +1 -1
  23. package/dist/core/worker-pool.d.ts +13 -0
  24. package/dist/core/worker-pool.d.ts.map +1 -1
  25. package/dist/core/worker-pool.js +100 -6
  26. package/dist/core/worker-pool.js.map +1 -1
  27. package/dist/daemon.d.ts +3 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +884 -3
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/auth.d.ts +36 -0
  32. package/dist/dashboard/auth.d.ts.map +1 -1
  33. package/dist/dashboard/auth.js +22 -0
  34. package/dist/dashboard/auth.js.map +1 -1
  35. package/dist/dashboard/web/app.js +20 -1
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  38. package/dist/dashboard/web/i18n.js +356 -0
  39. package/dist/dashboard/web/i18n.js.map +1 -1
  40. package/dist/dashboard/web/workflow-catalog.d.ts +2 -0
  41. package/dist/dashboard/web/workflow-catalog.d.ts.map +1 -0
  42. package/dist/dashboard/web/workflow-catalog.js +323 -0
  43. package/dist/dashboard/web/workflow-catalog.js.map +1 -0
  44. package/dist/dashboard/web/workflows.d.ts +2 -0
  45. package/dist/dashboard/web/workflows.d.ts.map +1 -0
  46. package/dist/dashboard/web/workflows.js +1618 -0
  47. package/dist/dashboard/web/workflows.js.map +1 -0
  48. package/dist/dashboard/workflow-api.d.ts +23 -0
  49. package/dist/dashboard/workflow-api.d.ts.map +1 -0
  50. package/dist/dashboard/workflow-api.js +463 -0
  51. package/dist/dashboard/workflow-api.js.map +1 -0
  52. package/dist/dashboard-web/app.js +494 -199
  53. package/dist/dashboard-web/index.html +1 -0
  54. package/dist/dashboard-web/style.css +160 -6
  55. package/dist/dashboard-web/terminal-replay.html +227 -0
  56. package/dist/dashboard.js +29 -12
  57. package/dist/dashboard.js.map +1 -1
  58. package/dist/i18n/en.d.ts.map +1 -1
  59. package/dist/i18n/en.js +12 -0
  60. package/dist/i18n/en.js.map +1 -1
  61. package/dist/i18n/zh.d.ts.map +1 -1
  62. package/dist/i18n/zh.js +12 -0
  63. package/dist/i18n/zh.js.map +1 -1
  64. package/dist/im/lark/card-handler.d.ts +3 -0
  65. package/dist/im/lark/card-handler.d.ts.map +1 -1
  66. package/dist/im/lark/card-handler.js +27 -1
  67. package/dist/im/lark/card-handler.js.map +1 -1
  68. package/dist/im/lark/client.d.ts +19 -2
  69. package/dist/im/lark/client.d.ts.map +1 -1
  70. package/dist/im/lark/client.js +21 -2
  71. package/dist/im/lark/client.js.map +1 -1
  72. package/dist/im/lark/workflow-card-handler.d.ts +50 -0
  73. package/dist/im/lark/workflow-card-handler.d.ts.map +1 -0
  74. package/dist/im/lark/workflow-card-handler.js +152 -0
  75. package/dist/im/lark/workflow-card-handler.js.map +1 -0
  76. package/dist/im/lark/workflow-cards.d.ts +46 -0
  77. package/dist/im/lark/workflow-cards.d.ts.map +1 -0
  78. package/dist/im/lark/workflow-cards.js +226 -0
  79. package/dist/im/lark/workflow-cards.js.map +1 -0
  80. package/dist/im/lark/workflow-progress-card.d.ts +76 -0
  81. package/dist/im/lark/workflow-progress-card.d.ts.map +1 -0
  82. package/dist/im/lark/workflow-progress-card.js +279 -0
  83. package/dist/im/lark/workflow-progress-card.js.map +1 -0
  84. package/dist/im/lark/workflow-slash-command.d.ts +92 -0
  85. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -0
  86. package/dist/im/lark/workflow-slash-command.js +185 -0
  87. package/dist/im/lark/workflow-slash-command.js.map +1 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +17 -4
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/groups-store.d.ts +11 -0
  92. package/dist/services/groups-store.d.ts.map +1 -1
  93. package/dist/services/groups-store.js +26 -0
  94. package/dist/services/groups-store.js.map +1 -1
  95. package/dist/services/jsonl-cursor.d.ts +12 -0
  96. package/dist/services/jsonl-cursor.d.ts.map +1 -0
  97. package/dist/services/jsonl-cursor.js +45 -0
  98. package/dist/services/jsonl-cursor.js.map +1 -0
  99. package/dist/services/schedule-store.d.ts +35 -0
  100. package/dist/services/schedule-store.d.ts.map +1 -1
  101. package/dist/services/schedule-store.js +108 -1
  102. package/dist/services/schedule-store.js.map +1 -1
  103. package/dist/skills/definitions.d.ts.map +1 -1
  104. package/dist/skills/definitions.js +399 -0
  105. package/dist/skills/definitions.js.map +1 -1
  106. package/dist/types.d.ts +4 -0
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  109. package/dist/utils/cli-usage-limit.js +4 -0
  110. package/dist/utils/cli-usage-limit.js.map +1 -1
  111. package/dist/worker.js +118 -14
  112. package/dist/worker.js.map +1 -1
  113. package/dist/workflows/attempt-resume.d.ts +114 -0
  114. package/dist/workflows/attempt-resume.d.ts.map +1 -0
  115. package/dist/workflows/attempt-resume.js +385 -0
  116. package/dist/workflows/attempt-resume.js.map +1 -0
  117. package/dist/workflows/attempt-terminal.d.ts +21 -0
  118. package/dist/workflows/attempt-terminal.d.ts.map +1 -0
  119. package/dist/workflows/attempt-terminal.js +7 -0
  120. package/dist/workflows/attempt-terminal.js.map +1 -0
  121. package/dist/workflows/blob.d.ts +27 -0
  122. package/dist/workflows/blob.d.ts.map +1 -0
  123. package/dist/workflows/blob.js +39 -0
  124. package/dist/workflows/blob.js.map +1 -0
  125. package/dist/workflows/cancel-run.d.ts +45 -0
  126. package/dist/workflows/cancel-run.d.ts.map +1 -0
  127. package/dist/workflows/cancel-run.js +99 -0
  128. package/dist/workflows/cancel-run.js.map +1 -0
  129. package/dist/workflows/cancel.d.ts +111 -0
  130. package/dist/workflows/cancel.d.ts.map +1 -0
  131. package/dist/workflows/cancel.js +120 -0
  132. package/dist/workflows/cancel.js.map +1 -0
  133. package/dist/workflows/catalog.d.ts +60 -0
  134. package/dist/workflows/catalog.d.ts.map +1 -0
  135. package/dist/workflows/catalog.js +119 -0
  136. package/dist/workflows/catalog.js.map +1 -0
  137. package/dist/workflows/cold-attach.d.ts +30 -0
  138. package/dist/workflows/cold-attach.d.ts.map +1 -0
  139. package/dist/workflows/cold-attach.js +40 -0
  140. package/dist/workflows/cold-attach.js.map +1 -0
  141. package/dist/workflows/cold-scan.d.ts +21 -0
  142. package/dist/workflows/cold-scan.d.ts.map +1 -0
  143. package/dist/workflows/cold-scan.js +70 -0
  144. package/dist/workflows/cold-scan.js.map +1 -0
  145. package/dist/workflows/daemon-spawn.d.ts +117 -0
  146. package/dist/workflows/daemon-spawn.d.ts.map +1 -0
  147. package/dist/workflows/daemon-spawn.js +551 -0
  148. package/dist/workflows/daemon-spawn.js.map +1 -0
  149. package/dist/workflows/definition.d.ts +1309 -0
  150. package/dist/workflows/definition.d.ts.map +1 -0
  151. package/dist/workflows/definition.js +334 -0
  152. package/dist/workflows/definition.js.map +1 -0
  153. package/dist/workflows/effect-input.d.ts +4 -0
  154. package/dist/workflows/effect-input.d.ts.map +1 -0
  155. package/dist/workflows/effect-input.js +18 -0
  156. package/dist/workflows/effect-input.js.map +1 -0
  157. package/dist/workflows/events/append.d.ts +77 -0
  158. package/dist/workflows/events/append.d.ts.map +1 -0
  159. package/dist/workflows/events/append.js +214 -0
  160. package/dist/workflows/events/append.js.map +1 -0
  161. package/dist/workflows/events/idempotency.d.ts +77 -0
  162. package/dist/workflows/events/idempotency.d.ts.map +1 -0
  163. package/dist/workflows/events/idempotency.js +116 -0
  164. package/dist/workflows/events/idempotency.js.map +1 -0
  165. package/dist/workflows/events/index.d.ts +7 -0
  166. package/dist/workflows/events/index.d.ts.map +1 -0
  167. package/dist/workflows/events/index.js +7 -0
  168. package/dist/workflows/events/index.js.map +1 -0
  169. package/dist/workflows/events/payloads.d.ts +917 -0
  170. package/dist/workflows/events/payloads.d.ts.map +1 -0
  171. package/dist/workflows/events/payloads.js +337 -0
  172. package/dist/workflows/events/payloads.js.map +1 -0
  173. package/dist/workflows/events/replay.d.ts +238 -0
  174. package/dist/workflows/events/replay.d.ts.map +1 -0
  175. package/dist/workflows/events/replay.js +608 -0
  176. package/dist/workflows/events/replay.js.map +1 -0
  177. package/dist/workflows/events/schema.d.ts +5242 -0
  178. package/dist/workflows/events/schema.d.ts.map +1 -0
  179. package/dist/workflows/events/schema.js +295 -0
  180. package/dist/workflows/events/schema.js.map +1 -0
  181. package/dist/workflows/events/types.d.ts +34 -0
  182. package/dist/workflows/events/types.d.ts.map +1 -0
  183. package/dist/workflows/events/types.js +2 -0
  184. package/dist/workflows/events/types.js.map +1 -0
  185. package/dist/workflows/fanout.d.ts +36 -0
  186. package/dist/workflows/fanout.d.ts.map +1 -0
  187. package/dist/workflows/fanout.js +114 -0
  188. package/dist/workflows/fanout.js.map +1 -0
  189. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +41 -0
  190. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -0
  191. package/dist/workflows/hostExecutors/botmux-schedule.js +121 -0
  192. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -0
  193. package/dist/workflows/hostExecutors/feishu-im.d.ts +12 -0
  194. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -0
  195. package/dist/workflows/hostExecutors/feishu-im.js +49 -0
  196. package/dist/workflows/hostExecutors/feishu-im.js.map +1 -0
  197. package/dist/workflows/hostExecutors/feishu-reply.d.ts +24 -0
  198. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -0
  199. package/dist/workflows/hostExecutors/feishu-reply.js +88 -0
  200. package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -0
  201. package/dist/workflows/hostExecutors/feishu-send.d.ts +23 -0
  202. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -0
  203. package/dist/workflows/hostExecutors/feishu-send.js +124 -0
  204. package/dist/workflows/hostExecutors/feishu-send.js.map +1 -0
  205. package/dist/workflows/hostExecutors/index.d.ts +8 -0
  206. package/dist/workflows/hostExecutors/index.d.ts.map +1 -0
  207. package/dist/workflows/hostExecutors/index.js +8 -0
  208. package/dist/workflows/hostExecutors/index.js.map +1 -0
  209. package/dist/workflows/hostExecutors/protocol.d.ts +42 -0
  210. package/dist/workflows/hostExecutors/protocol.d.ts.map +1 -0
  211. package/dist/workflows/hostExecutors/protocol.js +181 -0
  212. package/dist/workflows/hostExecutors/protocol.js.map +1 -0
  213. package/dist/workflows/hostExecutors/registry.d.ts +10 -0
  214. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -0
  215. package/dist/workflows/hostExecutors/registry.js +36 -0
  216. package/dist/workflows/hostExecutors/registry.js.map +1 -0
  217. package/dist/workflows/hostExecutors/types.d.ts +78 -0
  218. package/dist/workflows/hostExecutors/types.d.ts.map +1 -0
  219. package/dist/workflows/hostExecutors/types.js +2 -0
  220. package/dist/workflows/hostExecutors/types.js.map +1 -0
  221. package/dist/workflows/loader.d.ts +16 -0
  222. package/dist/workflows/loader.d.ts.map +1 -0
  223. package/dist/workflows/loader.js +56 -0
  224. package/dist/workflows/loader.js.map +1 -0
  225. package/dist/workflows/loop.d.ts +50 -0
  226. package/dist/workflows/loop.d.ts.map +1 -0
  227. package/dist/workflows/loop.js +350 -0
  228. package/dist/workflows/loop.js.map +1 -0
  229. package/dist/workflows/ops-projection.d.ts +168 -0
  230. package/dist/workflows/ops-projection.d.ts.map +1 -0
  231. package/dist/workflows/ops-projection.js +707 -0
  232. package/dist/workflows/ops-projection.js.map +1 -0
  233. package/dist/workflows/orchestrator.d.ts +107 -0
  234. package/dist/workflows/orchestrator.d.ts.map +1 -0
  235. package/dist/workflows/orchestrator.js +197 -0
  236. package/dist/workflows/orchestrator.js.map +1 -0
  237. package/dist/workflows/output-binding.d.ts +70 -0
  238. package/dist/workflows/output-binding.d.ts.map +1 -0
  239. package/dist/workflows/output-binding.js +265 -0
  240. package/dist/workflows/output-binding.js.map +1 -0
  241. package/dist/workflows/params.d.ts +61 -0
  242. package/dist/workflows/params.d.ts.map +1 -0
  243. package/dist/workflows/params.js +195 -0
  244. package/dist/workflows/params.js.map +1 -0
  245. package/dist/workflows/resume.d.ts +263 -0
  246. package/dist/workflows/resume.d.ts.map +1 -0
  247. package/dist/workflows/resume.js +808 -0
  248. package/dist/workflows/resume.js.map +1 -0
  249. package/dist/workflows/run-id.d.ts +2 -0
  250. package/dist/workflows/run-id.d.ts.map +1 -0
  251. package/dist/workflows/run-id.js +7 -0
  252. package/dist/workflows/run-id.js.map +1 -0
  253. package/dist/workflows/run-init.d.ts +48 -0
  254. package/dist/workflows/run-init.d.ts.map +1 -0
  255. package/dist/workflows/run-init.js +99 -0
  256. package/dist/workflows/run-init.js.map +1 -0
  257. package/dist/workflows/runs-dir.d.ts +4 -0
  258. package/dist/workflows/runs-dir.d.ts.map +1 -0
  259. package/dist/workflows/runs-dir.js +15 -0
  260. package/dist/workflows/runs-dir.js.map +1 -0
  261. package/dist/workflows/runtime.d.ts +211 -0
  262. package/dist/workflows/runtime.d.ts.map +1 -0
  263. package/dist/workflows/runtime.js +594 -0
  264. package/dist/workflows/runtime.js.map +1 -0
  265. package/dist/workflows/spawn-bot.d.ts +165 -0
  266. package/dist/workflows/spawn-bot.d.ts.map +1 -0
  267. package/dist/workflows/spawn-bot.js +215 -0
  268. package/dist/workflows/spawn-bot.js.map +1 -0
  269. package/dist/workflows/system.d.ts +49 -0
  270. package/dist/workflows/system.d.ts.map +1 -0
  271. package/dist/workflows/system.js +48 -0
  272. package/dist/workflows/system.js.map +1 -0
  273. package/dist/workflows/trigger-run.d.ts +70 -0
  274. package/dist/workflows/trigger-run.d.ts.map +1 -0
  275. package/dist/workflows/trigger-run.js +88 -0
  276. package/dist/workflows/trigger-run.js.map +1 -0
  277. package/dist/workflows/wait.d.ts +120 -0
  278. package/dist/workflows/wait.d.ts.map +1 -0
  279. package/dist/workflows/wait.js +181 -0
  280. package/dist/workflows/wait.js.map +1 -0
  281. package/package.json +3 -3
@@ -32,6 +32,10 @@ function parseMeridiemTime(text, now) {
32
32
  hour += 12;
33
33
  const retryAt = new Date(now);
34
34
  retryAt.setHours(hour, minute, 0, 0);
35
+ // CLI output only includes a wall-clock time, not a date. Roll passed AM
36
+ // times into tomorrow because afternoon→midnight resets are common. Passed
37
+ // PM times stay on today: they might mean "just reset" or "tomorrow PM",
38
+ // and a wrong ready state self-heals when the CLI rejects the retry again.
35
39
  if (retryAt.getTime() < now.getTime() && hour < 12) {
36
40
  retryAt.setDate(retryAt.getDate() + 1);
37
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-usage-limit.js","sourceRoot":"","sources":["../../src/utils/cli-usage-limit.ts"],"names":[],"mappings":"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"}
package/dist/worker.js CHANGED
@@ -13,7 +13,7 @@
13
13
  * 7. On 'restart', kills CLI and re-spawns with --resume
14
14
  */
15
15
  import { randomBytes } from 'node:crypto';
16
- import { mkdirSync, writeFileSync, unlinkSync, existsSync, statSync, readdirSync, readlinkSync, readFileSync, watch as fsWatch } from 'node:fs';
16
+ import { mkdirSync, writeFileSync, unlinkSync, existsSync, statSync, readdirSync, readlinkSync, readFileSync, watch as fsWatch, createWriteStream } from 'node:fs';
17
17
  import { join } from 'node:path';
18
18
  import { drainTranscript, joinAssistantText, findJsonlContainingFingerprint, findJsonlsContainingExactContent, findLatestJsonl, extractLastAssistantTurn, extractTurnStartText, splitTranscriptEventsByCutoff } from './services/claude-transcript.js';
19
19
  import { BridgeTurnQueue, makeFingerprint, normaliseForFingerprint } from './services/bridge-turn-queue.js';
@@ -22,6 +22,7 @@ import { shouldRunQuietRotation, evaluatePidResolverPullback, decideFingerprintS
22
22
  import { CodexBridgeQueue } from './services/codex-bridge-queue.js';
23
23
  import { drainCodexRollout, findCodexRolloutBySessionId, findCodexRolloutByPid, splitCodexEventsByCutoff, extractLastCodexTurn } from './services/codex-transcript.js';
24
24
  import { cocoEventsPathForSession, drainCocoEvents, findCocoSessionByPid } from './services/coco-transcript.js';
25
+ import { baselineJsonlCursor } from './services/jsonl-cursor.js';
25
26
  import { dirname } from 'node:path';
26
27
  import { createServer as createHttpServer } from 'node:http';
27
28
  import { WebSocketServer, WebSocket } from 'ws';
@@ -379,6 +380,13 @@ function bridgeProbeOpenSessionIds() {
379
380
  function bridgeAbsorbBaseline() {
380
381
  if (!bridgeJsonlPath)
381
382
  return;
383
+ if (!lastInitConfig?.adoptMode) {
384
+ const cursor = baselineJsonlCursor(bridgeJsonlPath);
385
+ bridgeOffset = cursor.newOffset;
386
+ bridgePendingTail = cursor.pendingTail;
387
+ bridgeBaselineDone = true;
388
+ return;
389
+ }
382
390
  const result = drainTranscript(bridgeJsonlPath, 0);
383
391
  bridgeOffset = result.newOffset;
384
392
  bridgePendingTail = result.pendingTail;
@@ -1440,10 +1448,9 @@ function codexBridgeAttach(rolloutPath, mode) {
1440
1448
  log(`Codex bridge split-live degraded to fresh (file missing): ${rolloutPath}`);
1441
1449
  }
1442
1450
  else if (existsSync(rolloutPath)) {
1443
- const result = structuredBridgeIngestPath(rolloutPath, 0);
1444
- codexBridgeOffset = result.newOffset;
1445
- codexBridgePendingTail = result.pendingTail;
1446
- codexBridgeQueue.absorb(result.events);
1451
+ const cursor = baselineJsonlCursor(rolloutPath);
1452
+ codexBridgeOffset = cursor.newOffset;
1453
+ codexBridgePendingTail = cursor.pendingTail;
1447
1454
  codexBridgeBaselineDone = true;
1448
1455
  log(`Codex bridge baselined: ${rolloutPath} (offset=${codexBridgeOffset})`);
1449
1456
  }
@@ -1685,6 +1692,10 @@ const SCREEN_UPDATE_INTERVAL_MS = 2_000;
1685
1692
  // ─── Scrollback Buffer (replay to late-connecting WS clients) ───────────────
1686
1693
  const MAX_SCROLLBACK = 1_000_000; // chars (~1MB)
1687
1694
  let scrollback = '';
1695
+ const WORKFLOW_TRANSCRIPT_MAX = 2_000_000; // chars (~2MB)
1696
+ const WORKFLOW_OUTPUT_END_MARKER = '</WORKFLOW_OUTPUT>';
1697
+ let workflowTranscript = '';
1698
+ let workflowFinalOutputSent = false;
1688
1699
  /** Tracks whether the CLI is currently in the alt screen buffer. Updated by
1689
1700
  * scanning PTY output for DECSET 1049/47/1047 toggles. Used when trimming
1690
1701
  * scrollback at cap so replay always starts with the correct buffer mode —
@@ -1698,6 +1709,66 @@ const ALT_EXIT_RE = /\x1b\[\?(1049|1047|47)l/g;
1698
1709
  let screenAnalyzer = null;
1699
1710
  /** When true, user messages are queued because a TUI prompt is active */
1700
1711
  let tuiPromptBlocking = false;
1712
+ function isWorkflowWorker() {
1713
+ return process.env.BOTMUX_WORKFLOW === '1';
1714
+ }
1715
+ /**
1716
+ * Raw PTY byte stream writer — independent of the IPC `final_output` path.
1717
+ * Powers the dashboard "terminal replay" view: bytes flow straight through
1718
+ * without splitting on `\n` or prefixing each line, so ANSI cursor moves /
1719
+ * status bars / alt-screen toggles all survive and `xterm.write()` on the
1720
+ * client renders an actual recording of the live session.
1721
+ *
1722
+ * Lazily opened on first PTY chunk so attempts that never produce data
1723
+ * don't leave empty `pty.log` files behind. Closed at worker exit by the
1724
+ * process-shutdown hook below.
1725
+ */
1726
+ let workflowPtyLogStream;
1727
+ let workflowPtyLogOpenFailed = false;
1728
+ function appendWorkflowPtyLog(data) {
1729
+ if (!isWorkflowWorker() || workflowPtyLogOpenFailed)
1730
+ return;
1731
+ const path = process.env.BOTMUX_WORKFLOW_PTY_LOG_PATH;
1732
+ if (!path)
1733
+ return;
1734
+ if (!workflowPtyLogStream) {
1735
+ try {
1736
+ mkdirSync(dirname(path), { recursive: true });
1737
+ workflowPtyLogStream = createWriteStream(path, { flags: 'a' });
1738
+ workflowPtyLogStream.on('error', (err) => {
1739
+ log(`workflow pty log write error: ${err.message}`);
1740
+ });
1741
+ }
1742
+ catch (err) {
1743
+ workflowPtyLogOpenFailed = true;
1744
+ log(`workflow pty log open failed (${path}): ${err.message}`);
1745
+ return;
1746
+ }
1747
+ }
1748
+ workflowPtyLogStream.write(data);
1749
+ }
1750
+ function captureWorkflowTranscript(data) {
1751
+ appendWorkflowPtyLog(data);
1752
+ if (!isWorkflowWorker() || workflowFinalOutputSent)
1753
+ return;
1754
+ workflowTranscript += data;
1755
+ if (workflowTranscript.length > WORKFLOW_TRANSCRIPT_MAX) {
1756
+ workflowTranscript = workflowTranscript.slice(-WORKFLOW_TRANSCRIPT_MAX);
1757
+ }
1758
+ }
1759
+ function maybeEmitWorkflowTranscriptOutput() {
1760
+ if (!isWorkflowWorker() || workflowFinalOutputSent)
1761
+ return;
1762
+ if (!workflowTranscript.includes(WORKFLOW_OUTPUT_END_MARKER))
1763
+ return;
1764
+ send({
1765
+ type: 'final_output',
1766
+ content: workflowTranscript,
1767
+ lastUuid: `workflow-pty-${Date.now()}`,
1768
+ turnId: `workflow-pty-${sessionId || 'unknown'}`,
1769
+ });
1770
+ log('Workflow PTY transcript final_output emitted');
1771
+ }
1701
1772
  function startScreenAnalyzer() {
1702
1773
  const sa = config.screenAnalyzer;
1703
1774
  log(`ScreenAnalyzer config: enabled=${sa.enabled}, baseUrl=${sa.baseUrl ? 'set' : 'empty'}, model=${sa.model || 'empty'}, extraHeaders=${JSON.stringify(sa.extraHeaders)}`);
@@ -2057,6 +2128,7 @@ const TRUST_DIALOG_PATTERN = /Yes, I trust this folder|Yes, continue/;
2057
2128
  let trustHandled = false;
2058
2129
  // ─── Prompt Detection ────────────────────────────────────────────────────────
2059
2130
  function onPtyData(data) {
2131
+ captureWorkflowTranscript(data);
2060
2132
  renderer?.write(data);
2061
2133
  // In tmux-attach mode, each web client has its own tmux attach PTY —
2062
2134
  // no relay needed. In non-tmux mode AND in pipe mode (adopt-bridge),
@@ -2120,6 +2192,7 @@ function markPromptReady() {
2120
2192
  if (isPromptReady)
2121
2193
  return; // guard against duplicate calls
2122
2194
  isPromptReady = true;
2195
+ maybeEmitWorkflowTranscriptOutput();
2123
2196
  if (awaitingFirstPrompt) {
2124
2197
  awaitingFirstPrompt = false;
2125
2198
  renderer?.markNewTurn(); // exclude history replay from streaming card
@@ -2141,6 +2214,7 @@ function persistCliSessionId(cliSessionId) {
2141
2214
  return;
2142
2215
  if (lastInitConfig)
2143
2216
  lastInitConfig.cliSessionId = cliSessionId;
2217
+ send({ type: 'cli_session_id', cliSessionId });
2144
2218
  try {
2145
2219
  const session = sessionStore.getSession(sessionId);
2146
2220
  if (!session || session.cliSessionId === cliSessionId)
@@ -2614,6 +2688,9 @@ function spawnCli(cfg) {
2614
2688
  isTmuxMode = selectedBackend.isTmuxMode;
2615
2689
  isPipeMode = selectedBackend.isPipeMode;
2616
2690
  backend = selectedBackend.backend;
2691
+ const adapterSessionId = cfg.resume
2692
+ ? (cfg.originalSessionId ?? cfg.sessionId)
2693
+ : cfg.sessionId;
2617
2694
  // Claude Code appends a line to ~/.claude/projects/<cwd-hash>/<sid>.jsonl each
2618
2695
  // time the user submits. The adapter uses this file to verify paste+Enter
2619
2696
  // actually committed (rather than trusting a fixed sleep), so wire it up now.
@@ -2621,10 +2698,10 @@ function spawnCli(cfg) {
2621
2698
  // so it needs no per-session wiring here.
2622
2699
  if (cfg.cliId === 'claude-code') {
2623
2700
  backend.claudeJsonlPath =
2624
- claudeJsonlPathForSession(cfg.sessionId, cfg.workingDir);
2701
+ claudeJsonlPathForSession(cfg.cliSessionId ?? adapterSessionId, cfg.workingDir);
2625
2702
  }
2626
2703
  const args = cliAdapter.buildArgs({
2627
- sessionId: cfg.sessionId,
2704
+ sessionId: adapterSessionId,
2628
2705
  resume: cfg.resume ?? false,
2629
2706
  workingDir: cfg.workingDir,
2630
2707
  resumeSessionId: cfg.cliSessionId,
@@ -2707,8 +2784,9 @@ function spawnCli(cfg) {
2707
2784
  // the file Claude creates on first submit isn't absorbed as history,
2708
2785
  // and baseline-existing on resume so prior-run turns ARE absorbed (we
2709
2786
  // don't want to re-emit yesterday's conversation as fresh turns).
2710
- if (cfg.cliId === 'claude-code' && cfg.sessionId) {
2711
- const claudeJsonl = claudeJsonlPathForSession(cfg.sessionId, cfg.workingDir);
2787
+ if (cfg.cliId === 'claude-code' && adapterSessionId) {
2788
+ const claudeBridgeSessionId = cfg.cliSessionId ?? adapterSessionId;
2789
+ const claudeJsonl = claudeJsonlPathForSession(claudeBridgeSessionId, cfg.workingDir);
2712
2790
  startBridgeWatcher(claudeJsonl, {
2713
2791
  cliPid: cliPid ?? undefined,
2714
2792
  cliCwd: cfg.workingDir,
@@ -3186,6 +3264,9 @@ if(isTouch&&typeof Hammer!=='undefined'){
3186
3264
  }
3187
3265
  // ─── IPC Communication ───────────────────────────────────────────────────────
3188
3266
  function send(msg) {
3267
+ if (isWorkflowWorker() && msg.type === 'final_output') {
3268
+ workflowFinalOutputSent = true;
3269
+ }
3189
3270
  process.send?.(msg);
3190
3271
  }
3191
3272
  function log(msg) {
@@ -3210,9 +3291,14 @@ process.on('message', async (raw) => {
3210
3291
  const { setDefaultLocale } = await import('./i18n/index.js');
3211
3292
  setDefaultLocale(msg.locale);
3212
3293
  }
3213
- // Scope session store to this bot's per-bot file
3214
- if (msg.larkAppId)
3294
+ // Scope session store to this bot's per-bot file.
3295
+ // Slice C0: workflow-spawned workers (BOTMUX_WORKFLOW=1) skip this —
3296
+ // their `sessionId` is synthetic (`wf-<runId>-<activityId>-...`) and
3297
+ // must not be appended to the bot's chat-session registry. The
3298
+ // workflow's own event log is the source of truth for run state.
3299
+ if (msg.larkAppId && process.env.BOTMUX_WORKFLOW !== '1') {
3215
3300
  sessionStore.init(msg.larkAppId);
3301
+ }
3216
3302
  // Capture credentials for direct image upload from worker
3217
3303
  larkAppIdForUpload = msg.larkAppId;
3218
3304
  larkAppSecretForUpload = msg.larkAppSecret;
@@ -3226,9 +3312,20 @@ process.on('message', async (raw) => {
3226
3312
  renderRows = dims.rows;
3227
3313
  log(`Init: session=${sessionId}, cwd=${msg.workingDir}, render=${renderCols}x${renderRows}${msg.adoptMode ? ' (adopt-pane)' : ''}`);
3228
3314
  try {
3229
- const port = await startWebServer('0.0.0.0', msg.webPort);
3230
- startScreenUpdates();
3231
- startScreenAnalyzer();
3315
+ let port = 0;
3316
+ if (!isWorkflowWorker()) {
3317
+ port = await startWebServer('0.0.0.0', msg.webPort);
3318
+ startScreenUpdates();
3319
+ startScreenAnalyzer();
3320
+ }
3321
+ else {
3322
+ // Workflow attempts still expose a read-only web terminal so the
3323
+ // workflow dashboard can observe in-flight subagents. Keep the
3324
+ // chat-side features disabled: no screen cards, no analyzer, no
3325
+ // sessionStore writes.
3326
+ port = await startWebServer('0.0.0.0', msg.webPort);
3327
+ log('Workflow worker mode: web terminal enabled; skipping screen updates and screen analyzer');
3328
+ }
3232
3329
  spawnCli(msg);
3233
3330
  // Queue the initial prompt — flushed when CLI shows idle.
3234
3331
  // Adapters with passesInitialPromptViaArgs (e.g. Gemini -i) bake the
@@ -3453,6 +3550,13 @@ function cleanup() {
3453
3550
  httpServer.close();
3454
3551
  httpServer = null;
3455
3552
  }
3553
+ if (workflowPtyLogStream) {
3554
+ try {
3555
+ workflowPtyLogStream.end();
3556
+ }
3557
+ catch { /* already closed */ }
3558
+ workflowPtyLogStream = undefined;
3559
+ }
3456
3560
  }
3457
3561
  process.on('SIGTERM', () => { stopScreenshotLoop(); killCli(); cleanup(); process.exit(0); });
3458
3562
  process.on('SIGINT', () => { stopScreenshotLoop(); killCli(); cleanup(); process.exit(0); });