@amalgm/live 0.2.29 → 0.2.31

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 (93) hide show
  1. package/PURPOSE.md +37 -2
  2. package/README.md +1 -0
  3. package/dist/apply/content-results.d.ts +26 -0
  4. package/dist/apply/content-results.d.ts.map +1 -0
  5. package/dist/apply/content-results.js +52 -0
  6. package/dist/apply/content-results.js.map +1 -0
  7. package/dist/apply/contracts.d.ts +191 -0
  8. package/dist/apply/contracts.d.ts.map +1 -0
  9. package/dist/apply/contracts.js +47 -0
  10. package/dist/apply/contracts.js.map +1 -0
  11. package/dist/apply/index.d.ts +10 -0
  12. package/dist/apply/index.d.ts.map +1 -0
  13. package/dist/apply/index.js +10 -0
  14. package/dist/apply/index.js.map +1 -0
  15. package/dist/apply/local-work.d.ts +10 -0
  16. package/dist/apply/local-work.d.ts.map +1 -0
  17. package/dist/apply/local-work.js +17 -0
  18. package/dist/apply/local-work.js.map +1 -0
  19. package/dist/apply/plans.d.ts +14 -0
  20. package/dist/apply/plans.d.ts.map +1 -0
  21. package/dist/apply/plans.js +183 -0
  22. package/dist/apply/plans.js.map +1 -0
  23. package/dist/apply/rail.d.ts +25 -0
  24. package/dist/apply/rail.d.ts.map +1 -0
  25. package/dist/apply/rail.js +304 -0
  26. package/dist/apply/rail.js.map +1 -0
  27. package/dist/apply/repository-result.d.ts +25 -0
  28. package/dist/apply/repository-result.d.ts.map +1 -0
  29. package/dist/apply/repository-result.js +83 -0
  30. package/dist/apply/repository-result.js.map +1 -0
  31. package/dist/apply/selection.d.ts +14 -0
  32. package/dist/apply/selection.d.ts.map +1 -0
  33. package/dist/apply/selection.js +63 -0
  34. package/dist/apply/selection.js.map +1 -0
  35. package/dist/apply/type-adapters.d.ts +13 -0
  36. package/dist/apply/type-adapters.d.ts.map +1 -0
  37. package/dist/apply/type-adapters.js +37 -0
  38. package/dist/apply/type-adapters.js.map +1 -0
  39. package/dist/detection/adapter-contract.d.ts +11 -8
  40. package/dist/detection/adapter-contract.d.ts.map +1 -1
  41. package/dist/detection/adapter-contract.js +5 -5
  42. package/dist/detection/adapter-contract.js.map +1 -1
  43. package/dist/detection/echo.d.ts +1 -1
  44. package/dist/detection/echo.d.ts.map +1 -1
  45. package/dist/detection/echo.js +8 -1
  46. package/dist/detection/echo.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/records/index.d.ts +2 -0
  52. package/dist/records/index.d.ts.map +1 -1
  53. package/dist/records/index.js +2 -0
  54. package/dist/records/index.js.map +1 -1
  55. package/dist/records/rail.d.ts +97 -0
  56. package/dist/records/rail.d.ts.map +1 -0
  57. package/dist/records/rail.js +250 -0
  58. package/dist/records/rail.js.map +1 -0
  59. package/dist/records/wire.d.ts +63 -0
  60. package/dist/records/wire.d.ts.map +1 -0
  61. package/dist/records/wire.js +86 -0
  62. package/dist/records/wire.js.map +1 -0
  63. package/dist-cjs/apply/content-results.js +57 -0
  64. package/dist-cjs/apply/content-results.js.map +1 -0
  65. package/dist-cjs/apply/contracts.js +53 -0
  66. package/dist-cjs/apply/contracts.js.map +1 -0
  67. package/dist-cjs/apply/index.js +28 -0
  68. package/dist-cjs/apply/index.js.map +1 -0
  69. package/dist-cjs/apply/local-work.js +20 -0
  70. package/dist-cjs/apply/local-work.js.map +1 -0
  71. package/dist-cjs/apply/plans.js +187 -0
  72. package/dist-cjs/apply/plans.js.map +1 -0
  73. package/dist-cjs/apply/rail.js +308 -0
  74. package/dist-cjs/apply/rail.js.map +1 -0
  75. package/dist-cjs/apply/repository-result.js +86 -0
  76. package/dist-cjs/apply/repository-result.js.map +1 -0
  77. package/dist-cjs/apply/selection.js +66 -0
  78. package/dist-cjs/apply/selection.js.map +1 -0
  79. package/dist-cjs/apply/type-adapters.js +41 -0
  80. package/dist-cjs/apply/type-adapters.js.map +1 -0
  81. package/dist-cjs/detection/adapter-contract.js +5 -5
  82. package/dist-cjs/detection/adapter-contract.js.map +1 -1
  83. package/dist-cjs/detection/echo.js +8 -1
  84. package/dist-cjs/detection/echo.js.map +1 -1
  85. package/dist-cjs/index.js +1 -0
  86. package/dist-cjs/index.js.map +1 -1
  87. package/dist-cjs/records/index.js +2 -0
  88. package/dist-cjs/records/index.js.map +1 -1
  89. package/dist-cjs/records/rail.js +254 -0
  90. package/dist-cjs/records/rail.js.map +1 -0
  91. package/dist-cjs/records/wire.js +91 -0
  92. package/dist-cjs/records/wire.js.map +1 -0
  93. package/package.json +7 -1
@@ -0,0 +1,183 @@
1
+ /** Type-sensitive Apply plan derivation from one accepted complete result. */
2
+ import { checkContentManifest } from '../contracts/content.js';
3
+ import { assertRecord, stableJson } from '../entities/cloud.js';
4
+ import { utf8Encode } from '../entities/bytes.js';
5
+ import { UUID_PATTERN } from '../entities/types.js';
6
+ import { artifactForRecord, assertTransferArtifact } from '../transfer/artifacts.js';
7
+ import { selectEntityApply } from './selection.js';
8
+ const HASH = /^[0-9a-f]{64}$/;
9
+ const sameArtifact = (left, right) => stableJson(left) === stableJson(right);
10
+ const requireNoCargo = (cargo) => {
11
+ if (cargo.length !== 0)
12
+ throw new Error('structural Apply cannot carry immutable cargo');
13
+ };
14
+ const requireArtifact = (target, cargo) => {
15
+ const expected = artifactForRecord(target);
16
+ if (expected === null)
17
+ throw new Error(`active ${target.type} Apply has no immutable artifact`);
18
+ assertTransferArtifact(expected);
19
+ if (cargo.length !== 1 || !sameArtifact(cargo[0], expected)) {
20
+ throw new Error('Apply cargo does not exactly name its complete result artifact');
21
+ }
22
+ return Object.freeze(expected);
23
+ };
24
+ const textPlan = (base, replay, cargo, materializedPayload) => {
25
+ const artifact = requireArtifact(base.target, cargo);
26
+ if (replay.kind !== 'file.text'
27
+ || replay.resultPayloadVersion !== base.target.payloadVersion
28
+ || !HASH.test(replay.resultPayloadVersion)
29
+ || (replay.basePayloadVersion !== null && !HASH.test(replay.basePayloadVersion))
30
+ || (replay.mode === 'delta') !== (replay.delta !== null)
31
+ || !['delta', 'snapshot'].includes(replay.mode)) {
32
+ throw new Error('text Apply replay does not describe its complete result');
33
+ }
34
+ if (replay.delta !== null
35
+ && (!Number.isSafeInteger(replay.delta.offset) || replay.delta.offset < 0
36
+ || !Number.isSafeInteger(replay.delta.deleteBytes) || replay.delta.deleteBytes < 0
37
+ || !(replay.delta.insert instanceof Uint8Array))) {
38
+ throw new Error('text Apply replay has an invalid byte splice');
39
+ }
40
+ const useDelta = replay.mode === 'delta'
41
+ && replay.delta !== null
42
+ && replay.basePayloadVersion !== null
43
+ && materializedPayload === replay.basePayloadVersion;
44
+ return Object.freeze({
45
+ ...base,
46
+ kind: 'file.text',
47
+ artifact,
48
+ strategy: useDelta
49
+ ? Object.freeze({
50
+ kind: 'delta',
51
+ basePayloadVersion: replay.basePayloadVersion,
52
+ delta: Object.freeze({
53
+ ...replay.delta,
54
+ insert: replay.delta.insert.slice(),
55
+ }),
56
+ })
57
+ : Object.freeze({ kind: 'snapshot' }),
58
+ });
59
+ };
60
+ const binaryPlan = (base, replay, cargo) => {
61
+ const artifact = requireArtifact(base.target, cargo);
62
+ const manifest = checkContentManifest(replay.manifest, base.target.payloadVersion);
63
+ if (replay.kind !== 'file.binary'
64
+ || replay.resultPayloadVersion !== base.target.payloadVersion
65
+ || !manifest.ok) {
66
+ throw new Error('binary Apply replay does not describe its complete result manifest');
67
+ }
68
+ return Object.freeze({
69
+ ...base,
70
+ kind: 'file.binary',
71
+ artifact,
72
+ manifest: Object.freeze({
73
+ ...manifest.value,
74
+ chunks: Object.freeze(manifest.value.chunks.map((chunk) => Object.freeze({ ...chunk }))),
75
+ }),
76
+ });
77
+ };
78
+ const linkPlan = (base, replay, cargo, sha256Hex) => {
79
+ const artifact = requireArtifact(base.target, cargo);
80
+ if (replay.kind !== 'link'
81
+ || replay.resultPayloadVersion !== base.target.payloadVersion
82
+ || sha256Hex(utf8Encode(replay.target)) !== replay.resultPayloadVersion) {
83
+ throw new Error('link Apply replay does not describe its literal target result');
84
+ }
85
+ return Object.freeze({
86
+ ...base,
87
+ kind: 'link',
88
+ artifact,
89
+ targetText: replay.target,
90
+ });
91
+ };
92
+ const repositoryPlan = (base, replay, cargo) => {
93
+ const artifact = requireArtifact(base.target, cargo);
94
+ if (replay.kind !== 'repo.git'
95
+ || replay.stateId !== base.target.payloadVersion
96
+ || replay.transportVersion !== base.target.transportVersion
97
+ || ![replay.stateId, replay.cardId, replay.checkpointId, replay.transportVersion]
98
+ .every((value) => HASH.test(value))
99
+ || (replay.parentTransportVersion !== null && !HASH.test(replay.parentTransportVersion))
100
+ || typeof replay.cardChanged !== 'boolean'
101
+ || typeof replay.checkpointChanged !== 'boolean') {
102
+ throw new Error('repository Apply replay does not describe its Card + Checkpoint result');
103
+ }
104
+ return Object.freeze({
105
+ ...base,
106
+ kind: 'repo.git',
107
+ artifact,
108
+ stateId: replay.stateId,
109
+ cardId: replay.cardId,
110
+ checkpointId: replay.checkpointId,
111
+ parentTransportVersion: replay.parentTransportVersion,
112
+ transportVersion: replay.transportVersion,
113
+ cardChanged: replay.cardChanged,
114
+ checkpointChanged: replay.checkpointChanged,
115
+ });
116
+ };
117
+ /**
118
+ * Validate the target's replay/cargo seam and derive the one plan a host may
119
+ * execute. Type is never rediscovered from path, extension, or downloaded
120
+ * bytes. A structural-only record stays structural even when its target is a
121
+ * leaf; its existing immutable head is only repair fallback.
122
+ */
123
+ export function planEntityApply(work, sha256Hex) {
124
+ return planSelectedEntityApply(work, selectEntityApply(work), sha256Hex);
125
+ }
126
+ /** Derive a plan from the exact selection this coordinator already validated. */
127
+ export function planSelectedEntityApply(work, selected, sha256Hex) {
128
+ const accepted = selected.target;
129
+ const target = Object.freeze(assertRecord(accepted.change.result));
130
+ const common = Object.freeze({
131
+ entityId: accepted.entityId,
132
+ fromSequence: work.resolvedThrough,
133
+ throughSequence: accepted.globalSequence,
134
+ targetMutationId: accepted.mutationId,
135
+ target,
136
+ facets: Object.freeze([...accepted.change.facets]),
137
+ });
138
+ if (target.status !== 'active') {
139
+ if (accepted.change.replay.kind !== 'structure') {
140
+ throw new Error('non-active Apply must be a structural lifecycle result');
141
+ }
142
+ requireNoCargo(accepted.change.cargo);
143
+ return Object.freeze({
144
+ ...common,
145
+ kind: 'lifecycle',
146
+ status: target.status,
147
+ });
148
+ }
149
+ if (accepted.change.replay.kind === 'structure') {
150
+ requireNoCargo(accepted.change.cargo);
151
+ if (target.type === 'reference') {
152
+ if (target.payloadVersion === null || !UUID_PATTERN.test(target.payloadVersion)) {
153
+ throw new Error('managed reference Apply has no target entity UUID');
154
+ }
155
+ return Object.freeze({
156
+ ...common,
157
+ kind: 'reference',
158
+ targetEntityId: target.payloadVersion.toLowerCase(),
159
+ });
160
+ }
161
+ return Object.freeze({
162
+ ...common,
163
+ kind: 'structure',
164
+ repairArtifact: artifactForRecord(target),
165
+ });
166
+ }
167
+ const materializedPayload = work.materialized?.record.payloadVersion ?? null;
168
+ switch (target.type) {
169
+ case 'file.text':
170
+ return textPlan(common, accepted.change.replay, accepted.change.cargo, materializedPayload);
171
+ case 'file.binary':
172
+ return binaryPlan(common, accepted.change.replay, accepted.change.cargo);
173
+ case 'link':
174
+ return linkPlan(common, accepted.change.replay, accepted.change.cargo, sha256Hex);
175
+ case 'repo.git':
176
+ return repositoryPlan(common, accepted.change.replay, accepted.change.cargo);
177
+ case 'workspace':
178
+ case 'folder':
179
+ case 'reference':
180
+ throw new Error(`${target.type} Apply cannot carry content replay`);
181
+ }
182
+ }
183
+ //# sourceMappingURL=plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.js","sourceRoot":"","sources":["../../src/apply/plans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** Event-driven portable Apply/Verify orchestration. */
2
+ import { type EntityApplyRailOptions } from './contracts.js';
3
+ export declare const ENTITY_APPLY_DEFAULT_CONCURRENCY = 8;
4
+ export declare const ENTITY_APPLY_DEFAULT_WORK_LIMIT = 64;
5
+ export declare const ENTITY_APPLY_RETRY_BASE_MS = 1000;
6
+ export declare const ENTITY_APPLY_RETRY_MAX_MS = 30000;
7
+ /**
8
+ * Apply has only two wake sources: Receive committed new Inbox work, or local
9
+ * state changed in a way that may release a pending-local gate. Unsettled
10
+ * machine truth alone schedules bounded retry; an idle rail never polls.
11
+ */
12
+ export declare class EntityApplyRail {
13
+ #private;
14
+ constructor(options: EntityApplyRailOptions);
15
+ /** Resume durable intents and then consume already-received Inbox work. */
16
+ start(): Promise<void>;
17
+ /** Receive calls only after its Inbox transaction commits. */
18
+ recordsAvailable(): void;
19
+ /** Record/Send or Detect calls after a local gate may have changed. */
20
+ localStateChanged(): void;
21
+ /** Await work known at this boundary. It never creates an idle query loop. */
22
+ flush(): Promise<void>;
23
+ stop(): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=rail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail.d.ts","sourceRoot":"","sources":["../../src/apply/rail.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAExD,OAAO,EAKL,KAAK,sBAAsB,EAG5B,MAAM,gBAAgB,CAAC;AAIxB,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,0BAA0B,OAAQ,CAAC;AAChD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAuBhD;;;;GAIG;AACH,qBAAa,eAAe;;gBAcd,OAAO,EAAE,sBAAsB;IAW3C,2EAA2E;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,8DAA8D;IAC9D,gBAAgB,IAAI,IAAI;IAMxB,uEAAuE;IACvE,iBAAiB,IAAI,IAAI;IAIzB,8EAA8E;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuP5B"}
@@ -0,0 +1,304 @@
1
+ /** Event-driven portable Apply/Verify orchestration. */
2
+ import { advanceApplyIntent, createApplyIntent, } from './contracts.js';
3
+ import { planSelectedEntityApply } from './plans.js';
4
+ import { selectEntityApply } from './selection.js';
5
+ export const ENTITY_APPLY_DEFAULT_CONCURRENCY = 8;
6
+ export const ENTITY_APPLY_DEFAULT_WORK_LIMIT = 64;
7
+ export const ENTITY_APPLY_RETRY_BASE_MS = 1_000;
8
+ export const ENTITY_APPLY_RETRY_MAX_MS = 30_000;
9
+ async function boundedMap(values, concurrency, visit) {
10
+ const results = new Array(values.length);
11
+ let cursor = 0;
12
+ const workers = Array.from({ length: Math.min(concurrency, values.length) }, async () => {
13
+ while (true) {
14
+ const index = cursor;
15
+ cursor += 1;
16
+ if (index >= values.length)
17
+ return;
18
+ results[index] = await visit(values[index]);
19
+ }
20
+ });
21
+ await Promise.all(workers);
22
+ return results;
23
+ }
24
+ /**
25
+ * Apply has only two wake sources: Receive committed new Inbox work, or local
26
+ * state changed in a way that may release a pending-local gate. Unsettled
27
+ * machine truth alone schedules bounded retry; an idle rail never polls.
28
+ */
29
+ export class EntityApplyRail {
30
+ #options;
31
+ #concurrency;
32
+ #workLimit;
33
+ #onBackgroundError;
34
+ #started = false;
35
+ #stopped = false;
36
+ #needsApply = false;
37
+ #retryRequested = false;
38
+ #running = null;
39
+ #retry = null;
40
+ #retryAttempt = 0;
41
+ constructor(options) {
42
+ this.#options = options;
43
+ this.#concurrency = options.concurrency ?? ENTITY_APPLY_DEFAULT_CONCURRENCY;
44
+ this.#workLimit = options.workLimit ?? ENTITY_APPLY_DEFAULT_WORK_LIMIT;
45
+ this.#onBackgroundError = options.onBackgroundError ?? (() => undefined);
46
+ if (!Number.isSafeInteger(this.#concurrency) || this.#concurrency < 1
47
+ || !Number.isSafeInteger(this.#workLimit) || this.#workLimit < 1) {
48
+ throw new Error('entity Apply concurrency and work limit must be positive integers');
49
+ }
50
+ }
51
+ /** Resume durable intents and then consume already-received Inbox work. */
52
+ async start() {
53
+ if (this.#started)
54
+ throw new Error('entity Apply rail already started');
55
+ if (this.#stopped)
56
+ throw new Error('entity Apply rail is stopped');
57
+ this.#started = true;
58
+ this.#needsApply = true;
59
+ await this.#runExplicitly();
60
+ }
61
+ /** Receive calls only after its Inbox transaction commits. */
62
+ recordsAvailable() {
63
+ if (this.#stopped)
64
+ return;
65
+ this.#needsApply = true;
66
+ if (this.#started)
67
+ this.#kick();
68
+ }
69
+ /** Record/Send or Detect calls after a local gate may have changed. */
70
+ localStateChanged() {
71
+ this.recordsAvailable();
72
+ }
73
+ /** Await work known at this boundary. It never creates an idle query loop. */
74
+ async flush() {
75
+ if (!this.#started)
76
+ throw new Error('entity Apply rail has not started');
77
+ if (this.#stopped)
78
+ return;
79
+ this.#needsApply = true;
80
+ await this.#runExplicitly();
81
+ }
82
+ async stop() {
83
+ if (this.#stopped)
84
+ return;
85
+ this.#stopped = true;
86
+ this.#cancelRetry();
87
+ await this.#running?.catch(() => undefined);
88
+ }
89
+ async #runExplicitly() {
90
+ this.#cancelRetry();
91
+ try {
92
+ // A finishing drain can hand a late flag to a successor from its final
93
+ // microtask. An explicit caller owns that successor as well.
94
+ do {
95
+ await this.#ensureRun();
96
+ } while (!this.#stopped && (this.#needsApply || this.#running !== null));
97
+ if (this.#retryRequested)
98
+ this.#scheduleRetry();
99
+ else
100
+ this.#retryAttempt = 0;
101
+ }
102
+ catch (error) {
103
+ this.#scheduleRetry();
104
+ throw error;
105
+ }
106
+ }
107
+ #kick() {
108
+ if (!this.#started || this.#stopped)
109
+ return;
110
+ this.#cancelRetry();
111
+ void this.#ensureRun().then(() => {
112
+ if (this.#retryRequested)
113
+ this.#scheduleRetry();
114
+ else
115
+ this.#retryAttempt = 0;
116
+ }, (error) => {
117
+ this.#onBackgroundError(error);
118
+ this.#scheduleRetry();
119
+ });
120
+ }
121
+ #ensureRun() {
122
+ if (this.#running)
123
+ return this.#running;
124
+ const running = this.#drain();
125
+ this.#running = running;
126
+ void running.finally(() => {
127
+ if (this.#running === running)
128
+ this.#running = null;
129
+ if (!this.#stopped && this.#needsApply)
130
+ this.#kick();
131
+ }).catch(() => undefined);
132
+ return running;
133
+ }
134
+ async #drain() {
135
+ this.#retryRequested = false;
136
+ while (!this.#stopped && this.#needsApply) {
137
+ this.#needsApply = false;
138
+ const entities = new Set();
139
+ const cursors = new Set();
140
+ let afterCursor = null;
141
+ let madeProgress = false;
142
+ do {
143
+ const page = await this.#options.store.readApplyWork(this.#workLimit, afterCursor);
144
+ if (!page || !Array.isArray(page.work)
145
+ || (page.nextCursor !== null
146
+ && (typeof page.nextCursor !== 'string' || page.nextCursor.length === 0))) {
147
+ throw new Error('entity Apply store returned an invalid work page');
148
+ }
149
+ if (page.work.length > this.#workLimit
150
+ || (page.work.length === 0 && page.nextCursor !== null)) {
151
+ throw new Error('entity Apply store violated its work-page bound');
152
+ }
153
+ for (const item of page.work) {
154
+ if (entities.has(item.entityId)) {
155
+ throw new Error(`entity Apply store returned ${item.entityId} twice in one scan`);
156
+ }
157
+ entities.add(item.entityId);
158
+ }
159
+ const results = await boundedMap(page.work, this.#concurrency, (item) => this.#applyOne(item));
160
+ if (results.includes('retry'))
161
+ this.#retryRequested = true;
162
+ if (results.includes('progress'))
163
+ madeProgress = true;
164
+ afterCursor = page.nextCursor;
165
+ if (afterCursor !== null && cursors.has(afterCursor)) {
166
+ throw new Error('entity Apply store repeated a work-page cursor');
167
+ }
168
+ if (afterCursor !== null)
169
+ cursors.add(afterCursor);
170
+ } while (!this.#stopped && afterCursor !== null);
171
+ if (madeProgress)
172
+ this.#needsApply = true;
173
+ }
174
+ }
175
+ async #applyOne(work) {
176
+ const selected = selectEntityApply(work);
177
+ if (work.intent === null) {
178
+ if (await this.#options.store.hasLocalWorkAfter(work.authorityId, work.entityId, selected.target.globalSequence)) {
179
+ return 'blocked';
180
+ }
181
+ }
182
+ const plan = planSelectedEntityApply(work, selected, this.#options.sha256Hex);
183
+ const adapter = this.#options.effects.adapterFor(plan.target.type);
184
+ let intent;
185
+ if (work.intent === null) {
186
+ intent = createApplyIntent({
187
+ authorityId: work.authorityId,
188
+ entityId: work.entityId,
189
+ fromSequence: work.resolvedThrough,
190
+ target: selected.target,
191
+ createdAt: this.#options.now(),
192
+ });
193
+ await this.#options.store.beginIntent(intent);
194
+ }
195
+ else {
196
+ intent = work.intent;
197
+ }
198
+ if (intent.phase !== 'revealed'
199
+ && await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
200
+ await this.#abandon(intent, plan, adapter);
201
+ return 'progress';
202
+ }
203
+ if (intent.phase === 'declared') {
204
+ const guard = await adapter.apply.guard(intent, plan);
205
+ if (guard.kind === 'retry')
206
+ return 'retry';
207
+ if (guard.kind === 'local-change') {
208
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
209
+ await this.#options.effects.captureLocal(intent, plan, 'before-reveal');
210
+ }
211
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
212
+ throw new Error('Apply local capture returned without durable Outbox work after its target');
213
+ }
214
+ await this.#abandon(intent, plan, adapter);
215
+ return 'progress';
216
+ }
217
+ if (guard.kind === 'already-target') {
218
+ // Revealed means visible ground owns the target, whether this pass
219
+ // installed it or the early guard proved it was already present.
220
+ intent = advanceApplyIntent(advanceApplyIntent(intent, 'prepared'), 'revealed');
221
+ await this.#options.store.setIntentPhase(intent);
222
+ }
223
+ else {
224
+ if (await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
225
+ await this.#abandon(intent, plan, adapter);
226
+ return 'progress';
227
+ }
228
+ await adapter.apply.prepare(intent, plan);
229
+ intent = advanceApplyIntent(intent, 'prepared');
230
+ await this.#options.store.setIntentPhase(intent);
231
+ }
232
+ }
233
+ if (intent.phase === 'prepared') {
234
+ if (await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
235
+ await this.#abandon(intent, plan, adapter);
236
+ return 'progress';
237
+ }
238
+ const guard = await adapter.apply.guard(intent, plan);
239
+ if (guard.kind === 'retry')
240
+ return 'retry';
241
+ if (guard.kind === 'local-change') {
242
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
243
+ await this.#options.effects.captureLocal(intent, plan, 'before-reveal');
244
+ }
245
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
246
+ throw new Error('Apply local capture returned without durable Outbox work after its target');
247
+ }
248
+ await this.#abandon(intent, plan, adapter);
249
+ return 'progress';
250
+ }
251
+ if (guard.kind === 'safe') {
252
+ // Close the window between the disk guard and the reveal as far as the
253
+ // durable local queue can prove. The host's recoverable replacement
254
+ // owns the remaining syscall-sized race.
255
+ if (await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
256
+ await this.#abandon(intent, plan, adapter);
257
+ return 'progress';
258
+ }
259
+ await adapter.apply.reveal(intent, plan);
260
+ }
261
+ intent = advanceApplyIntent(intent, 'revealed');
262
+ await this.#options.store.setIntentPhase(intent);
263
+ }
264
+ const verification = await adapter.verify.verify(intent, plan);
265
+ if (verification.kind === 'retry')
266
+ return 'retry';
267
+ if (verification.kind === 'local-change') {
268
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
269
+ await this.#options.effects.captureLocal(intent, plan, 'after-reveal');
270
+ }
271
+ if (!await this.#options.store.hasLocalWorkAfter(intent.authorityId, intent.entityId, intent.throughSequence)) {
272
+ throw new Error('Apply post-reveal capture returned without durable Outbox work after its target');
273
+ }
274
+ await adapter.apply.discard(intent, plan);
275
+ await this.#options.store.completeIntent(intent, { kind: 'superseded-by-local' });
276
+ return 'progress';
277
+ }
278
+ await adapter.apply.discard(intent, plan);
279
+ await this.#options.store.completeIntent(intent, { kind: 'materialized' });
280
+ return 'progress';
281
+ }
282
+ async #abandon(intent, plan, adapter) {
283
+ await adapter.apply.discard(intent, plan);
284
+ await this.#options.store.cancelIntent(intent);
285
+ }
286
+ #scheduleRetry() {
287
+ if (this.#stopped || this.#retry)
288
+ return;
289
+ const base = Math.min(ENTITY_APPLY_RETRY_MAX_MS, ENTITY_APPLY_RETRY_BASE_MS * (2 ** Math.min(this.#retryAttempt, 16)));
290
+ const random = Math.max(0, Math.min(1, this.#options.schedule.random()));
291
+ const delay = Math.round(base * (0.5 + random));
292
+ this.#retryAttempt += 1;
293
+ this.#retry = this.#options.schedule.schedule(delay, () => {
294
+ this.#retry = null;
295
+ this.#needsApply = true;
296
+ this.#kick();
297
+ });
298
+ }
299
+ #cancelRetry() {
300
+ this.#retry?.cancel();
301
+ this.#retry = null;
302
+ }
303
+ }
304
+ //# sourceMappingURL=rail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail.js","sourceRoot":"","sources":["../../src/apply/rail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /** Portable proof of one incremental Git Card + Checkpoint transport chain. */
2
+ import { type RepoIdentityEntry, type RepositoryTransport } from '../entities/repo-states.js';
3
+ import type { Sha256Hex } from '../entities/types.js';
4
+ import type { RepositoryApplyPlan } from './contracts.js';
5
+ export interface SealedRepositoryApplyNode {
6
+ readonly transportVersion: string;
7
+ readonly bytes: Uint8Array;
8
+ }
9
+ export interface RepositoryApplyBase {
10
+ readonly transportVersion: string | null;
11
+ readonly identity: readonly RepoIdentityEntry[] | null;
12
+ }
13
+ export interface PreparedRepositoryResult {
14
+ readonly transports: readonly RepositoryTransport[];
15
+ readonly latest: RepositoryTransport;
16
+ readonly transportVersion: string;
17
+ readonly identity: readonly RepoIdentityEntry[];
18
+ }
19
+ /**
20
+ * Verify a sealed transport suffix before a host invokes Git. With a null
21
+ * base the chain must be complete from its reset node. With a durable local
22
+ * base, the first incremental node must name that exact transport frontier.
23
+ */
24
+ export declare function prepareRepositoryResult(plan: RepositoryApplyPlan, nodes: readonly SealedRepositoryApplyNode[], base: RepositoryApplyBase, sha256Hex: Sha256Hex): PreparedRepositoryResult;
25
+ //# sourceMappingURL=repository-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-result.d.ts","sourceRoot":"","sources":["../../src/apply/repository-result.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI,CAAC;CACxD;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAsCD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,SAAS,yBAAyB,EAAE,EAC3C,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,SAAS,GACnB,wBAAwB,CAuC1B"}