@victframework/runtime 0.1.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/agent-governance.d.ts +285 -0
- package/dist/agent-governance.js +438 -0
- package/dist/agent-governance.js.map +1 -0
- package/dist/agent-registry.d.ts +103 -0
- package/dist/agent-registry.js +758 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/agent-types.d.ts +433 -0
- package/dist/agent-types.js +480 -0
- package/dist/agent-types.js.map +1 -0
- package/dist/authority.d.ts +83 -0
- package/dist/authority.js +170 -0
- package/dist/authority.js.map +1 -0
- package/dist/boundary-conformance.d.ts +51 -0
- package/dist/boundary-conformance.js +364 -0
- package/dist/boundary-conformance.js.map +1 -0
- package/dist/control-conformance.d.ts +68 -0
- package/dist/control-conformance.js +1131 -0
- package/dist/control-conformance.js.map +1 -0
- package/dist/control-in-memory.d.ts +257 -0
- package/dist/control-in-memory.js +886 -0
- package/dist/control-in-memory.js.map +1 -0
- package/dist/control-types.d.ts +1017 -0
- package/dist/control-types.js +779 -0
- package/dist/control-types.js.map +1 -0
- package/dist/durable-run.d.ts +73 -0
- package/dist/durable-run.js +262 -0
- package/dist/durable-run.js.map +1 -0
- package/dist/effect-policy.d.ts +22 -0
- package/dist/effect-policy.js +45 -0
- package/dist/effect-policy.js.map +1 -0
- package/dist/errors.d.ts +36 -0
- package/dist/errors.js +71 -0
- package/dist/errors.js.map +1 -0
- package/dist/in-memory-stores.d.ts +16 -0
- package/dist/in-memory-stores.js +522 -0
- package/dist/in-memory-stores.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/operator-config.d.ts +141 -0
- package/dist/operator-config.js +289 -0
- package/dist/operator-config.js.map +1 -0
- package/dist/orchestration-activation.d.ts +116 -0
- package/dist/orchestration-activation.js +223 -0
- package/dist/orchestration-activation.js.map +1 -0
- package/dist/orchestration-canary-conformance.d.ts +10 -0
- package/dist/orchestration-canary-conformance.js +726 -0
- package/dist/orchestration-canary-conformance.js.map +1 -0
- package/dist/orchestration-commands.d.ts +47 -0
- package/dist/orchestration-commands.js +538 -0
- package/dist/orchestration-commands.js.map +1 -0
- package/dist/orchestration-conformance.d.ts +59 -0
- package/dist/orchestration-conformance.js +594 -0
- package/dist/orchestration-conformance.js.map +1 -0
- package/dist/orchestration-driver-types.d.ts +163 -0
- package/dist/orchestration-driver-types.js +21 -0
- package/dist/orchestration-driver-types.js.map +1 -0
- package/dist/orchestration-driver.d.ts +48 -0
- package/dist/orchestration-driver.js +1030 -0
- package/dist/orchestration-driver.js.map +1 -0
- package/dist/orchestration-in-memory.d.ts +18 -0
- package/dist/orchestration-in-memory.js +1313 -0
- package/dist/orchestration-in-memory.js.map +1 -0
- package/dist/orchestration-join-conformance.d.ts +20 -0
- package/dist/orchestration-join-conformance.js +542 -0
- package/dist/orchestration-join-conformance.js.map +1 -0
- package/dist/orchestration-plan.d.ts +52 -0
- package/dist/orchestration-plan.js +265 -0
- package/dist/orchestration-plan.js.map +1 -0
- package/dist/orchestration-race-conformance.d.ts +35 -0
- package/dist/orchestration-race-conformance.js +1265 -0
- package/dist/orchestration-race-conformance.js.map +1 -0
- package/dist/orchestration-remediation-conformance.d.ts +54 -0
- package/dist/orchestration-remediation-conformance.js +632 -0
- package/dist/orchestration-remediation-conformance.js.map +1 -0
- package/dist/orchestration-store-types.d.ts +568 -0
- package/dist/orchestration-store-types.js +2 -0
- package/dist/orchestration-store-types.js.map +1 -0
- package/dist/pack-conformance.d.ts +59 -0
- package/dist/pack-conformance.js +222 -0
- package/dist/pack-conformance.js.map +1 -0
- package/dist/pack-install.d.ts +44 -0
- package/dist/pack-install.js +126 -0
- package/dist/pack-install.js.map +1 -0
- package/dist/registry.d.ts +107 -0
- package/dist/registry.js +481 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +158 -0
- package/dist/runtime.js +1341 -0
- package/dist/runtime.js.map +1 -0
- package/dist/serialization.d.ts +26 -0
- package/dist/serialization.js +162 -0
- package/dist/serialization.js.map +1 -0
- package/dist/store-conformance.d.ts +45 -0
- package/dist/store-conformance.js +876 -0
- package/dist/store-conformance.js.map +1 -0
- package/dist/store-errors.d.ts +49 -0
- package/dist/store-errors.js +48 -0
- package/dist/store-errors.js.map +1 -0
- package/dist/store-types.d.ts +331 -0
- package/dist/store-types.js +14 -0
- package/dist/store-types.js.map +1 -0
- package/dist/store-validation.d.ts +63 -0
- package/dist/store-validation.js +164 -0
- package/dist/store-validation.js.map +1 -0
- package/dist/stream-hub.d.ts +151 -0
- package/dist/stream-hub.js +402 -0
- package/dist/stream-hub.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.js +19 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import { NEUTRAL_JSON_CONTRACT_ID } from '@victframework/contracts';
|
|
2
|
+
import { VictRuntimeError } from './errors.js';
|
|
3
|
+
import { gateCapabilityInvoke, pinAuthorityDeclarations, } from './authority.js';
|
|
4
|
+
function isValidRevision(revision) {
|
|
5
|
+
return typeof revision === 'string' && revision.trim().length > 0;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The closed field set of a capability definition. Unknown fields are
|
|
9
|
+
* rejected at the public registration boundary: a misspelled authority
|
|
10
|
+
* field (e.g. `permissionsTypo`) must fail loudly instead of silently
|
|
11
|
+
* dropping the author's intended enforcement.
|
|
12
|
+
*/
|
|
13
|
+
const CAPABILITY_DEFINITION_FIELDS = new Set([
|
|
14
|
+
'id',
|
|
15
|
+
'revision',
|
|
16
|
+
'effect',
|
|
17
|
+
'input',
|
|
18
|
+
'output',
|
|
19
|
+
'invoke',
|
|
20
|
+
'idempotency',
|
|
21
|
+
'permissions',
|
|
22
|
+
'configuration',
|
|
23
|
+
'requiredConfiguration',
|
|
24
|
+
'secrets',
|
|
25
|
+
'requiredSecrets',
|
|
26
|
+
]);
|
|
27
|
+
/** A contract-shaped object: identity + revision + a parse callable. */
|
|
28
|
+
function isContractShaped(value) {
|
|
29
|
+
return (typeof value === 'object' &&
|
|
30
|
+
value !== null &&
|
|
31
|
+
typeof value.id === 'string' &&
|
|
32
|
+
typeof value.revision === 'string' &&
|
|
33
|
+
typeof value.parse === 'function');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Owns registered capabilities, contracts, and test doubles for one runtime.
|
|
37
|
+
* Not a global registry: every runtime instance carries its own.
|
|
38
|
+
*
|
|
39
|
+
* Registration validates author/build revisions and the full executable
|
|
40
|
+
* definition (closed fields, effect vocabulary, CONT-001 contract presence,
|
|
41
|
+
* authority names), because revisions and declarations feed activation
|
|
42
|
+
* identity. Live maps are never exposed: consumers receive descriptors or
|
|
43
|
+
* frozen copies.
|
|
44
|
+
*
|
|
45
|
+
* Atomic registration (HIGH-04-A / LOW-RE-3): `installBatch` stages every
|
|
46
|
+
* contract/capability/double against a staging overlay WITHOUT mutating any
|
|
47
|
+
* live map, and commits the complete batch only when every step succeeds.
|
|
48
|
+
* The direct public `registerCapability` path uses the SAME staging
|
|
49
|
+
* mechanism (capability + embedded contracts staged together), so ANY
|
|
50
|
+
* failure — including a contract conflict — leaves the registry
|
|
51
|
+
* byte-for-byte semantically unchanged. There is no best-effort rollback
|
|
52
|
+
* of partially registered entries.
|
|
53
|
+
*/
|
|
54
|
+
export class CapabilityRegistry {
|
|
55
|
+
#authority;
|
|
56
|
+
#capabilities = new Map();
|
|
57
|
+
/**
|
|
58
|
+
* Historical revisions per capability id. Registering a NEW revision for
|
|
59
|
+
* an existing id adds a resolvable revision instead of replacing the
|
|
60
|
+
* current one, so suspended runs can restore their exact pinned
|
|
61
|
+
* activation artifacts. The same id+revision may never be registered
|
|
62
|
+
* twice.
|
|
63
|
+
*/
|
|
64
|
+
#capabilityRevisions = new Map();
|
|
65
|
+
#contracts = new Map();
|
|
66
|
+
#contractRevisions = new Map();
|
|
67
|
+
#doubles = new Map();
|
|
68
|
+
/** Active staging overlay (set only inside `installBatch`). */
|
|
69
|
+
#staging;
|
|
70
|
+
constructor(authority) {
|
|
71
|
+
this.#authority = authority;
|
|
72
|
+
}
|
|
73
|
+
// ---- Validation ---------------------------------------------------------
|
|
74
|
+
/** Full executable-definition validation at the public registration boundary. */
|
|
75
|
+
#validateCapabilityDefinition(definition) {
|
|
76
|
+
if (typeof definition.id !== 'string' || definition.id.trim().length === 0) {
|
|
77
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CAPABILITY', 'Capability id must be a non-empty, non-whitespace string.');
|
|
78
|
+
}
|
|
79
|
+
for (const key of Object.keys(definition)) {
|
|
80
|
+
if (!CAPABILITY_DEFINITION_FIELDS.has(key)) {
|
|
81
|
+
throw new VictRuntimeError('VICT_RUNTIME_UNKNOWN_DEFINITION_FIELD', `Capability '${definition.id}' declares unknown field '${key}'; the capability-definition schema is closed. A misspelled authority or metadata field is rejected instead of silently dropping the author's intended semantics.`, { capabilityId: definition.id, field: key });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!isValidRevision(definition.revision)) {
|
|
85
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_REVISION', `Capability '${definition.id}' must declare a non-empty revision string (e.g. revision: '1'). ` +
|
|
86
|
+
'Changing handler logic or execution metadata requires changing the revision.', { capabilityId: definition.id });
|
|
87
|
+
}
|
|
88
|
+
if (typeof definition.invoke !== 'function') {
|
|
89
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CAPABILITY', `Capability '${definition.id}' must provide an invoke function.`);
|
|
90
|
+
}
|
|
91
|
+
const effect = definition.effect;
|
|
92
|
+
if (typeof effect !== 'string' || !['pure', 'read', 'write', 'irreversible'].includes(effect)) {
|
|
93
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_EFFECT', `Capability '${definition.id}' declares effect '${String(definition.effect)}', which is not in the closed effect vocabulary ('pure', 'read', 'write', 'irreversible').`, { capabilityId: definition.id, effect: String(definition.effect) });
|
|
94
|
+
}
|
|
95
|
+
if (definition.idempotency !== undefined && definition.idempotency !== 'keyed') {
|
|
96
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CAPABILITY', `Capability '${definition.id}' declares unsupported idempotency '${String(definition.idempotency)}'; only 'keyed' (or absent) is supported.`, { capabilityId: definition.id });
|
|
97
|
+
}
|
|
98
|
+
// CONT-001: every executable capability declares BOTH input and output
|
|
99
|
+
// contracts. Enforced at the public registration/pack-installation
|
|
100
|
+
// boundary — TypeScript typing alone cannot guarantee it for plain
|
|
101
|
+
// JavaScript objects.
|
|
102
|
+
for (const role of ['input', 'output']) {
|
|
103
|
+
const contract = definition[role];
|
|
104
|
+
if (contract === undefined) {
|
|
105
|
+
throw new VictRuntimeError('VICT_RUNTIME_MISSING_CONTRACT', `Capability '${definition.id}' must declare an ${role} contract (CONT-001: every executable capability declares its input and output contracts). Use a deliberate neutral contract (e.g. vict.neutral.json) when the boundary intentionally accepts arbitrary JSON values.`, { capabilityId: definition.id, role });
|
|
106
|
+
}
|
|
107
|
+
if (!isContractShaped(contract)) {
|
|
108
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CONTRACT', `Capability '${definition.id}' declares an ${role} contract without a contract identity (id, revision) and a parse function.`, { capabilityId: definition.id, role });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Authority declarations are executable semantics: validate every name,
|
|
112
|
+
// reject duplicates and whitespace-only entries, and PIN (copy + freeze)
|
|
113
|
+
// the declaration snapshot used by the invocation gate.
|
|
114
|
+
pinAuthorityDeclarations(definition);
|
|
115
|
+
}
|
|
116
|
+
// ---- Registration -------------------------------------------------------
|
|
117
|
+
registerCapability(definition) {
|
|
118
|
+
if (this.#staging !== undefined) {
|
|
119
|
+
// Inside a batch (pack installation or the atomic direct path below):
|
|
120
|
+
// stage the effective registration without touching any live map.
|
|
121
|
+
this.#stageCapability(definition);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// LOW-RE-3 remediation: the direct public path is ATOMIC. The
|
|
125
|
+
// capability AND its embedded contracts are staged together (all
|
|
126
|
+
// validation and collision checks run against live + staged state) and
|
|
127
|
+
// the complete registration commits only when every step succeeds. A
|
|
128
|
+
// capability-identity or contract collision leaves the registry
|
|
129
|
+
// semantically unchanged, and the same corrected registration is
|
|
130
|
+
// retryable. Pack installation keeps its own outer batch; this path
|
|
131
|
+
// never nests a second batch.
|
|
132
|
+
this.installBatch(() => {
|
|
133
|
+
this.#stageCapability(definition);
|
|
134
|
+
// Capability-embedded contracts are published under their own ids so
|
|
135
|
+
// the kernel can validate against them at execution time.
|
|
136
|
+
if (definition.input) {
|
|
137
|
+
this.registerContract(definition.input);
|
|
138
|
+
}
|
|
139
|
+
if (definition.output) {
|
|
140
|
+
this.registerContract(definition.output);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** Validate, gate, and stage one capability registration (no live mutation). */
|
|
145
|
+
#stageCapability(definition) {
|
|
146
|
+
this.#validateCapabilityDefinition(definition);
|
|
147
|
+
if (this.#capabilityRevisions.get(definition.id)?.has(definition.revision)) {
|
|
148
|
+
throw new VictRuntimeError('VICT_RUNTIME_DUPLICATE_CAPABILITY', `Capability '${definition.id}' revision '${definition.revision}' is already registered in this runtime.`);
|
|
149
|
+
}
|
|
150
|
+
// Stage 04 least-authority gate: the WRAPPED invoke is what activations
|
|
151
|
+
// capture, so permission/secret/configuration enforcement is identical
|
|
152
|
+
// on the sequential and durable engines. Default-deny: a definition
|
|
153
|
+
// that declares permissions/requirements is gated even when the runtime
|
|
154
|
+
// has NO authority configured (empty grants, absent ports). The gate
|
|
155
|
+
// closes over PINNED (copied + frozen) declaration snapshots, never the
|
|
156
|
+
// caller's arrays. Function-bearing fields are captured by reference.
|
|
157
|
+
const declaresAuthorityRequirements = (definition.permissions !== undefined && definition.permissions.length > 0) ||
|
|
158
|
+
(definition.requiredConfiguration !== undefined &&
|
|
159
|
+
definition.requiredConfiguration.length > 0) ||
|
|
160
|
+
(definition.requiredSecrets !== undefined && definition.requiredSecrets.length > 0);
|
|
161
|
+
const needsGate = this.#authority !== undefined || declaresAuthorityRequirements;
|
|
162
|
+
const effective = needsGate
|
|
163
|
+
? {
|
|
164
|
+
...definition,
|
|
165
|
+
invoke: gateCapabilityInvoke(definition, this.#authority ?? {}),
|
|
166
|
+
}
|
|
167
|
+
: definition;
|
|
168
|
+
this.#commitCapability(definition.id, definition.revision, effective);
|
|
169
|
+
}
|
|
170
|
+
/** Commit one capability registration to live or staged storage. */
|
|
171
|
+
#commitCapability(id, revision, effective) {
|
|
172
|
+
if (this.#staging !== undefined) {
|
|
173
|
+
let revisions = this.#staging.capabilities.get(id);
|
|
174
|
+
if (!revisions) {
|
|
175
|
+
revisions = new Map();
|
|
176
|
+
this.#staging.capabilities.set(id, revisions);
|
|
177
|
+
}
|
|
178
|
+
if (revisions.has(revision)) {
|
|
179
|
+
throw new VictRuntimeError('VICT_RUNTIME_DUPLICATE_CAPABILITY', `Capability '${id}' revision '${revision}' is already staged by this installation.`);
|
|
180
|
+
}
|
|
181
|
+
revisions.set(revision, effective);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
this.#capabilities.set(id, effective);
|
|
185
|
+
let capabilityRevisions = this.#capabilityRevisions.get(id);
|
|
186
|
+
if (!capabilityRevisions) {
|
|
187
|
+
capabilityRevisions = new Map();
|
|
188
|
+
this.#capabilityRevisions.set(id, capabilityRevisions);
|
|
189
|
+
}
|
|
190
|
+
capabilityRevisions.set(revision, effective);
|
|
191
|
+
}
|
|
192
|
+
registerContract(contract) {
|
|
193
|
+
if (typeof contract.id !== 'string' || contract.id.trim().length === 0) {
|
|
194
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CONTRACT', 'Contract id must be a non-empty, non-whitespace string.');
|
|
195
|
+
}
|
|
196
|
+
if (!isValidRevision(contract.revision)) {
|
|
197
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CONTRACT', `Contract '${contract.id}' must declare a non-empty revision string (e.g. revision: '1'). ` +
|
|
198
|
+
'Changing contract semantics requires changing the revision.', { contractId: contract.id });
|
|
199
|
+
}
|
|
200
|
+
const existing = this.#contracts.get(contract.id);
|
|
201
|
+
if (existing && existing !== contract) {
|
|
202
|
+
if (existing.revision === contract.revision) {
|
|
203
|
+
throw new VictRuntimeError('VICT_RUNTIME_CONTRACT_CONFLICT', `Contract id '${contract.id}' revision '${contract.revision}' is already registered with a different contract object.`);
|
|
204
|
+
}
|
|
205
|
+
// A new revision for an existing contract id: both remain resolvable.
|
|
206
|
+
}
|
|
207
|
+
if (!existing && this.#staging === undefined) {
|
|
208
|
+
this.#contracts.set(contract.id, contract);
|
|
209
|
+
}
|
|
210
|
+
const revisionMap = this.#staging !== undefined
|
|
211
|
+
? this.#contractRevisionMapFor(this.#staging.contracts, contract.id)
|
|
212
|
+
: this.#contractRevisionMapFor(this.#contractRevisions, contract.id);
|
|
213
|
+
const priorRevision = revisionMap.get(contract.revision);
|
|
214
|
+
if (priorRevision !== undefined && priorRevision !== contract) {
|
|
215
|
+
throw new VictRuntimeError('VICT_RUNTIME_CONTRACT_CONFLICT', `Contract id '${contract.id}' revision '${contract.revision}' is already registered with a different contract object.`);
|
|
216
|
+
}
|
|
217
|
+
revisionMap.set(contract.revision, contract);
|
|
218
|
+
}
|
|
219
|
+
#contractRevisionMapFor(map, id) {
|
|
220
|
+
let revisions = map.get(id);
|
|
221
|
+
if (!revisions) {
|
|
222
|
+
revisions = new Map();
|
|
223
|
+
map.set(id, revisions);
|
|
224
|
+
}
|
|
225
|
+
return revisions;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Register a test double. Doubles are runtime test configuration: they are
|
|
229
|
+
* not part of activation identity, and each run snapshots them at run
|
|
230
|
+
* start. A double NEVER runs in normal mode; without an explicit
|
|
231
|
+
* `modes` option it is eligible in both 'test' and 'simulate'. Duplicate
|
|
232
|
+
* registration is rejected — use `replaceDouble` for an explicit
|
|
233
|
+
* replacement.
|
|
234
|
+
*/
|
|
235
|
+
registerDouble(capabilityId, invoke, options = {}) {
|
|
236
|
+
if (!this.#capabilities.has(capabilityId) && !this.#staging?.capabilities.has(capabilityId)) {
|
|
237
|
+
throw new VictRuntimeError('VICT_RUNTIME_DOUBLE_FOR_UNKNOWN_CAPABILITY', `Cannot register a test double for unknown capability '${capabilityId}'. Register the capability first.`);
|
|
238
|
+
}
|
|
239
|
+
if (typeof invoke !== 'function') {
|
|
240
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CAPABILITY', `Test double for '${capabilityId}' must be a function.`);
|
|
241
|
+
}
|
|
242
|
+
if (this.#doubles.has(capabilityId) || this.#staging?.doubles.has(capabilityId)) {
|
|
243
|
+
throw new VictRuntimeError('VICT_RUNTIME_DOUBLE_ALREADY_REGISTERED', `A test double for capability '${capabilityId}' is already registered. Use replaceDouble() for an explicit replacement.`);
|
|
244
|
+
}
|
|
245
|
+
const modes = new Set(options.modes ?? ['test', 'simulate']);
|
|
246
|
+
if (modes.size === 0) {
|
|
247
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_CAPABILITY', `Test double for '${capabilityId}' must declare at least one eligible mode ('test' or 'simulate').`);
|
|
248
|
+
}
|
|
249
|
+
const registered = { invoke, modes: Object.freeze(modes) };
|
|
250
|
+
if (this.#staging !== undefined) {
|
|
251
|
+
this.#staging.doubles.set(capabilityId, registered);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
this.#doubles.set(capabilityId, registered);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/** Explicitly replace an existing test double. Requires a double to be registered. */
|
|
258
|
+
replaceDouble(capabilityId, invoke) {
|
|
259
|
+
if (!this.#capabilities.has(capabilityId)) {
|
|
260
|
+
throw new VictRuntimeError('VICT_RUNTIME_DOUBLE_FOR_UNKNOWN_CAPABILITY', `Cannot replace a test double for unknown capability '${capabilityId}'. Register the capability first.`);
|
|
261
|
+
}
|
|
262
|
+
if (!this.#doubles.has(capabilityId)) {
|
|
263
|
+
throw new VictRuntimeError('VICT_RUNTIME_DOUBLE_NOT_REGISTERED', `No test double is registered for capability '${capabilityId}'. Use registerDouble() first.`);
|
|
264
|
+
}
|
|
265
|
+
this.#doubles.set(capabilityId, {
|
|
266
|
+
invoke,
|
|
267
|
+
modes: this.#doubles.get(capabilityId)?.modes ??
|
|
268
|
+
Object.freeze(new Set(['test', 'simulate'])),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
hasDouble(capabilityId) {
|
|
272
|
+
return this.#doubles.has(capabilityId);
|
|
273
|
+
}
|
|
274
|
+
getDoubleModes(capabilityId) {
|
|
275
|
+
return this.#doubles.get(capabilityId)?.modes;
|
|
276
|
+
}
|
|
277
|
+
/** Snapshot the current doubles at run start. In-flight runs cannot observe later changes. */
|
|
278
|
+
snapshotDoubles() {
|
|
279
|
+
return new Map(this.#doubles);
|
|
280
|
+
}
|
|
281
|
+
getCapability(capabilityId) {
|
|
282
|
+
return this.#capabilities.get(capabilityId);
|
|
283
|
+
}
|
|
284
|
+
/** Resolve a capability by exact revision (suspended-run restoration). */
|
|
285
|
+
getCapabilityRevision(capabilityId, revision) {
|
|
286
|
+
return this.#capabilityRevisions.get(capabilityId)?.get(revision);
|
|
287
|
+
}
|
|
288
|
+
getContract(contractId) {
|
|
289
|
+
return this.#contracts.get(contractId);
|
|
290
|
+
}
|
|
291
|
+
/** Resolve a contract by exact revision (suspended-run restoration). */
|
|
292
|
+
getContractRevision(contractId, revision) {
|
|
293
|
+
return this.#contractRevisions.get(contractId)?.get(revision);
|
|
294
|
+
}
|
|
295
|
+
// ---- Atomic batch installation (HIGH-04-A) -------------------------------
|
|
296
|
+
/**
|
|
297
|
+
* Install a batch atomically. `step` registers contracts, capabilities,
|
|
298
|
+
* and doubles through the staging area; NOTHING touches the live maps
|
|
299
|
+
* until the callback returns successfully. Any throw — a validation
|
|
300
|
+
* failure, a collision with the live registry, or a collision inside the
|
|
301
|
+
* batch — discards the staging overlay and leaves the registry
|
|
302
|
+
* semantically unchanged: no capability, contract, or double from the
|
|
303
|
+
* attempted batch is resolvable afterwards.
|
|
304
|
+
*
|
|
305
|
+
* The staging overlay participates in collision checks, so both
|
|
306
|
+
* batch-vs-registry and batch-internal duplicates are detected BEFORE any
|
|
307
|
+
* commit.
|
|
308
|
+
*/
|
|
309
|
+
installBatch(install) {
|
|
310
|
+
if (this.#staging !== undefined) {
|
|
311
|
+
throw new VictRuntimeError('VICT_RUNTIME_INVALID_STORES', 'A registry batch installation is already in progress.');
|
|
312
|
+
}
|
|
313
|
+
this.#staging = {
|
|
314
|
+
contracts: new Map(),
|
|
315
|
+
capabilities: new Map(),
|
|
316
|
+
doubles: new Map(),
|
|
317
|
+
};
|
|
318
|
+
const staging = this.#staging;
|
|
319
|
+
try {
|
|
320
|
+
install({
|
|
321
|
+
registerContract: (contract) => this.registerContract(contract),
|
|
322
|
+
registerCapability: (definition) => this.registerCapability(definition),
|
|
323
|
+
registerDouble: (capabilityId, invoke, options) => this.registerDouble(capabilityId, invoke, options),
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
this.#staging = undefined;
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
// Commit: contracts, then capabilities, then doubles — deterministic,
|
|
331
|
+
// after EVERY validation and collision check has succeeded.
|
|
332
|
+
for (const [, revisions] of staging.contracts) {
|
|
333
|
+
for (const [, contract] of revisions) {
|
|
334
|
+
this.#commitStagedContract(contract);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
for (const [, revisions] of staging.capabilities) {
|
|
338
|
+
for (const [, effective] of revisions) {
|
|
339
|
+
this.#capabilities.set(effective.id, effective);
|
|
340
|
+
let capabilityRevisions = this.#capabilityRevisions.get(effective.id);
|
|
341
|
+
if (!capabilityRevisions) {
|
|
342
|
+
capabilityRevisions = new Map();
|
|
343
|
+
this.#capabilityRevisions.set(effective.id, capabilityRevisions);
|
|
344
|
+
}
|
|
345
|
+
capabilityRevisions.set(effective.revision, effective);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
for (const [capabilityId, registered] of staging.doubles) {
|
|
349
|
+
this.#doubles.set(capabilityId, registered);
|
|
350
|
+
}
|
|
351
|
+
this.#staging = undefined;
|
|
352
|
+
}
|
|
353
|
+
#commitStagedContract(contract) {
|
|
354
|
+
const existing = this.#contracts.get(contract.id);
|
|
355
|
+
if (!existing) {
|
|
356
|
+
this.#contracts.set(contract.id, contract);
|
|
357
|
+
}
|
|
358
|
+
let contractRevisions = this.#contractRevisions.get(contract.id);
|
|
359
|
+
if (!contractRevisions) {
|
|
360
|
+
contractRevisions = new Map();
|
|
361
|
+
this.#contractRevisions.set(contract.id, contractRevisions);
|
|
362
|
+
}
|
|
363
|
+
contractRevisions.set(contract.revision, contract);
|
|
364
|
+
}
|
|
365
|
+
// ---- Indexes -------------------------------------------------------------
|
|
366
|
+
/**
|
|
367
|
+
* A capability index pinned to EXACT revisions (suspended-run
|
|
368
|
+
* restoration). Unknown id/revision pairs resolve to undefined so the
|
|
369
|
+
* kernel reports structured missing-artifact diagnostics instead of
|
|
370
|
+
* silently substituting a nearby revision.
|
|
371
|
+
*/
|
|
372
|
+
capabilityIndex() {
|
|
373
|
+
const capabilities = this.#capabilities;
|
|
374
|
+
return {
|
|
375
|
+
getCapabilityDescriptor(capabilityId) {
|
|
376
|
+
const definition = capabilities.get(capabilityId);
|
|
377
|
+
if (!definition) {
|
|
378
|
+
return undefined;
|
|
379
|
+
}
|
|
380
|
+
return descriptorOfPublic(definition);
|
|
381
|
+
},
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
capabilityIndexPinned(revisions) {
|
|
385
|
+
return {
|
|
386
|
+
getCapabilityDescriptor: (capabilityId) => {
|
|
387
|
+
const revision = revisions.get(capabilityId);
|
|
388
|
+
if (revision === undefined) {
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
const definition = this.#capabilityRevisions.get(capabilityId)?.get(revision);
|
|
392
|
+
if (!definition) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
return descriptorOfPublic(definition);
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
contractEnvironment() {
|
|
400
|
+
const contracts = this.#contracts;
|
|
401
|
+
return {
|
|
402
|
+
has: (contractId) => contracts.has(contractId),
|
|
403
|
+
// Night 01 static compatibility is identity-based: two adjacent
|
|
404
|
+
// contracts are compatible when they are the same contract. Structural
|
|
405
|
+
// compatibility is deferred until the contract system grows one.
|
|
406
|
+
// The neutral JSON contract is deliberately untyped: it accepts any
|
|
407
|
+
// canonical JSON value, so it is compatible with EVERY contract on
|
|
408
|
+
// either side of an edge.
|
|
409
|
+
isCompatible: (from, to) => from === undefined ||
|
|
410
|
+
to === undefined ||
|
|
411
|
+
from === to ||
|
|
412
|
+
from === NEUTRAL_JSON_CONTRACT_ID ||
|
|
413
|
+
to === NEUTRAL_JSON_CONTRACT_ID,
|
|
414
|
+
get: (contractId) => contracts.get(contractId),
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
/** A contract environment pinned to exact revisions (suspended-run restoration). */
|
|
418
|
+
contractEnvironmentPinned(revisions) {
|
|
419
|
+
return {
|
|
420
|
+
has: (contractId) => {
|
|
421
|
+
const revision = revisions.get(contractId);
|
|
422
|
+
return revision === undefined
|
|
423
|
+
? this.#contracts.has(contractId)
|
|
424
|
+
: (this.#contractRevisions.get(contractId)?.has(revision) ?? false);
|
|
425
|
+
},
|
|
426
|
+
isCompatible: (from, to) => from === undefined ||
|
|
427
|
+
to === undefined ||
|
|
428
|
+
from === to ||
|
|
429
|
+
from === NEUTRAL_JSON_CONTRACT_ID ||
|
|
430
|
+
to === NEUTRAL_JSON_CONTRACT_ID,
|
|
431
|
+
get: (contractId) => {
|
|
432
|
+
const revision = revisions.get(contractId);
|
|
433
|
+
return revision === undefined
|
|
434
|
+
? this.#contracts.get(contractId)
|
|
435
|
+
: this.#contractRevisions.get(contractId)?.get(revision);
|
|
436
|
+
},
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/** Module-level descriptor builder (keeps the class body free of self-references). */
|
|
441
|
+
function descriptorOfPublic(definition) {
|
|
442
|
+
const hasAuthority = (definition.permissions !== undefined && definition.permissions.length > 0) ||
|
|
443
|
+
(definition.configuration !== undefined && definition.configuration.length > 0) ||
|
|
444
|
+
(definition.requiredConfiguration !== undefined &&
|
|
445
|
+
definition.requiredConfiguration.length > 0) ||
|
|
446
|
+
(definition.secrets !== undefined && definition.secrets.length > 0) ||
|
|
447
|
+
(definition.requiredSecrets !== undefined && definition.requiredSecrets.length > 0);
|
|
448
|
+
return {
|
|
449
|
+
id: definition.id,
|
|
450
|
+
revision: definition.revision,
|
|
451
|
+
effect: definition.effect,
|
|
452
|
+
inputContractId: definition.input?.id,
|
|
453
|
+
inputRevision: definition.input?.revision,
|
|
454
|
+
outputContractId: definition.output?.id,
|
|
455
|
+
outputRevision: definition.output?.revision,
|
|
456
|
+
idempotency: definition.idempotency,
|
|
457
|
+
...(hasAuthority
|
|
458
|
+
? {
|
|
459
|
+
authority: {
|
|
460
|
+
...(definition.permissions !== undefined && definition.permissions.length > 0
|
|
461
|
+
? { permissions: Object.freeze([...definition.permissions]) }
|
|
462
|
+
: {}),
|
|
463
|
+
...(definition.configuration !== undefined && definition.configuration.length > 0
|
|
464
|
+
? { configuration: Object.freeze([...definition.configuration]) }
|
|
465
|
+
: {}),
|
|
466
|
+
...(definition.requiredConfiguration !== undefined &&
|
|
467
|
+
definition.requiredConfiguration.length > 0
|
|
468
|
+
? { requiredConfiguration: Object.freeze([...definition.requiredConfiguration]) }
|
|
469
|
+
: {}),
|
|
470
|
+
...(definition.secrets !== undefined && definition.secrets.length > 0
|
|
471
|
+
? { secrets: Object.freeze([...definition.secrets]) }
|
|
472
|
+
: {}),
|
|
473
|
+
...(definition.requiredSecrets !== undefined && definition.requiredSecrets.length > 0
|
|
474
|
+
? { requiredSecrets: Object.freeze([...definition.requiredSecrets]) }
|
|
475
|
+
: {}),
|
|
476
|
+
},
|
|
477
|
+
}
|
|
478
|
+
: {}),
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|