@ontrails/core 1.0.0-beta.14 → 1.0.0-beta.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 (280) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +17 -13
  4. package/dist/branded.d.ts +1 -1
  5. package/dist/branded.d.ts.map +1 -1
  6. package/dist/branded.js +1 -1
  7. package/dist/branded.js.map +1 -1
  8. package/dist/context.d.ts +13 -1
  9. package/dist/context.d.ts.map +1 -1
  10. package/dist/context.js +19 -3
  11. package/dist/context.js.map +1 -1
  12. package/dist/contour.d.ts +81 -0
  13. package/dist/contour.d.ts.map +1 -0
  14. package/dist/contour.js +176 -0
  15. package/dist/contour.js.map +1 -0
  16. package/dist/cross-schema.d.ts +18 -0
  17. package/dist/cross-schema.d.ts.map +1 -0
  18. package/dist/cross-schema.js +29 -0
  19. package/dist/cross-schema.js.map +1 -0
  20. package/dist/draft.d.ts +5 -5
  21. package/dist/draft.d.ts.map +1 -1
  22. package/dist/draft.js +28 -27
  23. package/dist/draft.js.map +1 -1
  24. package/dist/errors.d.ts +62 -4
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +44 -1
  27. package/dist/errors.js.map +1 -1
  28. package/dist/execute.d.ts +26 -9
  29. package/dist/execute.d.ts.map +1 -1
  30. package/dist/execute.js +441 -20
  31. package/dist/execute.js.map +1 -1
  32. package/dist/fire.d.ts +43 -0
  33. package/dist/fire.d.ts.map +1 -0
  34. package/dist/fire.js +185 -0
  35. package/dist/fire.js.map +1 -0
  36. package/dist/index.d.ts +31 -20
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +23 -13
  39. package/dist/index.js.map +1 -1
  40. package/dist/internal/cross-batch.d.ts +44 -0
  41. package/dist/internal/cross-batch.d.ts.map +1 -0
  42. package/dist/internal/cross-batch.js +58 -0
  43. package/dist/internal/cross-batch.js.map +1 -0
  44. package/dist/internal/fork-ctx.d.ts +41 -0
  45. package/dist/internal/fork-ctx.d.ts.map +1 -0
  46. package/dist/internal/fork-ctx.js +47 -0
  47. package/dist/internal/fork-ctx.js.map +1 -0
  48. package/dist/internal/signal-ref.d.ts +15 -0
  49. package/dist/internal/signal-ref.d.ts.map +1 -0
  50. package/dist/internal/signal-ref.js +41 -0
  51. package/dist/internal/signal-ref.js.map +1 -0
  52. package/dist/internal/topo-saves.d.ts +8 -2
  53. package/dist/internal/topo-saves.d.ts.map +1 -1
  54. package/dist/internal/topo-saves.js +162 -23
  55. package/dist/internal/topo-saves.js.map +1 -1
  56. package/dist/internal/topo-snapshots.d.ts +57 -0
  57. package/dist/internal/topo-snapshots.d.ts.map +1 -0
  58. package/dist/internal/topo-snapshots.js +372 -0
  59. package/dist/internal/topo-snapshots.js.map +1 -0
  60. package/dist/internal/topo-store-read.d.ts +23 -20
  61. package/dist/internal/topo-store-read.d.ts.map +1 -1
  62. package/dist/internal/topo-store-read.js +82 -83
  63. package/dist/internal/topo-store-read.js.map +1 -1
  64. package/dist/internal/topo-store.d.ts +19 -5
  65. package/dist/internal/topo-store.d.ts.map +1 -1
  66. package/dist/internal/topo-store.js +174 -124
  67. package/dist/internal/topo-store.js.map +1 -1
  68. package/dist/internal/tracing.d.ts +98 -0
  69. package/dist/internal/tracing.d.ts.map +1 -0
  70. package/dist/internal/tracing.js +102 -0
  71. package/dist/internal/tracing.js.map +1 -0
  72. package/dist/internal/trails-db.d.ts +2 -2
  73. package/dist/internal/trails-db.d.ts.map +1 -1
  74. package/dist/internal/trails-db.js +8 -8
  75. package/dist/internal/trails-db.js.map +1 -1
  76. package/dist/internal/zod-wrappers.d.ts +40 -0
  77. package/dist/internal/zod-wrappers.d.ts.map +1 -0
  78. package/dist/internal/zod-wrappers.js +59 -0
  79. package/dist/internal/zod-wrappers.js.map +1 -0
  80. package/dist/layer.d.ts +22 -5
  81. package/dist/layer.d.ts.map +1 -1
  82. package/dist/layer.js +20 -3
  83. package/dist/layer.js.map +1 -1
  84. package/dist/path-security.d.ts +1 -1
  85. package/dist/path-security.d.ts.map +1 -1
  86. package/dist/path-security.js +1 -1
  87. package/dist/path-security.js.map +1 -1
  88. package/dist/resilience.d.ts +1 -1
  89. package/dist/resilience.d.ts.map +1 -1
  90. package/dist/resilience.js +3 -3
  91. package/dist/resilience.js.map +1 -1
  92. package/dist/resource-config.d.ts +22 -0
  93. package/dist/resource-config.d.ts.map +1 -0
  94. package/dist/resource-config.js +210 -0
  95. package/dist/resource-config.js.map +1 -0
  96. package/dist/resource.d.ts +74 -0
  97. package/dist/resource.d.ts.map +1 -0
  98. package/dist/resource.js +61 -0
  99. package/dist/resource.js.map +1 -0
  100. package/dist/run.d.ts +4 -3
  101. package/dist/run.d.ts.map +1 -1
  102. package/dist/run.js +5 -4
  103. package/dist/run.js.map +1 -1
  104. package/dist/serialization.d.ts.map +1 -1
  105. package/dist/serialization.js +2 -1
  106. package/dist/serialization.js.map +1 -1
  107. package/dist/store/accessor-protocol.d.ts +51 -0
  108. package/dist/store/accessor-protocol.d.ts.map +1 -0
  109. package/dist/store/accessor-protocol.js +2 -0
  110. package/dist/store/accessor-protocol.js.map +1 -0
  111. package/dist/store/index.d.ts +2 -0
  112. package/dist/store/index.d.ts.map +1 -0
  113. package/dist/store/index.js +2 -0
  114. package/dist/store/index.js.map +1 -0
  115. package/dist/surface-filter.d.ts +13 -0
  116. package/dist/surface-filter.d.ts.map +1 -0
  117. package/dist/surface-filter.js +76 -0
  118. package/dist/surface-filter.js.map +1 -0
  119. package/dist/topo-store.d.ts +36 -22
  120. package/dist/topo-store.d.ts.map +1 -1
  121. package/dist/topo-store.js +215 -71
  122. package/dist/topo-store.js.map +1 -1
  123. package/dist/topo.d.ts +23 -9
  124. package/dist/topo.d.ts.map +1 -1
  125. package/dist/topo.js +175 -46
  126. package/dist/topo.js.map +1 -1
  127. package/dist/trail.d.ts +86 -19
  128. package/dist/trail.d.ts.map +1 -1
  129. package/dist/trail.js +59 -4
  130. package/dist/trail.js.map +1 -1
  131. package/dist/trails/derive-trail.d.ts +66 -0
  132. package/dist/trails/derive-trail.d.ts.map +1 -0
  133. package/dist/trails/derive-trail.js +378 -0
  134. package/dist/trails/derive-trail.js.map +1 -0
  135. package/dist/trails/index.d.ts +5 -0
  136. package/dist/trails/index.d.ts.map +1 -0
  137. package/dist/trails/index.js +3 -0
  138. package/dist/trails/index.js.map +1 -0
  139. package/dist/trails/ingest.d.ts +24 -0
  140. package/dist/trails/ingest.d.ts.map +1 -0
  141. package/dist/trails/ingest.js +63 -0
  142. package/dist/trails/ingest.js.map +1 -0
  143. package/dist/transport-error-map.d.ts +106 -0
  144. package/dist/transport-error-map.d.ts.map +1 -0
  145. package/dist/transport-error-map.js +24 -0
  146. package/dist/transport-error-map.js.map +1 -0
  147. package/dist/type-checks.test-d.d.ts +71 -0
  148. package/dist/type-checks.test-d.d.ts.map +1 -0
  149. package/dist/type-checks.test-d.js +12 -0
  150. package/dist/type-checks.test-d.js.map +1 -0
  151. package/dist/type-utils.d.ts +11 -2
  152. package/dist/type-utils.d.ts.map +1 -1
  153. package/dist/type-utils.js.map +1 -1
  154. package/dist/types.d.ts +113 -7
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/types.js.map +1 -1
  157. package/dist/validate-established-topo.js +2 -2
  158. package/dist/validate-established-topo.js.map +1 -1
  159. package/dist/validate-topo.d.ts.map +1 -1
  160. package/dist/validate-topo.js +24 -7
  161. package/dist/validate-topo.js.map +1 -1
  162. package/dist/workspace.d.ts +1 -1
  163. package/dist/workspace.d.ts.map +1 -1
  164. package/dist/workspace.js +1 -1
  165. package/dist/workspace.js.map +1 -1
  166. package/package.json +8 -2
  167. package/src/__tests__/branded.test.ts +5 -5
  168. package/src/__tests__/context.test.ts +3 -3
  169. package/src/__tests__/contour.test.ts +263 -0
  170. package/src/__tests__/derive-trail.test.ts +668 -0
  171. package/src/__tests__/errors.test.ts +118 -0
  172. package/src/__tests__/execute.test.ts +1179 -141
  173. package/src/__tests__/fire.test.ts +1056 -0
  174. package/src/__tests__/fork-ctx.test.ts +83 -0
  175. package/src/__tests__/ingest.test.ts +191 -0
  176. package/src/__tests__/{gate.test.ts → layer.test.ts} +21 -21
  177. package/src/__tests__/path-security.test.ts +7 -7
  178. package/src/__tests__/resilience.test.ts +8 -8
  179. package/src/__tests__/resource.test.ts +204 -0
  180. package/src/__tests__/run.test.ts +13 -13
  181. package/src/__tests__/service-config.test.ts +28 -32
  182. package/src/__tests__/surface-filter.test.ts +196 -0
  183. package/src/__tests__/topo-store-read.test.ts +41 -36
  184. package/src/__tests__/topo-store.test.ts +493 -93
  185. package/src/__tests__/topo.test.ts +350 -54
  186. package/src/__tests__/trail.test.ts +189 -24
  187. package/src/__tests__/trails-db.test.ts +32 -25
  188. package/src/__tests__/transport-error-map.test.ts +82 -0
  189. package/src/__tests__/type-utils.test.ts +29 -1
  190. package/src/__tests__/validate-topo.test.ts +147 -25
  191. package/src/__tests__/workspace.test.ts +6 -6
  192. package/src/__tests__/zod-wrappers.test.ts +62 -0
  193. package/src/branded.ts +1 -1
  194. package/src/context.ts +24 -4
  195. package/src/contour.ts +344 -0
  196. package/src/cross-schema.ts +36 -0
  197. package/src/draft.ts +56 -52
  198. package/src/errors.ts +62 -18
  199. package/src/execute.ts +840 -29
  200. package/src/fire.ts +295 -0
  201. package/src/index.ts +116 -29
  202. package/src/internal/cross-batch.ts +77 -0
  203. package/src/internal/fork-ctx.ts +69 -0
  204. package/src/internal/signal-ref.ts +87 -0
  205. package/src/internal/topo-snapshots.ts +517 -0
  206. package/src/internal/topo-store-read.ts +140 -132
  207. package/src/internal/topo-store.ts +291 -186
  208. package/src/internal/tracing.ts +187 -0
  209. package/src/internal/trails-db.ts +9 -11
  210. package/src/internal/zod-wrappers.ts +78 -0
  211. package/src/layer.ts +50 -0
  212. package/src/path-security.ts +1 -1
  213. package/src/resilience.ts +3 -3
  214. package/src/{provision-config.ts → resource-config.ts} +109 -123
  215. package/src/resource.ts +155 -0
  216. package/src/run.ts +5 -4
  217. package/src/serialization.ts +2 -0
  218. package/src/store/accessor-protocol.ts +56 -0
  219. package/src/store/index.ts +4 -0
  220. package/src/surface-filter.ts +182 -0
  221. package/src/topo-store.ts +313 -104
  222. package/src/topo.ts +328 -57
  223. package/src/trail.ts +199 -31
  224. package/src/trails/derive-trail.ts +842 -0
  225. package/src/trails/index.ts +9 -0
  226. package/src/trails/ingest.ts +146 -0
  227. package/src/transport-error-map.ts +56 -0
  228. package/src/type-checks.test-d.ts +106 -0
  229. package/src/type-utils.ts +17 -2
  230. package/src/types.ts +148 -11
  231. package/src/validate-established-topo.ts +2 -2
  232. package/src/validate-topo.ts +32 -8
  233. package/src/workspace.ts +1 -1
  234. package/tsconfig.tests.json +10 -0
  235. package/tsconfig.tsbuildinfo +1 -1
  236. package/dist/adapters.d.ts +0 -39
  237. package/dist/adapters.d.ts.map +0 -1
  238. package/dist/adapters.js +0 -2
  239. package/dist/adapters.js.map +0 -1
  240. package/dist/dispatch.d.ts +0 -27
  241. package/dist/dispatch.d.ts.map +0 -1
  242. package/dist/dispatch.js +0 -34
  243. package/dist/dispatch.js.map +0 -1
  244. package/dist/event.d.ts +0 -8
  245. package/dist/event.d.ts.map +0 -1
  246. package/dist/event.js +0 -7
  247. package/dist/event.js.map +0 -1
  248. package/dist/gate.d.ts +0 -17
  249. package/dist/gate.d.ts.map +0 -1
  250. package/dist/gate.js +0 -21
  251. package/dist/gate.js.map +0 -1
  252. package/dist/health.d.ts +0 -18
  253. package/dist/health.d.ts.map +0 -1
  254. package/dist/health.js +0 -5
  255. package/dist/health.js.map +0 -1
  256. package/dist/job.d.ts +0 -24
  257. package/dist/job.d.ts.map +0 -1
  258. package/dist/job.js +0 -17
  259. package/dist/job.js.map +0 -1
  260. package/dist/provision-config.d.ts +0 -22
  261. package/dist/provision-config.d.ts.map +0 -1
  262. package/dist/provision-config.js +0 -210
  263. package/dist/provision-config.js.map +0 -1
  264. package/dist/provision.d.ts +0 -71
  265. package/dist/provision.d.ts.map +0 -1
  266. package/dist/provision.js +0 -56
  267. package/dist/provision.js.map +0 -1
  268. package/dist/service-config.d.ts +0 -22
  269. package/dist/service-config.d.ts.map +0 -1
  270. package/dist/service-config.js +0 -210
  271. package/dist/service-config.js.map +0 -1
  272. package/dist/service.d.ts +0 -71
  273. package/dist/service.d.ts.map +0 -1
  274. package/dist/service.js +0 -56
  275. package/dist/service.js.map +0 -1
  276. package/src/__tests__/service.test.ts +0 -197
  277. package/src/event.ts +0 -15
  278. package/src/gate.ts +0 -44
  279. package/src/internal/topo-saves.ts +0 -429
  280. package/src/provision.ts +0 -148
@@ -6,18 +6,19 @@ import { join } from 'node:path';
6
6
  import { z } from 'zod';
7
7
 
8
8
  import {
9
+ ConflictError,
9
10
  createMockTopoStore,
11
+ createTopoSnapshot,
10
12
  createTopoStore,
11
- provision,
13
+ resource,
12
14
  Result,
13
15
  signal,
14
16
  topo,
15
17
  topoStore,
16
18
  trail,
17
19
  } from '../index.js';
18
- import { pinTopoSave } from '../internal/topo-saves.js';
19
- import type { TopoSaveRecord } from '../internal/topo-saves.js';
20
- import { persistEstablishedTopoSave } from '../internal/topo-store.js';
20
+ import { pinTopoSnapshot } from '../internal/topo-snapshots.js';
21
+ import type { TopoSnapshot } from '../internal/topo-snapshots.js';
21
22
  import { openWriteTrailsDb } from '../internal/trails-db.js';
22
23
 
23
24
  const noop = () => Result.ok({ ok: true });
@@ -40,7 +41,7 @@ const requireValue = <T>(value: T | undefined, message: string): T => {
40
41
  };
41
42
 
42
43
  const exampleApp = () => {
43
- const dbMain = provision('db.main', {
44
+ const dbMain = resource('db.main', {
44
45
  create: () => Result.ok({ source: 'factory' }),
45
46
  description: 'Primary database',
46
47
  health: () => Result.ok({ ok: true }),
@@ -66,21 +67,20 @@ const exampleApp = () => {
66
67
  ],
67
68
  input: z.object({ name: z.string() }),
68
69
  output: z.object({ id: z.string(), ok: z.boolean() }),
69
- provisions: [dbMain],
70
+ resources: [dbMain],
70
71
  });
71
72
 
72
73
  const entityList = trail('entity.list', {
73
74
  blaze: noop,
74
75
  crosses: ['entity.add'],
75
76
  description: 'List entities',
76
- detours: {
77
- ConflictError: ['entity.add'],
78
- },
77
+ /* oxlint-disable-next-line require-await -- test stub */
78
+ detours: [{ on: ConflictError, recover: async () => Result.ok() }],
79
79
  idempotent: true,
80
80
  input: z.object({}),
81
81
  intent: 'read',
82
82
  output: z.object({ ok: z.boolean() }),
83
- provisions: [dbMain],
83
+ resources: [dbMain],
84
84
  });
85
85
 
86
86
  return topo('projection-app', {
@@ -108,35 +108,38 @@ describe('read-only topo store', () => {
108
108
 
109
109
  const seedStore = (): {
110
110
  readonly rootDir: string;
111
- readonly save: TopoSaveRecord;
111
+ readonly snapshot: TopoSnapshot;
112
112
  } => {
113
113
  const rootDir = makeRoot();
114
114
  const db = openWriteTrailsDb({ rootDir });
115
115
 
116
116
  try {
117
- const result = persistEstablishedTopoSave(db, exampleApp(), {
117
+ const result = createTopoSnapshot(exampleApp(), {
118
118
  createdAt: '2026-04-03T14:00:00.000Z',
119
119
  gitSha: 'abc123',
120
+ rootDir,
120
121
  });
121
122
  if (result.isErr()) {
122
123
  throw result.error;
123
124
  }
124
- const save = result.value;
125
- pinTopoSave(db, { name: 'baseline', saveId: save.id });
126
- return { rootDir, save };
125
+ const snapshot = result.value;
126
+ pinTopoSnapshot(db, { id: snapshot.id, name: 'baseline' });
127
+ return { rootDir, snapshot };
127
128
  } finally {
128
129
  db.close();
129
130
  }
130
131
  };
131
132
 
132
- test('lists save-scoped trails and provisions through typed accessors', () => {
133
- const { rootDir, save } = seedStore();
133
+ test('lists snapshot-scoped trails and resources through typed accessors', () => {
134
+ const { rootDir, snapshot } = seedStore();
134
135
  const store = createTopoStore({ rootDir });
135
136
 
136
- expect(store.saves.latest()?.id).toBe(save.id);
137
- expect(store.pins.get('baseline')?.saveId).toBe(save.id);
137
+ expect(store.snapshots.latest()?.id).toBe(snapshot.id);
138
+ expect(store.snapshots.get({ pin: 'baseline' })?.id).toBe(snapshot.id);
138
139
 
139
- expect(store.trails.list({ save: { saveId: save.id } })).toEqual([
140
+ expect(
141
+ store.trails.list({ snapshot: { snapshotId: snapshot.id } })
142
+ ).toEqual([
140
143
  expect.objectContaining({
141
144
  description: 'Add a new entity',
142
145
  exampleCount: 1,
@@ -153,7 +156,9 @@ describe('read-only topo store', () => {
153
156
  }),
154
157
  ]);
155
158
 
156
- expect(store.provisions.list({ save: { saveId: save.id } })).toEqual([
159
+ expect(
160
+ store.resources.list({ snapshot: { snapshotId: snapshot.id } })
161
+ ).toEqual([
157
162
  expect.objectContaining({
158
163
  description: 'Primary database',
159
164
  health: 'available',
@@ -164,48 +169,48 @@ describe('read-only topo store', () => {
164
169
  });
165
170
 
166
171
  test('filters trails by intent', () => {
167
- const { rootDir, save } = seedStore();
172
+ const { rootDir, snapshot } = seedStore();
168
173
  const store = createTopoStore({ rootDir });
169
174
 
170
175
  const writeTrails = store.trails.list({
171
176
  intent: 'write',
172
- save: { saveId: save.id },
177
+ snapshot: { snapshotId: snapshot.id },
173
178
  });
174
179
  expect(writeTrails).toHaveLength(1);
175
180
  expect(writeTrails[0]?.id).toBe('entity.add');
176
181
 
177
182
  const readTrails = store.trails.list({
178
183
  intent: 'read',
179
- save: { saveId: save.id },
184
+ snapshot: { snapshotId: snapshot.id },
180
185
  });
181
186
  expect(readTrails).toHaveLength(1);
182
187
  expect(readTrails[0]?.id).toBe('entity.list');
183
188
  });
184
189
 
185
190
  test('returns detailed trail and export views, plus a query escape hatch', () => {
186
- const { rootDir, save } = seedStore();
191
+ const { rootDir, snapshot } = seedStore();
187
192
  const store = createTopoStore({ rootDir });
188
193
 
189
194
  const detail = store.trails.get('entity.list', {
190
- save: { saveId: save.id },
195
+ snapshot: { snapshotId: snapshot.id },
191
196
  });
192
197
  expect(detail).toEqual(
193
198
  expect.objectContaining({
194
199
  crosses: ['entity.add'],
195
- detours: { ConflictError: ['entity.add'] },
200
+ detours: [{ maxAttempts: 1, on: 'ConflictError' }],
196
201
  id: 'entity.list',
197
- provisions: ['db.main'],
202
+ resources: ['db.main'],
198
203
  })
199
204
  );
200
205
  expect(detail?.examples).toEqual([]);
201
206
 
202
207
  const exported = store.exports.get({ pin: 'baseline' });
203
- expect(exported?.save.id).toBe(save.id);
204
- expect(exported?.trailheadHash).toHaveLength(64);
208
+ expect(exported?.snapshot.id).toBe(snapshot.id);
209
+ expect(exported?.surfaceHash).toHaveLength(64);
205
210
 
206
211
  const rows = store.query<{ id: string }>(
207
- 'SELECT id FROM topo_trails WHERE save_id = ? ORDER BY id ASC',
208
- [save.id]
212
+ 'SELECT id FROM topo_trails WHERE snapshot_id = ? ORDER BY id ASC',
213
+ [snapshot.id]
209
214
  );
210
215
  expect(rows).toEqual([{ id: 'entity.add' }, { id: 'entity.list' }]);
211
216
  });
@@ -214,12 +219,12 @@ describe('read-only topo store', () => {
214
219
  const rootDir = makeRoot();
215
220
  const store = createTopoStore({ rootDir });
216
221
 
217
- expect(() => store.saves.latest()).toThrow('No saved topo state found');
222
+ expect(() => store.snapshots.latest()).toThrow('No saved topo state found');
218
223
  expect(() => store.trails.list()).toThrow('No saved topo state found');
219
224
  expect(() => store.exports.get()).toThrow('No saved topo state found');
220
225
  });
221
226
 
222
- test('exposes a provision factory and mock for topoStore', async () => {
227
+ test('exposes a resource factory and mock for topoStore', async () => {
223
228
  const { rootDir } = seedStore();
224
229
 
225
230
  const created = await expectOk(
@@ -231,10 +236,10 @@ describe('read-only topo store', () => {
231
236
  })
232
237
  );
233
238
 
234
- expect(created.saves.latest()).toBeDefined();
239
+ expect(created.snapshots.latest()).toBeDefined();
235
240
  expect(
236
241
  created.query<{ count: number }>(
237
- 'SELECT COUNT(*) as count FROM topo_saves'
242
+ 'SELECT COUNT(*) as count FROM topo_snapshots'
238
243
  )[0]?.count
239
244
  ).toBe(1);
240
245