@demlik/tea 0.12.0 → 0.13.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 (152) hide show
  1. package/dist/agent/index.d.ts +6 -5
  2. package/dist/agent/index.js +11 -11
  3. package/dist/authed-call/index.d.ts +3 -2
  4. package/dist/authed-call/index.js +7 -7
  5. package/dist/await-terminal/index.d.ts +3 -2
  6. package/dist/await-terminal/index.js +2 -2
  7. package/dist/batch-window/index.d.ts +4 -3
  8. package/dist/batch-window/index.js +3 -3
  9. package/dist/cache/index.d.ts +3 -2
  10. package/dist/cache/index.js +4 -4
  11. package/dist/chart/index.d.ts +4 -3
  12. package/dist/chart/index.js +2 -2
  13. package/dist/chart/inspect/index.d.ts +5 -4
  14. package/dist/chart/inspect/index.js +3 -3
  15. package/dist/chart/inspect/react.d.ts +6 -5
  16. package/dist/chart/inspect/react.js +5 -5
  17. package/dist/chart/lane/index.d.ts +7 -6
  18. package/dist/chart/lane/index.js +6 -6
  19. package/dist/chart/lane/react.d.ts +6 -5
  20. package/dist/chart/lane/react.js +7 -7
  21. package/dist/chart/report/index.d.ts +5 -4
  22. package/dist/chart/report/index.js +4 -4
  23. package/dist/{chunk-ZF6WDK2D.js → chunk-3I52QZZ5.js} +7 -7
  24. package/dist/{chunk-ZF6WDK2D.js.map → chunk-3I52QZZ5.js.map} +1 -1
  25. package/dist/{chunk-ZD6PNZBK.js → chunk-3ZAFFRRB.js} +3 -3
  26. package/dist/{chunk-ZD6PNZBK.js.map → chunk-3ZAFFRRB.js.map} +1 -1
  27. package/dist/{chunk-4KTWLPL5.js → chunk-4EQZ76JC.js} +3 -3
  28. package/dist/{chunk-4KTWLPL5.js.map → chunk-4EQZ76JC.js.map} +1 -1
  29. package/dist/{chunk-EUF7XOEE.js → chunk-4KLG43GY.js} +6 -6
  30. package/dist/{chunk-EUF7XOEE.js.map → chunk-4KLG43GY.js.map} +1 -1
  31. package/dist/{chunk-JER5O7PQ.js → chunk-7FRZ2CT2.js} +15 -7
  32. package/dist/chunk-7FRZ2CT2.js.map +1 -0
  33. package/dist/{chunk-ZCL7SCBK.js → chunk-CIQG5L42.js} +5 -5
  34. package/dist/{chunk-ZCL7SCBK.js.map → chunk-CIQG5L42.js.map} +1 -1
  35. package/dist/{chunk-TP5UPGLY.js → chunk-CLM6ERNO.js} +3 -3
  36. package/dist/{chunk-TP5UPGLY.js.map → chunk-CLM6ERNO.js.map} +1 -1
  37. package/dist/{chunk-ND3DH6KM.js → chunk-COS5MSTO.js} +3 -3
  38. package/dist/{chunk-ND3DH6KM.js.map → chunk-COS5MSTO.js.map} +1 -1
  39. package/dist/{chunk-JP5D6GSL.js → chunk-CRPZJVD2.js} +4 -4
  40. package/dist/{chunk-JP5D6GSL.js.map → chunk-CRPZJVD2.js.map} +1 -1
  41. package/dist/{chunk-SUST46KO.js → chunk-D62FDQKE.js} +3 -3
  42. package/dist/{chunk-SUST46KO.js.map → chunk-D62FDQKE.js.map} +1 -1
  43. package/dist/{chunk-JGVL3WPL.js → chunk-DGE4PV4A.js} +3 -3
  44. package/dist/{chunk-JGVL3WPL.js.map → chunk-DGE4PV4A.js.map} +1 -1
  45. package/dist/{chunk-WLGO64WC.js → chunk-DMYGQB4O.js} +4 -4
  46. package/dist/{chunk-WLGO64WC.js.map → chunk-DMYGQB4O.js.map} +1 -1
  47. package/dist/{chunk-A56OR5RF.js → chunk-L57ZOT5K.js} +3 -3
  48. package/dist/{chunk-A56OR5RF.js.map → chunk-L57ZOT5K.js.map} +1 -1
  49. package/dist/{chunk-5KJKJOFC.js → chunk-NR7BU22N.js} +3 -3
  50. package/dist/{chunk-5KJKJOFC.js.map → chunk-NR7BU22N.js.map} +1 -1
  51. package/dist/{chunk-7V4EVLZA.js → chunk-O4MVQTEJ.js} +4 -4
  52. package/dist/{chunk-7V4EVLZA.js.map → chunk-O4MVQTEJ.js.map} +1 -1
  53. package/dist/{chunk-B5VXOFMZ.js → chunk-OOYD44JI.js} +54 -3
  54. package/dist/chunk-OOYD44JI.js.map +1 -0
  55. package/dist/{chunk-7SVIRMC6.js → chunk-RH5EFRVJ.js} +3 -3
  56. package/dist/{chunk-7SVIRMC6.js.map → chunk-RH5EFRVJ.js.map} +1 -1
  57. package/dist/{chunk-3JU6657S.js → chunk-VYFAZN3F.js} +3 -3
  58. package/dist/{chunk-3JU6657S.js.map → chunk-VYFAZN3F.js.map} +1 -1
  59. package/dist/chunk-XGELA764.js +163 -0
  60. package/dist/chunk-XGELA764.js.map +1 -0
  61. package/dist/{chunk-I5OV65MS.js → chunk-YUXP55T2.js} +3 -3
  62. package/dist/{chunk-I5OV65MS.js.map → chunk-YUXP55T2.js.map} +1 -1
  63. package/dist/{chunk-E6GEDSF4.js → chunk-YWIKDKHY.js} +3 -3
  64. package/dist/{chunk-E6GEDSF4.js.map → chunk-YWIKDKHY.js.map} +1 -1
  65. package/dist/{chunk-5EHLEUTL.js → chunk-ZSUUOEPL.js} +51 -6
  66. package/dist/chunk-ZSUUOEPL.js.map +1 -0
  67. package/dist/{core-Bjc0bS8j.d.ts → core-Co0LWkIA.d.ts} +190 -3
  68. package/dist/deadline/index.d.ts +3 -2
  69. package/dist/deadline/index.js +3 -3
  70. package/dist/do/index.d.ts +12 -8
  71. package/dist/do/index.js +11 -11
  72. package/dist/do/index.js.map +1 -1
  73. package/dist/{durable-effects-D8SqU_if.d.ts → durable-effects-C6uwzjb5.d.ts} +1 -1
  74. package/dist/extension/index.d.ts +3 -2
  75. package/dist/extension/index.js +3 -3
  76. package/dist/extension/react.js +3 -3
  77. package/dist/extension/subs/index.d.ts +3 -2
  78. package/dist/fan-out/index.d.ts +3 -2
  79. package/dist/{fold-Blbhru48.d.ts → fold-BJPdjc9w.d.ts} +1 -1
  80. package/dist/{graph-CcjWZVrd.d.ts → graph-B3L5e0N1.d.ts} +1 -1
  81. package/dist/idempotent-intake/index.d.ts +3 -2
  82. package/dist/index.d.ts +14 -6
  83. package/dist/index.js +2 -2
  84. package/dist/journal/index.d.ts +373 -0
  85. package/dist/journal/index.js +3 -0
  86. package/dist/journal/index.js.map +1 -0
  87. package/dist/llm-call/index.d.ts +3 -2
  88. package/dist/llm-call/index.js +8 -8
  89. package/dist/{machine-0OmPvsy_.d.ts → machine-BtFWQmmq.d.ts} +1 -1
  90. package/dist/machine-viz/index.d.ts +2 -1
  91. package/dist/machine-viz/index.js +2 -2
  92. package/dist/mem/index.d.ts +3 -2
  93. package/dist/monitored-run/index.d.ts +4 -3
  94. package/dist/monitored-run/index.js +5 -5
  95. package/dist/node/index.d.ts +31 -3
  96. package/dist/node/index.js +92 -3
  97. package/dist/node/index.js.map +1 -1
  98. package/dist/paginated-walk/index.d.ts +3 -2
  99. package/dist/paginated-walk/index.js +7 -7
  100. package/dist/parity/index.d.ts +3 -2
  101. package/dist/parity/index.js +3 -3
  102. package/dist/pbt/arbitraries/index.d.ts +2 -1
  103. package/dist/pbt/index.d.ts +2 -1
  104. package/dist/pbt/index.js +3 -3
  105. package/dist/pbt/runners/index.d.ts +2 -1
  106. package/dist/pbt/runners/index.js +3 -3
  107. package/dist/poller/index.d.ts +3 -2
  108. package/dist/poller/index.js +3 -3
  109. package/dist/prediction/index.d.ts +2 -1
  110. package/dist/prediction/index.js +2 -2
  111. package/dist/pure/index.d.ts +2 -1
  112. package/dist/pure/index.js +2 -2
  113. package/dist/react/index.d.ts +4 -3
  114. package/dist/react/index.js +2 -2
  115. package/dist/react/index.js.map +1 -1
  116. package/dist/reconciler/index.d.ts +3 -2
  117. package/dist/reconciler/index.js +7 -7
  118. package/dist/recorder/index.d.ts +3 -2
  119. package/dist/{reducer-BqyoVyBG.d.ts → reducer-4GNR6b8B.d.ts} +2 -2
  120. package/dist/resilient-call/index.d.ts +3 -2
  121. package/dist/resilient-call/index.js +6 -6
  122. package/dist/{run-BVeqJDBF.d.ts → run-pAcmBpah.d.ts} +3 -3
  123. package/dist/{runtime-types-Bxc637bp.d.ts → runtime-types-CNLmhWif.d.ts} +17 -2
  124. package/dist/saga/index.d.ts +3 -2
  125. package/dist/{samples-DCt6nF8H.d.ts → samples-B3My5oh2.d.ts} +1 -1
  126. package/dist/snapshot/index.d.ts +2 -1
  127. package/dist/snapshot/index.js +3 -3
  128. package/dist/subs/index.d.ts +4 -3
  129. package/dist/subs/index.js +3 -3
  130. package/dist/testing/index.d.ts +3 -2
  131. package/dist/testing/index.js +2 -2
  132. package/dist/throttled-input/index.d.ts +3 -2
  133. package/dist/throttled-input/index.js +6 -6
  134. package/dist/token-refresh/index.d.ts +2 -1
  135. package/dist/token-refresh/index.js +3 -3
  136. package/dist/trace-replay/index.d.ts +3 -2
  137. package/dist/trace-replay/index.js +3 -3
  138. package/dist/{types-D7u9DkH7.d.ts → types-XS_miRnB.d.ts} +1 -1
  139. package/dist/with-deadline/index.d.ts +2 -1
  140. package/dist/with-deadline/index.js +2 -2
  141. package/dist/with-resilience/index.d.ts +3 -2
  142. package/dist/with-resilience/index.js +6 -6
  143. package/dist/with-telemetry/index.d.ts +2 -1
  144. package/dist/with-telemetry/index.js +2 -2
  145. package/dist/work-queue/adapter.d.ts +3 -2
  146. package/dist/work-queue/index.d.ts +3 -2
  147. package/dist/work-queue/ops.d.ts +3 -2
  148. package/dist/workflow/index.d.ts +4 -3
  149. package/package.json +11 -4
  150. package/dist/chunk-5EHLEUTL.js.map +0 -1
  151. package/dist/chunk-B5VXOFMZ.js.map +0 -1
  152. package/dist/chunk-JER5O7PQ.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { C as Cmd } from './core-Bjc0bS8j.js';
1
+ import { C as Cmd } from './core-Co0LWkIA.js';
2
2
 
3
3
  /**
4
4
  * @demlik/tea/do — the durable pending-effects ledger (substrate primitive #1).
@@ -1,6 +1,7 @@
1
- import { R as Runtime, S as Store } from '../runtime-types-Bxc637bp.js';
1
+ import { R as Runtime, S as Store } from '../runtime-types-CNLmhWif.js';
2
2
  import 'better-result';
3
- import '../core-Bjc0bS8j.js';
3
+ import '../core-Co0LWkIA.js';
4
+ import 'zod';
4
5
 
5
6
  /**
6
7
  * Runtime bridge — expose a `@demlik/tea` runtime running in one chrome context
@@ -1,7 +1,7 @@
1
- export { bridgeClient, bridgeRuntime, bridgeTabClient, passThroughMsg } from '../chunk-A56OR5RF.js';
1
+ export { bridgeClient, bridgeRuntime, bridgeTabClient, passThroughMsg } from '../chunk-L57ZOT5K.js';
2
2
  import '../chunk-G5E74IJB.js';
3
- import '../chunk-5EHLEUTL.js';
4
- import '../chunk-B5VXOFMZ.js';
3
+ import '../chunk-ZSUUOEPL.js';
4
+ import '../chunk-OOYD44JI.js';
5
5
 
6
6
  // src/extension/index.ts
7
7
  var MALFORMED = "chromeStorageStore: stored value is not a string";
@@ -1,7 +1,7 @@
1
- import { bridgeClient, passThroughMsg } from '../chunk-A56OR5RF.js';
1
+ import { bridgeClient, passThroughMsg } from '../chunk-L57ZOT5K.js';
2
2
  import '../chunk-G5E74IJB.js';
3
- import '../chunk-5EHLEUTL.js';
4
- import '../chunk-B5VXOFMZ.js';
3
+ import '../chunk-ZSUUOEPL.js';
4
+ import '../chunk-OOYD44JI.js';
5
5
  import { useRef, useSyncExternalStore, useEffect, useCallback, createContext, useMemo, useContext } from 'react';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
@@ -1,5 +1,6 @@
1
- import { S as Sub } from '../../core-Bjc0bS8j.js';
2
- import { S as SubscribeHandler } from '../../types-D7u9DkH7.js';
1
+ import { S as Sub } from '../../core-Co0LWkIA.js';
2
+ import { S as SubscribeHandler } from '../../types-XS_miRnB.js';
3
+ import 'zod';
3
4
 
4
5
  type AlarmSubData = {
5
6
  alarmName: string;
@@ -1,6 +1,7 @@
1
- import { C as Cmd, a as Port } from '../core-Bjc0bS8j.js';
1
+ import { C as Cmd, a as Port } from '../core-Co0LWkIA.js';
2
2
  import { QueueItem } from '../work-queue/index.js';
3
- import '../runtime-types-Bxc637bp.js';
3
+ import 'zod';
4
+ import '../runtime-types-CNLmhWif.js';
4
5
  import 'better-result';
5
6
 
6
7
  /**
@@ -1,4 +1,4 @@
1
- import { k as EventOrigin } from './graph-CcjWZVrd.js';
1
+ import { k as EventOrigin } from './graph-B3L5e0N1.js';
2
2
 
3
3
  /** `TASK_1.DONE` and `DONE` are the same event; the namespace is presentation. */
4
4
  declare const bareEvent: (event: string) => string;
@@ -1,4 +1,4 @@
1
- import { C as Cmd } from './core-Bjc0bS8j.js';
1
+ import { C as Cmd } from './core-Co0LWkIA.js';
2
2
 
3
3
  /**
4
4
  * A type smuggled through a value position. `ty<{ at: number }>()` is an empty
@@ -1,7 +1,8 @@
1
1
  import { IdempotencyStore } from '../idempotency/index.js';
2
- import { C as Cmd } from '../core-Bjc0bS8j.js';
2
+ import { C as Cmd } from '../core-Co0LWkIA.js';
3
3
  import { QueueItem } from '../work-queue/index.js';
4
- import '../runtime-types-Bxc637bp.js';
4
+ import 'zod';
5
+ import '../runtime-types-CNLmhWif.js';
5
6
  import 'better-result';
6
7
 
7
8
  /**
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { B as BootingRuntime, C as CtxArg, S as Store, O as OnError, a as Supervision } from './runtime-types-Bxc637bp.js';
2
- export { b as Branded, D as DispatchDiscardedError, c as DispatchSettle, d as DisposeTimeoutNotice, F as FoldRefusal, I as IdentityDropNotice, P as PortNameCollisionError, Q as QuiescenceTimeoutError, R as Runtime, e as RuntimeDiscardNotice, f as RuntimeDiscardedError, g as RuntimeErrorContext, h as RuntimeErrorPhase, i as RuntimeRef, j as Schema, k as SubIdCollisionError, l as SupervisionStrategy, _ as __resetPortRegistry, m as absurd, n as asReducer, o as defineMachine, p as definePort, q as noop, r as replay, s as schemaMigrate, t as tryApplyCell, u as tryFoldMsgs, v as tryInterpret, w as wrapDetached } from './runtime-types-Bxc637bp.js';
3
- import { C as Cmd, S as Sub, M as Machine } from './core-Bjc0bS8j.js';
4
- export { d as ContextFree, D as DepKeyedSub, e as Dispose, f as Identity, I as Interpret, c as InterpretDetached, g as MachineShape, N as NoCellError, h as NoCtx, a as Port, P as PortEmitter, R as Reducer, b as SubId, i as Subscribe, j as SyncReturn, T as Transitions, U as UpdateForm, k as acceptsOf, l as applyCell, m as applyCellChecked, n as describeMachine, o as detectUpdateForm, p as foldMsgs, q as foldUpdates, r as formOf, s as msgKeysOf, t as structuralHash, u as subId } from './core-Bjc0bS8j.js';
1
+ import { B as BootingRuntime, C as CtxArg, S as Store, O as OnError, a as Supervision } from './runtime-types-CNLmhWif.js';
2
+ export { b as Branded, D as DispatchDiscardedError, c as DispatchSettle, d as DisposeTimeoutNotice, F as FoldRefusal, I as IdentityDropNotice, P as PortNameCollisionError, Q as QuiescenceTimeoutError, R as Runtime, e as RuntimeDiscardNotice, f as RuntimeDiscardedError, g as RuntimeErrorContext, h as RuntimeErrorPhase, i as RuntimeRef, j as Schema, k as SubIdCollisionError, l as SupervisionStrategy, _ as __resetPortRegistry, m as absurd, n as asReducer, o as defineMachine, p as definePort, q as noop, r as replay, s as schemaMigrate, t as settle, u as tryApplyCell, v as tryFoldMsgs, w as tryInterpret, x as wrapDetached } from './runtime-types-CNLmhWif.js';
3
+ import { C as Cmd, S as Sub, M as Machine, R as RequiredCtx } from './core-Co0LWkIA.js';
4
+ export { A as AnyCmdDef, h as CmdDef, i as CmdInput, e as CmdOf, j as CmdValue, k as ContextFree, D as DepKeyedSub, l as Dispose, E as ErrOf, m as ErrorsOf, n as Identity, I as Interpret, g as InterpretDetached, o as MachineShape, p as MalformedResult, q as Needs, f as NeedsOf, N as NoCellError, r as NoCtx, O as OkOf, a as Port, P as PortEmitter, c as Reducer, d as Settled, s as SettledErr, t as SettledOk, b as SubId, u as Subscribe, v as SyncReturn, w as Tagged, x as TaggedError, T as Transitions, U as UpdateForm, y as acceptsOf, z as applyCell, B as applyCellChecked, F as describeMachine, G as detectUpdateForm, H as foldMsgs, J as foldUpdates, K as formOf, L as msgKeysOf, Q as structuralHash, V as subId } from './core-Co0LWkIA.js';
5
5
  import 'better-result';
6
+ import 'zod';
6
7
 
7
8
  interface HistoryTracker<S, M extends {
8
9
  type: string;
@@ -60,9 +61,16 @@ declare function run<S, M extends {
60
61
  type: string;
61
62
  }, C extends Cmd, U extends Sub, Ctx, E extends {
62
63
  type: string;
63
- } = never>(machine: Machine<S, M, C, U, Ctx>, opts: CtxArg<Ctx> & {
64
+ } = never>(machine: Machine<S, M, C, U, Ctx>, opts: CtxArg<Ctx & RequiredCtx<C>> & {
64
65
  store?: Store<S>;
65
66
  onError?: OnError;
67
+ /**
68
+ * The clock that stamps `at` on a `Cmd.define`d effect's settled Msg at
69
+ * the interpret edge. Defaults to `Date.now`. Inject a fixed one for a
70
+ * deterministic run; a `replay` log carries its own `at`s and never reads
71
+ * this.
72
+ */
73
+ clock?: () => number;
66
74
  /**
67
75
  * The SEMANTIC event projector. Maps one APPLIED transition `(msg, state)`
68
76
  * to zero-or-more public events of `E`; `[]` skips the transition. Maps the
@@ -104,4 +112,4 @@ declare function run<S, M extends {
104
112
  __idleCap?: number;
105
113
  }): BootingRuntime<S, M, E>;
106
114
 
107
- export { BootingRuntime, Cmd, CtxArg, type HistoryTracker, Machine, OnError, Store, Sub, Supervision, historyTracker, run };
115
+ export { BootingRuntime, Cmd, CtxArg, type HistoryTracker, Machine, OnError, RequiredCtx, Store, Sub, Supervision, historyTracker, run };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { DispatchDiscardedError, DisposeTimeoutNotice, IdentityDropNotice, PortNameCollisionError, QuiescenceTimeoutError, RuntimeDiscardNotice, RuntimeDiscardedError, SubIdCollisionError, __resetPortRegistry, absurd, asReducer, defineMachine, definePort, historyTracker, noop, replay, run, schemaMigrate, tryApplyCell, tryFoldMsgs, tryInterpret, wrapDetached } from './chunk-5EHLEUTL.js';
2
- export { Cmd, NoCellError, acceptsOf, applyCell, applyCellChecked, describeMachine, detectUpdateForm, foldMsgs, foldUpdates, formOf, msgKeysOf, structuralHash, subId } from './chunk-B5VXOFMZ.js';
1
+ export { DispatchDiscardedError, DisposeTimeoutNotice, IdentityDropNotice, PortNameCollisionError, QuiescenceTimeoutError, RuntimeDiscardNotice, RuntimeDiscardedError, SubIdCollisionError, __resetPortRegistry, absurd, asReducer, defineMachine, definePort, historyTracker, noop, replay, run, schemaMigrate, settle, tryApplyCell, tryFoldMsgs, tryInterpret, wrapDetached } from './chunk-ZSUUOEPL.js';
2
+ export { Cmd, NoCellError, acceptsOf, applyCell, applyCellChecked, describeMachine, detectUpdateForm, foldMsgs, foldUpdates, formOf, msgKeysOf, structuralHash, subId } from './chunk-OOYD44JI.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,373 @@
1
+ /**
2
+ * journal sync — a remote journal and per-remote cursors, so two local journals
3
+ * meet in one order.
4
+ *
5
+ * `Journal<R>` (`./index`) is the LOCAL append-only log a single machine replays
6
+ * from. This is the second half: a **remote** journal that many local journals
7
+ * push their appends into and pull everyone else's out of, with the remote
8
+ * assigning the one `seq` that counts. Records are append-only, so there is
9
+ * nothing to merge — the fold over the remote's order *is* the merge. This is
10
+ * the network-in-the-middle twin of the append-then-fold shape already proven
11
+ * in-repo by `src/do/event-sourced-store.ts` (append each record to a
12
+ * monotonically-keyed log; rebuild state by folding the log via `replay`).
13
+ *
14
+ * The three moving parts:
15
+ * - `RemoteJournal<R>` — the append-only remote. `push` sends the records a
16
+ * client has not yet had acked and gets back the `seq` the remote assigned
17
+ * each; `pull` reads everyone's records after a given `seq`. One monotonic
18
+ * `seq` per stream, assigned by the remote, is the whole ordering contract.
19
+ * - a per-`(client, stream)` **cursor** (`CursorStore`) kept locally — the
20
+ * last remote `seq` a client has pulled — so `push`/`pull` resume
21
+ * incrementally instead of re-sending or re-reading the whole stream.
22
+ * - `SyncClient<R>` — a local `Journal<R>` joined to a `RemoteJournal<R>`
23
+ * through that cursor and a stable author identity. A local `append` is
24
+ * PROVISIONAL (it has a local order but no remote `seq`) until `sync` pushes
25
+ * it and pulls it back under the `seq` the remote assigned.
26
+ *
27
+ * Domain-blind and auth-blind: the remote takes an opaque `token` and an opaque
28
+ * `stream` key and does nothing with the token — who-may-push-to-which-stream is
29
+ * the host's concern, not this primitive's (the same way the local `Journal` is
30
+ * blind to what a record means). Interface shape follows Effect
31
+ * `unstable/eventlog` `EventJournal` (`writeFromRemote`, per-remote cursors, a
32
+ * `changes` stream) as prior art, not a dependency.
33
+ */
34
+
35
+ /**
36
+ * A remote-assigned order key. Like a local `Seq` it starts at 1 and increments
37
+ * by one per record within a stream, but it is assigned by the REMOTE — it is
38
+ * the authoritative order every client folds over, not any one client's local
39
+ * append order.
40
+ */
41
+ type RemoteSeq = number;
42
+ /**
43
+ * A record paired with the stable identity of whoever authored it. Author
44
+ * identity is the one fact a team-mode record needs that a solo record does not:
45
+ * once records from many clients interleave in the remote's order, the fold
46
+ * still has to know who wrote each. It is opaque — a string the host assigns
47
+ * meaning to (a device id, a user handle) — never interpreted here.
48
+ */
49
+ interface AuthoredRecord<R> {
50
+ /** The stable identity of the client that authored `record`. */
51
+ readonly author: string;
52
+ /** The domain record itself; this primitive knows nothing of its shape. */
53
+ readonly record: R;
54
+ }
55
+ /**
56
+ * One record as it lives on the remote: the `seq` the remote assigned, the
57
+ * `author` that wrote it, the `stream` it belongs to, and the record. This is
58
+ * the entry every client pulls and folds; two clients that pull the same stream
59
+ * see identical `RemoteEntry`s in identical `seq` order, which is what lets
60
+ * their folds agree.
61
+ */
62
+ interface RemoteEntry<R> {
63
+ /** The stream this entry belongs to. */
64
+ readonly stream: string;
65
+ /** The remote-assigned order key — 1-based, gap-free, monotonic per stream. */
66
+ readonly seq: RemoteSeq;
67
+ /** The stable identity of the client that authored the record. */
68
+ readonly author: string;
69
+ /** The domain record. */
70
+ readonly record: R;
71
+ }
72
+ /** A `push` — the records a client wants acked, presented under its token. */
73
+ interface PushRequest<R> {
74
+ /**
75
+ * An opaque credential the host's remote may check. This primitive does
76
+ * nothing with it: authorization (who may push to which stream) is the host's
77
+ * concern, deliberately out of scope here.
78
+ */
79
+ readonly token: unknown;
80
+ /** The opaque stream key to append to. */
81
+ readonly stream: string;
82
+ /**
83
+ * The records to append, in the client's local order. Normally these are the
84
+ * client's own appends made since its last successful push — the incremental
85
+ * tail, not the whole stream.
86
+ */
87
+ readonly records: ReadonlyArray<AuthoredRecord<R>>;
88
+ }
89
+ /** The remote's answer to a `push`: the `seq` it assigned each record, in order. */
90
+ interface PushResult {
91
+ /**
92
+ * The remote `seq` assigned to each record of the request, in the same order.
93
+ * `seqs[i]` is the seq of `records[i]`. A client does not need to fold these —
94
+ * it learns the full ordered stream (its own records included) through `pull`,
95
+ * which is the single reader of converged state.
96
+ */
97
+ readonly seqs: ReadonlyArray<RemoteSeq>;
98
+ }
99
+ /** A `pull` — read everyone's records after a `seq` the client already has. */
100
+ interface PullRequest {
101
+ /** The opaque credential; ignored here, see {@link PushRequest.token}. */
102
+ readonly token: unknown;
103
+ /** The opaque stream key to read. */
104
+ readonly stream: string;
105
+ /**
106
+ * Return only entries with `seq` strictly greater than this. A client passes
107
+ * its cursor (the last `seq` it pulled), so it reads only what is new — never
108
+ * re-reading the whole stream. `0` (the cursor's initial value) reads from the
109
+ * start.
110
+ */
111
+ readonly since: RemoteSeq;
112
+ }
113
+ /** The remote's answer to a `pull`: the new entries, in `seq` order. */
114
+ interface PullResult<R> {
115
+ /** Every entry with `seq > since`, in ascending `seq` order. */
116
+ readonly entries: ReadonlyArray<RemoteEntry<R>>;
117
+ }
118
+ /**
119
+ * An append-only remote journal: many clients push into it, all pull from it,
120
+ * and it assigns the one monotonic `seq` per stream that every client's fold
121
+ * agrees over. It is the network-in-the-middle: a real one is a server; this
122
+ * interface is what a client talks to, host- and transport-blind.
123
+ *
124
+ * The remote never merges and never resolves conflicts — records are
125
+ * append-only, so its only job is to assign an honest total order. That order
126
+ * is enough: two clients that both push and both pull fold the same sequence and
127
+ * reach the same state (the append-then-fold result proven in phoenix spike
128
+ * #6673, reused here rather than reinvented).
129
+ */
130
+ interface RemoteJournal<R> {
131
+ /**
132
+ * Append `records` to `stream` durably and return the `seq` assigned to each,
133
+ * in order. Concurrent pushes to one stream are serialised into a single total
134
+ * order — the seq assignment is the remote's whole ordering guarantee.
135
+ */
136
+ push(request: PushRequest<R>): Promise<PushResult>;
137
+ /**
138
+ * Read every entry of `stream` with `seq` strictly greater than
139
+ * `request.since`, in ascending `seq` order. Empty when the client is already
140
+ * caught up.
141
+ */
142
+ pull(request: PullRequest): Promise<PullResult<R>>;
143
+ }
144
+ /**
145
+ * An in-memory `RemoteJournal<R>` — the standard test/reference substrate,
146
+ * mirroring `memoryStore` (`@demlik/tea/mem`) and `memoryJournal` (`./index`).
147
+ *
148
+ * It is built ON `memoryJournal`: the remote's authoritative `seq` assignment IS
149
+ * a local `Journal`'s per-stream total order. `push` appends each record under
150
+ * the stream's lock (so concurrent pushes serialise into one order and never
151
+ * race the seq), and `pull` is `list` filtered past the client's cursor. The
152
+ * seq machinery is `makeJournal`'s, reused — this substrate reinvents none of
153
+ * it, exactly as the issue's seam was designed to be consumed.
154
+ *
155
+ * The `token` is accepted and ignored: this substrate enforces no authorization,
156
+ * because who-may-push-to-which-stream is the host's concern, out of scope here.
157
+ */
158
+ declare function memoryRemoteJournal<R>(): RemoteJournal<R>;
159
+ /**
160
+ * Where a client keeps its per-`(client, stream)` cursor — the last remote `seq`
161
+ * it has pulled. Kept LOCALLY (the client's own disk/memory), never on the
162
+ * remote, so `push`/`pull` resume incrementally after a restart instead of
163
+ * re-reading the whole stream. `get` returns `0` for a stream never pulled.
164
+ */
165
+ interface CursorStore {
166
+ /** The last remote `seq` pulled for `stream`, or `0` if none yet. */
167
+ get(stream: string): Promise<RemoteSeq>;
168
+ /** Record `seq` as the last remote `seq` pulled for `stream`. */
169
+ set(stream: string, seq: RemoteSeq): Promise<void>;
170
+ }
171
+ /**
172
+ * An in-memory `CursorStore`, mirroring `memoryStore`. A durable client swaps in
173
+ * a file- or DB-backed one so its cursor survives a restart; the semantics are
174
+ * identical.
175
+ */
176
+ declare function memoryCursorStore(): CursorStore;
177
+ /** How to build a {@link SyncClient}. */
178
+ interface SyncClientOptions<R> {
179
+ /** The remote every push/pull talks to. */
180
+ readonly remote: RemoteJournal<R>;
181
+ /**
182
+ * This client's stable author identity, stamped on every record it appends —
183
+ * the one fact team mode needs that solo mode does not.
184
+ */
185
+ readonly author: string;
186
+ /**
187
+ * The opaque credential presented on every push/pull. Optional because this
188
+ * primitive never checks it; a host that runs an authorizing remote supplies
189
+ * it here.
190
+ */
191
+ readonly token?: unknown;
192
+ /**
193
+ * The client's LOCAL append-only journal — its own provisional appends live
194
+ * here. Defaults to a `memoryJournal`; a durable client passes a `fileJournal`
195
+ * (or any `Journal<R>`), which is the #30 substrate seam this consumes.
196
+ */
197
+ readonly local?: LocalJournal<R>;
198
+ /**
199
+ * Where the per-stream pull cursor lives. Defaults to a `memoryCursorStore`; a
200
+ * durable client passes one backed by its own storage.
201
+ */
202
+ readonly cursors?: CursorStore;
203
+ }
204
+ /**
205
+ * The slice of a local `Journal<R>` a `SyncClient` drives — its own provisional
206
+ * appends and reading them back in local order. This is structurally the #30
207
+ * `Journal<R>` interface narrowed to what sync needs, so a `memoryJournal` or a
208
+ * `fileJournal` satisfies it as-is.
209
+ */
210
+ interface LocalJournal<R> {
211
+ append(stream: string, record: R): Promise<{
212
+ seq: number;
213
+ }>;
214
+ list(stream: string): Promise<ReadonlyArray<JournalEntry<R>>>;
215
+ }
216
+ /**
217
+ * A local `Journal` joined to a `RemoteJournal` through a cursor and an author
218
+ * identity. It is what makes two local journals "meet in one order": each
219
+ * appends offline, both `sync`, and both converge on the remote's order.
220
+ */
221
+ interface SyncClient<R> {
222
+ /**
223
+ * Append `record` to the client's LOCAL journal. The append is PROVISIONAL: it
224
+ * has a local order immediately, but no remote `seq` — and so no place in the
225
+ * converged order — until a later `sync` pushes it and pulls it back. Resolves
226
+ * once the local append is durable.
227
+ */
228
+ append(stream: string, record: R): Promise<void>;
229
+ /**
230
+ * The client's local appends for `stream` that have not yet been pushed — the
231
+ * provisional tail. Empty right after a successful `sync`.
232
+ */
233
+ pending(stream: string): Promise<ReadonlyArray<AuthoredRecord<R>>>;
234
+ /**
235
+ * Reconcile `stream` with the remote: PUSH every local append not yet pushed,
236
+ * then PULL every remote entry after the cursor and fold it into the converged
237
+ * log, advancing the cursor. One `sync` may not see records a peer pushes
238
+ * concurrently (they may land after this pull); a second `sync` — with nothing
239
+ * new to push — pulls them, which is how two racing clients converge.
240
+ */
241
+ sync(stream: string): Promise<void>;
242
+ /**
243
+ * The converged log for `stream`: every entry the client has pulled, in remote
244
+ * `seq` order. This is the fold's input — reducing over it yields the client's
245
+ * state. After both of two racing clients sync to quiescence, their `log`s are
246
+ * identical, which is the convergence guarantee.
247
+ */
248
+ log(stream: string): ReadonlyArray<RemoteEntry<R>>;
249
+ }
250
+ /**
251
+ * Build a {@link SyncClient} over a remote, an author identity, and (optionally)
252
+ * a local journal and cursor store.
253
+ *
254
+ * The client holds two watermarks per stream: how many of its own local appends
255
+ * it has PUSHED (so a re-`sync` sends only the new tail), and — in the
256
+ * `CursorStore` — the last remote `seq` it has PULLED (so it reads only what is
257
+ * new). Its converged `log` is built solely from `pull`, so `pull` is the single
258
+ * source of converged truth; a client learns even its OWN records' remote order
259
+ * by pulling them back.
260
+ */
261
+ declare function makeSyncClient<R>(options: SyncClientOptions<R>): SyncClient<R>;
262
+
263
+ /**
264
+ * @packageDocumentation
265
+ * @demlik/tea/journal — an append-only, ordered record log for `@demlik/tea`.
266
+ *
267
+ * The log a "durable, replayable state machine" replays from. tea already ships
268
+ * the log's neighbours — `fileStore`/`memoryStore` (`Store<S>`: snapshot with
269
+ * whole-load / whole-save), `recorder` (JSONL debug traces), `durable-effects`
270
+ * (`foldLedger` over an owed-effect ledger) — but not the log itself, so every
271
+ * consumer hand-rolled it. This is that log, domain-blind: a `Journal<R>` over
272
+ * an opaque record `R`, with no pipeline/ledger vocabulary of its own.
273
+ *
274
+ * Three operations carry the contract:
275
+ * - `append(stream, record)` — durable before it returns, assigning a
276
+ * per-stream total-order `seq` (1, 2, 3, …). Concurrent appenders to one
277
+ * stream converge on one order; the lock's only job is an honest order key.
278
+ * - `list(stream)` — every entry of a stream in `seq` order.
279
+ * - `changes(listener)` — a subscription over appends made through this
280
+ * instance after subscribing.
281
+ *
282
+ * `withLock(stream, fx)` runs `fx` with exclusive access to a stream, so a
283
+ * read-decide-append sequence is atomic against other writers. It is
284
+ * re-entrant for the same stream: an `append` inside `fx` does not deadlock on
285
+ * the lock `fx` already holds.
286
+ *
287
+ * The substrate is a `JournalBackend<R>` — how a stream is read, how one record
288
+ * is appended durably, and how a stream is locked across processes.
289
+ * `makeJournal` wires the domain-blind orchestration (per-stream serialisation,
290
+ * `seq` assignment, `changes` fan-out) over any backend. `memoryJournal` is the
291
+ * in-process backend that mirrors `memoryStore` for tests; the Node file
292
+ * backend (`fileJournal`) homes in `@demlik/tea/node` beside `fileStore`.
293
+ *
294
+ * Interface shape follows Effect `unstable/eventlog` `EventJournal`
295
+ * (`entries`/`write`/`changes`/`withLock`) as prior art, not a dependency.
296
+ */
297
+ /** A per-stream total-order key. Starts at 1 and increments by one per append. */
298
+ type Seq = number;
299
+ /** One appended record, tagged with its stream and its per-stream `seq`. */
300
+ interface JournalEntry<R> {
301
+ readonly stream: string;
302
+ readonly seq: Seq;
303
+ readonly record: R;
304
+ }
305
+ /**
306
+ * An append-only, ordered record log over an opaque record `R`.
307
+ *
308
+ * Domain-blind: it knows nothing of what a record means. Ordering, durability
309
+ * and the honest order key are its whole contract.
310
+ */
311
+ interface Journal<R> {
312
+ /**
313
+ * Append `record` to `stream`, durable before the promise resolves, and
314
+ * resolve with the `seq` it was assigned — the next integer in the stream's
315
+ * total order.
316
+ */
317
+ append(stream: string, record: R): Promise<{
318
+ seq: Seq;
319
+ }>;
320
+ /** Every entry of `stream`, in `seq` order. Empty for an unwritten stream. */
321
+ list(stream: string): Promise<ReadonlyArray<JournalEntry<R>>>;
322
+ /**
323
+ * Subscribe to appends made through this instance after this call. Returns an
324
+ * unsubscribe. Cross-process appends are not delivered — a cross-process
325
+ * subscription is a polling concern this log leaves to its consumer.
326
+ */
327
+ changes(listener: (entry: JournalEntry<R>) => void): () => void;
328
+ /**
329
+ * Run `fx` with exclusive access to `stream` — the in-process mutex against
330
+ * other callers here, the backend lock against other processes. Re-entrant
331
+ * for the same stream, so an `append` (or nested `withLock`) inside `fx` runs
332
+ * under the lock this call already holds rather than deadlocking on it.
333
+ */
334
+ withLock<A>(stream: string, fx: () => Promise<A>): Promise<A>;
335
+ }
336
+ /**
337
+ * The substrate a `Journal<R>` is built over. Everything host-specific lives
338
+ * here; `makeJournal` owns the host-blind rest.
339
+ *
340
+ * `append` is always invoked under `lock` for the same stream, so a backend
341
+ * assigns `seq` from `read().length + 1` without racing itself.
342
+ */
343
+ interface JournalBackend<R> {
344
+ /** Every entry of `stream` in `seq` order; empty for an unwritten stream. */
345
+ read(stream: string): Promise<ReadonlyArray<JournalEntry<R>>>;
346
+ /**
347
+ * Persist `record` as the next entry of `stream`, durable before resolving,
348
+ * and resolve with the entry it wrote. Invoked only while `lock` holds the
349
+ * stream, so `seq` is safely the current length plus one.
350
+ */
351
+ append(stream: string, record: R): Promise<JournalEntry<R>>;
352
+ /** Run `fx` while holding `stream`'s cross-process lock. */
353
+ lock<A>(stream: string, fx: () => Promise<A>): Promise<A>;
354
+ }
355
+ /**
356
+ * Build a `Journal<R>` over `backend`. Owns the host-blind half: per-stream
357
+ * serialisation, re-entrant exclusion, and the `changes` fan-out. `append` and
358
+ * `withLock` both route through `exclusive`, which holds the in-process mutex
359
+ * and the backend lock for one stream and is re-entrant for that stream within
360
+ * a single call chain.
361
+ */
362
+ declare function makeJournal<R>(backend: JournalBackend<R>): Journal<R>;
363
+ /**
364
+ * An in-process `Journal<R>` — the standard test substrate, mirroring
365
+ * `memoryStore` from `@demlik/tea/mem`. Reference semantics: a record handed to
366
+ * `append` is stored by reference, exactly as `memoryStore` stores state. No
367
+ * cross-process lock is needed — a single process owns the whole log — so the
368
+ * backend lock is identity and `makeJournal`'s in-process mutex is the only
369
+ * ordering guarantee.
370
+ */
371
+ declare function memoryJournal<R>(): Journal<R>;
372
+
373
+ export { type AuthoredRecord, type CursorStore, type Journal, type JournalBackend, type JournalEntry, type LocalJournal, type PullRequest, type PullResult, type PushRequest, type PushResult, type RemoteEntry, type RemoteJournal, type RemoteSeq, type Seq, type SyncClient, type SyncClientOptions, makeJournal, makeSyncClient, memoryCursorStore, memoryJournal, memoryRemoteJournal };
@@ -0,0 +1,3 @@
1
+ export { makeJournal, makeSyncClient, memoryCursorStore, memoryJournal, memoryRemoteJournal } from '../chunk-XGELA764.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1,10 +1,11 @@
1
- import { C as Cmd } from '../core-Bjc0bS8j.js';
1
+ import { C as Cmd } from '../core-Co0LWkIA.js';
2
2
  import { RunCmd, SucceedMsg, FailMsg, ResilientState } from '../resilient-call/index.js';
3
3
  import { RetryPolicy } from '../retry-backoff/index.js';
4
4
  import { DeadlineExceeded, DeadlineSub } from '../deadline/index.js';
5
5
  export { deadlineSub, subscribeDeadline } from '../deadline/index.js';
6
+ import 'zod';
6
7
  import '../cache/index.js';
7
- import '../types-D7u9DkH7.js';
8
+ import '../types-XS_miRnB.js';
8
9
  import '../circuit-breaker/index.js';
9
10
  import '../protocol-B5YmJr0d.js';
10
11
  import '../rate-limit/index.js';
@@ -1,16 +1,16 @@
1
- export { createLlmCall, liftLlmCall } from '../chunk-ND3DH6KM.js';
2
- import '../chunk-EUF7XOEE.js';
1
+ export { createLlmCall, liftLlmCall } from '../chunk-COS5MSTO.js';
2
+ import '../chunk-4KLG43GY.js';
3
3
  import '../chunk-JELSZN25.js';
4
- export { deadlineSub, subscribeDeadline } from '../chunk-JGVL3WPL.js';
4
+ import '../chunk-RH5EFRVJ.js';
5
+ export { deadlineSub, subscribeDeadline } from '../chunk-DGE4PV4A.js';
5
6
  import '../chunk-Q2UM7BXU.js';
6
7
  import '../chunk-S2EGRPCM.js';
7
8
  import '../chunk-UF4MZSLT.js';
8
- import '../chunk-7SVIRMC6.js';
9
- import '../chunk-3JU6657S.js';
9
+ import '../chunk-G5E74IJB.js';
10
+ import '../chunk-VYFAZN3F.js';
10
11
  import '../chunk-2YFLOCWX.js';
11
12
  import '../chunk-ZJ5AOYBH.js';
12
- import '../chunk-G5E74IJB.js';
13
- import '../chunk-5EHLEUTL.js';
14
- import '../chunk-B5VXOFMZ.js';
13
+ import '../chunk-ZSUUOEPL.js';
14
+ import '../chunk-OOYD44JI.js';
15
15
  //# sourceMappingURL=index.js.map
16
16
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { C as Cmd, I as Interpret, M as Machine } from './core-Bjc0bS8j.js';
1
+ import { C as Cmd, I as Interpret, M as Machine } from './core-Co0LWkIA.js';
2
2
  import { ModelFactory, Schema, MessageLoader, LlmCall, LlmOk, LlmErr, LlmRunCmd, LlmSucceedMsg, LlmFailMsg, LlmTimerMsg, LlmCallPorts } from './llm-call/index.js';
3
3
  import { MonitoredRunState, RunFailure, MonitoredRunCmd } from './monitored-run/index.js';
4
4
  import { M as MsgType } from './protocol-B5YmJr0d.js';
@@ -1,4 +1,5 @@
1
- import { C as Cmd, S as Sub, M as Machine } from '../core-Bjc0bS8j.js';
1
+ import { C as Cmd, S as Sub, M as Machine } from '../core-Co0LWkIA.js';
2
+ import 'zod';
2
3
 
3
4
  /**
4
5
  * Sanitize a discriminant string into a Mermaid-safe node identifier.
@@ -1,7 +1,7 @@
1
1
  import { safeId, safeLabel } from '../chunk-UOC2PL46.js';
2
2
  export { safeId, safeLabel } from '../chunk-UOC2PL46.js';
3
- import '../chunk-5EHLEUTL.js';
4
- import { formOf } from '../chunk-B5VXOFMZ.js';
3
+ import '../chunk-ZSUUOEPL.js';
4
+ import { formOf } from '../chunk-OOYD44JI.js';
5
5
 
6
6
  // src/machine-viz/index.ts
7
7
  function toMermaid(machine, opts = {}) {
@@ -1,6 +1,7 @@
1
- import { S as Store } from '../runtime-types-Bxc637bp.js';
1
+ import { S as Store } from '../runtime-types-CNLmhWif.js';
2
2
  import 'better-result';
3
- import '../core-Bjc0bS8j.js';
3
+ import '../core-Co0LWkIA.js';
4
+ import 'zod';
4
5
 
5
6
  /**
6
7
  * @packageDocumentation
@@ -1,10 +1,11 @@
1
1
  import { DeadlineExceeded, DeadlineSub } from '../deadline/index.js';
2
2
  export { deadlineSub, subscribeDeadline } from '../deadline/index.js';
3
- import { I as Interpret, C as Cmd } from '../core-Bjc0bS8j.js';
3
+ import { I as Interpret, C as Cmd } from '../core-Co0LWkIA.js';
4
4
  import { SnapshotWriteCmd, SnapshotState, SnapshotStore, SnapshotSavedMsg, SnapshotFailedMsg, SnapshotLoadedMsg, SnapshotLoadFailedMsg, SnapshotLoadCmd } from '../snapshot/index.js';
5
5
  import { QueueItem } from '../work-queue/index.js';
6
- import '../types-D7u9DkH7.js';
7
- import '../runtime-types-Bxc637bp.js';
6
+ import '../types-XS_miRnB.js';
7
+ import 'zod';
8
+ import '../runtime-types-CNLmhWif.js';
8
9
  import 'better-result';
9
10
 
10
11
  /**
@@ -1,10 +1,10 @@
1
- export { createMonitoredRun, liftRun } from '../chunk-WLGO64WC.js';
2
- import '../chunk-7V4EVLZA.js';
3
- export { deadlineSub, subscribeDeadline } from '../chunk-JGVL3WPL.js';
1
+ export { createMonitoredRun, liftRun } from '../chunk-DMYGQB4O.js';
2
+ import '../chunk-O4MVQTEJ.js';
3
+ export { deadlineSub, subscribeDeadline } from '../chunk-DGE4PV4A.js';
4
4
  import '../chunk-MU6MCIAC.js';
5
5
  import '../chunk-FV3Z5MBE.js';
6
6
  import '../chunk-2YFLOCWX.js';
7
- import '../chunk-5EHLEUTL.js';
8
- import '../chunk-B5VXOFMZ.js';
7
+ import '../chunk-ZSUUOEPL.js';
8
+ import '../chunk-OOYD44JI.js';
9
9
  //# sourceMappingURL=index.js.map
10
10
  //# sourceMappingURL=index.js.map