@origintrail-official/dkg-node-ui 10.0.19 → 10.0.21
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 +1 -0
- package/dist/api.d.ts +7 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +22 -1
- package/dist/api.js.map +1 -1
- package/dist/chain-cursor-stores.d.ts +11 -108
- package/dist/chain-cursor-stores.d.ts.map +1 -1
- package/dist/chain-cursor-stores.js +11 -287
- package/dist/chain-cursor-stores.js.map +1 -1
- package/dist/chain-event-log-store.d.ts +10 -112
- package/dist/chain-event-log-store.d.ts.map +1 -1
- package/dist/chain-event-log-store.js +9 -360
- package/dist/chain-event-log-store.js.map +1 -1
- package/dist/chat-memory.d.ts +1 -0
- package/dist/chat-memory.d.ts.map +1 -1
- package/dist/chat-memory.js +31 -39
- package/dist/chat-memory.js.map +1 -1
- package/dist/chat-turn-subject.d.ts +18 -0
- package/dist/chat-turn-subject.d.ts.map +1 -0
- package/dist/chat-turn-subject.js +52 -0
- package/dist/chat-turn-subject.js.map +1 -0
- package/dist/db.d.ts +2 -143
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +9 -387
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/metrics-collector.d.ts +11 -1
- package/dist/metrics-collector.d.ts.map +1 -1
- package/dist/metrics-collector.js +77 -39
- package/dist/metrics-collector.js.map +1 -1
- package/dist/protocol-outbox-store.d.ts +9 -64
- package/dist/protocol-outbox-store.d.ts.map +1 -1
- package/dist/protocol-outbox-store.js +11 -198
- package/dist/protocol-outbox-store.js.map +1 -1
- package/dist-ui/assets/{3d-force-graph-CehOGxux.js → 3d-force-graph-DbVwxMKf.js} +1 -1
- package/dist-ui/assets/{ActivityFeed-BE4MTD8M.js → ActivityFeed-Bfg6fmQQ.js} +1 -1
- package/dist-ui/assets/{AgentHub-CT6UhLF2.js → AgentHub-DyF5Pa70.js} +1 -1
- package/dist-ui/assets/{AgentProfilePage-ygi-GXKM.js → AgentProfilePage-BPrSuKjV.js} +1 -1
- package/dist-ui/assets/{ApproveWalletsModal-YFfDrGth.js → ApproveWalletsModal-Dd_tHLRP.js} +1 -1
- package/dist-ui/assets/{ContextGraphPrimitives-Dh-w2D_i.js → ContextGraphPrimitives-BXormriD.js} +1 -1
- package/dist-ui/assets/{ConvictionDetailView-CfRmqqDD.js → ConvictionDetailView-BsPTd17P.js} +1 -1
- package/dist-ui/assets/{MemoryLayerView-DL0zLYAQ.js → MemoryLayerView-CloJeM33.js} +2 -2
- package/dist-ui/assets/{MemoryStackView-BsV_JnOe.js → MemoryStackView-BbUJ2uiM.js} +1 -1
- package/dist-ui/assets/{Network-BkxRENe4.js → Network-BKvJttOu.js} +1 -1
- package/dist-ui/assets/{OnChainProvenanceCard-CnnkMMNI.js → OnChainProvenanceCard-BV9-G1cT.js} +1 -1
- package/dist-ui/assets/{Operations-BaWWLSUw.js → Operations-LAhUQsnj.js} +1 -1
- package/dist-ui/assets/{ProjectView-BJmZ5f62.js → ProjectView-0zCSblAV.js} +3 -3
- package/dist-ui/assets/{PublishingConviction-CKB6JBYk.js → PublishingConviction-CF6352oT.js} +1 -1
- package/dist-ui/assets/{Settings-DXGMPiJk.js → Settings-runaZqPv.js} +1 -1
- package/dist-ui/assets/{browserWalletTransaction-BdmrJpK1.js → browserWalletTransaction-CBgx0i4w.js} +3 -3
- package/dist-ui/assets/{ccip-BNYiIkjs.js → ccip-BM07w5uU.js} +1 -1
- package/dist-ui/assets/{index-DOGXDQkQ.js → index-CfVUpsfM.js} +3 -3
- package/dist-ui/assets/{index-DK8XzE3T.js → index-MQh8C4aJ.js} +90 -90
- package/dist-ui/assets/index-xKO-U_eV.css +1 -0
- package/dist-ui/assets/{jsonld-32FQRO67-Ca-KnQfb.js → jsonld-32FQRO67-DBZOBQji.js} +2 -2
- package/dist-ui/assets/{jsonld-mRC9FbFR.js → jsonld-DOX7dKpf.js} +1 -1
- package/dist-ui/assets/{renderer-3d-2EVDZII7-AEMBPIY7.js → renderer-3d-2EVDZII7-CVCpAmwB.js} +2 -2
- package/dist-ui/assets/{shikiHighlighter-CUQ07vzt.js → shikiHighlighter-CzU2U2Tx.js} +1 -1
- package/dist-ui/assets/{useEntityOnChainReceipt-C8NHlPPN.js → useEntityOnChainReceipt-BvWQ6qdT.js} +1 -1
- package/dist-ui/assets/{useProjectActivity-CVFCfbMj.js → useProjectActivity-Cxr4QGX1.js} +1 -1
- package/dist-ui/index.html +2 -2
- package/package.json +6 -4
- package/dist-ui/assets/index-BLQUVvVz.css +0 -1
|
@@ -1,363 +1,12 @@
|
|
|
1
|
-
const CHAIN_EVENT_LOG_ZERO_HASH = `0x${'00'.repeat(32)}`;
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* @deprecated Compatibility module. The chain-event log store moved to
|
|
3
|
+
* `@origintrail-official/dkg-node-store`; this file only keeps the deep import
|
|
4
|
+
* path `@origintrail-official/dkg-node-ui/dist/chain-event-log-store.js`
|
|
5
|
+
* resolving for downstream consumers that shipped against it (this package has
|
|
6
|
+
* no `exports` map, so `dist/*` is importable). First-party code imports
|
|
7
|
+
* `@origintrail-official/dkg-node-store` directly. Every runtime value and type
|
|
8
|
+
* the former module exported is forwarded, and each is the very same
|
|
9
|
+
* declaration node-store exports.
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
function placeholders(count) {
|
|
13
|
-
return Array.from({ length: count }, () => '?').join(', ');
|
|
14
|
-
}
|
|
15
|
-
/** The re-fetched range, or `undefined` when this commit replaces no tail. */
|
|
16
|
-
function normalizeReplacedRange(range) {
|
|
17
|
-
if (range === undefined)
|
|
18
|
-
return undefined;
|
|
19
|
-
if (!Number.isSafeInteger(range.fromBlockNumber)
|
|
20
|
-
|| !Number.isSafeInteger(range.throughBlockNumber)) {
|
|
21
|
-
throw new Error('Chain event log replaced range is invalid');
|
|
22
|
-
}
|
|
23
|
-
// An empty range is a legitimate "this pass fetched nothing", not an error:
|
|
24
|
-
// it simply replaces no tail.
|
|
25
|
-
return range.throughBlockNumber < range.fromBlockNumber ? undefined : range;
|
|
26
|
-
}
|
|
27
|
-
// The indexes the reads below pin, all created by `DashboardDB`'s chain-log
|
|
28
|
-
// schema. Without ANALYZE statistics the planner prefers the primary key's
|
|
29
|
-
// block range for every one of these shapes (it also satisfies the ORDER BY)
|
|
30
|
-
// and walks every row of every contract in the window, synchronously.
|
|
31
|
-
/** `kaToContextGraph`: one address, one topic0, one topic2 (the KA id). */
|
|
32
|
-
const KA_POINT_READ_INDEX = 'idx_chain_events_scope_address_ka';
|
|
33
|
-
/** One graph's rows: one address, its topic0s, one topic1 (the graph id). */
|
|
34
|
-
const GRAPH_READ_INDEX = 'idx_chain_events_scope_address_topic';
|
|
35
|
-
/** Tail rows only (`settled = 0`): the reorg tail is a handful of blocks. */
|
|
36
|
-
const TAIL_READ_INDEX = 'idx_chain_events_scope_unsettled';
|
|
37
|
-
export class SqliteChainEventLogStore {
|
|
38
|
-
db;
|
|
39
|
-
/**
|
|
40
|
-
* The pinnable indexes that exist. `INDEXED BY` turns a missing index into a
|
|
41
|
-
* query ERROR, not a slower plan. `DashboardDB` creates them on every open it
|
|
42
|
-
* migrates (the KA index best-effort), but a database written by a NEWER
|
|
43
|
-
* schema is opened without migrating at all, so a hint is only used once its
|
|
44
|
-
* index is known to be there.
|
|
45
|
-
*/
|
|
46
|
-
indexes;
|
|
47
|
-
constructor(dashboard) {
|
|
48
|
-
this.db = dashboard.db;
|
|
49
|
-
const present = this.db.prepare(`
|
|
50
|
-
SELECT name FROM sqlite_master WHERE type = 'index' AND name IN (?, ?, ?)
|
|
51
|
-
`).all(KA_POINT_READ_INDEX, GRAPH_READ_INDEX, TAIL_READ_INDEX);
|
|
52
|
-
this.indexes = new Set(present.map((index) => index.name));
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* The WHERE clause, its parameters and the index to pin for one filter.
|
|
56
|
-
*
|
|
57
|
-
* Hints are chosen for the exact shapes that have a better index than the
|
|
58
|
-
* block range, and only then:
|
|
59
|
-
* - the KA point read (four equalities on the KA index);
|
|
60
|
-
* - one graph's rows (the per-graph ordinal reads and counts): address,
|
|
61
|
-
* topic0 and topic1 equalities on the topic index, index-only for a count;
|
|
62
|
-
* - a count of tail rows, walked from the unsettled index.
|
|
63
|
-
*/
|
|
64
|
-
where(scope, filter) {
|
|
65
|
-
const clauses = ['scope = ?', 'block_number >= ?', 'block_number <= ?'];
|
|
66
|
-
const parameters = [scope, filter.fromBlockNumber, filter.throughBlockNumber];
|
|
67
|
-
for (const [column, values] of [
|
|
68
|
-
['address', filter.addresses],
|
|
69
|
-
['topic0', filter.topic0],
|
|
70
|
-
['topic1', filter.topic1],
|
|
71
|
-
['topic2', filter.topic2],
|
|
72
|
-
]) {
|
|
73
|
-
if (values === undefined || values.length === 0)
|
|
74
|
-
continue;
|
|
75
|
-
clauses.push(`${column} IN (${placeholders(values.length)})`);
|
|
76
|
-
parameters.push(...values);
|
|
77
|
-
}
|
|
78
|
-
if (filter.settled !== undefined) {
|
|
79
|
-
clauses.push('settled = ?');
|
|
80
|
-
parameters.push(filter.settled ? 1 : 0);
|
|
81
|
-
}
|
|
82
|
-
const oneAddress = filter.addresses?.length === 1;
|
|
83
|
-
const topic0s = filter.topic0?.length ?? 0;
|
|
84
|
-
const topic1s = filter.topic1?.length ?? 0;
|
|
85
|
-
const topic2s = filter.topic2?.length ?? 0;
|
|
86
|
-
let index;
|
|
87
|
-
if (filter.settled === false) {
|
|
88
|
-
index = TAIL_READ_INDEX;
|
|
89
|
-
}
|
|
90
|
-
else if (oneAddress && topic0s === 1 && topic2s === 1) {
|
|
91
|
-
// The KA point read (approach from PR #2784).
|
|
92
|
-
index = KA_POINT_READ_INDEX;
|
|
93
|
-
}
|
|
94
|
-
else if (oneAddress && topic0s >= 1 && topic1s === 1 && topic2s === 0) {
|
|
95
|
-
index = GRAPH_READ_INDEX;
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
clauses,
|
|
99
|
-
parameters,
|
|
100
|
-
indexHint: index !== undefined && this.indexes.has(index) ? ` INDEXED BY ${index}` : '',
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
async load(scope) {
|
|
104
|
-
const row = this.db.prepare(`
|
|
105
|
-
SELECT revision, lineage, deployment_block, settled_block, settled_hash,
|
|
106
|
-
head_block, head_hash, head_timestamp_seconds, head_fetched_at_ms,
|
|
107
|
-
topic_set_version, suspected_fork_block
|
|
108
|
-
FROM chain_index_cursor
|
|
109
|
-
WHERE scope = ?
|
|
110
|
-
`).get(scope);
|
|
111
|
-
if (row === undefined || row.lineage === TOMBSTONE_LINEAGE)
|
|
112
|
-
return undefined;
|
|
113
|
-
const coverage = this.db.prepare(`
|
|
114
|
-
SELECT family, address, covered_from_block, covered_through_block, floor_block
|
|
115
|
-
FROM chain_index_coverage
|
|
116
|
-
WHERE scope = ?
|
|
117
|
-
ORDER BY family, address
|
|
118
|
-
`).all(scope);
|
|
119
|
-
return Object.freeze({
|
|
120
|
-
cursor: Object.freeze({
|
|
121
|
-
revision: row.revision,
|
|
122
|
-
lineage: row.lineage,
|
|
123
|
-
deploymentBlockNumber: row.deployment_block,
|
|
124
|
-
settledBlockNumber: row.settled_block,
|
|
125
|
-
settledBlockHash: row.settled_hash,
|
|
126
|
-
head: Object.freeze({
|
|
127
|
-
number: row.head_block,
|
|
128
|
-
hash: row.head_hash,
|
|
129
|
-
timestampSeconds: row.head_timestamp_seconds,
|
|
130
|
-
fetchedAtMs: row.head_fetched_at_ms,
|
|
131
|
-
}),
|
|
132
|
-
topicSetVersion: row.topic_set_version,
|
|
133
|
-
}),
|
|
134
|
-
coverage: Object.freeze(coverage.map((entry) => Object.freeze({
|
|
135
|
-
family: entry.family,
|
|
136
|
-
address: entry.address,
|
|
137
|
-
coveredFromBlock: entry.covered_from_block,
|
|
138
|
-
coveredThroughBlock: entry.covered_through_block,
|
|
139
|
-
floorBlock: entry.floor_block,
|
|
140
|
-
}))),
|
|
141
|
-
...(row.suspected_fork_block === null
|
|
142
|
-
? {}
|
|
143
|
-
: { suspectedForkBlockNumber: row.suspected_fork_block }),
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
async commit(scope, expectedRevision, commit) {
|
|
147
|
-
if (scope.trim().length === 0)
|
|
148
|
-
throw new Error('Chain event log scope is empty');
|
|
149
|
-
if (commit.cursor.lineage === TOMBSTONE_LINEAGE) {
|
|
150
|
-
throw new Error('Chain event log lineage is empty');
|
|
151
|
-
}
|
|
152
|
-
if (expectedRevision !== undefined
|
|
153
|
-
&& (!Number.isSafeInteger(expectedRevision) || expectedRevision < 1)) {
|
|
154
|
-
throw new Error('Chain event log expected revision is invalid');
|
|
155
|
-
}
|
|
156
|
-
const replaced = normalizeReplacedRange(commit.replacedRange);
|
|
157
|
-
// A tail row outside the re-fetched range would be unreachable by any later
|
|
158
|
-
// replacement, so it could only ever be dropped by a commit that did not
|
|
159
|
-
// look at its block. Refusing here keeps the invariant a property of the
|
|
160
|
-
// schema rather than of whoever wrote the caller.
|
|
161
|
-
for (const row of commit.rows) {
|
|
162
|
-
if (row.settled)
|
|
163
|
-
continue;
|
|
164
|
-
if (replaced !== undefined
|
|
165
|
-
&& row.blockNumber >= replaced.fromBlockNumber
|
|
166
|
-
&& row.blockNumber <= replaced.throughBlockNumber) {
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
throw new Error('Chain event log tail row falls outside the replaced range');
|
|
170
|
-
}
|
|
171
|
-
const apply = this.db.transaction(() => {
|
|
172
|
-
const revision = this.writeCursor(scope, expectedRevision, commit);
|
|
173
|
-
if (revision === undefined)
|
|
174
|
-
return undefined;
|
|
175
|
-
// The previous tail goes first, but ONLY inside the range this commit
|
|
176
|
-
// re-fetched. Coverage never shrinks, so deleting a tail block this pass
|
|
177
|
-
// did not look at would leave coverage claiming a range whose rows are
|
|
178
|
-
// gone — and a read over that range would answer "no such event".
|
|
179
|
-
if (replaced !== undefined) {
|
|
180
|
-
this.db.prepare(`
|
|
181
|
-
DELETE FROM chain_events
|
|
182
|
-
WHERE scope = ? AND settled = 0
|
|
183
|
-
AND block_number >= ? AND block_number <= ?
|
|
184
|
-
`).run(scope, replaced.fromBlockNumber, replaced.throughBlockNumber);
|
|
185
|
-
}
|
|
186
|
-
const insert = this.db.prepare(`
|
|
187
|
-
INSERT OR IGNORE INTO chain_events (
|
|
188
|
-
scope, block_number, log_index, block_hash, tx_hash, address,
|
|
189
|
-
topic0, topic1, topic2, topic3, data, settled
|
|
190
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
191
|
-
`);
|
|
192
|
-
for (const row of commit.rows) {
|
|
193
|
-
// OR IGNORE, not OR REPLACE: a settled row is written ONCE. A second
|
|
194
|
-
// write at the same (block, logIndex) would mean the settled prefix was
|
|
195
|
-
// re-fetched, which only a reorg below the tail can cause — and that is
|
|
196
|
-
// the tombstone's job, not a silent overwrite's.
|
|
197
|
-
insert.run(scope, row.blockNumber, row.logIndex, row.blockHash, row.transactionHash, row.address, row.topics[0] ?? '', row.topics[1] ?? null, row.topics[2] ?? null, row.topics[3] ?? null, row.data, row.settled ? 1 : 0);
|
|
198
|
-
}
|
|
199
|
-
const upsertCoverage = this.db.prepare(`
|
|
200
|
-
INSERT INTO chain_index_coverage (
|
|
201
|
-
scope, family, address, covered_from_block, covered_through_block,
|
|
202
|
-
floor_block, updated_at
|
|
203
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
204
|
-
ON CONFLICT(scope, family, address) DO UPDATE SET
|
|
205
|
-
covered_from_block = excluded.covered_from_block,
|
|
206
|
-
covered_through_block = excluded.covered_through_block,
|
|
207
|
-
floor_block = excluded.floor_block,
|
|
208
|
-
updated_at = excluded.updated_at
|
|
209
|
-
`);
|
|
210
|
-
for (const entry of commit.coverage) {
|
|
211
|
-
upsertCoverage.run(scope, entry.family, entry.address, entry.coveredFromBlock, entry.coveredThroughBlock, entry.floorBlock, Date.now());
|
|
212
|
-
}
|
|
213
|
-
return revision;
|
|
214
|
-
});
|
|
215
|
-
return apply();
|
|
216
|
-
}
|
|
217
|
-
async tombstone(scope, expectedRevision) {
|
|
218
|
-
if (!Number.isSafeInteger(expectedRevision) || expectedRevision < 1) {
|
|
219
|
-
throw new Error('Chain event log expected revision is invalid');
|
|
220
|
-
}
|
|
221
|
-
const nextRevision = expectedRevision + 1;
|
|
222
|
-
if (!Number.isSafeInteger(nextRevision)) {
|
|
223
|
-
throw new Error('Chain event log revision exceeds the safe integer range');
|
|
224
|
-
}
|
|
225
|
-
const apply = this.db.transaction(() => {
|
|
226
|
-
const invalidated = this.db.prepare(`
|
|
227
|
-
UPDATE chain_index_cursor
|
|
228
|
-
SET revision = ?, lineage = ?, settled_block = -1, settled_hash = '',
|
|
229
|
-
suspected_fork_block = NULL, updated_at = ?
|
|
230
|
-
WHERE scope = ? AND revision = ?
|
|
231
|
-
`).run(nextRevision, TOMBSTONE_LINEAGE, Date.now(), scope, expectedRevision).changes === 1;
|
|
232
|
-
if (!invalidated)
|
|
233
|
-
return undefined;
|
|
234
|
-
// Everything derived from the dead chain goes with the cursor. A single
|
|
235
|
-
// surviving "permanent memo" is enough to answer an id-reuse question
|
|
236
|
-
// from a chain that no longer exists.
|
|
237
|
-
for (const table of [
|
|
238
|
-
'chain_events',
|
|
239
|
-
'chain_index_coverage',
|
|
240
|
-
]) {
|
|
241
|
-
this.db.prepare(`DELETE FROM ${table} WHERE scope = ?`).run(scope);
|
|
242
|
-
}
|
|
243
|
-
return nextRevision;
|
|
244
|
-
});
|
|
245
|
-
return apply();
|
|
246
|
-
}
|
|
247
|
-
async readEvents(scope, query) {
|
|
248
|
-
// Reads never narrow by `settled`: callers filter the tail themselves.
|
|
249
|
-
const { clauses, parameters, indexHint } = this.where(scope, { ...query, settled: undefined });
|
|
250
|
-
const rows = this.db.prepare(`
|
|
251
|
-
SELECT block_number, log_index, block_hash, tx_hash, address,
|
|
252
|
-
topic0, topic1, topic2, topic3, data, settled
|
|
253
|
-
FROM chain_events${indexHint}
|
|
254
|
-
WHERE ${clauses.join(' AND ')}
|
|
255
|
-
ORDER BY block_number, log_index
|
|
256
|
-
`).all(...parameters);
|
|
257
|
-
return Object.freeze(rows.map((row) => Object.freeze({
|
|
258
|
-
blockNumber: row.block_number,
|
|
259
|
-
blockHash: row.block_hash,
|
|
260
|
-
logIndex: row.log_index,
|
|
261
|
-
transactionHash: row.tx_hash,
|
|
262
|
-
address: row.address,
|
|
263
|
-
// Absent topics are omitted rather than zero-filled: a decoder must see
|
|
264
|
-
// the log's real arity, not a padded one.
|
|
265
|
-
topics: Object.freeze([row.topic0, row.topic1, row.topic2, row.topic3]
|
|
266
|
-
.filter((topic) => typeof topic === 'string' && topic.length > 0)),
|
|
267
|
-
data: row.data,
|
|
268
|
-
settled: row.settled === 1,
|
|
269
|
-
})));
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* `COUNT(*)` of exactly what {@link readEvents} returns for `query`, narrowed
|
|
273
|
-
* by `settled` when given, without building a row. For one graph's rows the
|
|
274
|
-
* count is index-only (~2 ms over 30k registrations); for tail rows it walks
|
|
275
|
-
* the unsettled index, i.e. the reorg tail.
|
|
276
|
-
*/
|
|
277
|
-
async countEvents(scope, query) {
|
|
278
|
-
const { clauses, parameters, indexHint } = this.where(scope, query);
|
|
279
|
-
const row = this.db.prepare(`
|
|
280
|
-
SELECT COUNT(*) AS count FROM chain_events${indexHint} WHERE ${clauses.join(' AND ')}
|
|
281
|
-
`).get(...parameters);
|
|
282
|
-
return row.count;
|
|
283
|
-
}
|
|
284
|
-
async blockHashAt(scope, blockNumber) {
|
|
285
|
-
const cursor = this.db.prepare(`
|
|
286
|
-
SELECT settled_block, settled_hash, head_block, head_hash
|
|
287
|
-
FROM chain_index_cursor
|
|
288
|
-
WHERE scope = ? AND lineage <> ?
|
|
289
|
-
`).get(scope, TOMBSTONE_LINEAGE);
|
|
290
|
-
if (cursor?.settled_block === blockNumber
|
|
291
|
-
&& cursor.settled_hash.length > 0
|
|
292
|
-
&& cursor.settled_hash !== CHAIN_EVENT_LOG_ZERO_HASH) {
|
|
293
|
-
return cursor.settled_hash;
|
|
294
|
-
}
|
|
295
|
-
if (cursor?.head_block === blockNumber)
|
|
296
|
-
return cursor.head_hash;
|
|
297
|
-
const row = this.db.prepare(`
|
|
298
|
-
SELECT block_hash FROM chain_events
|
|
299
|
-
WHERE scope = ? AND block_number = ?
|
|
300
|
-
LIMIT 1
|
|
301
|
-
`).get(scope, blockNumber);
|
|
302
|
-
return row?.block_hash;
|
|
303
|
-
}
|
|
304
|
-
writeCursor(scope, expectedRevision, commit) {
|
|
305
|
-
const cursor = commit.cursor;
|
|
306
|
-
const suspected = commit.suspectedForkBlockNumber ?? null;
|
|
307
|
-
const now = Date.now();
|
|
308
|
-
if (expectedRevision === undefined) {
|
|
309
|
-
const inserted = this.db.prepare(`
|
|
310
|
-
INSERT INTO chain_index_cursor (
|
|
311
|
-
scope, revision, lineage, deployment_block, settled_block, settled_hash,
|
|
312
|
-
head_block, head_hash, head_timestamp_seconds, head_fetched_at_ms,
|
|
313
|
-
topic_set_version, suspected_fork_block, updated_at
|
|
314
|
-
) VALUES (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
315
|
-
ON CONFLICT(scope) DO UPDATE SET
|
|
316
|
-
revision = chain_index_cursor.revision + 1,
|
|
317
|
-
lineage = excluded.lineage,
|
|
318
|
-
deployment_block = excluded.deployment_block,
|
|
319
|
-
settled_block = excluded.settled_block,
|
|
320
|
-
settled_hash = excluded.settled_hash,
|
|
321
|
-
head_block = excluded.head_block,
|
|
322
|
-
head_hash = excluded.head_hash,
|
|
323
|
-
head_timestamp_seconds = excluded.head_timestamp_seconds,
|
|
324
|
-
head_fetched_at_ms = excluded.head_fetched_at_ms,
|
|
325
|
-
topic_set_version = excluded.topic_set_version,
|
|
326
|
-
suspected_fork_block = excluded.suspected_fork_block,
|
|
327
|
-
updated_at = excluded.updated_at
|
|
328
|
-
-- Re-initializing is allowed ONLY for a tombstoned scope. A live cursor
|
|
329
|
-
-- must lose this CAS, so a caller that thinks the scope is cold cannot
|
|
330
|
-
-- reset a cursor another pass is advancing.
|
|
331
|
-
WHERE chain_index_cursor.lineage = ''
|
|
332
|
-
`).run(scope, cursor.lineage, cursor.deploymentBlockNumber, cursor.settledBlockNumber, cursor.settledBlockHash, cursor.head.number, cursor.head.hash, cursor.head.timestampSeconds, cursor.head.fetchedAtMs, cursor.topicSetVersion, suspected, now).changes === 1;
|
|
333
|
-
if (!inserted)
|
|
334
|
-
return undefined;
|
|
335
|
-
return this.db.prepare(`SELECT revision FROM chain_index_cursor WHERE scope = ?`)
|
|
336
|
-
.get(scope).revision;
|
|
337
|
-
}
|
|
338
|
-
const nextRevision = expectedRevision + 1;
|
|
339
|
-
if (!Number.isSafeInteger(nextRevision)) {
|
|
340
|
-
throw new Error('Chain event log revision exceeds the safe integer range');
|
|
341
|
-
}
|
|
342
|
-
// STICKY. A suspicion is the tick's only memory between two passes, so a
|
|
343
|
-
// commit that says nothing about forks — a backfill page, an idle head
|
|
344
|
-
// refresh — must leave the held one alone. Writing NULL here is what let a
|
|
345
|
-
// backfill between two mismatching passes reset the two-pass rule forever.
|
|
346
|
-
const suspectedClause = commit.clearsForkSuspicion === true
|
|
347
|
-
? 'NULL'
|
|
348
|
-
: commit.suspectedForkBlockNumber === undefined
|
|
349
|
-
? 'suspected_fork_block'
|
|
350
|
-
: '?';
|
|
351
|
-
const updated = this.db.prepare(`
|
|
352
|
-
UPDATE chain_index_cursor
|
|
353
|
-
SET revision = ?, lineage = ?, deployment_block = ?, settled_block = ?,
|
|
354
|
-
settled_hash = ?, head_block = ?, head_hash = ?,
|
|
355
|
-
head_timestamp_seconds = ?, head_fetched_at_ms = ?,
|
|
356
|
-
topic_set_version = ?, suspected_fork_block = ${suspectedClause},
|
|
357
|
-
updated_at = ?
|
|
358
|
-
WHERE scope = ? AND revision = ? AND lineage <> ''
|
|
359
|
-
`).run(nextRevision, cursor.lineage, cursor.deploymentBlockNumber, cursor.settledBlockNumber, cursor.settledBlockHash, cursor.head.number, cursor.head.hash, cursor.head.timestampSeconds, cursor.head.fetchedAtMs, cursor.topicSetVersion, ...(suspectedClause === '?' ? [suspected] : []), now, scope, expectedRevision).changes === 1;
|
|
360
|
-
return updated ? nextRevision : undefined;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
11
|
+
export { SqliteChainEventLogStore } from '@origintrail-official/dkg-node-store';
|
|
363
12
|
//# sourceMappingURL=chain-event-log-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain-event-log-store.js","sourceRoot":"","sources":["../src/chain-event-log-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chain-event-log-store.js","sourceRoot":"","sources":["../src/chain-event-log-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC"}
|
package/dist/chat-memory.d.ts
CHANGED
|
@@ -219,6 +219,7 @@ export declare class ChatMemoryManager {
|
|
|
219
219
|
}): Promise<void>;
|
|
220
220
|
hasChatTurn(sessionId: string, turnId: string): Promise<boolean>;
|
|
221
221
|
getChatTurnPersistenceState(sessionId: string, turnId: string): Promise<ChatTurnPersistenceState | null>;
|
|
222
|
+
private findExistingChatTurn;
|
|
222
223
|
recordChatTurnPersistenceTransition(sessionId: string, turnId: string, persistenceState: ChatTurnPersistenceState, opts?: {
|
|
223
224
|
failureReason?: string | null;
|
|
224
225
|
assistantReply?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-memory.d.ts","sourceRoot":"","sources":["../src/chat-memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-memory.d.ts","sourceRoot":"","sources":["../src/chat-memory.ts"],"names":[],"mappings":"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"}
|
package/dist/chat-memory.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { chatTurnSubjectPattern, scopedChatTurnUri, decodeExistingChatTurn } from './chat-turn-subject.js';
|
|
1
2
|
import { isSafeIri } from '@origintrail-official/dkg-core';
|
|
2
3
|
import { LlmClient } from './llm/client.js';
|
|
3
4
|
import { decodeRdfStringLiteral } from './rdf-literal.js';
|
|
@@ -412,7 +413,7 @@ export class ChatMemoryManager {
|
|
|
412
413
|
const failureReason = typeof opts?.failureReason === 'string'
|
|
413
414
|
? opts.failureReason.trim()
|
|
414
415
|
: (opts?.failureReason === null ? null : undefined);
|
|
415
|
-
const turnUri = turnId ?
|
|
416
|
+
const turnUri = turnId ? (await this.findExistingChatTurn(sessionId, turnId))?.uri ?? scopedChatTurnUri(sessionId, turnId) : undefined;
|
|
416
417
|
const isNewSession = !this.knownSessions.has(sessionId);
|
|
417
418
|
const quads = [];
|
|
418
419
|
// Only declare the session entity on the first exchange to avoid
|
|
@@ -456,9 +457,7 @@ export class ChatMemoryManager {
|
|
|
456
457
|
return false;
|
|
457
458
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
458
459
|
const result = await this.tools.query(`SELECT ?turn WHERE {
|
|
459
|
-
|
|
460
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
461
|
-
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
460
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', JSON.stringify(trimmedTurnId))}
|
|
462
461
|
} LIMIT 1`, this.wmReadOpts());
|
|
463
462
|
return (result.bindings ?? []).length > 0;
|
|
464
463
|
}
|
|
@@ -469,9 +468,7 @@ export class ChatMemoryManager {
|
|
|
469
468
|
return null;
|
|
470
469
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
471
470
|
const result = await this.tools.query(`SELECT ?persistenceState ?transitionState WHERE {
|
|
472
|
-
|
|
473
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
474
|
-
?turn <${DKG_ONT}turnId> ${JSON.stringify(trimmedTurnId)} .
|
|
471
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', JSON.stringify(trimmedTurnId))}
|
|
475
472
|
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
476
473
|
OPTIONAL {
|
|
477
474
|
?transition <${RDF_TYPE}> <${CHAT_TURN_PERSISTENCE_TRANSITION_TYPE}> .
|
|
@@ -492,13 +489,22 @@ export class ChatMemoryManager {
|
|
|
492
489
|
return 'pending';
|
|
493
490
|
return null;
|
|
494
491
|
}
|
|
492
|
+
async findExistingChatTurn(sessionId, turnId) {
|
|
493
|
+
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
494
|
+
const result = await this.tools.query(`SELECT ?turn ?tid ?ts WHERE {
|
|
495
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', JSON.stringify(turnId))}
|
|
496
|
+
?turn <${DKG_ONT}turnId> ?tid .
|
|
497
|
+
OPTIONAL { ?turn <${SCHEMA}dateCreated> ?ts }
|
|
498
|
+
} ORDER BY ?turn LIMIT 1`, this.wmReadOpts());
|
|
499
|
+
return decodeExistingChatTurn(result.bindings?.[0], turnId, stripRdfLiteral);
|
|
500
|
+
}
|
|
495
501
|
async recordChatTurnPersistenceTransition(sessionId, turnId, persistenceState, opts) {
|
|
496
502
|
await this.ensureInitialized();
|
|
497
503
|
const trimmedTurnId = turnId.trim();
|
|
498
504
|
if (!trimmedTurnId)
|
|
499
505
|
return;
|
|
500
506
|
const transitionId = crypto.randomUUID().slice(0, 8);
|
|
501
|
-
const turnUri =
|
|
507
|
+
const turnUri = (await this.findExistingChatTurn(sessionId, trimmedTurnId))?.uri ?? scopedChatTurnUri(sessionId, trimmedTurnId);
|
|
502
508
|
const transitionUri = `${CHAT_NS}turn-transition:${transitionId}`;
|
|
503
509
|
const now = new Date().toISOString();
|
|
504
510
|
const failureReason = typeof opts?.failureReason === 'string'
|
|
@@ -760,9 +766,7 @@ export class ChatMemoryManager {
|
|
|
760
766
|
OPTIONAL { ?m <${DKG_ONT}turnId> ?turnId }
|
|
761
767
|
OPTIONAL { ?m <${CHAT_ATTACHMENT_REFS_PREDICATE}> ?attachmentRefs }
|
|
762
768
|
OPTIONAL {
|
|
763
|
-
?turn
|
|
764
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
765
|
-
?turn <${DKG_ONT}turnId> ?turnId .
|
|
769
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', '?turnId')}
|
|
766
770
|
OPTIONAL { ?turn <${DKG_ONT}persistenceState> ?persistenceState }
|
|
767
771
|
OPTIONAL { ?turn <${DKG_ONT}failureReason> ?failureReason }
|
|
768
772
|
OPTIONAL {
|
|
@@ -902,9 +906,8 @@ export class ChatMemoryManager {
|
|
|
902
906
|
await this.ensureInitialized();
|
|
903
907
|
const sessionUri = `${CHAT_NS}session:${sessionId}`;
|
|
904
908
|
const baseTurnId = opts?.baseTurnId?.trim() || null;
|
|
905
|
-
const countResult = await this.tools.query(`SELECT (COUNT(
|
|
906
|
-
?turn
|
|
907
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
909
|
+
const countResult = await this.tools.query(`SELECT (COUNT(DISTINCT ?tid) AS ?c) WHERE {
|
|
910
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', '?tid')}
|
|
908
911
|
}`, this.wmReadOpts());
|
|
909
912
|
const turnCount = sumBindingValues(countResult.bindings, 'c');
|
|
910
913
|
if (turnCount === 0) {
|
|
@@ -924,24 +927,13 @@ export class ChatMemoryManager {
|
|
|
924
927
|
triples: [],
|
|
925
928
|
};
|
|
926
929
|
}
|
|
927
|
-
const
|
|
928
|
-
const currentTurnResult = await this.tools.query(`SELECT ?tid ?ts WHERE {
|
|
929
|
-
<${turnUri}> <${RDF_TYPE}> <${DKG_ONT}ChatTurn> .
|
|
930
|
-
<${turnUri}> <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
931
|
-
<${turnUri}> <${DKG_ONT}turnId> ?tid .
|
|
932
|
-
OPTIONAL { <${turnUri}> <${SCHEMA}dateCreated> ?ts }
|
|
933
|
-
} LIMIT 1`, this.wmReadOpts());
|
|
934
|
-
const currentTurn = (currentTurnResult.bindings ?? [])[0];
|
|
935
|
-
const currentTurnId = stripRdfLiteral(currentTurn?.tid ?? '').trim();
|
|
936
|
-
const currentTurnTs = stripRdfLiteral(currentTurn?.ts ?? '').trim();
|
|
930
|
+
const currentTurn = await this.findExistingChatTurn(sessionId, turnId);
|
|
937
931
|
const latestTurnResult = await this.tools.query(`SELECT ?latestTurnId ?latestTs WHERE {
|
|
938
|
-
?latestTurn
|
|
939
|
-
?latestTurn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
940
|
-
?latestTurn <${DKG_ONT}turnId> ?latestTurnId .
|
|
932
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?latestTurn', '?latestTurnId')}
|
|
941
933
|
OPTIONAL { ?latestTurn <${SCHEMA}dateCreated> ?latestTs }
|
|
942
934
|
} ORDER BY DESC(?latestTs) DESC(?latestTurnId) LIMIT 1`, this.wmReadOpts());
|
|
943
935
|
const latestTurnId = stripRdfLiteral((latestTurnResult.bindings ?? [])[0]?.latestTurnId ?? '').trim() || null;
|
|
944
|
-
if (!
|
|
936
|
+
if (!currentTurn) {
|
|
945
937
|
return {
|
|
946
938
|
mode: 'full_refresh_required',
|
|
947
939
|
reason: 'turn_not_found',
|
|
@@ -958,15 +950,15 @@ export class ChatMemoryManager {
|
|
|
958
950
|
triples: [],
|
|
959
951
|
};
|
|
960
952
|
}
|
|
953
|
+
const { uri: turnUri, turnId: currentTurnId, createdAt: currentTurnTs } = currentTurn;
|
|
961
954
|
const currentTurnIdLiteral = JSON.stringify(currentTurnId);
|
|
962
955
|
const currentTsLiteral = currentTurnTs
|
|
963
956
|
? `"${currentTurnTs}"^^<${XSD_DATETIME}>`
|
|
964
957
|
: null;
|
|
965
958
|
const previousTurnQuery = currentTsLiteral
|
|
966
959
|
? `SELECT ?previousTurnId WHERE {
|
|
967
|
-
?previousTurn
|
|
968
|
-
?
|
|
969
|
-
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
960
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?previousTurn', '?previousTurnId')}
|
|
961
|
+
FILTER(?previousTurnId != ${currentTurnIdLiteral})
|
|
970
962
|
?previousTurn <${SCHEMA}dateCreated> ?previousTs .
|
|
971
963
|
FILTER(
|
|
972
964
|
?previousTs < ${currentTsLiteral}
|
|
@@ -974,25 +966,25 @@ export class ChatMemoryManager {
|
|
|
974
966
|
)
|
|
975
967
|
} ORDER BY DESC(?previousTs) DESC(?previousTurnId) LIMIT 1`
|
|
976
968
|
: `SELECT ?previousTurnId WHERE {
|
|
977
|
-
?previousTurn
|
|
978
|
-
?
|
|
979
|
-
?previousTurn <${DKG_ONT}turnId> ?previousTurnId .
|
|
969
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?previousTurn', '?previousTurnId')}
|
|
970
|
+
FILTER(?previousTurnId != ${currentTurnIdLiteral})
|
|
980
971
|
FILTER(?previousTurnId < ${currentTurnIdLiteral})
|
|
981
972
|
} ORDER BY DESC(?previousTurnId) LIMIT 1`;
|
|
982
973
|
const previousTurnResult = await this.tools.query(previousTurnQuery, this.wmReadOpts());
|
|
983
974
|
const previousTurnId = stripRdfLiteral((previousTurnResult.bindings ?? [])[0]?.previousTurnId ?? '').trim() || null;
|
|
984
975
|
const turnIndexResult = currentTsLiteral
|
|
985
|
-
? await this.tools.query(`SELECT (COUNT(
|
|
986
|
-
?turn
|
|
987
|
-
?turn <${SCHEMA}isPartOf> <${sessionUri}> .
|
|
988
|
-
?turn <${DKG_ONT}turnId> ?tid .
|
|
976
|
+
? await this.tools.query(`SELECT (COUNT(DISTINCT ?tid) AS ?c) WHERE {
|
|
977
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', '?tid')}
|
|
989
978
|
?turn <${SCHEMA}dateCreated> ?ts .
|
|
990
979
|
FILTER(
|
|
991
980
|
?ts < ${currentTsLiteral}
|
|
992
981
|
|| (?ts = ${currentTsLiteral} && ?tid <= ${currentTurnIdLiteral})
|
|
993
982
|
)
|
|
994
983
|
}`, this.wmReadOpts())
|
|
995
|
-
:
|
|
984
|
+
: await this.tools.query(`SELECT (COUNT(DISTINCT ?tid) AS ?c) WHERE {
|
|
985
|
+
${chatTurnSubjectPattern(`<${sessionUri}>`, '?turn', '?tid')}
|
|
986
|
+
FILTER(?tid <= ${currentTurnIdLiteral})
|
|
987
|
+
}`, this.wmReadOpts());
|
|
996
988
|
const turnIndex = Math.max(0, sumBindingValues(turnIndexResult.bindings, 'c'));
|
|
997
989
|
if (previousTurnId && !baseTurnId) {
|
|
998
990
|
return {
|