@czap/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/addressed-digest.d.ts +15 -0
  4. package/dist/addressed-digest.d.ts.map +1 -0
  5. package/dist/addressed-digest.js +35 -0
  6. package/dist/addressed-digest.js.map +1 -0
  7. package/dist/animation.d.ts +46 -0
  8. package/dist/animation.d.ts.map +1 -0
  9. package/dist/animation.js +70 -0
  10. package/dist/animation.js.map +1 -0
  11. package/dist/assembly.d.ts +25 -0
  12. package/dist/assembly.d.ts.map +1 -0
  13. package/dist/assembly.js +58 -0
  14. package/dist/assembly.js.map +1 -0
  15. package/dist/av-bridge.d.ts +74 -0
  16. package/dist/av-bridge.d.ts.map +1 -0
  17. package/dist/av-bridge.js +107 -0
  18. package/dist/av-bridge.js.map +1 -0
  19. package/dist/av-renderer.d.ts +56 -0
  20. package/dist/av-renderer.d.ts.map +1 -0
  21. package/dist/av-renderer.js +65 -0
  22. package/dist/av-renderer.js.map +1 -0
  23. package/dist/blend.d.ts +61 -0
  24. package/dist/blend.d.ts.map +1 -0
  25. package/dist/blend.js +100 -0
  26. package/dist/blend.js.map +1 -0
  27. package/dist/boundary.d.ts +154 -0
  28. package/dist/boundary.d.ts.map +1 -0
  29. package/dist/boundary.js +269 -0
  30. package/dist/boundary.js.map +1 -0
  31. package/dist/brands.d.ts +63 -0
  32. package/dist/brands.d.ts.map +1 -0
  33. package/dist/brands.js +31 -0
  34. package/dist/brands.js.map +1 -0
  35. package/dist/caps.d.ts +49 -0
  36. package/dist/caps.d.ts.map +1 -0
  37. package/dist/caps.js +73 -0
  38. package/dist/caps.js.map +1 -0
  39. package/dist/capsule.d.ts +77 -0
  40. package/dist/capsule.d.ts.map +1 -0
  41. package/dist/capsule.js +18 -0
  42. package/dist/capsule.js.map +1 -0
  43. package/dist/capsules/boundary-evaluate.d.ts +28 -0
  44. package/dist/capsules/boundary-evaluate.d.ts.map +1 -0
  45. package/dist/capsules/boundary-evaluate.js +117 -0
  46. package/dist/capsules/boundary-evaluate.js.map +1 -0
  47. package/dist/capsules/canonical-cbor.d.ts +13 -0
  48. package/dist/capsules/canonical-cbor.d.ts.map +1 -0
  49. package/dist/capsules/canonical-cbor.js +60 -0
  50. package/dist/capsules/canonical-cbor.js.map +1 -0
  51. package/dist/capsules/token-buffer.d.ts +24 -0
  52. package/dist/capsules/token-buffer.d.ts.map +1 -0
  53. package/dist/capsules/token-buffer.js +53 -0
  54. package/dist/capsules/token-buffer.js.map +1 -0
  55. package/dist/capture.d.ts +40 -0
  56. package/dist/capture.d.ts.map +1 -0
  57. package/dist/capture.js +10 -0
  58. package/dist/capture.js.map +1 -0
  59. package/dist/cbor.d.ts +33 -0
  60. package/dist/cbor.d.ts.map +1 -0
  61. package/dist/cbor.js +179 -0
  62. package/dist/cbor.js.map +1 -0
  63. package/dist/cell.d.ts +53 -0
  64. package/dist/cell.d.ts.map +1 -0
  65. package/dist/cell.js +83 -0
  66. package/dist/cell.js.map +1 -0
  67. package/dist/codec.d.ts +30 -0
  68. package/dist/codec.d.ts.map +1 -0
  69. package/dist/codec.js +25 -0
  70. package/dist/codec.js.map +1 -0
  71. package/dist/component.d.ts +52 -0
  72. package/dist/component.d.ts.map +1 -0
  73. package/dist/component.js +44 -0
  74. package/dist/component.js.map +1 -0
  75. package/dist/composable.d.ts +76 -0
  76. package/dist/composable.d.ts.map +1 -0
  77. package/dist/composable.js +221 -0
  78. package/dist/composable.js.map +1 -0
  79. package/dist/compositor-pool.d.ts +74 -0
  80. package/dist/compositor-pool.d.ts.map +1 -0
  81. package/dist/compositor-pool.js +119 -0
  82. package/dist/compositor-pool.js.map +1 -0
  83. package/dist/compositor.d.ts +90 -0
  84. package/dist/compositor.d.ts.map +1 -0
  85. package/dist/compositor.js +278 -0
  86. package/dist/compositor.js.map +1 -0
  87. package/dist/config.d.ts +72 -0
  88. package/dist/config.d.ts.map +1 -0
  89. package/dist/config.js +97 -0
  90. package/dist/config.js.map +1 -0
  91. package/dist/dag.d.ts +251 -0
  92. package/dist/dag.d.ts.map +1 -0
  93. package/dist/dag.js +450 -0
  94. package/dist/dag.js.map +1 -0
  95. package/dist/defaults.d.ts +45 -0
  96. package/dist/defaults.d.ts.map +1 -0
  97. package/dist/defaults.js +45 -0
  98. package/dist/defaults.js.map +1 -0
  99. package/dist/derived.d.ts +34 -0
  100. package/dist/derived.d.ts.map +1 -0
  101. package/dist/derived.js +101 -0
  102. package/dist/derived.js.map +1 -0
  103. package/dist/diagnostics.d.ts +77 -0
  104. package/dist/diagnostics.d.ts.map +1 -0
  105. package/dist/diagnostics.js +122 -0
  106. package/dist/diagnostics.js.map +1 -0
  107. package/dist/dirty.d.ts +55 -0
  108. package/dist/dirty.d.ts.map +1 -0
  109. package/dist/dirty.js +80 -0
  110. package/dist/dirty.js.map +1 -0
  111. package/dist/easing.d.ts +55 -0
  112. package/dist/easing.d.ts.map +1 -0
  113. package/dist/easing.js +291 -0
  114. package/dist/easing.js.map +1 -0
  115. package/dist/ecs.d.ts +105 -0
  116. package/dist/ecs.d.ts.map +1 -0
  117. package/dist/ecs.js +245 -0
  118. package/dist/ecs.js.map +1 -0
  119. package/dist/fnv.d.ts +14 -0
  120. package/dist/fnv.d.ts.map +1 -0
  121. package/dist/fnv.js +28 -0
  122. package/dist/fnv.js.map +1 -0
  123. package/dist/frame-budget.d.ts +73 -0
  124. package/dist/frame-budget.d.ts.map +1 -0
  125. package/dist/frame-budget.js +114 -0
  126. package/dist/frame-budget.js.map +1 -0
  127. package/dist/gen-frame.d.ts +102 -0
  128. package/dist/gen-frame.d.ts.map +1 -0
  129. package/dist/gen-frame.js +121 -0
  130. package/dist/gen-frame.js.map +1 -0
  131. package/dist/harness/arbitrary-from-schema.d.ts +28 -0
  132. package/dist/harness/arbitrary-from-schema.d.ts.map +1 -0
  133. package/dist/harness/arbitrary-from-schema.js +262 -0
  134. package/dist/harness/arbitrary-from-schema.js.map +1 -0
  135. package/dist/harness/cached-projection.d.ts +19 -0
  136. package/dist/harness/cached-projection.d.ts.map +1 -0
  137. package/dist/harness/cached-projection.js +39 -0
  138. package/dist/harness/cached-projection.js.map +1 -0
  139. package/dist/harness/index.d.ts +16 -0
  140. package/dist/harness/index.d.ts.map +1 -0
  141. package/dist/harness/index.js +15 -0
  142. package/dist/harness/index.js.map +1 -0
  143. package/dist/harness/policy-gate.d.ts +18 -0
  144. package/dist/harness/policy-gate.d.ts.map +1 -0
  145. package/dist/harness/policy-gate.js +46 -0
  146. package/dist/harness/policy-gate.js.map +1 -0
  147. package/dist/harness/pure-transform.d.ts +42 -0
  148. package/dist/harness/pure-transform.d.ts.map +1 -0
  149. package/dist/harness/pure-transform.js +76 -0
  150. package/dist/harness/pure-transform.js.map +1 -0
  151. package/dist/harness/receipted-mutation.d.ts +23 -0
  152. package/dist/harness/receipted-mutation.d.ts.map +1 -0
  153. package/dist/harness/receipted-mutation.js +52 -0
  154. package/dist/harness/receipted-mutation.js.map +1 -0
  155. package/dist/harness/scene-composition.d.ts +19 -0
  156. package/dist/harness/scene-composition.d.ts.map +1 -0
  157. package/dist/harness/scene-composition.js +47 -0
  158. package/dist/harness/scene-composition.js.map +1 -0
  159. package/dist/harness/site-adapter.d.ts +18 -0
  160. package/dist/harness/site-adapter.d.ts.map +1 -0
  161. package/dist/harness/site-adapter.js +38 -0
  162. package/dist/harness/site-adapter.js.map +1 -0
  163. package/dist/harness/state-machine.d.ts +19 -0
  164. package/dist/harness/state-machine.d.ts.map +1 -0
  165. package/dist/harness/state-machine.js +44 -0
  166. package/dist/harness/state-machine.js.map +1 -0
  167. package/dist/hlc.d.ts +99 -0
  168. package/dist/hlc.d.ts.map +1 -0
  169. package/dist/hlc.js +219 -0
  170. package/dist/hlc.js.map +1 -0
  171. package/dist/index.d.ts +104 -0
  172. package/dist/index.d.ts.map +1 -0
  173. package/dist/index.js +137 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/interpolate.d.ts +14 -0
  176. package/dist/interpolate.d.ts.map +1 -0
  177. package/dist/interpolate.js +31 -0
  178. package/dist/interpolate.js.map +1 -0
  179. package/dist/live-cell.d.ts +46 -0
  180. package/dist/live-cell.d.ts.map +1 -0
  181. package/dist/live-cell.js +154 -0
  182. package/dist/live-cell.js.map +1 -0
  183. package/dist/op.d.ts +58 -0
  184. package/dist/op.d.ts.map +1 -0
  185. package/dist/op.js +171 -0
  186. package/dist/op.js.map +1 -0
  187. package/dist/plan.d.ts +195 -0
  188. package/dist/plan.d.ts.map +1 -0
  189. package/dist/plan.js +211 -0
  190. package/dist/plan.js.map +1 -0
  191. package/dist/protocol.d.ts +33 -0
  192. package/dist/protocol.d.ts.map +1 -0
  193. package/dist/protocol.js +10 -0
  194. package/dist/protocol.js.map +1 -0
  195. package/dist/quantizer-types.d.ts +28 -0
  196. package/dist/quantizer-types.d.ts.map +1 -0
  197. package/dist/quantizer-types.js +9 -0
  198. package/dist/quantizer-types.js.map +1 -0
  199. package/dist/receipt.d.ts +294 -0
  200. package/dist/receipt.d.ts.map +1 -0
  201. package/dist/receipt.js +352 -0
  202. package/dist/receipt.js.map +1 -0
  203. package/dist/runtime-coordinator.d.ts +75 -0
  204. package/dist/runtime-coordinator.d.ts.map +1 -0
  205. package/dist/runtime-coordinator.js +149 -0
  206. package/dist/runtime-coordinator.js.map +1 -0
  207. package/dist/scheduler.d.ts +58 -0
  208. package/dist/scheduler.d.ts.map +1 -0
  209. package/dist/scheduler.js +109 -0
  210. package/dist/scheduler.js.map +1 -0
  211. package/dist/ship-capsule.d.ts +54 -0
  212. package/dist/ship-capsule.d.ts.map +1 -0
  213. package/dist/ship-capsule.js +142 -0
  214. package/dist/ship-capsule.js.map +1 -0
  215. package/dist/ship-manifest.d.ts +45 -0
  216. package/dist/ship-manifest.d.ts.map +1 -0
  217. package/dist/ship-manifest.js +175 -0
  218. package/dist/ship-manifest.js.map +1 -0
  219. package/dist/signal.d.ts +149 -0
  220. package/dist/signal.d.ts.map +1 -0
  221. package/dist/signal.js +277 -0
  222. package/dist/signal.js.map +1 -0
  223. package/dist/speculative.d.ts +67 -0
  224. package/dist/speculative.d.ts.map +1 -0
  225. package/dist/speculative.js +139 -0
  226. package/dist/speculative.js.map +1 -0
  227. package/dist/store.d.ts +39 -0
  228. package/dist/store.d.ts.map +1 -0
  229. package/dist/store.js +42 -0
  230. package/dist/store.js.map +1 -0
  231. package/dist/style.d.ts +119 -0
  232. package/dist/style.d.ts.map +1 -0
  233. package/dist/style.js +168 -0
  234. package/dist/style.js.map +1 -0
  235. package/dist/testing.d.ts +14 -0
  236. package/dist/testing.d.ts.map +1 -0
  237. package/dist/testing.js +14 -0
  238. package/dist/testing.js.map +1 -0
  239. package/dist/theme.d.ts +78 -0
  240. package/dist/theme.d.ts.map +1 -0
  241. package/dist/theme.js +109 -0
  242. package/dist/theme.js.map +1 -0
  243. package/dist/timeline.d.ts +45 -0
  244. package/dist/timeline.d.ts.map +1 -0
  245. package/dist/timeline.js +101 -0
  246. package/dist/timeline.js.map +1 -0
  247. package/dist/token-buffer.d.ts +43 -0
  248. package/dist/token-buffer.d.ts.map +1 -0
  249. package/dist/token-buffer.js +112 -0
  250. package/dist/token-buffer.js.map +1 -0
  251. package/dist/token.d.ts +107 -0
  252. package/dist/token.d.ts.map +1 -0
  253. package/dist/token.js +143 -0
  254. package/dist/token.js.map +1 -0
  255. package/dist/tuple.d.ts +16 -0
  256. package/dist/tuple.d.ts.map +1 -0
  257. package/dist/tuple.js +16 -0
  258. package/dist/tuple.js.map +1 -0
  259. package/dist/type-utils.d.ts +41 -0
  260. package/dist/type-utils.d.ts.map +1 -0
  261. package/dist/type-utils.js +10 -0
  262. package/dist/type-utils.js.map +1 -0
  263. package/dist/typed-ref.d.ts +50 -0
  264. package/dist/typed-ref.d.ts.map +1 -0
  265. package/dist/typed-ref.js +59 -0
  266. package/dist/typed-ref.js.map +1 -0
  267. package/dist/ui-quality.d.ts +50 -0
  268. package/dist/ui-quality.d.ts.map +1 -0
  269. package/dist/ui-quality.js +64 -0
  270. package/dist/ui-quality.js.map +1 -0
  271. package/dist/validation-error.d.ts +25 -0
  272. package/dist/validation-error.d.ts.map +1 -0
  273. package/dist/validation-error.js +32 -0
  274. package/dist/validation-error.js.map +1 -0
  275. package/dist/vector-clock.d.ts +46 -0
  276. package/dist/vector-clock.d.ts.map +1 -0
  277. package/dist/vector-clock.js +91 -0
  278. package/dist/vector-clock.js.map +1 -0
  279. package/dist/video.d.ts +62 -0
  280. package/dist/video.d.ts.map +1 -0
  281. package/dist/video.js +59 -0
  282. package/dist/video.js.map +1 -0
  283. package/dist/wasm-dispatch.d.ts +52 -0
  284. package/dist/wasm-dispatch.d.ts.map +1 -0
  285. package/dist/wasm-dispatch.js +204 -0
  286. package/dist/wasm-dispatch.js.map +1 -0
  287. package/dist/wasm-fallback.d.ts +19 -0
  288. package/dist/wasm-fallback.d.ts.map +1 -0
  289. package/dist/wasm-fallback.js +93 -0
  290. package/dist/wasm-fallback.js.map +1 -0
  291. package/dist/wire.d.ts +49 -0
  292. package/dist/wire.d.ts.map +1 -0
  293. package/dist/wire.js +201 -0
  294. package/dist/wire.js.map +1 -0
  295. package/dist/zap.d.ts +42 -0
  296. package/dist/zap.d.ts.map +1 -0
  297. package/dist/zap.js +172 -0
  298. package/dist/zap.js.map +1 -0
  299. package/package.json +71 -0
  300. package/src/addressed-digest.ts +48 -0
  301. package/src/animation.ts +103 -0
  302. package/src/assembly.ts +76 -0
  303. package/src/av-bridge.ts +161 -0
  304. package/src/av-renderer.ts +118 -0
  305. package/src/blend.ts +135 -0
  306. package/src/boundary.ts +363 -0
  307. package/src/brands.ts +86 -0
  308. package/src/caps.ts +100 -0
  309. package/src/capsule.ts +95 -0
  310. package/src/capsules/boundary-evaluate.ts +128 -0
  311. package/src/capsules/canonical-cbor.ts +60 -0
  312. package/src/capsules/token-buffer.ts +57 -0
  313. package/src/capture.ts +48 -0
  314. package/src/cbor.ts +199 -0
  315. package/src/cell.ts +130 -0
  316. package/src/codec.ts +39 -0
  317. package/src/component.ts +102 -0
  318. package/src/composable.ts +328 -0
  319. package/src/compositor-pool.ts +162 -0
  320. package/src/compositor.ts +387 -0
  321. package/src/config.ts +157 -0
  322. package/src/dag.ts +527 -0
  323. package/src/defaults.ts +60 -0
  324. package/src/derived.ts +164 -0
  325. package/src/diagnostics.ts +186 -0
  326. package/src/dirty.ts +101 -0
  327. package/src/easing.ts +334 -0
  328. package/src/ecs.ts +382 -0
  329. package/src/fnv.ts +31 -0
  330. package/src/frame-budget.ts +149 -0
  331. package/src/gen-frame.ts +229 -0
  332. package/src/harness/arbitrary-from-schema.ts +270 -0
  333. package/src/harness/cached-projection.ts +46 -0
  334. package/src/harness/index.ts +16 -0
  335. package/src/harness/policy-gate.ts +51 -0
  336. package/src/harness/pure-transform.ts +121 -0
  337. package/src/harness/receipted-mutation.ts +59 -0
  338. package/src/harness/scene-composition.ts +54 -0
  339. package/src/harness/site-adapter.ts +43 -0
  340. package/src/harness/state-machine.ts +49 -0
  341. package/src/hlc.ts +238 -0
  342. package/src/index.ts +274 -0
  343. package/src/interpolate.ts +37 -0
  344. package/src/live-cell.ts +199 -0
  345. package/src/op.ts +233 -0
  346. package/src/plan.ts +317 -0
  347. package/src/protocol.ts +49 -0
  348. package/src/quantizer-types.ts +29 -0
  349. package/src/receipt.ts +444 -0
  350. package/src/runtime-coordinator.ts +230 -0
  351. package/src/scheduler.ts +161 -0
  352. package/src/ship-capsule.ts +191 -0
  353. package/src/signal.ts +345 -0
  354. package/src/speculative.ts +186 -0
  355. package/src/store.ts +77 -0
  356. package/src/style.ts +249 -0
  357. package/src/testing.ts +14 -0
  358. package/src/theme.ts +153 -0
  359. package/src/timeline.ts +146 -0
  360. package/src/token-buffer.ts +151 -0
  361. package/src/token.ts +197 -0
  362. package/src/tuple.ts +19 -0
  363. package/src/type-utils.ts +48 -0
  364. package/src/typed-ref.ts +79 -0
  365. package/src/ui-quality.ts +105 -0
  366. package/src/validation-error.ts +34 -0
  367. package/src/vector-clock.ts +111 -0
  368. package/src/video.ts +106 -0
  369. package/src/wasm-dispatch.ts +300 -0
  370. package/src/wasm-fallback.ts +102 -0
  371. package/src/wire.ts +274 -0
  372. package/src/zap.ts +241 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * `LiveCell<K, T>` — bridge between protocol envelope and reactive runtime.
3
+ *
4
+ * A LiveCell is a Cell that also carries a CellEnvelope, tracking
5
+ * its kind, content address, metadata (HLC timestamps, version),
6
+ * and boundary crossings.
7
+ *
8
+ * @module
9
+ */
10
+ import { Effect, Stream, PubSub, Ref } from 'effect';
11
+ import { Cell } from './cell.js';
12
+ import { ContentAddress as mkContentAddress, StateName as mkStateName } from './brands.js';
13
+ import { HLC } from './hlc.js';
14
+ import { canonicalize, hash } from './typed-ref.js';
15
+ import { Boundary } from './boundary.js';
16
+ function _make(kind, initial) {
17
+ return Effect.gen(function* () {
18
+ const cell = yield* Cell.make(initial);
19
+ const clockRef = yield* HLC.makeClock(`live-cell-${kind}`);
20
+ const createdHlc = yield* HLC.tick(clockRef);
21
+ const versionRef = yield* Ref.make(1);
22
+ const crossingPub = yield* PubSub.unbounded();
23
+ const createdRef = yield* Ref.make(createdHlc);
24
+ const updatedRef = yield* Ref.make(createdHlc);
25
+ const computeId = (value) => Effect.gen(function* () {
26
+ const h = yield* hash(canonicalize({ kind, value }));
27
+ return mkContentAddress(h);
28
+ });
29
+ const initialId = yield* computeId(initial);
30
+ const idRef = yield* Ref.make(initialId);
31
+ const recordMutation = (value) => Effect.gen(function* () {
32
+ const hlc = yield* HLC.tick(clockRef);
33
+ yield* Ref.set(updatedRef, hlc);
34
+ yield* Ref.update(versionRef, (v) => v + 1);
35
+ const newId = yield* computeId(value);
36
+ yield* Ref.set(idRef, newId);
37
+ });
38
+ const liveCell = {
39
+ _tag: 'LiveCell',
40
+ ref: cell.ref,
41
+ changes: cell.changes,
42
+ get: cell.get,
43
+ set: (value) => Effect.gen(function* () {
44
+ yield* cell.set(value);
45
+ yield* recordMutation(value);
46
+ }),
47
+ update: (f) => Effect.gen(function* () {
48
+ const current = yield* cell.get;
49
+ const next = f(current);
50
+ yield* cell.set(next);
51
+ yield* recordMutation(next);
52
+ }),
53
+ kind,
54
+ crossings: Stream.fromPubSub(crossingPub),
55
+ publishCrossing: (crossing) => PubSub.publish(crossingPub, crossing),
56
+ envelope: Effect.gen(function* () {
57
+ const value = yield* cell.get;
58
+ const created = yield* Ref.get(createdRef);
59
+ const updated = yield* Ref.get(updatedRef);
60
+ const version = yield* Ref.get(versionRef);
61
+ const id = yield* Ref.get(idRef);
62
+ const meta = { created, updated, version };
63
+ const envelope = { kind, id, meta, value };
64
+ return envelope;
65
+ }),
66
+ };
67
+ return liveCell;
68
+ });
69
+ }
70
+ /**
71
+ * Create a boundary-kind LiveCell that automatically publishes crossings
72
+ * when the numeric value transitions between boundary states.
73
+ */
74
+ function _makeBoundary(boundary, initial) {
75
+ return Effect.gen(function* () {
76
+ const cell = yield* Cell.make(initial);
77
+ const clockRef = yield* HLC.makeClock(`live-cell-boundary`);
78
+ const createdHlc = yield* HLC.tick(clockRef);
79
+ const versionRef = yield* Ref.make(1);
80
+ const crossingPub = yield* PubSub.unbounded();
81
+ const createdRef = yield* Ref.make(createdHlc);
82
+ const updatedRef = yield* Ref.make(createdHlc);
83
+ const kind = 'boundary';
84
+ const computeId = (value) => Effect.gen(function* () {
85
+ const h = yield* hash(canonicalize({ kind, value }));
86
+ return mkContentAddress(h);
87
+ });
88
+ const initialId = yield* computeId(initial);
89
+ const idRef = yield* Ref.make(initialId);
90
+ const initialState = Boundary.evaluate(boundary, initial);
91
+ const prevStateRef = yield* Ref.make(initialState);
92
+ const recordMutation = (value) => Effect.gen(function* () {
93
+ const hlc = yield* HLC.tick(clockRef);
94
+ yield* Ref.set(updatedRef, hlc);
95
+ yield* Ref.update(versionRef, (v) => v + 1);
96
+ const newId = yield* computeId(value);
97
+ yield* Ref.set(idRef, newId);
98
+ const prevState = yield* Ref.get(prevStateRef);
99
+ const nextState = Boundary.evaluateWithHysteresis(boundary, value, prevState);
100
+ if (nextState !== prevState) {
101
+ yield* Ref.set(prevStateRef, nextState);
102
+ yield* PubSub.publish(crossingPub, {
103
+ from: mkStateName(prevState),
104
+ to: mkStateName(nextState),
105
+ timestamp: hlc,
106
+ value,
107
+ });
108
+ }
109
+ });
110
+ const liveCell = {
111
+ _tag: 'LiveCell',
112
+ ref: cell.ref,
113
+ changes: cell.changes,
114
+ get: cell.get,
115
+ set: (value) => Effect.gen(function* () {
116
+ yield* cell.set(value);
117
+ yield* recordMutation(value);
118
+ }),
119
+ update: (f) => Effect.gen(function* () {
120
+ const current = yield* cell.get;
121
+ const next = f(current);
122
+ yield* cell.set(next);
123
+ yield* recordMutation(next);
124
+ }),
125
+ kind,
126
+ crossings: Stream.fromPubSub(crossingPub),
127
+ publishCrossing: (crossing) => PubSub.publish(crossingPub, crossing),
128
+ envelope: Effect.gen(function* () {
129
+ const value = yield* cell.get;
130
+ const created = yield* Ref.get(createdRef);
131
+ const updated = yield* Ref.get(updatedRef);
132
+ const version = yield* Ref.get(versionRef);
133
+ const id = yield* Ref.get(idRef);
134
+ const meta = { created, updated, version };
135
+ const envelope = { kind, id, meta, value };
136
+ return envelope;
137
+ }),
138
+ };
139
+ return liveCell;
140
+ });
141
+ }
142
+ /**
143
+ * LiveCell — bridge between the {@link Cell} reactive graph and the wire
144
+ * protocol. A `LiveCell` wraps a `Cell` with a typed {@link CellEnvelope} —
145
+ * kind, content address, HLC, boundary crossings — so primitives can travel
146
+ * between peers as self-describing messages.
147
+ */
148
+ export const LiveCell = {
149
+ /** Wrap an arbitrary value in a {@link LiveCell} with freshly minted identity + HLC. */
150
+ make: _make,
151
+ /** Specialized factory for boundary crossings so the envelope captures crossing metadata. */
152
+ makeBoundary: _makeBoundary,
153
+ };
154
+ //# sourceMappingURL=live-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-cell.js","sourceRoot":"","sources":["../src/live-cell.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,IAAI,gBAAgB,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3F,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAUzC,SAAS,KAAK,CAAwB,IAAO,EAAE,OAAU;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAA4B,CAAC;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAW,UAAU,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAW,UAAU,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,CAAC,KAAQ,EAAiC,EAAE,CAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEL,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAiB,SAAS,CAAC,CAAC;QAEzD,MAAM,cAAc,GAAG,CAAC,KAAQ,EAAuB,EAAE,CACvD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAChC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEL,MAAM,QAAQ,GAAwB;YACpC,IAAI,EAAE,UAAmB;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,CAAC,KAAQ,EAAE,EAAE,CAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvB,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;YACJ,MAAM,EAAE,CAAC,CAAoB,EAAE,EAAE,CAC/B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAChC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;gBACxB,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtB,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC;YACJ,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;YACzC,eAAe,EAAE,CAAC,QAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;YAC9F,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEjC,MAAM,IAAI,GAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrD,MAAM,QAAQ,GAAuB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBAC/D,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;SACH,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CACpB,QAA8B,EAC9B,OAAe;IAEf,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAA4B,CAAC;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAW,UAAU,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAW,UAAU,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,UAAmB,CAAC;QAEjC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAiC,EAAE,CACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEL,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAiB,SAAS,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAW,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG,CAAC,KAAa,EAAuB,EAAE,CAC5D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAChC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAE7B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAW,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACtF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBACxC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;oBACjC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC;oBAC5B,EAAE,EAAE,WAAW,CAAC,SAAS,CAAC;oBAC1B,SAAS,EAAE,GAAG;oBACd,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,MAAM,QAAQ,GAAsC;YAClD,IAAI,EAAE,UAAmB;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvB,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;YACJ,MAAM,EAAE,CAAC,CAA8B,EAAE,EAAE,CACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAChC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;gBACxB,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACtB,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC;YACJ,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;YACzC,eAAe,EAAE,CAAC,QAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;YAC9F,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEjC,MAAM,IAAI,GAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBACrD,MAAM,QAAQ,GAAqC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBAC7E,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;SACH,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,wFAAwF;IACxF,IAAI,EAAE,KAAK;IACX,6FAA6F;IAC7F,YAAY,EAAE,aAAa;CAC5B,CAAC"}
package/dist/op.d.ts ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * `Op<A, E, R>` — `Effect.Effect` wrapper with named factories.
3
+ *
4
+ * @module
5
+ */
6
+ import type { Scope, Result } from 'effect';
7
+ import { Effect } from 'effect';
8
+ import type { Millis } from './brands.js';
9
+ interface OpShape<A, E = never, R = never> {
10
+ readonly _tag: 'Op';
11
+ readonly effect: Effect.Effect<A, E, R>;
12
+ run(): Effect.Effect<A, E, R | Scope.Scope>;
13
+ map<B>(f: (a: A) => B): OpShape<B, E, R>;
14
+ flatMap<B, E2, R2>(f: (a: A) => OpShape<B, E2, R2>): OpShape<B, E | E2, R | R2>;
15
+ }
16
+ type OpValue<T extends OpShape<unknown, unknown, unknown>> = T extends OpShape<infer A, unknown, unknown> ? A : never;
17
+ type OpError<T extends OpShape<unknown, unknown, unknown>> = T extends OpShape<unknown, infer E, unknown> ? E : never;
18
+ type OpRequirement<T extends OpShape<unknown, unknown, unknown>> = T extends OpShape<unknown, unknown, infer R> ? R : never;
19
+ type OpValues<T extends readonly OpShape<unknown, unknown, unknown>[]> = {
20
+ [K in keyof T]: OpValue<T[K]>;
21
+ };
22
+ type SettledOpValues<T extends readonly OpShape<unknown, unknown, unknown>[]> = {
23
+ [K in keyof T]: Result.Result<OpValue<T[K]>, OpError<T[K]>>;
24
+ };
25
+ /**
26
+ * Op -- Effect.Effect wrapper providing named factories and combinators
27
+ * for async operations with retry, timeout, race, and parallel execution.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const op = Op.succeed(42).map(n => n * 2);
32
+ * const result = Effect.runSync(op.run()); // 84
33
+ *
34
+ * const tasks = Op.all([Op.succeed(1), Op.succeed(2)] as const);
35
+ * const [a, b] = Effect.runSync(tasks.run()); // [1, 2]
36
+ * ```
37
+ */
38
+ export declare const Op: {
39
+ make: <A, E = never, R = never>(effect: Effect.Effect<A, E, R>) => OpShape<A, E, R>;
40
+ fromPromise: <A>(f: () => Promise<A>) => OpShape<A, Error>;
41
+ succeed: <A>(value: A) => OpShape<A>;
42
+ fail: <E>(error: E) => OpShape<never, E>;
43
+ all: <T extends readonly OpShape<unknown, unknown, unknown>[]>(tasks: T) => OpShape<OpValues<T>, OpError<T[number]>, OpRequirement<T[number]>>;
44
+ allSettled: <T extends readonly OpShape<unknown, unknown, unknown>[]>(tasks: T) => OpShape<SettledOpValues<T>, never, OpRequirement<T[number]>>;
45
+ race: <A, E, R>(tasks: ReadonlyArray<OpShape<A, E, R>>) => OpShape<A, E | Error, R>;
46
+ retry: <A, E, R>(task: OpShape<A, E, R>, options: {
47
+ times: number;
48
+ delay?: Millis;
49
+ factor?: number;
50
+ }) => OpShape<A, E, R>;
51
+ timeout: <A, E, R>(task: OpShape<A, E, R>, ms: Millis) => OpShape<A, E | Error, R>;
52
+ };
53
+ export declare namespace Op {
54
+ /** Structural shape of an {@link Op}: a thin alias over `Effect.Effect<A, E, R>` produced by the `Op.*` factories. */
55
+ type Shape<A, E = never, R = never> = OpShape<A, E, R>;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=op.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"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"}
package/dist/op.js ADDED
@@ -0,0 +1,171 @@
1
+ /**
2
+ * `Op<A, E, R>` — `Effect.Effect` wrapper with named factories.
3
+ *
4
+ * @module
5
+ */
6
+ import { Effect, Schedule, Duration } from 'effect';
7
+ /**
8
+ * Wraps an Effect into an Op, providing `.map()` and `.flatMap()` chaining.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const op = Op.make(Effect.succeed(42));
13
+ * const doubled = op.map(n => n * 2);
14
+ * const result = Effect.runSync(doubled.run()); // 84
15
+ * ```
16
+ */
17
+ const _make = (effect) => ({
18
+ _tag: 'Op',
19
+ effect,
20
+ run: () => effect,
21
+ map: (fn) => _make(Effect.map(effect, fn)),
22
+ flatMap: (fn) => _make(Effect.flatMap(effect, (a) => fn(a).effect)),
23
+ });
24
+ /**
25
+ * Creates an Op from a Promise-returning function, catching errors as `Error`.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const op = Op.fromPromise(() => fetch('/api/data').then(r => r.json()));
30
+ * const result = await Effect.runPromise(op.run());
31
+ * console.log(result); // parsed JSON response
32
+ * ```
33
+ */
34
+ const _fromPromise = (f) => _make(Effect.tryPromise({
35
+ try: f,
36
+ catch: (error) => (error instanceof Error ? error : new Error(String(error))),
37
+ }));
38
+ /**
39
+ * Creates an Op that immediately succeeds with the given value.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const op = Op.succeed({ name: 'dark', contrast: 0.9 });
44
+ * const result = Effect.runSync(op.run()); // { name: 'dark', contrast: 0.9 }
45
+ * ```
46
+ */
47
+ const _succeed = (value) => _make(Effect.succeed(value));
48
+ /**
49
+ * Creates an Op that immediately fails with the given error.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const op = Op.fail(new Error('GPU not available'));
54
+ * // Effect.runSync(op.run()) would throw
55
+ * ```
56
+ */
57
+ const _fail = (error) => _make(Effect.fail(error));
58
+ /**
59
+ * Runs all Ops concurrently and returns their results as a tuple.
60
+ * Fails if any Op fails.
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * const a = Op.succeed(10);
65
+ * const b = Op.succeed('hello');
66
+ * const combined = Op.all([a, b] as const);
67
+ * const [num, str] = Effect.runSync(combined.run()); // [10, 'hello']
68
+ * ```
69
+ */
70
+ // Effect.all's overloads infer tuple results only when the input shape itself is tuple-typed.
71
+ // `tasks.map(...)` widens to unknown[], so we contain one cast into a typed wrapper and
72
+ // apply it at the boundary where the tuple→Op product is materialized.
73
+ const _all = (tasks) => {
74
+ const effects = tasks.map((task) => task.effect);
75
+ const combined = Effect.all(effects, { concurrency: 'unbounded' });
76
+ return _make(combined);
77
+ };
78
+ /**
79
+ * Runs all Ops concurrently and returns a Result for each, never failing.
80
+ * Each result is either a success or a failure.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const a = Op.succeed(1);
85
+ * const b = Op.fail(new Error('oops'));
86
+ * const settled = Op.allSettled([a, b] as const);
87
+ * const results = Effect.runSync(settled.run());
88
+ * // results[0] is Result.success(1), results[1] is Result.failure(Error)
89
+ * ```
90
+ */
91
+ // Mirrors _all: one boundary cast from unknown[] back to the tuple-projected product.
92
+ const _allSettled = (tasks) => {
93
+ const resultEffects = tasks.map((task) => Effect.result(task.effect));
94
+ const combined = Effect.all(resultEffects, { concurrency: 'unbounded' });
95
+ return _make(combined);
96
+ };
97
+ /**
98
+ * Races multiple Ops concurrently, returning the first to complete.
99
+ * Fails with an error if the array is empty.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * const fast = Op.succeed('fast');
104
+ * const slow = Op.fromPromise(() => new Promise(r => setTimeout(() => r('slow'), 100)));
105
+ * const winner = Op.race([fast, slow]);
106
+ * const result = Effect.runSync(winner.run()); // 'fast'
107
+ * ```
108
+ */
109
+ const _race = (tasks) => {
110
+ if (tasks.length === 0) {
111
+ return _fail(new Error('Op.race: empty array'));
112
+ }
113
+ if (tasks.length === 1) {
114
+ return tasks[0];
115
+ }
116
+ const effects = tasks.map((task) => task.effect);
117
+ const raced = effects.reduce((acc, effect) => Effect.race(acc, effect));
118
+ return _make(raced);
119
+ };
120
+ /**
121
+ * Retries a failing Op with exponential backoff.
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * const flaky = Op.fromPromise(() => fetch('/unstable-api').then(r => r.json()));
126
+ * const resilient = Op.retry(flaky, { times: 3, delay: Millis(200), factor: 2 });
127
+ * const result = await Effect.runPromise(resilient.run());
128
+ * ```
129
+ */
130
+ const _retry = (task, options) => {
131
+ const delay = options.delay ?? 100;
132
+ const factor = options.factor ?? 2;
133
+ const schedule = Schedule.exponential(Duration.millis(delay), factor).pipe(Schedule.both(Schedule.recurs(options.times)));
134
+ return _make(Effect.retry(task.effect, schedule));
135
+ };
136
+ /**
137
+ * Wraps an Op with a timeout, failing with an Error if it exceeds the given duration.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * const slow = Op.fromPromise(() => new Promise(r => setTimeout(() => r('done'), 5000)));
142
+ * const bounded = Op.timeout(slow, Millis(1000));
143
+ * // Will fail with Error('Op timed out after 1000ms') if not resolved in time
144
+ * ```
145
+ */
146
+ const _timeout = (task, ms) => _make(Effect.timeout(task.effect, Duration.millis(ms)).pipe(Effect.catchTag('TimeoutError', () => Effect.fail(new Error(`Op timed out after ${ms}ms`)))));
147
+ /**
148
+ * Op -- Effect.Effect wrapper providing named factories and combinators
149
+ * for async operations with retry, timeout, race, and parallel execution.
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * const op = Op.succeed(42).map(n => n * 2);
154
+ * const result = Effect.runSync(op.run()); // 84
155
+ *
156
+ * const tasks = Op.all([Op.succeed(1), Op.succeed(2)] as const);
157
+ * const [a, b] = Effect.runSync(tasks.run()); // [1, 2]
158
+ * ```
159
+ */
160
+ export const Op = {
161
+ make: _make,
162
+ fromPromise: _fromPromise,
163
+ succeed: _succeed,
164
+ fail: _fail,
165
+ all: _all,
166
+ allSettled: _allSettled,
167
+ race: _race,
168
+ retry: _retry,
169
+ timeout: _timeout,
170
+ };
171
+ //# sourceMappingURL=op.js.map
package/dist/op.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"op.js","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"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"}
package/dist/plan.d.ts ADDED
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Plan -- plan IR builder for universal execution DAG.
3
+ *
4
+ * @module
5
+ */
6
+ /**
7
+ * Discriminated union describing the kind of work a `PlanStep` performs.
8
+ *
9
+ * `pure` and `effect` name an executable function; `spawn` references a child
10
+ * fiber/worker keyed by `key`; `domain` dispatches to an external domain's
11
+ * named operation; `choice` marks a branch point; `noop` is an explicit
12
+ * placeholder.
13
+ */
14
+ export type OpType = {
15
+ readonly type: 'pure';
16
+ readonly fn?: string;
17
+ } | {
18
+ readonly type: 'effect';
19
+ readonly fn?: string;
20
+ } | {
21
+ readonly type: 'spawn';
22
+ readonly key: string;
23
+ readonly spec: Record<string, unknown>;
24
+ } | {
25
+ readonly type: 'domain';
26
+ readonly domain: string;
27
+ readonly op: string;
28
+ } | {
29
+ readonly type: 'choice';
30
+ readonly condition: unknown;
31
+ } | {
32
+ readonly type: 'noop';
33
+ };
34
+ /**
35
+ * Edge flavor in a plan DAG: sequential (`seq`), parallel (`par`), or the two
36
+ * branches of a `choice` step (`choice_then` / `choice_else`).
37
+ */
38
+ export type EdgeType = 'seq' | 'par' | 'choice_then' | 'choice_else';
39
+ /** A single node in a {@link PlanIR}: an identifier, a display name, and its {@link OpType}. */
40
+ export interface PlanStep {
41
+ readonly id: string;
42
+ readonly name: string;
43
+ readonly opType: OpType;
44
+ readonly metadata?: Record<string, unknown>;
45
+ }
46
+ /** A directed edge between two {@link PlanStep}s, tagged by {@link EdgeType}. */
47
+ export interface PlanEdge {
48
+ readonly from: string;
49
+ readonly to: string;
50
+ readonly type: EdgeType;
51
+ }
52
+ /** Intermediate representation of a plan: named steps plus directed edges. */
53
+ export interface PlanIR {
54
+ readonly name: string;
55
+ readonly steps: readonly PlanStep[];
56
+ readonly edges: readonly PlanEdge[];
57
+ readonly metadata?: Record<string, unknown>;
58
+ }
59
+ /** Structural failure from {@link Plan.validate}: either a cycle or an edge pointing at a missing step. */
60
+ export type PlanValidationError = {
61
+ readonly type: 'cycle';
62
+ readonly message: string;
63
+ readonly stepIds?: readonly string[];
64
+ } | {
65
+ readonly type: 'missing_step';
66
+ readonly message: string;
67
+ readonly stepIds?: readonly string[];
68
+ };
69
+ /** Result of {@link Plan.validate}: either the validated plan or a list of errors. */
70
+ export type PlanValidationResult = {
71
+ readonly ok: true;
72
+ readonly plan: PlanIR;
73
+ } | {
74
+ readonly ok: false;
75
+ readonly errors: readonly PlanValidationError[];
76
+ };
77
+ /**
78
+ * Result of {@link Plan.topoSort}: the sorted step IDs, optionally accompanied by
79
+ * the IDs that participated in a detected cycle.
80
+ */
81
+ export type TopoSortResult = {
82
+ readonly sorted: readonly string[];
83
+ readonly cycle?: undefined;
84
+ } | {
85
+ readonly sorted: readonly string[];
86
+ readonly cycle: readonly string[];
87
+ };
88
+ interface PlanBuilder {
89
+ step(name: string, opType: OpType, metadata?: Record<string, unknown>): PlanBuilder;
90
+ seq(fromId: string, toId: string): PlanBuilder;
91
+ par(fromId: string, toId: string): PlanBuilder;
92
+ choice(fromId: string, thenId: string, elseId: string): PlanBuilder;
93
+ build(): PlanIR;
94
+ }
95
+ /**
96
+ * Create a new PlanBuilder with the given plan name.
97
+ *
98
+ * Returns a fluent builder that supports chaining `.step()`, `.seq()`,
99
+ * `.par()`, and `.choice()` calls. Call `.build()` to produce the PlanIR.
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * const plan = Plan.make('my-pipeline')
104
+ * .step('fetch', { type: 'effect' })
105
+ * .step('transform', { type: 'pure' })
106
+ * .seq('step-1', 'step-2')
107
+ * .build();
108
+ * // plan.name === 'my-pipeline'
109
+ * // plan.steps.length === 2
110
+ * // plan.edges.length === 1
111
+ * ```
112
+ */
113
+ declare function _make(name: string): PlanBuilder;
114
+ /**
115
+ * Validate a PlanIR for structural correctness.
116
+ *
117
+ * Checks that all edges reference existing steps and that the graph is acyclic.
118
+ * Returns `{ ok: true, plan }` on success or `{ ok: false, errors }` with
119
+ * detailed validation errors.
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * const plan = Plan.make('test').step('a', { type: 'noop' }).build();
124
+ * const result = Plan.validate(plan);
125
+ * // result.ok === true
126
+ * // result.plan === plan
127
+ * ```
128
+ */
129
+ declare function _validate(planIR: PlanIR): PlanValidationResult;
130
+ /**
131
+ * Topologically sort the steps of a PlanIR using Kahn's algorithm.
132
+ *
133
+ * Returns `{ sorted }` on success. If a cycle exists, returns
134
+ * `{ sorted, cycle }` where `cycle` lists the step IDs involved.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * const plan = Plan.make('pipeline')
139
+ * .step('a', { type: 'pure' })
140
+ * .step('b', { type: 'pure' })
141
+ * .seq('step-1', 'step-2')
142
+ * .build();
143
+ * const result = Plan.topoSort(plan);
144
+ * // result.sorted === ['step-1', 'step-2']
145
+ * ```
146
+ */
147
+ declare function _topoSort(planIR: PlanIR): TopoSortResult;
148
+ /**
149
+ * Plan namespace -- plan IR builder for universal execution DAG.
150
+ *
151
+ * Build, validate, and topologically sort execution plans. Plans model
152
+ * computation graphs with sequential, parallel, and conditional edges.
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * import { Plan } from '@czap/core';
157
+ *
158
+ * const plan = Plan.make('render-pipeline')
159
+ * .step('load', { type: 'effect' })
160
+ * .step('compile', { type: 'pure' })
161
+ * .step('emit', { type: 'effect' })
162
+ * .seq('step-1', 'step-2')
163
+ * .seq('step-2', 'step-3')
164
+ * .build();
165
+ * const valid = Plan.validate(plan);
166
+ * const order = Plan.topoSort(plan);
167
+ * // order.sorted === ['step-1', 'step-2', 'step-3']
168
+ * ```
169
+ */
170
+ export declare const Plan: {
171
+ /** Start a new fluent {@link Plan.Builder} with the given display name. */
172
+ make: typeof _make;
173
+ /** Check that every edge references a known step and that the graph is acyclic. */
174
+ validate: typeof _validate;
175
+ /** Kahn's-algorithm topological sort; surfaces cycle participants if the plan is not a DAG. */
176
+ topoSort: typeof _topoSort;
177
+ };
178
+ export declare namespace Plan {
179
+ /** Alias for `PlanIR`. */
180
+ type IR = PlanIR;
181
+ /** Alias for `PlanStep`. */
182
+ type Step = PlanStep;
183
+ /** Alias for `PlanEdge`. */
184
+ type Edge = PlanEdge;
185
+ /** Alias for `PlanValidationError`. */
186
+ type ValidationError = PlanValidationError;
187
+ /** Alias for `PlanValidationResult`. */
188
+ type ValidationResult = PlanValidationResult;
189
+ /** Alias for `TopoSortResult`. */
190
+ type TopoSort = TopoSortResult;
191
+ /** Fluent builder interface returned by `Plan.make`. */
192
+ type Builder = PlanBuilder;
193
+ }
194
+ export {};
195
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}