@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,83 @@
1
+ /** Portable proof of one incremental Git Card + Checkpoint transport chain. */
2
+ import { applyRepositoryIdentity, decodeRepositoryTransport, deriveCardId, deriveCheckpointId, deriveStateId, } from '../entities/repo-states.js';
3
+ const portableRepositoryPath = (path) => path.length > 0
4
+ && !path.startsWith('/')
5
+ && !path.includes('\0')
6
+ && path.split('/').every((part) => part !== '' && part !== '.' && part !== '..');
7
+ function assertTransportTruth(state, sha256Hex) {
8
+ const cardId = deriveCardId(state.card, sha256Hex);
9
+ const checkpointId = deriveCheckpointId(state.checkpoint, sha256Hex);
10
+ const stateId = deriveStateId(cardId, checkpointId, sha256Hex);
11
+ if (state.cardId !== cardId || state.checkpointId !== checkpointId || state.stateId !== stateId) {
12
+ throw new Error('repository Apply transport IDs do not describe its Card + Checkpoint');
13
+ }
14
+ if (state.pack !== null && sha256Hex(state.pack.bytes) !== state.pack.sha256) {
15
+ throw new Error('repository Apply Git pack failed verification');
16
+ }
17
+ const paths = new Set();
18
+ for (const file of state.checkpoint.untracked) {
19
+ if (!portableRepositoryPath(file.path) || paths.has(file.path)
20
+ || !['100644', '100755', '120000'].includes(file.mode)) {
21
+ throw new Error('repository Apply Checkpoint has an invalid untracked path or mode');
22
+ }
23
+ paths.add(file.path);
24
+ if (file.content !== null && sha256Hex(file.content) !== file.sha256) {
25
+ throw new Error(`repository Apply Checkpoint content failed verification for ${file.path}`);
26
+ }
27
+ }
28
+ for (const entry of state.identityDelta.upsert) {
29
+ if (!portableRepositoryPath(entry.path)) {
30
+ throw new Error('repository Apply identity map has an unsafe path');
31
+ }
32
+ }
33
+ if (state.identityDelta.remove.some((path) => !portableRepositoryPath(path))) {
34
+ throw new Error('repository Apply identity map has an unsafe removal path');
35
+ }
36
+ }
37
+ /**
38
+ * Verify a sealed transport suffix before a host invokes Git. With a null
39
+ * base the chain must be complete from its reset node. With a durable local
40
+ * base, the first incremental node must name that exact transport frontier.
41
+ */
42
+ export function prepareRepositoryResult(plan, nodes, base, sha256Hex) {
43
+ if (nodes.length === 0)
44
+ throw new Error('repository Apply transport chain is empty');
45
+ let priorVersion = base.transportVersion;
46
+ let identity = base.identity;
47
+ if ((base.transportVersion === null) !== (base.identity === null)) {
48
+ throw new Error('repository Apply base frontier is incomplete');
49
+ }
50
+ const transports = [];
51
+ for (const node of nodes) {
52
+ if (sha256Hex(node.bytes) !== node.transportVersion) {
53
+ throw new Error('repository Apply transport failed its immutable hash');
54
+ }
55
+ const state = decodeRepositoryTransport(node.bytes);
56
+ if (state.parentTransportVersion !== priorVersion) {
57
+ throw new Error('repository Apply transport chain is discontinuous');
58
+ }
59
+ assertTransportTruth(state, sha256Hex);
60
+ identity = applyRepositoryIdentity(identity, state, sha256Hex);
61
+ transports.push(state);
62
+ priorVersion = node.transportVersion;
63
+ }
64
+ const latest = transports.at(-1);
65
+ if (priorVersion !== plan.transportVersion
66
+ || latest.parentTransportVersion !== plan.parentTransportVersion
67
+ || latest.stateId !== plan.stateId
68
+ || latest.cardId !== plan.cardId
69
+ || latest.checkpointId !== plan.checkpointId) {
70
+ throw new Error('repository Apply chain does not produce its accepted complete result');
71
+ }
72
+ const missingUntracked = latest.checkpoint.untracked.find((file) => file.content === null);
73
+ if (missingUntracked) {
74
+ throw new Error(`repository Apply Checkpoint omitted untracked content for ${missingUntracked.path}`);
75
+ }
76
+ return Object.freeze({
77
+ transports: Object.freeze(transports),
78
+ latest,
79
+ transportVersion: priorVersion,
80
+ identity: Object.freeze([...identity]),
81
+ });
82
+ }
83
+ //# sourceMappingURL=repository-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-result.js","sourceRoot":"","sources":["../../src/apply/repository-result.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Gap-free per-entity Apply selection and complete-result coalescing. */
2
+ import { type AcceptedEntityRecord } from '../records/contracts.js';
3
+ import { type EntityApplyWork } from './contracts.js';
4
+ export interface SelectedEntityApply {
5
+ readonly records: readonly AcceptedEntityRecord[];
6
+ readonly target: AcceptedEntityRecord;
7
+ }
8
+ /**
9
+ * Select the exact target named by a recovering intent, otherwise the newest
10
+ * contiguous complete result. The host may reveal only this target; every
11
+ * earlier selected row becomes resolved after target Verify succeeds.
12
+ */
13
+ export declare function selectEntityApply(work: EntityApplyWork): SelectedEntityApply;
14
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/apply/selection.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/F,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,mBAAmB,CAmD5E"}
@@ -0,0 +1,63 @@
1
+ /** Gap-free per-entity Apply selection and complete-result coalescing. */
2
+ import { assertRecord } from '../entities/cloud.js';
3
+ import { checkAcceptedEntityRecord } from '../records/contracts.js';
4
+ import { assertApplyIntent } from './contracts.js';
5
+ /**
6
+ * Select the exact target named by a recovering intent, otherwise the newest
7
+ * contiguous complete result. The host may reveal only this target; every
8
+ * earlier selected row becomes resolved after target Verify succeeds.
9
+ */
10
+ export function selectEntityApply(work) {
11
+ if (!work.authorityId || !work.entityId
12
+ || !Number.isSafeInteger(work.resolvedThrough) || work.resolvedThrough < 0
13
+ || work.records.length === 0) {
14
+ throw new Error('entity Apply work is invalid');
15
+ }
16
+ let expected = work.resolvedThrough + 1;
17
+ for (const record of work.records) {
18
+ const checked = checkAcceptedEntityRecord(record);
19
+ if (!checked.ok)
20
+ throw new Error(checked.error);
21
+ if (record.authorityId !== work.authorityId || record.entityId !== work.entityId) {
22
+ throw new Error('one entity Apply batch cannot cross authority or UUID channels');
23
+ }
24
+ if (record.globalSequence !== expected) {
25
+ throw new Error(`entity Apply work has a gap before sequence ${record.globalSequence}`);
26
+ }
27
+ expected += 1;
28
+ }
29
+ if (work.materialized !== null) {
30
+ const current = assertRecord(work.materialized.record);
31
+ if (current.uuid !== work.entityId
32
+ || !Number.isSafeInteger(work.materialized.globalSequence)
33
+ || work.materialized.globalSequence < 1
34
+ || work.materialized.globalSequence > work.resolvedThrough) {
35
+ throw new Error('entity Apply materialization proof is invalid');
36
+ }
37
+ }
38
+ let through = work.records.at(-1).globalSequence;
39
+ if (work.intent !== null) {
40
+ assertApplyIntent(work.intent);
41
+ if (work.intent.authorityId !== work.authorityId
42
+ || work.intent.entityId !== work.entityId
43
+ || work.intent.fromSequence !== work.resolvedThrough) {
44
+ throw new Error('entity Apply intent does not own this work range');
45
+ }
46
+ through = work.intent.throughSequence;
47
+ }
48
+ const index = through - work.resolvedThrough - 1;
49
+ const target = work.records[index];
50
+ if (!target)
51
+ throw new Error('entity Apply intent target is absent from Inbox work');
52
+ if (work.intent !== null
53
+ && (target.mutationId !== work.intent.targetMutationId
54
+ || target.resultState !== work.intent.targetState
55
+ || target.change.result.type !== work.intent.targetType)) {
56
+ throw new Error('entity Apply intent target does not match its retained Inbox record');
57
+ }
58
+ return Object.freeze({
59
+ records: Object.freeze(work.records.slice(0, index + 1)),
60
+ target,
61
+ });
62
+ }
63
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/apply/selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Bridge the canonical entity type registry to the Apply/Verify coordinator. */
2
+ import { type AdapterDescriptor } from '../detection/adapter-contract.js';
3
+ import type { EntityApplyEffectsPort } from './contracts.js';
4
+ export type CaptureLocalEffect = EntityApplyEffectsPort['captureLocal'];
5
+ /**
6
+ * Adapt the already-convicted one-type/one-adapter registry for Apply. The
7
+ * subsystem refuses partial support: every type selected at runtime must bind
8
+ * both complete sockets, never a generic fallback or a path-based guess.
9
+ */
10
+ export declare function entityApplyEffects(byType: ReadonlyMap<string, AdapterDescriptor>, captureLocal: CaptureLocalEffect): EntityApplyEffectsPort;
11
+ /** Build the universal physical-type registry, refusing any missing type. */
12
+ export declare function buildEntityApplyEffects(adapters: Iterable<unknown>, captureLocal: CaptureLocalEffect): EntityApplyEffectsPort;
13
+ //# sourceMappingURL=type-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-adapters.d.ts","sourceRoot":"","sources":["../../src/apply/type-adapters.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,KAAK,EACV,sBAAsB,EAIvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC9C,YAAY,EAAE,kBAAkB,GAC/B,sBAAsB,CA0BxB;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,YAAY,EAAE,kBAAkB,GAC/B,sBAAsB,CAExB"}
@@ -0,0 +1,37 @@
1
+ /** Bridge the canonical entity type registry to the Apply/Verify coordinator. */
2
+ import { buildTypeMap } from '../detection/adapter-contract.js';
3
+ import { ENTITY_TYPES, isEntityType } from '../entities/types.js';
4
+ /**
5
+ * Adapt the already-convicted one-type/one-adapter registry for Apply. The
6
+ * subsystem refuses partial support: every type selected at runtime must bind
7
+ * both complete sockets, never a generic fallback or a path-based guess.
8
+ */
9
+ export function entityApplyEffects(byType, captureLocal) {
10
+ const operational = new Map();
11
+ for (const [type, descriptor] of byType) {
12
+ if (!isEntityType(type)) {
13
+ throw new Error(`Apply adapter registry contains unknown entity type ${JSON.stringify(type)}`);
14
+ }
15
+ const { apply, verify } = descriptor.rails;
16
+ if (!apply || !verify) {
17
+ throw new Error(`adapter ${descriptor.name} cannot Apply ${type} until both Apply and Verify sockets are bound`);
18
+ }
19
+ operational.set(type, Object.freeze({ name: descriptor.name, apply, verify }));
20
+ }
21
+ return Object.freeze({
22
+ adapterFor(type) {
23
+ const adapter = operational.get(type);
24
+ if (!adapter)
25
+ throw new Error(`entity type ${type} has no operational Apply adapter`);
26
+ return adapter;
27
+ },
28
+ captureLocal(intent, plan, position) {
29
+ return captureLocal(intent, plan, position);
30
+ },
31
+ });
32
+ }
33
+ /** Build the universal physical-type registry, refusing any missing type. */
34
+ export function buildEntityApplyEffects(adapters, captureLocal) {
35
+ return entityApplyEffects(buildTypeMap(adapters, ENTITY_TYPES), captureLocal);
36
+ }
37
+ //# sourceMappingURL=type-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-adapters.js","sourceRoot":"","sources":["../../src/apply/type-adapters.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAA0B,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAUnF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA8C,EAC9C,YAAgC;IAEhC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6C,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC,IAAI,iBAAiB,IAAI,gDAAgD,CAAC,CAAC;QACnH,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,CAAC,IAAgB;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,mCAAmC,CAAC,CAAC;YACtF,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,YAAY,CACV,MAAyB,EACzB,IAAqB,EACrB,QAA0C;YAE1C,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,uBAAuB,CACrC,QAA2B,EAC3B,YAAgC;IAEhC,OAAO,kBAAkB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;AAChF,CAAC"}
@@ -32,6 +32,7 @@
32
32
  * rail earns a socket only when a real consumer proves that
33
33
  * behavior differs by type — never for symmetry.
34
34
  */
35
+ import type { EntityApplySocket, EntityVerifySocket } from '../apply/contracts.js';
35
36
  export type Rail = 'watch' | 'detect' | 'record' | 'send' | 'receive' | 'apply' | 'verify';
36
37
  /** The seven rails, declared once, frozen, in journey order. */
37
38
  export declare const RAILS: readonly Rail[];
@@ -49,6 +50,9 @@ export declare const RAILS: readonly Rail[];
49
50
  export type TruthReading = {
50
51
  readonly truth: 'present';
51
52
  readonly version: string;
53
+ /** Repository identity transport is exact materialization truth even when
54
+ * Card + Checkpoint logical version is unchanged. */
55
+ readonly transportVersion?: string | null;
52
56
  readonly state?: unknown;
53
57
  } | {
54
58
  readonly truth: 'absent';
@@ -56,18 +60,16 @@ export type TruthReading = {
56
60
  readonly truth: 'unsettled';
57
61
  readonly reason?: string | undefined;
58
62
  };
59
- /** The one ratified socket: detect's truth read. */
63
+ /** Detect's one ratified truth-read socket. */
60
64
  export interface DetectSocket {
61
65
  readonly truth: (path: string) => TruthReading;
62
66
  }
63
67
  /**
64
68
  * The ratified sockets — for each rail that has one, the exact surfaces
65
69
  * every binding adapter implements. Same names, same shapes, every
66
- * type. ONE socket is ratified today (detect), derived from what
67
- * production detection actually asks of a type. Watch and record earn
68
- * none at this bar (adjudicated 2026-08-03 under axiom 7); apply and
69
- * verify join only when the Send/Receive rails exist to derive their
70
- * socket from. A socket is ratified from a real consumer or it is not
70
+ * type. Detect, Apply, and Verify are ratified from their real portable
71
+ * consumers. Watch, Record, Send, and Receive need no type-specific surface
72
+ * at this bar. A socket is ratified from a real consumer or it is not
71
73
  * ratified at all.
72
74
  */
73
75
  export declare const SOCKETS: Readonly<Partial<Record<Rail, readonly string[]>>>;
@@ -76,14 +78,15 @@ export declare const SOCKETS: Readonly<Partial<Record<Rail, readonly string[]>>>
76
78
  *
77
79
  * name — the adapter's one name
78
80
  * types — { entityType: 'one-sentence source of truth', ... }
79
- * rails — only rails whose ratified socket the adapter fully
80
- * implements; detect is the only bindable rail today
81
+ * rails — only rails whose ratified socket the adapter fully implements
81
82
  */
82
83
  export interface AdapterDescriptor {
83
84
  readonly name: string;
84
85
  readonly types: Readonly<Record<string, string>>;
85
86
  readonly rails: {
86
87
  readonly detect?: DetectSocket;
88
+ readonly apply?: EntityApplySocket;
89
+ readonly verify?: EntityVerifySocket;
87
90
  };
88
91
  }
89
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-contract.d.ts","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3F,gEAAgE;AAChE,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAE/B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACjF;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE1E,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;CAChD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAErE,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CA6CjE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GACzB,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAsBhC;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,UAAU,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAGpD,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAM7B,CAAC"}
1
+ {"version":3,"file":"adapter-contract.d.ts","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3F,gEAAgE;AAChE,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAE/B,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB;IACA,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;yDACqD;IACrD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,GACC;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE1E,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAIrE,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;QAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;KACtC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CA6CjE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GACzB,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAsBhC;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,UAAU,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAGpD,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,iBAM7B,CAAC"}
@@ -39,15 +39,15 @@ export const RAILS = Object.freeze([
39
39
  /**
40
40
  * The ratified sockets — for each rail that has one, the exact surfaces
41
41
  * every binding adapter implements. Same names, same shapes, every
42
- * type. ONE socket is ratified today (detect), derived from what
43
- * production detection actually asks of a type. Watch and record earn
44
- * none at this bar (adjudicated 2026-08-03 under axiom 7); apply and
45
- * verify join only when the Send/Receive rails exist to derive their
46
- * socket from. A socket is ratified from a real consumer or it is not
42
+ * type. Detect, Apply, and Verify are ratified from their real portable
43
+ * consumers. Watch, Record, Send, and Receive need no type-specific surface
44
+ * at this bar. A socket is ratified from a real consumer or it is not
47
45
  * ratified at all.
48
46
  */
49
47
  export const SOCKETS = Object.freeze({
50
48
  detect: Object.freeze(['truth']),
49
+ apply: Object.freeze(['prepare', 'guard', 'reveal', 'discard']),
50
+ verify: Object.freeze(['verify']),
51
51
  });
52
52
  /**
53
53
  * Convict a malformed adapter descriptor loudly; return it (typed)
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter-contract.js","sourceRoot":"","sources":["../../src/detection/adapter-contract.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,5 @@ export type EchoDecision = {
16
16
  readonly kind: 'retry';
17
17
  readonly reason?: string | undefined;
18
18
  };
19
- export declare function echoDecision(notebook: Pick<CloudEntityRecord, 'status' | 'version'>, observed: TruthReading): EchoDecision;
19
+ export declare function echoDecision(notebook: Pick<CloudEntityRecord, 'status' | 'version' | 'transportVersion'>, observed: TruthReading): EchoDecision;
20
20
  //# sourceMappingURL=echo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAErE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,SAAS,CAAC,EACvD,QAAQ,EAAE,YAAY,GACrB,YAAY,CAYd"}
1
+ {"version":3,"file":"echo.d.ts","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAErE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAC,EAC5E,QAAQ,EAAE,YAAY,GACrB,YAAY,CAmBd"}
@@ -13,7 +13,14 @@ export function echoDecision(notebook, observed) {
13
13
  : { kind: 'retry', reason: observed.reason };
14
14
  }
15
15
  if (notebook.status === 'active') {
16
- return observed.truth === 'present' && observed.version === notebook.version
16
+ const exactTransport = notebook.transportVersion === null
17
+ ? observed.truth === 'present'
18
+ && (observed.transportVersion === undefined || observed.transportVersion === null)
19
+ : observed.truth === 'present'
20
+ && observed.transportVersion === notebook.transportVersion;
21
+ return observed.truth === 'present'
22
+ && observed.version === notebook.version
23
+ && exactTransport
17
24
  ? { kind: 'silence' }
18
25
  : { kind: 'detect' };
19
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,UAAU,YAAY,CAC1B,QAAuD,EACvD,QAAsB;IAEtB,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YACnB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;YAC1E,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChF,CAAC"}
1
+ {"version":3,"file":"echo.js","sourceRoot":"","sources":["../../src/detection/echo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,UAAU,YAAY,CAC1B,QAA4E,EAC5E,QAAsB;IAEtB,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YACnB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,KAAK,IAAI;YACvD,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;mBACzB,CAAC,QAAQ,CAAC,gBAAgB,KAAK,SAAS,IAAI,QAAQ,CAAC,gBAAgB,KAAK,IAAI,CAAC;YACpF,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;mBACzB,QAAQ,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB,CAAC;QAC/D,OAAO,QAAQ,CAAC,KAAK,KAAK,SAAS;eAC9B,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;eACrC,cAAc;YACjB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;YACrB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export * from './entities/index.js';
15
15
  export * from './watching/index.js';
16
16
  export * from './detection/index.js';
17
17
  export * from './records/index.js';
18
+ export * from './apply/index.js';
18
19
  export * from './registration/index.js';
19
20
  export * from './files/index.js';
20
21
  export * from './transfer/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,7 @@ export * from './entities/index.js';
15
15
  export * from './watching/index.js';
16
16
  export * from './detection/index.js';
17
17
  export * from './records/index.js';
18
+ export * from './apply/index.js';
18
19
  export * from './registration/index.js';
19
20
  export * from './files/index.js';
20
21
  export * from './transfer/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
@@ -4,4 +4,6 @@ export * from './codec.js';
4
4
  export * from './contracts.js';
5
5
  export * from './inbox.js';
6
6
  export * from './outbox.js';
7
+ export * from './rail.js';
8
+ export * from './wire.js';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/records/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/records/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
@@ -4,4 +4,6 @@ export * from './codec.js';
4
4
  export * from './contracts.js';
5
5
  export * from './inbox.js';
6
6
  export * from './outbox.js';
7
+ export * from './rail.js';
8
+ export * from './wire.js';
7
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/records/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/records/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,97 @@
1
+ /** Portable, event-driven Send and Receive orchestration. Hosts inject effects. */
2
+ import { type OutboxRow } from './outbox.js';
3
+ import type { AcceptedEntityRecord, LocalEntityRecord } from './contracts.js';
4
+ export declare const ENTITY_RECORD_DELIVERY_LIMIT = 256;
5
+ export declare const ENTITY_RECORD_RETRY_BASE_MS = 1000;
6
+ export declare const ENTITY_RECORD_RETRY_MAX_MS = 30000;
7
+ type MaybePromise<T> = T | Promise<T>;
8
+ export type PendingEntityRecord = Extract<OutboxRow, {
9
+ readonly status: 'pending';
10
+ }> & {
11
+ readonly localSequence: number;
12
+ };
13
+ export interface DeliveredEntityRecord {
14
+ readonly deliverySequence: number;
15
+ readonly record: AcceptedEntityRecord;
16
+ }
17
+ export interface EntityRecordAvailability {
18
+ readonly authorityId: string;
19
+ }
20
+ export interface EntityRecordGap {
21
+ readonly entityId: string;
22
+ readonly after: number;
23
+ readonly received: number;
24
+ }
25
+ export type ReceiveEntityDeliveriesResult = {
26
+ readonly kind: 'stored';
27
+ readonly deliveryCursor: number;
28
+ } | {
29
+ readonly kind: 'gap';
30
+ readonly gap: EntityRecordGap;
31
+ };
32
+ /** One persistent host-owned transaction boundary for the two local queues. */
33
+ export interface EntityRecordStorePort {
34
+ readPending(): MaybePromise<readonly PendingEntityRecord[]>;
35
+ stampAccepted(row: PendingEntityRecord, accepted: AcceptedEntityRecord): MaybePromise<void>;
36
+ readDeliveryCursor(authorityId: string): MaybePromise<number>;
37
+ receive(input: {
38
+ readonly authorityId: string;
39
+ readonly deliveries: readonly DeliveredEntityRecord[];
40
+ /** False only while repairing one entity gap. */
41
+ readonly advanceDeliveryCursor: boolean;
42
+ }): MaybePromise<ReceiveEntityDeliveriesResult>;
43
+ }
44
+ export interface EntityRecordCargoPort {
45
+ ensure(record: LocalEntityRecord): Promise<void>;
46
+ }
47
+ /** Authenticated authority effects. `subscribe` registers before it reads. */
48
+ export interface EntityRecordAuthorityPort {
49
+ submit(record: LocalEntityRecord): Promise<AcceptedEntityRecord>;
50
+ subscribe(input: {
51
+ readonly authorityId: string;
52
+ readonly afterDeliverySequence: number;
53
+ readonly limit: number;
54
+ }): Promise<readonly DeliveredEntityRecord[]>;
55
+ backfill(input: {
56
+ readonly authorityId: string;
57
+ readonly entityId: string;
58
+ readonly afterGlobalSequence: number;
59
+ readonly throughGlobalSequence: number;
60
+ }): Promise<readonly DeliveredEntityRecord[]>;
61
+ onAvailable(listener: (signal: EntityRecordAvailability) => void): () => void;
62
+ onDisconnect(listener: (error: unknown) => void): () => void;
63
+ }
64
+ export interface EntityRecordSchedulePort {
65
+ schedule(delayMs: number, callback: () => void): {
66
+ cancel(): void;
67
+ };
68
+ random(): number;
69
+ }
70
+ export interface EntityRecordRailOptions {
71
+ readonly authorityId: string;
72
+ readonly store: EntityRecordStorePort;
73
+ readonly cargo: EntityRecordCargoPort;
74
+ readonly authority: EntityRecordAuthorityPort;
75
+ readonly schedule: EntityRecordSchedulePort;
76
+ /** Payload-free local doorbell emitted only after Receive commits Inbox truth. */
77
+ readonly onInboxCommitted?: () => void;
78
+ readonly onBackgroundError?: (error: unknown) => void;
79
+ }
80
+ /**
81
+ * One rail has only two reasons to run: local work exists, or authority work
82
+ * may exist. Repeated reasons coalesce while the current run is in flight.
83
+ */
84
+ export declare class EntityRecordRail {
85
+ #private;
86
+ constructor(options: EntityRecordRailOptions);
87
+ /** Subscribe first, catch up from the durable cursor, then drain local work. */
88
+ start(): Promise<void>;
89
+ /** Record calls this only after its local outbox transaction commits. */
90
+ localRecordsAvailable(): void;
91
+ /** Await all work known at this boundary; it never creates an idle query. */
92
+ flush(): Promise<void>;
93
+ /** Stop accepting events. Closing the injected wire may interrupt a request. */
94
+ stop(): Promise<void>;
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=rail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail.d.ts","sourceRoot":"","sources":["../../src/records/rail.ts"],"names":[],"mappings":"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"}