@code-yeongyu/senpi-agent-core 2026.8.13 → 2026.8.16
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/dist/harness/env/nodejs.d.ts +25 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -1
- package/dist/harness/env/nodejs.js +77 -12
- package/dist/harness/env/nodejs.js.map +1 -1
- package/dist/harness/events.d.ts +43 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +67 -0
- package/dist/harness/events.js.map +1 -0
- package/dist/harness/session/jsonl/codec.d.ts +4 -2
- package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/dist/harness/session/jsonl/codec.js +127 -88
- package/dist/harness/session/jsonl/codec.js.map +1 -1
- package/dist/harness/session/jsonl/errors.d.ts +5 -1
- package/dist/harness/session/jsonl/errors.d.ts.map +1 -1
- package/dist/harness/session/jsonl/errors.js +9 -2
- package/dist/harness/session/jsonl/errors.js.map +1 -1
- package/dist/harness/session/jsonl/repo.d.ts +12 -3
- package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/dist/harness/session/jsonl/repo.js +88 -45
- package/dist/harness/session/jsonl/repo.js.map +1 -1
- package/dist/harness/session/jsonl/storage.d.ts +1 -1
- package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/dist/harness/session/jsonl/storage.js +28 -19
- package/dist/harness/session/jsonl/storage.js.map +1 -1
- package/dist/harness/session/jsonl/types.d.ts +1 -1
- package/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/dist/harness/session/jsonl/types.js.map +1 -1
- package/dist/harness/session/memory.d.ts +1 -1
- package/dist/harness/session/memory.d.ts.map +1 -1
- package/dist/harness/session/memory.js.map +1 -1
- package/dist/harness/session/session.d.ts +6 -1
- package/dist/harness/session/session.d.ts.map +1 -1
- package/dist/harness/session/session.js +7 -2
- package/dist/harness/session/session.js.map +1 -1
- package/dist/harness/session/state.d.ts +1 -1
- package/dist/harness/session/state.d.ts.map +1 -1
- package/dist/harness/session/state.js.map +1 -1
- package/dist/harness/session/testing/conformance.d.ts.map +1 -1
- package/dist/harness/session/testing/conformance.js +19 -0
- package/dist/harness/session/testing/conformance.js.map +1 -1
- package/dist/harness/session/types.d.ts +18 -5
- package/dist/harness/session/types.d.ts.map +1 -1
- package/dist/harness/session/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +4 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js.map +1 -1
- package/dist/search/index.d.ts +21 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +2 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/scanning.d.ts +29 -0
- package/dist/search/scanning.d.ts.map +1 -0
- package/dist/search/scanning.js +103 -0
- package/dist/search/scanning.js.map +1 -0
- package/package.json +3 -3
- package/dist/harness/session/search.d.ts +0 -19
- package/dist/harness/session/search.d.ts.map +0 -1
- package/dist/harness/session/search.js +0 -41
- package/dist/harness/session/search.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EACX,YAAY,EACZ,KAAK,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAO,EACP,UAAU,EACV,SAAS,EACT,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,MAAM,YAAY,CAAC;AAqBpB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA0D3D;AAED,qBAAa,OAAO,CAAC,SAAS,SAAS,eAAe,GAAG,eAAe,CAAE,YAAW,WAAW;IAC/F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAEtB,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAO;IAKrF,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAIvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAmBzB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAInC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAIhD,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAIjC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAItC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -165,6 +165,7 @@ export class Session {
|
|
|
165
165
|
async getLog(options) {
|
|
166
166
|
return this.queryLog(options);
|
|
167
167
|
}
|
|
168
|
+
/** Returns the lane's current leaf, or null when empty. Throws when the lane does not exist. */
|
|
168
169
|
async getLeafIdForLane(lane) {
|
|
169
170
|
const pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);
|
|
170
171
|
if (!pointer)
|
|
@@ -176,10 +177,14 @@ export class Session {
|
|
|
176
177
|
assertValidCursor(query.cursor?.afterSeq);
|
|
177
178
|
return this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });
|
|
178
179
|
}
|
|
179
|
-
|
|
180
|
+
/**
|
|
181
|
+
* Queries from `query.start` toward the root, defaulting to the lane's current leaf.
|
|
182
|
+
* `resultLimit` lets single-entry queries cap results without changing the caller's query.
|
|
183
|
+
*/
|
|
184
|
+
async queryBranchEntries(defaultLane, query = {}, resultLimit = query.limit) {
|
|
180
185
|
assertValidLimit(query.limit);
|
|
181
186
|
assertValidCursor(query.cursor?.afterSeq);
|
|
182
|
-
const start = query.start ?? (await this.getLeafIdForLane(
|
|
187
|
+
const start = query.start ?? (await this.getLeafIdForLane(defaultLane));
|
|
183
188
|
if (start === null)
|
|
184
189
|
return [];
|
|
185
190
|
const storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { uuidv7 } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../../types.ts\";\nimport type {\n\tBranchBounds,\n\tEntry,\n\tEntryQuery,\n\tIdGenerator,\n\tLanePointer,\n\tLaneRecord,\n\tLogItem,\n\tLogOptions,\n\tNewRecord,\n\tOperationStartedRecord,\n\tProvisionedEntry,\n\tRecordBase,\n\tRecordQuery,\n\tSessionMetadata,\n\tSessionStats,\n\tSessionStorage,\n\tSessionTree,\n} from \"./types.ts\";\nimport { SessionError } from \"./types.ts\";\n\ntype JsonValidationFrame = { value: unknown } | { exit: object };\n\nfunction invalidPayload(reason: string): never {\n\tthrow new SessionError(\"invalid_payload\", `Durable payload ${reason}`);\n}\n\nfunction assertValidLimit(limit: number | undefined): void {\n\tif (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"limit must be a positive integer\");\n\t}\n}\n\nfunction assertValidCursor(afterSeq: number | undefined): void {\n\tif (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"cursor sequence must be a non-negative integer\");\n\t}\n}\n\nexport function assertJsonSerializable(value: unknown): void {\n\tconst active = new WeakSet<object>();\n\tconst stack: JsonValidationFrame[] = [{ value }];\n\twhile (stack.length > 0) {\n\t\tconst frame = stack.pop()!;\n\t\tif (\"exit\" in frame) {\n\t\t\tactive.delete(frame.exit);\n\t\t\tcontinue;\n\t\t}\n\t\tconst candidate = frame.value;\n\t\tif (candidate === null || typeof candidate === \"string\" || typeof candidate === \"boolean\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof candidate === \"number\") {\n\t\t\tif (!Number.isFinite(candidate)) invalidPayload(\"contains a non-finite number\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof candidate !== \"object\") invalidPayload(`contains ${typeof candidate}`);\n\t\tif (active.has(candidate)) invalidPayload(\"contains a cycle\");\n\t\tactive.add(candidate);\n\t\tstack.push({ exit: candidate });\n\n\t\tif (Array.isArray(candidate)) {\n\t\t\tif (Object.getPrototypeOf(candidate) !== Array.prototype) {\n\t\t\t\tinvalidPayload(\"contains a non-standard array\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.getOwnPropertySymbols(candidate).length > 0 ||\n\t\t\t\tObject.getOwnPropertyNames(candidate).length !== candidate.length + 1\n\t\t\t) {\n\t\t\t\tinvalidPayload(\"contains an array with unsupported properties\");\n\t\t\t}\n\t\t\tfor (let index = candidate.length - 1; index >= 0; index--) {\n\t\t\t\tif (!Object.hasOwn(candidate, index)) invalidPayload(\"contains a sparse array\");\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(candidate, index)!;\n\t\t\t\tif (!(\"value\" in descriptor)) invalidPayload(\"contains an array accessor\");\n\t\t\t\tstack.push({ value: descriptor.value });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst prototype = Object.getPrototypeOf(candidate);\n\t\tif (prototype !== Object.prototype && prototype !== null) {\n\t\t\tinvalidPayload(\"contains a non-plain object\");\n\t\t}\n\t\tif (Object.getOwnPropertySymbols(candidate).length > 0) {\n\t\t\tinvalidPayload(\"contains a symbol-keyed property\");\n\t\t}\n\t\tconst keys = Object.keys(candidate);\n\t\tif (Object.getOwnPropertyNames(candidate).length !== keys.length) {\n\t\t\tinvalidPayload(\"contains a non-enumerable property\");\n\t\t}\n\t\tfor (let index = keys.length - 1; index >= 0; index--) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(candidate, keys[index]!)!;\n\t\t\tif (!(\"value\" in descriptor)) invalidPayload(\"contains an accessor\");\n\t\t\tstack.push({ value: descriptor.value });\n\t\t}\n\t}\n}\n\nexport class Session<TMetadata extends SessionMetadata = SessionMetadata> implements SessionTree {\n\tprivate readonly storage: SessionStorage<TMetadata>;\n\treadonly idGenerator: IdGenerator;\n\n\tconstructor(storage: SessionStorage<TMetadata>, options: { idGenerator?: IdGenerator } = {}) {\n\t\tthis.storage = storage;\n\t\tthis.idGenerator = options.idGenerator ?? { next: () => uuidv7() };\n\t}\n\n\tasync getMetadata(): Promise<TMetadata> {\n\t\treturn this.storage.getMetadata();\n\t}\n\n\tview(lane: string): SessionTree {\n\t\tif (lane === \"main\") return this;\n\t\treturn {\n\t\t\tgetLeafId: () => this.getLeafIdForLane(lane),\n\t\t\tgetEntry: (id) => this.getEntry(id),\n\t\t\tgetStats: () => this.getStats(),\n\t\t\tgetName: () => this.getName(),\n\t\t\tsetName: (name) => this.setName(name),\n\t\t\tgetLabel: (targetId) => this.getLabel(targetId),\n\t\t\tsetLabel: (targetId, label) => this.setLabel(targetId, label),\n\t\t\tfindEntries: (query) => this.queryEntries(query),\n\t\t\tfindEntry: async (query = {}) => (await this.queryEntries(query, 1))[0],\n\t\t\tfindEntriesOnBranch: (query) => this.queryBranchEntries(lane, query),\n\t\t\tfindEntryOnBranch: async (query = {}) => (await this.queryBranchEntries(lane, query, 1))[0],\n\t\t\tappendMessage: (message) => this.appendMessageToLane(lane, message),\n\t\t\tappendCustomEntry: (customType, data) => this.appendCustomEntryToLane(lane, customType, data),\n\t\t};\n\t}\n\n\tasync getLeafId(): Promise<string | null> {\n\t\treturn this.getLeafIdForLane(\"main\");\n\t}\n\n\tasync getEntry(id: string): Promise<Entry | undefined> {\n\t\treturn this.storage.getEntry(id);\n\t}\n\n\tasync getStats(): Promise<SessionStats> {\n\t\treturn this.storage.getStats();\n\t}\n\n\tasync getName(): Promise<string | undefined> {\n\t\treturn this.storage.getName();\n\t}\n\n\tasync setName(name: string): Promise<void> {\n\t\tawait this.storage.setName(name);\n\t}\n\n\tasync getLabel(targetId: string): Promise<string | undefined> {\n\t\treturn this.storage.getLabel(targetId);\n\t}\n\n\tasync setLabel(targetId: string, label: string | undefined): Promise<void> {\n\t\tawait this.storage.setLabel(targetId, label);\n\t}\n\n\tasync findEntries(query?: EntryQuery): Promise<Entry[]> {\n\t\treturn this.queryEntries(query);\n\t}\n\n\tasync findEntry(query: EntryQuery = {}): Promise<Entry | undefined> {\n\t\treturn (await this.queryEntries(query, 1))[0];\n\t}\n\n\tasync findEntriesOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry[]> {\n\t\treturn this.queryBranchEntries(\"main\", query);\n\t}\n\n\tasync findEntryOnBranch(query: EntryQuery & BranchBounds = {}): Promise<Entry | undefined> {\n\t\treturn (await this.queryBranchEntries(\"main\", query, 1))[0];\n\t}\n\n\tasync appendMessage(message: AgentMessage): Promise<string> {\n\t\treturn this.appendMessageToLane(\"main\", message);\n\t}\n\n\tasync appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n\t\treturn this.appendCustomEntryToLane(\"main\", customType, data);\n\t}\n\n\tasync getLanes(): Promise<LanePointer[]> {\n\t\treturn this.storage.getLanes();\n\t}\n\n\tasync createLane(lane: string, at: string | null): Promise<void> {\n\t\tawait this.storage.createLane(lane, at);\n\t}\n\n\tasync moveLane(lane: string, to: string | null): Promise<void> {\n\t\tawait this.storage.moveLane(lane, to);\n\t}\n\n\tasync appendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\treturn this.commitEntry(entry, lane);\n\t}\n\n\tasync appendRecord<TNewRecord extends NewRecord>(\n\t\trecord: TNewRecord,\n\t): Promise<TNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">>;\n\tasync appendRecord(record: NewRecord): Promise<LaneRecord> {\n\t\treturn this.commitRecord(record);\n\t}\n\n\tasync findRecords<K extends LaneRecord[\"type\"]>(\n\t\tquery: RecordQuery & { type: K },\n\t): Promise<Extract<LaneRecord, { type: K }>[]>;\n\tasync findRecords(query?: RecordQuery): Promise<LaneRecord[]>;\n\tasync findRecords(query?: RecordQuery): Promise<LaneRecord[]> {\n\t\treturn this.queryRecords(query);\n\t}\n\n\tasync findOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]> {\n\t\tassertValidLimit(options?.limit);\n\t\treturn this.storage.findOpenOperations(lane, options);\n\t}\n\n\tasync getLog(options?: LogOptions): Promise<LogItem[]> {\n\t\treturn this.queryLog(options);\n\t}\n\n\tprivate async getLeafIdForLane(lane: string): Promise<string | null> {\n\t\tconst pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);\n\t\tif (!pointer) throw new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\treturn pointer.leafId;\n\t}\n\n\tprivate async queryEntries(query: EntryQuery = {}, resultLimit = query.limit): Promise<Entry[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\treturn this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });\n\t}\n\n\tprivate async queryBranchEntries(\n\t\tlane: string,\n\t\tquery: EntryQuery & BranchBounds = {},\n\t\tresultLimit = query.limit,\n\t): Promise<Entry[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst start = query.start ?? (await this.getLeafIdForLane(lane));\n\t\tif (start === null) return [];\n\t\tconst storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };\n\t\treturn this.storage.findEntriesOnBranch({ ...storageQuery, start });\n\t}\n\n\tprivate async queryRecords(query: RecordQuery = {}): Promise<LaneRecord[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.afterSeq);\n\t\tif (query.operationKind !== undefined && query.type !== \"operation_started\") {\n\t\t\tthrow new SessionError(\"invalid_query\", 'operationKind requires type \"operation_started\"');\n\t\t}\n\t\treturn this.storage.findRecords(query);\n\t}\n\n\tprivate async queryLog(options: LogOptions = {}): Promise<LogItem[]> {\n\t\tassertValidLimit(options.limit);\n\t\tassertValidCursor(options.afterSeq);\n\t\treturn this.storage.getLog(options);\n\t}\n\n\tprivate async appendMessageToLane(lane: string, message: AgentMessage): Promise<string> {\n\t\tconst entry = await this.commitEntry({ type: \"message\", id: this.idGenerator.next(), message }, lane);\n\t\treturn entry.id;\n\t}\n\n\tprivate async appendCustomEntryToLane(lane: string, customType: string, data?: unknown): Promise<string> {\n\t\tconst entry = await this.commitEntry(\n\t\t\tdata === undefined\n\t\t\t\t? { type: \"custom\", id: this.idGenerator.next(), customType }\n\t\t\t\t: { type: \"custom\", id: this.idGenerator.next(), customType, data },\n\t\t\tlane,\n\t\t);\n\t\treturn entry.id;\n\t}\n\n\tprivate async commitEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\tassertJsonSerializable(entry);\n\t\treturn this.storage.appendEntry(entry, lane);\n\t}\n\n\tprivate async commitRecord<TNewRecord extends NewRecord>(\n\t\trecord: TNewRecord,\n\t): Promise<TNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">> {\n\t\tassertJsonSerializable(record);\n\t\treturn this.storage.appendRecord<LaneRecord>(record) as unknown as Promise<\n\t\t\tTNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">\n\t\t>;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { uuidv7 } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../../types.ts\";\nimport type {\n\tBranchBounds,\n\tEntry,\n\tEntryQuery,\n\tIdGenerator,\n\tLanePointer,\n\tLaneRecord,\n\tLogItem,\n\tLogOptions,\n\tNewRecord,\n\tOperationStartedRecord,\n\tProvisionedEntry,\n\tRecordBase,\n\tRecordQuery,\n\tSessionMetadata,\n\tSessionStats,\n\tSessionStorage,\n\tSessionTree,\n} from \"./types.ts\";\nimport { SessionError } from \"./types.ts\";\n\ntype JsonValidationFrame = { value: unknown } | { exit: object };\n\nfunction invalidPayload(reason: string): never {\n\tthrow new SessionError(\"invalid_payload\", `Durable payload ${reason}`);\n}\n\nfunction assertValidLimit(limit: number | undefined): void {\n\tif (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"limit must be a positive integer\");\n\t}\n}\n\nfunction assertValidCursor(afterSeq: number | undefined): void {\n\tif (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"cursor sequence must be a non-negative integer\");\n\t}\n}\n\nexport function assertJsonSerializable(value: unknown): void {\n\tconst active = new WeakSet<object>();\n\tconst stack: JsonValidationFrame[] = [{ value }];\n\twhile (stack.length > 0) {\n\t\tconst frame = stack.pop()!;\n\t\tif (\"exit\" in frame) {\n\t\t\tactive.delete(frame.exit);\n\t\t\tcontinue;\n\t\t}\n\t\tconst candidate = frame.value;\n\t\tif (candidate === null || typeof candidate === \"string\" || typeof candidate === \"boolean\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof candidate === \"number\") {\n\t\t\tif (!Number.isFinite(candidate)) invalidPayload(\"contains a non-finite number\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof candidate !== \"object\") invalidPayload(`contains ${typeof candidate}`);\n\t\tif (active.has(candidate)) invalidPayload(\"contains a cycle\");\n\t\tactive.add(candidate);\n\t\tstack.push({ exit: candidate });\n\n\t\tif (Array.isArray(candidate)) {\n\t\t\tif (Object.getPrototypeOf(candidate) !== Array.prototype) {\n\t\t\t\tinvalidPayload(\"contains a non-standard array\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tObject.getOwnPropertySymbols(candidate).length > 0 ||\n\t\t\t\tObject.getOwnPropertyNames(candidate).length !== candidate.length + 1\n\t\t\t) {\n\t\t\t\tinvalidPayload(\"contains an array with unsupported properties\");\n\t\t\t}\n\t\t\tfor (let index = candidate.length - 1; index >= 0; index--) {\n\t\t\t\tif (!Object.hasOwn(candidate, index)) invalidPayload(\"contains a sparse array\");\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(candidate, index)!;\n\t\t\t\tif (!(\"value\" in descriptor)) invalidPayload(\"contains an array accessor\");\n\t\t\t\tstack.push({ value: descriptor.value });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst prototype = Object.getPrototypeOf(candidate);\n\t\tif (prototype !== Object.prototype && prototype !== null) {\n\t\t\tinvalidPayload(\"contains a non-plain object\");\n\t\t}\n\t\tif (Object.getOwnPropertySymbols(candidate).length > 0) {\n\t\t\tinvalidPayload(\"contains a symbol-keyed property\");\n\t\t}\n\t\tconst keys = Object.keys(candidate);\n\t\tif (Object.getOwnPropertyNames(candidate).length !== keys.length) {\n\t\t\tinvalidPayload(\"contains a non-enumerable property\");\n\t\t}\n\t\tfor (let index = keys.length - 1; index >= 0; index--) {\n\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(candidate, keys[index]!)!;\n\t\t\tif (!(\"value\" in descriptor)) invalidPayload(\"contains an accessor\");\n\t\t\tstack.push({ value: descriptor.value });\n\t\t}\n\t}\n}\n\nexport class Session<TMetadata extends SessionMetadata = SessionMetadata> implements SessionTree {\n\tprivate readonly storage: SessionStorage<TMetadata>;\n\treadonly idGenerator: IdGenerator;\n\n\tconstructor(storage: SessionStorage<TMetadata>, options: { idGenerator?: IdGenerator } = {}) {\n\t\tthis.storage = storage;\n\t\tthis.idGenerator = options.idGenerator ?? { next: () => uuidv7() };\n\t}\n\n\tasync getMetadata(): Promise<TMetadata> {\n\t\treturn this.storage.getMetadata();\n\t}\n\n\tview(lane: string): SessionTree {\n\t\tif (lane === \"main\") return this;\n\t\treturn {\n\t\t\tgetLeafId: () => this.getLeafIdForLane(lane),\n\t\t\tgetEntry: (id) => this.getEntry(id),\n\t\t\tgetStats: () => this.getStats(),\n\t\t\tgetName: () => this.getName(),\n\t\t\tsetName: (name) => this.setName(name),\n\t\t\tgetLabel: (targetId) => this.getLabel(targetId),\n\t\t\tsetLabel: (targetId, label) => this.setLabel(targetId, label),\n\t\t\tfindEntries: (query) => this.queryEntries(query),\n\t\t\tfindEntry: async (query = {}) => (await this.queryEntries(query, 1))[0],\n\t\t\tfindEntriesOnBranch: (query) => this.queryBranchEntries(lane, query),\n\t\t\tfindEntryOnBranch: async (query = {}) => (await this.queryBranchEntries(lane, query, 1))[0],\n\t\t\tappendMessage: (message) => this.appendMessageToLane(lane, message),\n\t\t\tappendCustomEntry: (customType, data) => this.appendCustomEntryToLane(lane, customType, data),\n\t\t};\n\t}\n\n\tasync getLeafId(): Promise<string | null> {\n\t\treturn this.getLeafIdForLane(\"main\");\n\t}\n\n\tasync getEntry(id: string): Promise<Entry | undefined> {\n\t\treturn this.storage.getEntry(id);\n\t}\n\n\tasync getStats(): Promise<SessionStats> {\n\t\treturn this.storage.getStats();\n\t}\n\n\tasync getName(): Promise<string | undefined> {\n\t\treturn this.storage.getName();\n\t}\n\n\tasync setName(name: string | undefined): Promise<void> {\n\t\tawait this.storage.setName(name);\n\t}\n\n\tasync getLabel(targetId: string): Promise<string | undefined> {\n\t\treturn this.storage.getLabel(targetId);\n\t}\n\n\tasync setLabel(targetId: string, label: string | undefined): Promise<void> {\n\t\tawait this.storage.setLabel(targetId, label);\n\t}\n\n\tasync findEntries(query?: EntryQuery): Promise<Entry[]> {\n\t\treturn this.queryEntries(query);\n\t}\n\n\tasync findEntry(query: EntryQuery = {}): Promise<Entry | undefined> {\n\t\treturn (await this.queryEntries(query, 1))[0];\n\t}\n\n\tasync findEntriesOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry[]> {\n\t\treturn this.queryBranchEntries(\"main\", query);\n\t}\n\n\tasync findEntryOnBranch(query: EntryQuery & BranchBounds = {}): Promise<Entry | undefined> {\n\t\treturn (await this.queryBranchEntries(\"main\", query, 1))[0];\n\t}\n\n\tasync appendMessage(message: AgentMessage): Promise<string> {\n\t\treturn this.appendMessageToLane(\"main\", message);\n\t}\n\n\tasync appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n\t\treturn this.appendCustomEntryToLane(\"main\", customType, data);\n\t}\n\n\tasync getLanes(): Promise<LanePointer[]> {\n\t\treturn this.storage.getLanes();\n\t}\n\n\tasync createLane(lane: string, at: string | null): Promise<void> {\n\t\tawait this.storage.createLane(lane, at);\n\t}\n\n\tasync moveLane(lane: string, to: string | null): Promise<void> {\n\t\tawait this.storage.moveLane(lane, to);\n\t}\n\n\tasync appendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\treturn this.commitEntry(entry, lane);\n\t}\n\n\tasync appendRecord<TNewRecord extends NewRecord>(\n\t\trecord: TNewRecord,\n\t): Promise<TNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">>;\n\tasync appendRecord(record: NewRecord): Promise<LaneRecord> {\n\t\treturn this.commitRecord(record);\n\t}\n\n\tasync findRecords<K extends LaneRecord[\"type\"]>(\n\t\tquery: RecordQuery & { type: K },\n\t): Promise<Extract<LaneRecord, { type: K }>[]>;\n\tasync findRecords(query?: RecordQuery): Promise<LaneRecord[]>;\n\tasync findRecords(query?: RecordQuery): Promise<LaneRecord[]> {\n\t\treturn this.queryRecords(query);\n\t}\n\n\tasync findOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]> {\n\t\tassertValidLimit(options?.limit);\n\t\treturn this.storage.findOpenOperations(lane, options);\n\t}\n\n\tasync getLog(options?: LogOptions): Promise<LogItem[]> {\n\t\treturn this.queryLog(options);\n\t}\n\n\t/** Returns the lane's current leaf, or null when empty. Throws when the lane does not exist. */\n\tprivate async getLeafIdForLane(lane: string): Promise<string | null> {\n\t\tconst pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);\n\t\tif (!pointer) throw new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\treturn pointer.leafId;\n\t}\n\n\tprivate async queryEntries(query: EntryQuery = {}, resultLimit = query.limit): Promise<Entry[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\treturn this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });\n\t}\n\n\t/**\n\t * Queries from `query.start` toward the root, defaulting to the lane's current leaf.\n\t * `resultLimit` lets single-entry queries cap results without changing the caller's query.\n\t */\n\tprivate async queryBranchEntries(\n\t\tdefaultLane: string,\n\t\tquery: EntryQuery & BranchBounds = {},\n\t\tresultLimit = query.limit,\n\t): Promise<Entry[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst start = query.start ?? (await this.getLeafIdForLane(defaultLane));\n\t\tif (start === null) return [];\n\t\tconst storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };\n\t\treturn this.storage.findEntriesOnBranch({ ...storageQuery, start });\n\t}\n\n\tprivate async queryRecords(query: RecordQuery = {}): Promise<LaneRecord[]> {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.afterSeq);\n\t\tif (query.operationKind !== undefined && query.type !== \"operation_started\") {\n\t\t\tthrow new SessionError(\"invalid_query\", 'operationKind requires type \"operation_started\"');\n\t\t}\n\t\treturn this.storage.findRecords(query);\n\t}\n\n\tprivate async queryLog(options: LogOptions = {}): Promise<LogItem[]> {\n\t\tassertValidLimit(options.limit);\n\t\tassertValidCursor(options.afterSeq);\n\t\treturn this.storage.getLog(options);\n\t}\n\n\tprivate async appendMessageToLane(lane: string, message: AgentMessage): Promise<string> {\n\t\tconst entry = await this.commitEntry({ type: \"message\", id: this.idGenerator.next(), message }, lane);\n\t\treturn entry.id;\n\t}\n\n\tprivate async appendCustomEntryToLane(lane: string, customType: string, data?: unknown): Promise<string> {\n\t\tconst entry = await this.commitEntry(\n\t\t\tdata === undefined\n\t\t\t\t? { type: \"custom\", id: this.idGenerator.next(), customType }\n\t\t\t\t: { type: \"custom\", id: this.idGenerator.next(), customType, data },\n\t\t\tlane,\n\t\t);\n\t\treturn entry.id;\n\t}\n\n\tprivate async commitEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry> {\n\t\tassertJsonSerializable(entry);\n\t\treturn this.storage.appendEntry(entry, lane);\n\t}\n\n\tprivate async commitRecord<TNewRecord extends NewRecord>(\n\t\trecord: TNewRecord,\n\t): Promise<TNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">> {\n\t\tassertJsonSerializable(record);\n\t\treturn this.storage.appendRecord<LaneRecord>(record) as unknown as Promise<\n\t\t\tTNewRecord & Pick<RecordBase, \"seq\" | \"timestamp\">\n\t\t>;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/harness/session/state.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,KAAK,EAEV,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAEhB,KAAK,YAAY,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,eAAe,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/harness/session/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/harness/session/state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype BranchBounds,\n\ttype Entry,\n\ttype EntryOrder,\n\ttype EntryQuery,\n\ttype ForkOptions,\n\ttype LanePointer,\n\ttype LaneRecord,\n\ttype LogItem,\n\ttype LogOptions,\n\ttype OperationStartedRecord,\n\ttype RecordQuery,\n\tSessionError,\n\ttype SessionStats,\n} from \"./types.ts\";\n\nexport type SessionMutation =\n\t| { kind: \"entry\"; lane?: string; entry: Entry }\n\t| { kind: \"record\"; record: LaneRecord }\n\t| { kind: \"lane\"; seq: number; lane: string; leafId: string | null }\n\t| { kind: \"fact\"; seq: number; fact: \"name\"; name: string }\n\t| { kind: \"fact\"; seq: number; fact: \"label\"; targetId: string; label: string | undefined };\n\ntype InvalidMutation = (message: string) => never;\n\nfunction invalidMutation(message: string): never {\n\tthrow new SessionError(\"invalid_entry\", `Invalid session mutation: ${message}`);\n}\n\nfunction assertValidLimit(limit: number | undefined): void {\n\tif (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"limit must be a positive integer\");\n\t}\n}\n\nfunction assertValidCursor(afterSeq: number | undefined): void {\n\tif (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"cursor sequence must be a non-negative integer\");\n\t}\n}\n\nfunction* ordered<T>(items: readonly T[], order: EntryOrder | undefined): IterableIterator<T> {\n\tif (order === \"oldestFirst\") {\n\t\tyield* items;\n\t\treturn;\n\t}\n\tfor (let index = items.length - 1; index >= 0; index--) yield items[index]!;\n}\n\nexport class SessionState {\n\tprivate sequence = 0;\n\tprivate readonly usedIds = new Set<string>();\n\tprivate readonly entries: Entry[] = [];\n\tprivate readonly entriesById = new Map<string, Entry>();\n\tprivate readonly records: LaneRecord[] = [];\n\tprivate readonly openOperationsByLane = new Map<string, Map<string, OperationStartedRecord>>();\n\tprivate readonly lanes = new Map<string, string | null>([[\"main\", null]]);\n\tprivate readonly log: LogItem[] = [];\n\tprivate readonly stats: SessionStats = {\n\t\tmessageCount: 0,\n\t\tcachedTokens: 0,\n\t\tuncachedTokens: 0,\n\t\ttotalTokens: 0,\n\t\tcostTotal: 0,\n\t};\n\tprivate name: string | undefined;\n\tprivate readonly labels = new Map<string, string>();\n\n\tget nextSequence(): number {\n\t\treturn this.sequence + 1;\n\t}\n\n\tgetLanes(): LanePointer[] {\n\t\treturn [...this.lanes].map(([lane, leafId]) => ({ lane, leafId }));\n\t}\n\n\trequireLane(lane: string): string | null {\n\t\tconst leafId = this.lanes.get(lane);\n\t\tif (leafId === undefined) throw new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\treturn leafId;\n\t}\n\n\tvalidateNewLane(lane: string): void {\n\t\tif (this.lanes.has(lane)) throw new SessionError(\"already_exists\", `Lane already exists: ${lane}`);\n\t}\n\n\tvalidateTarget(targetId: string | null): void {\n\t\tif (targetId !== null && !this.entriesById.has(targetId)) {\n\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${targetId}`);\n\t\t}\n\t}\n\n\tvalidateUnusedId(id: string): void {\n\t\tif (this.usedIds.has(id)) throw new SessionError(\"already_exists\", `Session id already exists: ${id}`);\n\t}\n\n\tapplyMutation(mutation: SessionMutation, invalid: InvalidMutation = invalidMutation): void {\n\t\tconst seq =\n\t\t\tmutation.kind === \"entry\"\n\t\t\t\t? mutation.entry.seq\n\t\t\t\t: mutation.kind === \"record\"\n\t\t\t\t\t? mutation.record.seq\n\t\t\t\t\t: mutation.seq;\n\t\tif (seq !== this.sequence + 1) invalid(`has non-consecutive seq ${seq}`);\n\n\t\tswitch (mutation.kind) {\n\t\t\tcase \"entry\": {\n\t\t\t\tif (this.usedIds.has(mutation.entry.id)) invalid(`contains duplicate id ${mutation.entry.id}`);\n\t\t\t\tif (mutation.lane !== undefined) {\n\t\t\t\t\tconst leafId = this.lanes.get(mutation.lane);\n\t\t\t\t\tif (leafId === undefined) invalid(`references missing lane ${mutation.lane}`);\n\t\t\t\t\tif (mutation.entry.parentId !== leafId) invalid(\"does not chain to the lane leaf\");\n\t\t\t\t}\n\t\t\t\tif (mutation.entry.parentId !== null && !this.entriesById.has(mutation.entry.parentId)) {\n\t\t\t\t\tinvalid(`references missing parent ${mutation.entry.parentId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.usedIds.add(mutation.entry.id);\n\t\t\t\tthis.entries.push(mutation.entry);\n\t\t\t\tthis.entriesById.set(mutation.entry.id, mutation.entry);\n\t\t\t\tif (mutation.lane !== undefined) this.lanes.set(mutation.lane, mutation.entry.id);\n\t\t\t\tthis.log.push({ kind: \"entry\", seq, entry: mutation.entry });\n\t\t\t\tif (mutation.entry.type === \"message\") this.stats.messageCount += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"record\": {\n\t\t\t\tif (!this.lanes.has(mutation.record.lane)) invalid(`references missing lane ${mutation.record.lane}`);\n\t\t\t\tif (this.usedIds.has(mutation.record.id)) invalid(`contains duplicate id ${mutation.record.id}`);\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.usedIds.add(mutation.record.id);\n\t\t\t\tthis.records.push(mutation.record);\n\t\t\t\tif (mutation.record.type === \"operation_started\") {\n\t\t\t\t\tlet openOperations = this.openOperationsByLane.get(mutation.record.lane);\n\t\t\t\t\tif (!openOperations) {\n\t\t\t\t\t\topenOperations = new Map();\n\t\t\t\t\t\tthis.openOperationsByLane.set(mutation.record.lane, openOperations);\n\t\t\t\t\t}\n\t\t\t\t\topenOperations.set(mutation.record.id, mutation.record);\n\t\t\t\t} else if (mutation.record.type === \"operation_finished\") {\n\t\t\t\t\tthis.openOperationsByLane.get(mutation.record.lane)?.delete(mutation.record.runId);\n\t\t\t\t}\n\t\t\t\tthis.log.push({ kind: \"record\", seq, record: mutation.record });\n\t\t\t\tif (mutation.record.type === \"usage\") {\n\t\t\t\t\tthis.stats.cachedTokens += mutation.record.usage.cacheRead;\n\t\t\t\t\tthis.stats.uncachedTokens += mutation.record.usage.input + mutation.record.usage.cacheWrite;\n\t\t\t\t\tthis.stats.totalTokens += mutation.record.usage.totalTokens;\n\t\t\t\t\tthis.stats.costTotal += mutation.record.usage.cost.total;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"lane\":\n\t\t\t\tif (mutation.leafId !== null && !this.entriesById.has(mutation.leafId)) {\n\t\t\t\t\tinvalid(`references missing lane target ${mutation.leafId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.lanes.set(mutation.lane, mutation.leafId);\n\t\t\t\tthis.log.push({ kind: \"lane\", seq, lane: mutation.lane, leafId: mutation.leafId });\n\t\t\t\tbreak;\n\t\t\tcase \"fact\":\n\t\t\t\tif (mutation.fact === \"label\" && !this.entriesById.has(mutation.targetId)) {\n\t\t\t\t\tinvalid(`references missing label target ${mutation.targetId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tif (mutation.fact === \"name\") {\n\t\t\t\t\tthis.name = mutation.name;\n\t\t\t\t\tthis.log.push({ kind: \"fact\", seq, fact: \"name\", name: mutation.name });\n\t\t\t\t} else {\n\t\t\t\t\tif (mutation.label === undefined) this.labels.delete(mutation.targetId);\n\t\t\t\t\telse this.labels.set(mutation.targetId, mutation.label);\n\t\t\t\t\tthis.log.push({\n\t\t\t\t\t\tkind: \"fact\",\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tfact: \"label\",\n\t\t\t\t\t\ttargetId: mutation.targetId,\n\t\t\t\t\t\tlabel: mutation.label,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tgetEntry(id: string): Entry | undefined {\n\t\treturn this.entriesById.get(id);\n\t}\n\n\tfindEntries(query: EntryQuery = {}): Entry[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst results: Entry[] = [];\n\t\tfor (const entry of ordered(this.entries, query.order)) {\n\t\t\tif (!this.matchesEntryQuery(entry, query)) continue;\n\t\t\tresults.push(entry);\n\t\t\tif (results.length === query.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Entry[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst results: Entry[] = [];\n\t\tif (query.order === \"oldestFirst\") {\n\t\t\tfor (const entry of [...this.walkToRoot(query.start)].reverse()) {\n\t\t\t\tconst reachedBound = entry.id === query.stopAtId || entry.type === query.stopAtType;\n\t\t\t\tif (this.matchesEntryQuery(entry, query)) results.push(entry);\n\t\t\t\tif (reachedBound || results.length === query.limit) break;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const entry of this.walkToRoot(query.start, query)) {\n\t\t\t\tif (this.matchesEntryQuery(entry, query)) results.push(entry);\n\t\t\t\tif (results.length === query.limit) break;\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindRecords(query: RecordQuery = {}): LaneRecord[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.afterSeq);\n\t\tconst results: LaneRecord[] = [];\n\t\tfor (const record of ordered(this.records, query.order)) {\n\t\t\tif (!this.matchesRecordQuery(record, query)) continue;\n\t\t\tresults.push(record);\n\t\t\tif (results.length === query.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindOpenOperations(lane: string, options?: { limit?: number }): OperationStartedRecord[] {\n\t\tassertValidLimit(options?.limit);\n\t\tconst openOperationsById = this.openOperationsByLane.get(lane);\n\t\tconst openOperations = openOperationsById ? [...openOperationsById.values()].reverse() : [];\n\t\treturn options?.limit === undefined ? openOperations : openOperations.slice(0, options.limit);\n\t}\n\n\tgetLog(options: LogOptions = {}): LogItem[] {\n\t\tassertValidLimit(options.limit);\n\t\tassertValidCursor(options.afterSeq);\n\t\tconst results: LogItem[] = [];\n\t\tfor (const item of this.log) {\n\t\t\tif (options.afterSeq !== undefined && item.seq <= options.afterSeq) continue;\n\t\t\tresults.push(item);\n\t\t\tif (results.length === options.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tgetName(): string | undefined {\n\t\treturn this.name;\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labels.get(id);\n\t}\n\n\tgetStats(): SessionStats {\n\t\treturn this.stats;\n\t}\n\n\tcreateForkMutations(options: ForkOptions): SessionMutation[] {\n\t\tlet copiedEntries: Entry[];\n\t\tlet forkLanes: LanePointer[];\n\t\tif (options.scope === \"tree\") {\n\t\t\tcopiedEntries = this.findEntries({ order: \"oldestFirst\" });\n\t\t\tforkLanes = this.getLanes();\n\t\t} else {\n\t\t\tconst selectedEntryId = options.entryId ?? this.requireLane(\"main\");\n\t\t\tlet targetId: string | null = null;\n\t\t\tif (selectedEntryId !== null) {\n\t\t\t\tconst entry = this.getEntry(selectedEntryId);\n\t\t\t\tif (entry?.type !== \"message\") {\n\t\t\t\t\tthrow new SessionError(\"invalid_fork_target\", `Fork target is not a message entry: ${selectedEntryId}`);\n\t\t\t\t}\n\t\t\t\tconst position = options.position ?? (options.entryId === undefined ? \"at\" : \"before\");\n\t\t\t\ttargetId = position === \"at\" ? entry.id : entry.parentId;\n\t\t\t}\n\t\t\tcopiedEntries = targetId === null ? [] : this.findEntriesOnBranch({ start: targetId, order: \"oldestFirst\" });\n\t\t\tforkLanes = [{ lane: \"main\", leafId: targetId }];\n\t\t}\n\n\t\tconst mutations: SessionMutation[] = [];\n\t\tlet sequence = 1;\n\t\tfor (const sourceEntry of copiedEntries) {\n\t\t\tmutations.push({ kind: \"entry\", entry: { ...structuredClone(sourceEntry), seq: sequence++ } });\n\t\t}\n\t\tfor (const pointer of forkLanes) {\n\t\t\tmutations.push({ kind: \"lane\", seq: sequence++, lane: pointer.lane, leafId: pointer.leafId });\n\t\t}\n\t\tif (this.name !== undefined) {\n\t\t\tmutations.push({ kind: \"fact\", seq: sequence++, fact: \"name\", name: this.name });\n\t\t}\n\t\tfor (const entry of copiedEntries) {\n\t\t\tconst label = this.labels.get(entry.id);\n\t\t\tif (label !== undefined) {\n\t\t\t\tmutations.push({ kind: \"fact\", seq: sequence++, fact: \"label\", targetId: entry.id, label });\n\t\t\t}\n\t\t}\n\t\treturn mutations;\n\t}\n\n\tprivate *walkToRoot(\n\t\tstart: string | null,\n\t\tbounds?: Pick<BranchBounds, \"stopAtId\" | \"stopAtType\">,\n\t): IterableIterator<Entry> {\n\t\tif (start === null) return;\n\t\tconst visited = new Set<string>();\n\t\tlet current = this.entriesById.get(start);\n\t\tif (!current) throw new SessionError(\"not_found\", `Entry not found: ${start}`);\n\t\twhile (current) {\n\t\t\tif (visited.has(current.id)) {\n\t\t\t\tthrow new SessionError(\"invalid_entry\", `Session branch contains a cycle at ${current.id}`);\n\t\t\t}\n\t\t\tvisited.add(current.id);\n\t\t\tyield current;\n\t\t\tif (current.id === bounds?.stopAtId || current.type === bounds?.stopAtType || current.parentId === null) break;\n\t\t\tconst parentId: string = current.parentId;\n\t\t\tcurrent = this.entriesById.get(parentId);\n\t\t\tif (!current) throw new SessionError(\"invalid_entry\", `Entry not found: ${parentId}`);\n\t\t}\n\t}\n\n\tprivate matchesEntryQuery(entry: Entry, query: EntryQuery): boolean {\n\t\treturn (\n\t\t\t(query.type === undefined || entry.type === query.type) &&\n\t\t\t(query.customType === undefined || (entry.type === \"custom\" && entry.customType === query.customType)) &&\n\t\t\t(query.cursor === undefined ||\n\t\t\t\t(query.order === \"oldestFirst\" ? entry.seq > query.cursor.afterSeq : entry.seq < query.cursor.afterSeq))\n\t\t);\n\t}\n\n\tprivate matchesRecordQuery(record: LaneRecord, query: RecordQuery): boolean {\n\t\treturn (\n\t\t\t(query.lane === undefined || record.lane === query.lane) &&\n\t\t\t(query.type === undefined || record.type === query.type) &&\n\t\t\t(query.runId === undefined ||\n\t\t\t\t(record.type === \"operation_started\"\n\t\t\t\t\t? record.id === query.runId\n\t\t\t\t\t: \"runId\" in record && record.runId === query.runId)) &&\n\t\t\t(query.operationKind === undefined ||\n\t\t\t\t(record.type === \"operation_started\" && record.intent.kind === query.operationKind)) &&\n\t\t\t(query.afterSeq === undefined || record.seq > query.afterSeq)\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/harness/session/state.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype BranchBounds,\n\ttype Entry,\n\ttype EntryOrder,\n\ttype EntryQuery,\n\ttype ForkOptions,\n\ttype LanePointer,\n\ttype LaneRecord,\n\ttype LogItem,\n\ttype LogOptions,\n\ttype OperationStartedRecord,\n\ttype RecordQuery,\n\tSessionError,\n\ttype SessionStats,\n} from \"./types.ts\";\n\nexport type SessionMutation =\n\t| { kind: \"entry\"; lane?: string; entry: Entry }\n\t| { kind: \"record\"; record: LaneRecord }\n\t| { kind: \"lane\"; seq: number; lane: string; leafId: string | null }\n\t| { kind: \"fact\"; seq: number; fact: \"name\"; name: string | undefined }\n\t| { kind: \"fact\"; seq: number; fact: \"label\"; targetId: string; label: string | undefined };\n\ntype InvalidMutation = (message: string) => never;\n\nfunction invalidMutation(message: string): never {\n\tthrow new SessionError(\"invalid_entry\", `Invalid session mutation: ${message}`);\n}\n\nfunction assertValidLimit(limit: number | undefined): void {\n\tif (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"limit must be a positive integer\");\n\t}\n}\n\nfunction assertValidCursor(afterSeq: number | undefined): void {\n\tif (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n\t\tthrow new SessionError(\"invalid_query\", \"cursor sequence must be a non-negative integer\");\n\t}\n}\n\nfunction* ordered<T>(items: readonly T[], order: EntryOrder | undefined): IterableIterator<T> {\n\tif (order === \"oldestFirst\") {\n\t\tyield* items;\n\t\treturn;\n\t}\n\tfor (let index = items.length - 1; index >= 0; index--) yield items[index]!;\n}\n\nexport class SessionState {\n\tprivate sequence = 0;\n\tprivate readonly usedIds = new Set<string>();\n\tprivate readonly entries: Entry[] = [];\n\tprivate readonly entriesById = new Map<string, Entry>();\n\tprivate readonly records: LaneRecord[] = [];\n\tprivate readonly openOperationsByLane = new Map<string, Map<string, OperationStartedRecord>>();\n\tprivate readonly lanes = new Map<string, string | null>([[\"main\", null]]);\n\tprivate readonly log: LogItem[] = [];\n\tprivate readonly stats: SessionStats = {\n\t\tmessageCount: 0,\n\t\tcachedTokens: 0,\n\t\tuncachedTokens: 0,\n\t\ttotalTokens: 0,\n\t\tcostTotal: 0,\n\t};\n\tprivate name: string | undefined;\n\tprivate readonly labels = new Map<string, string>();\n\n\tget nextSequence(): number {\n\t\treturn this.sequence + 1;\n\t}\n\n\tgetLanes(): LanePointer[] {\n\t\treturn [...this.lanes].map(([lane, leafId]) => ({ lane, leafId }));\n\t}\n\n\trequireLane(lane: string): string | null {\n\t\tconst leafId = this.lanes.get(lane);\n\t\tif (leafId === undefined) throw new SessionError(\"invalid_lane\", `Lane not found: ${lane}`);\n\t\treturn leafId;\n\t}\n\n\tvalidateNewLane(lane: string): void {\n\t\tif (this.lanes.has(lane)) throw new SessionError(\"already_exists\", `Lane already exists: ${lane}`);\n\t}\n\n\tvalidateTarget(targetId: string | null): void {\n\t\tif (targetId !== null && !this.entriesById.has(targetId)) {\n\t\t\tthrow new SessionError(\"not_found\", `Entry not found: ${targetId}`);\n\t\t}\n\t}\n\n\tvalidateUnusedId(id: string): void {\n\t\tif (this.usedIds.has(id)) throw new SessionError(\"already_exists\", `Session id already exists: ${id}`);\n\t}\n\n\tapplyMutation(mutation: SessionMutation, invalid: InvalidMutation = invalidMutation): void {\n\t\tconst seq =\n\t\t\tmutation.kind === \"entry\"\n\t\t\t\t? mutation.entry.seq\n\t\t\t\t: mutation.kind === \"record\"\n\t\t\t\t\t? mutation.record.seq\n\t\t\t\t\t: mutation.seq;\n\t\tif (seq !== this.sequence + 1) invalid(`has non-consecutive seq ${seq}`);\n\n\t\tswitch (mutation.kind) {\n\t\t\tcase \"entry\": {\n\t\t\t\tif (this.usedIds.has(mutation.entry.id)) invalid(`contains duplicate id ${mutation.entry.id}`);\n\t\t\t\tif (mutation.lane !== undefined) {\n\t\t\t\t\tconst leafId = this.lanes.get(mutation.lane);\n\t\t\t\t\tif (leafId === undefined) invalid(`references missing lane ${mutation.lane}`);\n\t\t\t\t\tif (mutation.entry.parentId !== leafId) invalid(\"does not chain to the lane leaf\");\n\t\t\t\t}\n\t\t\t\tif (mutation.entry.parentId !== null && !this.entriesById.has(mutation.entry.parentId)) {\n\t\t\t\t\tinvalid(`references missing parent ${mutation.entry.parentId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.usedIds.add(mutation.entry.id);\n\t\t\t\tthis.entries.push(mutation.entry);\n\t\t\t\tthis.entriesById.set(mutation.entry.id, mutation.entry);\n\t\t\t\tif (mutation.lane !== undefined) this.lanes.set(mutation.lane, mutation.entry.id);\n\t\t\t\tthis.log.push({ kind: \"entry\", seq, entry: mutation.entry });\n\t\t\t\tif (mutation.entry.type === \"message\") this.stats.messageCount += 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"record\": {\n\t\t\t\tif (!this.lanes.has(mutation.record.lane)) invalid(`references missing lane ${mutation.record.lane}`);\n\t\t\t\tif (this.usedIds.has(mutation.record.id)) invalid(`contains duplicate id ${mutation.record.id}`);\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.usedIds.add(mutation.record.id);\n\t\t\t\tthis.records.push(mutation.record);\n\t\t\t\tif (mutation.record.type === \"operation_started\") {\n\t\t\t\t\tlet openOperations = this.openOperationsByLane.get(mutation.record.lane);\n\t\t\t\t\tif (!openOperations) {\n\t\t\t\t\t\topenOperations = new Map();\n\t\t\t\t\t\tthis.openOperationsByLane.set(mutation.record.lane, openOperations);\n\t\t\t\t\t}\n\t\t\t\t\topenOperations.set(mutation.record.id, mutation.record);\n\t\t\t\t} else if (mutation.record.type === \"operation_finished\") {\n\t\t\t\t\tthis.openOperationsByLane.get(mutation.record.lane)?.delete(mutation.record.runId);\n\t\t\t\t}\n\t\t\t\tthis.log.push({ kind: \"record\", seq, record: mutation.record });\n\t\t\t\tif (mutation.record.type === \"usage\") {\n\t\t\t\t\tthis.stats.cachedTokens += mutation.record.usage.cacheRead;\n\t\t\t\t\tthis.stats.uncachedTokens += mutation.record.usage.input + mutation.record.usage.cacheWrite;\n\t\t\t\t\tthis.stats.totalTokens += mutation.record.usage.totalTokens;\n\t\t\t\t\tthis.stats.costTotal += mutation.record.usage.cost.total;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"lane\":\n\t\t\t\tif (mutation.leafId !== null && !this.entriesById.has(mutation.leafId)) {\n\t\t\t\t\tinvalid(`references missing lane target ${mutation.leafId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tthis.lanes.set(mutation.lane, mutation.leafId);\n\t\t\t\tthis.log.push({ kind: \"lane\", seq, lane: mutation.lane, leafId: mutation.leafId });\n\t\t\t\tbreak;\n\t\t\tcase \"fact\":\n\t\t\t\tif (mutation.fact === \"label\" && !this.entriesById.has(mutation.targetId)) {\n\t\t\t\t\tinvalid(`references missing label target ${mutation.targetId}`);\n\t\t\t\t}\n\t\t\t\tthis.sequence = seq;\n\t\t\t\tif (mutation.fact === \"name\") {\n\t\t\t\t\tthis.name = mutation.name;\n\t\t\t\t\tthis.log.push({ kind: \"fact\", seq, fact: \"name\", name: mutation.name });\n\t\t\t\t} else {\n\t\t\t\t\tif (mutation.label === undefined) this.labels.delete(mutation.targetId);\n\t\t\t\t\telse this.labels.set(mutation.targetId, mutation.label);\n\t\t\t\t\tthis.log.push({\n\t\t\t\t\t\tkind: \"fact\",\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tfact: \"label\",\n\t\t\t\t\t\ttargetId: mutation.targetId,\n\t\t\t\t\t\tlabel: mutation.label,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tgetEntry(id: string): Entry | undefined {\n\t\treturn this.entriesById.get(id);\n\t}\n\n\tfindEntries(query: EntryQuery = {}): Entry[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst results: Entry[] = [];\n\t\tfor (const entry of ordered(this.entries, query.order)) {\n\t\t\tif (!this.matchesEntryQuery(entry, query)) continue;\n\t\t\tresults.push(entry);\n\t\t\tif (results.length === query.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Entry[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.cursor?.afterSeq);\n\t\tconst results: Entry[] = [];\n\t\tif (query.order === \"oldestFirst\") {\n\t\t\tfor (const entry of [...this.walkToRoot(query.start)].reverse()) {\n\t\t\t\tconst reachedBound = entry.id === query.stopAtId || entry.type === query.stopAtType;\n\t\t\t\tif (this.matchesEntryQuery(entry, query)) results.push(entry);\n\t\t\t\tif (reachedBound || results.length === query.limit) break;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const entry of this.walkToRoot(query.start, query)) {\n\t\t\t\tif (this.matchesEntryQuery(entry, query)) results.push(entry);\n\t\t\t\tif (results.length === query.limit) break;\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindRecords(query: RecordQuery = {}): LaneRecord[] {\n\t\tassertValidLimit(query.limit);\n\t\tassertValidCursor(query.afterSeq);\n\t\tconst results: LaneRecord[] = [];\n\t\tfor (const record of ordered(this.records, query.order)) {\n\t\t\tif (!this.matchesRecordQuery(record, query)) continue;\n\t\t\tresults.push(record);\n\t\t\tif (results.length === query.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tfindOpenOperations(lane: string, options?: { limit?: number }): OperationStartedRecord[] {\n\t\tassertValidLimit(options?.limit);\n\t\tconst openOperationsById = this.openOperationsByLane.get(lane);\n\t\tconst openOperations = openOperationsById ? [...openOperationsById.values()].reverse() : [];\n\t\treturn options?.limit === undefined ? openOperations : openOperations.slice(0, options.limit);\n\t}\n\n\tgetLog(options: LogOptions = {}): LogItem[] {\n\t\tassertValidLimit(options.limit);\n\t\tassertValidCursor(options.afterSeq);\n\t\tconst results: LogItem[] = [];\n\t\tfor (const item of this.log) {\n\t\t\tif (options.afterSeq !== undefined && item.seq <= options.afterSeq) continue;\n\t\t\tresults.push(item);\n\t\t\tif (results.length === options.limit) break;\n\t\t}\n\t\treturn results;\n\t}\n\n\tgetName(): string | undefined {\n\t\treturn this.name;\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labels.get(id);\n\t}\n\n\tgetStats(): SessionStats {\n\t\treturn this.stats;\n\t}\n\n\tcreateForkMutations(options: ForkOptions): SessionMutation[] {\n\t\tlet copiedEntries: Entry[];\n\t\tlet forkLanes: LanePointer[];\n\t\tif (options.scope === \"tree\") {\n\t\t\tcopiedEntries = this.findEntries({ order: \"oldestFirst\" });\n\t\t\tforkLanes = this.getLanes();\n\t\t} else {\n\t\t\tconst selectedEntryId = options.entryId ?? this.requireLane(\"main\");\n\t\t\tlet targetId: string | null = null;\n\t\t\tif (selectedEntryId !== null) {\n\t\t\t\tconst entry = this.getEntry(selectedEntryId);\n\t\t\t\tif (entry?.type !== \"message\") {\n\t\t\t\t\tthrow new SessionError(\"invalid_fork_target\", `Fork target is not a message entry: ${selectedEntryId}`);\n\t\t\t\t}\n\t\t\t\tconst position = options.position ?? (options.entryId === undefined ? \"at\" : \"before\");\n\t\t\t\ttargetId = position === \"at\" ? entry.id : entry.parentId;\n\t\t\t}\n\t\t\tcopiedEntries = targetId === null ? [] : this.findEntriesOnBranch({ start: targetId, order: \"oldestFirst\" });\n\t\t\tforkLanes = [{ lane: \"main\", leafId: targetId }];\n\t\t}\n\n\t\tconst mutations: SessionMutation[] = [];\n\t\tlet sequence = 1;\n\t\tfor (const sourceEntry of copiedEntries) {\n\t\t\tmutations.push({ kind: \"entry\", entry: { ...structuredClone(sourceEntry), seq: sequence++ } });\n\t\t}\n\t\tfor (const pointer of forkLanes) {\n\t\t\tmutations.push({ kind: \"lane\", seq: sequence++, lane: pointer.lane, leafId: pointer.leafId });\n\t\t}\n\t\tif (this.name !== undefined) {\n\t\t\tmutations.push({ kind: \"fact\", seq: sequence++, fact: \"name\", name: this.name });\n\t\t}\n\t\tfor (const entry of copiedEntries) {\n\t\t\tconst label = this.labels.get(entry.id);\n\t\t\tif (label !== undefined) {\n\t\t\t\tmutations.push({ kind: \"fact\", seq: sequence++, fact: \"label\", targetId: entry.id, label });\n\t\t\t}\n\t\t}\n\t\treturn mutations;\n\t}\n\n\tprivate *walkToRoot(\n\t\tstart: string | null,\n\t\tbounds?: Pick<BranchBounds, \"stopAtId\" | \"stopAtType\">,\n\t): IterableIterator<Entry> {\n\t\tif (start === null) return;\n\t\tconst visited = new Set<string>();\n\t\tlet current = this.entriesById.get(start);\n\t\tif (!current) throw new SessionError(\"not_found\", `Entry not found: ${start}`);\n\t\twhile (current) {\n\t\t\tif (visited.has(current.id)) {\n\t\t\t\tthrow new SessionError(\"invalid_entry\", `Session branch contains a cycle at ${current.id}`);\n\t\t\t}\n\t\t\tvisited.add(current.id);\n\t\t\tyield current;\n\t\t\tif (current.id === bounds?.stopAtId || current.type === bounds?.stopAtType || current.parentId === null) break;\n\t\t\tconst parentId: string = current.parentId;\n\t\t\tcurrent = this.entriesById.get(parentId);\n\t\t\tif (!current) throw new SessionError(\"invalid_entry\", `Entry not found: ${parentId}`);\n\t\t}\n\t}\n\n\tprivate matchesEntryQuery(entry: Entry, query: EntryQuery): boolean {\n\t\treturn (\n\t\t\t(query.type === undefined || entry.type === query.type) &&\n\t\t\t(query.customType === undefined || (entry.type === \"custom\" && entry.customType === query.customType)) &&\n\t\t\t(query.cursor === undefined ||\n\t\t\t\t(query.order === \"oldestFirst\" ? entry.seq > query.cursor.afterSeq : entry.seq < query.cursor.afterSeq))\n\t\t);\n\t}\n\n\tprivate matchesRecordQuery(record: LaneRecord, query: RecordQuery): boolean {\n\t\treturn (\n\t\t\t(query.lane === undefined || record.lane === query.lane) &&\n\t\t\t(query.type === undefined || record.type === query.type) &&\n\t\t\t(query.runId === undefined ||\n\t\t\t\t(record.type === \"operation_started\"\n\t\t\t\t\t? record.id === query.runId\n\t\t\t\t\t: \"runId\" in record && record.runId === query.runId)) &&\n\t\t\t(query.operationKind === undefined ||\n\t\t\t\t(record.type === \"operation_started\" && record.intent.kind === query.operationKind)) &&\n\t\t\t(query.afterSeq === undefined || record.seq > query.afterSeq)\n\t\t);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/conformance.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AA+E9F,qGAAqG;AACrG,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,4BAA4B,GACnC,SAAS,6BAA6B,EAAE,
|
|
1
|
+
{"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/conformance.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AA+E9F,qGAAqG;AACrG,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,4BAA4B,GACnC,SAAS,6BAA6B,EAAE,CA05B1C"}
|
|
@@ -477,6 +477,25 @@ export function createSessionBackendConformance(factory) {
|
|
|
477
477
|
costTotal: 9.5,
|
|
478
478
|
});
|
|
479
479
|
}),
|
|
480
|
+
createCase(factory, "queries and facts", "clears session names durably", async (repository) => {
|
|
481
|
+
const session = await repository.create({ id: "session" });
|
|
482
|
+
await session.setName("Temporary");
|
|
483
|
+
await session.setName(undefined);
|
|
484
|
+
strictEqual(await session.getName(), undefined);
|
|
485
|
+
deepStrictEqual(await session.getLog(), [
|
|
486
|
+
{ kind: "fact", seq: 1, fact: "name", name: "Temporary" },
|
|
487
|
+
{ kind: "fact", seq: 2, fact: "name", name: undefined },
|
|
488
|
+
]);
|
|
489
|
+
const metadata = await session.getMetadata();
|
|
490
|
+
const reopened = await repository.open(metadata);
|
|
491
|
+
strictEqual(await reopened.getName(), undefined);
|
|
492
|
+
deepStrictEqual(await reopened.getLog(), [
|
|
493
|
+
{ kind: "fact", seq: 1, fact: "name", name: "Temporary" },
|
|
494
|
+
{ kind: "fact", seq: 2, fact: "name", name: undefined },
|
|
495
|
+
]);
|
|
496
|
+
const fork = await repository.fork(metadata, { id: "fork" });
|
|
497
|
+
strictEqual(await fork.getName(), undefined);
|
|
498
|
+
}),
|
|
480
499
|
createCase(factory, "validation and immutability", "returns immutable copies from reads", async (repository) => {
|
|
481
500
|
const session = await repository.create({ id: "immutable" });
|
|
482
501
|
const metadata = await session.getMetadata();
|