@gobing-ai/ts-dual-workflow-engine 0.4.11 → 0.4.13
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.md +6 -0
- package/dist/action-step.d.ts.map +1 -1
- package/dist/action-step.js +1 -0
- package/dist/persistence.d.ts +10 -0
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +24 -0
- package/dist/run-lifecycle.d.ts +11 -6
- package/dist/run-lifecycle.d.ts.map +1 -1
- package/dist/run-lifecycle.js +22 -7
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +31 -4
- package/dist/state-machine.d.ts.map +1 -1
- package/dist/state-machine.js +3 -3
- package/dist/transition-flow.d.ts.map +1 -1
- package/dist/transition-flow.js +3 -3
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/action-step.ts +1 -0
- package/src/persistence.ts +28 -0
- package/src/run-lifecycle.ts +20 -7
- package/src/service.ts +30 -5
- package/src/state-machine.ts +13 -6
- package/src/transition-flow.ts +13 -6
- package/src/types.ts +11 -0
package/README.md
CHANGED
|
@@ -776,6 +776,12 @@ The workflow engine uses a **three-layer observability model**:
|
|
|
776
776
|
|
|
777
777
|
All three layers are **additive** — EventBus does not replace logging or tracing. A consumer who wants a progress bar subscribes to events; a consumer who wants traces attaches an OTel collector; both work independently.
|
|
778
778
|
|
|
779
|
+
Action runners also receive the persisted action-row identity as
|
|
780
|
+
`ActionRunContext.actionId`. It is optional for source compatibility with hosts
|
|
781
|
+
that invoke a runner directly, but engine-driven execution always supplies it
|
|
782
|
+
after `saveActionStart` succeeds. Consumers can use it to correlate runner-owned
|
|
783
|
+
output or control events without widening the persisted action schema.
|
|
784
|
+
|
|
779
785
|
### Event Map
|
|
780
786
|
|
|
781
787
|
`WorkflowEngineEvents` is a typed event map. All events are prefixed `workflow.`:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-step.d.ts","sourceRoot":"","sources":["../src/action-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGtH;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAElE,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,aAAa,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,cAAc,GACrB,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"action-step.d.ts","sourceRoot":"","sources":["../src/action-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAGtH;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAElE,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,aAAa,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,cAAc,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAgD3B;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,cAAc,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAS3B"}
|
package/dist/action-step.js
CHANGED
package/dist/persistence.d.ts
CHANGED
|
@@ -47,6 +47,11 @@ export declare class DbWorkflowPersistenceAdapter implements WorkflowPersistence
|
|
|
47
47
|
reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult>;
|
|
48
48
|
/** Load the current state name for a run. */
|
|
49
49
|
loadCurrentState(runId: string): Promise<string | undefined>;
|
|
50
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
51
|
+
loadLatestStateSnapshot(runId: string): Promise<{
|
|
52
|
+
state: string;
|
|
53
|
+
data: Record<string, unknown>;
|
|
54
|
+
} | undefined>;
|
|
50
55
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
51
56
|
listPausedRuns(options?: {
|
|
52
57
|
workflowName?: string;
|
|
@@ -112,6 +117,11 @@ export declare class MemoryWorkflowPersistenceAdapter implements WorkflowPersist
|
|
|
112
117
|
reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult>;
|
|
113
118
|
/** Load the current state name for a run. */
|
|
114
119
|
loadCurrentState(runId: string): Promise<string | undefined>;
|
|
120
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
121
|
+
loadLatestStateSnapshot(runId: string): Promise<{
|
|
122
|
+
state: string;
|
|
123
|
+
data: Record<string, unknown>;
|
|
124
|
+
} | undefined>;
|
|
115
125
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
116
126
|
listPausedRuns(options?: {
|
|
117
127
|
workflowName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
|
package/dist/persistence.js
CHANGED
|
@@ -174,6 +174,23 @@ export class DbWorkflowPersistenceAdapter {
|
|
|
174
174
|
const row = await this.db.queryFirst('SELECT state FROM workflow_states WHERE run_id = ? ORDER BY created_at DESC, rowid DESC LIMIT 1', runId);
|
|
175
175
|
return row?.state;
|
|
176
176
|
}
|
|
177
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
178
|
+
async loadLatestStateSnapshot(runId) {
|
|
179
|
+
await this.ensureSchema();
|
|
180
|
+
const row = await this.db.queryFirst('SELECT state, data_json FROM workflow_states WHERE run_id = ? ORDER BY created_at DESC, rowid DESC LIMIT 1', runId);
|
|
181
|
+
if (row == null)
|
|
182
|
+
return undefined;
|
|
183
|
+
let data = {};
|
|
184
|
+
if (row.data_json !== null && row.data_json.length > 0) {
|
|
185
|
+
try {
|
|
186
|
+
data = JSON.parse(row.data_json);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
data = {};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { state: row.state, data };
|
|
193
|
+
}
|
|
177
194
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
178
195
|
async listPausedRuns(options) {
|
|
179
196
|
await this.ensureSchema();
|
|
@@ -291,6 +308,13 @@ export class MemoryWorkflowPersistenceAdapter {
|
|
|
291
308
|
const last = this.states.findLast((s) => s.runId === runId);
|
|
292
309
|
return last?.state;
|
|
293
310
|
}
|
|
311
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
312
|
+
async loadLatestStateSnapshot(runId) {
|
|
313
|
+
const last = this.states.findLast((s) => s.runId === runId);
|
|
314
|
+
if (last === undefined)
|
|
315
|
+
return undefined;
|
|
316
|
+
return { state: last.state, data: last.data };
|
|
317
|
+
}
|
|
294
318
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
295
319
|
async listPausedRuns(options) {
|
|
296
320
|
let runs = [...this.runs.values()].filter((r) => r.status === 'paused');
|
package/dist/run-lifecycle.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type BusLifecycleEvents, EventBus, type Logger } from '@gobing-ai/ts-infra';
|
|
2
2
|
import type { WorkflowEngineEvents } from './events';
|
|
3
|
-
import type { WorkflowPersistenceAdapter, WorkflowRunOptions, WorkflowRunResult, WorkflowStatus } from './types';
|
|
3
|
+
import type { Vars, WorkflowPersistenceAdapter, WorkflowRunOptions, WorkflowRunResult, WorkflowStatus } from './types';
|
|
4
4
|
/** Workflow dialect carried on every run, span, and persisted record. */
|
|
5
5
|
export type WorkflowMode = WorkflowRunResult['mode'];
|
|
6
6
|
/** Keys of the runtime builtin namespace, single-sourced for resolver + validator. */
|
|
@@ -61,7 +61,7 @@ export declare class RunLifecycle {
|
|
|
61
61
|
* persisted the state atomically), only emit the enter observability —
|
|
62
62
|
* skip `saveWorkflowState` + `savePhase` to avoid duplicate INSERT rows.
|
|
63
63
|
*/
|
|
64
|
-
enter(stateOrNodeId: string, transitionsTaken: number, persist?: boolean): Promise<void>;
|
|
64
|
+
enter(stateOrNodeId: string, transitionsTaken: number, persist?: boolean, vars?: Vars): Promise<void>;
|
|
65
65
|
/**
|
|
66
66
|
* Atomically commit a transition together with the resulting state snapshot
|
|
67
67
|
* and optional phase record, then emit the transition observability event.
|
|
@@ -73,15 +73,20 @@ export declare class RunLifecycle {
|
|
|
73
73
|
commitHop(from: string, to: string, trigger: string | null, transitionsTaken: number, phase?: {
|
|
74
74
|
phase: string;
|
|
75
75
|
status: WorkflowStatus;
|
|
76
|
-
}): Promise<void>;
|
|
77
|
-
/** Persist a transition and emit its observability event. */
|
|
76
|
+
}, vars?: Vars): Promise<void>;
|
|
78
77
|
recordTransition(from: string, to: string, trigger: string | null): Promise<void>;
|
|
79
78
|
/** Finalize the run as succeeded and return its result. */
|
|
80
79
|
done(finalState: string, transitionsTaken: number): Promise<WorkflowRunResult>;
|
|
81
80
|
/** Finalize the run as failed and return its result. */
|
|
82
81
|
fail(finalState: string, transitionsTaken: number, reason?: string): Promise<WorkflowRunResult>;
|
|
83
|
-
/**
|
|
84
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Finalize the run as paused and return its result. Writes a fresh state
|
|
84
|
+
* snapshot carrying the post-action `effectiveVars` BEFORE the phase/finalize
|
|
85
|
+
* writes so resume can restore them — onEnter setVars (e.g. `__hitlAnswer`)
|
|
86
|
+
* would otherwise be lost because the prior snapshot predates this state's
|
|
87
|
+
* action execution (R3 of 0366).
|
|
88
|
+
*/
|
|
89
|
+
pause(stateOrNodeId: string, transitionsTaken: number, vars?: Vars): Promise<WorkflowRunResult>;
|
|
85
90
|
/** Emit the resumed event (called by WorkflowService after re-creating a lifecycle for resume). */
|
|
86
91
|
emitResumed(node: string): void;
|
|
87
92
|
/** Emit action-level observability before a host action is invoked. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-lifecycle.d.ts","sourceRoot":"","sources":["../src/run-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,kBAAkB,EACvB,QAAQ,EAER,KAAK,MAAM,EAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EACR,0BAA0B,EAC1B,kBAAkB,EAElB,iBAAiB,EACjB,cAAc,EACjB,MAAM,SAAS,CAAC;AAEjB,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAErD,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,wFASvB,CAAC;AAEX,mGAAmG;AACnG,wBAAgB,eAAe,CAC3B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,YAAY,GACnB,MAAM,CAAC,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,CAWhE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CACtB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAmB,GAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACjD,mFAAmF;IACnF,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;CACxD;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IASjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IATzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO;IAgBP;;;;;;;;OAQG;IACH,MAAM,CAAC,qBAAqB,CACxB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gBAAgB,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,GAChC,YAAY;IAIf;;;;OAIG;WACU,GAAG,CACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,iBAAiB,CAAC,GAC9D,OAAO,CAAC,iBAAiB,CAAC;IAyC7B;;;OAGG;WACU,MAAM,CACf,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,KAAK,OAAO,CAAC,iBAAiB,CAAC,GAC9D,OAAO,CAAC,iBAAiB,CAAC;IAY7B;;;;;OAKG;IACG,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"run-lifecycle.d.ts","sourceRoot":"","sources":["../src/run-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/run-lifecycle.js
CHANGED
|
@@ -117,9 +117,12 @@ export class RunLifecycle {
|
|
|
117
117
|
* persisted the state atomically), only emit the enter observability —
|
|
118
118
|
* skip `saveWorkflowState` + `savePhase` to avoid duplicate INSERT rows.
|
|
119
119
|
*/
|
|
120
|
-
async enter(stateOrNodeId, transitionsTaken, persist = true) {
|
|
120
|
+
async enter(stateOrNodeId, transitionsTaken, persist = true, vars) {
|
|
121
121
|
if (persist) {
|
|
122
|
-
|
|
122
|
+
const data = { transitionsTaken };
|
|
123
|
+
if (vars !== undefined)
|
|
124
|
+
data.effectiveVars = vars;
|
|
125
|
+
await this.persistence.saveWorkflowState(this.runId, stateOrNodeId, data);
|
|
123
126
|
await this.persistence.savePhase(this.runId, stateOrNodeId, 'running');
|
|
124
127
|
}
|
|
125
128
|
addSpanEvent('workflow.node.enter', {
|
|
@@ -141,8 +144,11 @@ export class RunLifecycle {
|
|
|
141
144
|
* `workflow.node.transition` only after the batch commits — a rolled-back
|
|
142
145
|
* batch emits nothing (R1.6).
|
|
143
146
|
*/
|
|
144
|
-
async commitHop(from, to, trigger, transitionsTaken, phase) {
|
|
145
|
-
|
|
147
|
+
async commitHop(from, to, trigger, transitionsTaken, phase, vars) {
|
|
148
|
+
const data = { transitionsTaken };
|
|
149
|
+
if (vars !== undefined)
|
|
150
|
+
data.effectiveVars = vars;
|
|
151
|
+
await this.persistence.commitTransition(this.runId, from, to, trigger, to, data, phase);
|
|
146
152
|
addSpanEvent('workflow.node.transition', {
|
|
147
153
|
runId: this.runId,
|
|
148
154
|
from,
|
|
@@ -157,7 +163,6 @@ export class RunLifecycle {
|
|
|
157
163
|
externalKey: this.externalKey,
|
|
158
164
|
});
|
|
159
165
|
}
|
|
160
|
-
/** Persist a transition and emit its observability event. */
|
|
161
166
|
async recordTransition(from, to, trigger) {
|
|
162
167
|
await this.persistence.saveTransition(this.runId, from, to, trigger);
|
|
163
168
|
addSpanEvent('workflow.node.transition', {
|
|
@@ -202,8 +207,18 @@ export class RunLifecycle {
|
|
|
202
207
|
this.logger.warn('workflow run failed', { finalState, transitionsTaken, reason });
|
|
203
208
|
return this.result('failed', finalState, transitionsTaken, reason);
|
|
204
209
|
}
|
|
205
|
-
/**
|
|
206
|
-
|
|
210
|
+
/**
|
|
211
|
+
* Finalize the run as paused and return its result. Writes a fresh state
|
|
212
|
+
* snapshot carrying the post-action `effectiveVars` BEFORE the phase/finalize
|
|
213
|
+
* writes so resume can restore them — onEnter setVars (e.g. `__hitlAnswer`)
|
|
214
|
+
* would otherwise be lost because the prior snapshot predates this state's
|
|
215
|
+
* action execution (R3 of 0366).
|
|
216
|
+
*/
|
|
217
|
+
async pause(stateOrNodeId, transitionsTaken, vars) {
|
|
218
|
+
const data = { transitionsTaken };
|
|
219
|
+
if (vars !== undefined)
|
|
220
|
+
data.effectiveVars = vars;
|
|
221
|
+
await this.persistence.saveWorkflowState(this.runId, stateOrNodeId, data);
|
|
207
222
|
await this.persistence.savePhase(this.runId, stateOrNodeId, 'paused');
|
|
208
223
|
await this.persistence.finalizeRun(this.runId, 'paused', new Date().toISOString());
|
|
209
224
|
this.logger.info('workflow run paused', { stateOrNodeId, transitionsTaken });
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAIjD,OAAO,KAAK,EACR,uBAAuB,EAEvB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAIjD,OAAO,KAAK,EACR,uBAAuB,EAEvB,uBAAuB,EAEvB,WAAW,EACX,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAGjB,6FAA6F;AAC7F,qBAAa,eAAe;IAMpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IANhC,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;gBAGnD,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,0BAA0B;IACxD;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;IAK/C,sGAAsG;IACtG,OAAO,CAAC,aAAa;IASrB,4CAA4C;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI9C,iDAAiD;IAC3C,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAc9F,oCAAoC;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIzF,oCAAoC;IAC9B,QAAQ;IAId,mEAAmE;IAC7D,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIrG,gFAAgF;IAC1E,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI9E,qFAAqF;IAC/E,SAAS,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,IAAI,CAAC;IACV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B7F,iGAAiG;IACjG,OAAO,CAAC,0BAA0B;IASlC,oFAAoF;YACtE,YAAY;IAY1B,uEAAuE;IACjE,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwC/G,iEAAiE;IAC3D,cAAc,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC;IAIhH;;;;;OAKG;IACG,iBAAiB,CACnB,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;YAsBrB,iBAAiB;IAgF/B;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAiBzB"}
|
package/dist/service.js
CHANGED
|
@@ -4,7 +4,7 @@ import { FSMError, WorkflowResumeError } from './errors.js';
|
|
|
4
4
|
import { RunLifecycle } from './run-lifecycle.js';
|
|
5
5
|
import { StateMachineDriver } from './state-machine.js';
|
|
6
6
|
import { TransitionFlowDriver } from './transition-flow.js';
|
|
7
|
-
import { resolveTemplates } from './variables.js';
|
|
7
|
+
import { mergeVars, resolveTemplates } from './variables.js';
|
|
8
8
|
/** High-level workflow service for loading, running, and listing persisted workflow runs. */
|
|
9
9
|
export class WorkflowService {
|
|
10
10
|
host;
|
|
@@ -119,22 +119,29 @@ export class WorkflowService {
|
|
|
119
119
|
if (currentState === undefined) {
|
|
120
120
|
throw new WorkflowResumeError(`Run "${runId}" has no persisted state to resume from`);
|
|
121
121
|
}
|
|
122
|
+
// Restore effectiveVars persisted in the last state snapshot so resume
|
|
123
|
+
// continues with the same runtime variables (e.g. `__hitlAnswer`). Caller
|
|
124
|
+
// overrides in `options.vars` win over the persisted snapshot (R3 of 0366).
|
|
125
|
+
const snapshot = await this.persistence.loadLatestStateSnapshot(runId);
|
|
126
|
+
const persistedVars = extractEffectiveVars(snapshot?.data);
|
|
127
|
+
const restoredVars = mergeVars(persistedVars, options?.vars);
|
|
128
|
+
const mergedOptions = { ...options, vars: restoredVars };
|
|
122
129
|
// Re-open the run as running.
|
|
123
130
|
const extKey = run.external_key ?? undefined;
|
|
124
131
|
await this.persistence.finalizeRun(runId, 'running', '');
|
|
125
|
-
const events = this.resolveEvents(
|
|
132
|
+
const events = this.resolveEvents(mergedOptions.events);
|
|
126
133
|
void events?.emit('workflow.run.resumed', { runId, node: currentState, externalKey: extKey });
|
|
127
134
|
// Resume through the appropriate driver, starting from the paused state (skip on-enter).
|
|
128
135
|
if (workflow.kind === 'transition-flow') {
|
|
129
136
|
return await new TransitionFlowDriver({
|
|
130
137
|
host: this.host,
|
|
131
138
|
persistence: this.persistence,
|
|
132
|
-
}).resume(workflow, runId, currentState, extKey,
|
|
139
|
+
}).resume(workflow, runId, currentState, extKey, mergedOptions);
|
|
133
140
|
}
|
|
134
141
|
return await new StateMachineDriver({
|
|
135
142
|
host: this.host,
|
|
136
143
|
persistence: this.persistence,
|
|
137
|
-
}).resume(workflow, runId, currentState, extKey,
|
|
144
|
+
}).resume(workflow, runId, currentState, extKey, mergedOptions);
|
|
138
145
|
}
|
|
139
146
|
/** List runs currently paused. Optional filters and ordering. */
|
|
140
147
|
async listPausedRuns(options) {
|
|
@@ -246,3 +253,23 @@ export class WorkflowService {
|
|
|
246
253
|
return { allowed: false, ...denial };
|
|
247
254
|
}
|
|
248
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Read `effectiveVars` from a state snapshot's data payload. Tolerates older
|
|
258
|
+
* snapshots that lack the field (returns `{}`) and silently drops non-string
|
|
259
|
+
* values, matching `mergeSetVars`'s defensive contract.
|
|
260
|
+
*/
|
|
261
|
+
function extractEffectiveVars(data) {
|
|
262
|
+
if (data === undefined)
|
|
263
|
+
return {};
|
|
264
|
+
const raw = data.effectiveVars;
|
|
265
|
+
if (raw === undefined || raw === null)
|
|
266
|
+
return {};
|
|
267
|
+
if (typeof raw !== 'object')
|
|
268
|
+
return {};
|
|
269
|
+
const filtered = {};
|
|
270
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
271
|
+
if (typeof value === 'string')
|
|
272
|
+
filtered[key] = value;
|
|
273
|
+
}
|
|
274
|
+
return filtered;
|
|
275
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAER,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAGjB,yDAAyD;AACzD,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CACpD;AAED,wEAAwE;AACxE,qBAAa,kBAAkB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,yBAAyB;IAE/D,6DAA6D;IACvD,GAAG,CAAC,QAAQ,EAAE,uBAAuB,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU1G,iFAAiF;IAC3E,MAAM,CACR,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAWf,IAAI;
|
|
1
|
+
{"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../src/state-machine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAER,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAGjB,yDAAyD;AACzD,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CACpD;AAED,wEAAwE;AACxE,qBAAa,kBAAkB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,yBAAyB;IAE/D,6DAA6D;IACvD,GAAG,CAAC,QAAQ,EAAE,uBAAuB,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU1G,iFAAiF;IAC3E,MAAM,CACR,QAAQ,EAAE,uBAAuB,EACjC,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAWf,IAAI;CA2IrB"}
|
package/dist/state-machine.js
CHANGED
|
@@ -45,7 +45,7 @@ export class StateMachineDriver {
|
|
|
45
45
|
else {
|
|
46
46
|
// 1. Persist current state snapshot before work starts (skipped when
|
|
47
47
|
// commitHop already persisted it atomically on the previous hop).
|
|
48
|
-
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop);
|
|
48
|
+
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop, vars);
|
|
49
49
|
// 2. Execute this state's on-enter actions in declaration order.
|
|
50
50
|
const enter = options.dryRun
|
|
51
51
|
? EMPTY_OUTCOME
|
|
@@ -79,7 +79,7 @@ export class StateMachineDriver {
|
|
|
79
79
|
}
|
|
80
80
|
// Pause: if the state declares pause, stop advancing and persist the paused position.
|
|
81
81
|
if (current.pause === true) {
|
|
82
|
-
return await lifecycle.pause(current.id, transitionsTaken);
|
|
82
|
+
return await lifecycle.pause(current.id, transitionsTaken, vars);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
const outbound = workflow.transitions.filter((transition) => transition.from === current?.id);
|
|
@@ -125,7 +125,7 @@ export class StateMachineDriver {
|
|
|
125
125
|
await lifecycle.commitHop(current.id, nextTransition.to, nextTransition.trigger ?? null, transitionsTaken, {
|
|
126
126
|
phase: nextTransition.to,
|
|
127
127
|
status: 'running',
|
|
128
|
-
});
|
|
128
|
+
}, vars);
|
|
129
129
|
if (transitionsTaken > iterationBound) {
|
|
130
130
|
return await lifecycle.fail(current.id, transitionsTaken, 'iteration-bound-exceeded');
|
|
131
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transition-flow.d.ts","sourceRoot":"","sources":["../src/transition-flow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAER,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAGjB,2DAA2D;AAC3D,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CACpD;AAED,0EAA0E;AAC1E,qBAAa,oBAAoB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAEjE,+DAA+D;IACzD,GAAG,CAAC,QAAQ,EAAE,yBAAyB,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU5G,qFAAqF;IAC/E,MAAM,CACR,QAAQ,EAAE,yBAAyB,EACnC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAWf,IAAI;
|
|
1
|
+
{"version":3,"file":"transition-flow.d.ts","sourceRoot":"","sources":["../src/transition-flow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,KAAK,EAER,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,SAAS,CAAC;AAGjB,2DAA2D;AAC3D,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CACpD;AAED,0EAA0E;AAC1E,qBAAa,oBAAoB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAEjE,+DAA+D;IACzD,GAAG,CAAC,QAAQ,EAAE,yBAAyB,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAU5G,qFAAqF;IAC/E,MAAM,CACR,QAAQ,EAAE,yBAAyB,EACnC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAWf,IAAI;CA0HrB"}
|
package/dist/transition-flow.js
CHANGED
|
@@ -45,7 +45,7 @@ export class TransitionFlowDriver {
|
|
|
45
45
|
else {
|
|
46
46
|
// 1. Persist current node snapshot before action execution (skipped when
|
|
47
47
|
// commitHop already persisted it atomically on the previous hop).
|
|
48
|
-
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop);
|
|
48
|
+
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop, vars);
|
|
49
49
|
// 2. Execute the node action when one is configured (skipped in dry-run).
|
|
50
50
|
if (options.dryRun) {
|
|
51
51
|
if (current.action !== undefined) {
|
|
@@ -78,7 +78,7 @@ export class TransitionFlowDriver {
|
|
|
78
78
|
}
|
|
79
79
|
// Pause: if the node declares pause, stop advancing and persist the paused position.
|
|
80
80
|
if (current.pause === true) {
|
|
81
|
-
return await lifecycle.pause(current.id, transitionsTaken);
|
|
81
|
+
return await lifecycle.pause(current.id, transitionsTaken, vars);
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
// 3. Stop when the node is terminal or no outgoing edge exists.
|
|
@@ -103,7 +103,7 @@ export class TransitionFlowDriver {
|
|
|
103
103
|
await lifecycle.commitHop(current.id, edge.to, edge.condition?.kind ?? null, transitionsTaken, {
|
|
104
104
|
phase: edge.to,
|
|
105
105
|
status: 'running',
|
|
106
|
-
});
|
|
106
|
+
}, vars);
|
|
107
107
|
// 6. Enforce the iteration bound after taking the transition.
|
|
108
108
|
if (transitionsTaken > iterationBound) {
|
|
109
109
|
return await lifecycle.fail(current.id, transitionsTaken, 'iteration-bound-exceeded');
|
package/dist/types.d.ts
CHANGED
|
@@ -100,6 +100,8 @@ export type WorkflowDef = StateMachineWorkflowDef | TransitionFlowWorkflowDef;
|
|
|
100
100
|
/** Action execution context passed to action runners. */
|
|
101
101
|
export interface ActionRunContext {
|
|
102
102
|
readonly runId: string;
|
|
103
|
+
/** Engine-owned persisted action identity for correlation and safe control targeting. */
|
|
104
|
+
readonly actionId?: string;
|
|
103
105
|
readonly workdir?: string;
|
|
104
106
|
readonly stateOrNodeId: string;
|
|
105
107
|
readonly vars: Vars;
|
|
@@ -257,6 +259,18 @@ export interface WorkflowPersistenceAdapter {
|
|
|
257
259
|
reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult>;
|
|
258
260
|
/** Load the current state name for a run (latest state snapshot). Returns undefined if no state recorded. */
|
|
259
261
|
loadCurrentState(runId: string): Promise<string | undefined>;
|
|
262
|
+
/**
|
|
263
|
+
* Load the latest state snapshot for a run — the full data payload (including
|
|
264
|
+
* `effectiveVars` when present), not just the state name. Used by resume to
|
|
265
|
+
* restore the post-action variable state that was active when the run paused.
|
|
266
|
+
* Old snapshots written before R1 of 0366 have no `effectiveVars` field;
|
|
267
|
+
* callers must tolerate `data.effectiveVars === undefined` and fall back to {}.
|
|
268
|
+
* Returns undefined if no state recorded.
|
|
269
|
+
*/
|
|
270
|
+
loadLatestStateSnapshot(runId: string): Promise<{
|
|
271
|
+
state: string;
|
|
272
|
+
data: Record<string, unknown>;
|
|
273
|
+
} | undefined>;
|
|
260
274
|
/** List runs with status 'paused'. Optional filters: workflow name, limit. Ordered most-recent-first. */
|
|
261
275
|
listPausedRuns(options?: {
|
|
262
276
|
workflowName?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/ts-dual-workflow-engine",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.13",
|
|
4
4
|
"description": "@gobing-ai/ts-dual-workflow-engine — State-machine and transition-flow workflow runtime.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"release": "echo 'Manual publish is disabled. Releases go through GitHub Actions via Trusted Publishing — push a tag: git tag @gobing-ai/ts-dual-workflow-engine-v<version> && git push --tags' && exit 1"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@gobing-ai/ts-db": "^0.4.
|
|
52
|
-
"@gobing-ai/ts-infra": "^0.4.
|
|
53
|
-
"@gobing-ai/ts-runtime": "^0.4.
|
|
51
|
+
"@gobing-ai/ts-db": "^0.4.13",
|
|
52
|
+
"@gobing-ai/ts-infra": "^0.4.13",
|
|
53
|
+
"@gobing-ai/ts-runtime": "^0.4.13",
|
|
54
54
|
"zod": "^4.1.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
package/src/action-step.ts
CHANGED
package/src/persistence.ts
CHANGED
|
@@ -263,6 +263,26 @@ export class DbWorkflowPersistenceAdapter implements WorkflowPersistenceAdapter
|
|
|
263
263
|
);
|
|
264
264
|
return row?.state;
|
|
265
265
|
}
|
|
266
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
267
|
+
async loadLatestStateSnapshot(
|
|
268
|
+
runId: string,
|
|
269
|
+
): Promise<{ state: string; data: Record<string, unknown> } | undefined> {
|
|
270
|
+
await this.ensureSchema();
|
|
271
|
+
const row = await this.db.queryFirst<{ state: string; data_json: string | null }>(
|
|
272
|
+
'SELECT state, data_json FROM workflow_states WHERE run_id = ? ORDER BY created_at DESC, rowid DESC LIMIT 1',
|
|
273
|
+
runId,
|
|
274
|
+
);
|
|
275
|
+
if (row == null) return undefined;
|
|
276
|
+
let data: Record<string, unknown> = {};
|
|
277
|
+
if (row.data_json !== null && row.data_json.length > 0) {
|
|
278
|
+
try {
|
|
279
|
+
data = JSON.parse(row.data_json) as Record<string, unknown>;
|
|
280
|
+
} catch {
|
|
281
|
+
data = {};
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return { state: row.state, data };
|
|
285
|
+
}
|
|
266
286
|
|
|
267
287
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
268
288
|
async listPausedRuns(options?: { workflowName?: string; limit?: number }): Promise<readonly WorkflowRunRecord[]> {
|
|
@@ -421,6 +441,14 @@ export class MemoryWorkflowPersistenceAdapter implements WorkflowPersistenceAdap
|
|
|
421
441
|
const last = this.states.findLast((s) => s.runId === runId);
|
|
422
442
|
return last?.state;
|
|
423
443
|
}
|
|
444
|
+
/** Load the latest state snapshot (full data payload) for a run. */
|
|
445
|
+
async loadLatestStateSnapshot(
|
|
446
|
+
runId: string,
|
|
447
|
+
): Promise<{ state: string; data: Record<string, unknown> } | undefined> {
|
|
448
|
+
const last = this.states.findLast((s) => s.runId === runId);
|
|
449
|
+
if (last === undefined) return undefined;
|
|
450
|
+
return { state: last.state, data: last.data };
|
|
451
|
+
}
|
|
424
452
|
|
|
425
453
|
/** List runs with status 'paused'. Ordered most-recent-first. */
|
|
426
454
|
async listPausedRuns(options?: { workflowName?: string; limit?: number }): Promise<readonly WorkflowRunRecord[]> {
|
package/src/run-lifecycle.ts
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { getProcessEnv } from '@gobing-ai/ts-runtime';
|
|
10
10
|
import type { WorkflowEngineEvents } from './events';
|
|
11
11
|
import type {
|
|
12
|
+
Vars,
|
|
12
13
|
WorkflowPersistenceAdapter,
|
|
13
14
|
WorkflowRunOptions,
|
|
14
15
|
WorkflowRunRecord,
|
|
@@ -200,9 +201,11 @@ export class RunLifecycle {
|
|
|
200
201
|
* persisted the state atomically), only emit the enter observability —
|
|
201
202
|
* skip `saveWorkflowState` + `savePhase` to avoid duplicate INSERT rows.
|
|
202
203
|
*/
|
|
203
|
-
async enter(stateOrNodeId: string, transitionsTaken: number, persist = true): Promise<void> {
|
|
204
|
+
async enter(stateOrNodeId: string, transitionsTaken: number, persist = true, vars?: Vars): Promise<void> {
|
|
204
205
|
if (persist) {
|
|
205
|
-
|
|
206
|
+
const data: Record<string, unknown> = { transitionsTaken };
|
|
207
|
+
if (vars !== undefined) data.effectiveVars = vars;
|
|
208
|
+
await this.persistence.saveWorkflowState(this.runId, stateOrNodeId, data);
|
|
206
209
|
await this.persistence.savePhase(this.runId, stateOrNodeId, 'running');
|
|
207
210
|
}
|
|
208
211
|
addSpanEvent('workflow.node.enter', {
|
|
@@ -231,8 +234,11 @@ export class RunLifecycle {
|
|
|
231
234
|
trigger: string | null,
|
|
232
235
|
transitionsTaken: number,
|
|
233
236
|
phase?: { phase: string; status: WorkflowStatus },
|
|
237
|
+
vars?: Vars,
|
|
234
238
|
): Promise<void> {
|
|
235
|
-
|
|
239
|
+
const data: Record<string, unknown> = { transitionsTaken };
|
|
240
|
+
if (vars !== undefined) data.effectiveVars = vars;
|
|
241
|
+
await this.persistence.commitTransition(this.runId, from, to, trigger, to, data, phase);
|
|
236
242
|
addSpanEvent('workflow.node.transition', {
|
|
237
243
|
runId: this.runId,
|
|
238
244
|
from,
|
|
@@ -247,8 +253,6 @@ export class RunLifecycle {
|
|
|
247
253
|
externalKey: this.externalKey,
|
|
248
254
|
});
|
|
249
255
|
}
|
|
250
|
-
|
|
251
|
-
/** Persist a transition and emit its observability event. */
|
|
252
256
|
async recordTransition(from: string, to: string, trigger: string | null): Promise<void> {
|
|
253
257
|
await this.persistence.saveTransition(this.runId, from, to, trigger);
|
|
254
258
|
addSpanEvent('workflow.node.transition', {
|
|
@@ -296,8 +300,17 @@ export class RunLifecycle {
|
|
|
296
300
|
return this.result('failed', finalState, transitionsTaken, reason);
|
|
297
301
|
}
|
|
298
302
|
|
|
299
|
-
/**
|
|
300
|
-
|
|
303
|
+
/**
|
|
304
|
+
* Finalize the run as paused and return its result. Writes a fresh state
|
|
305
|
+
* snapshot carrying the post-action `effectiveVars` BEFORE the phase/finalize
|
|
306
|
+
* writes so resume can restore them — onEnter setVars (e.g. `__hitlAnswer`)
|
|
307
|
+
* would otherwise be lost because the prior snapshot predates this state's
|
|
308
|
+
* action execution (R3 of 0366).
|
|
309
|
+
*/
|
|
310
|
+
async pause(stateOrNodeId: string, transitionsTaken: number, vars?: Vars): Promise<WorkflowRunResult> {
|
|
311
|
+
const data: Record<string, unknown> = { transitionsTaken };
|
|
312
|
+
if (vars !== undefined) data.effectiveVars = vars;
|
|
313
|
+
await this.persistence.saveWorkflowState(this.runId, stateOrNodeId, data);
|
|
301
314
|
await this.persistence.savePhase(this.runId, stateOrNodeId, 'paused');
|
|
302
315
|
await this.persistence.finalizeRun(this.runId, 'paused', new Date().toISOString());
|
|
303
316
|
this.logger.info('workflow run paused', { stateOrNodeId, transitionsTaken });
|
package/src/service.ts
CHANGED
|
@@ -10,13 +10,14 @@ import type {
|
|
|
10
10
|
StateMachineWorkflowDef,
|
|
11
11
|
TransitionDenied,
|
|
12
12
|
TransitionRequestResult,
|
|
13
|
+
Vars,
|
|
13
14
|
WorkflowDef,
|
|
14
15
|
WorkflowPersistenceAdapter,
|
|
15
16
|
WorkflowRunOptions,
|
|
16
17
|
WorkflowRunRecord,
|
|
17
18
|
WorkflowRunResult,
|
|
18
19
|
} from './types';
|
|
19
|
-
import { resolveTemplates } from './variables';
|
|
20
|
+
import { mergeVars, resolveTemplates } from './variables';
|
|
20
21
|
|
|
21
22
|
/** High-level workflow service for loading, running, and listing persisted workflow runs. */
|
|
22
23
|
export class WorkflowService {
|
|
@@ -158,16 +159,23 @@ export class WorkflowService {
|
|
|
158
159
|
if (run.status !== 'paused') {
|
|
159
160
|
throw new WorkflowResumeError(`Run "${runId}" is not paused (status: ${run.status})`);
|
|
160
161
|
}
|
|
161
|
-
|
|
162
162
|
const currentState = await this.persistence.loadCurrentState(runId);
|
|
163
163
|
if (currentState === undefined) {
|
|
164
164
|
throw new WorkflowResumeError(`Run "${runId}" has no persisted state to resume from`);
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
+
// Restore effectiveVars persisted in the last state snapshot so resume
|
|
168
|
+
// continues with the same runtime variables (e.g. `__hitlAnswer`). Caller
|
|
169
|
+
// overrides in `options.vars` win over the persisted snapshot (R3 of 0366).
|
|
170
|
+
const snapshot = await this.persistence.loadLatestStateSnapshot(runId);
|
|
171
|
+
const persistedVars = extractEffectiveVars(snapshot?.data);
|
|
172
|
+
const restoredVars = mergeVars(persistedVars, options?.vars);
|
|
173
|
+
const mergedOptions: WorkflowRunOptions = { ...options, vars: restoredVars };
|
|
174
|
+
|
|
167
175
|
// Re-open the run as running.
|
|
168
176
|
const extKey = run.external_key ?? undefined;
|
|
169
177
|
await this.persistence.finalizeRun(runId, 'running', '');
|
|
170
|
-
const events = this.resolveEvents(
|
|
178
|
+
const events = this.resolveEvents(mergedOptions.events);
|
|
171
179
|
void events?.emit('workflow.run.resumed', { runId, node: currentState, externalKey: extKey });
|
|
172
180
|
|
|
173
181
|
// Resume through the appropriate driver, starting from the paused state (skip on-enter).
|
|
@@ -175,12 +183,12 @@ export class WorkflowService {
|
|
|
175
183
|
return await new TransitionFlowDriver({
|
|
176
184
|
host: this.host,
|
|
177
185
|
persistence: this.persistence,
|
|
178
|
-
}).resume(workflow, runId, currentState, extKey,
|
|
186
|
+
}).resume(workflow, runId, currentState, extKey, mergedOptions);
|
|
179
187
|
}
|
|
180
188
|
return await new StateMachineDriver({
|
|
181
189
|
host: this.host,
|
|
182
190
|
persistence: this.persistence,
|
|
183
|
-
}).resume(workflow as StateMachineWorkflowDef, runId, currentState, extKey,
|
|
191
|
+
}).resume(workflow as StateMachineWorkflowDef, runId, currentState, extKey, mergedOptions);
|
|
184
192
|
}
|
|
185
193
|
|
|
186
194
|
/** List runs currently paused. Optional filters and ordering. */
|
|
@@ -324,3 +332,20 @@ export class WorkflowService {
|
|
|
324
332
|
return { allowed: false, ...denial };
|
|
325
333
|
}
|
|
326
334
|
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Read `effectiveVars` from a state snapshot's data payload. Tolerates older
|
|
338
|
+
* snapshots that lack the field (returns `{}`) and silently drops non-string
|
|
339
|
+
* values, matching `mergeSetVars`'s defensive contract.
|
|
340
|
+
*/
|
|
341
|
+
function extractEffectiveVars(data: Record<string, unknown> | undefined): Vars {
|
|
342
|
+
if (data === undefined) return {};
|
|
343
|
+
const raw = data.effectiveVars;
|
|
344
|
+
if (raw === undefined || raw === null) return {};
|
|
345
|
+
if (typeof raw !== 'object') return {};
|
|
346
|
+
const filtered: Vars = {};
|
|
347
|
+
for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {
|
|
348
|
+
if (typeof value === 'string') filtered[key] = value;
|
|
349
|
+
}
|
|
350
|
+
return filtered;
|
|
351
|
+
}
|
package/src/state-machine.ts
CHANGED
|
@@ -85,7 +85,7 @@ export class StateMachineDriver {
|
|
|
85
85
|
} else {
|
|
86
86
|
// 1. Persist current state snapshot before work starts (skipped when
|
|
87
87
|
// commitHop already persisted it atomically on the previous hop).
|
|
88
|
-
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop);
|
|
88
|
+
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop, vars);
|
|
89
89
|
|
|
90
90
|
// 2. Execute this state's on-enter actions in declaration order.
|
|
91
91
|
const enter = options.dryRun
|
|
@@ -119,7 +119,7 @@ export class StateMachineDriver {
|
|
|
119
119
|
|
|
120
120
|
// Pause: if the state declares pause, stop advancing and persist the paused position.
|
|
121
121
|
if (current.pause === true) {
|
|
122
|
-
return await lifecycle.pause(current.id, transitionsTaken);
|
|
122
|
+
return await lifecycle.pause(current.id, transitionsTaken, vars);
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -169,10 +169,17 @@ export class StateMachineDriver {
|
|
|
169
169
|
// single batch (ADR-020). The next iteration's `enter` becomes
|
|
170
170
|
// observe-only; a crash between writes is now impossible.
|
|
171
171
|
transitionsTaken += 1;
|
|
172
|
-
await lifecycle.commitHop(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
172
|
+
await lifecycle.commitHop(
|
|
173
|
+
current.id,
|
|
174
|
+
nextTransition.to,
|
|
175
|
+
nextTransition.trigger ?? null,
|
|
176
|
+
transitionsTaken,
|
|
177
|
+
{
|
|
178
|
+
phase: nextTransition.to,
|
|
179
|
+
status: 'running',
|
|
180
|
+
},
|
|
181
|
+
vars,
|
|
182
|
+
);
|
|
176
183
|
if (transitionsTaken > iterationBound) {
|
|
177
184
|
return await lifecycle.fail(current.id, transitionsTaken, 'iteration-bound-exceeded');
|
|
178
185
|
}
|
package/src/transition-flow.ts
CHANGED
|
@@ -85,7 +85,7 @@ export class TransitionFlowDriver {
|
|
|
85
85
|
} else {
|
|
86
86
|
// 1. Persist current node snapshot before action execution (skipped when
|
|
87
87
|
// commitHop already persisted it atomically on the previous hop).
|
|
88
|
-
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop);
|
|
88
|
+
await lifecycle.enter(current.id, transitionsTaken, !persistedViaHop, vars);
|
|
89
89
|
|
|
90
90
|
// 2. Execute the node action when one is configured (skipped in dry-run).
|
|
91
91
|
if (options.dryRun) {
|
|
@@ -118,7 +118,7 @@ export class TransitionFlowDriver {
|
|
|
118
118
|
|
|
119
119
|
// Pause: if the node declares pause, stop advancing and persist the paused position.
|
|
120
120
|
if (current.pause === true) {
|
|
121
|
-
return await lifecycle.pause(current.id, transitionsTaken);
|
|
121
|
+
return await lifecycle.pause(current.id, transitionsTaken, vars);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
|
|
@@ -148,10 +148,17 @@ export class TransitionFlowDriver {
|
|
|
148
148
|
// a single batch (ADR-020). The next iteration's `enter` becomes
|
|
149
149
|
// observe-only; a crash between writes is now impossible.
|
|
150
150
|
transitionsTaken += 1;
|
|
151
|
-
await lifecycle.commitHop(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
await lifecycle.commitHop(
|
|
152
|
+
current.id,
|
|
153
|
+
edge.to,
|
|
154
|
+
edge.condition?.kind ?? null,
|
|
155
|
+
transitionsTaken,
|
|
156
|
+
{
|
|
157
|
+
phase: edge.to,
|
|
158
|
+
status: 'running',
|
|
159
|
+
},
|
|
160
|
+
vars,
|
|
161
|
+
);
|
|
155
162
|
|
|
156
163
|
// 6. Enforce the iteration bound after taking the transition.
|
|
157
164
|
if (transitionsTaken > iterationBound) {
|
package/src/types.ts
CHANGED
|
@@ -114,6 +114,8 @@ export type WorkflowDef = StateMachineWorkflowDef | TransitionFlowWorkflowDef;
|
|
|
114
114
|
/** Action execution context passed to action runners. */
|
|
115
115
|
export interface ActionRunContext {
|
|
116
116
|
readonly runId: string;
|
|
117
|
+
/** Engine-owned persisted action identity for correlation and safe control targeting. */
|
|
118
|
+
readonly actionId?: string;
|
|
117
119
|
readonly workdir?: string;
|
|
118
120
|
readonly stateOrNodeId: string;
|
|
119
121
|
readonly vars: Vars;
|
|
@@ -299,6 +301,15 @@ export interface WorkflowPersistenceAdapter {
|
|
|
299
301
|
reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult>;
|
|
300
302
|
/** Load the current state name for a run (latest state snapshot). Returns undefined if no state recorded. */
|
|
301
303
|
loadCurrentState(runId: string): Promise<string | undefined>;
|
|
304
|
+
/**
|
|
305
|
+
* Load the latest state snapshot for a run — the full data payload (including
|
|
306
|
+
* `effectiveVars` when present), not just the state name. Used by resume to
|
|
307
|
+
* restore the post-action variable state that was active when the run paused.
|
|
308
|
+
* Old snapshots written before R1 of 0366 have no `effectiveVars` field;
|
|
309
|
+
* callers must tolerate `data.effectiveVars === undefined` and fall back to {}.
|
|
310
|
+
* Returns undefined if no state recorded.
|
|
311
|
+
*/
|
|
312
|
+
loadLatestStateSnapshot(runId: string): Promise<{ state: string; data: Record<string, unknown> } | undefined>;
|
|
302
313
|
/** List runs with status 'paused'. Optional filters: workflow name, limit. Ordered most-recent-first. */
|
|
303
314
|
listPausedRuns(options?: { workflowName?: string; limit?: number }): Promise<readonly WorkflowRunRecord[]>;
|
|
304
315
|
}
|