{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../../src/harness/session/testing/benchmark/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA0B,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE7E,OAAO,EAA8B,KAAK,uBAAuB,EAA2B,MAAM,eAAe,CAAC;AA2BlH,iGAAiG;AACjG,wBAAiB,wCAAwC,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAQ9G;AAED,uDAAuD;AACvD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5G;AAED,sEAAsE;AACtE,UAAU,4BAA4B;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAAC;IACzD,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzE;AAED,8EAA8E;AAC9E,UAAU,6BAA6B;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvC;AAuBD,iFAAiF;AACjF,eAAO,MAAM,gCAAgC,EAAE,SAAS,4BAA4B,EA6BnF,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,iCAAiC,EAAE,SAAS,6BAA6B,EAyBrF,CAAC","sourcesContent":["import { BACKGROUND_CONTEXT } from \"../../../context.ts\";\nimport { insertEntry, insertUsage } from \"../../commit.ts\";\nimport type { MessageEntry, NewEntry, Storage, Write } from \"../../types.ts\";\nimport { branchTip, setValue } from \"../../values.ts\";\nimport { STORAGE_BENCHMARK_DATASETS, type StorageBenchmarkDataset, storageBenchmarkEntryId } from \"./datasets.ts\";\n\nconst MESSAGE_TIMESTAMP = 1_650_000_000_000;\nconst SEED_BATCH_SIZE = 250;\nconst WRITE_BASELINE_DATASET = STORAGE_BENCHMARK_DATASETS[0]!;\n\nfunction createEntry(index: number, payloadBytes: number): NewEntry<MessageEntry> {\n\tconst id = storageBenchmarkEntryId(index);\n\tconst prefix = `${id}:`;\n\treturn {\n\t\tid,\n\t\tparentId: index === 0 ? null : storageBenchmarkEntryId(index - 1),\n\t\ttype: \"message\",\n\t\tmessage: {\n\t\t\trole: \"user\",\n\t\t\tcontent: [{ type: \"text\", text: prefix + \"x\".repeat(Math.max(0, payloadBytes - prefix.length)) }],\n\t\t\ttimestamp: MESSAGE_TIMESTAMP,\n\t\t},\n\t};\n}\n\nfunction createStorageBenchmarkTransaction(startIndex: number, entryCount: number, payloadBytes: number): Write[] {\n\treturn Array.from({ length: entryCount }, (_, offset) =>\n\t\tinsertEntry(createEntry(startIndex + offset, payloadBytes)),\n\t);\n}\n\n/** Generates deterministic seed transactions without claiming a production data distribution. */\nexport function* generateStorageBenchmarkSeedTransactions(dataset: StorageBenchmarkDataset): Generator<Write[]> {\n\tfor (let startIndex = 0; startIndex < dataset.entryCount; startIndex += SEED_BATCH_SIZE) {\n\t\tyield createStorageBenchmarkTransaction(\n\t\t\tstartIndex,\n\t\t\tMath.min(SEED_BATCH_SIZE, dataset.entryCount - startIndex),\n\t\t\tdataset.payloadBytes,\n\t\t);\n\t}\n}\n\n/** Seeds one deterministic synthetic linear branch. */\nexport async function seedStorageBenchmark(storage: Storage, dataset: StorageBenchmarkDataset): Promise<void> {\n\tfor (const transaction of generateStorageBenchmarkSeedTransactions(dataset))\n\t\tawait storage.commit(transaction, BACKGROUND_CONTEXT);\n}\n\n/** A steady-state read operation run against a pre-seeded fixture. */\ninterface StorageReadBenchmarkScenario {\n\treadonly name: string;\n\texpectedResult(dataset: StorageBenchmarkDataset): number;\n\trun(storage: Storage, dataset: StorageBenchmarkDataset): Promise<number>;\n}\n\n/** A write operation run once against each independently prepared fixture. */\ninterface StorageWriteBenchmarkScenario {\n\treadonly name: string;\n\treadonly writeCount: number;\n\tprepare?(storage: Storage): Promise<void>;\n\trun(storage: Storage): Promise<number>;\n}\n\nconst singleEntryTransaction = createStorageBenchmarkTransaction(0, 1, 256);\nconst hundredEntryTransaction = createStorageBenchmarkTransaction(0, 100, 256);\nconst appendedEntryId = storageBenchmarkEntryId(WRITE_BASELINE_DATASET.entryCount);\nconst mixedAppendTransaction: Write[] = [\n\t...createStorageBenchmarkTransaction(WRITE_BASELINE_DATASET.entryCount, 1, WRITE_BASELINE_DATASET.payloadBytes),\n\tsetValue(branchTip(\"main\"), appendedEntryId),\n\tinsertUsage({\n\t\tid: \"benchmark-usage\",\n\t\tentryId: appendedEntryId,\n\t\tadjustment: false,\n\t\tusage: {\n\t\t\tinput: 1_000,\n\t\t\toutput: 250,\n\t\t\tcacheRead: 500,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 1_250,\n\t\t\tcost: { input: 0.001, output: 0.001, cacheRead: 0.0001, cacheWrite: 0, total: 0.0021 },\n\t\t},\n\t}),\n];\n\n/** Shared read scenarios. Returning a number ensures each result is consumed. */\nexport const STORAGE_READ_BENCHMARK_SCENARIOS: readonly StorageReadBenchmarkScenario[] = [\n\t{\n\t\tname: \"get 100 distributed entries\",\n\t\texpectedResult(dataset) {\n\t\t\treturn dataset.lookupIds.length;\n\t\t},\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.getEntries([...dataset.lookupIds], BACKGROUND_CONTEXT)).size;\n\t\t},\n\t},\n\t{\n\t\tname: \"scan latest 50 entries\",\n\t\texpectedResult(dataset) {\n\t\t\treturn Math.min(50, dataset.entryCount);\n\t\t},\n\t\tasync run(storage) {\n\t\t\treturn (await storage.scanEntries({ order: \"desc\", limit: 50 }, BACKGROUND_CONTEXT)).length;\n\t\t},\n\t},\n\t{\n\t\tname: \"scan full branch structure\",\n\t\texpectedResult(dataset) {\n\t\t\treturn dataset.entryCount;\n\t\t},\n\t\tasync run(storage, dataset) {\n\t\t\treturn (await storage.scanBranchStructure({ start: dataset.tipId, order: \"newestFirst\" }, BACKGROUND_CONTEXT))\n\t\t\t\t.length;\n\t\t},\n\t},\n];\n\n/** Shared writes. Every invocation receives equivalent pre-benchmark state. */\nexport const STORAGE_WRITE_BENCHMARK_SCENARIOS: readonly StorageWriteBenchmarkScenario[] = [\n\t{\n\t\tname: \"commit one message entry\",\n\t\twriteCount: 1,\n\t\tasync run(storage) {\n\t\t\treturn (await storage.commit(singleEntryTransaction, BACKGROUND_CONTEXT)).seqs.length;\n\t\t},\n\t},\n\t{\n\t\tname: \"commit 100 message entries\",\n\t\twriteCount: 100,\n\t\tasync run(storage) {\n\t\t\treturn (await storage.commit(hundredEntryTransaction, BACKGROUND_CONTEXT)).seqs.length;\n\t\t},\n\t},\n\t{\n\t\tname: `commit mixed append (${WRITE_BASELINE_DATASET.name})`,\n\t\twriteCount: 3,\n\t\tprepare(storage) {\n\t\t\treturn seedStorageBenchmark(storage, WRITE_BASELINE_DATASET);\n\t\t},\n\t\tasync run(storage) {\n\t\t\treturn (await storage.commit(mixedAppendTransaction, BACKGROUND_CONTEXT)).seqs.length;\n\t\t},\n\t},\n];\n"]}