niceeval 0.16.3-canary.99 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/bootstrap.cjs +7 -1
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/project-configuration.cjs +8 -11
- package/dist/cli/project-configuration.cjs.map +1 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +1 -0
- package/dist/expect/index.d.mts +1 -0
- package/dist/expect/index.d.ts +1 -0
- package/dist/experiment/host/cli/contribution.cjs +6 -11
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +0 -16
- package/dist/experiment/host/cli/contribution.d.mts +0 -16
- package/dist/experiment/host/cli/contribution.d.ts +0 -16
- package/dist/experiment/host/operations.cjs +3 -3
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +0 -4
- package/dist/experiment/host/types.d.mts +0 -4
- package/dist/experiment/host/types.d.ts +0 -4
- package/dist/fresh-import.cjs +2 -2
- package/dist/fresh-import.cjs.map +1 -1
- package/dist/fresh-import.d.cts +3 -3
- package/dist/fresh-import.d.mts +3 -3
- package/dist/fresh-import.d.ts +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/inspection/codec.cjs.map +1 -1
- package/dist/inspection/codec.d.cts +1 -1
- package/dist/inspection/codec.d.mts +1 -1
- package/dist/inspection/codec.d.ts +1 -1
- package/dist/inspection/facts.cjs +66 -9
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/facts.d.cts +4 -0
- package/dist/inspection/facts.d.mts +4 -0
- package/dist/inspection/facts.d.ts +4 -0
- package/dist/inspection/facts.js +4 -2
- package/dist/inspection/index.cjs +1 -3
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -1
- package/dist/inspection/index.d.mts +1 -1
- package/dist/inspection/index.d.ts +1 -1
- package/dist/inspection/index.js +44 -48
- package/dist/inspection/limits.cjs +3 -1
- package/dist/inspection/limits.cjs.map +1 -1
- package/dist/inspection/limits.d.cts +2 -0
- package/dist/inspection/limits.d.mts +2 -0
- package/dist/inspection/limits.d.ts +2 -0
- package/dist/inspection/limits.js +6 -4
- package/dist/inspection/project-source.cjs +4 -1
- package/dist/inspection/project-source.cjs.map +1 -1
- package/dist/inspection/protocol.cjs +10 -18
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +111 -173
- package/dist/inspection/protocol.d.mts +111 -173
- package/dist/inspection/protocol.d.ts +111 -173
- package/dist/inspection/public.mjs +73 -109
- package/dist/inspection/results.cjs +12 -48
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +124 -122
- package/dist/inspection/results.d.mts +124 -122
- package/dist/inspection/results.d.ts +124 -122
- package/dist/inspection/results.js +16 -20
- package/dist/inspection/select.cjs +80 -117
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +14 -15
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/source.d.cts +6 -3
- package/dist/inspection/source.d.mts +6 -3
- package/dist/inspection/source.d.ts +6 -3
- package/dist/inspection/trace.cjs +1 -1
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/load-config.cjs +17 -11
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +3 -2
- package/dist/load-config.d.mts +3 -2
- package/dist/load-config.d.ts +3 -2
- package/dist/o11y/adapter-usage-projection.cjs +5 -1
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +109 -1
- package/dist/o11y/adapter-usage-projection.d.mts +109 -1
- package/dist/o11y/adapter-usage-projection.d.ts +109 -1
- package/dist/o11y/cache-read.cjs +113 -0
- package/dist/o11y/cache-read.cjs.map +1 -0
- package/dist/o11y/cache-read.d.cts +80 -0
- package/dist/o11y/cache-read.d.mts +80 -0
- package/dist/o11y/cache-read.d.ts +80 -0
- package/dist/o11y/cache-read.js +8 -0
- package/dist/o11y/cache-read.js.map +1 -0
- package/dist/o11y/eval-usage.cjs +4 -1
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +4 -1
- package/dist/o11y/eval-usage.d.mts +4 -1
- package/dist/o11y/eval-usage.d.ts +4 -1
- package/dist/record/host/sqlite-host.cjs +188 -53
- package/dist/record/host/sqlite-host.cjs.map +1 -1
- package/dist/record/host/sqlite-host.d.cts +37 -1
- package/dist/record/host/sqlite-host.d.mts +37 -1
- package/dist/record/host/sqlite-host.d.ts +37 -1
- package/dist/record/host/sqlite-host.js +16 -8
- package/dist/record/maintenance/runtime.cjs +3 -3
- package/dist/record/maintenance/runtime.cjs.map +1 -1
- package/dist/record/sqlite/admission-repository.cjs +18 -18
- package/dist/record/sqlite/admission-repository.cjs.map +1 -1
- package/dist/record/sqlite/case-repository.cjs +6 -6
- package/dist/record/sqlite/case-repository.cjs.map +1 -1
- package/dist/record/sqlite/coordination-repository.cjs +25 -25
- package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.cjs +115 -111
- package/dist/record/sqlite/current-schema.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.d.cts +3 -3
- package/dist/record/sqlite/current-schema.d.mts +3 -3
- package/dist/record/sqlite/current-schema.d.ts +3 -3
- package/dist/record/sqlite/database.cjs +56 -53
- package/dist/record/sqlite/database.cjs.map +1 -1
- package/dist/record/sqlite/index.cjs +3 -1
- package/dist/record/sqlite/index.cjs.map +1 -1
- package/dist/record/sqlite/index.d.cts +5 -2
- package/dist/record/sqlite/index.d.mts +5 -2
- package/dist/record/sqlite/index.d.ts +5 -2
- package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
- package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
- package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
- package/dist/record/sqlite/legacy-schema-018.js +6 -0
- package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
- package/dist/record/sqlite/migration.cjs +105 -46
- package/dist/record/sqlite/migration.cjs.map +1 -1
- package/dist/record/sqlite/migration.d.cts +2 -1
- package/dist/record/sqlite/migration.d.mts +2 -1
- package/dist/record/sqlite/migration.d.ts +2 -1
- package/dist/record/sqlite/portable-capture.cjs +13 -13
- package/dist/record/sqlite/portable-capture.cjs.map +1 -1
- package/dist/record/sqlite/registry-repository.cjs +22 -22
- package/dist/record/sqlite/registry-repository.cjs.map +1 -1
- package/dist/record/sqlite/schema.cjs +10 -2
- package/dist/record/sqlite/schema.cjs.map +1 -1
- package/dist/record/sqlite/schema.d.cts +4 -1
- package/dist/record/sqlite/schema.d.mts +4 -1
- package/dist/record/sqlite/schema.d.ts +4 -1
- package/dist/record/sqlite/schema.js +20 -14
- package/dist/record/sqlite/storage-worker.cjs +1 -1
- package/dist/record/sqlite/storage-worker.cjs.map +1 -1
- package/dist/record/sqlite/storage.cjs +316 -232
- package/dist/record/sqlite/storage.cjs.map +1 -1
- package/dist/record/sqlite/storage.d.cts +10 -2
- package/dist/record/sqlite/storage.d.mts +10 -2
- package/dist/record/sqlite/storage.d.ts +10 -2
- package/dist/record/sqlite/storage.js +54 -50
- package/dist/record/sqlite/types.cjs +1 -1
- package/dist/record/sqlite/types.cjs.map +1 -1
- package/dist/record/sqlite/types.d.cts +13 -1
- package/dist/record/sqlite/types.d.mts +13 -1
- package/dist/record/sqlite/types.d.ts +13 -1
- package/dist/run/cli/contribution.cjs +17 -12
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/lifecycle-adapter.cjs +1 -1
- package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
- package/dist/run/storage/owner-identity.cjs +78 -16
- package/dist/run/storage/owner-identity.cjs.map +1 -1
- package/dist/run/storage/owner-identity.d.cts +2 -1
- package/dist/run/storage/owner-identity.d.mts +2 -1
- package/dist/run/storage/owner-identity.d.ts +2 -1
- package/dist/run/storage/sqlite.cjs +55 -55
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/accept.cjs +12 -42
- package/dist/runner/accept.cjs.map +1 -1
- package/dist/runner/accept.d.cts +2 -3
- package/dist/runner/accept.d.mts +2 -3
- package/dist/runner/accept.d.ts +2 -3
- package/dist/runner/adapter-usage.cjs +2 -2
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adoption.cjs +14 -26
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/adoption.d.cts +5 -13
- package/dist/runner/adoption.d.mts +5 -13
- package/dist/runner/adoption.d.ts +5 -13
- package/dist/runner/adoption.js +2 -4
- package/dist/runner/record.cjs +24 -18
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/rename-experiment.cjs +5 -7
- package/dist/runner/rename-experiment.cjs.map +1 -1
- package/dist/runner/reuse-plan.cjs +37 -18
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/reuse-plan.d.cts +4 -1
- package/dist/runner/reuse-plan.d.mts +4 -1
- package/dist/runner/reuse-plan.d.ts +4 -1
- package/dist/runner/setup-prefix-plan.cjs +17 -12
- package/dist/runner/setup-prefix-plan.cjs.map +1 -1
- package/dist/runner/setup-prefix-plan.d.cts +0 -2
- package/dist/runner/setup-prefix-plan.d.mts +0 -2
- package/dist/runner/setup-prefix-plan.d.ts +0 -2
- package/dist/runner/setup-prefix-plan.js +8 -12
- package/dist/sandbox/backend.cjs +10 -1
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +16 -8
- package/dist/sandbox/backend.d.mts +16 -8
- package/dist/sandbox/backend.d.ts +16 -8
- package/dist/sandbox/backend.js +28 -26
- package/dist/sandbox/docker.cjs +7 -1
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.cjs +13 -3
- package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
- package/dist/sandbox/e2b-cache-repository.js +16 -12
- package/dist/sandbox/e2b.cjs +2 -2
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/incus/materialize.cjs +1 -1
- package/dist/sandbox/incus/materialize.cjs.map +1 -1
- package/dist/show/contribution.cjs +3 -3
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/model.cjs +14 -13
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +7 -7
- package/dist/show/model.d.mts +7 -7
- package/dist/show/model.d.ts +7 -7
- package/dist/show/render.cjs +14 -0
- package/dist/show/render.cjs.map +1 -1
- package/dist/user-database/storage-worker.cjs +13 -3
- package/dist/user-database/storage-worker.cjs.map +1 -1
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/application-runtime.cjs +8 -0
- package/dist/view/application-runtime.cjs.map +1 -0
- package/dist/view/application-runtime.d.cts +9 -0
- package/dist/view/application-runtime.d.mts +9 -0
- package/dist/view/application-runtime.d.ts +9 -0
- package/dist/view/application-runtime.js +6 -0
- package/dist/view/application-runtime.js.map +1 -0
- package/dist/view/cli/contribution.cjs +5 -2
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/cli/contribution.d.cts +2 -1
- package/dist/view/cli/contribution.d.mts +2 -1
- package/dist/view/cli/contribution.d.ts +2 -1
- package/dist/view/function-runtime.mjs +1019 -456
- package/dist/view/http-protocol.d.cts +1 -9
- package/dist/view/http-protocol.d.mts +1 -9
- package/dist/view/http-protocol.d.ts +1 -9
- package/dist/view/inspection-host.cjs +39 -30
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +7545 -2
- package/dist/view/inspection-host.d.mts +7545 -2
- package/dist/view/inspection-host.d.ts +7545 -2
- package/dist/view/server.cjs +8 -5
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +4 -2
- package/dist/view/server.d.mts +4 -2
- package/dist/view/server.d.ts +4 -2
- package/docs-site/zh/reference/cli.mdx +1 -2
- package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
- package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
- package/package.json +1 -1
|
@@ -33,32 +33,32 @@ function teardownRow(row, owner) {
|
|
|
33
33
|
}
|
|
34
34
|
function putTeardownObligation(input) {
|
|
35
35
|
return withConnection(input.connection, (connection) => {
|
|
36
|
-
(0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
36
|
+
(0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_teardown_obligations(
|
|
37
37
|
obligation_id,experiment_id,owner_pid,owner_host,generation,payload) VALUES(?,?,?,?,1,?)
|
|
38
38
|
ON CONFLICT(obligation_id) DO UPDATE SET owner_host=excluded.owner_host,
|
|
39
|
-
generation=
|
|
39
|
+
generation=ne19_teardown_obligations.generation+1,payload=excluded.payload`)
|
|
40
40
|
.run(input.id, input.experimentId, input.ownerPid, input.ownerHost, input.payload);
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
function getTeardownObligation(connection, id) {
|
|
44
44
|
return withConnection(connection, (connection) => {
|
|
45
45
|
const row = (0, database_ts_1.recordStatement)(connection, `SELECT obligation_id,generation,payload
|
|
46
|
-
FROM
|
|
46
|
+
FROM ne19_teardown_obligations WHERE obligation_id=?`).get(id);
|
|
47
47
|
return row === undefined ? undefined : teardownRow(row, `teardown obligation ${id}`);
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
function listTeardownObligations(connection) {
|
|
51
51
|
return withConnection(connection, (connection) => (0, database_ts_1.recordStatement)(connection, `SELECT obligation_id,generation,payload
|
|
52
|
-
FROM
|
|
52
|
+
FROM ne19_teardown_obligations ORDER BY experiment_id,owner_pid`).all()
|
|
53
53
|
.map((row) => teardownRow(row, "teardown obligation")));
|
|
54
54
|
}
|
|
55
55
|
function claimTeardownObligation(connection, id) {
|
|
56
56
|
return withConnection(connection, (connection) => {
|
|
57
|
-
const row = (0, database_ts_1.recordStatement)(connection, `SELECT generation FROM
|
|
57
|
+
const row = (0, database_ts_1.recordStatement)(connection, `SELECT generation FROM ne19_teardown_obligations
|
|
58
58
|
WHERE obligation_id=?`).get(id);
|
|
59
59
|
if (row === undefined)
|
|
60
60
|
return false;
|
|
61
|
-
const removed = (0, database_ts_1.recordStatement)(connection, `DELETE FROM
|
|
61
|
+
const removed = (0, database_ts_1.recordStatement)(connection, `DELETE FROM ne19_teardown_obligations
|
|
62
62
|
WHERE obligation_id=? AND generation=?`).run(id, Number(row.generation));
|
|
63
63
|
return Number(removed.changes) === 1;
|
|
64
64
|
});
|
|
@@ -72,16 +72,16 @@ function sharedStateRow(row, key) {
|
|
|
72
72
|
}
|
|
73
73
|
function listSharedStateGenerations(connection, key) {
|
|
74
74
|
return withConnection(connection, (connection) => (0, database_ts_1.recordStatement)(connection, `SELECT generation,state_kind,payload,heartbeat_at
|
|
75
|
-
FROM
|
|
75
|
+
FROM ne19_shared_state_generations WHERE state_key=? ORDER BY generation`).all(key)
|
|
76
76
|
.map((row) => sharedStateRow(row, key)));
|
|
77
77
|
}
|
|
78
78
|
function appendSharedStateGeneration(input) {
|
|
79
79
|
return withConnection(input.connection, (connection) => {
|
|
80
80
|
const head = (0, database_ts_1.recordStatement)(connection, `SELECT coalesce(max(generation),0) AS generation
|
|
81
|
-
FROM
|
|
81
|
+
FROM ne19_shared_state_generations WHERE state_key=?`).get(input.key);
|
|
82
82
|
if (Number(head.generation) !== input.expectedGeneration)
|
|
83
83
|
return false;
|
|
84
|
-
const inserted = (0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
84
|
+
const inserted = (0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_shared_state_generations(
|
|
85
85
|
state_key,generation,parent_generation,state_kind,owner_token,owner_pid,owner_host,
|
|
86
86
|
owner_process_identity,heartbeat_at,payload) VALUES(?,?,?,?,?,?,?,?,?,?)`)
|
|
87
87
|
.run(input.key, input.generation, input.parentGeneration, input.kind, input.ownerToken, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.heartbeatAt, input.payload);
|
|
@@ -90,40 +90,40 @@ function appendSharedStateGeneration(input) {
|
|
|
90
90
|
}
|
|
91
91
|
function updateSharedStateHeartbeat(input) {
|
|
92
92
|
return withConnection(input.connection, (connection) => {
|
|
93
|
-
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
93
|
+
const changed = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_shared_state_generations
|
|
94
94
|
SET heartbeat_at=? WHERE state_key=? AND generation=? AND owner_token=?
|
|
95
95
|
AND state_kind IN ('active','recovering')
|
|
96
|
-
AND generation=(SELECT max(generation) FROM
|
|
96
|
+
AND generation=(SELECT max(generation) FROM ne19_shared_state_generations WHERE state_key=?)`)
|
|
97
97
|
.run(input.heartbeatAt, input.key, input.generation, input.ownerToken, input.key);
|
|
98
98
|
return Number(changed.changes) === 1;
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
function putKeptSandbox(input) {
|
|
102
102
|
return withConnection(input.connection, (connection) => {
|
|
103
|
-
(0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
103
|
+
(0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_kept_sandboxes(entry_id,provider,sandbox_id,kept_at,payload)
|
|
104
104
|
VALUES(?,?,?,?,?) ON CONFLICT(entry_id) DO UPDATE SET kept_at=excluded.kept_at,payload=excluded.payload`)
|
|
105
105
|
.run(input.id, input.provider, input.sandboxId, input.keptAt, input.payload);
|
|
106
106
|
});
|
|
107
107
|
}
|
|
108
108
|
function getKeptSandbox(connection, id) {
|
|
109
109
|
return withConnection(connection, (connection) => {
|
|
110
|
-
const row = (0, database_ts_1.recordStatement)(connection, "SELECT entry_id,payload FROM
|
|
110
|
+
const row = (0, database_ts_1.recordStatement)(connection, "SELECT entry_id,payload FROM ne19_kept_sandboxes WHERE entry_id=?")
|
|
111
111
|
.get(id);
|
|
112
112
|
return row === undefined ? undefined : { id: String(row.entry_id), payload: payload(row.payload, `kept sandbox ${id}`) };
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
115
|
function listKeptSandboxes(connection) {
|
|
116
116
|
return withConnection(connection, (connection) => (0, database_ts_1.recordStatement)(connection, `SELECT entry_id,payload
|
|
117
|
-
FROM
|
|
117
|
+
FROM ne19_kept_sandboxes ORDER BY kept_at,entry_id`).all().map((row) => ({
|
|
118
118
|
id: String(row.entry_id), payload: payload(row.payload, "kept sandbox"),
|
|
119
119
|
})));
|
|
120
120
|
}
|
|
121
121
|
function updateKeptSandbox(connection, id, value) {
|
|
122
|
-
return withConnection(connection, (connection) => Number((0, database_ts_1.recordStatement)(connection, "UPDATE
|
|
122
|
+
return withConnection(connection, (connection) => Number((0, database_ts_1.recordStatement)(connection, "UPDATE ne19_kept_sandboxes SET payload=? WHERE entry_id=?").run(value, id).changes) === 1);
|
|
123
123
|
}
|
|
124
124
|
function deleteKeptSandbox(connection, id) {
|
|
125
125
|
return withConnection(connection, (connection) => {
|
|
126
|
-
(0, database_ts_1.recordStatement)(connection, "DELETE FROM
|
|
126
|
+
(0, database_ts_1.recordStatement)(connection, "DELETE FROM ne19_kept_sandboxes WHERE entry_id=?").run(id);
|
|
127
127
|
});
|
|
128
128
|
}
|
|
129
129
|
function keptLeaseRow(row) {
|
|
@@ -136,32 +136,32 @@ function keptLeaseRow(row) {
|
|
|
136
136
|
}
|
|
137
137
|
function getKeptSandboxLease(connection, id) {
|
|
138
138
|
return withConnection(connection, (connection) => {
|
|
139
|
-
const row = (0, database_ts_1.recordStatement)(connection, `SELECT * FROM
|
|
139
|
+
const row = (0, database_ts_1.recordStatement)(connection, `SELECT * FROM ne19_kept_sandbox_operation_leases
|
|
140
140
|
WHERE entry_id=?`).get(id);
|
|
141
141
|
return row === undefined ? undefined : keptLeaseRow(row);
|
|
142
142
|
});
|
|
143
143
|
}
|
|
144
144
|
function acquireKeptSandboxLease(input) {
|
|
145
145
|
return withConnection(input.connection, (connection) => {
|
|
146
|
-
const current = (0, database_ts_1.recordStatement)(connection, `SELECT * FROM
|
|
146
|
+
const current = (0, database_ts_1.recordStatement)(connection, `SELECT * FROM ne19_kept_sandbox_operation_leases
|
|
147
147
|
WHERE entry_id=?`).get(input.id);
|
|
148
148
|
if (current !== undefined)
|
|
149
149
|
return { acquired: false, lease: keptLeaseRow(current) };
|
|
150
|
-
const advanced = (0, database_ts_1.recordStatement)(connection, `UPDATE
|
|
150
|
+
const advanced = (0, database_ts_1.recordStatement)(connection, `UPDATE ne19_kept_sandboxes SET operation_generation=operation_generation+1
|
|
151
151
|
WHERE entry_id=?`).run(input.id);
|
|
152
152
|
if (Number(advanced.changes) !== 1)
|
|
153
153
|
throw new Error(`kept sandbox ${input.id} is missing`);
|
|
154
|
-
const row = (0, database_ts_1.recordStatement)(connection, "SELECT operation_generation FROM
|
|
154
|
+
const row = (0, database_ts_1.recordStatement)(connection, "SELECT operation_generation FROM ne19_kept_sandboxes WHERE entry_id=?")
|
|
155
155
|
.get(input.id);
|
|
156
156
|
const generation = Number(row.operation_generation);
|
|
157
|
-
(0, database_ts_1.recordStatement)(connection, `INSERT INTO
|
|
157
|
+
(0, database_ts_1.recordStatement)(connection, `INSERT INTO ne19_kept_sandbox_operation_leases(entry_id,generation,token,holder,
|
|
158
158
|
owner_pid,owner_host,owner_process_identity,operation,acquired_at,ttl_ms) VALUES(?,?,?,?,?,?,?,?,?,?)`)
|
|
159
159
|
.run(input.id, generation, input.token, input.holder, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.operation, input.acquiredAt, input.ttlMs);
|
|
160
160
|
return { acquired: true, generation };
|
|
161
161
|
});
|
|
162
162
|
}
|
|
163
163
|
function releaseKeptSandboxLease(input) {
|
|
164
|
-
return withConnection(input.connection, (connection) => Number((0, database_ts_1.recordStatement)(connection, `DELETE FROM
|
|
164
|
+
return withConnection(input.connection, (connection) => Number((0, database_ts_1.recordStatement)(connection, `DELETE FROM ne19_kept_sandbox_operation_leases WHERE entry_id=? AND generation=? AND token=?
|
|
165
165
|
AND owner_pid=? AND owner_host=? AND owner_process_identity=?`)
|
|
166
166
|
.run(input.id, input.generation, input.token, input.ownerPid, input.ownerHost, input.ownerProcessIdentity).changes) === 1);
|
|
167
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-repository.js","sourceRoot":"","sources":["registry-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SQLOutputValue } from \"node:sqlite\";\nimport { recordStatement, type RecordDatabase } from \"./database.ts\";\ntype Row = Readonly<Record<string, SQLOutputValue>>;\nfunction withConnection<A>(connection: RecordDatabase, body: (connection: RecordDatabase) => A): A {\n return body(connection);\n}\nfunction payload(value: SQLOutputValue, owner: string): Uint8Array {\n if (!(value instanceof Uint8Array))\n throw new Error(`${owner} payload is not a SQLite BLOB`);\n return value;\n}\nexport interface TeardownObligationRow {\n readonly id: string;\n readonly generation: number;\n readonly payload: Uint8Array;\n}\nfunction teardownRow(row: Row, owner: string): TeardownObligationRow {\n return {\n id: String(row.obligation_id),\n generation: Number(row.generation),\n payload: payload(row.payload, owner),\n };\n}\nexport function putTeardownObligation(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly experimentId: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n recordStatement(connection, `INSERT INTO ne18_teardown_obligations(\n obligation_id,experiment_id,owner_pid,owner_host,generation,payload) VALUES(?,?,?,?,1,?)\n ON CONFLICT(obligation_id) DO UPDATE SET owner_host=excluded.owner_host,\n generation=ne18_teardown_obligations.generation+1,payload=excluded.payload`)\n .run(input.id, input.experimentId, input.ownerPid, input.ownerHost, input.payload);\n });\n}\nexport function getTeardownObligation(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT obligation_id,generation,payload\n FROM ne18_teardown_obligations WHERE obligation_id=?`).get(id) as Row | undefined;\n return row === undefined ? undefined : teardownRow(row, `teardown obligation ${id}`);\n });\n}\nexport function listTeardownObligations(connection: RecordDatabase) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT obligation_id,generation,payload\n FROM ne18_teardown_obligations ORDER BY experiment_id,owner_pid`).all() as Row[])\n .map((row) => teardownRow(row, \"teardown obligation\")));\n}\nexport function claimTeardownObligation(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT generation FROM ne18_teardown_obligations\n WHERE obligation_id=?`).get(id) as Row | undefined;\n if (row === undefined)\n return false;\n const removed = recordStatement(connection, `DELETE FROM ne18_teardown_obligations\n WHERE obligation_id=? AND generation=?`).run(id, Number(row.generation));\n return Number(removed.changes) === 1;\n });\n}\nexport interface SharedStateGenerationRow {\n readonly generation: number;\n readonly kind: \"active\" | \"recovering\" | \"free\";\n readonly payload: Uint8Array;\n readonly heartbeatAt: string;\n}\nfunction sharedStateRow(row: Row, key: string): SharedStateGenerationRow {\n const kind = String(row.state_kind);\n if (kind !== \"active\" && kind !== \"recovering\" && kind !== \"free\") {\n throw new Error(`sharedState ${JSON.stringify(key)} has an invalid generation kind`);\n }\n return { generation: Number(row.generation), kind, payload: payload(row.payload, \"sharedState generation\"), heartbeatAt: String(row.heartbeat_at) };\n}\nexport function listSharedStateGenerations(connection: RecordDatabase, key: string) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT generation,state_kind,payload,heartbeat_at\n FROM ne18_shared_state_generations WHERE state_key=? ORDER BY generation`).all(key) as Row[])\n .map((row) => sharedStateRow(row, key)));\n}\nexport function appendSharedStateGeneration(input: {\n readonly connection: RecordDatabase;\n readonly key: string;\n readonly expectedGeneration: number;\n readonly generation: number;\n readonly parentGeneration: number;\n readonly kind: \"active\" | \"recovering\" | \"free\";\n readonly ownerToken: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n readonly heartbeatAt: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n const head = recordStatement(connection, `SELECT coalesce(max(generation),0) AS generation\n FROM ne18_shared_state_generations WHERE state_key=?`).get(input.key) as Row;\n if (Number(head.generation) !== input.expectedGeneration)\n return false;\n const inserted = recordStatement(connection, `INSERT INTO ne18_shared_state_generations(\n state_key,generation,parent_generation,state_kind,owner_token,owner_pid,owner_host,\n owner_process_identity,heartbeat_at,payload) VALUES(?,?,?,?,?,?,?,?,?,?)`)\n .run(input.key, input.generation, input.parentGeneration, input.kind, input.ownerToken, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.heartbeatAt, input.payload);\n return Number(inserted.changes) === 1;\n });\n}\nexport function updateSharedStateHeartbeat(input: {\n readonly connection: RecordDatabase;\n readonly key: string;\n readonly generation: number;\n readonly ownerToken: string;\n readonly heartbeatAt: string;\n}) {\n return withConnection(input.connection, (connection) => {\n const changed = recordStatement(connection, `UPDATE ne18_shared_state_generations\n SET heartbeat_at=? WHERE state_key=? AND generation=? AND owner_token=?\n AND state_kind IN ('active','recovering')\n AND generation=(SELECT max(generation) FROM ne18_shared_state_generations WHERE state_key=?)`)\n .run(input.heartbeatAt, input.key, input.generation, input.ownerToken, input.key);\n return Number(changed.changes) === 1;\n });\n}\nexport interface KeptSandboxRow {\n readonly id: string;\n readonly payload: Uint8Array;\n}\nexport function putKeptSandbox(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly provider: string;\n readonly sandboxId: string;\n readonly keptAt: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n recordStatement(connection, `INSERT INTO ne18_kept_sandboxes(entry_id,provider,sandbox_id,kept_at,payload)\n VALUES(?,?,?,?,?) ON CONFLICT(entry_id) DO UPDATE SET kept_at=excluded.kept_at,payload=excluded.payload`)\n .run(input.id, input.provider, input.sandboxId, input.keptAt, input.payload);\n });\n}\nexport function getKeptSandbox(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, \"SELECT entry_id,payload FROM ne18_kept_sandboxes WHERE entry_id=?\")\n .get(id) as Row | undefined;\n return row === undefined ? undefined : { id: String(row.entry_id), payload: payload(row.payload, `kept sandbox ${id}`) };\n });\n}\nexport function listKeptSandboxes(connection: RecordDatabase) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT entry_id,payload\n FROM ne18_kept_sandboxes ORDER BY kept_at,entry_id`).all() as Row[]).map((row) => ({\n id: String(row.entry_id), payload: payload(row.payload, \"kept sandbox\"),\n })));\n}\nexport function updateKeptSandbox(connection: RecordDatabase, id: string, value: Uint8Array) {\n return withConnection(connection, (connection) => Number(recordStatement(connection, \"UPDATE ne18_kept_sandboxes SET payload=? WHERE entry_id=?\").run(value, id).changes) === 1);\n}\nexport function deleteKeptSandbox(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n recordStatement(connection, \"DELETE FROM ne18_kept_sandboxes WHERE entry_id=?\").run(id);\n });\n}\nexport interface KeptSandboxLeaseRow {\n readonly generation: number;\n readonly token: string;\n readonly holder: string;\n readonly operation: string;\n readonly acquiredAt: string;\n readonly ttlMs: number;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}\nfunction keptLeaseRow(row: Row): KeptSandboxLeaseRow {\n return {\n generation: Number(row.generation), token: String(row.token), holder: String(row.holder),\n operation: String(row.operation), acquiredAt: String(row.acquired_at), ttlMs: Number(row.ttl_ms),\n ownerPid: Number(row.owner_pid), ownerHost: String(row.owner_host),\n ownerProcessIdentity: String(row.owner_process_identity),\n };\n}\nexport function getKeptSandboxLease(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT * FROM ne18_kept_sandbox_operation_leases\n WHERE entry_id=?`).get(id) as Row | undefined;\n return row === undefined ? undefined : keptLeaseRow(row);\n });\n}\nexport function acquireKeptSandboxLease(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly token: string;\n readonly holder: string;\n readonly operation: string;\n readonly acquiredAt: string;\n readonly ttlMs: number;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}) {\n return withConnection(input.connection, (connection) => {\n const current = recordStatement(connection, `SELECT * FROM ne18_kept_sandbox_operation_leases\n WHERE entry_id=?`).get(input.id) as Row | undefined;\n if (current !== undefined)\n return { acquired: false as const, lease: keptLeaseRow(current) };\n const advanced = recordStatement(connection, `UPDATE ne18_kept_sandboxes SET operation_generation=operation_generation+1\n WHERE entry_id=?`).run(input.id);\n if (Number(advanced.changes) !== 1)\n throw new Error(`kept sandbox ${input.id} is missing`);\n const row = recordStatement(connection, \"SELECT operation_generation FROM ne18_kept_sandboxes WHERE entry_id=?\")\n .get(input.id) as Row;\n const generation = Number(row.operation_generation);\n recordStatement(connection, `INSERT INTO ne18_kept_sandbox_operation_leases(entry_id,generation,token,holder,\n owner_pid,owner_host,owner_process_identity,operation,acquired_at,ttl_ms) VALUES(?,?,?,?,?,?,?,?,?,?)`)\n .run(input.id, generation, input.token, input.holder, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.operation, input.acquiredAt, input.ttlMs);\n return { acquired: true as const, generation };\n });\n}\nexport function releaseKeptSandboxLease(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly generation: number;\n readonly token: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}) {\n return withConnection(input.connection, (connection) => Number(recordStatement(connection, `DELETE FROM ne18_kept_sandbox_operation_leases WHERE entry_id=? AND generation=? AND token=?\n AND owner_pid=? AND owner_host=? AND owner_process_identity=?`)\n .run(input.id, input.generation, input.token, input.ownerPid, input.ownerHost, input.ownerProcessIdentity).changes) === 1);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"registry-repository.js","sourceRoot":"","sources":["registry-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SQLOutputValue } from \"node:sqlite\";\nimport { recordStatement, type RecordDatabase } from \"./database.ts\";\ntype Row = Readonly<Record<string, SQLOutputValue>>;\nfunction withConnection<A>(connection: RecordDatabase, body: (connection: RecordDatabase) => A): A {\n return body(connection);\n}\nfunction payload(value: SQLOutputValue, owner: string): Uint8Array {\n if (!(value instanceof Uint8Array))\n throw new Error(`${owner} payload is not a SQLite BLOB`);\n return value;\n}\nexport interface TeardownObligationRow {\n readonly id: string;\n readonly generation: number;\n readonly payload: Uint8Array;\n}\nfunction teardownRow(row: Row, owner: string): TeardownObligationRow {\n return {\n id: String(row.obligation_id),\n generation: Number(row.generation),\n payload: payload(row.payload, owner),\n };\n}\nexport function putTeardownObligation(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly experimentId: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n recordStatement(connection, `INSERT INTO ne19_teardown_obligations(\n obligation_id,experiment_id,owner_pid,owner_host,generation,payload) VALUES(?,?,?,?,1,?)\n ON CONFLICT(obligation_id) DO UPDATE SET owner_host=excluded.owner_host,\n generation=ne19_teardown_obligations.generation+1,payload=excluded.payload`)\n .run(input.id, input.experimentId, input.ownerPid, input.ownerHost, input.payload);\n });\n}\nexport function getTeardownObligation(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT obligation_id,generation,payload\n FROM ne19_teardown_obligations WHERE obligation_id=?`).get(id) as Row | undefined;\n return row === undefined ? undefined : teardownRow(row, `teardown obligation ${id}`);\n });\n}\nexport function listTeardownObligations(connection: RecordDatabase) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT obligation_id,generation,payload\n FROM ne19_teardown_obligations ORDER BY experiment_id,owner_pid`).all() as Row[])\n .map((row) => teardownRow(row, \"teardown obligation\")));\n}\nexport function claimTeardownObligation(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT generation FROM ne19_teardown_obligations\n WHERE obligation_id=?`).get(id) as Row | undefined;\n if (row === undefined)\n return false;\n const removed = recordStatement(connection, `DELETE FROM ne19_teardown_obligations\n WHERE obligation_id=? AND generation=?`).run(id, Number(row.generation));\n return Number(removed.changes) === 1;\n });\n}\nexport interface SharedStateGenerationRow {\n readonly generation: number;\n readonly kind: \"active\" | \"recovering\" | \"free\";\n readonly payload: Uint8Array;\n readonly heartbeatAt: string;\n}\nfunction sharedStateRow(row: Row, key: string): SharedStateGenerationRow {\n const kind = String(row.state_kind);\n if (kind !== \"active\" && kind !== \"recovering\" && kind !== \"free\") {\n throw new Error(`sharedState ${JSON.stringify(key)} has an invalid generation kind`);\n }\n return { generation: Number(row.generation), kind, payload: payload(row.payload, \"sharedState generation\"), heartbeatAt: String(row.heartbeat_at) };\n}\nexport function listSharedStateGenerations(connection: RecordDatabase, key: string) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT generation,state_kind,payload,heartbeat_at\n FROM ne19_shared_state_generations WHERE state_key=? ORDER BY generation`).all(key) as Row[])\n .map((row) => sharedStateRow(row, key)));\n}\nexport function appendSharedStateGeneration(input: {\n readonly connection: RecordDatabase;\n readonly key: string;\n readonly expectedGeneration: number;\n readonly generation: number;\n readonly parentGeneration: number;\n readonly kind: \"active\" | \"recovering\" | \"free\";\n readonly ownerToken: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n readonly heartbeatAt: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n const head = recordStatement(connection, `SELECT coalesce(max(generation),0) AS generation\n FROM ne19_shared_state_generations WHERE state_key=?`).get(input.key) as Row;\n if (Number(head.generation) !== input.expectedGeneration)\n return false;\n const inserted = recordStatement(connection, `INSERT INTO ne19_shared_state_generations(\n state_key,generation,parent_generation,state_kind,owner_token,owner_pid,owner_host,\n owner_process_identity,heartbeat_at,payload) VALUES(?,?,?,?,?,?,?,?,?,?)`)\n .run(input.key, input.generation, input.parentGeneration, input.kind, input.ownerToken, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.heartbeatAt, input.payload);\n return Number(inserted.changes) === 1;\n });\n}\nexport function updateSharedStateHeartbeat(input: {\n readonly connection: RecordDatabase;\n readonly key: string;\n readonly generation: number;\n readonly ownerToken: string;\n readonly heartbeatAt: string;\n}) {\n return withConnection(input.connection, (connection) => {\n const changed = recordStatement(connection, `UPDATE ne19_shared_state_generations\n SET heartbeat_at=? WHERE state_key=? AND generation=? AND owner_token=?\n AND state_kind IN ('active','recovering')\n AND generation=(SELECT max(generation) FROM ne19_shared_state_generations WHERE state_key=?)`)\n .run(input.heartbeatAt, input.key, input.generation, input.ownerToken, input.key);\n return Number(changed.changes) === 1;\n });\n}\nexport interface KeptSandboxRow {\n readonly id: string;\n readonly payload: Uint8Array;\n}\nexport function putKeptSandbox(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly provider: string;\n readonly sandboxId: string;\n readonly keptAt: string;\n readonly payload: Uint8Array;\n}) {\n return withConnection(input.connection, (connection) => {\n recordStatement(connection, `INSERT INTO ne19_kept_sandboxes(entry_id,provider,sandbox_id,kept_at,payload)\n VALUES(?,?,?,?,?) ON CONFLICT(entry_id) DO UPDATE SET kept_at=excluded.kept_at,payload=excluded.payload`)\n .run(input.id, input.provider, input.sandboxId, input.keptAt, input.payload);\n });\n}\nexport function getKeptSandbox(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, \"SELECT entry_id,payload FROM ne19_kept_sandboxes WHERE entry_id=?\")\n .get(id) as Row | undefined;\n return row === undefined ? undefined : { id: String(row.entry_id), payload: payload(row.payload, `kept sandbox ${id}`) };\n });\n}\nexport function listKeptSandboxes(connection: RecordDatabase) {\n return withConnection(connection, (connection) => (recordStatement(connection, `SELECT entry_id,payload\n FROM ne19_kept_sandboxes ORDER BY kept_at,entry_id`).all() as Row[]).map((row) => ({\n id: String(row.entry_id), payload: payload(row.payload, \"kept sandbox\"),\n })));\n}\nexport function updateKeptSandbox(connection: RecordDatabase, id: string, value: Uint8Array) {\n return withConnection(connection, (connection) => Number(recordStatement(connection, \"UPDATE ne19_kept_sandboxes SET payload=? WHERE entry_id=?\").run(value, id).changes) === 1);\n}\nexport function deleteKeptSandbox(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n recordStatement(connection, \"DELETE FROM ne19_kept_sandboxes WHERE entry_id=?\").run(id);\n });\n}\nexport interface KeptSandboxLeaseRow {\n readonly generation: number;\n readonly token: string;\n readonly holder: string;\n readonly operation: string;\n readonly acquiredAt: string;\n readonly ttlMs: number;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}\nfunction keptLeaseRow(row: Row): KeptSandboxLeaseRow {\n return {\n generation: Number(row.generation), token: String(row.token), holder: String(row.holder),\n operation: String(row.operation), acquiredAt: String(row.acquired_at), ttlMs: Number(row.ttl_ms),\n ownerPid: Number(row.owner_pid), ownerHost: String(row.owner_host),\n ownerProcessIdentity: String(row.owner_process_identity),\n };\n}\nexport function getKeptSandboxLease(connection: RecordDatabase, id: string) {\n return withConnection(connection, (connection) => {\n const row = recordStatement(connection, `SELECT * FROM ne19_kept_sandbox_operation_leases\n WHERE entry_id=?`).get(id) as Row | undefined;\n return row === undefined ? undefined : keptLeaseRow(row);\n });\n}\nexport function acquireKeptSandboxLease(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly token: string;\n readonly holder: string;\n readonly operation: string;\n readonly acquiredAt: string;\n readonly ttlMs: number;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}) {\n return withConnection(input.connection, (connection) => {\n const current = recordStatement(connection, `SELECT * FROM ne19_kept_sandbox_operation_leases\n WHERE entry_id=?`).get(input.id) as Row | undefined;\n if (current !== undefined)\n return { acquired: false as const, lease: keptLeaseRow(current) };\n const advanced = recordStatement(connection, `UPDATE ne19_kept_sandboxes SET operation_generation=operation_generation+1\n WHERE entry_id=?`).run(input.id);\n if (Number(advanced.changes) !== 1)\n throw new Error(`kept sandbox ${input.id} is missing`);\n const row = recordStatement(connection, \"SELECT operation_generation FROM ne19_kept_sandboxes WHERE entry_id=?\")\n .get(input.id) as Row;\n const generation = Number(row.operation_generation);\n recordStatement(connection, `INSERT INTO ne19_kept_sandbox_operation_leases(entry_id,generation,token,holder,\n owner_pid,owner_host,owner_process_identity,operation,acquired_at,ttl_ms) VALUES(?,?,?,?,?,?,?,?,?,?)`)\n .run(input.id, generation, input.token, input.holder, input.ownerPid, input.ownerHost, input.ownerProcessIdentity, input.operation, input.acquiredAt, input.ttlMs);\n return { acquired: true as const, generation };\n });\n}\nexport function releaseKeptSandboxLease(input: {\n readonly connection: RecordDatabase;\n readonly id: string;\n readonly generation: number;\n readonly token: string;\n readonly ownerPid: number;\n readonly ownerHost: string;\n readonly ownerProcessIdentity: string;\n}) {\n return withConnection(input.connection, (connection) => Number(recordStatement(connection, `DELETE FROM ne19_kept_sandbox_operation_leases WHERE entry_id=? AND generation=? AND token=?\n AND owner_pid=? AND owner_host=? AND owner_process_identity=?`)\n .run(input.id, input.generation, input.token, input.ownerPid, input.ownerHost, input.ownerProcessIdentity).changes) === 1);\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RECORD_SQLITE_LEGACY_FINGERPRINTS = exports.RECORD_SQLITE_017_FINGERPRINT = exports.RECORD_SQLITE_BASELINE_FINGERPRINT = exports.RECORD_SQLITE_SCHEMA_SQL = exports.RECORD_SQLITE_017_TABLE_NAMES = exports.RECORD_SQLITE_LEGACY_TABLE_NAMES = exports.RECORD_SQLITE_LEGACY_BASELINE_SQL = exports.RECORD_SQLITE_PREPARED_SEAL_TEMP_SQL = exports.RECORD_SQLITE_017_BASELINE_SQL = exports.RECORD_SQLITE_BASELINE_SQL = void 0;
|
|
3
|
+
exports.RECORD_SQLITE_018_FINGERPRINT = exports.RECORD_SQLITE_018_TABLE_NAMES = exports.RECORD_SQLITE_018_BASELINE_SQL = exports.RECORD_SQLITE_LEGACY_FINGERPRINTS = exports.RECORD_SQLITE_017_FINGERPRINT = exports.RECORD_SQLITE_BASELINE_FINGERPRINT = exports.RECORD_SQLITE_SCHEMA_SQL = exports.RECORD_SQLITE_017_TABLE_NAMES = exports.RECORD_SQLITE_LEGACY_TABLE_NAMES = exports.RECORD_SQLITE_LEGACY_BASELINE_SQL = exports.RECORD_SQLITE_PREPARED_SEAL_TEMP_SQL = exports.RECORD_SQLITE_017_BASELINE_SQL = exports.RECORD_SQLITE_BASELINE_SQL = void 0;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
5
|
const current_schema_ts_1 = require("./current-schema.cjs");
|
|
6
|
+
const legacy_schema_018_ts_1 = require("./legacy-schema-018.cjs");
|
|
6
7
|
const legacy_schema_017_ts_1 = require("./legacy-schema-017.cjs");
|
|
7
8
|
var current_schema_ts_2 = require("./current-schema.cjs");
|
|
8
9
|
Object.defineProperty(exports, "RECORD_SQLITE_BASELINE_SQL", { enumerable: true, get: function () { return current_schema_ts_2.RECORD_SQLITE_BASELINE_SQL; } });
|
|
@@ -516,7 +517,7 @@ exports.RECORD_SQLITE_017_TABLE_NAMES = Object.freeze([
|
|
|
516
517
|
]);
|
|
517
518
|
exports.RECORD_SQLITE_SCHEMA_SQL = current_schema_ts_1.RECORD_SQLITE_BASELINE_SQL;
|
|
518
519
|
exports.RECORD_SQLITE_BASELINE_FINGERPRINT = (0, node_crypto_1.createHash)("sha256")
|
|
519
|
-
.update("niceeval.project-database.bootstrap/0.
|
|
520
|
+
.update("niceeval.project-database.bootstrap/0.19\0")
|
|
520
521
|
.update(current_schema_ts_1.RECORD_SQLITE_BASELINE_SQL)
|
|
521
522
|
.digest("hex");
|
|
522
523
|
exports.RECORD_SQLITE_017_FINGERPRINT = (0, node_crypto_1.createHash)("sha256")
|
|
@@ -533,4 +534,11 @@ exports.RECORD_SQLITE_LEGACY_FINGERPRINTS = Object.freeze({
|
|
|
533
534
|
.update(exports.RECORD_SQLITE_LEGACY_BASELINE_SQL)
|
|
534
535
|
.digest("hex"),
|
|
535
536
|
});
|
|
537
|
+
var legacy_schema_018_ts_2 = require("./legacy-schema-018.cjs");
|
|
538
|
+
Object.defineProperty(exports, "RECORD_SQLITE_018_BASELINE_SQL", { enumerable: true, get: function () { return legacy_schema_018_ts_2.RECORD_SQLITE_018_BASELINE_SQL; } });
|
|
539
|
+
exports.RECORD_SQLITE_018_TABLE_NAMES = Object.freeze(exports.RECORD_SQLITE_017_TABLE_NAMES.map((table) => table.replace(/^ne_/u, "ne18_")));
|
|
540
|
+
exports.RECORD_SQLITE_018_FINGERPRINT = (0, node_crypto_1.createHash)("sha256")
|
|
541
|
+
.update("niceeval.project-database.bootstrap/0.18\0")
|
|
542
|
+
.update(legacy_schema_018_ts_1.RECORD_SQLITE_018_BASELINE_SQL)
|
|
543
|
+
.digest("hex");
|
|
536
544
|
//# sourceMappingURL=schema.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { RECORD_SQLITE_BASELINE_SQL } from \"./current-schema.ts\";\nimport { RECORD_SQLITE_017_BASELINE_SQL } from \"./legacy-schema-017.ts\";\nexport { RECORD_SQLITE_BASELINE_SQL } from \"./current-schema.ts\";\nexport { RECORD_SQLITE_017_BASELINE_SQL } from \"./legacy-schema-017.ts\";\nconst LEGACY_RECORD_SQLITE_CHUNK_BYTES = 256 * 1024;\nexport const RECORD_SQLITE_PREPARED_SEAL_TEMP_SQL = `\nCREATE TEMP TABLE IF NOT EXISTS niceeval_prepared_seal_raw(\n run_id TEXT NOT NULL,entry_kind TEXT NOT NULL,logical_identity TEXT NOT NULL,digest TEXT NOT NULL,\n PRIMARY KEY(run_id,entry_kind,logical_identity,digest)) WITHOUT ROWID;\nCREATE TEMP TABLE IF NOT EXISTS niceeval_prepared_seal_ordered(\n run_id TEXT NOT NULL,ordinal INTEGER NOT NULL,entry_kind TEXT NOT NULL,logical_identity TEXT NOT NULL,digest TEXT NOT NULL,\n PRIMARY KEY(run_id,ordinal)) WITHOUT ROWID;`;\n/** Immutable SQL shared by the exact ProjectDatabase 0.15 and 0.16 baselines. */\nconst RECORD_SQLITE_CORE_SQL = `\nCREATE TABLE record_metadata (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n format TEXT NOT NULL,\n storage_revision INTEGER NOT NULL CHECK (storage_revision > 0),\n storage_generation TEXT NOT NULL,\n schema_fingerprint TEXT NOT NULL CHECK (length(schema_fingerprint) = 64),\n created_at TEXT NOT NULL,\n barrier_state TEXT NOT NULL CHECK (barrier_state IN ('open','draining','portable')),\n portable_generation TEXT,\n portable_revision INTEGER CHECK (portable_revision IS NULL OR portable_revision >= 0),\n portable_gate_id TEXT,\n record_payload BLOB,\n record_digest TEXT,\n CHECK ((record_payload IS NULL) = (record_digest IS NULL)),\n CHECK (record_digest IS NULL OR length(record_digest) = 64),\n CHECK ((barrier_state = 'portable') = (portable_generation IS NOT NULL)),\n CHECK ((barrier_state = 'portable') = (portable_revision IS NOT NULL)),\n CHECK ((barrier_state = 'open') = (portable_gate_id IS NULL))\n) STRICT;\nCREATE TABLE coordination_state (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n revision INTEGER NOT NULL CHECK (revision >= 0),\n operational_generation TEXT NOT NULL,\n next_writer_sequence INTEGER NOT NULL CHECK (next_writer_sequence > 0),\n writer_ticket_id TEXT,\n writer_sequence INTEGER CHECK (writer_sequence IS NULL OR writer_sequence > 0),\n writer_host TEXT,\n writer_pid INTEGER CHECK (writer_pid IS NULL OR writer_pid > 0),\n writer_boot_id TEXT,\n writer_process_start TEXT,\n writer_deadline INTEGER CHECK (writer_deadline IS NULL OR writer_deadline > 0),\n writer_enqueued_at INTEGER CHECK (writer_enqueued_at IS NULL OR writer_enqueued_at > 0),\n writer_nonce TEXT,\n writer_admitted_at INTEGER CHECK (writer_admitted_at IS NULL OR writer_admitted_at > 0),\n writer_lease_expires_at INTEGER CHECK (writer_lease_expires_at IS NULL OR writer_lease_expires_at > 0),\n barrier_id TEXT,\n barrier_nonce TEXT,\n barrier_host TEXT,\n barrier_pid INTEGER CHECK (barrier_pid IS NULL OR barrier_pid > 0),\n barrier_boot_id TEXT,\n barrier_process_start TEXT,\n barrier_deadline INTEGER CHECK (barrier_deadline IS NULL OR barrier_deadline > 0),\n barrier_requested_at INTEGER CHECK (barrier_requested_at IS NULL OR barrier_requested_at > 0),\n barrier_lease_expires_at INTEGER CHECK (barrier_lease_expires_at IS NULL OR barrier_lease_expires_at > 0),\n barrier_status TEXT CHECK (barrier_status IS NULL OR barrier_status IN ('requested','active')),\n barrier_active_at INTEGER CHECK (barrier_active_at IS NULL OR barrier_active_at > 0),\n CHECK ((writer_ticket_id IS NULL) = (writer_sequence IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_host IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_pid IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_boot_id IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_process_start IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_deadline IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_enqueued_at IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_nonce IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_admitted_at IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_lease_expires_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_nonce IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_host IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_pid IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_boot_id IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_process_start IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_deadline IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_requested_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_lease_expires_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_status IS NULL)),\n CHECK (\n (barrier_status IS NULL AND barrier_active_at IS NULL) OR\n (barrier_status = 'requested' AND barrier_active_at IS NULL) OR\n (barrier_status = 'active' AND barrier_active_at IS NOT NULL)\n )\n) STRICT;\nCREATE TABLE coordination_tickets (\n ticket_id TEXT PRIMARY KEY,\n sequence INTEGER NOT NULL UNIQUE CHECK (sequence > 0),\n host TEXT NOT NULL,\n pid INTEGER NOT NULL CHECK (pid > 0),\n boot_id TEXT NOT NULL,\n process_start TEXT NOT NULL,\n deadline INTEGER NOT NULL CHECK (deadline > 0),\n enqueued_at INTEGER NOT NULL CHECK (enqueued_at > 0)\n) STRICT;\nCREATE TABLE runs (\n run_id TEXT PRIMARY KEY,\n status TEXT NOT NULL CHECK (status IN ('open','sealing','sealed')),\n writer_generation TEXT NOT NULL,\n started_at TEXT NOT NULL,\n core_payload BLOB,\n core_digest TEXT CHECK (core_digest IS NULL OR length(core_digest) = 64),\n mutation_sequence INTEGER NOT NULL DEFAULT 0 CHECK (mutation_sequence >= 0),\n candidate_seal_identity TEXT CHECK (candidate_seal_identity IS NULL OR length(candidate_seal_identity) = 64),\n candidate_seal_entry_count INTEGER CHECK (candidate_seal_entry_count IS NULL OR candidate_seal_entry_count >= 0),\n candidate_seal_staged_count INTEGER NOT NULL DEFAULT 0 CHECK (candidate_seal_staged_count >= 0),\n logical_seal_identity TEXT,\n CHECK ((core_payload IS NULL) = (core_digest IS NULL)),\n CHECK ((candidate_seal_identity IS NULL) = (candidate_seal_entry_count IS NULL)),\n CHECK ((status = 'open') = (candidate_seal_identity IS NULL)),\n CHECK (candidate_seal_entry_count IS NULL OR candidate_seal_staged_count <= candidate_seal_entry_count),\n CHECK (status != 'open' OR candidate_seal_staged_count = 0),\n CHECK ((status = 'sealed') = (logical_seal_identity IS NOT NULL)),\n CHECK (status = 'open' OR core_payload IS NOT NULL)\n) STRICT;\nCREATE TABLE slots (\n run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n core_payload BLOB NOT NULL,\n core_digest TEXT NOT NULL CHECK (length(core_digest) = 64),\n PRIMARY KEY (run_id, slot_id),\n UNIQUE (run_id, ordinal)\n) STRICT;\nCREATE TABLE attempts (\n origin_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n attempt_id TEXT NOT NULL,\n attempt_locator TEXT NOT NULL CHECK (length(attempt_locator) = 14 AND substr(attempt_locator,1,2) = '@1'),\n publication_state TEXT NOT NULL DEFAULT 'staging' CHECK (publication_state IN ('staging','sealing','published')),\n core_payload BLOB,\n core_digest TEXT CHECK (core_digest IS NULL OR length(core_digest) = 64),\n CHECK ((core_payload IS NULL) = (core_digest IS NULL)),\n PRIMARY KEY (origin_run_id, attempt_id)\n) STRICT;\nCREATE TABLE members (\n target_run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n origin_run_id TEXT,\n attempt_id TEXT,\n action TEXT NOT NULL CHECK (action IN ('executed','carried','accepted','not-dispatched','interrupted')),\n core_payload BLOB NOT NULL,\n core_digest TEXT NOT NULL CHECK (length(core_digest) = 64),\n PRIMARY KEY (target_run_id, slot_id),\n CHECK (\n (action IN ('executed','carried','accepted') AND origin_run_id IS NOT NULL AND attempt_id IS NOT NULL) OR\n (action IN ('not-dispatched','interrupted') AND origin_run_id IS NULL AND attempt_id IS NULL)\n ),\n FOREIGN KEY (target_run_id, slot_id) REFERENCES slots(run_id, slot_id) ON DELETE CASCADE\n) STRICT;\nCREATE TABLE attachments (\n attachment_id TEXT PRIMARY KEY,\n owner_kind TEXT NOT NULL CHECK (owner_kind IN ('run','attempt')),\n owner_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n owner_attempt_id TEXT,\n family TEXT NOT NULL,\n family_revision INTEGER NOT NULL CHECK (family_revision > 0),\n logical_identity TEXT,\n canonical_payload BLOB,\n canonical_digest TEXT CHECK (canonical_digest IS NULL OR length(canonical_digest) = 64),\n logical_inventory BLOB,\n inventory_digest TEXT CHECK (inventory_digest IS NULL OR length(inventory_digest) = 64),\n CHECK ((canonical_payload IS NULL) = (canonical_digest IS NULL)),\n CHECK ((logical_inventory IS NULL) = (inventory_digest IS NULL)),\n CHECK ((owner_kind = 'run' AND owner_attempt_id IS NULL) OR (owner_kind = 'attempt' AND owner_attempt_id IS NOT NULL)),\n UNIQUE (owner_kind, owner_run_id, owner_attempt_id, family),\n FOREIGN KEY (owner_run_id, owner_attempt_id) REFERENCES attempts(origin_run_id, attempt_id) ON DELETE CASCADE\n) STRICT;\nCREATE TABLE attachment_references (\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n target_owner_kind TEXT NOT NULL CHECK (target_owner_kind IN ('run','attempt')),\n target_family TEXT NOT NULL,\n canonical_payload BLOB NOT NULL,\n reference_digest TEXT NOT NULL CHECK (length(reference_digest) = 64),\n PRIMARY KEY (attachment_id, ordinal)\n) STRICT;\nCREATE TABLE collection_items (\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n logical_identity TEXT NOT NULL,\n canonical_payload BLOB NOT NULL,\n canonical_digest TEXT NOT NULL CHECK (length(canonical_digest) = 64),\n PRIMARY KEY (attachment_id, ordinal),\n UNIQUE (attachment_id, logical_identity)\n) STRICT;\nCREATE TABLE contents (\n content_id TEXT PRIMARY KEY,\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n logical_handle TEXT NOT NULL,\n byte_length INTEGER CHECK (byte_length IS NULL OR byte_length >= 0),\n overall_digest TEXT CHECK (overall_digest IS NULL OR length(overall_digest) = 64),\n chunk_count INTEGER CHECK (chunk_count IS NULL OR chunk_count >= 0),\n CHECK ((byte_length IS NULL) = (overall_digest IS NULL) AND (overall_digest IS NULL) = (chunk_count IS NULL)),\n UNIQUE (attachment_id, logical_handle)\n) STRICT;\nCREATE TABLE content_chunks (\n content_id TEXT NOT NULL REFERENCES contents(content_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n bytes BLOB NOT NULL CHECK (length(bytes) <= ${LEGACY_RECORD_SQLITE_CHUNK_BYTES}),\n chunk_digest TEXT NOT NULL CHECK (length(chunk_digest) = 64),\n PRIMARY KEY (content_id, ordinal)\n) STRICT;\nCREATE TABLE run_seal_entries (\n run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n entry_kind TEXT NOT NULL CHECK (entry_kind IN ('record','run','slot','member','attempt','attachment','attachment-reference','collection-item','content','content-chunk')),\n logical_identity TEXT NOT NULL,\n digest TEXT NOT NULL CHECK (length(digest) = 64),\n PRIMARY KEY (run_id, ordinal),\n UNIQUE (run_id, entry_kind, logical_identity)\n) STRICT;\nCREATE INDEX attachments_owner_family ON attachments(owner_kind, owner_run_id, owner_attempt_id, family);\nCREATE UNIQUE INDEX attachments_owner_family_unique ON attachments(owner_kind, owner_run_id, coalesce(owner_attempt_id,''), family);\nCREATE INDEX members_origin_attempt ON members(origin_run_id, attempt_id, target_run_id);\nCREATE INDEX attempts_locator ON attempts(attempt_locator, origin_run_id, attempt_id);\nCREATE INDEX references_target_family ON attachment_references(target_owner_kind, target_family);\nCREATE INDEX content_chunks_page ON content_chunks(content_id, ordinal);\nCREATE INDEX coordination_tickets_fifo ON coordination_tickets(sequence);\nCREATE TRIGGER coordination_ticket_barrier_insert BEFORE INSERT ON coordination_tickets WHEN (SELECT barrier_state FROM record_metadata WHERE singleton=1)!='open' BEGIN SELECT RAISE(ABORT, 'ProjectDatabase writer barrier is not open'); END;\nCREATE TRIGGER coordination_writer_barrier_update BEFORE UPDATE ON coordination_state WHEN NEW.writer_ticket_id IS NOT NULL AND (SELECT barrier_state FROM record_metadata WHERE singleton=1)!='open' BEGIN SELECT RAISE(ABORT, 'ProjectDatabase writer barrier is not open'); END;\nCREATE TRIGGER runs_sealed_update BEFORE UPDATE ON runs WHEN OLD.status = 'sealed' BEGIN SELECT RAISE(ABORT, 'sealed run is immutable'); END;\nCREATE TRIGGER runs_sealed_delete BEFORE DELETE ON runs WHEN OLD.status = 'sealed' BEGIN SELECT RAISE(ABORT, 'sealed run is immutable'); END;\nCREATE TRIGGER slots_sealed_insert BEFORE INSERT ON slots WHEN (SELECT status FROM runs WHERE run_id = NEW.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER slots_sealed_update BEFORE UPDATE ON slots WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER slots_sealed_delete BEFORE DELETE ON slots WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_insert BEFORE INSERT ON attempts WHEN (SELECT status FROM runs WHERE run_id = NEW.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_update BEFORE UPDATE ON attempts WHEN (SELECT status FROM runs WHERE run_id = OLD.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_delete BEFORE DELETE ON attempts WHEN (SELECT status FROM runs WHERE run_id = OLD.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_insert BEFORE INSERT ON members WHEN (SELECT status FROM runs WHERE run_id = NEW.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_update BEFORE UPDATE ON members WHEN (SELECT status FROM runs WHERE run_id = OLD.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_delete BEFORE DELETE ON members WHEN (SELECT status FROM runs WHERE run_id = OLD.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_sealed_insert BEFORE INSERT ON attachments WHEN (SELECT status FROM runs WHERE run_id = NEW.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_insert BEFORE INSERT ON attachments WHEN NEW.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=NEW.owner_run_id AND attempt_id=NEW.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER attachments_sealed_update BEFORE UPDATE ON attachments WHEN (SELECT status FROM runs WHERE run_id = OLD.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_update BEFORE UPDATE ON attachments WHEN OLD.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=OLD.owner_run_id AND attempt_id=OLD.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER attachments_sealed_delete BEFORE DELETE ON attachments WHEN (SELECT status FROM runs WHERE run_id = OLD.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_delete BEFORE DELETE ON attachments WHEN OLD.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=OLD.owner_run_id AND attempt_id=OLD.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER references_sealed_insert BEFORE INSERT ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER references_sealed_update BEFORE UPDATE ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER references_sealed_delete BEFORE DELETE ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_insert BEFORE INSERT ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_update BEFORE UPDATE ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_delete BEFORE DELETE ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_insert BEFORE INSERT ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_update BEFORE UPDATE ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_delete BEFORE DELETE ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_insert BEFORE INSERT ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=NEW.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_update BEFORE UPDATE ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=OLD.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_delete BEFORE DELETE ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=OLD.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER seal_entries_sealed_insert BEFORE INSERT ON run_seal_entries WHEN (SELECT status FROM runs WHERE run_id = NEW.run_id) != 'sealing' BEGIN SELECT RAISE(ABORT, 'Seal candidates require sealing state'); END;\nCREATE TRIGGER seal_entries_sealed_update BEFORE UPDATE ON run_seal_entries BEGIN SELECT RAISE(ABORT, 'Seal entries are immutable'); END;\nCREATE TRIGGER seal_entries_sealed_delete BEFORE DELETE ON run_seal_entries WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'Seal entries are immutable'); END;\n`;\n/** Run publication storage included in the exact 0.15 and 0.16 baselines. */\nconst RECORD_SQLITE_RUN_SQL = `\nCREATE TABLE run_publication_clock (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n revision INTEGER NOT NULL CHECK (revision >= 0)\n) STRICT;\nCREATE TABLE run_resources (\n run_id TEXT PRIMARY KEY,\n invocation_id TEXT NOT NULL,\n experiment_id TEXT NOT NULL,\n started_at TEXT NOT NULL,\n initial_writer_generation TEXT NOT NULL,\n current_writer_generation TEXT NOT NULL,\n terminal_state TEXT CHECK (terminal_state IS NULL OR terminal_state IN ('completed','interrupted','failed')),\n completed_at TEXT,\n created_revision INTEGER NOT NULL UNIQUE CHECK (created_revision > 0),\n close_revision INTEGER UNIQUE CHECK (close_revision IS NULL OR close_revision > created_revision),\n CHECK ((terminal_state IS NULL) = (completed_at IS NULL)),\n CHECK ((terminal_state IS NULL) = (close_revision IS NULL))\n) STRICT;\nCREATE TABLE run_expected_slots (\n run_id TEXT NOT NULL REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n eval_id TEXT NOT NULL,\n attempt_ordinal INTEGER NOT NULL CHECK (attempt_ordinal >= 0),\n execution_identity_digest TEXT NOT NULL CHECK (length(execution_identity_digest) = 64),\n PRIMARY KEY (run_id, slot_id),\n UNIQUE (run_id, ordinal)\n) STRICT;\nCREATE TABLE attempt_publications (\n attempt_id TEXT PRIMARY KEY,\n attempt_locator TEXT NOT NULL CHECK (length(attempt_locator) = 14 AND substr(attempt_locator,1,2) = '@1'),\n origin_run_id TEXT NOT NULL,\n origin_slot_id TEXT NOT NULL,\n closure_payload BLOB NOT NULL,\n closure_digest TEXT NOT NULL CHECK (length(closure_digest) = 64),\n published_revision INTEGER NOT NULL UNIQUE CHECK (published_revision > 0),\n FOREIGN KEY (origin_run_id, origin_slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_slot_bindings (\n target_run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n attempt_id TEXT NOT NULL REFERENCES attempt_publications(attempt_id) ON DELETE RESTRICT,\n origin_run_id TEXT NOT NULL,\n origin_slot_id TEXT NOT NULL,\n attempt_publication_revision INTEGER NOT NULL CHECK (attempt_publication_revision > 0),\n action TEXT NOT NULL CHECK (action IN ('executed','carried','accepted')),\n binding_revision INTEGER NOT NULL UNIQUE CHECK (binding_revision > 0),\n PRIMARY KEY (target_run_id, slot_id),\n FOREIGN KEY (target_run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT,\n FOREIGN KEY (origin_run_id, origin_slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_slot_absences (\n run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n reason TEXT NOT NULL CHECK (reason IN ('early-exit-satisfied','budget-exhausted','stopped-by-failure','interrupted-before-publication','dispatch-failed')),\n absence_revision INTEGER NOT NULL CHECK (absence_revision > 0),\n PRIMARY KEY (run_id, slot_id),\n FOREIGN KEY (run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_recoveries (\n run_id TEXT PRIMARY KEY REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n previous_writer_generation TEXT NOT NULL,\n recovery_writer_generation TEXT NOT NULL,\n evidence_kind TEXT NOT NULL,\n evidence_identity TEXT NOT NULL,\n evidence_observed_at TEXT NOT NULL,\n recovery_revision INTEGER NOT NULL UNIQUE CHECK (recovery_revision > 0)\n) STRICT;\nCREATE TABLE run_deletion_tombstones (\n run_id TEXT PRIMARY KEY REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n terminal_state TEXT NOT NULL CHECK (terminal_state IN ('completed','interrupted','failed')),\n deleted_at TEXT NOT NULL,\n deletion_revision INTEGER NOT NULL UNIQUE CHECK (deletion_revision > 0)\n) STRICT;\nCREATE INDEX run_resources_list ON run_resources(created_revision, run_id);\nCREATE INDEX run_resources_invocation ON run_resources(invocation_id, created_revision, run_id);\nCREATE INDEX attempt_publications_origin ON attempt_publications(origin_run_id, origin_slot_id);\nCREATE INDEX attempt_publications_locator ON attempt_publications(attempt_locator, origin_run_id, attempt_id);\nCREATE INDEX run_slot_bindings_attempt ON run_slot_bindings(attempt_id, target_run_id, slot_id);\nCREATE INDEX run_deletion_revision ON run_deletion_tombstones(deletion_revision, run_id);\nINSERT INTO run_publication_clock(singleton,revision) VALUES (1,0);\n`;\n/** Invocation and case coordination are durable rows in the canonical database. */\nconst RECORD_SQLITE_COORDINATION_SQL = `\nCREATE TABLE invocation_sessions (\n invocation_id TEXT PRIMARY KEY,\n state TEXT NOT NULL CHECK (state IN ('active','recovering','completed','interrupted','failed')),\n owner_id TEXT NOT NULL,\n owner_generation INTEGER NOT NULL CHECK (owner_generation > 0),\n owner_host TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_boot_id TEXT NOT NULL,\n owner_process_start TEXT NOT NULL,\n started_at TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL,\n active_projection BLOB,\n recovering_at TEXT,\n closed_at TEXT,\n terminal_projection BLOB,\n CHECK ((state IN ('completed','interrupted','failed')) = (closed_at IS NOT NULL)),\n CHECK ((state IN ('completed','interrupted','failed')) = (terminal_projection IS NOT NULL)),\n CHECK (state IN ('active','recovering') OR active_projection IS NULL),\n CHECK ((state = 'recovering') = (recovering_at IS NOT NULL))\n) STRICT;\nCREATE TABLE invocation_session_experiments (\n invocation_id TEXT NOT NULL REFERENCES invocation_sessions(invocation_id) ON DELETE RESTRICT,\n experiment_id TEXT NOT NULL,\n run_id TEXT NOT NULL UNIQUE REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n PRIMARY KEY (invocation_id, experiment_id),\n UNIQUE (invocation_id, ordinal)\n) STRICT;\nCREATE TABLE invocation_session_queued_attempts (\n invocation_id TEXT NOT NULL REFERENCES invocation_sessions(invocation_id) ON DELETE RESTRICT,\n attempt_id TEXT NOT NULL,\n run_id TEXT NOT NULL REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n PRIMARY KEY (invocation_id, attempt_id),\n UNIQUE (invocation_id, ordinal),\n FOREIGN KEY (run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE case_locks (\n case_id TEXT PRIMARY KEY,\n owner_id TEXT NOT NULL,\n owner_generation INTEGER NOT NULL CHECK (owner_generation > 0),\n owner_host TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_boot_id TEXT NOT NULL,\n owner_process_start TEXT NOT NULL,\n acquired_at TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL\n) STRICT;\nCREATE INDEX invocation_sessions_state ON invocation_sessions(state, started_at, invocation_id);\nCREATE INDEX invocation_session_experiments_invocation ON invocation_session_experiments(invocation_id, ordinal);\nCREATE INDEX invocation_session_queued_attempts_run ON invocation_session_queued_attempts(run_id, slot_id);\nCREATE INDEX case_locks_owner ON case_locks(owner_id, owner_generation);\nCREATE TABLE teardown_obligations (\n obligation_id TEXT PRIMARY KEY,\n experiment_id TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n generation INTEGER NOT NULL DEFAULT 1 CHECK (generation > 0),\n payload BLOB NOT NULL,\n UNIQUE (experiment_id, owner_pid)\n) STRICT;\nCREATE TABLE shared_state_generations (\n state_key TEXT NOT NULL,\n generation INTEGER NOT NULL CHECK (generation > 0),\n parent_generation INTEGER NOT NULL CHECK (parent_generation >= 0),\n state_kind TEXT NOT NULL CHECK (state_kind IN ('active','recovering','free')),\n owner_token TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n owner_process_identity TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL,\n payload BLOB NOT NULL,\n PRIMARY KEY (state_key, generation),\n CHECK (parent_generation = generation - 1)\n) STRICT;\nCREATE TABLE kept_sandboxes (\n entry_id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n sandbox_id TEXT NOT NULL,\n kept_at TEXT NOT NULL,\n operation_generation INTEGER NOT NULL DEFAULT 0 CHECK (operation_generation >= 0),\n payload BLOB NOT NULL,\n UNIQUE (provider, sandbox_id)\n) STRICT;\nCREATE TABLE kept_sandbox_operation_leases (\n entry_id TEXT PRIMARY KEY REFERENCES kept_sandboxes(entry_id) ON DELETE CASCADE,\n generation INTEGER NOT NULL CHECK (generation > 0),\n token TEXT NOT NULL,\n holder TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n owner_process_identity TEXT NOT NULL,\n operation TEXT NOT NULL,\n acquired_at TEXT NOT NULL,\n ttl_ms INTEGER NOT NULL CHECK (ttl_ms > 0)\n) STRICT;\nCREATE INDEX teardown_obligations_experiment ON teardown_obligations(experiment_id, owner_pid);\nCREATE INDEX shared_state_generations_head ON shared_state_generations(state_key, generation DESC);\nCREATE INDEX kept_sandboxes_kept_at ON kept_sandboxes(kept_at, entry_id);\n`;\n/**\n * Exact historical schema used by ProjectDatabase 0.15 and 0.16. Keep this\n * source immutable: Host-owned migration validates it before interpreting any\n * legacy payload bytes.\n */\nexport const RECORD_SQLITE_LEGACY_BASELINE_SQL = `${RECORD_SQLITE_CORE_SQL}\\n${RECORD_SQLITE_RUN_SQL}\\n${RECORD_SQLITE_COORDINATION_SQL}`;\nexport const RECORD_SQLITE_LEGACY_TABLE_NAMES = Object.freeze([\n \"record_metadata\",\n \"coordination_state\",\n \"coordination_tickets\",\n \"runs\",\n \"slots\",\n \"attempts\",\n \"members\",\n \"attachments\",\n \"attachment_references\",\n \"collection_items\",\n \"contents\",\n \"content_chunks\",\n \"run_seal_entries\",\n \"run_publication_clock\",\n \"run_resources\",\n \"run_expected_slots\",\n \"attempt_publications\",\n \"run_slot_bindings\",\n \"run_slot_absences\",\n \"run_recoveries\",\n \"run_deletion_tombstones\",\n \"invocation_sessions\",\n \"invocation_session_experiments\",\n \"invocation_session_queued_attempts\",\n \"case_locks\",\n \"teardown_obligations\",\n \"shared_state_generations\",\n \"kept_sandboxes\",\n \"kept_sandbox_operation_leases\",\n] as const);\n/** Complete fixed table allowlist for the historical 0.17 `ne_` namespace. */\nexport const RECORD_SQLITE_017_TABLE_NAMES = Object.freeze([\n \"ne_record_metadata\",\n \"ne_coordination_state\",\n \"ne_coordination_tickets\",\n \"ne_runs\",\n \"ne_slots\",\n \"ne_attempts\",\n \"ne_members\",\n \"ne_attachments\",\n \"ne_attachment_references\",\n \"ne_collection_items\",\n \"ne_contents\",\n \"ne_content_chunks\",\n \"ne_run_seal_entries\",\n \"ne_run_publication_clock\",\n \"ne_run_resources\",\n \"ne_run_expected_slots\",\n \"ne_attempt_publications\",\n \"ne_run_slot_bindings\",\n \"ne_run_slot_absences\",\n \"ne_run_recoveries\",\n \"ne_run_deletion_tombstones\",\n \"ne_invocation_sessions\",\n \"ne_invocation_session_experiments\",\n \"ne_invocation_session_queued_attempts\",\n \"ne_case_locks\",\n \"ne_teardown_obligations\",\n \"ne_shared_state_generations\",\n \"ne_kept_sandboxes\",\n \"ne_kept_sandbox_operation_leases\",\n \"ne_migration_state\",\n] as const);\nexport const RECORD_SQLITE_SCHEMA_SQL = RECORD_SQLITE_BASELINE_SQL;\nexport const RECORD_SQLITE_BASELINE_FINGERPRINT = createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.18\\0\")\n .update(RECORD_SQLITE_BASELINE_SQL)\n .digest(\"hex\");\nexport const RECORD_SQLITE_017_FINGERPRINT = createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.17\\0\")\n .update(RECORD_SQLITE_017_BASELINE_SQL)\n .digest(\"hex\");\nexport const RECORD_SQLITE_LEGACY_FINGERPRINTS = Object.freeze({\n \"niceeval.project-database/0.15\": createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.15\\0\")\n .update(RECORD_SQLITE_LEGACY_BASELINE_SQL)\n .digest(\"hex\"),\n \"niceeval.project-database/0.16\": createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.16\\0\")\n .update(RECORD_SQLITE_LEGACY_BASELINE_SQL)\n .digest(\"hex\"),\n});\n"]}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { RECORD_SQLITE_BASELINE_SQL } from \"./current-schema.ts\";\nimport { RECORD_SQLITE_018_BASELINE_SQL } from \"./legacy-schema-018.ts\";\nimport { RECORD_SQLITE_017_BASELINE_SQL } from \"./legacy-schema-017.ts\";\nexport { RECORD_SQLITE_BASELINE_SQL } from \"./current-schema.ts\";\nexport { RECORD_SQLITE_017_BASELINE_SQL } from \"./legacy-schema-017.ts\";\nconst LEGACY_RECORD_SQLITE_CHUNK_BYTES = 256 * 1024;\nexport const RECORD_SQLITE_PREPARED_SEAL_TEMP_SQL = `\nCREATE TEMP TABLE IF NOT EXISTS niceeval_prepared_seal_raw(\n run_id TEXT NOT NULL,entry_kind TEXT NOT NULL,logical_identity TEXT NOT NULL,digest TEXT NOT NULL,\n PRIMARY KEY(run_id,entry_kind,logical_identity,digest)) WITHOUT ROWID;\nCREATE TEMP TABLE IF NOT EXISTS niceeval_prepared_seal_ordered(\n run_id TEXT NOT NULL,ordinal INTEGER NOT NULL,entry_kind TEXT NOT NULL,logical_identity TEXT NOT NULL,digest TEXT NOT NULL,\n PRIMARY KEY(run_id,ordinal)) WITHOUT ROWID;`;\n/** Immutable SQL shared by the exact ProjectDatabase 0.15 and 0.16 baselines. */\nconst RECORD_SQLITE_CORE_SQL = `\nCREATE TABLE record_metadata (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n format TEXT NOT NULL,\n storage_revision INTEGER NOT NULL CHECK (storage_revision > 0),\n storage_generation TEXT NOT NULL,\n schema_fingerprint TEXT NOT NULL CHECK (length(schema_fingerprint) = 64),\n created_at TEXT NOT NULL,\n barrier_state TEXT NOT NULL CHECK (barrier_state IN ('open','draining','portable')),\n portable_generation TEXT,\n portable_revision INTEGER CHECK (portable_revision IS NULL OR portable_revision >= 0),\n portable_gate_id TEXT,\n record_payload BLOB,\n record_digest TEXT,\n CHECK ((record_payload IS NULL) = (record_digest IS NULL)),\n CHECK (record_digest IS NULL OR length(record_digest) = 64),\n CHECK ((barrier_state = 'portable') = (portable_generation IS NOT NULL)),\n CHECK ((barrier_state = 'portable') = (portable_revision IS NOT NULL)),\n CHECK ((barrier_state = 'open') = (portable_gate_id IS NULL))\n) STRICT;\nCREATE TABLE coordination_state (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n revision INTEGER NOT NULL CHECK (revision >= 0),\n operational_generation TEXT NOT NULL,\n next_writer_sequence INTEGER NOT NULL CHECK (next_writer_sequence > 0),\n writer_ticket_id TEXT,\n writer_sequence INTEGER CHECK (writer_sequence IS NULL OR writer_sequence > 0),\n writer_host TEXT,\n writer_pid INTEGER CHECK (writer_pid IS NULL OR writer_pid > 0),\n writer_boot_id TEXT,\n writer_process_start TEXT,\n writer_deadline INTEGER CHECK (writer_deadline IS NULL OR writer_deadline > 0),\n writer_enqueued_at INTEGER CHECK (writer_enqueued_at IS NULL OR writer_enqueued_at > 0),\n writer_nonce TEXT,\n writer_admitted_at INTEGER CHECK (writer_admitted_at IS NULL OR writer_admitted_at > 0),\n writer_lease_expires_at INTEGER CHECK (writer_lease_expires_at IS NULL OR writer_lease_expires_at > 0),\n barrier_id TEXT,\n barrier_nonce TEXT,\n barrier_host TEXT,\n barrier_pid INTEGER CHECK (barrier_pid IS NULL OR barrier_pid > 0),\n barrier_boot_id TEXT,\n barrier_process_start TEXT,\n barrier_deadline INTEGER CHECK (barrier_deadline IS NULL OR barrier_deadline > 0),\n barrier_requested_at INTEGER CHECK (barrier_requested_at IS NULL OR barrier_requested_at > 0),\n barrier_lease_expires_at INTEGER CHECK (barrier_lease_expires_at IS NULL OR barrier_lease_expires_at > 0),\n barrier_status TEXT CHECK (barrier_status IS NULL OR barrier_status IN ('requested','active')),\n barrier_active_at INTEGER CHECK (barrier_active_at IS NULL OR barrier_active_at > 0),\n CHECK ((writer_ticket_id IS NULL) = (writer_sequence IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_host IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_pid IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_boot_id IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_process_start IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_deadline IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_enqueued_at IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_nonce IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_admitted_at IS NULL)),\n CHECK ((writer_ticket_id IS NULL) = (writer_lease_expires_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_nonce IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_host IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_pid IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_boot_id IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_process_start IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_deadline IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_requested_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_lease_expires_at IS NULL)),\n CHECK ((barrier_id IS NULL) = (barrier_status IS NULL)),\n CHECK (\n (barrier_status IS NULL AND barrier_active_at IS NULL) OR\n (barrier_status = 'requested' AND barrier_active_at IS NULL) OR\n (barrier_status = 'active' AND barrier_active_at IS NOT NULL)\n )\n) STRICT;\nCREATE TABLE coordination_tickets (\n ticket_id TEXT PRIMARY KEY,\n sequence INTEGER NOT NULL UNIQUE CHECK (sequence > 0),\n host TEXT NOT NULL,\n pid INTEGER NOT NULL CHECK (pid > 0),\n boot_id TEXT NOT NULL,\n process_start TEXT NOT NULL,\n deadline INTEGER NOT NULL CHECK (deadline > 0),\n enqueued_at INTEGER NOT NULL CHECK (enqueued_at > 0)\n) STRICT;\nCREATE TABLE runs (\n run_id TEXT PRIMARY KEY,\n status TEXT NOT NULL CHECK (status IN ('open','sealing','sealed')),\n writer_generation TEXT NOT NULL,\n started_at TEXT NOT NULL,\n core_payload BLOB,\n core_digest TEXT CHECK (core_digest IS NULL OR length(core_digest) = 64),\n mutation_sequence INTEGER NOT NULL DEFAULT 0 CHECK (mutation_sequence >= 0),\n candidate_seal_identity TEXT CHECK (candidate_seal_identity IS NULL OR length(candidate_seal_identity) = 64),\n candidate_seal_entry_count INTEGER CHECK (candidate_seal_entry_count IS NULL OR candidate_seal_entry_count >= 0),\n candidate_seal_staged_count INTEGER NOT NULL DEFAULT 0 CHECK (candidate_seal_staged_count >= 0),\n logical_seal_identity TEXT,\n CHECK ((core_payload IS NULL) = (core_digest IS NULL)),\n CHECK ((candidate_seal_identity IS NULL) = (candidate_seal_entry_count IS NULL)),\n CHECK ((status = 'open') = (candidate_seal_identity IS NULL)),\n CHECK (candidate_seal_entry_count IS NULL OR candidate_seal_staged_count <= candidate_seal_entry_count),\n CHECK (status != 'open' OR candidate_seal_staged_count = 0),\n CHECK ((status = 'sealed') = (logical_seal_identity IS NOT NULL)),\n CHECK (status = 'open' OR core_payload IS NOT NULL)\n) STRICT;\nCREATE TABLE slots (\n run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n core_payload BLOB NOT NULL,\n core_digest TEXT NOT NULL CHECK (length(core_digest) = 64),\n PRIMARY KEY (run_id, slot_id),\n UNIQUE (run_id, ordinal)\n) STRICT;\nCREATE TABLE attempts (\n origin_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n attempt_id TEXT NOT NULL,\n attempt_locator TEXT NOT NULL CHECK (length(attempt_locator) = 14 AND substr(attempt_locator,1,2) = '@1'),\n publication_state TEXT NOT NULL DEFAULT 'staging' CHECK (publication_state IN ('staging','sealing','published')),\n core_payload BLOB,\n core_digest TEXT CHECK (core_digest IS NULL OR length(core_digest) = 64),\n CHECK ((core_payload IS NULL) = (core_digest IS NULL)),\n PRIMARY KEY (origin_run_id, attempt_id)\n) STRICT;\nCREATE TABLE members (\n target_run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n origin_run_id TEXT,\n attempt_id TEXT,\n action TEXT NOT NULL CHECK (action IN ('executed','carried','accepted','not-dispatched','interrupted')),\n core_payload BLOB NOT NULL,\n core_digest TEXT NOT NULL CHECK (length(core_digest) = 64),\n PRIMARY KEY (target_run_id, slot_id),\n CHECK (\n (action IN ('executed','carried','accepted') AND origin_run_id IS NOT NULL AND attempt_id IS NOT NULL) OR\n (action IN ('not-dispatched','interrupted') AND origin_run_id IS NULL AND attempt_id IS NULL)\n ),\n FOREIGN KEY (target_run_id, slot_id) REFERENCES slots(run_id, slot_id) ON DELETE CASCADE\n) STRICT;\nCREATE TABLE attachments (\n attachment_id TEXT PRIMARY KEY,\n owner_kind TEXT NOT NULL CHECK (owner_kind IN ('run','attempt')),\n owner_run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n owner_attempt_id TEXT,\n family TEXT NOT NULL,\n family_revision INTEGER NOT NULL CHECK (family_revision > 0),\n logical_identity TEXT,\n canonical_payload BLOB,\n canonical_digest TEXT CHECK (canonical_digest IS NULL OR length(canonical_digest) = 64),\n logical_inventory BLOB,\n inventory_digest TEXT CHECK (inventory_digest IS NULL OR length(inventory_digest) = 64),\n CHECK ((canonical_payload IS NULL) = (canonical_digest IS NULL)),\n CHECK ((logical_inventory IS NULL) = (inventory_digest IS NULL)),\n CHECK ((owner_kind = 'run' AND owner_attempt_id IS NULL) OR (owner_kind = 'attempt' AND owner_attempt_id IS NOT NULL)),\n UNIQUE (owner_kind, owner_run_id, owner_attempt_id, family),\n FOREIGN KEY (owner_run_id, owner_attempt_id) REFERENCES attempts(origin_run_id, attempt_id) ON DELETE CASCADE\n) STRICT;\nCREATE TABLE attachment_references (\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n target_owner_kind TEXT NOT NULL CHECK (target_owner_kind IN ('run','attempt')),\n target_family TEXT NOT NULL,\n canonical_payload BLOB NOT NULL,\n reference_digest TEXT NOT NULL CHECK (length(reference_digest) = 64),\n PRIMARY KEY (attachment_id, ordinal)\n) STRICT;\nCREATE TABLE collection_items (\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n logical_identity TEXT NOT NULL,\n canonical_payload BLOB NOT NULL,\n canonical_digest TEXT NOT NULL CHECK (length(canonical_digest) = 64),\n PRIMARY KEY (attachment_id, ordinal),\n UNIQUE (attachment_id, logical_identity)\n) STRICT;\nCREATE TABLE contents (\n content_id TEXT PRIMARY KEY,\n attachment_id TEXT NOT NULL REFERENCES attachments(attachment_id) ON DELETE CASCADE,\n logical_handle TEXT NOT NULL,\n byte_length INTEGER CHECK (byte_length IS NULL OR byte_length >= 0),\n overall_digest TEXT CHECK (overall_digest IS NULL OR length(overall_digest) = 64),\n chunk_count INTEGER CHECK (chunk_count IS NULL OR chunk_count >= 0),\n CHECK ((byte_length IS NULL) = (overall_digest IS NULL) AND (overall_digest IS NULL) = (chunk_count IS NULL)),\n UNIQUE (attachment_id, logical_handle)\n) STRICT;\nCREATE TABLE content_chunks (\n content_id TEXT NOT NULL REFERENCES contents(content_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n bytes BLOB NOT NULL CHECK (length(bytes) <= ${LEGACY_RECORD_SQLITE_CHUNK_BYTES}),\n chunk_digest TEXT NOT NULL CHECK (length(chunk_digest) = 64),\n PRIMARY KEY (content_id, ordinal)\n) STRICT;\nCREATE TABLE run_seal_entries (\n run_id TEXT NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n entry_kind TEXT NOT NULL CHECK (entry_kind IN ('record','run','slot','member','attempt','attachment','attachment-reference','collection-item','content','content-chunk')),\n logical_identity TEXT NOT NULL,\n digest TEXT NOT NULL CHECK (length(digest) = 64),\n PRIMARY KEY (run_id, ordinal),\n UNIQUE (run_id, entry_kind, logical_identity)\n) STRICT;\nCREATE INDEX attachments_owner_family ON attachments(owner_kind, owner_run_id, owner_attempt_id, family);\nCREATE UNIQUE INDEX attachments_owner_family_unique ON attachments(owner_kind, owner_run_id, coalesce(owner_attempt_id,''), family);\nCREATE INDEX members_origin_attempt ON members(origin_run_id, attempt_id, target_run_id);\nCREATE INDEX attempts_locator ON attempts(attempt_locator, origin_run_id, attempt_id);\nCREATE INDEX references_target_family ON attachment_references(target_owner_kind, target_family);\nCREATE INDEX content_chunks_page ON content_chunks(content_id, ordinal);\nCREATE INDEX coordination_tickets_fifo ON coordination_tickets(sequence);\nCREATE TRIGGER coordination_ticket_barrier_insert BEFORE INSERT ON coordination_tickets WHEN (SELECT barrier_state FROM record_metadata WHERE singleton=1)!='open' BEGIN SELECT RAISE(ABORT, 'ProjectDatabase writer barrier is not open'); END;\nCREATE TRIGGER coordination_writer_barrier_update BEFORE UPDATE ON coordination_state WHEN NEW.writer_ticket_id IS NOT NULL AND (SELECT barrier_state FROM record_metadata WHERE singleton=1)!='open' BEGIN SELECT RAISE(ABORT, 'ProjectDatabase writer barrier is not open'); END;\nCREATE TRIGGER runs_sealed_update BEFORE UPDATE ON runs WHEN OLD.status = 'sealed' BEGIN SELECT RAISE(ABORT, 'sealed run is immutable'); END;\nCREATE TRIGGER runs_sealed_delete BEFORE DELETE ON runs WHEN OLD.status = 'sealed' BEGIN SELECT RAISE(ABORT, 'sealed run is immutable'); END;\nCREATE TRIGGER slots_sealed_insert BEFORE INSERT ON slots WHEN (SELECT status FROM runs WHERE run_id = NEW.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER slots_sealed_update BEFORE UPDATE ON slots WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER slots_sealed_delete BEFORE DELETE ON slots WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_insert BEFORE INSERT ON attempts WHEN (SELECT status FROM runs WHERE run_id = NEW.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_update BEFORE UPDATE ON attempts WHEN (SELECT status FROM runs WHERE run_id = OLD.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attempts_sealed_delete BEFORE DELETE ON attempts WHEN (SELECT status FROM runs WHERE run_id = OLD.origin_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_insert BEFORE INSERT ON members WHEN (SELECT status FROM runs WHERE run_id = NEW.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_update BEFORE UPDATE ON members WHEN (SELECT status FROM runs WHERE run_id = OLD.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER members_sealed_delete BEFORE DELETE ON members WHEN (SELECT status FROM runs WHERE run_id = OLD.target_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_sealed_insert BEFORE INSERT ON attachments WHEN (SELECT status FROM runs WHERE run_id = NEW.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_insert BEFORE INSERT ON attachments WHEN NEW.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=NEW.owner_run_id AND attempt_id=NEW.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER attachments_sealed_update BEFORE UPDATE ON attachments WHEN (SELECT status FROM runs WHERE run_id = OLD.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_update BEFORE UPDATE ON attachments WHEN OLD.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=OLD.owner_run_id AND attempt_id=OLD.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER attachments_sealed_delete BEFORE DELETE ON attachments WHEN (SELECT status FROM runs WHERE run_id = OLD.owner_run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER attachments_attempt_published_delete BEFORE DELETE ON attachments WHEN OLD.owner_kind='attempt' AND (SELECT publication_state FROM attempts WHERE origin_run_id=OLD.owner_run_id AND attempt_id=OLD.owner_attempt_id)='published' BEGIN SELECT RAISE(ABORT, 'published attempt is immutable'); END;\nCREATE TRIGGER references_sealed_insert BEFORE INSERT ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER references_sealed_update BEFORE UPDATE ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER references_sealed_delete BEFORE DELETE ON attachment_references WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_insert BEFORE INSERT ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_update BEFORE UPDATE ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER items_sealed_delete BEFORE DELETE ON collection_items WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_insert BEFORE INSERT ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=NEW.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_update BEFORE UPDATE ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER contents_sealed_delete BEFORE DELETE ON contents WHEN (SELECT r.status FROM attachments a JOIN runs r ON r.run_id=a.owner_run_id WHERE a.attachment_id=OLD.attachment_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_insert BEFORE INSERT ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=NEW.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_update BEFORE UPDATE ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=OLD.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER chunks_sealed_delete BEFORE DELETE ON content_chunks WHEN (SELECT r.status FROM contents c JOIN attachments a ON a.attachment_id=c.attachment_id JOIN runs r ON r.run_id=a.owner_run_id WHERE c.content_id=OLD.content_id) != 'open' BEGIN SELECT RAISE(ABORT, 'run closure is immutable'); END;\nCREATE TRIGGER seal_entries_sealed_insert BEFORE INSERT ON run_seal_entries WHEN (SELECT status FROM runs WHERE run_id = NEW.run_id) != 'sealing' BEGIN SELECT RAISE(ABORT, 'Seal candidates require sealing state'); END;\nCREATE TRIGGER seal_entries_sealed_update BEFORE UPDATE ON run_seal_entries BEGIN SELECT RAISE(ABORT, 'Seal entries are immutable'); END;\nCREATE TRIGGER seal_entries_sealed_delete BEFORE DELETE ON run_seal_entries WHEN (SELECT status FROM runs WHERE run_id = OLD.run_id) != 'open' BEGIN SELECT RAISE(ABORT, 'Seal entries are immutable'); END;\n`;\n/** Run publication storage included in the exact 0.15 and 0.16 baselines. */\nconst RECORD_SQLITE_RUN_SQL = `\nCREATE TABLE run_publication_clock (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n revision INTEGER NOT NULL CHECK (revision >= 0)\n) STRICT;\nCREATE TABLE run_resources (\n run_id TEXT PRIMARY KEY,\n invocation_id TEXT NOT NULL,\n experiment_id TEXT NOT NULL,\n started_at TEXT NOT NULL,\n initial_writer_generation TEXT NOT NULL,\n current_writer_generation TEXT NOT NULL,\n terminal_state TEXT CHECK (terminal_state IS NULL OR terminal_state IN ('completed','interrupted','failed')),\n completed_at TEXT,\n created_revision INTEGER NOT NULL UNIQUE CHECK (created_revision > 0),\n close_revision INTEGER UNIQUE CHECK (close_revision IS NULL OR close_revision > created_revision),\n CHECK ((terminal_state IS NULL) = (completed_at IS NULL)),\n CHECK ((terminal_state IS NULL) = (close_revision IS NULL))\n) STRICT;\nCREATE TABLE run_expected_slots (\n run_id TEXT NOT NULL REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n eval_id TEXT NOT NULL,\n attempt_ordinal INTEGER NOT NULL CHECK (attempt_ordinal >= 0),\n execution_identity_digest TEXT NOT NULL CHECK (length(execution_identity_digest) = 64),\n PRIMARY KEY (run_id, slot_id),\n UNIQUE (run_id, ordinal)\n) STRICT;\nCREATE TABLE attempt_publications (\n attempt_id TEXT PRIMARY KEY,\n attempt_locator TEXT NOT NULL CHECK (length(attempt_locator) = 14 AND substr(attempt_locator,1,2) = '@1'),\n origin_run_id TEXT NOT NULL,\n origin_slot_id TEXT NOT NULL,\n closure_payload BLOB NOT NULL,\n closure_digest TEXT NOT NULL CHECK (length(closure_digest) = 64),\n published_revision INTEGER NOT NULL UNIQUE CHECK (published_revision > 0),\n FOREIGN KEY (origin_run_id, origin_slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_slot_bindings (\n target_run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n attempt_id TEXT NOT NULL REFERENCES attempt_publications(attempt_id) ON DELETE RESTRICT,\n origin_run_id TEXT NOT NULL,\n origin_slot_id TEXT NOT NULL,\n attempt_publication_revision INTEGER NOT NULL CHECK (attempt_publication_revision > 0),\n action TEXT NOT NULL CHECK (action IN ('executed','carried','accepted')),\n binding_revision INTEGER NOT NULL UNIQUE CHECK (binding_revision > 0),\n PRIMARY KEY (target_run_id, slot_id),\n FOREIGN KEY (target_run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT,\n FOREIGN KEY (origin_run_id, origin_slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_slot_absences (\n run_id TEXT NOT NULL,\n slot_id TEXT NOT NULL,\n reason TEXT NOT NULL CHECK (reason IN ('early-exit-satisfied','budget-exhausted','stopped-by-failure','interrupted-before-publication','dispatch-failed')),\n absence_revision INTEGER NOT NULL CHECK (absence_revision > 0),\n PRIMARY KEY (run_id, slot_id),\n FOREIGN KEY (run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE run_recoveries (\n run_id TEXT PRIMARY KEY REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n previous_writer_generation TEXT NOT NULL,\n recovery_writer_generation TEXT NOT NULL,\n evidence_kind TEXT NOT NULL,\n evidence_identity TEXT NOT NULL,\n evidence_observed_at TEXT NOT NULL,\n recovery_revision INTEGER NOT NULL UNIQUE CHECK (recovery_revision > 0)\n) STRICT;\nCREATE TABLE run_deletion_tombstones (\n run_id TEXT PRIMARY KEY REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n terminal_state TEXT NOT NULL CHECK (terminal_state IN ('completed','interrupted','failed')),\n deleted_at TEXT NOT NULL,\n deletion_revision INTEGER NOT NULL UNIQUE CHECK (deletion_revision > 0)\n) STRICT;\nCREATE INDEX run_resources_list ON run_resources(created_revision, run_id);\nCREATE INDEX run_resources_invocation ON run_resources(invocation_id, created_revision, run_id);\nCREATE INDEX attempt_publications_origin ON attempt_publications(origin_run_id, origin_slot_id);\nCREATE INDEX attempt_publications_locator ON attempt_publications(attempt_locator, origin_run_id, attempt_id);\nCREATE INDEX run_slot_bindings_attempt ON run_slot_bindings(attempt_id, target_run_id, slot_id);\nCREATE INDEX run_deletion_revision ON run_deletion_tombstones(deletion_revision, run_id);\nINSERT INTO run_publication_clock(singleton,revision) VALUES (1,0);\n`;\n/** Invocation and case coordination are durable rows in the canonical database. */\nconst RECORD_SQLITE_COORDINATION_SQL = `\nCREATE TABLE invocation_sessions (\n invocation_id TEXT PRIMARY KEY,\n state TEXT NOT NULL CHECK (state IN ('active','recovering','completed','interrupted','failed')),\n owner_id TEXT NOT NULL,\n owner_generation INTEGER NOT NULL CHECK (owner_generation > 0),\n owner_host TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_boot_id TEXT NOT NULL,\n owner_process_start TEXT NOT NULL,\n started_at TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL,\n active_projection BLOB,\n recovering_at TEXT,\n closed_at TEXT,\n terminal_projection BLOB,\n CHECK ((state IN ('completed','interrupted','failed')) = (closed_at IS NOT NULL)),\n CHECK ((state IN ('completed','interrupted','failed')) = (terminal_projection IS NOT NULL)),\n CHECK (state IN ('active','recovering') OR active_projection IS NULL),\n CHECK ((state = 'recovering') = (recovering_at IS NOT NULL))\n) STRICT;\nCREATE TABLE invocation_session_experiments (\n invocation_id TEXT NOT NULL REFERENCES invocation_sessions(invocation_id) ON DELETE RESTRICT,\n experiment_id TEXT NOT NULL,\n run_id TEXT NOT NULL UNIQUE REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n PRIMARY KEY (invocation_id, experiment_id),\n UNIQUE (invocation_id, ordinal)\n) STRICT;\nCREATE TABLE invocation_session_queued_attempts (\n invocation_id TEXT NOT NULL REFERENCES invocation_sessions(invocation_id) ON DELETE RESTRICT,\n attempt_id TEXT NOT NULL,\n run_id TEXT NOT NULL REFERENCES run_resources(run_id) ON DELETE RESTRICT,\n slot_id TEXT NOT NULL,\n ordinal INTEGER NOT NULL CHECK (ordinal >= 0),\n PRIMARY KEY (invocation_id, attempt_id),\n UNIQUE (invocation_id, ordinal),\n FOREIGN KEY (run_id, slot_id) REFERENCES run_expected_slots(run_id, slot_id) ON DELETE RESTRICT\n) STRICT;\nCREATE TABLE case_locks (\n case_id TEXT PRIMARY KEY,\n owner_id TEXT NOT NULL,\n owner_generation INTEGER NOT NULL CHECK (owner_generation > 0),\n owner_host TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_boot_id TEXT NOT NULL,\n owner_process_start TEXT NOT NULL,\n acquired_at TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL\n) STRICT;\nCREATE INDEX invocation_sessions_state ON invocation_sessions(state, started_at, invocation_id);\nCREATE INDEX invocation_session_experiments_invocation ON invocation_session_experiments(invocation_id, ordinal);\nCREATE INDEX invocation_session_queued_attempts_run ON invocation_session_queued_attempts(run_id, slot_id);\nCREATE INDEX case_locks_owner ON case_locks(owner_id, owner_generation);\nCREATE TABLE teardown_obligations (\n obligation_id TEXT PRIMARY KEY,\n experiment_id TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n generation INTEGER NOT NULL DEFAULT 1 CHECK (generation > 0),\n payload BLOB NOT NULL,\n UNIQUE (experiment_id, owner_pid)\n) STRICT;\nCREATE TABLE shared_state_generations (\n state_key TEXT NOT NULL,\n generation INTEGER NOT NULL CHECK (generation > 0),\n parent_generation INTEGER NOT NULL CHECK (parent_generation >= 0),\n state_kind TEXT NOT NULL CHECK (state_kind IN ('active','recovering','free')),\n owner_token TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n owner_process_identity TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL,\n payload BLOB NOT NULL,\n PRIMARY KEY (state_key, generation),\n CHECK (parent_generation = generation - 1)\n) STRICT;\nCREATE TABLE kept_sandboxes (\n entry_id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n sandbox_id TEXT NOT NULL,\n kept_at TEXT NOT NULL,\n operation_generation INTEGER NOT NULL DEFAULT 0 CHECK (operation_generation >= 0),\n payload BLOB NOT NULL,\n UNIQUE (provider, sandbox_id)\n) STRICT;\nCREATE TABLE kept_sandbox_operation_leases (\n entry_id TEXT PRIMARY KEY REFERENCES kept_sandboxes(entry_id) ON DELETE CASCADE,\n generation INTEGER NOT NULL CHECK (generation > 0),\n token TEXT NOT NULL,\n holder TEXT NOT NULL,\n owner_pid INTEGER NOT NULL CHECK (owner_pid > 0),\n owner_host TEXT NOT NULL,\n owner_process_identity TEXT NOT NULL,\n operation TEXT NOT NULL,\n acquired_at TEXT NOT NULL,\n ttl_ms INTEGER NOT NULL CHECK (ttl_ms > 0)\n) STRICT;\nCREATE INDEX teardown_obligations_experiment ON teardown_obligations(experiment_id, owner_pid);\nCREATE INDEX shared_state_generations_head ON shared_state_generations(state_key, generation DESC);\nCREATE INDEX kept_sandboxes_kept_at ON kept_sandboxes(kept_at, entry_id);\n`;\n/**\n * Exact historical schema used by ProjectDatabase 0.15 and 0.16. Keep this\n * source immutable: Host-owned migration validates it before interpreting any\n * legacy payload bytes.\n */\nexport const RECORD_SQLITE_LEGACY_BASELINE_SQL = `${RECORD_SQLITE_CORE_SQL}\\n${RECORD_SQLITE_RUN_SQL}\\n${RECORD_SQLITE_COORDINATION_SQL}`;\nexport const RECORD_SQLITE_LEGACY_TABLE_NAMES = Object.freeze([\n \"record_metadata\",\n \"coordination_state\",\n \"coordination_tickets\",\n \"runs\",\n \"slots\",\n \"attempts\",\n \"members\",\n \"attachments\",\n \"attachment_references\",\n \"collection_items\",\n \"contents\",\n \"content_chunks\",\n \"run_seal_entries\",\n \"run_publication_clock\",\n \"run_resources\",\n \"run_expected_slots\",\n \"attempt_publications\",\n \"run_slot_bindings\",\n \"run_slot_absences\",\n \"run_recoveries\",\n \"run_deletion_tombstones\",\n \"invocation_sessions\",\n \"invocation_session_experiments\",\n \"invocation_session_queued_attempts\",\n \"case_locks\",\n \"teardown_obligations\",\n \"shared_state_generations\",\n \"kept_sandboxes\",\n \"kept_sandbox_operation_leases\",\n] as const);\n/** Complete fixed table allowlist for the historical 0.17 `ne_` namespace. */\nexport const RECORD_SQLITE_017_TABLE_NAMES = Object.freeze([\n \"ne_record_metadata\",\n \"ne_coordination_state\",\n \"ne_coordination_tickets\",\n \"ne_runs\",\n \"ne_slots\",\n \"ne_attempts\",\n \"ne_members\",\n \"ne_attachments\",\n \"ne_attachment_references\",\n \"ne_collection_items\",\n \"ne_contents\",\n \"ne_content_chunks\",\n \"ne_run_seal_entries\",\n \"ne_run_publication_clock\",\n \"ne_run_resources\",\n \"ne_run_expected_slots\",\n \"ne_attempt_publications\",\n \"ne_run_slot_bindings\",\n \"ne_run_slot_absences\",\n \"ne_run_recoveries\",\n \"ne_run_deletion_tombstones\",\n \"ne_invocation_sessions\",\n \"ne_invocation_session_experiments\",\n \"ne_invocation_session_queued_attempts\",\n \"ne_case_locks\",\n \"ne_teardown_obligations\",\n \"ne_shared_state_generations\",\n \"ne_kept_sandboxes\",\n \"ne_kept_sandbox_operation_leases\",\n \"ne_migration_state\",\n] as const);\nexport const RECORD_SQLITE_SCHEMA_SQL = RECORD_SQLITE_BASELINE_SQL;\nexport const RECORD_SQLITE_BASELINE_FINGERPRINT = createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.19\\0\")\n .update(RECORD_SQLITE_BASELINE_SQL)\n .digest(\"hex\");\nexport const RECORD_SQLITE_017_FINGERPRINT = createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.17\\0\")\n .update(RECORD_SQLITE_017_BASELINE_SQL)\n .digest(\"hex\");\nexport const RECORD_SQLITE_LEGACY_FINGERPRINTS = Object.freeze({\n \"niceeval.project-database/0.15\": createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.15\\0\")\n .update(RECORD_SQLITE_LEGACY_BASELINE_SQL)\n .digest(\"hex\"),\n \"niceeval.project-database/0.16\": createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.16\\0\")\n .update(RECORD_SQLITE_LEGACY_BASELINE_SQL)\n .digest(\"hex\"),\n});\nexport { RECORD_SQLITE_018_BASELINE_SQL } from \"./legacy-schema-018.ts\";\nexport const RECORD_SQLITE_018_TABLE_NAMES = Object.freeze(RECORD_SQLITE_017_TABLE_NAMES.map((table) => table.replace(/^ne_/u, \"ne18_\")));\nexport const RECORD_SQLITE_018_FINGERPRINT = createHash(\"sha256\")\n .update(\"niceeval.project-database.bootstrap/0.18\\0\")\n .update(RECORD_SQLITE_018_BASELINE_SQL)\n .digest(\"hex\");\n"]}
|