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.
- package/README.en.md +12 -1
- package/README.md +45 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +11 -0
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/cli/bots-list-output.d.ts +21 -0
- package/dist/cli/bots-list-output.d.ts.map +1 -0
- package/dist/cli/bots-list-output.js +23 -0
- package/dist/cli/bots-list-output.js.map +1 -0
- package/dist/cli/workflow.d.ts +13 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +781 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/cli.js +69 -14
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +211 -4
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +22 -12
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/worker-pool.d.ts +13 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +100 -6
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +884 -3
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/auth.d.ts +36 -0
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +22 -0
- package/dist/dashboard/auth.js.map +1 -1
- package/dist/dashboard/web/app.js +20 -1
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +356 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/workflow-catalog.d.ts +2 -0
- package/dist/dashboard/web/workflow-catalog.d.ts.map +1 -0
- package/dist/dashboard/web/workflow-catalog.js +323 -0
- package/dist/dashboard/web/workflow-catalog.js.map +1 -0
- package/dist/dashboard/web/workflows.d.ts +2 -0
- package/dist/dashboard/web/workflows.d.ts.map +1 -0
- package/dist/dashboard/web/workflows.js +1618 -0
- package/dist/dashboard/web/workflows.js.map +1 -0
- package/dist/dashboard/workflow-api.d.ts +23 -0
- package/dist/dashboard/workflow-api.d.ts.map +1 -0
- package/dist/dashboard/workflow-api.js +463 -0
- package/dist/dashboard/workflow-api.js.map +1 -0
- package/dist/dashboard-web/app.js +494 -199
- package/dist/dashboard-web/index.html +1 -0
- package/dist/dashboard-web/style.css +160 -6
- package/dist/dashboard-web/terminal-replay.html +227 -0
- package/dist/dashboard.js +29 -12
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +12 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +12 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +3 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +27 -1
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +19 -2
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +21 -2
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/workflow-card-handler.d.ts +50 -0
- package/dist/im/lark/workflow-card-handler.d.ts.map +1 -0
- package/dist/im/lark/workflow-card-handler.js +152 -0
- package/dist/im/lark/workflow-card-handler.js.map +1 -0
- package/dist/im/lark/workflow-cards.d.ts +46 -0
- package/dist/im/lark/workflow-cards.d.ts.map +1 -0
- package/dist/im/lark/workflow-cards.js +226 -0
- package/dist/im/lark/workflow-cards.js.map +1 -0
- package/dist/im/lark/workflow-progress-card.d.ts +76 -0
- package/dist/im/lark/workflow-progress-card.d.ts.map +1 -0
- package/dist/im/lark/workflow-progress-card.js +279 -0
- package/dist/im/lark/workflow-progress-card.js.map +1 -0
- package/dist/im/lark/workflow-slash-command.d.ts +92 -0
- package/dist/im/lark/workflow-slash-command.d.ts.map +1 -0
- package/dist/im/lark/workflow-slash-command.js +185 -0
- package/dist/im/lark/workflow-slash-command.js.map +1 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +17 -4
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/groups-store.d.ts +11 -0
- package/dist/services/groups-store.d.ts.map +1 -1
- package/dist/services/groups-store.js +26 -0
- package/dist/services/groups-store.js.map +1 -1
- package/dist/services/jsonl-cursor.d.ts +12 -0
- package/dist/services/jsonl-cursor.d.ts.map +1 -0
- package/dist/services/jsonl-cursor.js +45 -0
- package/dist/services/jsonl-cursor.js.map +1 -0
- package/dist/services/schedule-store.d.ts +35 -0
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +108 -1
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +399 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.js +4 -0
- package/dist/utils/cli-usage-limit.js.map +1 -1
- package/dist/worker.js +118 -14
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts +114 -0
- package/dist/workflows/attempt-resume.d.ts.map +1 -0
- package/dist/workflows/attempt-resume.js +385 -0
- package/dist/workflows/attempt-resume.js.map +1 -0
- package/dist/workflows/attempt-terminal.d.ts +21 -0
- package/dist/workflows/attempt-terminal.d.ts.map +1 -0
- package/dist/workflows/attempt-terminal.js +7 -0
- package/dist/workflows/attempt-terminal.js.map +1 -0
- package/dist/workflows/blob.d.ts +27 -0
- package/dist/workflows/blob.d.ts.map +1 -0
- package/dist/workflows/blob.js +39 -0
- package/dist/workflows/blob.js.map +1 -0
- package/dist/workflows/cancel-run.d.ts +45 -0
- package/dist/workflows/cancel-run.d.ts.map +1 -0
- package/dist/workflows/cancel-run.js +99 -0
- package/dist/workflows/cancel-run.js.map +1 -0
- package/dist/workflows/cancel.d.ts +111 -0
- package/dist/workflows/cancel.d.ts.map +1 -0
- package/dist/workflows/cancel.js +120 -0
- package/dist/workflows/cancel.js.map +1 -0
- package/dist/workflows/catalog.d.ts +60 -0
- package/dist/workflows/catalog.d.ts.map +1 -0
- package/dist/workflows/catalog.js +119 -0
- package/dist/workflows/catalog.js.map +1 -0
- package/dist/workflows/cold-attach.d.ts +30 -0
- package/dist/workflows/cold-attach.d.ts.map +1 -0
- package/dist/workflows/cold-attach.js +40 -0
- package/dist/workflows/cold-attach.js.map +1 -0
- package/dist/workflows/cold-scan.d.ts +21 -0
- package/dist/workflows/cold-scan.d.ts.map +1 -0
- package/dist/workflows/cold-scan.js +70 -0
- package/dist/workflows/cold-scan.js.map +1 -0
- package/dist/workflows/daemon-spawn.d.ts +117 -0
- package/dist/workflows/daemon-spawn.d.ts.map +1 -0
- package/dist/workflows/daemon-spawn.js +551 -0
- package/dist/workflows/daemon-spawn.js.map +1 -0
- package/dist/workflows/definition.d.ts +1309 -0
- package/dist/workflows/definition.d.ts.map +1 -0
- package/dist/workflows/definition.js +334 -0
- package/dist/workflows/definition.js.map +1 -0
- package/dist/workflows/effect-input.d.ts +4 -0
- package/dist/workflows/effect-input.d.ts.map +1 -0
- package/dist/workflows/effect-input.js +18 -0
- package/dist/workflows/effect-input.js.map +1 -0
- package/dist/workflows/events/append.d.ts +77 -0
- package/dist/workflows/events/append.d.ts.map +1 -0
- package/dist/workflows/events/append.js +214 -0
- package/dist/workflows/events/append.js.map +1 -0
- package/dist/workflows/events/idempotency.d.ts +77 -0
- package/dist/workflows/events/idempotency.d.ts.map +1 -0
- package/dist/workflows/events/idempotency.js +116 -0
- package/dist/workflows/events/idempotency.js.map +1 -0
- package/dist/workflows/events/index.d.ts +7 -0
- package/dist/workflows/events/index.d.ts.map +1 -0
- package/dist/workflows/events/index.js +7 -0
- package/dist/workflows/events/index.js.map +1 -0
- package/dist/workflows/events/payloads.d.ts +917 -0
- package/dist/workflows/events/payloads.d.ts.map +1 -0
- package/dist/workflows/events/payloads.js +337 -0
- package/dist/workflows/events/payloads.js.map +1 -0
- package/dist/workflows/events/replay.d.ts +238 -0
- package/dist/workflows/events/replay.d.ts.map +1 -0
- package/dist/workflows/events/replay.js +608 -0
- package/dist/workflows/events/replay.js.map +1 -0
- package/dist/workflows/events/schema.d.ts +5242 -0
- package/dist/workflows/events/schema.d.ts.map +1 -0
- package/dist/workflows/events/schema.js +295 -0
- package/dist/workflows/events/schema.js.map +1 -0
- package/dist/workflows/events/types.d.ts +34 -0
- package/dist/workflows/events/types.d.ts.map +1 -0
- package/dist/workflows/events/types.js +2 -0
- package/dist/workflows/events/types.js.map +1 -0
- package/dist/workflows/fanout.d.ts +36 -0
- package/dist/workflows/fanout.d.ts.map +1 -0
- package/dist/workflows/fanout.js +114 -0
- package/dist/workflows/fanout.js.map +1 -0
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts +41 -0
- package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/botmux-schedule.js +121 -0
- package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -0
- package/dist/workflows/hostExecutors/feishu-im.d.ts +12 -0
- package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/feishu-im.js +49 -0
- package/dist/workflows/hostExecutors/feishu-im.js.map +1 -0
- package/dist/workflows/hostExecutors/feishu-reply.d.ts +24 -0
- package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/feishu-reply.js +88 -0
- package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -0
- package/dist/workflows/hostExecutors/feishu-send.d.ts +23 -0
- package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/feishu-send.js +124 -0
- package/dist/workflows/hostExecutors/feishu-send.js.map +1 -0
- package/dist/workflows/hostExecutors/index.d.ts +8 -0
- package/dist/workflows/hostExecutors/index.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/index.js +8 -0
- package/dist/workflows/hostExecutors/index.js.map +1 -0
- package/dist/workflows/hostExecutors/protocol.d.ts +42 -0
- package/dist/workflows/hostExecutors/protocol.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/protocol.js +181 -0
- package/dist/workflows/hostExecutors/protocol.js.map +1 -0
- package/dist/workflows/hostExecutors/registry.d.ts +10 -0
- package/dist/workflows/hostExecutors/registry.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/registry.js +36 -0
- package/dist/workflows/hostExecutors/registry.js.map +1 -0
- package/dist/workflows/hostExecutors/types.d.ts +78 -0
- package/dist/workflows/hostExecutors/types.d.ts.map +1 -0
- package/dist/workflows/hostExecutors/types.js +2 -0
- package/dist/workflows/hostExecutors/types.js.map +1 -0
- package/dist/workflows/loader.d.ts +16 -0
- package/dist/workflows/loader.d.ts.map +1 -0
- package/dist/workflows/loader.js +56 -0
- package/dist/workflows/loader.js.map +1 -0
- package/dist/workflows/loop.d.ts +50 -0
- package/dist/workflows/loop.d.ts.map +1 -0
- package/dist/workflows/loop.js +350 -0
- package/dist/workflows/loop.js.map +1 -0
- package/dist/workflows/ops-projection.d.ts +168 -0
- package/dist/workflows/ops-projection.d.ts.map +1 -0
- package/dist/workflows/ops-projection.js +707 -0
- package/dist/workflows/ops-projection.js.map +1 -0
- package/dist/workflows/orchestrator.d.ts +107 -0
- package/dist/workflows/orchestrator.d.ts.map +1 -0
- package/dist/workflows/orchestrator.js +197 -0
- package/dist/workflows/orchestrator.js.map +1 -0
- package/dist/workflows/output-binding.d.ts +70 -0
- package/dist/workflows/output-binding.d.ts.map +1 -0
- package/dist/workflows/output-binding.js +265 -0
- package/dist/workflows/output-binding.js.map +1 -0
- package/dist/workflows/params.d.ts +61 -0
- package/dist/workflows/params.d.ts.map +1 -0
- package/dist/workflows/params.js +195 -0
- package/dist/workflows/params.js.map +1 -0
- package/dist/workflows/resume.d.ts +263 -0
- package/dist/workflows/resume.d.ts.map +1 -0
- package/dist/workflows/resume.js +808 -0
- package/dist/workflows/resume.js.map +1 -0
- package/dist/workflows/run-id.d.ts +2 -0
- package/dist/workflows/run-id.d.ts.map +1 -0
- package/dist/workflows/run-id.js +7 -0
- package/dist/workflows/run-id.js.map +1 -0
- package/dist/workflows/run-init.d.ts +48 -0
- package/dist/workflows/run-init.d.ts.map +1 -0
- package/dist/workflows/run-init.js +99 -0
- package/dist/workflows/run-init.js.map +1 -0
- package/dist/workflows/runs-dir.d.ts +4 -0
- package/dist/workflows/runs-dir.d.ts.map +1 -0
- package/dist/workflows/runs-dir.js +15 -0
- package/dist/workflows/runs-dir.js.map +1 -0
- package/dist/workflows/runtime.d.ts +211 -0
- package/dist/workflows/runtime.d.ts.map +1 -0
- package/dist/workflows/runtime.js +594 -0
- package/dist/workflows/runtime.js.map +1 -0
- package/dist/workflows/spawn-bot.d.ts +165 -0
- package/dist/workflows/spawn-bot.d.ts.map +1 -0
- package/dist/workflows/spawn-bot.js +215 -0
- package/dist/workflows/spawn-bot.js.map +1 -0
- package/dist/workflows/system.d.ts +49 -0
- package/dist/workflows/system.d.ts.map +1 -0
- package/dist/workflows/system.js +48 -0
- package/dist/workflows/system.js.map +1 -0
- package/dist/workflows/trigger-run.d.ts +70 -0
- package/dist/workflows/trigger-run.d.ts.map +1 -0
- package/dist/workflows/trigger-run.js +88 -0
- package/dist/workflows/trigger-run.js.map +1 -0
- package/dist/workflows/wait.d.ts +120 -0
- package/dist/workflows/wait.d.ts.map +1 -0
- package/dist/workflows/wait.js +181 -0
- package/dist/workflows/wait.js.map +1 -0
- 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
|
|
1444
|
-
codexBridgeOffset =
|
|
1445
|
-
codexBridgePendingTail =
|
|
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.
|
|
2701
|
+
claudeJsonlPathForSession(cfg.cliSessionId ?? adapterSessionId, cfg.workingDir);
|
|
2625
2702
|
}
|
|
2626
2703
|
const args = cliAdapter.buildArgs({
|
|
2627
|
-
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' &&
|
|
2711
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
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); });
|