videobook-engine 2.0.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 +214 -0
- package/dist/artifacts.d.ts +20 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +312 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/books.d.ts +7 -0
- package/dist/books.d.ts.map +1 -0
- package/dist/books.js +27 -0
- package/dist/books.js.map +1 -0
- package/dist/cas.d.ts +26 -0
- package/dist/cas.d.ts.map +1 -0
- package/dist/cas.js +139 -0
- package/dist/cas.js.map +1 -0
- package/dist/communications.d.ts +15 -0
- package/dist/communications.d.ts.map +1 -0
- package/dist/communications.js +139 -0
- package/dist/communications.js.map +1 -0
- package/dist/context.d.ts +42 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +197 -0
- package/dist/context.js.map +1 -0
- package/dist/domain.d.ts +32 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +399 -0
- package/dist/domain.js.map +1 -0
- package/dist/engine-types.d.ts +548 -0
- package/dist/engine-types.d.ts.map +1 -0
- package/dist/engine-types.js +10 -0
- package/dist/engine-types.js.map +1 -0
- package/dist/engine.d.ts +213 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +130 -0
- package/dist/engine.js.map +1 -0
- package/dist/files.d.ts +28 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +476 -0
- package/dist/files.js.map +1 -0
- package/dist/history-types.d.ts +74 -0
- package/dist/history-types.d.ts.map +1 -0
- package/dist/history-types.js +2 -0
- package/dist/history-types.js.map +1 -0
- package/dist/history.d.ts +20 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +921 -0
- package/dist/history.js.map +1 -0
- package/dist/ids.d.ts +4 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +14 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/job-queue.d.ts +51 -0
- package/dist/job-queue.d.ts.map +1 -0
- package/dist/job-queue.js +443 -0
- package/dist/job-queue.js.map +1 -0
- package/dist/media.d.ts +7 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +60 -0
- package/dist/media.js.map +1 -0
- package/dist/metadata.d.ts +21 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +222 -0
- package/dist/metadata.js.map +1 -0
- package/dist/notebook/types.d.ts +51 -0
- package/dist/notebook/types.d.ts.map +1 -0
- package/dist/notebook/types.js +2 -0
- package/dist/notebook/types.js.map +1 -0
- package/dist/resolver.d.ts +15 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +81 -0
- package/dist/resolver.js.map +1 -0
- package/dist/runtime-services.d.ts +65 -0
- package/dist/runtime-services.d.ts.map +1 -0
- package/dist/runtime-services.js +584 -0
- package/dist/runtime-services.js.map +1 -0
- package/dist/schema.d.ts +7 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +509 -0
- package/dist/schema.js.map +1 -0
- package/dist/similarity.d.ts +4 -0
- package/dist/similarity.d.ts.map +1 -0
- package/dist/similarity.js +1551 -0
- package/dist/similarity.js.map +1 -0
- package/dist/status.d.ts +9 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +231 -0
- package/dist/status.js.map +1 -0
- package/dist/storage.d.ts +7 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +129 -0
- package/dist/storage.js.map +1 -0
- package/dist/store.d.ts +55 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +378 -0
- package/dist/store.js.map +1 -0
- package/dist/timeline.d.ts +9 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +236 -0
- package/dist/timeline.js.map +1 -0
- package/docs/engine-layout.md +489 -0
- package/package.json +55 -0
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
import { v7 as uuidv7 } from "uuid";
|
|
2
|
+
import { ok } from "./engine-types.js";
|
|
3
|
+
import { resultOf, syncResultOf } from "./context.js";
|
|
4
|
+
import { SCHEMA_VERSION } from "./schema.js";
|
|
5
|
+
import { canonicalJson, parseJson } from "./store.js";
|
|
6
|
+
export function createRuntimeApi(context) {
|
|
7
|
+
const artifactWork = createArtifactWorkApi(context);
|
|
8
|
+
const pending = createPendingApi(context);
|
|
9
|
+
const failures = createFailuresApi(context);
|
|
10
|
+
const locks = createLocksApi(context);
|
|
11
|
+
const settings = createSettingsApi(context);
|
|
12
|
+
return {
|
|
13
|
+
artifactWork,
|
|
14
|
+
pending,
|
|
15
|
+
failures,
|
|
16
|
+
locks,
|
|
17
|
+
settings,
|
|
18
|
+
recoverArtifact: (artifact) => recoverArtifact(context, artifact),
|
|
19
|
+
recoverAll: () => recoverAll(context),
|
|
20
|
+
startReaper: (options) => startReaper(context, options),
|
|
21
|
+
checkSchema: () => ({
|
|
22
|
+
ok: true,
|
|
23
|
+
currentVersion: SCHEMA_VERSION,
|
|
24
|
+
supportedVersion: SCHEMA_VERSION,
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createSettingsApi(context) {
|
|
29
|
+
return {
|
|
30
|
+
get: (key) => {
|
|
31
|
+
const row = context.store.db
|
|
32
|
+
.prepare("SELECT value_json FROM runtime_settings WHERE key=?")
|
|
33
|
+
.get(settingKey(key));
|
|
34
|
+
return row ? parseJson(row.value_json, null) : null;
|
|
35
|
+
},
|
|
36
|
+
set: (key, value) => syncResultOf(() => {
|
|
37
|
+
const normalized = settingKey(key);
|
|
38
|
+
context.store.runtime((now) => {
|
|
39
|
+
context.store.db
|
|
40
|
+
.prepare(`INSERT INTO runtime_settings(key, value_json, updated_at)
|
|
41
|
+
VALUES (?, ?, ?)
|
|
42
|
+
ON CONFLICT(key) DO UPDATE SET
|
|
43
|
+
value_json=excluded.value_json, updated_at=excluded.updated_at`)
|
|
44
|
+
.run(normalized, canonicalJson(value), now);
|
|
45
|
+
});
|
|
46
|
+
return value;
|
|
47
|
+
}),
|
|
48
|
+
delete: (key) => syncResultOf(() => {
|
|
49
|
+
const normalized = settingKey(key);
|
|
50
|
+
return context.store.runtime(() => context.store.db
|
|
51
|
+
.prepare("DELETE FROM runtime_settings WHERE key=?")
|
|
52
|
+
.run(normalized).changes > 0);
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createLogsApi(context) {
|
|
57
|
+
return {
|
|
58
|
+
append: (name, line) => resultOf(async () => {
|
|
59
|
+
const id = context.store.runtime((now) => context.store.db
|
|
60
|
+
.prepare(`INSERT INTO runtime_logs(name, body_json, created_at)
|
|
61
|
+
VALUES (?, ?, ?)`)
|
|
62
|
+
.run(logName(name), canonicalJson(line), now).lastInsertRowid);
|
|
63
|
+
return String(id);
|
|
64
|
+
}),
|
|
65
|
+
read: (name, options = {}) => {
|
|
66
|
+
const rows = context.store.db
|
|
67
|
+
.prepare(`SELECT body_json FROM runtime_logs
|
|
68
|
+
WHERE name=? ORDER BY id DESC LIMIT ?`)
|
|
69
|
+
.all(logName(name), Math.max(1, options.limit ?? 100));
|
|
70
|
+
return rows.reverse().map((row) => parseJson(row.body_json, {}));
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function createArtifactWorkApi(context) {
|
|
75
|
+
return {
|
|
76
|
+
begin: (artifact, input) => {
|
|
77
|
+
const artifactRow = context.artifactRow(artifact);
|
|
78
|
+
return context.store.runtime((now) => {
|
|
79
|
+
const existing = context.store.db
|
|
80
|
+
.prepare("SELECT status, owner_id FROM runtime_artifact_views WHERE artifact_id=?")
|
|
81
|
+
.get(artifactRow.artifact_id);
|
|
82
|
+
if (existing?.owner_id ||
|
|
83
|
+
existing?.status === "working" ||
|
|
84
|
+
existing?.status === "error") {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const ownerId = uuidv7();
|
|
88
|
+
const deadline = now + Math.max(1, input.durationMs);
|
|
89
|
+
const pid = input.pid ?? (input.ownerKind === "job" ? process.pid : null);
|
|
90
|
+
const meta = {
|
|
91
|
+
kind: input.kind,
|
|
92
|
+
orientation: input.meta?.orientation ?? null,
|
|
93
|
+
queued: false,
|
|
94
|
+
progress: input.meta?.progress ?? null,
|
|
95
|
+
error: null,
|
|
96
|
+
...(input.meta ?? {}),
|
|
97
|
+
};
|
|
98
|
+
context.store.db
|
|
99
|
+
.prepare(`INSERT INTO runtime_artifact_views(
|
|
100
|
+
artifact_id, status, meta_json, owner_id, owner_kind, pid,
|
|
101
|
+
deadline_at, updated_at, fence
|
|
102
|
+
) VALUES (?, 'working', ?, ?, ?, ?, ?, ?, 1)
|
|
103
|
+
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
104
|
+
status='working', meta_json=excluded.meta_json,
|
|
105
|
+
owner_id=excluded.owner_id, owner_kind=excluded.owner_kind,
|
|
106
|
+
pid=excluded.pid, deadline_at=excluded.deadline_at,
|
|
107
|
+
updated_at=excluded.updated_at,
|
|
108
|
+
fence=runtime_artifact_views.fence+1`)
|
|
109
|
+
.run(artifactRow.artifact_id, canonicalJson(meta), ownerId, input.ownerKind, pid, deadline, now);
|
|
110
|
+
return { ownerId };
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
complete: (artifact, ownerId) => {
|
|
114
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
115
|
+
return context.store.runtime((now) => context.store.db
|
|
116
|
+
.prepare(`UPDATE runtime_artifact_views
|
|
117
|
+
SET status='ready', meta_json='{}', owner_id=NULL,
|
|
118
|
+
owner_kind=NULL, pid=NULL, deadline_at=NULL, updated_at=?
|
|
119
|
+
WHERE artifact_id=? AND owner_id=?`)
|
|
120
|
+
.run(now, artifactId, ownerId).changes > 0);
|
|
121
|
+
},
|
|
122
|
+
fail: (artifact, ownerId, failure) => failArtifactWork(context, artifact, ownerId, failure),
|
|
123
|
+
renew: (artifact, ownerId, extendMs) => {
|
|
124
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
125
|
+
return context.store.runtime((now) => context.store.db
|
|
126
|
+
.prepare(`UPDATE runtime_artifact_views
|
|
127
|
+
SET deadline_at=MAX(COALESCE(deadline_at, 0), ?), updated_at=?
|
|
128
|
+
WHERE artifact_id=? AND owner_id=? AND status='working'`)
|
|
129
|
+
.run(now + Math.max(1, extendMs), now, artifactId, ownerId).changes > 0);
|
|
130
|
+
},
|
|
131
|
+
markSeen: (artifact) => {
|
|
132
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
133
|
+
return context.store.runtime((now) => context.store.db
|
|
134
|
+
.prepare("UPDATE runtime_artifact_views SET seen_at=?, updated_at=? WHERE artifact_id=?")
|
|
135
|
+
.run(now, now, artifactId).changes > 0);
|
|
136
|
+
},
|
|
137
|
+
read: (artifact) => syncResultOf(() => {
|
|
138
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
139
|
+
const row = context.store.db
|
|
140
|
+
.prepare(`${VIEW_SELECT} WHERE artifact_id=?`)
|
|
141
|
+
.get(artifactId);
|
|
142
|
+
return row ? viewFromRow(context, row) : null;
|
|
143
|
+
}),
|
|
144
|
+
list: () => syncResultOf(() => {
|
|
145
|
+
const rows = context.store.db
|
|
146
|
+
.prepare(`${VIEW_SELECT} ORDER BY updated_at DESC`)
|
|
147
|
+
.all();
|
|
148
|
+
return rows.map((row) => viewFromRow(context, row));
|
|
149
|
+
}),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createPendingApi(context) {
|
|
153
|
+
return {
|
|
154
|
+
write: (input, expectedOwnerId) => resultOf(async () => {
|
|
155
|
+
const artifact = context.artifactRow(input.artifactId);
|
|
156
|
+
const value = context.store.runtime((now) => {
|
|
157
|
+
const existing = context.store.db
|
|
158
|
+
.prepare("SELECT task_id, owner_id FROM runtime_pending_tasks WHERE artifact_id=?")
|
|
159
|
+
.get(artifact.artifact_id);
|
|
160
|
+
if (existing && existing.owner_id !== null && existing.owner_id !== expectedOwnerId) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
context.store.db
|
|
164
|
+
.prepare(`INSERT INTO runtime_pending_tasks(
|
|
165
|
+
artifact_id, task_id, task_type, created_at, meta_json, completing, owner_id
|
|
166
|
+
) VALUES (?, ?, ?, ?, ?, 0, ?)
|
|
167
|
+
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
168
|
+
task_id=excluded.task_id, task_type=excluded.task_type,
|
|
169
|
+
created_at=excluded.created_at, meta_json=excluded.meta_json,
|
|
170
|
+
completing=0, owner_id=excluded.owner_id`)
|
|
171
|
+
.run(artifact.artifact_id, input.taskId, input.taskType, now, canonicalJson(input.meta ?? {}), expectedOwnerId);
|
|
172
|
+
return {
|
|
173
|
+
task: pendingFromRow(context, requiredPendingRow(context, artifact.artifact_id)),
|
|
174
|
+
inserted: !existing,
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
return value;
|
|
178
|
+
}),
|
|
179
|
+
read: (artifact) => syncResultOf(() => {
|
|
180
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
181
|
+
const row = context.store.db
|
|
182
|
+
.prepare(`${PENDING_SELECT} WHERE artifact_id=?`)
|
|
183
|
+
.get(artifactId);
|
|
184
|
+
return row ? pendingFromRow(context, row) : null;
|
|
185
|
+
}),
|
|
186
|
+
delete: (artifact, expectedTaskId) => syncResultOf(() => {
|
|
187
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
188
|
+
return context.store.runtime(() => {
|
|
189
|
+
const statement = expectedTaskId
|
|
190
|
+
? context.store.db.prepare("DELETE FROM runtime_pending_tasks WHERE artifact_id=? AND task_id=?")
|
|
191
|
+
: context.store.db.prepare("DELETE FROM runtime_pending_tasks WHERE artifact_id=?");
|
|
192
|
+
return statement.run(...(expectedTaskId ? [artifactId, expectedTaskId] : [artifactId])).changes > 0;
|
|
193
|
+
});
|
|
194
|
+
}),
|
|
195
|
+
markCompleting: (artifact) => updateCompleting(context, artifact, true),
|
|
196
|
+
clearCompleting: (artifact) => updateCompleting(context, artifact, false),
|
|
197
|
+
findAll: () => syncResultOf(() => {
|
|
198
|
+
const rows = context.store.db
|
|
199
|
+
.prepare(`${PENDING_SELECT} ORDER BY created_at, artifact_id`)
|
|
200
|
+
.all();
|
|
201
|
+
return rows.map((row) => pendingFromRow(context, row));
|
|
202
|
+
}),
|
|
203
|
+
findByExternalId: (taskId) => syncResultOf(() => {
|
|
204
|
+
const row = context.store.db
|
|
205
|
+
.prepare(`${PENDING_SELECT} WHERE task_id=?`)
|
|
206
|
+
.get(taskId);
|
|
207
|
+
return row ? pendingFromRow(context, row) : null;
|
|
208
|
+
}),
|
|
209
|
+
getOwner: (artifact, taskId) => {
|
|
210
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
211
|
+
const row = context.store.db
|
|
212
|
+
.prepare("SELECT owner_id FROM runtime_pending_tasks WHERE artifact_id=? AND task_id=?")
|
|
213
|
+
.get(artifactId, taskId);
|
|
214
|
+
return row?.owner_id ?? null;
|
|
215
|
+
},
|
|
216
|
+
fail: (artifact, taskOrInfo, maybeInfo) => failPending(context, artifact, typeof taskOrInfo === "string" ? taskOrInfo : undefined, typeof taskOrInfo === "string" ? maybeInfo : taskOrInfo),
|
|
217
|
+
forceFail: (artifact, info) => failPending(context, artifact, undefined, info, true),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function createFailuresApi(context) {
|
|
221
|
+
return {
|
|
222
|
+
write: (artifact, info) => writeFailure(context, artifact, info),
|
|
223
|
+
read: (artifact) => syncResultOf(() => {
|
|
224
|
+
const artifactId = context.artifactRow(artifact).artifact_id;
|
|
225
|
+
const row = context.store.db
|
|
226
|
+
.prepare(`${FAILURE_SELECT} WHERE artifact_id=?`)
|
|
227
|
+
.get(artifactId);
|
|
228
|
+
return row ? failureFromRow(context, row) : null;
|
|
229
|
+
}),
|
|
230
|
+
clear: (artifact) => clearFailure(context, artifact),
|
|
231
|
+
findAll: () => syncResultOf(() => {
|
|
232
|
+
const rows = context.store.db
|
|
233
|
+
.prepare(`${FAILURE_SELECT} ORDER BY failed_at DESC`)
|
|
234
|
+
.all();
|
|
235
|
+
return rows.map((row) => failureFromRow(context, row));
|
|
236
|
+
}),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function createLocksApi(context) {
|
|
240
|
+
return {
|
|
241
|
+
acquire: (resource, options) => resultOf(async () => {
|
|
242
|
+
const key = resourceKey(resource);
|
|
243
|
+
const ownerId = options.ownerId ?? uuidv7();
|
|
244
|
+
const value = context.store.runtime((now) => {
|
|
245
|
+
context.store.db
|
|
246
|
+
.prepare(`UPDATE runtime_resource_leases SET revoked_at=?, fence=fence+1
|
|
247
|
+
WHERE resource_key=? AND revoked_at IS NULL AND expires_at<=?`)
|
|
248
|
+
.run(now, key, now);
|
|
249
|
+
const active = context.store.db
|
|
250
|
+
.prepare(`${LEASE_SELECT} WHERE resource_key=? AND revoked_at IS NULL`)
|
|
251
|
+
.get(key);
|
|
252
|
+
if (active)
|
|
253
|
+
throw new Error(`Resource is locked: ${key}`);
|
|
254
|
+
const identity = workspaceIdentity(context, key);
|
|
255
|
+
const fenceRow = context.store.db
|
|
256
|
+
.prepare("SELECT COALESCE(MAX(fence), 0) AS fence FROM runtime_resource_leases WHERE resource_key=?")
|
|
257
|
+
.get(key);
|
|
258
|
+
const leaseId = uuidv7();
|
|
259
|
+
const fence = fenceRow.fence + 1;
|
|
260
|
+
context.store.db
|
|
261
|
+
.prepare(`INSERT INTO runtime_resource_leases(
|
|
262
|
+
lease_id, artifact_id, resource_key, owner_id, owner_kind,
|
|
263
|
+
pid, state, data_json, fence, acquired_at, expires_at, revoked_at
|
|
264
|
+
) VALUES (?, ?, ?, ?, 'process', ?, ?, ?, ?, ?, ?, NULL)`)
|
|
265
|
+
.run(leaseId, identity.artifactId, key, ownerId, process.pid, options.state ?? null, canonicalJson(options.data ?? {}), fence, now, now + Math.max(1, options.durationMs));
|
|
266
|
+
return requiredLease(context, leaseId);
|
|
267
|
+
});
|
|
268
|
+
return lockFromRow(value);
|
|
269
|
+
}),
|
|
270
|
+
release: (resource, ownerId) => syncResultOf(() => {
|
|
271
|
+
const key = resourceKey(resource);
|
|
272
|
+
return context.store.runtime((now) => {
|
|
273
|
+
const sql = ownerId
|
|
274
|
+
? `UPDATE runtime_resource_leases SET revoked_at=?, fence=fence+1
|
|
275
|
+
WHERE resource_key=? AND owner_id=? AND revoked_at IS NULL`
|
|
276
|
+
: `UPDATE runtime_resource_leases SET revoked_at=?, fence=fence+1
|
|
277
|
+
WHERE resource_key=? AND revoked_at IS NULL`;
|
|
278
|
+
return context.store.db
|
|
279
|
+
.prepare(sql)
|
|
280
|
+
.run(...(ownerId ? [now, key, ownerId] : [now, key])).changes > 0;
|
|
281
|
+
});
|
|
282
|
+
}),
|
|
283
|
+
isLocked: (resource) => {
|
|
284
|
+
const key = resourceKey(resource);
|
|
285
|
+
return Boolean(context.store.db
|
|
286
|
+
.prepare(`SELECT 1 AS present FROM runtime_resource_leases
|
|
287
|
+
WHERE resource_key=? AND revoked_at IS NULL AND expires_at>?`)
|
|
288
|
+
.get(key, Date.now()));
|
|
289
|
+
},
|
|
290
|
+
get: (resource) => {
|
|
291
|
+
const row = context.store.db
|
|
292
|
+
.prepare(`${LEASE_SELECT}
|
|
293
|
+
WHERE resource_key=? AND revoked_at IS NULL AND expires_at>?
|
|
294
|
+
ORDER BY fence DESC LIMIT 1`)
|
|
295
|
+
.get(resourceKey(resource), Date.now());
|
|
296
|
+
return row ? lockFromRow(row) : null;
|
|
297
|
+
},
|
|
298
|
+
cleanStale: (resource) => {
|
|
299
|
+
const key = resourceKey(resource);
|
|
300
|
+
return context.store.runtime((now) => context.store.db
|
|
301
|
+
.prepare(`UPDATE runtime_resource_leases SET revoked_at=?, fence=fence+1
|
|
302
|
+
WHERE resource_key=? AND revoked_at IS NULL AND expires_at<=?`)
|
|
303
|
+
.run(now, key, now).changes > 0);
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
async function failArtifactWork(context, artifactReference, ownerId, failure) {
|
|
308
|
+
const artifact = context.artifactRow(artifactReference);
|
|
309
|
+
const current = context.store.db
|
|
310
|
+
.prepare("SELECT owner_id FROM runtime_artifact_views WHERE artifact_id=?")
|
|
311
|
+
.get(artifact.artifact_id);
|
|
312
|
+
if (current?.owner_id !== ownerId)
|
|
313
|
+
return false;
|
|
314
|
+
const result = await writeFailure(context, artifactReference, {
|
|
315
|
+
message: failure.message,
|
|
316
|
+
...(failure.code ? { failCode: failure.code } : {}),
|
|
317
|
+
});
|
|
318
|
+
return result.ok;
|
|
319
|
+
}
|
|
320
|
+
async function failPending(context, artifactReference, expectedTaskId, info, force = false) {
|
|
321
|
+
return resultOf(async () => {
|
|
322
|
+
const artifact = context.artifactRow(artifactReference);
|
|
323
|
+
const pending = context.store.db
|
|
324
|
+
.prepare(`${PENDING_SELECT} WHERE artifact_id=?`)
|
|
325
|
+
.get(artifact.artifact_id);
|
|
326
|
+
if (!force && (!pending || (expectedTaskId !== undefined && pending.task_id !== expectedTaskId))) {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
const result = await writeFailure(context, artifactReference, info);
|
|
330
|
+
if (!result.ok)
|
|
331
|
+
throw new Error(result.error.message);
|
|
332
|
+
context.store.runtime(() => {
|
|
333
|
+
context.store.db
|
|
334
|
+
.prepare("DELETE FROM runtime_pending_tasks WHERE artifact_id=?")
|
|
335
|
+
.run(artifact.artifact_id);
|
|
336
|
+
});
|
|
337
|
+
return result.value;
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
async function writeFailure(context, artifactReference, info) {
|
|
341
|
+
return resultOf(async () => {
|
|
342
|
+
const artifact = context.artifactRow(artifactReference);
|
|
343
|
+
const mutation = await context.store.semantic({
|
|
344
|
+
operation: "artifact_failed",
|
|
345
|
+
artifactId: artifact.artifact_id,
|
|
346
|
+
details: { ...info },
|
|
347
|
+
writeSet: [`artifact-runtime:${artifact.artifact_id}`],
|
|
348
|
+
}, ["job_runs"], (_operationId, now) => {
|
|
349
|
+
context.store.db
|
|
350
|
+
.prepare(`INSERT INTO runtime_generation_errors(
|
|
351
|
+
artifact_id, message, fail_code, prompt, failed_at
|
|
352
|
+
) VALUES (?, ?, ?, ?, ?)
|
|
353
|
+
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
354
|
+
message=excluded.message, fail_code=excluded.fail_code,
|
|
355
|
+
prompt=excluded.prompt, failed_at=excluded.failed_at`)
|
|
356
|
+
.run(artifact.artifact_id, info.message, info.failCode ?? null, info.prompt ?? null, now);
|
|
357
|
+
context.store.db
|
|
358
|
+
.prepare(`INSERT INTO runtime_artifact_views(
|
|
359
|
+
artifact_id, status, meta_json, updated_at
|
|
360
|
+
) VALUES (?, 'error', ?, ?)
|
|
361
|
+
ON CONFLICT(artifact_id) DO UPDATE SET
|
|
362
|
+
status='error', meta_json=excluded.meta_json, owner_id=NULL,
|
|
363
|
+
owner_kind=NULL, pid=NULL, deadline_at=NULL,
|
|
364
|
+
updated_at=excluded.updated_at`)
|
|
365
|
+
.run(artifact.artifact_id, canonicalJson({
|
|
366
|
+
error: { message: info.message, code: info.failCode ?? null },
|
|
367
|
+
}), now);
|
|
368
|
+
context.store.db
|
|
369
|
+
.prepare(`INSERT INTO job_runs(
|
|
370
|
+
run_id, artifact_id, job_type, state, payload_json, result_json,
|
|
371
|
+
error_json, started_at, finished_at
|
|
372
|
+
) VALUES (?, ?, 'external', 'failed', '{}', NULL, ?, NULL, ?)`)
|
|
373
|
+
.run(uuidv7(), artifact.artifact_id, canonicalJson(info), now);
|
|
374
|
+
return now;
|
|
375
|
+
});
|
|
376
|
+
return ok({
|
|
377
|
+
artifactId: artifact.artifact_id,
|
|
378
|
+
artifactSlug: artifact.slug,
|
|
379
|
+
message: info.message,
|
|
380
|
+
...(info.failCode ? { failCode: info.failCode } : {}),
|
|
381
|
+
...(info.prompt !== undefined ? { prompt: info.prompt } : {}),
|
|
382
|
+
failedAt: mutation.value,
|
|
383
|
+
}, mutation.revision);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
async function clearFailure(context, artifactReference) {
|
|
387
|
+
return resultOf(async () => {
|
|
388
|
+
const artifact = context.artifactRow(artifactReference);
|
|
389
|
+
const exists = context.store.db
|
|
390
|
+
.prepare("SELECT 1 AS present FROM runtime_generation_errors WHERE artifact_id=?")
|
|
391
|
+
.get(artifact.artifact_id);
|
|
392
|
+
if (!exists)
|
|
393
|
+
return false;
|
|
394
|
+
const mutation = await context.store.semantic({
|
|
395
|
+
operation: "clear_artifact_failure",
|
|
396
|
+
artifactId: artifact.artifact_id,
|
|
397
|
+
writeSet: [`artifact-runtime:${artifact.artifact_id}`],
|
|
398
|
+
}, [], (_operationId, now) => {
|
|
399
|
+
context.store.db
|
|
400
|
+
.prepare("DELETE FROM runtime_generation_errors WHERE artifact_id=?")
|
|
401
|
+
.run(artifact.artifact_id);
|
|
402
|
+
context.store.db
|
|
403
|
+
.prepare(`UPDATE runtime_artifact_views
|
|
404
|
+
SET status='ready', meta_json='{}', owner_id=NULL, owner_kind=NULL,
|
|
405
|
+
pid=NULL, deadline_at=NULL, updated_at=? WHERE artifact_id=?`)
|
|
406
|
+
.run(now, artifact.artifact_id);
|
|
407
|
+
});
|
|
408
|
+
return ok(true, mutation.revision);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
function updateCompleting(context, artifactReference, completing) {
|
|
412
|
+
return syncResultOf(() => {
|
|
413
|
+
const artifactId = context.artifactRow(artifactReference).artifact_id;
|
|
414
|
+
return context.store.runtime(() => context.store.db
|
|
415
|
+
.prepare("UPDATE runtime_pending_tasks SET completing=? WHERE artifact_id=?")
|
|
416
|
+
.run(completing ? 1 : 0, artifactId).changes > 0);
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
function recoverArtifact(context, artifactReference) {
|
|
420
|
+
return syncResultOf(() => {
|
|
421
|
+
const artifact = context.artifactRow(artifactReference);
|
|
422
|
+
context.store.runtime((now) => {
|
|
423
|
+
context.store.db
|
|
424
|
+
.prepare(`INSERT OR IGNORE INTO runtime_artifact_views(
|
|
425
|
+
artifact_id, status, meta_json, updated_at
|
|
426
|
+
) VALUES (?, 'ready', '{}', ?)`)
|
|
427
|
+
.run(artifact.artifact_id, now);
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
function recoverAll(context) {
|
|
432
|
+
return syncResultOf(() => {
|
|
433
|
+
const artifacts = context.store.db
|
|
434
|
+
.prepare("SELECT artifact_id FROM artifacts")
|
|
435
|
+
.all();
|
|
436
|
+
const recovered = context.store.runtime((now) => {
|
|
437
|
+
let count = 0;
|
|
438
|
+
for (const artifact of artifacts) {
|
|
439
|
+
count += context.store.db
|
|
440
|
+
.prepare(`INSERT OR IGNORE INTO runtime_artifact_views(
|
|
441
|
+
artifact_id, status, meta_json, updated_at
|
|
442
|
+
) VALUES (?, 'ready', '{}', ?)`)
|
|
443
|
+
.run(artifact.artifact_id, now).changes;
|
|
444
|
+
}
|
|
445
|
+
return count;
|
|
446
|
+
});
|
|
447
|
+
return { recovered };
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
function startReaper(context, options) {
|
|
451
|
+
const timer = setInterval(() => {
|
|
452
|
+
context.store.runtime((now) => {
|
|
453
|
+
context.store.db
|
|
454
|
+
.prepare(`UPDATE runtime_resource_leases SET revoked_at=?, fence=fence+1
|
|
455
|
+
WHERE revoked_at IS NULL AND expires_at<=?`)
|
|
456
|
+
.run(now, now);
|
|
457
|
+
context.store.db
|
|
458
|
+
.prepare(`UPDATE runtime_artifact_views
|
|
459
|
+
SET status='error',
|
|
460
|
+
meta_json='{"error":{"message":"Work lease expired","code":"LEASE_EXPIRED"}}',
|
|
461
|
+
owner_id=NULL, owner_kind=NULL, pid=NULL, deadline_at=NULL,
|
|
462
|
+
updated_at=?, fence=fence+1
|
|
463
|
+
WHERE status='working' AND deadline_at IS NOT NULL AND deadline_at<=?`)
|
|
464
|
+
.run(now, now);
|
|
465
|
+
});
|
|
466
|
+
}, Math.max(50, options.intervalMs));
|
|
467
|
+
timer.unref?.();
|
|
468
|
+
return { stop: () => clearInterval(timer) };
|
|
469
|
+
}
|
|
470
|
+
function viewFromRow(context, row) {
|
|
471
|
+
const artifact = context.artifactRowById(row.artifact_id);
|
|
472
|
+
return {
|
|
473
|
+
artifactId: row.artifact_id,
|
|
474
|
+
slug: artifact.slug,
|
|
475
|
+
status: row.status,
|
|
476
|
+
meta: parseJson(row.meta_json, {}),
|
|
477
|
+
ownerId: row.owner_id,
|
|
478
|
+
ownerKind: row.owner_kind,
|
|
479
|
+
pid: row.pid,
|
|
480
|
+
deadlineAt: row.deadline_at,
|
|
481
|
+
updatedAt: row.updated_at,
|
|
482
|
+
seenAt: row.seen_at,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
function pendingFromRow(context, row) {
|
|
486
|
+
const artifact = context.artifactRowById(row.artifact_id);
|
|
487
|
+
return {
|
|
488
|
+
artifactId: row.artifact_id,
|
|
489
|
+
artifactSlug: artifact.slug,
|
|
490
|
+
taskId: row.task_id,
|
|
491
|
+
taskType: row.task_type,
|
|
492
|
+
workspacePath: context.artifactPath(row.artifact_id),
|
|
493
|
+
createdAt: row.created_at,
|
|
494
|
+
meta: parseJson(row.meta_json, {}),
|
|
495
|
+
completing: row.completing === 1,
|
|
496
|
+
ownerId: row.owner_id,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
function failureFromRow(context, row) {
|
|
500
|
+
const artifact = context.artifactRowById(row.artifact_id);
|
|
501
|
+
return {
|
|
502
|
+
artifactId: row.artifact_id,
|
|
503
|
+
artifactSlug: artifact.slug,
|
|
504
|
+
message: row.message,
|
|
505
|
+
...(row.fail_code ? { failCode: row.fail_code } : {}),
|
|
506
|
+
...(row.prompt !== null ? { prompt: row.prompt } : {}),
|
|
507
|
+
failedAt: row.failed_at,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function requiredPendingRow(context, artifactId) {
|
|
511
|
+
const row = context.store.db
|
|
512
|
+
.prepare(`${PENDING_SELECT} WHERE artifact_id=?`)
|
|
513
|
+
.get(artifactId);
|
|
514
|
+
if (!row)
|
|
515
|
+
throw new Error(`Pending task not found: ${artifactId}`);
|
|
516
|
+
return row;
|
|
517
|
+
}
|
|
518
|
+
function requiredLease(context, leaseId) {
|
|
519
|
+
const row = context.store.db
|
|
520
|
+
.prepare(`${LEASE_SELECT} WHERE lease_id=?`)
|
|
521
|
+
.get(leaseId);
|
|
522
|
+
if (!row)
|
|
523
|
+
throw new Error(`Lease not found: ${leaseId}`);
|
|
524
|
+
return row;
|
|
525
|
+
}
|
|
526
|
+
function lockFromRow(row) {
|
|
527
|
+
return {
|
|
528
|
+
id: row.lease_id,
|
|
529
|
+
resource: row.resource_key,
|
|
530
|
+
ownerId: row.owner_id,
|
|
531
|
+
created_at: row.acquired_at,
|
|
532
|
+
timeout_at: row.expires_at,
|
|
533
|
+
...(row.pid !== null ? { pid: row.pid } : {}),
|
|
534
|
+
...(row.state ? { state: row.state } : {}),
|
|
535
|
+
data: parseJson(row.data_json, {}),
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
function workspaceIdentity(context, resource) {
|
|
539
|
+
const row = context.store.db
|
|
540
|
+
.prepare(`SELECT artifact_id FROM runtime_workspace_entries
|
|
541
|
+
WHERE ?=path OR ? LIKE path || '/%'
|
|
542
|
+
ORDER BY length(path) DESC LIMIT 1`)
|
|
543
|
+
.get(resource, resource);
|
|
544
|
+
return { artifactId: row?.artifact_id ?? null };
|
|
545
|
+
}
|
|
546
|
+
function resourceKey(input) {
|
|
547
|
+
const key = input.trim();
|
|
548
|
+
if (!key)
|
|
549
|
+
throw new Error("Lock resource is required");
|
|
550
|
+
return key;
|
|
551
|
+
}
|
|
552
|
+
function settingKey(input) {
|
|
553
|
+
const key = input.trim();
|
|
554
|
+
if (key.length === 0 || key.length > 255 || /[\u0000-\u001f\u007f]/.test(key)) {
|
|
555
|
+
throw new Error("Invalid runtime setting key");
|
|
556
|
+
}
|
|
557
|
+
return key;
|
|
558
|
+
}
|
|
559
|
+
function logName(input) {
|
|
560
|
+
const name = input.trim();
|
|
561
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/.test(name)) {
|
|
562
|
+
throw new Error(`Invalid log name: ${input}`);
|
|
563
|
+
}
|
|
564
|
+
return name;
|
|
565
|
+
}
|
|
566
|
+
const VIEW_SELECT = `
|
|
567
|
+
SELECT artifact_id, status, meta_json, owner_id,
|
|
568
|
+
owner_kind, pid, deadline_at, updated_at, seen_at
|
|
569
|
+
FROM runtime_artifact_views
|
|
570
|
+
`;
|
|
571
|
+
const PENDING_SELECT = `
|
|
572
|
+
SELECT artifact_id, task_id, task_type, created_at, meta_json, completing, owner_id
|
|
573
|
+
FROM runtime_pending_tasks
|
|
574
|
+
`;
|
|
575
|
+
const FAILURE_SELECT = `
|
|
576
|
+
SELECT artifact_id, message, fail_code, prompt, failed_at
|
|
577
|
+
FROM runtime_generation_errors
|
|
578
|
+
`;
|
|
579
|
+
const LEASE_SELECT = `
|
|
580
|
+
SELECT lease_id, artifact_id, resource_key, owner_id,
|
|
581
|
+
pid, state, data_json, fence, acquired_at, expires_at
|
|
582
|
+
FROM runtime_resource_leases
|
|
583
|
+
`;
|
|
584
|
+
//# sourceMappingURL=runtime-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-services.js","sourceRoot":"","sources":["../src/runtime-services.ts"],"names":[],"mappings":"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"}
|