@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
package/dist/findings.js
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { FINDING_RULE_MAX_DAYS, findingEntry, findingRuleEntry, opsFailureFingerprint, substratError, } from '@substrat-run/contracts';
|
|
2
|
+
import { ulid } from './ulid.js';
|
|
3
|
+
import { assertRowLimit, boundedRetentionDelete, ISSUE_RETENTION_DAYS } from './scope-host.js';
|
|
4
|
+
/**
|
|
5
|
+
* How long a finding outlives its last occurrence — the issue store's window, since a Recurring
|
|
6
|
+
* finding is the tenant's projection of an issue and should be recognisable for as long.
|
|
7
|
+
*/
|
|
8
|
+
export const FINDING_RETENTION_DAYS = ISSUE_RETENTION_DAYS;
|
|
9
|
+
/**
|
|
10
|
+
* The findings store (#1748), as statements both adapters run against their directory — the
|
|
11
|
+
* SQLite host over better-sqlite3, the hosted one inside ControlPlaneDO — so the lifecycle is
|
|
12
|
+
* written once. `sql` is the row-returning executor subject erasure already uses.
|
|
13
|
+
*
|
|
14
|
+
* Detection is ON WRITE: the call that records an ops failure or a sweep run also observes the
|
|
15
|
+
* finding it implies, so there is no cron and no scan. Per occurrence that is one indexed rule
|
|
16
|
+
* lookup and one primary-key upsert, over evidence that is already bounded upstream.
|
|
17
|
+
*/
|
|
18
|
+
export const FINDINGS_DDL = `
|
|
19
|
+
CREATE TABLE IF NOT EXISTS _substrat_findings (
|
|
20
|
+
id TEXT PRIMARY KEY,
|
|
21
|
+
tenant_id TEXT NOT NULL,
|
|
22
|
+
kind TEXT NOT NULL,
|
|
23
|
+
subject TEXT NOT NULL,
|
|
24
|
+
status TEXT NOT NULL,
|
|
25
|
+
regressed INTEGER NOT NULL DEFAULT 0,
|
|
26
|
+
severity TEXT NOT NULL,
|
|
27
|
+
title TEXT NOT NULL,
|
|
28
|
+
operation TEXT,
|
|
29
|
+
codes TEXT NOT NULL DEFAULT '[]',
|
|
30
|
+
vertical TEXT,
|
|
31
|
+
scope_id TEXT,
|
|
32
|
+
seen_count INTEGER NOT NULL,
|
|
33
|
+
first_seen TEXT NOT NULL,
|
|
34
|
+
last_seen TEXT NOT NULL,
|
|
35
|
+
last_version TEXT,
|
|
36
|
+
resolved_version TEXT,
|
|
37
|
+
resolved_at TEXT,
|
|
38
|
+
resolution TEXT,
|
|
39
|
+
acknowledged_at TEXT,
|
|
40
|
+
rule_id TEXT,
|
|
41
|
+
evidence TEXT NOT NULL,
|
|
42
|
+
likely_cause TEXT,
|
|
43
|
+
UNIQUE (tenant_id, kind, subject)
|
|
44
|
+
);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS _substrat_findings_tenant_seen ON _substrat_findings (tenant_id, last_seen);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS _substrat_findings_seen ON _substrat_findings (last_seen);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS _substrat_findings_quiet ON _substrat_findings (last_seen) WHERE status IN ('open', 'acked');
|
|
48
|
+
CREATE TABLE IF NOT EXISTS _substrat_finding_rules (
|
|
49
|
+
id TEXT PRIMARY KEY,
|
|
50
|
+
tenant_id TEXT NOT NULL,
|
|
51
|
+
kind TEXT,
|
|
52
|
+
operation TEXT,
|
|
53
|
+
code TEXT,
|
|
54
|
+
subject TEXT,
|
|
55
|
+
expires_at TEXT NOT NULL,
|
|
56
|
+
reason TEXT NOT NULL,
|
|
57
|
+
created_by TEXT NOT NULL,
|
|
58
|
+
created_at TEXT NOT NULL
|
|
59
|
+
);
|
|
60
|
+
CREATE INDEX IF NOT EXISTS _substrat_finding_rules_tenant ON _substrat_finding_rules (tenant_id, expires_at);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS _substrat_finding_rules_expiry ON _substrat_finding_rules (expires_at);
|
|
62
|
+
`;
|
|
63
|
+
/**
|
|
64
|
+
* The Recurring source: a tenant's own ops failure, keyed on the same fingerprint as the fleet
|
|
65
|
+
* issue. A failure with no tenant is the platform's own and stays in the staff issue store.
|
|
66
|
+
*/
|
|
67
|
+
export function findingOfOpsFailure(f) {
|
|
68
|
+
if (!f.tenantId)
|
|
69
|
+
return null;
|
|
70
|
+
const fingerprint = opsFailureFingerprint(f);
|
|
71
|
+
return {
|
|
72
|
+
tenantId: f.tenantId,
|
|
73
|
+
kind: 'recurring',
|
|
74
|
+
subject: fingerprint,
|
|
75
|
+
severity: 'warning',
|
|
76
|
+
title: `${f.operation} fails${f.stage ? ` at ${f.stage}` : ''}${f.code ? ` (${f.code})` : ''}`,
|
|
77
|
+
operation: f.operation,
|
|
78
|
+
code: f.code ?? null,
|
|
79
|
+
vertical: f.vertical ?? null,
|
|
80
|
+
scopeId: f.scopeId ?? null,
|
|
81
|
+
version: f.version ?? null,
|
|
82
|
+
evidence: { source: 'ops-failures', fingerprint },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The Invariant and Drift sources: a scheduled run that failed (expected 0 failed runs,
|
|
87
|
+
* observed N) and a freshness expectation judged stale. Every other sweep row implies nothing.
|
|
88
|
+
*/
|
|
89
|
+
export function findingOfSweepRun(r) {
|
|
90
|
+
if (!r.tenantId || r.outcome !== 'failed')
|
|
91
|
+
return null;
|
|
92
|
+
const base = {
|
|
93
|
+
tenantId: r.tenantId,
|
|
94
|
+
subject: r.unit,
|
|
95
|
+
code: null,
|
|
96
|
+
vertical: r.vertical ?? null,
|
|
97
|
+
scopeId: r.scopeId ?? null,
|
|
98
|
+
version: r.version ?? null,
|
|
99
|
+
};
|
|
100
|
+
if (r.kind === 'schedule') {
|
|
101
|
+
return {
|
|
102
|
+
...base,
|
|
103
|
+
kind: 'invariant',
|
|
104
|
+
severity: 'critical',
|
|
105
|
+
title: `Scheduled ${r.operation ?? r.unit} failed`,
|
|
106
|
+
operation: r.operation ?? null,
|
|
107
|
+
evidence: { source: 'sweep-runs', kind: 'schedule', unit: r.unit },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (r.kind === 'freshness') {
|
|
111
|
+
return {
|
|
112
|
+
...base,
|
|
113
|
+
kind: 'drift',
|
|
114
|
+
severity: 'warning',
|
|
115
|
+
title: `${r.eventType ?? r.unit} has gone stale`,
|
|
116
|
+
operation: null,
|
|
117
|
+
evidence: { source: 'sweep-runs', kind: 'freshness', unit: r.unit },
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const FINDING_COLUMNS = 'id, tenant_id, kind, subject, status, regressed, severity, title, operation, codes, vertical, scope_id, ' +
|
|
123
|
+
'seen_count, first_seen, last_seen, last_version, resolved_version, resolved_at, resolution, acknowledged_at, ' +
|
|
124
|
+
'rule_id, evidence, likely_cause';
|
|
125
|
+
const RULE_COLUMNS = 'id, tenant_id, kind, operation, code, subject, expires_at, reason, created_by, created_at';
|
|
126
|
+
function findingOf(r) {
|
|
127
|
+
return findingEntry.parse({
|
|
128
|
+
id: r.id,
|
|
129
|
+
tenantId: r.tenant_id,
|
|
130
|
+
kind: r.kind,
|
|
131
|
+
subject: r.subject,
|
|
132
|
+
status: r.status,
|
|
133
|
+
regressed: r.regressed === 1,
|
|
134
|
+
severity: r.severity,
|
|
135
|
+
title: r.title,
|
|
136
|
+
operation: r.operation,
|
|
137
|
+
codes: JSON.parse(r.codes),
|
|
138
|
+
vertical: r.vertical,
|
|
139
|
+
scopeId: r.scope_id,
|
|
140
|
+
count: r.seen_count,
|
|
141
|
+
firstSeen: r.first_seen,
|
|
142
|
+
lastSeen: r.last_seen,
|
|
143
|
+
lastVersion: r.last_version,
|
|
144
|
+
resolvedVersion: r.resolved_version,
|
|
145
|
+
resolvedAt: r.resolved_at,
|
|
146
|
+
resolution: r.resolution,
|
|
147
|
+
acknowledgedAt: r.acknowledged_at,
|
|
148
|
+
ruleId: r.rule_id,
|
|
149
|
+
evidence: JSON.parse(r.evidence),
|
|
150
|
+
likelyCause: r.likely_cause === null ? null : JSON.parse(r.likely_cause),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function ruleOf(r) {
|
|
154
|
+
return findingRuleEntry.parse({
|
|
155
|
+
id: r.id,
|
|
156
|
+
tenantId: r.tenant_id,
|
|
157
|
+
kind: r.kind,
|
|
158
|
+
operation: r.operation,
|
|
159
|
+
code: r.code,
|
|
160
|
+
subject: r.subject,
|
|
161
|
+
expiresAt: r.expires_at,
|
|
162
|
+
reason: r.reason,
|
|
163
|
+
createdBy: r.created_by,
|
|
164
|
+
createdAt: r.created_at,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The unexpired rule covering this occurrence, if any. A rule field left NULL matches anything;
|
|
169
|
+
* a set one must equal the occurrence's — and `= NULL` is never true, so a rule naming an
|
|
170
|
+
* operation never covers a finding that has none.
|
|
171
|
+
*/
|
|
172
|
+
function activeRule(sql, o, at) {
|
|
173
|
+
const row = sql(`SELECT id FROM _substrat_finding_rules
|
|
174
|
+
WHERE tenant_id = ? AND expires_at > ?
|
|
175
|
+
AND (kind IS NULL OR kind = ?)
|
|
176
|
+
AND (operation IS NULL OR operation = ?)
|
|
177
|
+
AND (code IS NULL OR code = ?)
|
|
178
|
+
AND (subject IS NULL OR subject = ?)
|
|
179
|
+
ORDER BY expires_at DESC, id LIMIT 1`, [o.tenantId, at, o.kind, o.operation, o.code, o.subject])[0];
|
|
180
|
+
return row?.id ?? null;
|
|
181
|
+
}
|
|
182
|
+
const MAX_CODES = 5;
|
|
183
|
+
/**
|
|
184
|
+
* Record one occurrence on its finding, opening it if new. The transitions, in order:
|
|
185
|
+
* - an unexpired rule covers it → `suppressed` (counted all the same: suppressing hides the
|
|
186
|
+
* finding, never the evidence);
|
|
187
|
+
* - it was `resolved` → `open`, `regressed`, and its likely cause is worked out afresh from
|
|
188
|
+
* THIS regression: the version it came back under, when that is not the one it was resolved
|
|
189
|
+
* under, and none otherwise — never a cause left over from an earlier cycle;
|
|
190
|
+
* - it was `suppressed` and no rule covers it any longer → `open`;
|
|
191
|
+
* - otherwise the status stands (`acked` stays acked: somebody is already on it).
|
|
192
|
+
*/
|
|
193
|
+
export function observeFinding(sql, o, at) {
|
|
194
|
+
const ruleId = activeRule(sql, o, at);
|
|
195
|
+
const existing = sql(`SELECT id, status, regressed, codes, resolved_version, likely_cause
|
|
196
|
+
FROM _substrat_findings WHERE tenant_id = ? AND kind = ? AND subject = ?`, [o.tenantId, o.kind, o.subject])[0];
|
|
197
|
+
if (!existing) {
|
|
198
|
+
sql(`INSERT INTO _substrat_findings (${FINDING_COLUMNS})
|
|
199
|
+
VALUES (?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, NULL, NULL, NULL, NULL, ?, ?, NULL)`, [
|
|
200
|
+
ulid(),
|
|
201
|
+
o.tenantId,
|
|
202
|
+
o.kind,
|
|
203
|
+
o.subject,
|
|
204
|
+
ruleId ? 'suppressed' : 'open',
|
|
205
|
+
o.severity,
|
|
206
|
+
o.title,
|
|
207
|
+
o.operation,
|
|
208
|
+
JSON.stringify(o.code ? [o.code] : []),
|
|
209
|
+
o.vertical,
|
|
210
|
+
o.scopeId,
|
|
211
|
+
at,
|
|
212
|
+
at,
|
|
213
|
+
o.version,
|
|
214
|
+
ruleId,
|
|
215
|
+
JSON.stringify(o.evidence),
|
|
216
|
+
]);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
let status = existing.status;
|
|
220
|
+
let regressed = existing.regressed;
|
|
221
|
+
let likelyCause = existing.likely_cause;
|
|
222
|
+
if (ruleId) {
|
|
223
|
+
status = 'suppressed';
|
|
224
|
+
}
|
|
225
|
+
else if (status === 'resolved') {
|
|
226
|
+
status = 'open';
|
|
227
|
+
regressed = 1;
|
|
228
|
+
likelyCause = null;
|
|
229
|
+
if (o.version !== null && o.version !== existing.resolved_version) {
|
|
230
|
+
const cause = {
|
|
231
|
+
kind: 'deploy',
|
|
232
|
+
version: o.version,
|
|
233
|
+
reason: existing.resolved_version
|
|
234
|
+
? `resolved under ${existing.resolved_version}, seen again under ${o.version}`
|
|
235
|
+
: `seen again under ${o.version} after it was resolved`,
|
|
236
|
+
};
|
|
237
|
+
likelyCause = JSON.stringify(cause);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (status === 'suppressed') {
|
|
241
|
+
status = 'open';
|
|
242
|
+
}
|
|
243
|
+
const codes = JSON.parse(existing.codes);
|
|
244
|
+
const nextCodes = o.code ? [o.code, ...codes.filter((c) => c !== o.code)].slice(0, MAX_CODES) : codes;
|
|
245
|
+
sql(`UPDATE _substrat_findings SET
|
|
246
|
+
status = ?, regressed = ?, rule_id = ?, likely_cause = ?, codes = ?,
|
|
247
|
+
seen_count = seen_count + 1, last_seen = ?,
|
|
248
|
+
last_version = COALESCE(?, last_version), vertical = COALESCE(?, vertical), scope_id = COALESCE(?, scope_id)
|
|
249
|
+
WHERE id = ?`, [
|
|
250
|
+
status,
|
|
251
|
+
regressed,
|
|
252
|
+
status === 'suppressed' ? ruleId : null,
|
|
253
|
+
likelyCause,
|
|
254
|
+
JSON.stringify(nextCodes),
|
|
255
|
+
at,
|
|
256
|
+
o.version,
|
|
257
|
+
o.vertical,
|
|
258
|
+
o.scopeId,
|
|
259
|
+
existing.id,
|
|
260
|
+
]);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Findings, most recently seen first. No cursor, like the issue read it projects: the
|
|
264
|
+
* cardinality is the number of distinct shapes a tenant has, and `limit` bounds it.
|
|
265
|
+
*/
|
|
266
|
+
export function listFindings(sql, filter = {}) {
|
|
267
|
+
const where = [];
|
|
268
|
+
const params = [];
|
|
269
|
+
if (filter.tenantId !== undefined) {
|
|
270
|
+
where.push('tenant_id = ?');
|
|
271
|
+
params.push(filter.tenantId);
|
|
272
|
+
}
|
|
273
|
+
if (filter.status !== undefined) {
|
|
274
|
+
where.push('status = ?');
|
|
275
|
+
params.push(filter.status);
|
|
276
|
+
}
|
|
277
|
+
if (filter.kind !== undefined) {
|
|
278
|
+
where.push('kind = ?');
|
|
279
|
+
params.push(filter.kind);
|
|
280
|
+
}
|
|
281
|
+
params.push(assertRowLimit('limit', filter.limit ?? 100));
|
|
282
|
+
const rows = sql(`SELECT ${FINDING_COLUMNS} FROM _substrat_findings` +
|
|
283
|
+
(where.length ? ` WHERE ${where.join(' AND ')}` : '') +
|
|
284
|
+
' ORDER BY last_seen DESC, id LIMIT ?', params);
|
|
285
|
+
return rows.map(findingOf);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* A person's verdict: acknowledge, resolve, or reopen. Keyed on (tenant, id), so a tenant can
|
|
289
|
+
* never move another tenant's finding by guessing its id. Reopening a suppressed finding lifts
|
|
290
|
+
* it out of its rule for now; the next occurrence the rule still covers suppresses it again —
|
|
291
|
+
* revoking the rule is what ends a suppression.
|
|
292
|
+
*/
|
|
293
|
+
export function setFindingStatus(sql, tenantId, id, status, at, audit) {
|
|
294
|
+
const existing = sql(`SELECT ${FINDING_COLUMNS} FROM _substrat_findings WHERE tenant_id = ? AND id = ?`, [
|
|
295
|
+
tenantId,
|
|
296
|
+
id,
|
|
297
|
+
])[0];
|
|
298
|
+
if (!existing)
|
|
299
|
+
return undefined;
|
|
300
|
+
const resolved = status === 'resolved';
|
|
301
|
+
const [after] = sql(`UPDATE _substrat_findings SET status = ?, rule_id = NULL, regressed = ?, resolved_at = ?,
|
|
302
|
+
resolved_version = ?, resolution = ?, acknowledged_at = ?, likely_cause = ?
|
|
303
|
+
WHERE id = ? RETURNING ${FINDING_COLUMNS}`, [
|
|
304
|
+
status,
|
|
305
|
+
resolved ? 0 : existing.regressed,
|
|
306
|
+
resolved ? at : existing.resolved_at,
|
|
307
|
+
resolved ? existing.last_version : existing.resolved_version,
|
|
308
|
+
resolved ? 'verdict' : existing.resolution,
|
|
309
|
+
status === 'acked' ? at : status === 'open' ? null : existing.acknowledged_at,
|
|
310
|
+
// A resolve closes the cycle its cause explained; the next regression names its own.
|
|
311
|
+
resolved ? null : existing.likely_cause,
|
|
312
|
+
id,
|
|
313
|
+
]);
|
|
314
|
+
const change = { before: findingOf(existing), after: findingOf(after) };
|
|
315
|
+
audit({
|
|
316
|
+
action: 'setFindingStatus',
|
|
317
|
+
target: { tenantId, vertical: change.after.vertical },
|
|
318
|
+
before: { id, status: change.before.status },
|
|
319
|
+
after: { id, status: change.after.status },
|
|
320
|
+
});
|
|
321
|
+
return change;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* A rule expires in the future and within `FINDING_RULE_MAX_DAYS` of `at`. A host whose store
|
|
325
|
+
* sits behind an RPC hop calls `createFindingRule` as a replied method, so this keeps its code.
|
|
326
|
+
*/
|
|
327
|
+
function assertFindingRuleExpiry(expiresAt, at) {
|
|
328
|
+
if (!(expiresAt > at))
|
|
329
|
+
throw substratError('validation_failed', 'a suppress rule must expire in the future');
|
|
330
|
+
const ceiling = new Date(Date.parse(at) + FINDING_RULE_MAX_DAYS * 86_400_000).toISOString();
|
|
331
|
+
if (expiresAt > ceiling) {
|
|
332
|
+
throw substratError('validation_failed', `a suppress rule lasts at most ${FINDING_RULE_MAX_DAYS} days`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Create a suppress rule and apply it to the findings it covers now: each one not already
|
|
337
|
+
* resolved becomes `suppressed` under it. Returns the rule and the ids it suppressed, for the
|
|
338
|
+
* caller's audit row. The input is parsed by the caller (`findingRuleInput`); the expiry is
|
|
339
|
+
* held here (`assertFindingRuleExpiry`), against the same `at` every other write in the call uses.
|
|
340
|
+
*/
|
|
341
|
+
export function createFindingRule(sql, tenantId, input, createdBy, at, audit) {
|
|
342
|
+
assertFindingRuleExpiry(input.expiresAt, at);
|
|
343
|
+
const id = ulid();
|
|
344
|
+
const [rule] = sql(`INSERT INTO _substrat_finding_rules (${RULE_COLUMNS}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
345
|
+
RETURNING ${RULE_COLUMNS}`, [
|
|
346
|
+
id,
|
|
347
|
+
tenantId,
|
|
348
|
+
input.kind ?? null,
|
|
349
|
+
input.operation ?? null,
|
|
350
|
+
input.code ?? null,
|
|
351
|
+
input.subject ?? null,
|
|
352
|
+
input.expiresAt,
|
|
353
|
+
input.reason,
|
|
354
|
+
createdBy,
|
|
355
|
+
at,
|
|
356
|
+
]);
|
|
357
|
+
const covered = sql(`UPDATE _substrat_findings SET status = 'suppressed', rule_id = ?
|
|
358
|
+
WHERE tenant_id = ? AND status IN ('open', 'acked', 'suppressed')
|
|
359
|
+
AND (? IS NULL OR kind = ?)
|
|
360
|
+
AND (? IS NULL OR operation = ?)
|
|
361
|
+
AND (? IS NULL OR EXISTS (SELECT 1 FROM json_each(codes) WHERE value = ?))
|
|
362
|
+
AND (? IS NULL OR subject = ?)
|
|
363
|
+
RETURNING id`, [
|
|
364
|
+
id,
|
|
365
|
+
tenantId,
|
|
366
|
+
input.kind ?? null,
|
|
367
|
+
input.kind ?? null,
|
|
368
|
+
input.operation ?? null,
|
|
369
|
+
input.operation ?? null,
|
|
370
|
+
input.code ?? null,
|
|
371
|
+
input.code ?? null,
|
|
372
|
+
input.subject ?? null,
|
|
373
|
+
input.subject ?? null,
|
|
374
|
+
]);
|
|
375
|
+
const created = { rule: ruleOf(rule), suppressed: covered.map((c) => c.id) };
|
|
376
|
+
audit({
|
|
377
|
+
action: 'createFindingRule',
|
|
378
|
+
target: { tenantId, vertical: null },
|
|
379
|
+
before: null,
|
|
380
|
+
after: { rule: created.rule, suppressed: covered.length },
|
|
381
|
+
});
|
|
382
|
+
return created;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* End a rule now. Its findings stay suppressed until their next occurrence, which then opens
|
|
386
|
+
* them — the same thing an expiry does, brought forward.
|
|
387
|
+
*/
|
|
388
|
+
export function revokeFindingRule(sql, tenantId, ruleId, at, audit) {
|
|
389
|
+
const existing = sql(`SELECT ${RULE_COLUMNS} FROM _substrat_finding_rules WHERE tenant_id = ? AND id = ?`, [
|
|
390
|
+
tenantId,
|
|
391
|
+
ruleId,
|
|
392
|
+
])[0];
|
|
393
|
+
if (!existing)
|
|
394
|
+
return undefined;
|
|
395
|
+
// An already-expired rule keeps its expiry: revoking it changes nothing.
|
|
396
|
+
const expiresAt = existing.expires_at > at ? at : existing.expires_at;
|
|
397
|
+
sql('UPDATE _substrat_finding_rules SET expires_at = ? WHERE id = ?', [expiresAt, ruleId]);
|
|
398
|
+
const change = { before: ruleOf(existing), after: ruleOf({ ...existing, expires_at: expiresAt }) };
|
|
399
|
+
audit({
|
|
400
|
+
action: 'revokeFindingRule',
|
|
401
|
+
target: { tenantId, vertical: null },
|
|
402
|
+
before: { id: ruleId, expiresAt: change.before.expiresAt },
|
|
403
|
+
after: { id: ruleId, expiresAt: change.after.expiresAt },
|
|
404
|
+
});
|
|
405
|
+
return change;
|
|
406
|
+
}
|
|
407
|
+
/** A tenant's rules, newest first; `activeAt` keeps only those unexpired at that instant. */
|
|
408
|
+
export function listFindingRules(sql, tenantId, activeAt, limit = 100) {
|
|
409
|
+
const where = [];
|
|
410
|
+
const params = [];
|
|
411
|
+
if (tenantId !== undefined) {
|
|
412
|
+
where.push('tenant_id = ?');
|
|
413
|
+
params.push(tenantId);
|
|
414
|
+
}
|
|
415
|
+
if (activeAt !== undefined) {
|
|
416
|
+
where.push('expires_at > ?');
|
|
417
|
+
params.push(activeAt);
|
|
418
|
+
}
|
|
419
|
+
params.push(assertRowLimit('limit', limit));
|
|
420
|
+
return sql(`SELECT ${RULE_COLUMNS} FROM _substrat_finding_rules` +
|
|
421
|
+
(where.length ? ` WHERE ${where.join(' AND ')}` : '') +
|
|
422
|
+
' ORDER BY created_at DESC, id DESC LIMIT ?', params).map(ruleOf);
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* The findings retention pass, bounded by `limit` per step, oldest first. Run in ONE unit with
|
|
426
|
+
* `audit`, which the adapter points at its own admin-log write, so a stale resolution never
|
|
427
|
+
* lands without its row.
|
|
428
|
+
*
|
|
429
|
+
* An `open` or `acked` finding is never deleted for going quiet: deleting it would take it out
|
|
430
|
+
* of the inbox of whoever was watching it with nothing said. One quiet for the whole
|
|
431
|
+
* `FINDING_RETENTION_DAYS` is RESOLVED as `stale` instead, and audited. A `resolved` or
|
|
432
|
+
* `suppressed` finding is deleted once both its last occurrence and its last resolve are past
|
|
433
|
+
* the horizon — so a stale-resolved finding stays readable for one more window. An expired rule
|
|
434
|
+
* is deleted once its expiry is past the horizon; the admin log keeps its story.
|
|
435
|
+
*/
|
|
436
|
+
export function pruneFindings(sql, nowMs, limit, audit) {
|
|
437
|
+
assertRowLimit('limit', limit);
|
|
438
|
+
const now = new Date(nowMs).toISOString();
|
|
439
|
+
const horizon = new Date(nowMs - FINDING_RETENTION_DAYS * 86_400_000).toISOString();
|
|
440
|
+
const quiet = sql(`SELECT id, tenant_id, vertical, status FROM _substrat_findings
|
|
441
|
+
WHERE last_seen < ? AND status IN ('open', 'acked') ORDER BY last_seen LIMIT ?`, [horizon, limit]);
|
|
442
|
+
if (quiet.length > 0) {
|
|
443
|
+
sql(`UPDATE _substrat_findings SET status = 'resolved', resolution = 'stale', resolved_at = ?,
|
|
444
|
+
resolved_version = last_version, regressed = 0, likely_cause = NULL
|
|
445
|
+
WHERE id IN (SELECT value FROM json_each(?))`, [now, JSON.stringify(quiet.map((q) => q.id))]);
|
|
446
|
+
}
|
|
447
|
+
for (const q of quiet) {
|
|
448
|
+
audit({
|
|
449
|
+
action: 'resolveStaleFinding',
|
|
450
|
+
target: { tenantId: q.tenant_id, vertical: q.vertical },
|
|
451
|
+
before: { id: q.id, status: q.status },
|
|
452
|
+
after: { id: q.id, status: 'resolved', resolution: 'stale' },
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
const deleted = sql(`DELETE FROM _substrat_findings WHERE rowid IN (
|
|
456
|
+
SELECT rowid FROM _substrat_findings
|
|
457
|
+
WHERE last_seen < ? AND status IN ('resolved', 'suppressed')
|
|
458
|
+
AND (resolved_at IS NULL OR resolved_at < ?)
|
|
459
|
+
ORDER BY last_seen LIMIT ?) RETURNING 1`, [horizon, horizon, limit]).length;
|
|
460
|
+
const rulesDeleted = sql(boundedRetentionDelete('_substrat_finding_rules', 'expires_at'), [horizon, limit]).length;
|
|
461
|
+
return { deleted, staled: quiet.length, rulesDeleted };
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../src/findings.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { AccessLogFilter, AttachmentSearchOptions, AttachmentUploadInput, AuditLogFilter, BlobStoreProvisionInput, BlobStoreRecord, ConsumerHandler, ImportHandler, ExecutorDeadLetter, ExecutorDrainReport, ExecutorHandler, ExecutorRetryPolicy, ConnectorConnection, ScopedConnectorConnection, ConnectorContext, ConnectorHandler, ConnectorOptions, ConnectorRequestInit, ConnectorResponse, Clock, FetchLike, GuardPredicate, HostAdmin, MigrateScopeOutcome, MigrationFrontier, ModuleRegistration, ConsumersOf, EventContract, EventPayloadOf, EventTypeOf, TypedConsumerHandler, TypedConsumers, OpenedAttachment, OperationContext, PageParams, OperationHandler, AppliedMigration, OpsFailureFilter, OpsFailureInput, KeptCopyResolution, IssueFilter, TelemetryPruneReport, SweepRunFilter, SweepRunInput, ProvisionScopeInput, RoleFilter, FreshnessRegistration, FreshnessReport, LiveChange, LiveReadSurface, LiveUpgradeRequest, OperationEntitlement, ScheduleRegistration, ScheduleRunReport, ScopeAttachments, ScopedSql, ScopeFilter, ScopeHost, ScopeStub, ScopeStubOptions, InvokeOptions, EmittedEvent, EmittedReport, SqlMigration, SqlValue, TenantBlobStore, TenantRelationalStore, TenantStoreProvisionInput, TenantStoreRecord, } from './scope-host.js';
|
|
1
|
+
export type { AccessLogFilter, AttachmentSearchOptions, AttachmentUploadInput, AuditLogFilter, BlobStoreProvisionInput, BlobStoreRecord, ConsumerHandler, ImportHandler, ExecutorDeadLetter, ExecutorDrainReport, ExecutorHandler, ExecutorOutcome, ExecutorRetryPolicy, ExecutorScope, MembershipChange, MembershipChangeResult, ConnectorConnection, ScopedConnectorConnection, ConnectorContext, ConnectorHandler, ConnectorOptions, ConnectorRequestInit, ConnectorResponse, Clock, FetchLike, GuardPredicate, HostAdmin, MigrateScopeOutcome, MigrationFrontier, ModuleRegistration, ConsumersOf, EventContract, EventPayloadOf, EventTypeOf, TypedConsumerHandler, TypedConsumers, OpenedAttachment, OperationContext, PageParams, OperationHandler, AppliedMigration, OpsFailureFilter, OpsFailureInput, KeptCopyResolution, IssueFilter, TelemetryPruneReport, SweepRunFilter, SweepRunInput, ProvisionScopeInput, RoleFilter, FreshnessRegistration, FreshnessReport, LiveChange, LiveFrame, LiveNudge, LiveReadSurface, LiveUpgradeRequest, OperationEntitlement, ScheduleRegistration, ScheduleRunReport, ScopeAttachments, ScopedSql, ScopeFilter, ScopeHost, ScopeStub, ScopeStubOptions, InvokeOptions, EmittedEvent, EmittedReport, SqlMigration, SqlValue, TenantBlobStore, TenantRelationalStore, TenantStoreProvisionInput, TenantStoreRecord, } from './scope-host.js';
|
|
2
2
|
export type {
|
|
3
3
|
/** @deprecated Import from `@substrat-run/adapter-cloudflare` (#1978); this kernel export goes in a later release. */
|
|
4
4
|
AnalyticsEngineDatasetLike, ConnectionUseOutcome, ConnectionUseTiming, ConnectorCallErrorType, ConnectorCallRecord, ConnectorCallRecorder, CountingConnectorCallRecorder, } from './connector-calls.js';
|
|
@@ -9,9 +9,9 @@ CONNECTOR_CALL_DATA_POINT_LAYOUT, CONNECTOR_CALL_ERROR_TYPES,
|
|
|
9
9
|
analyticsEngineConnectorCallRecorder,
|
|
10
10
|
/** @deprecated Import from `@substrat-run/adapter-cloudflare` (#1978); this kernel export goes in a later release. */
|
|
11
11
|
connectorCallDataPoint, connectorCallErrorType, connectorCallRecord, noopConnectorCallRecorder, recordConnectorCall, settleConnectionUse, } from './connector-calls.js';
|
|
12
|
-
export { assertRedrainWindow, attachmentBlobKey, attachmentSha256, consumersFor, entitlementDenial, requiredEntitlementFor, backoffAt, globalFetch, parseValidationRecords, resolveRetryPolicy, OPS_FAILURE_RETENTION_DAYS, SWEEP_RUN_RETENTION_DAYS, SWEEP_RUNS_INTENT_INDEX, sweepRunsIntentHasKind, ISSUE_RETENTION_DAYS, telemetryRetentionStatements, TELEMETRY_PRUNE_BATCH, assertRowLimit, assertRowOffset, EMITTED_REPORT_CAP,
|
|
12
|
+
export { assertRedrainWindow, attachmentBlobKey, attachmentSha256, consumersFor, entitlementDenial, requiredEntitlementFor, backoffAt, globalFetch, executorOutcomeOf, parseValidationRecords, resolveRetryPolicy, OPS_FAILURE_RETENTION_DAYS, SWEEP_RUN_RETENTION_DAYS, SWEEP_RUNS_INTENT_INDEX, sweepRunsIntentHasKind, ISSUE_RETENTION_DAYS, telemetryRetentionStatements, TELEMETRY_PRUNE_BATCH, assertRowLimit, assertRowOffset, EMITTED_REPORT_CAP,
|
|
13
13
|
/** @deprecated Import from `@substrat-run/vertical-host` (#1978); this kernel export goes in a later release. */
|
|
14
|
-
isUpgradeRequest, } from './scope-host.js';
|
|
14
|
+
isUpgradeRequest, isVouchedWithin, vouchedWithin, type VouchedWithin, } from './scope-host.js';
|
|
15
15
|
export {
|
|
16
16
|
/** @deprecated Import from `@substrat-run/contracts` (#1978); this kernel export goes in a later release. */
|
|
17
17
|
LIVE_MODE_HEADER,
|
|
@@ -36,28 +36,32 @@ export type { ResolvedScopeRecord } from './scope-record.js';
|
|
|
36
36
|
export { assertAllowed, denyAllChecker, PermissionDenied, UNSAFE_allowAllChecker, } from './permission-checker.js';
|
|
37
37
|
export { actorOf, asPrincipal, isUnknownRoleError, unknownRoleError } from './permission-checker.js';
|
|
38
38
|
export type { PermissionChecker } from './permission-checker.js';
|
|
39
|
-
export { createTupleEvaluator } from './permission-eval.js';
|
|
40
|
-
export type { PermissionTupleReader, PermissionTupleRow, ScopeTupleReader, } from './permission-eval.js';
|
|
39
|
+
export { ancestorsWithin, createTupleEvaluator, joinedMembershipExpiry, liveOrgMembership, memberAddedAudit, orgChangeBound, reachesWithin, tenantCoverage, } from './permission-eval.js';
|
|
40
|
+
export type { PermissionTupleReader, TenantDirectoryReader, PermissionTupleRow, ScopeTupleReader, } from './permission-eval.js';
|
|
41
41
|
export { CAPABILITY_COLUMNS, CAPABILITY_DDL, CAPABILITY_EXCHANGE_OPERATION, CAPABILITY_SESSION_PRUNE_BATCH, WITHHELD_SECRET, assertNoSecret, capabilityAttachmentWriteRefused, capabilityByIdQuery, capabilityExchangeable, capabilityGrantOf, capabilityListQuery, capabilityLive, capabilityRecordOf, capabilityTokenHash, carriesSecret, checkBecomeInput, createCapabilityVerbs, exchangeCapability, guardSecrets, mintBecomeCapability, mintCapabilitySecret, mintCapabilitySessionToken, persistedText, readCapabilities, readCapabilityPage, plausibleSessionToken, plausibleCapabilitySecret, redactSecrets, redactSecretText, resolveCapabilitySession, revokeCapabilityAsPlatform, } from './capability.js';
|
|
42
42
|
export type { CapabilityGrantView, CapabilityRow, CapabilityVerbDeps, CapabilityVerbs, } from './capability.js';
|
|
43
43
|
export { createEntityEdgeVerbs } from './entity-edges.js';
|
|
44
44
|
export type { EntityEdgeDeps, EntityEdgeVerbs } from './entity-edges.js';
|
|
45
|
+
export { addStatePlans, createEntityStateVerbs, entityStateMigrations, entityStatePlans, entityStateTriggerDdl, assertEntityStateIntact, ENTITY_STATE_MOVES_DDL, ENTITY_STATE_MOVES_TABLE, statefulTablesOf, entityStateWhere, stateColumnsOf, } from './entity-state.js';
|
|
46
|
+
export type { EntityStateDeps, EntityStatePlan, EntityStateVerbs, StateColumns } from './entity-state.js';
|
|
47
|
+
export { TRASH_SCAN_BUDGET, createTrashedReads, searchStateWhere, uncheckedView } from './entity-state-reads.js';
|
|
48
|
+
export type { TrashedReadDeps, TrashedReads } from './entity-state-reads.js';
|
|
45
49
|
export { createAtomic } from './sub-transaction.js';
|
|
46
50
|
export type { RunSub, AtomicMarks } from './sub-transaction.js';
|
|
47
51
|
export { DEFAULT_SEARCH_LIMIT, MAX_SEARCH_LIMIT, MIN_SEARCH_TERM, NotSearchable, SEARCH_INDEX_PREFIX, SearchTermTooShort, isSearchIndexTable, searchIndexDdl, searchIndexMigrations, searchIndexPlans, searchLimit, searchMatchExpression, searchPlansByEntityType, searchQuery, } from './search-index.js';
|
|
48
52
|
export type { SearchHit, SearchIndexPlan, SearchOptions, SearchTokenizer, SearchableDeclaration, } from './search-index.js';
|
|
49
|
-
export { ATTACHMENT_SEARCH_OWNER_MAX, ATTACHMENT_SEARCH_OWNERS_SQL, ATTACHMENT_SEARCH_SQL, ATTACHMENT_SEARCH_TOO_MANY_OWNERS, ATTACHMENT_TEXT_DDL, ATTACHMENT_TEXT_JOB, ATTACHMENT_TEXT_MODULE, assertJobRegistrable, attachmentRecordOfRow, attachmentTextJob, enqueueAttachmentText, isAttachmentTextRun, readAttachmentText, reconcileAttachmentText, recordAttachmentText, searchAttachments, } from './attachment-text.js';
|
|
50
|
-
export type { AttachmentRowShape, AttachmentSearchGate, AttachmentTextSource, AttachmentTextState, AttachmentTextStatus, } from './attachment-text.js';
|
|
51
|
-
export { DEFAULT_ATTACHMENT_TEXT_BOUNDS, EXTRACTION_STRIDE, assertAttachmentExtractors, assertAttachmentTextBounds, chooseAttachmentExtractor, inputBoundRefusal, isPositiveIntegerBound, mediaTypeOf, normalizeExtractedText, runAttachmentExtractor, truncateUtf8, } from './attachment-extractor.js';
|
|
53
|
+
export { ATTACHMENT_SEARCH_OWNER_MAX, ATTACHMENT_SEARCH_OWNERS_SQL, ATTACHMENT_SEARCH_SQL, ATTACHMENT_SEARCH_TOO_MANY_OWNERS, ATTACHMENT_TEXT_BACKFILL_BATCH, ATTACHMENT_TEXT_BACKFILL_JOB, ATTACHMENT_TEXT_DDL, ATTACHMENT_TEXT_JOB, ATTACHMENT_TEXT_MODULE, assertJobRegistrable, attachmentRecordOfRow, attachmentTextBackfillJob, attachmentTextJob, enqueueAttachmentText, kernelJobFor, isAttachmentTextRun, queueAttachmentTextBackfill, readAttachmentText, reconcileAttachmentText, recordAttachmentText, searchAttachments, startAttachmentTextBackfill, } from './attachment-text.js';
|
|
54
|
+
export type { AttachmentRowShape, AttachmentTextBackfillBatch, KernelJobHandlers, AttachmentSearchGate, AttachmentTextSource, AttachmentTextState, AttachmentTextStatus, } from './attachment-text.js';
|
|
55
|
+
export { DEFAULT_ATTACHMENT_TEXT_BOUNDS, EXTRACTION_STRIDE, assertAttachmentExtractors, assertAttachmentTextBounds, chooseAttachmentExtractor, inputBoundRefusal, isPositiveIntegerBound, mediaTypeOf, normalizeExtractedText, resolveAttachmentTextBounds, runAttachmentExtractor, truncateUtf8, } from './attachment-extractor.js';
|
|
52
56
|
export type { AttachmentExtractor, AttachmentExtractorInput, AttachmentExtractorResult, AttachmentTextBounds, ExtractionOutcome, ExtractionSignal, } from './attachment-extractor.js';
|
|
53
|
-
export { CursorMismatch, FilterNotDeclared, LIST_INDEX_PREFIX, NotListable, SortNotDeclared, cursorOf, isListIndexName, listIndexColumns, listIndexDdl, listIndexMigrations, listIndexPlans, listPlansByEntityType, listQuery, splitCursor, } from './list-index.js';
|
|
57
|
+
export { CursorMismatch, FilterNotDeclared, LIST_INDEX_PREFIX, NotListable, SortNotDeclared, cursorOf, isListIndexName, listIndexColumns, listIndexDdl, listIndexMigrations, listIndexPlans, stateListIndexNames, listPlansByEntityType, listQuery, splitCursor, } from './list-index.js';
|
|
54
58
|
export type { ComposedListQuery, ListDeclaration, ListIndexPlan, ListQueryParams, } from './list-index.js';
|
|
55
59
|
export { moduleMigrations } from './module-migrations.js';
|
|
56
60
|
export { frozenClock, manualClock } from './clock.js';
|
|
57
61
|
export type { ManualClock } from './clock.js';
|
|
58
|
-
export { createUlid, ulid, ulidCeiling, ulidTime, type UlidMint } from './ulid.js';
|
|
62
|
+
export { createUlid, ulid, ulidCeiling, ulidFloor, ulidTime, type UlidMint } from './ulid.js';
|
|
59
63
|
export { assertReadOnlyQuery } from './read-only-sql.js';
|
|
60
|
-
export { assertNoSpineReference, assertNoSpineWrite, guardSpine } from './spine-guard.js';
|
|
64
|
+
export { assertNoReservedColumnWrite, assertNoSpineReference, assertNoSpineWrite, assertNoStatefulDdl, changesSchema, guardSpine } from './spine-guard.js';
|
|
61
65
|
export { DO_SQL_LIMITS, tooManyResultColumns, tooManyTableColumns, assertWithinSqlLimits, guardSqlLimits, } from './sql-limits.js';
|
|
62
66
|
export { assertPermissionKey } from './check-key.js';
|
|
63
67
|
export { assertModuleEnqueueableKind } from './platform-kinds.js';
|
|
@@ -86,16 +90,18 @@ export { PLATFORM_REQUEST_COLUMNS, platformRequestHistoryQuery, platformRequestO
|
|
|
86
90
|
export type { PlatformRequestRawRow } from './platform-request-query.js';
|
|
87
91
|
export { CANCELLED_INTENT_NOTE, CANCELLED_JOB_NOTE, DELIVERY_ERROR_REDACTION_SQL, intentPayloadCarriesSubject, JOB_RUN_REDACTION_SQL, JOB_STEP_REDACTION_SQL, PLATFORM_REQUEST_REDACTION_SQL, platformRequestRedactionParams, platformRequestRedactionQuery, REDACTED_DELIVERY_NOTE, REDACTED_INTENT_MARKER, REDACTED_INTENT_NOTE, REDACTED_JOB_NOTE, redactedIntentPayload, redactSubjectJobRuns, REDACTED_FAILURE_NOTE, redactSubjectScopeText, ISSUE_EXEMPLAR_OWNER_BACKFILL_SQL, issueExemplarOwner, redactSubjectDirectoryText, platformIntentFailureMessage, intentIdOfFailureMessage, } from './subject-redaction.js';
|
|
88
92
|
export type { LegacySubjectRedactionCounts, PlatformRequestRedactionCandidate, RedactionSql, SubjectRedactionCounts, SubjectTextTarget, IssueExemplarOwner, } from './subject-redaction.js';
|
|
93
|
+
export { FINDINGS_DDL, FINDING_RETENTION_DAYS, createFindingRule, findingOfOpsFailure, findingOfSweepRun, pruneFindings, listFindingRules, listFindings, observeFinding, revokeFindingRule, setFindingStatus, type FindingPruneReport, type FindingAudit, type FindingChange, type FindingObservation, } from './findings.js';
|
|
89
94
|
export { effectiveRoleGrantQuery, seatScopeTuple } from './scope-tuple-seat.js';
|
|
95
|
+
export { applyScopeRoleChange, changeScopeRole, combineCoverage, revokeScopeRoles, scopeRoleHolders, type Atomically, type RoleBound, type ScopeRoleHolder } from './scope-role-admin.js';
|
|
90
96
|
export { repointScopeGrants, type RepointSource } from './scope-repoint.js';
|
|
91
97
|
export { COPY_ORIGIN_DDL, capabilitiesForLoad, clearCopyMarker, emittedHere, isCopyLoad, IS_COPY_SQL, MARK_COPY_ORIGIN_SQL, markCopyOrigin, settleCopiedWork } from './scope-copy.js';
|
|
92
98
|
export { isLifecycleWrite, lifecycleAfterLoad, lifecycleReceipt, lifecycleRefusal, readLifecycle, settleLifecycleAfterLoad, SCOPE_LIFECYCLE_KEY, WRITE_LIFECYCLE_SQL, writeLifecycle } from './scope-lifecycle.js';
|
|
93
99
|
export { CARRIED_AWAY_KEY, COPY_MARK_CLEARED_KEY, KEPT_COPY_REFUSAL, KEPT_DIVERGENT_KEY, LOAD_STAMP_KEY, STORE_LOCAL_META_KEYS, WRITE_REVISION_KEY, type KeptCopy, carriedAwayDump, dumpMetaValue, isCopyMarkInsert, isWriteStatement, metaValueIn, type CarriedAway, type LoadMarker } from './carried-copy.js';
|
|
94
100
|
export { LEGACY_SCOPE_ROWS_BACKFILL, assertDirectoryTablesBuilt, assertSpineTablesBuilt, dumpRowsInsert, isSpineTable, loadDirectoryDump, spineColumnAdditions, spineRowsInsert, type KernelColumnsOf } from './spine-restore.js';
|
|
95
|
-
export { SYSTEM_SWITCH_OFF_PREDICATE, SYSTEM_SWITCH_OFF_QUERY, SYSTEM_SWITCH_OFF_RELATION, subjectSwitchedOff, switchRecordedOff, switchSubjectGrants, switchSystemSchedules, subjectGrantState, systemGrantsStatus, systemScheduleState, systemSwitchedOff, systemSwitchedOffMessage, tenantSystemSwitchedOffMessage, } from './system-switch.js';
|
|
96
|
-
export type { SwitchOutcome, SwitchSql, SwitchedOff, SystemGrantsEntry, SystemScheduleState, } from './system-switch.js';
|
|
97
|
-
export {
|
|
98
|
-
export type { SystemSwitchReassert, SystemSwitchReassertOptions, SystemSwitchRecordFilter,
|
|
101
|
+
export { SYSTEM_SWITCH_OFF_PREDICATE, SYSTEM_SWITCH_OFF_QUERY, SYSTEM_SWITCH_OFF_RELATION, subjectSwitchedOff, SWITCH_FENCES_DDL, moveSwitch, recordedOffFromWire, switchRecordedOff, switchSubjectGrants, switchSystemSchedules, subjectGrantState, systemGrantsStatus, systemScheduleState, systemSwitchedOff, systemSwitchedOffMessage, tenantSystemSwitchedOffMessage, } from './system-switch.js';
|
|
102
|
+
export type { RecordedOffCarry, SwitchCarryWire, SwitchOutcome, SwitchSql, SwitchedOff, SystemGrantsEntry, SystemScheduleState, } from './system-switch.js';
|
|
103
|
+
export { PEER_SWITCHES_DDL, SWITCH_KINDS, SWITCH_OWED_DDL, SYSTEM_SWITCHES_DDL, SYSTEM_SWITCHES_TABLE, clearSwitchOwed, scopeOwesSwitch, markSwitchOwed, switchesOwedOf, dumpCarriesSwitches, forgetSwitchesOf, inUnitMovesToAudit, listSystemSwitchRecords, reassertActionOf, recordWriteSuperseded, reassertEntry, reassertOffRow, reassertOnRow, recordSwitchedOff, recordSwitchedOn, restoreSwitchRecord, scopesSwitchedOffFor, staleCarryRevertRow, staleCarryReverts, reportKeyOf, switchActionOf, switchAuditSubject, switchNotFoundMessage, switchFencesOf, switchRecordStatesOf, switchRecordsOf, switchSubjectOf, switchSupersededMessage, switchedOffOf, switchesBackfillSqlOf, switchesDdlOf, switchesTableExists, switchesTableOf, tenantHeldOf, tenantHoldsGrant, withRecorded, } from './system-switch-record.js';
|
|
104
|
+
export type { InUnitReport, SwitchKind, SwitchRecordPrior, SwitchRecordWrite, SystemSwitchReassert, SystemSwitchReassertOptions, SystemSwitchRecordFilter, SystemSwitchRecordRow, } from './system-switch-record.js';
|
|
99
105
|
export { VERSION_MIGRATIONS_DDL, splitManifestMigrations, splitVersionMigrationsBatch, versionMigrationsOf, versionsAwaitSplit, writeVersionMigrations, } from './version-migrations.js';
|
|
100
106
|
export type { SplitManifest } from './version-migrations.js';
|
|
101
107
|
export { PEER_SUBJECT_PREFIX, admitPeer, collectPeers, peerGrantsStatus, peerSeats, peerSubjectRef, peerSwitchedOff, resolveVerticalInstanceFrom, switchPeer, } from './peer.js';
|
|
@@ -104,9 +110,10 @@ export { DENIAL_COLUMNS, DENIAL_WINDOW_QUERY, denialListQuery, denialSummaryQuer
|
|
|
104
110
|
export { entityVersionQuery, entityVersionOf, assertIfMatch, OUTBOX_ENTITY_INDEX, type EntityVersion, type EntityVersionRow, } from './entity-version.js';
|
|
105
111
|
export { IMPERSONATION_COLUMNS, IMPERSONATION_DDL, ImpersonationRefused, assertImpersonationWrites, assertSessionUsable, impersonationByIdQuery, impersonationListQuery, impersonationRowValues, impersonationStampOf, mapImpersonationRow, newImpersonationSession, type ImpersonationRow, } from './impersonation.js';
|
|
106
112
|
export { readLifecycleFlow } from './lifecycle-flow.js';
|
|
113
|
+
export { OPERATION_SERIES_ID_SLACK_MS, operationSeriesQuery, readOperationSeries } from './operation-series.js';
|
|
107
114
|
export { REFUSALS_DDL, REFUSALS_INDEX, REFUSALS_REBUILD, REFUSALS_TABLE_DDL, markGuardRefusal, refusalInsert, refusalOf, refusalsAdmitGuards, refusedTransitionOf, type RefusalRow, type RefusedGuard, } from './refusals.js';
|
|
108
115
|
export { REFUSAL_COLUMNS, mapRefusalRow, refusalListQuery, type RefusalDbRow } from './refusal-query.js';
|
|
109
|
-
export { readTimeline, readHistory, readScopeTimeline, readScopeHistory, facetEvents, walkEventCause, walkEventEffects, readInvocation, readDeadLetters } from './timeline.js';
|
|
116
|
+
export { readTimeline, readHistory, readScopeTimeline, readScopeHistory, facetEvents, walkEventCause, walkEventEffects, readInvocation, readDeadLetters, readExecutorDelivery, type ExecutorDelivery, type ExecutorDeliveryState } from './timeline.js';
|
|
110
117
|
export type { ScopeWalkPage } from './timeline.js';
|
|
111
118
|
export type { TimelineReader } from './timeline.js';
|
|
112
119
|
export { rowDecoder, UNDECODED_ACTOR, UNDECODED_PERMISSION } from './row-decode.js';
|
|
@@ -114,8 +121,8 @@ export type { RowDecoder } from './row-decode.js';
|
|
|
114
121
|
export { domainEventOf, drainedEventOf, readUndrainedOutbox, undrainedEventsOf, UNDRAINED_SCAN_FACTOR, UNDRAINED_SKIPPED_IDS, } from './outbox-event.js';
|
|
115
122
|
export type { OutboxEnvelopeRow, OutboxDrainRow, UndrainedEvents, UndrainedRead, UndrainedSkipped, } from './outbox-event.js';
|
|
116
123
|
export { IDEMPOTENCY_DDL, assertIdempotencyKey, idempotencyLookupQuery, idempotencyPruneStatement, idempotencyRecordStatement, idempotencySubject, idempotencyOptedOutMessage, replayFor, type IdempotencyRow, type IdempotentReplay, } from './idempotency.js';
|
|
117
|
-
export { JOB_RUN_DDL, JOB_RUN_PATCH_SQL, JOB_STEP_RECORD_SQL, JOB_DRIVE_LIMIT, JOB_DRIVE_SCAN_MAX, JOB_RUN_LIST_LIMIT, JOB_RUN_LIST_MAX, jobRunListLimit, JOB_STEP_REUSED, SYSTEM_DOOR_WAIT, JOB_DEFER_MS, JOB_RUN_DUE_AT, assertQueueSafe, jobRunOf, runDueJobRuns, runJobPass, startJobRun, } from './job-run.js';
|
|
118
|
-
export type { JobDueKey, JobDriveReport, JobHandler, JobPassContext, JobPassOutcome, JobPassResult, JobRun, JobRunFilter, JobRunKey, JobRunPatch, JobRunRow, JobRunStatus, JobRunStore, JobStepRow, StartJobRunInput, } from './job-run.js';
|
|
124
|
+
export { JOB_RUN_DDL, JOB_RUN_PATCH_SQL, JOB_RUN_CLAIM_SQL, JOB_RUN_RENEW_SQL, JOB_RUN_BEGIN_SQL, JOB_RUN_MISS_SQL, JOB_RUN_MISS_SETTLE_SQL, admissionMissOutcome, JOB_STEP_RECORD_SQL, JOB_LEASE_MS, JOB_LEASE_MIN_MS, JOB_LEASE_ENTRY_MARGIN, JOB_ADMISSION_MISS_MAX, JOB_ADMISSION_BACKOFF_BASE_MS, JOB_ADMISSION_BACKOFF_MAX_MS, JOB_LEASE_TOO_SHORT_NOTE, admissionBackoffMs, JOB_LEASE_EXPIRED_NOTE, assertLeaseMs, JOB_DRIVE_LIMIT, JOB_DRIVE_SCAN_MAX, JOB_RUN_LIST_LIMIT, JOB_RUN_LIST_MAX, jobRunListLimit, JOB_STEP_REUSED, SYSTEM_DOOR_WAIT, JOB_DEFER_MS, JOB_RUN_DUE_AT, assertQueueSafe, jobRunOf, runDueJobRuns, runJobPass, startJobRun, } from './job-run.js';
|
|
125
|
+
export type { JobDueKey, JobDriveReport, JobHandler, JobPassContext, JobPassOutcome, JobPassResult, JobRun, JobRegistration, JobRunClaim, JobRunFilter, JobRunKey, JobRunPatch, JobRunRow, JobRunStatus, JobRunStore, JobStepRow, StartJobRunInput, } from './job-run.js';
|
|
119
126
|
export {
|
|
120
127
|
/** @deprecated Import from `@substrat-run/control-plane-api` (#1978); this kernel export goes in a later release. */
|
|
121
128
|
isTerminalDispatchFailure,
|
|
@@ -171,6 +178,9 @@ export {
|
|
|
171
178
|
invocationLevelOf,
|
|
172
179
|
/** @deprecated Import from `@substrat-run/contracts` (#1978); this kernel export goes in a later release. */
|
|
173
180
|
type InvocationLevel, } from '@substrat-run/contracts/invocation-record';
|
|
174
|
-
export { VERTICAL_EVENTS_DDL, EXPORT_HOPS_SQL, IMPORT_CURSORS_SQL, IMPORT_CURSOR_OF_SQL, IMPORT_CURSOR_ADVANCE_SQL, IMPORT_RECORD_SQL, OUTBOX_MARK_SQL, emittedSinceQuery, emittedReportOf, moveImportCursor, importCursorSourceOf, exportedSinceQuery, exportReadQuery, exportReadPlan, exportsOf, planExportBatch, withheldNote, CrossVerticalRegistry, type ExportRow, type RegisteredImport, } from './vertical-events.js';
|
|
175
|
-
export { attributedHost } from './attribution.js';
|
|
181
|
+
export { VERTICAL_EVENTS_DDL, EXPORT_HOPS_SQL, emptyImportResult, IMPORT_CURSORS_SQL, IMPORT_CURSOR_OF_SQL, IMPORT_CURSOR_ADVANCE_SQL, IMPORT_RECORD_SQL, OUTBOX_MARK_SQL, emittedSinceQuery, emittedReportOf, moveImportCursor, importCursorSourceOf, exportedSinceQuery, exportReadQuery, exportReadPlan, exportsOf, planExportBatch, withheldNote, CrossVerticalRegistry, type ExportRow, type RegisteredImport, } from './vertical-events.js';
|
|
182
|
+
export { attributedHost, attributedView, type ConsumerDelivery, type HostAttribution } from './attribution.js';
|
|
183
|
+
export { isDeliveryRefusal, refuseDelivery, refusalJournalText, REFUSAL_JOURNAL_PREFIX, type DeliveryRefusal, } from './delivery-refusal.js';
|
|
184
|
+
export { MEMBER_ADD_REQUESTED, MEMBER_REMOVE_REQUESTED, MEMBERSHIP_EXECUTOR_ID, MEMBERSHIP_REMOVAL_SKEW_MS, membershipEntity, membershipRemoveExecutorId, memberRemoveRequestedPayload, registerMembershipExecutor, type MemberRemoveRequestedPayload, type MembershipExecutorOptions, } from './membership-executor.js';
|
|
185
|
+
export { membershipFencesBackfillSql, MEMBERSHIP_FENCES_DDL, MEMBERSHIP_FENCES_TABLE, MEMBERSHIP_FENCE_SINCE_SQL, RAISE_MEMBERSHIP_FENCE_SQL, membershipFencesTableExists, } from './membership-fence.js';
|
|
176
186
|
//# sourceMappingURL=index.d.ts.map
|