@geminixiang/mikan 1.0.0-beta.47 → 1.0.0-beta.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/cli/boot.js +1 -1
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/sessions.d.ts.map +1 -1
- package/dist/cli/sessions.js +18 -13
- package/dist/cli/sessions.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +2 -2
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session-store.d.ts +3 -45
- package/dist/harness/session-store.d.ts.map +1 -1
- package/dist/harness/session-store.js +296 -198
- package/dist/harness/session-store.js.map +1 -1
- package/dist/harness/types.d.ts +9 -5
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/sessions/migrate-pi-084.d.ts +8 -0
- package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
- package/dist/sessions/migrate-pi-084.js +353 -0
- package/dist/sessions/migrate-pi-084.js.map +1 -0
- package/dist/sessions/migrate-v3.d.ts +0 -5
- package/dist/sessions/migrate-v3.d.ts.map +1 -1
- package/dist/sessions/migrate-v3.js +129 -51
- package/dist/sessions/migrate-v3.js.map +1 -1
- package/dist/sessions/types.d.ts +6 -1
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/web/session-view/portal.js +0 -16
- package/dist/web/session-view/portal.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/harness/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mikan-owned session storage facade over pi-agent-core's v4 sessions.\n *\n * Sessions are pi v4 JSONL files: a `{\"kind\":\"header\",\"version\":4,...}` line\n * followed by mutation lines (entries, lane pointers, facts, lane records).\n * pi's `Session`/`JsonlSessionStorage` own the format, tree validation, and\n * torn-tail repair; this facade owns mikan's concerns only: session files\n * live at mikan-chosen paths (session-key layout), mikan header extras ride\n * in the v4 header `metadata`, and a missing file behaves as an empty\n * session whose header materializes on the first append.\n *\n * v3 files (the pre-0.84 layout) are not readable at runtime: `open` throws\n * an actionable error pointing at the `mikan sessions migrate` script.\n */\nimport {\n closeSync,\n existsSync,\n fstatSync,\n ftruncateSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readFileSync,\n readSync,\n realpathSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport {\n buildSessionContext as buildContextFromEntries,\n createCustomMessage,\n InMemorySessionStorage,\n JsonlSessionRepo,\n Session,\n uuidv7,\n} from \"@earendil-works/pi-agent-core\";\nimport type {\n AgentMessage,\n Entry,\n JsonlSessionMetadata,\n JsonlV4Header,\n} from \"@earendil-works/pi-agent-core\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-agent-core/node\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { atomicWritePrivateFile } from \"../utils/file-guards.js\";\nimport {\n CURRENT_SESSION_VERSION,\n type SessionContext,\n type SessionCreateInfo,\n type SessionHeader,\n type SessionInspection,\n} from \"./types.js\";\n\n/** Live writer claims: lease key → canonical path it was claimed for. */\nconst activeWriterKeys = new Map<string, string>();\n\nfunction canonicalSessionPath(path: string): string {\n const absolute = resolve(path);\n if (existsSync(absolute)) return realpathSync(absolute);\n const parent = dirname(absolute);\n mkdirSync(parent, { recursive: true });\n return join(realpathSync(parent), basename(absolute));\n}\n\nfunction sessionWriterKey(path: string): string {\n if (!existsSync(path)) return `path:${path}`;\n const stat = statSync(path);\n // birthtime disambiguates a deleted-and-recreated file that received the\n // same reused inode (same path or not). Filesystems without birthtime\n // report 0 and fall back to dev:ino alone.\n return `inode:${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;\n}\n\n/**\n * A claim is stale when the file it was taken for no longer resolves to the\n * claimed identity — deleted or replaced since. Filesystems reuse inodes, so\n * without this check a leaked claim for a deleted file would block an\n * unrelated new file that happens to receive the same dev:ino.\n */\nfunction isStaleClaim(key: string, claimedPath: string): boolean {\n // Pending (`path:`) claims guard a file that legitimately does not exist\n // yet, so absence proves nothing; they are never stale.\n if (!key.startsWith(\"inode:\")) return false;\n return sessionWriterKey(claimedPath) !== key;\n}\n\nfunction claimWriter(key: string, path: string): void {\n const claimedPath = activeWriterKeys.get(key);\n if (claimedPath !== undefined && !isStaleClaim(key, claimedPath)) {\n throw new Error(`Session file already has an active writer: ${path}`);\n }\n activeWriterKeys.set(key, path);\n}\n\nfunction acquireWriter(path: string): { path: string; key: string } {\n const canonical = canonicalSessionPath(path);\n const key = sessionWriterKey(canonical);\n claimWriter(key, canonical);\n return { path: canonical, key };\n}\n\nfunction releaseWriter(key: string): void {\n activeWriterKeys.delete(key);\n}\n\nfunction promotePendingWriter(pathKey: string, path: string): string {\n const inodeKey = sessionWriterKey(path);\n if (inodeKey === pathKey) return pathKey;\n claimWriter(inodeKey, path);\n activeWriterKeys.delete(pathKey);\n return inodeKey;\n}\n\nlet sharedRepo: JsonlSessionRepo | undefined;\n\n/**\n * Drop undefined-valued properties before durable persistence. pi's agent\n * loop builds messages with explicit `details: undefined` / `usage: undefined`\n * (e.g. tool results from tools that return only `content`), which pi's own\n * v4 durable-payload validator rejects; persistence is a value boundary, so\n * a JSON round-trip matches the validator's semantics exactly.\n */\nfunction toDurable<T>(value: T): T {\n return value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T);\n}\n\nfunction repo(): JsonlSessionRepo {\n // The repo is only used to open sessions at explicit paths; its\n // sessionsRoot layout is never consulted, so one shared instance is fine.\n sharedRepo ??= new JsonlSessionRepo({\n fs: new NodeExecutionEnv({ cwd: process.cwd() }),\n sessionsRoot: process.cwd(),\n });\n return sharedRepo;\n}\n\nclass SessionFormatError extends Error {}\n\nconst HEADER_CHUNK_SIZE = 4096;\nconst MAX_HEADER_BYTES = 1024 * 1024;\n\n/** Read only the first JSONL line rather than loading the complete session. */\nfunction readHeaderLine(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (total < MAX_HEADER_BYTES) {\n const chunk = Buffer.allocUnsafe(Math.min(HEADER_CHUNK_SIZE, MAX_HEADER_BYTES - total));\n const bytesRead = readSync(fd, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n const data = chunk.subarray(0, bytesRead);\n const newline = data.indexOf(0x0a);\n chunks.push(newline < 0 ? data : data.subarray(0, newline));\n total += newline < 0 ? bytesRead : newline;\n if (newline >= 0) break;\n }\n } finally {\n closeSync(fd);\n }\n if (total >= MAX_HEADER_BYTES) {\n throw new SessionFormatError(\n `Session file header exceeds ${MAX_HEADER_BYTES} bytes: ${filePath}`,\n );\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\n/** Parse the first line of a session file into a v4 header, or explain why not. */\nfunction parseV4Header(filePath: string, firstLine: string): JsonlV4Header {\n firstLine = firstLine.trim();\n if (!firstLine) throw new SessionFormatError(`Session file has a blank header line: ${filePath}`);\n let parsed: unknown;\n try {\n parsed = JSON.parse(firstLine);\n } catch {\n throw new SessionFormatError(`Session file header is not valid JSON: ${filePath}`);\n }\n const record = parsed as {\n kind?: unknown;\n type?: unknown;\n version?: unknown;\n id?: unknown;\n };\n if (record.type === \"session\") {\n throw new SessionFormatError(\n `Session file uses the legacy v3 format: ${filePath}. Run \\`mikan sessions migrate\\` before starting this mikan version.`,\n );\n }\n if (record.kind !== \"header\" || record.version !== 4 || typeof record.id !== \"string\") {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n return parsed as JsonlV4Header;\n}\n\nfunction metadataFromHeader(header: JsonlV4Header, path: string): JsonlSessionMetadata {\n return {\n id: header.id,\n createdAt: header.createdAt,\n cwd: header.cwd,\n path,\n modifiedAt: 0,\n sourceFormat: 4,\n ...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n ...(header.legacyParentSessionPath !== undefined\n ? { legacyParentSessionPath: header.legacyParentSessionPath }\n : {}),\n ...(header.metadata !== undefined ? { metadata: header.metadata } : {}),\n };\n}\n\nfunction fileFingerprint(path: string): string {\n const bytes = readFileSync(path);\n const fd = openSync(path, \"r\");\n try {\n const stat = fstatSync(fd);\n return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${bytes.toString(\"base64\")}`;\n } finally {\n closeSync(fd);\n }\n}\n\nfunction materializePendingFile(\n path: string,\n header: JsonlV4Header,\n expectedFingerprint: string | null,\n): void {\n const content = `${JSON.stringify(header)}\\n`;\n if (expectedFingerprint === null) {\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n return;\n }\n\n const fd = openSync(path, \"r+\");\n try {\n const stat = fstatSync(fd);\n const bytes = Buffer.alloc(stat.size);\n readSync(fd, bytes, 0, bytes.length, 0);\n const actual = `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${bytes.toString(\"base64\")}`;\n if (actual !== expectedFingerprint) {\n throw new Error(`Session file changed before pending session materialization: ${path}`);\n }\n ftruncateSync(fd, 0);\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction buildHeader(cwd: string, options?: SessionCreateInfo): JsonlV4Header {\n return {\n kind: \"header\",\n version: 4,\n id: options?.id ?? uuidv7(),\n createdAt: Date.now(),\n cwd,\n ...(options?.parentSessionId !== undefined ? { parentSessionId: options.parentSessionId } : {}),\n // The v3 parent *path* has no dedicated v4 slot when the id is known;\n // preserve it in metadata so lineage debugging keeps working.\n ...(options?.parentSession !== undefined\n ? { metadata: { parentSessionPath: options.parentSession } }\n : {}),\n };\n}\n\nfunction headerView(header: JsonlV4Header): SessionHeader {\n const metadata = header.metadata as Record<string, unknown> | undefined;\n return {\n type: \"session\",\n version: CURRENT_SESSION_VERSION,\n id: header.id,\n timestamp: new Date(header.createdAt).toISOString(),\n cwd: header.cwd,\n ...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n ...(typeof metadata?.parentSessionPath === \"string\"\n ? { parentSession: metadata.parentSessionPath }\n : {}),\n ...(header.legacyParentSessionPath !== undefined && metadata?.parentSessionPath === undefined\n ? { parentSession: header.legacyParentSessionPath }\n : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n };\n}\n\ntype StoreState =\n | { kind: \"live\"; session: Session; header: JsonlV4Header }\n | { kind: \"pending\"; header: JsonlV4Header; fingerprint: string | null };\n\nclass ReadOnlySessionInspection implements SessionInspection {\n constructor(\n private readonly header: JsonlV4Header,\n private readonly session: Session,\n ) {}\n\n getHeader(): SessionHeader {\n return headerView(this.header);\n }\n\n async getEntries(): Promise<Entry[]> {\n return this.session.findEntries({ order: \"oldestFirst\" });\n }\n\n async getSessionName(): Promise<string | undefined> {\n return this.session.getName();\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n return this.session.findEntriesOnBranch({\n order: \"oldestFirst\",\n ...(fromId !== undefined ? { start: fromId } : {}),\n });\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return buildContextFromEntries(await this.getBranch());\n }\n}\n\n/**\n * Async session store over one pi v4 JSONL file at a mikan-chosen path.\n *\n * A missing or empty file opens as an empty session; the header (and file)\n * materialize on the first append. Files with content must carry a valid\n * v4 header — v3 files throw with a pointer at the migration script.\n */\nexport class SessionStore implements SessionInspection {\n private readonly sessionFile: string | null;\n private readonly cwd: string;\n private writerKey: string | null;\n private state: StoreState;\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n\n private constructor(\n sessionFile: string | null,\n cwd: string,\n state: StoreState,\n writerKey: string | null,\n ) {\n this.sessionFile = sessionFile;\n this.cwd = cwd;\n this.state = state;\n this.writerKey = writerKey;\n }\n\n /**\n * Open a session file. Missing and empty files start an empty session\n * whose header is written on the first append.\n * @param cwdOverride Working directory override; defaults to the header cwd.\n */\n static async open(path: string, cwdOverride?: string): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n try {\n if (!existsSync(writerPath)) {\n const cwd = cwdOverride ?? process.cwd();\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", header: buildHeader(cwd), fingerprint: null },\n writer.key,\n );\n }\n const firstLine = readHeaderLine(writerPath);\n if (firstLine.trim().length === 0) {\n const cwd = cwdOverride ?? process.cwd();\n return new SessionStore(\n writerPath,\n cwd,\n {\n kind: \"pending\",\n header: buildHeader(cwd),\n fingerprint: fileFingerprint(writerPath),\n },\n writer.key,\n );\n }\n const header = parseV4Header(writerPath, firstLine);\n const session = await repo().open(metadataFromHeader(header, writerPath));\n return new SessionStore(\n writerPath,\n cwdOverride ?? header.cwd,\n { kind: \"live\", session, header },\n writer.key,\n );\n } catch (error) {\n releaseWriter(writer.key);\n throw error;\n }\n }\n\n /** Open an immutable inspection handle that does not acquire a writer lease. */\n static async inspect(path: string): Promise<SessionInspection> {\n const resolvedPath = canonicalSessionPath(path);\n const snapshotDir = mkdtempSync(join(tmpdir(), \"mikan-session-inspect-\"));\n const snapshotPath = join(snapshotDir, basename(resolvedPath));\n try {\n writeFileSync(snapshotPath, readFileSync(resolvedPath), { mode: 0o600, flag: \"wx\" });\n const firstLine = readHeaderLine(snapshotPath);\n const header = parseV4Header(resolvedPath, firstLine);\n const session = await repo().open(metadataFromHeader(header, snapshotPath));\n return new ReadOnlySessionInspection(header, session);\n } finally {\n rmSync(snapshotDir, { recursive: true, force: true });\n }\n }\n\n /** Create a new session file exclusively; existing content is never replaced. */\n static async create(\n path: string,\n cwd: string,\n options?: SessionCreateInfo,\n ): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n let leaseKey = writer.key;\n try {\n const header = buildHeader(cwd, options);\n writeFileSync(writerPath, `${JSON.stringify(header)}\\n`, { mode: 0o600, flag: \"wx\" });\n leaseKey = promotePendingWriter(leaseKey, writerPath);\n const session = await repo().open(metadataFromHeader(header, writerPath));\n return new SessionStore(writerPath, cwd, { kind: \"live\", session, header }, leaseKey);\n } catch (error) {\n releaseWriter(leaseKey);\n throw error;\n }\n }\n\n /**\n * Synchronously read a session file's header without opening the session.\n * Returns null for missing, empty, or unreadable files; throws only for\n * v3 files so callers surface the migration requirement.\n */\n static readHeader(path: string): SessionHeader | null {\n let firstLine: string;\n try {\n firstLine = readHeaderLine(path);\n } catch {\n return null;\n }\n if (firstLine.trim().length === 0) return null;\n try {\n return headerView(parseV4Header(path, firstLine));\n } catch (error) {\n if (error instanceof SessionFormatError && /legacy v3/.test(error.message)) throw error;\n return null;\n }\n }\n\n /**\n * Synchronously write a fresh header-only session file, replacing any\n * existing file. The session is opened later via {@link SessionStore.open}.\n */\n static writeHeaderFile(path: string, cwd: string, options?: SessionCreateInfo): void {\n mkdirSync(dirname(path), { recursive: true });\n atomicWritePrivateFile(path, `${JSON.stringify(buildHeader(cwd, options))}\\n`);\n }\n\n /** Create an ephemeral session that never writes a session file. */\n static inMemory(cwd = process.cwd()): SessionStore {\n const header = buildHeader(cwd);\n const storage = new InMemorySessionStorage({\n id: header.id,\n createdAt: header.createdAt,\n });\n const session = new Session(storage);\n return new SessionStore(null, cwd, { kind: \"live\", session, header }, null);\n }\n\n getSessionFile(): string | undefined {\n this.assertOpen();\n return this.sessionFile ?? undefined;\n }\n\n isPersisted(): boolean {\n this.assertOpen();\n return this.sessionFile !== null;\n }\n\n getCwd(): string {\n this.assertOpen();\n return this.cwd;\n }\n\n /** Compatibility header view for callers that read mikan session lineage. */\n getHeader(): SessionHeader {\n this.assertOpen();\n return headerView(this.state.header);\n }\n\n /** Stable session id: the header id, or a generated id for fresh sessions. */\n getSessionId(): string {\n this.assertOpen();\n return this.state.header.id;\n }\n\n async getLeafId(): Promise<string | null> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return null;\n return this.state.session.getLeafId();\n }\n\n async getEntry(id: string): Promise<Entry | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getEntry(id);\n }\n\n /** All session entries in append order. */\n async getEntries(): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n return this.state.session.findEntries({ order: \"oldestFirst\" });\n }\n\n /** Latest user-assigned session name, if any. */\n async getSessionName(): Promise<string | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getName();\n }\n\n /**\n * Walk from an entry to the root, returning entries in path order\n * (root first). Defaults to the current leaf.\n */\n async getBranch(fromId?: string): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n return this.state.session.findEntriesOnBranch({\n order: \"oldestFirst\",\n ...(fromId !== undefined ? { start: fromId } : {}),\n });\n }\n\n /**\n * Build the LLM context (messages, thinking level, model) from the current\n * branch, resolving compaction and branch summaries along the path.\n */\n async buildSessionContext(): Promise<SessionContext> {\n this.assertOpen();\n return buildContextFromEntries(await this.getBranch());\n }\n\n /** Append a chat message as a child of the current leaf. Returns the entry id. */\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => (await this.live()).appendMessage(toDurable(message)));\n }\n\n /** Append a custom application data entry (never sent to the LLM). */\n async appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n return this.mutate(async () =>\n (await this.live()).appendCustomEntry(customType, toDurable(data)),\n );\n }\n\n /** Append a custom message that participates in LLM context. */\n async appendCustomMessageEntry(\n customType: string,\n content: string | (TextContent | ImageContent)[],\n display: boolean,\n details?: unknown,\n ): Promise<string> {\n return this.mutate(async () =>\n (await this.live()).appendMessage(\n toDurable(createCustomMessage(customType, content, display, details, Date.now())),\n ),\n );\n }\n\n /** Record a user-visible session name. */\n async setSessionName(name: string): Promise<void> {\n await this.mutate(async () => (await this.live()).setName(name.trim() || undefined));\n }\n\n /** Persist a compaction summary produced for this session. */\n async appendCompaction(\n summary: string,\n retainedTail: AgentMessage[],\n tokensBefore: number,\n details?: unknown,\n ): Promise<string> {\n return this.mutate(async () => {\n const session = await this.live();\n const entry = await session.appendEntry(\n {\n type: \"compaction\",\n id: session.idGenerator.next(),\n summary,\n retainedTail: toDurable(retainedTail),\n tokensBefore,\n ...(details !== undefined ? { details: toDurable(details) } : {}),\n },\n \"main\",\n );\n return entry.id;\n });\n }\n\n async close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n this.closePromise = this.mutationTail.finally(() => {\n if (this.writerKey !== null) releaseWriter(this.writerKey);\n });\n return this.closePromise;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"SessionStore is closed\");\n }\n\n private mutate<T>(operation: () => Promise<T>): Promise<T> {\n this.assertOpen();\n const result = this.mutationTail.then(operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n /** Materialize the session file (when persisted) and return the live session. */\n private async live(): Promise<Session> {\n if (this.state.kind === \"live\") return this.state.session;\n const pending = this.state;\n const header = pending.header;\n const sessionFile = this.sessionFile;\n if (sessionFile === null) throw new Error(\"Pending session must have a session file\");\n materializePendingFile(sessionFile, header, pending.fingerprint);\n if (this.writerKey === null) throw new Error(\"Pending session must have a writer lease\");\n this.writerKey = promotePendingWriter(this.writerKey, sessionFile);\n const session = await repo().open(metadataFromHeader(header, sessionFile));\n this.state = { kind: \"live\", session, header };\n return session;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/harness/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * mikan-owned facade over Pi's current JSONL v4 SessionRepo.\n *\n * Pi owns entry, branch, value, transaction, and storage validation. mikan\n * owns exact file paths, single-writer leases, lazy materialization, lineage\n * metadata, and the stable inspection API consumed by platform runtimes.\n * Older session generations are rejected and converted only by the offline\n * `mikan sessions migrate` command.\n */\nimport {\n closeSync,\n existsSync,\n fstatSync,\n ftruncateSync,\n mkdirSync,\n mkdtempSync,\n openSync,\n readFileSync,\n readSync,\n realpathSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport {\n branchTip,\n createBranchSummaryMessage,\n createCompactionSummaryMessage,\n createCustomMessage,\n insertEntry,\n JsonlSessionRepo,\n MemorySessionRepo,\n setValue,\n TODO_CONTEXT,\n uuidv7,\n value,\n} from \"@earendil-works/pi-agent-core\";\nimport type {\n AgentMessage,\n Branch,\n Entry,\n JsonlSessionMetadata,\n JsonValue,\n Session,\n} from \"@earendil-works/pi-agent-core\";\nimport { NodeExecutionEnv } from \"@earendil-works/pi-agent-core/node\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport { atomicWritePrivateFile } from \"../utils/file-guards.js\";\nimport type {\n SessionContext,\n SessionCreateInfo,\n SessionHeader,\n SessionInspection,\n} from \"./types.js\";\nimport { CURRENT_SESSION_VERSION } from \"./types.js\";\n\ninterface CurrentSessionHeader {\n v: 4;\n kind: \"header\";\n id: string;\n storageVersion: number;\n createdAt: number;\n cwd: string;\n parentSessionId?: string;\n legacyParentSessionPath?: string;\n nextSeq?: number;\n}\n\ntype MikanSessionMetadata = Record<string, JsonValue>;\n\nconst MIKAN_METADATA = value<MikanSessionMetadata>(\"mikan\", \"metadata\");\nconst activeWriterKeys = new Map<string, string>();\n\nfunction canonicalSessionPath(path: string): string {\n const absolute = resolve(path);\n if (existsSync(absolute)) return realpathSync(absolute);\n const parent = dirname(absolute);\n mkdirSync(parent, { recursive: true });\n return join(realpathSync(parent), basename(absolute));\n}\n\nfunction sessionWriterKey(path: string): string {\n if (!existsSync(path)) return `path:${path}`;\n const stats = statSync(path);\n return `inode:${stats.dev}:${stats.ino}:${stats.birthtimeMs}`;\n}\n\nfunction isStaleClaim(key: string, claimedPath: string): boolean {\n if (!key.startsWith(\"inode:\")) return false;\n return sessionWriterKey(claimedPath) !== key;\n}\n\nfunction claimWriter(key: string, path: string): void {\n const claimedPath = activeWriterKeys.get(key);\n if (claimedPath !== undefined && !isStaleClaim(key, claimedPath)) {\n throw new Error(`Session file already has an active writer: ${path}`);\n }\n activeWriterKeys.set(key, path);\n}\n\nfunction acquireWriter(path: string): { path: string; key: string } {\n const canonical = canonicalSessionPath(path);\n const key = sessionWriterKey(canonical);\n claimWriter(key, canonical);\n return { path: canonical, key };\n}\n\nfunction releaseWriter(key: string): void {\n activeWriterKeys.delete(key);\n}\n\nfunction promotePendingWriter(pathKey: string, path: string): string {\n const inodeKey = sessionWriterKey(path);\n if (inodeKey === pathKey) return pathKey;\n claimWriter(inodeKey, path);\n activeWriterKeys.delete(pathKey);\n return inodeKey;\n}\n\nfunction toDurable<T>(input: T): T {\n return input === undefined ? input : (JSON.parse(JSON.stringify(input)) as T);\n}\n\nclass SessionFormatError extends Error {}\n\nconst HEADER_CHUNK_SIZE = 4096;\nconst MAX_HEADER_BYTES = 1024 * 1024;\n\nfunction readHeaderLine(filePath: string): string {\n const fd = openSync(filePath, \"r\");\n const chunks: Buffer[] = [];\n let total = 0;\n try {\n while (total < MAX_HEADER_BYTES) {\n const chunk = Buffer.allocUnsafe(Math.min(HEADER_CHUNK_SIZE, MAX_HEADER_BYTES - total));\n const bytesRead = readSync(fd, chunk, 0, chunk.length, null);\n if (bytesRead === 0) break;\n const data = chunk.subarray(0, bytesRead);\n const newline = data.indexOf(0x0a);\n chunks.push(newline < 0 ? data : data.subarray(0, newline));\n total += newline < 0 ? bytesRead : newline;\n if (newline >= 0) break;\n }\n } finally {\n closeSync(fd);\n }\n if (total >= MAX_HEADER_BYTES) {\n throw new SessionFormatError(\n `Session file header exceeds ${MAX_HEADER_BYTES} bytes: ${filePath}`,\n );\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nfunction parseCurrentHeader(filePath: string, firstLine: string): CurrentSessionHeader {\n const trimmed = firstLine.trim();\n if (!trimmed) throw new SessionFormatError(`Session file has a blank header line: ${filePath}`);\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n throw new SessionFormatError(`Session file header is not valid JSON: ${filePath}`);\n }\n const record = parsed as Record<string, unknown>;\n if (record.type === \"session\" || (record.kind === \"header\" && record.version === 4)) {\n const generation = record.type === \"session\" ? \"legacy v3\" : \"Pi 0.84 v4\";\n throw new SessionFormatError(\n `Session file uses the ${generation} format: ${filePath}. Run \\`mikan sessions migrate\\` before starting this mikan version.`,\n );\n }\n if (\n record.kind !== \"header\" ||\n record.v !== 4 ||\n record.storageVersion !== 1 ||\n typeof record.id !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n typeof record.cwd !== \"string\"\n ) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n return parsed as CurrentSessionHeader;\n}\n\nfunction metadataFromHeader(header: CurrentSessionHeader, path: string): JsonlSessionMetadata {\n return {\n id: header.id,\n createdAt: header.createdAt,\n storageVersion: header.storageVersion,\n cwd: header.cwd,\n path,\n modifiedAt: 0,\n ...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n ...(header.legacyParentSessionPath !== undefined\n ? { legacyParentSessionPath: header.legacyParentSessionPath }\n : {}),\n };\n}\n\nfunction parseMikanMetadata(filePath: string): MikanSessionMetadata | undefined {\n let current: MikanSessionMetadata | undefined;\n const lines = readFileSync(filePath, \"utf-8\").split(\"\\n\");\n for (const [index, line] of lines.entries()) {\n if (index === 0 || line.trim() === \"\") continue;\n let transaction: unknown;\n try {\n transaction = JSON.parse(line);\n } catch {\n if (index === lines.length - 1) break;\n continue;\n }\n const writes = Array.isArray(transaction) ? transaction : [transaction];\n for (const candidate of writes) {\n if (typeof candidate !== \"object\" || candidate === null) continue;\n const write = candidate as Record<string, unknown>;\n if (write.kind !== \"value\" || write.namespace !== \"mikan\" || write.key !== \"metadata\") {\n continue;\n }\n if (write.op === \"delete\") current = undefined;\n else if (\n write.op === \"set\" &&\n typeof write.value === \"object\" &&\n write.value !== null &&\n !Array.isArray(write.value)\n ) {\n current = write.value as MikanSessionMetadata;\n }\n }\n }\n return current;\n}\n\nfunction fileFingerprint(path: string): string {\n const bytes = readFileSync(path);\n const fd = openSync(path, \"r\");\n try {\n const stats = fstatSync(fd);\n return `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}:${bytes.toString(\"base64\")}`;\n } finally {\n closeSync(fd);\n }\n}\n\nfunction materializePendingFile(\n path: string,\n header: CurrentSessionHeader,\n expectedFingerprint: string | null,\n): void {\n const content = `${JSON.stringify(header)}\\n`;\n if (expectedFingerprint === null) {\n mkdirSync(dirname(path), { recursive: true });\n const fd = openSync(path, \"wx\", 0o600);\n try {\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n return;\n }\n const fd = openSync(path, \"r+\");\n try {\n const stats = fstatSync(fd);\n const bytes = Buffer.alloc(stats.size);\n readSync(fd, bytes, 0, bytes.length, 0);\n const actual = `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}:${bytes.toString(\"base64\")}`;\n if (actual !== expectedFingerprint) {\n throw new Error(`Session file changed before pending session materialization: ${path}`);\n }\n ftruncateSync(fd, 0);\n writeFileSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction buildHeader(\n cwd: string,\n options?: SessionCreateInfo,\n): { header: CurrentSessionHeader; metadata?: MikanSessionMetadata } {\n const metadata =\n options?.parentSession === undefined\n ? undefined\n : ({ parentSessionPath: options.parentSession } satisfies MikanSessionMetadata);\n return {\n header: {\n v: 4,\n kind: \"header\",\n id: options?.id ?? uuidv7(),\n storageVersion: 1,\n createdAt: Date.now(),\n cwd,\n ...(options?.parentSessionId !== undefined\n ? { parentSessionId: options.parentSessionId }\n : {}),\n ...(options?.parentSession !== undefined\n ? { legacyParentSessionPath: options.parentSession }\n : {}),\n },\n ...(metadata !== undefined ? { metadata } : {}),\n };\n}\n\nfunction headerView(header: CurrentSessionHeader, metadata?: MikanSessionMetadata): SessionHeader {\n const parentSession =\n typeof metadata?.parentSessionPath === \"string\"\n ? metadata.parentSessionPath\n : header.legacyParentSessionPath;\n return {\n type: \"session\",\n version: CURRENT_SESSION_VERSION,\n id: header.id,\n timestamp: new Date(header.createdAt).toISOString(),\n cwd: header.cwd,\n ...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n ...(parentSession !== undefined ? { parentSession } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n };\n}\n\nfunction fileRepo(path: string): JsonlSessionRepo {\n return new JsonlSessionRepo({\n fileSystem: new NodeExecutionEnv({ cwd: process.cwd() }),\n sessionsRoot: dirname(path),\n });\n}\n\nasync function openFileSession(\n path: string,\n header: CurrentSessionHeader,\n): Promise<{ session: Session<JsonlSessionMetadata>; repo: JsonlSessionRepo }> {\n const sessionRepo = fileRepo(path);\n try {\n const session = await sessionRepo.open(metadataFromHeader(header, path), TODO_CONTEXT);\n return { session, repo: sessionRepo };\n } catch (error) {\n await sessionRepo.close(TODO_CONTEXT);\n throw error;\n }\n}\n\nasync function mainBranch(session: Session, create: boolean): Promise<Branch | undefined> {\n const existing = await session.branch(\"main\", TODO_CONTEXT);\n if (existing || !create) return existing;\n return session.createBranch(\"main\", null, TODO_CONTEXT);\n}\n\nfunction isContextMessage(message: AgentMessage): boolean {\n return (\n message.role !== \"assistant\" ||\n (message.stopReason !== \"error\" &&\n message.stopReason !== \"aborted\" &&\n message.stopReason !== \"deferred\")\n );\n}\n\nfunction buildContext(entries: Entry[]): SessionContext {\n const compactionIndex = entries.findLastIndex((entry) => entry.type === \"compaction\");\n const visibleEntries =\n compactionIndex === -1\n ? entries\n : [entries[compactionIndex]!, ...entries.slice(compactionIndex + 1)];\n const messages: AgentMessage[] = [];\n for (const entry of visibleEntries) {\n if (entry.type === \"message\") {\n if (isContextMessage(entry.message)) messages.push(entry.message);\n } else if (entry.type === \"compaction\") {\n messages.push(\n createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n ...entry.retainedTail.filter(isContextMessage),\n );\n } else if (entry.type === \"branch_summary\" && entry.summary) {\n messages.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n }\n }\n return { messages };\n}\n\ninterface LiveState {\n kind: \"live\";\n session: Session;\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n repo?: JsonlSessionRepo | MemorySessionRepo;\n}\n\ninterface PendingState {\n kind: \"pending\";\n header: CurrentSessionHeader;\n metadata?: MikanSessionMetadata;\n fingerprint: string | null;\n}\n\ntype StoreState = LiveState | PendingState;\n\nclass CachedSessionInspection implements SessionInspection {\n constructor(\n private readonly header: SessionHeader,\n private readonly entries: Entry[],\n private readonly name: string | undefined,\n private readonly branch: Entry[],\n private readonly context: SessionContext,\n ) {}\n\n getHeader(): SessionHeader {\n return structuredClone(this.header);\n }\n\n async getEntries(): Promise<Entry[]> {\n return structuredClone(this.entries);\n }\n\n async getSessionName(): Promise<string | undefined> {\n return this.name;\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n if (fromId === undefined) return structuredClone(this.branch);\n const byId = new Map(this.entries.map((entry) => [entry.id, entry]));\n const result: Entry[] = [];\n let current = byId.get(fromId);\n while (current) {\n result.push(current);\n current = current.parentId === null ? undefined : byId.get(current.parentId);\n }\n return result.toReversed();\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return structuredClone(this.context);\n }\n}\n\nexport class SessionStore implements SessionInspection {\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n\n private constructor(\n private readonly sessionFile: string | null,\n private readonly cwd: string,\n private state: StoreState,\n private writerKey: string | null,\n ) {}\n\n static async open(path: string, cwdOverride?: string): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n try {\n if (!existsSync(writerPath)) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: null },\n writer.key,\n );\n }\n const firstLine = readHeaderLine(writerPath);\n if (firstLine.trim().length === 0) {\n const cwd = cwdOverride ?? process.cwd();\n const built = buildHeader(cwd);\n return new SessionStore(\n writerPath,\n cwd,\n { kind: \"pending\", ...built, fingerprint: fileFingerprint(writerPath) },\n writer.key,\n );\n }\n const header = parseCurrentHeader(writerPath, firstLine);\n const metadata = parseMikanMetadata(writerPath);\n const opened = await openFileSession(writerPath, header);\n return new SessionStore(\n writerPath,\n cwdOverride ?? header.cwd,\n { kind: \"live\", header, metadata, ...opened },\n writer.key,\n );\n } catch (error) {\n releaseWriter(writer.key);\n throw error;\n }\n }\n\n static async inspect(path: string): Promise<SessionInspection> {\n const resolvedPath = canonicalSessionPath(path);\n const snapshotDir = mkdtempSync(join(tmpdir(), \"mikan-session-inspect-\"));\n const snapshotPath = join(snapshotDir, basename(resolvedPath));\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n writeFileSync(snapshotPath, readFileSync(resolvedPath), { mode: 0o600, flag: \"wx\" });\n const header = parseCurrentHeader(resolvedPath, readHeaderLine(snapshotPath));\n const metadata = parseMikanMetadata(snapshotPath);\n opened = await openFileSession(snapshotPath, header);\n const entries = await opened.session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n const name = await opened.session.getName(TODO_CONTEXT);\n const branchObject = await mainBranch(opened.session, false);\n const branch = branchObject\n ? await branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT)\n : [];\n const context = buildContext(branch);\n return new CachedSessionInspection(\n headerView(header, metadata),\n entries,\n name,\n branch,\n context,\n );\n } finally {\n if (opened) {\n await opened.session.close(TODO_CONTEXT);\n await opened.repo.close(TODO_CONTEXT);\n }\n rmSync(snapshotDir, { recursive: true, force: true });\n }\n }\n\n static async create(\n path: string,\n cwd: string,\n options?: SessionCreateInfo,\n ): Promise<SessionStore> {\n const writer = acquireWriter(path);\n const writerPath = writer.path;\n let leaseKey = writer.key;\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n const built = buildHeader(cwd, options);\n mkdirSync(dirname(writerPath), { recursive: true });\n writeFileSync(writerPath, `${JSON.stringify(built.header)}\\n`, { mode: 0o600, flag: \"wx\" });\n leaseKey = promotePendingWriter(leaseKey, writerPath);\n opened = await openFileSession(writerPath, built.header);\n if (built.metadata) {\n await opened.session.setValue(MIKAN_METADATA, built.metadata, TODO_CONTEXT);\n }\n return new SessionStore(writerPath, cwd, { kind: \"live\", ...built, ...opened }, leaseKey);\n } catch (error) {\n if (opened) {\n await opened.session.close(TODO_CONTEXT).catch(() => undefined);\n await opened.repo.close(TODO_CONTEXT).catch(() => undefined);\n }\n releaseWriter(leaseKey);\n throw error;\n }\n }\n\n static readHeader(path: string): SessionHeader | null {\n let firstLine: string;\n try {\n firstLine = readHeaderLine(path);\n } catch {\n return null;\n }\n if (firstLine.trim().length === 0) return null;\n try {\n const header = parseCurrentHeader(path, firstLine);\n return headerView(header, parseMikanMetadata(path));\n } catch (error) {\n if (error instanceof SessionFormatError && /legacy v3|Pi 0\\.84 v4/.test(error.message)) {\n throw error;\n }\n return null;\n }\n }\n\n static writeHeaderFile(path: string, cwd: string, options?: SessionCreateInfo): void {\n mkdirSync(dirname(path), { recursive: true });\n const built = buildHeader(cwd, options);\n atomicWritePrivateFile(path, `${JSON.stringify(built.header)}\\n`);\n }\n\n static inMemory(cwd = process.cwd()): SessionStore {\n const built = buildHeader(cwd);\n return new SessionStore(null, cwd, { kind: \"pending\", ...built, fingerprint: null }, null);\n }\n\n getSessionFile(): string | undefined {\n this.assertOpen();\n return this.sessionFile ?? undefined;\n }\n\n isPersisted(): boolean {\n this.assertOpen();\n return this.sessionFile !== null;\n }\n\n getCwd(): string {\n this.assertOpen();\n return this.cwd;\n }\n\n getHeader(): SessionHeader {\n this.assertOpen();\n return headerView(this.state.header, this.state.metadata);\n }\n\n getSessionId(): string {\n this.assertOpen();\n return this.state.header.id;\n }\n\n async getLeafId(): Promise<string | null> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return null;\n return (await mainBranch(this.state.session, false))?.getTipId(TODO_CONTEXT) ?? null;\n }\n\n async getEntry(id: string): Promise<Entry | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getEntry(id, TODO_CONTEXT);\n }\n\n async getEntries(): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n return this.state.session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n }\n\n async getSessionName(): Promise<string | undefined> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return undefined;\n return this.state.session.getName(TODO_CONTEXT);\n }\n\n async getBranch(fromId?: string): Promise<Entry[]> {\n this.assertOpen();\n if (this.state.kind === \"pending\") return [];\n if (fromId !== undefined) {\n return this.state.session.scanBranch({ start: fromId, order: \"oldestFirst\" }, TODO_CONTEXT);\n }\n const branchObject = await mainBranch(this.state.session, false);\n return branchObject ? branchObject.findEntries({ order: \"oldestFirst\" }, TODO_CONTEXT) : [];\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return buildContext(await this.getBranch());\n }\n\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => {\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendMessage(toDurable(message), TODO_CONTEXT);\n });\n }\n\n async appendCustomEntry(customType: string, data?: unknown): Promise<string> {\n return this.mutate(async () => {\n const branchObject = await mainBranch((await this.live()).session, true);\n if (!branchObject) throw new Error(\"Failed to create main session branch\");\n return branchObject.appendCustomEntry(customType, toDurable(data) as JsonValue, TODO_CONTEXT);\n });\n }\n\n async appendCustomMessageEntry(\n customType: string,\n content: string | Array<TextContent | ImageContent>,\n display: boolean,\n details?: unknown,\n ): Promise<string> {\n return this.appendMessage(\n toDurable(createCustomMessage(customType, content, display, details, Date.now())),\n );\n }\n\n async setSessionName(name: string): Promise<void> {\n await this.mutate(async () =>\n (await this.live()).session.setName(name.trim() || undefined, TODO_CONTEXT),\n );\n }\n\n async appendCompaction(\n summary: string,\n retainedTail: AgentMessage[],\n tokensBefore: number,\n details?: unknown,\n ): Promise<string> {\n return this.mutate(async () => {\n const { session } = await this.live();\n const id = session.idGenerator.next();\n await session.mutate(async (mutator, context) => {\n const currentTip = await mutator.getValue(branchTip(\"main\"), context);\n await mutator.commit(\n [\n insertEntry({\n type: \"compaction\",\n id,\n parentId: currentTip?.value ?? null,\n summary,\n retainedTail: toDurable(retainedTail),\n tokensBefore,\n fromHook: false,\n ...(details !== undefined ? { details: toDurable(details) as JsonValue } : {}),\n }),\n setValue(branchTip(\"main\"), id),\n ],\n context,\n );\n }, TODO_CONTEXT);\n return id;\n });\n }\n\n async close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n this.closePromise = this.mutationTail\n .then(async () => {\n if (this.state.kind !== \"live\") return;\n try {\n await this.state.session.close(TODO_CONTEXT);\n } finally {\n await this.state.repo?.close(TODO_CONTEXT);\n }\n })\n .finally(() => {\n if (this.writerKey !== null) releaseWriter(this.writerKey);\n });\n return this.closePromise;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"SessionStore is closed\");\n }\n\n private mutate<T>(operation: () => Promise<T>): Promise<T> {\n this.assertOpen();\n const result = this.mutationTail.then(operation);\n this.mutationTail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async live(): Promise<LiveState> {\n if (this.state.kind === \"live\") return this.state;\n const pending = this.state;\n const sessionFile = this.sessionFile;\n if (sessionFile === null) {\n const repo = new MemorySessionRepo();\n const session = await repo.create(\n {\n id: pending.header.id,\n ...(pending.header.parentSessionId !== undefined\n ? { parentSessionId: pending.header.parentSessionId }\n : {}),\n },\n TODO_CONTEXT,\n );\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n session,\n repo,\n };\n this.state = live;\n return live;\n }\n materializePendingFile(sessionFile, pending.header, pending.fingerprint);\n if (this.writerKey === null) throw new Error(\"Pending session must have a writer lease\");\n this.writerKey = promotePendingWriter(this.writerKey, sessionFile);\n const opened = await openFileSession(sessionFile, pending.header);\n if (pending.metadata) {\n await opened.session.setValue(MIKAN_METADATA, pending.metadata, TODO_CONTEXT);\n }\n const live: LiveState = {\n kind: \"live\",\n header: pending.header,\n metadata: pending.metadata,\n ...opened,\n };\n this.state = live;\n return live;\n }\n}\n"]}
|
package/dist/harness/types.d.ts
CHANGED
|
@@ -2,16 +2,20 @@
|
|
|
2
2
|
* Core types for the mikan agent harness.
|
|
3
3
|
*
|
|
4
4
|
* The harness is built directly on pi-agent-core and pi-ai. Sessions use
|
|
5
|
-
* pi's v4 entry model and JSONL format
|
|
6
|
-
*
|
|
7
|
-
* handled exclusively by the
|
|
5
|
+
* pi's current v4 entry model and JSONL storage format. mikan-owned
|
|
6
|
+
* metadata uses a namespaced durable value; legacy v3 and Pi 0.84 v4 files
|
|
7
|
+
* are handled exclusively by the offline session migrations.
|
|
8
8
|
*/
|
|
9
|
-
import type { AgentEvent, AgentTool, BranchSummaryEntry, CompactionEntry, CustomEntry, Entry, MessageEntry,
|
|
9
|
+
import type { AgentEvent, AgentMessage, AgentTool, BranchSummaryEntry, CompactionEntry, CustomEntry, Entry, MessageEntry, ThinkingLevel, CompactionSettings } from "@earendil-works/pi-agent-core";
|
|
10
10
|
import type { Api, Model, Usage } from "@earendil-works/pi-ai";
|
|
11
11
|
import type { MikanModels } from "./models.js";
|
|
12
12
|
import type { SessionStore } from "./session-store.js";
|
|
13
13
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
14
|
-
export type { BranchSummaryEntry, CompactionEntry, CustomEntry
|
|
14
|
+
export type { BranchSummaryEntry, CompactionEntry, CustomEntry };
|
|
15
|
+
/** Model-visible messages reconstructed from the active session branch. */
|
|
16
|
+
export interface SessionContext {
|
|
17
|
+
messages: AgentMessage[];
|
|
18
|
+
}
|
|
15
19
|
/** Message entry as stored in mikan session files (pi v4). */
|
|
16
20
|
export type SessionMessageEntry = MessageEntry;
|
|
17
21
|
/** Union of entry types mikan reads and writes. Alias of pi's v4 entry. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,KAAK,EACL,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC","sourcesContent":["/**\n * Core types for the mikan agent harness.\n *\n * The harness is built directly on pi-agent-core and pi-ai. Sessions use\n * pi's v4 entry model and JSONL format; mikan adds only the header\n * conventions carried in the v4 header `metadata`. Legacy v3 files are\n * handled exclusively by the migration module (`sessions/migrate-v3.ts`).\n */\nimport type {\n AgentEvent,\n AgentTool,\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n Entry,\n MessageEntry,\n SessionContext,\n ThinkingLevel,\n CompactionSettings,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\nimport type { MikanModels } from \"./models.js\";\nimport type { SessionStore } from \"./session-store.js\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\n\nexport type { BranchSummaryEntry, CompactionEntry, CustomEntry, SessionContext };\n\n/** Message entry as stored in mikan session files (pi v4). */\nexport type SessionMessageEntry = MessageEntry;\n\n/** Union of entry types mikan reads and writes. Alias of pi's v4 entry. */\nexport type SessionEntry = Entry;\n\nexport const CURRENT_SESSION_VERSION = 4;\n\nexport interface SessionCreateInfo {\n id?: string;\n parentSession?: string;\n parentSessionId?: string;\n}\n\n/** Immutable session queries available to portals, admin, and migration code. */\nexport interface SessionInspection {\n getHeader(): SessionHeader;\n getEntries(): Promise<Entry[]>;\n getSessionName(): Promise<string | undefined>;\n getBranch(fromId?: string): Promise<Entry[]>;\n buildSessionContext(): Promise<SessionContext>;\n}\n\nexport interface SubagentModelSpec {\n provider: string;\n id: string;\n}\n\n/**\n * A curated capability set a subagent can be launched with. Built-ins ship\n * with the harness; `<workspaceDir>/agents/<name>.md` patches them per\n * installation. Turn, cost, and duration fields are caps — an explicit\n * `request.budget` may tighten them but never raise them. Token budgets use the\n * larger of the profile default and the request value.\n */\nexport interface SubagentProfile {\n name: string;\n description: string;\n systemPrompt: string;\n tools: string[];\n requiredTools: string[];\n model?: SubagentModelSpec;\n thinkingLevel?: ThinkingLevel;\n maxTurns?: number;\n maxTokens?: number;\n maxCostUsd?: number;\n maxDurationMs?: number;\n}\n\nexport interface SubagentRunBudget {\n /** Maximum assistant/model calls in the subagent run. */\n maxTurns?: number;\n /** Maximum cumulative input/output/cache tokens. */\n maxTokens?: number;\n /** Maximum provider cost in USD. */\n maxCostUsd?: number;\n /** Maximum wall-clock duration. */\n maxDurationMs?: number;\n}\n\nexport type SubagentRunStatus =\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"timeout\"\n | \"budget_exceeded\"\n | \"invalid_output\";\n\nexport interface SubagentParentContext {\n mode: \"normalized\";\n /** Number of recent user/assistant turns to include. Defaults to 3. */\n recentTurns?: number;\n}\n\n/** Aggregated model usage across every assistant turn in a subagent run. */\nexport type SubagentUsage = Usage;\n\n/** Receives usage from a subagent run, including after detached cleanup settles. */\nexport type SubagentUsageSink = (usage: SubagentUsage) => void | Promise<void>;\n\n/** A fresh, isolated subagent run. */\nexport interface SubagentRunRequest<TOutputSchema extends TSchema | undefined = undefined> {\n task: string;\n /** Named profile: a harness built-in, patched by `<workspaceDir>/agents/<name>.md`. */\n profile?: string;\n /** Opt in to a normalized textual snapshot of the active parent run. Defaults to fresh. */\n parentContext?: SubagentParentContext;\n systemPrompt?: string;\n /** JSON-serializable input appended to the task. */\n input?: unknown;\n /** Defaults to the parent runner's configured model. */\n model?: SubagentModelSpec;\n /** Tool names explicitly granted to the subagent. Defaults to no tools. */\n tools?: string[];\n /** Tool names that must each be invoked at least once before completion. */\n requiredTools?: string[];\n /** Per-profile thinking override. */\n thinkingLevel?: ThinkingLevel;\n /** When present, the final response must be JSON matching this schema. */\n outputSchema?: TOutputSchema;\n budget?: SubagentRunBudget;\n signal?: AbortSignal;\n}\n\nexport type SubagentRunOutput<TSchemaOrUndefined extends TSchema | undefined> =\n TSchemaOrUndefined extends TSchema ? Static<TSchemaOrUndefined> : string;\n\ninterface SubagentRunMetadata {\n runId: string;\n /** Raw final assistant text, including when structured validation failed. */\n text?: string;\n model: SubagentModelSpec;\n turns: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n /** Full token and cost breakdown across the run. */\n usage: SubagentUsage;\n /** Aggregate token count; equivalent to `usage.totalTokens`. */\n tokens: number;\n /** Aggregate provider cost; equivalent to `usage.cost.total`. */\n costUsd: number;\n durationMs: number;\n /**\n * The caller received a terminal result before the underlying run settled.\n * When true, `usage`, `tokens`, and `costUsd` are provisional snapshots;\n * final usage is delivered later through the run's bound usage sink. The\n * global slot remains held until cleanup settles because in-process work\n * cannot be safely reclaimed without a killable execution boundary.\n */\n cleanupPending?: boolean;\n}\n\ninterface SubagentRunCompletedResult<TOutput> extends SubagentRunMetadata {\n status: \"completed\";\n output: TOutput;\n error?: never;\n}\n\ninterface SubagentRunIncompleteResult extends SubagentRunMetadata {\n status: Exclude<SubagentRunStatus, \"completed\">;\n output?: never;\n error?: string;\n}\n\nexport type SubagentRunResult<TOutput = string> =\n | SubagentRunCompletedResult<TOutput>\n | SubagentRunIncompleteResult;\n\n/**\n * Compatibility header view synthesized from the v4 file header for callers\n * that read mikan session lineage. `metadata` carries mikan header extras (for\n * example `parentSessionPath` and the legacy `source` marker preserved by\n * the v3 migration).\n */\nexport interface SessionHeader {\n type: \"session\";\n version?: number;\n id: string;\n timestamp: string;\n cwd: string;\n parentSession?: string;\n parentSessionId?: string;\n [extra: string]: unknown;\n}\n\nexport interface CreateMikanModelsOptions {\n modelsJsonPath?: string;\n}\n\nexport type EventConversationKind = \"direct\" | \"shared\";\n\nexport type EventType = \"immediate\" | \"one-shot\" | \"periodic\";\n\ninterface EventPayloadBase {\n /** Target platform; may be omitted when only one platform is running. */\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n /** Self-contained task text; event runs do not inherit conversation history. */\n text: string;\n}\n\nexport interface ImmediateEventPayload extends EventPayloadBase {\n type: \"immediate\";\n}\n\nexport interface OneShotEventPayload extends EventPayloadBase {\n type: \"one-shot\";\n /** ISO 8601 timestamp with offset. */\n at: string;\n}\n\nexport interface PeriodicEventPayload extends EventPayloadBase {\n type: \"periodic\";\n /** Cron expression (croner syntax). */\n schedule: string;\n /** IANA timezone, e.g. \"Asia/Taipei\". */\n timezone: string;\n}\n\n/** Wire shape of one event file. */\nexport type EventFilePayload = ImmediateEventPayload | OneShotEventPayload | PeriodicEventPayload;\n\nexport interface EventPayloadInput {\n type: EventType;\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n at?: string;\n schedule?: string;\n timezone?: string;\n}\n\n/** A loaded skill. `baseDir` is the directory containing the skill file. */\nexport interface MikanSkill {\n name: string;\n description: string;\n /** Full skill instructions (file content without frontmatter). */\n content: string;\n filePath: string;\n baseDir: string;\n /** Where the skill was loaded from (e.g. \"workspace\", \"channel\"). */\n source: string;\n /** Exclude from model-visible skill lists. */\n disableModelInvocation?: boolean;\n /** Embed the skill body in the prompt instead of referencing its file path. */\n inline?: boolean;\n}\n\nexport interface SkillDiagnostic {\n type: \"warning\";\n message: string;\n path: string;\n /** Set when the entry was skipped because it is a symlink on a rejecting load. */\n code?: \"symlink\";\n}\n\nexport interface LoadSkillsResult {\n skills: MikanSkill[];\n diagnostics: SkillDiagnostic[];\n}\n\nexport interface RetrySettings {\n enabled: boolean;\n maxRetries: number;\n baseDelayMs: number;\n}\n\nexport interface BudgetSettings {\n /** Max cumulative tokens processed this run (input + output + cache read/write). */\n maxTokens?: number;\n /** Max cumulative provider cost (USD) this run. Requires a populated model cost table. */\n maxCostUsd?: number;\n /** Max wall-clock duration for the run, in milliseconds. */\n maxDurationMs?: number;\n /** Max number of LLM calls (assistant turns) this run. */\n maxLlmCalls?: number;\n}\n\nexport interface HarnessSettings {\n compaction: CompactionSettings;\n retry: RetrySettings;\n budget: BudgetSettings;\n}\n\nexport interface SubagentProfileDiagnostic {\n type: \"warning\";\n message: string;\n path: string;\n}\n\nexport interface LoadSubagentProfilesResult {\n profiles: Map<string, SubagentProfile>;\n diagnostics: SubagentProfileDiagnostic[];\n}\n\nexport type CompactionReason = \"threshold\" | \"overflow\" | \"manual\";\n\ninterface CompactionResultSummary {\n summary: string;\n /** Number of recent messages retained inline on the compaction entry. */\n retainedMessages: number;\n tokensBefore: number;\n}\n\nexport type HarnessEvent =\n | AgentEvent\n | { type: \"compaction_start\"; reason: CompactionReason }\n | {\n type: \"compaction_end\";\n reason: CompactionReason;\n result?: CompactionResultSummary;\n aborted: boolean;\n errorMessage?: string;\n }\n | {\n type: \"auto_retry_start\";\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n errorMessage: string;\n }\n | { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n | {\n type: \"budget_exceeded\";\n /** Which cap was hit, e.g. \"cost 2.01 USD > 2 USD limit\". */\n reason: string;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n durationMs: number;\n };\n\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\nexport interface MikanAgentSessionOptions {\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: AgentTool[];\n models: MikanModels;\n sessionStore: SessionStore;\n settings?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC","sourcesContent":["/**\n * Core types for the mikan agent harness.\n *\n * The harness is built directly on pi-agent-core and pi-ai. Sessions use\n * pi's current v4 entry model and JSONL storage format. mikan-owned\n * metadata uses a namespaced durable value; legacy v3 and Pi 0.84 v4 files\n * are handled exclusively by the offline session migrations.\n */\nimport type {\n AgentEvent,\n AgentMessage,\n AgentTool,\n BranchSummaryEntry,\n CompactionEntry,\n CustomEntry,\n Entry,\n MessageEntry,\n ThinkingLevel,\n CompactionSettings,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\nimport type { MikanModels } from \"./models.js\";\nimport type { SessionStore } from \"./session-store.js\";\nimport type { Static, TSchema } from \"@sinclair/typebox\";\n\nexport type { BranchSummaryEntry, CompactionEntry, CustomEntry };\n\n/** Model-visible messages reconstructed from the active session branch. */\nexport interface SessionContext {\n messages: AgentMessage[];\n}\n\n/** Message entry as stored in mikan session files (pi v4). */\nexport type SessionMessageEntry = MessageEntry;\n\n/** Union of entry types mikan reads and writes. Alias of pi's v4 entry. */\nexport type SessionEntry = Entry;\n\nexport const CURRENT_SESSION_VERSION = 4;\n\nexport interface SessionCreateInfo {\n id?: string;\n parentSession?: string;\n parentSessionId?: string;\n}\n\n/** Immutable session queries available to portals, admin, and migration code. */\nexport interface SessionInspection {\n getHeader(): SessionHeader;\n getEntries(): Promise<Entry[]>;\n getSessionName(): Promise<string | undefined>;\n getBranch(fromId?: string): Promise<Entry[]>;\n buildSessionContext(): Promise<SessionContext>;\n}\n\nexport interface SubagentModelSpec {\n provider: string;\n id: string;\n}\n\n/**\n * A curated capability set a subagent can be launched with. Built-ins ship\n * with the harness; `<workspaceDir>/agents/<name>.md` patches them per\n * installation. Turn, cost, and duration fields are caps — an explicit\n * `request.budget` may tighten them but never raise them. Token budgets use the\n * larger of the profile default and the request value.\n */\nexport interface SubagentProfile {\n name: string;\n description: string;\n systemPrompt: string;\n tools: string[];\n requiredTools: string[];\n model?: SubagentModelSpec;\n thinkingLevel?: ThinkingLevel;\n maxTurns?: number;\n maxTokens?: number;\n maxCostUsd?: number;\n maxDurationMs?: number;\n}\n\nexport interface SubagentRunBudget {\n /** Maximum assistant/model calls in the subagent run. */\n maxTurns?: number;\n /** Maximum cumulative input/output/cache tokens. */\n maxTokens?: number;\n /** Maximum provider cost in USD. */\n maxCostUsd?: number;\n /** Maximum wall-clock duration. */\n maxDurationMs?: number;\n}\n\nexport type SubagentRunStatus =\n | \"completed\"\n | \"failed\"\n | \"cancelled\"\n | \"timeout\"\n | \"budget_exceeded\"\n | \"invalid_output\";\n\nexport interface SubagentParentContext {\n mode: \"normalized\";\n /** Number of recent user/assistant turns to include. Defaults to 3. */\n recentTurns?: number;\n}\n\n/** Aggregated model usage across every assistant turn in a subagent run. */\nexport type SubagentUsage = Usage;\n\n/** Receives usage from a subagent run, including after detached cleanup settles. */\nexport type SubagentUsageSink = (usage: SubagentUsage) => void | Promise<void>;\n\n/** A fresh, isolated subagent run. */\nexport interface SubagentRunRequest<TOutputSchema extends TSchema | undefined = undefined> {\n task: string;\n /** Named profile: a harness built-in, patched by `<workspaceDir>/agents/<name>.md`. */\n profile?: string;\n /** Opt in to a normalized textual snapshot of the active parent run. Defaults to fresh. */\n parentContext?: SubagentParentContext;\n systemPrompt?: string;\n /** JSON-serializable input appended to the task. */\n input?: unknown;\n /** Defaults to the parent runner's configured model. */\n model?: SubagentModelSpec;\n /** Tool names explicitly granted to the subagent. Defaults to no tools. */\n tools?: string[];\n /** Tool names that must each be invoked at least once before completion. */\n requiredTools?: string[];\n /** Per-profile thinking override. */\n thinkingLevel?: ThinkingLevel;\n /** When present, the final response must be JSON matching this schema. */\n outputSchema?: TOutputSchema;\n budget?: SubagentRunBudget;\n signal?: AbortSignal;\n}\n\nexport type SubagentRunOutput<TSchemaOrUndefined extends TSchema | undefined> =\n TSchemaOrUndefined extends TSchema ? Static<TSchemaOrUndefined> : string;\n\ninterface SubagentRunMetadata {\n runId: string;\n /** Raw final assistant text, including when structured validation failed. */\n text?: string;\n model: SubagentModelSpec;\n turns: number;\n toolCalls: number;\n toolCallCounts: Record<string, number>;\n /** Full token and cost breakdown across the run. */\n usage: SubagentUsage;\n /** Aggregate token count; equivalent to `usage.totalTokens`. */\n tokens: number;\n /** Aggregate provider cost; equivalent to `usage.cost.total`. */\n costUsd: number;\n durationMs: number;\n /**\n * The caller received a terminal result before the underlying run settled.\n * When true, `usage`, `tokens`, and `costUsd` are provisional snapshots;\n * final usage is delivered later through the run's bound usage sink. The\n * global slot remains held until cleanup settles because in-process work\n * cannot be safely reclaimed without a killable execution boundary.\n */\n cleanupPending?: boolean;\n}\n\ninterface SubagentRunCompletedResult<TOutput> extends SubagentRunMetadata {\n status: \"completed\";\n output: TOutput;\n error?: never;\n}\n\ninterface SubagentRunIncompleteResult extends SubagentRunMetadata {\n status: Exclude<SubagentRunStatus, \"completed\">;\n output?: never;\n error?: string;\n}\n\nexport type SubagentRunResult<TOutput = string> =\n | SubagentRunCompletedResult<TOutput>\n | SubagentRunIncompleteResult;\n\n/**\n * Compatibility header view synthesized from the v4 file header for callers\n * that read mikan session lineage. `metadata` carries mikan header extras (for\n * example `parentSessionPath` and the legacy `source` marker preserved by\n * the v3 migration).\n */\nexport interface SessionHeader {\n type: \"session\";\n version?: number;\n id: string;\n timestamp: string;\n cwd: string;\n parentSession?: string;\n parentSessionId?: string;\n [extra: string]: unknown;\n}\n\nexport interface CreateMikanModelsOptions {\n modelsJsonPath?: string;\n}\n\nexport type EventConversationKind = \"direct\" | \"shared\";\n\nexport type EventType = \"immediate\" | \"one-shot\" | \"periodic\";\n\ninterface EventPayloadBase {\n /** Target platform; may be omitted when only one platform is running. */\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n /** Self-contained task text; event runs do not inherit conversation history. */\n text: string;\n}\n\nexport interface ImmediateEventPayload extends EventPayloadBase {\n type: \"immediate\";\n}\n\nexport interface OneShotEventPayload extends EventPayloadBase {\n type: \"one-shot\";\n /** ISO 8601 timestamp with offset. */\n at: string;\n}\n\nexport interface PeriodicEventPayload extends EventPayloadBase {\n type: \"periodic\";\n /** Cron expression (croner syntax). */\n schedule: string;\n /** IANA timezone, e.g. \"Asia/Taipei\". */\n timezone: string;\n}\n\n/** Wire shape of one event file. */\nexport type EventFilePayload = ImmediateEventPayload | OneShotEventPayload | PeriodicEventPayload;\n\nexport interface EventPayloadInput {\n type: EventType;\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n at?: string;\n schedule?: string;\n timezone?: string;\n}\n\n/** A loaded skill. `baseDir` is the directory containing the skill file. */\nexport interface MikanSkill {\n name: string;\n description: string;\n /** Full skill instructions (file content without frontmatter). */\n content: string;\n filePath: string;\n baseDir: string;\n /** Where the skill was loaded from (e.g. \"workspace\", \"channel\"). */\n source: string;\n /** Exclude from model-visible skill lists. */\n disableModelInvocation?: boolean;\n /** Embed the skill body in the prompt instead of referencing its file path. */\n inline?: boolean;\n}\n\nexport interface SkillDiagnostic {\n type: \"warning\";\n message: string;\n path: string;\n /** Set when the entry was skipped because it is a symlink on a rejecting load. */\n code?: \"symlink\";\n}\n\nexport interface LoadSkillsResult {\n skills: MikanSkill[];\n diagnostics: SkillDiagnostic[];\n}\n\nexport interface RetrySettings {\n enabled: boolean;\n maxRetries: number;\n baseDelayMs: number;\n}\n\nexport interface BudgetSettings {\n /** Max cumulative tokens processed this run (input + output + cache read/write). */\n maxTokens?: number;\n /** Max cumulative provider cost (USD) this run. Requires a populated model cost table. */\n maxCostUsd?: number;\n /** Max wall-clock duration for the run, in milliseconds. */\n maxDurationMs?: number;\n /** Max number of LLM calls (assistant turns) this run. */\n maxLlmCalls?: number;\n}\n\nexport interface HarnessSettings {\n compaction: CompactionSettings;\n retry: RetrySettings;\n budget: BudgetSettings;\n}\n\nexport interface SubagentProfileDiagnostic {\n type: \"warning\";\n message: string;\n path: string;\n}\n\nexport interface LoadSubagentProfilesResult {\n profiles: Map<string, SubagentProfile>;\n diagnostics: SubagentProfileDiagnostic[];\n}\n\nexport type CompactionReason = \"threshold\" | \"overflow\" | \"manual\";\n\ninterface CompactionResultSummary {\n summary: string;\n /** Number of recent messages retained inline on the compaction entry. */\n retainedMessages: number;\n tokensBefore: number;\n}\n\nexport type HarnessEvent =\n | AgentEvent\n | { type: \"compaction_start\"; reason: CompactionReason }\n | {\n type: \"compaction_end\";\n reason: CompactionReason;\n result?: CompactionResultSummary;\n aborted: boolean;\n errorMessage?: string;\n }\n | {\n type: \"auto_retry_start\";\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n errorMessage: string;\n }\n | { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n | {\n type: \"budget_exceeded\";\n /** Which cap was hit, e.g. \"cost 2.01 USD > 2 USD limit\". */\n reason: string;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n durationMs: number;\n };\n\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\nexport interface MikanAgentSessionOptions {\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: AgentTool[];\n models: MikanModels;\n sessionStore: SessionStore;\n settings?: {\n compaction?: Partial<CompactionSettings>;\n retry?: Partial<RetrySettings>;\n budget?: Partial<BudgetSettings>;\n };\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Pi084MigrationResult } from "./types.js";
|
|
2
|
+
export type { Pi084MigrationResult } from "./types.js";
|
|
3
|
+
export declare function isPi084SessionFile(filePath: string): boolean;
|
|
4
|
+
export declare function migratePi084SessionFile(filePath: string, options?: {
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}): Promise<Pi084MigrationResult>;
|
|
7
|
+
export declare function findPi084SessionFiles(root: string): string[];
|
|
8
|
+
//# sourceMappingURL=migrate-pi-084.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-pi-084.d.ts","sourceRoot":"","sources":["../../src/sessions/migrate-pi-084.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAkDvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO5D;AAoRD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA4B/B;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB5D"}
|