yaml-flow 8.7.0 → 8.8.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/browser/adapters/firebase-storage.js +2 -2
- package/browser/adapters/firestore-storage.js +2 -2
- package/browser/adapters/localstorage-storage.js +3 -3
- package/browser/asset-integrity.json +11 -15
- package/browser/live-cards.schema.json +10 -1
- package/browser/server-runtime-controlface.js +5 -5
- package/examples/ARCHITECTURE.md +0 -27
- package/examples/board/server/board-server.js +151 -101
- package/examples/board/server/board-worker/source_def_flows.json +0 -8
- package/examples/board/server/board-worker/task-executor.js +1 -3
- package/examples/board/test/server-http-test.js +181 -152
- package/examples/board-firestore/server/worker.js +9 -1
- package/examples/portfolio-tracker/portfolio-tracker.js +11 -1
- package/examples/portfolio-tracker/test/portfolio-t4.js +12 -2
- package/lib/{artifacts-store-lib-D9nMkVcE.d.cts → artifacts-store-lib-C6qBpMfU.d.cts} +1 -1
- package/lib/{artifacts-store-lib-DSSMqVL2.d.ts → artifacts-store-lib-D4qf7Q-7.d.ts} +1 -1
- package/lib/artifacts-store-public.d.cts +3 -3
- package/lib/artifacts-store-public.d.ts +3 -3
- package/lib/board-live-cards-mcp.cjs +1 -1
- package/lib/board-live-cards-mcp.d.cts +7 -7
- package/lib/board-live-cards-mcp.d.ts +7 -7
- package/lib/board-live-cards-mcp.js +1 -1
- package/lib/board-live-cards-node.cjs +8 -8
- package/lib/board-live-cards-node.d.cts +16 -14
- package/lib/board-live-cards-node.d.ts +16 -14
- package/lib/board-live-cards-node.js +8 -8
- package/lib/{board-live-cards-public-DQzPe7A9.d.cts → board-live-cards-public-BT5HrgqZ.d.cts} +82 -59
- package/lib/{board-live-cards-public-D-DJek3X.d.ts → board-live-cards-public-DSRamFm8.d.ts} +82 -59
- package/lib/{board-live-cards-public-async-CgMCYYft.d.cts → board-live-cards-public-async-CYjr4mgX.d.cts} +18 -8
- package/lib/{board-live-cards-public-async-3hUuHxDx.d.ts → board-live-cards-public-async-DlyC3PgC.d.ts} +18 -8
- package/lib/board-live-cards-public.cjs +1 -1
- package/lib/board-live-cards-public.d.cts +2 -2
- package/lib/board-live-cards-public.d.ts +2 -2
- package/lib/board-live-cards-public.js +1 -1
- package/lib/board-live-cards-server-runtime.cjs +1 -1
- package/lib/board-live-cards-server-runtime.d.cts +6 -8
- package/lib/board-live-cards-server-runtime.d.ts +6 -8
- package/lib/board-live-cards-server-runtime.js +1 -1
- package/lib/board-livegraph-runtime/index.cjs +1 -1
- package/lib/board-livegraph-runtime/index.js +1 -1
- package/lib/{board-platform-adapter-async-DOfEq_HC.d.cts → board-platform-adapter-async-BZIftm36.d.cts} +18 -14
- package/lib/{board-platform-adapter-async-JZPCzZnH.d.ts → board-platform-adapter-async-JP9V-U5E.d.ts} +18 -14
- package/lib/board-worker-adapter.cjs +1 -24
- package/lib/board-worker-adapter.d.cts +68 -3
- package/lib/board-worker-adapter.d.ts +68 -3
- package/lib/board-worker-adapter.js +1 -24
- package/lib/card-compute/index.cjs +1 -1
- package/lib/card-compute/index.js +1 -1
- package/lib/card-store-public.d.cts +2 -2
- package/lib/card-store-public.d.ts +2 -2
- package/lib/card-validation.cjs +1 -1
- package/lib/card-validation.js +1 -1
- package/lib/chat-store-public.cjs +1 -1
- package/lib/chat-store-public.d.cts +20 -20
- package/lib/chat-store-public.d.ts +20 -20
- package/lib/chat-store-public.js +1 -1
- package/lib/chunk-2GSI6C45.js +7 -0
- package/lib/chunk-35N7ONTH.js +2 -0
- package/lib/chunk-37HDEW26.cjs +2 -0
- package/lib/{chunk-PMUSJQSR.cjs → chunk-3CZCGNY4.cjs} +2 -2
- package/lib/chunk-3KC6LBOG.js +3 -0
- package/lib/{chunk-BQS3EIEK.js → chunk-44L64VQ2.js} +3 -3
- package/lib/chunk-6OPXQPSC.js +2 -0
- package/lib/chunk-7BTZCOT5.js +2 -0
- package/lib/{chunk-U2N6MCD5.cjs → chunk-7JVHYHT2.cjs} +2 -2
- package/lib/chunk-7QZ267XP.cjs +2 -0
- package/lib/{chunk-XQRNDX4Q.js → chunk-ANKA7HEJ.js} +2 -2
- package/lib/{chunk-KAWQPLIE.cjs → chunk-BQUQTOPB.cjs} +2 -2
- package/lib/chunk-CMFD27ZC.cjs +3 -0
- package/lib/chunk-DOFNXJ4C.js +3 -0
- package/lib/chunk-ETW3BXHD.cjs +2 -0
- package/lib/chunk-FO4KNVU7.cjs +2 -0
- package/lib/{chunk-SGV7PU4H.js → chunk-FOFGEABN.js} +2 -2
- package/lib/chunk-GPCMBPLK.cjs +2 -0
- package/lib/chunk-GU3T75C4.js +3 -0
- package/lib/chunk-H3EHFCDZ.js +3 -0
- package/lib/chunk-H4TYOSMD.cjs +45 -0
- package/lib/chunk-HFW7E2Z7.cjs +4 -0
- package/lib/chunk-HWYMZK3N.cjs +3 -0
- package/lib/chunk-IQIZA7TN.cjs +7 -0
- package/lib/chunk-J4MHQ7JF.js +45 -0
- package/lib/chunk-MCPADH33.cjs +2 -0
- package/lib/chunk-NBJTYAYN.cjs +2 -0
- package/lib/chunk-NDAKMJQK.cjs +3 -0
- package/lib/chunk-NNSBBO5R.js +2 -0
- package/lib/chunk-NU5NO5NM.js +2 -0
- package/lib/chunk-O4RKTQBP.cjs +3 -0
- package/lib/chunk-O5UYCGIN.js +2 -0
- package/lib/chunk-Q3OTUDIE.js +2 -0
- package/lib/chunk-R44X3RQB.cjs +2 -0
- package/lib/chunk-RKKSVOP2.js +2 -0
- package/lib/chunk-UB54HZA4.cjs +2 -0
- package/lib/{chunk-CIAJNUR4.js → chunk-VGDLSS2H.js} +2 -2
- package/lib/{chunk-SFVO2LB2.cjs → chunk-VQCIOKJV.cjs} +3 -3
- package/lib/chunk-VS3BXEYK.js +4 -0
- package/lib/chunk-Y4WK7HE4.js +2 -0
- package/lib/chunk-YBYXCFAI.js +2 -0
- package/lib/chunk-ZK3E7L4Y.cjs +2 -0
- package/lib/cloud-storage.cjs +1 -1
- package/lib/cloud-storage.d.cts +6 -6
- package/lib/cloud-storage.d.ts +6 -6
- package/lib/cloud-storage.js +1 -1
- package/lib/continuous-event-graph/index.cjs +1 -1
- package/lib/continuous-event-graph/index.js +1 -1
- package/lib/execution-refs.cjs +1 -1
- package/lib/execution-refs.js +1 -1
- package/lib/firebase-storage/index.cjs +2 -2
- package/lib/firebase-storage/index.d.cts +2 -2
- package/lib/firebase-storage/index.d.ts +2 -2
- package/lib/firebase-storage/index.js +2 -2
- package/lib/firestore-storage/index.cjs +2 -2
- package/lib/firestore-storage/index.d.cts +23 -8
- package/lib/firestore-storage/index.d.ts +23 -8
- package/lib/firestore-storage/index.js +2 -2
- package/lib/index.cjs +2 -2
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/localstorage-storage/index.cjs +1 -1
- package/lib/localstorage-storage/index.d.cts +10 -6
- package/lib/localstorage-storage/index.d.ts +10 -6
- package/lib/localstorage-storage/index.js +1 -1
- package/lib/{mcp-tool-registries-W3TRj6O5.d.cts → mcp-tool-registries-CRtea2x4.d.cts} +3 -0
- package/lib/{mcp-tool-registries-BBObLYga.d.ts → mcp-tool-registries-D3rWSppt.d.ts} +3 -0
- package/lib/server-jobs-queue-runner/index.cjs +1 -1
- package/lib/server-jobs-queue-runner/index.d.cts +12 -9
- package/lib/server-jobs-queue-runner/index.d.ts +12 -9
- package/lib/server-jobs-queue-runner/index.js +1 -1
- package/lib/server-runtime/index.cjs +1 -1
- package/lib/server-runtime/index.d.cts +7 -9
- package/lib/server-runtime/index.d.ts +7 -9
- package/lib/server-runtime/index.js +1 -1
- package/lib/server-runtime-agentface/index.d.cts +7 -9
- package/lib/server-runtime-agentface/index.d.ts +7 -9
- package/lib/server-runtime-controlface/index.cjs +1 -1
- package/lib/server-runtime-controlface/index.d.cts +19 -71
- package/lib/server-runtime-controlface/index.d.ts +19 -71
- package/lib/server-runtime-controlface/index.js +1 -1
- package/lib/server-runtime-core/index.cjs +1 -1
- package/lib/server-runtime-core/index.d.cts +61 -21
- package/lib/server-runtime-core/index.d.ts +61 -21
- package/lib/server-runtime-core/index.js +1 -1
- package/lib/server-runtime-watchers/index.cjs +1 -1
- package/lib/server-runtime-watchers/index.d.cts +9 -65
- package/lib/server-runtime-watchers/index.d.ts +9 -65
- package/lib/server-runtime-watchers/index.js +1 -1
- package/lib/server-runtime-webhooks/index.d.cts +7 -9
- package/lib/server-runtime-webhooks/index.d.ts +7 -9
- package/lib/sse-hub-CYXisfXJ.d.cts +63 -0
- package/lib/sse-hub-Dodwtc3_.d.ts +63 -0
- package/lib/step-machine-public/index.cjs +1 -1
- package/lib/step-machine-public/index.d.cts +1 -1
- package/lib/step-machine-public/index.d.ts +1 -1
- package/lib/step-machine-public/index.js +1 -1
- package/lib/{storage-async-interface-BRR4eBjx.d.cts → storage-async-interface-CG0bMqvE.d.ts} +20 -1
- package/lib/{storage-async-interface-DhlOVPSp.d.ts → storage-async-interface-CyO-zwVQ.d.cts} +20 -1
- package/lib/{storage-interface-BFiD3kyB.d.ts → storage-interface-D-iEiTJA.d.cts} +45 -1
- package/lib/{storage-interface-BFiD3kyB.d.cts → storage-interface-D-iEiTJA.d.ts} +45 -1
- package/lib/stores/index.d.cts +1 -1
- package/lib/stores/index.d.ts +1 -1
- package/lib/stores/kv.d.cts +1 -1
- package/lib/stores/kv.d.ts +1 -1
- package/lib/{types-CF2xUcZW.d.ts → types-BtH3scgE.d.ts} +66 -29
- package/lib/{types-BzQY45dH.d.cts → types-Ch0u3FKP.d.cts} +66 -29
- package/package.json +4 -5
- package/schema/live-cards.schema.json +10 -1
- package/browser/board-livecards-client.js +0 -2
- package/examples/board/demo-shell-with-server.html +0 -272
- package/examples/board/doc.html +0 -465
- package/examples/board/server-config.json +0 -24
- package/lib/chat-storage-lib-B9Q34Dyv.d.cts +0 -54
- package/lib/chat-storage-lib-DB9iSai2.d.ts +0 -54
- package/lib/chunk-5XHOHTLZ.cjs +0 -2
- package/lib/chunk-6APH25VI.js +0 -2
- package/lib/chunk-76ON3V7R.js +0 -2
- package/lib/chunk-7ICPAABP.cjs +0 -7
- package/lib/chunk-CPAXTVBQ.cjs +0 -2
- package/lib/chunk-DDYSXP2A.cjs +0 -3
- package/lib/chunk-EGRHWZRV.js +0 -2
- package/lib/chunk-GL2OHR2E.cjs +0 -2
- package/lib/chunk-GYQXDNNI.cjs +0 -2
- package/lib/chunk-H5HBXPOI.cjs +0 -3
- package/lib/chunk-IPLSRN6P.cjs +0 -4
- package/lib/chunk-J5J6BG7B.js +0 -2
- package/lib/chunk-M3OU6IS5.cjs +0 -2
- package/lib/chunk-M6STQR5F.cjs +0 -2
- package/lib/chunk-N6P2JW4W.js +0 -3
- package/lib/chunk-NJJ7WEDT.cjs +0 -2
- package/lib/chunk-NKIQRCOM.cjs +0 -2
- package/lib/chunk-NMZ6XNLB.cjs +0 -3
- package/lib/chunk-OEFTOO47.cjs +0 -3
- package/lib/chunk-PRHQBGPT.js +0 -2
- package/lib/chunk-S44QZUDX.js +0 -2
- package/lib/chunk-TSN3RTXT.js +0 -4
- package/lib/chunk-VLBB3D6B.js +0 -3
- package/lib/chunk-VMW4Z6EF.js +0 -3
- package/lib/chunk-VXJHBWK3.js +0 -2
- package/lib/chunk-WHDEBJLT.js +0 -7
- package/lib/chunk-YGALANRO.js +0 -2
- package/lib/chunk-ZXQR7GHT.js +0 -3
package/examples/board/doc.html
DELETED
|
@@ -1,465 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>Example Board Demo (Server Runtime)</title>
|
|
7
|
-
<link rel="icon" type="image/svg+xml" href="../../browser/favicon.svg" />
|
|
8
|
-
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" />
|
|
9
|
-
<style>
|
|
10
|
-
/* Scale down markdown headings inside cards to stay in proportion with card body text */
|
|
11
|
-
.lc-result h1 { font-size: 1rem; font-weight: 700; margin: 0.5rem 0 0.25rem; }
|
|
12
|
-
.lc-result h2 { font-size: 0.9rem; font-weight: 700; margin: 0.5rem 0 0.25rem; border-bottom: 1px solid #dee2e6; padding-bottom: 0.1rem; }
|
|
13
|
-
.lc-result h3 { font-size: 0.85rem; font-weight: 600; margin: 0.4rem 0 0.2rem; }
|
|
14
|
-
.lc-result p { font-size: 0.8rem; margin: 0 0 0.25rem; }
|
|
15
|
-
.lc-result ul, .lc-result ol { font-size: 0.8rem; margin: 0 0 0.25rem; padding-left: 1.2rem; }
|
|
16
|
-
.lc-result li { margin-bottom: 0.15rem; }
|
|
17
|
-
.demo-docs pre {
|
|
18
|
-
background: #0f172a;
|
|
19
|
-
border-radius: 0.75rem;
|
|
20
|
-
color: #e2e8f0;
|
|
21
|
-
font-size: 0.8rem;
|
|
22
|
-
margin: 0;
|
|
23
|
-
overflow-x: auto;
|
|
24
|
-
padding: 0.9rem 1rem;
|
|
25
|
-
white-space: pre-wrap;
|
|
26
|
-
}
|
|
27
|
-
.demo-docs code {
|
|
28
|
-
color: inherit;
|
|
29
|
-
font-size: inherit;
|
|
30
|
-
}
|
|
31
|
-
.demo-docs .list-inline-item {
|
|
32
|
-
margin-right: 0.35rem;
|
|
33
|
-
margin-bottom: 0.35rem;
|
|
34
|
-
}
|
|
35
|
-
</style>
|
|
36
|
-
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
37
|
-
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
38
|
-
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
|
|
39
|
-
<script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
|
|
40
|
-
<script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.7.0/browser/live-cards.js"></script>
|
|
41
|
-
<script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.7.0/browser/board-livecards-client.js"></script>
|
|
42
|
-
</head>
|
|
43
|
-
<body class="bg-light">
|
|
44
|
-
<div class="container-fluid py-3">
|
|
45
|
-
<div class="d-flex flex-wrap align-items-center justify-content-between gap-2 mb-3">
|
|
46
|
-
<div>
|
|
47
|
-
<h1 class="h4 mb-0" id="boardTitle">Example Board (Server Runtime)</h1>
|
|
48
|
-
<div class="small text-muted" id="boardDesc"></div>
|
|
49
|
-
</div>
|
|
50
|
-
<div class="d-flex align-items-center gap-2">
|
|
51
|
-
<select class="form-select form-select-sm" id="boardSelector" style="max-width:180px" title="Active board"></select>
|
|
52
|
-
<button class="btn btn-sm btn-outline-success" id="addBoardBtn">+ Board</button>
|
|
53
|
-
<div id="addBoardForm" class="d-flex align-items-center gap-1" style="display:none!important">
|
|
54
|
-
<input class="form-control form-control-sm" id="newBoardId" placeholder="board-id" style="max-width:110px" />
|
|
55
|
-
<input class="form-control form-control-sm" id="newBoardLabel" placeholder="Label (optional)" style="max-width:150px" />
|
|
56
|
-
<button class="btn btn-sm btn-success" id="addBoardSubmit">Add</button>
|
|
57
|
-
<button class="btn btn-sm btn-secondary" id="addBoardCancel">Cancel</button>
|
|
58
|
-
</div>
|
|
59
|
-
<button class="btn btn-sm btn-outline-primary" id="modeBoard">Board</button>
|
|
60
|
-
<button class="btn btn-sm btn-outline-primary" id="modeCanvas">Canvas</button>
|
|
61
|
-
<button class="btn btn-sm btn-outline-secondary" id="autoLayout">Auto Layout</button>
|
|
62
|
-
<button class="btn btn-sm btn-outline-dark" id="refreshAll" style="display:none">Refresh All</button>
|
|
63
|
-
<div class="form-check ms-2">
|
|
64
|
-
<input class="form-check-input" type="checkbox" id="devModeToggle" />
|
|
65
|
-
<label class="form-check-label" for="devModeToggle">Dev Mode</label>
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<div class="alert alert-info small py-2 mb-3">
|
|
71
|
-
Server runtime mode: board initializes on first connect and streams updates via SSE.
|
|
72
|
-
Source execution and event processing happen on the server side.
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
<div class="card shadow-sm border-0 mb-3 demo-docs">
|
|
76
|
-
<div class="card-body">
|
|
77
|
-
<div class="d-flex flex-wrap justify-content-between gap-3 mb-3">
|
|
78
|
-
<div>
|
|
79
|
-
<h2 class="h6 mb-1">Advanced Composition Model</h2>
|
|
80
|
-
<p class="small text-muted mb-0">
|
|
81
|
-
This demo still mounts the full board, but the same client now exposes the shared runtime session
|
|
82
|
-
needed for filtered or projected live views. Host applications do not need to reimplement SSE,
|
|
83
|
-
client identity, notification reduction, or card chat subscribe or unsubscribe.
|
|
84
|
-
</p>
|
|
85
|
-
</div>
|
|
86
|
-
<div class="small text-muted text-end">
|
|
87
|
-
<div><strong>Active board:</strong> <span id="docActiveBoard">default</span></div>
|
|
88
|
-
<div><strong>Shared client id:</strong> <span id="docClientId">pending</span></div>
|
|
89
|
-
<div><strong>Session state:</strong> <span id="docSessionState">not connected</span></div>
|
|
90
|
-
</div>
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
<div class="row g-3">
|
|
94
|
-
<div class="col-lg-4">
|
|
95
|
-
<div class="border rounded-3 p-3 h-100 bg-white">
|
|
96
|
-
<h3 class="h6 mb-2">What is public now</h3>
|
|
97
|
-
<ul class="list-inline small mb-0">
|
|
98
|
-
<li class="list-inline-item badge text-bg-light">createBoardRuntimeSession()</li>
|
|
99
|
-
<li class="list-inline-item badge text-bg-light">createDerivedBoardRuntime()</li>
|
|
100
|
-
<li class="list-inline-item badge text-bg-light">applyBoardNotifications()</li>
|
|
101
|
-
<li class="list-inline-item badge text-bg-light">serverPayloadToBoardState()</li>
|
|
102
|
-
<li class="list-inline-item badge text-bg-light">pickBoardState()</li>
|
|
103
|
-
<li class="list-inline-item badge text-bg-light">subtractBoardState()</li>
|
|
104
|
-
<li class="list-inline-item badge text-bg-light">deriveBoardState()</li>
|
|
105
|
-
<li class="list-inline-item badge text-bg-light">session.attachProvidedState()</li>
|
|
106
|
-
<li class="list-inline-item badge text-bg-light">session.subscribeCardChats()</li>
|
|
107
|
-
<li class="list-inline-item badge text-bg-light">session.unsubscribeCardChats()</li>
|
|
108
|
-
</ul>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
<div class="col-lg-4">
|
|
112
|
-
<div class="border rounded-3 p-3 h-100 bg-white">
|
|
113
|
-
<h3 class="h6 mb-2">Recommended shape</h3>
|
|
114
|
-
<ol class="small mb-0 ps-3">
|
|
115
|
-
<li>Create one shared runtime session per logical board.</li>
|
|
116
|
-
<li>Mount the full board or any number of derived views from that same session.</li>
|
|
117
|
-
<li>Reuse the shared client id for all chat subscribe or unsubscribe calls.</li>
|
|
118
|
-
<li>Use the public reducer helpers instead of mutating projected state by hand.</li>
|
|
119
|
-
</ol>
|
|
120
|
-
</div>
|
|
121
|
-
</div>
|
|
122
|
-
<div class="col-lg-4">
|
|
123
|
-
<div class="border rounded-3 p-3 h-100 bg-white">
|
|
124
|
-
<h3 class="h6 mb-2">When to use this</h3>
|
|
125
|
-
<ul class="small mb-0 ps-3">
|
|
126
|
-
<li>split views over one board</li>
|
|
127
|
-
<li>plugin or secondary mounts</li>
|
|
128
|
-
<li>filtered card subsets</li>
|
|
129
|
-
<li>provided-state boot with live SSE attached afterward</li>
|
|
130
|
-
</ul>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
</div>
|
|
134
|
-
|
|
135
|
-
<div class="row g-3 mt-1">
|
|
136
|
-
<div class="col-xl-4">
|
|
137
|
-
<div class="border rounded-3 overflow-hidden bg-white h-100">
|
|
138
|
-
<div class="px-3 py-2 border-bottom small fw-semibold">1. Share one session</div>
|
|
139
|
-
<pre><code>const client = BoardLiveCardsClient.createBoardRuntimeClient({
|
|
140
|
-
fetchServer,
|
|
141
|
-
boardPaths,
|
|
142
|
-
getServerOrigin,
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
await client.bootstrapBoard({
|
|
146
|
-
boardId: 'default',
|
|
147
|
-
rootElement: boardRoot,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
const session = client.getRuntimeSession();</code></pre>
|
|
151
|
-
</div>
|
|
152
|
-
</div>
|
|
153
|
-
<div class="col-xl-4">
|
|
154
|
-
<div class="border rounded-3 overflow-hidden bg-white h-100">
|
|
155
|
-
<div class="px-3 py-2 border-bottom small fw-semibold">2. Mount derived live views</div>
|
|
156
|
-
<pre><code>const alertsView = client.createDerivedRuntime({
|
|
157
|
-
includeCard: (model) => model.id.startsWith('alert-'),
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
alertsView.mountBoard({
|
|
161
|
-
rootElement: alertsRoot,
|
|
162
|
-
mode: 'board',
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
// shares SSE + chat session with the main board</code></pre>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
<div class="col-xl-4">
|
|
169
|
-
<div class="border rounded-3 overflow-hidden bg-white h-100">
|
|
170
|
-
<div class="px-3 py-2 border-bottom small fw-semibold">3. Start from provided state</div>
|
|
171
|
-
<pre><code>const session = BoardLiveCardsClient.createBoardRuntimeSession({
|
|
172
|
-
fetchServer,
|
|
173
|
-
boardPaths,
|
|
174
|
-
getServerOrigin,
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
session.attachProvidedState({ boardId, payload });
|
|
178
|
-
await session.bootstrap({ boardId, skipInitBoard: true });
|
|
179
|
-
|
|
180
|
-
const view = BoardLiveCardsClient.createDerivedBoardRuntime({
|
|
181
|
-
session,
|
|
182
|
-
includeCard: (model) => model.id !== 'hidden-card',
|
|
183
|
-
});</code></pre>
|
|
184
|
-
</div>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
|
-
|
|
188
|
-
<div class="row g-3 mt-1">
|
|
189
|
-
<div class="col-xl-6">
|
|
190
|
-
<div class="border rounded-3 overflow-hidden bg-white h-100">
|
|
191
|
-
<div class="px-3 py-2 border-bottom small fw-semibold">Reducer helpers for host-managed state</div>
|
|
192
|
-
<pre><code>const state = BoardLiveCardsClient.serverPayloadToBoardState(payload);
|
|
193
|
-
|
|
194
|
-
const nextState = BoardLiveCardsClient.applyBoardNotifications(
|
|
195
|
-
state,
|
|
196
|
-
notifications,
|
|
197
|
-
() => payload,
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
const leftPane = BoardLiveCardsClient.pickBoardState(nextState, ['card-a']);
|
|
201
|
-
const rightPane = BoardLiveCardsClient.subtractBoardState(nextState, ['card-a']);</code></pre>
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
|
204
|
-
<div class="col-xl-6">
|
|
205
|
-
<div class="border rounded-3 overflow-hidden bg-white h-100">
|
|
206
|
-
<div class="px-3 py-2 border-bottom small fw-semibold">Chat lifecycle stays with the session</div>
|
|
207
|
-
<pre><code>const session = client.getRuntimeSession();
|
|
208
|
-
|
|
209
|
-
await session.subscribeCardChats(cardId);
|
|
210
|
-
await session.unsubscribeCardChats(cardId);
|
|
211
|
-
|
|
212
|
-
// same shared client id is reused automatically
|
|
213
|
-
console.log(session.getClientId());
|
|
214
|
-
|
|
215
|
-
// incoming notifications keep mounted chat UIs synchronized</code></pre>
|
|
216
|
-
</div>
|
|
217
|
-
</div>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
</div>
|
|
221
|
-
|
|
222
|
-
<div id="boardRoot">
|
|
223
|
-
<div class="d-flex align-items-center justify-content-center" style="height: 72vh;">
|
|
224
|
-
<div class="text-center">
|
|
225
|
-
<div class="spinner-border mb-3" role="status">
|
|
226
|
-
<span class="visually-hidden">Loading...</span>
|
|
227
|
-
</div>
|
|
228
|
-
<p class="text-muted">Initializing board...</p>
|
|
229
|
-
</div>
|
|
230
|
-
</div>
|
|
231
|
-
</div>
|
|
232
|
-
</div>
|
|
233
|
-
|
|
234
|
-
<script>
|
|
235
|
-
(function () {
|
|
236
|
-
const createBoardRuntimeClient = window.BoardLiveCardsClient && window.BoardLiveCardsClient.createBoardRuntimeClient;
|
|
237
|
-
const defaultBoardPaths = window.BoardLiveCardsClient && window.BoardLiveCardsClient.defaultBoardPaths;
|
|
238
|
-
if (!createBoardRuntimeClient || !defaultBoardPaths) {
|
|
239
|
-
document.getElementById('boardRoot').innerHTML =
|
|
240
|
-
'<div class="alert alert-danger">board-livecards-client.js not loaded. Run <code>npm run build:browser</code> first.</div>';
|
|
241
|
-
throw new Error('BoardLiveCardsClient not loaded');
|
|
242
|
-
}
|
|
243
|
-
let currentMode = 'canvas';
|
|
244
|
-
let bootstrapCompleted = false;
|
|
245
|
-
let activeBoardId = 'default';
|
|
246
|
-
let runtimeClient = null;
|
|
247
|
-
|
|
248
|
-
function refreshDocsRuntimeState() {
|
|
249
|
-
const boardEl = document.getElementById('docActiveBoard');
|
|
250
|
-
const clientIdEl = document.getElementById('docClientId');
|
|
251
|
-
const sessionStateEl = document.getElementById('docSessionState');
|
|
252
|
-
const session = runtimeClient && typeof runtimeClient.getRuntimeSession === 'function'
|
|
253
|
-
? runtimeClient.getRuntimeSession()
|
|
254
|
-
: null;
|
|
255
|
-
|
|
256
|
-
if (boardEl) boardEl.textContent = activeBoardId || 'default';
|
|
257
|
-
if (!session) {
|
|
258
|
-
if (clientIdEl) clientIdEl.textContent = 'unavailable';
|
|
259
|
-
if (sessionStateEl) sessionStateEl.textContent = 'not connected';
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (clientIdEl) clientIdEl.textContent = session.getClientId();
|
|
264
|
-
if (sessionStateEl) {
|
|
265
|
-
const state = session.getState();
|
|
266
|
-
const status = session.isConnected()
|
|
267
|
-
? `connected, ${Array.isArray(state && state.cardIds) ? state.cardIds.length : 0} cards in session state`
|
|
268
|
-
: 'not connected';
|
|
269
|
-
sessionStateEl.textContent = status;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
function boardPaths(boardId) {
|
|
274
|
-
return defaultBoardPaths(boardId || activeBoardId || 'default');
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
function localServerOrigins() {
|
|
278
|
-
const params = new URLSearchParams(window.location.search || '');
|
|
279
|
-
const fromQuery = params.get('demoServerOrigin');
|
|
280
|
-
const fromWindow = window.DEMO_SERVER_ORIGIN;
|
|
281
|
-
const hostPref = window.location.hostname === 'localhost' ? 'localhost' : '127.0.0.1';
|
|
282
|
-
const hostAlt = hostPref === 'localhost' ? '127.0.0.1' : 'localhost';
|
|
283
|
-
const defaults = [
|
|
284
|
-
`http://${hostPref}:7799`,
|
|
285
|
-
`http://${hostAlt}:7799`,
|
|
286
|
-
];
|
|
287
|
-
|
|
288
|
-
const unique = [];
|
|
289
|
-
const push = (v) => {
|
|
290
|
-
if (!v || typeof v !== 'string') return;
|
|
291
|
-
if (unique.includes(v)) return;
|
|
292
|
-
unique.push(v);
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
push(fromWindow);
|
|
296
|
-
push(fromQuery);
|
|
297
|
-
defaults.forEach(push);
|
|
298
|
-
return unique;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
let activeServerOrigin = null;
|
|
302
|
-
|
|
303
|
-
async function fetchServer(path, init) {
|
|
304
|
-
const origins = activeServerOrigin ? [activeServerOrigin] : localServerOrigins();
|
|
305
|
-
const failures = [];
|
|
306
|
-
|
|
307
|
-
for (const origin of origins) {
|
|
308
|
-
const url = `${origin}${path}`;
|
|
309
|
-
try {
|
|
310
|
-
const res = await fetch(url, init);
|
|
311
|
-
activeServerOrigin = origin;
|
|
312
|
-
return res;
|
|
313
|
-
} catch (err) {
|
|
314
|
-
failures.push(`${url} -> ${String(err && err.message || err)}`);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const tip = 'Start the server from the yaml-flow folder: node public-examples/board/server/board-server.js';
|
|
319
|
-
throw new Error(`Unable to reach example-board demo server. Tried: ${failures.join(' | ')}. ${tip}`);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
runtimeClient = createBoardRuntimeClient({
|
|
323
|
-
fetchServer,
|
|
324
|
-
boardPaths,
|
|
325
|
-
getServerOrigin: function () { return activeServerOrigin; },
|
|
326
|
-
initialMode: currentMode,
|
|
327
|
-
canvas: { height: '72vh', overflow: 'auto' },
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
async function loadBoardList() {
|
|
331
|
-
try {
|
|
332
|
-
const res = await fetchServer('/api/boards');
|
|
333
|
-
if (!res.ok) return;
|
|
334
|
-
const data = await res.json();
|
|
335
|
-
const boards = Array.isArray(data && data.boards) ? data.boards : [];
|
|
336
|
-
const sel = document.getElementById('boardSelector');
|
|
337
|
-
const prev = sel.value;
|
|
338
|
-
sel.innerHTML = boards.map((b) =>
|
|
339
|
-
`<option value="${b.id}"${b.id === (prev || activeBoardId) ? ' selected' : ''}>${b.label || b.id}</option>`
|
|
340
|
-
).join('');
|
|
341
|
-
if (boards.length && !boards.some((b) => b.id === activeBoardId)) {
|
|
342
|
-
activeBoardId = boards[0].id;
|
|
343
|
-
sel.value = activeBoardId;
|
|
344
|
-
}
|
|
345
|
-
} catch (err) {
|
|
346
|
-
console.warn('Could not load board list', err);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
async function switchBoard(boardId) {
|
|
351
|
-
if (boardId === activeBoardId && bootstrapCompleted) return;
|
|
352
|
-
runtimeClient.dispose();
|
|
353
|
-
bootstrapCompleted = false;
|
|
354
|
-
activeBoardId = boardId;
|
|
355
|
-
refreshDocsRuntimeState();
|
|
356
|
-
document.getElementById('boardRoot').innerHTML =
|
|
357
|
-
'<div class="d-flex align-items-center justify-content-center" style="height:72vh">'
|
|
358
|
-
+ '<div class="text-center"><div class="spinner-border mb-3" role="status">'
|
|
359
|
-
+ '<span class="visually-hidden">Loading...</span></div>'
|
|
360
|
-
+ '<p class="text-muted">Loading board...</p></div></div>';
|
|
361
|
-
await bootstrap(boardId);
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
async function bootstrap(boardId) {
|
|
365
|
-
const bid = boardId || activeBoardId || 'default';
|
|
366
|
-
|
|
367
|
-
// Board title from registry label or fallback
|
|
368
|
-
document.getElementById('boardTitle').textContent = bid + ' (Server Runtime)';
|
|
369
|
-
document.getElementById('boardDesc').textContent = '';
|
|
370
|
-
|
|
371
|
-
// SSE-first bootstrap: init-board initializes the board server-side,
|
|
372
|
-
// then /sse sends the full payload as the first frame. No separate
|
|
373
|
-
// demo-setup step needed — the server runs it automatically at init time.
|
|
374
|
-
await runtimeClient.bootstrapBoard({
|
|
375
|
-
boardId: bid,
|
|
376
|
-
rootElement: document.getElementById('boardRoot'),
|
|
377
|
-
mode: currentMode,
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
bootstrapCompleted = true;
|
|
381
|
-
refreshDocsRuntimeState();
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
document.getElementById('modeBoard').addEventListener('click', function () {
|
|
385
|
-
currentMode = 'board';
|
|
386
|
-
runtimeClient.setMode('board');
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
document.getElementById('modeCanvas').addEventListener('click', function () {
|
|
390
|
-
currentMode = 'canvas';
|
|
391
|
-
runtimeClient.setMode('canvas');
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
document.getElementById('autoLayout').addEventListener('click', function () {
|
|
395
|
-
currentMode = 'canvas';
|
|
396
|
-
runtimeClient.autoLayout();
|
|
397
|
-
});
|
|
398
|
-
|
|
399
|
-
document.getElementById('devModeToggle').addEventListener('change', function () {
|
|
400
|
-
runtimeClient.setDevMode(this.checked);
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
document.getElementById('boardSelector').addEventListener('change', function () {
|
|
404
|
-
switchBoard(this.value).catch(function (err) {
|
|
405
|
-
console.error(err);
|
|
406
|
-
document.getElementById('boardRoot').innerHTML =
|
|
407
|
-
`<div class="alert alert-danger">Failed to switch board: ${String(err && err.message || err)}</div>`;
|
|
408
|
-
});
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
document.getElementById('addBoardBtn').addEventListener('click', function () {
|
|
412
|
-
document.getElementById('addBoardForm').style.removeProperty('display');
|
|
413
|
-
document.getElementById('newBoardId').focus();
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
document.getElementById('addBoardCancel').addEventListener('click', function () {
|
|
417
|
-
document.getElementById('addBoardForm').style.display = 'none';
|
|
418
|
-
document.getElementById('newBoardId').value = '';
|
|
419
|
-
document.getElementById('newBoardLabel').value = '';
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
document.getElementById('addBoardSubmit').addEventListener('click', async function () {
|
|
423
|
-
const id = document.getElementById('newBoardId').value.trim();
|
|
424
|
-
const label = document.getElementById('newBoardLabel').value.trim();
|
|
425
|
-
if (!id) {
|
|
426
|
-
alert('Board id is required');
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
try {
|
|
430
|
-
const res = await fetchServer('/api/boards', {
|
|
431
|
-
method: 'POST',
|
|
432
|
-
headers: { 'content-type': 'application/json' },
|
|
433
|
-
body: JSON.stringify({ id, label: label || id }),
|
|
434
|
-
});
|
|
435
|
-
const data = await res.json();
|
|
436
|
-
if (!res.ok) {
|
|
437
|
-
alert(data.error || 'Failed to add board');
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
document.getElementById('addBoardForm').style.display = 'none';
|
|
441
|
-
document.getElementById('newBoardId').value = '';
|
|
442
|
-
document.getElementById('newBoardLabel').value = '';
|
|
443
|
-
await loadBoardList();
|
|
444
|
-
await switchBoard(id);
|
|
445
|
-
} catch (err) {
|
|
446
|
-
alert('Error adding board: ' + String((err && err.message) || err));
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
loadBoardList().then(function () {
|
|
451
|
-
refreshDocsRuntimeState();
|
|
452
|
-
return bootstrap(activeBoardId);
|
|
453
|
-
}).catch(function (err) {
|
|
454
|
-
console.error(err);
|
|
455
|
-
document.getElementById('boardRoot').innerHTML =
|
|
456
|
-
`<div class="alert alert-danger">Failed to start server runtime demo: ${String(err && err.message || err)}</div>`;
|
|
457
|
-
});
|
|
458
|
-
|
|
459
|
-
window.addEventListener('beforeunload', function () {
|
|
460
|
-
runtimeClient.dispose();
|
|
461
|
-
});
|
|
462
|
-
})();
|
|
463
|
-
</script>
|
|
464
|
-
</body>
|
|
465
|
-
</html>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mode": "cloud",
|
|
3
|
-
"port": 7799,
|
|
4
|
-
"taskExecutorTransport": "http",
|
|
5
|
-
"chatFlowTimeoutMs": 1800000,
|
|
6
|
-
"chatInvokeRefTimeoutMs": 1800000,
|
|
7
|
-
"chatCopilotTimeoutMs": 1800000,
|
|
8
|
-
"serverMetaStoreRef": "b64:eyJraW5kIjoiZnMtcGF0aCIsInZhbHVlIjoiLi8uc2VydmVyLW1ldGEifQ",
|
|
9
|
-
"foundry": {
|
|
10
|
-
"endpoint": "<YOUR_AZURE_FOUNDRY_ENDPOINT>",
|
|
11
|
-
"agent_id": "<YOUR_AZURE_FOUNDRY_AGENT_ID>"
|
|
12
|
-
},
|
|
13
|
-
"boards": {
|
|
14
|
-
"live": {
|
|
15
|
-
"label": "Live",
|
|
16
|
-
"setupDir": "./.board-ws",
|
|
17
|
-
"regular": {
|
|
18
|
-
"seedCardsDir": "./cards",
|
|
19
|
-
"taskExecutorPath": "./server/board-worker/task-executor.js",
|
|
20
|
-
"chatHandlerFlowPath": "./server/chat-flow/flow-steps.json"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { J as JournalStorage, K as KVStorage } from './storage-interface-BFiD3kyB.cjs';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* chat-storage-lib.ts
|
|
5
|
-
*
|
|
6
|
-
* ChatStorage interface + factories backed by JournalStorage (history) and
|
|
7
|
-
* KVStorage (processing state and config).
|
|
8
|
-
*
|
|
9
|
-
* Platform-free — no node:fs or node:crypto imports.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
interface ChatRecord {
|
|
13
|
-
/** Journal entry id — also used as SSE cursor. */
|
|
14
|
-
id: string;
|
|
15
|
-
role: string;
|
|
16
|
-
text: string;
|
|
17
|
-
files: unknown[];
|
|
18
|
-
turn: string;
|
|
19
|
-
updated_at: string;
|
|
20
|
-
}
|
|
21
|
-
interface ChatConfig {
|
|
22
|
-
systemPrompt?: string;
|
|
23
|
-
}
|
|
24
|
-
interface ChatReadAfterResult {
|
|
25
|
-
records: ChatRecord[];
|
|
26
|
-
/** Pass as cursor on the next call. Null when the journal is empty. */
|
|
27
|
-
cursor: string | null;
|
|
28
|
-
}
|
|
29
|
-
interface ChatStorage {
|
|
30
|
-
/** Append a message; returns the new entry id (usable as a cursor). */
|
|
31
|
-
append(cardId: string, role: string, text: string, files?: unknown[], turn?: string): string;
|
|
32
|
-
/** Read all messages in insertion order. */
|
|
33
|
-
readAll(cardId: string): ChatRecord[];
|
|
34
|
-
/**
|
|
35
|
-
* Read messages appended after cursor.
|
|
36
|
-
* Pass null to read from the beginning.
|
|
37
|
-
*/
|
|
38
|
-
readAfter(cardId: string, cursor: string | null): ChatReadAfterResult;
|
|
39
|
-
/** Remove all messages for this card. */
|
|
40
|
-
clear(cardId: string): void;
|
|
41
|
-
setProcessing(cardId: string, active: boolean): void;
|
|
42
|
-
isProcessing(cardId: string): boolean;
|
|
43
|
-
getConfig(cardId: string): ChatConfig;
|
|
44
|
-
setConfig(cardId: string, patch: Partial<ChatConfig>): void;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Create a ChatStorage backed by:
|
|
48
|
-
* - journalFactory(cardId) → JournalStorage (one per-card journal for history)
|
|
49
|
-
* - kv → KVStorage (shared processing flags + config)
|
|
50
|
-
*/
|
|
51
|
-
declare function createChatStorage(journalFactory: (cardId: string) => JournalStorage, kv: KVStorage): ChatStorage;
|
|
52
|
-
declare function createInMemoryChatStorage(): ChatStorage;
|
|
53
|
-
|
|
54
|
-
export { type ChatStorage as C, type ChatRecord as a, type ChatReadAfterResult as b, type ChatConfig as c, createChatStorage as d, createInMemoryChatStorage as e };
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { J as JournalStorage, K as KVStorage } from './storage-interface-BFiD3kyB.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* chat-storage-lib.ts
|
|
5
|
-
*
|
|
6
|
-
* ChatStorage interface + factories backed by JournalStorage (history) and
|
|
7
|
-
* KVStorage (processing state and config).
|
|
8
|
-
*
|
|
9
|
-
* Platform-free — no node:fs or node:crypto imports.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
interface ChatRecord {
|
|
13
|
-
/** Journal entry id — also used as SSE cursor. */
|
|
14
|
-
id: string;
|
|
15
|
-
role: string;
|
|
16
|
-
text: string;
|
|
17
|
-
files: unknown[];
|
|
18
|
-
turn: string;
|
|
19
|
-
updated_at: string;
|
|
20
|
-
}
|
|
21
|
-
interface ChatConfig {
|
|
22
|
-
systemPrompt?: string;
|
|
23
|
-
}
|
|
24
|
-
interface ChatReadAfterResult {
|
|
25
|
-
records: ChatRecord[];
|
|
26
|
-
/** Pass as cursor on the next call. Null when the journal is empty. */
|
|
27
|
-
cursor: string | null;
|
|
28
|
-
}
|
|
29
|
-
interface ChatStorage {
|
|
30
|
-
/** Append a message; returns the new entry id (usable as a cursor). */
|
|
31
|
-
append(cardId: string, role: string, text: string, files?: unknown[], turn?: string): string;
|
|
32
|
-
/** Read all messages in insertion order. */
|
|
33
|
-
readAll(cardId: string): ChatRecord[];
|
|
34
|
-
/**
|
|
35
|
-
* Read messages appended after cursor.
|
|
36
|
-
* Pass null to read from the beginning.
|
|
37
|
-
*/
|
|
38
|
-
readAfter(cardId: string, cursor: string | null): ChatReadAfterResult;
|
|
39
|
-
/** Remove all messages for this card. */
|
|
40
|
-
clear(cardId: string): void;
|
|
41
|
-
setProcessing(cardId: string, active: boolean): void;
|
|
42
|
-
isProcessing(cardId: string): boolean;
|
|
43
|
-
getConfig(cardId: string): ChatConfig;
|
|
44
|
-
setConfig(cardId: string, patch: Partial<ChatConfig>): void;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Create a ChatStorage backed by:
|
|
48
|
-
* - journalFactory(cardId) → JournalStorage (one per-card journal for history)
|
|
49
|
-
* - kv → KVStorage (shared processing flags + config)
|
|
50
|
-
*/
|
|
51
|
-
declare function createChatStorage(journalFactory: (cardId: string) => JournalStorage, kv: KVStorage): ChatStorage;
|
|
52
|
-
declare function createInMemoryChatStorage(): ChatStorage;
|
|
53
|
-
|
|
54
|
-
export { type ChatStorage as C, type ChatRecord as a, type ChatReadAfterResult as b, type ChatConfig as c, createChatStorage as d, createInMemoryChatStorage as e };
|
package/lib/chunk-5XHOHTLZ.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
'use strict';function T(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.statusCode=="number")return t.statusCode;if(typeof t.code=="number")return t.code}function c(e,t){return T(e)===t}function l(e,t,r){return t?typeof t=="function"?t(e):t:r}function b(e){return (e?.()??new Date).toISOString()}function L(e,t){if(t)return t();let r=String((e?.()??new Date).getTime()).padStart(13,"0"),n=Math.random().toString(36).slice(2,10).padEnd(8,"0");return `${r}-${n}`}function p(e){return {id:e.id,payload:e.payload}}function B(e,t={}){return {async read(r){let n=l(r,t.partitionKey,"kv");try{return (await e.item(r,n).read()).resource?.value??null}catch(o){if(c(o,404))return null;throw o}},async write(r,n){let o=l(r,t.partitionKey,"kv");await e.items.upsert({id:r,pk:o,kind:"kv",value:n});},async delete(r){let n=l(r,t.partitionKey,"kv");try{await e.item(r,n).delete();}catch(o){if(!c(o,404))throw o}},async listKeys(r=""){let{resources:n}=await e.items.query({query:"SELECT c.id FROM c WHERE c.kind = @kind AND STARTSWITH(c.id, @prefix)",parameters:[{name:"@kind",value:"kv"},{name:"@prefix",value:r}]}).fetchAll();return n.map(o=>o.id).sort()}}}function x(e,t,r={}){let n=l(t,r.partitionKey,`journal:${t}`);return {async append(o){let s={id:L(r.now,r.idFactory),pk:n,kind:"journal",streamKey:t,createdAt:b(r.now),payload:o};return await e.items.create(s),p(s)},async readAll(){let{resources:o}=await e.items.query({query:"SELECT * FROM c WHERE c.kind = @kind AND c.pk = @pk AND c.streamKey = @streamKey ORDER BY c.id",parameters:[{name:"@kind",value:"journal"},{name:"@pk",value:n},{name:"@streamKey",value:t}]}).fetchAll();return o.sort((s,a)=>s.id.localeCompare(a.id)).map(p)},async readAfter(o){let{resources:s}=await e.items.query({query:o?"SELECT * FROM c WHERE c.kind = @kind AND c.pk = @pk AND c.streamKey = @streamKey AND c.id > @cursor ORDER BY c.id":"SELECT * FROM c WHERE c.kind = @kind AND c.pk = @pk AND c.streamKey = @streamKey ORDER BY c.id",parameters:[{name:"@kind",value:"journal"},{name:"@pk",value:n},{name:"@streamKey",value:t},...o?[{name:"@cursor",value:o}]:[]]}).fetchAll(),a=s.sort((m,g)=>m.id.localeCompare(g.id));return {entries:a.map(p),newCursor:a.length>0?a[a.length-1].id:o}},async clear(){let o=await this.readAll();await Promise.all(o.map(s=>e.item(s.id,n).delete()));}}}function D(e,t,r={}){let n=r.partitionKey??"lock",o=r.holderId??`holder-${Math.random().toString(36).slice(2,10)}`,s=r.now,a=r.ttlMs??3e4;function m(){let i=s?.()??new Date;return {id:t,pk:n,kind:"lock",held:true,holderId:o,expiresAt:new Date(i.getTime()+a).toISOString(),updatedAt:i.toISOString()}}function g(i){return {...i??{id:t,pk:n,kind:"lock"},kind:"lock",held:false,holderId:o,expiresAt:null,updatedAt:b(s)}}async function k(){try{return (await e.item(t,n).read()).resource??null}catch(i){if(c(i,404))return null;throw i}}function S(i){return i?.held?i.expiresAt?Date.parse(i.expiresAt)>(s?.()??new Date).getTime():true:false}return {async tryAcquire(){let i=await k(),A=m();if(i){if(S(i))return null;try{await e.item(t,n).replace(A,i._etag?{accessCondition:{type:"IfMatch",condition:i._etag}}:void 0);}catch(u){if(c(u,412)||c(u,409))return null;throw u}}else try{await e.items.create(A);}catch(u){if(c(u,409))return null;throw u}return async()=>{let u=await k();if(!u)return;let w=g(u);try{await e.item(t,n).replace(w,u._etag?{accessCondition:{type:"IfMatch",condition:u._etag}}:void 0);}catch{}}}}}function M(e){return new TextDecoder().decode(e)}function P(e,t={}){return {async read(r){if(!await e.getBlobClient(r).exists())return null;let n=await e.getBlobClient(r).downloadToBuffer();return M(n)},async write(r,n){await e.getBlockBlobClient(r).upload(n,new TextEncoder().encode(n).byteLength,{blobHTTPHeaders:{blobContentType:t.defaultContentType??"application/json; charset=utf-8"}});},exists(r){return e.getBlobClient(r).exists()},async remove(r){await e.getBlobClient(r).deleteIfExists();},async readBytes(r){return await e.getBlobClient(r).exists()?await e.getBlobClient(r).downloadToBuffer():null},async writeBytes(r,n){await e.getBlockBlobClient(r).upload(n,n.byteLength,{blobHTTPHeaders:{blobContentType:t.defaultContentType??"application/octet-stream"}});},async listKeys(r=""){let n=[];for await(let o of e.listBlobsFlat({prefix:r}))n.push(o.name);return n.sort()},async stat(r){if(!await e.getBlobClient(r).exists())return null;let n=await e.getBlobClient(r).getProperties();return {key:r,size:Number(n.contentLength??0),updatedAt:n.lastModified?.toISOString(),contentType:n.contentType}},keyRef(r){return t.keyRef?.(r)??{kind:"azure-blob-key",value:r}}}}function C(e){if(!e||typeof e!="object")return;let t=e;if(typeof t.statusCode=="number")return t.statusCode;if(typeof t.code=="number")return t.code}function y(e){let t=JSON.stringify(e),r=globalThis.Buffer;if(r)return r.from(t,"utf-8").toString("base64");if(typeof btoa=="function")return btoa(t);throw new Error("No base64 encoder available in this runtime")}function f(e){let t=e??"",r=globalThis.Buffer;if(r)return JSON.parse(r.from(t,"base64").toString("utf-8"));if(typeof atob=="function")return JSON.parse(atob(t));throw new Error("No base64 decoder available in this runtime")}function d(e,t){return (e??t()).toISOString()}function v(e,t){return {id:String(e.messageId??""),body:f(e.messageText),enqueuedAt:d(e.insertedOn??e.insertionTime,t),attempt:Number(e.dequeueCount??0)}}function h(e,t){return {id:String(e.messageId??""),body:f(e.messageText),enqueuedAt:d(e.insertedOn??e.insertionTime,t),attempt:Number(e.dequeueCount??0),leaseToken:String(e.popReceipt??""),leaseExpiresAt:d(e.nextVisibleOn,t)}}function R(e,t={}){let r=t.now??(()=>new Date);return {async enqueue(n){let o=await e.sendMessage(y(n));return {id:String(o.messageId??""),body:n,enqueuedAt:d(o.insertionTime,r),attempt:0}},async lease(n){return (await e.receiveMessages({numberOfMessages:n?.max,visibilityTimeout:n?.visibilityMs?Math.max(1,Math.ceil(n.visibilityMs/1e3)):void 0})).receivedMessageItems.map(s=>h(s,r))},async ack(n,o){try{return await e.deleteMessage(n,o),!0}catch(s){if(C(s)===404)return false;throw s}},async nack(n,o,s){try{if(s?.dead){if(!t.deadLetterQueueClient)return !1;let a={messageId:n,reason:s.reason??null};return await t.deadLetterQueueClient.sendMessage(y(a)),await e.deleteMessage(n,o),!0}return await e.updateMessage(n,o,y({requeued:!0}),0),!0}catch(a){if(C(a)===404)return false;throw a}},async peekActive(n=""){return (await e.peekMessages({numberOfMessages:32})).peekedMessageItems.map(s=>v(s,r)).filter(s=>!n||s.id.startsWith(n))},async peekDeadLetter(n=""){return t.deadLetterQueueClient?(await t.deadLetterQueueClient.peekMessages({numberOfMessages:32})).peekedMessageItems.map(s=>{let a=f(s.messageText);return {id:String(s.messageId??""),body:a,enqueuedAt:d(s.insertedOn??s.insertionTime,r),attempt:Number(s.dequeueCount??0),reason:typeof a.reason=="string"?a.reason:void 0}}).filter(s=>!n||s.id.startsWith(n)):[]}}}exports.a=B;exports.b=x;exports.c=D;exports.d=P;exports.e=R;//# sourceMappingURL=chunk-5XHOHTLZ.cjs.map
|
|
2
|
-
//# sourceMappingURL=chunk-5XHOHTLZ.cjs.map
|
package/lib/chunk-6APH25VI.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function p(e){return String(e).replace(/[^a-zA-Z0-9_-]/g,"_")}function m(e){let n=e.payload??{};return {id:e.id,role:typeof n.role=="string"?n.role:"system",text:typeof n.text=="string"?n.text:"",files:Array.isArray(n.files)?n.files:[],turn:typeof n.turn=="string"?n.turn:"",updated_at:typeof n.updated_at=="string"?n.updated_at:""}}function R(e,n){let a=t=>`chats/${p(t)}/processing`,r=t=>`chats/${p(t)}/config`;return {append(t,i,o,u=[],s=""){return e(t).append({role:i,text:o,files:u,turn:s,updated_at:new Date().toISOString()}).id},readAll(t){return e(t).readAll().map(m)},readAfter(t,i){let o=e(t).readAfter(i);return {records:o.entries.map(m),cursor:o.newCursor}},clear(t){e(t).clear?.();},setProcessing(t,i){i?n.write(a(t),true):n.delete(a(t));},isProcessing(t){return n.read(a(t))===true},getConfig(t){return n.read(r(t))??{}},setConfig(t,i){let o=n.read(r(t))??{};n.write(r(t),{...o,...i});}}}function S(){let e=globalThis.crypto;return typeof e?.randomUUID=="function"?String(e.randomUUID()):`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function $(){let e=new Map,n=new Map;function a(r){return e.has(r)||e.set(r,[]),e.get(r)}return {append(r,t,i,o=[],u=""){let s={id:S(),role:t,text:i,files:o,turn:u,updated_at:new Date().toISOString()};return a(r).push(s),s.id},readAll(r){return a(r).slice()},readAfter(r,t){let i=a(r);if(!t)return {records:i.slice(),cursor:i.length>0?i[i.length-1].id:null};let o=i.findIndex(s=>s.id===t),u=o===-1?i.slice():i.slice(o+1);return {records:u,cursor:u.length>0?u[u.length-1].id:t}},clear(r){e.set(r,[]);},setProcessing(r,t){t?n.set(`p:${r}`,true):n.delete(`p:${r}`);},isProcessing(r){return n.get(`p:${r}`)===true},getConfig(r){return n.get(`c:${r}`)??{}},setConfig(r,t){let i=n.get(`c:${r}`)??{};n.set(`c:${r}`,{...i,...t});}}}function y(){return new Date().toISOString()}function x(e){return new TextEncoder().encode(e).byteLength}function A(e){return e?{key:e.key,size:e.size,updatedAt:e.updatedAt,contentType:e.contentType}:null}function w(e){let n=String(e||"").match(/^(\d+)[-_]/);return n?parseInt(n[1],10):0}function I(e){let n=String(e||"").trim();if(!n)return "upload.bin";let a=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return (a>=0?n.slice(a+1):n)||"upload.bin"}function k(e){return String(e||"").toLowerCase().replace(/\s+/g,"_").replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"")||"file"}function z(e){if(!e||e===".")return "";let n=String(e).replace(/^\./,"").toLowerCase().replace(/[^a-z0-9]/g,"");return n?`.${n}`:""}function F(e){let n=I(e),a=n.lastIndexOf(".");return a<=0||a===n.length-1?{stem:n,ext:""}:{stem:n.slice(0,a),ext:n.slice(a)}}function M(e){let n=e.lastIndexOf("/");return n>=0?e.slice(n+1):e}function L(e){function n(a){let r=e.stat?A(e.stat(a)):null;if(r)return r;if(!e.exists(a))return null;let t=e.read(a);return t===null?{key:a}:{key:a,size:x(t)}}return {exists(a){return e.exists(a)},putText(a,r,t="text/plain; charset=utf-8"){e.write(a,r);let i=n(a)??{key:a};return i.contentType=t,i.updatedAt=i.updatedAt??y(),i.size=i.size??x(r),i},putBytes(a,r,t="application/octet-stream"){if(e.writeBytes)e.writeBytes(a,r);else {let o=JSON.stringify({__kind:"bytes-array",data:[...r]});e.write(a,o);}let i=n(a)??{key:a};return i.contentType=t,i.updatedAt=i.updatedAt??y(),i.size=i.size??r.byteLength,i},getText(a){let r=e.read(a);if(r===null){if(!e.readBytes)return null;let t=e.readBytes(a);return t===null?null:Buffer.from(t).toString("utf-8")}try{let t=JSON.parse(r);if(t&&t.__kind==="bytes-array"&&Array.isArray(t.data))return new TextDecoder("utf-8").decode(new Uint8Array(t.data))}catch{}return r},getBytes(a){if(e.readBytes){let t=e.readBytes(a);if(t!==null)return t}let r=e.read(a);if(r===null)return null;try{let t=JSON.parse(r);if(t&&t.__kind==="bytes-array"&&Array.isArray(t.data))return new Uint8Array(t.data)}catch{}return new TextEncoder().encode(r)},head:n,list(a=""){return e.listKeys(a).map(r=>n(r)??{key:r}).sort((r,t)=>r.key.localeCompare(t.key))},remove(a){e.remove(a);}}}function b(e){function n(t,i){let o=0,u=[];Array.isArray(i)&&u.push(...i);for(let s of e.list(`${t}/`))u.push(M(s.key));for(let s of u){let l=w(s);Number.isFinite(l)&&l>o&&(o=l);}return o+1}function a(t,i,o){let u=Number(o?.maxLen||32),{stem:s,ext:l}=F(t),h=z(l),C=k(s),d=`${String(i).padStart(3,"0")}-`,g=h,f=u-d.length-g.length;f<1&&(g="",f=u-d.length);let _=C.slice(0,Math.max(1,f)),c=`${d}${_}${g}`;return c.length>u&&(c=c.slice(0,u).replace(/\.$/,"")),c}function r(t,i,o){let u=n(t,o?.seedNames),s=a(i,u,{maxLen:o?.maxLen});for(;e.exists(`${t}/${s}`);)u+=1,s=a(i,u,{maxLen:o?.maxLen});return s}return {nextSerial:n,buildStoredName:a,allocateStoredName:r}}function N(){function e(t,i){if(!Array.isArray(t))return [];let o=[];for(let u of t){if(!u||typeof u!="object")continue;let s=u;typeof s.stored_name=="string"&&o.push({name:typeof s.name=="string"?s.name:s.stored_name,stored_name:s.stored_name,size:typeof s.size=="number"&&Number.isFinite(s.size)?s.size:null,mime_type:typeof s.mime_type=="string"?s.mime_type:null,uploaded_at:typeof s.uploaded_at=="string"?s.uploaded_at:i||null,chat:s.chat===true});}return o}function n(t){return !t||typeof t!="object"?[]:e(t.files,void 0)}function a(t,i){let o=n(t);if(i.length===0)return t.files=o,o;let u=new Set(o.map(s=>s.stored_name));for(let s of i)u.has(s.stored_name)||(o.push(s),u.add(s.stored_name));return t.files=o,o}function r(t,i,o){let u=n(t);if(!Number.isInteger(i)||i<0||i>=u.length)return {ok:false,reason:"index_out_of_range"};let s=u[i];return !s||!s.stored_name?{ok:false,reason:"missing_stored_name"}:o&&o!==s.stored_name?{ok:false,reason:"stale_reference"}:{ok:true,file:s}}return {read:n,normalizeIncoming:e,merge:a,resolve:r}}export{R as a,$ as b,L as c,b as d,N as e};//# sourceMappingURL=chunk-6APH25VI.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-6APH25VI.js.map
|
package/lib/chunk-76ON3V7R.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function P(c){function T(n){let r=typeof n=="number"?n:Number(n);return Number.isInteger(r)&&r>0?r:null}function k(n,r){let t=r;for(let e=n.length-1;e>=0;e-=1)if(n[e]?.role==="user"&&(t-=1,t===0))return n.slice(e);return n}function S(n){return n.some(r=>typeof r?.turn=="string"&&r.turn!=="")}function w(n,r){if(r<=0)return [];if(!S(n))return k(n,r);let t=new Map,e=[];for(let s of n){let u=typeof s?.turn=="string"?s.turn:"";t.has(u)||(t.set(u,[]),e.push(u)),t.get(u).push(s);}return e.slice(Math.max(0,e.length-r)).flatMap(s=>t.get(s)??[])}function o(n){return {status:"success",data:n}}function a(n){return {status:"fail",error:n}}function i(n){return {status:"error",error:n instanceof Error?n.message:String(n)}}function R(n,r="command envelope"){let t=typeof n.cardId=="string"?n.cardId:void 0;if(!n.command)return a(`chat-store: ${r} missing "command"`);if(!t)return a(`chat-store: ${r} missing "cardId"`);if(n.command==="append")return d.append({params:{cardId:t},body:{role:n.role,text:n.text,files:n.files,turn:n.turn}});if(n.command==="read-all")return d.readAll({params:{cardId:t},body:{lastUserTurns:n.lastUserTurns,tailTurns:n.tailTurns,turnId:n.turnId,allTurns:n.allTurns,tailTurnsBeforeId:n.tailTurnsBeforeId}});if(n.command==="read-after")return d.readAfter({params:{cardId:t},body:{cursor:n.cursor??null}});if(n.command==="clear")return d.clear({params:{cardId:t}});if(n.command==="set-processing")return d.setProcessing({params:{cardId:t},body:{active:n.active}});if(n.command==="is-processing")return d.isProcessing({params:{cardId:t}});if(n.command==="get-config")return d.getConfig({params:{cardId:t}});if(n.command==="set-config"){let{command:e,cardId:m,...s}=n;return d.setConfig({params:{cardId:t},body:s})}return a(`chat-store: unknown command "${String(n.command)}"`)}function A(n){if(!Array.isArray(n.commands)||n.commands.length===0)return a('chat-store: command envelope must include a non-empty "commands" array');let r=[];for(let t=0;t<n.commands.length;t+=1){let e=n.commands[t];if(!e||typeof e!="object"||Array.isArray(e))return a(`chat-store: command envelope entry ${t} must be an object`);let m={cardId:n.cardId,...e},s=R(m,`command envelope entry ${t}`);if(s.status!=="success")return s;r.push({index:t,command:String(m.command),data:s.data});}return o({results:r})}let d={append(n){try{let r=n.params?.cardId;if(!r)return a("append requires params.cardId");let t=n.body??{},e=typeof t.role=="string"?t.role:"",m=typeof t.text=="string"?t.text:"",s=Array.isArray(t.files)?t.files:[],u=typeof t.turn=="string"?t.turn:"";if(!e)return a("append requires body.role");let l=c.append(r,e,m,s,u);return o({id:l})}catch(r){return i(r)}},readAll(n){try{let r=n.params?.cardId;if(!r)return a("readAll requires params.cardId");let t=n.body??{},e=typeof t.turnId=="string"?t.turnId:"",m=t.allTurns===!0,s=typeof t.tailTurnsBeforeId=="string"?t.tailTurnsBeforeId:"",u=t.tailTurns===void 0?t.lastUserTurns:t.tailTurns,l=u===void 0?m||e?void 0:1:T(u);if(u!==void 0&&l===null)return a("readAll requires body.tailTurns (positive integer)");let b=c.readAll(r),g=b.filter(f=>!e||String(f.turn||"")===e);if(s){let f=l;if(typeof f!="number"||!Number.isInteger(f)||f<=0)return a("readAll requires body.tailTurns (positive integer) when body.tailTurnsBeforeId is provided");let p=new Map,I=[];for(let C of b){let h=String(C.turn||"");p.has(h)||(p.set(h,[]),I.push(h)),p.get(h).push(C);}let y=I.findIndex(C=>C===s),x=Math.max(0,y-f);return g=(y===-1?[]:I.slice(x,y)).flatMap(C=>p.get(C)??[]),o({records:g})}return o(typeof l=="number"?{records:w(g,l)}:{records:g})}catch(r){return i(r)}},readAfter(n){try{let r=n.params?.cardId;if(!r)return a("readAfter requires params.cardId");let e=(n.body??{}).cursor??null;return o(c.readAfter(r,e))}catch(r){return i(r)}},clear(n){try{let r=n.params?.cardId;return r?(c.clear(r),o({ok:!0})):a("clear requires params.cardId")}catch(r){return i(r)}},setProcessing(n){try{let r=n.params?.cardId;if(!r)return a("setProcessing requires params.cardId");let t=n.body??{};return typeof t.active!="boolean"?a("setProcessing requires body.active (boolean)"):(c.setProcessing(r,t.active),o({ok:!0}))}catch(r){return i(r)}},isProcessing(n){try{let r=n.params?.cardId;return r?o({active:c.isProcessing(r)}):a("isProcessing requires params.cardId")}catch(r){return i(r)}},getConfig(n){try{let r=n.params?.cardId;return r?o({config:c.getConfig(r)}):a("getConfig requires params.cardId")}catch(r){return i(r)}},setConfig(n){try{let r=n.params?.cardId;if(!r)return a("setConfig requires params.cardId");let t=n.body??{};return c.setConfig(r,t),o({ok:!0})}catch(r){return i(r)}},run:R,runBatch:A};return d}export{P as a};//# sourceMappingURL=chunk-76ON3V7R.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-76ON3V7R.js.map
|