@demlik/tea 0.13.0 → 0.15.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.
- package/README.md +11 -9
- package/dist/agent/index.d.ts +638 -45
- package/dist/agent/index.js +9 -19
- package/dist/{chunk-RH5EFRVJ.js → chunk-22POWGFA.js} +31 -5
- package/dist/chunk-22POWGFA.js.map +1 -0
- package/dist/{chunk-DMYGQB4O.js → chunk-3B5X7SBB.js} +23 -6
- package/dist/chunk-3B5X7SBB.js.map +1 -0
- package/dist/chunk-66PY5WYF.js +1816 -0
- package/dist/chunk-66PY5WYF.js.map +1 -0
- package/dist/{chunk-25LBDCBC.js → chunk-6IQPODUF.js} +2 -2
- package/dist/{chunk-25LBDCBC.js.map → chunk-6IQPODUF.js.map} +1 -1
- package/dist/chunk-AYS5N6WY.js +505 -0
- package/dist/chunk-AYS5N6WY.js.map +1 -0
- package/dist/{chunk-EWJP3YYP.js → chunk-HWVW4AXC.js} +3 -3
- package/dist/chunk-HWVW4AXC.js.map +1 -0
- package/dist/{chunk-O4MVQTEJ.js → chunk-L3TND7LA.js} +20 -16
- package/dist/chunk-L3TND7LA.js.map +1 -0
- package/dist/{chunk-J6527VRQ.js → chunk-LFZUK6J2.js} +3 -3
- package/dist/chunk-LFZUK6J2.js.map +1 -0
- package/dist/{chunk-D736QUGF.js → chunk-MYXFNWAJ.js} +4 -5
- package/dist/chunk-MYXFNWAJ.js.map +1 -0
- package/dist/{chunk-K575PT4S.js → chunk-PR6TB3BL.js} +15 -4
- package/dist/chunk-PR6TB3BL.js.map +1 -0
- package/dist/{chunk-YUXP55T2.js → chunk-Q5CQTBFA.js} +57 -7
- package/dist/chunk-Q5CQTBFA.js.map +1 -0
- package/dist/{batch-window/index.js → chunk-QPEVCJ5Q.js} +4 -8
- package/dist/chunk-QPEVCJ5Q.js.map +1 -0
- package/dist/chunk-TCLBCERH.js +1480 -0
- package/dist/chunk-TCLBCERH.js.map +1 -0
- package/dist/{chunk-FV3Z5MBE.js → chunk-TXN2KFHF.js} +14 -4
- package/dist/chunk-TXN2KFHF.js.map +1 -0
- package/dist/{chunk-MUUROGIH.js → chunk-V46HSVCK.js} +62 -12
- package/dist/chunk-V46HSVCK.js.map +1 -0
- package/dist/{chunk-Q2UM7BXU.js → chunk-VBDU4JL6.js} +2 -2
- package/dist/chunk-VBDU4JL6.js.map +1 -0
- package/dist/{chunk-ZVJZ72HY.js → chunk-VTQI2NHP.js} +25 -11
- package/dist/chunk-VTQI2NHP.js.map +1 -0
- package/dist/{core-Co0LWkIA.d.ts → core-DnzqWy6u.d.ts} +72 -23
- package/dist/devtools/index.d.ts +2 -2
- package/dist/devtools/index.js +207 -2
- package/dist/devtools/index.js.map +1 -1
- package/dist/do/index.d.ts +43 -29
- package/dist/do/index.js +36 -25
- package/dist/do/index.js.map +1 -1
- package/dist/{durable-effects-C6uwzjb5.d.ts → durable-effects-CWzA-o2B.d.ts} +2 -2
- package/dist/extension/index.d.ts +300 -3
- package/dist/extension/index.js +596 -5
- package/dist/extension/index.js.map +1 -1
- package/dist/flow/index.d.ts +1284 -0
- package/dist/flow/index.js +732 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/idempotency/index.d.ts +90 -116
- package/dist/idempotency/index.js +4 -1
- package/dist/index-Bc40JWVl.d.ts +131 -0
- package/dist/{batch-window/index.d.ts → index-C2DwkjlP.d.ts} +7 -12
- package/dist/index-CA_7I5g9.d.ts +806 -0
- package/dist/index-CSyMYDAB.d.ts +69 -0
- package/dist/{fan-out/index.d.ts → index-CuNO9m8i.d.ts} +7 -9
- package/dist/{debounce/index.d.ts → index-DHSUmQTR.d.ts} +7 -7
- package/dist/{recorder/index.d.ts → index-DrIRb_Ch.d.ts} +4 -7
- package/dist/index-HSYgG2Yt.d.ts +380 -0
- package/dist/{monitored-run/index.d.ts → index-KXqTRJyb.d.ts} +37 -13
- package/dist/{snapshot/index.d.ts → index-ZCMhnVKN.d.ts} +15 -78
- package/dist/index.d.ts +771 -6
- package/dist/index.js +1 -2
- package/dist/jev/index.d.ts +646 -0
- package/dist/jev/index.js +485 -0
- package/dist/jev/index.js.map +1 -0
- package/dist/machine-DGlPWCWI.d.ts +1781 -0
- package/dist/machine-viz/index.d.ts +1 -1
- package/dist/machine-viz/index.js +12 -5
- package/dist/machine-viz/index.js.map +1 -1
- package/dist/mem/index.d.ts +18 -3
- package/dist/mem/index.js +22 -2
- package/dist/mem/index.js.map +1 -1
- package/dist/node/index.d.ts +104 -6
- package/dist/node/index.js +132 -9
- package/dist/node/index.js.map +1 -1
- package/dist/{paginator → paginate}/index.d.ts +140 -6
- package/dist/paginate/index.js +7 -0
- package/dist/parity/index.d.ts +4 -10
- package/dist/parity/index.js +4 -7
- package/dist/parity/index.js.map +1 -1
- package/dist/pbt/index.d.ts +247 -5
- package/dist/pbt/index.js +124 -5
- package/dist/pbt/index.js.map +1 -1
- package/dist/{trace-replay → persistence}/index.d.ts +7 -5
- package/dist/persistence/index.js +6 -0
- package/dist/{protocol-B5YmJr0d.d.ts → protocol-D8VbH-VH.d.ts} +10 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -2
- package/dist/react/index.js.map +1 -1
- package/dist/resilience/index.d.ts +744 -0
- package/dist/resilience/index.js +657 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/retry-backoff/index.d.ts +3 -2
- package/dist/retry-backoff/index.js +1 -1
- package/dist/runtime-types-CMF13BBh.d.ts +998 -0
- package/dist/testing/index.d.ts +147 -3
- package/dist/testing/index.js +95 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/{throttled-input → timing}/index.d.ts +143 -12
- package/dist/{throttled-input → timing}/index.js +57 -12
- package/dist/timing/index.js.map +1 -0
- package/dist/{types-XS_miRnB.d.ts → types-BseNPIhr.d.ts} +1 -1
- package/dist/work-queue/index.d.ts +130 -54
- package/dist/work-queue/index.js +3 -2
- package/dist/work-queue/index.js.map +1 -1
- package/package.json +45 -218
- package/dist/authed-call/index.d.ts +0 -120
- package/dist/authed-call/index.js +0 -134
- package/dist/authed-call/index.js.map +0 -1
- package/dist/await-terminal/index.d.ts +0 -101
- package/dist/await-terminal/index.js +0 -76
- package/dist/await-terminal/index.js.map +0 -1
- package/dist/batch-window/index.js.map +0 -1
- package/dist/cache/index.d.ts +0 -152
- package/dist/cache/index.js +0 -8
- package/dist/chart/index.d.ts +0 -218
- package/dist/chart/index.js +0 -16
- package/dist/chart/index.js.map +0 -1
- package/dist/chart/inspect/index.d.ts +0 -86
- package/dist/chart/inspect/index.js +0 -5
- package/dist/chart/inspect/react.d.ts +0 -113
- package/dist/chart/inspect/react.js +0 -11
- package/dist/chart/inspect/react.js.map +0 -1
- package/dist/chart/inspect/styles.css +0 -286
- package/dist/chart/lane/index.d.ts +0 -362
- package/dist/chart/lane/index.js +0 -9
- package/dist/chart/lane/index.js.map +0 -1
- package/dist/chart/lane/react.d.ts +0 -84
- package/dist/chart/lane/react.js +0 -559
- package/dist/chart/lane/react.js.map +0 -1
- package/dist/chart/lane/server.d.ts +0 -148
- package/dist/chart/lane/server.js +0 -209
- package/dist/chart/lane/server.js.map +0 -1
- package/dist/chart/lane/styles.css +0 -498
- package/dist/chart/lane/viewer/assets/abnfDiagram-N423BO3Z-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/architectureDiagram-T3A2C74G-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/blockDiagram-VBNYF7ZC-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/c4Diagram-5PPSVZJV-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/chunk-2GRJ4B5K-HdDf8SI3.js +0 -1
- package/dist/chart/lane/viewer/assets/chunk-5RXB4S5H-CcNtpUd7.js +0 -231
- package/dist/chart/lane/viewer/assets/chunk-5VM5RSS4-BP4fRS_5.js +0 -15
- package/dist/chart/lane/viewer/assets/chunk-KBJHAD2P-DZOw7xU6.js +0 -1
- package/dist/chart/lane/viewer/assets/chunk-NSK5VX7P-CBCyTZMs.js +0 -128
- package/dist/chart/lane/viewer/assets/classDiagram-JCYQIIEL-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/classDiagram-v2-OCEON4UE-D4uAiFr8.js +0 -206
- package/dist/chart/lane/viewer/assets/cose-bilkent-JH36ORCC-DOwCrGXH.js +0 -1
- package/dist/chart/lane/viewer/assets/cynefinDiagram-MW4NZA55-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/dagre-K_PewWfS.js +0 -1
- package/dist/chart/lane/viewer/assets/dagre-VZM6K2ZE-831qZcA8.js +0 -4
- package/dist/chart/lane/viewer/assets/diagram-7IWD3JNH-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/diagram-B4RE2ZJO-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/diagram-LBJQPF4R-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/diagram-Q27KOJAE-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/diagram-UB23O5K3-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/ebnfDiagram-BXEA7PRR-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/erDiagram-JOGREHBK-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/flowDiagram-UKHOOZJN-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/ganttDiagram-PKOTCBZU-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/gitGraphDiagram-DS77QQ5N-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/index-9SkH5NA3.css +0 -1
- package/dist/chart/lane/viewer/assets/index-Bgt4sXpW.js +0 -195
- package/dist/chart/lane/viewer/assets/infoDiagram-6WML65LV-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/ishikawaDiagram-WSZJBQD7-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/journeyDiagram-NVQOT4AX-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/kanban-definition-27J2QSJJ-G7PaPzy-.js +0 -89
- package/dist/chart/lane/viewer/assets/katex-DOwCrGXH.js +0 -1
- package/dist/chart/lane/viewer/assets/mindmap-definition-FAOFIHXS-CGj9nrVk.js +0 -96
- package/dist/chart/lane/viewer/assets/path-fybaL0A-.js +0 -1
- package/dist/chart/lane/viewer/assets/pegDiagram-VL7TDLO6-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/pieDiagram-7S7Q4E2Y-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/quadrantDiagram-CIZ2JOQS-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/railroadDiagram-AXF67PYL-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/requirementDiagram-LRYGKXZP-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/sankeyDiagram-W5VNT64P-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/sequenceDiagram-SI44F4Z6-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/stateDiagram-OKZ733FA-B_88AzBS.js +0 -1
- package/dist/chart/lane/viewer/assets/stateDiagram-v2-UEYNNEHI-CR5gcgq6.js +0 -1
- package/dist/chart/lane/viewer/assets/swimlanes-SLNWSIFB-B4xK-rwg.js +0 -1
- package/dist/chart/lane/viewer/assets/swimlanesDiagram-ULZ7WXOC-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/timeline-definition-Z64GVDOM-CCv52MfY.js +0 -120
- package/dist/chart/lane/viewer/assets/vennDiagram-T6HMQDX7-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/wardleyDiagram-T6FBY63Y-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/assets/xychartDiagram-ELKLHX3M-C729LI31.js +0 -1
- package/dist/chart/lane/viewer/index.html +0 -15
- package/dist/chart/report/index.d.ts +0 -117
- package/dist/chart/report/index.js +0 -32
- package/dist/chart/report/index.js.map +0 -1
- package/dist/chunk-2YFLOCWX.js +0 -15
- package/dist/chunk-2YFLOCWX.js.map +0 -1
- package/dist/chunk-3I52QZZ5.js +0 -519
- package/dist/chunk-3I52QZZ5.js.map +0 -1
- package/dist/chunk-3ZAFFRRB.js +0 -457
- package/dist/chunk-3ZAFFRRB.js.map +0 -1
- package/dist/chunk-4EQZ76JC.js +0 -33
- package/dist/chunk-4EQZ76JC.js.map +0 -1
- package/dist/chunk-4KLG43GY.js +0 -223
- package/dist/chunk-4KLG43GY.js.map +0 -1
- package/dist/chunk-7FRZ2CT2.js +0 -424
- package/dist/chunk-7FRZ2CT2.js.map +0 -1
- package/dist/chunk-AZZLE7XR.js +0 -62
- package/dist/chunk-AZZLE7XR.js.map +0 -1
- package/dist/chunk-BYQUGDD3.js +0 -16
- package/dist/chunk-BYQUGDD3.js.map +0 -1
- package/dist/chunk-CIQG5L42.js +0 -685
- package/dist/chunk-CIQG5L42.js.map +0 -1
- package/dist/chunk-CLM6ERNO.js +0 -61
- package/dist/chunk-CLM6ERNO.js.map +0 -1
- package/dist/chunk-COS5MSTO.js +0 -88
- package/dist/chunk-COS5MSTO.js.map +0 -1
- package/dist/chunk-CRPZJVD2.js +0 -71
- package/dist/chunk-CRPZJVD2.js.map +0 -1
- package/dist/chunk-D62FDQKE.js +0 -53
- package/dist/chunk-D62FDQKE.js.map +0 -1
- package/dist/chunk-D736QUGF.js.map +0 -1
- package/dist/chunk-DGE4PV4A.js +0 -26
- package/dist/chunk-DGE4PV4A.js.map +0 -1
- package/dist/chunk-DMYGQB4O.js.map +0 -1
- package/dist/chunk-EWJP3YYP.js.map +0 -1
- package/dist/chunk-FV3Z5MBE.js.map +0 -1
- package/dist/chunk-HCEVHFJ7.js +0 -54
- package/dist/chunk-HCEVHFJ7.js.map +0 -1
- package/dist/chunk-J6527VRQ.js.map +0 -1
- package/dist/chunk-JELSZN25.js +0 -47
- package/dist/chunk-JELSZN25.js.map +0 -1
- package/dist/chunk-K575PT4S.js.map +0 -1
- package/dist/chunk-L57ZOT5K.js +0 -184
- package/dist/chunk-L57ZOT5K.js.map +0 -1
- package/dist/chunk-MU6MCIAC.js +0 -15
- package/dist/chunk-MU6MCIAC.js.map +0 -1
- package/dist/chunk-MUUROGIH.js.map +0 -1
- package/dist/chunk-NR7BU22N.js +0 -758
- package/dist/chunk-NR7BU22N.js.map +0 -1
- package/dist/chunk-O4MVQTEJ.js.map +0 -1
- package/dist/chunk-OOYD44JI.js +0 -317
- package/dist/chunk-OOYD44JI.js.map +0 -1
- package/dist/chunk-Q2UM7BXU.js.map +0 -1
- package/dist/chunk-RH5EFRVJ.js.map +0 -1
- package/dist/chunk-S2EGRPCM.js +0 -47
- package/dist/chunk-S2EGRPCM.js.map +0 -1
- package/dist/chunk-SINXE47Y.js +0 -55
- package/dist/chunk-SINXE47Y.js.map +0 -1
- package/dist/chunk-UF4MZSLT.js +0 -53
- package/dist/chunk-UF4MZSLT.js.map +0 -1
- package/dist/chunk-UOC2PL46.js +0 -13
- package/dist/chunk-UOC2PL46.js.map +0 -1
- package/dist/chunk-VYFAZN3F.js +0 -372
- package/dist/chunk-VYFAZN3F.js.map +0 -1
- package/dist/chunk-WRAA7GVZ.js +0 -209
- package/dist/chunk-WRAA7GVZ.js.map +0 -1
- package/dist/chunk-XGELA764.js +0 -163
- package/dist/chunk-XGELA764.js.map +0 -1
- package/dist/chunk-YUXP55T2.js.map +0 -1
- package/dist/chunk-YWIKDKHY.js +0 -307
- package/dist/chunk-YWIKDKHY.js.map +0 -1
- package/dist/chunk-ZJ5AOYBH.js +0 -8
- package/dist/chunk-ZJ5AOYBH.js.map +0 -1
- package/dist/chunk-ZSUUOEPL.js +0 -731
- package/dist/chunk-ZSUUOEPL.js.map +0 -1
- package/dist/chunk-ZVJZ72HY.js.map +0 -1
- package/dist/circuit-breaker/index.d.ts +0 -197
- package/dist/circuit-breaker/index.js +0 -3
- package/dist/circuit-breaker/index.js.map +0 -1
- package/dist/deadline/index.d.ts +0 -199
- package/dist/deadline/index.js +0 -6
- package/dist/deadline/index.js.map +0 -1
- package/dist/debounce/index.js +0 -3
- package/dist/debounce/index.js.map +0 -1
- package/dist/extension/react.d.ts +0 -121
- package/dist/extension/react.js +0 -75
- package/dist/extension/react.js.map +0 -1
- package/dist/extension/subs/index.d.ts +0 -45
- package/dist/extension/subs/index.js +0 -80
- package/dist/extension/subs/index.js.map +0 -1
- package/dist/extension/test-utils.d.ts +0 -128
- package/dist/extension/test-utils.js +0 -277
- package/dist/extension/test-utils.js.map +0 -1
- package/dist/fan-out/index.js +0 -5
- package/dist/fan-out/index.js.map +0 -1
- package/dist/fold-BJPdjc9w.d.ts +0 -435
- package/dist/graph-B3L5e0N1.d.ts +0 -923
- package/dist/idempotency/adapter.d.ts +0 -62
- package/dist/idempotency/adapter.js +0 -4
- package/dist/idempotency/adapter.js.map +0 -1
- package/dist/idempotent-intake/index.d.ts +0 -188
- package/dist/idempotent-intake/index.js +0 -7
- package/dist/idempotent-intake/index.js.map +0 -1
- package/dist/journal/index.d.ts +0 -373
- package/dist/journal/index.js +0 -3
- package/dist/journal/index.js.map +0 -1
- package/dist/llm-call/index.d.ts +0 -311
- package/dist/llm-call/index.js +0 -16
- package/dist/llm-call/index.js.map +0 -1
- package/dist/machine-BtFWQmmq.d.ts +0 -804
- package/dist/monitored-run/index.js +0 -10
- package/dist/monitored-run/index.js.map +0 -1
- package/dist/paginated-walk/index.d.ts +0 -235
- package/dist/paginated-walk/index.js +0 -16
- package/dist/paginated-walk/index.js.map +0 -1
- package/dist/paginator/index.js +0 -3
- package/dist/paginator/index.js.map +0 -1
- package/dist/pbt/arbitraries/index.d.ts +0 -136
- package/dist/pbt/arbitraries/index.js +0 -3
- package/dist/pbt/arbitraries/index.js.map +0 -1
- package/dist/pbt/runners/index.d.ts +0 -118
- package/dist/pbt/runners/index.js +0 -5
- package/dist/pbt/runners/index.js.map +0 -1
- package/dist/poller/index.d.ts +0 -352
- package/dist/poller/index.js +0 -115
- package/dist/poller/index.js.map +0 -1
- package/dist/prediction/index.d.ts +0 -131
- package/dist/prediction/index.js +0 -4
- package/dist/prediction/index.js.map +0 -1
- package/dist/pure/index.d.ts +0 -3
- package/dist/pure/index.js +0 -4
- package/dist/pure/index.js.map +0 -1
- package/dist/rate-limit/index.d.ts +0 -115
- package/dist/rate-limit/index.js +0 -3
- package/dist/rate-limit/index.js.map +0 -1
- package/dist/reconciler/index.d.ts +0 -193
- package/dist/reconciler/index.js +0 -164
- package/dist/reconciler/index.js.map +0 -1
- package/dist/recorder/index.js +0 -3
- package/dist/recorder/index.js.map +0 -1
- package/dist/reducer-4GNR6b8B.d.ts +0 -447
- package/dist/resilient-call/index.d.ts +0 -320
- package/dist/resilient-call/index.js +0 -14
- package/dist/resilient-call/index.js.map +0 -1
- package/dist/retry-to-success/index.d.ts +0 -109
- package/dist/retry-to-success/index.js +0 -37
- package/dist/retry-to-success/index.js.map +0 -1
- package/dist/run-pAcmBpah.d.ts +0 -713
- package/dist/runtime-types-CNLmhWif.d.ts +0 -517
- package/dist/saga/index.d.ts +0 -241
- package/dist/saga/index.js +0 -150
- package/dist/saga/index.js.map +0 -1
- package/dist/samples-B3My5oh2.d.ts +0 -59
- package/dist/snapshot/index.js +0 -5
- package/dist/snapshot/index.js.map +0 -1
- package/dist/subs/index.d.ts +0 -472
- package/dist/subs/index.js +0 -7
- package/dist/subs/index.js.map +0 -1
- package/dist/throttle/index.d.ts +0 -134
- package/dist/throttle/index.js +0 -3
- package/dist/throttle/index.js.map +0 -1
- package/dist/throttled-input/index.js.map +0 -1
- package/dist/token-refresh/index.d.ts +0 -216
- package/dist/token-refresh/index.js +0 -6
- package/dist/token-refresh/index.js.map +0 -1
- package/dist/trace-replay/index.js +0 -6
- package/dist/trace-replay/index.js.map +0 -1
- package/dist/with-deadline/index.d.ts +0 -197
- package/dist/with-deadline/index.js +0 -111
- package/dist/with-deadline/index.js.map +0 -1
- package/dist/with-resilience/index.d.ts +0 -225
- package/dist/with-resilience/index.js +0 -240
- package/dist/with-resilience/index.js.map +0 -1
- package/dist/with-telemetry/index.d.ts +0 -150
- package/dist/with-telemetry/index.js +0 -70
- package/dist/with-telemetry/index.js.map +0 -1
- package/dist/work-queue/adapter.d.ts +0 -84
- package/dist/work-queue/adapter.js +0 -4
- package/dist/work-queue/adapter.js.map +0 -1
- package/dist/work-queue/ops.d.ts +0 -71
- package/dist/work-queue/ops.js +0 -3
- package/dist/work-queue/ops.js.map +0 -1
- package/dist/workflow/index.d.ts +0 -485
- package/dist/workflow/index.js +0 -244
- package/dist/workflow/index.js.map +0 -1
- /package/dist/{cache → paginate}/index.js.map +0 -0
- /package/dist/{chart/inspect → persistence}/index.js.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/reconciler/index.ts"],"names":["w","applied"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @demlik/tea/reconciler — the desired-vs-actual sync loop (the \"fleet-sync /\n * coverage-gap\" shape): walk the ACTUAL world end to end, diff it against the\n * DESIRED spec, then apply each resulting `Change` one at a time until the two\n * agree. The control-plane reconcile pattern (Kubernetes controllers, fleet\n * config rollout, accessibility coverage-gap remediation) lifted to the uniform\n * L2 knob contract.\n *\n * ## The recipe (which bricks it composes)\n *\n * - **`../paginated-walk`** owns the SCAN. The actual world is rarely a single\n * fetch — it is a paginated list (every node in a fleet, every page of an\n * audit, every row of a table). `reconciler` does not re-implement that walk:\n * it embeds a `paginated-walk` slice and lets it sequence the actual-state\n * fetch (gated, retried, rate-limited, resumable across eviction). The walk's\n * own `onPage` hook stays empty (`() => []`) — `reconciler` accumulates each\n * fetched page's items into the running `actual` snapshot inside its OWN\n * `pageOk` verb, where it holds its slice and so can extend the accumulator\n * the walk cannot see; when the walk reports `isComplete`, the full actual\n * snapshot is in hand.\n * - **`../cache`** owns the APPLIED ledger. Every `Change` that settles is\n * written into a TTL cache keyed by the change's id, so a re-`applyNext`\n * after an eviction skips changes already applied (idempotent re-apply — the\n * reconcile is safe to resume from any point). The cache is the durable\n * \"what have I already done?\" memory the apply loop reads before re-issuing.\n *\n * Because the scan IS a `paginated-walk` slice (which itself IS a\n * `resilient-call` slice), this knob **inherits that contract verbatim**: the\n * slice is flat plain data, every verb returns `readonly [State, Cmd[]]`, time\n * is always an `at` parameter, and the jitter RNG is injected once at\n * `createReconciler(config, rng)` — never read inside a verb (the spec:\n * `reconciler` *extends* `paginated-walk`).\n *\n * ## Why the run lifecycle is INLINE (run-tracker not extracted)\n *\n * The reconcile phase union (`idle` / `scanning` / `applying` / `done` /\n * `failed`) and its bookkeeping (`plan`, `appliedCursor`, the `actual`\n * accumulator) live directly on this slice rather than behind a `run-tracker`\n * sub-knob — exactly as `monitored-run` keeps its lifecycle inline. Extraction\n * earns its keep when two independent axes vary; here the lifecycle has one\n * anchoring axis (this reconcile pass). The genuinely independent axes — the\n * paginated SCAN and the applied LEDGER — ARE extracted (`../paginated-walk`,\n * `../cache`). The lifecycle is the glue that sequences scan → plan → apply.\n *\n * ## The two non-negotiables (canon)\n *\n * - **Durable** — the slice is plain data: the paginated-walk slice, the\n * accumulated `actual` items, the planned `Change[]`, the applied cursor, and\n * the applied-ledger cache (all JSON-serializable). A reconcile survives DO\n * eviction mid-scan or mid-apply and resumes from the exact position.\n * - **Replayable** — every transition is a verb returning new state + Cmds.\n * `diff` / `apply` are pure config functions applied at the verb boundary;\n * the Cmds they yield are plain data. `replay` reconstructs the whole pass\n * exactly. Nothing here closes over time or RNG.\n *\n * ## Where the clock / RNG live\n *\n * Inside the verbs: nowhere. `at` arrives on `scan` / `pageOk` / `pageErr` /\n * `applied` / `onTimer` and threads into the underlying paginated-walk gate (so a\n * retried / rate-limited page measures backoff from that `at`) and into the\n * applied-ledger cache writes. The jitter RNG is injected at construction. The\n * only clock read is `Date.now()` inside the inherited paginated-walk `handlers`\n * port (the effect boundary).\n *\n * ## Typical wiring\n *\n * const rec = createReconciler<FleetNode, NodeSpec, Page, SyncChange, ApplyCmd>({\n * desired: targetSpecs, // the spec to converge on\n * firstPage: null, // actual-list page-one sentinel\n * nextCursor: (page) => page.next ?? null,\n * itemsOf: (page) => page.nodes, // page → actual items\n * diff: (desired, actual) => planChanges(desired, actual),\n * apply: (change) => ({ type: \"apply_change\", change }),\n * idOf: (change) => change.nodeId, // applied-ledger key\n * rateLimit: { capacity: 10, refillPerSec: 5 },\n * retry: defaultRetryPolicy,\n * });\n *\n * // in the machine:\n * init: () => [{ rec: rec.init() }, []],\n * update: {\n * reconcile: (s, m) => lift(s, rec.scan(s.rec, m.at)),\n * page_ok: (s, m) => lift(s, rec.pageOk(s.rec, m.result, m.at)),\n * page_err: (s, m) => lift(s, rec.pageErr(s.rec, m.error, m.at)),\n * change_done: (s, m) => lift(s, rec.applied(s.rec, m.change, m.at)),\n * retry_due: (s, m) => lift(s, rec.onTimer(s.rec, m)),\n * },\n * subscriptions: (s) => rec.subs(s.rec),\n * subscribe: { deadline: subscribeDeadline },\n * interpret: rec.handlers({ run: (cursor) => api.listActual(cursor) }),\n */\n\nimport {\n get as cacheGet,\n set as cacheSet,\n initCache,\n type TtlCache,\n} from \"../cache\";\nimport type { Cmd } from \"../index\";\nimport {\n createPaginatedWalk,\n type DeadlineSub,\n deadlineSub,\n type FetchPageCmd,\n PAGE_KEY,\n type PageErrMsg,\n type PageOkMsg,\n type PaginatedWalkState,\n type PaginatedWalkTimerMsg,\n subscribeDeadline,\n} from \"../paginated-walk\";\nimport type {\n CircuitConfig,\n DeadlineConfig,\n RateLimitConfig,\n ResilientPorts,\n} from \"../resilient-call\";\nimport type { RetryPolicy } from \"../retry-backoff\";\n\n// ===========================================================================\n// Config — the knob. `desired` / `diff` / `apply` / `idOf` describe the\n// reconcile; the SCAN knobs (firstPage / nextCursor / itemsOf) describe how the\n// actual world is walked; the resilience bricks are inherited from\n// paginated-walk (every one optional — omit a brick, omit its gate).\n// ===========================================================================\n\n/**\n * The reconciler knob. Generic in:\n * - `Actual` — one item of the ACTUAL world (a fleet node, an audited page, a\n * table row). The scan accumulates these.\n * - `Desired` — the DESIRED spec value the diff converges toward. Opaque to\n * this module; only `diff` reads it.\n * - `Page` — the shape one actual-list page fetch resolves with.\n * - `Change` — one unit of remediation the diff produces and `apply` realizes.\n * - `ApplyCmd`— the Cmd `apply(change)` yields (the effect that mutates the\n * actual world toward desired).\n *\n * `diff` / `apply` / `idOf` / `nextCursor` / `itemsOf` are PURE config functions\n * applied at the verb boundary, never stored in the slice or in a Cmd (Cmds are\n * plain data, not closures). The resilience bricks (`retry` / `circuit` /\n * `rateLimit` / `deadline`) are the SAME optional knobs `paginated-walk` /\n * `resilient-call` expose — reconciler extends them; `rateLimit` keeps the scan\n * from 429-ing the upstream listing API.\n */\nexport interface ReconcilerConfig<\n Actual,\n Desired,\n Page,\n Change,\n ApplyCmd extends Cmd,\n Cursor = number,\n> {\n /**\n * The DESIRED spec to converge on. Held verbatim and handed to `diff` once the\n * scan completes. Any JSON-serializable value — a list of specs, a target map,\n * a single target object — `diff` alone interprets it.\n */\n readonly desired: Desired;\n /**\n * Compute the remediation plan: the ordered `Change[]` that moves `actual` to\n * `desired`. Called once when the scan finishes (the full actual snapshot is in\n * hand). An empty plan means \"already in sync — nothing to apply\". PURE +\n * consumer-specific (only the consumer knows the domain's reconcile rules).\n */\n readonly diff: (\n desired: Desired,\n actual: readonly Actual[],\n ) => readonly Change[];\n /**\n * Realize one `Change` as the Cmd that mutates the actual world. Returns plain\n * data (a `{ type, ... }` Cmd the consumer's interpret handler performs).\n * PURE — the side effect happens when the runtime performs the emitted Cmd,\n * never here.\n */\n readonly apply: (change: Change) => ApplyCmd;\n /**\n * Stable identity for a `Change` — the applied-ledger cache key. A re-`applyNext`\n * after eviction (or after a re-plan) skips a change whose id is already in the\n * ledger (idempotent re-apply). MUST be a property of the change itself, NOT its\n * position in the plan: the ledger has to survive re-planning. When omitted the\n * default keys by the change's serialized CONTENT (`JSON.stringify(change)`) —\n * a stable per-change identity that is unchanged by where the change sits in the\n * plan. Supply a domain id (the target node id, the resource key) when one\n * exists; it is cheaper than serializing and dedupes two changes that differ\n * only in fields irrelevant to identity. PURE.\n *\n * Why NOT positional: keying by index silently drops changes on the documented\n * re-plan path. After applying the index-0 change, its `\"0\"` ledger entry would\n * match WHATEVER different, never-applied change lands at index 0 in the next\n * plan — the apply loop skips it as \"already done\". Identity must be intrinsic\n * to the change so the ledger means \"this change settled\", not \"slot N settled\".\n */\n readonly idOf?: (change: Change) => string;\n\n // --- scan knobs (the actual-world walk), inherited from paginated-walk ---\n /**\n * The cursor the actual-list scan fetches first. For an offset API typically\n * `0`; for a token API whatever sentinel the API treats as page one.\n */\n readonly firstPage: Cursor;\n /**\n * Extract the next scan cursor from a fetched page — a `Cursor` to keep\n * scanning, or `null` when the actual listing is exhausted (scan finishes,\n * plan computed). PURE + consumer-specific.\n */\n readonly nextCursor: (page: Page) => Cursor | null;\n /**\n * Extract the actual items from one fetched page. Each page's items are\n * appended to the running `actual` accumulator. PURE.\n */\n readonly itemsOf: (page: Page) => readonly Actual[];\n\n // --- resilience bricks, inherited from paginated-walk (all optional) ---\n /** Exponential-backoff retry policy for a transient scan-page failure. */\n readonly retry?: RetryPolicy;\n /** Circuit breaker around the scan fetch (one upstream → one breaker). */\n readonly circuit?: CircuitConfig;\n /** Token-bucket rate limit on the scan — the \"don't 429 the listing API\" knob. */\n readonly rateLimit?: RateLimitConfig;\n /** Overall wall-clock deadline per individual scan-page fetch. */\n readonly deadline?: DeadlineConfig;\n}\n\n// ===========================================================================\n// Slice — the Model field this knob owns. The paginated-walk scan slice + the\n// accumulated actual snapshot + the inline reconcile lifecycle (plan, applied\n// cursor, ledger). All flat plain data.\n// ===========================================================================\n\n/**\n * Reconcile lifecycle phase. Discriminated on `phase`:\n *\n * - `idle` — created, never scanned. `scan` starts the actual-world walk.\n * - `scanning` — the paginated-walk is traversing the actual listing; pages\n * fold into `actual` as they arrive. The scan owns the `walk`\n * sub-slice; this phase ends when the walk finishes.\n * - `applying` — the scan finished, `diff` produced the `plan`, and changes are\n * being applied one at a time. `appliedCursor` is the index of\n * the next change to apply.\n * - `done` — every planned change applied (or an empty plan: already in\n * sync). Terminal.\n * - `failed` — the scan failed terminally (the page-fetch retries were\n * exhausted / a deadline fired). `error` carries why. Terminal.\n */\nexport type ReconcilePhase =\n | \"idle\"\n | \"scanning\"\n | \"applying\"\n | \"done\"\n | \"failed\";\n\n/**\n * The slice. Plain data end to end:\n * - `phase` — the lifecycle discriminant.\n * - `walk` — the `../paginated-walk` scan slice (cursor + resilience).\n * Drives the actual-world traversal; POSITION survives\n * eviction.\n * - `actual` — the accumulated actual items, appended page by page during\n * the scan. The full snapshot `diff` is computed against.\n * - `plan` — the `Change[]` `diff` produced. Empty until the scan\n * finishes; the apply loop walks it by `appliedCursor`.\n * - `appliedCursor` — index of the NEXT change to apply (0 ≤ cursor ≤ plan.length).\n * `cursor === plan.length` means every change applied.\n * - `applied` — the applied-ledger cache: `idOf(change) → change`, written\n * as each change settles. The idempotency memory the apply\n * loop reads to skip already-applied changes after eviction.\n */\nexport interface ReconcilerState<Actual, Change, Page, Cursor = number> {\n readonly phase: ReconcilePhase;\n readonly walk: PaginatedWalkState<Cursor, Page>;\n readonly actual: readonly Actual[];\n readonly plan: readonly Change[];\n readonly appliedCursor: number;\n readonly applied: TtlCache<Change>;\n}\n\n// ===========================================================================\n// Cmds + Msgs the knob speaks. The scan emits the inherited page-fetch effect;\n// the apply loop emits the consumer's `apply(change)` Cmds.\n// ===========================================================================\n\n/**\n * The actual-list page-fetch effect: the inherited `resilient_run` Cmd from\n * paginated-walk, whose `input` is the `Cursor` to fetch and whose `key` is the\n * fixed `PAGE_KEY`. The consumer's `handlers(ports)` interprets it.\n */\nexport type ScanPageCmd<Cursor> = FetchPageCmd<Cursor>;\n\n/** Page-settled Msgs the scan `handlers` port dispatches back (inherited verbatim). */\nexport type ScanPageOkMsg<Page> = PageOkMsg<Page>;\nexport type ScanPageErrMsg = PageErrMsg;\n\n/** The scan retry / deadline timer Msg — inherited from paginated-walk. */\nexport type ReconcilerTimerMsg = PaginatedWalkTimerMsg;\n\n/**\n * Ports the consumer supplies to `handlers`. `run(cursor)` fetches ONE page of\n * the ACTUAL listing for the given cursor; throwing routes to `pageErr` (and\n * thus the scan backoff). Same shape as paginated-walk's port.\n */\nexport interface ReconcilerPorts<Cursor, Page>\n extends ResilientPorts<Cursor, Page> {}\n\n// ===========================================================================\n// The knob factory.\n// ===========================================================================\n\n/**\n * Build a reconciler knob from `config`. `rng` is injected for the underlying\n * scan-retry jitter — pass a fixed `() => 0` in tests to pin backoff; defaults\n * to `Math.random` (read at the verb boundary inside resilient-call, never in a\n * reconciler verb). Inherited straight from paginated-walk.\n *\n * Returns the uniform L2 knob contract: `init()`, the verbs `scan` / `pageOk` /\n * `pageErr` / `planned` / `applyNext` / `applied` / `onTimer`, the derived\n * `isComplete`, `subs(state)`, and `handlers(ports)`.\n */\nexport function createReconciler<\n Actual,\n Desired,\n Page,\n Change,\n ApplyCmd extends Cmd = Cmd,\n Cursor = number,\n>(\n config: ReconcilerConfig<Actual, Desired, Page, Change, ApplyCmd, Cursor>,\n rng: () => number = Math.random,\n) {\n type State = ReconcilerState<Actual, Change, Page, Cursor>;\n // The combined Cmd type the verbs can emit: the inherited scan page-fetch\n // effect plus whatever `apply(change)` yields.\n type OutCmd = ScanPageCmd<Cursor> | ApplyCmd;\n\n // The scan is a paginated-walk over the actual listing. We feed it the scan\n // cursor knobs + the resilience bricks; `onPage` is OURS — it is a pure marker\n // (we accumulate items in `pageOk` instead, where we hold the reconciler\n // slice). The walk's `Page` payload is the consumer's `Page`; the reconciler\n // slice stores the walk as `PaginatedWalkState<Cursor, unknown>` so its own\n // type does not have to thread `Page` (the page never lands in the slice — only\n // the extracted `actual` items do).\n const walk = createPaginatedWalk<Cursor, Page, never>(\n {\n firstPage: config.firstPage,\n nextCursor: config.nextCursor,\n // The walk's per-page hook emits no Cmds — the reconciler accumulates the\n // page's items itself in `pageOk` (where it holds its own slice), so the\n // walk's onPage stays empty.\n onPage: () => [],\n retry: config.retry,\n circuit: config.circuit,\n rateLimit: config.rateLimit,\n deadline: config.deadline,\n },\n rng,\n );\n\n /**\n * The applied-ledger key for a change. Custom `idOf` when supplied; otherwise\n * the change's serialized CONTENT — a stable per-change identity. NEVER the\n * positional index: an index-keyed ledger drops a never-applied change that\n * happens to land at a slot a different, already-applied change once occupied\n * (the re-plan defect). Identity is intrinsic to the change, so the ledger\n * means \"this change settled\", surviving a re-plan that reorders the slots.\n */\n function changeId(change: Change): string {\n return config.idOf ? config.idOf(change) : JSON.stringify(change);\n }\n\n /** Replace the walk sub-slice, leaving the rest of the reconciler untouched. */\n function withWalk(s: State, w: State[\"walk\"]): State {\n return { ...s, walk: w };\n }\n\n /** The starting slice: idle, fresh walk + empty accumulator / plan / ledger. */\n function init(): State {\n return {\n phase: \"idle\",\n walk: walk.init(),\n actual: [],\n plan: [],\n appliedCursor: 0,\n applied: initCache<Change>(),\n };\n }\n\n // === Verb: scan ==========================================================\n\n /**\n * Begin the reconcile: start the paginated walk over the ACTUAL world and\n * enter `scanning`. Issues the first scan-page fetch (gated through the\n * inherited resilience). A no-op on any non-`idle` phase — re-scanning a\n * reconcile already in flight would restart the actual walk and double-count,\n * so a stray `scan` is absorbed. PURE — `at` threads into the fetch gate.\n */\n function scan(s: State, at: number): readonly [State, readonly OutCmd[]] {\n if (s.phase !== \"idle\") return [s, []];\n const [w, cmds] = walk.start(s.walk, at);\n const next: State = { ...s, phase: \"scanning\", walk: w };\n return [next, cmds];\n }\n\n // === Verb: pageOk ========================================================\n\n /**\n * Record a successfully fetched actual-list `page`: append its items to the\n * `actual` accumulator and advance the walk. When the walk finishes (the\n * listing is exhausted), the full actual snapshot is in hand → compute the\n * plan (`planned`) and start applying. PURE — `at` is the scan clock.\n *\n * A stray `pageOk` while not `scanning` (a late duplicate after the scan\n * completed) is absorbed by the walk (no cursor advance) and contributes no\n * items — the reconcile never re-accumulates after the plan is computed.\n */\n function pageOk(\n s: State,\n page: Page,\n at: number,\n ): readonly [State, readonly OutCmd[]] {\n // Once we are past scanning, the actual snapshot is frozen — absorb stray pages.\n if (s.phase !== \"scanning\") {\n const [w] = walk.pageOk(s.walk, page, at);\n return [withWalk(s, w), []];\n }\n\n const [w, walkCmds] = walk.pageOk(s.walk, page, at);\n const actual = [...s.actual, ...config.itemsOf(page)];\n const scanned: State = { ...s, walk: w, actual };\n\n // The walk emits the next scan-page fetch while it stays fetching. When it\n // finishes (done / paused with no fetch), `walkCmds` is empty.\n const cmds: readonly OutCmd[] = walkCmds;\n\n // Scan exhausted → plan + begin applying. `walk.isComplete` is the honest\n // \"the API returned a null next cursor\" signal.\n if (walk.isComplete(scanned.walk)) {\n const [plannedState, applyCmds] = planned(scanned, at);\n return [plannedState, [...cmds, ...applyCmds]];\n }\n\n return [scanned, cmds];\n }\n\n // === Verb: pageErr =======================================================\n\n /**\n * Record a failed scan-page fetch and back off via the inherited resilience:\n * schedule a retry (the scan cursor stays parked — no advance) or, once the\n * page-fetch retries are exhausted, the underlying call settles `failed`. When\n * the scan call is terminally failed, the whole reconcile enters `failed`.\n * PURE — `at` stamps the breaker trip + the retry-delay base.\n */\n function pageErr(\n s: State,\n error: unknown,\n at: number,\n ): readonly [State, readonly OutCmd[]] {\n const [w, cmds] = walk.pageErr(s.walk, error, at);\n let next = withWalk(s, w);\n // The page-fetch call settling `failed` (retries exhausted) is a terminal\n // scan failure → the reconcile cannot trust an incomplete actual snapshot.\n if (\n s.phase === \"scanning\" &&\n w.resilience.calls[PAGE_KEY]?.phase === \"failed\"\n ) {\n next = { ...next, phase: \"failed\" };\n }\n return [next, cmds];\n }\n\n // === Verb: planned =======================================================\n\n /**\n * Compute the remediation plan from the accumulated `actual` snapshot and the\n * configured `desired`, store it, and enter `applying`. Normally driven\n * internally by `pageOk` when the scan finishes, but exposed as a\n * verb so a consumer can force planning from an externally-supplied actual\n * snapshot (e.g. a single-shot actual fetch outside the paginated scan), or\n * re-plan after a desired change. An empty plan settles straight to `done`\n * (already in sync). PURE — `at` only stamps the (empty) apply-loop clock.\n *\n * `changes` is optional: omit it to diff the slice's own accumulated `actual`\n * against `config.desired`; pass an explicit plan to install it directly\n * (skipping the diff — the consumer computed it elsewhere).\n */\n function planned(\n s: State,\n at: number,\n changes?: readonly Change[],\n ): readonly [State, readonly OutCmd[]] {\n const plan = changes ?? config.diff(config.desired, s.actual);\n const planning: State = {\n ...s,\n phase: \"applying\",\n plan,\n appliedCursor: 0,\n };\n return applyNext(planning, at);\n }\n\n // === Verb: applyNext =====================================================\n\n /**\n * Emit the apply Cmd for the next not-yet-applied change in the plan, skipping\n * any whose id is already in the applied ledger (idempotent re-apply after\n * eviction). Advances `appliedCursor` past skipped + the emitted change. When\n * the cursor reaches the end of the plan, settles `done`. A no-op unless\n * `applying`. PURE — `at` is read only for the ledger lookup clock; `idOf`\n * keys the skip check.\n *\n * Emits at most ONE apply Cmd per call (the loop is sequential: each `applied`\n * drives the next `applyNext`). This keeps the actual-world mutation\n * one-at-a-time, matching a controller's serial reconcile.\n */\n function applyNext(\n s: State,\n at: number,\n ): readonly [State, readonly OutCmd[]] {\n if (s.phase !== \"applying\") return [s, []];\n\n let cursor = s.appliedCursor;\n // Skip changes already in the ledger (a resumed reconcile re-issues from the\n // cursor but must not re-apply what already settled).\n while (cursor < s.plan.length) {\n const change = s.plan[cursor];\n // `cursor < plan.length` guarantees an element under normal indexing; the\n // explicit `undefined` narrow (vs a non-null assertion) keeps the access\n // typed without a suppression and tolerates a sparse hole by skipping it.\n if (change === undefined) {\n cursor++;\n continue;\n }\n const id = changeId(change);\n if (cacheGet(s.applied, id, at) === undefined) {\n // This change is not yet applied — emit its Cmd and park the cursor here\n // (it advances to cursor+1 only once `applied` confirms the change).\n const advanced: State = { ...s, appliedCursor: cursor };\n return [advanced, [config.apply(change)]];\n }\n cursor++;\n }\n\n // Every change applied → reconcile complete.\n const done: State = { ...s, phase: \"done\", appliedCursor: cursor };\n return [done, []];\n }\n\n // === Verb: applied =======================================================\n\n /**\n * Record that `change` finished applying: write it into the applied ledger,\n * advance the cursor past it, and drive the next `applyNext`. PURE — `at` is\n * the ledger-write clock (the entry never expires in practice; a large TTL\n * keeps the idempotency window open for the reconcile's lifetime).\n *\n * `change` is the SAME change the consumer's apply handler settled (echoed back\n * on the settle Msg) — its id is computed from the change's own identity (NOT a\n * cursor position), so the ledger key matches the skip check in `applyNext`\n * regardless of where the change sits in the plan. A no-op unless `applying` (a\n * late settle after `done` is ignored). PURE.\n */\n function applied(\n s: State,\n change: Change,\n at: number,\n ): readonly [State, readonly OutCmd[]] {\n if (s.phase !== \"applying\") return [s, []];\n const id = changeId(change);\n // A very large TTL: the ledger entry must outlive the whole reconcile pass.\n // `get(..., at)` treats it as fresh for `at < expiresAtMs`, which holds for\n // any realistic reconcile (the cache exists to dedupe within one pass).\n const applied = cacheSet(\n s.applied,\n id,\n change,\n at,\n Number.MAX_SAFE_INTEGER,\n );\n const advanced: State = {\n ...s,\n applied,\n appliedCursor: s.appliedCursor + 1,\n };\n return applyNext(advanced, at);\n }\n\n // === Verb: onTimer =======================================================\n\n /**\n * A scan retry / deadline timer fired. Defers to paginated-walk's `onTimer`: a\n * retry timer re-issues the SAME scan-page fetch (re-fetching the parked\n * cursor); a deadline timer settles the scan call failed. A deadline-driven\n * terminal scan failure escalates the whole reconcile to `failed`. A stale fire\n * is a pure no-op (inherited identity). PURE.\n */\n function onTimer(\n s: State,\n msg: ReconcilerTimerMsg,\n ): readonly [State, readonly OutCmd[]] {\n const [w, cmds] = walk.onTimer(s.walk, msg);\n if (w === s.walk) {\n // Inherited no-op identity → keep our slice identity too.\n return [s, []];\n }\n let next = withWalk(s, w);\n if (\n s.phase === \"scanning\" &&\n w.resilience.calls[PAGE_KEY]?.phase === \"failed\"\n ) {\n next = { ...next, phase: \"failed\" };\n }\n return [next, cmds];\n }\n\n // === Derived predicate ===================================================\n\n /**\n * Whether the reconcile has fully settled — every planned change applied (or an\n * empty plan: already in sync). PURE, read-only. Lets a consumer's reducer fire\n * a \"reconcile complete\" Cmd without re-checking the phase by hand.\n */\n function isComplete(s: State): boolean {\n return s.phase === \"done\";\n }\n\n // === Subs ================================================================\n\n /**\n * Pre-wired subscriptions: exactly the scan's paginated-walk subs — a retry\n * timer while a scan page is `waiting_retry`, and (with the `deadline` brick) a\n * per-page deadline timer while a scan fetch is active. The apply loop emits no\n * timers (each apply settles via the consumer's own Msg), so once the scan\n * finishes the desired sub set empties. Reconciled by id; wire `subscribe: {\n * deadline: subscribeDeadline }` (re-exported below).\n */\n function subs(s: State): readonly DeadlineSub[] {\n return walk.subs(s.walk);\n }\n\n // === Handlers ============================================================\n\n /**\n * Pre-wired interpret handler for the scan page-fetch effect. Inherited from\n * paginated-walk (`resilient_run`): wraps the consumer's `run(cursor)` actual-\n * list port via `tryInterpret` (Railway) — success → `resilient_ok` (handled by\n * `pageOk`), failure → `resilient_err` (handled by `pageErr`), each stamped\n * with `Date.now()` at the effect boundary (the ONE permitted clock read).\n *\n * interpret: rec.handlers({ run: (cursor) => api.listActual(cursor) })\n *\n * The apply-Cmd side is the CONSUMER's interpret handler (it knows how to\n * realize `apply(change)`); the consumer routes its settle Msg back through\n * `applied`. This knob only owns the scan's interpret cell.\n */\n function handlers(ports: ReconcilerPorts<Cursor, Page>) {\n return walk.handlers(ports);\n }\n\n return {\n init,\n scan,\n pageOk,\n pageErr,\n planned,\n applyNext,\n applied,\n onTimer,\n isComplete,\n subs,\n handlers,\n };\n}\n\n/**\n * Lift a knob result `[slice, cmds]` into a host `[State, cmds]` where the slice\n * lives at `state.rec`. Convenience for the common single-slice host; hosts with\n * a differently-named field spread by hand. PURE — a thin record rebuild, no\n * clock / RNG.\n */\nexport function liftReconciler<\n S extends { rec: ReconcilerState<Actual, Change, Page, Cursor> },\n Actual,\n Change,\n Page,\n Cursor,\n C extends Cmd,\n>(\n state: S,\n [slice, cmds]: readonly [\n ReconcilerState<Actual, Change, Page, Cursor>,\n readonly C[],\n ],\n): readonly [S, readonly C[]] {\n return [{ ...state, rec: slice }, cmds];\n}\n\n/**\n * Re-export the deadline Sub primitives (inherited from paginated-walk) so\n * consumers wire one import: `subscribeDeadline` is the `subscribe` cell,\n * `deadlineSub` builds the Sub literal this knob's `subs` emits.\n */\nexport { subscribeDeadline, deadlineSub };\nexport type { DeadlineSub };\n"]}
|
package/dist/recorder/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -1,447 +0,0 @@
|
|
|
1
|
-
import { k as EventOrigin, C as Chart, R as ReducerChart } from './graph-B3L5e0N1.js';
|
|
2
|
-
import { R as RtSamples } from './samples-B3My5oh2.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* WHY a (state, event) pair is refused. The chart's three refusal mechanisms,
|
|
6
|
-
* each carrying the evidence that produced it, so a UI can say *"`WIP` is not
|
|
7
|
-
* addressed to `blocked` — its scope is `edges`"* rather than "disabled".
|
|
8
|
-
*
|
|
9
|
-
* `undeclared` is the fourth case the type layer forbids: a pair that is live,
|
|
10
|
-
* unhandled and unrefused. It cannot occur on a chart that compiled through
|
|
11
|
-
* `defineChart`, and it is reported rather than swallowed because reaching it
|
|
12
|
-
* means the types were bypassed with a cast — which is precisely when a
|
|
13
|
-
* debugger should say so instead of drawing a well-behaved button.
|
|
14
|
-
*/
|
|
15
|
-
type RefusalReason = {
|
|
16
|
-
readonly kind: "end";
|
|
17
|
-
/** Terminal state: it accepts nothing, by declaration. */
|
|
18
|
-
readonly state: string;
|
|
19
|
-
} | {
|
|
20
|
-
readonly kind: "out-of-scope";
|
|
21
|
-
/** The event's declared `scope`, flattened to its members. */
|
|
22
|
-
readonly scope: readonly string[];
|
|
23
|
-
/** The phase this state lives in — the one that is not in `scope`. */
|
|
24
|
-
readonly phase: string;
|
|
25
|
-
} | {
|
|
26
|
-
/**
|
|
27
|
-
* `scope: "edges"` — the event is live exactly where an edge declares it,
|
|
28
|
-
* and this state declares none.
|
|
29
|
-
*
|
|
30
|
-
* SPLIT OUT OF `out-of-scope` because the phase has nothing to do with it.
|
|
31
|
-
* `"edges"` is not a phase name, so the phase test could never pass and
|
|
32
|
-
* the refusal came back naming a phase the reader then went looking for:
|
|
33
|
-
* *"`DONE` is not addressed to phase `working` (scope: edges)"* — three
|
|
34
|
-
* pieces of vocabulary for one fact, and the fact is not in there. The
|
|
35
|
-
* default scope is `edges`, so this was most refusals on most charts.
|
|
36
|
-
*/
|
|
37
|
-
readonly kind: "no-edge";
|
|
38
|
-
readonly state: string;
|
|
39
|
-
} | {
|
|
40
|
-
readonly kind: "ignored";
|
|
41
|
-
/** The event is live here and this state refuses it BY NAME. */
|
|
42
|
-
readonly state: string;
|
|
43
|
-
} | {
|
|
44
|
-
readonly kind: "undeclared";
|
|
45
|
-
};
|
|
46
|
-
/** A one-line, human-readable rendering of a {@link RefusalReason}. */
|
|
47
|
-
declare function explainRefusal(event: string, reason: RefusalReason): string;
|
|
48
|
-
/** What kind of transition an edge declares. */
|
|
49
|
-
type EdgeKind = "plain" | "guarded" | "cell" | "resume";
|
|
50
|
-
/** One declared edge — a `(state, event)` pair the chart routes. */
|
|
51
|
-
interface ChartEdge {
|
|
52
|
-
readonly from: string;
|
|
53
|
-
readonly event: string;
|
|
54
|
-
/** `"${from}.${event}"` — the site key guards/cmds/cells are indexed by. */
|
|
55
|
-
readonly at: string;
|
|
56
|
-
readonly kind: EdgeKind;
|
|
57
|
-
/**
|
|
58
|
-
* Every state this edge can land on, in declaration order. A guarded edge
|
|
59
|
-
* contributes both arms; a cell edge contributes its whole declared `to`.
|
|
60
|
-
* For a resume edge this is the fallback alone — the real target is
|
|
61
|
-
* `state.was`, which is a property of the LIVE state, not of the chart.
|
|
62
|
-
*/
|
|
63
|
-
readonly targets: readonly string[];
|
|
64
|
-
/** The guard's name, on a guarded edge. */
|
|
65
|
-
readonly guard?: string;
|
|
66
|
-
/** The target taken when the guard HOLDS. */
|
|
67
|
-
readonly then?: string;
|
|
68
|
-
/** The target taken when the guard FAILS. */
|
|
69
|
-
readonly otherwise?: string;
|
|
70
|
-
/** The cell's name, on a `{ to, cell }` edge. */
|
|
71
|
-
readonly cell?: string;
|
|
72
|
-
/** The declared fallback, on a `resume` edge. */
|
|
73
|
-
readonly fallback?: string;
|
|
74
|
-
/** Cmds fired when the edge fires (the guard's `then` arm, if guarded). */
|
|
75
|
-
readonly cmds: readonly string[];
|
|
76
|
-
/** Cmds fired when the guard FAILS. Empty unless the edge is guarded. */
|
|
77
|
-
readonly otherwiseCmds: readonly string[];
|
|
78
|
-
}
|
|
79
|
-
/** A (state, event) pair the chart explicitly refuses, and why. */
|
|
80
|
-
interface ChartRefusal {
|
|
81
|
-
readonly from: string;
|
|
82
|
-
readonly event: string;
|
|
83
|
-
readonly reason: RefusalReason;
|
|
84
|
-
}
|
|
85
|
-
/** One state, with the facts the chart declares about it. */
|
|
86
|
-
interface ChartStateInfo {
|
|
87
|
-
readonly name: string;
|
|
88
|
-
/** The phase it was declared under. */
|
|
89
|
-
readonly phase: string;
|
|
90
|
-
/** `initial: true` — the entry state. Exactly one per machine-bearing chart. */
|
|
91
|
-
readonly initial: boolean;
|
|
92
|
-
/**
|
|
93
|
-
* Terminal by DECLARATION, not by "has no outgoing edges" — `true` for both
|
|
94
|
-
* polarities, because both accept nothing and both owe nothing.
|
|
95
|
-
*/
|
|
96
|
-
readonly end: boolean;
|
|
97
|
-
/**
|
|
98
|
-
* WHICH ending. `true` a success final, `"error"` the failure terminal,
|
|
99
|
-
* `false` not a final at all.
|
|
100
|
-
*
|
|
101
|
-
* `end` answers "does this accept anything"; this answers "did the machine
|
|
102
|
-
* win or lose". A lane needs both and they are not the same question —
|
|
103
|
-
* `shipped` and `frozen` are equally terminal and are not the same outcome.
|
|
104
|
-
*/
|
|
105
|
-
readonly endPolarity: false | true | "error";
|
|
106
|
-
/** Carries a `resume` edge out of it, so the compiler injects `was` here. */
|
|
107
|
-
readonly parking: boolean;
|
|
108
|
-
}
|
|
109
|
-
/** One event of the alphabet. */
|
|
110
|
-
interface ChartEventInfo {
|
|
111
|
-
readonly name: string;
|
|
112
|
-
/** The declared `scope`, flattened: `"edges"`, `"all"`, or phase names. */
|
|
113
|
-
readonly scope: readonly string[];
|
|
114
|
-
/** `foreign: true` — the name belongs to someone else and stays bare. */
|
|
115
|
-
readonly foreign: boolean;
|
|
116
|
-
/**
|
|
117
|
-
* WHERE THIS EVENT COMES FROM — `from`, read back off the chart.
|
|
118
|
-
*
|
|
119
|
-
* `undefined` means the chart does not say, which is a fact of its own and
|
|
120
|
-
* never a default: a UI that groups its button row by sender must render the
|
|
121
|
-
* undeclared ones as undeclared rather than filing them under a guess.
|
|
122
|
-
*/
|
|
123
|
-
readonly from?: EventOrigin;
|
|
124
|
-
/**
|
|
125
|
-
* Whether the event DECLARED a payload (`data: ty<…>()`).
|
|
126
|
-
*
|
|
127
|
-
* `ty<T>()` is `{}` at runtime, so `T` is unreadable — but the `data` KEY is
|
|
128
|
-
* right there in the literal, so "does this event carry a payload at all" IS
|
|
129
|
-
* a runtime fact. It is what decides whether a sample is required.
|
|
130
|
-
*/
|
|
131
|
-
readonly hasPayload: boolean;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* A whole chart, as data a UI can build itself from. Nothing here is supplied
|
|
135
|
-
* by the caller; every field is read off the one chart value.
|
|
136
|
-
*/
|
|
137
|
-
interface ChartDescription {
|
|
138
|
-
/** The phases, in declaration order, each with its member states. */
|
|
139
|
-
readonly phases: readonly {
|
|
140
|
-
readonly name: string;
|
|
141
|
-
readonly states: readonly string[];
|
|
142
|
-
}[];
|
|
143
|
-
readonly states: readonly ChartStateInfo[];
|
|
144
|
-
/** The state marked `initial: true`, or `undefined` on a chart with none. */
|
|
145
|
-
readonly initial: string | undefined;
|
|
146
|
-
readonly events: readonly ChartEventInfo[];
|
|
147
|
-
/** Every cmd DECLARED in the `cmds` section — the effect alphabet. */
|
|
148
|
-
readonly cmds: readonly string[];
|
|
149
|
-
/** Every guard name any edge references. */
|
|
150
|
-
readonly guards: readonly string[];
|
|
151
|
-
/** Every cell name any `{ to, cell }` edge references. */
|
|
152
|
-
readonly cells: readonly string[];
|
|
153
|
-
readonly edges: readonly ChartEdge[];
|
|
154
|
-
readonly refusals: readonly ChartRefusal[];
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* A read edge MINUS the state it leaves — everything about an edge that is a
|
|
158
|
-
* fact of the edge itself rather than of the grid it sits in.
|
|
159
|
-
*
|
|
160
|
-
* The reducer form has no state dimension (`src/chart/inspect/reducer.ts`), so
|
|
161
|
-
* its edges are exactly this: same kinds, same targets, same guard/cell/cmd
|
|
162
|
-
* fields, with `from` unrepresentable rather than blank.
|
|
163
|
-
*/
|
|
164
|
-
type EdgeCore = Omit<ChartEdge, "from">;
|
|
165
|
-
/**
|
|
166
|
-
* Read a chart into its {@link ChartDescription}.
|
|
167
|
-
*
|
|
168
|
-
* Pure, total, and allocation-only — it never executes a guard, a cell or a
|
|
169
|
-
* payload builder, so it is safe on a chart whose parts do not exist yet.
|
|
170
|
-
*/
|
|
171
|
-
declare function describeChart<const C extends Chart<C>>(chart: C): ChartDescription;
|
|
172
|
-
/** The declared edge out of `state` on `event`, or `undefined`. */
|
|
173
|
-
declare function edgeAt(desc: ChartDescription, state: string, event: string): ChartEdge | undefined;
|
|
174
|
-
/** Why `state` refuses `event`, or `undefined` when it does not. */
|
|
175
|
-
declare function refusalAtState(desc: ChartDescription, state: string, event: string): RefusalReason | undefined;
|
|
176
|
-
/** The record for `state`, or `undefined` when the chart has no such state. */
|
|
177
|
-
declare function stateInfo(desc: ChartDescription, state: string): ChartStateInfo | undefined;
|
|
178
|
-
|
|
179
|
-
/** Any guard, however narrowly its use sites typed it. */
|
|
180
|
-
type AnyGuard = (...args: never[]) => boolean;
|
|
181
|
-
/** Any cell, in either the single-body or the per-site form. */
|
|
182
|
-
type AnyCell = ((...args: never[]) => readonly [{
|
|
183
|
-
readonly type: string;
|
|
184
|
-
}, unknown]) | Readonly<Record<string, unknown>>;
|
|
185
|
-
/**
|
|
186
|
-
* The code parts a preview may consult — the SAME bag `compile` receives, so
|
|
187
|
-
* an author passes the one they already built rather than a second copy.
|
|
188
|
-
* Every field is optional: the preview degrades where a part is absent.
|
|
189
|
-
*/
|
|
190
|
-
interface InspectParts {
|
|
191
|
-
readonly guards?: Readonly<Record<string, AnyGuard | undefined>>;
|
|
192
|
-
readonly cells?: Readonly<Record<string, AnyCell | undefined>>;
|
|
193
|
-
}
|
|
194
|
-
/** Everything a live preview may consult, beyond the state itself. */
|
|
195
|
-
interface InspectOptions {
|
|
196
|
-
/** The parts bag `compile` was given. Guards/cells are read from it. */
|
|
197
|
-
readonly parts?: InspectParts;
|
|
198
|
-
/** Sample payload per event — see `./samples`. */
|
|
199
|
-
readonly samples?: RtSamples;
|
|
200
|
-
}
|
|
201
|
-
/** Why a guard could not be evaluated. Each is a fact, not a guess. */
|
|
202
|
-
type GuardUnknown = "no-guard-bag" | "no-implementation" | "no-sample" | "threw";
|
|
203
|
-
/**
|
|
204
|
-
* Which branch a guarded edge would take right now.
|
|
205
|
-
*
|
|
206
|
-
* `then` / `else` are ANSWERS — the guard ran, on this state, with this msg.
|
|
207
|
-
* `unknown` is the honest non-answer, carrying the reason and (for a throwing
|
|
208
|
-
* guard) the message, so a UI shows "cannot evaluate: no sample for FAIL"
|
|
209
|
-
* rather than a confidently wrong arrow.
|
|
210
|
-
*/
|
|
211
|
-
type GuardPreview = {
|
|
212
|
-
readonly guard: string;
|
|
213
|
-
readonly branch: "then" | "else";
|
|
214
|
-
/** The state that branch lands on. */
|
|
215
|
-
readonly target: string;
|
|
216
|
-
/** The cmds that branch fires. */
|
|
217
|
-
readonly cmds: readonly string[];
|
|
218
|
-
} | {
|
|
219
|
-
readonly guard: string;
|
|
220
|
-
readonly branch: "unknown";
|
|
221
|
-
readonly why: GuardUnknown;
|
|
222
|
-
/** The thrown error's message, when `why` is `"threw"`. */
|
|
223
|
-
readonly error?: string;
|
|
224
|
-
};
|
|
225
|
-
/** How a single target was determined, when one could be. */
|
|
226
|
-
type ResolvedBy = "declared" | "guard" | "resume" | "cell";
|
|
227
|
-
/**
|
|
228
|
-
* What would happen if `event` were dispatched at the current state.
|
|
229
|
-
*
|
|
230
|
-
* A refusal is FIRST-CLASS: it carries the reason and a rendered explanation,
|
|
231
|
-
* so a UI draws it as visibly refused rather than omitting the control. That
|
|
232
|
-
* is the totality property paying rent — the chart knows the difference
|
|
233
|
-
* between "not routed here", "deliberately dropped here" and "this state is
|
|
234
|
-
* over", and a debugger that hides all three behind a missing button throws
|
|
235
|
-
* away the one thing this substrate knows and others do not.
|
|
236
|
-
*/
|
|
237
|
-
interface EventPreview {
|
|
238
|
-
readonly event: string;
|
|
239
|
-
readonly status: "legal" | "refused";
|
|
240
|
-
/**
|
|
241
|
-
* Who would send this — the event's declared `from`, carried through rather
|
|
242
|
-
* than recomputed, so a button row can be grouped by sender with the same
|
|
243
|
-
* answer the report's "waiting on" line gives. `undefined` when the chart
|
|
244
|
-
* does not say.
|
|
245
|
-
*/
|
|
246
|
-
readonly from?: EventOrigin;
|
|
247
|
-
/** Present iff `status` is `"refused"`. */
|
|
248
|
-
readonly reason?: RefusalReason;
|
|
249
|
-
/** A one-line rendering of `reason`. Present iff refused. */
|
|
250
|
-
readonly why?: string;
|
|
251
|
-
/** The declared edge. Present iff legal. */
|
|
252
|
-
readonly edge?: ChartEdge;
|
|
253
|
-
/** Present iff the edge is guarded. */
|
|
254
|
-
readonly guard?: GuardPreview;
|
|
255
|
-
/**
|
|
256
|
-
* The cmds that WOULD fire — read off the edge's declaration. For a guarded
|
|
257
|
-
* edge whose branch resolved, the cmds of THAT arm; for one that did not, the
|
|
258
|
-
* `then` arm's (the declared happy path) — `guard.branch === "unknown"` is
|
|
259
|
-
* what says so.
|
|
260
|
-
*
|
|
261
|
-
* This is the BEFORE question, and a `{ to, cell }` edge answers it with an
|
|
262
|
-
* empty list BY DECLARATION: the cell builds its cmds inside its body, so the
|
|
263
|
-
* chart has none to declare. For what actually fired, ask the after question
|
|
264
|
-
* — `captureCmds` in `./captured`, which reads the emitted cmds off the
|
|
265
|
-
* machine's own output.
|
|
266
|
-
*/
|
|
267
|
-
readonly cmds: readonly string[];
|
|
268
|
-
/** Every state the edge declares it can reach. */
|
|
269
|
-
readonly targets: readonly string[];
|
|
270
|
-
/** The single target, when one is determined. */
|
|
271
|
-
readonly resolved?: string;
|
|
272
|
-
/** How {@link EventPreview.resolved} was determined. */
|
|
273
|
-
readonly resolvedBy?: ResolvedBy;
|
|
274
|
-
/**
|
|
275
|
-
* The msg this preview used — the sample plus the chart's `type`. `undefined`
|
|
276
|
-
* when the event declares a payload and no sample was supplied, which is
|
|
277
|
-
* also why a guard or cell may have come back `unknown`.
|
|
278
|
-
*/
|
|
279
|
-
readonly msg?: {
|
|
280
|
-
readonly type: string;
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Preview one event against a live state.
|
|
285
|
-
*
|
|
286
|
-
* @param desc the chart's {@link ChartDescription}.
|
|
287
|
-
* @param state the live state — anything with a `type` (and `was`, on a
|
|
288
|
-
* parking state, which is what makes a resume target resolvable).
|
|
289
|
-
*/
|
|
290
|
-
declare function previewEvent<S extends {
|
|
291
|
-
readonly type: string;
|
|
292
|
-
}>(desc: ChartDescription, state: S, event: string, opts?: InspectOptions): EventPreview;
|
|
293
|
-
/**
|
|
294
|
-
* Preview EVERY event of the alphabet against a live state, in the chart's
|
|
295
|
-
* declaration order.
|
|
296
|
-
*
|
|
297
|
-
* This is the button row: one entry per declared event, each either legal
|
|
298
|
-
* (with its branch, targets and cmds) or refused (with its reason). Nothing is
|
|
299
|
-
* filtered out — a refused event is a control the UI draws, not one it lacks.
|
|
300
|
-
*/
|
|
301
|
-
declare function inspectState<S extends {
|
|
302
|
-
readonly type: string;
|
|
303
|
-
}>(desc: ChartDescription, state: S, opts?: InspectOptions): readonly EventPreview[];
|
|
304
|
-
/**
|
|
305
|
-
* {@link inspectState}, plus the two roll-ups a caller almost always wants
|
|
306
|
-
* next: the legal event names and the refused ones.
|
|
307
|
-
*
|
|
308
|
-
* The whole verdict list is still there — the split is a convenience, not a
|
|
309
|
-
* filter, and `events` remains the surface a UI renders so a refusal keeps its
|
|
310
|
-
* reason.
|
|
311
|
-
*/
|
|
312
|
-
declare function inspectStateSummary<S extends {
|
|
313
|
-
readonly type: string;
|
|
314
|
-
}>(desc: ChartDescription, state: S, opts?: InspectOptions): {
|
|
315
|
-
readonly state: S;
|
|
316
|
-
readonly events: readonly EventPreview[];
|
|
317
|
-
readonly legal: readonly string[];
|
|
318
|
-
readonly refused: readonly string[];
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* A QUESTION THIS FORM CANNOT ANSWER, carried in the slot where the grid form
|
|
323
|
-
* carries the answer.
|
|
324
|
-
*
|
|
325
|
-
* `answerable: false` is the whole type: there is no `true` member, because a
|
|
326
|
-
* question this form CAN answer is answered with the answer. So `desc.refusals`
|
|
327
|
-
* on a reducer description is not an empty list a UI silently renders — it is a
|
|
328
|
-
* value whose only shape says why the list is not there, and code written
|
|
329
|
-
* against the grid form's array fails to compile against it.
|
|
330
|
-
*/
|
|
331
|
-
interface Unanswerable<Q extends string> {
|
|
332
|
-
readonly answerable: false;
|
|
333
|
-
/** Which question — the grid-form field this stands in for. */
|
|
334
|
-
readonly question: Q;
|
|
335
|
-
/** One line, ready to render. */
|
|
336
|
-
readonly why: string;
|
|
337
|
-
}
|
|
338
|
-
/** One edge of a reducer chart — an edge with no state to leave from. */
|
|
339
|
-
type ReducerEdge = EdgeCore;
|
|
340
|
-
/** One event of a reducer chart's alphabet. `scope` has no counterpart here. */
|
|
341
|
-
interface ReducerEventInfo {
|
|
342
|
-
readonly name: string;
|
|
343
|
-
/** `foreign: true` — the name belongs to someone else and stays bare. */
|
|
344
|
-
readonly foreign: boolean;
|
|
345
|
-
/** WHO SENDS THIS. `undefined` means the chart does not say — never a guess. */
|
|
346
|
-
readonly from?: EventOrigin;
|
|
347
|
-
/** Whether the event declared a payload (`data: ty<…>()`). */
|
|
348
|
-
readonly hasPayload: boolean;
|
|
349
|
-
/** `false` iff the chart declares this event and routes it nowhere. */
|
|
350
|
-
readonly routed: boolean;
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* A reducer-form chart, as data a UI can build itself from — the same contract
|
|
354
|
-
* as {@link import("./describe").ChartDescription}, over the facts this form
|
|
355
|
-
* actually has.
|
|
356
|
-
*/
|
|
357
|
-
interface ReducerChartDescription {
|
|
358
|
-
/** The declared state names, in declaration order. Flat: there are no groups. */
|
|
359
|
-
readonly states: readonly string[];
|
|
360
|
-
/** The entry state — the chart's `initial` field, not a marked node. */
|
|
361
|
-
readonly initial: string;
|
|
362
|
-
readonly events: readonly ReducerEventInfo[];
|
|
363
|
-
/** Every cmd DECLARED in the `cmds` section — the effect alphabet. */
|
|
364
|
-
readonly cmds: readonly string[];
|
|
365
|
-
readonly guards: readonly string[];
|
|
366
|
-
readonly cells: readonly string[];
|
|
367
|
-
/** One edge per routed event, in the alphabet's declaration order. */
|
|
368
|
-
readonly edges: readonly ReducerEdge[];
|
|
369
|
-
/**
|
|
370
|
-
* TOTALITY, read back off the value: `true` iff every declared event owes and
|
|
371
|
-
* has an edge. Through the typed door this is always `true` — `on` is a
|
|
372
|
-
* required mapped type — so a `false` here means the types were bypassed with
|
|
373
|
-
* a cast, exactly as `refusals`' `undeclared` kind does in the grid form.
|
|
374
|
-
*/
|
|
375
|
-
readonly total: boolean;
|
|
376
|
-
/** The declared events with no edge. Empty through the typed door. */
|
|
377
|
-
readonly missing: readonly string[];
|
|
378
|
-
/** NOT AVAILABLE — see {@link Unanswerable}. */
|
|
379
|
-
readonly phases: Unanswerable<"phases">;
|
|
380
|
-
/** NOT AVAILABLE — see {@link Unanswerable}. */
|
|
381
|
-
readonly refusals: Unanswerable<"refusals">;
|
|
382
|
-
/** NOT AVAILABLE — see {@link Unanswerable}. */
|
|
383
|
-
readonly scope: Unanswerable<"scope">;
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Read a reducer-form chart into its {@link ReducerChartDescription}.
|
|
387
|
-
*
|
|
388
|
-
* Pure, total and allocation-only, exactly as `describeChart` is: it never runs
|
|
389
|
-
* a guard, a cell or a payload builder, so it is safe on a chart whose parts do
|
|
390
|
-
* not exist yet.
|
|
391
|
-
*/
|
|
392
|
-
declare function describeReducerChart<const C extends ReducerChart<C>>(chart: C): ReducerChartDescription;
|
|
393
|
-
/** The edge that routes `event`, or `undefined` when the chart routes it nowhere. */
|
|
394
|
-
declare function reducerEdgeAt(desc: ReducerChartDescription, event: string): ReducerEdge | undefined;
|
|
395
|
-
/**
|
|
396
|
-
* What would happen if `event` were dispatched at the current state.
|
|
397
|
-
*
|
|
398
|
-
* There is NO `status` field, and its absence is the honest part: this form
|
|
399
|
-
* cannot refuse an event — `on` is total over the alphabet and there is no
|
|
400
|
-
* state dimension to refuse from — so a "legal" tag would be a distinction
|
|
401
|
-
* without a second case. Everything a grid preview can still say here it says:
|
|
402
|
-
* the edge, the guard's branch, the declared fan-out, the target a cell picks.
|
|
403
|
-
*
|
|
404
|
-
* The cmds are the DECLARED ones — the before question. For what actually
|
|
405
|
-
* fired, see `captureCmds` in `./captured`.
|
|
406
|
-
*/
|
|
407
|
-
interface ReducerEventPreview {
|
|
408
|
-
readonly event: string;
|
|
409
|
-
/** The event's declared `from`, carried through rather than recomputed. */
|
|
410
|
-
readonly from?: EventOrigin;
|
|
411
|
-
/** The declared edge. `undefined` only when the chart routes the event nowhere. */
|
|
412
|
-
readonly edge?: ReducerEdge;
|
|
413
|
-
/** Present iff the edge is guarded. */
|
|
414
|
-
readonly guard?: GuardPreview;
|
|
415
|
-
/** The cmds the edge DECLARES for the arm that resolved. */
|
|
416
|
-
readonly cmds: readonly string[];
|
|
417
|
-
/** Every state the edge declares it can reach. */
|
|
418
|
-
readonly targets: readonly string[];
|
|
419
|
-
/** The single target, when one is determined. */
|
|
420
|
-
readonly resolved?: string;
|
|
421
|
-
/** How {@link ReducerEventPreview.resolved} was determined. */
|
|
422
|
-
readonly resolvedBy?: ResolvedBy;
|
|
423
|
-
/** The msg this preview used, or `undefined` when no sample was supplied. */
|
|
424
|
-
readonly msg?: {
|
|
425
|
-
readonly type: string;
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
/**
|
|
429
|
-
* Preview one event of a reducer chart against a live state.
|
|
430
|
-
*
|
|
431
|
-
* The guard and cell previews are the SAME functions the grid form uses — a
|
|
432
|
-
* guard is pure and a cell is pure in both forms, and the only difference is
|
|
433
|
-
* that `at` is the bare event name.
|
|
434
|
-
*/
|
|
435
|
-
declare function previewReducerEvent<S extends {
|
|
436
|
-
readonly type: string;
|
|
437
|
-
}>(desc: ReducerChartDescription, state: S, event: string, opts?: InspectOptions): ReducerEventPreview;
|
|
438
|
-
/**
|
|
439
|
-
* Preview EVERY event of a reducer chart's alphabet against a live state, in
|
|
440
|
-
* declaration order. The button row — and here every control is live, because
|
|
441
|
-
* this form has nothing with which to refuse one.
|
|
442
|
-
*/
|
|
443
|
-
declare function inspectReducerState<S extends {
|
|
444
|
-
readonly type: string;
|
|
445
|
-
}>(desc: ReducerChartDescription, state: S, opts?: InspectOptions): readonly ReducerEventPreview[];
|
|
446
|
-
|
|
447
|
-
export { type AnyCell as A, type ChartDescription as C, type EdgeCore as E, type GuardPreview as G, type InspectOptions as I, type ReducerChartDescription as R, type Unanswerable as U, type AnyGuard as a, type ChartEdge as b, type ChartEventInfo as c, type ChartRefusal as d, type ChartStateInfo as e, type EdgeKind as f, type EventPreview as g, type GuardUnknown as h, type InspectParts as i, type ReducerEdge as j, type ReducerEventInfo as k, type ReducerEventPreview as l, type RefusalReason as m, type ResolvedBy as n, describeChart as o, describeReducerChart as p, edgeAt as q, explainRefusal as r, inspectReducerState as s, inspectState as t, inspectStateSummary as u, previewEvent as v, previewReducerEvent as w, reducerEdgeAt as x, refusalAtState as y, stateInfo as z };
|