@gobing-ai/ts-dual-workflow-engine 0.4.28 → 0.4.30

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/dist/service.js CHANGED
@@ -104,6 +104,7 @@ export class WorkflowService {
104
104
  fromState: result.fromState ?? '',
105
105
  toState: result.toState,
106
106
  externalKey: extKey,
107
+ severity: 'warning',
107
108
  });
108
109
  }
109
110
  /** Resume a paused run, continuing execution from where it stopped. */
@@ -130,7 +131,12 @@ export class WorkflowService {
130
131
  const extKey = run.external_key ?? undefined;
131
132
  await this.persistence.finalizeRun(runId, 'running', '');
132
133
  const events = this.resolveEvents(mergedOptions.events);
133
- void events?.emit('workflow.run.resumed', { runId, node: currentState, externalKey: extKey });
134
+ void events?.emit('workflow.run.resumed', {
135
+ runId,
136
+ node: currentState,
137
+ externalKey: extKey,
138
+ severity: 'info',
139
+ });
134
140
  // Resume through the appropriate driver, starting from the paused state (skip on-enter).
135
141
  if (workflow.kind === 'transition-flow') {
136
142
  return await new TransitionFlowDriver({
@@ -234,6 +240,7 @@ export class WorkflowService {
234
240
  to: toState,
235
241
  trigger,
236
242
  externalKey: extKey,
243
+ severity: 'info',
237
244
  });
238
245
  return { allowed: true, fromState: currentState, toState };
239
246
  }
@@ -249,6 +256,7 @@ export class WorkflowService {
249
256
  to,
250
257
  reason: denial.reason,
251
258
  externalKey,
259
+ severity: 'error',
252
260
  });
253
261
  return { allowed: false, ...denial };
254
262
  }
package/dist/types.d.ts CHANGED
@@ -158,6 +158,13 @@ export interface WorkflowRunOptions {
158
158
  readonly events?: EventBus<WorkflowEngineEvents>;
159
159
  /** Run-level error policy override. Lowest precedence; action-level wins. */
160
160
  readonly onError?: OnErrorPolicy;
161
+ /**
162
+ * Optional result redaction hook applied before an action row is finalized.
163
+ * When omitted, the built-in default scrubs shell stdout/stderr so raw command
164
+ * output never lands in the audit table. Callers that need raw output in
165
+ * `action_runs.result_json` must supply their own redactor (task 0060 F4).
166
+ */
167
+ readonly redactor?: ActionRedactor;
161
168
  /** Validate the definition and walk the transition graph without executing actions. */
162
169
  readonly dryRun?: boolean;
163
170
  /** Optional caller-supplied external key, unique per workflow definition. */
@@ -252,8 +259,8 @@ export interface WorkflowPersistenceAdapter {
252
259
  * persistence implementations ignore it (mirror-only — no new column, no alter, no redaction).
253
260
  */
254
261
  saveActionStart(runId: string, node: string, kind: string, options?: Record<string, unknown>): Promise<string>;
255
- /** Finalize an action row with duration, ok, result. */
256
- saveActionFinalize(actionId: string, status: WorkflowStatus, durationMs: number, ok: boolean, result?: unknown, redactor?: ActionRedactor): Promise<void>;
262
+ /** Finalize an action row with duration, ok, result. `kind` names the action for the redactor. */
263
+ saveActionFinalize(actionId: string, status: WorkflowStatus, durationMs: number, ok: boolean, kind: string, result?: unknown, redactor?: ActionRedactor): Promise<void>;
257
264
  loadRun(runId: string): Promise<WorkflowRunRecord | undefined>;
258
265
  listRuns(): Promise<readonly WorkflowRunRecord[]>;
259
266
  /** Look up a run by its external key within a workflow definition. Returns undefined if not found. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAErD,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtE,8EAA8E;AAC9E,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1C,8DAA8D;AAC9D,MAAM,WAAW,GAAG;IAChB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,mEAAmE;AACnE,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,oGAAoG;IACpG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CACpC;AAED,8FAA8F;AAC9F,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED,6CAA6C;AAC7C,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;CAC7B;AAED,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,gGAAgG;IAChG,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;CAClD;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;CACjC;AAED,2CAA2C;AAC3C,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,gGAAgG;IAChG,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C;AAED,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG,uBAAuB,GAAG,yBAAyB,CAAC;AAE9E,yDAAyD;AACzD,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,iHAAiH;IACjH,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;CACpD;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,mGAAmG;IACnG,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;CAC3B;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/F;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,YAAY,CAAC;CAC5C;AAED,8FAA8F;AAC9F,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,GAAG,qBAAqB,CAAC,CAAC;CAC/G;AAED,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,uFAAuF;IACvF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAED,uEAAuE;AACvE,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AAE3E,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,mEAAmE;AACnE,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE3E,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,+FAA+F;AAC/F,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzG,oEAAoE;AACpE,MAAM,WAAW,0BAA0B;IACvC,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F;;;;;OAKG;IACH,gBAAgB,CACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAClD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/G,wDAAwD;IACxD,kBAAkB,CACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,OAAO,EACX,MAAM,CAAC,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAC/D,QAAQ,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAClD,sGAAsG;IACtG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAChG,oGAAoG;IACpG,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzE,qFAAqF;IACrF,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1E,6GAA6G;IAC7G,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7D;;;;;;;OAOG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC9G,yGAAyG;IACzG,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,CAAC;CAC9G"}
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.28",
3
+ "version": "0.4.30",
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.28",
52
- "@gobing-ai/ts-infra": "^0.4.28",
53
- "@gobing-ai/ts-runtime": "^0.4.28",
51
+ "@gobing-ai/ts-db": "^0.4.30",
52
+ "@gobing-ai/ts-infra": "^0.4.30",
53
+ "@gobing-ai/ts-runtime": "^0.4.30",
54
54
  "zod": "^4.1.0"
55
55
  },
56
56
  "devDependencies": {
@@ -1,4 +1,5 @@
1
1
  import type { WorkflowEngineHost } from './host';
2
+ import { defaultActionRedactor } from './persistence';
2
3
  import type { RunLifecycle } from './run-lifecycle';
3
4
  import { runtimeBuiltins, type WorkflowMode } from './run-lifecycle';
4
5
  import type { ActionDef, ActionResult, OnErrorPolicy, WorkflowPersistenceAdapter, WorkflowRunOptions } from './types';
@@ -91,7 +92,9 @@ export async function runActionStep(
91
92
  result?.ok !== false ? 'done' : 'failed',
92
93
  durationMs,
93
94
  result?.ok ?? false,
95
+ action.kind,
94
96
  result,
97
+ deps.options.redactor ?? defaultActionRedactor,
95
98
  )
96
99
  .catch(() => undefined);
97
100
  }
package/src/events.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { EventSeverity } from '@gobing-ai/ts-infra';
2
+
1
3
  /** Typed event map for workflow-engine run observability. All events prefixed `workflow.`. */
2
4
  export type WorkflowEngineEvents = {
3
5
  /** Emitted when a run begins (inside the span). */
@@ -7,6 +9,7 @@ export type WorkflowEngineEvents = {
7
9
  runId: string;
8
10
  dryRun: boolean;
9
11
  externalKey?: string;
12
+ severity: EventSeverity;
10
13
  }) => void;
11
14
  /** Emitted when a run completes successfully. */
12
15
  'workflow.run.done': (data: {
@@ -14,11 +17,23 @@ export type WorkflowEngineEvents = {
14
17
  finalState: string;
15
18
  transitionsTaken: number;
16
19
  externalKey?: string;
20
+ severity: EventSeverity;
17
21
  }) => void;
18
22
  /** Emitted when a run fails. */
19
- 'workflow.run.failed': (data: { runId: string; finalState: string; reason: string; externalKey?: string }) => void;
23
+ 'workflow.run.failed': (data: {
24
+ runId: string;
25
+ finalState: string;
26
+ reason: string;
27
+ externalKey?: string;
28
+ severity: EventSeverity;
29
+ }) => void;
20
30
  /** Emitted when entering a state or node. */
21
- 'workflow.node.enter': (data: { runId: string; node: string; transitionsTaken: number }) => void;
31
+ 'workflow.node.enter': (data: {
32
+ runId: string;
33
+ node: string;
34
+ transitionsTaken: number;
35
+ severity: EventSeverity;
36
+ }) => void;
22
37
  /** Emitted on a state/node transition. */
23
38
  'workflow.node.transition': (data: {
24
39
  runId: string;
@@ -26,9 +41,10 @@ export type WorkflowEngineEvents = {
26
41
  to: string;
27
42
  trigger: string | null;
28
43
  externalKey?: string;
44
+ severity: EventSeverity;
29
45
  }) => void;
30
46
  /** Emitted when an action starts executing. */
31
- 'workflow.action.start': (data: { runId: string; node: string; kind: string }) => void;
47
+ 'workflow.action.start': (data: { runId: string; node: string; kind: string; severity: EventSeverity }) => void;
32
48
  /** Emitted when an action finishes executing (success or failure). */
33
49
  'workflow.action.done': (data: {
34
50
  runId: string;
@@ -36,6 +52,7 @@ export type WorkflowEngineEvents = {
36
52
  kind: string;
37
53
  durationMs: number;
38
54
  ok: boolean;
55
+ severity: EventSeverity;
39
56
  }) => void;
40
57
  /** Emitted when a non-fatal action failure is continued past (onError: 'continue'). */
41
58
  'workflow.action.failed_continue': (data: {
@@ -43,11 +60,12 @@ export type WorkflowEngineEvents = {
43
60
  node: string;
44
61
  transitionsTaken: number;
45
62
  error?: string;
63
+ severity: EventSeverity;
46
64
  }) => void;
47
65
  /** Emitted by the builtin `event.emit` action for custom user-defined events. */
48
- 'workflow.custom': (data: { name: string; payload: Record<string, unknown> }) => void;
66
+ 'workflow.custom': (data: { name: string; payload: Record<string, unknown>; severity: EventSeverity }) => void;
49
67
  /** Emitted by the builtin `note` action for workflow-visible annotations. */
50
- 'workflow.hitl.note': (data: { runId: string; node: string; message: string }) => void;
68
+ 'workflow.hitl.note': (data: { runId: string; node: string; message: string; severity: EventSeverity }) => void;
51
69
  /** Emitted when a guard condition is evaluated. Fires for every guard, including rejected ones. */
52
70
  'workflow.guard.evaluated': (data: {
53
71
  runId: string;
@@ -56,17 +74,25 @@ export type WorkflowEngineEvents = {
56
74
  kind: string;
57
75
  passed: boolean;
58
76
  externalKey?: string;
77
+ severity: EventSeverity;
59
78
  }) => void;
60
79
  /** Emitted when an interactive HITL prompt is presented and the engine waits for input. */
61
- 'workflow.hitl.ask': (data: { runId: string; node: string; kind: string; message: string }) => void;
80
+ 'workflow.hitl.ask': (data: {
81
+ runId: string;
82
+ node: string;
83
+ kind: string;
84
+ message: string;
85
+ severity: EventSeverity;
86
+ }) => void;
62
87
  /** Emitted when an interactive HITL prompt receives a response. */
63
- 'workflow.hitl.response': (data: { runId: string; node: string; ok: boolean }) => void;
88
+ 'workflow.hitl.response': (data: { runId: string; node: string; ok: boolean; severity: EventSeverity }) => void;
64
89
  /** Emitted when a run's state is force-set via reseed (consumer-side authority reconciliation). */
65
90
  'workflow.run.reseeded': (data: {
66
91
  runId: string;
67
92
  fromState: string;
68
93
  toState: string;
69
94
  externalKey?: string;
95
+ severity: EventSeverity;
70
96
  }) => void;
71
97
  /** Emitted when an external transition request is allowed and committed. */
72
98
  'workflow.transition.requested': (data: {
@@ -75,6 +101,7 @@ export type WorkflowEngineEvents = {
75
101
  to: string;
76
102
  trigger: string | null;
77
103
  externalKey?: string;
104
+ severity: EventSeverity;
78
105
  }) => void;
79
106
  /** Emitted when an external transition request is denied. */
80
107
  'workflow.transition.denied': (data: {
@@ -83,6 +110,7 @@ export type WorkflowEngineEvents = {
83
110
  to: string;
84
111
  reason: string;
85
112
  externalKey?: string;
113
+ severity: EventSeverity;
86
114
  }) => void;
87
115
  /** Emitted when a run pauses at a declared pause point. */
88
116
  'workflow.run.paused': (data: {
@@ -90,7 +118,13 @@ export type WorkflowEngineEvents = {
90
118
  node: string;
91
119
  transitionsTaken: number;
92
120
  externalKey?: string;
121
+ severity: EventSeverity;
93
122
  }) => void;
94
123
  /** Emitted when a paused run is resumed. */
95
- 'workflow.run.resumed': (data: { runId: string; node: string; externalKey?: string }) => void;
124
+ 'workflow.run.resumed': (data: {
125
+ runId: string;
126
+ node: string;
127
+ externalKey?: string;
128
+ severity: EventSeverity;
129
+ }) => void;
96
130
  };
package/src/extensions.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import type { Logger } from '@gobing-ai/ts-infra';
2
- import { basenamePath, dirnamePath, SEP } from '@gobing-ai/ts-runtime';
3
2
  import type { ExtensionRef, LoadExtensionsOptions } from '@gobing-ai/ts-runtime/extension';
4
3
  import { loadExtensionModules } from '@gobing-ai/ts-runtime/extension';
5
4
  import { WorkflowValidationError } from './errors';
@@ -21,15 +20,17 @@ export type WorkflowExtensionKind = 'actions' | 'guards';
21
20
  /**
22
21
  * A single workflow extension module reference.
23
22
  *
24
- * The caller provides a pre-resolved absolute path; the loader adapts it to the
25
- * shared `ExtensionRef` format before delegating to the generic core so the
26
- * trust guard always governs the module that gets imported.
23
+ * The caller supplies the authored relative path plus the declaring directory; the
24
+ * shared loader resolves `(baseDir, path)` and applies its traversal + symlink
25
+ * guards to the authored string exactly as declared (task 0060 C2).
27
26
  */
28
27
  export interface WorkflowExtensionRef {
29
28
  /** Target capability registry. */
30
29
  readonly kind: WorkflowExtensionKind;
31
- /** Absolute path to the module to import. */
32
- readonly absPath: string;
30
+ /** Relative path as authored (e.g. `./exts/foo.ts`). */
31
+ readonly path: string;
32
+ /** Absolute directory the authored `path` is resolved against. */
33
+ readonly baseDir: string;
33
34
  /** Name of the config declaring this extension (for diagnostics). */
34
35
  readonly sourceName: string;
35
36
  }
@@ -79,28 +80,13 @@ export async function loadWorkflowExtensionsIntoHost(
79
80
  ): Promise<void> {
80
81
  if (refs.length === 0) return;
81
82
 
82
- // Enforce relative-path guard before adapting to the shared format.
83
- // The shared loader's assertRelativeExtensionPath applies to the derived
84
- // (basename) path, which is always clean this pre-check catches `..`
85
- // traversal in the caller-supplied absPath before basename strips it (R6).
86
- for (const ref of refs) {
87
- const segments = ref.absPath.split(SEP);
88
- if (segments.includes('..')) {
89
- throw new Error(
90
- `extension path "${ref.absPath}" declared by "${ref.sourceName}" must not contain ".." traversal`,
91
- );
92
- }
93
- }
94
-
95
- // Adapt WorkflowExtensionRef → shared ExtensionRef so the generic loader
96
- // governs every import. The shared loader resolves (baseDir, path) ->
97
- // absPath internally; we supply dirname/basename so the resolved path
98
- // reconstructs the caller's original absPath. assertRelativeExtensionPath
99
- // is satisfied because basenamePath() is always a simple filename.
83
+ // Map 1:1 onto the shared ref shape — no dirname/basename smash, so the shared
84
+ // loader's assertRelativeExtensionPath + realPath confinement govern the authored
85
+ // path exactly as declared (task 0060 C2).
100
86
  const sharedRefs: ExtensionRef<WorkflowExtensionKind>[] = refs.map((ref) => ({
101
87
  kind: ref.kind,
102
- path: `./${basenamePath(ref.absPath)}`,
103
- baseDir: dirnamePath(ref.absPath),
88
+ path: ref.path,
89
+ baseDir: ref.baseDir,
104
90
  sourceName: ref.sourceName,
105
91
  }));
106
92
 
package/src/host.ts CHANGED
@@ -123,6 +123,7 @@ export class NoteActionRunner implements ActionRunner {
123
123
  runId: context.runId,
124
124
  node: context.stateOrNodeId,
125
125
  message,
126
+ severity: 'info',
126
127
  });
127
128
  return { ok: true, data: { message } };
128
129
  }
@@ -136,7 +137,7 @@ export class EventEmitActionRunner implements ActionRunner {
136
137
  const name = String(options.name ?? '');
137
138
  if (!name) return { ok: false, error: 'event.emit requires a non-empty "name" option' };
138
139
  const payload = (options.payload as Record<string, unknown>) ?? {};
139
- void context?.events?.emit('workflow.custom', { name, payload });
140
+ void context?.events?.emit('workflow.custom', { name, payload, severity: 'info' });
140
141
  return { ok: true, data: { name, payload } };
141
142
  }
142
143
  }
@@ -17,6 +17,36 @@ export async function applyWorkflowEngineSchema(db: DbAdapter): Promise<void> {
17
17
  }
18
18
  }
19
19
 
20
+ /** Narrow to a non-array object record. */
21
+ function isRecord(value: unknown): value is Record<string, unknown> {
22
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
23
+ }
24
+
25
+ /**
26
+ * Default result redactor (task 0060 F4): shell action results keep `ok`/`exitCode`
27
+ * but drop raw `stdout`/`stderr`, which may carry secrets, from the persisted row.
28
+ * Non-shell results pass through unchanged.
29
+ */
30
+ export function defaultActionRedactor(kind: string, payload: Record<string, unknown>): Record<string, unknown> {
31
+ if (kind !== 'shell') return payload;
32
+ const data = isRecord(payload.data) ? { ...payload.data } : payload.data;
33
+ if (isRecord(data)) {
34
+ if ('stdout' in data) data.stdout = '[redacted]';
35
+ if ('stderr' in data) data.stderr = '[redacted]';
36
+ }
37
+ return { ...payload, data };
38
+ }
39
+
40
+ /** Apply the caller redactor, or the built-in default when none is supplied. */
41
+ export function applyRedactor(
42
+ redactor: ActionRedactor | undefined,
43
+ kind: string,
44
+ result: unknown,
45
+ ): Record<string, unknown> {
46
+ const payload = isRecord(result) ? result : { value: result };
47
+ return redactor !== undefined ? redactor(kind, payload) : defaultActionRedactor(kind, payload);
48
+ }
49
+
20
50
  /** SQLite/D1-compatible workflow persistence adapter backed by ts-db. */
21
51
  export class DbWorkflowPersistenceAdapter implements WorkflowPersistenceAdapter {
22
52
  /** Memoized schema-ensure; the DDL runs at most once per adapter instance. */
@@ -180,8 +210,9 @@ export class DbWorkflowPersistenceAdapter implements WorkflowPersistenceAdapter
180
210
  status: WorkflowStatus,
181
211
  durationMs: number,
182
212
  ok: boolean,
213
+ kind: string,
183
214
  result?: unknown,
184
- _redactor?: ActionRedactor,
215
+ redactor?: ActionRedactor,
185
216
  ): Promise<void> {
186
217
  const now = Date.now();
187
218
  await this.db.run(
@@ -191,7 +222,7 @@ export class DbWorkflowPersistenceAdapter implements WorkflowPersistenceAdapter
191
222
  status,
192
223
  durationMs,
193
224
  ok ? 1 : 0,
194
- result !== undefined ? JSON.stringify(result) : null,
225
+ result !== undefined ? JSON.stringify(applyRedactor(redactor, kind, result)) : null,
195
226
  new Date(now).toISOString(),
196
227
  now,
197
228
  actionId,
@@ -241,16 +272,18 @@ export class DbWorkflowPersistenceAdapter implements WorkflowPersistenceAdapter
241
272
  return { ...record };
242
273
  }
243
274
 
244
- /** Force-set the current state of a run (reseed). */
275
+ /** Force-set the current state of a run (reseed). Atomic: snapshot + `__reseed__` transition
276
+ * commit in one `db.batch`, and the previous snapshot's `effectiveVars` survive (task 0060 F6). */
245
277
  async reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult> {
246
- const now = Date.now();
247
278
  await this.ensureSchema();
248
- const previous = await this.db.queryFirst<{ state: string }>(
249
- 'SELECT state FROM workflow_states WHERE run_id = ? ORDER BY created_at DESC, rowid DESC LIMIT 1',
250
- runId,
251
- );
252
- await this.saveWorkflowState(runId, newState, { reseeded: true, reseededAt: new Date(now).toISOString() });
253
- await this.saveTransition(runId, previous?.state ?? '', newState, '__reseed__');
279
+ const previous = await this.loadLatestStateSnapshot(runId);
280
+ const now = Date.now();
281
+ const data = {
282
+ ...(previous?.data ?? {}),
283
+ reseeded: true,
284
+ reseededAt: new Date(now).toISOString(),
285
+ };
286
+ await this.commitTransition(runId, previous?.state ?? '', newState, '__reseed__', newState, data);
254
287
  return { fromState: previous?.state ?? null, toState: newState };
255
288
  }
256
289
 
@@ -357,15 +390,16 @@ export class MemoryWorkflowPersistenceAdapter implements WorkflowPersistenceAdap
357
390
  status: WorkflowStatus,
358
391
  durationMs: number,
359
392
  ok: boolean,
393
+ kind: string,
360
394
  result?: unknown,
361
- _redactor?: ActionRedactor,
395
+ redactor?: ActionRedactor,
362
396
  ): Promise<void> {
363
397
  const row = this.actionRuns.find((a) => a.id === actionId);
364
398
  if (row === undefined) return;
365
399
  row.status = status;
366
400
  row.durationMs = durationMs;
367
401
  row.ok = ok ? 1 : 0;
368
- row.resultJson = result !== undefined ? JSON.stringify(result) : null;
402
+ row.resultJson = result !== undefined ? JSON.stringify(applyRedactor(redactor, kind, result)) : null;
369
403
  }
370
404
 
371
405
  /** Save one phase/state execution record. */
@@ -430,9 +464,13 @@ export class MemoryWorkflowPersistenceAdapter implements WorkflowPersistenceAdap
430
464
 
431
465
  /** Force-set the current state of a run (reseed). */
432
466
  async reseedRun(runId: string, newState: string): Promise<WorkflowReseedResult> {
433
- const previous = this.states.findLast((state) => state.runId === runId);
434
- await this.saveWorkflowState(runId, newState, { reseeded: true, reseededAt: new Date().toISOString() });
435
- await this.saveTransition(runId, previous?.state ?? '', newState, '__reseed__');
467
+ const previous = await this.loadLatestStateSnapshot(runId);
468
+ const data = {
469
+ ...(previous?.data ?? {}),
470
+ reseeded: true,
471
+ reseededAt: new Date().toISOString(),
472
+ };
473
+ await this.commitTransition(runId, previous?.state ?? '', newState, '__reseed__', newState, data);
436
474
  return { fromState: previous?.state ?? null, toState: newState };
437
475
  }
438
476
 
@@ -165,6 +165,7 @@ export class RunLifecycle {
165
165
  runId: lifecycle.runId,
166
166
  dryRun: options.dryRun ?? false,
167
167
  externalKey: extKey,
168
+ severity: 'info',
168
169
  });
169
170
  return await loop(lifecycle);
170
171
  },
@@ -217,6 +218,7 @@ export class RunLifecycle {
217
218
  runId: this.runId,
218
219
  node: stateOrNodeId,
219
220
  transitionsTaken,
221
+ severity: 'info',
220
222
  });
221
223
  }
222
224
 
@@ -251,6 +253,7 @@ export class RunLifecycle {
251
253
  to,
252
254
  trigger,
253
255
  externalKey: this.externalKey,
256
+ severity: 'info',
254
257
  });
255
258
  }
256
259
  async recordTransition(from: string, to: string, trigger: string | null): Promise<void> {
@@ -267,6 +270,7 @@ export class RunLifecycle {
267
270
  to,
268
271
  trigger,
269
272
  externalKey: this.externalKey,
273
+ severity: 'info',
270
274
  });
271
275
  }
272
276
 
@@ -281,6 +285,7 @@ export class RunLifecycle {
281
285
  finalState,
282
286
  transitionsTaken,
283
287
  externalKey: this.externalKey,
288
+ severity: 'info',
284
289
  });
285
290
  return this.result('done', finalState, transitionsTaken);
286
291
  }
@@ -295,6 +300,7 @@ export class RunLifecycle {
295
300
  finalState,
296
301
  reason,
297
302
  externalKey: this.externalKey,
303
+ severity: 'error',
298
304
  });
299
305
  this.logger.warn('workflow run failed', { finalState, transitionsTaken, reason });
300
306
  return this.result('failed', finalState, transitionsTaken, reason);
@@ -320,6 +326,7 @@ export class RunLifecycle {
320
326
  node: stateOrNodeId,
321
327
  transitionsTaken,
322
328
  externalKey: this.externalKey,
329
+ severity: 'warning',
323
330
  });
324
331
  return this.result('paused', stateOrNodeId, transitionsTaken);
325
332
  }
@@ -327,13 +334,23 @@ export class RunLifecycle {
327
334
  /** Emit the resumed event (called by WorkflowService after re-creating a lifecycle for resume). */
328
335
  emitResumed(node: string): void {
329
336
  addSpanEvent('workflow.run.resumed', { runId: this.runId, node });
330
- void this.events?.emit('workflow.run.resumed', { runId: this.runId, node, externalKey: this.externalKey });
337
+ void this.events?.emit('workflow.run.resumed', {
338
+ runId: this.runId,
339
+ node,
340
+ externalKey: this.externalKey,
341
+ severity: 'info',
342
+ });
331
343
  }
332
344
 
333
345
  /** Emit action-level observability before a host action is invoked. */
334
346
  actionStart(stateOrNodeId: string, kind: string): void {
335
347
  addSpanEvent('workflow.action.start', { runId: this.runId, node: stateOrNodeId, kind });
336
- void this.events?.emit('workflow.action.start', { runId: this.runId, node: stateOrNodeId, kind });
348
+ void this.events?.emit('workflow.action.start', {
349
+ runId: this.runId,
350
+ node: stateOrNodeId,
351
+ kind,
352
+ severity: 'info',
353
+ });
337
354
  }
338
355
 
339
356
  /** Emit action-level observability after a host action settles. */
@@ -345,6 +362,7 @@ export class RunLifecycle {
345
362
  kind,
346
363
  durationMs,
347
364
  ok,
365
+ severity: ok ? 'info' : 'error',
348
366
  });
349
367
  }
350
368
 
@@ -361,6 +379,7 @@ export class RunLifecycle {
361
379
  node: stateOrNodeId,
362
380
  transitionsTaken,
363
381
  ...(error === undefined ? {} : { error }),
382
+ severity: 'warning',
364
383
  });
365
384
  this.logger.warn('action failed (continuing)', { node: stateOrNodeId, transitionsTaken, error });
366
385
  }
@@ -374,17 +393,23 @@ export class RunLifecycle {
374
393
  kind,
375
394
  passed,
376
395
  externalKey: this.externalKey,
396
+ severity: passed ? 'info' : 'warning',
377
397
  });
378
398
  }
379
399
 
380
400
  /** Emit when an interactive HITL prompt is presented. */
381
401
  hitlAsk(node: string, kind: string, message: string): void {
382
- void this.events?.emit('workflow.hitl.ask', { runId: this.runId, node, kind, message });
402
+ void this.events?.emit('workflow.hitl.ask', { runId: this.runId, node, kind, message, severity: 'info' });
383
403
  }
384
404
 
385
405
  /** Emit when an interactive HITL prompt resolves. */
386
406
  hitlResponse(node: string, ok: boolean): void {
387
- void this.events?.emit('workflow.hitl.response', { runId: this.runId, node, ok });
407
+ void this.events?.emit('workflow.hitl.response', {
408
+ runId: this.runId,
409
+ node,
410
+ ok,
411
+ severity: ok ? 'info' : 'warning',
412
+ });
388
413
  }
389
414
 
390
415
  private result(
package/src/service.ts CHANGED
@@ -147,6 +147,7 @@ export class WorkflowService {
147
147
  fromState: result.fromState ?? '',
148
148
  toState: result.toState,
149
149
  externalKey: extKey,
150
+ severity: 'warning',
150
151
  });
151
152
  }
152
153
 
@@ -176,7 +177,12 @@ export class WorkflowService {
176
177
  const extKey = run.external_key ?? undefined;
177
178
  await this.persistence.finalizeRun(runId, 'running', '');
178
179
  const events = this.resolveEvents(mergedOptions.events);
179
- void events?.emit('workflow.run.resumed', { runId, node: currentState, externalKey: extKey });
180
+ void events?.emit('workflow.run.resumed', {
181
+ runId,
182
+ node: currentState,
183
+ externalKey: extKey,
184
+ severity: 'info',
185
+ });
180
186
 
181
187
  // Resume through the appropriate driver, starting from the paused state (skip on-enter).
182
188
  if (workflow.kind === 'transition-flow') {
@@ -305,6 +311,7 @@ export class WorkflowService {
305
311
  to: toState,
306
312
  trigger,
307
313
  externalKey: extKey,
314
+ severity: 'info',
308
315
  });
309
316
  return { allowed: true, fromState: currentState, toState };
310
317
  }
@@ -328,6 +335,7 @@ export class WorkflowService {
328
335
  to,
329
336
  reason: denial.reason,
330
337
  externalKey,
338
+ severity: 'error',
331
339
  });
332
340
  return { allowed: false, ...denial };
333
341
  }