@elaraai/e3-core 1.0.13 → 1.0.15

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 (57) hide show
  1. package/dist/src/dataflow/steps.spec.js +1 -0
  2. package/dist/src/dataflow/steps.spec.js.map +1 -1
  3. package/dist/src/dataflow-orchestration.spec.js +67 -3
  4. package/dist/src/dataflow-orchestration.spec.js.map +1 -1
  5. package/dist/src/dataflow.spec.js +1 -0
  6. package/dist/src/dataflow.spec.js.map +1 -1
  7. package/dist/src/dataset-refs.d.ts.map +1 -1
  8. package/dist/src/dataset-refs.js +7 -1
  9. package/dist/src/dataset-refs.js.map +1 -1
  10. package/dist/src/errors.d.ts +15 -0
  11. package/dist/src/errors.d.ts.map +1 -1
  12. package/dist/src/errors.js +22 -0
  13. package/dist/src/errors.js.map +1 -1
  14. package/dist/src/execution/processExec.d.ts.map +1 -1
  15. package/dist/src/execution/processExec.js +14 -10
  16. package/dist/src/execution/processExec.js.map +1 -1
  17. package/dist/src/gc.spec.js +45 -2
  18. package/dist/src/gc.spec.js.map +1 -1
  19. package/dist/src/index.d.ts +2 -1
  20. package/dist/src/index.d.ts.map +1 -1
  21. package/dist/src/index.js +3 -1
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/records.d.ts +136 -0
  24. package/dist/src/records.d.ts.map +1 -0
  25. package/dist/src/records.js +250 -0
  26. package/dist/src/records.js.map +1 -0
  27. package/dist/src/records.spec.d.ts +6 -0
  28. package/dist/src/records.spec.d.ts.map +1 -0
  29. package/dist/src/records.spec.js +299 -0
  30. package/dist/src/records.spec.js.map +1 -0
  31. package/dist/src/storage/in-memory/InMemoryStorage.d.ts +9 -0
  32. package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -1
  33. package/dist/src/storage/in-memory/InMemoryStorage.js +26 -4
  34. package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -1
  35. package/dist/src/storage/interfaces.d.ts +64 -10
  36. package/dist/src/storage/interfaces.d.ts.map +1 -1
  37. package/dist/src/storage/local/LocalDatasetRefStore.d.ts +21 -0
  38. package/dist/src/storage/local/LocalDatasetRefStore.d.ts.map +1 -1
  39. package/dist/src/storage/local/LocalDatasetRefStore.js +100 -14
  40. package/dist/src/storage/local/LocalDatasetRefStore.js.map +1 -1
  41. package/dist/src/storage/local/LocalDatasetRefStore.spec.d.ts +6 -0
  42. package/dist/src/storage/local/LocalDatasetRefStore.spec.d.ts.map +1 -0
  43. package/dist/src/storage/local/LocalDatasetRefStore.spec.js +118 -0
  44. package/dist/src/storage/local/LocalDatasetRefStore.spec.js.map +1 -0
  45. package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -1
  46. package/dist/src/storage/local/LocalRepoStore.js +9 -0
  47. package/dist/src/storage/local/LocalRepoStore.js.map +1 -1
  48. package/dist/src/storage/local/gc.d.ts.map +1 -1
  49. package/dist/src/storage/local/gc.js +66 -0
  50. package/dist/src/storage/local/gc.js.map +1 -1
  51. package/dist/src/trees.d.ts.map +1 -1
  52. package/dist/src/trees.js +29 -5
  53. package/dist/src/trees.js.map +1 -1
  54. package/dist/src/workspaces.d.ts.map +1 -1
  55. package/dist/src/workspaces.js +116 -5
  56. package/dist/src/workspaces.js.map +1 -1
  57. package/package.json +4 -4
@@ -18,6 +18,7 @@ export { objectWrite, objectWriteStream, objectRead, objectExists, } from './sto
18
18
  export { objectPath, objectAbbrev } from './storage/local/localHelpers.js';
19
19
  export { packageImport, packageExport, packageRemove, packageList, packageGetLatestVersion, packageResolve, packageRead, type PackageImportResult, type PackageImportOptions, type PackageExportResult, } from './packages.js';
20
20
  export { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceGetPackage, workspaceDeploy, workspaceExport, type WorkspaceExportResult, type WorkspaceRemoveOptions, type WorkspaceDeployOptions, } from './workspaces.js';
21
+ export { recordMutate, recordHistory, recordDescribe, recordCompact, type MutationOutcome, type RecordMutateOptions, type RecordMutateLimits, type RecordHistoryEntry, type RecordSignature, } from './records.js';
21
22
  export { treeRead, treeWrite, datasetRead, datasetWrite, type TreeObject, } from './trees.js';
22
23
  export { packageListTree, workspaceListTree, workspaceGetDataset, workspaceGetDatasetHash, workspaceGetDatasetStatus, workspaceSetDataset, workspaceSetDatasetByHash, workspaceGetTree, type DatasetStatusResult, type WorkspaceSetDatasetOptions, type WorkspaceGetTreeOptions, type TreeNode, type TreeBranchNode, type TreeLeafNode, } from './trees.js';
23
24
  export { packageListTasks, packageGetTask, workspaceListTasks, workspaceGetTask, workspaceGetTaskHash, } from './tasks.js';
@@ -30,6 +31,6 @@ export { type DataflowExecutionState, type DataflowExecutionStatus, type TaskSta
30
31
  export { acquireWorkspaceLock, getWorkspaceLockState, getWorkspaceLockHolder, lockStateToHolderInfo, isLockHolderAlive, workspaceLockPath, type WorkspaceLockHandle, type AcquireLockOptions, } from './storage/local/LocalLockService.js';
31
32
  export { workspaceStatus, type DatasetStatus, type TaskStatus, type DatasetStatusInfo, type TaskStatusInfo, type WorkspaceStatusResult, } from './workspaceStatus.js';
32
33
  export { checkVersionConsistency, mergeVersionVectors, inputVersionVector, keypathToRefPath, refPathToKeypath, snapshotInputVersions, detectInputChanges, computeRootHash, writeRefsFromTree, writeRefsFromPackage, } from './dataset-refs.js';
33
- export { E3Error, RepoNotFoundError, RepoAlreadyExistsError, RepoStatusConflictError, WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, WorkspaceLockError, type LockHolderInfo, PackageNotFoundError, PackageInvalidError, PackageExistsError, DatasetNotFoundError, TaskNotFoundError, ObjectNotFoundError, ObjectCorruptError, ExecutionCorruptError, ExecutionNotFoundError, DataflowError, DataflowAbortedError, PermissionDeniedError, isNotFoundError, isPermissionError, isExistsError, wrapError, } from './errors.js';
34
+ export { E3Error, RepoNotFoundError, RepoAlreadyExistsError, RepoStatusConflictError, WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, WorkspaceLockError, type LockHolderInfo, PackageNotFoundError, PackageInvalidError, PackageExistsError, DatasetNotFoundError, DatasetRefConflictError, TaskNotFoundError, ObjectNotFoundError, ObjectCorruptError, ExecutionCorruptError, ExecutionNotFoundError, DataflowError, DataflowAbortedError, PermissionDeniedError, isNotFoundError, isPermissionError, isExistsError, wrapError, } from './errors.js';
34
35
  export * from './transfer/index.js';
35
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -36,6 +36,8 @@ export { objectPath, objectAbbrev } from './storage/local/localHelpers.js';
36
36
  export { packageImport, packageExport, packageRemove, packageList, packageGetLatestVersion, packageResolve, packageRead, } from './packages.js';
37
37
  // Workspace operations
38
38
  export { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceGetPackage, workspaceDeploy, workspaceExport, } from './workspaces.js';
39
+ // Record mutations and history (the write half of the CQRS pair)
40
+ export { recordMutate, recordHistory, recordDescribe, recordCompact, } from './records.js';
39
41
  // Tree and dataset operations (low-level, by hash)
40
42
  export { treeRead, treeWrite, datasetRead, datasetWrite, } from './trees.js';
41
43
  // Tree and dataset operations (high-level, by path)
@@ -84,7 +86,7 @@ WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, Workspa
84
86
  // Package
85
87
  PackageNotFoundError, PackageInvalidError, PackageExistsError,
86
88
  // Dataset
87
- DatasetNotFoundError,
89
+ DatasetNotFoundError, DatasetRefConflictError,
88
90
  // Task
89
91
  TaskNotFoundError,
90
92
  // Object
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,gFAAgF;AAChF,qCAAqC;AACrC,gFAAgF;AAChF,sEAAsE;AACtE,kDAAkD;AAClD,8CAA8C;AAC9C,wCAAwC;AAExC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAErC,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAChF,0EAA0E;AAC1E,mDAAmD;AAEnD,2CAA2C;AAC3C,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,GAER,MAAM,+BAA+B,CAAC;AAEvC,qBAAqB;AACrB,OAAO,EACL,MAAM,EACN,eAAe,EACf,aAAa,EACb,UAAU,GAIX,MAAM,uBAAuB,CAAC;AAE/B,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEhE,+DAA+D;AAC/D,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE3E,qBAAqB;AACrB,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,cAAc,EACd,WAAW,GAIZ,MAAM,eAAe,CAAC;AAEvB,uBAAuB;AACvB,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,GAIhB,MAAM,iBAAiB,CAAC;AAEzB,mDAAmD;AACnD,OAAO,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,GAEb,MAAM,YAAY,CAAC;AAEpB,oDAAoD;AACpD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GAOjB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,uBAAuB;AACvB,OAAO;AACL,WAAW;AACX,UAAU;AACV,SAAS;AACT,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa;AACb,iDAAiD;AACjD,oBAAoB;AAEpB,OAAO;AACP,gBAAgB;AAEhB,2EAA2E;AAC3E,wBAAwB;AACxB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9D,oDAAoD;AACpD,OAAO,EACL,WAAW,GAGZ,MAAM,gCAAgC,CAAC;AAExC,2DAA2D;AAC3D,OAAO,EACL,SAAS,EACT,eAAe,EACf,cAAc,GACf,MAAM,+BAA+B,CAAC;AAEvC,qBAAqB;AACrB,OAAO,EACL,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAKhB,MAAM,eAAe,CAAC;AAEvB,+BAA+B;AAC/B,OAAO;AAgBL,iBAAiB;AACjB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAM3B,kBAAkB,EAClB,cAAc,EAQd,iBAAiB,EACjB,aAAa,EAOb,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,wCAAwC;AACxC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAGlB,MAAM,qCAAqC,CAAC;AAE7C,mBAAmB;AACnB,OAAO,EACL,eAAe,GAMhB,MAAM,sBAAsB,CAAC;AAE9B,mCAAmC;AACnC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,SAAS;AACT,OAAO;AACL,OAAO;AACP,OAAO;AACP,aAAa;AACb,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB;AACvB,YAAY;AACZ,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB;AAElB,UAAU;AACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB;AAClB,UAAU;AACV,oBAAoB;AACpB,OAAO;AACP,iBAAiB;AACjB,SAAS;AACT,mBAAmB,EACnB,kBAAkB;AAClB,YAAY;AACZ,qBAAqB,EACrB,sBAAsB;AACtB,WAAW;AACX,aAAa,EACb,oBAAoB;AACpB,UAAU;AACV,qBAAqB;AACrB,UAAU;AACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,mBAAmB;AACnB,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Record mutation execution — the write half of the function machinery.
7
+ *
8
+ * A mutation is a pure East reducer `(State, ...Args) => State` run via the
9
+ * graph-free {@link runDetached} kernel in a compare-and-swap retry loop:
10
+ * read state → reduce → write new state + commit objects → conditional ref
11
+ * write; retry on conflict. A crash at any point leaves only unreferenced
12
+ * objects (GC reclaims them) — never a torn record. The reducer's purity is
13
+ * what makes re-running against fresher state safe.
14
+ */
15
+ import { type EastTypeValue } from '@elaraai/east';
16
+ import { type RecordCommit } from '@elaraai/e3-types';
17
+ import type { StorageBackend, LockHandle } from './storage/interfaces.js';
18
+ import type { TaskRunner } from './execution/interfaces.js';
19
+ /** Mutations persist their (potentially large) new state, so the result cap is
20
+ * far higher than the 1 MB inline-result default for function calls. */
21
+ export interface RecordMutateLimits {
22
+ timeoutMs: number;
23
+ maxResultBytes: number;
24
+ maxLogBytes: number;
25
+ }
26
+ /**
27
+ * The outcome of a mutation attempt. Only `committed` writes anything durable;
28
+ * every other outcome leaves the repo byte-identical (bar unreferenced objects
29
+ * GC reclaims).
30
+ */
31
+ export type MutationOutcome =
32
+ /** New state + commit written, record ref swung to the new commit. */
33
+ {
34
+ kind: 'committed';
35
+ commitHash: string;
36
+ stateHash: string;
37
+ }
38
+ /** Lookup/arity error — nothing ran. */
39
+ | {
40
+ kind: 'invalid';
41
+ message: string;
42
+ }
43
+ /** The reducer process exited non-zero (incl. a reducer `$.error`). */
44
+ | {
45
+ kind: 'failed';
46
+ exitCode: number;
47
+ stderr: string;
48
+ }
49
+ /** The reducer exceeded its time budget. */
50
+ | {
51
+ kind: 'timed_out';
52
+ ms: number;
53
+ stderr: string;
54
+ }
55
+ /** The new state exceeded the result-size cap. */
56
+ | {
57
+ kind: 'too_large';
58
+ bytes: number;
59
+ limit: number;
60
+ stderr: string;
61
+ }
62
+ /** The compare-and-swap lost the race `attempts` times. */
63
+ | {
64
+ kind: 'conflict';
65
+ attempts: number;
66
+ };
67
+ export interface RecordMutateOptions {
68
+ /** Caller identity recorded on the commit (auth principal / `cli:<user>`). */
69
+ actor: string;
70
+ /** Execution limits; sensible record defaults applied when omitted. */
71
+ limits?: RecordMutateLimits;
72
+ /** Wall-clock budget for CAS retries (default 30s); on expiry returns conflict. */
73
+ maxRetryMs?: number;
74
+ /** Optional hard cap on CAS attempts (mainly for tests forcing a conflict). */
75
+ maxAttempts?: number;
76
+ /** Cancellation — aborts the in-flight reducer execution (how is the runner's
77
+ * concern: a local runner kills the process group, a remote one cancels the
78
+ * invocation). */
79
+ signal?: AbortSignal;
80
+ /** Externally-held shared workspace lock; acquired internally when omitted. */
81
+ lock?: LockHandle;
82
+ }
83
+ /**
84
+ * Apply a named mutation to a record under optimistic concurrency.
85
+ *
86
+ * Resolves the mutation, then loops: read the current state + revision, run the
87
+ * reducer against it, write the new state and a commit object, and conditionally
88
+ * swing the record ref. On a concurrent commit the conditional write conflicts
89
+ * and the loop retries against fresher state. Two mutations on the same record
90
+ * serialize; mutations on different records never contend.
91
+ */
92
+ export declare function recordMutate(storage: StorageBackend, runner: TaskRunner, repo: string, ws: string, recordName: string, mutationName: string, args: Uint8Array[], opts: RecordMutateOptions): Promise<MutationOutcome>;
93
+ /** A record's mutation surface: each mutation's name and EXTRA arg types. */
94
+ export interface RecordSignature {
95
+ name: string;
96
+ mutations: Array<{
97
+ name: string;
98
+ argTypes: EastTypeValue[];
99
+ }>;
100
+ }
101
+ /**
102
+ * Describe a record's mutations (name + extra arg types), so dynamic callers
103
+ * can encode arguments. Returns null if the workspace has no such record.
104
+ */
105
+ export declare function recordDescribe(storage: StorageBackend, repo: string, ws: string, recordName: string): Promise<RecordSignature | null>;
106
+ /**
107
+ * Compact a record's history: write a fresh `$compact` root commit
108
+ * (`parent: none`) over the current state and swing the ref to it. The prior
109
+ * commit chain becomes unreachable and is reclaimed by GC; the state itself is
110
+ * unchanged. Returns `committed` / `invalid` / `conflict` like a mutation.
111
+ */
112
+ export declare function recordCompact(storage: StorageBackend, repo: string, ws: string, recordName: string, opts: {
113
+ actor: string;
114
+ maxRetryMs?: number;
115
+ maxAttempts?: number;
116
+ lock?: LockHandle;
117
+ }): Promise<MutationOutcome>;
118
+ /** A commit in a record's history, with its content hash. */
119
+ export interface RecordHistoryEntry {
120
+ hash: string;
121
+ commit: RecordCommit;
122
+ }
123
+ /**
124
+ * Walk a record's commit chain newest-first.
125
+ *
126
+ * @param opts.limit - Maximum commits to return (default: the whole chain)
127
+ * @param opts.from - Commit hash to start the walk at (a cursor for paging,
128
+ * trusted to be a hash this endpoint previously returned for this record);
129
+ * defaults to the record's head commit. A missing/undecodable cursor (or a
130
+ * corrupt link mid-walk) terminates the walk rather than throwing.
131
+ */
132
+ export declare function recordHistory(storage: StorageBackend, repo: string, ws: string, recordName: string, opts?: {
133
+ limit?: number;
134
+ from?: string;
135
+ }): Promise<RecordHistoryEntry[]>;
136
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Record mutation execution — the write half of the function machinery.
7
+ *
8
+ * A mutation is a pure East reducer `(State, ...Args) => State` run via the
9
+ * graph-free {@link runDetached} kernel in a compare-and-swap retry loop:
10
+ * read state → reduce → write new state + commit objects → conditional ref
11
+ * write; retry on conflict. A crash at any point leaves only unreferenced
12
+ * objects (GC reclaims them) — never a torn record. The reducer's purity is
13
+ * what makes re-running against fresher state safe.
14
+ */
15
+ import { variant, some, none, ArrayType, BlobType, encodeBeast2For, decodeBeast2For } from '@elaraai/east';
16
+ import { RecordObjectType, MutationObjectType, RecordCommitType, decodePackageObject, } from '@elaraai/e3-types';
17
+ import { workspaceGetPackage } from './workspaces.js';
18
+ import { refPathToKeypath } from './dataset-refs.js';
19
+ import { DatasetRefConflictError, WorkspaceLockError } from './errors.js';
20
+ const encodeCommit = encodeBeast2For(RecordCommitType);
21
+ const decodeCommit = decodeBeast2For(RecordCommitType);
22
+ const decodeRecordObject = decodeBeast2For(RecordObjectType);
23
+ const decodeMutationObject = decodeBeast2For(MutationObjectType);
24
+ const encodeArgsTuple = encodeBeast2For(ArrayType(BlobType));
25
+ const DEFAULT_LIMITS = {
26
+ timeoutMs: 60_000,
27
+ maxResultBytes: 64 * 1024 * 1024,
28
+ maxLogBytes: 64 * 1024,
29
+ };
30
+ /** Wall-clock budget for the compare-and-swap retry loop. Because each conflict
31
+ * means another writer committed (real progress), a hot record converges; the
32
+ * loop is deadline-bounded rather than capped at a fixed attempt count (which a
33
+ * thundering herd would exhaust, dropping a write). */
34
+ const DEFAULT_MAX_RETRY_MS = 30_000;
35
+ /**
36
+ * Run a record operation under a shared workspace lock (acquired internally
37
+ * unless the caller already holds one), so mutations coexist with dataflow but
38
+ * are fenced out by an exclusive deploy/remove — the §8 concurrency contract.
39
+ */
40
+ async function withSharedWorkspaceLock(storage, repo, ws, externalLock, fn) {
41
+ let lock = externalLock ?? null;
42
+ if (!lock) {
43
+ lock = await storage.locks.acquire(repo, ws, variant('dataset_write', null), { mode: 'shared' });
44
+ if (!lock) {
45
+ const state = await storage.locks.getState(repo, ws);
46
+ throw new WorkspaceLockError(ws, state ? { acquiredAt: state.acquiredAt.toISOString(), operation: state.operation.type } : undefined);
47
+ }
48
+ }
49
+ try {
50
+ return await fn();
51
+ }
52
+ finally {
53
+ if (!externalLock)
54
+ await lock.release();
55
+ }
56
+ }
57
+ /** Jittered exponential backoff (ms) before a compare-and-swap retry, so hot
58
+ * records don't lock-step their (expensive) reducer re-runs under contention. */
59
+ function casBackoffMs(attempt) {
60
+ return Math.min(2 ** attempt, 64) * (0.5 + Math.random());
61
+ }
62
+ /** Resolve a record name in a workspace's deployed package to its ref path and
63
+ * mutation table. Returns null if the workspace has no such record. */
64
+ async function resolveRecord(storage, repo, ws, recordName) {
65
+ const { hash } = await workspaceGetPackage(storage, repo, ws);
66
+ const pkg = decodePackageObject(await storage.objects.read(repo, hash));
67
+ const recHash = pkg.records.get(recordName);
68
+ if (!recHash)
69
+ return null;
70
+ const recObj = decodeRecordObject(await storage.objects.read(repo, recHash));
71
+ return {
72
+ refPath: recObj.path,
73
+ selfKeypath: refPathToKeypath(recObj.path),
74
+ mutations: recObj.mutations,
75
+ };
76
+ }
77
+ /** Map a non-success reducer run to its mutation outcome (nothing written).
78
+ * The reducer's captured stderr is forwarded on every failure so a human
79
+ * debugging a hand-written reducer sees its diagnostics. */
80
+ function failureOutcome(result) {
81
+ switch (result.kind) {
82
+ case 'failed':
83
+ return { kind: 'failed', exitCode: result.exitCode, stderr: result.stderr };
84
+ case 'timed_out':
85
+ return { kind: 'timed_out', ms: result.ms, stderr: result.stderr };
86
+ case 'too_large':
87
+ return { kind: 'too_large', bytes: result.bytes, limit: result.limit, stderr: result.stderr };
88
+ }
89
+ }
90
+ /**
91
+ * Apply a named mutation to a record under optimistic concurrency.
92
+ *
93
+ * Resolves the mutation, then loops: read the current state + revision, run the
94
+ * reducer against it, write the new state and a commit object, and conditionally
95
+ * swing the record ref. On a concurrent commit the conditional write conflicts
96
+ * and the loop retries against fresher state. Two mutations on the same record
97
+ * serialize; mutations on different records never contend.
98
+ */
99
+ export async function recordMutate(storage, runner, repo, ws, recordName, mutationName, args, opts) {
100
+ return withSharedWorkspaceLock(storage, repo, ws, opts.lock, async () => {
101
+ const resolved = await resolveRecord(storage, repo, ws, recordName);
102
+ if (!resolved)
103
+ return { kind: 'invalid', message: `record '${recordName}' not found` };
104
+ const mutHash = resolved.mutations.get(mutationName);
105
+ if (!mutHash)
106
+ return { kind: 'invalid', message: `mutation '${mutationName}' not found on record '${recordName}'` };
107
+ const mutObj = decodeMutationObject(await storage.objects.read(repo, mutHash));
108
+ if (args.length !== mutObj.argTypes.length) {
109
+ return { kind: 'invalid', message: `mutation '${mutationName}' expects ${mutObj.argTypes.length} argument(s), got ${args.length}` };
110
+ }
111
+ const bodyIr = await storage.objects.read(repo, mutObj.bodyIr);
112
+ const limits = opts.limits ?? DEFAULT_LIMITS;
113
+ const deadline = Date.now() + (opts.maxRetryMs ?? DEFAULT_MAX_RETRY_MS);
114
+ for (let attempt = 1;; attempt++) {
115
+ if (opts.signal?.aborted)
116
+ return { kind: 'failed', exitCode: -1, stderr: 'aborted' };
117
+ const existing = await storage.datasets.readVersioned(repo, ws, resolved.refPath);
118
+ if (!existing || existing.ref.type !== 'value') {
119
+ return { kind: 'invalid', message: `record '${recordName}' has no state` };
120
+ }
121
+ const stateBytes = await storage.objects.read(repo, existing.ref.value.hash);
122
+ const result = await runner.runDetached({ bodyIr, args: [stateBytes, ...args], runner: mutObj.runner, limits }, { signal: opts.signal });
123
+ if (result.kind !== 'success')
124
+ return failureOutcome(result);
125
+ // Objects written before the conditional ref swing are invisible until the
126
+ // ref references them; a conflict simply orphans them for GC.
127
+ const newStateHash = await storage.objects.write(repo, result.value);
128
+ const argsHash = args.length > 0
129
+ ? await storage.objects.write(repo, encodeArgsTuple(args))
130
+ : undefined;
131
+ const prevCommit = existing.ref.value.versions.get(resolved.selfKeypath);
132
+ const commit = {
133
+ parent: prevCommit !== undefined ? some(prevCommit) : none,
134
+ state: newStateHash,
135
+ mutation: mutationName,
136
+ args: argsHash !== undefined ? some(argsHash) : none,
137
+ actor: opts.actor,
138
+ at: new Date(),
139
+ };
140
+ const commitHash = await storage.objects.write(repo, encodeCommit(commit));
141
+ try {
142
+ await storage.datasets.writeIf(repo, ws, resolved.refPath, variant('value', { hash: newStateHash, versions: new Map([[resolved.selfKeypath, commitHash]]) }), existing.revision);
143
+ return { kind: 'committed', commitHash, stateHash: newStateHash };
144
+ }
145
+ catch (err) {
146
+ if (!(err instanceof DatasetRefConflictError))
147
+ throw err;
148
+ if ((opts.maxAttempts !== undefined && attempt >= opts.maxAttempts) || Date.now() >= deadline) {
149
+ return { kind: 'conflict', attempts: attempt };
150
+ }
151
+ await new Promise((resolve) => setTimeout(resolve, casBackoffMs(attempt)));
152
+ }
153
+ }
154
+ });
155
+ }
156
+ /**
157
+ * Describe a record's mutations (name + extra arg types), so dynamic callers
158
+ * can encode arguments. Returns null if the workspace has no such record.
159
+ */
160
+ export async function recordDescribe(storage, repo, ws, recordName) {
161
+ const resolved = await resolveRecord(storage, repo, ws, recordName);
162
+ if (!resolved)
163
+ return null;
164
+ const mutations = [];
165
+ for (const [name, mutHash] of resolved.mutations) {
166
+ const mutObj = decodeMutationObject(await storage.objects.read(repo, mutHash));
167
+ mutations.push({ name, argTypes: mutObj.argTypes });
168
+ }
169
+ return { name: recordName, mutations };
170
+ }
171
+ /**
172
+ * Compact a record's history: write a fresh `$compact` root commit
173
+ * (`parent: none`) over the current state and swing the ref to it. The prior
174
+ * commit chain becomes unreachable and is reclaimed by GC; the state itself is
175
+ * unchanged. Returns `committed` / `invalid` / `conflict` like a mutation.
176
+ */
177
+ export async function recordCompact(storage, repo, ws, recordName, opts) {
178
+ return withSharedWorkspaceLock(storage, repo, ws, opts.lock, async () => {
179
+ const resolved = await resolveRecord(storage, repo, ws, recordName);
180
+ if (!resolved)
181
+ return { kind: 'invalid', message: `record '${recordName}' not found` };
182
+ const deadline = Date.now() + (opts.maxRetryMs ?? DEFAULT_MAX_RETRY_MS);
183
+ for (let attempt = 1;; attempt++) {
184
+ const existing = await storage.datasets.readVersioned(repo, ws, resolved.refPath);
185
+ if (!existing || existing.ref.type !== 'value') {
186
+ return { kind: 'invalid', message: `record '${recordName}' has no state` };
187
+ }
188
+ const stateHash = existing.ref.value.hash;
189
+ const commit = {
190
+ parent: none,
191
+ state: stateHash,
192
+ mutation: '$compact',
193
+ args: none,
194
+ actor: opts.actor,
195
+ at: new Date(),
196
+ };
197
+ const commitHash = await storage.objects.write(repo, encodeCommit(commit));
198
+ try {
199
+ await storage.datasets.writeIf(repo, ws, resolved.refPath, variant('value', { hash: stateHash, versions: new Map([[resolved.selfKeypath, commitHash]]) }), existing.revision);
200
+ return { kind: 'committed', commitHash, stateHash };
201
+ }
202
+ catch (err) {
203
+ if (!(err instanceof DatasetRefConflictError))
204
+ throw err;
205
+ if ((opts.maxAttempts !== undefined && attempt >= opts.maxAttempts) || Date.now() >= deadline) {
206
+ return { kind: 'conflict', attempts: attempt };
207
+ }
208
+ await new Promise((resolve) => setTimeout(resolve, casBackoffMs(attempt)));
209
+ }
210
+ }
211
+ });
212
+ }
213
+ /**
214
+ * Walk a record's commit chain newest-first.
215
+ *
216
+ * @param opts.limit - Maximum commits to return (default: the whole chain)
217
+ * @param opts.from - Commit hash to start the walk at (a cursor for paging,
218
+ * trusted to be a hash this endpoint previously returned for this record);
219
+ * defaults to the record's head commit. A missing/undecodable cursor (or a
220
+ * corrupt link mid-walk) terminates the walk rather than throwing.
221
+ */
222
+ export async function recordHistory(storage, repo, ws, recordName, opts = {}) {
223
+ const resolved = await resolveRecord(storage, repo, ws, recordName);
224
+ if (!resolved)
225
+ return [];
226
+ const ref = await storage.datasets.read(repo, ws, resolved.refPath);
227
+ if (!ref || ref.type !== 'value')
228
+ return [];
229
+ const entries = [];
230
+ const seen = new Set();
231
+ let next = opts.from ?? ref.value.versions.get(resolved.selfKeypath);
232
+ const limit = opts.limit ?? Infinity;
233
+ while (next !== undefined && entries.length < limit) {
234
+ // Bound the walk by distinct objects so a corrupted/cyclic parent can't hang.
235
+ if (seen.has(next))
236
+ break;
237
+ seen.add(next);
238
+ let commit;
239
+ try {
240
+ commit = decodeCommit(await storage.objects.read(repo, next));
241
+ }
242
+ catch {
243
+ break; // missing object or non-commit cursor — end the walk gracefully
244
+ }
245
+ entries.push({ hash: next, commit });
246
+ next = commit.parent.type === 'some' ? commit.parent.value : undefined;
247
+ }
248
+ return entries;
249
+ }
250
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=records.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.spec.d.ts","sourceRoot":"","sources":["../../src/records.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}