@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-store.js","sourceRoot":"","sources":["../../../src/harness/session/jsonl-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tFileSystem,\n\tJsonlSessionCreateOptions,\n\tJsonlSessionListOptions,\n\tJsonlSessionMetadata,\n\tSessionForkSelection,\n\tSessionReader,\n\tSessionStore,\n\tSessionTreeEntry,\n} from \"../types.ts\";\nimport { SessionError, toError } from \"../types.ts\";\nimport { createArraySessionReader } from \"./array-session-reader.ts\";\nimport { readSessionEntriesForFork } from \"./fork.ts\";\nimport { KeyedOperationQueue } from \"./keyed-operation-queue.ts\";\nimport { createSessionId, createTimestamp, getFileSystemResultOrThrow } from \"./repository.ts\";\n\nexport interface JsonlSessionStoreOptions {\n\tfs: JsonlSessionStoreFileSystem;\n\tsessionsRoot: string;\n\t/** Maximum active operations across session keys. Defaults to 4. */\n\tmaxConcurrentOperations?: number;\n}\nexport type JsonlSessionStoreFileSystem = Pick<\n\tFileSystem,\n\t| \"absolutePath\"\n\t| \"joinPath\"\n\t| \"readTextFile\"\n\t| \"readTextLines\"\n\t| \"writeFile\"\n\t| \"appendFile\"\n\t| \"listDir\"\n\t| \"exists\"\n\t| \"createDir\"\n\t| \"remove\"\n>;\n\ntype JsonlSessionFileSystem = Pick<FileSystem, \"readTextFile\" | \"readTextLines\" | \"writeFile\" | \"appendFile\">;\n\nconst DEFAULT_MAX_CONCURRENT_OPERATIONS = 4;\n\ninterface SessionHeader {\n\ttype: \"session\";\n\tversion: 3;\n\tid: string;\n\ttimestamp: string;\n\tcwd: string;\n\tparentSession?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\ninterface SessionDocumentDescriptor {\n\tid: string;\n\ttimestamp: string;\n\tfileName: string;\n\toperationKey: string;\n}\n\ninterface JsonlSessionDocument {\n\tmetadata: JsonlSessionMetadata;\n\tentries: SessionTreeEntry[];\n}\n\nfunction invalidSession(path: string, message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_session\", `Invalid JSONL session file ${path}: ${message}`, cause);\n}\n\nfunction invalidEntry(path: string, line: number, message: string, cause?: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid JSONL session file ${path}: line ${line} ${message}`, cause);\n}\n\nfunction parseHeader(line: string, path: string): SessionHeader {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line);\n\t} catch (error) {\n\t\tthrow invalidSession(path, \"first line is not a valid session header\", toError(error));\n\t}\n\tif (typeof value !== \"object\" || value === null)\n\t\tthrow invalidSession(path, \"first line is not a valid session header\");\n\tconst header = value as Partial<SessionHeader>;\n\tif (header.type !== \"session\" || header.version !== 3) {\n\t\tthrow invalidSession(\n\t\t\tpath,\n\t\t\theader.type === \"session\" ? \"unsupported session version\" : \"first line is not a valid session header\",\n\t\t);\n\t}\n\tif (typeof header.id !== \"string\" || !header.id) throw invalidSession(path, \"session header is missing id\");\n\tif (typeof header.timestamp !== \"string\" || !header.timestamp)\n\t\tthrow invalidSession(path, \"session header is missing timestamp\");\n\tif (typeof header.cwd !== \"string\" || !header.cwd) throw invalidSession(path, \"session header is missing cwd\");\n\tif (header.parentSession !== undefined && typeof header.parentSession !== \"string\") {\n\t\tthrow invalidSession(path, \"session header parentSession must be a string\");\n\t}\n\tif (\n\t\theader.metadata !== undefined &&\n\t\t(typeof header.metadata !== \"object\" || header.metadata === null || Array.isArray(header.metadata))\n\t) {\n\t\tthrow invalidSession(path, \"session header metadata must be an object\");\n\t}\n\treturn {\n\t\ttype: \"session\",\n\t\tversion: 3,\n\t\tid: header.id,\n\t\ttimestamp: header.timestamp,\n\t\tcwd: header.cwd,\n\t\tparentSession: header.parentSession,\n\t\tmetadata: header.metadata,\n\t};\n}\n\nfunction parseEntry(line: string, path: string, lineNumber: number): SessionTreeEntry {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line);\n\t} catch (error) {\n\t\tthrow invalidEntry(path, lineNumber, \"is not valid JSON\", toError(error));\n\t}\n\tif (typeof value !== \"object\" || value === null)\n\t\tthrow invalidEntry(path, lineNumber, \"is not a valid session entry\");\n\tconst entry = value as { type?: unknown; id?: unknown; parentId?: unknown; timestamp?: unknown; targetId?: unknown };\n\tif (typeof entry.type !== \"string\") throw invalidEntry(path, lineNumber, \"is missing entry type\");\n\tif (typeof entry.id !== \"string\" || !entry.id) throw invalidEntry(path, lineNumber, \"is missing entry id\");\n\tif (entry.parentId !== null && typeof entry.parentId !== \"string\")\n\t\tthrow invalidEntry(path, lineNumber, \"has invalid parentId\");\n\tif (typeof entry.timestamp !== \"string\" || !entry.timestamp)\n\t\tthrow invalidEntry(path, lineNumber, \"is missing timestamp\");\n\tif (entry.type === \"leaf\" && entry.targetId !== null && typeof entry.targetId !== \"string\") {\n\t\tthrow invalidEntry(path, lineNumber, \"has invalid targetId\");\n\t}\n\treturn entry as SessionTreeEntry;\n}\n\nfunction metadataFromHeader(header: SessionHeader, path: string): JsonlSessionMetadata {\n\treturn {\n\t\tid: header.id,\n\t\tcreatedAt: header.timestamp,\n\t\tcwd: header.cwd,\n\t\tpath,\n\t\tparentSessionPath: header.parentSession,\n\t\tmetadata: header.metadata,\n\t};\n}\n\nexport async function loadJsonlSessionMetadata(\n\tfs: JsonlSessionFileSystem,\n\tpath: string,\n): Promise<JsonlSessionMetadata> {\n\tconst lines = getFileSystemResultOrThrow(\n\t\tawait fs.readTextLines(path, { maxLines: 1 }),\n\t\t`Failed to read session header ${path}`,\n\t);\n\tif (!lines[0]?.trim()) throw invalidSession(path, \"missing session header\");\n\treturn metadataFromHeader(parseHeader(lines[0], path), path);\n}\n\nasync function loadJsonlSession(fs: JsonlSessionFileSystem, path: string): Promise<JsonlSessionDocument> {\n\tconst content = getFileSystemResultOrThrow(await fs.readTextFile(path), `Failed to read session ${path}`);\n\tconst lines = content.split(\"\\n\").filter((line) => line.trim());\n\tif (lines.length === 0) throw invalidSession(path, \"missing session header\");\n\tconst header = parseHeader(lines[0]!, path);\n\tconst entries = lines.slice(1).map((line, index) => parseEntry(line, path, index + 2));\n\tconst entryIds = new Set<string>();\n\tfor (const entry of entries) {\n\t\tif (entryIds.has(entry.id)) throw invalidSession(path, `duplicate entry id ${entry.id}`);\n\t\tentryIds.add(entry.id);\n\t}\n\treturn {\n\t\tmetadata: metadataFromHeader(header, path),\n\t\tentries,\n\t};\n}\n\nfunction encodeCwd(cwd: string): string {\n\treturn `--${cwd.replace(/^[/\\\\]/, \"\").replace(/[/\\\\:]/g, \"-\")}--`;\n}\n\nfunction createDocumentDescriptor(options: JsonlSessionCreateOptions): SessionDocumentDescriptor {\n\tconst id = options.id ?? createSessionId();\n\tif (!id) throw new SessionError(\"invalid_session\", \"Session id cannot be empty\");\n\tlet encodedId: string;\n\ttry {\n\t\tencodedId = encodeURIComponent(id);\n\t} catch (error) {\n\t\tthrow new SessionError(\"invalid_session\", `Invalid session id ${JSON.stringify(id)}`, toError(error));\n\t}\n\tconst timestamp = createTimestamp();\n\tconst fileName = `${timestamp.replace(/[:.]/g, \"-\")}_${encodedId}.jsonl`;\n\treturn {\n\t\tid,\n\t\ttimestamp,\n\t\tfileName,\n\t\toperationKey: `document:${JSON.stringify([encodeCwd(options.cwd), fileName])}`,\n\t};\n}\n\nclass JsonlSessionStore\n\timplements SessionStore<JsonlSessionMetadata, JsonlSessionCreateOptions, JsonlSessionListOptions>\n{\n\tprivate readonly fs: JsonlSessionStoreFileSystem;\n\tprivate readonly sessionsRootInput: string;\n\tprivate sessionsRoot: string | undefined;\n\tprivate readonly entryIdsByPath = new Map<string, Set<string>>();\n\tprivate readonly entriesByPath = new Map<string, SessionTreeEntry[]>();\n\tprivate readonly operationKeysByPath = new Map<string, string>();\n\tprivate readonly operations: KeyedOperationQueue<string>;\n\tprivate disposed = false;\n\tprivate disposePromise: Promise<void> | undefined;\n\n\tconstructor(options: JsonlSessionStoreOptions) {\n\t\tthis.fs = options.fs;\n\t\tthis.sessionsRootInput = options.sessionsRoot;\n\t\tthis.operations = new KeyedOperationQueue({\n\t\t\tmaxConcurrentOperations: options.maxConcurrentOperations ?? DEFAULT_MAX_CONCURRENT_OPERATIONS,\n\t\t});\n\t}\n\n\tcreate(options: JsonlSessionCreateOptions): Promise<SessionReader<JsonlSessionMetadata>> {\n\t\tthis.assertOpen();\n\t\tconst descriptor = createDocumentDescriptor(options);\n\t\treturn this.operations.enqueue(descriptor.operationKey, () =>\n\t\t\tthis.createDocument(descriptor, options, options.parentSessionPath, options.metadata, []),\n\t\t);\n\t}\n\n\tload(metadata: JsonlSessionMetadata): Promise<SessionReader<JsonlSessionMetadata>> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(this.operationKey(metadata), () => this.loadDocument(metadata));\n\t}\n\n\tprivate async loadDocument(metadata: JsonlSessionMetadata): Promise<SessionReader<JsonlSessionMetadata>> {\n\t\tif (\n\t\t\t!getFileSystemResultOrThrow(await this.fs.exists(metadata.path), `Failed to check session ${metadata.path}`)\n\t\t) {\n\t\t\tthrow new SessionError(\"not_found\", `Session not found: ${metadata.path}`);\n\t\t}\n\t\tconst document = await loadJsonlSession(this.fs, metadata.path);\n\t\tthis.entriesByPath.set(metadata.path, document.entries);\n\t\tthis.entryIdsByPath.set(metadata.path, new Set(document.entries.map((entry) => entry.id)));\n\t\treturn this.reader(document.metadata);\n\t}\n\n\tlist(options: JsonlSessionListOptions = {}): Promise<JsonlSessionMetadata[]> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueueBarrier(() => this.listSessions(options));\n\t}\n\n\tprivate async listSessions(options: JsonlSessionListOptions): Promise<JsonlSessionMetadata[]> {\n\t\tconst dirs = options.cwd ? [await this.getSessionDir(options.cwd)] : await this.listSessionDirs();\n\t\tconst sessions: JsonlSessionMetadata[] = [];\n\t\tfor (const dir of dirs) {\n\t\t\tif (!getFileSystemResultOrThrow(await this.fs.exists(dir), `Failed to check session directory ${dir}`))\n\t\t\t\tcontinue;\n\t\t\tconst files = getFileSystemResultOrThrow(\n\t\t\t\tawait this.fs.listDir(dir),\n\t\t\t\t`Failed to list sessions in ${dir}`,\n\t\t\t).filter((file) => file.kind !== \"directory\" && file.name.endsWith(\".jsonl\"));\n\t\t\tfor (const file of files) sessions.push(await loadJsonlSessionMetadata(this.fs, file.path));\n\t\t}\n\t\treturn sessions.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\t}\n\n\tappendEntry(metadata: JsonlSessionMetadata, entry: SessionTreeEntry): Promise<void> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(this.operationKey(metadata), async () => {\n\t\t\tif (\n\t\t\t\t!getFileSystemResultOrThrow(await this.fs.exists(metadata.path), `Failed to check session ${metadata.path}`)\n\t\t\t) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Session not found: ${metadata.path}`);\n\t\t\t}\n\t\t\tlet entryIds = this.entryIdsByPath.get(metadata.path);\n\t\t\tif (!entryIds) {\n\t\t\t\tawait this.loadDocument(metadata);\n\t\t\t\tentryIds = this.entryIdsByPath.get(metadata.path)!;\n\t\t\t}\n\t\t\tif (entryIds.has(entry.id)) throw new SessionError(\"invalid_entry\", `Entry ${entry.id} already exists`);\n\t\t\tgetFileSystemResultOrThrow(\n\t\t\t\tawait this.fs.appendFile(metadata.path, `${JSON.stringify(entry)}\\n`),\n\t\t\t\t`Failed to append session entry ${entry.id}`,\n\t\t\t);\n\t\t\tentryIds.add(entry.id);\n\t\t\tthis.entryIdsByPath.set(metadata.path, entryIds);\n\t\t\tthis.entriesByPath.get(metadata.path)!.push(entry);\n\t\t});\n\t}\n\n\tdelete(metadata: JsonlSessionMetadata): Promise<void> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(this.operationKey(metadata), async () => {\n\t\t\tgetFileSystemResultOrThrow(\n\t\t\t\tawait this.fs.remove(metadata.path, { force: true }),\n\t\t\t\t`Failed to delete session ${metadata.path}`,\n\t\t\t);\n\t\t\tthis.entryIdsByPath.delete(metadata.path);\n\t\t\tthis.entriesByPath.delete(metadata.path);\n\t\t\tthis.operationKeysByPath.delete(metadata.path);\n\t\t});\n\t}\n\n\tfork(\n\t\tsource: JsonlSessionMetadata,\n\t\toptions: JsonlSessionCreateOptions,\n\t\tselection: SessionForkSelection,\n\t): Promise<SessionReader<JsonlSessionMetadata>> {\n\t\tthis.assertOpen();\n\t\tconst descriptor = createDocumentDescriptor(options);\n\t\tconst sourceEntries = this.operations.enqueue(this.operationKey(source), async () => {\n\t\t\tif (!getFileSystemResultOrThrow(await this.fs.exists(source.path), `Failed to check session ${source.path}`)) {\n\t\t\t\tthrow new SessionError(\"not_found\", `Session not found: ${source.path}`);\n\t\t\t}\n\t\t\tconst document = await loadJsonlSession(this.fs, source.path);\n\t\t\tthis.entriesByPath.set(source.path, document.entries);\n\t\t\tthis.entryIdsByPath.set(source.path, new Set(document.entries.map((entry) => entry.id)));\n\t\t\treturn readSessionEntriesForFork(\n\t\t\t\tcreateArraySessionReader(document.metadata, () => document.entries),\n\t\t\t\tselection,\n\t\t\t);\n\t\t});\n\t\treturn this.operations.enqueue(descriptor.operationKey, async () =>\n\t\t\tthis.createDocument(\n\t\t\t\tdescriptor,\n\t\t\t\toptions,\n\t\t\t\toptions.parentSessionPath ?? source.path,\n\t\t\t\toptions.metadata ?? source.metadata,\n\t\t\t\tawait sourceEntries,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tif (!this.disposePromise) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.disposePromise = this.operations.drain();\n\t\t}\n\t\tawait this.disposePromise;\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) throw new SessionError(\"storage\", \"JSONL session store is disposed\");\n\t}\n\n\tprivate operationKey(metadata: JsonlSessionMetadata): string {\n\t\treturn this.operationKeysByPath.get(metadata.path) ?? metadata.path;\n\t}\n\n\tprivate async createDocument(\n\t\tdescriptor: SessionDocumentDescriptor,\n\t\toptions: JsonlSessionCreateOptions,\n\t\tparentSessionPath: string | undefined,\n\t\tmetadata: Record<string, unknown> | undefined,\n\t\tentries: readonly SessionTreeEntry[],\n\t): Promise<SessionReader<JsonlSessionMetadata>> {\n\t\tconst dir = await this.getSessionDir(options.cwd);\n\t\tgetFileSystemResultOrThrow(\n\t\t\tawait this.fs.createDir(dir, { recursive: true }),\n\t\t\t`Failed to create session directory ${dir}`,\n\t\t);\n\t\tconst path = getFileSystemResultOrThrow(\n\t\t\tawait this.fs.joinPath([dir, descriptor.fileName]),\n\t\t\t`Failed to resolve session file path for ${descriptor.id}`,\n\t\t);\n\t\tif (getFileSystemResultOrThrow(await this.fs.exists(path), `Failed to check session ${path}`)) {\n\t\t\tthrow new SessionError(\"invalid_session\", `Session already exists: ${path}`);\n\t\t}\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: 3,\n\t\t\tid: descriptor.id,\n\t\t\ttimestamp: descriptor.timestamp,\n\t\t\tcwd: options.cwd,\n\t\t\tparentSession: parentSessionPath,\n\t\t\tmetadata,\n\t\t};\n\t\tconst content = [JSON.stringify(header), ...entries.map((entry) => JSON.stringify(entry)), \"\"].join(\"\\n\");\n\t\tgetFileSystemResultOrThrow(await this.fs.writeFile(path, content), `Failed to create session ${path}`);\n\t\tconst storedEntries = [...entries];\n\t\tthis.entriesByPath.set(path, storedEntries);\n\t\tthis.entryIdsByPath.set(path, new Set(storedEntries.map((entry) => entry.id)));\n\t\tthis.operationKeysByPath.set(path, descriptor.operationKey);\n\t\treturn this.reader(metadataFromHeader(header, path));\n\t}\n\n\tprivate reader(metadata: JsonlSessionMetadata): SessionReader<JsonlSessionMetadata> {\n\t\tconst reader = createArraySessionReader(metadata, () => {\n\t\t\tconst entries = this.entriesByPath.get(metadata.path);\n\t\t\tif (!entries) throw new SessionError(\"not_found\", `Session not found: ${metadata.path}`);\n\t\t\treturn entries;\n\t\t});\n\t\tconst operationKey = this.operationKey(metadata);\n\t\treturn {\n\t\t\tmetadata: reader.metadata,\n\t\t\treadHead: () => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(operationKey, () => reader.readHead());\n\t\t\t},\n\t\t\treadEntry: (id) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(operationKey, () => reader.readEntry(id));\n\t\t\t},\n\t\t\treadEntries: (options) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(operationKey, () => reader.readEntries(options));\n\t\t\t},\n\t\t\treadPathToRootOrCompaction: (leafId) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(operationKey, () => reader.readPathToRootOrCompaction(leafId));\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async getSessionsRoot(): Promise<string> {\n\t\tthis.sessionsRoot ??= getFileSystemResultOrThrow(\n\t\t\tawait this.fs.absolutePath(this.sessionsRootInput),\n\t\t\t`Failed to resolve sessions root ${this.sessionsRootInput}`,\n\t\t);\n\t\treturn this.sessionsRoot;\n\t}\n\n\tprivate async getSessionDir(cwd: string): Promise<string> {\n\t\treturn getFileSystemResultOrThrow(\n\t\t\tawait this.fs.joinPath([await this.getSessionsRoot(), encodeCwd(cwd)]),\n\t\t\t`Failed to resolve session directory for ${cwd}`,\n\t\t);\n\t}\n\n\tprivate async listSessionDirs(): Promise<string[]> {\n\t\tconst root = await this.getSessionsRoot();\n\t\tif (!getFileSystemResultOrThrow(await this.fs.exists(root), `Failed to check sessions root ${root}`)) return [];\n\t\treturn getFileSystemResultOrThrow(await this.fs.listDir(root), `Failed to list sessions root ${root}`)\n\t\t\t.filter((entry) => entry.kind === \"directory\")\n\t\t\t.map((entry) => entry.path);\n\t}\n}\n\nexport function createJsonlSessionStore(\n\toptions: JsonlSessionStoreOptions,\n): SessionStore<JsonlSessionMetadata, JsonlSessionCreateOptions, JsonlSessionListOptions> {\n\treturn new JsonlSessionStore(options);\n}\n"]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export declare class KeyedOperationQueue<TKey> {
|
|
2
|
-
private readonly tails;
|
|
3
|
-
private readonly maxConcurrentOperations;
|
|
4
|
-
private readonly permitWaiters;
|
|
5
|
-
private activeOperations;
|
|
6
|
-
private barrier;
|
|
7
|
-
constructor(options?: {
|
|
8
|
-
maxConcurrentOperations?: number;
|
|
9
|
-
});
|
|
10
|
-
enqueue<T>(key: TKey, operation: () => Promise<T> | T): Promise<T>;
|
|
11
|
-
enqueueBarrier<T>(operation: () => Promise<T> | T): Promise<T>;
|
|
12
|
-
drain(): Promise<void>;
|
|
13
|
-
private runOperation;
|
|
14
|
-
private acquirePermit;
|
|
15
|
-
private releasePermit;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=keyed-operation-queue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-operation-queue.d.ts","sourceRoot":"","sources":["../../../src/harness/session/keyed-operation-queue.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAmB,CAAC,IAAI;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqB;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,OAAO,CAAoC;IAEnD,YAAY,OAAO,GAAE;QAAE,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAAO,EAQ7D;IAED,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYjE;IAED,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO7D;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;YAEa,YAAY;YASZ,aAAa;IAS3B,OAAO,CAAC,aAAa;CAMrB"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
export class KeyedOperationQueue {
|
|
2
|
-
constructor(options = {}) {
|
|
3
|
-
this.tails = new Map();
|
|
4
|
-
this.permitWaiters = [];
|
|
5
|
-
this.activeOperations = 0;
|
|
6
|
-
this.barrier = Promise.resolve();
|
|
7
|
-
if (options.maxConcurrentOperations !== undefined &&
|
|
8
|
-
(!Number.isInteger(options.maxConcurrentOperations) || options.maxConcurrentOperations < 1)) {
|
|
9
|
-
throw new RangeError("maxConcurrentOperations must be a positive integer");
|
|
10
|
-
}
|
|
11
|
-
this.maxConcurrentOperations = options.maxConcurrentOperations;
|
|
12
|
-
}
|
|
13
|
-
enqueue(key, operation) {
|
|
14
|
-
const previous = this.tails.get(key) ?? Promise.resolve();
|
|
15
|
-
const result = Promise.all([this.barrier, previous]).then(() => this.runOperation(operation));
|
|
16
|
-
const tail = result.then(() => undefined, () => undefined);
|
|
17
|
-
this.tails.set(key, tail);
|
|
18
|
-
void tail.then(() => {
|
|
19
|
-
if (this.tails.get(key) === tail)
|
|
20
|
-
this.tails.delete(key);
|
|
21
|
-
});
|
|
22
|
-
return result;
|
|
23
|
-
}
|
|
24
|
-
enqueueBarrier(operation) {
|
|
25
|
-
const result = Promise.all([this.barrier, ...this.tails.values()]).then(() => this.runOperation(operation));
|
|
26
|
-
this.barrier = result.then(() => undefined, () => undefined);
|
|
27
|
-
return result;
|
|
28
|
-
}
|
|
29
|
-
async drain() {
|
|
30
|
-
await Promise.all([this.barrier, ...this.tails.values()]);
|
|
31
|
-
}
|
|
32
|
-
async runOperation(operation) {
|
|
33
|
-
await this.acquirePermit();
|
|
34
|
-
try {
|
|
35
|
-
return await operation();
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
this.releasePermit();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async acquirePermit() {
|
|
42
|
-
if (this.maxConcurrentOperations === undefined)
|
|
43
|
-
return;
|
|
44
|
-
if (this.activeOperations < this.maxConcurrentOperations) {
|
|
45
|
-
this.activeOperations += 1;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
await new Promise((resolve) => this.permitWaiters.push(resolve));
|
|
49
|
-
}
|
|
50
|
-
releasePermit() {
|
|
51
|
-
if (this.maxConcurrentOperations === undefined)
|
|
52
|
-
return;
|
|
53
|
-
const next = this.permitWaiters.shift();
|
|
54
|
-
if (next)
|
|
55
|
-
next();
|
|
56
|
-
else
|
|
57
|
-
this.activeOperations -= 1;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=keyed-operation-queue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-operation-queue.js","sourceRoot":"","sources":["../../../src/harness/session/keyed-operation-queue.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAmB;IAO/B,YAAY,OAAO,GAAyC,EAAE;QAN7C,UAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEvC,kBAAa,GAAsB,EAAE,CAAC;QAC/C,qBAAgB,GAAG,CAAC,CAAC;QACrB,YAAO,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;QAGlD,IACC,OAAO,CAAC,uBAAuB,KAAK,SAAS;YAC7C,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,uBAAuB,GAAG,CAAC,CAAC,EAC1F,CAAC;YACF,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAChE,CAAC;IAED,OAAO,CAAI,GAAS,EAAE,SAA+B;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACvB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CACf,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACnB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,cAAc,CAAI,SAA+B;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5G,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CACf,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAI,SAA+B;QAC5D,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC;YACJ,OAAO,MAAM,SAAS,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,aAAa;QAC1B,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS;YAAE,OAAO;QACvD,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC1D,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC3B,OAAO;QACR,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,aAAa;QACpB,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS;YAAE,OAAO;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;;YACZ,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACjC,CAAC;CACD","sourcesContent":["export class KeyedOperationQueue<TKey> {\n\tprivate readonly tails = new Map<TKey, Promise<void>>();\n\tprivate readonly maxConcurrentOperations: number | undefined;\n\tprivate readonly permitWaiters: Array<() => void> = [];\n\tprivate activeOperations = 0;\n\tprivate barrier: Promise<void> = Promise.resolve();\n\n\tconstructor(options: { maxConcurrentOperations?: number } = {}) {\n\t\tif (\n\t\t\toptions.maxConcurrentOperations !== undefined &&\n\t\t\t(!Number.isInteger(options.maxConcurrentOperations) || options.maxConcurrentOperations < 1)\n\t\t) {\n\t\t\tthrow new RangeError(\"maxConcurrentOperations must be a positive integer\");\n\t\t}\n\t\tthis.maxConcurrentOperations = options.maxConcurrentOperations;\n\t}\n\n\tenqueue<T>(key: TKey, operation: () => Promise<T> | T): Promise<T> {\n\t\tconst previous = this.tails.get(key) ?? Promise.resolve();\n\t\tconst result = Promise.all([this.barrier, previous]).then(() => this.runOperation(operation));\n\t\tconst tail = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\tthis.tails.set(key, tail);\n\t\tvoid tail.then(() => {\n\t\t\tif (this.tails.get(key) === tail) this.tails.delete(key);\n\t\t});\n\t\treturn result;\n\t}\n\n\tenqueueBarrier<T>(operation: () => Promise<T> | T): Promise<T> {\n\t\tconst result = Promise.all([this.barrier, ...this.tails.values()]).then(() => this.runOperation(operation));\n\t\tthis.barrier = result.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\treturn result;\n\t}\n\n\tasync drain(): Promise<void> {\n\t\tawait Promise.all([this.barrier, ...this.tails.values()]);\n\t}\n\n\tprivate async runOperation<T>(operation: () => Promise<T> | T): Promise<T> {\n\t\tawait this.acquirePermit();\n\t\ttry {\n\t\t\treturn await operation();\n\t\t} finally {\n\t\t\tthis.releasePermit();\n\t\t}\n\t}\n\n\tprivate async acquirePermit(): Promise<void> {\n\t\tif (this.maxConcurrentOperations === undefined) return;\n\t\tif (this.activeOperations < this.maxConcurrentOperations) {\n\t\t\tthis.activeOperations += 1;\n\t\t\treturn;\n\t\t}\n\t\tawait new Promise<void>((resolve) => this.permitWaiters.push(resolve));\n\t}\n\n\tprivate releasePermit(): void {\n\t\tif (this.maxConcurrentOperations === undefined) return;\n\t\tconst next = this.permitWaiters.shift();\n\t\tif (next) next();\n\t\telse this.activeOperations -= 1;\n\t}\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { SessionMetadata, SessionStore } from "../types.ts";
|
|
2
|
-
export type InMemorySessionCreateOptions = {
|
|
3
|
-
id?: string;
|
|
4
|
-
};
|
|
5
|
-
export declare function createInMemorySessionStore(): SessionStore<SessionMetadata, InMemorySessionCreateOptions, void>;
|
|
6
|
-
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../../src/harness/session/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,eAAe,EAAiB,YAAY,EAAoB,MAAM,aAAa,CAAC;AAOxH,MAAM,MAAM,4BAA4B,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAwH3D,wBAAgB,0BAA0B,IAAI,YAAY,CAAC,eAAe,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAE9G"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { SessionError } from "../types.js";
|
|
2
|
-
import { createArraySessionReader } from "./array-session-reader.js";
|
|
3
|
-
import { readSessionEntriesForFork } from "./fork.js";
|
|
4
|
-
import { KeyedOperationQueue } from "./keyed-operation-queue.js";
|
|
5
|
-
import { createSessionId, createTimestamp } from "./repository.js";
|
|
6
|
-
class InMemorySessionStore {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.sessions = new Map();
|
|
9
|
-
this.operations = new KeyedOperationQueue();
|
|
10
|
-
this.disposed = false;
|
|
11
|
-
}
|
|
12
|
-
create(options = {}) {
|
|
13
|
-
this.assertOpen();
|
|
14
|
-
const id = options.id ?? createSessionId();
|
|
15
|
-
return this.operations.enqueue(id, () => {
|
|
16
|
-
const state = {
|
|
17
|
-
metadata: { id, createdAt: createTimestamp() },
|
|
18
|
-
entries: [],
|
|
19
|
-
};
|
|
20
|
-
this.sessions.set(state.metadata.id, state);
|
|
21
|
-
return this.reader(state);
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
load(metadata) {
|
|
25
|
-
this.assertOpen();
|
|
26
|
-
return this.operations.enqueue(metadata.id, () => this.reader(this.getState(metadata)));
|
|
27
|
-
}
|
|
28
|
-
list() {
|
|
29
|
-
this.assertOpen();
|
|
30
|
-
return this.operations.enqueueBarrier(() => [...this.sessions.values()].map((state) => state.metadata));
|
|
31
|
-
}
|
|
32
|
-
appendEntry(metadata, entry) {
|
|
33
|
-
this.assertOpen();
|
|
34
|
-
return this.operations.enqueue(metadata.id, () => {
|
|
35
|
-
const state = this.getState(metadata);
|
|
36
|
-
if (state.entries.some((existing) => existing.id === entry.id)) {
|
|
37
|
-
throw new SessionError("invalid_entry", `Entry ${entry.id} already exists`);
|
|
38
|
-
}
|
|
39
|
-
state.entries.push(entry);
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
delete(metadata) {
|
|
43
|
-
this.assertOpen();
|
|
44
|
-
return this.operations.enqueue(metadata.id, () => {
|
|
45
|
-
this.sessions.delete(metadata.id);
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
fork(source, options, selection) {
|
|
49
|
-
this.assertOpen();
|
|
50
|
-
const id = options.id ?? createSessionId();
|
|
51
|
-
const sourceEntries = this.operations.enqueue(source.id, () => {
|
|
52
|
-
const sourceState = this.getState(source);
|
|
53
|
-
return readSessionEntriesForFork(createArraySessionReader(sourceState.metadata, () => sourceState.entries), selection);
|
|
54
|
-
});
|
|
55
|
-
return this.operations.enqueue(id, async () => {
|
|
56
|
-
const state = {
|
|
57
|
-
metadata: { id, createdAt: createTimestamp() },
|
|
58
|
-
entries: [...(await sourceEntries)],
|
|
59
|
-
};
|
|
60
|
-
this.sessions.set(state.metadata.id, state);
|
|
61
|
-
return this.reader(state);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
async [Symbol.asyncDispose]() {
|
|
65
|
-
if (!this.disposePromise) {
|
|
66
|
-
this.disposed = true;
|
|
67
|
-
this.disposePromise = this.operations.drain();
|
|
68
|
-
}
|
|
69
|
-
await this.disposePromise;
|
|
70
|
-
}
|
|
71
|
-
assertOpen() {
|
|
72
|
-
if (this.disposed)
|
|
73
|
-
throw new SessionError("storage", "In-memory session store is disposed");
|
|
74
|
-
}
|
|
75
|
-
getState(metadata) {
|
|
76
|
-
const state = this.sessions.get(metadata.id);
|
|
77
|
-
if (!state)
|
|
78
|
-
throw new SessionError("not_found", `Session not found: ${metadata.id}`);
|
|
79
|
-
return state;
|
|
80
|
-
}
|
|
81
|
-
reader(state) {
|
|
82
|
-
const reader = createArraySessionReader(state.metadata, () => state.entries);
|
|
83
|
-
return {
|
|
84
|
-
metadata: reader.metadata,
|
|
85
|
-
readHead: () => {
|
|
86
|
-
this.assertOpen();
|
|
87
|
-
return this.operations.enqueue(state.metadata.id, () => reader.readHead());
|
|
88
|
-
},
|
|
89
|
-
readEntry: (id) => {
|
|
90
|
-
this.assertOpen();
|
|
91
|
-
return this.operations.enqueue(state.metadata.id, () => reader.readEntry(id));
|
|
92
|
-
},
|
|
93
|
-
readEntries: (options) => {
|
|
94
|
-
this.assertOpen();
|
|
95
|
-
return this.operations.enqueue(state.metadata.id, () => reader.readEntries(options));
|
|
96
|
-
},
|
|
97
|
-
readPathToRootOrCompaction: (leafId) => {
|
|
98
|
-
this.assertOpen();
|
|
99
|
-
return this.operations.enqueue(state.metadata.id, () => reader.readPathToRootOrCompaction(leafId));
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export function createInMemorySessionStore() {
|
|
105
|
-
return new InMemorySessionStore();
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=memory-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/harness/session/memory-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionForkSelection, SessionMetadata, SessionReader, SessionStore, SessionTreeEntry } from \"../types.ts\";\nimport { SessionError } from \"../types.ts\";\nimport { createArraySessionReader } from \"./array-session-reader.ts\";\nimport { readSessionEntriesForFork } from \"./fork.ts\";\nimport { KeyedOperationQueue } from \"./keyed-operation-queue.ts\";\nimport { createSessionId, createTimestamp } from \"./repository.ts\";\n\nexport type InMemorySessionCreateOptions = { id?: string };\n\ninterface InMemorySessionState {\n\tmetadata: SessionMetadata;\n\tentries: SessionTreeEntry[];\n}\n\nclass InMemorySessionStore implements SessionStore<SessionMetadata, InMemorySessionCreateOptions, void> {\n\tprivate readonly sessions = new Map<string, InMemorySessionState>();\n\tprivate readonly operations = new KeyedOperationQueue<string>();\n\tprivate disposed = false;\n\tprivate disposePromise: Promise<void> | undefined;\n\n\tcreate(options: InMemorySessionCreateOptions = {}): Promise<SessionReader<SessionMetadata>> {\n\t\tthis.assertOpen();\n\t\tconst id = options.id ?? createSessionId();\n\t\treturn this.operations.enqueue(id, () => {\n\t\t\tconst state: InMemorySessionState = {\n\t\t\t\tmetadata: { id, createdAt: createTimestamp() },\n\t\t\t\tentries: [],\n\t\t\t};\n\t\t\tthis.sessions.set(state.metadata.id, state);\n\t\t\treturn this.reader(state);\n\t\t});\n\t}\n\n\tload(metadata: SessionMetadata): Promise<SessionReader<SessionMetadata>> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(metadata.id, () => this.reader(this.getState(metadata)));\n\t}\n\n\tlist(): Promise<SessionMetadata[]> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueueBarrier(() => [...this.sessions.values()].map((state) => state.metadata));\n\t}\n\n\tappendEntry(metadata: SessionMetadata, entry: SessionTreeEntry): Promise<void> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(metadata.id, () => {\n\t\t\tconst state = this.getState(metadata);\n\t\t\tif (state.entries.some((existing) => existing.id === entry.id)) {\n\t\t\t\tthrow new SessionError(\"invalid_entry\", `Entry ${entry.id} already exists`);\n\t\t\t}\n\t\t\tstate.entries.push(entry);\n\t\t});\n\t}\n\n\tdelete(metadata: SessionMetadata): Promise<void> {\n\t\tthis.assertOpen();\n\t\treturn this.operations.enqueue(metadata.id, () => {\n\t\t\tthis.sessions.delete(metadata.id);\n\t\t});\n\t}\n\n\tfork(\n\t\tsource: SessionMetadata,\n\t\toptions: InMemorySessionCreateOptions,\n\t\tselection: SessionForkSelection,\n\t): Promise<SessionReader<SessionMetadata>> {\n\t\tthis.assertOpen();\n\t\tconst id = options.id ?? createSessionId();\n\t\tconst sourceEntries = this.operations.enqueue(source.id, () => {\n\t\t\tconst sourceState = this.getState(source);\n\t\t\treturn readSessionEntriesForFork(\n\t\t\t\tcreateArraySessionReader(sourceState.metadata, () => sourceState.entries),\n\t\t\t\tselection,\n\t\t\t);\n\t\t});\n\t\treturn this.operations.enqueue(id, async () => {\n\t\t\tconst state: InMemorySessionState = {\n\t\t\t\tmetadata: { id, createdAt: createTimestamp() },\n\t\t\t\tentries: [...(await sourceEntries)],\n\t\t\t};\n\t\t\tthis.sessions.set(state.metadata.id, state);\n\t\t\treturn this.reader(state);\n\t\t});\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tif (!this.disposePromise) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.disposePromise = this.operations.drain();\n\t\t}\n\t\tawait this.disposePromise;\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.disposed) throw new SessionError(\"storage\", \"In-memory session store is disposed\");\n\t}\n\n\tprivate getState(metadata: SessionMetadata): InMemorySessionState {\n\t\tconst state = this.sessions.get(metadata.id);\n\t\tif (!state) throw new SessionError(\"not_found\", `Session not found: ${metadata.id}`);\n\t\treturn state;\n\t}\n\n\tprivate reader(state: InMemorySessionState): SessionReader<SessionMetadata> {\n\t\tconst reader = createArraySessionReader(state.metadata, () => state.entries);\n\t\treturn {\n\t\t\tmetadata: reader.metadata,\n\t\t\treadHead: () => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(state.metadata.id, () => reader.readHead());\n\t\t\t},\n\t\t\treadEntry: (id) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(state.metadata.id, () => reader.readEntry(id));\n\t\t\t},\n\t\t\treadEntries: (options) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(state.metadata.id, () => reader.readEntries(options));\n\t\t\t},\n\t\t\treadPathToRootOrCompaction: (leafId) => {\n\t\t\t\tthis.assertOpen();\n\t\t\t\treturn this.operations.enqueue(state.metadata.id, () => reader.readPathToRootOrCompaction(leafId));\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport function createInMemorySessionStore(): SessionStore<SessionMetadata, InMemorySessionCreateOptions, void> {\n\treturn new InMemorySessionStore();\n}\n"]}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { type FileError, type Result, type SessionCreateOptions, type SessionForkOptions, type SessionMetadata, type SessionSearch, type SessionSearchHit, type SessionStore, type SessionTreeEntry } from "../types.ts";
|
|
2
|
-
import { type Session, type SessionContextBuildOptions } from "./session.ts";
|
|
3
|
-
export declare function createSessionId(): string;
|
|
4
|
-
export declare function createTimestamp(): string;
|
|
5
|
-
export declare class SessionRepository<TMetadata extends SessionMetadata = SessionMetadata, TCreateOptions extends SessionCreateOptions = SessionCreateOptions, TListOptions = void> {
|
|
6
|
-
private readonly store;
|
|
7
|
-
private readonly searchStore;
|
|
8
|
-
private readonly contextBuildOptions;
|
|
9
|
-
constructor(options: {
|
|
10
|
-
store: SessionStore<TMetadata, TCreateOptions, TListOptions>;
|
|
11
|
-
search?: SessionSearch<TMetadata> | null;
|
|
12
|
-
contextBuildOptions?: SessionContextBuildOptions;
|
|
13
|
-
});
|
|
14
|
-
create(options: TCreateOptions): Promise<Session<TMetadata>>;
|
|
15
|
-
open(metadata: TMetadata): Promise<Session<TMetadata>>;
|
|
16
|
-
list(options?: TListOptions): Promise<TMetadata[]>;
|
|
17
|
-
delete(metadata: TMetadata): Promise<void>;
|
|
18
|
-
fork(source: TMetadata, options: SessionForkOptions & TCreateOptions): Promise<Session<TMetadata>>;
|
|
19
|
-
search(options: Parameters<SessionSearch<TMetadata>["search"]>[0]): Promise<SessionSearchHit<TMetadata>[]>;
|
|
20
|
-
}
|
|
21
|
-
export declare function createSessionRepository<TMetadata extends SessionMetadata = SessionMetadata, TCreateOptions extends SessionCreateOptions = SessionCreateOptions, TListOptions = void>(options: {
|
|
22
|
-
store: SessionStore<TMetadata, TCreateOptions, TListOptions>;
|
|
23
|
-
search?: SessionSearch<TMetadata> | null;
|
|
24
|
-
contextBuildOptions?: SessionContextBuildOptions;
|
|
25
|
-
}): SessionRepository<TMetadata, TCreateOptions, TListOptions>;
|
|
26
|
-
export declare function findSessionEntryMatches<TMetadata extends SessionMetadata>(metadata: TMetadata, entries: readonly SessionTreeEntry[], text: string): SessionSearchHit<TMetadata>[];
|
|
27
|
-
export declare function getFileSystemResultOrThrow<TValue>(result: Result<TValue, FileError>, message: string): TValue;
|
|
28
|
-
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/harness/session/repository.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAEtG,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,qBAAa,iBAAiB,CAC7B,SAAS,SAAS,eAAe,GAAG,eAAe,EACnD,cAAc,SAAS,oBAAoB,GAAG,oBAAoB,EAClE,YAAY,GAAG,IAAI;IAEnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IAEjE,YAAY,OAAO,EAAE;QACpB,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACzC,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;KACjD,EAIA;IAEK,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAEjE;IAEK,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAE3D;IAEK,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAEvD;IAEK,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;IAEK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,GAAG,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAUvG;IAEK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,CAE/G;CACD;AAED,wBAAgB,uBAAuB,CACtC,SAAS,SAAS,eAAe,GAAG,eAAe,EACnD,cAAc,SAAS,oBAAoB,GAAG,oBAAoB,EAClE,YAAY,GAAG,IAAI,EAClB,OAAO,EAAE;IACV,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,0BAA0B,CAAC;CACjD,GAAG,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAE7D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,SAAS,eAAe,EACxE,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,IAAI,EAAE,MAAM,GACV,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAQ/B;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAM7G"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { uuidv7 } from "@earendil-works/pi-ai";
|
|
2
|
-
import { SessionError, } from "../types.js";
|
|
3
|
-
import { createSessionForkSelection } from "./fork.js";
|
|
4
|
-
import { createSessionFromReader } from "./session.js";
|
|
5
|
-
export function createSessionId() {
|
|
6
|
-
return uuidv7();
|
|
7
|
-
}
|
|
8
|
-
export function createTimestamp() {
|
|
9
|
-
return new Date().toISOString();
|
|
10
|
-
}
|
|
11
|
-
export class SessionRepository {
|
|
12
|
-
constructor(options) {
|
|
13
|
-
this.store = options.store;
|
|
14
|
-
this.searchStore = options.search ?? null;
|
|
15
|
-
this.contextBuildOptions = options.contextBuildOptions ?? {};
|
|
16
|
-
}
|
|
17
|
-
async create(options) {
|
|
18
|
-
return createSessionFromReader(this.store, await this.store.create(options), this.contextBuildOptions);
|
|
19
|
-
}
|
|
20
|
-
async open(metadata) {
|
|
21
|
-
return createSessionFromReader(this.store, await this.store.load(metadata), this.contextBuildOptions);
|
|
22
|
-
}
|
|
23
|
-
async list(options) {
|
|
24
|
-
return await this.store.list(options);
|
|
25
|
-
}
|
|
26
|
-
async delete(metadata) {
|
|
27
|
-
await this.store.delete(metadata);
|
|
28
|
-
}
|
|
29
|
-
async fork(source, options) {
|
|
30
|
-
const selection = createSessionForkSelection(options);
|
|
31
|
-
const createOptions = { ...options };
|
|
32
|
-
delete createOptions.entryId;
|
|
33
|
-
delete createOptions.position;
|
|
34
|
-
return createSessionFromReader(this.store, await this.store.fork(source, createOptions, selection), this.contextBuildOptions);
|
|
35
|
-
}
|
|
36
|
-
async search(options) {
|
|
37
|
-
return this.searchStore ? await this.searchStore.search(options) : [];
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export function createSessionRepository(options) {
|
|
41
|
-
return new SessionRepository(options);
|
|
42
|
-
}
|
|
43
|
-
export function findSessionEntryMatches(metadata, entries, text) {
|
|
44
|
-
const normalizedText = text.trim().toLowerCase();
|
|
45
|
-
if (!normalizedText)
|
|
46
|
-
return [];
|
|
47
|
-
return entries.flatMap((entry) => {
|
|
48
|
-
const payload = JSON.stringify(entry);
|
|
49
|
-
if (!payload.toLowerCase().includes(normalizedText))
|
|
50
|
-
return [];
|
|
51
|
-
return [{ metadata, entryId: entry.id, timestamp: entry.timestamp, snippet: payload }];
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
export function getFileSystemResultOrThrow(result, message) {
|
|
55
|
-
if (!result.ok) {
|
|
56
|
-
const code = result.error.code === "not_found" ? "not_found" : "storage";
|
|
57
|
-
throw new SessionError(code, `${message}: ${result.error.message}`, result.error);
|
|
58
|
-
}
|
|
59
|
-
return result.value;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/harness/session/repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { uuidv7 } from \"@earendil-works/pi-ai\";\nimport {\n\ttype FileError,\n\ttype Result,\n\ttype SessionCreateOptions,\n\tSessionError,\n\ttype SessionForkOptions,\n\ttype SessionMetadata,\n\ttype SessionSearch,\n\ttype SessionSearchHit,\n\ttype SessionStore,\n\ttype SessionTreeEntry,\n} from \"../types.ts\";\nimport { createSessionForkSelection } from \"./fork.ts\";\nimport { createSessionFromReader, type Session, type SessionContextBuildOptions } from \"./session.ts\";\n\nexport function createSessionId(): string {\n\treturn uuidv7();\n}\n\nexport function createTimestamp(): string {\n\treturn new Date().toISOString();\n}\n\nexport class SessionRepository<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends SessionCreateOptions = SessionCreateOptions,\n\tTListOptions = void,\n> {\n\tprivate readonly store: SessionStore<TMetadata, TCreateOptions, TListOptions>;\n\tprivate readonly searchStore: SessionSearch<TMetadata> | null;\n\tprivate readonly contextBuildOptions: SessionContextBuildOptions;\n\n\tconstructor(options: {\n\t\tstore: SessionStore<TMetadata, TCreateOptions, TListOptions>;\n\t\tsearch?: SessionSearch<TMetadata> | null;\n\t\tcontextBuildOptions?: SessionContextBuildOptions;\n\t}) {\n\t\tthis.store = options.store;\n\t\tthis.searchStore = options.search ?? null;\n\t\tthis.contextBuildOptions = options.contextBuildOptions ?? {};\n\t}\n\n\tasync create(options: TCreateOptions): Promise<Session<TMetadata>> {\n\t\treturn createSessionFromReader(this.store, await this.store.create(options), this.contextBuildOptions);\n\t}\n\n\tasync open(metadata: TMetadata): Promise<Session<TMetadata>> {\n\t\treturn createSessionFromReader(this.store, await this.store.load(metadata), this.contextBuildOptions);\n\t}\n\n\tasync list(options?: TListOptions): Promise<TMetadata[]> {\n\t\treturn await this.store.list(options);\n\t}\n\n\tasync delete(metadata: TMetadata): Promise<void> {\n\t\tawait this.store.delete(metadata);\n\t}\n\n\tasync fork(source: TMetadata, options: SessionForkOptions & TCreateOptions): Promise<Session<TMetadata>> {\n\t\tconst selection = createSessionForkSelection(options);\n\t\tconst createOptions = { ...options };\n\t\tdelete createOptions.entryId;\n\t\tdelete createOptions.position;\n\t\treturn createSessionFromReader(\n\t\t\tthis.store,\n\t\t\tawait this.store.fork(source, createOptions, selection),\n\t\t\tthis.contextBuildOptions,\n\t\t);\n\t}\n\n\tasync search(options: Parameters<SessionSearch<TMetadata>[\"search\"]>[0]): Promise<SessionSearchHit<TMetadata>[]> {\n\t\treturn this.searchStore ? await this.searchStore.search(options) : [];\n\t}\n}\n\nexport function createSessionRepository<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends SessionCreateOptions = SessionCreateOptions,\n\tTListOptions = void,\n>(options: {\n\tstore: SessionStore<TMetadata, TCreateOptions, TListOptions>;\n\tsearch?: SessionSearch<TMetadata> | null;\n\tcontextBuildOptions?: SessionContextBuildOptions;\n}): SessionRepository<TMetadata, TCreateOptions, TListOptions> {\n\treturn new SessionRepository(options);\n}\n\nexport function findSessionEntryMatches<TMetadata extends SessionMetadata>(\n\tmetadata: TMetadata,\n\tentries: readonly SessionTreeEntry[],\n\ttext: string,\n): SessionSearchHit<TMetadata>[] {\n\tconst normalizedText = text.trim().toLowerCase();\n\tif (!normalizedText) return [];\n\treturn entries.flatMap((entry) => {\n\t\tconst payload = JSON.stringify(entry);\n\t\tif (!payload.toLowerCase().includes(normalizedText)) return [];\n\t\treturn [{ metadata, entryId: entry.id, timestamp: entry.timestamp, snippet: payload }];\n\t});\n}\n\nexport function getFileSystemResultOrThrow<TValue>(result: Result<TValue, FileError>, message: string): TValue {\n\tif (!result.ok) {\n\t\tconst code = result.error.code === \"not_found\" ? \"not_found\" : \"storage\";\n\t\tthrow new SessionError(code, `${message}: ${result.error.message}`, result.error);\n\t}\n\treturn result.value;\n}\n"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { SessionMetadata, SessionReader, SessionSearch } from "../types.ts";
|
|
2
|
-
type SessionSearchSource<TMetadata extends SessionMetadata> = {
|
|
3
|
-
load(metadata: TMetadata): Promise<SessionReader<TMetadata>>;
|
|
4
|
-
list(): Promise<TMetadata[]>;
|
|
5
|
-
};
|
|
6
|
-
export declare function createScanningSessionSearch<TMetadata extends SessionMetadata>(source: SessionSearchSource<TMetadata>): SessionSearch<TMetadata>;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=search-backend.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-backend.d.ts","sourceRoot":"","sources":["../../../src/harness/session/search-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,aAAa,EACb,aAAa,EAGb,MAAM,aAAa,CAAC;AAGrB,KAAK,mBAAmB,CAAC,SAAS,SAAS,eAAe,IAAI;IAC7D,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC7B,CAAC;AAsBF,wBAAgB,2BAA2B,CAAC,SAAS,SAAS,eAAe,EAC5E,MAAM,EAAE,mBAAmB,CAAC,SAAS,CAAC,GACpC,aAAa,CAAC,SAAS,CAAC,CAE1B"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { findSessionEntryMatches } from "./repository.js";
|
|
2
|
-
/** Searches canonical sessions directly and therefore has no index to maintain. */
|
|
3
|
-
class ScanningSessionSearch {
|
|
4
|
-
constructor(source) {
|
|
5
|
-
this.source = source;
|
|
6
|
-
}
|
|
7
|
-
async search(options) {
|
|
8
|
-
const hits = [];
|
|
9
|
-
for (const metadata of await this.source.list()) {
|
|
10
|
-
const cwd = metadata.cwd;
|
|
11
|
-
if (options.cwd !== undefined && cwd !== options.cwd)
|
|
12
|
-
continue;
|
|
13
|
-
const reader = await this.source.load(metadata);
|
|
14
|
-
hits.push(...findSessionEntryMatches(reader.metadata, await reader.readEntries(), options.text));
|
|
15
|
-
}
|
|
16
|
-
return hits;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export function createScanningSessionSearch(source) {
|
|
20
|
-
return new ScanningSessionSearch(source);
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=search-backend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-backend.js","sourceRoot":"","sources":["../../../src/harness/session/search-backend.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAO1D,mFAAmF;AACnF,MAAM,qBAAqB;IAG1B,YAAY,MAAsC;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA6B;QACzC,MAAM,IAAI,GAAkC,EAAE,CAAC;QAC/C,KAAK,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,GAAG,GAAI,QAA8B,CAAC,GAAG,CAAC;YAChD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,SAAS;YAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAClG,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED,MAAM,UAAU,2BAA2B,CAC1C,MAAsC;IAEtC,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import type {\n\tSessionMetadata,\n\tSessionReader,\n\tSessionSearch,\n\tSessionSearchHit,\n\tSessionSearchOptions,\n} from \"../types.ts\";\nimport { findSessionEntryMatches } from \"./repository.ts\";\n\ntype SessionSearchSource<TMetadata extends SessionMetadata> = {\n\tload(metadata: TMetadata): Promise<SessionReader<TMetadata>>;\n\tlist(): Promise<TMetadata[]>;\n};\n\n/** Searches canonical sessions directly and therefore has no index to maintain. */\nclass ScanningSessionSearch<TMetadata extends SessionMetadata = SessionMetadata> implements SessionSearch<TMetadata> {\n\tprivate readonly source: SessionSearchSource<TMetadata>;\n\n\tconstructor(source: SessionSearchSource<TMetadata>) {\n\t\tthis.source = source;\n\t}\n\n\tasync search(options: SessionSearchOptions): Promise<SessionSearchHit<TMetadata>[]> {\n\t\tconst hits: SessionSearchHit<TMetadata>[] = [];\n\t\tfor (const metadata of await this.source.list()) {\n\t\t\tconst cwd = (metadata as { cwd?: unknown }).cwd;\n\t\t\tif (options.cwd !== undefined && cwd !== options.cwd) continue;\n\t\t\tconst reader = await this.source.load(metadata);\n\t\t\thits.push(...findSessionEntryMatches(reader.metadata, await reader.readEntries(), options.text));\n\t\t}\n\t\treturn hits;\n\t}\n}\n\nexport function createScanningSessionSearch<TMetadata extends SessionMetadata>(\n\tsource: SessionSearchSource<TMetadata>,\n): SessionSearch<TMetadata> {\n\treturn new ScanningSessionSearch(source);\n}\n"]}
|