@earendil-works/pi-durable 1.4.0 → 1.5.1
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/CHANGELOG.md +204 -0
- package/README.md +195 -85
- package/dist/codemode/codemode.d.ts +6 -5
- package/dist/codemode/codemode.d.ts.map +1 -1
- package/dist/codemode/codemode.js +10 -49
- package/dist/codemode/codemode.js.map +1 -1
- package/dist/codemode/models.d.ts +2 -1
- package/dist/codemode/models.d.ts.map +1 -1
- package/dist/codemode/models.js +4 -4
- package/dist/codemode/models.js.map +1 -1
- package/dist/documents.d.ts +1 -1
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -1
- package/dist/documents.js.map +1 -1
- package/dist/entries.d.ts +1 -1
- package/dist/entries.d.ts.map +1 -1
- package/dist/entries.js.map +1 -1
- package/dist/env/index.d.ts +13 -11
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/env/node-watch.d.ts +4 -4
- package/dist/env/node-watch.d.ts.map +1 -1
- package/dist/env/node-watch.js +18 -16
- package/dist/env/node-watch.js.map +1 -1
- package/dist/env/node.d.ts +3 -3
- package/dist/env/node.d.ts.map +1 -1
- package/dist/env/node.js +1 -1
- package/dist/env/node.js.map +1 -1
- package/dist/errors.d.ts +18 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +26 -3
- package/dist/errors.js.map +1 -1
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +37 -3
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +8 -3
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +40 -11
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +24 -8
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js +71 -25
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/define.d.ts +8 -4
- package/dist/harness/define.d.ts.map +1 -1
- package/dist/harness/define.js +4 -0
- package/dist/harness/define.js.map +1 -1
- package/dist/harness/generation.d.ts +39 -6
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +451 -100
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +3 -1
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +87 -62
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +7 -2
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +5 -2
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/json.d.ts +21 -5
- package/dist/harness/json.d.ts.map +1 -1
- package/dist/harness/json.js +23 -5
- package/dist/harness/json.js.map +1 -1
- package/dist/harness/live.d.ts +124 -17
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js +93 -12
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/partial-changes.d.ts +54 -0
- package/dist/harness/partial-changes.d.ts.map +1 -0
- package/dist/harness/partial-changes.js +163 -0
- package/dist/harness/partial-changes.js.map +1 -0
- package/dist/harness/prompt.d.ts +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/provider.d.ts +1 -1
- package/dist/harness/provider.d.ts.map +1 -1
- package/dist/harness/provider.js.map +1 -1
- package/dist/harness/registry-reader.d.ts +11 -0
- package/dist/harness/registry-reader.d.ts.map +1 -0
- package/dist/harness/registry-reader.js +25 -0
- package/dist/harness/registry-reader.js.map +1 -0
- package/dist/harness/scheduler.d.ts +48 -20
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +1006 -380
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +18 -11
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +63 -26
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +14 -9
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +38 -28
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/telemetry.d.ts +11 -11
- package/dist/harness/telemetry.d.ts.map +1 -1
- package/dist/harness/telemetry.js +7 -7
- package/dist/harness/telemetry.js.map +1 -1
- package/dist/harness/tool.d.ts +3 -1
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +172 -56
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/transcript.d.ts +72 -0
- package/dist/harness/transcript.d.ts.map +1 -0
- package/dist/harness/transcript.js +264 -0
- package/dist/harness/transcript.js.map +1 -0
- package/dist/harness/types.d.ts +237 -61
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +2 -1
- package/dist/harness/usage.d.ts.map +1 -1
- package/dist/harness/usage.js +1 -1
- package/dist/harness/usage.js.map +1 -1
- package/dist/harness/util.d.ts +4 -2
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js +9 -0
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +44 -22
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +130 -71
- package/dist/harness/view.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/search.d.ts +19 -3
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +107 -44
- package/dist/search.js.map +1 -1
- package/dist/session/cached-storage.d.ts +72 -0
- package/dist/session/cached-storage.d.ts.map +1 -0
- package/dist/session/cached-storage.js +269 -0
- package/dist/session/cached-storage.js.map +1 -0
- package/dist/session/conversation-tails.d.ts +33 -0
- package/dist/session/conversation-tails.d.ts.map +1 -0
- package/dist/session/conversation-tails.js +101 -0
- package/dist/session/conversation-tails.js.map +1 -0
- package/dist/session/forks.d.ts +1 -1
- package/dist/session/forks.d.ts.map +1 -1
- package/dist/session/forks.js.map +1 -1
- package/dist/session/keys.d.ts +69 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +161 -0
- package/dist/session/keys.js.map +1 -0
- package/dist/session/session.d.ts +169 -26
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +1029 -171
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts +84 -5
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +227 -40
- package/dist/session/transaction.js.map +1 -1
- package/dist/session/writer.d.ts +74 -0
- package/dist/session/writer.d.ts.map +1 -0
- package/dist/session/writer.js +294 -0
- package/dist/session/writer.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +12 -3
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/indexeddb.js +91 -41
- package/dist/storage/indexeddb.js.map +1 -1
- package/dist/storage/jsonl/index.d.ts +1 -1
- package/dist/storage/jsonl/index.d.ts.map +1 -1
- package/dist/storage/jsonl/index.js +1 -1
- package/dist/storage/jsonl/index.js.map +1 -1
- package/dist/storage/jsonl/node.d.ts +3 -3
- package/dist/storage/jsonl/node.d.ts.map +1 -1
- package/dist/storage/jsonl/node.js +2 -2
- package/dist/storage/jsonl/node.js.map +1 -1
- package/dist/storage/jsonl/storage.d.ts +46 -5
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +158 -43
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts +9 -3
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +28 -2
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite/commit.d.ts +52 -0
- package/dist/storage/sqlite/commit.d.ts.map +1 -0
- package/dist/storage/sqlite/commit.js +371 -0
- package/dist/storage/sqlite/commit.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +33 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +53 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/statements.d.ts +13 -0
- package/dist/storage/sqlite/statements.d.ts.map +1 -0
- package/dist/storage/sqlite/statements.js +88 -0
- package/dist/storage/sqlite/statements.js.map +1 -0
- package/dist/storage/sqlite/storage.d.ts +23 -10
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +120 -261
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/storage/store/commit.d.ts +33 -0
- package/dist/storage/store/commit.d.ts.map +1 -0
- package/dist/storage/store/commit.js +286 -0
- package/dist/storage/store/commit.js.map +1 -0
- package/dist/storage/store/documents.d.ts +43 -0
- package/dist/storage/store/documents.d.ts.map +1 -0
- package/dist/storage/store/documents.js +102 -0
- package/dist/storage/store/documents.js.map +1 -0
- package/dist/storage/store/index.d.ts +2 -0
- package/dist/storage/store/index.d.ts.map +1 -0
- package/dist/storage/store/index.js +2 -0
- package/dist/storage/store/index.js.map +1 -0
- package/dist/storage/store/queries.d.ts +49 -0
- package/dist/storage/store/queries.d.ts.map +1 -0
- package/dist/storage/store/queries.js +93 -0
- package/dist/storage/store/queries.js.map +1 -0
- package/dist/storage/store/storage.d.ts +60 -0
- package/dist/storage/store/storage.d.ts.map +1 -0
- package/dist/storage/store/storage.js +438 -0
- package/dist/storage/store/storage.js.map +1 -0
- package/dist/storage/store/tables.d.ts +54 -0
- package/dist/storage/store/tables.d.ts.map +1 -0
- package/dist/storage/store/tables.js +108 -0
- package/dist/storage/store/tables.js.map +1 -0
- package/dist/testing/commit-writes.d.ts +5 -0
- package/dist/testing/commit-writes.d.ts.map +1 -0
- package/dist/testing/commit-writes.js +12 -0
- package/dist/testing/commit-writes.js.map +1 -0
- package/dist/testing/env-conformance.js +7 -7
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/storage-benchmark.d.ts.map +1 -1
- package/dist/testing/storage-benchmark.js +18 -17
- package/dist/testing/storage-benchmark.js.map +1 -1
- package/dist/testing/storage-conformance.d.ts.map +1 -1
- package/dist/testing/storage-conformance.js +354 -69
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/tool-search/tool-search.d.ts +8 -14
- package/dist/tool-search/tool-search.d.ts.map +1 -1
- package/dist/tool-search/tool-search.js +25 -13
- package/dist/tool-search/tool-search.js.map +1 -1
- package/dist/tools/bash.d.ts +13 -13
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +16 -15
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.d.ts +7 -7
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +9 -9
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/file-mutation-queue.d.ts +1 -1
- package/dist/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/tools/file-mutation-queue.js.map +1 -1
- package/dist/tools/index.d.ts +32 -32
- package/dist/tools/path-utils.d.ts +1 -1
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/read.d.ts +6 -6
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +19 -8
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write.d.ts +4 -4
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +5 -5
- package/dist/tools/write.js.map +1 -1
- package/dist/types.d.ts +228 -78
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +19 -12
- package/dist/harness/events.d.ts +0 -186
- package/dist/harness/events.d.ts.map +0 -1
- package/dist/harness/events.js +0 -373
- package/dist/harness/events.js.map +0 -1
- package/dist/session/observation.d.ts +0 -42
- package/dist/session/observation.d.ts.map +0 -1
- package/dist/session/observation.js +0 -281
- package/dist/session/observation.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
2
2
|
import { ROOT_CONVERSATION_ID } from "../types.js";
|
|
3
|
+
import { commitWrites } from "./commit-writes.js";
|
|
3
4
|
export const STORAGE_MEMORY_SCALES = [
|
|
4
5
|
{ name: "1k", entryCount: 1_000, taskCount: 200, documentCount: 200 },
|
|
5
6
|
{ name: "10k", entryCount: 10_000, taskCount: 2_000, documentCount: 2_000 },
|
|
@@ -43,7 +44,7 @@ function task(id, index) {
|
|
|
43
44
|
}
|
|
44
45
|
/** Seed deterministic representative data through only the public `Storage` contract. */
|
|
45
46
|
export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
46
|
-
await storage
|
|
47
|
+
await commitWrites(storage, [{ type: "conversation", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);
|
|
47
48
|
let firstEntryId;
|
|
48
49
|
for (let start = 0; start < scale.entryCount; start += BATCH_SIZE) {
|
|
49
50
|
const writes = [];
|
|
@@ -62,14 +63,14 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
62
63
|
},
|
|
63
64
|
});
|
|
64
65
|
}
|
|
65
|
-
await storage
|
|
66
|
+
await commitWrites(storage, writes, BACKGROUND_CONTEXT);
|
|
66
67
|
}
|
|
67
68
|
for (let start = 0; start < scale.taskCount; start += BATCH_SIZE) {
|
|
68
69
|
const writes = [];
|
|
69
70
|
for (let index = start; index < Math.min(start + BATCH_SIZE, scale.taskCount); index++) {
|
|
70
71
|
writes.push({ type: "task", value: task(await storage.mintId(), index) });
|
|
71
72
|
}
|
|
72
|
-
await storage
|
|
73
|
+
await commitWrites(storage, writes, BACKGROUND_CONTEXT);
|
|
73
74
|
}
|
|
74
75
|
let exactDocumentId;
|
|
75
76
|
for (let start = 0; start < scale.documentCount; start += BATCH_SIZE) {
|
|
@@ -83,13 +84,13 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
83
84
|
content: { kind: "base", version: 1, value: { index, text: "x".repeat(128) } },
|
|
84
85
|
});
|
|
85
86
|
}
|
|
86
|
-
await storage
|
|
87
|
+
await commitWrites(storage, writes, BACKGROUND_CONTEXT);
|
|
87
88
|
}
|
|
88
89
|
const replayEntries = await Promise.all(REPLAY_TAILS.map(async (tail) => {
|
|
89
90
|
const id = await storage.mintId();
|
|
90
91
|
return { tail, id };
|
|
91
92
|
}));
|
|
92
|
-
await storage
|
|
93
|
+
await commitWrites(storage, replayEntries.map(({ tail, id }) => ({
|
|
93
94
|
type: "document.create",
|
|
94
95
|
record: {
|
|
95
96
|
id,
|
|
@@ -102,7 +103,7 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
102
103
|
content: { kind: "base", version: 1, value: { count: 0, text: "x".repeat(64) } },
|
|
103
104
|
})), BACKGROUND_CONTEXT);
|
|
104
105
|
for (let count = 1; count <= REPLAY_TAILS.at(-1); count++) {
|
|
105
|
-
await storage
|
|
106
|
+
await commitWrites(storage, replayEntries
|
|
106
107
|
.filter(({ tail }) => count <= tail)
|
|
107
108
|
.map(({ id }) => ({
|
|
108
109
|
type: "document.change",
|
|
@@ -118,7 +119,7 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
118
119
|
history: "rewindable",
|
|
119
120
|
fork: "asOf",
|
|
120
121
|
};
|
|
121
|
-
await storage
|
|
122
|
+
await commitWrites(storage, [
|
|
122
123
|
{
|
|
123
124
|
type: "document.create",
|
|
124
125
|
record: historicalRecord,
|
|
@@ -127,7 +128,7 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
127
128
|
], BACKGROUND_CONTEXT);
|
|
128
129
|
let ancientAt;
|
|
129
130
|
for (let count = 1; count <= HISTORY_SEGMENT_LENGTH; count++) {
|
|
130
|
-
ancientAt = await storage
|
|
131
|
+
ancientAt = await commitWrites(storage, [
|
|
131
132
|
{
|
|
132
133
|
type: "document.change",
|
|
133
134
|
id: historicalDocumentId,
|
|
@@ -135,7 +136,7 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
135
136
|
},
|
|
136
137
|
], BACKGROUND_CONTEXT);
|
|
137
138
|
}
|
|
138
|
-
await storage
|
|
139
|
+
await commitWrites(storage, [
|
|
139
140
|
{
|
|
140
141
|
type: "document.change",
|
|
141
142
|
id: historicalDocumentId,
|
|
@@ -146,7 +147,7 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
146
147
|
throw new Error("Benchmark history seed produced no commits");
|
|
147
148
|
let recentAt = ancientAt;
|
|
148
149
|
for (let count = HISTORY_SEGMENT_LENGTH + 1; count <= HISTORY_SEGMENT_LENGTH * 2; count++) {
|
|
149
|
-
recentAt = await storage
|
|
150
|
+
recentAt = await commitWrites(storage, [
|
|
150
151
|
{
|
|
151
152
|
type: "document.change",
|
|
152
153
|
id: historicalDocumentId,
|
|
@@ -161,14 +162,14 @@ export async function seedStorageBenchmark(storage, scale = TIMING_SCALE) {
|
|
|
161
162
|
let deepestConversationId = ROOT_CONVERSATION_ID;
|
|
162
163
|
for (let depth = 0; depth < FORK_DEPTH; depth++) {
|
|
163
164
|
const conversationId = await storage.mintId();
|
|
164
|
-
await storage
|
|
165
|
+
await commitWrites(storage, [
|
|
165
166
|
{
|
|
166
167
|
type: "conversation",
|
|
167
168
|
value: { id: conversationId, parent: { conversationId: parentConversationId, at: parentAt } },
|
|
168
169
|
},
|
|
169
170
|
], BACKGROUND_CONTEXT);
|
|
170
171
|
const ids = await Promise.all(Array.from({ length: ENTRIES_PER_FORK }, () => storage.mintId()));
|
|
171
|
-
await storage
|
|
172
|
+
await commitWrites(storage, ids.map((id, index) => ({
|
|
172
173
|
type: "entry",
|
|
173
174
|
value: {
|
|
174
175
|
id,
|
|
@@ -263,8 +264,8 @@ export const STORAGE_READ_BENCHMARKS = [
|
|
|
263
264
|
];
|
|
264
265
|
/** Seed the common state expected by every write benchmark sample. */
|
|
265
266
|
export async function seedStorageWriteBenchmark(storage) {
|
|
266
|
-
await storage
|
|
267
|
-
await storage
|
|
267
|
+
await commitWrites(storage, [{ type: "conversation", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);
|
|
268
|
+
await commitWrites(storage, await Promise.all(Array.from({ length: 100 }, async (_, index) => ({
|
|
268
269
|
type: "entry",
|
|
269
270
|
value: {
|
|
270
271
|
id: await storage.mintId(),
|
|
@@ -280,7 +281,7 @@ export const STORAGE_WRITE_BENCHMARKS = [
|
|
|
280
281
|
expected: 1,
|
|
281
282
|
async run(storage) {
|
|
282
283
|
const id = await storage.mintId();
|
|
283
|
-
await storage
|
|
284
|
+
await commitWrites(storage, [
|
|
284
285
|
{
|
|
285
286
|
type: "entry",
|
|
286
287
|
value: {
|
|
@@ -307,7 +308,7 @@ export const STORAGE_WRITE_BENCHMARKS = [
|
|
|
307
308
|
data: { index, text: "x".repeat(128) },
|
|
308
309
|
},
|
|
309
310
|
})));
|
|
310
|
-
await storage
|
|
311
|
+
await commitWrites(storage, writes, BACKGROUND_CONTEXT);
|
|
311
312
|
return writes.length;
|
|
312
313
|
},
|
|
313
314
|
},
|
|
@@ -342,7 +343,7 @@ export const STORAGE_WRITE_BENCHMARKS = [
|
|
|
342
343
|
content: { kind: "base", version: 1, value: { entryId, taskId } },
|
|
343
344
|
},
|
|
344
345
|
];
|
|
345
|
-
await storage
|
|
346
|
+
await commitWrites(storage, writes, BACKGROUND_CONTEXT);
|
|
346
347
|
return writes.length;
|
|
347
348
|
},
|
|
348
349
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-benchmark.js","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type {\n\tConversationId,\n\tDocumentCreate,\n\tDocumentId,\n\tEntryId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\n\nexport type StorageBenchmarkScale = {\n\treadonly name: string;\n\treadonly entryCount: number;\n\treadonly taskCount: number;\n\treadonly documentCount: number;\n};\n\nexport const STORAGE_MEMORY_SCALES: readonly StorageBenchmarkScale[] = [\n\t{ name: \"1k\", entryCount: 1_000, taskCount: 200, documentCount: 200 },\n\t{ name: \"10k\", entryCount: 10_000, taskCount: 2_000, documentCount: 2_000 },\n];\n\nexport const TIMING_SCALE: StorageBenchmarkScale = {\n\tname: \"timing\",\n\tentryCount: 1_000,\n\ttaskCount: 300,\n\tdocumentCount: 300,\n};\n\nconst REPLAY_TAILS = [0, 16, 128, 1_024] as const;\nconst HISTORY_SEGMENT_LENGTH = 128;\nconst FORK_DEPTH = 8;\nconst ENTRIES_PER_FORK = 32;\nconst BATCH_SIZE = 100;\n\nexport function storageBenchmarkPrimaryRecordCount(scale: StorageBenchmarkScale): number {\n\treturn (\n\t\t1 +\n\t\tscale.entryCount +\n\t\tscale.taskCount +\n\t\tscale.documentCount +\n\t\tREPLAY_TAILS.length +\n\t\t1 +\n\t\tFORK_DEPTH * (1 + ENTRIES_PER_FORK)\n\t);\n}\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\nexport type StorageBenchmarkDataset = {\n\treadonly firstEntryId: EntryId;\n\treadonly filteredTaskCount: number;\n\treadonly exactDocumentId: DocumentId;\n\treadonly exactDocumentKey: string;\n\treadonly replayDocumentIds: Readonly<Record<(typeof REPLAY_TAILS)[number], DocumentId>>;\n\treadonly historicalDocumentId: DocumentId;\n\treadonly ancientAt: Seq;\n\treadonly recentAt: Seq;\n\treadonly deepestConversationId: ConversationId;\n\treadonly ancestorHeadEntryId: EntryId;\n};\n\nfunction task(id: TaskId<JsonValue>, index: number): StoredTask {\n\tconst statuses = [\"pending\", \"running\", \"terminal\"] as const;\n\tconst status = statuses[index % statuses.length];\n\tconst common = {\n\t\tid,\n\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\tkind: index % 4 === 0 ? \"benchmark.filtered\" : \"benchmark.other\",\n\t\tversion: 1,\n\t\tinput: { index },\n\t\tbackground: index % 5 === 0,\n\t\tabortRequested: index % 7 === 0,\n\t};\n\tif (status === \"terminal\") {\n\t\treturn { ...common, state: { status, outcome: { status: \"completed\", result: { index } } } };\n\t}\n\treturn { ...common, state: { status, checkpoint: { index, payload: \"x\".repeat(64) } } };\n}\n\n/** Seed deterministic representative data through only the public `Storage` contract. */\nexport async function seedStorageBenchmark(\n\tstorage: Storage,\n\tscale: StorageBenchmarkScale = TIMING_SCALE,\n): Promise<StorageBenchmarkDataset> {\n\tawait storage.commit([{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\n\tlet firstEntryId: EntryId | undefined;\n\tfor (let start = 0; start < scale.entryCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.entryCount); index++) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tif (index === 0) firstEntryId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"entry\",\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.entry\",\n\t\t\t\t\t...(index === 0 ? { head: id } : {}),\n\t\t\t\t\tdata: { index, text: `entry-${index}-${\"x\".repeat(96)}` },\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait storage.commit(writes, BACKGROUND_CONTEXT);\n\t}\n\n\tfor (let start = 0; start < scale.taskCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.taskCount); index++) {\n\t\t\twrites.push({ type: \"task\", value: task(await storage.mintId<TaskId<JsonValue>>(), index) });\n\t\t}\n\t\tawait storage.commit(writes, BACKGROUND_CONTEXT);\n\t}\n\n\tlet exactDocumentId: DocumentId | undefined;\n\tfor (let start = 0; start < scale.documentCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.documentCount); index++) {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\texactDocumentId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: { id, kind: \"benchmark.family\", key: `key-${index}`, scope: { kind: \"session\" } },\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { index, text: \"x\".repeat(128) } },\n\t\t\t});\n\t\t}\n\t\tawait storage.commit(writes, BACKGROUND_CONTEXT);\n\t}\n\n\tconst replayEntries = await Promise.all(\n\t\tREPLAY_TAILS.map(async (tail) => {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\treturn { tail, id };\n\t\t}),\n\t);\n\tawait storage.commit(\n\t\treplayEntries.map(({ tail, id }) => ({\n\t\t\ttype: \"document.create\" as const,\n\t\t\trecord: {\n\t\t\t\tid,\n\t\t\t\tkind: \"benchmark.replay\",\n\t\t\t\tkey: String(tail),\n\t\t\t\tscope: { kind: \"conversation\" as const, conversationId: ROOT_CONVERSATION_ID },\n\t\t\t\thistory: \"rewindable\" as const,\n\t\t\t\tfork: \"asOf\" as const,\n\t\t\t},\n\t\t\tcontent: { kind: \"base\" as const, version: 1, value: { count: 0, text: \"x\".repeat(64) } },\n\t\t})),\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tfor (let count = 1; count <= REPLAY_TAILS.at(-1)!; count++) {\n\t\tawait storage.commit(\n\t\t\treplayEntries\n\t\t\t\t.filter(({ tail }) => count <= tail)\n\t\t\t\t.map(({ id }) => ({\n\t\t\t\t\ttype: \"document.change\" as const,\n\t\t\t\t\tid,\n\t\t\t\t\tcontent: { kind: \"delta\" as const, version: 1, ops: [[\"s\", [\"count\"], count] as const] },\n\t\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tconst historicalDocumentId = await storage.mintId<DocumentId>();\n\tconst historicalRecord = {\n\t\tid: historicalDocumentId,\n\t\tkind: \"benchmark.history\",\n\t\tscope: { kind: \"conversation\", conversationId: ROOT_CONVERSATION_ID },\n\t\thistory: \"rewindable\",\n\t\tfork: \"asOf\",\n\t} satisfies DocumentCreate;\n\tawait storage.commit(\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: historicalRecord,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: 0 } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tlet ancientAt: Seq | undefined;\n\tfor (let count = 1; count <= HISTORY_SEGMENT_LENGTH; count++) {\n\t\tancientAt = await storage.commit(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\tawait storage.commit(\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.change\",\n\t\t\t\tid: historicalDocumentId,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: HISTORY_SEGMENT_LENGTH } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tif (ancientAt === undefined) throw new Error(\"Benchmark history seed produced no commits\");\n\tlet recentAt = ancientAt;\n\tfor (let count = HISTORY_SEGMENT_LENGTH + 1; count <= HISTORY_SEGMENT_LENGTH * 2; count++) {\n\t\trecentAt = await storage.commit(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tif (firstEntryId === undefined) throw new Error(\"Benchmark scale must create entries\");\n\tlet parentConversationId = ROOT_CONVERSATION_ID;\n\tlet parentAt = firstEntryId;\n\tlet deepestConversationId = ROOT_CONVERSATION_ID;\n\tfor (let depth = 0; depth < FORK_DEPTH; depth++) {\n\t\tconst conversationId = await storage.mintId<ConversationId>();\n\t\tawait storage.commit(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\tvalue: { id: conversationId, parent: { conversationId: parentConversationId, at: parentAt } },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tconst ids = await Promise.all(Array.from({ length: ENTRIES_PER_FORK }, () => storage.mintId<EntryId>()));\n\t\tawait storage.commit(\n\t\t\tids.map((id, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: \"benchmark.fork\",\n\t\t\t\t\tdata: { depth, index },\n\t\t\t\t},\n\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tparentConversationId = conversationId;\n\t\tparentAt = ids.at(-1)!;\n\t\tdeepestConversationId = conversationId;\n\t}\n\n\tif (exactDocumentId === undefined) throw new Error(\"Benchmark scale must create documents\");\n\treturn {\n\t\tfirstEntryId,\n\t\tfilteredTaskCount: Math.min(50, Math.ceil(scale.taskCount / 60)),\n\t\texactDocumentId,\n\t\texactDocumentKey: `key-${scale.documentCount - 1}`,\n\t\treplayDocumentIds: Object.fromEntries(replayEntries.map(({ tail, id }) => [tail, id])) as Record<\n\t\t\t(typeof REPLAY_TAILS)[number],\n\t\t\tDocumentId\n\t\t>,\n\t\thistoricalDocumentId,\n\t\tancientAt,\n\t\trecentAt,\n\t\tdeepestConversationId,\n\t\tancestorHeadEntryId: firstEntryId,\n\t};\n}\n\nexport type StorageReadBenchmark = {\n\treadonly name: string;\n\trun(storage: Storage, dataset: StorageBenchmarkDataset): Promise<number>;\n\texpected(dataset: StorageBenchmarkDataset): number;\n};\n\nexport const STORAGE_READ_BENCHMARKS: readonly StorageReadBenchmark[] = [\n\t{\n\t\tname: \"exact entry lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.entry(dataset.firstEntryId, BACKGROUND_CONTEXT))?.entry.id ?? -1;\n\t\t},\n\t\texpected: ({ firstEntryId }) => firstEntryId,\n\t},\n\t{\n\t\tname: \"entry page scan (100)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries({ conversationId: ROOT_CONVERSATION_ID }, 100, undefined, BACKGROUND_CONTEXT)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"filtered task scan (50)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanTasks(\n\t\t\t\t\t{ kind: \"benchmark.filtered\", status: \"pending\", background: true },\n\t\t\t\t\t50,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: ({ filteredTaskCount }) => filteredTaskCount,\n\t},\n\t{\n\t\tname: \"exact document address among many\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"benchmark.family\", key: dataset.exactDocumentKey, scope: { kind: \"session\" } },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t)\n\t\t\t\t)?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ exactDocumentId }) => exactDocumentId,\n\t},\n\t...REPLAY_TAILS.map(\n\t\t(tail): StorageReadBenchmark => ({\n\t\t\tname: `document replay tail (${tail})`,\n\t\t\tasync run(storage, dataset) {\n\t\t\t\treturn Number(\n\t\t\t\t\t(await storage.document(dataset.replayDocumentIds[tail], \"current\", BACKGROUND_CONTEXT))?.value.count,\n\t\t\t\t);\n\t\t\t},\n\t\t\texpected: () => tail,\n\t\t}),\n\t),\n\t{\n\t\tname: \"ancient historical read before newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.ancientAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH,\n\t},\n\t{\n\t\tname: \"recent historical read after newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.recentAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH * 2,\n\t},\n\t{\n\t\tname: \"fork-depth history scan (100)\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t{ conversationId: dataset.deepestConversationId },\n\t\t\t\t\t100,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"fork-depth head lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(await storage.findLatestHeadMarker(dataset.deepestConversationId, undefined, BACKGROUND_CONTEXT))?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ ancestorHeadEntryId }) => ancestorHeadEntryId,\n\t},\n];\n\nexport type StorageWriteBenchmark = {\n\treadonly name: string;\n\treadonly expected: number;\n\trun(storage: Storage): Promise<number>;\n};\n\n/** Seed the common state expected by every write benchmark sample. */\nexport async function seedStorageWriteBenchmark(storage: Storage): Promise<void> {\n\tawait storage.commit([{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\tawait storage.commit(\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: 100 }, async (_, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.baseline\",\n\t\t\t\t\tdata: { index },\n\t\t\t\t},\n\t\t\t})),\n\t\t),\n\t\tBACKGROUND_CONTEXT,\n\t);\n}\n\nexport const STORAGE_WRITE_BENCHMARKS: readonly StorageWriteBenchmark[] = [\n\t{\n\t\tname: \"commit one entry\",\n\t\texpected: 1,\n\t\tasync run(storage) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\treturn 1;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit 100 entries\",\n\t\texpected: 100,\n\t\tasync run(storage) {\n\t\t\tconst writes = await Promise.all(\n\t\t\t\tArray.from(\n\t\t\t\t\t{ length: 100 },\n\t\t\t\t\tasync (_, index): Promise<StorageWrite> => ({\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { index, text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait storage.commit(writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit mixed entry/task/submission/document\",\n\t\texpected: 4,\n\t\tasync run(storage) {\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst documentId = await storage.mintId<DocumentId>();\n\t\t\tconst writes: readonly StorageWrite[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\tvalue: { id: entryId, conversationId: ROOT_CONVERSATION_ID, kind: \"benchmark.mixed\" },\n\t\t\t\t},\n\t\t\t\t{ type: \"task\", value: task(taskId, taskId) },\n\t\t\t\t{\n\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tid: submissionId,\n\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\trequestId: `benchmark-${submissionId}`,\n\t\t\t\t\t\ttype: \"write\",\n\t\t\t\t\t\tstatus: \"done\",\n\t\t\t\t\t\tentry: entryId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\trecord: { id: documentId, kind: \"benchmark.mixed\", key: String(documentId), scope: { kind: \"session\" } },\n\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { entryId, taskId } },\n\t\t\t\t},\n\t\t\t];\n\t\t\tawait storage.commit(writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n];\n"]}
|
|
1
|
+
{"version":3,"file":"storage-benchmark.js","sourceRoot":"","sources":["../../src/testing/storage-benchmark.ts"],"names":[],"mappings":"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","sourcesContent":["import { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type { JsonValue } from \"@earendil-works/chord/json\";\nimport type {\n\tConversationId,\n\tDocumentCreate,\n\tDocumentId,\n\tEntryId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tTaskId,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { ROOT_CONVERSATION_ID } from \"../types.ts\";\nimport { commitWrites } from \"./commit-writes.ts\";\n\nexport type StorageBenchmarkScale = {\n\treadonly name: string;\n\treadonly entryCount: number;\n\treadonly taskCount: number;\n\treadonly documentCount: number;\n};\n\nexport const STORAGE_MEMORY_SCALES: readonly StorageBenchmarkScale[] = [\n\t{ name: \"1k\", entryCount: 1_000, taskCount: 200, documentCount: 200 },\n\t{ name: \"10k\", entryCount: 10_000, taskCount: 2_000, documentCount: 2_000 },\n];\n\nexport const TIMING_SCALE: StorageBenchmarkScale = {\n\tname: \"timing\",\n\tentryCount: 1_000,\n\ttaskCount: 300,\n\tdocumentCount: 300,\n};\n\nconst REPLAY_TAILS = [0, 16, 128, 1_024] as const;\nconst HISTORY_SEGMENT_LENGTH = 128;\nconst FORK_DEPTH = 8;\nconst ENTRIES_PER_FORK = 32;\nconst BATCH_SIZE = 100;\n\nexport function storageBenchmarkPrimaryRecordCount(scale: StorageBenchmarkScale): number {\n\treturn (\n\t\t1 +\n\t\tscale.entryCount +\n\t\tscale.taskCount +\n\t\tscale.documentCount +\n\t\tREPLAY_TAILS.length +\n\t\t1 +\n\t\tFORK_DEPTH * (1 + ENTRIES_PER_FORK)\n\t);\n}\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\nexport type StorageBenchmarkDataset = {\n\treadonly firstEntryId: EntryId;\n\treadonly filteredTaskCount: number;\n\treadonly exactDocumentId: DocumentId;\n\treadonly exactDocumentKey: string;\n\treadonly replayDocumentIds: Readonly<Record<(typeof REPLAY_TAILS)[number], DocumentId>>;\n\treadonly historicalDocumentId: DocumentId;\n\treadonly ancientAt: Seq;\n\treadonly recentAt: Seq;\n\treadonly deepestConversationId: ConversationId;\n\treadonly ancestorHeadEntryId: EntryId;\n};\n\nfunction task(id: TaskId<JsonValue>, index: number): StoredTask {\n\tconst statuses = [\"pending\", \"running\", \"terminal\"] as const;\n\tconst status = statuses[index % statuses.length];\n\tconst common = {\n\t\tid,\n\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\tkind: index % 4 === 0 ? \"benchmark.filtered\" : \"benchmark.other\",\n\t\tversion: 1,\n\t\tinput: { index },\n\t\tbackground: index % 5 === 0,\n\t\tabortRequested: index % 7 === 0,\n\t};\n\tif (status === \"terminal\") {\n\t\treturn { ...common, state: { status, outcome: { status: \"completed\", result: { index } } } };\n\t}\n\treturn { ...common, state: { status, checkpoint: { index, payload: \"x\".repeat(64) } } };\n}\n\n/** Seed deterministic representative data through only the public `Storage` contract. */\nexport async function seedStorageBenchmark(\n\tstorage: Storage,\n\tscale: StorageBenchmarkScale = TIMING_SCALE,\n): Promise<StorageBenchmarkDataset> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\n\tlet firstEntryId: EntryId | undefined;\n\tfor (let start = 0; start < scale.entryCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.entryCount); index++) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tif (index === 0) firstEntryId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"entry\",\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.entry\",\n\t\t\t\t\t...(index === 0 ? { head: id } : {}),\n\t\t\t\t\tdata: { index, text: `entry-${index}-${\"x\".repeat(96)}` },\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tfor (let start = 0; start < scale.taskCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.taskCount); index++) {\n\t\t\twrites.push({ type: \"task\", value: task(await storage.mintId<TaskId<JsonValue>>(), index) });\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tlet exactDocumentId: DocumentId | undefined;\n\tfor (let start = 0; start < scale.documentCount; start += BATCH_SIZE) {\n\t\tconst writes: StorageWrite[] = [];\n\t\tfor (let index = start; index < Math.min(start + BATCH_SIZE, scale.documentCount); index++) {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\texactDocumentId = id;\n\t\t\twrites.push({\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: { id, kind: \"benchmark.family\", key: `key-${index}`, scope: { kind: \"session\" } },\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { index, text: \"x\".repeat(128) } },\n\t\t\t});\n\t\t}\n\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t}\n\n\tconst replayEntries = await Promise.all(\n\t\tREPLAY_TAILS.map(async (tail) => {\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\treturn { tail, id };\n\t\t}),\n\t);\n\tawait commitWrites(\n\t\tstorage,\n\t\treplayEntries.map(({ tail, id }) => ({\n\t\t\ttype: \"document.create\" as const,\n\t\t\trecord: {\n\t\t\t\tid,\n\t\t\t\tkind: \"benchmark.replay\",\n\t\t\t\tkey: String(tail),\n\t\t\t\tscope: { kind: \"conversation\" as const, conversationId: ROOT_CONVERSATION_ID },\n\t\t\t\thistory: \"rewindable\" as const,\n\t\t\t\tfork: \"asOf\" as const,\n\t\t\t},\n\t\t\tcontent: { kind: \"base\" as const, version: 1, value: { count: 0, text: \"x\".repeat(64) } },\n\t\t})),\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tfor (let count = 1; count <= REPLAY_TAILS.at(-1)!; count++) {\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\treplayEntries\n\t\t\t\t.filter(({ tail }) => count <= tail)\n\t\t\t\t.map(({ id }) => ({\n\t\t\t\t\ttype: \"document.change\" as const,\n\t\t\t\t\tid,\n\t\t\t\t\tcontent: { kind: \"delta\" as const, version: 1, ops: [[\"s\", [\"count\"], count] as const] },\n\t\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tconst historicalDocumentId = await storage.mintId<DocumentId>();\n\tconst historicalRecord = {\n\t\tid: historicalDocumentId,\n\t\tkind: \"benchmark.history\",\n\t\tscope: { kind: \"conversation\", conversationId: ROOT_CONVERSATION_ID },\n\t\thistory: \"rewindable\",\n\t\tfork: \"asOf\",\n\t} satisfies DocumentCreate;\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.create\",\n\t\t\t\trecord: historicalRecord,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: 0 } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tlet ancientAt: Seq | undefined;\n\tfor (let count = 1; count <= HISTORY_SEGMENT_LENGTH; count++) {\n\t\tancientAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\tawait commitWrites(\n\t\tstorage,\n\t\t[\n\t\t\t{\n\t\t\t\ttype: \"document.change\",\n\t\t\t\tid: historicalDocumentId,\n\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: HISTORY_SEGMENT_LENGTH } },\n\t\t\t},\n\t\t],\n\t\tBACKGROUND_CONTEXT,\n\t);\n\tif (ancientAt === undefined) throw new Error(\"Benchmark history seed produced no commits\");\n\tlet recentAt = ancientAt;\n\tfor (let count = HISTORY_SEGMENT_LENGTH + 1; count <= HISTORY_SEGMENT_LENGTH * 2; count++) {\n\t\trecentAt = await commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\tid: historicalDocumentId,\n\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], count]] },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t}\n\n\tif (firstEntryId === undefined) throw new Error(\"Benchmark scale must create entries\");\n\tlet parentConversationId = ROOT_CONVERSATION_ID;\n\tlet parentAt = firstEntryId;\n\tlet deepestConversationId = ROOT_CONVERSATION_ID;\n\tfor (let depth = 0; depth < FORK_DEPTH; depth++) {\n\t\tconst conversationId = await storage.mintId<ConversationId>();\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\tvalue: { id: conversationId, parent: { conversationId: parentConversationId, at: parentAt } },\n\t\t\t\t},\n\t\t\t],\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tconst ids = await Promise.all(Array.from({ length: ENTRIES_PER_FORK }, () => storage.mintId<EntryId>()));\n\t\tawait commitWrites(\n\t\t\tstorage,\n\t\t\tids.map((id, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tkind: \"benchmark.fork\",\n\t\t\t\t\tdata: { depth, index },\n\t\t\t\t},\n\t\t\t})),\n\t\t\tBACKGROUND_CONTEXT,\n\t\t);\n\t\tparentConversationId = conversationId;\n\t\tparentAt = ids.at(-1)!;\n\t\tdeepestConversationId = conversationId;\n\t}\n\n\tif (exactDocumentId === undefined) throw new Error(\"Benchmark scale must create documents\");\n\treturn {\n\t\tfirstEntryId,\n\t\tfilteredTaskCount: Math.min(50, Math.ceil(scale.taskCount / 60)),\n\t\texactDocumentId,\n\t\texactDocumentKey: `key-${scale.documentCount - 1}`,\n\t\treplayDocumentIds: Object.fromEntries(replayEntries.map(({ tail, id }) => [tail, id])) as Record<\n\t\t\t(typeof REPLAY_TAILS)[number],\n\t\t\tDocumentId\n\t\t>,\n\t\thistoricalDocumentId,\n\t\tancientAt,\n\t\trecentAt,\n\t\tdeepestConversationId,\n\t\tancestorHeadEntryId: firstEntryId,\n\t};\n}\n\nexport type StorageReadBenchmark = {\n\treadonly name: string;\n\trun(storage: Storage, dataset: StorageBenchmarkDataset): Promise<number>;\n\texpected(dataset: StorageBenchmarkDataset): number;\n};\n\nexport const STORAGE_READ_BENCHMARKS: readonly StorageReadBenchmark[] = [\n\t{\n\t\tname: \"exact entry lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.entry(dataset.firstEntryId, BACKGROUND_CONTEXT))?.entry.id ?? -1;\n\t\t},\n\t\texpected: ({ firstEntryId }) => firstEntryId,\n\t},\n\t{\n\t\tname: \"entry page scan (100)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries({ conversationId: ROOT_CONVERSATION_ID }, 100, undefined, BACKGROUND_CONTEXT)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"filtered task scan (50)\",\n\t\tasync run(storage) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanTasks(\n\t\t\t\t\t{ kind: \"benchmark.filtered\", status: \"pending\", background: true },\n\t\t\t\t\t50,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: ({ filteredTaskCount }) => filteredTaskCount,\n\t},\n\t{\n\t\tname: \"exact document address among many\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"benchmark.family\", key: dataset.exactDocumentKey, scope: { kind: \"session\" } },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t)\n\t\t\t\t)?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ exactDocumentId }) => exactDocumentId,\n\t},\n\t...REPLAY_TAILS.map(\n\t\t(tail): StorageReadBenchmark => ({\n\t\t\tname: `document replay tail (${tail})`,\n\t\t\tasync run(storage, dataset) {\n\t\t\t\treturn Number(\n\t\t\t\t\t(await storage.document(dataset.replayDocumentIds[tail], \"current\", BACKGROUND_CONTEXT))?.value.count,\n\t\t\t\t);\n\t\t\t},\n\t\t\texpected: () => tail,\n\t\t}),\n\t),\n\t{\n\t\tname: \"ancient historical read before newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.ancientAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH,\n\t},\n\t{\n\t\tname: \"recent historical read after newer base\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn Number(\n\t\t\t\t(await storage.document(dataset.historicalDocumentId, dataset.recentAt, BACKGROUND_CONTEXT))?.value.count,\n\t\t\t);\n\t\t},\n\t\texpected: () => HISTORY_SEGMENT_LENGTH * 2,\n\t},\n\t{\n\t\tname: \"fork-depth history scan (100)\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t{ conversationId: dataset.deepestConversationId },\n\t\t\t\t\t100,\n\t\t\t\t\tundefined,\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t)\n\t\t\t).items.length;\n\t\t},\n\t\texpected: () => 100,\n\t},\n\t{\n\t\tname: \"fork-depth head lookup\",\n\t\tasync run(storage, dataset) {\n\t\t\treturn (\n\t\t\t\t(await storage.findLatestHeadMarker(dataset.deepestConversationId, undefined, BACKGROUND_CONTEXT))?.id ?? -1\n\t\t\t);\n\t\t},\n\t\texpected: ({ ancestorHeadEntryId }) => ancestorHeadEntryId,\n\t},\n];\n\nexport type StorageWriteBenchmark = {\n\treadonly name: string;\n\treadonly expected: number;\n\trun(storage: Storage): Promise<number>;\n};\n\n/** Seed the common state expected by every write benchmark sample. */\nexport async function seedStorageWriteBenchmark(storage: Storage): Promise<void> {\n\tawait commitWrites(storage, [{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], BACKGROUND_CONTEXT);\n\tawait commitWrites(\n\t\tstorage,\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: 100 }, async (_, index) => ({\n\t\t\t\ttype: \"entry\" as const,\n\t\t\t\tvalue: {\n\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\tkind: \"benchmark.baseline\",\n\t\t\t\t\tdata: { index },\n\t\t\t\t},\n\t\t\t})),\n\t\t),\n\t\tBACKGROUND_CONTEXT,\n\t);\n}\n\nexport const STORAGE_WRITE_BENCHMARKS: readonly StorageWriteBenchmark[] = [\n\t{\n\t\tname: \"commit one entry\",\n\t\texpected: 1,\n\t\tasync run(storage) {\n\t\t\tconst id = await storage.mintId<EntryId>();\n\t\t\tawait commitWrites(\n\t\t\t\tstorage,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\treturn 1;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit 100 entries\",\n\t\texpected: 100,\n\t\tasync run(storage) {\n\t\t\tconst writes = await Promise.all(\n\t\t\t\tArray.from(\n\t\t\t\t\t{ length: 100 },\n\t\t\t\t\tasync (_, index): Promise<StorageWrite> => ({\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: await storage.mintId<EntryId>(),\n\t\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\t\tkind: \"benchmark.write\",\n\t\t\t\t\t\t\tdata: { index, text: \"x\".repeat(128) },\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit mixed entry/task/submission/document\",\n\t\texpected: 4,\n\t\tasync run(storage) {\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst documentId = await storage.mintId<DocumentId>();\n\t\t\tconst writes: readonly StorageWrite[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\tvalue: { id: entryId, conversationId: ROOT_CONVERSATION_ID, kind: \"benchmark.mixed\" },\n\t\t\t\t},\n\t\t\t\t{ type: \"task\", value: task(taskId, taskId) },\n\t\t\t\t{\n\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tid: submissionId,\n\t\t\t\t\t\tconversationId: ROOT_CONVERSATION_ID,\n\t\t\t\t\t\trequestId: `benchmark-${submissionId}`,\n\t\t\t\t\t\ttype: \"write\",\n\t\t\t\t\t\tstatus: \"done\",\n\t\t\t\t\t\tentry: entryId,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\trecord: { id: documentId, kind: \"benchmark.mixed\", key: String(documentId), scope: { kind: \"session\" } },\n\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { entryId, taskId } },\n\t\t\t\t},\n\t\t\t];\n\t\t\tawait commitWrites(storage, writes, BACKGROUND_CONTEXT);\n\t\t\treturn writes.length;\n\t\t},\n\t},\n];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-conformance.d.ts","sourceRoot":"","sources":["../../src/testing/storage-conformance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage-conformance.d.ts","sourceRoot":"","sources":["../../src/testing/storage-conformance.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAgC,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAsGlH,8GAA8G;AAC9G,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,SAAS,sBAAsB,EAAE,CAk7D9G"}
|