@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.
Files changed (115) hide show
  1. package/dist/agent-governance.d.ts +285 -0
  2. package/dist/agent-governance.js +438 -0
  3. package/dist/agent-governance.js.map +1 -0
  4. package/dist/agent-registry.d.ts +103 -0
  5. package/dist/agent-registry.js +758 -0
  6. package/dist/agent-registry.js.map +1 -0
  7. package/dist/agent-types.d.ts +433 -0
  8. package/dist/agent-types.js +480 -0
  9. package/dist/agent-types.js.map +1 -0
  10. package/dist/authority.d.ts +83 -0
  11. package/dist/authority.js +170 -0
  12. package/dist/authority.js.map +1 -0
  13. package/dist/boundary-conformance.d.ts +51 -0
  14. package/dist/boundary-conformance.js +364 -0
  15. package/dist/boundary-conformance.js.map +1 -0
  16. package/dist/control-conformance.d.ts +68 -0
  17. package/dist/control-conformance.js +1131 -0
  18. package/dist/control-conformance.js.map +1 -0
  19. package/dist/control-in-memory.d.ts +257 -0
  20. package/dist/control-in-memory.js +886 -0
  21. package/dist/control-in-memory.js.map +1 -0
  22. package/dist/control-types.d.ts +1017 -0
  23. package/dist/control-types.js +779 -0
  24. package/dist/control-types.js.map +1 -0
  25. package/dist/durable-run.d.ts +73 -0
  26. package/dist/durable-run.js +262 -0
  27. package/dist/durable-run.js.map +1 -0
  28. package/dist/effect-policy.d.ts +22 -0
  29. package/dist/effect-policy.js +45 -0
  30. package/dist/effect-policy.js.map +1 -0
  31. package/dist/errors.d.ts +36 -0
  32. package/dist/errors.js +71 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/in-memory-stores.d.ts +16 -0
  35. package/dist/in-memory-stores.js +522 -0
  36. package/dist/in-memory-stores.js.map +1 -0
  37. package/dist/index.d.ts +41 -0
  38. package/dist/index.js +26 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/operator-config.d.ts +141 -0
  41. package/dist/operator-config.js +289 -0
  42. package/dist/operator-config.js.map +1 -0
  43. package/dist/orchestration-activation.d.ts +116 -0
  44. package/dist/orchestration-activation.js +223 -0
  45. package/dist/orchestration-activation.js.map +1 -0
  46. package/dist/orchestration-canary-conformance.d.ts +10 -0
  47. package/dist/orchestration-canary-conformance.js +726 -0
  48. package/dist/orchestration-canary-conformance.js.map +1 -0
  49. package/dist/orchestration-commands.d.ts +47 -0
  50. package/dist/orchestration-commands.js +538 -0
  51. package/dist/orchestration-commands.js.map +1 -0
  52. package/dist/orchestration-conformance.d.ts +59 -0
  53. package/dist/orchestration-conformance.js +594 -0
  54. package/dist/orchestration-conformance.js.map +1 -0
  55. package/dist/orchestration-driver-types.d.ts +163 -0
  56. package/dist/orchestration-driver-types.js +21 -0
  57. package/dist/orchestration-driver-types.js.map +1 -0
  58. package/dist/orchestration-driver.d.ts +48 -0
  59. package/dist/orchestration-driver.js +1030 -0
  60. package/dist/orchestration-driver.js.map +1 -0
  61. package/dist/orchestration-in-memory.d.ts +18 -0
  62. package/dist/orchestration-in-memory.js +1313 -0
  63. package/dist/orchestration-in-memory.js.map +1 -0
  64. package/dist/orchestration-join-conformance.d.ts +20 -0
  65. package/dist/orchestration-join-conformance.js +542 -0
  66. package/dist/orchestration-join-conformance.js.map +1 -0
  67. package/dist/orchestration-plan.d.ts +52 -0
  68. package/dist/orchestration-plan.js +265 -0
  69. package/dist/orchestration-plan.js.map +1 -0
  70. package/dist/orchestration-race-conformance.d.ts +35 -0
  71. package/dist/orchestration-race-conformance.js +1265 -0
  72. package/dist/orchestration-race-conformance.js.map +1 -0
  73. package/dist/orchestration-remediation-conformance.d.ts +54 -0
  74. package/dist/orchestration-remediation-conformance.js +632 -0
  75. package/dist/orchestration-remediation-conformance.js.map +1 -0
  76. package/dist/orchestration-store-types.d.ts +568 -0
  77. package/dist/orchestration-store-types.js +2 -0
  78. package/dist/orchestration-store-types.js.map +1 -0
  79. package/dist/pack-conformance.d.ts +59 -0
  80. package/dist/pack-conformance.js +222 -0
  81. package/dist/pack-conformance.js.map +1 -0
  82. package/dist/pack-install.d.ts +44 -0
  83. package/dist/pack-install.js +126 -0
  84. package/dist/pack-install.js.map +1 -0
  85. package/dist/registry.d.ts +107 -0
  86. package/dist/registry.js +481 -0
  87. package/dist/registry.js.map +1 -0
  88. package/dist/runtime.d.ts +158 -0
  89. package/dist/runtime.js +1341 -0
  90. package/dist/runtime.js.map +1 -0
  91. package/dist/serialization.d.ts +26 -0
  92. package/dist/serialization.js +162 -0
  93. package/dist/serialization.js.map +1 -0
  94. package/dist/store-conformance.d.ts +45 -0
  95. package/dist/store-conformance.js +876 -0
  96. package/dist/store-conformance.js.map +1 -0
  97. package/dist/store-errors.d.ts +49 -0
  98. package/dist/store-errors.js +48 -0
  99. package/dist/store-errors.js.map +1 -0
  100. package/dist/store-types.d.ts +331 -0
  101. package/dist/store-types.js +14 -0
  102. package/dist/store-types.js.map +1 -0
  103. package/dist/store-validation.d.ts +63 -0
  104. package/dist/store-validation.js +164 -0
  105. package/dist/store-validation.js.map +1 -0
  106. package/dist/stream-hub.d.ts +151 -0
  107. package/dist/stream-hub.js +402 -0
  108. package/dist/stream-hub.js.map +1 -0
  109. package/dist/testing.d.ts +25 -0
  110. package/dist/testing.js +19 -0
  111. package/dist/testing.js.map +1 -0
  112. package/dist/types.d.ts +221 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/package.json +45 -0
@@ -0,0 +1,265 @@
1
+ import { backoffDelayMs, isRetryable, resolveDecisionRoute, } from '@victframework/kernel';
2
+ import { canonicalBranchLineage, forkChildTokenId, forkLineageOf, joinTokenId, waitIdFor, } from './orchestration-activation.js';
3
+ export function invalidOutcome(message) {
4
+ return {
5
+ code: 'VICT_ORCH_INVALID_TRANSITION',
6
+ message,
7
+ retryable: false,
8
+ };
9
+ }
10
+ export function blockedOutcome(code, reason) {
11
+ return { continuation: { kind: 'block', code, reason }, runStatus: 'blocked' };
12
+ }
13
+ function safeCode(error) {
14
+ return error?.code ?? 'VICT_ORCH_CAPABILITY_FAILED';
15
+ }
16
+ export function planContinuation(input) {
17
+ const { graph, claim, outcome } = input;
18
+ const node = graph.getNode(claim.token.nodeId);
19
+ if (!node) {
20
+ return {
21
+ kind: 'invalid',
22
+ error: invalidOutcome(`Compiled graph '${graph.id}' has no node '${claim.token.nodeId}'.`),
23
+ };
24
+ }
25
+ if (outcome.kind === 'cancelled') {
26
+ return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'running' };
27
+ }
28
+ if (outcome.kind === 'outcome_unknown') {
29
+ return {
30
+ kind: 'transition',
31
+ continuation: {
32
+ kind: 'block',
33
+ code: 'VICT_ORCH_OUTCOME_UNKNOWN',
34
+ reason: 'The attempt outcome is unknown; explicit operator resolution is required.',
35
+ },
36
+ runStatus: 'blocked',
37
+ };
38
+ }
39
+ if (outcome.kind === 'failed') {
40
+ return planFailure(input, safeCode(outcome.error));
41
+ }
42
+ if (outcome.kind === 'timed_out') {
43
+ return planTimeout(input);
44
+ }
45
+ return planSuccess(input);
46
+ }
47
+ /** Failure routing: bounded retry → error edge → branch failure → run failed. */
48
+ function planFailure(input, code) {
49
+ const { graph, claim } = input;
50
+ const node = graph.getNode(claim.token.nodeId);
51
+ if (node.retry !== undefined &&
52
+ claim.attempt.attemptNumber < node.retry.maxAttempts &&
53
+ isRetryable(node.retry, code)) {
54
+ return {
55
+ kind: 'transition',
56
+ continuation: {
57
+ kind: 'retry',
58
+ dueAt: input.now + backoffDelayMs(node.retry, claim.attempt.attemptNumber),
59
+ retryOnCode: code,
60
+ maxAttempts: node.retry.maxAttempts,
61
+ },
62
+ runStatus: 'running',
63
+ };
64
+ }
65
+ const errorTarget = graph.errorTargetOf(node.id);
66
+ if (errorTarget !== undefined) {
67
+ return {
68
+ kind: 'transition',
69
+ continuation: { kind: 'advance', toNodeId: errorTarget, payload: input.error },
70
+ runStatus: 'running',
71
+ };
72
+ }
73
+ if (claim.token.forkId !== null) {
74
+ return { kind: 'transition', continuation: { kind: 'branchFailure' }, runStatus: 'failed' };
75
+ }
76
+ return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'failed' };
77
+ }
78
+ /** Timeout routing under effect-specific ambiguity rules (handoff §13). */
79
+ function planTimeout(input) {
80
+ const { graph, claim } = input;
81
+ const node = graph.getNode(claim.token.nodeId);
82
+ const effect = input.descriptor?.effect ?? 'pure';
83
+ const keyed = input.descriptor?.idempotency === 'keyed';
84
+ const retry = node.retry;
85
+ if (retry !== undefined &&
86
+ claim.attempt.attemptNumber < retry.maxAttempts &&
87
+ isRetryable(retry, 'timeout')) {
88
+ if (effect === 'irreversible') {
89
+ const blocked = blockedOutcome('VICT_ORCH_AMBIGUOUS_TIMEOUT', 'A timed-out irreversible attempt is never replayed; operator resolution is required.');
90
+ return { kind: 'transition', ...blocked };
91
+ }
92
+ if (effect === 'write' && !keyed) {
93
+ const blocked = blockedOutcome('VICT_ORCH_OUTCOME_UNKNOWN', 'A timed-out write without keyed idempotency has an ambiguous outcome.');
94
+ return { kind: 'transition', ...blocked };
95
+ }
96
+ return {
97
+ kind: 'transition',
98
+ continuation: {
99
+ kind: 'retry',
100
+ dueAt: input.now + backoffDelayMs(retry, claim.attempt.attemptNumber),
101
+ retryOnCode: 'timeout',
102
+ maxAttempts: retry.maxAttempts,
103
+ },
104
+ runStatus: 'running',
105
+ };
106
+ }
107
+ if (effect === 'write' || effect === 'irreversible') {
108
+ const blocked = blockedOutcome('VICT_ORCH_OUTCOME_UNKNOWN', 'A timed-out unsafe effect has an ambiguous outcome; it is never replayed automatically.');
109
+ return { kind: 'transition', ...blocked };
110
+ }
111
+ return planFailure(input, 'timeout');
112
+ }
113
+ /** Success routing: decision routes, waits, forks, terminal, and branch arrival. */
114
+ function planSuccess(input) {
115
+ const { graph, claim } = input;
116
+ const node = graph.getNode(claim.token.nodeId);
117
+ if (node.kind === 'decision') {
118
+ const result = input.validatedOutput;
119
+ if (!result || typeof result !== 'object' || typeof result.route !== 'string') {
120
+ return {
121
+ kind: 'invalid',
122
+ error: invalidOutcome(`Decision node '${node.id}' must return a validated DecisionResult.`),
123
+ };
124
+ }
125
+ const resolved = resolveDecisionRoute(graph.routeTargetsOf(node.id), result);
126
+ if (!resolved.ok) {
127
+ return {
128
+ kind: 'invalid',
129
+ error: invalidOutcome(resolved.code === 'EMPTY_ROUTE'
130
+ ? `Decision node '${node.id}' returned an empty route; no target was invoked.`
131
+ : `Decision node '${node.id}' returned undeclared route '${resolved.route}'; no target was invoked.`),
132
+ };
133
+ }
134
+ return {
135
+ kind: 'transition',
136
+ continuation: { kind: 'advance', toNodeId: resolved.target, payload: result.value },
137
+ runStatus: 'running',
138
+ };
139
+ }
140
+ if (node.kind === 'wait' && input.resolvedWait !== true) {
141
+ const wait = node.wait;
142
+ const waitId = waitIdFor(claim.token.runId, claim.token.lineage, node.id);
143
+ if (wait.kind === 'timer') {
144
+ // Scheduling-time overflow guard: the deadline must stay inside the
145
+ // safe persisted-timestamp domain. Compilation already rejects
146
+ // non-positive/fractional/NaN/Infinite delays; an enormous (but
147
+ // compile-valid) delay combined with the current time could still
148
+ // overflow `Number.MAX_SAFE_INTEGER`, which fails structurally here
149
+ // instead of persisting an unusable timestamp.
150
+ const dueAt = input.now + wait.delayMs;
151
+ if (!Number.isSafeInteger(dueAt)) {
152
+ return {
153
+ kind: 'invalid',
154
+ error: invalidOutcome(`Timer wait node '${node.id}' declares delayMs ${wait.delayMs}, which would schedule a deadline outside the safe persisted-timestamp domain; the run cannot park on this wait.`),
155
+ };
156
+ }
157
+ const command = {
158
+ waitId,
159
+ nodeId: node.id,
160
+ kind: 'timer',
161
+ signalName: null,
162
+ contractId: null,
163
+ contractRevision: null,
164
+ dueAt,
165
+ timeoutAt: null,
166
+ };
167
+ return {
168
+ kind: 'transition',
169
+ continuation: { kind: 'wait', wait: command },
170
+ runStatus: 'waiting',
171
+ };
172
+ }
173
+ // Same overflow guard for a declared wait timeout (absent when
174
+ // `undefined` or `null`).
175
+ const timeoutAt = wait.timeoutMs !== undefined && wait.timeoutMs !== null ? input.now + wait.timeoutMs : null;
176
+ if (timeoutAt !== null && !Number.isSafeInteger(timeoutAt)) {
177
+ return {
178
+ kind: 'invalid',
179
+ error: invalidOutcome(`Signal wait node '${node.id}' declares timeoutMs ${String(wait.timeoutMs)}, which would schedule a deadline outside the safe persisted-timestamp domain; the run cannot park on this wait.`),
180
+ };
181
+ }
182
+ const command = {
183
+ waitId,
184
+ nodeId: node.id,
185
+ kind: 'signal',
186
+ signalName: wait.name,
187
+ contractId: wait.contract ?? null,
188
+ contractRevision: null,
189
+ dueAt: null,
190
+ // The canonical manifest form normalizes an ABSENT timeout to `null`.
191
+ // Both `undefined` and `null` mean "no timeout": no wait-timeout timer
192
+ // is scheduled for a plain signal wait.
193
+ timeoutAt,
194
+ };
195
+ return {
196
+ kind: 'transition',
197
+ continuation: { kind: 'wait', wait: command },
198
+ runStatus: 'waiting',
199
+ };
200
+ }
201
+ if (node.kind === 'fork') {
202
+ const joinId = graph.joinOfFork(node.id);
203
+ if (joinId === undefined) {
204
+ return {
205
+ kind: 'invalid',
206
+ error: invalidOutcome(`Fork node '${node.id}' has no matching join.`),
207
+ };
208
+ }
209
+ const children = graph.branchKeysOf(node.id).map((branchKey) => ({
210
+ branchKey,
211
+ toNodeId: graph.branchTargetsOf(node.id)[branchKey],
212
+ forkId: node.id,
213
+ lineage: canonicalBranchLineage(claim.token.lineage, node.id, branchKey),
214
+ tokenId: forkChildTokenId(claim.token.runId, node.id, branchKey),
215
+ }));
216
+ return {
217
+ kind: 'transition',
218
+ continuation: { kind: 'fork', joinId, children },
219
+ runStatus: 'running',
220
+ };
221
+ }
222
+ const successTarget = graph.successTargetOf(node.id);
223
+ if (successTarget === undefined) {
224
+ if (claim.token.forkId !== null) {
225
+ // A branch path escaping to a terminal is a compile-time diagnostic;
226
+ // treat defensively as a branch failure.
227
+ return { kind: 'transition', continuation: { kind: 'branchFailure' }, runStatus: 'failed' };
228
+ }
229
+ return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'completed' };
230
+ }
231
+ const targetNode = graph.getNode(successTarget);
232
+ if (targetNode !== undefined && targetNode.kind === 'join') {
233
+ // Branch arrival: the branch token is consumed; the store records the
234
+ // branch result and — on the final arrival — creates exactly ONE
235
+ // join-ready token AT THE JOIN NODE carrying the private canonical
236
+ // checkpoint. The join node is then claimed and completed by the
237
+ // runtime like any other control node: its declared output contract
238
+ // is validated OUTSIDE the store transaction, and one atomic
239
+ // transition either advances downstream (or completes a terminal
240
+ // join) or fails the run with a sanitized contract error. The join
241
+ // therefore always crosses its own declared boundary, exactly once,
242
+ // even when it declares zero success edges (terminal join).
243
+ return {
244
+ kind: 'transition',
245
+ continuation: {
246
+ kind: 'branchArrival',
247
+ forkId: targetNode.fork,
248
+ joinId: successTarget,
249
+ branchKey: claim.token.branchKey ?? '',
250
+ joinContinuation: {
251
+ tokenId: joinTokenId(claim.token.runId, successTarget),
252
+ toNodeId: successTarget,
253
+ lineage: forkLineageOf(claim.token.lineage, targetNode.fork, claim.token.branchKey ?? ''),
254
+ },
255
+ },
256
+ runStatus: 'running',
257
+ };
258
+ }
259
+ return {
260
+ kind: 'transition',
261
+ continuation: { kind: 'advance', toNodeId: successTarget, payload: input.validatedOutput },
262
+ runStatus: 'running',
263
+ };
264
+ }
265
+ //# sourceMappingURL=orchestration-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestration-plan.js","sourceRoot":"","sources":["../src/orchestration-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { VictRuntime } from './runtime.js';
2
+ import type { ConformanceExpect, ConformanceTestRunner, OrchestrationConformanceFixture, OrchestrationConformanceStores } from './orchestration-conformance.js';
3
+ /**
4
+ * Adapter-neutral Stage 03 race and adversarial conformance suite
5
+ * (corrective evidence for handoff §23–§24: races, fencing, cancellation,
6
+ * blocked-state resolution, fan-out recovery). Every conforming backend
7
+ * (in-memory, SQLite) runs this exact suite. Deterministic by
8
+ * construction: barriers, injected deadlines and raw guarded store
9
+ * commands — never timing guesses.
10
+ */
11
+ export interface OrchestrationRaceStores extends OrchestrationConformanceStores {
12
+ /** A SECOND runtime sharing the same durable stores with explicit operator authorization. */
13
+ createOperatorRuntime(): Promise<VictRuntime>;
14
+ }
15
+ export interface OrchestrationRaceFixture extends OrchestrationConformanceFixture {
16
+ /**
17
+ * `clock` (optional) is injected as both the runtime clock and the
18
+ * orchestration time port so timeout/race tests are fully deterministic.
19
+ */
20
+ create(clock?: ManualOrchestrationClock): Promise<OrchestrationRaceStores>;
21
+ }
22
+ /**
23
+ * A fully deterministic orchestration clock: `now()` is test-advanced,
24
+ * `delay()` resolves only when the test advances past the requested due
25
+ * time. Injected as BOTH the runtime `clock` and the orchestration time
26
+ * port, so persisted deadlines, retry-timer eligibility, and deadline
27
+ * racing all move only when the test moves them. No wall-clock guessing.
28
+ */
29
+ export interface ManualOrchestrationClock {
30
+ readonly now: () => number;
31
+ readonly delay: (ms: number) => Promise<void>;
32
+ readonly advance: (ms: number) => void;
33
+ }
34
+ export declare function createManualOrchestrationClock(start?: number): ManualOrchestrationClock;
35
+ export declare function runOrchestrationRaceSuite(runner: ConformanceTestRunner, expect: ConformanceExpect, factory: OrchestrationRaceFixture): void;