@zhivex-ai/core 1.17.0 → 1.19.1
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 +4 -0
- package/dist/agent/approvals.d.ts +7 -0
- package/dist/agent/approvals.d.ts.map +1 -0
- package/dist/agent/approvals.js +97 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/cancellation.d.ts +4 -0
- package/dist/agent/cancellation.d.ts.map +1 -0
- package/dist/agent/cancellation.js +69 -0
- package/dist/agent/cancellation.js.map +1 -0
- package/dist/agent/common.d.ts +20 -0
- package/dist/agent/common.d.ts.map +1 -0
- package/dist/agent/common.js +150 -0
- package/dist/agent/common.js.map +1 -0
- package/dist/agent/compaction.d.ts +6 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +156 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/context.d.ts +58 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +267 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/definition.d.ts +4 -0
- package/dist/agent/definition.d.ts.map +1 -0
- package/dist/agent/definition.js +35 -0
- package/dist/agent/definition.js.map +1 -0
- package/dist/agent/execution.d.ts +14 -0
- package/dist/agent/execution.d.ts.map +1 -0
- package/dist/agent/execution.js +1062 -0
- package/dist/agent/execution.js.map +1 -0
- package/dist/agent/groups.d.ts +3 -0
- package/dist/agent/groups.d.ts.map +1 -0
- package/dist/agent/groups.js +130 -0
- package/dist/agent/groups.js.map +1 -0
- package/dist/agent/guardrails.d.ts +4 -0
- package/dist/agent/guardrails.d.ts.map +1 -0
- package/dist/agent/guardrails.js +29 -0
- package/dist/agent/guardrails.js.map +1 -0
- package/dist/agent/instance.d.ts +42 -0
- package/dist/agent/instance.d.ts.map +1 -0
- package/dist/agent/instance.js +82 -0
- package/dist/agent/instance.js.map +1 -0
- package/dist/agent/lifecycle.d.ts +31 -0
- package/dist/agent/lifecycle.d.ts.map +1 -0
- package/dist/agent/lifecycle.js +184 -0
- package/dist/agent/lifecycle.js.map +1 -0
- package/dist/agent/state.d.ts +6 -0
- package/dist/agent/state.d.ts.map +1 -0
- package/dist/agent/state.js +119 -0
- package/dist/agent/state.js.map +1 -0
- package/dist/agent/telemetry.d.ts +12 -0
- package/dist/agent/telemetry.d.ts.map +1 -0
- package/dist/agent/telemetry.js +176 -0
- package/dist/agent/telemetry.js.map +1 -0
- package/dist/agent/tool-execution.d.ts +6 -0
- package/dist/agent/tool-execution.d.ts.map +1 -0
- package/dist/agent/tool-execution.js +176 -0
- package/dist/agent/tool-execution.js.map +1 -0
- package/dist/agent-evaluation.d.ts.map +1 -1
- package/dist/agent-evaluation.js +2 -0
- package/dist/agent-evaluation.js.map +1 -1
- package/dist/agent-reconciliation.d.ts +12 -0
- package/dist/agent-reconciliation.d.ts.map +1 -0
- package/dist/agent-reconciliation.js +87 -0
- package/dist/agent-reconciliation.js.map +1 -0
- package/dist/agent-run-view.d.ts +9 -0
- package/dist/agent-run-view.d.ts.map +1 -0
- package/dist/agent-run-view.js +42 -0
- package/dist/agent-run-view.js.map +1 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +34 -0
- package/dist/agent-state.js.map +1 -1
- package/dist/agent-store/file.d.ts +11 -0
- package/dist/agent-store/file.d.ts.map +1 -0
- package/dist/agent-store/file.js +534 -0
- package/dist/agent-store/file.js.map +1 -0
- package/dist/agent-store/memory.d.ts +9 -0
- package/dist/agent-store/memory.d.ts.map +1 -0
- package/dist/agent-store/memory.js +198 -0
- package/dist/agent-store/memory.js.map +1 -0
- package/dist/agent-store/postgres.d.ts +4 -0
- package/dist/agent-store/postgres.d.ts.map +1 -0
- package/dist/agent-store/postgres.js +374 -0
- package/dist/agent-store/postgres.js.map +1 -0
- package/dist/agent-store/shared.d.ts +19 -0
- package/dist/agent-store/shared.d.ts.map +1 -0
- package/dist/agent-store/shared.js +137 -0
- package/dist/agent-store/shared.js.map +1 -0
- package/dist/agent-store/sqlite.d.ts +4 -0
- package/dist/agent-store/sqlite.d.ts.map +1 -0
- package/dist/agent-store/sqlite.js +362 -0
- package/dist/agent-store/sqlite.js.map +1 -0
- package/dist/agent-store.d.ts +5 -21
- package/dist/agent-store.d.ts.map +1 -1
- package/dist/agent-store.js +5 -1540
- package/dist/agent-store.js.map +1 -1
- package/dist/agent.d.ts +6 -57
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +6 -2622
- package/dist/agent.js.map +1 -1
- package/dist/agents-entry.d.ts +19 -0
- package/dist/agents-entry.d.ts.map +1 -0
- package/dist/agents-entry.js +14 -0
- package/dist/agents-entry.js.map +1 -0
- package/dist/api-stability.d.ts.map +1 -1
- package/dist/api-stability.js +1 -0
- package/dist/api-stability.js.map +1 -1
- package/dist/artifact/file.d.ts +6 -0
- package/dist/artifact/file.d.ts.map +1 -0
- package/dist/artifact/file.js +380 -0
- package/dist/artifact/file.js.map +1 -0
- package/dist/artifact/memory.d.ts +3 -0
- package/dist/artifact/memory.d.ts.map +1 -0
- package/dist/artifact/memory.js +80 -0
- package/dist/artifact/memory.js.map +1 -0
- package/dist/artifact/postgres.d.ts +3 -0
- package/dist/artifact/postgres.d.ts.map +1 -0
- package/dist/artifact/postgres.js +283 -0
- package/dist/artifact/postgres.js.map +1 -0
- package/dist/artifact/shared.d.ts +208 -0
- package/dist/artifact/shared.d.ts.map +1 -0
- package/dist/artifact/shared.js +523 -0
- package/dist/artifact/shared.js.map +1 -0
- package/dist/artifact/sqlite.d.ts +3 -0
- package/dist/artifact/sqlite.d.ts.map +1 -0
- package/dist/artifact/sqlite.js +283 -0
- package/dist/artifact/sqlite.js.map +1 -0
- package/dist/artifact.d.ts +6 -186
- package/dist/artifact.d.ts.map +1 -1
- package/dist/artifact.js +6 -1536
- package/dist/artifact.js.map +1 -1
- package/dist/catalog-contracts.d.ts +52 -0
- package/dist/catalog-contracts.d.ts.map +1 -0
- package/dist/catalog-contracts.js +250 -0
- package/dist/catalog-contracts.js.map +1 -0
- package/dist/catalog.d.ts +3 -52
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +3 -249
- package/dist/catalog.js.map +1 -1
- package/dist/generate-cache-file.d.ts +11 -0
- package/dist/generate-cache-file.d.ts.map +1 -0
- package/dist/generate-cache-file.js +124 -0
- package/dist/generate-cache-file.js.map +1 -0
- package/dist/generate-text.d.ts +2 -5
- package/dist/generate-text.d.ts.map +1 -1
- package/dist/generate-text.js +3 -18
- package/dist/generate-text.js.map +1 -1
- package/dist/generation-entry.d.ts +6 -0
- package/dist/generation-entry.d.ts.map +1 -0
- package/dist/generation-entry.js +6 -0
- package/dist/generation-entry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware-runtime.d.ts +35 -0
- package/dist/middleware-runtime.d.ts.map +1 -0
- package/dist/middleware-runtime.js +532 -0
- package/dist/middleware-runtime.js.map +1 -0
- package/dist/middleware.d.ts +3 -43
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +3 -653
- package/dist/middleware.js.map +1 -1
- package/dist/normalize-messages.d.ts +3 -0
- package/dist/normalize-messages.d.ts.map +1 -0
- package/dist/normalize-messages.js +16 -0
- package/dist/normalize-messages.js.map +1 -0
- package/dist/provider-entry.d.ts +17 -0
- package/dist/provider-entry.d.ts.map +1 -0
- package/dist/provider-entry.js +13 -0
- package/dist/provider-entry.js.map +1 -0
- package/dist/realtime.d.ts +2 -0
- package/dist/realtime.d.ts.map +1 -1
- package/dist/realtime.js +6 -0
- package/dist/realtime.js.map +1 -1
- package/dist/store-key.d.ts +3 -0
- package/dist/store-key.d.ts.map +1 -0
- package/dist/store-key.js +5 -0
- package/dist/store-key.js.map +1 -0
- package/dist/store-security.d.ts +1 -2
- package/dist/store-security.d.ts.map +1 -1
- package/dist/store-security.js +2 -4
- package/dist/store-security.js.map +1 -1
- package/dist/types/agent-state.d.ts +236 -0
- package/dist/types/agent-state.d.ts.map +1 -0
- package/dist/types/agent-state.js +2 -0
- package/dist/types/agent-state.js.map +1 -0
- package/dist/types/agents.d.ts +429 -0
- package/dist/types/agents.d.ts.map +1 -0
- package/dist/types/agents.js +2 -0
- package/dist/types/agents.js.map +1 -0
- package/dist/types/common.d.ts +179 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +2 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/generation.d.ts +109 -0
- package/dist/types/generation.d.ts.map +1 -0
- package/dist/types/generation.js +2 -0
- package/dist/types/generation.js.map +1 -0
- package/dist/types/media-data.d.ts +65 -0
- package/dist/types/media-data.d.ts.map +1 -0
- package/dist/types/media-data.js +2 -0
- package/dist/types/media-data.js.map +1 -0
- package/dist/types/media.d.ts +141 -0
- package/dist/types/media.d.ts.map +1 -0
- package/dist/types/media.js +2 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/messages.d.ts +82 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/middleware.d.ts +130 -0
- package/dist/types/middleware.d.ts.map +1 -0
- package/dist/types/middleware.js +2 -0
- package/dist/types/middleware.js.map +1 -0
- package/dist/types/model-tools.d.ts +409 -0
- package/dist/types/model-tools.d.ts.map +1 -0
- package/dist/types/model-tools.js +2 -0
- package/dist/types/model-tools.js.map +1 -0
- package/dist/types/persistence.d.ts +168 -0
- package/dist/types/persistence.d.ts.map +1 -0
- package/dist/types/persistence.js +2 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/types/provider-resources.d.ts +336 -0
- package/dist/types/provider-resources.d.ts.map +1 -0
- package/dist/types/provider-resources.js +2 -0
- package/dist/types/provider-resources.js.map +1 -0
- package/dist/types/provider.d.ts +23 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +2 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/resource-options.d.ts +88 -0
- package/dist/types/resource-options.d.ts.map +1 -0
- package/dist/types/resource-options.js +2 -0
- package/dist/types/resource-options.js.map +1 -0
- package/dist/types/stream.d.ts +70 -0
- package/dist/types/stream.d.ts.map +1 -0
- package/dist/types/stream.js +2 -0
- package/dist/types/stream.js.map +1 -0
- package/dist/types/ui.d.ts +110 -0
- package/dist/types/ui.d.ts.map +1 -0
- package/dist/types/ui.js +2 -0
- package/dist/types/ui.js.map +1 -0
- package/dist/types.d.ts +16 -2442
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +2 -0
- package/dist/ui.js.map +1 -1
- package/dist/workflow-state-service/file.d.ts +5 -0
- package/dist/workflow-state-service/file.d.ts.map +1 -0
- package/dist/workflow-state-service/file.js +142 -0
- package/dist/workflow-state-service/file.js.map +1 -0
- package/dist/workflow-state-service/memory.d.ts +3 -0
- package/dist/workflow-state-service/memory.d.ts.map +1 -0
- package/dist/workflow-state-service/memory.js +27 -0
- package/dist/workflow-state-service/memory.js.map +1 -0
- package/dist/workflow-state-service/postgres.d.ts +4 -0
- package/dist/workflow-state-service/postgres.d.ts.map +1 -0
- package/dist/workflow-state-service/postgres.js +179 -0
- package/dist/workflow-state-service/postgres.js.map +1 -0
- package/dist/workflow-state-service/shared.d.ts +43 -0
- package/dist/workflow-state-service/shared.d.ts.map +1 -0
- package/dist/workflow-state-service/shared.js +107 -0
- package/dist/workflow-state-service/shared.js.map +1 -0
- package/dist/workflow-state-service/sqlite.d.ts +4 -0
- package/dist/workflow-state-service/sqlite.d.ts.map +1 -0
- package/dist/workflow-state-service/sqlite.js +183 -0
- package/dist/workflow-state-service/sqlite.js.map +1 -0
- package/dist/workflow-state-service.d.ts +6 -33
- package/dist/workflow-state-service.d.ts.map +1 -1
- package/dist/workflow-state-service.js +6 -626
- package/dist/workflow-state-service.js.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { ConflictError } from "../errors.js";
|
|
2
|
+
import { assertPostgresClient } from "../postgres-client.js";
|
|
3
|
+
import { validateIdentifier, workflowStateKey, legacyWorkflowStateKey, parseWorkflowStateJson, getRecordField, matchesWorkflowStateLookup, cloneRecord, assertExpectedRevision, createRecord } from "./shared.js";
|
|
4
|
+
const ensurePostgresTable = (() => {
|
|
5
|
+
const initializedTables = new WeakMap();
|
|
6
|
+
return async (client, tableName, createSql) => {
|
|
7
|
+
let tables = initializedTables.get(client);
|
|
8
|
+
if (!tables) {
|
|
9
|
+
tables = new Map();
|
|
10
|
+
initializedTables.set(client, tables);
|
|
11
|
+
}
|
|
12
|
+
let initialization = tables.get(tableName);
|
|
13
|
+
if (!initialization) {
|
|
14
|
+
initialization = Promise.resolve(client.query(createSql, [])).then(() => undefined);
|
|
15
|
+
tables.set(tableName, initialization);
|
|
16
|
+
}
|
|
17
|
+
await initialization;
|
|
18
|
+
};
|
|
19
|
+
})();
|
|
20
|
+
export const createPostgresWorkflowStateService = (options) => {
|
|
21
|
+
assertPostgresClient(options.client);
|
|
22
|
+
const tableName = validateIdentifier(options.tableName ?? "zhivex_workflow_states", "tableName");
|
|
23
|
+
const createSql = `
|
|
24
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
25
|
+
workflow_state_key TEXT PRIMARY KEY,
|
|
26
|
+
app_name TEXT NOT NULL,
|
|
27
|
+
user_id TEXT NOT NULL,
|
|
28
|
+
session_id TEXT NOT NULL,
|
|
29
|
+
workflow_key TEXT NOT NULL,
|
|
30
|
+
run_id TEXT NOT NULL,
|
|
31
|
+
status TEXT NOT NULL,
|
|
32
|
+
state_json JSONB NOT NULL,
|
|
33
|
+
created_at_ms BIGINT NOT NULL,
|
|
34
|
+
updated_at_ms BIGINT NOT NULL
|
|
35
|
+
)
|
|
36
|
+
`;
|
|
37
|
+
const load = async (input) => {
|
|
38
|
+
await ensurePostgresTable(options.client, tableName, createSql);
|
|
39
|
+
for (const key of [workflowStateKey(input), legacyWorkflowStateKey(input)]) {
|
|
40
|
+
const result = await options.client.query(`SELECT state_json FROM ${tableName} WHERE workflow_state_key = $1`, [key]);
|
|
41
|
+
const record = parseWorkflowStateJson(getRecordField(result.rows[0], ["state_json", "stateJson"]));
|
|
42
|
+
if (record && matchesWorkflowStateLookup(record, input)) {
|
|
43
|
+
return record;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
};
|
|
48
|
+
const save = async (record, saveOptions) => {
|
|
49
|
+
await ensurePostgresTable(options.client, tableName, createSql);
|
|
50
|
+
if (saveOptions?.expectedRevision !== undefined && saveOptions.existing) {
|
|
51
|
+
const result = await options.client.query(`UPDATE ${tableName}
|
|
52
|
+
SET app_name = $2,
|
|
53
|
+
user_id = $3,
|
|
54
|
+
session_id = $4,
|
|
55
|
+
workflow_key = $5,
|
|
56
|
+
run_id = $6,
|
|
57
|
+
status = $7,
|
|
58
|
+
state_json = $8::jsonb,
|
|
59
|
+
updated_at_ms = $9
|
|
60
|
+
WHERE workflow_state_key = $1
|
|
61
|
+
AND updated_at_ms = $10
|
|
62
|
+
RETURNING state_json`, [
|
|
63
|
+
workflowStateKey(record),
|
|
64
|
+
record.appName,
|
|
65
|
+
record.userId,
|
|
66
|
+
record.sessionId,
|
|
67
|
+
record.workflowKey,
|
|
68
|
+
record.runId,
|
|
69
|
+
record.status,
|
|
70
|
+
JSON.stringify(record),
|
|
71
|
+
record.updatedAt,
|
|
72
|
+
saveOptions.existing.updatedAt
|
|
73
|
+
]);
|
|
74
|
+
if (result.rows.length === 0) {
|
|
75
|
+
const migrated = await options.client.query(`UPDATE ${tableName}
|
|
76
|
+
SET workflow_state_key = $1,
|
|
77
|
+
app_name = $2,
|
|
78
|
+
user_id = $3,
|
|
79
|
+
session_id = $4,
|
|
80
|
+
workflow_key = $5,
|
|
81
|
+
run_id = $6,
|
|
82
|
+
status = $7,
|
|
83
|
+
state_json = $8::jsonb,
|
|
84
|
+
updated_at_ms = $9
|
|
85
|
+
WHERE workflow_state_key = $10
|
|
86
|
+
AND updated_at_ms = $11
|
|
87
|
+
RETURNING state_json`, [
|
|
88
|
+
workflowStateKey(record),
|
|
89
|
+
record.appName,
|
|
90
|
+
record.userId,
|
|
91
|
+
record.sessionId,
|
|
92
|
+
record.workflowKey,
|
|
93
|
+
record.runId,
|
|
94
|
+
record.status,
|
|
95
|
+
JSON.stringify(record),
|
|
96
|
+
record.updatedAt,
|
|
97
|
+
legacyWorkflowStateKey(record),
|
|
98
|
+
saveOptions.existing.updatedAt
|
|
99
|
+
]);
|
|
100
|
+
if (migrated.rows.length === 0) {
|
|
101
|
+
throw new ConflictError("WorkflowStateRecord revision conflict.");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
await options.client.query(`INSERT INTO ${tableName} (
|
|
107
|
+
workflow_state_key, app_name, user_id, session_id, workflow_key, run_id, status, state_json, created_at_ms, updated_at_ms
|
|
108
|
+
)
|
|
109
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8::jsonb, $9, $10)
|
|
110
|
+
ON CONFLICT(workflow_state_key) DO UPDATE SET
|
|
111
|
+
app_name = EXCLUDED.app_name,
|
|
112
|
+
user_id = EXCLUDED.user_id,
|
|
113
|
+
session_id = EXCLUDED.session_id,
|
|
114
|
+
workflow_key = EXCLUDED.workflow_key,
|
|
115
|
+
run_id = EXCLUDED.run_id,
|
|
116
|
+
status = EXCLUDED.status,
|
|
117
|
+
state_json = EXCLUDED.state_json,
|
|
118
|
+
updated_at_ms = EXCLUDED.updated_at_ms`, [
|
|
119
|
+
workflowStateKey(record),
|
|
120
|
+
record.appName,
|
|
121
|
+
record.userId,
|
|
122
|
+
record.sessionId,
|
|
123
|
+
record.workflowKey,
|
|
124
|
+
record.runId,
|
|
125
|
+
record.status,
|
|
126
|
+
JSON.stringify(record),
|
|
127
|
+
record.createdAt,
|
|
128
|
+
record.updatedAt
|
|
129
|
+
]);
|
|
130
|
+
}
|
|
131
|
+
const legacyResult = await options.client.query(`SELECT state_json FROM ${tableName} WHERE workflow_state_key = $1`, [legacyWorkflowStateKey(record)]);
|
|
132
|
+
const legacy = parseWorkflowStateJson(getRecordField(legacyResult.rows[0], ["state_json", "stateJson"]));
|
|
133
|
+
if (legacy && matchesWorkflowStateLookup(legacy, record)) {
|
|
134
|
+
await options.client.query(`DELETE FROM ${tableName} WHERE workflow_state_key = $1`, [legacyWorkflowStateKey(record)]);
|
|
135
|
+
}
|
|
136
|
+
return cloneRecord(record);
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
async saveWorkflowState(input) {
|
|
140
|
+
const existing = await load(input);
|
|
141
|
+
assertExpectedRevision(existing, input.expectedRevision);
|
|
142
|
+
return save(createRecord(input, existing), {
|
|
143
|
+
existing,
|
|
144
|
+
expectedRevision: input.expectedRevision
|
|
145
|
+
});
|
|
146
|
+
},
|
|
147
|
+
loadWorkflowState(input) {
|
|
148
|
+
return load(input);
|
|
149
|
+
},
|
|
150
|
+
async listWorkflowStates(input) {
|
|
151
|
+
await ensurePostgresTable(options.client, tableName, createSql);
|
|
152
|
+
const result = await options.client.query(`SELECT state_json FROM ${tableName}
|
|
153
|
+
WHERE app_name = $1
|
|
154
|
+
AND user_id = $2
|
|
155
|
+
AND ($3::text IS NULL OR session_id = $3)
|
|
156
|
+
AND ($4::text IS NULL OR workflow_key = $4)
|
|
157
|
+
AND ($5::text IS NULL OR status = $5)
|
|
158
|
+
ORDER BY updated_at_ms ASC, workflow_key ASC`, [input.appName, input.userId, input.sessionId ?? null, input.workflowKey ?? null, input.status ?? null]);
|
|
159
|
+
const records = new Map();
|
|
160
|
+
for (const row of result.rows) {
|
|
161
|
+
const record = parseWorkflowStateJson(getRecordField(row, ["state_json", "stateJson"]));
|
|
162
|
+
if (record) {
|
|
163
|
+
records.set(workflowStateKey(record), record);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return [...records.values()];
|
|
167
|
+
},
|
|
168
|
+
async deleteWorkflowState(input) {
|
|
169
|
+
await ensurePostgresTable(options.client, tableName, createSql);
|
|
170
|
+
await options.client.query(`DELETE FROM ${tableName} WHERE workflow_state_key = $1`, [workflowStateKey(input)]);
|
|
171
|
+
const legacyResult = await options.client.query(`SELECT state_json FROM ${tableName} WHERE workflow_state_key = $1`, [legacyWorkflowStateKey(input)]);
|
|
172
|
+
const legacy = parseWorkflowStateJson(getRecordField(legacyResult.rows[0], ["state_json", "stateJson"]));
|
|
173
|
+
if (legacy && matchesWorkflowStateLookup(legacy, input)) {
|
|
174
|
+
await options.client.query(`DELETE FROM ${tableName} WHERE workflow_state_key = $1`, [legacyWorkflowStateKey(input)]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/workflow-state-service/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { PostgresClientLike, SqliteDatabaseLike } from "../types.js";
|
|
2
|
+
import { WORKFLOW_STATE_RECORD_SCHEMA_VERSION, type WorkflowStateListInput, type WorkflowStateRecord, type WorkflowStateSaveInput, type WorkflowStateServiceLookup } from "../workflow-state-contracts.js";
|
|
3
|
+
export interface FileWorkflowStateServiceOptions {
|
|
4
|
+
directory: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FileWorkflowStateStorePruneOptions extends FileWorkflowStateServiceOptions {
|
|
7
|
+
olderThanMs?: number;
|
|
8
|
+
keepLast?: number;
|
|
9
|
+
now?: number;
|
|
10
|
+
dryRun?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface FileWorkflowStateStorePruneResult {
|
|
13
|
+
directory: string;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
deletedWorkflowStateKeys: string[];
|
|
16
|
+
keptWorkflowStateKeys: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface SqliteWorkflowStateServiceOptions {
|
|
19
|
+
db: SqliteDatabaseLike;
|
|
20
|
+
tableName?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PostgresWorkflowStateServiceOptions {
|
|
23
|
+
client: PostgresClientLike;
|
|
24
|
+
tableName?: string;
|
|
25
|
+
}
|
|
26
|
+
export type WorkflowStateRecordMigrationTarget = typeof WORKFLOW_STATE_RECORD_SCHEMA_VERSION;
|
|
27
|
+
export type WorkflowStateLookup = WorkflowStateServiceLookup;
|
|
28
|
+
export declare const workflowStateParts: (input: WorkflowStateLookup) => readonly [string, string, string, string];
|
|
29
|
+
export declare const workflowStateKey: (input: WorkflowStateLookup) => string;
|
|
30
|
+
export declare const legacyWorkflowStateKey: (input: WorkflowStateLookup) => string;
|
|
31
|
+
export declare const matchesWorkflowStateLookup: (record: WorkflowStateRecord, input: WorkflowStateLookup) => boolean;
|
|
32
|
+
export declare const normalizeWorkflowStateRecord: (value: unknown) => WorkflowStateRecord;
|
|
33
|
+
export declare const migrateWorkflowStateRecord: (value: unknown, targetVersion?: WorkflowStateRecordMigrationTarget) => WorkflowStateRecord;
|
|
34
|
+
export declare const assertExpectedRevision: (current: {
|
|
35
|
+
revision: number;
|
|
36
|
+
} | undefined, expectedRevision: number | undefined) => void;
|
|
37
|
+
export declare const cloneRecord: (record: WorkflowStateRecord) => WorkflowStateRecord;
|
|
38
|
+
export declare const createRecord: (input: WorkflowStateSaveInput, existing?: WorkflowStateRecord) => WorkflowStateRecord;
|
|
39
|
+
export declare const matchesListInput: (record: WorkflowStateRecord, input: WorkflowStateListInput) => boolean;
|
|
40
|
+
export declare const validateIdentifier: (value: string, fieldName: string) => string;
|
|
41
|
+
export declare const getRecordField: (value: unknown, candidates: string[]) => unknown;
|
|
42
|
+
export declare const parseWorkflowStateJson: (value: unknown) => WorkflowStateRecord | undefined;
|
|
43
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/workflow-state-service/shared.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAGL,oCAAoC,EACpC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAEhC,MAAM,gCAAgC,CAAC;AAMxC,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kCAAmC,SAAQ,+BAA+B;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,kBAAkB,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mCAAmC;IAClD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,kCAAkC,GAAG,OAAO,oCAAoC,CAAC;AAE7F,MAAM,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE7D,eAAO,MAAM,kBAAkB,UAAW,mBAAmB,8CACe,CAAC;AAE7E,eAAO,MAAM,gBAAgB,UAAW,mBAAmB,KAAG,MACE,CAAC;AAEjE,eAAO,MAAM,sBAAsB,UAAW,mBAAmB,KAAG,MACQ,CAAC;AAE7E,eAAO,MAAM,0BAA0B,WAAY,mBAAmB,SAAS,mBAAmB,YAIxD,CAAC;AAE3C,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,mBAkC7D,CAAC;AAEF,eAAO,MAAM,0BAA0B,UAC9B,OAAO,kBACC,kCAAkC,KAChD,mBAKF,CAAC;AAEF,eAAO,MAAM,sBAAsB,YACxB;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,oBACvB,MAAM,GAAG,SAAS,SAKrC,CAAC;AAEF,eAAO,MAAM,WAAW,WAAY,mBAAmB,KAAG,mBAAsE,CAAC;AAEjI,eAAO,MAAM,YAAY,UAAW,sBAAsB,aAAa,mBAAmB,KAAG,mBAgB5F,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAAY,mBAAmB,SAAS,sBAAsB,KAAG,OAK9B,CAAC;AAEjE,eAAO,MAAM,kBAAkB,UAAW,MAAM,aAAa,MAAM,KAAG,MAKrE,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,OAAO,cAAc,MAAM,EAAE,KAAG,OAWrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,UAAW,OAAO,KAAG,mBAAmB,GAAG,SAQ7E,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { ConflictError, ValidationError } from "../errors.js";
|
|
2
|
+
import { canonicalStoreKey } from "../store-key.js";
|
|
3
|
+
import { normalizeWorkflowRunState, WORKFLOW_RUN_STATE_SCHEMA_VERSION, WORKFLOW_STATE_RECORD_SCHEMA_VERSION } from "../workflow-state-contracts.js";
|
|
4
|
+
const cloneJson = (value) => JSON.parse(JSON.stringify(value));
|
|
5
|
+
const identifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
6
|
+
export const workflowStateParts = (input) => [input.appName, input.userId, input.sessionId, input.workflowKey];
|
|
7
|
+
export const workflowStateKey = (input) => canonicalStoreKey("workflow-state", workflowStateParts(input));
|
|
8
|
+
export const legacyWorkflowStateKey = (input) => `${input.appName}:${input.userId}:${input.sessionId}:${input.workflowKey}`;
|
|
9
|
+
export const matchesWorkflowStateLookup = (record, input) => record.appName === input.appName &&
|
|
10
|
+
record.userId === input.userId &&
|
|
11
|
+
record.sessionId === input.sessionId &&
|
|
12
|
+
record.workflowKey === input.workflowKey;
|
|
13
|
+
export const normalizeWorkflowStateRecord = (value) => {
|
|
14
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
15
|
+
throw new ValidationError("WorkflowStateRecord must be an object.");
|
|
16
|
+
}
|
|
17
|
+
const record = value;
|
|
18
|
+
if (record.schemaVersion !== undefined && record.schemaVersion > WORKFLOW_STATE_RECORD_SCHEMA_VERSION) {
|
|
19
|
+
throw new ValidationError(`Unsupported WorkflowStateRecord schemaVersion ${record.schemaVersion}.`);
|
|
20
|
+
}
|
|
21
|
+
if (typeof record.appName !== "string" ||
|
|
22
|
+
typeof record.userId !== "string" ||
|
|
23
|
+
typeof record.sessionId !== "string" ||
|
|
24
|
+
typeof record.workflowKey !== "string" ||
|
|
25
|
+
typeof record.runId !== "string" ||
|
|
26
|
+
typeof record.status !== "string" ||
|
|
27
|
+
typeof record.createdAt !== "number" ||
|
|
28
|
+
typeof record.updatedAt !== "number" ||
|
|
29
|
+
!record.state) {
|
|
30
|
+
throw new ValidationError("WorkflowStateRecord is missing required fields.");
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
schemaVersion: WORKFLOW_STATE_RECORD_SCHEMA_VERSION,
|
|
34
|
+
revision: typeof record.revision === "number" ? record.revision : 1,
|
|
35
|
+
appName: record.appName,
|
|
36
|
+
userId: record.userId,
|
|
37
|
+
sessionId: record.sessionId,
|
|
38
|
+
workflowKey: record.workflowKey,
|
|
39
|
+
state: normalizeWorkflowRunState(record.state),
|
|
40
|
+
status: record.status,
|
|
41
|
+
runId: record.runId,
|
|
42
|
+
createdAt: record.createdAt,
|
|
43
|
+
updatedAt: record.updatedAt
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export const migrateWorkflowStateRecord = (value, targetVersion = WORKFLOW_STATE_RECORD_SCHEMA_VERSION) => {
|
|
47
|
+
if (targetVersion !== WORKFLOW_STATE_RECORD_SCHEMA_VERSION) {
|
|
48
|
+
throw new ValidationError(`Unsupported WorkflowStateRecord migration target ${targetVersion}.`);
|
|
49
|
+
}
|
|
50
|
+
return normalizeWorkflowStateRecord(value);
|
|
51
|
+
};
|
|
52
|
+
export const assertExpectedRevision = (current, expectedRevision) => {
|
|
53
|
+
if (expectedRevision !== undefined && (current?.revision ?? 0) !== expectedRevision) {
|
|
54
|
+
throw new ConflictError("WorkflowStateRecord revision conflict.");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
export const cloneRecord = (record) => cloneJson(normalizeWorkflowStateRecord(record));
|
|
58
|
+
export const createRecord = (input, existing) => {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
const state = normalizeWorkflowRunState(input.state);
|
|
61
|
+
return {
|
|
62
|
+
schemaVersion: WORKFLOW_STATE_RECORD_SCHEMA_VERSION,
|
|
63
|
+
revision: existing ? existing.revision + 1 : 1,
|
|
64
|
+
appName: input.appName,
|
|
65
|
+
userId: input.userId,
|
|
66
|
+
sessionId: input.sessionId,
|
|
67
|
+
workflowKey: input.workflowKey,
|
|
68
|
+
state: cloneJson({ ...state, schemaVersion: WORKFLOW_RUN_STATE_SCHEMA_VERSION }),
|
|
69
|
+
status: state.status,
|
|
70
|
+
runId: state.runId,
|
|
71
|
+
createdAt: existing?.createdAt ?? now,
|
|
72
|
+
updatedAt: now
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
export const matchesListInput = (record, input) => record.appName === input.appName &&
|
|
76
|
+
record.userId === input.userId &&
|
|
77
|
+
(input.sessionId === undefined || record.sessionId === input.sessionId) &&
|
|
78
|
+
(input.workflowKey === undefined || record.workflowKey === input.workflowKey) &&
|
|
79
|
+
(input.status === undefined || record.status === input.status);
|
|
80
|
+
export const validateIdentifier = (value, fieldName) => {
|
|
81
|
+
if (!identifierPattern.test(value)) {
|
|
82
|
+
throw new ValidationError(`The "${fieldName}" option must match the SQL identifier pattern [A-Za-z_][A-Za-z0-9_]*.`);
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
};
|
|
86
|
+
export const getRecordField = (value, candidates) => {
|
|
87
|
+
if (!value || typeof value !== "object") {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const record = value;
|
|
91
|
+
for (const candidate of candidates) {
|
|
92
|
+
if (candidate in record) {
|
|
93
|
+
return record[candidate];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
};
|
|
98
|
+
export const parseWorkflowStateJson = (value) => {
|
|
99
|
+
if (!value) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
if (typeof value === "string") {
|
|
103
|
+
return normalizeWorkflowStateRecord(JSON.parse(value));
|
|
104
|
+
}
|
|
105
|
+
return normalizeWorkflowStateRecord(value);
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/workflow-state-service/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type WorkflowStateService } from "../workflow-state-contracts.js";
|
|
2
|
+
import { type SqliteWorkflowStateServiceOptions } from "./shared.js";
|
|
3
|
+
export declare const createSqliteWorkflowStateService: (options: SqliteWorkflowStateServiceOptions) => WorkflowStateService;
|
|
4
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/workflow-state-service/sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACrG,OAAO,EACL,KAAK,iCAAiC,EAWvC,MAAM,aAAa,CAAC;AAwBrB,eAAO,MAAM,gCAAgC,YAAa,iCAAiC,KAAG,oBAmL7F,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ConflictError, ValidationError } from "../errors.js";
|
|
2
|
+
import { validateIdentifier, workflowStateKey, legacyWorkflowStateKey, parseWorkflowStateJson, getRecordField, matchesWorkflowStateLookup, cloneRecord, assertExpectedRevision, createRecord } from "./shared.js";
|
|
3
|
+
const sqliteMutationCount = (result) => {
|
|
4
|
+
if (!result || typeof result !== "object") {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const record = result;
|
|
8
|
+
const value = record.changes ?? record.changeset ?? record.rowCount;
|
|
9
|
+
return typeof value === "number" ? value : undefined;
|
|
10
|
+
};
|
|
11
|
+
const prepareSqliteStatement = (db, sql) => {
|
|
12
|
+
if (typeof db.prepare === "function") {
|
|
13
|
+
return db.prepare(sql);
|
|
14
|
+
}
|
|
15
|
+
if (typeof db.query === "function") {
|
|
16
|
+
return db.query(sql);
|
|
17
|
+
}
|
|
18
|
+
throw new ValidationError('The "db" option must expose either a "prepare()" or "query()" method.');
|
|
19
|
+
};
|
|
20
|
+
export const createSqliteWorkflowStateService = (options) => {
|
|
21
|
+
const tableName = validateIdentifier(options.tableName ?? "zhivex_workflow_states", "tableName");
|
|
22
|
+
options.db.exec(`
|
|
23
|
+
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
24
|
+
workflow_state_key TEXT PRIMARY KEY,
|
|
25
|
+
app_name TEXT NOT NULL,
|
|
26
|
+
user_id TEXT NOT NULL,
|
|
27
|
+
session_id TEXT NOT NULL,
|
|
28
|
+
workflow_key TEXT NOT NULL,
|
|
29
|
+
run_id TEXT NOT NULL,
|
|
30
|
+
status TEXT NOT NULL,
|
|
31
|
+
state_json TEXT NOT NULL,
|
|
32
|
+
created_at_ms INTEGER NOT NULL,
|
|
33
|
+
updated_at_ms INTEGER NOT NULL
|
|
34
|
+
)
|
|
35
|
+
`);
|
|
36
|
+
const loadStatement = prepareSqliteStatement(options.db, `SELECT state_json FROM ${tableName} WHERE workflow_state_key = ?`);
|
|
37
|
+
const listStatement = prepareSqliteStatement(options.db, `SELECT state_json FROM ${tableName}
|
|
38
|
+
WHERE app_name = ?
|
|
39
|
+
AND user_id = ?
|
|
40
|
+
AND (? IS NULL OR session_id = ?)
|
|
41
|
+
AND (? IS NULL OR workflow_key = ?)
|
|
42
|
+
AND (? IS NULL OR status = ?)
|
|
43
|
+
ORDER BY updated_at_ms ASC, workflow_key ASC`);
|
|
44
|
+
const saveStatement = prepareSqliteStatement(options.db, `
|
|
45
|
+
INSERT INTO ${tableName} (
|
|
46
|
+
workflow_state_key, app_name, user_id, session_id, workflow_key, run_id, status, state_json, created_at_ms, updated_at_ms
|
|
47
|
+
)
|
|
48
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
49
|
+
ON CONFLICT(workflow_state_key) DO UPDATE SET
|
|
50
|
+
app_name = excluded.app_name,
|
|
51
|
+
user_id = excluded.user_id,
|
|
52
|
+
session_id = excluded.session_id,
|
|
53
|
+
workflow_key = excluded.workflow_key,
|
|
54
|
+
run_id = excluded.run_id,
|
|
55
|
+
status = excluded.status,
|
|
56
|
+
state_json = excluded.state_json,
|
|
57
|
+
updated_at_ms = excluded.updated_at_ms
|
|
58
|
+
`);
|
|
59
|
+
const updateCasStatement = prepareSqliteStatement(options.db, `
|
|
60
|
+
UPDATE ${tableName}
|
|
61
|
+
SET app_name = ?,
|
|
62
|
+
user_id = ?,
|
|
63
|
+
session_id = ?,
|
|
64
|
+
workflow_key = ?,
|
|
65
|
+
run_id = ?,
|
|
66
|
+
status = ?,
|
|
67
|
+
state_json = ?,
|
|
68
|
+
updated_at_ms = ?
|
|
69
|
+
WHERE workflow_state_key = ?
|
|
70
|
+
AND updated_at_ms = ?
|
|
71
|
+
`);
|
|
72
|
+
const deleteStatement = prepareSqliteStatement(options.db, `DELETE FROM ${tableName} WHERE workflow_state_key = ?`);
|
|
73
|
+
const load = (input) => {
|
|
74
|
+
for (const key of [workflowStateKey(input), legacyWorkflowStateKey(input)]) {
|
|
75
|
+
const record = parseWorkflowStateJson(getRecordField(loadStatement.get([key]), ["state_json", "stateJson"]));
|
|
76
|
+
if (record && matchesWorkflowStateLookup(record, input)) {
|
|
77
|
+
return record;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
const save = (record, options) => {
|
|
83
|
+
if (options?.expectedRevision !== undefined && options.existing) {
|
|
84
|
+
const canonical = parseWorkflowStateJson(getRecordField(loadStatement.get([workflowStateKey(record)]), ["state_json", "stateJson"]));
|
|
85
|
+
if (canonical && matchesWorkflowStateLookup(canonical, record)) {
|
|
86
|
+
const result = updateCasStatement.run([
|
|
87
|
+
record.appName,
|
|
88
|
+
record.userId,
|
|
89
|
+
record.sessionId,
|
|
90
|
+
record.workflowKey,
|
|
91
|
+
record.runId,
|
|
92
|
+
record.status,
|
|
93
|
+
JSON.stringify(record),
|
|
94
|
+
record.updatedAt,
|
|
95
|
+
workflowStateKey(record),
|
|
96
|
+
options.existing.updatedAt
|
|
97
|
+
]);
|
|
98
|
+
if (sqliteMutationCount(result) === 0) {
|
|
99
|
+
throw new ConflictError("WorkflowStateRecord revision conflict.");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const legacy = parseWorkflowStateJson(getRecordField(loadStatement.get([legacyWorkflowStateKey(record)]), ["state_json", "stateJson"]));
|
|
104
|
+
if (!legacy || !matchesWorkflowStateLookup(legacy, record) || legacy.updatedAt !== options.existing.updatedAt) {
|
|
105
|
+
throw new ConflictError("WorkflowStateRecord revision conflict.");
|
|
106
|
+
}
|
|
107
|
+
saveStatement.run([
|
|
108
|
+
workflowStateKey(record),
|
|
109
|
+
record.appName,
|
|
110
|
+
record.userId,
|
|
111
|
+
record.sessionId,
|
|
112
|
+
record.workflowKey,
|
|
113
|
+
record.runId,
|
|
114
|
+
record.status,
|
|
115
|
+
JSON.stringify(record),
|
|
116
|
+
record.createdAt,
|
|
117
|
+
record.updatedAt
|
|
118
|
+
]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
saveStatement.run([
|
|
123
|
+
workflowStateKey(record),
|
|
124
|
+
record.appName,
|
|
125
|
+
record.userId,
|
|
126
|
+
record.sessionId,
|
|
127
|
+
record.workflowKey,
|
|
128
|
+
record.runId,
|
|
129
|
+
record.status,
|
|
130
|
+
JSON.stringify(record),
|
|
131
|
+
record.createdAt,
|
|
132
|
+
record.updatedAt
|
|
133
|
+
]);
|
|
134
|
+
}
|
|
135
|
+
const legacy = parseWorkflowStateJson(getRecordField(loadStatement.get([legacyWorkflowStateKey(record)]), ["state_json", "stateJson"]));
|
|
136
|
+
if (legacy && matchesWorkflowStateLookup(legacy, record)) {
|
|
137
|
+
deleteStatement.run([legacyWorkflowStateKey(record)]);
|
|
138
|
+
}
|
|
139
|
+
return cloneRecord(record);
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
saveWorkflowState(input) {
|
|
143
|
+
const existing = load(input);
|
|
144
|
+
assertExpectedRevision(existing, input.expectedRevision);
|
|
145
|
+
return save(createRecord(input, existing), {
|
|
146
|
+
existing,
|
|
147
|
+
expectedRevision: input.expectedRevision
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
loadWorkflowState(input) {
|
|
151
|
+
return load(input);
|
|
152
|
+
},
|
|
153
|
+
listWorkflowStates(input) {
|
|
154
|
+
const params = [
|
|
155
|
+
input.appName,
|
|
156
|
+
input.userId,
|
|
157
|
+
input.sessionId ?? null,
|
|
158
|
+
input.sessionId ?? null,
|
|
159
|
+
input.workflowKey ?? null,
|
|
160
|
+
input.workflowKey ?? null,
|
|
161
|
+
input.status ?? null,
|
|
162
|
+
input.status ?? null
|
|
163
|
+
];
|
|
164
|
+
const rows = listStatement.all?.(params) ?? [];
|
|
165
|
+
const records = new Map();
|
|
166
|
+
for (const row of rows) {
|
|
167
|
+
const record = parseWorkflowStateJson(getRecordField(row, ["state_json", "stateJson"]));
|
|
168
|
+
if (record) {
|
|
169
|
+
records.set(workflowStateKey(record), record);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return [...records.values()];
|
|
173
|
+
},
|
|
174
|
+
deleteWorkflowState(input) {
|
|
175
|
+
deleteStatement.run([workflowStateKey(input)]);
|
|
176
|
+
const legacy = parseWorkflowStateJson(getRecordField(loadStatement.get([legacyWorkflowStateKey(input)]), ["state_json", "stateJson"]));
|
|
177
|
+
if (legacy && matchesWorkflowStateLookup(legacy, input)) {
|
|
178
|
+
deleteStatement.run([legacyWorkflowStateKey(input)]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/workflow-state-service/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import { WORKFLOW_STATE_RECORD_SCHEMA_VERSION, type WorkflowStateRecord, type WorkflowStateService } from "./workflow-state-contracts.js";
|
|
1
|
+
/** Compatibility facade. Backend implementations live in dedicated internal modules. */
|
|
3
2
|
export { WORKFLOW_STATE_RECORD_SCHEMA_VERSION } from "./workflow-state-contracts.js";
|
|
4
3
|
export type { WorkflowStateListInput, WorkflowStateRecord, WorkflowStateSaveInput, WorkflowStateService, WorkflowStateServiceLookup as WorkflowStateLookup } from "./workflow-state-contracts.js";
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
keepLast?: number;
|
|
11
|
-
now?: number;
|
|
12
|
-
dryRun?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export interface FileWorkflowStateStorePruneResult {
|
|
15
|
-
directory: string;
|
|
16
|
-
dryRun: boolean;
|
|
17
|
-
deletedWorkflowStateKeys: string[];
|
|
18
|
-
keptWorkflowStateKeys: string[];
|
|
19
|
-
}
|
|
20
|
-
export interface SqliteWorkflowStateServiceOptions {
|
|
21
|
-
db: SqliteDatabaseLike;
|
|
22
|
-
tableName?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface PostgresWorkflowStateServiceOptions {
|
|
25
|
-
client: PostgresClientLike;
|
|
26
|
-
tableName?: string;
|
|
27
|
-
}
|
|
28
|
-
export type WorkflowStateRecordMigrationTarget = typeof WORKFLOW_STATE_RECORD_SCHEMA_VERSION;
|
|
29
|
-
export declare const normalizeWorkflowStateRecord: (value: unknown) => WorkflowStateRecord;
|
|
30
|
-
export declare const migrateWorkflowStateRecord: (value: unknown, targetVersion?: WorkflowStateRecordMigrationTarget) => WorkflowStateRecord;
|
|
31
|
-
export declare const createInMemoryWorkflowStateService: () => WorkflowStateService;
|
|
32
|
-
export declare const createFileWorkflowStateService: (options: FileWorkflowStateServiceOptions) => WorkflowStateService;
|
|
33
|
-
export declare const pruneFileWorkflowStateStore: (options: FileWorkflowStateStorePruneOptions) => Promise<FileWorkflowStateStorePruneResult>;
|
|
34
|
-
export declare const createSqliteWorkflowStateService: (options: SqliteWorkflowStateServiceOptions) => WorkflowStateService;
|
|
35
|
-
export declare const createPostgresWorkflowStateService: (options: PostgresWorkflowStateServiceOptions) => WorkflowStateService;
|
|
4
|
+
export { type FileWorkflowStateServiceOptions, type FileWorkflowStateStorePruneOptions, type FileWorkflowStateStorePruneResult, type SqliteWorkflowStateServiceOptions, type PostgresWorkflowStateServiceOptions, type WorkflowStateRecordMigrationTarget, normalizeWorkflowStateRecord, migrateWorkflowStateRecord } from "./workflow-state-service/shared.js";
|
|
5
|
+
export { createInMemoryWorkflowStateService } from "./workflow-state-service/memory.js";
|
|
6
|
+
export { createFileWorkflowStateService, pruneFileWorkflowStateStore } from "./workflow-state-service/file.js";
|
|
7
|
+
export { createSqliteWorkflowStateService } from "./workflow-state-service/sqlite.js";
|
|
8
|
+
export { createPostgresWorkflowStateService } from "./workflow-state-service/postgres.js";
|
|
36
9
|
//# sourceMappingURL=workflow-state-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-state-service.d.ts","sourceRoot":"","sources":["../src/workflow-state-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow-state-service.d.ts","sourceRoot":"","sources":["../src/workflow-state-service.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,oCAAoC,EAAE,MAAM,+BAA+B,CAAC;AACrF,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,0BAA0B,IAAI,mBAAmB,EAClD,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,kCAAkC,EACvC,4BAA4B,EAC5B,0BAA0B,EAC3B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kCAAkC,EACnC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,gCAAgC,EACjC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kCAAkC,EACnC,MAAM,sCAAsC,CAAC"}
|