@zhivex-ai/core 1.5.0 → 1.7.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.md +39 -0
- package/dist/agent-handoff-contracts.d.ts +12 -0
- package/dist/agent-handoff-contracts.d.ts.map +1 -0
- package/dist/agent-handoff-contracts.js +18 -0
- package/dist/agent-handoff-contracts.js.map +1 -0
- package/dist/agent-handoff.d.ts +2 -11
- package/dist/agent-handoff.d.ts.map +1 -1
- package/dist/agent-handoff.js +1 -18
- package/dist/agent-handoff.js.map +1 -1
- package/dist/agent-trace.d.ts +1 -5
- package/dist/agent-trace.d.ts.map +1 -1
- package/dist/agent-trace.js.map +1 -1
- package/dist/agent.d.ts +1 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +358 -215
- package/dist/agent.js.map +1 -1
- package/dist/api-stability.d.ts.map +1 -1
- package/dist/api-stability.js +36 -25
- package/dist/api-stability.js.map +1 -1
- package/dist/artifact.d.ts +32 -9
- package/dist/artifact.d.ts.map +1 -1
- package/dist/artifact.js +428 -82
- package/dist/artifact.js.map +1 -1
- package/dist/catalog.d.ts +42 -3
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +269 -7
- package/dist/catalog.js.map +1 -1
- package/dist/contracts.d.ts +8 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +2 -0
- package/dist/contracts.js.map +1 -0
- package/dist/generate-text.d.ts.map +1 -1
- package/dist/generate-text.js +6 -3
- package/dist/generate-text.js.map +1 -1
- package/dist/google.d.ts +1 -60
- package/dist/google.d.ts.map +1 -1
- package/dist/google.js +0 -198
- package/dist/google.js.map +1 -1
- package/dist/index.d.ts +13 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/live-agent.js +1 -1
- package/dist/live-agent.js.map +1 -1
- package/dist/middleware.d.ts +16 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +476 -110
- package/dist/middleware.js.map +1 -1
- package/dist/model-capabilities.d.ts +66 -0
- package/dist/model-capabilities.d.ts.map +1 -0
- package/dist/model-capabilities.js +136 -0
- package/dist/model-capabilities.js.map +1 -0
- package/dist/node.d.ts +8 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +8 -0
- package/dist/node.js.map +1 -0
- package/dist/observability.d.ts +57 -10
- package/dist/observability.d.ts.map +1 -1
- package/dist/observability.js +535 -114
- package/dist/observability.js.map +1 -1
- package/dist/pricing.d.ts +7 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +2 -0
- package/dist/pricing.js.map +1 -0
- package/dist/provider-resources.d.ts +61 -0
- package/dist/provider-resources.d.ts.map +1 -0
- package/dist/provider-resources.js +199 -0
- package/dist/provider-resources.js.map +1 -0
- package/dist/runner.js +1 -1
- package/dist/runner.js.map +1 -1
- package/dist/runtime-entry.d.ts +15 -0
- package/dist/runtime-entry.d.ts.map +1 -0
- package/dist/runtime-entry.js +14 -0
- package/dist/runtime-entry.js.map +1 -0
- package/dist/runtime.d.ts +9 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +35 -8
- package/dist/runtime.js.map +1 -1
- package/dist/secure-id-node.d.ts +2 -0
- package/dist/secure-id-node.d.ts.map +1 -0
- package/dist/secure-id-node.js +3 -0
- package/dist/secure-id-node.js.map +1 -0
- package/dist/secure-id.d.ts.map +1 -1
- package/dist/secure-id.js +6 -2
- package/dist/secure-id.js.map +1 -1
- package/dist/testing.d.ts +4 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +74 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/ui-entry.d.ts +6 -0
- package/dist/ui-entry.d.ts.map +1 -0
- package/dist/ui-entry.js +5 -0
- package/dist/ui-entry.js.map +1 -0
- package/dist/ui.js +1 -1
- package/dist/ui.js.map +1 -1
- package/dist/workflow-observability.d.ts +13 -0
- package/dist/workflow-observability.d.ts.map +1 -0
- package/dist/workflow-observability.js +186 -0
- package/dist/workflow-observability.js.map +1 -0
- package/dist/workflow-state-contracts.d.ts +76 -0
- package/dist/workflow-state-contracts.d.ts.map +1 -0
- package/dist/workflow-state-contracts.js +49 -0
- package/dist/workflow-state-contracts.js.map +1 -0
- package/dist/workflow-state-service.d.ts +3 -34
- package/dist/workflow-state-service.d.ts.map +1 -1
- package/dist/workflow-state-service.js +2 -2
- package/dist/workflow-state-service.js.map +1 -1
- package/dist/workflow.d.ts +53 -42
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +258 -125
- package/dist/workflow.js.map +1 -1
- package/dist/workflows-entry.d.ts +9 -0
- package/dist/workflows-entry.d.ts.map +1 -0
- package/dist/workflows-entry.js +5 -0
- package/dist/workflows-entry.js.map +1 -0
- package/package.json +42 -1
- package/secure-id-internal.d.ts +1 -0
package/dist/workflow.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { AgentSession, Runner, SessionService } from "./runner.js";
|
|
2
|
-
import type { AgentApprovalRequest, AgentApprovalResponse,
|
|
3
|
-
import type
|
|
4
|
-
export
|
|
5
|
-
export type
|
|
6
|
-
export type WorkflowStepStatus = "pending" | "running" | "completed" | "waiting_approval" | "failed";
|
|
2
|
+
import type { AgentApprovalRequest, AgentApprovalResponse, JsonValue, LanguageModel } from "./types.js";
|
|
3
|
+
import { type WorkflowRunState, type WorkflowStateService, type WorkflowStatus, type WorkflowStepResult, type WorkflowStepStatus } from "./workflow-state-contracts.js";
|
|
4
|
+
export { migrateWorkflowRunState, normalizeWorkflowRunState, WORKFLOW_RUN_STATE_SCHEMA_VERSION } from "./workflow-state-contracts.js";
|
|
5
|
+
export type { PersistedWorkflowRunState, WorkflowRunState, WorkflowRunStateMigrationTarget, WorkflowStatus, WorkflowStepResult, WorkflowStepStatus } from "./workflow-state-contracts.js";
|
|
7
6
|
export interface WorkflowPromptContext {
|
|
8
7
|
workflowId?: string;
|
|
9
8
|
runId: string;
|
|
@@ -57,9 +56,12 @@ export interface WorkflowLoopStep<TModel extends LanguageModel = LanguageModel>
|
|
|
57
56
|
export type WorkflowStep<TModel extends LanguageModel = LanguageModel> = WorkflowTaskStep<TModel> | WorkflowParallelStep | WorkflowLoopStep<TModel>;
|
|
58
57
|
export interface WorkflowDefinition {
|
|
59
58
|
id?: string;
|
|
59
|
+
name?: string;
|
|
60
60
|
steps: WorkflowStep[];
|
|
61
61
|
metadata?: Record<string, JsonValue>;
|
|
62
62
|
persistence?: WorkflowPersistenceOptions;
|
|
63
|
+
/** Best-effort operational telemetry. Observer failures never fail workflow execution. */
|
|
64
|
+
onTelemetryEvent?: WorkflowTelemetryObserver;
|
|
63
65
|
}
|
|
64
66
|
export interface WorkflowPersistenceOptions {
|
|
65
67
|
appName: string;
|
|
@@ -71,6 +73,7 @@ export interface WorkflowPersistenceOptions {
|
|
|
71
73
|
export interface WorkflowRunInput {
|
|
72
74
|
userId: string;
|
|
73
75
|
sessionId?: string;
|
|
76
|
+
abortSignal?: AbortSignal;
|
|
74
77
|
input?: JsonValue;
|
|
75
78
|
state?: WorkflowRunState;
|
|
76
79
|
approvals?: AgentApprovalResponse[];
|
|
@@ -78,42 +81,9 @@ export interface WorkflowRunInput {
|
|
|
78
81
|
eventMetadata?: Record<string, JsonValue>;
|
|
79
82
|
metadata?: Record<string, JsonValue>;
|
|
80
83
|
resumeFromPersistedState?: boolean;
|
|
84
|
+
/** Overrides the definition observer for this invocation. Fail-open by contract. */
|
|
85
|
+
onTelemetryEvent?: WorkflowTelemetryObserver;
|
|
81
86
|
}
|
|
82
|
-
export interface WorkflowStepResult {
|
|
83
|
-
id: string;
|
|
84
|
-
kind?: "task" | "parallel" | "loop";
|
|
85
|
-
status: WorkflowStepStatus;
|
|
86
|
-
outputKey?: string;
|
|
87
|
-
outputText?: string;
|
|
88
|
-
runId?: string;
|
|
89
|
-
agentStatus?: AgentStatus;
|
|
90
|
-
approvals?: AgentApprovalRequest[];
|
|
91
|
-
children?: WorkflowStepResult[];
|
|
92
|
-
startedAt?: number;
|
|
93
|
-
finishedAt?: number;
|
|
94
|
-
error?: {
|
|
95
|
-
message: string;
|
|
96
|
-
};
|
|
97
|
-
metadata?: Record<string, JsonValue>;
|
|
98
|
-
}
|
|
99
|
-
export interface WorkflowRunState {
|
|
100
|
-
schemaVersion: typeof WORKFLOW_RUN_STATE_SCHEMA_VERSION;
|
|
101
|
-
workflowId?: string;
|
|
102
|
-
runId: string;
|
|
103
|
-
userId: string;
|
|
104
|
-
sessionId: string;
|
|
105
|
-
status: WorkflowStatus;
|
|
106
|
-
input?: JsonValue;
|
|
107
|
-
outputs: Record<string, JsonValue>;
|
|
108
|
-
steps: WorkflowStepResult[];
|
|
109
|
-
currentStepIndex: number;
|
|
110
|
-
session?: AgentSession;
|
|
111
|
-
metadata?: Record<string, JsonValue>;
|
|
112
|
-
createdAt: number;
|
|
113
|
-
updatedAt: number;
|
|
114
|
-
}
|
|
115
|
-
export type PersistedWorkflowRunState = Omit<WorkflowRunState, "session">;
|
|
116
|
-
export type WorkflowRunStateMigrationTarget = typeof WORKFLOW_RUN_STATE_SCHEMA_VERSION;
|
|
117
87
|
export interface WorkflowStateLookup {
|
|
118
88
|
userId: string;
|
|
119
89
|
sessionId: string;
|
|
@@ -125,6 +95,49 @@ export interface WorkflowRunOutput {
|
|
|
125
95
|
steps: WorkflowStepResult[];
|
|
126
96
|
session?: AgentSession;
|
|
127
97
|
}
|
|
98
|
+
export type WorkflowTelemetryTerminalStatus = "completed" | "waiting_approval" | "failed" | "cancelled";
|
|
99
|
+
export type WorkflowTelemetryStepKind = "task" | "parallel" | "loop";
|
|
100
|
+
export interface WorkflowTelemetryContext {
|
|
101
|
+
runId: string;
|
|
102
|
+
workflowId?: string;
|
|
103
|
+
workflowName?: string;
|
|
104
|
+
userId: string;
|
|
105
|
+
sessionId?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface WorkflowTelemetryStartEvent extends WorkflowTelemetryContext {
|
|
108
|
+
type: "workflow-start";
|
|
109
|
+
startedAt: number;
|
|
110
|
+
}
|
|
111
|
+
export interface WorkflowTelemetryStepStartEvent extends WorkflowTelemetryContext {
|
|
112
|
+
type: "workflow-step-start";
|
|
113
|
+
stepId: string;
|
|
114
|
+
stepIndex: number;
|
|
115
|
+
stepKind: WorkflowTelemetryStepKind;
|
|
116
|
+
startedAt: number;
|
|
117
|
+
}
|
|
118
|
+
export interface WorkflowTelemetryStepFinishEvent extends WorkflowTelemetryContext {
|
|
119
|
+
type: "workflow-step-finish";
|
|
120
|
+
stepId: string;
|
|
121
|
+
stepIndex: number;
|
|
122
|
+
stepKind: WorkflowTelemetryStepKind;
|
|
123
|
+
status: WorkflowTelemetryTerminalStatus;
|
|
124
|
+
startedAt: number;
|
|
125
|
+
finishedAt: number;
|
|
126
|
+
error?: Error;
|
|
127
|
+
}
|
|
128
|
+
export interface WorkflowTelemetryFinishEvent extends WorkflowTelemetryContext {
|
|
129
|
+
type: "workflow-finish";
|
|
130
|
+
status: WorkflowTelemetryTerminalStatus;
|
|
131
|
+
startedAt: number;
|
|
132
|
+
finishedAt: number;
|
|
133
|
+
error?: Error;
|
|
134
|
+
}
|
|
135
|
+
export type WorkflowTelemetryEvent = WorkflowTelemetryStartEvent | WorkflowTelemetryStepStartEvent | WorkflowTelemetryStepFinishEvent | WorkflowTelemetryFinishEvent;
|
|
136
|
+
export interface WorkflowTelemetryObserver {
|
|
137
|
+
(event: WorkflowTelemetryEvent): void | Promise<void>;
|
|
138
|
+
/** Runs a step while an observer-specific context is active. Implementations must invoke callback once. */
|
|
139
|
+
withStepContext?<T>(runId: string, stepIndex: number, callback: () => Promise<T>): Promise<T>;
|
|
140
|
+
}
|
|
128
141
|
export type WorkflowReplayTimelineEvent = {
|
|
129
142
|
type: "workflow-start";
|
|
130
143
|
runId: string;
|
|
@@ -196,8 +209,6 @@ export interface WorkflowReplayResult {
|
|
|
196
209
|
timeline: WorkflowReplayTimelineEvent[];
|
|
197
210
|
outputs: Record<string, JsonValue>;
|
|
198
211
|
}
|
|
199
|
-
export declare const normalizeWorkflowRunState: (value: unknown) => WorkflowRunState;
|
|
200
|
-
export declare const migrateWorkflowRunState: (value: unknown, targetVersion?: WorkflowRunStateMigrationTarget) => WorkflowRunState;
|
|
201
212
|
export declare const loadWorkflowState: (workflow: WorkflowDefinition, input: WorkflowStateLookup) => Promise<WorkflowRunState | undefined>;
|
|
202
213
|
export declare const saveWorkflowState: (workflow: WorkflowDefinition, state: WorkflowRunState) => Promise<AgentSession | undefined>;
|
|
203
214
|
export declare const createWorkflow: (definition: WorkflowDefinition) => WorkflowDefinition;
|
package/dist/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EAGN,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
|
package/dist/workflow.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createSecureId } from "
|
|
1
|
+
import { normalizeWorkflowRunState, WORKFLOW_RUN_STATE_SCHEMA_VERSION } from "./workflow-state-contracts.js";
|
|
2
|
+
import { createSecureId } from "#secure-id";
|
|
3
|
+
export { migrateWorkflowRunState, normalizeWorkflowRunState, WORKFLOW_RUN_STATE_SCHEMA_VERSION } from "./workflow-state-contracts.js";
|
|
3
4
|
const randomId = createSecureId;
|
|
4
5
|
const cloneJson = (value) => JSON.parse(JSON.stringify(value));
|
|
5
|
-
export const WORKFLOW_RUN_STATE_SCHEMA_VERSION = 1;
|
|
6
6
|
const toOutput = (state) => ({
|
|
7
7
|
status: state.status,
|
|
8
8
|
state: cloneJson(state),
|
|
@@ -28,50 +28,6 @@ const createBaseState = (workflow, input) => {
|
|
|
28
28
|
updatedAt: now
|
|
29
29
|
};
|
|
30
30
|
};
|
|
31
|
-
export const normalizeWorkflowRunState = (value) => {
|
|
32
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
33
|
-
throw new ValidationError("WorkflowRunState must be an object.");
|
|
34
|
-
}
|
|
35
|
-
const state = value;
|
|
36
|
-
if (state.schemaVersion !== undefined && state.schemaVersion > WORKFLOW_RUN_STATE_SCHEMA_VERSION) {
|
|
37
|
-
throw new ValidationError(`Unsupported WorkflowRunState schemaVersion ${state.schemaVersion}.`);
|
|
38
|
-
}
|
|
39
|
-
if (typeof state.runId !== "string" ||
|
|
40
|
-
typeof state.userId !== "string" ||
|
|
41
|
-
typeof state.sessionId !== "string" ||
|
|
42
|
-
typeof state.status !== "string" ||
|
|
43
|
-
!state.outputs ||
|
|
44
|
-
typeof state.outputs !== "object" ||
|
|
45
|
-
Array.isArray(state.outputs) ||
|
|
46
|
-
!Array.isArray(state.steps) ||
|
|
47
|
-
typeof state.currentStepIndex !== "number" ||
|
|
48
|
-
typeof state.createdAt !== "number" ||
|
|
49
|
-
typeof state.updatedAt !== "number") {
|
|
50
|
-
throw new ValidationError("WorkflowRunState is missing required fields.");
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
schemaVersion: WORKFLOW_RUN_STATE_SCHEMA_VERSION,
|
|
54
|
-
workflowId: state.workflowId,
|
|
55
|
-
runId: state.runId,
|
|
56
|
-
userId: state.userId,
|
|
57
|
-
sessionId: state.sessionId,
|
|
58
|
-
status: state.status,
|
|
59
|
-
input: state.input === undefined ? undefined : cloneJson(state.input),
|
|
60
|
-
outputs: cloneJson(state.outputs),
|
|
61
|
-
steps: cloneJson(state.steps),
|
|
62
|
-
currentStepIndex: state.currentStepIndex,
|
|
63
|
-
session: state.session ? cloneJson(state.session) : undefined,
|
|
64
|
-
metadata: state.metadata ? cloneJson(state.metadata) : undefined,
|
|
65
|
-
createdAt: state.createdAt,
|
|
66
|
-
updatedAt: state.updatedAt
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
export const migrateWorkflowRunState = (value, targetVersion = WORKFLOW_RUN_STATE_SCHEMA_VERSION) => {
|
|
70
|
-
if (targetVersion !== WORKFLOW_RUN_STATE_SCHEMA_VERSION) {
|
|
71
|
-
throw new ValidationError(`Unsupported WorkflowRunState migration target ${targetVersion}.`);
|
|
72
|
-
}
|
|
73
|
-
return normalizeWorkflowRunState(value);
|
|
74
|
-
};
|
|
75
31
|
const normalizeState = (state) => normalizeWorkflowRunState(state);
|
|
76
32
|
const workflowPersistenceKey = (workflow) => workflow.persistence?.workflowKey ?? workflow.id ?? "default";
|
|
77
33
|
const workflowMetadataKey = (workflow) => workflow.persistence?.metadataKey ?? "workflowRuns";
|
|
@@ -350,6 +306,7 @@ const runTaskStep = async (workflow, state, step, input, options) => {
|
|
|
350
306
|
userId: state.userId,
|
|
351
307
|
sessionId: state.sessionId,
|
|
352
308
|
approvals: input.approvals,
|
|
309
|
+
abortSignal: input.abortSignal,
|
|
353
310
|
sessionMetadata: input.sessionMetadata,
|
|
354
311
|
eventMetadata: input.eventMetadata
|
|
355
312
|
}
|
|
@@ -358,6 +315,7 @@ const runTaskStep = async (workflow, state, step, input, options) => {
|
|
|
358
315
|
sessionId: state.sessionId,
|
|
359
316
|
prompt: await resolveTaskPrompt(workflow, state, step, input),
|
|
360
317
|
system: step.system,
|
|
318
|
+
abortSignal: input.abortSignal,
|
|
361
319
|
sessionMetadata: input.sessionMetadata,
|
|
362
320
|
eventMetadata: {
|
|
363
321
|
...(input.eventMetadata ?? {}),
|
|
@@ -506,103 +464,278 @@ const runLoopStep = async (workflow, state, step, input, existingResult, started
|
|
|
506
464
|
session: state.session
|
|
507
465
|
};
|
|
508
466
|
};
|
|
467
|
+
const workflowTelemetryContext = (workflow, state) => ({
|
|
468
|
+
runId: state.runId,
|
|
469
|
+
workflowId: workflow.id,
|
|
470
|
+
workflowName: workflow.name,
|
|
471
|
+
userId: state.userId,
|
|
472
|
+
sessionId: state.sessionId
|
|
473
|
+
});
|
|
474
|
+
const preStartWorkflowTelemetryContext = (workflow, input) => ({
|
|
475
|
+
runId: input.state && typeof input.state.runId === "string" && input.state.runId
|
|
476
|
+
? input.state.runId
|
|
477
|
+
: randomId("wfr"),
|
|
478
|
+
workflowId: workflow.id,
|
|
479
|
+
workflowName: workflow.name,
|
|
480
|
+
userId: input.userId,
|
|
481
|
+
sessionId: input.state && typeof input.state.sessionId === "string" && input.state.sessionId
|
|
482
|
+
? input.state.sessionId
|
|
483
|
+
: input.sessionId
|
|
484
|
+
});
|
|
485
|
+
const emitWorkflowTelemetry = async (observer, event) => {
|
|
486
|
+
if (!observer) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
try {
|
|
490
|
+
await observer(event);
|
|
491
|
+
}
|
|
492
|
+
catch {
|
|
493
|
+
// Workflow telemetry is operational and fail-open by contract.
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
const runWithWorkflowStepContext = async (observer, runId, stepIndex, callback) => {
|
|
497
|
+
if (!observer?.withStepContext) {
|
|
498
|
+
return callback();
|
|
499
|
+
}
|
|
500
|
+
let execution;
|
|
501
|
+
const executeOnce = () => {
|
|
502
|
+
execution ??= callback();
|
|
503
|
+
return execution;
|
|
504
|
+
};
|
|
505
|
+
try {
|
|
506
|
+
await observer.withStepContext(runId, stepIndex, executeOnce);
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// Ignore context/exporter failures; the business callback result remains authoritative.
|
|
510
|
+
}
|
|
511
|
+
return execution ? await execution : callback();
|
|
512
|
+
};
|
|
513
|
+
const workflowStepKind = (step) => isParallelStep(step) ? "parallel" : isLoopStep(step) ? "loop" : "task";
|
|
514
|
+
const toWorkflowError = (error, fallback) => error instanceof Error ? error : new Error(error === undefined ? fallback : String(error));
|
|
515
|
+
const isCancellationError = (error) => error instanceof Error && (error.name === "AbortError" || error.name === "CancellationError");
|
|
516
|
+
const hasCancelledAgentResult = (result) => result.agentStatus === "cancelled" || (result.children?.some(hasCancelledAgentResult) ?? false);
|
|
517
|
+
const workflowStepTelemetryStatus = (result, input, error) => {
|
|
518
|
+
if (hasCancelledAgentResult(result) ||
|
|
519
|
+
isCancellationError(error) ||
|
|
520
|
+
(result.status === "failed" && input.abortSignal?.aborted)) {
|
|
521
|
+
return "cancelled";
|
|
522
|
+
}
|
|
523
|
+
if (result.status === "completed" || result.status === "waiting_approval" || result.status === "failed") {
|
|
524
|
+
return result.status;
|
|
525
|
+
}
|
|
526
|
+
return "failed";
|
|
527
|
+
};
|
|
528
|
+
const workflowStepTelemetryError = (result, status, input, error) => {
|
|
529
|
+
if (status === "cancelled") {
|
|
530
|
+
const cancellation = toWorkflowError(error ?? input.abortSignal?.reason, "Workflow execution was cancelled.");
|
|
531
|
+
cancellation.name = "AbortError";
|
|
532
|
+
return cancellation;
|
|
533
|
+
}
|
|
534
|
+
if (status === "failed") {
|
|
535
|
+
return toWorkflowError(error ?? result.error?.message, "Workflow step failed.");
|
|
536
|
+
}
|
|
537
|
+
return undefined;
|
|
538
|
+
};
|
|
509
539
|
export const runWorkflow = async (workflow, input) => {
|
|
510
|
-
const
|
|
511
|
-
const
|
|
540
|
+
const invocationStartedAt = Date.now();
|
|
541
|
+
const observer = input.onTelemetryEvent ?? workflow.onTelemetryEvent;
|
|
542
|
+
let definition;
|
|
543
|
+
let state;
|
|
544
|
+
try {
|
|
545
|
+
definition = validateWorkflow(workflow);
|
|
546
|
+
state = await resolveInitialState(definition, input);
|
|
547
|
+
}
|
|
548
|
+
catch (error) {
|
|
549
|
+
const telemetryContext = preStartWorkflowTelemetryContext(workflow, input);
|
|
550
|
+
const telemetryError = toWorkflowError(error, "Workflow initialization failed.");
|
|
551
|
+
await emitWorkflowTelemetry(observer, {
|
|
552
|
+
...telemetryContext,
|
|
553
|
+
type: "workflow-start",
|
|
554
|
+
startedAt: invocationStartedAt
|
|
555
|
+
});
|
|
556
|
+
await emitWorkflowTelemetry(observer, {
|
|
557
|
+
...telemetryContext,
|
|
558
|
+
type: "workflow-finish",
|
|
559
|
+
status: "failed",
|
|
560
|
+
startedAt: invocationStartedAt,
|
|
561
|
+
finishedAt: Date.now(),
|
|
562
|
+
error: telemetryError
|
|
563
|
+
});
|
|
564
|
+
throw error;
|
|
565
|
+
}
|
|
512
566
|
state.status = "running";
|
|
513
567
|
state.updatedAt = Date.now();
|
|
514
|
-
const
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
}
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
568
|
+
const telemetryContext = workflowTelemetryContext(definition, state);
|
|
569
|
+
let terminalEventEmitted = false;
|
|
570
|
+
await emitWorkflowTelemetry(observer, {
|
|
571
|
+
...telemetryContext,
|
|
572
|
+
type: "workflow-start",
|
|
573
|
+
startedAt: invocationStartedAt
|
|
574
|
+
});
|
|
575
|
+
const emitWorkflowFinish = async (status, error) => {
|
|
576
|
+
if (terminalEventEmitted) {
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
terminalEventEmitted = true;
|
|
580
|
+
await emitWorkflowTelemetry(observer, {
|
|
581
|
+
...telemetryContext,
|
|
582
|
+
type: "workflow-finish",
|
|
583
|
+
status,
|
|
584
|
+
startedAt: invocationStartedAt,
|
|
585
|
+
finishedAt: Date.now(),
|
|
586
|
+
error
|
|
587
|
+
});
|
|
588
|
+
};
|
|
589
|
+
const finalizeInvocation = async (status, error) => {
|
|
590
|
+
const output = await finalizeWorkflowOutput(definition, state);
|
|
591
|
+
await emitWorkflowFinish(status, error);
|
|
592
|
+
return output;
|
|
593
|
+
};
|
|
594
|
+
try {
|
|
595
|
+
const waitingIndex = state.steps.findIndex((step) => step.status === "waiting_approval");
|
|
596
|
+
if (waitingIndex >= 0 && !input.approvals?.length) {
|
|
597
|
+
state.status = "waiting_approval";
|
|
598
|
+
state.currentStepIndex = waitingIndex;
|
|
599
|
+
state.updatedAt = Date.now();
|
|
600
|
+
return await finalizeInvocation("waiting_approval");
|
|
601
|
+
}
|
|
602
|
+
const startIndex = waitingIndex >= 0 ? waitingIndex : state.currentStepIndex;
|
|
603
|
+
for (let index = startIndex; index < definition.steps.length; index += 1) {
|
|
604
|
+
const step = definition.steps[index];
|
|
605
|
+
const stepKind = workflowStepKind(step);
|
|
606
|
+
const startedAt = Date.now();
|
|
607
|
+
state.currentStepIndex = index;
|
|
608
|
+
const existingResult = state.steps[index];
|
|
609
|
+
setStepResult(state, index, isParallelStep(step)
|
|
537
610
|
? {
|
|
538
611
|
id: step.id,
|
|
539
|
-
kind: "
|
|
612
|
+
kind: "parallel",
|
|
540
613
|
status: "running",
|
|
541
614
|
children: existingResult?.children,
|
|
542
615
|
metadata: step.metadata ? cloneJson(step.metadata) : undefined,
|
|
543
616
|
startedAt
|
|
544
617
|
}
|
|
545
|
-
: {
|
|
546
|
-
id: step.id,
|
|
547
|
-
kind: "task",
|
|
548
|
-
status: "running",
|
|
549
|
-
outputKey: step.outputKey,
|
|
550
|
-
metadata: step.metadata ? cloneJson(step.metadata) : undefined,
|
|
551
|
-
startedAt
|
|
552
|
-
});
|
|
553
|
-
try {
|
|
554
|
-
const stepRun = isParallelStep(step)
|
|
555
|
-
? await runParallelStep(definition, state, step, input, existingResult, startedAt)
|
|
556
618
|
: isLoopStep(step)
|
|
557
|
-
?
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
619
|
+
? {
|
|
620
|
+
id: step.id,
|
|
621
|
+
kind: "loop",
|
|
622
|
+
status: "running",
|
|
623
|
+
children: existingResult?.children,
|
|
624
|
+
metadata: step.metadata ? cloneJson(step.metadata) : undefined,
|
|
625
|
+
startedAt
|
|
626
|
+
}
|
|
627
|
+
: {
|
|
628
|
+
id: step.id,
|
|
629
|
+
kind: "task",
|
|
630
|
+
status: "running",
|
|
631
|
+
outputKey: step.outputKey,
|
|
632
|
+
metadata: step.metadata ? cloneJson(step.metadata) : undefined,
|
|
633
|
+
startedAt
|
|
561
634
|
});
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
635
|
+
await emitWorkflowTelemetry(observer, {
|
|
636
|
+
...telemetryContext,
|
|
637
|
+
type: "workflow-step-start",
|
|
638
|
+
stepId: step.id,
|
|
639
|
+
stepIndex: index,
|
|
640
|
+
stepKind,
|
|
641
|
+
startedAt
|
|
642
|
+
});
|
|
643
|
+
let stepTerminalEventEmitted = false;
|
|
644
|
+
try {
|
|
645
|
+
const stepRun = await runWithWorkflowStepContext(observer, state.runId, index, () => isParallelStep(step)
|
|
646
|
+
? runParallelStep(definition, state, step, input, existingResult, startedAt)
|
|
647
|
+
: isLoopStep(step)
|
|
648
|
+
? runLoopStep(definition, state, step, input, existingResult, startedAt)
|
|
649
|
+
: runTaskStep(definition, state, step, input, {
|
|
650
|
+
startedAt,
|
|
651
|
+
isApprovalResume: index === waitingIndex && Boolean(input.approvals?.length)
|
|
652
|
+
}));
|
|
653
|
+
const { result } = stepRun;
|
|
654
|
+
const output = stepRun.output;
|
|
655
|
+
const session = stepRun.session;
|
|
656
|
+
if (output?.session) {
|
|
657
|
+
state.session = output.session;
|
|
576
658
|
}
|
|
577
|
-
|
|
659
|
+
else if (session) {
|
|
660
|
+
state.session = session;
|
|
661
|
+
}
|
|
662
|
+
const status = result.status;
|
|
663
|
+
setStepResult(state, index, result);
|
|
664
|
+
const telemetryStatus = workflowStepTelemetryStatus(result, input);
|
|
665
|
+
const telemetryError = workflowStepTelemetryError(result, telemetryStatus, input);
|
|
666
|
+
await emitWorkflowTelemetry(observer, {
|
|
667
|
+
...telemetryContext,
|
|
668
|
+
type: "workflow-step-finish",
|
|
669
|
+
stepId: step.id,
|
|
670
|
+
stepIndex: index,
|
|
671
|
+
stepKind,
|
|
672
|
+
status: telemetryStatus,
|
|
673
|
+
startedAt,
|
|
674
|
+
finishedAt: result.finishedAt ?? Date.now(),
|
|
675
|
+
error: telemetryError
|
|
676
|
+
});
|
|
677
|
+
stepTerminalEventEmitted = true;
|
|
678
|
+
if (status === "completed") {
|
|
679
|
+
if (!isParallelStep(step) && !isLoopStep(step)) {
|
|
680
|
+
collectStepOutputs(state.outputs, step, result, output);
|
|
681
|
+
}
|
|
682
|
+
state.currentStepIndex = index + 1;
|
|
683
|
+
state.updatedAt = Date.now();
|
|
684
|
+
continue;
|
|
685
|
+
}
|
|
686
|
+
state.status = status === "waiting_approval" ? "waiting_approval" : "failed";
|
|
687
|
+
state.currentStepIndex = index;
|
|
578
688
|
state.updatedAt = Date.now();
|
|
579
|
-
|
|
689
|
+
return await finalizeInvocation(telemetryStatus, telemetryError);
|
|
580
690
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
setStepResult(state, index, isParallelStep(step)
|
|
588
|
-
? createParallelResult(step, "failed", startedAt, existingResult?.children ?? [], {
|
|
589
|
-
message: error instanceof Error ? error.message : String(error)
|
|
590
|
-
})
|
|
591
|
-
: isLoopStep(step)
|
|
592
|
-
? createLoopResult(step, "failed", startedAt, existingResult?.children ?? [], {
|
|
691
|
+
catch (error) {
|
|
692
|
+
if (stepTerminalEventEmitted) {
|
|
693
|
+
throw error;
|
|
694
|
+
}
|
|
695
|
+
const result = isParallelStep(step)
|
|
696
|
+
? createParallelResult(step, "failed", startedAt, existingResult?.children ?? [], {
|
|
593
697
|
message: error instanceof Error ? error.message : String(error)
|
|
594
698
|
})
|
|
595
|
-
:
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
699
|
+
: isLoopStep(step)
|
|
700
|
+
? createLoopResult(step, "failed", startedAt, existingResult?.children ?? [], {
|
|
701
|
+
message: error instanceof Error ? error.message : String(error)
|
|
702
|
+
})
|
|
703
|
+
: createStepResult(step, "failed", startedAt, undefined, error);
|
|
704
|
+
setStepResult(state, index, result);
|
|
705
|
+
const telemetryStatus = workflowStepTelemetryStatus(result, input, error);
|
|
706
|
+
const telemetryError = workflowStepTelemetryError(result, telemetryStatus, input, error);
|
|
707
|
+
await emitWorkflowTelemetry(observer, {
|
|
708
|
+
...telemetryContext,
|
|
709
|
+
type: "workflow-step-finish",
|
|
710
|
+
stepId: step.id,
|
|
711
|
+
stepIndex: index,
|
|
712
|
+
stepKind,
|
|
713
|
+
status: telemetryStatus,
|
|
714
|
+
startedAt,
|
|
715
|
+
finishedAt: result.finishedAt ?? Date.now(),
|
|
716
|
+
error: telemetryError
|
|
717
|
+
});
|
|
718
|
+
stepTerminalEventEmitted = true;
|
|
719
|
+
state.status = "failed";
|
|
720
|
+
state.currentStepIndex = index;
|
|
721
|
+
state.updatedAt = Date.now();
|
|
722
|
+
return await finalizeInvocation(telemetryStatus, telemetryError);
|
|
723
|
+
}
|
|
600
724
|
}
|
|
725
|
+
state.status = "completed";
|
|
726
|
+
state.currentStepIndex = definition.steps.length;
|
|
727
|
+
state.updatedAt = Date.now();
|
|
728
|
+
return await finalizeInvocation("completed");
|
|
729
|
+
}
|
|
730
|
+
catch (error) {
|
|
731
|
+
const terminalStatus = isCancellationError(error) || input.abortSignal?.aborted ? "cancelled" : "failed";
|
|
732
|
+
const terminalError = toWorkflowError(error ?? input.abortSignal?.reason, terminalStatus === "cancelled" ? "Workflow execution was cancelled." : "Workflow execution failed.");
|
|
733
|
+
if (terminalStatus === "cancelled") {
|
|
734
|
+
terminalError.name = "AbortError";
|
|
735
|
+
}
|
|
736
|
+
await emitWorkflowFinish(terminalStatus, terminalError);
|
|
737
|
+
throw error;
|
|
601
738
|
}
|
|
602
|
-
state.status = "completed";
|
|
603
|
-
state.currentStepIndex = definition.steps.length;
|
|
604
|
-
state.updatedAt = Date.now();
|
|
605
|
-
return finalizeWorkflowOutput(definition, state);
|
|
606
739
|
};
|
|
607
740
|
export const replayWorkflowRun = (state) => {
|
|
608
741
|
const timeline = [
|