@dsh-enhanced/lark-channel 0.1.64 → 0.1.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -6
- package/cordis.patch.yml +1 -0
- package/docs/operations.md +1 -1
- package/docs/progress-security.md +3 -0
- package/docs/rsi-setup.md +11 -7
- package/docs/setup.md +2 -1
- package/lib/adapter.d.ts +8 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +34 -2
- package/lib/adapter.js.map +1 -1
- package/lib/config.d.ts +4 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +52 -8
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +24 -1
- package/lib/index.js.map +1 -1
- package/lib/progress.d.ts +11 -1
- package/lib/progress.d.ts.map +1 -1
- package/lib/progress.js +13 -1
- package/lib/progress.js.map +1 -1
- package/lib/rsi-authority-runtime.d.ts +1 -0
- package/lib/rsi-authority-runtime.d.ts.map +1 -1
- package/lib/rsi-authority-runtime.js +121 -18
- package/lib/rsi-authority-runtime.js.map +1 -1
- package/lib/rsi-bootstrap-manifest.d.ts +12 -5
- package/lib/rsi-bootstrap-manifest.d.ts.map +1 -1
- package/lib/rsi-bootstrap-manifest.js +63 -9
- package/lib/rsi-bootstrap-manifest.js.map +1 -1
- package/lib/rsi-bootstrap.js +3 -3
- package/lib/rsi-bootstrap.js.map +1 -1
- package/lib/rsi-build.d.ts +12 -0
- package/lib/rsi-build.d.ts.map +1 -1
- package/lib/rsi-build.js +55 -5
- package/lib/rsi-build.js.map +1 -1
- package/lib/rsi-creation-build.d.ts +3 -0
- package/lib/rsi-creation-build.d.ts.map +1 -1
- package/lib/rsi-creation-build.js +45 -0
- package/lib/rsi-creation-build.js.map +1 -1
- package/lib/rsi-host-update.d.ts +51 -0
- package/lib/rsi-host-update.d.ts.map +1 -1
- package/lib/rsi-host-update.js +61 -1
- package/lib/rsi-host-update.js.map +1 -1
- package/lib/rsi-install.d.ts +10 -3
- package/lib/rsi-install.d.ts.map +1 -1
- package/lib/rsi-install.js +65 -15
- package/lib/rsi-install.js.map +1 -1
- package/lib/rsi-linux-cgroup-roots.d.ts +3 -0
- package/lib/rsi-linux-cgroup-roots.d.ts.map +1 -0
- package/lib/rsi-linux-cgroup-roots.js +3 -0
- package/lib/rsi-linux-cgroup-roots.js.map +1 -0
- package/lib/rsi-linux-creation-build.d.ts +36 -0
- package/lib/rsi-linux-creation-build.d.ts.map +1 -0
- package/lib/rsi-linux-creation-build.js +213 -0
- package/lib/rsi-linux-creation-build.js.map +1 -0
- package/lib/rsi-linux-native-materialize.d.ts +31 -0
- package/lib/rsi-linux-native-materialize.d.ts.map +1 -0
- package/lib/rsi-linux-native-materialize.js +162 -0
- package/lib/rsi-linux-native-materialize.js.map +1 -0
- package/lib/rsi-linux-native-relocation.d.ts +120 -0
- package/lib/rsi-linux-native-relocation.d.ts.map +1 -0
- package/lib/rsi-linux-native-relocation.js +1555 -0
- package/lib/rsi-linux-native-relocation.js.map +1 -0
- package/lib/rsi-linux-native-resources.d.ts +97 -0
- package/lib/rsi-linux-native-resources.d.ts.map +1 -0
- package/lib/rsi-linux-native-resources.js +521 -0
- package/lib/rsi-linux-native-resources.js.map +1 -0
- package/lib/rsi-linux-repository-bootstrap.d.ts +17 -0
- package/lib/rsi-linux-repository-bootstrap.d.ts.map +1 -0
- package/lib/rsi-linux-repository-bootstrap.js +317 -0
- package/lib/rsi-linux-repository-bootstrap.js.map +1 -0
- package/lib/rsi-linux-runner-states.d.ts +20 -0
- package/lib/rsi-linux-runner-states.d.ts.map +1 -0
- package/lib/rsi-linux-runner-states.js +70 -0
- package/lib/rsi-linux-runner-states.js.map +1 -0
- package/lib/rsi-linux-runtime-bootstrap.d.ts +10 -0
- package/lib/rsi-linux-runtime-bootstrap.d.ts.map +1 -0
- package/lib/rsi-linux-runtime-bootstrap.js +38 -0
- package/lib/rsi-linux-runtime-bootstrap.js.map +1 -0
- package/lib/rsi-linux-source-build.d.ts +28 -0
- package/lib/rsi-linux-source-build.d.ts.map +1 -0
- package/lib/rsi-linux-source-build.js +43 -0
- package/lib/rsi-linux-source-build.js.map +1 -0
- package/lib/rsi-local-install.d.ts +2 -0
- package/lib/rsi-local-install.d.ts.map +1 -1
- package/lib/rsi-local-install.js +42 -1
- package/lib/rsi-local-install.js.map +1 -1
- package/lib/rsi-local-pair-install.d.ts +15 -0
- package/lib/rsi-local-pair-install.d.ts.map +1 -1
- package/lib/rsi-local-pair-install.js +21 -6
- package/lib/rsi-local-pair-install.js.map +1 -1
- package/lib/rsi-local-resources.d.ts +2 -2
- package/lib/rsi-local-resources.d.ts.map +1 -1
- package/lib/rsi-local-resources.js +5 -0
- package/lib/rsi-local-resources.js.map +1 -1
- package/lib/rsi-local-update-build.d.ts +25 -6
- package/lib/rsi-local-update-build.d.ts.map +1 -1
- package/lib/rsi-local-update-build.js +46 -7
- package/lib/rsi-local-update-build.js.map +1 -1
- package/lib/rsi-local-update.d.ts +5 -2
- package/lib/rsi-local-update.d.ts.map +1 -1
- package/lib/rsi-local-update.js +6 -5
- package/lib/rsi-local-update.js.map +1 -1
- package/lib/rsi-plugin-creation.d.ts +16 -1
- package/lib/rsi-plugin-creation.d.ts.map +1 -1
- package/lib/rsi-plugin-creation.js +60 -14
- package/lib/rsi-plugin-creation.js.map +1 -1
- package/lib/rsi-plugin-revision.d.ts +35 -0
- package/lib/rsi-plugin-revision.d.ts.map +1 -0
- package/lib/rsi-plugin-revision.js +200 -0
- package/lib/rsi-plugin-revision.js.map +1 -0
- package/lib/rsi-profile.d.ts +8 -0
- package/lib/rsi-profile.d.ts.map +1 -1
- package/lib/rsi-profile.js +55 -2
- package/lib/rsi-profile.js.map +1 -1
- package/lib/rsi-release-build.d.ts +24 -8
- package/lib/rsi-release-build.d.ts.map +1 -1
- package/lib/rsi-release-build.js +89 -37
- package/lib/rsi-release-build.js.map +1 -1
- package/lib/rsi-scanner-retirement-config.d.ts +34 -0
- package/lib/rsi-scanner-retirement-config.d.ts.map +1 -0
- package/lib/rsi-scanner-retirement-config.js +272 -0
- package/lib/rsi-scanner-retirement-config.js.map +1 -0
- package/lib/rsi-scanner-retirement-runtime.d.ts +23 -0
- package/lib/rsi-scanner-retirement-runtime.d.ts.map +1 -0
- package/lib/rsi-scanner-retirement-runtime.js +98 -0
- package/lib/rsi-scanner-retirement-runtime.js.map +1 -0
- package/lib/rsi-scanner-retirement-stage.d.ts +55 -0
- package/lib/rsi-scanner-retirement-stage.d.ts.map +1 -0
- package/lib/rsi-scanner-retirement-stage.js +183 -0
- package/lib/rsi-scanner-retirement-stage.js.map +1 -0
- package/lib/rsi-scanner-retirement-transition.d.ts +57 -0
- package/lib/rsi-scanner-retirement-transition.d.ts.map +1 -0
- package/lib/rsi-scanner-retirement-transition.js +320 -0
- package/lib/rsi-scanner-retirement-transition.js.map +1 -0
- package/lib/rsi-setup.d.ts +20 -0
- package/lib/rsi-setup.d.ts.map +1 -1
- package/lib/rsi-setup.js +102 -5
- package/lib/rsi-setup.js.map +1 -1
- package/lib/rsi-source-maintenance.d.ts +9 -1
- package/lib/rsi-source-maintenance.d.ts.map +1 -1
- package/lib/rsi-source-maintenance.js +64 -5
- package/lib/rsi-source-maintenance.js.map +1 -1
- package/lib/rsi-source-update.js +2 -2
- package/lib/rsi-source-update.js.map +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +1 -0
- package/lib/service.js.map +1 -1
- package/lib/setup-profile.d.ts.map +1 -1
- package/lib/setup-profile.js +1 -0
- package/lib/setup-profile.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +21 -21
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
4
|
+
import { inspectAutomationRetirementSnapshot } from '@dsh-enhanced/assistant-automations';
|
|
5
|
+
import { ActiveLarkOwnerBindingsSnapshotError, inspectActiveLarkOwnerBindingsLocally, inspectRevokedOwnerRouteLocally } from '@dsh-enhanced/assistant-delivery';
|
|
6
|
+
import { validateMemoryLearningOwner } from '@dsh-enhanced/assistant-growth-contract';
|
|
7
|
+
import { deriveScannerRetirementConfiguration } from './rsi-scanner-retirement-config.js';
|
|
8
|
+
import { applyScannerRetirementMaintenance } from './rsi-scanner-retirement-runtime.js';
|
|
9
|
+
import { prepareScannerRetirementOperations, verifyScannerRetirementTransition } from './rsi-scanner-retirement-transition.js';
|
|
10
|
+
export class ScannerRetirementStageError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code) {
|
|
13
|
+
super(`scanner retirement stage rejected: ${code}`);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'ScannerRetirementStageError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function fail(code) { throw new ScannerRetirementStageError(code); }
|
|
19
|
+
function canonical(value) {
|
|
20
|
+
if (value === null || typeof value !== 'object')
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
if (Array.isArray(value))
|
|
23
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
24
|
+
const object = value;
|
|
25
|
+
return `{${Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${canonical(object[key])}`).join(',')}}`;
|
|
26
|
+
}
|
|
27
|
+
const digest = (value) => createHash('sha256').update(canonical(value)).digest('hex');
|
|
28
|
+
const same = (a, b) => canonical(a) === canonical(b);
|
|
29
|
+
function freeze(value) {
|
|
30
|
+
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
31
|
+
Object.values(value).forEach(freeze);
|
|
32
|
+
Object.freeze(value);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function sameStage(before, current) {
|
|
37
|
+
if (before.database.device !== current.database.device || before.database.inode !== current.database.inode)
|
|
38
|
+
fail('storage-drift');
|
|
39
|
+
}
|
|
40
|
+
function selectTargets(before, configured) {
|
|
41
|
+
return configured.filter(target => {
|
|
42
|
+
const record = before.records.find(row => row.id === target.automationId);
|
|
43
|
+
const marker = before.retirements.find(row => row.owner === target.owner && row.automationId === target.automationId);
|
|
44
|
+
if (record && record.owner !== target.owner)
|
|
45
|
+
fail('invalid-target');
|
|
46
|
+
// A formal marker can outlive its definition; neither case creates a row.
|
|
47
|
+
if (marker)
|
|
48
|
+
return false;
|
|
49
|
+
if (!record)
|
|
50
|
+
return false;
|
|
51
|
+
if (!['active', 'paused'].includes(record.status))
|
|
52
|
+
fail('invalid-target');
|
|
53
|
+
return true;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function proveActive(config, owner) {
|
|
57
|
+
const authority = config.ownerQuery.authority;
|
|
58
|
+
const active = inspectActiveLarkOwnerBindingsLocally({ databasePath: config.ownerQuery.databasePath,
|
|
59
|
+
account: authority.principal.account, tenant: authority.principal.tenant, workspace: authority.workspace, agentPreset: authority.agentPreset });
|
|
60
|
+
const matches = active.bindings.filter(binding => binding.owner.id === owner.principalRecordId
|
|
61
|
+
&& binding.owner.version === owner.principalVersion && binding.owner.status === 'active' && binding.owner.role === 'owner'
|
|
62
|
+
&& isDeepStrictEqual(binding.owner.principal, authority.principal) && isDeepStrictEqual(binding.principal, authority.principal)
|
|
63
|
+
&& isDeepStrictEqual(binding.conversation, authority.conversation) && binding.workspace === authority.workspace
|
|
64
|
+
&& binding.agentPreset === authority.agentPreset && binding.policyRef === authority.policyRef
|
|
65
|
+
&& binding.generation >= authority.minimumGeneration);
|
|
66
|
+
if (matches.length !== 1)
|
|
67
|
+
fail('owner-unavailable');
|
|
68
|
+
}
|
|
69
|
+
function validatePlan(plan) {
|
|
70
|
+
try {
|
|
71
|
+
if (Object.keys(plan).sort().join(',') !== 'automationsDatabasePath,before,dshHome,effectiveConfigDigest,operations,owner,ownerProof,planDigest,profile,protocol,targets'
|
|
72
|
+
|| plan.protocol !== 'lark-channel/scanner-retirement-plan/v1' || !/^[a-f0-9]{64}$/u.test(plan.effectiveConfigDigest)
|
|
73
|
+
|| !isAbsolute(plan.automationsDatabasePath) || resolve(plan.automationsDatabasePath) !== plan.automationsDatabasePath
|
|
74
|
+
|| plan.targets.length < 1 || plan.targets.length > 4)
|
|
75
|
+
fail('invalid-plan');
|
|
76
|
+
const { planDigest, ...unsigned } = plan;
|
|
77
|
+
if (digest(unsigned) !== planDigest)
|
|
78
|
+
fail('invalid-plan');
|
|
79
|
+
const owner = validateMemoryLearningOwner(plan.owner), proof = plan.ownerProof;
|
|
80
|
+
if (proof.frozenPrincipalVersion !== owner.principalVersion || proof.state.principalRecordId !== owner.principalRecordId
|
|
81
|
+
|| proof.state.principalId !== owner.principalId || proof.state.authorityId !== owner.authorityId
|
|
82
|
+
|| proof.state.authorityHash !== owner.authorityHash || proof.authority.workspace !== owner.workspace
|
|
83
|
+
|| proof.authority.agentPreset !== owner.agentPreset)
|
|
84
|
+
fail('invalid-plan');
|
|
85
|
+
if (!same(prepareScannerRetirementOperations(plan), plan.operations))
|
|
86
|
+
fail('invalid-plan');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error instanceof ScannerRetirementStageError)
|
|
90
|
+
throw error;
|
|
91
|
+
fail('invalid-plan');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function completion(plan, after) {
|
|
95
|
+
sameStage(plan.before, after);
|
|
96
|
+
const transition = verifyScannerRetirementTransition({ ...plan, after });
|
|
97
|
+
const unsigned = { protocol: 'lark-channel/scanner-retirement-completion/v1', planDigest: plan.planDigest, after, transition };
|
|
98
|
+
return freeze({ ...unsigned, completionDigest: digest(unsigned) });
|
|
99
|
+
}
|
|
100
|
+
/** Read-only preparation for a parent-attested, stopped stage. No Store is opened. */
|
|
101
|
+
export function captureScannerRetirementPlan(input) {
|
|
102
|
+
const { expectedStorageDigest, ...scope } = input;
|
|
103
|
+
const config = deriveScannerRetirementConfiguration(scope);
|
|
104
|
+
const before = inspectAutomationRetirementSnapshot(config.automationsDatabasePath);
|
|
105
|
+
if (!/^[a-f0-9]{64}$/u.test(expectedStorageDigest) || before.storageDigest !== expectedStorageDigest)
|
|
106
|
+
fail('storage-drift');
|
|
107
|
+
const noop = (reason) => freeze({ status: 'no-op', reason,
|
|
108
|
+
effectiveConfigDigest: config.effectiveConfigDigest, beforeSnapshotDigest: before.snapshotDigest, storageDigest: before.storageDigest });
|
|
109
|
+
let ownerProof;
|
|
110
|
+
try {
|
|
111
|
+
ownerProof = inspectRevokedOwnerRouteLocally(config.ownerQuery);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (!(error instanceof ActiveLarkOwnerBindingsSnapshotError) || error.code !== 'owner-not-revoked')
|
|
115
|
+
throw error;
|
|
116
|
+
proveActive(config, input.owner);
|
|
117
|
+
return noop('owner-active');
|
|
118
|
+
}
|
|
119
|
+
const targets = selectTargets(before, config.targets);
|
|
120
|
+
if (targets.length === 0)
|
|
121
|
+
return noop('no-targets');
|
|
122
|
+
const operations = prepareScannerRetirementOperations({ before, ownerProof, targets });
|
|
123
|
+
const unsigned = { protocol: 'lark-channel/scanner-retirement-plan/v1', dshHome: input.dshHome, profile: input.profile,
|
|
124
|
+
owner: structuredClone(input.owner), automationsDatabasePath: config.automationsDatabasePath,
|
|
125
|
+
effectiveConfigDigest: config.effectiveConfigDigest, before, ownerProof, targets, operations };
|
|
126
|
+
return freeze({ status: 'prepared', plan: { ...unsigned, planDigest: digest(unsigned) } });
|
|
127
|
+
}
|
|
128
|
+
/** Uses only the archived tuples; a partial or close failure never renews a key or grant. */
|
|
129
|
+
export async function applyScannerRetirementPlan(input) {
|
|
130
|
+
input.signal.throwIfAborted();
|
|
131
|
+
// Own a detached copy across every asynchronous maintenance boundary.
|
|
132
|
+
const plan = freeze(structuredClone(input.plan));
|
|
133
|
+
validatePlan(plan);
|
|
134
|
+
const config = deriveScannerRetirementConfiguration({ effectiveConfig: input.effectiveConfig, dshHome: plan.dshHome, profile: plan.profile, owner: plan.owner });
|
|
135
|
+
if (config.effectiveConfigDigest !== plan.effectiveConfigDigest || config.automationsDatabasePath !== plan.automationsDatabasePath
|
|
136
|
+
|| !same(selectTargets(plan.before, config.targets), plan.targets)
|
|
137
|
+
|| !same(config.ownerQuery.authority, plan.ownerProof.authority)
|
|
138
|
+
|| config.ownerQuery.principalRecordId !== plan.ownerProof.state.principalRecordId
|
|
139
|
+
|| config.ownerQuery.frozenPrincipalVersion !== plan.ownerProof.frozenPrincipalVersion)
|
|
140
|
+
fail('configuration-drift');
|
|
141
|
+
const ownerProof = inspectRevokedOwnerRouteLocally(config.ownerQuery);
|
|
142
|
+
if (ownerProof.snapshotDigest !== plan.ownerProof.snapshotDigest)
|
|
143
|
+
fail('owner-drift');
|
|
144
|
+
const current = inspectAutomationRetirementSnapshot(plan.automationsDatabasePath);
|
|
145
|
+
sameStage(plan.before, current);
|
|
146
|
+
const completed = plan.targets.filter(target => current.retirements.some(marker => marker.owner === target.owner && marker.automationId === target.automationId));
|
|
147
|
+
if (!same(current, plan.before))
|
|
148
|
+
verifyScannerRetirementTransition({ before: plan.before, after: current, ownerProof: plan.ownerProof, targets: completed });
|
|
149
|
+
input.signal.throwIfAborted();
|
|
150
|
+
if (completed.length === plan.targets.length)
|
|
151
|
+
return completion(plan, current);
|
|
152
|
+
await applyScannerRetirementMaintenance({ policyConfig: config.policyConfig, automationsConfig: config.automationsConfig,
|
|
153
|
+
operations: plan.operations, signal: input.signal });
|
|
154
|
+
input.signal.throwIfAborted();
|
|
155
|
+
return completion(plan, inspectAutomationRetirementSnapshot(plan.automationsDatabasePath));
|
|
156
|
+
}
|
|
157
|
+
/** Recheck permanent markers after legitimate task/history progress, using the frozen stage path. */
|
|
158
|
+
export function verifyScannerRetirementPersistence(input) {
|
|
159
|
+
const { plan, completion: receipt } = structuredClone(input);
|
|
160
|
+
validatePlan(plan);
|
|
161
|
+
const { completionDigest, ...unsigned } = receipt;
|
|
162
|
+
if (Object.keys(receipt).sort().join(',') !== 'after,completionDigest,planDigest,protocol,transition'
|
|
163
|
+
|| receipt.protocol !== 'lark-channel/scanner-retirement-completion/v1' || receipt.planDigest !== plan.planDigest
|
|
164
|
+
|| digest(unsigned) !== completionDigest || !same(completion(plan, receipt.after), receipt))
|
|
165
|
+
fail('invalid-plan');
|
|
166
|
+
const current = inspectAutomationRetirementSnapshot(plan.automationsDatabasePath);
|
|
167
|
+
sameStage(plan.before, current);
|
|
168
|
+
// A validated historical completion may remain on v16 without opening a
|
|
169
|
+
// writer. A v17 completion can never use that allowance to accept a downgrade.
|
|
170
|
+
const historicalV16 = current.schemaVersion === 16 && receipt.after.schemaVersion === 16
|
|
171
|
+
&& (plan.before.schemaVersion === 15 || plan.before.schemaVersion === 16);
|
|
172
|
+
if (current.schemaVersion !== 17 && !historicalV16)
|
|
173
|
+
fail('persistence-drift');
|
|
174
|
+
for (const target of plan.targets) {
|
|
175
|
+
const record = receipt.after.records.find(row => row.id === target.automationId);
|
|
176
|
+
const marker = receipt.after.retirements.find(row => row.owner === target.owner && row.automationId === target.automationId);
|
|
177
|
+
if (!record || !marker || !same(record, current.records.find(row => row.id === target.automationId))
|
|
178
|
+
|| !same(marker, current.retirements.find(row => row.owner === target.owner && row.automationId === target.automationId)))
|
|
179
|
+
fail('persistence-drift');
|
|
180
|
+
}
|
|
181
|
+
return current;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=rsi-scanner-retirement-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-scanner-retirement-stage.js","sourceRoot":"","sources":["../src/rsi-scanner-retirement-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { AutomationRetirementReceipt, AutomationRetirementSnapshot } from '@dsh-enhanced/assistant-automations';
|
|
2
|
+
import type { RevokedOwnerRouteSnapshot } from '@dsh-enhanced/assistant-delivery';
|
|
3
|
+
declare const scannerPrefixes: {
|
|
4
|
+
readonly 'assistant-memory-learning': "memory-scan-";
|
|
5
|
+
readonly 'assistant-growth-usage': "usage-scan-";
|
|
6
|
+
readonly 'plugin-control-plane-task-observations': "task-observation-scan-";
|
|
7
|
+
readonly 'plugin-control-plane-live-qualification': "live-qualification-scan-";
|
|
8
|
+
};
|
|
9
|
+
export interface ScannerRetirementTarget {
|
|
10
|
+
readonly owner: keyof typeof scannerPrefixes;
|
|
11
|
+
readonly automationId: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ScannerRetirementTransitionInput {
|
|
14
|
+
readonly before: AutomationRetirementSnapshot;
|
|
15
|
+
readonly after: AutomationRetirementSnapshot;
|
|
16
|
+
readonly ownerProof: RevokedOwnerRouteSnapshot;
|
|
17
|
+
readonly targets: readonly ScannerRetirementTarget[];
|
|
18
|
+
}
|
|
19
|
+
export type ScannerRetirementOperation = Pick<AutomationRetirementReceipt, 'owner' | 'automationId' | 'operationId' | 'definitionHash' | 'expectedVersion' | 'reason' | 'evidenceDigest'>;
|
|
20
|
+
export declare const scannerRetirementTransitionProtocol: "lark-channel/scanner-retirement-transition/v1";
|
|
21
|
+
export interface ScannerRetirementTransitionReceipt {
|
|
22
|
+
readonly protocol: typeof scannerRetirementTransitionProtocol;
|
|
23
|
+
readonly beforeSnapshotDigest: string;
|
|
24
|
+
readonly afterSnapshotDigest: string;
|
|
25
|
+
readonly ownerProofSnapshotDigest: string;
|
|
26
|
+
readonly targets: readonly Readonly<ScannerRetirementTarget & {
|
|
27
|
+
evidenceDigest: string;
|
|
28
|
+
markerDigest: string;
|
|
29
|
+
}>[];
|
|
30
|
+
readonly receiptDigest: string;
|
|
31
|
+
}
|
|
32
|
+
export type ScannerRetirementTransitionErrorCode = 'invalid-proof' | 'invalid-targets' | 'definitions-changed' | 'retirements-changed' | 'history-changed' | 'schema-changed';
|
|
33
|
+
export declare class ScannerRetirementTransitionError extends Error {
|
|
34
|
+
readonly code: ScannerRetirementTransitionErrorCode;
|
|
35
|
+
constructor(code: ScannerRetirementTransitionErrorCode);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Freeze the exact operations before any staged service is mounted. Inputs have
|
|
39
|
+
* the same trusted-reader and independently derived configuration requirements
|
|
40
|
+
* as transition verification. These tuples confer no permission: the writer must
|
|
41
|
+
* use the formal Automations service and retain them unchanged across retries.
|
|
42
|
+
*/
|
|
43
|
+
export declare function prepareScannerRetirementOperations(input: Omit<ScannerRetirementTransitionInput, 'after'>): readonly ScannerRetirementOperation[];
|
|
44
|
+
/**
|
|
45
|
+
* Pure verification of a preselected retirement change; grants no write or execution permission.
|
|
46
|
+
* Both snapshots and ownerProof MUST come from the formal trusted local readers.
|
|
47
|
+
* The parent installer MUST independently derive exact targets from frozen effective
|
|
48
|
+
* configuration and bind that configuration, owner route and transaction to this call.
|
|
49
|
+
* For Memory, ownerProof.frozenPrincipalVersion MUST equal the frozen learning
|
|
50
|
+
* grant owner.principalVersion; its expectedOwner scope uses that grant version,
|
|
51
|
+
* while the observed revoked state can be at a later durable principal version.
|
|
52
|
+
* A matching scanner prefix does not prove that a definition belongs to that config.
|
|
53
|
+
* Digests are consistency checks after trusted reads, never external authenticity signatures.
|
|
54
|
+
*/
|
|
55
|
+
export declare function verifyScannerRetirementTransition(input: ScannerRetirementTransitionInput): ScannerRetirementTransitionReceipt;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=rsi-scanner-retirement-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-scanner-retirement-transition.d.ts","sourceRoot":"","sources":["../src/rsi-scanner-retirement-transition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,2BAA2B,EAE3B,4BAA4B,EAC7B,MAAM,qCAAqC,CAAA;AAE5C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAA;AAEjF,QAAA,MAAM,eAAe;;;;;CAKX,CAAA;AAEV,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,eAAe,CAAA;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAA;IAC7C,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAA;CACrD;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,2BAA2B,EACvE,OAAO,GAAG,cAAc,GAAG,aAAa,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,QAAQ,GAAG,gBAAgB,CAAC,CAAA;AAEhH,eAAO,MAAM,mCAAmC,EAAG,+CAAwD,CAAA;AAE3G,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,mCAAmC,CAAA;IAC7D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAA;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,uBAAuB,GAAG;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAA;IACjH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,MAAM,oCAAoC,GAAG,eAAe,GAAG,iBAAiB,GAAG,qBAAqB,GAC1G,qBAAqB,GAAG,iBAAiB,GAAG,gBAAgB,CAAA;AAEhE,qBAAa,gCAAiC,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,oCAAoC;gBAA1C,IAAI,EAAE,oCAAoC;CAIhE;AAgJD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,IAAI,CAAC,gCAAgC,EAAE,OAAO,CAAC,GACrD,SAAS,0BAA0B,EAAE,CAgCvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,gCAAgC,GAAG,kCAAkC,CAsE7H"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { externalPrincipalId, ownerRouteAuthorityHash } from '@dsh-enhanced/assistant-delivery';
|
|
3
|
+
const scannerPrefixes = {
|
|
4
|
+
'assistant-memory-learning': 'memory-scan-',
|
|
5
|
+
'assistant-growth-usage': 'usage-scan-',
|
|
6
|
+
'plugin-control-plane-task-observations': 'task-observation-scan-',
|
|
7
|
+
'plugin-control-plane-live-qualification': 'live-qualification-scan-',
|
|
8
|
+
};
|
|
9
|
+
export const scannerRetirementTransitionProtocol = 'lark-channel/scanner-retirement-transition/v1';
|
|
10
|
+
export class ScannerRetirementTransitionError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code) {
|
|
13
|
+
super(`scanner retirement transition rejected: ${code}`);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'ScannerRetirementTransitionError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const digestPattern = /^[a-f0-9]{64}$/u;
|
|
19
|
+
const digest = (value) => createHash('sha256').update(value).digest('hex');
|
|
20
|
+
const jsonDigest = (value) => digest(JSON.stringify(value));
|
|
21
|
+
const integer = (value, minimum = 0) => typeof value === 'number'
|
|
22
|
+
&& Number.isSafeInteger(value) && value >= minimum;
|
|
23
|
+
function reject(code) { throw new ScannerRetirementTransitionError(code); }
|
|
24
|
+
function canonicalJson(value) {
|
|
25
|
+
if (value === null || typeof value !== 'object')
|
|
26
|
+
return JSON.stringify(value);
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
29
|
+
const object = value;
|
|
30
|
+
return `{${Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(',')}}`;
|
|
31
|
+
}
|
|
32
|
+
function same(left, right) { return canonicalJson(left) === canonicalJson(right); }
|
|
33
|
+
function freeze(value) {
|
|
34
|
+
if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
35
|
+
Object.values(value).forEach(freeze);
|
|
36
|
+
Object.freeze(value);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function uniqueMap(items, key, code) {
|
|
41
|
+
const result = new Map();
|
|
42
|
+
for (const item of items) {
|
|
43
|
+
const identity = key(item);
|
|
44
|
+
if (result.has(identity))
|
|
45
|
+
reject(code);
|
|
46
|
+
result.set(identity, item);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
const markerKey = (marker) => JSON.stringify([marker.owner, marker.automationId]);
|
|
51
|
+
const schemaKey = (entry) => JSON.stringify([entry.type, entry.name]);
|
|
52
|
+
/** Reconstruct the exact scope insertion order passed by each production scanner runtime. */
|
|
53
|
+
function ownerEvidence(proof) {
|
|
54
|
+
if (proof.protocol !== 'assistant-delivery/revoked-owner-route-snapshot/v1'
|
|
55
|
+
|| ![23, 24, 25, 26, 27, 28, 29, 30, 31].includes(proof.schemaVersion)
|
|
56
|
+
|| !integer(proof.frozenPrincipalVersion, 1) || !digestPattern.test(proof.snapshotDigest))
|
|
57
|
+
reject('invalid-proof');
|
|
58
|
+
const authority = proof.authority;
|
|
59
|
+
const authorityHash = ownerRouteAuthorityHash(authority);
|
|
60
|
+
// The public hash function validates the full authority and canonicalizes it.
|
|
61
|
+
// Rebuild canonical field order to reject noncanonical values while accepting
|
|
62
|
+
// arbitrary incoming JSON key order, without importing another bundle's internals.
|
|
63
|
+
const conversation = authority.conversation;
|
|
64
|
+
const principal = authority.principal;
|
|
65
|
+
const orderedAuthority = {
|
|
66
|
+
id: authority.id,
|
|
67
|
+
conversation: { channel: conversation.channel, account: conversation.account, tenant: conversation.tenant,
|
|
68
|
+
kind: conversation.kind, chat: conversation.chat, ...(conversation.thread === undefined ? {} : { thread: conversation.thread }) },
|
|
69
|
+
principal: { channel: principal.channel, account: principal.account, tenant: principal.tenant, user: principal.user },
|
|
70
|
+
workspace: authority.workspace, agentPreset: authority.agentPreset, policyRef: authority.policyRef,
|
|
71
|
+
minimumGeneration: authority.minimumGeneration,
|
|
72
|
+
};
|
|
73
|
+
if (jsonDigest(orderedAuthority) !== authorityHash)
|
|
74
|
+
reject('invalid-proof');
|
|
75
|
+
const state = proof.state;
|
|
76
|
+
if (state.status !== 'revoked' || state.authorityId !== authority.id || state.authorityHash !== authorityHash
|
|
77
|
+
|| state.principalId !== externalPrincipalId(principal)
|
|
78
|
+
|| typeof state.principalRecordId !== 'string' || !/^principal_[0-9a-f-]{8,}$/u.test(state.principalRecordId)
|
|
79
|
+
|| !integer(state.principalVersion, 1) || state.principalVersion < proof.frozenPrincipalVersion)
|
|
80
|
+
reject('invalid-proof');
|
|
81
|
+
const orderedState = { status: 'revoked', authorityId: authority.id, authorityHash,
|
|
82
|
+
principalId: externalPrincipalId(principal), principalRecordId: state.principalRecordId, principalVersion: state.principalVersion };
|
|
83
|
+
if (!same(state, orderedState))
|
|
84
|
+
reject('invalid-proof');
|
|
85
|
+
const { snapshotDigest, ...unsigned } = proof;
|
|
86
|
+
if (digest(canonicalJson(unsigned)) !== snapshotDigest)
|
|
87
|
+
reject('invalid-proof');
|
|
88
|
+
return owner => jsonDigest({ protocol: 'scanner-owner-revoked/v1',
|
|
89
|
+
scope: { authorityId: authority.id, principalId: orderedState.principalId,
|
|
90
|
+
workspace: authority.workspace, agentPreset: authority.agentPreset,
|
|
91
|
+
...(owner === 'assistant-memory-learning' ? { expectedOwner: { authorityHash,
|
|
92
|
+
principalRecordId: orderedState.principalRecordId, principalVersion: proof.frozenPrincipalVersion } } : {}) },
|
|
93
|
+
state: orderedState });
|
|
94
|
+
}
|
|
95
|
+
function stableDefinition(record) {
|
|
96
|
+
const { status: _status, nextRunAt: _nextRunAt, updatedAt: _updatedAt, version: _version, ...stable } = record;
|
|
97
|
+
return stable;
|
|
98
|
+
}
|
|
99
|
+
/** Reproduce SQLite ADD COLUMN's insertion before the table constraints. */
|
|
100
|
+
function addRunQuiescenceColumnSql(sql) {
|
|
101
|
+
if (sql === null)
|
|
102
|
+
return undefined;
|
|
103
|
+
let depth = 0;
|
|
104
|
+
// Skip quoted strings/identifiers and comments when finding structural commas.
|
|
105
|
+
const tokens = /'(?:''|[^'])*'|"(?:""|[^"])*"|`(?:``|[^`])*`|\[[^\]]*\]|--[^\n]*|\/\*[\s\S]*?\*\/|[(),]/gu;
|
|
106
|
+
for (const token of sql.matchAll(tokens)) {
|
|
107
|
+
if (token[0] === '(')
|
|
108
|
+
depth++;
|
|
109
|
+
if (token[0] === ')') {
|
|
110
|
+
depth--;
|
|
111
|
+
if (depth === 0)
|
|
112
|
+
return `${sql.slice(0, token.index)}, quiescent INTEGER CHECK(quiescent IN (0, 1))${sql.slice(token.index)}`;
|
|
113
|
+
}
|
|
114
|
+
if (token[0] === ',' && depth === 1
|
|
115
|
+
&& /^\s*(?:CHECK|CONSTRAINT|FOREIGN\s+KEY|PRIMARY\s+KEY|UNIQUE)\b/iu.test(sql.slice(token.index + 1))) {
|
|
116
|
+
return `${sql.slice(0, token.index)}, quiescent INTEGER CHECK(quiescent IN (0, 1))${sql.slice(token.index)}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
function verifySchema(before, after) {
|
|
122
|
+
const original = uniqueMap(before.schemaEntries, schemaKey, 'schema-changed');
|
|
123
|
+
const current = uniqueMap(after.schemaEntries, schemaKey, 'schema-changed');
|
|
124
|
+
const upgradesQuiescence = before.schemaVersion < 17 && after.schemaVersion === 17;
|
|
125
|
+
for (const [key, entry] of original) {
|
|
126
|
+
const updated = current.get(key);
|
|
127
|
+
if (upgradesQuiescence && entry.type === 'table' && entry.name === 'automation_runs') {
|
|
128
|
+
// Preserve every byte of the pre-existing SQL, including table constraints.
|
|
129
|
+
const expectedSql = addRunQuiescenceColumnSql(entry.sql);
|
|
130
|
+
if (typeof expectedSql !== 'string' || expectedSql === entry.sql
|
|
131
|
+
|| !same({ ...entry, sql: expectedSql }, updated))
|
|
132
|
+
reject('schema-changed');
|
|
133
|
+
}
|
|
134
|
+
else if (!same(entry, updated))
|
|
135
|
+
reject('schema-changed');
|
|
136
|
+
}
|
|
137
|
+
if (before.schemaVersion === after.schemaVersion) {
|
|
138
|
+
if (original.size !== current.size || !same(before.schemaEntries, after.schemaEntries)
|
|
139
|
+
|| before.schemaDigest !== after.schemaDigest)
|
|
140
|
+
reject('schema-changed');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Formal readers verify the exact retirement table/trigger SQL. Preserve the
|
|
144
|
+
// historical seven-identity v15->v16 allowance; upgrading to v17 additionally
|
|
145
|
+
// permits only the exact run quiescence column and immutable trigger.
|
|
146
|
+
const additions = before.schemaVersion === 15 ? [
|
|
147
|
+
{ type: 'table', name: 'automation_system_retirements', table: 'automation_system_retirements', sql: '' },
|
|
148
|
+
{ type: 'index', name: 'sqlite_autoindex_automation_system_retirements_1', table: 'automation_system_retirements', sql: null },
|
|
149
|
+
{ type: 'index', name: 'sqlite_autoindex_automation_system_retirements_2', table: 'automation_system_retirements', sql: null },
|
|
150
|
+
{ type: 'trigger', name: 'automation_retirements_no_update', table: 'automation_system_retirements', sql: '' },
|
|
151
|
+
{ type: 'trigger', name: 'automation_retirements_no_delete', table: 'automation_system_retirements', sql: '' },
|
|
152
|
+
{ type: 'trigger', name: 'automation_retired_no_activate_insert', table: 'automation_definitions', sql: '' },
|
|
153
|
+
{ type: 'trigger', name: 'automation_retired_no_activate_update', table: 'automation_definitions', sql: '' },
|
|
154
|
+
] : [];
|
|
155
|
+
if (upgradesQuiescence)
|
|
156
|
+
additions.push({ type: 'trigger', name: 'automation_run_quiescence_immutable',
|
|
157
|
+
table: 'automation_runs', sql: `CREATE TRIGGER automation_run_quiescence_immutable\n BEFORE UPDATE OF quiescent ON automation_runs WHEN NEW.quiescent IS NOT OLD.quiescent\n BEGIN SELECT RAISE(ABORT, 'run quiescence observation is immutable'); END` });
|
|
158
|
+
const allowed = new Map(additions.map(entry => [schemaKey(entry), entry]));
|
|
159
|
+
if (current.size !== original.size + allowed.size)
|
|
160
|
+
reject('schema-changed');
|
|
161
|
+
for (const [key, entry] of current) {
|
|
162
|
+
if (original.has(key))
|
|
163
|
+
continue;
|
|
164
|
+
const expected = allowed.get(key);
|
|
165
|
+
if (expected === undefined || entry.table !== expected.table
|
|
166
|
+
|| (entry.name === 'automation_run_quiescence_immutable' && entry.sql !== expected.sql)
|
|
167
|
+
|| (expected.sql === null ? entry.sql !== null : typeof entry.sql !== 'string' || entry.sql.length === 0))
|
|
168
|
+
reject('schema-changed');
|
|
169
|
+
allowed.delete(key);
|
|
170
|
+
}
|
|
171
|
+
if (allowed.size !== 0)
|
|
172
|
+
reject('schema-changed');
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Freeze the exact operations before any staged service is mounted. Inputs have
|
|
176
|
+
* the same trusted-reader and independently derived configuration requirements
|
|
177
|
+
* as transition verification. These tuples confer no permission: the writer must
|
|
178
|
+
* use the formal Automations service and retain them unchanged across retries.
|
|
179
|
+
*/
|
|
180
|
+
export function prepareScannerRetirementOperations(input) {
|
|
181
|
+
try {
|
|
182
|
+
const { before, ownerProof } = input;
|
|
183
|
+
if (before.protocol !== 'assistant-automations/retirement-snapshot/v1'
|
|
184
|
+
|| ![15, 16, 17].includes(before.schemaVersion) || before.inFlightCount !== 0
|
|
185
|
+
|| !digestPattern.test(before.snapshotDigest))
|
|
186
|
+
reject('invalid-proof');
|
|
187
|
+
const evidenceForOwner = ownerEvidence(ownerProof);
|
|
188
|
+
if (!Array.isArray(input.targets) || input.targets.length > 4)
|
|
189
|
+
reject('invalid-targets');
|
|
190
|
+
const originals = uniqueMap(before.records, record => record.id, 'definitions-changed');
|
|
191
|
+
const oldMarkers = uniqueMap(before.retirements, markerKey, 'retirements-changed');
|
|
192
|
+
if (before.schemaVersion === 15 && oldMarkers.size !== 0)
|
|
193
|
+
reject('retirements-changed');
|
|
194
|
+
const owners = new Set();
|
|
195
|
+
return freeze(input.targets.map((inputTarget) => {
|
|
196
|
+
const target = { owner: inputTarget.owner, automationId: inputTarget.automationId };
|
|
197
|
+
const prefix = Object.hasOwn(scannerPrefixes, target.owner) ? scannerPrefixes[target.owner] : undefined;
|
|
198
|
+
if (!same(target, inputTarget) || prefix === undefined || typeof target.automationId !== 'string'
|
|
199
|
+
|| !new RegExp(`^${prefix}[a-f0-9]{64}$`, 'u').test(target.automationId) || owners.has(target.owner))
|
|
200
|
+
reject('invalid-targets');
|
|
201
|
+
owners.add(target.owner);
|
|
202
|
+
const record = originals.get(target.automationId);
|
|
203
|
+
if (record === undefined || record.owner !== target.owner || record.runningTaskCount !== 0
|
|
204
|
+
|| !['active', 'paused'].includes(record.status) || !integer(record.version, 1)
|
|
205
|
+
|| !digestPattern.test(record.definitionHash))
|
|
206
|
+
reject('definitions-changed');
|
|
207
|
+
if (oldMarkers.has(markerKey(target)))
|
|
208
|
+
reject('retirements-changed');
|
|
209
|
+
const evidenceDigest = evidenceForOwner(target.owner);
|
|
210
|
+
return { ...target, definitionHash: record.definitionHash, expectedVersion: record.version,
|
|
211
|
+
operationId: `owner-revoked:${jsonDigest([target.owner, target.automationId, record.definitionHash, record.version, evidenceDigest])}`,
|
|
212
|
+
reason: 'owner-revoked', evidenceDigest };
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error instanceof ScannerRetirementTransitionError)
|
|
217
|
+
throw error;
|
|
218
|
+
return reject('invalid-proof');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Pure verification of a preselected retirement change; grants no write or execution permission.
|
|
223
|
+
* Both snapshots and ownerProof MUST come from the formal trusted local readers.
|
|
224
|
+
* The parent installer MUST independently derive exact targets from frozen effective
|
|
225
|
+
* configuration and bind that configuration, owner route and transaction to this call.
|
|
226
|
+
* For Memory, ownerProof.frozenPrincipalVersion MUST equal the frozen learning
|
|
227
|
+
* grant owner.principalVersion; its expectedOwner scope uses that grant version,
|
|
228
|
+
* while the observed revoked state can be at a later durable principal version.
|
|
229
|
+
* A matching scanner prefix does not prove that a definition belongs to that config.
|
|
230
|
+
* Digests are consistency checks after trusted reads, never external authenticity signatures.
|
|
231
|
+
*/
|
|
232
|
+
export function verifyScannerRetirementTransition(input) {
|
|
233
|
+
try {
|
|
234
|
+
const { before, after, ownerProof } = input;
|
|
235
|
+
if (before.protocol !== 'assistant-automations/retirement-snapshot/v1' || after.protocol !== before.protocol
|
|
236
|
+
|| ![15, 16, 17].includes(before.schemaVersion) || ![16, 17].includes(after.schemaVersion)
|
|
237
|
+
|| after.schemaVersion < before.schemaVersion
|
|
238
|
+
|| before.inFlightCount !== 0 || after.inFlightCount !== 0
|
|
239
|
+
|| !digestPattern.test(before.snapshotDigest) || !digestPattern.test(after.snapshotDigest))
|
|
240
|
+
reject('invalid-proof');
|
|
241
|
+
const operations = prepareScannerRetirementOperations(input);
|
|
242
|
+
const targets = input.targets.map(target => ({ owner: target.owner, automationId: target.automationId }));
|
|
243
|
+
const selected = uniqueMap(targets, target => target.automationId, 'invalid-targets');
|
|
244
|
+
const originals = uniqueMap(before.records, record => record.id, 'definitions-changed');
|
|
245
|
+
const current = uniqueMap(after.records, record => record.id, 'definitions-changed');
|
|
246
|
+
if (originals.size !== current.size)
|
|
247
|
+
reject('definitions-changed');
|
|
248
|
+
for (const [id, record] of originals) {
|
|
249
|
+
const updated = current.get(id);
|
|
250
|
+
if (updated === undefined || record.runningTaskCount !== 0 || updated.runningTaskCount !== 0
|
|
251
|
+
|| record.immutableDigest !== updated.immutableDigest)
|
|
252
|
+
reject('definitions-changed');
|
|
253
|
+
if (!selected.has(id) && !same(record, updated))
|
|
254
|
+
reject('definitions-changed');
|
|
255
|
+
}
|
|
256
|
+
const oldMarkers = uniqueMap(before.retirements, markerKey, 'retirements-changed');
|
|
257
|
+
const newMarkers = uniqueMap(after.retirements, markerKey, 'retirements-changed');
|
|
258
|
+
uniqueMap(after.retirements, marker => marker.operationId, 'retirements-changed');
|
|
259
|
+
if ((before.schemaVersion === 15 && oldMarkers.size !== 0)
|
|
260
|
+
|| newMarkers.size !== oldMarkers.size + targets.length)
|
|
261
|
+
reject('retirements-changed');
|
|
262
|
+
for (const [key, marker] of oldMarkers)
|
|
263
|
+
if (!same(marker, newMarkers.get(key)))
|
|
264
|
+
reject('retirements-changed');
|
|
265
|
+
const receipts = targets.map((target, index) => {
|
|
266
|
+
const operation = operations[index];
|
|
267
|
+
const { evidenceDigest } = operation;
|
|
268
|
+
const record = originals.get(target.automationId);
|
|
269
|
+
const updated = current.get(target.automationId);
|
|
270
|
+
if (record === undefined || updated === undefined || record.owner !== target.owner
|
|
271
|
+
|| (record.status !== 'active' && record.status !== 'paused') || record.runningTaskCount !== 0
|
|
272
|
+
|| updated.runningTaskCount !== 0 || !integer(record.version, 1) || !integer(updated.version, 2)
|
|
273
|
+
|| updated.version !== record.version + 1 || updated.status !== 'paused' || Object.hasOwn(updated, 'nextRunAt')
|
|
274
|
+
|| !same(stableDefinition(record), stableDefinition(updated)))
|
|
275
|
+
reject('definitions-changed');
|
|
276
|
+
const key = markerKey(target);
|
|
277
|
+
const marker = newMarkers.get(key);
|
|
278
|
+
if (oldMarkers.has(key) || marker === undefined || !integer(marker.retiredAt)
|
|
279
|
+
|| updated.updatedAt !== marker.retiredAt)
|
|
280
|
+
reject('retirements-changed');
|
|
281
|
+
const expected = {
|
|
282
|
+
...operation, definitionVersion: updated.version, automationStatus: 'paused', retiredAt: marker.retiredAt,
|
|
283
|
+
};
|
|
284
|
+
if (!same(marker, expected))
|
|
285
|
+
reject('retirements-changed');
|
|
286
|
+
return { ...target, evidenceDigest, markerDigest: digest(canonicalJson(expected)) };
|
|
287
|
+
});
|
|
288
|
+
const history = uniqueMap(before.historyTables, table => table.name, 'history-changed');
|
|
289
|
+
const updatedHistory = uniqueMap(after.historyTables, table => table.name, 'history-changed');
|
|
290
|
+
if (history.size !== updatedHistory.size)
|
|
291
|
+
reject('history-changed');
|
|
292
|
+
for (const [index, table] of before.historyTables.entries()) {
|
|
293
|
+
const updated = updatedHistory.get(table.name);
|
|
294
|
+
if (after.historyTables[index]?.name !== table.name)
|
|
295
|
+
reject('history-changed');
|
|
296
|
+
if (before.schemaVersion < 17 && after.schemaVersion === 17 && table.name === 'automation_runs') {
|
|
297
|
+
// Only the trusted reader can compute this old-column projection. The
|
|
298
|
+
// new nullable column must carry no retrospectively signed observations.
|
|
299
|
+
if (!updated || updated.rowCount !== table.rowCount || updated.legacyDigest !== table.digest
|
|
300
|
+
|| updated.nonNullQuiescentCount !== 0
|
|
301
|
+
|| Object.keys(table).sort().join(',') !== 'digest,name,rowCount'
|
|
302
|
+
|| Object.keys(updated).sort().join(',') !== 'digest,legacyDigest,name,nonNullQuiescentCount,rowCount')
|
|
303
|
+
reject('history-changed');
|
|
304
|
+
}
|
|
305
|
+
else if (!same(table, updated))
|
|
306
|
+
reject('history-changed');
|
|
307
|
+
}
|
|
308
|
+
verifySchema(before, after);
|
|
309
|
+
receipts.sort((left, right) => left.owner < right.owner ? -1 : left.owner > right.owner ? 1 : 0);
|
|
310
|
+
const unsigned = { protocol: scannerRetirementTransitionProtocol, beforeSnapshotDigest: before.snapshotDigest,
|
|
311
|
+
afterSnapshotDigest: after.snapshotDigest, ownerProofSnapshotDigest: ownerProof.snapshotDigest, targets: receipts };
|
|
312
|
+
return freeze({ ...unsigned, receiptDigest: digest(canonicalJson(unsigned)) });
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
if (error instanceof ScannerRetirementTransitionError)
|
|
316
|
+
throw error;
|
|
317
|
+
return reject('invalid-proof');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=rsi-scanner-retirement-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-scanner-retirement-transition.js","sourceRoot":"","sources":["../src/rsi-scanner-retirement-transition.ts"],"names":[],"mappings":"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"}
|