@code-yeongyu/senpi-agent-core 2026.8.12 → 2026.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -7
- package/dist/agent-loop.js +5 -1
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent.d.ts +3 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +8 -0
- package/dist/agent.js.map +1 -1
- package/dist/harness/agent-harness.d.ts +452 -96
- package/dist/harness/agent-harness.d.ts.map +1 -1
- package/dist/harness/agent-harness.js +162 -1005
- package/dist/harness/agent-harness.js.map +1 -1
- package/dist/harness/compaction/branch-summarization.d.ts +13 -6
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/harness/compaction/branch-summarization.js +10 -14
- package/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/dist/harness/compaction/compaction.d.ts +14 -17
- package/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/dist/harness/compaction/compaction.js +23 -36
- package/dist/harness/compaction/compaction.js.map +1 -1
- package/dist/harness/env/nodejs.d.ts +1 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -1
- package/dist/harness/env/nodejs.js +23 -7
- package/dist/harness/env/nodejs.js.map +1 -1
- package/dist/harness/messages.d.ts +3 -3
- package/dist/harness/messages.d.ts.map +1 -1
- package/dist/harness/messages.js +3 -3
- package/dist/harness/messages.js.map +1 -1
- package/dist/harness/prompt-templates.d.ts.map +1 -1
- package/dist/harness/prompt-templates.js +4 -9
- package/dist/harness/prompt-templates.js.map +1 -1
- package/dist/harness/reducer.d.ts +100 -0
- package/dist/harness/reducer.d.ts.map +1 -0
- package/dist/harness/reducer.js +414 -0
- package/dist/harness/reducer.js.map +1 -0
- package/dist/harness/result.d.ts +40 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +41 -0
- package/dist/harness/result.js.map +1 -0
- package/dist/harness/session/context.d.ts +22 -0
- package/dist/harness/session/context.d.ts.map +1 -0
- package/dist/harness/session/context.js +67 -0
- package/dist/harness/session/context.js.map +1 -0
- package/dist/harness/session/index.d.ts +7 -0
- package/dist/harness/session/index.d.ts.map +1 -0
- package/dist/harness/session/index.js +6 -0
- package/dist/harness/session/index.js.map +1 -0
- package/dist/harness/session/jsonl/codec.d.ts +8 -0
- package/dist/harness/session/jsonl/codec.d.ts.map +1 -0
- package/dist/harness/session/jsonl/codec.js +190 -0
- package/dist/harness/session/jsonl/codec.js.map +1 -0
- package/dist/harness/session/jsonl/errors.d.ts +5 -0
- package/dist/harness/session/jsonl/errors.d.ts.map +1 -0
- package/dist/harness/session/jsonl/errors.js +11 -0
- package/dist/harness/session/jsonl/errors.js.map +1 -0
- package/dist/harness/session/jsonl/repo.d.ts +23 -0
- package/dist/harness/session/jsonl/repo.d.ts.map +1 -0
- package/dist/harness/session/jsonl/repo.js +129 -0
- package/dist/harness/session/jsonl/repo.js.map +1 -0
- package/dist/harness/session/jsonl/storage.d.ts +43 -0
- package/dist/harness/session/jsonl/storage.d.ts.map +1 -0
- package/dist/harness/session/jsonl/storage.js +206 -0
- package/dist/harness/session/jsonl/storage.js.map +1 -0
- package/dist/harness/session/jsonl/types.d.ts +38 -0
- package/dist/harness/session/jsonl/types.d.ts.map +1 -0
- package/dist/harness/session/jsonl/types.js +2 -0
- package/dist/harness/session/jsonl/types.js.map +1 -0
- package/dist/harness/session/jsonl.d.ts +3 -0
- package/dist/harness/session/jsonl.d.ts.map +1 -0
- package/dist/harness/session/jsonl.js +2 -0
- package/dist/harness/session/jsonl.js.map +1 -0
- package/dist/harness/session/memory.d.ts +44 -0
- package/dist/harness/session/memory.d.ts.map +1 -0
- package/dist/harness/session/memory.js +142 -0
- package/dist/harness/session/memory.js.map +1 -0
- package/dist/harness/session/search.d.ts +19 -0
- package/dist/harness/session/search.d.ts.map +1 -0
- package/dist/harness/session/search.js +41 -0
- package/dist/harness/session/search.js.map +1 -0
- package/dist/harness/session/session.d.ts +43 -38
- package/dist/harness/session/session.d.ts.map +1 -1
- package/dist/harness/session/session.js +186 -304
- package/dist/harness/session/session.js.map +1 -1
- package/dist/harness/session/state.d.ts +65 -0
- package/dist/harness/session/state.d.ts.map +1 -0
- package/dist/harness/session/state.js +320 -0
- package/dist/harness/session/state.js.map +1 -0
- package/dist/harness/session/testing/conformance.d.ts +4 -0
- package/dist/harness/session/testing/conformance.d.ts.map +1 -0
- package/dist/harness/session/testing/conformance.js +743 -0
- package/dist/harness/session/testing/conformance.js.map +1 -0
- package/dist/harness/session/testing/index.d.ts +3 -0
- package/dist/harness/session/testing/index.d.ts.map +1 -0
- package/dist/harness/session/testing/index.js +2 -0
- package/dist/harness/session/testing/index.js.map +1 -0
- package/dist/harness/session/testing/types.d.ts +14 -0
- package/dist/harness/session/testing/types.d.ts.map +1 -0
- package/dist/harness/session/testing/types.js +2 -0
- package/dist/harness/session/testing/types.js.map +1 -0
- package/dist/harness/session/types.d.ts +333 -0
- package/dist/harness/session/types.d.ts.map +1 -0
- package/dist/harness/session/types.js +9 -0
- package/dist/harness/session/types.js.map +1 -0
- package/dist/harness/skills.js +21 -19
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/telemetry.d.ts +1221 -0
- package/dist/harness/telemetry.d.ts.map +1 -0
- package/dist/harness/telemetry.js +508 -0
- package/dist/harness/telemetry.js.map +1 -0
- package/dist/harness/types.d.ts +8 -485
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js +4 -16
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/utils/truncate.js.map +1 -1
- package/dist/index.d.ts +10 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +1 -0
- package/dist/proxy.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -2
- package/dist/harness/session/array-session-reader.d.ts +0 -3
- package/dist/harness/session/array-session-reader.d.ts.map +0 -1
- package/dist/harness/session/array-session-reader.js +0 -70
- package/dist/harness/session/array-session-reader.js.map +0 -1
- package/dist/harness/session/fork.d.ts +0 -4
- package/dist/harness/session/fork.d.ts.map +0 -1
- package/dist/harness/session/fork.js +0 -22
- package/dist/harness/session/fork.js.map +0 -1
- package/dist/harness/session/jsonl-store.d.ts +0 -13
- package/dist/harness/session/jsonl-store.d.ts.map +0 -1
- package/dist/harness/session/jsonl-store.js +0 -304
- package/dist/harness/session/jsonl-store.js.map +0 -1
- package/dist/harness/session/keyed-operation-queue.d.ts +0 -17
- package/dist/harness/session/keyed-operation-queue.d.ts.map +0 -1
- package/dist/harness/session/keyed-operation-queue.js +0 -60
- package/dist/harness/session/keyed-operation-queue.js.map +0 -1
- package/dist/harness/session/memory-store.d.ts +0 -6
- package/dist/harness/session/memory-store.d.ts.map +0 -1
- package/dist/harness/session/memory-store.js +0 -107
- package/dist/harness/session/memory-store.js.map +0 -1
- package/dist/harness/session/repository.d.ts +0 -28
- package/dist/harness/session/repository.d.ts.map +0 -1
- package/dist/harness/session/repository.js +0 -61
- package/dist/harness/session/repository.js.map +0 -1
- package/dist/harness/session/search-backend.d.ts +0 -8
- package/dist/harness/session/search-backend.d.ts.map +0 -1
- package/dist/harness/session/search-backend.js +0 -22
- package/dist/harness/session/search-backend.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ImageContent, type TextContent, type Usage, uuidv7 } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../../types.ts\";\nimport { createBranchSummaryMessage, createCompactionSummaryMessage, createCustomMessage } from \"../messages.ts\";\nimport type {\n\tActiveToolsChangeEntry,\n\tBranchSummaryEntry,\n\tCompactionEntry,\n\tCustomEntry,\n\tCustomMessageEntry,\n\tLabelEntry,\n\tLeafEntry,\n\tMessageEntry,\n\tModelChangeEntry,\n\tSessionContext,\n\tSessionEntryCursorOptions,\n\tSessionInfoEntry,\n\tSessionMetadata,\n\tSessionReader,\n\tSessionStats,\n\tSessionStore,\n\tSessionTreeEntry,\n\tThinkingLevelChangeEntry,\n} from \"../types.ts\";\nimport { SessionError } from \"../types.ts\";\n\nexport type ContextEntryTransform = (entries: readonly SessionTreeEntry[]) => readonly SessionTreeEntry[];\n\nexport type CustomEntryContextMessageProjector = (\n\tentry: CustomEntry,\n\tindex: number,\n\tentries: readonly SessionTreeEntry[],\n) => readonly AgentMessage[] | undefined;\n\nexport interface SessionContextBuildOptions {\n\t/** Additional entry transforms applied after the default compaction transform. */\n\tentryTransforms?: readonly ContextEntryTransform[];\n\t/** Optional custom-entry projectors. Custom entries are omitted from model context by default. */\n\tentryProjectors?: Readonly<Record<string, CustomEntryContextMessageProjector>>;\n}\n\nfunction deriveSessionContextState(pathEntries: readonly SessionTreeEntry[]): Omit<SessionContext, \"messages\"> {\n\tlet thinkingLevel = \"off\";\n\tlet model: { provider: string; modelId: string } | null = null;\n\tlet activeToolNames: string[] | null = null;\n\n\tfor (const entry of pathEntries) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = { provider: entry.provider, modelId: entry.modelId };\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = { provider: entry.message.provider, modelId: entry.message.model };\n\t\t} else if (entry.type === \"active_tools_change\") {\n\t\t\tactiveToolNames = [...entry.activeToolNames];\n\t\t}\n\t}\n\n\treturn { thinkingLevel, model, activeToolNames };\n}\n\nexport function defaultContextEntryTransform(pathEntries: readonly SessionTreeEntry[]): SessionTreeEntry[] {\n\tlet compaction: CompactionEntry | null = null;\n\tfor (const entry of pathEntries) {\n\t\tif (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t}\n\t}\n\tif (!compaction) {\n\t\treturn [...pathEntries];\n\t}\n\n\tconst entries: SessionTreeEntry[] = [compaction];\n\tconst compactionIdx = pathEntries.findIndex((entry) => entry.type === \"compaction\" && entry.id === compaction.id);\n\tif (compaction.retainedTail) {\n\t\tfor (let i = compactionIdx + 1; i < pathEntries.length; i++) {\n\t\t\tentries.push(pathEntries[i]!);\n\t\t}\n\t\treturn entries;\n\t}\n\tif (compaction.firstKeptEntryId) {\n\t\tlet foundFirstKept = false;\n\t\tfor (let i = 0; i < compactionIdx; i++) {\n\t\t\tconst entry = pathEntries[i]!;\n\t\t\tif (entry.id === compaction.firstKeptEntryId) foundFirstKept = true;\n\t\t\tif (foundFirstKept) entries.push(entry);\n\t\t}\n\t}\n\tfor (let i = compactionIdx + 1; i < pathEntries.length; i++) {\n\t\tentries.push(pathEntries[i]!);\n\t}\n\treturn entries;\n}\n\nexport function buildContextEntries(\n\tpathEntries: readonly SessionTreeEntry[],\n\toptions: SessionContextBuildOptions = {},\n): SessionTreeEntry[] {\n\tlet entries = defaultContextEntryTransform(pathEntries);\n\tfor (const transform of options.entryTransforms ?? []) {\n\t\tentries = [...transform(entries)];\n\t}\n\treturn entries;\n}\n\nexport function sessionEntryToContextMessages(\n\tentry: SessionTreeEntry,\n\tindex: number,\n\tentries: readonly SessionTreeEntry[],\n\toptions: SessionContextBuildOptions = {},\n): AgentMessage[] {\n\tif (entry.type === \"message\") {\n\t\treturn [entry.message as AgentMessage];\n\t}\n\tif (entry.type === \"custom_message\") {\n\t\treturn [\n\t\t\tcreateCustomMessage(\n\t\t\t\tentry.customType,\n\t\t\t\tentry.content as string | (TextContent | ImageContent)[],\n\t\t\t\tentry.display,\n\t\t\t\tentry.details,\n\t\t\t\tentry.timestamp,\n\t\t\t),\n\t\t];\n\t}\n\tif (entry.type === \"compaction\") {\n\t\treturn [\n\t\t\tcreateCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n\t\t\t...(entry.retainedTail ?? []),\n\t\t];\n\t}\n\tif (entry.type === \"branch_summary\" && entry.summary) {\n\t\treturn [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];\n\t}\n\tif (entry.type === \"custom\") {\n\t\treturn [...(options.entryProjectors?.[entry.customType]?.(entry, index, entries) ?? [])];\n\t}\n\treturn [];\n}\n\nexport function buildSessionContext(\n\tpathEntries: readonly SessionTreeEntry[],\n\toptions: SessionContextBuildOptions = {},\n): SessionContext {\n\tconst state = deriveSessionContextState(pathEntries);\n\tconst contextEntries = buildContextEntries(pathEntries, options);\n\tconst messages = contextEntries.flatMap((entry, index) =>\n\t\tsessionEntryToContextMessages(entry, index, contextEntries, options),\n\t);\n\treturn { ...state, messages };\n}\n\nclass HydratedSessionState {\n\tprivate readonly entries: SessionTreeEntry[];\n\tprivate readonly labelsById = new Map<string, string>();\n\n\tconstructor(entries: readonly SessionTreeEntry[]) {\n\t\tthis.entries = [...entries];\n\t\tfor (const entry of this.entries) this.applyProjection(entry);\n\t}\n\n\tgetLabel(id: string): string | undefined {\n\t\treturn this.labelsById.get(id);\n\t}\n\n\tgetSessionName(): string | undefined {\n\t\tfor (let i = this.entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.entries[i]!;\n\t\t\tif (entry.type === \"session_info\") return entry.name?.trim() || undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tgetSessionStats(): SessionStats {\n\t\tlet messageCount = 0;\n\t\tlet cachedTokens = 0;\n\t\tlet uncachedTokens = 0;\n\t\tlet totalTokens = 0;\n\t\tlet costTotal = 0;\n\t\tfor (const entry of this.entries) {\n\t\t\tif (entry.type === \"message\") messageCount += 1;\n\t\t\tconst usage =\n\t\t\t\tentry.type === \"message\"\n\t\t\t\t\t? entry.message.role === \"assistant\"\n\t\t\t\t\t\t? entry.message.usage\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: entry.type === \"compaction\" || entry.type === \"branch_summary\"\n\t\t\t\t\t\t? entry.usage\n\t\t\t\t\t\t: undefined;\n\t\t\tif (\n\t\t\t\t!usage ||\n\t\t\t\ttypeof usage.input !== \"number\" ||\n\t\t\t\ttypeof usage.output !== \"number\" ||\n\t\t\t\ttypeof usage.cacheRead !== \"number\" ||\n\t\t\t\ttypeof usage.cacheWrite !== \"number\" ||\n\t\t\t\ttypeof usage.cost?.total !== \"number\"\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tcachedTokens += usage.cacheRead;\n\t\t\tuncachedTokens += usage.input + usage.cacheWrite;\n\t\t\ttotalTokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n\t\t\tcostTotal += usage.cost.total;\n\t\t}\n\t\treturn { messageCount, cachedTokens, uncachedTokens, totalTokens, costTotal };\n\t}\n\n\tprivate applyProjection(entry: SessionTreeEntry): void {\n\t\tif (entry.type !== \"label\") return;\n\t\tconst label = entry.label?.trim();\n\t\tif (label) this.labelsById.set(entry.targetId, label);\n\t\telse this.labelsById.delete(entry.targetId);\n\t}\n}\n\nexport interface Session<TMetadata extends SessionMetadata = SessionMetadata> {\n\tgetMetadata(): Promise<TMetadata>;\n\tgetLeafId(): Promise<string | null>;\n\tgetEntry(id: string): Promise<SessionTreeEntry | undefined>;\n\tgetEntries(options?: SessionEntryCursorOptions): Promise<SessionTreeEntry[]>;\n\tgetBranch(fromId?: string | null): Promise<SessionTreeEntry[]>;\n\tbuildContextEntries(options?: SessionContextBuildOptions): Promise<SessionTreeEntry[]>;\n\tbuildContext(options?: SessionContextBuildOptions): Promise<SessionContext>;\n\tgetLabel(id: string): Promise<string | undefined>;\n\tgetSessionStats(): Promise<SessionStats>;\n\tgetSessionName(): Promise<string | undefined>;\n\tappendMessage(message: AgentMessage): Promise<string>;\n\tappendThinkingLevelChange(thinkingLevel: string): Promise<string>;\n\tappendModelChange(provider: string, modelId: string): Promise<string>;\n\tappendActiveToolsChange(activeToolNames: string[]): Promise<string>;\n\tappendCompaction<T = unknown>(\n\t\tsummary: string,\n\t\tfirstKeptEntryId: string | undefined,\n\t\ttokensBefore: number,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tusage?: Usage,\n\t\tretainedTail?: AgentMessage[],\n\t): Promise<string>;\n\tappendCustomEntry(customType: string, data?: unknown): Promise<string>;\n\tappendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): Promise<string>;\n\tappendLabel(targetId: string, label: string | undefined): Promise<string>;\n\tappendSessionName(name: string): Promise<string>;\n\tmoveTo(\n\t\tentryId: string | null,\n\t\tsummary?: { summary: string; details?: unknown; usage?: Usage; fromHook?: boolean },\n\t): Promise<string | undefined>;\n}\n\nclass StoreSession<TMetadata extends SessionMetadata = SessionMetadata> implements Session<TMetadata> {\n\tprivate readonly store: Pick<SessionStore<TMetadata>, \"appendEntry\">;\n\tprivate readonly reader: SessionReader<TMetadata>;\n\tprivate readonly metadata: TMetadata;\n\tprivate hydratedStatePromise: Promise<HydratedSessionState> | undefined;\n\tprivate leafId: string | null;\n\tprivate readonly contextBuildOptions: SessionContextBuildOptions;\n\tprivate appendTail: Promise<void> = Promise.resolve();\n\n\tconstructor(\n\t\tstore: Pick<SessionStore<TMetadata>, \"appendEntry\">,\n\t\treader: SessionReader<TMetadata>,\n\t\tleafId: string | null,\n\t\tcontextBuildOptions: SessionContextBuildOptions = {},\n\t) {\n\t\tthis.store = store;\n\t\tthis.reader = reader;\n\t\tthis.metadata = reader.metadata;\n\t\tthis.leafId = leafId;\n\t\tthis.contextBuildOptions = contextBuildOptions;\n\t}\n\n\tasync getMetadata(): Promise<TMetadata> {\n\t\treturn this.metadata;\n\t}\n\tasync getLeafId(): Promise<string | null> {\n\t\treturn this.leafId;\n\t}\n\tasync getEntry(id: string): Promise<SessionTreeEntry | undefined> {\n\t\treturn this.reader.readEntry(id);\n\t}\n\tasync getEntries(options?: SessionEntryCursorOptions): Promise<SessionTreeEntry[]> {\n\t\treturn [...(await this.reader.readEntries(options))];\n\t}\n\n\tasync getBranch(fromId?: string | null): Promise<SessionTreeEntry[]> {\n\t\treturn [...(await this.reader.readPathToRootOrCompaction(fromId === undefined ? this.leafId : fromId))];\n\t}\n\n\tasync buildContextEntries(options: SessionContextBuildOptions = {}): Promise<SessionTreeEntry[]> {\n\t\treturn buildContextEntries(await this.getBranch(), this.mergeContextBuildOptions(options));\n\t}\n\n\tasync buildContext(options: SessionContextBuildOptions = {}): Promise<SessionContext> {\n\t\treturn buildSessionContext(await this.getBranch(), this.mergeContextBuildOptions(options));\n\t}\n\n\tprivate mergeContextBuildOptions(options: SessionContextBuildOptions): SessionContextBuildOptions {\n\t\treturn {\n\t\t\tentryTransforms: [...(this.contextBuildOptions.entryTransforms ?? []), ...(options.entryTransforms ?? [])],\n\t\t\tentryProjectors: {\n\t\t\t\t...(this.contextBuildOptions.entryProjectors ?? {}),\n\t\t\t\t...(options.entryProjectors ?? {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tasync getLabel(id: string): Promise<string | undefined> {\n\t\treturn (await this.getHydratedState()).getLabel(id);\n\t}\n\tasync getSessionStats(): Promise<SessionStats> {\n\t\treturn (await this.getHydratedState()).getSessionStats();\n\t}\n\tasync getSessionName(): Promise<string | undefined> {\n\t\treturn (await this.getHydratedState()).getSessionName();\n\t}\n\n\tprivate async getHydratedState(): Promise<HydratedSessionState> {\n\t\tthis.hydratedStatePromise ??= this.reader.readEntries().then((entries) => new HydratedSessionState(entries));\n\t\treturn this.hydratedStatePromise;\n\t}\n\n\tprivate async createEntryId(): Promise<string> {\n\t\tfor (let i = 0; i < 100; i++) {\n\t\t\tconst id = uuidv7().slice(-8);\n\t\t\tif (!(await this.getEntry(id))) return id;\n\t\t}\n\t\treturn uuidv7();\n\t}\n\n\tprivate enqueueAppend<TEntry extends SessionTreeEntry>(\n\t\tcreateEntry: (base: Pick<SessionTreeEntry, \"id\" | \"parentId\" | \"timestamp\">) => TEntry,\n\t): Promise<TEntry> {\n\t\tconst operation = this.appendTail.then(async () => {\n\t\t\tconst entry = createEntry({\n\t\t\t\tid: await this.createEntryId(),\n\t\t\t\tparentId: this.leafId,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t});\n\t\t\tawait this.store.appendEntry(this.metadata, entry);\n\t\t\tthis.leafId = entry.type === \"leaf\" ? entry.targetId : entry.id;\n\t\t\tthis.hydratedStatePromise = undefined;\n\t\t\treturn entry;\n\t\t});\n\t\tthis.appendTail = operation.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn operation;\n\t}\n\n\tprivate async setLeafId(leafId: string | null): Promise<LeafEntry> {\n\t\tif (leafId !== null && !(await this.getEntry(leafId))) {\n\t\t\tthrow new SessionError(\"not_found\", `Entry ${leafId} not found`);\n\t\t}\n\t\treturn this.enqueueAppend((base) => {\n\t\t\treturn { ...base, type: \"leaf\", targetId: leafId };\n\t\t});\n\t}\n\n\tprivate async appendTypedEntry<TEntry extends SessionTreeEntry>(\n\t\tcreateEntry: (base: Pick<SessionTreeEntry, \"id\" | \"parentId\" | \"timestamp\">) => TEntry,\n\t): Promise<string> {\n\t\treturn (await this.enqueueAppend(createEntry)).id;\n\t}\n\n\tasync appendMessage(message: AgentMessage): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\tmessage,\n\t\t\t\t}) satisfies MessageEntry,\n\t\t);\n\t}\n\n\tasync appendThinkingLevelChange(thinkingLevel: string): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"thinking_level_change\",\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t}) satisfies ThinkingLevelChangeEntry,\n\t\t);\n\t}\n\n\tasync appendModelChange(provider: string, modelId: string): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"model_change\",\n\t\t\t\t\tprovider,\n\t\t\t\t\tmodelId,\n\t\t\t\t}) satisfies ModelChangeEntry,\n\t\t);\n\t}\n\n\tasync appendActiveToolsChange(activeToolNames: string[]): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"active_tools_change\",\n\t\t\t\t\tactiveToolNames: [...activeToolNames],\n\t\t\t\t}) satisfies ActiveToolsChangeEntry,\n\t\t);\n\t}\n\n\tasync appendCompaction<T = unknown>(\n\t\tsummary: string,\n\t\tfirstKeptEntryId: string | undefined,\n\t\ttokensBefore: number,\n\t\tdetails?: T,\n\t\tfromHook?: boolean,\n\t\tusage?: Usage,\n\t\tretainedTail?: AgentMessage[],\n\t): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"compaction\",\n\t\t\t\t\tsummary,\n\t\t\t\t\tfirstKeptEntryId,\n\t\t\t\t\ttokensBefore,\n\t\t\t\t\tretainedTail,\n\t\t\t\t\tdetails,\n\t\t\t\t\tusage,\n\t\t\t\t\tfromHook,\n\t\t\t\t}) satisfies CompactionEntry<T>,\n\t\t);\n\t}\n\n\tasync appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tcustomType,\n\t\t\t\t\tdata,\n\t\t\t\t}) satisfies CustomEntry,\n\t\t);\n\t}\n\n\tasync appendCustomMessageEntry<T = unknown>(\n\t\tcustomType: string,\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\tdisplay: boolean,\n\t\tdetails?: T,\n\t): Promise<string> {\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"custom_message\",\n\t\t\t\t\tcustomType,\n\t\t\t\t\tcontent,\n\t\t\t\t\tdisplay,\n\t\t\t\t\tdetails,\n\t\t\t\t}) satisfies CustomMessageEntry<T>,\n\t\t);\n\t}\n\n\tasync appendLabel(targetId: string, label: string | undefined): Promise<string> {\n\t\tif (!(await this.getEntry(targetId))) {\n\t\t\tthrow new SessionError(\"not_found\", `Entry ${targetId} not found`);\n\t\t}\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"label\",\n\t\t\t\t\ttargetId,\n\t\t\t\t\tlabel,\n\t\t\t\t}) satisfies LabelEntry,\n\t\t);\n\t}\n\n\tasync appendSessionName(name: string): Promise<string> {\n\t\tconst sanitizedName = name.replace(/[\\r\\n]+/g, \" \").trim();\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"session_info\",\n\t\t\t\t\tname: sanitizedName,\n\t\t\t\t}) satisfies SessionInfoEntry,\n\t\t);\n\t}\n\n\tasync moveTo(\n\t\tentryId: string | null,\n\t\tsummary?: { summary: string; details?: unknown; usage?: Usage; fromHook?: boolean },\n\t): Promise<string | undefined> {\n\t\tif (entryId !== null && !(await this.getEntry(entryId))) {\n\t\t\tthrow new SessionError(\"not_found\", `Entry ${entryId} not found`);\n\t\t}\n\t\tawait this.setLeafId(entryId);\n\t\tif (!summary) return undefined;\n\t\treturn this.appendTypedEntry(\n\t\t\t(base) =>\n\t\t\t\t({\n\t\t\t\t\t...base,\n\t\t\t\t\ttype: \"branch_summary\",\n\t\t\t\t\tfromId: entryId ?? \"root\",\n\t\t\t\t\tsummary: summary.summary,\n\t\t\t\t\tdetails: summary.details,\n\t\t\t\t\tusage: summary.usage,\n\t\t\t\t\tfromHook: summary.fromHook,\n\t\t\t\t}) satisfies BranchSummaryEntry,\n\t\t);\n\t}\n}\n\n/** @internal Construct sessions only through SessionRepository. */\nexport async function createSessionFromReader<TMetadata extends SessionMetadata>(\n\tstore: Pick<SessionStore<TMetadata>, \"appendEntry\">,\n\treader: SessionReader<TMetadata>,\n\tcontextBuildOptions: SessionContextBuildOptions = {},\n): Promise<Session<TMetadata>> {\n\treturn new StoreSession(store, reader, (await reader.readHead()).leafId, contextBuildOptions);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/harness/session/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAqB/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,SAAS,cAAc,CAAC,MAAc;IACrC,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IAClD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,kCAAkC,CAAC,CAAC;IAC7E,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA4B;IACtD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,gDAAgD,CAAC,CAAC;IAC3F,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACpD,MAAM,MAAM,GAAG,IAAI,OAAO,EAAU,CAAC;IACrC,MAAM,KAAK,GAA0B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC3B,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,SAAS;QACV,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9B,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3F,SAAS;QACV,CAAC;QACD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,cAAc,CAAC,8BAA8B,CAAC,CAAC;YAChF,SAAS;QACV,CAAC;QACD,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,cAAc,CAAC,YAAY,OAAO,SAAS,EAAE,CAAC,CAAC;QAClF,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,cAAc,CAAC,kBAAkB,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAEhC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1D,cAAc,CAAC,+BAA+B,CAAC,CAAC;YACjD,CAAC;YACD,IACC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;gBAClD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EACpE,CAAC;gBACF,cAAc,CAAC,+CAA+C,CAAC,CAAC;YACjE,CAAC;YACD,KAAK,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;oBAAE,cAAc,CAAC,yBAAyB,CAAC,CAAC;gBAChF,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAE,CAAC;gBACtE,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;oBAAE,cAAc,CAAC,4BAA4B,CAAC,CAAC;gBAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,SAAS;QACV,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1D,cAAc,CAAC,6BAA6B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,cAAc,CAAC,kCAAkC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAClE,cAAc,CAAC,oCAAoC,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAE,CAAE,CAAC;YAC7E,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;gBAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,OAAO,OAAO;IAInB,YAAY,OAAkC,EAAE,UAAyC,EAAE;QAC1F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,IAAY;QAChB,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO;YACN,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC5C,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACrC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/C,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC7D,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAChD,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC;YACpE,iBAAiB,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC;YACnE,iBAAiB,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC;SAC7F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,KAAyB;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAkB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAoB,EAAE;QACrC,OAAO,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAiC;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAmC,EAAE;QAC5D,OAAO,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAqB;QACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,UAAkB,EAAE,IAAc;QACzD,OAAO,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,EAAiB;QAC/C,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,EAAiB;QAC7C,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,WAAW,CAAuB,KAA+B,EAAE,IAAY;QACpF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAKD,KAAK,CAAC,YAAY,CAAC,MAAiB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAMD,KAAK,CAAC,WAAW,CAAC,KAAmB;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,OAA4B;QAClE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAoB;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC1C,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAChF,OAAO,OAAO,CAAC,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAoB,EAAE,EAAE,WAAW,GAAG,KAAK,CAAC,KAAK;QAC3E,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACzG,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC/B,IAAY,EACZ,QAAmC,EAAE,EACrC,WAAW,GAAG,KAAK,CAAC,KAAK;QAEzB,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,WAAW,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,GAAG,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAqB,EAAE;QACjD,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC7E,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,iDAAiD,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,UAAsB,EAAE;QAC9C,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,OAAqB;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QACtG,OAAO,KAAK,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,IAAY,EAAE,UAAkB,EAAE,IAAc;QACrF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,IAAI,KAAK,SAAS;YACjB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE;YAC7D,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EACpE,IAAI,CACJ,CAAC;QACF,OAAO,KAAK,CAAC,EAAE,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAuB,KAA+B,EAAE,IAAY;QAC5F,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,YAAY,CACzB,MAAkB;QAElB,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAa,MAAM,CAElD,CAAC;IACH,CAAC;CACD","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"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { type BranchBounds, type Entry, type EntryQuery, type ForkOptions, type LanePointer, type LaneRecord, type LogItem, type LogOptions, type OperationStartedRecord, type RecordQuery, type SessionStats } from "./types.ts";
|
|
2
|
+
export type SessionMutation = {
|
|
3
|
+
kind: "entry";
|
|
4
|
+
lane?: string;
|
|
5
|
+
entry: Entry;
|
|
6
|
+
} | {
|
|
7
|
+
kind: "record";
|
|
8
|
+
record: LaneRecord;
|
|
9
|
+
} | {
|
|
10
|
+
kind: "lane";
|
|
11
|
+
seq: number;
|
|
12
|
+
lane: string;
|
|
13
|
+
leafId: string | null;
|
|
14
|
+
} | {
|
|
15
|
+
kind: "fact";
|
|
16
|
+
seq: number;
|
|
17
|
+
fact: "name";
|
|
18
|
+
name: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "fact";
|
|
21
|
+
seq: number;
|
|
22
|
+
fact: "label";
|
|
23
|
+
targetId: string;
|
|
24
|
+
label: string | undefined;
|
|
25
|
+
};
|
|
26
|
+
type InvalidMutation = (message: string) => never;
|
|
27
|
+
export declare class SessionState {
|
|
28
|
+
private sequence;
|
|
29
|
+
private readonly usedIds;
|
|
30
|
+
private readonly entries;
|
|
31
|
+
private readonly entriesById;
|
|
32
|
+
private readonly records;
|
|
33
|
+
private readonly openOperationsByLane;
|
|
34
|
+
private readonly lanes;
|
|
35
|
+
private readonly log;
|
|
36
|
+
private readonly stats;
|
|
37
|
+
private name;
|
|
38
|
+
private readonly labels;
|
|
39
|
+
get nextSequence(): number;
|
|
40
|
+
getLanes(): LanePointer[];
|
|
41
|
+
requireLane(lane: string): string | null;
|
|
42
|
+
validateNewLane(lane: string): void;
|
|
43
|
+
validateTarget(targetId: string | null): void;
|
|
44
|
+
validateUnusedId(id: string): void;
|
|
45
|
+
applyMutation(mutation: SessionMutation, invalid?: InvalidMutation): void;
|
|
46
|
+
getEntry(id: string): Entry | undefined;
|
|
47
|
+
findEntries(query?: EntryQuery): Entry[];
|
|
48
|
+
findEntriesOnBranch(query: EntryQuery & BranchBounds & {
|
|
49
|
+
start: string;
|
|
50
|
+
}): Entry[];
|
|
51
|
+
findRecords(query?: RecordQuery): LaneRecord[];
|
|
52
|
+
findOpenOperations(lane: string, options?: {
|
|
53
|
+
limit?: number;
|
|
54
|
+
}): OperationStartedRecord[];
|
|
55
|
+
getLog(options?: LogOptions): LogItem[];
|
|
56
|
+
getName(): string | undefined;
|
|
57
|
+
getLabel(id: string): string | undefined;
|
|
58
|
+
getStats(): SessionStats;
|
|
59
|
+
createForkMutations(options: ForkOptions): SessionMutation[];
|
|
60
|
+
private walkToRoot;
|
|
61
|
+
private matchesEntryQuery;
|
|
62
|
+
private matchesRecordQuery;
|
|
63
|
+
}
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/harness/session/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { SessionError, } from "./types.js";
|
|
2
|
+
function invalidMutation(message) {
|
|
3
|
+
throw new SessionError("invalid_entry", `Invalid session mutation: ${message}`);
|
|
4
|
+
}
|
|
5
|
+
function assertValidLimit(limit) {
|
|
6
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
|
|
7
|
+
throw new SessionError("invalid_query", "limit must be a positive integer");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function assertValidCursor(afterSeq) {
|
|
11
|
+
if (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {
|
|
12
|
+
throw new SessionError("invalid_query", "cursor sequence must be a non-negative integer");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function* ordered(items, order) {
|
|
16
|
+
if (order === "oldestFirst") {
|
|
17
|
+
yield* items;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (let index = items.length - 1; index >= 0; index--)
|
|
21
|
+
yield items[index];
|
|
22
|
+
}
|
|
23
|
+
export class SessionState {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.sequence = 0;
|
|
26
|
+
this.usedIds = new Set();
|
|
27
|
+
this.entries = [];
|
|
28
|
+
this.entriesById = new Map();
|
|
29
|
+
this.records = [];
|
|
30
|
+
this.openOperationsByLane = new Map();
|
|
31
|
+
this.lanes = new Map([["main", null]]);
|
|
32
|
+
this.log = [];
|
|
33
|
+
this.stats = {
|
|
34
|
+
messageCount: 0,
|
|
35
|
+
cachedTokens: 0,
|
|
36
|
+
uncachedTokens: 0,
|
|
37
|
+
totalTokens: 0,
|
|
38
|
+
costTotal: 0,
|
|
39
|
+
};
|
|
40
|
+
this.labels = new Map();
|
|
41
|
+
}
|
|
42
|
+
get nextSequence() {
|
|
43
|
+
return this.sequence + 1;
|
|
44
|
+
}
|
|
45
|
+
getLanes() {
|
|
46
|
+
return [...this.lanes].map(([lane, leafId]) => ({ lane, leafId }));
|
|
47
|
+
}
|
|
48
|
+
requireLane(lane) {
|
|
49
|
+
const leafId = this.lanes.get(lane);
|
|
50
|
+
if (leafId === undefined)
|
|
51
|
+
throw new SessionError("invalid_lane", `Lane not found: ${lane}`);
|
|
52
|
+
return leafId;
|
|
53
|
+
}
|
|
54
|
+
validateNewLane(lane) {
|
|
55
|
+
if (this.lanes.has(lane))
|
|
56
|
+
throw new SessionError("already_exists", `Lane already exists: ${lane}`);
|
|
57
|
+
}
|
|
58
|
+
validateTarget(targetId) {
|
|
59
|
+
if (targetId !== null && !this.entriesById.has(targetId)) {
|
|
60
|
+
throw new SessionError("not_found", `Entry not found: ${targetId}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
validateUnusedId(id) {
|
|
64
|
+
if (this.usedIds.has(id))
|
|
65
|
+
throw new SessionError("already_exists", `Session id already exists: ${id}`);
|
|
66
|
+
}
|
|
67
|
+
applyMutation(mutation, invalid = invalidMutation) {
|
|
68
|
+
const seq = mutation.kind === "entry"
|
|
69
|
+
? mutation.entry.seq
|
|
70
|
+
: mutation.kind === "record"
|
|
71
|
+
? mutation.record.seq
|
|
72
|
+
: mutation.seq;
|
|
73
|
+
if (seq !== this.sequence + 1)
|
|
74
|
+
invalid(`has non-consecutive seq ${seq}`);
|
|
75
|
+
switch (mutation.kind) {
|
|
76
|
+
case "entry": {
|
|
77
|
+
if (this.usedIds.has(mutation.entry.id))
|
|
78
|
+
invalid(`contains duplicate id ${mutation.entry.id}`);
|
|
79
|
+
if (mutation.lane !== undefined) {
|
|
80
|
+
const leafId = this.lanes.get(mutation.lane);
|
|
81
|
+
if (leafId === undefined)
|
|
82
|
+
invalid(`references missing lane ${mutation.lane}`);
|
|
83
|
+
if (mutation.entry.parentId !== leafId)
|
|
84
|
+
invalid("does not chain to the lane leaf");
|
|
85
|
+
}
|
|
86
|
+
if (mutation.entry.parentId !== null && !this.entriesById.has(mutation.entry.parentId)) {
|
|
87
|
+
invalid(`references missing parent ${mutation.entry.parentId}`);
|
|
88
|
+
}
|
|
89
|
+
this.sequence = seq;
|
|
90
|
+
this.usedIds.add(mutation.entry.id);
|
|
91
|
+
this.entries.push(mutation.entry);
|
|
92
|
+
this.entriesById.set(mutation.entry.id, mutation.entry);
|
|
93
|
+
if (mutation.lane !== undefined)
|
|
94
|
+
this.lanes.set(mutation.lane, mutation.entry.id);
|
|
95
|
+
this.log.push({ kind: "entry", seq, entry: mutation.entry });
|
|
96
|
+
if (mutation.entry.type === "message")
|
|
97
|
+
this.stats.messageCount += 1;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case "record": {
|
|
101
|
+
if (!this.lanes.has(mutation.record.lane))
|
|
102
|
+
invalid(`references missing lane ${mutation.record.lane}`);
|
|
103
|
+
if (this.usedIds.has(mutation.record.id))
|
|
104
|
+
invalid(`contains duplicate id ${mutation.record.id}`);
|
|
105
|
+
this.sequence = seq;
|
|
106
|
+
this.usedIds.add(mutation.record.id);
|
|
107
|
+
this.records.push(mutation.record);
|
|
108
|
+
if (mutation.record.type === "operation_started") {
|
|
109
|
+
let openOperations = this.openOperationsByLane.get(mutation.record.lane);
|
|
110
|
+
if (!openOperations) {
|
|
111
|
+
openOperations = new Map();
|
|
112
|
+
this.openOperationsByLane.set(mutation.record.lane, openOperations);
|
|
113
|
+
}
|
|
114
|
+
openOperations.set(mutation.record.id, mutation.record);
|
|
115
|
+
}
|
|
116
|
+
else if (mutation.record.type === "operation_finished") {
|
|
117
|
+
this.openOperationsByLane.get(mutation.record.lane)?.delete(mutation.record.runId);
|
|
118
|
+
}
|
|
119
|
+
this.log.push({ kind: "record", seq, record: mutation.record });
|
|
120
|
+
if (mutation.record.type === "usage") {
|
|
121
|
+
this.stats.cachedTokens += mutation.record.usage.cacheRead;
|
|
122
|
+
this.stats.uncachedTokens += mutation.record.usage.input + mutation.record.usage.cacheWrite;
|
|
123
|
+
this.stats.totalTokens += mutation.record.usage.totalTokens;
|
|
124
|
+
this.stats.costTotal += mutation.record.usage.cost.total;
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "lane":
|
|
129
|
+
if (mutation.leafId !== null && !this.entriesById.has(mutation.leafId)) {
|
|
130
|
+
invalid(`references missing lane target ${mutation.leafId}`);
|
|
131
|
+
}
|
|
132
|
+
this.sequence = seq;
|
|
133
|
+
this.lanes.set(mutation.lane, mutation.leafId);
|
|
134
|
+
this.log.push({ kind: "lane", seq, lane: mutation.lane, leafId: mutation.leafId });
|
|
135
|
+
break;
|
|
136
|
+
case "fact":
|
|
137
|
+
if (mutation.fact === "label" && !this.entriesById.has(mutation.targetId)) {
|
|
138
|
+
invalid(`references missing label target ${mutation.targetId}`);
|
|
139
|
+
}
|
|
140
|
+
this.sequence = seq;
|
|
141
|
+
if (mutation.fact === "name") {
|
|
142
|
+
this.name = mutation.name;
|
|
143
|
+
this.log.push({ kind: "fact", seq, fact: "name", name: mutation.name });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
if (mutation.label === undefined)
|
|
147
|
+
this.labels.delete(mutation.targetId);
|
|
148
|
+
else
|
|
149
|
+
this.labels.set(mutation.targetId, mutation.label);
|
|
150
|
+
this.log.push({
|
|
151
|
+
kind: "fact",
|
|
152
|
+
seq,
|
|
153
|
+
fact: "label",
|
|
154
|
+
targetId: mutation.targetId,
|
|
155
|
+
label: mutation.label,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
getEntry(id) {
|
|
162
|
+
return this.entriesById.get(id);
|
|
163
|
+
}
|
|
164
|
+
findEntries(query = {}) {
|
|
165
|
+
assertValidLimit(query.limit);
|
|
166
|
+
assertValidCursor(query.cursor?.afterSeq);
|
|
167
|
+
const results = [];
|
|
168
|
+
for (const entry of ordered(this.entries, query.order)) {
|
|
169
|
+
if (!this.matchesEntryQuery(entry, query))
|
|
170
|
+
continue;
|
|
171
|
+
results.push(entry);
|
|
172
|
+
if (results.length === query.limit)
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
return results;
|
|
176
|
+
}
|
|
177
|
+
findEntriesOnBranch(query) {
|
|
178
|
+
assertValidLimit(query.limit);
|
|
179
|
+
assertValidCursor(query.cursor?.afterSeq);
|
|
180
|
+
const results = [];
|
|
181
|
+
if (query.order === "oldestFirst") {
|
|
182
|
+
for (const entry of [...this.walkToRoot(query.start)].reverse()) {
|
|
183
|
+
const reachedBound = entry.id === query.stopAtId || entry.type === query.stopAtType;
|
|
184
|
+
if (this.matchesEntryQuery(entry, query))
|
|
185
|
+
results.push(entry);
|
|
186
|
+
if (reachedBound || results.length === query.limit)
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
for (const entry of this.walkToRoot(query.start, query)) {
|
|
192
|
+
if (this.matchesEntryQuery(entry, query))
|
|
193
|
+
results.push(entry);
|
|
194
|
+
if (results.length === query.limit)
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return results;
|
|
199
|
+
}
|
|
200
|
+
findRecords(query = {}) {
|
|
201
|
+
assertValidLimit(query.limit);
|
|
202
|
+
assertValidCursor(query.afterSeq);
|
|
203
|
+
const results = [];
|
|
204
|
+
for (const record of ordered(this.records, query.order)) {
|
|
205
|
+
if (!this.matchesRecordQuery(record, query))
|
|
206
|
+
continue;
|
|
207
|
+
results.push(record);
|
|
208
|
+
if (results.length === query.limit)
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
return results;
|
|
212
|
+
}
|
|
213
|
+
findOpenOperations(lane, options) {
|
|
214
|
+
assertValidLimit(options?.limit);
|
|
215
|
+
const openOperationsById = this.openOperationsByLane.get(lane);
|
|
216
|
+
const openOperations = openOperationsById ? [...openOperationsById.values()].reverse() : [];
|
|
217
|
+
return options?.limit === undefined ? openOperations : openOperations.slice(0, options.limit);
|
|
218
|
+
}
|
|
219
|
+
getLog(options = {}) {
|
|
220
|
+
assertValidLimit(options.limit);
|
|
221
|
+
assertValidCursor(options.afterSeq);
|
|
222
|
+
const results = [];
|
|
223
|
+
for (const item of this.log) {
|
|
224
|
+
if (options.afterSeq !== undefined && item.seq <= options.afterSeq)
|
|
225
|
+
continue;
|
|
226
|
+
results.push(item);
|
|
227
|
+
if (results.length === options.limit)
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
return results;
|
|
231
|
+
}
|
|
232
|
+
getName() {
|
|
233
|
+
return this.name;
|
|
234
|
+
}
|
|
235
|
+
getLabel(id) {
|
|
236
|
+
return this.labels.get(id);
|
|
237
|
+
}
|
|
238
|
+
getStats() {
|
|
239
|
+
return this.stats;
|
|
240
|
+
}
|
|
241
|
+
createForkMutations(options) {
|
|
242
|
+
let copiedEntries;
|
|
243
|
+
let forkLanes;
|
|
244
|
+
if (options.scope === "tree") {
|
|
245
|
+
copiedEntries = this.findEntries({ order: "oldestFirst" });
|
|
246
|
+
forkLanes = this.getLanes();
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
const selectedEntryId = options.entryId ?? this.requireLane("main");
|
|
250
|
+
let targetId = null;
|
|
251
|
+
if (selectedEntryId !== null) {
|
|
252
|
+
const entry = this.getEntry(selectedEntryId);
|
|
253
|
+
if (entry?.type !== "message") {
|
|
254
|
+
throw new SessionError("invalid_fork_target", `Fork target is not a message entry: ${selectedEntryId}`);
|
|
255
|
+
}
|
|
256
|
+
const position = options.position ?? (options.entryId === undefined ? "at" : "before");
|
|
257
|
+
targetId = position === "at" ? entry.id : entry.parentId;
|
|
258
|
+
}
|
|
259
|
+
copiedEntries = targetId === null ? [] : this.findEntriesOnBranch({ start: targetId, order: "oldestFirst" });
|
|
260
|
+
forkLanes = [{ lane: "main", leafId: targetId }];
|
|
261
|
+
}
|
|
262
|
+
const mutations = [];
|
|
263
|
+
let sequence = 1;
|
|
264
|
+
for (const sourceEntry of copiedEntries) {
|
|
265
|
+
mutations.push({ kind: "entry", entry: { ...structuredClone(sourceEntry), seq: sequence++ } });
|
|
266
|
+
}
|
|
267
|
+
for (const pointer of forkLanes) {
|
|
268
|
+
mutations.push({ kind: "lane", seq: sequence++, lane: pointer.lane, leafId: pointer.leafId });
|
|
269
|
+
}
|
|
270
|
+
if (this.name !== undefined) {
|
|
271
|
+
mutations.push({ kind: "fact", seq: sequence++, fact: "name", name: this.name });
|
|
272
|
+
}
|
|
273
|
+
for (const entry of copiedEntries) {
|
|
274
|
+
const label = this.labels.get(entry.id);
|
|
275
|
+
if (label !== undefined) {
|
|
276
|
+
mutations.push({ kind: "fact", seq: sequence++, fact: "label", targetId: entry.id, label });
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return mutations;
|
|
280
|
+
}
|
|
281
|
+
*walkToRoot(start, bounds) {
|
|
282
|
+
if (start === null)
|
|
283
|
+
return;
|
|
284
|
+
const visited = new Set();
|
|
285
|
+
let current = this.entriesById.get(start);
|
|
286
|
+
if (!current)
|
|
287
|
+
throw new SessionError("not_found", `Entry not found: ${start}`);
|
|
288
|
+
while (current) {
|
|
289
|
+
if (visited.has(current.id)) {
|
|
290
|
+
throw new SessionError("invalid_entry", `Session branch contains a cycle at ${current.id}`);
|
|
291
|
+
}
|
|
292
|
+
visited.add(current.id);
|
|
293
|
+
yield current;
|
|
294
|
+
if (current.id === bounds?.stopAtId || current.type === bounds?.stopAtType || current.parentId === null)
|
|
295
|
+
break;
|
|
296
|
+
const parentId = current.parentId;
|
|
297
|
+
current = this.entriesById.get(parentId);
|
|
298
|
+
if (!current)
|
|
299
|
+
throw new SessionError("invalid_entry", `Entry not found: ${parentId}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
matchesEntryQuery(entry, query) {
|
|
303
|
+
return ((query.type === undefined || entry.type === query.type) &&
|
|
304
|
+
(query.customType === undefined || (entry.type === "custom" && entry.customType === query.customType)) &&
|
|
305
|
+
(query.cursor === undefined ||
|
|
306
|
+
(query.order === "oldestFirst" ? entry.seq > query.cursor.afterSeq : entry.seq < query.cursor.afterSeq)));
|
|
307
|
+
}
|
|
308
|
+
matchesRecordQuery(record, query) {
|
|
309
|
+
return ((query.lane === undefined || record.lane === query.lane) &&
|
|
310
|
+
(query.type === undefined || record.type === query.type) &&
|
|
311
|
+
(query.runId === undefined ||
|
|
312
|
+
(record.type === "operation_started"
|
|
313
|
+
? record.id === query.runId
|
|
314
|
+
: "runId" in record && record.runId === query.runId)) &&
|
|
315
|
+
(query.operationKind === undefined ||
|
|
316
|
+
(record.type === "operation_started" && record.intent.kind === query.operationKind)) &&
|
|
317
|
+
(query.afterSeq === undefined || record.seq > query.afterSeq));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SessionBackendConformanceCase, SessionBackendFixtureFactory } from "./types.ts";
|
|
2
|
+
/** Creates the session backend conformance cases. Each case creates and disposes its own fixture. */
|
|
3
|
+
export declare function createSessionBackendConformance(factory: SessionBackendFixtureFactory): readonly SessionBackendConformanceCase[];
|
|
4
|
+
//# sourceMappingURL=conformance.d.ts.map
|
|
@@ -0,0 +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,CAm4B1C"}
|