@substrat-run/kernel 0.137.0 → 0.139.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/attachment-extractor.d.ts +9 -1
- package/dist/attachment-extractor.d.ts.map +1 -1
- package/dist/attachment-extractor.js +21 -1
- package/dist/attachment-extractor.js.map +1 -1
- package/dist/attachment-text.d.ts +64 -0
- package/dist/attachment-text.d.ts.map +1 -1
- package/dist/attachment-text.js +87 -16
- package/dist/attachment-text.js.map +1 -1
- package/dist/attribution.d.ts +36 -3
- package/dist/attribution.d.ts.map +1 -1
- package/dist/attribution.js +21 -8
- package/dist/attribution.js.map +1 -1
- package/dist/delivery-refusal.d.ts +21 -0
- package/dist/delivery-refusal.d.ts.map +1 -0
- package/dist/delivery-refusal.js +21 -0
- package/dist/delivery-refusal.js.map +1 -0
- package/dist/entity-state-reads.d.ts +43 -0
- package/dist/entity-state-reads.d.ts.map +1 -0
- package/dist/entity-state-reads.js +135 -0
- package/dist/entity-state-reads.js.map +1 -0
- package/dist/entity-state.d.ts +177 -0
- package/dist/entity-state.d.ts.map +1 -0
- package/dist/entity-state.js +345 -0
- package/dist/entity-state.js.map +1 -0
- package/dist/findings.d.ts +143 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +463 -0
- package/dist/findings.js.map +1 -0
- package/dist/index.d.ts +30 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -14
- package/dist/index.js.map +1 -1
- package/dist/job-run.d.ts +309 -48
- package/dist/job-run.d.ts.map +1 -1
- package/dist/job-run.js +388 -80
- package/dist/job-run.js.map +1 -1
- package/dist/list-index.d.ts +25 -3
- package/dist/list-index.d.ts.map +1 -1
- package/dist/list-index.js +70 -26
- package/dist/list-index.js.map +1 -1
- package/dist/membership-executor.d.ts +109 -0
- package/dist/membership-executor.d.ts.map +1 -0
- package/dist/membership-executor.js +261 -0
- package/dist/membership-executor.js.map +1 -0
- package/dist/membership-fence.d.ts +57 -0
- package/dist/membership-fence.d.ts.map +1 -0
- package/dist/membership-fence.js +90 -0
- package/dist/membership-fence.js.map +1 -0
- package/dist/module-migrations.d.ts +6 -3
- package/dist/module-migrations.d.ts.map +1 -1
- package/dist/module-migrations.js +12 -5
- package/dist/module-migrations.js.map +1 -1
- package/dist/operation-series.d.ts +58 -0
- package/dist/operation-series.d.ts.map +1 -0
- package/dist/operation-series.js +63 -0
- package/dist/operation-series.js.map +1 -0
- package/dist/peer.d.ts +13 -8
- package/dist/peer.d.ts.map +1 -1
- package/dist/peer.js +13 -14
- package/dist/peer.js.map +1 -1
- package/dist/permission-eval.d.ts +80 -1
- package/dist/permission-eval.d.ts.map +1 -1
- package/dist/permission-eval.js +164 -18
- package/dist/permission-eval.js.map +1 -1
- package/dist/platform-sweep.d.ts +7 -1
- package/dist/platform-sweep.d.ts.map +1 -1
- package/dist/platform-sweep.js +12 -0
- package/dist/platform-sweep.js.map +1 -1
- package/dist/read-only-sql.d.ts +2 -26
- package/dist/read-only-sql.d.ts.map +1 -1
- package/dist/read-only-sql.js +13 -9
- package/dist/read-only-sql.js.map +1 -1
- package/dist/scope-copy.d.ts +18 -0
- package/dist/scope-copy.d.ts.map +1 -1
- package/dist/scope-copy.js +18 -0
- package/dist/scope-copy.js.map +1 -1
- package/dist/scope-host.d.ts +416 -13
- package/dist/scope-host.d.ts.map +1 -1
- package/dist/scope-host.js +51 -2
- package/dist/scope-host.js.map +1 -1
- package/dist/scope-role-admin.d.ts +68 -0
- package/dist/scope-role-admin.d.ts.map +1 -0
- package/dist/scope-role-admin.js +80 -0
- package/dist/scope-role-admin.js.map +1 -0
- package/dist/search-index.d.ts +13 -1
- package/dist/search-index.d.ts.map +1 -1
- package/dist/search-index.js +9 -16
- package/dist/search-index.js.map +1 -1
- package/dist/spine-guard.d.ts +64 -2
- package/dist/spine-guard.d.ts.map +1 -1
- package/dist/spine-guard.js +345 -10
- package/dist/spine-guard.js.map +1 -1
- package/dist/spine-restore.d.ts +7 -2
- package/dist/spine-restore.d.ts.map +1 -1
- package/dist/spine-restore.js +13 -5
- package/dist/spine-restore.js.map +1 -1
- package/dist/sql-identifier.d.ts +12 -0
- package/dist/sql-identifier.d.ts.map +1 -0
- package/dist/sql-identifier.js +17 -0
- package/dist/sql-identifier.js.map +1 -0
- package/dist/system-switch-record.d.ts +277 -77
- package/dist/system-switch-record.d.ts.map +1 -1
- package/dist/system-switch-record.js +322 -105
- package/dist/system-switch-record.js.map +1 -1
- package/dist/system-switch.d.ts +110 -14
- package/dist/system-switch.d.ts.map +1 -1
- package/dist/system-switch.js +92 -17
- package/dist/system-switch.js.map +1 -1
- package/dist/timeline.d.ts +23 -0
- package/dist/timeline.d.ts.map +1 -1
- package/dist/timeline.js +30 -0
- package/dist/timeline.js.map +1 -1
- package/dist/ulid.d.ts +5 -0
- package/dist/ulid.d.ts.map +1 -1
- package/dist/ulid.js +9 -0
- package/dist/ulid.js.map +1 -1
- package/dist/vertical-events.d.ts +7 -1
- package/dist/vertical-events.d.ts.map +1 -1
- package/dist/vertical-events.js +14 -0
- package/dist/vertical-events.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { liveTupleSql } from './permission-eval.js';
|
|
2
|
+
import { PEER_SUBJECT_PREFIX, } from './system-switch.js';
|
|
2
3
|
/** The record's table name, as the DDL below spells it. */
|
|
3
4
|
export const SYSTEM_SWITCHES_TABLE = '_substrat_system_switches';
|
|
5
|
+
/** The peer switch's record (#2029), as `PEER_SWITCHES_DDL` spells it. */
|
|
6
|
+
const PEER_SWITCHES_TABLE = '_substrat_peer_switches';
|
|
4
7
|
/**
|
|
5
8
|
* The table. Interpolated into both adapters' directory DDL, so `lint:spine-ddl` sees the
|
|
6
9
|
* one spelling on each side. No CHECK on `position`: the drift gate does not compare
|
|
@@ -26,35 +29,158 @@ export const SYSTEM_SWITCHES_DDL = `
|
|
|
26
29
|
CREATE INDEX IF NOT EXISTS _substrat_system_switches_operation
|
|
27
30
|
ON _substrat_system_switches (operation_id);
|
|
28
31
|
`;
|
|
32
|
+
/**
|
|
33
|
+
* The peer switch's record (#2029): `SYSTEM_SWITCHES_DDL`'s shape, keyed by the calling
|
|
34
|
+
* vertical's slug. No fleet read pages it yet, so it carries none of that read's indexes; every
|
|
35
|
+
* read here names (tenant, scope), the primary key's prefix.
|
|
36
|
+
*/
|
|
37
|
+
export const PEER_SWITCHES_DDL = `
|
|
38
|
+
CREATE TABLE IF NOT EXISTS _substrat_peer_switches (
|
|
39
|
+
tenant_id TEXT NOT NULL,
|
|
40
|
+
scope_id TEXT NOT NULL,
|
|
41
|
+
-- The calling vertical's slug, as the target's peers declaration names it.
|
|
42
|
+
vertical TEXT NOT NULL,
|
|
43
|
+
position TEXT NOT NULL,
|
|
44
|
+
actor TEXT NOT NULL,
|
|
45
|
+
reason TEXT NOT NULL,
|
|
46
|
+
operation_id TEXT NOT NULL,
|
|
47
|
+
switched_at TEXT NOT NULL,
|
|
48
|
+
PRIMARY KEY (tenant_id, scope_id, vertical)
|
|
49
|
+
);
|
|
50
|
+
`;
|
|
51
|
+
/**
|
|
52
|
+
* Everything that differs between the two kinds, in one place: where each is recorded, how its
|
|
53
|
+
* switch calls and re-asserts are written to the admin log, and how a call that held nothing is
|
|
54
|
+
* refused. Every function below reads this table; none branches on the kind itself.
|
|
55
|
+
*/
|
|
56
|
+
const RECORDS = {
|
|
57
|
+
system: {
|
|
58
|
+
table: SYSTEM_SWITCHES_TABLE,
|
|
59
|
+
ddl: SYSTEM_SWITCHES_DDL,
|
|
60
|
+
key: 'module_id',
|
|
61
|
+
subjectPrefix: 'system:',
|
|
62
|
+
actions: ['revokeFromSystem', 'restoreToSystem'],
|
|
63
|
+
reassertAction: 'reassertSystemSwitch',
|
|
64
|
+
/** The payload fields naming the subject and its position (`moduleId` + `schedules`). */
|
|
65
|
+
payloadKey: 'moduleId',
|
|
66
|
+
positionField: 'schedules',
|
|
67
|
+
notFound: (scopeId, key, to) => `scope ${scopeId} holds no system grant for module '${key}' — nothing to switch ${to} ` +
|
|
68
|
+
`(check the module id: it is the module's manifest id, e.g. '@substrat-run/engine-absence')`,
|
|
69
|
+
},
|
|
70
|
+
peer: {
|
|
71
|
+
table: PEER_SWITCHES_TABLE,
|
|
72
|
+
ddl: PEER_SWITCHES_DDL,
|
|
73
|
+
key: 'vertical',
|
|
74
|
+
subjectPrefix: PEER_SUBJECT_PREFIX,
|
|
75
|
+
actions: ['revokeFromPeer', 'restoreToPeer'],
|
|
76
|
+
reassertAction: 'reassertPeerSwitch',
|
|
77
|
+
payloadKey: 'vertical',
|
|
78
|
+
positionField: 'calls',
|
|
79
|
+
notFound: (scopeId, key, to) => `scope ${scopeId} holds no grant for peer '${key}' — nothing to switch ${to} ` +
|
|
80
|
+
`(check the slug: it is the calling vertical's registry id, as the target's \`peers\` names it)`,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
/** Every kind, for the passes that walk them all (a scope's reap, a directory restore). */
|
|
84
|
+
export const SWITCH_KINDS = ['system', 'peer'];
|
|
85
|
+
/** The admin-log action a switch call of this kind writes its intent and outcome rows under. */
|
|
86
|
+
export const switchActionOf = (kind, to) => RECORDS[kind].actions[to === 'off' ? 0 : 1];
|
|
87
|
+
/** The `not_found` a switch call that held nothing answers — one wording per kind, both adapters. */
|
|
88
|
+
export const switchNotFoundMessage = (kind, scopeId, key, to) => RECORDS[kind].notFound(scopeId, key, to);
|
|
89
|
+
/**
|
|
90
|
+
* #2045: the `conflict` a switch call answers when a newer call on the same subject got there first —
|
|
91
|
+
* its record write or its move was refused by the fence, and nothing of it was written.
|
|
92
|
+
*/
|
|
93
|
+
export const switchSupersededMessage = (kind, scopeId, key, to) => `a newer switch call on ${kind === 'system' ? `module '${key}'` : `peer '${key}'`} on scope ${scopeId} landed first, ` +
|
|
94
|
+
`so this one (${to}) switched nothing. Read the scope's switch status before retrying.`;
|
|
95
|
+
/** The record table of one kind. */
|
|
96
|
+
export const switchesTableOf = (kind) => RECORDS[kind].table;
|
|
97
|
+
/**
|
|
98
|
+
* #2045: the subjects whose scope may not be where their record says. A WRITE-AHEAD intent
|
|
99
|
+
* (Codex r3): the switch call's record write marks its subject owed in the same directory write,
|
|
100
|
+
* BEFORE anything moves, and the mark is cleared only once the scope has confirmed a move under a
|
|
101
|
+
* fence at least the call's own (`clearSwitchOwed`). So every way a move can go wrong — it throws,
|
|
102
|
+
* its answer is lost, the RPC that would have cleared the mark fails, the caller dies — leaves the
|
|
103
|
+
* mark set, and the next re-assert moves the scope to its record, in EITHER direction, under the
|
|
104
|
+
* record's fence. Without a mark a re-assert keeps #1674's rule: a record never turns anything on.
|
|
105
|
+
*
|
|
106
|
+
* `operation_id` is the newest call that marked the subject. A confirmation under an older fence
|
|
107
|
+
* clears nothing, so a newer call's mark outlives an older call's success.
|
|
108
|
+
*/
|
|
109
|
+
export const SWITCH_OWED_DDL = `
|
|
110
|
+
CREATE TABLE IF NOT EXISTS _substrat_switch_owed (
|
|
111
|
+
tenant_id TEXT NOT NULL,
|
|
112
|
+
scope_id TEXT NOT NULL,
|
|
113
|
+
-- 'system' or 'peer', and the module id or the peer's slug.
|
|
114
|
+
kind TEXT NOT NULL,
|
|
115
|
+
subject TEXT NOT NULL,
|
|
116
|
+
-- The newest switch call that marked it: a ULID, so it orders by text.
|
|
117
|
+
operation_id TEXT NOT NULL,
|
|
118
|
+
PRIMARY KEY (tenant_id, scope_id, kind, subject)
|
|
119
|
+
);
|
|
120
|
+
`;
|
|
121
|
+
/** #2045: mark one subject's scope owed a re-assert, by this switch call. Never moves a mark backwards. */
|
|
122
|
+
export function markSwitchOwed(db, kind, tenantId, scopeId, key, operationId) {
|
|
123
|
+
db.run(`INSERT INTO _substrat_switch_owed (tenant_id, scope_id, kind, subject, operation_id) VALUES (?, ?, ?, ?, ?)
|
|
124
|
+
ON CONFLICT (tenant_id, scope_id, kind, subject) DO UPDATE SET operation_id = excluded.operation_id
|
|
125
|
+
WHERE excluded.operation_id > _substrat_switch_owed.operation_id`, tenantId, scopeId, kind, key, operationId);
|
|
126
|
+
}
|
|
127
|
+
/** #2045: the subjects of one kind marked owed on one scope, each with the newest call that marked it. */
|
|
128
|
+
export function switchesOwedOf(db, kind, tenantId, scopeId) {
|
|
129
|
+
const rows = db.all(`SELECT subject, operation_id FROM _substrat_switch_owed
|
|
130
|
+
WHERE tenant_id = ? AND scope_id = ? AND kind = ? ORDER BY subject`, tenantId, scopeId, kind);
|
|
131
|
+
return new Map(rows.map((r) => [String(r.subject), String(r.operation_id)]));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* #2045: the scope confirmed a move of this subject under `fence` — its mark goes, unless a newer
|
|
135
|
+
* call has marked it since (a compare-and-set on the mark's operation id).
|
|
136
|
+
*/
|
|
137
|
+
export function clearSwitchOwed(db, kind, tenantId, scopeId, key, fence) {
|
|
138
|
+
db.run(`DELETE FROM _substrat_switch_owed
|
|
139
|
+
WHERE tenant_id = ? AND scope_id = ? AND kind = ? AND subject = ? AND operation_id <= ?`, tenantId, scopeId, kind, key, fence);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* #2045: does any subject on this scope still owe a re-assert? While one does, the scope's
|
|
143
|
+
* reconcile receipt is not written (the control plane's `markScopeProvisioned`), so the sweep keeps
|
|
144
|
+
* reconciling it until a re-assert has settled every mark.
|
|
145
|
+
*/
|
|
146
|
+
export function scopeOwesSwitch(db, scopeId) {
|
|
147
|
+
return db.all(`SELECT 1 FROM _substrat_switch_owed WHERE scope_id = ? LIMIT 1`, scopeId).length > 0;
|
|
148
|
+
}
|
|
149
|
+
/** Each kind's DDL, for a pass that creates a table with its backfill. */
|
|
150
|
+
export const switchesDdlOf = (kind) => RECORDS[kind].ddl;
|
|
29
151
|
/**
|
|
30
152
|
* The one-time backfill from the admin log: every switch moved before the record existed.
|
|
31
153
|
* Without it, those are exactly the switches a wipe would still lose.
|
|
32
154
|
*
|
|
33
|
-
* It reads the admin-log shape
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* `
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* (
|
|
155
|
+
* It reads the admin-log shape the switch calls have written since they existed
|
|
156
|
+
* (`revokeFromSystem` / `restoreToSystem` since #1666, `revokeFromPeer` / `restoreToPeer`
|
|
157
|
+
* since #1706), two rows per call sharing `after.operationId`: an `intent` row carrying the
|
|
158
|
+
* subject (`after.moduleId`, or `after.vertical` for a peer) and `after.reason`, then an
|
|
159
|
+
* outcome row whose `after.phase` is `applied`, `refused` or `failed`. Only calls whose
|
|
160
|
+
* outcome is `applied` count, because a refused call moved nothing and a failed one may not
|
|
161
|
+
* have. Of those, only the LATEST per (tenant, scope, subject) is taken, by the intent's ULID
|
|
162
|
+
* id. `at` is the intent's, the same instant the status read's who/why join reports. A key
|
|
163
|
+
* whose calls include no applied OFF gets no row, even when its latest applied call is an ON:
|
|
164
|
+
* history wrote no scope fence (#2045), so there is no fence for such a row to keep pace with,
|
|
165
|
+
* and an ON-only key needs no record to re-assert.
|
|
43
166
|
*
|
|
44
167
|
* `INSERT OR IGNORE`, so a row the switch wrote itself is never overwritten by history.
|
|
45
168
|
* The adapters run it only on the construction that creates the table, so it runs once.
|
|
46
169
|
*/
|
|
47
|
-
export
|
|
170
|
+
export function switchesBackfillSqlOf(kind) {
|
|
171
|
+
const { table, key, actions, payloadKey } = RECORDS[kind];
|
|
172
|
+
const [revoke, restore] = actions;
|
|
173
|
+
return `
|
|
48
174
|
WITH applied AS (
|
|
49
175
|
SELECT DISTINCT action, json_extract(after, '$.operationId') AS operation_id
|
|
50
176
|
FROM _substrat_admin_log
|
|
51
|
-
WHERE action IN ('
|
|
177
|
+
WHERE action IN ('${revoke}', '${restore}')
|
|
52
178
|
AND json_extract(after, '$.phase') = 'applied'
|
|
53
179
|
),
|
|
54
180
|
intents AS (
|
|
55
181
|
SELECT i.id AS id, i.tenant_id AS tenant_id, i.scope_id AS scope_id,
|
|
56
|
-
json_extract(i.after, '
|
|
57
|
-
CASE i.action WHEN '
|
|
182
|
+
json_extract(i.after, '$.${payloadKey}') AS subject_key,
|
|
183
|
+
CASE i.action WHEN '${revoke}' THEN 'off' ELSE 'on' END AS position,
|
|
58
184
|
i.actor AS actor,
|
|
59
185
|
json_extract(i.after, '$.reason') AS reason,
|
|
60
186
|
json_extract(i.after, '$.operationId') AS operation_id,
|
|
@@ -62,35 +188,37 @@ export const SYSTEM_SWITCHES_BACKFILL_SQL = `
|
|
|
62
188
|
FROM _substrat_admin_log i
|
|
63
189
|
JOIN applied a
|
|
64
190
|
ON a.action = i.action AND a.operation_id = json_extract(i.after, '$.operationId')
|
|
65
|
-
WHERE i.action IN ('
|
|
191
|
+
WHERE i.action IN ('${revoke}', '${restore}')
|
|
66
192
|
AND i.tenant_id IS NOT NULL AND i.scope_id IS NOT NULL
|
|
67
193
|
AND json_extract(i.after, '$.phase') = 'intent'
|
|
68
|
-
AND json_extract(i.after, '
|
|
194
|
+
AND json_extract(i.after, '$.${payloadKey}') IS NOT NULL
|
|
69
195
|
AND json_extract(i.after, '$.reason') IS NOT NULL
|
|
70
196
|
),
|
|
71
197
|
ranked AS (
|
|
72
198
|
SELECT *,
|
|
73
|
-
ROW_NUMBER() OVER (PARTITION BY tenant_id, scope_id,
|
|
74
|
-
MAX(position = 'off') OVER (PARTITION BY tenant_id, scope_id,
|
|
199
|
+
ROW_NUMBER() OVER (PARTITION BY tenant_id, scope_id, subject_key ORDER BY id DESC) AS latest,
|
|
200
|
+
MAX(position = 'off') OVER (PARTITION BY tenant_id, scope_id, subject_key) AS ever_off
|
|
75
201
|
FROM intents
|
|
76
202
|
)
|
|
77
|
-
INSERT OR IGNORE INTO
|
|
78
|
-
(tenant_id, scope_id,
|
|
79
|
-
SELECT tenant_id, scope_id,
|
|
203
|
+
INSERT OR IGNORE INTO ${table}
|
|
204
|
+
(tenant_id, scope_id, ${key}, position, actor, reason, operation_id, switched_at)
|
|
205
|
+
SELECT tenant_id, scope_id, subject_key, position, actor, reason, operation_id, at
|
|
80
206
|
FROM ranked
|
|
81
207
|
WHERE latest = 1 AND ever_off = 1
|
|
82
208
|
`;
|
|
209
|
+
}
|
|
83
210
|
/**
|
|
84
|
-
* Does a dump carry
|
|
85
|
-
* backfills it from the dump's own admin log only when the dump did not (#1898). Compared
|
|
211
|
+
* Does a dump carry this kind's record table? A directory restore builds the table either way,
|
|
212
|
+
* and backfills it from the dump's own admin log only when the dump did not (#1898). Compared
|
|
86
213
|
* without case, as SQLite resolves a table name.
|
|
87
214
|
*/
|
|
88
|
-
export function
|
|
89
|
-
|
|
215
|
+
export function dumpCarriesSwitches(names, kind) {
|
|
216
|
+
const table = RECORDS[kind].table;
|
|
217
|
+
return names.some((n) => n.toLowerCase() === table);
|
|
90
218
|
}
|
|
91
|
-
/** "Does
|
|
92
|
-
export function
|
|
93
|
-
return (db.all(`SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = ?`,
|
|
219
|
+
/** "Does this kind's record table exist yet?" — asked BEFORE the DDL, so the backfill runs once. */
|
|
220
|
+
export function switchesTableExists(db, kind) {
|
|
221
|
+
return (db.all(`SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = ?`, RECORDS[kind].table)
|
|
94
222
|
.length > 0);
|
|
95
223
|
}
|
|
96
224
|
const positionOf = (v) => (v === 'on' ? 'on' : 'off');
|
|
@@ -144,10 +272,14 @@ export function listSystemSwitchRecords(db, filter = {}) {
|
|
|
144
272
|
}
|
|
145
273
|
return db.all(sql, ...params).map(rowOf);
|
|
146
274
|
}
|
|
147
|
-
/**
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
275
|
+
/**
|
|
276
|
+
* One scope's record rows of one kind, by subject (module id or peer slug) — what the per-scope
|
|
277
|
+
* status read joins as `recorded`, and what a re-assert reverts a stale carry against.
|
|
278
|
+
*/
|
|
279
|
+
export function switchRecordsOf(db, kind, tenantId, scopeId) {
|
|
280
|
+
const { table, key } = RECORDS[kind];
|
|
281
|
+
const rows = db.all(`SELECT ${key} AS k, position FROM ${table} WHERE tenant_id = ? AND scope_id = ?`, tenantId, scopeId);
|
|
282
|
+
return new Map(rows.map((r) => [String(r.k), positionOf(r.position)]));
|
|
151
283
|
}
|
|
152
284
|
/**
|
|
153
285
|
* The per-scope status read's rows with the record joined on. Each module the scope
|
|
@@ -164,12 +296,12 @@ export function withRecorded(states, recorded) {
|
|
|
164
296
|
}
|
|
165
297
|
return rows.sort((a, b) => (a.moduleId < b.moduleId ? -1 : a.moduleId > b.moduleId ? 1 : 0));
|
|
166
298
|
}
|
|
167
|
-
/** The
|
|
168
|
-
export function
|
|
299
|
+
/** The subjects of one kind (module ids, or peer slugs) a reconcile must re-assert OFF on this scope. */
|
|
300
|
+
export function switchedOffOf(db, kind, tenantId, scopeId) {
|
|
301
|
+
const { table, key } = RECORDS[kind];
|
|
169
302
|
return db
|
|
170
|
-
.all(`SELECT
|
|
171
|
-
|
|
172
|
-
.map((r) => String(r.module_id));
|
|
303
|
+
.all(`SELECT ${key} AS k FROM ${table} WHERE tenant_id = ? AND scope_id = ? AND position = 'off' ORDER BY ${key}`, tenantId, scopeId)
|
|
304
|
+
.map((r) => String(r.k));
|
|
173
305
|
}
|
|
174
306
|
/**
|
|
175
307
|
* The scopes of one tenant the record holds a module OFF on — what a tenant-level
|
|
@@ -185,35 +317,75 @@ export function scopesSwitchedOffFor(db, tenantId, moduleId) {
|
|
|
185
317
|
.map((r) => String(r.scope_id));
|
|
186
318
|
}
|
|
187
319
|
/**
|
|
188
|
-
* Does the tenant hold a live TENANT-level grant for this
|
|
189
|
-
* directory, where the tenant tuple lives, and handed to the switch as
|
|
190
|
-
* whose only authority on a scope is a tenant-level grant has nothing
|
|
191
|
-
* for the switch to find, and must still be switchable there. One
|
|
192
|
-
* directories; the same "live" the evaluator judges a grant by
|
|
320
|
+
* Does the tenant hold a live TENANT-level grant for this subject (#1823, and #2030 for a peer)?
|
|
321
|
+
* Asked of the directory, where the tenant tuple lives, and handed to the switch as
|
|
322
|
+
* `tenantHeld`: a subject whose only authority on a scope is a tenant-level grant has nothing
|
|
323
|
+
* in the scope's storage for the switch to find, and must still be switchable there. One
|
|
324
|
+
* statement on both adapters' directories; the same "live" the evaluator judges a grant by
|
|
325
|
+
* (unrevoked, unexpired at `now`).
|
|
193
326
|
*/
|
|
194
|
-
export function
|
|
327
|
+
export function tenantHoldsGrant(db, kind, tenantId, key, now) {
|
|
195
328
|
const row = db.all(`SELECT EXISTS (SELECT 1 FROM _substrat_tenant_tuples
|
|
196
329
|
WHERE tenant_id = ? AND subject = ? AND object = ? AND substr(relation, 1, 8) = 'granted:'
|
|
197
|
-
AND ${liveTupleSql()}) AS held`, tenantId,
|
|
330
|
+
AND ${liveTupleSql()}) AS held`, tenantId, `${RECORDS[kind].subjectPrefix}${key}`, `tenant:${tenantId}`, now)[0];
|
|
198
331
|
return Number(row?.held) === 1;
|
|
199
332
|
}
|
|
333
|
+
/** Of `keys`, those the tenant holds a live tenant-level grant for (`tenantHoldsGrant`), in order. */
|
|
334
|
+
export function tenantHeldOf(db, kind, tenantId, keys, now) {
|
|
335
|
+
return keys.filter((key) => tenantHoldsGrant(db, kind, tenantId, key, now));
|
|
336
|
+
}
|
|
337
|
+
/** The subject an in-unit report names, if it is of this kind. */
|
|
338
|
+
export const reportKeyOf = (kind, report) => report[RECORDS[kind].payloadKey];
|
|
339
|
+
/**
|
|
340
|
+
* The fields an audit row names its subject and position with — the shape each kind's switch
|
|
341
|
+
* calls have always written (`moduleId` + `schedules`, `vertical` + `calls`).
|
|
342
|
+
*/
|
|
343
|
+
export function switchAuditSubject(kind, key, position) {
|
|
344
|
+
const { payloadKey, positionField } = RECORDS[kind];
|
|
345
|
+
return { [payloadKey]: key, [positionField]: position };
|
|
346
|
+
}
|
|
347
|
+
/** The admin-log action a re-assert of this kind writes its rows under. */
|
|
348
|
+
export const reassertActionOf = (kind) => RECORDS[kind].reassertAction;
|
|
349
|
+
/** One re-assert answer entry: the subject by its kind's field, and what the move did. */
|
|
350
|
+
export const reassertEntry = (kind, key, outcome) => ({ [RECORDS[kind].payloadKey]: key, held: outcome.held, changed: outcome.changed });
|
|
351
|
+
/**
|
|
352
|
+
* #2045: the audit row (less its `operationId`) for a re-assert's ON that moved something — a
|
|
353
|
+
* record of ON beside a scope that was off, converged to the record under its fence.
|
|
354
|
+
*/
|
|
355
|
+
export const reassertOnRow = (kind, key, permissions) => ({
|
|
356
|
+
...switchAuditSubject(kind, key, 'on'),
|
|
357
|
+
phase: 'applied',
|
|
358
|
+
changed: true,
|
|
359
|
+
permissions: [...permissions],
|
|
360
|
+
});
|
|
361
|
+
/** The audit row (less its `operationId`) for a re-assert's own OFF that moved something — both adapters. */
|
|
362
|
+
export const reassertOffRow = (kind, key, permissions) => ({
|
|
363
|
+
...switchAuditSubject(kind, key, 'off'),
|
|
364
|
+
phase: 'applied',
|
|
365
|
+
changed: true,
|
|
366
|
+
permissions: [...permissions],
|
|
367
|
+
});
|
|
200
368
|
/**
|
|
201
|
-
* The
|
|
202
|
-
* those that changed something, on a
|
|
369
|
+
* The re-assert's audit rows (less their `operationId`) for the in-unit moves of one kind:
|
|
370
|
+
* those that changed something, on a subject the directory records `off` for this scope.
|
|
203
371
|
* That filter is the point. The report comes from the deployment, and an audit row naming
|
|
204
|
-
* a
|
|
205
|
-
* log. One row per
|
|
372
|
+
* a subject the record never switched off would be the deployment writing the platform's
|
|
373
|
+
* log. One row per subject, first report wins. Built here so both adapters write one shape.
|
|
206
374
|
*/
|
|
207
|
-
export function inUnitMovesToAudit(recordedOff, applied
|
|
375
|
+
export function inUnitMovesToAudit(kind, recordedOff, applied,
|
|
376
|
+
/** Subjects this re-assert's stale-carry pass switched back on: their in-unit move is not credited. */
|
|
377
|
+
reverted = new Set()) {
|
|
208
378
|
const off = new Set(recordedOff);
|
|
209
379
|
const moves = new Map();
|
|
210
380
|
for (const a of applied ?? []) {
|
|
211
|
-
|
|
212
|
-
|
|
381
|
+
const key = reportKeyOf(kind, a);
|
|
382
|
+
if (key === undefined || reverted.has(key))
|
|
383
|
+
continue;
|
|
384
|
+
if (a.changed && off.has(key) && !moves.has(key))
|
|
385
|
+
moves.set(key, [...a.permissions]);
|
|
213
386
|
}
|
|
214
|
-
return [...moves].map(([
|
|
215
|
-
|
|
216
|
-
schedules: 'off',
|
|
387
|
+
return [...moves].map(([key, permissions]) => ({
|
|
388
|
+
...switchAuditSubject(kind, key, 'off'),
|
|
217
389
|
phase: 'applied',
|
|
218
390
|
changed: true,
|
|
219
391
|
permissions,
|
|
@@ -222,25 +394,26 @@ export function inUnitMovesToAudit(recordedOff, applied) {
|
|
|
222
394
|
}
|
|
223
395
|
/**
|
|
224
396
|
* The in-unit moves a STALE carry made, which the re-assert must undo (#1742 review): the
|
|
225
|
-
* deployment switched a
|
|
226
|
-
* the re-assert reads the record, an operator's
|
|
227
|
-
*
|
|
228
|
-
*
|
|
397
|
+
* deployment switched a subject off because the list it was handed said so, but by the time
|
|
398
|
+
* the re-assert reads the record, an operator's restore has moved it to `on`. The list was
|
|
399
|
+
* read before the call and the ON landed in between. Left alone, the scope would stay off
|
|
400
|
+
* while the record says on, and no later pass would put it back.
|
|
229
401
|
*
|
|
230
|
-
* Only a
|
|
231
|
-
* own ON. It never turns on a
|
|
402
|
+
* Only a subject the record now holds `on`, so a revert only ever re-applies an operator's
|
|
403
|
+
* own ON. It never turns on a subject whose record is `off` or missing, and so a report from
|
|
232
404
|
* the deployment can never switch on anything the platform has not already restored.
|
|
233
405
|
*/
|
|
234
|
-
export function staleCarryReverts(recorded, applied) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
406
|
+
export function staleCarryReverts(kind, recorded, applied) {
|
|
407
|
+
const keys = (applied ?? []).flatMap((a) => {
|
|
408
|
+
const key = reportKeyOf(kind, a);
|
|
409
|
+
return key !== undefined && a.changed && recorded.get(key) === 'on' ? [key] : [];
|
|
410
|
+
});
|
|
411
|
+
return [...new Set(keys)];
|
|
238
412
|
}
|
|
239
413
|
/** The audit row (less its `operationId`) for one stale-carry revert — both adapters write this shape. */
|
|
240
|
-
export function staleCarryRevertRow(
|
|
414
|
+
export function staleCarryRevertRow(kind, key, outcome) {
|
|
241
415
|
return {
|
|
242
|
-
|
|
243
|
-
schedules: 'on',
|
|
416
|
+
...switchAuditSubject(kind, key, 'on'),
|
|
244
417
|
phase: 'applied',
|
|
245
418
|
changed: outcome.changed,
|
|
246
419
|
permissions: [...outcome.permissions],
|
|
@@ -251,16 +424,17 @@ export function staleCarryRevertRow(moduleId, outcome) {
|
|
|
251
424
|
* Overwrite one existing row's position and provenance — ON's write, and its undo. With
|
|
252
425
|
* `ifOperationId`, only while the row is still the one that operation wrote (a CAS).
|
|
253
426
|
*/
|
|
254
|
-
function setRecordRow(db,
|
|
255
|
-
|
|
427
|
+
function setRecordRow(db, at, row, ifOperationId) {
|
|
428
|
+
const { table, key } = RECORDS[at.kind];
|
|
429
|
+
db.run(`UPDATE ${table}
|
|
256
430
|
SET position = ?, actor = ?, reason = ?, operation_id = ?, switched_at = ?
|
|
257
|
-
WHERE tenant_id = ? AND scope_id = ? AND
|
|
258
|
-
(ifOperationId === undefined ? '' : ' AND operation_id = ?'), row.position, row.actor, row.reason, row.operationId, row.at, key.tenantId, key.scopeId, key.moduleId, ...(ifOperationId === undefined ? [] : [ifOperationId]));
|
|
431
|
+
WHERE tenant_id = ? AND scope_id = ? AND ${key} = ?` + (ifOperationId === undefined ? '' : ' AND operation_id = ?'), row.position, row.actor, row.reason, row.operationId, row.at, at.tenantId, at.scopeId, at.key, ...(ifOperationId === undefined ? [] : [ifOperationId]));
|
|
259
432
|
}
|
|
260
433
|
/** The row as it stands now, or null — what a write answers so its undo can put it back. */
|
|
261
|
-
function priorOf(db,
|
|
262
|
-
const
|
|
263
|
-
|
|
434
|
+
function priorOf(db, at) {
|
|
435
|
+
const { table, key } = RECORDS[at.kind];
|
|
436
|
+
const prior = db.all(`SELECT position, actor, reason, operation_id, switched_at FROM ${table}
|
|
437
|
+
WHERE tenant_id = ? AND scope_id = ? AND ${key} = ?`, at.tenantId, at.scopeId, at.key)[0];
|
|
264
438
|
if (!prior)
|
|
265
439
|
return null;
|
|
266
440
|
return {
|
|
@@ -271,9 +445,42 @@ function priorOf(db, key) {
|
|
|
271
445
|
at: String(prior.switched_at),
|
|
272
446
|
};
|
|
273
447
|
}
|
|
448
|
+
/**
|
|
449
|
+
* #2045: the record's half of the switch fence (`SWITCH_FENCES_DDL`). A write from a call OLDER than
|
|
450
|
+
* the one the row holds writes nothing: a newer call has already recorded its position, and the
|
|
451
|
+
* scope will refuse this call's move for the same reason. Both writes answer the prior row, and the
|
|
452
|
+
* caller reads this off it, with the same test (`recordWriteSuperseded`).
|
|
453
|
+
*/
|
|
454
|
+
const supersededBy = (prior, row) => prior !== null && prior.operationId > row.operationId;
|
|
455
|
+
/** #2045: did this record write find a newer call's row, and so write nothing? */
|
|
456
|
+
export const recordWriteSuperseded = supersededBy;
|
|
457
|
+
/**
|
|
458
|
+
* #2045: the operation id each of one scope's record rows of one kind holds, by subject — the fence a
|
|
459
|
+
* re-assert or a carry moves the scope with, so a scope moved since by a newer call stays as that
|
|
460
|
+
* call put it.
|
|
461
|
+
*/
|
|
462
|
+
export function switchFencesOf(db, kind, tenantId, scopeId) {
|
|
463
|
+
const { table, key } = RECORDS[kind];
|
|
464
|
+
const rows = db.all(`SELECT ${key} AS k, operation_id FROM ${table} WHERE tenant_id = ? AND scope_id = ?`, tenantId, scopeId);
|
|
465
|
+
return new Map(rows.map((r) => [String(r.k), String(r.operation_id)]));
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* #2045: each record row's position AND operation id, by subject, in ONE read. A caller that moves
|
|
469
|
+
* the scope to a row's position under the row's fence must take both from the same instant: read
|
|
470
|
+
* apart, a row that moves between them pairs one call's position with another call's fence (an OFF
|
|
471
|
+
* carried under the ON's fence applies, since the scope holds that very fence), and a row the undo
|
|
472
|
+
* deleted between them is moved with no fence at all, which the scope applies unconditionally.
|
|
473
|
+
*/
|
|
474
|
+
export function switchRecordStatesOf(db, kind, tenantId, scopeId) {
|
|
475
|
+
const { table, key } = RECORDS[kind];
|
|
476
|
+
const rows = db.all(`SELECT ${key} AS k, position, operation_id FROM ${table} WHERE tenant_id = ? AND scope_id = ? ORDER BY ${key}`, tenantId, scopeId);
|
|
477
|
+
return new Map(rows.map((r) => [String(r.k), { position: positionOf(r.position), fence: String(r.operation_id) }]));
|
|
478
|
+
}
|
|
479
|
+
/** #2045: the tuple subject a record key names (`system:<m>`, `vertical:<v>`) — how a carry keys its fences. */
|
|
480
|
+
export const switchSubjectOf = (kind, key) => `${RECORDS[kind].subjectPrefix}${key}`;
|
|
274
481
|
/**
|
|
275
482
|
* OFF's write, made BEFORE the scope's switch moves (#1823), and undone by
|
|
276
|
-
* `
|
|
483
|
+
* `restoreSwitchRecord` when the move throws or holds nothing. An upsert: a repeat OFF
|
|
277
484
|
* refreshes the actor, reason and time, as the status read reports the latest reason.
|
|
278
485
|
* Answers the row as it was.
|
|
279
486
|
*
|
|
@@ -283,53 +490,63 @@ function priorOf(db, key) {
|
|
|
283
490
|
* which the scope is off and the record is not. This order fails toward a record of `off`
|
|
284
491
|
* beside a scope still on, until the undo runs — the direction OFF wins anyway, and the one a
|
|
285
492
|
* kill switch should fail in. Still never LEFT behind for a call that held nothing: a row
|
|
286
|
-
* saying `off` for a
|
|
493
|
+
* saying `off` for a subject the scope never had would switch it off on the day it is
|
|
287
494
|
* installed (the kernel's `held` check, for the same reason).
|
|
288
495
|
*/
|
|
289
|
-
export function
|
|
496
|
+
export function recordSwitchedOff(db, row) {
|
|
497
|
+
return writeRecord(db, row, 'off');
|
|
498
|
+
}
|
|
499
|
+
/** Both writes' upsert: the row as this call's position, unless a newer call's row is there (#2045). */
|
|
500
|
+
function writeRecord(db, row, position) {
|
|
501
|
+
const { table, key } = RECORDS[row.kind];
|
|
290
502
|
const prior = priorOf(db, row);
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
503
|
+
if (supersededBy(prior, row))
|
|
504
|
+
return prior;
|
|
505
|
+
db.run(`INSERT INTO ${table}
|
|
506
|
+
(tenant_id, scope_id, ${key}, position, actor, reason, operation_id, switched_at)
|
|
507
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
508
|
+
ON CONFLICT (tenant_id, scope_id, ${key}) DO UPDATE SET
|
|
509
|
+
position = excluded.position, actor = excluded.actor, reason = excluded.reason,
|
|
510
|
+
operation_id = excluded.operation_id, switched_at = excluded.switched_at`, row.tenantId, row.scopeId, row.key, position, row.actor, row.reason, row.operationId, row.at);
|
|
297
511
|
return prior;
|
|
298
512
|
}
|
|
299
513
|
/**
|
|
300
|
-
* ON's write, made BEFORE the scope's switch moves,
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
514
|
+
* ON's write, made BEFORE the scope's switch moves. Before, because the other order fails
|
|
515
|
+
* unsafely: a scope switched on whose record write then failed would still read `off`, and the
|
|
516
|
+
* next reconcile would switch the operator's restore back off. Answers the row as it was, for
|
|
517
|
+
* `restoreSwitchRecord`.
|
|
518
|
+
*
|
|
519
|
+
* #2045: an upsert, like OFF's. An ON with no row before it writes one, because its move stores
|
|
520
|
+
* its id in the scope's fence: without a row carrying the same id, an OLDER OFF arriving after
|
|
521
|
+
* it would find no row to be refused by, record itself, and leave the directory behind the scope
|
|
522
|
+
* (Codex r2). The directory's fence is never behind the scope's. An ON that holds nothing still
|
|
523
|
+
* leaves no row: its undo removes the one it wrote.
|
|
305
524
|
*/
|
|
306
|
-
export function
|
|
307
|
-
|
|
308
|
-
if (prior) {
|
|
309
|
-
setRecordRow(db, row, { position: 'on', actor: row.actor, reason: row.reason, operationId: row.operationId, at: row.at });
|
|
310
|
-
}
|
|
311
|
-
return prior;
|
|
525
|
+
export function recordSwitchedOn(db, row) {
|
|
526
|
+
return writeRecord(db, row, 'on');
|
|
312
527
|
}
|
|
313
528
|
/**
|
|
314
|
-
* Put a row back as `
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
529
|
+
* Put a row back as `recordSwitchedOn` or `recordSwitchedOff` found it — the call that wrote
|
|
530
|
+
* it threw, or held nothing. A row that did not exist is removed again. A compare-and-set on
|
|
531
|
+
* the call's own `operationId`: if another switch call has written the row since, the row is
|
|
532
|
+
* left as that call wrote it, so an undo can never clobber a newer position.
|
|
318
533
|
*/
|
|
319
|
-
export function
|
|
534
|
+
export function restoreSwitchRecord(db, call, prior) {
|
|
320
535
|
if (prior) {
|
|
321
536
|
setRecordRow(db, call, prior, call.operationId);
|
|
322
537
|
return;
|
|
323
538
|
}
|
|
324
|
-
|
|
325
|
-
|
|
539
|
+
const { table, key } = RECORDS[call.kind];
|
|
540
|
+
db.run(`DELETE FROM ${table} WHERE tenant_id = ? AND scope_id = ? AND ${key} = ? AND operation_id = ?`, call.tenantId, call.scopeId, call.key, call.operationId);
|
|
326
541
|
}
|
|
327
542
|
/**
|
|
328
|
-
* Forget one scope's switch records — the scope's directory row is going too (a
|
|
329
|
-
* preview or fork, a reaped scope). Without this the fleet read keeps listing a switch on
|
|
543
|
+
* Forget one scope's switch records, of every kind — the scope's directory row is going too (a
|
|
544
|
+
* reaped preview or fork, a reaped scope). Without this the fleet read keeps listing a switch on
|
|
330
545
|
* a scope that no longer exists. The admin log keeps the history, as it keeps the scope's.
|
|
331
546
|
*/
|
|
332
|
-
export function
|
|
333
|
-
|
|
547
|
+
export function forgetSwitchesOf(db, scopeId) {
|
|
548
|
+
for (const kind of SWITCH_KINDS)
|
|
549
|
+
db.run(`DELETE FROM ${RECORDS[kind].table} WHERE scope_id = ?`, scopeId);
|
|
550
|
+
db.run(`DELETE FROM _substrat_switch_owed WHERE scope_id = ?`, scopeId);
|
|
334
551
|
}
|
|
335
552
|
//# sourceMappingURL=system-switch-record.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-switch-record.js","sourceRoot":"","sources":["../src/system-switch-record.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"system-switch-record.js","sourceRoot":"","sources":["../src/system-switch-record.ts"],"names":[],"mappings":"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"}
|