botmux 2.33.0 → 2.34.0
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 +219 -6
- 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
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow runtime — event-writing glue for orchestrator actions.
|
|
3
|
+
*
|
|
4
|
+
* `decideNextActions` in `orchestrator.ts` is pure; this module performs
|
|
5
|
+
* the actual side effects: writes events to the EventLog and (for
|
|
6
|
+
* subagent dispatch) invokes the worker spawn callback.
|
|
7
|
+
*
|
|
8
|
+
* The `WorkerSpawnFn` indirection keeps tests isolated from the real
|
|
9
|
+
* worker / bot-registry / daemon plumbing — Slice D wires the live
|
|
10
|
+
* spawn function; tests pass a fake.
|
|
11
|
+
*
|
|
12
|
+
* Scope (Slice B-1):
|
|
13
|
+
* - dispatchGate → writes attemptCreated(gate) + waitCreated
|
|
14
|
+
* - dispatchWork → writes attemptCreated(work) + invokes spawn
|
|
15
|
+
* - completeNode* / completeRun* → terminal node/run writes
|
|
16
|
+
* (rootCauseEventId resolved from the latest activityFailed event)
|
|
17
|
+
*/
|
|
18
|
+
import { promises as fs } from 'node:fs';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { writeEffectInputSidecar } from './effect-input.js';
|
|
21
|
+
import { writeBlob, writeJsonBlob } from './blob.js';
|
|
22
|
+
import { BindingError, resolveBindings, resolveBoundString, } from './output-binding.js';
|
|
23
|
+
import { replay } from './events/replay.js';
|
|
24
|
+
import { createWait } from './wait.js';
|
|
25
|
+
import { executeSideEffect } from './hostExecutors/protocol.js';
|
|
26
|
+
function nowMs(ctx) {
|
|
27
|
+
return ctx.now ? ctx.now() : Date.now();
|
|
28
|
+
}
|
|
29
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
30
|
+
function gateAttemptId(activityId) {
|
|
31
|
+
return `${activityId}::att-1`;
|
|
32
|
+
}
|
|
33
|
+
function workAttemptId(activityId, attemptNumber) {
|
|
34
|
+
return `${activityId}::att-${attemptNumber}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the bot identity snapshot captured at runCreated.
|
|
38
|
+
*
|
|
39
|
+
* If caller supplies a Snapshot we read it directly (cheapest).
|
|
40
|
+
* Otherwise we replay the log — slower but always available. The
|
|
41
|
+
* runtime always passes a snapshot in practice; the fallback exists so
|
|
42
|
+
* tests that don't bother to compute one still get correct behavior.
|
|
43
|
+
*/
|
|
44
|
+
async function resolveBotSnapshot(ctx, botName, snapshot) {
|
|
45
|
+
if (snapshot)
|
|
46
|
+
return snapshot.run.botSnapshots?.[botName];
|
|
47
|
+
const events = await ctx.log.readAll();
|
|
48
|
+
if (events.length === 0)
|
|
49
|
+
return undefined;
|
|
50
|
+
const first = events[0];
|
|
51
|
+
if (first.type !== 'runCreated')
|
|
52
|
+
return undefined;
|
|
53
|
+
const p = first.payload;
|
|
54
|
+
if (typeof p !== 'object' || p === null || 'ref' in p) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const snaps = p.botSnapshots;
|
|
58
|
+
return snaps?.[botName];
|
|
59
|
+
}
|
|
60
|
+
async function attemptSidecarDir(log, activityId, attemptId) {
|
|
61
|
+
const dir = join(log.runDir, 'attempts', activityId, attemptId);
|
|
62
|
+
await fs.mkdir(dir, { recursive: true });
|
|
63
|
+
return dir;
|
|
64
|
+
}
|
|
65
|
+
async function writeSessionSidecar(log, activityId, attemptId, session) {
|
|
66
|
+
const dir = await attemptSidecarDir(log, activityId, attemptId);
|
|
67
|
+
const file = join(dir, 'session.json');
|
|
68
|
+
await fs.writeFile(file, JSON.stringify(session, null, 2), 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
function withAttemptLogPath(session, attemptLogPath) {
|
|
71
|
+
return session.logPath ? session : { ...session, logPath: attemptLogPath };
|
|
72
|
+
}
|
|
73
|
+
async function resolveWorkflowIdentity(ctx, snapshot) {
|
|
74
|
+
const snap = snapshot ?? replay(await ctx.log.readAll());
|
|
75
|
+
if (!snap.run.workflowId || !snap.run.revisionId) {
|
|
76
|
+
throw new Error(`workflow identity missing for run ${ctx.log.runId}`);
|
|
77
|
+
}
|
|
78
|
+
return { workflowId: snap.run.workflowId, revisionId: snap.run.revisionId };
|
|
79
|
+
}
|
|
80
|
+
function bindingContext(ctx, snapshot) {
|
|
81
|
+
let paramsPromise;
|
|
82
|
+
return {
|
|
83
|
+
snapshot,
|
|
84
|
+
def: ctx.def,
|
|
85
|
+
log: ctx.log,
|
|
86
|
+
loadParams: () => {
|
|
87
|
+
paramsPromise ??= loadRunParamsFromSnapshot(snapshot);
|
|
88
|
+
return paramsPromise;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function loadRunParamsFromSnapshot(snapshot) {
|
|
93
|
+
const inputPath = snapshot.run.input?.outputPath;
|
|
94
|
+
if (!inputPath) {
|
|
95
|
+
throw new BindingError('run input params missing outputPath');
|
|
96
|
+
}
|
|
97
|
+
const raw = await fs.readFile(inputPath, 'utf-8');
|
|
98
|
+
const parsed = JSON.parse(raw);
|
|
99
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
100
|
+
throw new BindingError('run input params blob is not an object');
|
|
101
|
+
}
|
|
102
|
+
return parsed;
|
|
103
|
+
}
|
|
104
|
+
async function failHostExecutor(ctx, activityId, attemptId, error) {
|
|
105
|
+
await ctx.log.append({
|
|
106
|
+
runId: ctx.log.runId,
|
|
107
|
+
type: 'activityFailed',
|
|
108
|
+
actor: 'scheduler',
|
|
109
|
+
payload: {
|
|
110
|
+
activityId,
|
|
111
|
+
attemptId,
|
|
112
|
+
error,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
kind: 'failed',
|
|
117
|
+
attemptId,
|
|
118
|
+
errorClass: error.errorClass,
|
|
119
|
+
errorCode: error.errorCode,
|
|
120
|
+
errorMessage: error.errorMessage,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function executeRegisteredHostExecutor(registered, hostCtx, input) {
|
|
124
|
+
return executeSideEffect(hostCtx, input, registered.executor);
|
|
125
|
+
}
|
|
126
|
+
export async function dispatchGate(ctx, action, options = {}) {
|
|
127
|
+
const attemptId = gateAttemptId(action.activityId);
|
|
128
|
+
const inputRef = await writeJsonBlob(ctx.log, {
|
|
129
|
+
kind: 'human-gate',
|
|
130
|
+
prompt: action.humanGate.prompt,
|
|
131
|
+
approvers: action.humanGate.approvers,
|
|
132
|
+
});
|
|
133
|
+
const attemptCreated = (await ctx.log.append({
|
|
134
|
+
runId: ctx.log.runId,
|
|
135
|
+
type: 'attemptCreated',
|
|
136
|
+
actor: 'scheduler',
|
|
137
|
+
payload: {
|
|
138
|
+
nodeId: action.nodeId,
|
|
139
|
+
activityId: action.activityId,
|
|
140
|
+
attemptId,
|
|
141
|
+
attemptNumber: 1,
|
|
142
|
+
inputRef,
|
|
143
|
+
},
|
|
144
|
+
}));
|
|
145
|
+
let resolvedPrompt;
|
|
146
|
+
try {
|
|
147
|
+
resolvedPrompt = await resolveBoundString(action.humanGate.prompt, bindingContext(ctx, options.snapshot ?? replay(await ctx.log.readAll())));
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
if (err instanceof BindingError) {
|
|
151
|
+
const activityFailed = await writeBindingFailure(ctx, action.activityId, attemptId, err.message);
|
|
152
|
+
return { kind: 'failed', attemptId, attemptCreated, activityFailed };
|
|
153
|
+
}
|
|
154
|
+
throw err;
|
|
155
|
+
}
|
|
156
|
+
const deadlineAt = action.humanGate.deadlineMs
|
|
157
|
+
? nowMs(ctx) + action.humanGate.deadlineMs
|
|
158
|
+
: undefined;
|
|
159
|
+
const promptField = await splitHumanGatePrompt(ctx, resolvedPrompt);
|
|
160
|
+
const waitCreated = await createWait(ctx.log, {
|
|
161
|
+
activityId: action.activityId,
|
|
162
|
+
attemptId,
|
|
163
|
+
nodeId: action.nodeId,
|
|
164
|
+
waitKind: 'human-gate',
|
|
165
|
+
deadlineAt,
|
|
166
|
+
...promptField,
|
|
167
|
+
approvers: action.humanGate.approvers,
|
|
168
|
+
onTimeout: action.humanGate.onTimeout,
|
|
169
|
+
});
|
|
170
|
+
return { kind: 'wait', attemptId, attemptCreated, waitCreated };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Producer-side split for the humanGate prompt: small prompts stay inline
|
|
174
|
+
* on `waitCreated.payload.prompt`; anything over `PROMPT_INLINE_MAX_BYTES`
|
|
175
|
+
* spills to a content-addressed blob and the event carries `promptRef` +
|
|
176
|
+
* a short `promptPreview` for card / dashboard display.
|
|
177
|
+
*
|
|
178
|
+
* The schema accepts arbitrarily long inline prompts for historical
|
|
179
|
+
* compatibility, so this threshold is a runtime policy, not a wire
|
|
180
|
+
* contract. Cards and dashboards MUST NOT read the blob — they render
|
|
181
|
+
* `promptPreview` only — so the preview is the contract for "what an
|
|
182
|
+
* approver sees" when prompts are large.
|
|
183
|
+
*/
|
|
184
|
+
async function splitHumanGatePrompt(ctx, resolvedPrompt) {
|
|
185
|
+
if (Buffer.byteLength(resolvedPrompt, 'utf-8') <= PROMPT_INLINE_MAX_BYTES) {
|
|
186
|
+
return { prompt: resolvedPrompt };
|
|
187
|
+
}
|
|
188
|
+
const buf = Buffer.from(resolvedPrompt, 'utf-8');
|
|
189
|
+
const promptRef = await writeBlob(ctx.log, buf, {
|
|
190
|
+
contentType: 'text/plain',
|
|
191
|
+
schemaVersion: 1,
|
|
192
|
+
});
|
|
193
|
+
return {
|
|
194
|
+
promptRef,
|
|
195
|
+
promptPreview: makePromptPreview(resolvedPrompt),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Producer policy: inline prompts <= 1 KiB; bigger spills to a blob.
|
|
200
|
+
* Chosen to leave headroom under the 4 KiB inline-event cap for
|
|
201
|
+
* activityId / nodeId / approvers / onTimeout and any future small
|
|
202
|
+
* fields.
|
|
203
|
+
*/
|
|
204
|
+
export const PROMPT_INLINE_MAX_BYTES = 1024;
|
|
205
|
+
/**
|
|
206
|
+
* Build the preview string carried inline on `waitCreated` when the
|
|
207
|
+
* full prompt is in a blob. Two simultaneous budgets (codex peg 2):
|
|
208
|
+
* - chars ≤ 500: schema cap from WaitCreatedPayload.promptPreview
|
|
209
|
+
* - bytes ≤ 800: UTF-8 budget so 500 CJK chars (~1.5 KiB) don't bloat
|
|
210
|
+
* the envelope past the 4 KiB inline cap
|
|
211
|
+
* Whichever budget hits first wins; a trailing ellipsis flags truncation.
|
|
212
|
+
*/
|
|
213
|
+
const PROMPT_PREVIEW_MAX_CHARS = 480; // 500 - ellipsis chars, safety
|
|
214
|
+
const PROMPT_PREVIEW_MAX_BYTES = 800;
|
|
215
|
+
export function makePromptPreview(full) {
|
|
216
|
+
const chars = [...full];
|
|
217
|
+
if (chars.length <= PROMPT_PREVIEW_MAX_CHARS && Buffer.byteLength(full, 'utf-8') <= PROMPT_PREVIEW_MAX_BYTES) {
|
|
218
|
+
return full;
|
|
219
|
+
}
|
|
220
|
+
const ELLIPSIS = '…(完整内容见 dashboard)';
|
|
221
|
+
const charBudget = PROMPT_PREVIEW_MAX_CHARS - [...ELLIPSIS].length;
|
|
222
|
+
const byteBudget = PROMPT_PREVIEW_MAX_BYTES - Buffer.byteLength(ELLIPSIS, 'utf-8');
|
|
223
|
+
let bytes = 0;
|
|
224
|
+
let cut = chars.length;
|
|
225
|
+
for (let i = 0; i < chars.length; i++) {
|
|
226
|
+
if (i >= charBudget) {
|
|
227
|
+
cut = i;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
bytes += Buffer.byteLength(chars[i], 'utf-8');
|
|
231
|
+
if (bytes > byteBudget) {
|
|
232
|
+
cut = i;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return chars.slice(0, cut).join('') + ELLIPSIS;
|
|
237
|
+
}
|
|
238
|
+
async function writeBindingFailure(ctx, activityId, attemptId, message) {
|
|
239
|
+
return (await ctx.log.append({
|
|
240
|
+
runId: ctx.log.runId,
|
|
241
|
+
type: 'activityFailed',
|
|
242
|
+
actor: 'scheduler',
|
|
243
|
+
payload: {
|
|
244
|
+
activityId,
|
|
245
|
+
attemptId,
|
|
246
|
+
error: {
|
|
247
|
+
errorCode: 'InputBindingFailed',
|
|
248
|
+
errorClass: 'userFault',
|
|
249
|
+
errorMessage: truncateRuntimeErrorMessage(message),
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Run a work activity end-to-end:
|
|
256
|
+
* 1. write `attemptCreated{work}`
|
|
257
|
+
* 2. for `subagent`: invoke `spawnSubagent`, persist session sidecar,
|
|
258
|
+
* write `activitySucceeded` or `activityFailed`
|
|
259
|
+
* 3. for `hostExecutor`: v0 placeholder — returns `unsupported` until
|
|
260
|
+
* Slice E (executor registry) lands. Caller can decide to surface
|
|
261
|
+
* this as a manual error or skip the run.
|
|
262
|
+
*
|
|
263
|
+
* The function does not retry — that's resume.ts's job after a terminal
|
|
264
|
+
* `activityFailed` lands. Orchestrator will see the failed work
|
|
265
|
+
* activity on its next tick and emit `completeNodeFailed`.
|
|
266
|
+
*/
|
|
267
|
+
export async function dispatchWork(ctx, action, options = {}) {
|
|
268
|
+
const attemptNumber = options.attemptNumber ?? 1;
|
|
269
|
+
const attemptId = workAttemptId(action.activityId, attemptNumber);
|
|
270
|
+
const node = action.node;
|
|
271
|
+
const bindingCtx = bindingContext(ctx, options.snapshot ?? replay(await ctx.log.readAll()));
|
|
272
|
+
if (node.type === 'hostExecutor') {
|
|
273
|
+
// attemptCreated carries the RAW (pre-binding) input. Operator-side
|
|
274
|
+
// debug can see the literal `$ref` the author wrote, while the
|
|
275
|
+
// effect-input sidecar (below) holds the resolved+parsed form.
|
|
276
|
+
const inputRef = await writeJsonBlob(ctx.log, {
|
|
277
|
+
kind: 'hostExecutor',
|
|
278
|
+
executor: node.executor,
|
|
279
|
+
input: node.input,
|
|
280
|
+
});
|
|
281
|
+
await ctx.log.append({
|
|
282
|
+
runId: ctx.log.runId,
|
|
283
|
+
type: 'attemptCreated',
|
|
284
|
+
actor: 'scheduler',
|
|
285
|
+
payload: {
|
|
286
|
+
nodeId: action.nodeId,
|
|
287
|
+
activityId: action.activityId,
|
|
288
|
+
attemptId,
|
|
289
|
+
attemptNumber,
|
|
290
|
+
inputRef,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
const registered = ctx.hostExecutors?.get(node.executor);
|
|
294
|
+
if (!registered) {
|
|
295
|
+
return failHostExecutor(ctx, action.activityId, attemptId, {
|
|
296
|
+
errorCode: 'UnknownProviderError',
|
|
297
|
+
errorClass: 'manual',
|
|
298
|
+
errorMessage: `hostExecutor '${node.executor}' is not registered.`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
let resolvedInput;
|
|
302
|
+
try {
|
|
303
|
+
resolvedInput = await resolveBindings(node.input, bindingCtx);
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
if (err instanceof BindingError) {
|
|
307
|
+
return failHostExecutor(ctx, action.activityId, attemptId, {
|
|
308
|
+
errorCode: 'InputBindingFailed',
|
|
309
|
+
errorClass: 'userFault',
|
|
310
|
+
errorMessage: truncateRuntimeErrorMessage(err.message),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
throw err;
|
|
314
|
+
}
|
|
315
|
+
let parsedInput;
|
|
316
|
+
try {
|
|
317
|
+
parsedInput = registered.parseInput(resolvedInput);
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
return failHostExecutor(ctx, action.activityId, attemptId, {
|
|
321
|
+
errorCode: 'InputValidationFailed',
|
|
322
|
+
errorClass: 'userFault',
|
|
323
|
+
errorMessage: truncateRuntimeErrorMessage(err instanceof Error ? err.message : String(err)),
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
await writeEffectInputSidecar(ctx.log, action.activityId, attemptId, parsedInput);
|
|
327
|
+
const identity = await resolveWorkflowIdentity(ctx, options.snapshot);
|
|
328
|
+
const result = await executeRegisteredHostExecutor(registered, {
|
|
329
|
+
log: ctx.log,
|
|
330
|
+
runId: ctx.log.runId,
|
|
331
|
+
workflowId: identity.workflowId,
|
|
332
|
+
revisionId: identity.revisionId,
|
|
333
|
+
nodeId: action.nodeId,
|
|
334
|
+
activityId: action.activityId,
|
|
335
|
+
attemptId,
|
|
336
|
+
}, parsedInput);
|
|
337
|
+
if (result.ok) {
|
|
338
|
+
if ('ref' in result.event.payload) {
|
|
339
|
+
throw new Error('hostExecutor activitySucceeded unexpectedly used payload ref');
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
kind: 'succeeded',
|
|
343
|
+
attemptId,
|
|
344
|
+
outputRef: result.event.payload.outputRef,
|
|
345
|
+
session: {
|
|
346
|
+
sessionId: `host-${action.activityId}-${attemptId}`,
|
|
347
|
+
botName: node.executor,
|
|
348
|
+
startedAt: nowMs(ctx),
|
|
349
|
+
endedAt: nowMs(ctx),
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
kind: 'failed',
|
|
355
|
+
attemptId,
|
|
356
|
+
errorClass: result.error.errorClass,
|
|
357
|
+
errorCode: result.error.errorCode,
|
|
358
|
+
errorMessage: result.error.errorMessage,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// Subagent path: serialize the RAW (pre-binding) prompt as the input
|
|
362
|
+
// blob so audit can see the literal `$ref` the author wrote. The
|
|
363
|
+
// resolved prompt is what we actually hand to the worker.
|
|
364
|
+
const inputRef = await writeJsonBlob(ctx.log, {
|
|
365
|
+
kind: 'subagent',
|
|
366
|
+
bot: node.bot,
|
|
367
|
+
prompt: node.prompt,
|
|
368
|
+
});
|
|
369
|
+
await ctx.log.append({
|
|
370
|
+
runId: ctx.log.runId,
|
|
371
|
+
type: 'attemptCreated',
|
|
372
|
+
actor: 'scheduler',
|
|
373
|
+
payload: {
|
|
374
|
+
nodeId: action.nodeId,
|
|
375
|
+
activityId: action.activityId,
|
|
376
|
+
attemptId,
|
|
377
|
+
attemptNumber,
|
|
378
|
+
inputRef,
|
|
379
|
+
},
|
|
380
|
+
});
|
|
381
|
+
let resolvedPrompt;
|
|
382
|
+
try {
|
|
383
|
+
resolvedPrompt = await resolveBoundString(node.prompt, bindingCtx);
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
if (err instanceof BindingError) {
|
|
387
|
+
const activityFailed = await writeBindingFailure(ctx, action.activityId, attemptId, err.message);
|
|
388
|
+
return {
|
|
389
|
+
kind: 'failed',
|
|
390
|
+
attemptId,
|
|
391
|
+
errorClass: 'userFault',
|
|
392
|
+
errorCode: 'InputBindingFailed',
|
|
393
|
+
errorMessage: activityFailed.payload && !('ref' in activityFailed.payload)
|
|
394
|
+
? activityFailed.payload.error.errorMessage
|
|
395
|
+
: err.message,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
throw err;
|
|
399
|
+
}
|
|
400
|
+
// NB: still skipping `leaseSigned` in v0 — that's tied to the lease-
|
|
401
|
+
// timeout enforcement path (Step 6) which we don't engage when the
|
|
402
|
+
// spawn callback runs inline. Re-introduce when leases are wired
|
|
403
|
+
// (Slice D / runtime-loop slice).
|
|
404
|
+
//
|
|
405
|
+
// BUT we DO write `activityRunning` here (v0.1.5 slice 3 round 1):
|
|
406
|
+
// replay projects it into `activity.status = 'running'` AND
|
|
407
|
+
// `node.status = 'running'`, which the run-level Feishu progress card's
|
|
408
|
+
// `collectRunningRows()` + `buildAttemptDeeplinkEnricher()` both gate
|
|
409
|
+
// on to render the "查看当前终端" deeplink. Without this write the
|
|
410
|
+
// activity stays `pending` for the entire lifetime of a long-running
|
|
411
|
+
// subagent and the card never shows the link. `leaseId` is a stable
|
|
412
|
+
// inline token so cold-attach replay is deterministic; real leases
|
|
413
|
+
// arrive with Slice D.
|
|
414
|
+
const botSnapshot = await resolveBotSnapshot(ctx, node.bot, options.snapshot);
|
|
415
|
+
const sidecarDir = await attemptSidecarDir(ctx.log, action.activityId, attemptId);
|
|
416
|
+
const attemptLogPath = join(sidecarDir, 'terminal.log');
|
|
417
|
+
await ctx.log.append({
|
|
418
|
+
runId: ctx.log.runId,
|
|
419
|
+
type: 'activityRunning',
|
|
420
|
+
actor: 'scheduler',
|
|
421
|
+
payload: {
|
|
422
|
+
activityId: action.activityId,
|
|
423
|
+
attemptId,
|
|
424
|
+
leaseId: `lease-${attemptId}`,
|
|
425
|
+
},
|
|
426
|
+
});
|
|
427
|
+
const spawnResult = await ctx.spawnSubagent({
|
|
428
|
+
botName: node.bot,
|
|
429
|
+
botSnapshot,
|
|
430
|
+
// Per UI doc §3.4 "freeze identity": prefer the snapshot's workingDir
|
|
431
|
+
// (frozen at runCreated) over current bot-registry state. Node-level
|
|
432
|
+
// override still wins — author intent on a specific step beats the
|
|
433
|
+
// run-wide bot default.
|
|
434
|
+
workingDir: node.workingDir ?? botSnapshot?.workingDir,
|
|
435
|
+
prompt: resolvedPrompt,
|
|
436
|
+
modelOverrides: node.modelOverrides,
|
|
437
|
+
toolPolicy: node.toolPolicy,
|
|
438
|
+
activityId: action.activityId,
|
|
439
|
+
attemptId,
|
|
440
|
+
nodeId: action.nodeId,
|
|
441
|
+
runId: ctx.log.runId,
|
|
442
|
+
attemptLogPath,
|
|
443
|
+
cancelSignal: options.cancelSignal,
|
|
444
|
+
});
|
|
445
|
+
if (spawnResult.session) {
|
|
446
|
+
spawnResult.session = withAttemptLogPath(spawnResult.session, attemptLogPath);
|
|
447
|
+
await writeSessionSidecar(ctx.log, action.activityId, attemptId, spawnResult.session);
|
|
448
|
+
}
|
|
449
|
+
if (spawnResult.kind === 'success') {
|
|
450
|
+
const outputRef = await writeJsonBlob(ctx.log, spawnResult.output);
|
|
451
|
+
await ctx.log.append({
|
|
452
|
+
runId: ctx.log.runId,
|
|
453
|
+
type: 'activitySucceeded',
|
|
454
|
+
actor: 'worker',
|
|
455
|
+
payload: {
|
|
456
|
+
activityId: action.activityId,
|
|
457
|
+
attemptId,
|
|
458
|
+
outputRef,
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
return { kind: 'succeeded', attemptId, outputRef, session: spawnResult.session };
|
|
462
|
+
}
|
|
463
|
+
if (spawnResult.kind === 'cancelled') {
|
|
464
|
+
// Worker observed `cancelSignal.aborted` and shut down (gracefully via
|
|
465
|
+
// SIGINT or forcefully via SIGKILL). Echo `cancelOriginEventId` from
|
|
466
|
+
// the abort reason straight into `activityCanceled.payload` — we avoid
|
|
467
|
+
// re-replaying the log here, which would otherwise miss the origin if
|
|
468
|
+
// cancel landed mid-tick (the dispatch's snapshot is tick-start, before
|
|
469
|
+
// `cancelRequested` was appended).
|
|
470
|
+
await ctx.log.append({
|
|
471
|
+
runId: ctx.log.runId,
|
|
472
|
+
type: 'activityCanceled',
|
|
473
|
+
actor: 'worker',
|
|
474
|
+
payload: {
|
|
475
|
+
activityId: action.activityId,
|
|
476
|
+
attemptId,
|
|
477
|
+
cancelOriginEventId: spawnResult.cancelOriginEventId,
|
|
478
|
+
},
|
|
479
|
+
});
|
|
480
|
+
return {
|
|
481
|
+
kind: 'cancelled',
|
|
482
|
+
attemptId,
|
|
483
|
+
cancelOriginEventId: spawnResult.cancelOriginEventId,
|
|
484
|
+
session: spawnResult.session,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
await ctx.log.append({
|
|
488
|
+
runId: ctx.log.runId,
|
|
489
|
+
type: 'activityFailed',
|
|
490
|
+
actor: 'worker',
|
|
491
|
+
payload: {
|
|
492
|
+
activityId: action.activityId,
|
|
493
|
+
attemptId,
|
|
494
|
+
error: {
|
|
495
|
+
errorCode: spawnResult.errorCode,
|
|
496
|
+
errorClass: spawnResult.errorClass,
|
|
497
|
+
errorMessage: spawnResult.errorMessage,
|
|
498
|
+
},
|
|
499
|
+
},
|
|
500
|
+
});
|
|
501
|
+
return {
|
|
502
|
+
kind: 'failed',
|
|
503
|
+
attemptId,
|
|
504
|
+
errorClass: spawnResult.errorClass,
|
|
505
|
+
errorCode: spawnResult.errorCode,
|
|
506
|
+
errorMessage: spawnResult.errorMessage,
|
|
507
|
+
session: spawnResult.session,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function truncateRuntimeErrorMessage(msg) {
|
|
511
|
+
const max = 2048;
|
|
512
|
+
return msg.length > max ? msg.slice(0, max - 3) + '...' : msg;
|
|
513
|
+
}
|
|
514
|
+
// ─── completeNodeSucceeded ───────────────────────────────────────────────
|
|
515
|
+
export async function completeNodeSucceeded(ctx, action) {
|
|
516
|
+
return (await ctx.log.append({
|
|
517
|
+
runId: ctx.log.runId,
|
|
518
|
+
type: 'nodeSucceeded',
|
|
519
|
+
actor: 'scheduler',
|
|
520
|
+
payload: {
|
|
521
|
+
nodeId: action.nodeId,
|
|
522
|
+
lastActivityId: action.lastActivityId,
|
|
523
|
+
},
|
|
524
|
+
}));
|
|
525
|
+
}
|
|
526
|
+
// ─── completeNodeFailed ───────────────────────────────────────────────────
|
|
527
|
+
// NB: nodeFailed payload (events doc v0.1.2) has no rootCauseEventId
|
|
528
|
+
// field — that lives on runFailed only. If/when the spec adds it to
|
|
529
|
+
// nodeFailed, lift `findRootCauseEventId` to take an activityId and
|
|
530
|
+
// reuse it here.
|
|
531
|
+
export async function completeNodeFailed(ctx, action) {
|
|
532
|
+
return (await ctx.log.append({
|
|
533
|
+
runId: ctx.log.runId,
|
|
534
|
+
type: 'nodeFailed',
|
|
535
|
+
actor: 'scheduler',
|
|
536
|
+
payload: {
|
|
537
|
+
nodeId: action.nodeId,
|
|
538
|
+
lastActivityId: action.lastActivityId,
|
|
539
|
+
errorClass: action.errorClass,
|
|
540
|
+
},
|
|
541
|
+
}));
|
|
542
|
+
}
|
|
543
|
+
// ─── completeRunSucceeded ─────────────────────────────────────────────────
|
|
544
|
+
export async function completeRunSucceeded(ctx, action) {
|
|
545
|
+
return (await ctx.log.append({
|
|
546
|
+
runId: ctx.log.runId,
|
|
547
|
+
type: 'runSucceeded',
|
|
548
|
+
actor: 'scheduler',
|
|
549
|
+
payload: { outputRef: action.outputRef },
|
|
550
|
+
}));
|
|
551
|
+
}
|
|
552
|
+
// ─── completeRunFailed ────────────────────────────────────────────────────
|
|
553
|
+
async function findRootCauseEventId(ctx, nodeId) {
|
|
554
|
+
const events = await ctx.log.readAll();
|
|
555
|
+
// Prefer the activityFailed under the failed node's last activity.
|
|
556
|
+
// Fall back to the nodeFailed event itself (always exists by now).
|
|
557
|
+
let nodeFailedEventId;
|
|
558
|
+
let activityFailedEventId;
|
|
559
|
+
const nodeActivities = new Set();
|
|
560
|
+
for (const e of events) {
|
|
561
|
+
if (e.type === 'attemptCreated') {
|
|
562
|
+
const p = e.payload;
|
|
563
|
+
if (!('ref' in p) && p.nodeId === nodeId)
|
|
564
|
+
nodeActivities.add(p.activityId);
|
|
565
|
+
}
|
|
566
|
+
else if (e.type === 'activityFailed') {
|
|
567
|
+
const p = e.payload;
|
|
568
|
+
if (!('ref' in p) && nodeActivities.has(p.activityId)) {
|
|
569
|
+
activityFailedEventId = e.eventId;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
else if (e.type === 'nodeFailed') {
|
|
573
|
+
const p = e.payload;
|
|
574
|
+
if (!('ref' in p) && p.nodeId === nodeId) {
|
|
575
|
+
nodeFailedEventId = e.eventId;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
return activityFailedEventId ?? nodeFailedEventId ?? events[0].eventId;
|
|
580
|
+
}
|
|
581
|
+
export async function completeRunFailed(ctx, action) {
|
|
582
|
+
const rootCauseEventId = await findRootCauseEventId(ctx, action.failedNodeId);
|
|
583
|
+
return (await ctx.log.append({
|
|
584
|
+
runId: ctx.log.runId,
|
|
585
|
+
type: 'runFailed',
|
|
586
|
+
actor: 'scheduler',
|
|
587
|
+
payload: {
|
|
588
|
+
failedNodeId: action.failedNodeId,
|
|
589
|
+
rootCauseEventId,
|
|
590
|
+
},
|
|
591
|
+
}));
|
|
592
|
+
}
|
|
593
|
+
export { replay };
|
|
594
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/workflows/runtime.ts"],"names":[],"mappings":"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"}
|