@osolmaz/pi-workflows 0.12.1 → 0.13.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 +52 -28
- package/dist/builtins/autodoc.workflow.d.ts +4 -4
- package/dist/builtins/autoimplement.workflow.d.ts +369 -73
- package/dist/builtins/autoplan.workflow.d.ts +126 -13
- package/dist/builtins/autoplan.workflow.js +200 -29
- package/dist/builtins/autoplan.workflow.js.map +1 -1
- package/dist/builtins/catalog.js +6 -4
- package/dist/builtins/catalog.js.map +1 -1
- package/dist/builtins/index.d.ts +2 -1
- package/dist/builtins/index.js +1 -0
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/monitor.workflow.d.ts +56 -21
- package/dist/builtins/monitor.workflow.js +497 -216
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/builtins/plain-summary.workflow.d.ts +32 -0
- package/dist/builtins/plain-summary.workflow.js +134 -0
- package/dist/builtins/plain-summary.workflow.js.map +1 -0
- package/dist/builtins/plan-change.workflow.d.ts +170 -22
- package/dist/builtins/sanity-check.workflow.d.ts +45 -3
- package/dist/builtins/sanity-check.workflow.js +45 -7
- package/dist/builtins/sanity-check.workflow.js.map +1 -1
- package/dist/controllers/effects.d.ts +3 -2
- package/dist/controllers/effects.js +8 -1
- package/dist/controllers/effects.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -1
- package/dist/controllers/index.js +1 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/manager.d.ts +1 -0
- package/dist/controllers/manager.js +41 -17
- package/dist/controllers/manager.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +107 -85
- package/dist/controllers/sqlite.js +1611 -1486
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/controllers/store.d.ts +9 -8
- package/dist/controllers/store.js +1 -31
- package/dist/controllers/store.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -0
- package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
- package/dist/controllers/workflow-engine-scheduler.js +3 -5
- package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
- package/dist/controllers/workflows.d.ts +2 -2
- package/dist/controllers/workflows.js +11 -10
- package/dist/controllers/workflows.js.map +1 -1
- package/dist/extension/controller-host.js +2 -2
- package/dist/extension/controller-host.js.map +1 -1
- package/dist/extension/decision-channels.d.ts +2 -0
- package/dist/extension/decision-channels.js +311 -118
- package/dist/extension/decision-channels.js.map +1 -1
- package/dist/extension/executor.d.ts +9 -2
- package/dist/extension/executor.js +89 -2
- package/dist/extension/executor.js.map +1 -1
- package/dist/extension/herdr-viewer.d.ts +0 -1
- package/dist/extension/herdr-viewer.js +0 -4
- package/dist/extension/herdr-viewer.js.map +1 -1
- package/dist/extension/index.js +156 -103
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +3 -10
- package/dist/extension/recorder.js +13 -22
- package/dist/extension/recorder.js.map +1 -1
- package/dist/extension/step-message.d.ts +7 -2
- package/dist/extension/step-message.js +94 -2
- package/dist/extension/step-message.js.map +1 -1
- package/dist/extension/widget.js +6 -0
- package/dist/extension/widget.js.map +1 -1
- package/dist/host/rpc-executor.d.ts +3 -0
- package/dist/host/rpc-executor.js +2 -0
- package/dist/host/rpc-executor.js.map +1 -1
- package/dist/host/runner.d.ts +3 -6
- package/dist/host/runner.js +83 -32
- package/dist/host/runner.js.map +1 -1
- package/dist/render/graph-render.js +14 -8
- package/dist/render/graph-render.js.map +1 -1
- package/dist/state/database.d.ts +35 -0
- package/dist/state/database.js +287 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/index.d.ts +4 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/json.d.ts +6 -0
- package/dist/state/json.js +38 -0
- package/dist/state/json.js.map +1 -0
- package/dist/state/mutation.d.ts +57 -0
- package/dist/state/mutation.js +255 -0
- package/dist/state/mutation.js.map +1 -0
- package/dist/state/schema.d.ts +6 -0
- package/dist/state/schema.js +473 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/viewer/cli.d.ts +2 -2
- package/dist/viewer/cli.js +142 -122
- package/dist/viewer/cli.js.map +1 -1
- package/dist/viewer/render.d.ts +4 -4
- package/dist/viewer/render.js +2 -17
- package/dist/viewer/render.js.map +1 -1
- package/dist/viewer/session-reducer.d.ts +1 -1
- package/dist/viewer/session-reducer.js +1 -1
- package/dist/viewer/tui.d.ts +3 -3
- package/dist/viewer/tui.js +15 -13
- package/dist/viewer/tui.js.map +1 -1
- package/dist/viewer/watch.d.ts +2 -5
- package/dist/viewer/watch.js +13 -13
- package/dist/viewer/watch.js.map +1 -1
- package/dist/workflows/composition.js +12 -2
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.d.ts +6 -2
- package/dist/workflows/definition.js +17 -0
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.d.ts +6 -6
- package/dist/workflows/engine.js +183 -103
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/errors.d.ts +3 -3
- package/dist/workflows/errors.js +3 -3
- package/dist/workflows/human-decision.d.ts +29 -4
- package/dist/workflows/human-decision.js +547 -283
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +4 -5
- package/dist/workflows/index.js +3 -4
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/schema.js +17 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.d.ts +83 -103
- package/dist/workflows/store.js +902 -951
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +55 -81
- package/docs/CONTROLLERS.md +10 -8
- package/docs/DEFERRED_TURNS.md +2 -2
- package/docs/DESIGN_PHILOSOPHY.md +4 -2
- package/docs/HUMAN_DECISIONS.md +13 -14
- package/docs/MONITOR.md +179 -231
- package/docs/SQLITE_STATE.md +219 -0
- package/docs/WORKFLOW_COMPOSITION.md +19 -19
- package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
- package/docs/WORKFLOW_UPDATES.md +10 -9
- package/docs/development.md +9 -9
- package/docs/live-replay-protocol.md +28 -37
- package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
- package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
- package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +1 -1
- package/docs/plans/2026-08-21-sanity-check-plan.md +30 -16
- package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
- package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
- package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
- package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
- package/docs/plans/session-event-replay-implementation-plan.md +1 -1
- package/docs/plans/tui-viewer-implementation-plan.md +1 -1
- package/docs/session-event-journal.md +63 -434
- package/docs/tui-viewer.md +13 -15
- package/docs/workflows.md +104 -50
- package/examples/workflows/plain-summary.workflow.ts +1 -0
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/plugins/herdr/viewer.mjs +1 -11
- package/skills/autoplan/SKILL.md +5 -4
- package/skills/monitor/SKILL.md +91 -163
- package/skills/pi-workflows/SKILL.md +7 -7
- package/skills/sanity-check/SKILL.md +1 -1
- package/src/builtins/autoplan.workflow.ts +290 -40
- package/src/builtins/catalog.ts +6 -4
- package/src/builtins/index.ts +7 -1
- package/src/builtins/monitor.workflow.ts +663 -249
- package/src/builtins/plain-summary.workflow.ts +185 -0
- package/src/builtins/sanity-check.workflow.ts +62 -7
- package/src/controllers/effects.ts +7 -0
- package/src/controllers/index.ts +0 -6
- package/src/controllers/manager.ts +72 -32
- package/src/controllers/sqlite.ts +2420 -1948
- package/src/controllers/store.ts +17 -38
- package/src/controllers/types.ts +3 -0
- package/src/controllers/workflow-engine-scheduler.ts +4 -8
- package/src/controllers/workflows.ts +45 -21
- package/src/extension/controller-host.ts +1 -2
- package/src/extension/decision-channels.ts +427 -144
- package/src/extension/executor.ts +105 -2
- package/src/extension/herdr-viewer.ts +0 -5
- package/src/extension/index.ts +180 -118
- package/src/extension/recorder.ts +13 -22
- package/src/extension/step-message.ts +106 -4
- package/src/extension/widget.ts +8 -0
- package/src/host/rpc-executor.ts +4 -0
- package/src/host/runner.ts +93 -41
- package/src/render/graph-render.ts +11 -4
- package/src/state/database.ts +375 -0
- package/src/state/index.ts +29 -0
- package/src/state/json.ts +42 -0
- package/src/state/mutation.ts +435 -0
- package/src/state/schema.ts +475 -0
- package/src/viewer/cli.ts +151 -144
- package/src/viewer/render.ts +12 -24
- package/src/viewer/session-reducer.ts +1 -1
- package/src/viewer/tui.ts +18 -17
- package/src/viewer/watch.ts +13 -17
- package/src/workflows/composition.ts +12 -3
- package/src/workflows/definition.ts +36 -3
- package/src/workflows/engine.ts +212 -116
- package/src/workflows/errors.ts +3 -3
- package/src/workflows/human-decision.ts +795 -340
- package/src/workflows/index.ts +15 -19
- package/src/workflows/schema.ts +19 -1
- package/src/workflows/store.ts +1295 -1163
- package/src/workflows/types.ts +61 -81
- package/dist/workflows/artifacts.d.ts +0 -40
- package/dist/workflows/artifacts.js +0 -155
- package/dist/workflows/artifacts.js.map +0 -1
- package/dist/workflows/migrate-sources.d.ts +0 -42
- package/dist/workflows/migrate-sources.js +0 -133
- package/dist/workflows/migrate-sources.js.map +0 -1
- package/docs/run-bundles.md +0 -481
- package/src/workflows/artifacts.ts +0 -188
- package/src/workflows/migrate-sources.ts +0 -178
package/src/controllers/store.ts
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
1
|
import type {
|
|
6
2
|
ChildWorkflowRecord,
|
|
7
3
|
ControllerEvent,
|
|
@@ -13,8 +9,6 @@ import type {
|
|
|
13
9
|
JsonObject,
|
|
14
10
|
} from "./types.js";
|
|
15
11
|
|
|
16
|
-
export const CONTROLLER_STORE_SCHEMA = "pi-workflows.controller-store.v1" as const;
|
|
17
|
-
|
|
18
12
|
export type QueueRequeueOptions = {
|
|
19
13
|
availableAt: string;
|
|
20
14
|
error?: string;
|
|
@@ -65,6 +59,7 @@ export interface ControllerStore {
|
|
|
65
59
|
updateStatus<TStatus>(options: {
|
|
66
60
|
ref: ControllerResourceRef;
|
|
67
61
|
expectedResourceVersion: number;
|
|
62
|
+
claim: ControllerQueueClaim;
|
|
68
63
|
status: ControllerResourceStatus<TStatus>;
|
|
69
64
|
finalizers?: string[];
|
|
70
65
|
now?: string;
|
|
@@ -76,11 +71,16 @@ export interface ControllerStore {
|
|
|
76
71
|
finalizers: string[];
|
|
77
72
|
now?: string;
|
|
78
73
|
}): ControllerResource;
|
|
79
|
-
deleteResource(
|
|
74
|
+
deleteResource(
|
|
75
|
+
ref: ControllerResourceRef,
|
|
76
|
+
expectedResourceVersion: number,
|
|
77
|
+
claim: ControllerQueueClaim,
|
|
78
|
+
): boolean;
|
|
80
79
|
|
|
81
80
|
enqueue(ref: ControllerResourceRef, availableAt?: string): void;
|
|
82
81
|
claimNext(options: {
|
|
83
82
|
controllers: string[];
|
|
83
|
+
ownerId: string;
|
|
84
84
|
leaseMs: number;
|
|
85
85
|
now?: string;
|
|
86
86
|
}): ControllerQueueClaim | undefined;
|
|
@@ -92,6 +92,7 @@ export interface ControllerStore {
|
|
|
92
92
|
reserveEffect(options: {
|
|
93
93
|
key: string;
|
|
94
94
|
resourceUid: string;
|
|
95
|
+
claim: ControllerQueueClaim;
|
|
95
96
|
generation: number;
|
|
96
97
|
kind: string;
|
|
97
98
|
requestFingerprint: string;
|
|
@@ -101,6 +102,7 @@ export interface ControllerStore {
|
|
|
101
102
|
updateEffect(options: {
|
|
102
103
|
resourceUid: string;
|
|
103
104
|
key: string;
|
|
105
|
+
claim: ControllerQueueClaim;
|
|
104
106
|
state: EffectRecord["state"];
|
|
105
107
|
externalRef?: string;
|
|
106
108
|
error?: string;
|
|
@@ -110,51 +112,28 @@ export interface ControllerStore {
|
|
|
110
112
|
|
|
111
113
|
reserveWorkflow(options: {
|
|
112
114
|
resourceUid: string;
|
|
115
|
+
claim: ControllerQueueClaim;
|
|
113
116
|
requestKey: string;
|
|
114
117
|
workflow: string;
|
|
115
118
|
inputFingerprint: string;
|
|
116
119
|
}): WorkflowReservation;
|
|
117
120
|
getWorkflow(resourceUid: string, requestKey: string): ChildWorkflowRecord | undefined;
|
|
118
121
|
getWorkflowByRequestId(requestId: string): ChildWorkflowRecord | undefined;
|
|
119
|
-
updateWorkflow(
|
|
122
|
+
updateWorkflow(
|
|
123
|
+
requestId: string,
|
|
124
|
+
update: WorkflowRecordUpdate,
|
|
125
|
+
claim: ControllerQueueClaim,
|
|
126
|
+
): ChildWorkflowRecord;
|
|
127
|
+
completeWorkflow(requestId: string, update: WorkflowRecordUpdate): ChildWorkflowRecord;
|
|
120
128
|
listWorkflows(resourceUid: string): ChildWorkflowRecord[];
|
|
121
129
|
|
|
122
130
|
recordEvent(options: {
|
|
123
131
|
controller: string;
|
|
124
132
|
key: string;
|
|
133
|
+
claim?: ControllerQueueClaim;
|
|
125
134
|
type: string;
|
|
126
135
|
payload?: JsonObject;
|
|
127
136
|
now?: string;
|
|
128
137
|
}): ControllerEvent;
|
|
129
138
|
listEvents(options?: { controller?: string; key?: string; limit?: number }): ControllerEvent[];
|
|
130
139
|
}
|
|
131
|
-
|
|
132
|
-
export function controllerStoreBaseDir(homeDir: string = os.homedir()): string {
|
|
133
|
-
const override = process.env.PI_WORKFLOWS_CONTROLLER_DIR;
|
|
134
|
-
if (override !== undefined && override.length > 0) {
|
|
135
|
-
return override;
|
|
136
|
-
}
|
|
137
|
-
return path.join(homeDir, ".pi", "agent", "workflows", "controllers");
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function controllerStorePath(homeDir: string = os.homedir()): string {
|
|
141
|
-
return path.join(controllerStoreBaseDir(homeDir), "controller.sqlite");
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function controllerProjectScope(cwd: string): string {
|
|
145
|
-
let canonicalCwd: string;
|
|
146
|
-
try {
|
|
147
|
-
canonicalCwd = fs.realpathSync.native(cwd);
|
|
148
|
-
} catch {
|
|
149
|
-
canonicalCwd = path.resolve(cwd);
|
|
150
|
-
}
|
|
151
|
-
return createHash("sha256").update(canonicalCwd).digest("hex").slice(0, 24);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function projectControllerStoreBaseDir(cwd: string, homeDir: string = os.homedir()): string {
|
|
155
|
-
return path.join(controllerStoreBaseDir(homeDir), "projects", controllerProjectScope(cwd));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function projectControllerStorePath(cwd: string, homeDir: string = os.homedir()): string {
|
|
159
|
-
return path.join(projectControllerStoreBaseDir(cwd, homeDir), "controller.sqlite");
|
|
160
|
-
}
|
package/src/controllers/types.ts
CHANGED
|
@@ -167,8 +167,11 @@ export type AnyControllerDefinition = {
|
|
|
167
167
|
export type ControllerQueueClaim = {
|
|
168
168
|
controller: string;
|
|
169
169
|
key: string;
|
|
170
|
+
ownerId: string;
|
|
170
171
|
token: string;
|
|
172
|
+
generation: number;
|
|
171
173
|
queueVersion: number;
|
|
174
|
+
resourceVersion: number;
|
|
172
175
|
consecutiveErrors: number;
|
|
173
176
|
expiresAt: string;
|
|
174
177
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WorkflowEngine } from "../workflows/engine.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { WorkflowRunStore } from "../workflows/store.js";
|
|
3
3
|
import type {
|
|
4
4
|
WorkflowDefinition,
|
|
5
5
|
WorkflowRunResult,
|
|
@@ -47,17 +47,14 @@ export class WorkflowEngineScheduler implements ControllerWorkflowScheduler {
|
|
|
47
47
|
return { state: "running", runId: active.runId };
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
const bundle =
|
|
50
|
+
const bundle = this.options.store.readRun(request.runId, { includeTrace: true });
|
|
51
51
|
if (bundle !== null) {
|
|
52
52
|
const recovered =
|
|
53
53
|
bundle.state.status === "running"
|
|
54
54
|
? await this.options.store.markRunInterrupted(request.runId)
|
|
55
55
|
: bundle;
|
|
56
56
|
if (recovered !== null) {
|
|
57
|
-
const lastTraceEvent =
|
|
58
|
-
recovered.runDir,
|
|
59
|
-
recovered.manifest.paths.trace,
|
|
60
|
-
);
|
|
57
|
+
const lastTraceEvent = recovered.traceEvents?.at(-1) ?? null;
|
|
61
58
|
return resultFromStatus(
|
|
62
59
|
recovered.state.status,
|
|
63
60
|
request.runId,
|
|
@@ -68,7 +65,6 @@ export class WorkflowEngineScheduler implements ControllerWorkflowScheduler {
|
|
|
68
65
|
return { state: "pending" };
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
await this.options.store.quarantineIncompleteRun(request.runId);
|
|
72
68
|
const resolved = await this.options.resolveWorkflow(request.workflow);
|
|
73
69
|
if (signal.aborted) {
|
|
74
70
|
throw signal.reason ?? new Error("Workflow scheduling aborted");
|
|
@@ -112,7 +108,7 @@ function callCompletion(
|
|
|
112
108
|
try {
|
|
113
109
|
callback(result);
|
|
114
110
|
} catch {
|
|
115
|
-
// A later reconciliation recovers completion from the immutable run
|
|
111
|
+
// A later reconciliation recovers completion from the immutable run event.
|
|
116
112
|
}
|
|
117
113
|
}
|
|
118
114
|
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ChildWorkflowRecord,
|
|
6
6
|
ChildWorkflowRequest,
|
|
7
7
|
ChildWorkflowState,
|
|
8
|
+
ControllerQueueClaim,
|
|
8
9
|
ControllerResource,
|
|
9
10
|
ControllerWorkflows,
|
|
10
11
|
} from "./types.js";
|
|
@@ -37,9 +38,13 @@ export class ControllerWorkflowCoordinator {
|
|
|
37
38
|
private readonly scheduler?: ControllerWorkflowScheduler,
|
|
38
39
|
) {}
|
|
39
40
|
|
|
40
|
-
forResource(
|
|
41
|
+
forResource(
|
|
42
|
+
resource: ControllerResource,
|
|
43
|
+
claim: ControllerQueueClaim,
|
|
44
|
+
signal: AbortSignal,
|
|
45
|
+
): ControllerWorkflows {
|
|
41
46
|
return {
|
|
42
|
-
ensure: async (request) => await this.ensure(resource, request, signal),
|
|
47
|
+
ensure: async (request) => await this.ensure(resource, claim, request, signal),
|
|
43
48
|
};
|
|
44
49
|
}
|
|
45
50
|
|
|
@@ -48,24 +53,25 @@ export class ControllerWorkflowCoordinator {
|
|
|
48
53
|
if (previous === undefined) {
|
|
49
54
|
throw new Error(`Workflow request not found: ${requestId}`);
|
|
50
55
|
}
|
|
51
|
-
const record = this.store.
|
|
56
|
+
const record = this.store.completeWorkflow(requestId, {
|
|
52
57
|
state: result.state,
|
|
53
58
|
...(result.runId !== undefined ? { runId: result.runId } : {}),
|
|
54
59
|
...(result.error !== undefined ? { error: result.error } : { error: null }),
|
|
55
60
|
});
|
|
56
61
|
this.enqueueParent(record.resourceUid);
|
|
57
|
-
this.recordEvent(record, "workflow_state_changed");
|
|
58
62
|
return record;
|
|
59
63
|
}
|
|
60
64
|
|
|
61
65
|
private async ensure(
|
|
62
66
|
resource: ControllerResource,
|
|
67
|
+
claim: ControllerQueueClaim,
|
|
63
68
|
request: ChildWorkflowRequest,
|
|
64
69
|
signal: AbortSignal,
|
|
65
70
|
): Promise<ChildWorkflowRecord> {
|
|
66
71
|
const inputFingerprint = jsonFingerprint(request.input);
|
|
67
72
|
const reservation = this.store.reserveWorkflow({
|
|
68
73
|
resourceUid: resource.metadata.uid,
|
|
74
|
+
claim,
|
|
69
75
|
requestKey: request.requestKey,
|
|
70
76
|
workflow: request.workflow,
|
|
71
77
|
inputFingerprint,
|
|
@@ -78,18 +84,26 @@ export class ControllerWorkflowCoordinator {
|
|
|
78
84
|
return record;
|
|
79
85
|
}
|
|
80
86
|
if (record.state === "interrupted" || record.attempt === 0) {
|
|
81
|
-
record = this.store.updateWorkflow(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
record = this.store.updateWorkflow(
|
|
88
|
+
record.requestId,
|
|
89
|
+
{
|
|
90
|
+
state: "pending",
|
|
91
|
+
attempt: record.attempt + 1,
|
|
92
|
+
runId: createRunId(record.workflow),
|
|
93
|
+
error: null,
|
|
94
|
+
},
|
|
95
|
+
claim,
|
|
96
|
+
);
|
|
87
97
|
} else if (record.runId === undefined) {
|
|
88
|
-
record = this.store.updateWorkflow(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
record = this.store.updateWorkflow(
|
|
99
|
+
record.requestId,
|
|
100
|
+
{
|
|
101
|
+
state: "pending",
|
|
102
|
+
runId: createRunId(record.workflow),
|
|
103
|
+
error: null,
|
|
104
|
+
},
|
|
105
|
+
claim,
|
|
106
|
+
);
|
|
93
107
|
}
|
|
94
108
|
if (record.runId === undefined) {
|
|
95
109
|
throw new Error(`Workflow request has no reserved run ID: ${record.requestId}`);
|
|
@@ -107,15 +121,20 @@ export class ControllerWorkflowCoordinator {
|
|
|
107
121
|
this.complete(record.requestId, completed);
|
|
108
122
|
},
|
|
109
123
|
);
|
|
110
|
-
record = this.store.updateWorkflow(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
124
|
+
record = this.store.updateWorkflow(
|
|
125
|
+
record.requestId,
|
|
126
|
+
{
|
|
127
|
+
state: result.state,
|
|
128
|
+
...(result.runId !== undefined ? { runId: result.runId } : {}),
|
|
129
|
+
...(result.error !== undefined ? { error: result.error } : { error: null }),
|
|
130
|
+
},
|
|
131
|
+
claim,
|
|
132
|
+
);
|
|
115
133
|
if (reservation.created || result.state !== "running") {
|
|
116
134
|
this.recordEvent(
|
|
117
135
|
record,
|
|
118
136
|
reservation.created ? "workflow_requested" : "workflow_state_changed",
|
|
137
|
+
claim,
|
|
119
138
|
);
|
|
120
139
|
}
|
|
121
140
|
return record;
|
|
@@ -131,7 +150,11 @@ export class ControllerWorkflowCoordinator {
|
|
|
131
150
|
}
|
|
132
151
|
}
|
|
133
152
|
|
|
134
|
-
private recordEvent(
|
|
153
|
+
private recordEvent(
|
|
154
|
+
record: ChildWorkflowRecord,
|
|
155
|
+
type: string,
|
|
156
|
+
claim: ControllerQueueClaim,
|
|
157
|
+
): void {
|
|
135
158
|
const resource = this.store.getResourceByUid(record.resourceUid);
|
|
136
159
|
if (resource === undefined) {
|
|
137
160
|
return;
|
|
@@ -139,6 +162,7 @@ export class ControllerWorkflowCoordinator {
|
|
|
139
162
|
this.store.recordEvent({
|
|
140
163
|
controller: resource.metadata.controller,
|
|
141
164
|
key: resource.metadata.key,
|
|
165
|
+
claim,
|
|
142
166
|
type,
|
|
143
167
|
payload: {
|
|
144
168
|
requestId: record.requestId,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ControllerManager,
|
|
3
3
|
SqliteControllerStore,
|
|
4
|
-
projectControllerStorePath,
|
|
5
4
|
loadDiscoveredControllers,
|
|
6
5
|
type AnyControllerDefinition,
|
|
7
6
|
type ControllerResource,
|
|
@@ -86,7 +85,7 @@ export class PiControllerHost {
|
|
|
86
85
|
if (definitions.length === 0) {
|
|
87
86
|
return undefined;
|
|
88
87
|
}
|
|
89
|
-
const store = new SqliteControllerStore(
|
|
88
|
+
const store = new SqliteControllerStore(undefined, { projectPath: options.cwd });
|
|
90
89
|
const manager = new ControllerManager({
|
|
91
90
|
store,
|
|
92
91
|
controllers: definitions,
|