@osolmaz/pi-workflows 0.16.4 → 0.16.6
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 +5 -5
- package/dist/builtins/autoimplement.workflow.d.ts +5 -1
- package/dist/builtins/autoimplement.workflow.js +29 -10
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/client/client.js +3 -1
- package/dist/client/client.js.map +1 -1
- package/dist/client/protocol.d.ts +1 -1
- package/dist/client/protocol.js +18 -1
- package/dist/client/protocol.js.map +1 -1
- package/dist/client/view.d.ts +7 -5
- package/dist/extension/index.d.ts +2 -1
- package/dist/extension/index.js +115 -165
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +1 -1
- package/dist/extension/recorder.js +2 -2
- package/dist/extension/recorder.js.map +1 -1
- package/dist/extension/step-message.d.ts +1 -1
- package/dist/extension/step-message.js +4 -4
- package/dist/extension/step-message.js.map +1 -1
- package/dist/extension/workflow-message-coordinator.d.ts +12 -1
- package/dist/extension/workflow-message-coordinator.js +65 -54
- package/dist/extension/workflow-message-coordinator.js.map +1 -1
- package/dist/resource-managers/index.d.ts +1 -2
- package/dist/resource-managers/index.js +1 -2
- package/dist/resource-managers/index.js.map +1 -1
- package/dist/resource-managers/sqlite.d.ts +2 -295
- package/dist/resource-managers/sqlite.js +71 -1528
- package/dist/resource-managers/sqlite.js.map +1 -1
- package/dist/resource-managers/types.d.ts +2 -7
- package/dist/server/resource-runner-entry.js +2 -6
- package/dist/server/resource-runner-entry.js.map +1 -1
- package/dist/server/rpc-bridge.js +1 -1
- package/dist/server/rpc-bridge.js.map +1 -1
- package/dist/server/rpc-executor.js +2 -4
- package/dist/server/rpc-executor.js.map +1 -1
- package/dist/server/server-entry.js +3 -0
- package/dist/server/server-entry.js.map +1 -1
- package/dist/server/server.d.ts +22 -8
- package/dist/server/server.js +498 -543
- package/dist/server/server.js.map +1 -1
- package/dist/server/state.d.ts +16 -29
- package/dist/server/state.js +105 -319
- package/dist/server/state.js.map +1 -1
- package/dist/server/view.d.ts +4 -5
- package/dist/server/view.js +51 -51
- package/dist/server/view.js.map +1 -1
- package/dist/server/workflow-runner-entry.d.ts +1 -1
- package/dist/server/workflow-runner-entry.js +1 -49
- package/dist/server/workflow-runner-entry.js.map +1 -1
- package/dist/server/workflow-runner-protocol.d.ts +2 -7
- package/dist/server/workflow-runner-protocol.js +5 -10
- package/dist/server/workflow-runner-protocol.js.map +1 -1
- package/dist/server/workflow-runner-store.d.ts +5 -6
- package/dist/server/workflow-runner-store.js +7 -14
- package/dist/server/workflow-runner-store.js.map +1 -1
- package/dist/state/attempt-time.d.ts +21 -0
- package/dist/state/attempt-time.js +95 -0
- package/dist/state/attempt-time.js.map +1 -0
- package/dist/state/json.d.ts +2 -1
- package/dist/state/json.js.map +1 -1
- package/dist/state/project-store.d.ts +39 -0
- package/dist/state/project-store.js +154 -0
- package/dist/state/project-store.js.map +1 -0
- package/dist/state/prune.d.ts +28 -0
- package/dist/state/prune.js +278 -83
- package/dist/state/prune.js.map +1 -1
- package/dist/state/schema.js +23 -23
- package/dist/state/workflow-messages.d.ts +1 -1
- package/dist/state/workflow-messages.js +3 -1
- package/dist/state/workflow-messages.js.map +1 -1
- package/dist/viewer/backup.js +5 -0
- package/dist/viewer/backup.js.map +1 -1
- package/dist/workflows/diagnostics.d.ts +8 -0
- package/dist/workflows/diagnostics.js +61 -0
- package/dist/workflows/diagnostics.js.map +1 -0
- package/dist/workflows/engine.d.ts +2 -15
- package/dist/workflows/engine.js +125 -245
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +3 -7
- package/dist/workflows/human-decision.js +2 -56
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +2 -1
- package/dist/workflows/index.js +1 -0
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/queue.d.ts +267 -0
- package/dist/workflows/queue.js +1248 -0
- package/dist/workflows/queue.js.map +1 -0
- package/dist/workflows/requests.d.ts +47 -0
- package/dist/workflows/requests.js +158 -0
- package/dist/workflows/requests.js.map +1 -0
- package/dist/workflows/schema.js +2 -4
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.d.ts +11 -16
- package/dist/workflows/store.js +174 -169
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +6 -9
- package/dist/workflows/tool-input.js +15 -12
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/transitions.d.ts +38 -0
- package/dist/workflows/transitions.js +276 -0
- package/dist/workflows/transitions.js.map +1 -0
- package/dist/workflows/types.d.ts +9 -42
- package/dist/workflows/workflow-message-content.d.ts +7 -1
- package/dist/workflows/workflow-message-content.js +22 -4
- package/dist/workflows/workflow-message-content.js.map +1 -1
- package/docs/2026-08-25-workflow-follow-ups.md +5 -5
- package/docs/2026-09-02-unify-workflow-messages-plan.md +2 -0
- package/docs/2026-09-04-workflow-run-state-plan.md +2 -0
- package/docs/2026-09-06-durable-execution-plan.md +176 -0
- package/docs/DEFERRED_TURNS.md +84 -105
- package/docs/HUMAN_DECISIONS.md +17 -19
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +1 -1
- package/docs/SQLITE_STATE.md +87 -30
- package/docs/WORKFLOW_SERVER.md +50 -11
- package/docs/WORKFLOW_STEP_MESSAGES.md +72 -54
- package/docs/plans/2026-08-04-controller-runtime-plan.md +2 -0
- package/docs/plans/2026-08-21-deferred-turn-intents-plan.md +2 -0
- package/docs/plans/2026-08-27-workflow-terminal-restart-plan.md +2 -0
- package/docs/plans/2026-09-04-automatic-state-retention-plan.md +283 -0
- package/docs/workflows.md +109 -44
- package/examples/workflows/autoresearch.workflow.ts +0 -2
- package/examples/workflows/branch.workflow.ts +0 -4
- package/examples/workflows/echo.workflow.ts +0 -2
- package/examples/workflows/live-settings.workflow.ts +0 -2
- package/examples/workflows/two-turn.workflow.ts +0 -2
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/protocol/fixtures/client-v1.json +1 -1
- package/skills/pi-workflows/SKILL.md +8 -7
- package/src/builtins/autoimplement.workflow.ts +31 -10
- package/src/client/client.ts +3 -1
- package/src/client/protocol.ts +21 -1
- package/src/client/view.ts +9 -5
- package/src/extension/index.ts +117 -189
- package/src/extension/recorder.ts +2 -2
- package/src/extension/step-message.ts +4 -4
- package/src/extension/workflow-message-coordinator.ts +78 -50
- package/src/resource-managers/index.ts +1 -9
- package/src/resource-managers/sqlite.ts +330 -2655
- package/src/resource-managers/types.ts +2 -3
- package/src/server/resource-runner-entry.ts +2 -7
- package/src/server/rpc-bridge.ts +1 -1
- package/src/server/rpc-executor.ts +4 -9
- package/src/server/server-entry.ts +3 -0
- package/src/server/server.ts +568 -644
- package/src/server/state.ts +122 -466
- package/src/server/view.ts +56 -60
- package/src/server/workflow-runner-entry.ts +2 -55
- package/src/server/workflow-runner-protocol.ts +5 -15
- package/src/server/workflow-runner-store.ts +12 -27
- package/src/state/attempt-time.ts +122 -0
- package/src/state/json.ts +2 -1
- package/src/state/project-store.ts +218 -0
- package/src/state/prune.ts +408 -95
- package/src/state/schema.ts +23 -23
- package/src/state/workflow-messages.ts +4 -2
- package/src/viewer/backup.ts +7 -0
- package/src/workflows/diagnostics.ts +78 -0
- package/src/workflows/engine.ts +133 -291
- package/src/workflows/human-decision.ts +3 -81
- package/src/workflows/index.ts +8 -2
- package/src/workflows/queue.ts +2091 -0
- package/src/workflows/requests.ts +283 -0
- package/src/workflows/schema.ts +2 -6
- package/src/workflows/store.ts +223 -231
- package/src/workflows/tool-input.ts +20 -12
- package/src/workflows/transitions.ts +330 -0
- package/src/workflows/types.ts +9 -46
- package/src/workflows/workflow-message-content.ts +28 -4
- package/dist/resource-managers/runtime.d.ts +0 -59
- package/dist/resource-managers/runtime.js +0 -423
- package/dist/resource-managers/runtime.js.map +0 -1
- package/src/resource-managers/runtime.ts +0 -576
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { StateDatabase, workflowStatePath } from "./database.js";
|
|
5
|
+
import { recordViewerDeltas } from "./viewer.js";
|
|
6
|
+
export function isRecord(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function isLeaseRow(value) {
|
|
10
|
+
return isRecord(value);
|
|
11
|
+
}
|
|
12
|
+
function isProjectRow(value) {
|
|
13
|
+
return isRecord(value);
|
|
14
|
+
}
|
|
15
|
+
function isRevisionRow(value) {
|
|
16
|
+
return isRecord(value);
|
|
17
|
+
}
|
|
18
|
+
export function isSequenceRow(value) {
|
|
19
|
+
return isRecord(value);
|
|
20
|
+
}
|
|
21
|
+
function projectIdFor(canonicalPath) {
|
|
22
|
+
return `project-${createHash("sha256").update(canonicalPath).digest("hex").slice(0, 40)}`;
|
|
23
|
+
}
|
|
24
|
+
function canonicalProjectPath(value) {
|
|
25
|
+
try {
|
|
26
|
+
return fs.realpathSync.native(value);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return path.resolve(value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function validTimestamp(value) {
|
|
33
|
+
const date = value === undefined ? new Date() : new Date(value);
|
|
34
|
+
if (!Number.isFinite(date.getTime()))
|
|
35
|
+
throw new Error("Invalid timestamp");
|
|
36
|
+
return date.toISOString();
|
|
37
|
+
}
|
|
38
|
+
export function epoch(value) {
|
|
39
|
+
return Date.parse(value);
|
|
40
|
+
}
|
|
41
|
+
/** Shared connection, project, and revision operations; domain stores own their rows. */
|
|
42
|
+
export class ProjectStore {
|
|
43
|
+
filePath;
|
|
44
|
+
state;
|
|
45
|
+
ownsState;
|
|
46
|
+
projectId;
|
|
47
|
+
closed = false;
|
|
48
|
+
constructor(filePath = workflowStatePath(), options = {}) {
|
|
49
|
+
this.ownsState = options.state === undefined;
|
|
50
|
+
this.state =
|
|
51
|
+
options.state ??
|
|
52
|
+
new StateDatabase({
|
|
53
|
+
filePath,
|
|
54
|
+
mode: options.readOnly === true ? "read-only" : "read-write",
|
|
55
|
+
checkLegacyState: filePath === workflowStatePath(),
|
|
56
|
+
});
|
|
57
|
+
this.filePath = this.state.filePath;
|
|
58
|
+
if (options.global === true) {
|
|
59
|
+
this.projectId = null;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const projectPath = options.projectPath === undefined ? process.cwd() : options.projectPath;
|
|
63
|
+
this.projectId =
|
|
64
|
+
this.state.mode === "read-only"
|
|
65
|
+
? this.findProject(projectPath)
|
|
66
|
+
: this.ensureProject(projectPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
close() {
|
|
70
|
+
if (this.closed)
|
|
71
|
+
return;
|
|
72
|
+
this.closed = true;
|
|
73
|
+
if (this.ownsState)
|
|
74
|
+
this.state.close();
|
|
75
|
+
}
|
|
76
|
+
ensureProject(projectPath) {
|
|
77
|
+
const canonicalPath = canonicalProjectPath(projectPath);
|
|
78
|
+
const projectId = projectIdFor(canonicalPath);
|
|
79
|
+
this.state.connection
|
|
80
|
+
.prepare(`INSERT INTO projects(project_id, canonical_path, created_at)
|
|
81
|
+
VALUES (?, ?, ?) ON CONFLICT(project_id) DO NOTHING`)
|
|
82
|
+
.run(projectId, canonicalPath, Date.now());
|
|
83
|
+
return projectId;
|
|
84
|
+
}
|
|
85
|
+
findProject(projectPath) {
|
|
86
|
+
const row = this.state.connection
|
|
87
|
+
.prepare("SELECT project_id AS projectId FROM projects WHERE canonical_path = ?")
|
|
88
|
+
.get(canonicalProjectPath(projectPath));
|
|
89
|
+
return isProjectRow(row) ? row.projectId : null;
|
|
90
|
+
}
|
|
91
|
+
requireProjectId() {
|
|
92
|
+
if (this.projectId === null)
|
|
93
|
+
throw new Error("Project is not registered in the state database");
|
|
94
|
+
return this.projectId;
|
|
95
|
+
}
|
|
96
|
+
requireLease(resourceId) {
|
|
97
|
+
const row = this.state.connection
|
|
98
|
+
.prepare(`SELECT generation, owner_type AS ownerType, owner_id AS ownerId,
|
|
99
|
+
token_hash AS tokenHash, expires_at AS expiresAt
|
|
100
|
+
FROM leases WHERE resource_id = ?`)
|
|
101
|
+
.get(resourceId);
|
|
102
|
+
/* istanbul ignore if -- exact schema and internal query shape */
|
|
103
|
+
/* istanbul ignore if -- impossible after exact schema and transaction checks */
|
|
104
|
+
if (!isLeaseRow(row))
|
|
105
|
+
throw new Error(`Lease is missing: ${resourceId}`);
|
|
106
|
+
return row;
|
|
107
|
+
}
|
|
108
|
+
resourceRevision(resourceId) {
|
|
109
|
+
const row = this.state.connection
|
|
110
|
+
.prepare("SELECT revision FROM resources WHERE resource_id = ?")
|
|
111
|
+
.get(resourceId);
|
|
112
|
+
/* istanbul ignore if -- exact schema and internal query shape */
|
|
113
|
+
/* istanbul ignore if -- impossible after exact schema and transaction checks */
|
|
114
|
+
if (!isRevisionRow(row))
|
|
115
|
+
throw new Error(`Resource is missing: ${resourceId}`);
|
|
116
|
+
return row.revision;
|
|
117
|
+
}
|
|
118
|
+
bumpResource(resourceId, expectedRevision, now) {
|
|
119
|
+
const result = this.state.connection
|
|
120
|
+
.prepare("UPDATE resources SET revision = revision + 1, updated_at = ? WHERE resource_id = ? AND revision = ?")
|
|
121
|
+
.run(now, resourceId, expectedRevision);
|
|
122
|
+
if (result.changes !== 1)
|
|
123
|
+
throw new Error("Resource revision conflict");
|
|
124
|
+
const run = this.state.connection
|
|
125
|
+
.prepare(`SELECT r.run_id AS runId
|
|
126
|
+
FROM runs r JOIN viewer_runs v ON v.run_id = r.run_id
|
|
127
|
+
WHERE r.resource_id = ?`)
|
|
128
|
+
.get(resourceId);
|
|
129
|
+
if (isRecord(run) && typeof run.runId === "string") {
|
|
130
|
+
recordViewerDeltas(this.state, run.runId, [
|
|
131
|
+
{ targetType: "summary" },
|
|
132
|
+
{ targetType: "graph" },
|
|
133
|
+
{ targetType: "replay" },
|
|
134
|
+
{ targetType: "inspector", targetKey: "run" },
|
|
135
|
+
], now);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
insertEvent(resourceId, revision, type, actorType, actorId, payload, now, leaseGeneration) {
|
|
139
|
+
const eventId = `event-${randomUUID()}`;
|
|
140
|
+
const payloadHash = this.state.putJson(payload, now);
|
|
141
|
+
this.state.connection
|
|
142
|
+
.prepare(`INSERT INTO events(
|
|
143
|
+
event_id, resource_id, resource_revision, event_type, actor_type,
|
|
144
|
+
actor_id, lease_generation, payload_hash, recorded_at
|
|
145
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
146
|
+
.run(eventId, resourceId, revision, type, actorType, actorId, leaseGeneration ?? null, payloadHash, now);
|
|
147
|
+
return eventId;
|
|
148
|
+
}
|
|
149
|
+
assertWritable() {
|
|
150
|
+
if (this.state.mode === "read-only")
|
|
151
|
+
throw new Error("State store is read-only");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=project-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/state/project-store.ts"],"names":[],"mappings":"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"}
|
package/dist/state/prune.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
1
2
|
import { StateDatabase } from "./database.js";
|
|
3
|
+
export declare const AUTOMATIC_STATE_RETENTION_MS: number;
|
|
4
|
+
export declare const AUTOMATIC_STATE_PRUNE_INTERVAL_MS: number;
|
|
5
|
+
export declare const AUTOMATIC_STATE_VACUUM_MIN_BYTES: number;
|
|
6
|
+
export declare const AUTOMATIC_STATE_VACUUM_MIN_FREE_RATIO = 0.2;
|
|
2
7
|
export type StatePruneOptions = {
|
|
3
8
|
before: string;
|
|
4
9
|
apply: boolean;
|
|
@@ -16,5 +21,28 @@ export type StatePruneReport = {
|
|
|
16
21
|
databaseBytesAfter: number;
|
|
17
22
|
applied: boolean;
|
|
18
23
|
};
|
|
24
|
+
export type AutomaticStatePruneOptions = {
|
|
25
|
+
now?: number;
|
|
26
|
+
activeBlobHashes?: () => readonly Buffer[];
|
|
27
|
+
shouldContinue?: () => boolean;
|
|
28
|
+
yieldControl?: () => Promise<void>;
|
|
29
|
+
vacuumMinBytes?: number;
|
|
30
|
+
vacuumMinFreeRatio?: number;
|
|
31
|
+
vacuum?: (database: Database.Database) => void;
|
|
32
|
+
};
|
|
33
|
+
export type AutomaticStatePruneReport = StatePruneReport & {
|
|
34
|
+
completed: boolean;
|
|
35
|
+
compacted: boolean;
|
|
36
|
+
pageCount: number;
|
|
37
|
+
freePageCount: number;
|
|
38
|
+
pageSize: number;
|
|
39
|
+
reclaimableBytes: number;
|
|
40
|
+
freePageRatio: number;
|
|
41
|
+
compactionError?: string;
|
|
42
|
+
};
|
|
43
|
+
type DatabasePageMetrics = Pick<AutomaticStatePruneReport, "pageCount" | "freePageCount" | "pageSize" | "reclaimableBytes" | "freePageRatio">;
|
|
19
44
|
export declare function validateStatePruneOptions(options: StatePruneOptions): void;
|
|
20
45
|
export declare function pruneState(state: StateDatabase, databasePath: string, options: StatePruneOptions, activeBlobHashes?: () => readonly Buffer[]): Promise<StatePruneReport>;
|
|
46
|
+
export declare function pruneStateAutomatically(state: StateDatabase, databasePath: string, options?: AutomaticStatePruneOptions): Promise<AutomaticStatePruneReport>;
|
|
47
|
+
export declare function shouldVacuumStateAutomatically(metrics: DatabasePageMetrics, minimumBytes?: number, minimumFreeRatio?: number): boolean;
|
|
48
|
+
export {};
|