@spine-event-engine/storage 2.0.0-snapshot.21 → 2.0.0-snapshot.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +7 -0
  2. package/REFERENCE.md +106 -1
  3. package/dist/entity/agent-execution-record-spec.d.ts +87 -0
  4. package/dist/entity/agent-execution-record-spec.d.ts.map +1 -0
  5. package/dist/entity/agent-execution-record-spec.js +230 -0
  6. package/dist/entity/agent-execution-record-spec.js.map +1 -0
  7. package/dist/entity/agent-execution-sizes.d.ts +30 -0
  8. package/dist/entity/agent-execution-sizes.d.ts.map +1 -0
  9. package/dist/entity/agent-execution-sizes.js +51 -0
  10. package/dist/entity/agent-execution-sizes.js.map +1 -0
  11. package/dist/entity/agent-execution-transitions.d.ts +71 -0
  12. package/dist/entity/agent-execution-transitions.d.ts.map +1 -0
  13. package/dist/entity/agent-execution-transitions.js +182 -0
  14. package/dist/entity/agent-execution-transitions.js.map +1 -0
  15. package/dist/entity/agent-execution-values.d.ts +142 -0
  16. package/dist/entity/agent-execution-values.d.ts.map +1 -0
  17. package/dist/entity/agent-execution-values.js +250 -0
  18. package/dist/entity/agent-execution-values.js.map +1 -0
  19. package/dist/entity/agent-execution.d.ts +234 -0
  20. package/dist/entity/agent-execution.d.ts.map +1 -0
  21. package/dist/entity/agent-execution.js +15 -0
  22. package/dist/entity/agent-execution.js.map +1 -0
  23. package/dist/entity/agent-history-conformance.d.ts +78 -0
  24. package/dist/entity/agent-history-conformance.d.ts.map +1 -0
  25. package/dist/entity/agent-history-conformance.js +493 -0
  26. package/dist/entity/agent-history-conformance.js.map +1 -0
  27. package/dist/entity/agent-history-provider-page.d.ts +39 -0
  28. package/dist/entity/agent-history-provider-page.d.ts.map +1 -0
  29. package/dist/entity/agent-history-provider-page.js +82 -0
  30. package/dist/entity/agent-history-provider-page.js.map +1 -0
  31. package/dist/entity/agent-history-record-spec.d.ts +79 -0
  32. package/dist/entity/agent-history-record-spec.d.ts.map +1 -0
  33. package/dist/entity/agent-history-record-spec.js +147 -0
  34. package/dist/entity/agent-history-record-spec.js.map +1 -0
  35. package/dist/entity/agent-history.d.ts +196 -0
  36. package/dist/entity/agent-history.d.ts.map +1 -0
  37. package/dist/entity/agent-history.js +136 -0
  38. package/dist/entity/agent-history.js.map +1 -0
  39. package/dist/event/event-store.d.ts +52 -4
  40. package/dist/event/event-store.d.ts.map +1 -1
  41. package/dist/event/event-store.js +153 -4
  42. package/dist/event/event-store.js.map +1 -1
  43. package/dist/internal/agent-execution.d.ts +51 -0
  44. package/dist/internal/agent-execution.d.ts.map +1 -0
  45. package/dist/internal/agent-execution.js +53 -0
  46. package/dist/internal/agent-execution.js.map +1 -0
  47. package/dist/internal/agent-history.d.ts +48 -0
  48. package/dist/internal/agent-history.d.ts.map +1 -0
  49. package/dist/internal/agent-history.js +52 -0
  50. package/dist/internal/agent-history.js.map +1 -0
  51. package/dist/internal/entity-history.d.ts +11 -0
  52. package/dist/internal/entity-history.d.ts.map +1 -1
  53. package/dist/internal/entity-history.js +10 -0
  54. package/dist/internal/entity-history.js.map +1 -1
  55. package/dist/internal/tenancy.d.ts +87 -1
  56. package/dist/internal/tenancy.d.ts.map +1 -1
  57. package/dist/internal/tenancy.js +39 -0
  58. package/dist/internal/tenancy.js.map +1 -1
  59. package/dist/memory/agent-execution-head-index.d.ts +52 -0
  60. package/dist/memory/agent-execution-head-index.d.ts.map +1 -0
  61. package/dist/memory/agent-execution-head-index.js +91 -0
  62. package/dist/memory/agent-execution-head-index.js.map +1 -0
  63. package/dist/memory/agent-history-index.d.ts +49 -0
  64. package/dist/memory/agent-history-index.d.ts.map +1 -0
  65. package/dist/memory/agent-history-index.js +239 -0
  66. package/dist/memory/agent-history-index.js.map +1 -0
  67. package/dist/memory/agent-history-mutation-queue.d.ts +17 -0
  68. package/dist/memory/agent-history-mutation-queue.d.ts.map +1 -0
  69. package/dist/memory/agent-history-mutation-queue.js +31 -0
  70. package/dist/memory/agent-history-mutation-queue.js.map +1 -0
  71. package/dist/memory/in-memory-agent-execution.d.ts +21 -0
  72. package/dist/memory/in-memory-agent-execution.d.ts.map +1 -0
  73. package/dist/memory/in-memory-agent-execution.js +587 -0
  74. package/dist/memory/in-memory-agent-execution.js.map +1 -0
  75. package/dist/memory/in-memory-agent-history.d.ts +21 -0
  76. package/dist/memory/in-memory-agent-history.d.ts.map +1 -0
  77. package/dist/memory/in-memory-agent-history.js +133 -0
  78. package/dist/memory/in-memory-agent-history.js.map +1 -0
  79. package/dist/memory/in-memory-entity-commit.d.ts +17 -0
  80. package/dist/memory/in-memory-entity-commit.d.ts.map +1 -1
  81. package/dist/memory/in-memory-entity-commit.js +47 -3
  82. package/dist/memory/in-memory-entity-commit.js.map +1 -1
  83. package/dist/memory/in-memory-entity-history.d.ts +1 -1
  84. package/dist/memory/in-memory-entity-history.d.ts.map +1 -1
  85. package/dist/memory/in-memory-entity-history.js.map +1 -1
  86. package/dist/memory/in-memory-storage-backend.d.ts +18 -0
  87. package/dist/memory/in-memory-storage-backend.d.ts.map +1 -1
  88. package/dist/memory/in-memory-storage-backend.js +71 -0
  89. package/dist/memory/in-memory-storage-backend.js.map +1 -1
  90. package/dist/memory/in-memory-storage-factory.d.ts +37 -2
  91. package/dist/memory/in-memory-storage-factory.d.ts.map +1 -1
  92. package/dist/memory/in-memory-storage-factory.js +144 -3
  93. package/dist/memory/in-memory-storage-factory.js.map +1 -1
  94. package/dist/tsconfig.tsbuildinfo +1 -1
  95. package/package.json +3 -2
@@ -0,0 +1,493 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { create, toBinary } from "@bufbuild/protobuf";
15
+ import { TenantIdSchema } from "@spine-event-engine/proto";
16
+ import { AgentHistoryEntrySchema, ConversationIdSchema, } from "@spine-event-engine/proto/agent";
17
+ import { AgentHistoryKeys, } from "./agent-history.js";
18
+ /**
19
+ * Runs provider-neutral Agent history ordering, paging, and retention checks.
20
+ */
21
+ export const AgentHistoryConformance = Object.freeze({
22
+ /**
23
+ * Checks all four views, bounded continuations, scopes, and immutable appends.
24
+ *
25
+ * @param adapter Real provider handle and domain-correct fixtures.
26
+ */
27
+ async check(adapter) {
28
+ await Checks.views(adapter);
29
+ await Checks.categoryPages(adapter);
30
+ await Checks.orderingEdges(adapter);
31
+ await Checks.pages(adapter);
32
+ await Checks.bytes(adapter);
33
+ await Checks.duplicates(adapter);
34
+ await Checks.scopes(adapter);
35
+ await Checks.live(adapter);
36
+ await Checks.unrelatedIds(adapter);
37
+ await Checks.invalid(adapter);
38
+ await Checks.invalidViews(adapter);
39
+ },
40
+ });
41
+ /**
42
+ * Shared provider assertions kept separate from provider production code.
43
+ */
44
+ const Checks = Object.freeze({
45
+ /**
46
+ * Checks one-category UTF-8 ID order and complete Timestamp boundaries through provider reads.
47
+ *
48
+ * @param adapter Provider handles and domain fixtures.
49
+ * @returns Completes after count-one continuations preserve canonical order.
50
+ */
51
+ async orderingEdges(adapter) {
52
+ const storage = adapter.open(adapter.scope);
53
+ const same = adapter.occurredAt(12n, 345678901);
54
+ const expected = [
55
+ adapter.domain("maximum", adapter.occurredAt(253402300799n, 999999999)),
56
+ adapter.domain("a", same),
57
+ adapter.domain("aa", same),
58
+ adapter.domain("z", same),
59
+ adapter.domain("é", same),
60
+ adapter.domain("minimum", adapter.occurredAt(-62135596800n)),
61
+ ];
62
+ try {
63
+ for (const entry of [...expected].reverse())
64
+ await storage.append("ticket-utf8-order", entry);
65
+ await this.countOnePages(storage, "ticket-utf8-order", expected);
66
+ }
67
+ finally {
68
+ storage.close();
69
+ }
70
+ },
71
+ /**
72
+ * Checks exact content and identity through every one-entry provider continuation.
73
+ *
74
+ * @param storage Populated provider history handle.
75
+ * @param entityId Target Agent ID.
76
+ * @param expected Entries in canonical newest-first order.
77
+ * @returns Completes after every boundary and the terminal page are checked.
78
+ */
79
+ async countOnePages(storage, entityId, expected) {
80
+ let after;
81
+ for (const [index, entry] of expected.entries()) {
82
+ const page = await this.read(storage, entityId, { kind: "domain" }, 1, after);
83
+ const actual = this.required(page.entries[0]);
84
+ this.assertEntries([actual], [entry], "count-one pages must preserve UTF-8 order and content");
85
+ this.assert(page.hasMore === index < expected.length - 1, "count-one page continuation is wrong");
86
+ after = AgentHistoryKeys.fromEntry(actual);
87
+ }
88
+ const terminal = await this.read(storage, entityId, { kind: "domain" }, 1, after);
89
+ this.assert(terminal.entries.length === 0 && !terminal.hasMore, "ordered pages must terminate");
90
+ },
91
+ /**
92
+ * Checks one-entry pages across category and time ties.
93
+ *
94
+ * @param adapter Provider handles and domain fixtures.
95
+ * @returns Completes after page order is verified.
96
+ */
97
+ async categoryPages(adapter) {
98
+ const storage = adapter.open(adapter.scope);
99
+ const time = adapter.occurredAt(10n, 123456789);
100
+ try {
101
+ await storage.append("ticket-category-pages", adapter.domain("same", time));
102
+ await storage.append("ticket-category-pages", adapter.system("same", time));
103
+ await storage.append("ticket-category-pages", adapter.conversation("same", "reply", time));
104
+ await storage.append("ticket-category-pages", adapter.domain("newer", adapter.occurredAt(10n, 123456790)));
105
+ const expected = ["domain:newer", "conversation:same", "system:same", "domain:same"];
106
+ let after;
107
+ for (const [index, identity] of expected.entries()) {
108
+ const page = await this.read(storage, "ticket-category-pages", { kind: "full" }, 1, after);
109
+ const entry = this.required(page.entries[0]);
110
+ after = AgentHistoryKeys.fromEntry(entry);
111
+ this.assert(`${after.category}:${after.recordId}` === identity &&
112
+ page.hasMore === index < expected.length - 1, "one-entry continuations must preserve submillisecond and category order");
113
+ }
114
+ this.assert((await this.read(storage, "ticket-category-pages", { kind: "full" }, 1, after)).entries
115
+ .length === 0, "a completed continuation must return an empty page");
116
+ }
117
+ finally {
118
+ storage.close();
119
+ }
120
+ },
121
+ /**
122
+ * Checks full and filtered Agent history views.
123
+ *
124
+ * @param adapter Provider handles and domain fixtures.
125
+ * @returns Completes after view contents are verified.
126
+ */
127
+ async views(adapter) {
128
+ const storage = adapter.open(adapter.scope);
129
+ const time = adapter.occurredAt(9n, 123456789);
130
+ const entries = [
131
+ adapter.domain("domain", time),
132
+ adapter.system("system", time),
133
+ adapter.conversation("c2", "conversation-two", time),
134
+ adapter.conversation("c1", "conversation-one", time),
135
+ ];
136
+ try {
137
+ for (const entry of entries)
138
+ await storage.append("ticket-views", entry);
139
+ const full = await this.read(storage, "ticket-views", { kind: "full" }, 10);
140
+ this.assertEntries(full.entries, [entries[3], entries[2], entries[1], entries[0]], "full history must preserve all original entries in category and ID order");
141
+ const system = await this.read(storage, "ticket-views", { kind: "system" }, 10);
142
+ this.assertEntries(system.entries, [entries[1]], "System view must retain its original Event");
143
+ const domain = await this.read(storage, "ticket-views", { kind: "domain" }, 10);
144
+ this.assertEntries(domain.entries, [entries[0]], "domain view must retain its original Event");
145
+ await this.conversationViews(storage, [entries[3], entries[2]]);
146
+ }
147
+ finally {
148
+ storage.close();
149
+ }
150
+ },
151
+ /**
152
+ * Checks isolation of individual conversations.
153
+ *
154
+ * @param storage Open provider history handle.
155
+ * @param expected Original entries for conversation one and two.
156
+ * @returns Completes after conversation views are verified.
157
+ */
158
+ async conversationViews(storage, expected) {
159
+ const view = (id) => ({
160
+ kind: "conversation",
161
+ conversation: create(ConversationIdSchema, { value: id }),
162
+ });
163
+ const first = await this.read(storage, "ticket-views", view("conversation-one"), 10);
164
+ this.assertEntries(first.entries, [expected[0]], "conversation one must retain its original exchange");
165
+ const second = await this.read(storage, "ticket-views", view("conversation-two"), 10);
166
+ this.assertEntries(second.entries, [expected[1]], "conversation two must retain its original exchange");
167
+ const empty = await this.read(storage, "ticket-views", view("unused"), 10);
168
+ this.assert(empty.entries.length === 0 && !empty.hasMore, "an unused conversation must have an empty terminal page");
169
+ },
170
+ /**
171
+ * Checks page sizes above one hundred.
172
+ *
173
+ * @param adapter Provider handles and domain fixtures.
174
+ * @returns Completes after pages are populated and checked.
175
+ */
176
+ async pages(adapter) {
177
+ const storage = adapter.open(adapter.scope);
178
+ const time = adapter.occurredAt(8n, 999999999);
179
+ try {
180
+ for (let index = 0; index < 250; index += 1)
181
+ await storage.append("ticket-pages", adapter.domain(`event-${String(index).padStart(3, "0")}`, time));
182
+ await this.pageContinuation(storage);
183
+ }
184
+ finally {
185
+ storage.close();
186
+ }
187
+ },
188
+ /**
189
+ * Checks changing page sizes across a continuation.
190
+ *
191
+ * @param storage Populated provider history handle.
192
+ * @returns Completes after all entries are reached.
193
+ */
194
+ async pageContinuation(storage) {
195
+ const first = await this.read(storage, "ticket-pages", { kind: "full" }, 1);
196
+ this.assert(first.entries.length === 1 && first.hasMore, "page size one must continue");
197
+ const second = await this.read(storage, "ticket-pages", { kind: "full" }, 137, AgentHistoryKeys.fromEntry(this.required(first.entries[0])));
198
+ this.assert(second.entries.length === 137 && second.hasMore, "requested counts above 100 must not be truncated");
199
+ const last = await this.read(storage, "ticket-pages", { kind: "full" }, 200, AgentHistoryKeys.fromEntry(this.required(second.entries.at(-1))));
200
+ this.assert(last.entries.length === 112 && !last.hasMore, "changed page sizes must reach every older entry once");
201
+ },
202
+ /**
203
+ * Checks byte-bounded history pages.
204
+ *
205
+ * @param adapter Provider handles and domain fixtures.
206
+ * @returns Completes after byte bounds are checked.
207
+ */
208
+ async bytes(adapter) {
209
+ const storage = adapter.open(adapter.scope);
210
+ const time = adapter.occurredAt(7n);
211
+ const first = adapter.conversation("a", "bytes", time);
212
+ const second = adapter.response("b", "bytes", time);
213
+ const size = toBinary(AgentHistoryEntrySchema, first).length;
214
+ try {
215
+ await storage.append("ticket-bytes", first);
216
+ await storage.append("ticket-bytes", second);
217
+ await this.byteContinuation(storage, size, first, second);
218
+ }
219
+ finally {
220
+ storage.close();
221
+ }
222
+ },
223
+ /**
224
+ * Checks a byte-limited page and continuation.
225
+ *
226
+ * @param storage Populated provider history handle.
227
+ * @param size Serialized first-entry byte length.
228
+ * @param first Original model request entry.
229
+ * @param second Original model response entry.
230
+ * @returns Completes after continuation and failure are checked.
231
+ */
232
+ async byteContinuation(storage, size, first, second) {
233
+ const request = { entityId: "ticket-bytes", view: { kind: "full" }, count: 2 };
234
+ const page = await storage.read({ ...request, maxBytes: size });
235
+ this.assert(page.entries.length === 1 && page.hasMore, "byte-limited pages must return a nonempty continuation");
236
+ this.assertEntries(page.entries, [first], "request page must retain exact content");
237
+ const next = await this.read(storage, "ticket-bytes", { kind: "full" }, 2, AgentHistoryKeys.fromEntry(this.required(page.entries[0])));
238
+ this.assert(next.entries.length === 1 && !next.hasMore, "byte continuation must reach the next entry");
239
+ this.assertEntries(next.entries, [second], "response page must retain exact content");
240
+ await this.rejects(storage.read({ ...request, maxBytes: size - 1 }), "oversized first item must fail explicitly");
241
+ },
242
+ /**
243
+ * Checks immutable repeat and conflict handling.
244
+ *
245
+ * @param adapter Provider handles and domain fixtures.
246
+ * @returns Completes after duplicate behavior is checked.
247
+ */
248
+ async duplicates(adapter) {
249
+ const storage = adapter.open(adapter.scope);
250
+ const original = adapter.domain("same-event", adapter.occurredAt(6n, 1));
251
+ try {
252
+ await storage.append("ticket-duplicate", original);
253
+ await storage.append("ticket-duplicate", original);
254
+ await this.rejects(storage.append("ticket-duplicate", adapter.domain("same-event", adapter.occurredAt(6n, 2))), "same category and record ID with different content must fail");
255
+ const page = await this.read(storage, "ticket-duplicate", { kind: "full" }, 10);
256
+ this.assert(page.entries.length === 1 && page.entries[0]?.occurredAt?.nanos === 1, "identical duplicate append must retain the original occurrence exactly");
257
+ }
258
+ finally {
259
+ storage.close();
260
+ }
261
+ },
262
+ /**
263
+ * Checks Agent ID, state type, and tenant isolation.
264
+ *
265
+ * @param adapter Provider handles and domain fixtures.
266
+ * @returns Completes after scope isolation is checked.
267
+ */
268
+ async scopes(adapter) {
269
+ const first = adapter.open(adapter.scope);
270
+ const otherType = adapter.open({
271
+ ...adapter.scope,
272
+ stateType: `${adapter.scope.stateType}.Other`,
273
+ });
274
+ const tenantA = adapter.open(this.tenantScope(adapter.scope, "tenant-a"));
275
+ const tenantB = adapter.open(this.tenantScope(adapter.scope, "tenant-b"));
276
+ try {
277
+ await first.append("ticket-scope", adapter.system("scope-event", adapter.occurredAt(5n)));
278
+ await tenantA.append("ticket-scope", adapter.system("tenant-event", adapter.occurredAt(5n)));
279
+ this.assert((await this.read(tenantA, "ticket-scope", { kind: "full" }, 1)).entries.length === 1, "selected tenant must retain its own history");
280
+ for (const storage of [otherType, tenantB])
281
+ this.assert((await this.read(storage, "ticket-scope", { kind: "full" }, 1)).entries.length === 0, "state type and tenant must isolate history");
282
+ this.assert((await this.read(first, "other-ticket", { kind: "full" }, 1)).entries.length === 0, "typed Agent ID must isolate history");
283
+ }
284
+ finally {
285
+ first.close();
286
+ otherType.close();
287
+ tenantA.close();
288
+ tenantB.close();
289
+ }
290
+ },
291
+ /**
292
+ * Builds a complete tenant boundary.
293
+ *
294
+ * @param scope Baseline repository scope.
295
+ * @param value Tenant ID value.
296
+ * @returns Scoped provider input.
297
+ */
298
+ tenantScope(scope, value) {
299
+ return {
300
+ ...scope,
301
+ context: {
302
+ name: "Support",
303
+ multitenant: true,
304
+ tenantId: create(TenantIdSchema, { kind: { case: "value", value } }),
305
+ },
306
+ };
307
+ },
308
+ /**
309
+ * Checks live continuation after reopening a handle.
310
+ *
311
+ * @param adapter Provider handles and domain fixtures.
312
+ * @returns Completes after retained entries are checked.
313
+ */
314
+ async live(adapter) {
315
+ const storage = adapter.open(adapter.scope);
316
+ const view = { kind: "full" };
317
+ await storage.append("ticket-live", adapter.domain("middle", adapter.occurredAt(4n)));
318
+ const first = await this.read(storage, "ticket-live", view, 1);
319
+ await storage.append("ticket-live", adapter.domain("new", adapter.occurredAt(5n)));
320
+ await storage.append("ticket-live", adapter.domain("old", adapter.occurredAt(3n)));
321
+ storage.close();
322
+ const reopened = adapter.open(adapter.scope);
323
+ try {
324
+ const continued = await this.read(reopened, "ticket-live", view, 10, AgentHistoryKeys.fromEntry(this.required(first.entries[0])));
325
+ this.assert(continued.entries.length === 1 &&
326
+ AgentHistoryKeys.fromEntry(this.required(continued.entries[0])).recordId === "old", "live continuation must include later older inserts but skip newer inserts");
327
+ const current = await this.read(reopened, "ticket-live", view, 10);
328
+ this.assert(AgentHistoryKeys.fromEntry(this.required(current.entries[0])).recordId === "new", "reopening must retain history without promising process restart durability");
329
+ }
330
+ finally {
331
+ reopened.close();
332
+ }
333
+ },
334
+ /**
335
+ * Checks target Agent isolation among many unrelated IDs.
336
+ *
337
+ * @param adapter Provider handles and domain fixtures.
338
+ * @returns Completes after the target view is checked.
339
+ */
340
+ async unrelatedIds(adapter) {
341
+ const storage = adapter.open(adapter.scope);
342
+ const time = adapter.occurredAt(2n);
343
+ try {
344
+ for (let index = 0; index < 1200; index += 1)
345
+ await storage.append(`unrelated-${String(index)}`, adapter.domain(`unrelated-${String(index)}`, time));
346
+ const first = adapter.domain("target-a", time);
347
+ const second = adapter.domain("target-b", time);
348
+ await storage.append("ticket-indexed", first);
349
+ await storage.append("ticket-indexed", second);
350
+ const page = await this.read(storage, "ticket-indexed", { kind: "domain" }, 1);
351
+ this.assertEntries(page.entries, [first], "target page must omit unrelated Agent entries");
352
+ this.assert(page.hasMore, "target page must continue to its second entry");
353
+ const next = await this.read(storage, "ticket-indexed", { kind: "domain" }, 1, AgentHistoryKeys.fromEntry(this.required(page.entries[0])));
354
+ this.assertEntries(next.entries, [second], "target continuation must omit unrelated entries");
355
+ this.assert(!next.hasMore, "target continuation must terminate");
356
+ }
357
+ finally {
358
+ storage.close();
359
+ }
360
+ },
361
+ /**
362
+ * Checks invalid input and a closed handle.
363
+ *
364
+ * @param adapter Provider handles and domain fixtures.
365
+ * @returns Completes after invalid requests reject.
366
+ */
367
+ async invalid(adapter) {
368
+ const storage = adapter.open(adapter.scope);
369
+ const time = adapter.occurredAt(1n);
370
+ const mismatch = {
371
+ ...adapter.domain("wrong-time", time),
372
+ occurredAt: adapter.occurredAt(1n, 1),
373
+ };
374
+ try {
375
+ await this.rejects(storage.append("ticket-invalid", mismatch), "wrapper and Event occurrence times must agree");
376
+ await this.rejects(storage.read({
377
+ entityId: "ticket-invalid",
378
+ view: { kind: "full" },
379
+ count: 0,
380
+ maxBytes: 100,
381
+ }), "zero count must fail");
382
+ await this.rejects(storage.read({ entityId: "ticket-invalid", view: { kind: "full" }, count: 1, maxBytes: 0 }), "zero byte limit must fail");
383
+ }
384
+ finally {
385
+ storage.close();
386
+ }
387
+ await this.rejects(storage.append("ticket-invalid", adapter.domain("closed", time)), "closed handle must reject appends");
388
+ },
389
+ /**
390
+ * Checks absent conversation identity, incompatible boundaries, and handle validation.
391
+ *
392
+ * @param adapter Provider handles and domain fixtures.
393
+ * @returns Completes after invalid requests reject.
394
+ */
395
+ async invalidViews(adapter) {
396
+ const storage = adapter.open(adapter.scope);
397
+ const time = adapter.occurredAt(1n);
398
+ const view = { kind: "conversation", conversation: create(ConversationIdSchema) };
399
+ try {
400
+ await this.rejects(storage.read({ entityId: "ticket-invalid", view, count: 1, maxBytes: 100 }), "conversation views require a nonempty ConversationId");
401
+ const after = AgentHistoryKeys.fromEntry(adapter.domain("boundary", time));
402
+ await this.rejects(storage.read({
403
+ entityId: "ticket-invalid",
404
+ view: { kind: "system" },
405
+ after,
406
+ count: 1,
407
+ maxBytes: 100,
408
+ }), "category boundary must match its view");
409
+ await this.rejects(storage.read({ entityId: "", view: { kind: "full" }, count: 1, maxBytes: 100 }), "Agent ID is required");
410
+ }
411
+ finally {
412
+ storage.close();
413
+ }
414
+ await this.rejects(storage.read({ entityId: "ticket-invalid", view: { kind: "full" }, count: 1, maxBytes: 100 }), "closed handle must reject reads");
415
+ },
416
+ /**
417
+ * Reads a provider page with a generous byte budget.
418
+ *
419
+ * @param storage Open provider history handle.
420
+ * @param entityId Target Agent ID.
421
+ * @param view Selected history view.
422
+ * @param count Maximum entries.
423
+ * @param after Optional complete ordering-key boundary.
424
+ * @returns Bounded provider page.
425
+ */
426
+ read(storage, entityId, view, count, after) {
427
+ return storage.read({
428
+ entityId,
429
+ view,
430
+ count,
431
+ maxBytes: 1_000_000,
432
+ ...(after ? { after } : {}),
433
+ });
434
+ },
435
+ /**
436
+ * Returns an expected history page entry or throws.
437
+ *
438
+ * @param entry Possible page entry.
439
+ * @returns Present history entry.
440
+ */
441
+ required(entry) {
442
+ if (entry === undefined)
443
+ throw new Error("Agent history conformance expected a page entry.");
444
+ return entry;
445
+ },
446
+ /**
447
+ * Checks complete identities and serialized bytes against original entries.
448
+ *
449
+ * @param actual Provider-returned entries.
450
+ * @param expected Original entries in expected order.
451
+ * @param message Failure explanation.
452
+ */
453
+ assertEntries(actual, expected, message) {
454
+ this.assert(actual.length === expected.length, message);
455
+ for (const [index, source] of expected.entries()) {
456
+ const wanted = this.required(source);
457
+ const returned = this.required(actual[index]);
458
+ const wantedKey = AgentHistoryKeys.fromEntry(wanted);
459
+ const returnedKey = AgentHistoryKeys.fromEntry(returned);
460
+ this.assert(AgentHistoryKeys.compare(returnedKey, wantedKey) === 0, message);
461
+ const left = toBinary(AgentHistoryEntrySchema, returned);
462
+ const right = toBinary(AgentHistoryEntrySchema, wanted);
463
+ this.assert(left.length === right.length && left.every((byte, offset) => byte === right[offset]), message);
464
+ }
465
+ },
466
+ /**
467
+ * Asserts a provider-observed behavior.
468
+ *
469
+ * @param condition Whether the expected behavior held.
470
+ * @param message Failure explanation.
471
+ */
472
+ assert(condition, message) {
473
+ if (!condition)
474
+ throw new Error(`Agent history conformance: ${message}`);
475
+ },
476
+ /**
477
+ * Asserts that an invalid operation rejects.
478
+ *
479
+ * @param operation Operation expected to reject.
480
+ * @param message Failure explanation.
481
+ * @returns Completes after rejection is observed.
482
+ */
483
+ async rejects(operation, message) {
484
+ try {
485
+ await operation;
486
+ }
487
+ catch {
488
+ return;
489
+ }
490
+ throw new Error(`Agent history conformance: ${message}`);
491
+ },
492
+ });
493
+ //# sourceMappingURL=agent-history-conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-history-conformance.js","sourceRoot":"","sources":["../../src/entity/agent-history-conformance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type AgentHistoryEntry } from "@spine-event-engine/proto/agent";
2
+ import type { AgentHistoryRecord } from "@spine-event-engine/proto/generated/spine/server/agent/history_record_pb.js";
3
+ import { type AgentHistoryPage } from "./agent-history.js";
4
+ /**
5
+
6
+ * Combines bounded native query chunks into one byte-bounded history page.
7
+
8
+ */
9
+ export declare const AgentHistoryPages: {
10
+ /**
11
+ * Reads complete-key native query chunks until a count or byte boundary.
12
+ *
13
+ * @param input Positive count and byte bounds.
14
+ * @param after Optional exclusive encoded boundary.
15
+ * @param fetch Reads at most the requested count from one indexed provider view.
16
+ * @returns Independent original entries and continuation status.
17
+ */
18
+ read(input: {
19
+ readonly count: number;
20
+ readonly maxBytes?: number;
21
+ }, after: string | undefined, fetch: (after: string | undefined, limit: number) => Promise<readonly AgentHistoryRecord[]>): Promise<AgentHistoryPage>;
22
+ /**
23
+ * Rejects malformed provider read bounds before query work.
24
+ *
25
+ * @param input Caller-supplied count and byte limits.
26
+ */
27
+ validate(input: {
28
+ readonly count: number;
29
+ readonly maxBytes?: number;
30
+ }): void;
31
+ /**
32
+ * Reads a complete original entry from its internal envelope.
33
+ *
34
+ * @param record Stored history envelope.
35
+ * @returns Complete original entry.
36
+ */
37
+ entry(record: AgentHistoryRecord): AgentHistoryEntry;
38
+ };
39
+ //# sourceMappingURL=agent-history-provider-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-history-provider-page.d.ts","sourceRoot":"","sources":["../../src/entity/agent-history-provider-page.ts"],"names":[],"mappings":"AAeA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAClG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6EAA6E,CAAC;AAEtH,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;;;;;;OAOG;gBAEM;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,SACtD,MAAM,GAAG,SAAS,SAClB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,GAC1F,OAAO,CAAC,gBAAgB,CAAC;IA4B5B;;;;OAIG;oBACa;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAU7E;;;;;OAKG;kBACW,kBAAkB,GAAG,iBAAiB;CAIrD,CAAC"}
@@ -0,0 +1,82 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { toBinary } from "@bufbuild/protobuf";
15
+ import { AgentHistoryEntrySchema } from "@spine-event-engine/proto/agent";
16
+ import { AgentHistoryKeys } from "./agent-history.js";
17
+ /**
18
+
19
+ * Combines bounded native query chunks into one byte-bounded history page.
20
+
21
+ */
22
+ export const AgentHistoryPages = {
23
+ /**
24
+ * Reads complete-key native query chunks until a count or byte boundary.
25
+ *
26
+ * @param input Positive count and byte bounds.
27
+ * @param after Optional exclusive encoded boundary.
28
+ * @param fetch Reads at most the requested count from one indexed provider view.
29
+ * @returns Independent original entries and continuation status.
30
+ */
31
+ async read(input, after, fetch) {
32
+ AgentHistoryPages.validate(input);
33
+ const entries = [];
34
+ let bytes = 0;
35
+ let next = after;
36
+ for (;;) {
37
+ const limit = Math.min(128, input.count + 1 - entries.length);
38
+ const records = await fetch(next, limit);
39
+ if (records.length === 0)
40
+ return { entries: Object.freeze(entries), hasMore: false };
41
+ for (const record of records) {
42
+ const entry = AgentHistoryPages.entry(record);
43
+ const length = toBinary(AgentHistoryEntrySchema, entry).length;
44
+ if (entries.length === input.count ||
45
+ (input.maxBytes !== undefined && length > input.maxBytes - bytes)) {
46
+ if (entries.length === 0)
47
+ throw new RangeError("Agent history first entry exceeds maxBytes.");
48
+ return { entries: Object.freeze(entries), hasMore: true };
49
+ }
50
+ entries.push(entry);
51
+ bytes += length;
52
+ next = AgentHistoryKeys.indexValue(AgentHistoryKeys.fromEntry(entry));
53
+ }
54
+ if (records.length < limit)
55
+ return { entries: Object.freeze(entries), hasMore: false };
56
+ }
57
+ },
58
+ /**
59
+ * Rejects malformed provider read bounds before query work.
60
+ *
61
+ * @param input Caller-supplied count and byte limits.
62
+ */
63
+ validate(input) {
64
+ if (!Number.isSafeInteger(input.count) || input.count <= 0)
65
+ throw new RangeError("Agent history count must be a positive safe integer.");
66
+ if (input.maxBytes !== undefined &&
67
+ (!Number.isSafeInteger(input.maxBytes) || input.maxBytes <= 0))
68
+ throw new RangeError("Agent history maxBytes must be a positive safe integer.");
69
+ },
70
+ /**
71
+ * Reads a complete original entry from its internal envelope.
72
+ *
73
+ * @param record Stored history envelope.
74
+ * @returns Complete original entry.
75
+ */
76
+ entry(record) {
77
+ if (record.entry === undefined)
78
+ throw new Error("Agent history stored record lacks its entry.");
79
+ return record.entry;
80
+ },
81
+ };
82
+ //# sourceMappingURL=agent-history-provider-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-history-provider-page.js","sourceRoot":"","sources":["../../src/entity/agent-history-provider-page.ts"],"names":[],"mappings":"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"}