@geminixiang/mikan 1.0.0-beta.87 → 1.0.0-beta.89
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 +44 -1370
- package/README.md +2 -2
- package/dist/adapters/commands/session-view.d.ts.map +1 -1
- package/dist/adapters/commands/session-view.js +4 -4
- package/dist/adapters/commands/session-view.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +4 -1
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +6 -3
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +3 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/discord/types.d.ts +1 -0
- package/dist/adapters/discord/types.d.ts.map +1 -1
- package/dist/adapters/discord/types.js.map +1 -1
- package/dist/adapters/github/activity.d.ts.map +1 -1
- package/dist/adapters/github/activity.js +7 -13
- package/dist/adapters/github/activity.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +4 -1
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +3 -3
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +3 -1
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/types.d.ts +0 -3
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/intake.d.ts.map +1 -1
- package/dist/adapters/intake.js +12 -2
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/shared.d.ts +2 -1
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +7 -2
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/assistant.d.ts +2 -4
- package/dist/adapters/slack/assistant.d.ts.map +1 -1
- package/dist/adapters/slack/assistant.js +10 -16
- package/dist/adapters/slack/assistant.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +5 -1
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +15 -11
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -1
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/slack/task-status.d.ts.map +1 -1
- package/dist/adapters/slack/task-status.js +1 -2
- package/dist/adapters/slack/task-status.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +4 -1
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +3 -3
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +3 -1
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +3 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/adapters/web/admin/client-assets.js +1 -1
- package/dist/adapters/web/admin/client-assets.js.map +1 -1
- package/dist/adapters/web/admin/portal.d.ts +0 -1
- package/dist/adapters/web/admin/portal.d.ts.map +1 -1
- package/dist/adapters/web/admin/portal.js +26 -42
- package/dist/adapters/web/admin/portal.js.map +1 -1
- package/dist/adapters/web/admin/types.d.ts +0 -2
- package/dist/adapters/web/admin/types.d.ts.map +1 -1
- package/dist/adapters/web/admin/types.js.map +1 -1
- package/dist/adapters/web/login/portal.d.ts.map +1 -1
- package/dist/adapters/web/login/portal.js +0 -8
- package/dist/adapters/web/login/portal.js.map +1 -1
- package/dist/adapters/web/server.d.ts.map +1 -1
- package/dist/adapters/web/server.js +0 -1
- package/dist/adapters/web/server.js.map +1 -1
- package/dist/adapters/web/session-view/portal.d.ts +1 -2
- package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
- package/dist/adapters/web/session-view/portal.js +38 -328
- package/dist/adapters/web/session-view/portal.js.map +1 -1
- package/dist/adapters/web/session-view/types.d.ts +4 -6
- package/dist/adapters/web/session-view/types.d.ts.map +1 -1
- package/dist/adapters/web/session-view/types.js.map +1 -1
- package/dist/env-manifest.d.ts +0 -4
- package/dist/env-manifest.d.ts.map +1 -1
- package/dist/env-manifest.js +5 -8
- package/dist/env-manifest.js.map +1 -1
- package/dist/events/index.d.ts +2 -9
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +0 -1
- package/dist/events/index.js.map +1 -1
- package/dist/events/scheduler.d.ts +0 -1
- package/dist/events/scheduler.d.ts.map +1 -1
- package/dist/events/scheduler.js +2 -7
- package/dist/events/scheduler.js.map +1 -1
- package/dist/harness/execution-env.d.ts +1 -1
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +32 -32
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/index.d.ts +2 -3
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +0 -1
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/mcp-result.d.ts +4 -3
- package/dist/harness/mcp-result.d.ts.map +1 -1
- package/dist/harness/mcp-result.js +27 -13
- package/dist/harness/mcp-result.js.map +1 -1
- package/dist/harness/mcp.js +4 -4
- package/dist/harness/mcp.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +20 -25
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts +0 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +3 -32
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/run-events.d.ts.map +1 -1
- package/dist/harness/run-events.js +4 -12
- package/dist/harness/run-events.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +35 -38
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +37 -38
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +387 -388
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/subagent.d.ts +5 -5
- package/dist/harness/subagent.d.ts.map +1 -1
- package/dist/harness/subagent.js +40 -45
- package/dist/harness/subagent.js.map +1 -1
- package/dist/harness/tools/codemode.d.ts +3 -0
- package/dist/harness/tools/codemode.d.ts.map +1 -0
- package/dist/harness/tools/codemode.js +173 -0
- package/dist/harness/tools/codemode.js.map +1 -0
- package/dist/harness/tools/history.d.ts +20 -0
- package/dist/harness/tools/history.d.ts.map +1 -0
- package/dist/harness/tools/history.js +293 -0
- package/dist/harness/tools/history.js.map +1 -0
- package/dist/harness/tools/pi-tools.d.ts +1 -1
- package/dist/harness/tools/pi-tools.d.ts.map +1 -1
- package/dist/harness/tools/pi-tools.js +47 -21
- package/dist/harness/tools/pi-tools.js.map +1 -1
- package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
- package/dist/harness/tools/secret-redaction.js +46 -2
- package/dist/harness/tools/secret-redaction.js.map +1 -1
- package/dist/harness/tools/tool-search.d.ts +5 -0
- package/dist/harness/tools/tool-search.d.ts.map +1 -0
- package/dist/harness/tools/tool-search.js +84 -0
- package/dist/harness/tools/tool-search.js.map +1 -0
- package/dist/harness/types.d.ts +75 -15
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +0 -3
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +0 -15
- package/dist/log.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/memory-capture/index.js +0 -1
- package/dist/memory-capture/index.js.map +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +2 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/session-files.d.ts +3 -2
- package/dist/migrations/session-files.d.ts.map +1 -1
- package/dist/migrations/session-files.js.map +1 -1
- package/dist/migrations/session-v4.d.ts +77 -0
- package/dist/migrations/session-v4.d.ts.map +1 -0
- package/dist/migrations/session-v4.js +177 -0
- package/dist/migrations/session-v4.js.map +1 -0
- package/dist/migrations/sessions-sqlite.d.ts +3 -0
- package/dist/migrations/sessions-sqlite.d.ts.map +1 -0
- package/dist/migrations/sessions-sqlite.js +215 -0
- package/dist/migrations/sessions-sqlite.js.map +1 -0
- package/dist/migrations/sessions-v3.d.ts +2 -2
- package/dist/migrations/sessions-v3.d.ts.map +1 -1
- package/dist/migrations/sessions-v3.js +8 -19
- package/dist/migrations/sessions-v3.js.map +1 -1
- package/dist/migrations/types.d.ts +0 -5
- package/dist/migrations/types.d.ts.map +1 -1
- package/dist/migrations/types.js.map +1 -1
- package/dist/observability/sentry.d.ts +2 -9
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +12 -64
- package/dist/observability/sentry.js.map +1 -1
- package/dist/observability/types.d.ts +0 -16
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/office/index.d.ts +1 -4
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +2 -14
- package/dist/office/index.js.map +1 -1
- package/dist/office/projection.d.ts.map +1 -1
- package/dist/office/projection.js +0 -1
- package/dist/office/projection.js.map +1 -1
- package/dist/office/types.d.ts +1 -2
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +2 -16
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +1 -2
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +7 -16
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +0 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +3 -4
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +8 -6
- package/dist/sessions/chat-history-sync.d.ts.map +1 -1
- package/dist/sessions/chat-history-sync.js +70 -143
- package/dist/sessions/chat-history-sync.js.map +1 -1
- package/dist/sessions/compaction-summary.d.ts +4 -0
- package/dist/sessions/compaction-summary.d.ts.map +1 -0
- package/dist/sessions/compaction-summary.js +16 -0
- package/dist/sessions/compaction-summary.js.map +1 -0
- package/dist/sessions/session-key.d.ts +1 -0
- package/dist/sessions/session-key.d.ts.map +1 -1
- package/dist/sessions/session-key.js +3 -0
- package/dist/sessions/session-key.js.map +1 -1
- package/dist/sessions/session-store.d.ts +47 -29
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +578 -484
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/types.d.ts +60 -46
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/apply.js +2 -2
- package/dist/settings/apply.js.map +1 -1
- package/dist/types.d.ts +10 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +0 -3
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.ts +0 -3
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/package.json +8 -5
- package/dist/sessions/store.d.ts +0 -17
- package/dist/sessions/store.d.ts.map +0 -1
- package/dist/sessions/store.js +0 -211
- package/dist/sessions/store.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\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 AgentHarness,\n laneState,\n operationResult,\n createBranchSummaryMessage,\n createCompactionSummaryMessage,\n createCustomMessage,\n JsonlSessionRepo,\n JSONL_STORAGE_VERSION,\n MemorySessionRepo,\n TODO_CONTEXT,\n uuidv7,\n value,\n} from \"@earendil-works/pi-agent-core\";\nimport type {\n AgentHarnessOptions,\n AgentLane,\n AgentMessage,\n Branch,\n Entry,\n JsonlSessionMetadata,\n JsonValue,\n Session,\n SessionMetadata,\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 \"../file-guards.js\";\nimport type {\n SessionContext,\n SessionCreateInfo,\n SessionHeader,\n SessionInspection,\n} from \"./types.js\";\nimport { CURRENT_SESSION_VERSION } from \"./types.js\";\nimport { loadMcpTools, formatMcpServerInstructions } from \"../harness/mcp.js\";\nimport type { McpServerConfig, McpToolsResult } from \"../harness/types.js\";\nimport * as log from \"../log.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\ninterface CurrentSessionHeader extends SessionMetadata {\n v: typeof CURRENT_SESSION_VERSION;\n kind: \"header\";\n cwd: 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 if (!isMetadataRecord(parsed)) {\n throw new SessionFormatError(`Session file has an unrecognized header: ${filePath}`);\n }\n const record = parsed;\n if (\n record.kind !== \"header\" ||\n record.v !== CURRENT_SESSION_VERSION ||\n record.storageVersion !== JSONL_STORAGE_VERSION ||\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 unknown 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 parentSessionId: header.parentSessionId,\n legacyParentSessionPath: header.legacyParentSessionPath,\n };\n}\n\nfunction parseMikanMetadata(filePath: string): MikanSessionMetadata | undefined {\n let current: MikanSessionMetadata | undefined;\n for (const line of readFileSync(filePath, \"utf-8\").split(\"\\n\").slice(1)) {\n for (const write of parseMetadataWrites(line)) {\n if (write.op === \"delete\") current = undefined;\n else if (write.op === \"set\" && isMetadataRecord(write.value)) current = write.value;\n }\n }\n return current;\n}\n\nfunction isMetadataRecord(input: unknown): input is MikanSessionMetadata {\n return isRecord(input);\n}\n\nfunction parseMetadataWrites(line: string): MikanSessionMetadata[] {\n let transaction: unknown;\n try {\n transaction = JSON.parse(line);\n } catch {\n return [];\n }\n const writes: unknown[] = Array.isArray(transaction) ? transaction : [transaction];\n return writes.filter(\n (write): write is MikanSessionMetadata =>\n isMetadataRecord(write) &&\n write.kind === \"value\" &&\n write.namespace === \"mikan\" &&\n write.key === \"metadata\",\n );\n}\n\nfunction fileFingerprint(path: string): string {\n const fd = openSync(path, \"r\");\n try {\n const stats = fstatSync(fd);\n return `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\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 actual = `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeMs}`;\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: CURRENT_SESSION_VERSION,\n kind: \"header\",\n id: options?.id ?? uuidv7(),\n storageVersion: JSONL_STORAGE_VERSION,\n createdAt: Date.now(),\n cwd,\n parentSessionId: options?.parentSessionId,\n legacyParentSessionPath: options?.parentSession,\n },\n 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 parentSessionId: header.parentSessionId,\n parentSession,\n metadata,\n };\n}\n\nasync function openFileSession(\n path: string,\n header: CurrentSessionHeader,\n): Promise<{ session: Session<JsonlSessionMetadata>; repo: JsonlSessionRepo }> {\n const sessionRepo = new JsonlSessionRepo({\n fileSystem: new NodeExecutionEnv({ cwd: process.cwd() }),\n sessionsRoot: dirname(path),\n });\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 withSessionSnapshot<T>(\n path: string,\n read: (session: Session<JsonlSessionMetadata>, header: CurrentSessionHeader) => Promise<T>,\n): Promise<T> {\n const resolvedPath = canonicalSessionPath(path);\n const dir = mkdtempSync(join(tmpdir(), \"mikan-session-inspect-\"));\n const snapshot = join(dir, basename(resolvedPath));\n let opened: Awaited<ReturnType<typeof openFileSession>> | undefined;\n try {\n writeFileSync(snapshot, readFileSync(resolvedPath), { mode: 0o600, flag: \"wx\" });\n const header = parseCurrentHeader(resolvedPath, readHeaderLine(snapshot));\n opened = await openFileSession(snapshot, header);\n return await read(opened.session, header);\n } finally {\n try {\n await opened?.session.close(TODO_CONTEXT);\n } finally {\n try {\n await opened?.repo.close(TODO_CONTEXT);\n } finally {\n rmSync(dir, { recursive: true, force: true });\n }\n }\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 = entries.slice(Math.max(0, compactionIndex));\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 mcp: McpToolsResult | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n private harness: AgentHarness | undefined;\n private harnessLane: AgentLane | undefined;\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 opened = await openFileSession(writerPath, header);\n const metadata = (await opened.session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\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 inspectExecution(path: string): Promise<{\n open: boolean;\n started: boolean;\n result?: { status: \"completed\" | \"aborted\" | \"failed\" | \"declined\"; endedAt: number };\n }> {\n return withSessionSnapshot(path, async (session) => {\n const state = (await session.getValue(laneState(\"main\"), TODO_CONTEXT))?.value;\n const result = state?.lastOperationId\n ? (await session.getValue(operationResult(state.lastOperationId), TODO_CONTEXT))?.value\n : undefined;\n return {\n open: state?.currentOperationId != null,\n started: state?.currentOperationId != null || state?.lastOperationId != null,\n result: result ? { status: result.status, endedAt: result.endedAt } : undefined,\n };\n });\n }\n\n static async inspect(path: string): Promise<SessionInspection> {\n return withSessionSnapshot(path, async (session, header) => {\n const metadata = (await session.getValue(MIKAN_METADATA, TODO_CONTEXT))?.value;\n const entries = await session.findEntries({ order: \"asc\" }, TODO_CONTEXT);\n const name = await session.getName(TODO_CONTEXT);\n const branchObject = await mainBranch(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 });\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 {\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 connectMcp(servers: Record<string, McpServerConfig>, signal?: AbortSignal) {\n return this.mutate(async () => {\n if (this.mcp) throw new Error(\"SessionStore already has MCP connections\");\n this.mcp = await loadMcpTools(servers, signal);\n for (const error of this.mcp.errors) {\n log.logWarning(`MCP server unavailable: ${error.server}`, error.error);\n }\n signal?.throwIfAborted();\n return this.mcp.tools;\n });\n }\n\n withMcpInstructions(prompt: string): string {\n const instructions = formatMcpServerInstructions(this.mcp?.instructions ?? []);\n return instructions ? `${prompt}\\n\\n${instructions}` : prompt;\n }\n\n async createHarness(options: Omit<AgentHarnessOptions, \"session\">): Promise<AgentHarness> {\n return this.mutate(async () => {\n if (this.harness) throw new Error(\"SessionStore already has an attached harness\");\n const { session } = await this.live();\n const { harness } = await AgentHarness.create({ ...options, session }, TODO_CONTEXT);\n this.harness = harness;\n this.harnessLane = await harness.lane(\"main\", TODO_CONTEXT);\n return harness;\n });\n }\n\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => {\n if (this.harnessLane) return this.harnessLane.appendMessage(toDurable(message), TODO_CONTEXT);\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 if (this.harnessLane) {\n return this.harnessLane.appendCustomEntry(\n customType,\n toDurable(data) as JsonValue,\n TODO_CONTEXT,\n );\n }\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 close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n this.closePromise = this.mutationTail\n .then(async () => {\n try {\n await this.mcp?.dispose();\n } finally {\n if (this.state.kind === \"live\") {\n try {\n if (this.harness) await this.harness.close(TODO_CONTEXT);\n else await this.state.session.close(TODO_CONTEXT);\n } finally {\n await this.state.repo?.close(TODO_CONTEXT);\n }\n }\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 parentSessionId: pending.header.parentSessionId,\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"]}
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/sessions/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, existsSync, mkdirSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { dirname } from \"node:path\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { JsonValue } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT } from \"@earendil-works/chord/context\";\nimport type { Message, Models } from \"@earendil-works/pi-ai\";\nimport { calculateContextTokens } from \"@earendil-works/pi-ai/utils/estimate\";\nimport {\n AssistantEntry,\n CompactionEntry,\n Harness,\n LiveDoc,\n MemoryStorage,\n ROOT_CONVERSATION_ID,\n ToolResultEntry,\n UserEntry,\n createRegistry,\n defineDoc,\n defineEntry,\n type Conversation,\n type ConversationId,\n type EntryId,\n type EntryRecord,\n type HarnessOptions,\n type HarnessSettings,\n type Registry,\n type Storage,\n type Tx,\n} from \"@earendil-works/pi-durable\";\nimport { openNodeSqliteStorage } from \"@earendil-works/pi-durable/storage/sqlite/node\";\nimport type { Office } from \"../office/types.js\";\nimport type {\n ImportedSession,\n ImportedSessionEntry,\n SessionContext,\n SessionEntry,\n SessionHeader,\n SessionInspection,\n SessionListing,\n SessionRunRecord,\n SessionRunStatus,\n} from \"./types.js\";\nimport { RUN_CAUSE_CUSTOM_TYPE } from \"./types.js\";\nimport { loadMcpTools, formatMcpServerInstructions } from \"../harness/mcp.js\";\nimport type { McpServerConfig, McpToolsResult } from \"../harness/types.js\";\nimport * as log from \"../log.js\";\nimport { compactionSummaryOf, wrapCompactionSummary } from \"./compaction-summary.js\";\nimport { isThreadSessionKey } from \"./session-key.js\";\nimport { errorMessage, isRecord } from \"../unknown-values.js\";\n\nconst context = BACKGROUND_CONTEXT;\nconst ENTRY_PAGE_SIZE = 500;\n\ntype SessionDocState = Partial<{\n name: string;\n run: Partial<SessionRunRecord>;\n}>;\n\nconst SessionDoc = defineDoc<SessionDocState>({\n kind: \"mikan.session\",\n version: 1,\n scope: \"conversation\",\n history: \"latest\",\n fork: \"initial\",\n initial: () => ({}),\n});\n\ntype SessionIndexRecord = Required<{\n conversationId: number;\n id: string;\n createdAt: number;\n}>;\n\ntype SessionIndexState = Required<{ sessions: Record<string, SessionIndexRecord> }>;\n\nconst SessionIndexDoc = defineDoc<SessionIndexState>({\n kind: \"mikan.sessions\",\n version: 1,\n scope: \"session\",\n initial: () => ({ sessions: {} }),\n});\n\nconst CustomSessionEntry = defineEntry<{\n customType: string;\n data: JsonValue;\n timestamp: number;\n}>(\"mikan.custom\");\n\nexport interface SessionHarnessBinding {\n models: Models;\n requestModels?: Models;\n env?: HarnessOptions[\"env\"];\n settings?: HarnessSettings;\n onReport?: (error: unknown) => void;\n}\n\nexport interface AttachedSessionHarness {\n harness: Harness;\n conversation: Conversation;\n registry: Registry;\n extensionName: string;\n tagRequest(messages: readonly Message[]): readonly Message[];\n}\n\nfunction toJson(input: unknown): JsonValue {\n if (input === undefined) return null;\n const copy: JsonValue = JSON.parse(JSON.stringify(input));\n return copy;\n}\n\nfunction durableMessage(message: Message): Message {\n const copy: Message = JSON.parse(JSON.stringify(message));\n return copy;\n}\n\nfunction messageTimestamp(message: Message | undefined): number {\n return message && \"timestamp\" in message && typeof message.timestamp === \"number\"\n ? message.timestamp\n : 0;\n}\n\nfunction contentText(message: Message | undefined): string {\n if (!message || !(\"content\" in message)) return \"\";\n if (typeof message.content === \"string\") return message.content;\n return message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction toSessionEntry(record: EntryRecord, sessionId: string): SessionEntry | undefined {\n const id = `${sessionId}:${record.id}`;\n const message = record.model?.[0];\n if (UserEntry.is(record) || AssistantEntry.is(record) || ToolResultEntry.is(record)) {\n if (!message) return undefined;\n return { type: \"message\", id, timestamp: messageTimestamp(message), message };\n }\n if (CompactionEntry.is(record)) {\n return {\n type: \"compaction\",\n id,\n timestamp: messageTimestamp(message),\n summary: (message && compactionSummaryOf(message)) ?? contentText(message),\n };\n }\n if (CustomSessionEntry.is(record)) {\n return {\n type: \"custom\",\n id,\n timestamp: record.data.timestamp,\n customType: record.data.customType,\n data: record.data.data ?? undefined,\n };\n }\n return undefined;\n}\n\nfunction toSessionEntries(records: readonly EntryRecord[], sessionId: string): SessionEntry[] {\n return records.flatMap((record) => toSessionEntry(record, sessionId) ?? []);\n}\n\nasync function readRecords(conversation: Conversation): Promise<EntryRecord[]> {\n const records: EntryRecord[] = [];\n let cursor: Parameters<Conversation[\"entries\"]>[2];\n do {\n const page = await conversation.entries({}, ENTRY_PAGE_SIZE, cursor, context);\n records.push(...page.items);\n cursor = page.next;\n } while (cursor !== undefined);\n return records.toReversed();\n}\n\nasync function readContext(conversation: Conversation): Promise<SessionContext> {\n const view = await conversation.context(context);\n const messages: AgentMessage[] = view.messages\n .filter((message) => message.role !== \"system\")\n .map(durableMessage);\n return { messages };\n}\n\nfunction bindModels(models: Models, property: PropertyKey): unknown {\n const value = Reflect.get(models, property, models) as unknown;\n return typeof value === \"function\" ? value.bind(models) : value;\n}\n\nfunction requestOwnerKey(request: unknown): object | undefined {\n if (typeof request !== \"object\" || request === null || !(\"messages\" in request)) return undefined;\n const { messages } = request;\n if (!Array.isArray(messages)) return undefined;\n const last: unknown = messages.at(-1);\n return typeof last === \"object\" && last !== null ? last : undefined;\n}\n\nfunction protectStorageFiles(path: string): void {\n for (const file of [path, `${path}-wal`, `${path}-shm`]) {\n if (existsSync(file)) chmodSync(file, 0o600);\n }\n}\n\nconst REQUEST_METHODS = new Set<PropertyKey>([\"streamSimple\", \"completeSimple\"]);\n\nclass OfficeStorage {\n private static readonly pool = new Map<string, Promise<OfficeStorage>>();\n readonly registry: Registry = createRegistry();\n private opened: Harness | undefined;\n private refs = 0;\n private readonly bindings = new Map<ConversationId, SessionHarnessBinding>();\n private readonly owners = new WeakMap<object, ConversationId>();\n private readonly writers = new Set<ConversationId>();\n\n private constructor(private readonly path: string | null) {}\n\n get harness(): Harness {\n if (!this.opened) throw new Error(\"Office session storage is not open\");\n return this.opened;\n }\n\n static async acquire(path: string): Promise<OfficeStorage> {\n let pending = OfficeStorage.pool.get(path);\n if (!pending) {\n pending = OfficeStorage.openShared(path);\n OfficeStorage.pool.set(path, pending);\n pending.catch(() => OfficeStorage.pool.delete(path));\n }\n const storage = await pending;\n storage.refs += 1;\n return storage;\n }\n\n static async inMemory(): Promise<OfficeStorage> {\n const storage = await OfficeStorage.open(null, new MemoryStorage());\n storage.refs = 1;\n return storage;\n }\n\n private static async openShared(path: string): Promise<OfficeStorage> {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n const storage = await OfficeStorage.open(path, await openNodeSqliteStorage(path));\n protectStorageFiles(path);\n await storage.abortUnfinishedWork();\n return storage;\n }\n\n private static async open(path: string | null, backend: Storage): Promise<OfficeStorage> {\n const storage = new OfficeStorage(path);\n storage.opened = await Harness.open(backend, storage.harnessOptions(), context);\n return storage;\n }\n\n private harnessOptions(): HarnessOptions {\n const latest = (): SessionHarnessBinding | undefined => [...this.bindings.values()].at(-1);\n const fallback = (): Models => {\n const models = latest()?.models;\n if (!models) throw new Error(\"Session has no model binding; start a run to use the model\");\n return models;\n };\n const models = new Proxy({} as Models, {\n get: (_target, property) => {\n if (!REQUEST_METHODS.has(property)) return bindModels(fallback(), property);\n return (...args: unknown[]) => {\n const key = requestOwnerKey(args[1]);\n const owner = key ? this.owners.get(key) : undefined;\n const binding = owner === undefined ? undefined : this.bindings.get(owner);\n const target = binding?.requestModels ?? binding?.models ?? fallback();\n const method = Reflect.get(target, property, target) as (...input: unknown[]) => unknown;\n return method.apply(target, args);\n };\n },\n });\n const settings = (): HarnessSettings | undefined => latest()?.settings;\n return {\n models,\n registry: this.registry,\n settings: {\n extensions: [],\n get stream() {\n return settings()?.stream;\n },\n get retry() {\n return settings()?.retry;\n },\n get compaction() {\n return settings()?.compaction;\n },\n get toolExecution() {\n return settings()?.toolExecution;\n },\n get steeringMode() {\n return settings()?.steeringMode;\n },\n get followUpMode() {\n return settings()?.followUpMode;\n },\n },\n env: (target, envContext) =>\n this.bindings.get(target.conversationId)?.env?.(target, envContext),\n onReport: (error) => {\n const report = latest()?.onReport;\n if (report) report(error);\n else log.logWarning(\"Durable harness report\", errorMessage(error));\n },\n };\n }\n\n private async abortUnfinishedWork(): Promise<void> {\n const { tasks } = await this.harness.inspect(context);\n const unowned = tasks.filter((task) => !task.record.owner);\n if (unowned.length === 0) return;\n log.logWarning(\n `Aborting ${unowned.length} durable tasks left unfinished by a previous process`,\n );\n for (const task of unowned) await this.harness.abortTask(task.record.id, context);\n }\n\n async index(): Promise<Readonly<Record<string, SessionIndexRecord>>> {\n return (await this.harness.snapshot(SessionIndexDoc, context))?.sessions ?? {};\n }\n\n claimWriter(conversationId: ConversationId, key: string): void {\n if (this.writers.has(conversationId)) {\n throw new Error(`Session already has an active writer: ${key}`);\n }\n this.writers.add(conversationId);\n }\n\n releaseWriter(conversationId: ConversationId): void {\n this.writers.delete(conversationId);\n }\n\n bind(conversationId: ConversationId, binding: SessionHarnessBinding): void {\n if (this.bindings.has(conversationId)) {\n throw new Error(\"Session already has an attached harness\");\n }\n this.bindings.set(conversationId, binding);\n }\n\n unbind(conversationId: ConversationId): void {\n this.bindings.delete(conversationId);\n }\n\n tag(conversationId: ConversationId, messages: readonly Message[]): readonly Message[] {\n const last = messages.at(-1);\n if (!last) return messages;\n const tagged = { ...last };\n this.owners.set(tagged, conversationId);\n return [...messages.slice(0, -1), tagged];\n }\n\n async release(): Promise<void> {\n this.refs -= 1;\n if (this.refs > 0) return;\n if (this.path !== null) OfficeStorage.pool.delete(this.path);\n await this.harness.close(context);\n }\n}\n\nfunction writeSessionIndex(tx: Tx, key: string, record: SessionIndexRecord): Promise<void> {\n return tx.doc(SessionIndexDoc).then((doc) => {\n doc.sessions[key] = record;\n });\n}\n\nasync function lookupSession(\n storage: OfficeStorage,\n key: string,\n): Promise<{ conversation: Conversation; record: SessionIndexRecord } | undefined> {\n const record = (await storage.index())[key];\n if (!record) return undefined;\n const conversation = await storage.harness.conversation(\n record.conversationId as ConversationId,\n context,\n );\n return conversation ? { conversation, record } : undefined;\n}\n\nasync function createSession(\n storage: OfficeStorage,\n key: string,\n): Promise<{ conversation: Conversation; record: SessionIndexRecord }> {\n let record: SessionIndexRecord | undefined;\n const init = async (tx: Tx, conversationId: ConversationId) => {\n record = { conversationId, id: randomUUID(), createdAt: Date.now() };\n await writeSessionIndex(tx, key, record);\n };\n const conversation = isThreadSessionKey(key)\n ? await storage.harness.createConversation({ ownership: { kind: \"ownerless\" }, init }, context)\n : await storage.harness.root(context, { init });\n if (!record) {\n record = { conversationId: conversation.id, id: randomUUID(), createdAt: Date.now() };\n const created = record;\n await conversation.commit((tx) => writeSessionIndex(tx, key, created), context);\n }\n return { conversation, record };\n}\n\nasync function parentSessionId(\n storage: OfficeStorage,\n conversationId: ConversationId,\n): Promise<string | undefined> {\n const parent = await storage.harness.commit(\n async (tx) => (await tx.conversation(conversationId))?.parent,\n context,\n );\n if (!parent) return undefined;\n const records = Object.values(await storage.index());\n return records.find((record) => record.conversationId === parent.conversationId)?.id;\n}\n\nfunction isRunCause(record: EntryRecord, messageId?: string): boolean {\n if (!CustomSessionEntry.is(record) || record.data.customType !== RUN_CAUSE_CUSTOM_TYPE) {\n return false;\n }\n const { data } = record.data;\n return messageId === undefined || (isRecord(data) && data.messageId === messageId);\n}\n\nfunction runEnd(records: readonly EntryRecord[], messageId: string): EntryId | undefined {\n const start = records.findLastIndex((record) => isRunCause(record, messageId));\n if (start < 0) return undefined;\n const next = records.findIndex((record, index) => index > start && isRunCause(record));\n const run = records.slice(start, next < 0 ? undefined : next);\n return (run.findLast((record) => AssistantEntry.is(record)) ?? run.at(-1))?.id;\n}\n\nconst EARLIER_SESSION_PREFIX = \"earlier:\";\n\nexport function earlierSessionKey(sessionId: string): string {\n return `${EARLIER_SESSION_PREFIX}${sessionId}`;\n}\n\nexport function isEarlierSessionKey(key: string): boolean {\n return key.startsWith(EARLIER_SESSION_PREFIX);\n}\n\nasync function appendImportedEntry(\n tx: Tx,\n conversationId: ConversationId,\n entry: ImportedSessionEntry,\n): Promise<void> {\n switch (entry.type) {\n case \"message\": {\n const model = [durableMessage(entry.message)];\n if (entry.message.role === \"user\") await tx.appendEntry(UserEntry, conversationId, { model });\n else if (entry.message.role === \"assistant\") {\n await tx.appendEntry(AssistantEntry, conversationId, { model });\n } else {\n await tx.appendEntry(ToolResultEntry, conversationId, {\n model,\n data: { diagnostics: [] },\n });\n }\n return;\n }\n case \"compaction\":\n await tx.appendEntry(CompactionEntry, conversationId, {\n model: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: wrapCompactionSummary(entry.summary) }],\n timestamp: entry.timestamp,\n },\n ],\n data: { reason: \"manual\" },\n head: \"self\",\n });\n return;\n case \"custom\":\n await tx.appendEntry(CustomSessionEntry, conversationId, {\n data: {\n customType: entry.customType,\n data: toJson(entry.data),\n timestamp: entry.timestamp,\n },\n });\n return;\n default:\n entry satisfies never;\n }\n}\n\nexport async function importOfficeSessions(\n path: string,\n sessions: readonly ImportedSession[],\n): Promise<void> {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n const harness = await Harness.open(\n await openNodeSqliteStorage(path),\n { models: {} as Models, registry: createRegistry(), settings: { extensions: [] } },\n context,\n );\n try {\n for (const session of sessions) {\n const init = async (tx: Tx, conversationId: ConversationId) => {\n for (const entry of session.entries) await appendImportedEntry(tx, conversationId, entry);\n if (session.name) (await tx.doc(SessionDoc, conversationId)).name = session.name;\n await writeSessionIndex(tx, session.key, {\n conversationId,\n id: session.id,\n createdAt: session.createdAt,\n });\n };\n if (session.root) await harness.root(context, { init });\n else await harness.createConversation({ ownership: { kind: \"ownerless\" }, init }, context);\n }\n } finally {\n await harness.close(context);\n }\n protectStorageFiles(path);\n}\n\nexport async function readImportedContexts(path: string): Promise<Map<string, AgentMessage[]>> {\n const harness = await Harness.open(\n await openNodeSqliteStorage(path),\n { models: {} as Models, registry: createRegistry(), settings: { extensions: [] } },\n context,\n );\n try {\n const index = (await harness.snapshot(SessionIndexDoc, context))?.sessions ?? {};\n const contexts = new Map<string, AgentMessage[]>();\n for (const [key, record] of Object.entries(index)) {\n const conversation = await harness.conversation(\n record.conversationId as ConversationId,\n context,\n );\n if (conversation) contexts.set(key, (await readContext(conversation)).messages);\n }\n return contexts;\n } finally {\n await harness.close(context);\n }\n}\n\nclass CachedSessionInspection implements SessionInspection {\n constructor(\n private readonly header: SessionHeader,\n private readonly entries: SessionEntry[],\n private readonly name: string | undefined,\n private readonly sessionContext: SessionContext,\n ) {}\n\n getHeader(): SessionHeader {\n return structuredClone(this.header);\n }\n\n async getEntries(): Promise<SessionEntry[]> {\n return structuredClone(this.entries);\n }\n\n async getSessionName(): Promise<string | undefined> {\n return this.name;\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n return structuredClone(this.sessionContext);\n }\n}\n\nasync function withOfficeStorage<T>(\n office: Office,\n read: (storage: OfficeStorage) => Promise<T>,\n): Promise<T> {\n const storage = await OfficeStorage.acquire(office.sessionsPath);\n try {\n return await read(storage);\n } finally {\n await storage.release();\n }\n}\n\nexport class SessionStore implements SessionInspection {\n private mcp: McpToolsResult | undefined;\n private mutationTail: Promise<void> = Promise.resolve();\n private closePromise: Promise<void> | undefined;\n private closed = false;\n private bound = false;\n\n private constructor(\n private readonly storage: OfficeStorage,\n private readonly conversation: Conversation,\n private readonly header: SessionHeader,\n ) {}\n\n static async open(office: Office, key: string): Promise<SessionStore> {\n const storage = await OfficeStorage.acquire(office.sessionsPath);\n try {\n const session = (await lookupSession(storage, key)) ?? (await createSession(storage, key));\n storage.claimWriter(session.conversation.id, key);\n return new SessionStore(storage, session.conversation, {\n id: session.record.id,\n createdAt: session.record.createdAt,\n parentSessionId: await parentSessionId(storage, session.conversation.id),\n });\n } catch (error) {\n await storage.release();\n throw error;\n }\n }\n\n static async forkRun(\n office: Office,\n key: string,\n cause: { sessionKey: string; messageId: string },\n entries: readonly ImportedSessionEntry[],\n ): Promise<boolean> {\n return withOfficeStorage(office, async (storage) => {\n if ((await storage.index())[key]) return false;\n const parent = await lookupSession(storage, cause.sessionKey);\n if (!parent) return false;\n const at = runEnd(await readRecords(parent.conversation), cause.messageId);\n if (at === undefined) return false;\n await parent.conversation.fork(\n at,\n {\n ownership: { kind: \"ownerless\" },\n init: async (tx, conversationId) => {\n for (const entry of entries) await appendImportedEntry(tx, conversationId, entry);\n await writeSessionIndex(tx, key, {\n conversationId,\n id: randomUUID(),\n createdAt: Date.now(),\n });\n },\n },\n context,\n );\n return true;\n });\n }\n\n static async inMemory(): Promise<SessionStore> {\n const storage = await OfficeStorage.inMemory();\n const conversation = await storage.harness.root(context);\n return new SessionStore(storage, conversation, { id: randomUUID(), createdAt: Date.now() });\n }\n\n static async exists(office: Office, key: string): Promise<boolean> {\n if (!existsSync(office.sessionsPath)) return false;\n return withOfficeStorage(office, async (storage) => (await storage.index())[key] !== undefined);\n }\n\n static async list(office: Office): Promise<SessionListing[]> {\n if (!existsSync(office.sessionsPath)) return [];\n return withOfficeStorage(office, async (storage) => {\n const index = await storage.index();\n const byConversation = new Map(\n Object.values(index).map((record) => [record.conversationId, record.id]),\n );\n return Promise.all(\n Object.entries(index).map(async ([key, record]) => {\n const parent = await storage.harness.commit(\n async (tx) => (await tx.conversation(record.conversationId as ConversationId))?.parent,\n context,\n );\n const parentId = parent ? byConversation.get(parent.conversationId) : undefined;\n return {\n key,\n id: record.id,\n createdAt: record.createdAt,\n root: record.conversationId === ROOT_CONVERSATION_ID,\n parentSessionId: parentId,\n forkEntryId: parent && parentId ? `${parentId}:${parent.at}` : undefined,\n };\n }),\n );\n });\n }\n\n static async inspect(office: Office, key: string): Promise<SessionInspection | undefined> {\n if (!existsSync(office.sessionsPath)) return undefined;\n return withOfficeStorage(office, async (storage) => {\n const session = await lookupSession(storage, key);\n if (!session) return undefined;\n const { conversation, record } = session;\n const name = (await storage.harness.snapshot(SessionDoc, conversation.id, context))?.name;\n return new CachedSessionInspection(\n {\n id: record.id,\n createdAt: record.createdAt,\n parentSessionId: await parentSessionId(storage, conversation.id),\n },\n toSessionEntries(await readRecords(conversation), record.id),\n name,\n await readContext(conversation),\n );\n });\n }\n\n static async inspectExecution(\n office: Office,\n key: string,\n ): Promise<{\n open: boolean;\n started: boolean;\n result?: { status: SessionRunStatus; endedAt: number };\n }> {\n if (!existsSync(office.sessionsPath)) return { open: false, started: false };\n return withOfficeStorage(office, async (storage) => {\n const session = await lookupSession(storage, key);\n if (!session) return { open: false, started: false };\n const id = session.conversation.id;\n const live = await storage.harness.snapshot(LiveDoc, id, context);\n const run = (await storage.harness.snapshot(SessionDoc, id, context))?.run;\n const open = live?.run !== undefined;\n return {\n open,\n started: open || run !== undefined,\n result:\n run?.endedAt !== undefined && run.status !== undefined\n ? { status: run.status, endedAt: run.endedAt }\n : undefined,\n };\n });\n }\n\n getHeader(): SessionHeader {\n this.assertOpen();\n return structuredClone(this.header);\n }\n\n getSessionId(): string {\n this.assertOpen();\n return this.header.id;\n }\n\n async getEntries(): Promise<SessionEntry[]> {\n this.assertOpen();\n return toSessionEntries(await readRecords(this.conversation), this.header.id);\n }\n\n async getContextEntries(): Promise<SessionEntry[]> {\n this.assertOpen();\n const view = await this.conversation.context(context);\n return toSessionEntries(view.entries, this.header.id);\n }\n\n async getContextTokens(): Promise<number | undefined> {\n this.assertOpen();\n const view = await this.conversation.context(context);\n const after = view.head?.id ?? Number.NEGATIVE_INFINITY;\n for (const record of view.entries.toReversed()) {\n const message = record.model?.[0];\n if (record.id <= after || !AssistantEntry.is(record) || message?.role !== \"assistant\")\n continue;\n if (message.stopReason === \"aborted\" || message.stopReason === \"error\") continue;\n return calculateContextTokens(message.usage);\n }\n return undefined;\n }\n\n async getSessionName(): Promise<string | undefined> {\n this.assertOpen();\n return (await this.storage.harness.snapshot(SessionDoc, this.conversation.id, context))?.name;\n }\n\n async buildSessionContext(): Promise<SessionContext> {\n this.assertOpen();\n return readContext(this.conversation);\n }\n\n async connectMcp(servers: Record<string, McpServerConfig>, signal?: AbortSignal) {\n return this.mutate(async () => {\n if (this.mcp) throw new Error(\"SessionStore already has MCP connections\");\n this.mcp = await loadMcpTools(servers, signal);\n for (const error of this.mcp.errors) {\n log.logWarning(`MCP server unavailable: ${error.server}`, error.error);\n }\n signal?.throwIfAborted();\n return this.mcp.tools;\n });\n }\n\n withMcpInstructions(prompt: string): string {\n const instructions = formatMcpServerInstructions(this.mcp?.instructions ?? []);\n return instructions ? `${prompt}\\n\\n${instructions}` : prompt;\n }\n\n async bindHarness(binding: SessionHarnessBinding): Promise<AttachedSessionHarness> {\n return this.mutate(async () => {\n this.storage.bind(this.conversation.id, binding);\n this.bound = true;\n const conversationId = this.conversation.id;\n return {\n harness: this.storage.harness,\n conversation: this.conversation,\n registry: this.storage.registry,\n extensionName: `mikan.${conversationId}`,\n tagRequest: (messages) => this.storage.tag(conversationId, messages),\n };\n });\n }\n\n async appendMessage(message: AgentMessage): Promise<string> {\n return this.mutate(async () => {\n const conversation = this.conversation;\n const model = [durableMessage(message)];\n const entry = await conversation.commit((tx): Promise<EntryRecord> => {\n switch (message.role) {\n case \"user\":\n return tx.appendEntry(UserEntry, conversation.id, { model });\n case \"assistant\":\n return tx.appendEntry(AssistantEntry, conversation.id, { model });\n case \"toolResult\":\n return tx.appendEntry(ToolResultEntry, conversation.id, {\n model,\n data: { diagnostics: [] },\n });\n default:\n throw new Error(\"Only user, assistant, and tool result messages enter a session\");\n }\n }, context);\n return `${this.header.id}:${entry.id}`;\n });\n }\n\n async appendCustomEntry(\n customType: string,\n data?: unknown,\n timestamp = Date.now(),\n ): Promise<string> {\n return this.mutate(async () => {\n const conversation = this.conversation;\n const entry = await conversation.commit(\n (tx) =>\n tx.appendEntry(CustomSessionEntry, conversation.id, {\n data: { customType, data: toJson(data), timestamp },\n }),\n context,\n );\n return `${this.header.id}:${entry.id}`;\n });\n }\n\n async appendCompactionSummary(summary: string, timestamp: number): Promise<string> {\n const text = wrapCompactionSummary(summary);\n return this.mutate(async () => {\n const conversation = this.conversation;\n const entry = await conversation.commit(\n (tx) =>\n tx.appendEntry(CompactionEntry, conversation.id, {\n model: [{ role: \"user\", content: [{ type: \"text\", text }], timestamp }],\n data: { reason: \"manual\" },\n head: \"self\",\n }),\n context,\n );\n return `${this.header.id}:${entry.id}`;\n });\n }\n\n async reset(): Promise<void> {\n await this.mutate(() => this.conversation.reset(undefined, context));\n }\n\n async setSessionName(name: string): Promise<void> {\n await this.updateSessionDoc((doc) => {\n doc.name = name.trim() || undefined;\n });\n }\n\n async recordRun(run: SessionRunRecord): Promise<void> {\n await this.updateSessionDoc((doc) => {\n doc.run = { ...run };\n });\n }\n\n async close(): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closed = true;\n const conversationId = this.conversation.id;\n this.closePromise = this.mutationTail.then(async () => {\n try {\n await this.mcp?.dispose();\n } finally {\n if (this.bound) {\n this.storage.registry.uninstall({ name: `mikan.${conversationId}` });\n this.storage.unbind(conversationId);\n }\n this.storage.releaseWriter(conversationId);\n await this.storage.release();\n }\n });\n return this.closePromise;\n }\n\n private async updateSessionDoc(change: (doc: SessionDocState) => void): Promise<void> {\n await this.mutate(async () => {\n const conversation = this.conversation;\n await conversation.commit(async (tx) => {\n change(await tx.doc(SessionDoc, conversation.id));\n }, context);\n });\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"]}
|
package/dist/sessions/types.d.ts
CHANGED
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
import type { Office } from "../office/types.js";
|
|
2
2
|
import type { ConversationKind } from "../types.js";
|
|
3
|
-
import type { AgentMessage
|
|
3
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
4
|
+
import type { Message } from "@earendil-works/pi-ai";
|
|
5
|
+
import type { JsonValue } from "@earendil-works/chord";
|
|
4
6
|
import type { ConversationLogMessage } from "../types.js";
|
|
5
7
|
import type { SessionStore } from "./session-store.js";
|
|
6
|
-
export interface MikanSessionHeader {
|
|
7
|
-
type?: string;
|
|
8
|
-
version?: number;
|
|
9
|
-
id?: string;
|
|
10
|
-
timestamp?: string;
|
|
11
|
-
cwd?: string;
|
|
12
|
-
parentSession?: string;
|
|
13
|
-
source?: {
|
|
14
|
-
kind?: string;
|
|
15
|
-
file?: string;
|
|
16
|
-
recentDays?: number;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
8
|
export interface ResolveSessionKeyOptions {
|
|
20
9
|
conversationId: string;
|
|
21
10
|
conversationKind: ConversationKind;
|
|
@@ -27,56 +16,83 @@ export interface ResolveSessionKeyOptions {
|
|
|
27
16
|
export interface SessionContext {
|
|
28
17
|
messages: AgentMessage[];
|
|
29
18
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
export interface
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
19
|
+
interface SessionEntryBase {
|
|
20
|
+
id: string;
|
|
21
|
+
timestamp: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SessionMessageEntry extends SessionEntryBase {
|
|
24
|
+
type: "message";
|
|
25
|
+
message: AgentMessage;
|
|
26
|
+
}
|
|
27
|
+
export interface SessionCustomEntry extends SessionEntryBase {
|
|
28
|
+
type: "custom";
|
|
29
|
+
customType: string;
|
|
30
|
+
data?: JsonValue;
|
|
31
|
+
}
|
|
32
|
+
export interface SessionCompactionEntry extends SessionEntryBase {
|
|
33
|
+
type: "compaction";
|
|
34
|
+
summary: string;
|
|
35
|
+
}
|
|
36
|
+
export type SessionEntry = SessionMessageEntry | SessionCustomEntry | SessionCompactionEntry;
|
|
37
|
+
export type SessionRunStatus = "completed" | "aborted" | "failed";
|
|
38
|
+
export interface SessionRunRecord {
|
|
39
|
+
endedAt?: number;
|
|
40
|
+
status?: SessionRunStatus;
|
|
38
41
|
}
|
|
42
|
+
export declare const CONTROL_INPUT_CUSTOM_TYPE = "mikan.control_input";
|
|
43
|
+
export declare const RUN_CAUSE_CUSTOM_TYPE = "mikan.run_cause";
|
|
39
44
|
export interface SessionInspection {
|
|
40
45
|
getHeader(): SessionHeader;
|
|
41
|
-
getEntries(): Promise<
|
|
46
|
+
getEntries(): Promise<SessionEntry[]>;
|
|
42
47
|
getSessionName(): Promise<string | undefined>;
|
|
43
|
-
getBranch(fromId?: string): Promise<Entry[]>;
|
|
44
48
|
buildSessionContext(): Promise<SessionContext>;
|
|
45
49
|
}
|
|
46
50
|
export interface SessionHeader {
|
|
47
|
-
type: "session";
|
|
48
|
-
version?: number;
|
|
49
51
|
id: string;
|
|
50
|
-
|
|
51
|
-
cwd: string;
|
|
52
|
-
parentSession?: string;
|
|
52
|
+
createdAt: number;
|
|
53
53
|
parentSessionId?: string;
|
|
54
|
-
[extra: string]: unknown;
|
|
55
|
-
}
|
|
56
|
-
export interface ParentSessionRef {
|
|
57
|
-
path: string;
|
|
58
|
-
id: string;
|
|
59
54
|
}
|
|
60
55
|
export interface ThreadRootMessage {
|
|
61
56
|
text?: string;
|
|
62
57
|
userName?: string;
|
|
63
58
|
user?: string;
|
|
64
|
-
loggedAt?: number;
|
|
65
|
-
isMessagingBot?: boolean;
|
|
66
59
|
}
|
|
67
60
|
export interface ResolvedSessionScope {
|
|
68
|
-
sessionDir: string;
|
|
69
|
-
contextFile: string;
|
|
70
61
|
threadRootMessage: ThreadRootMessage | null;
|
|
71
62
|
}
|
|
63
|
+
export interface SessionListing {
|
|
64
|
+
key: string;
|
|
65
|
+
id: string;
|
|
66
|
+
createdAt: number;
|
|
67
|
+
root: boolean;
|
|
68
|
+
parentSessionId: string | undefined;
|
|
69
|
+
forkEntryId: string | undefined;
|
|
70
|
+
}
|
|
71
|
+
export type ImportedSessionEntry = {
|
|
72
|
+
type: "message";
|
|
73
|
+
message: Message;
|
|
74
|
+
} | {
|
|
75
|
+
type: "compaction";
|
|
76
|
+
summary: string;
|
|
77
|
+
timestamp: number;
|
|
78
|
+
} | {
|
|
79
|
+
type: "custom";
|
|
80
|
+
customType: string;
|
|
81
|
+
data: unknown;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
};
|
|
84
|
+
export interface ImportedSession {
|
|
85
|
+
key: string;
|
|
86
|
+
id: string;
|
|
87
|
+
createdAt: number;
|
|
88
|
+
root: boolean;
|
|
89
|
+
name: string | undefined;
|
|
90
|
+
entries: ImportedSessionEntry[];
|
|
91
|
+
}
|
|
72
92
|
export interface LogRecord {
|
|
73
93
|
message: ConversationLogMessage;
|
|
74
94
|
index: number;
|
|
75
95
|
}
|
|
76
|
-
export interface ChatSyncReport {
|
|
77
|
-
appended: number;
|
|
78
|
-
lastMessageId?: string;
|
|
79
|
-
}
|
|
80
96
|
export interface ChatHistorySyncOptions {
|
|
81
97
|
isCommandText: (text: string) => boolean;
|
|
82
98
|
recentDays?: number;
|
|
@@ -86,7 +102,6 @@ export interface ChatHistorySyncOptions {
|
|
|
86
102
|
export interface ResolveChatSessionScopeOptions {
|
|
87
103
|
office: Office;
|
|
88
104
|
sessionKey: string;
|
|
89
|
-
cwd?: string;
|
|
90
105
|
currentMessageId?: string;
|
|
91
106
|
}
|
|
92
107
|
export interface SyncChatSessionOptions {
|
|
@@ -98,12 +113,10 @@ export interface SyncChatSessionOptions {
|
|
|
98
113
|
export interface ResetChatSessionOptions {
|
|
99
114
|
office: Office;
|
|
100
115
|
sessionKey: string;
|
|
101
|
-
cwd?: string;
|
|
102
116
|
}
|
|
103
117
|
export interface RegisterThreadSessionOptions {
|
|
104
118
|
office: Office;
|
|
105
119
|
sessionKey: string;
|
|
106
|
-
cwd?: string;
|
|
107
120
|
}
|
|
108
121
|
export interface HasMaterializedSessionOptions {
|
|
109
122
|
office: Office;
|
|
@@ -112,9 +125,10 @@ export interface HasMaterializedSessionOptions {
|
|
|
112
125
|
export interface ThreadBootstrapWaitOptions {
|
|
113
126
|
parentSessionKey: string;
|
|
114
127
|
sessionKey: string;
|
|
115
|
-
hasThreadSession: () => boolean
|
|
128
|
+
hasThreadSession: () => Promise<boolean>;
|
|
116
129
|
isParentRunning: () => boolean;
|
|
117
130
|
sleep?: (ms: number) => Promise<void>;
|
|
118
131
|
pollMs?: number;
|
|
119
132
|
}
|
|
133
|
+
export {};
|
|
120
134
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAmDA,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC","sourcesContent":["import type { Office } from \"../office/types.js\";\nimport type { ConversationKind } from \"../types.js\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport type { JsonValue } from \"@earendil-works/chord\";\nimport type { ConversationLogMessage } from \"../types.js\";\nimport type { SessionStore } from \"./session-store.js\";\n\nexport interface ResolveSessionKeyOptions {\n conversationId: string;\n conversationKind: ConversationKind;\n messageId: string;\n threadTs?: string;\n persistentTopLevel?: boolean;\n scopeDirectThreads?: boolean;\n}\n\nexport interface SessionContext {\n messages: AgentMessage[];\n}\n\ninterface SessionEntryBase {\n id: string;\n timestamp: number;\n}\n\nexport interface SessionMessageEntry extends SessionEntryBase {\n type: \"message\";\n message: AgentMessage;\n}\n\nexport interface SessionCustomEntry extends SessionEntryBase {\n type: \"custom\";\n customType: string;\n data?: JsonValue;\n}\n\nexport interface SessionCompactionEntry extends SessionEntryBase {\n type: \"compaction\";\n summary: string;\n}\n\nexport type SessionEntry = SessionMessageEntry | SessionCustomEntry | SessionCompactionEntry;\n\nexport type SessionRunStatus = \"completed\" | \"aborted\" | \"failed\";\n\nexport interface SessionRunRecord {\n endedAt?: number;\n status?: SessionRunStatus;\n}\n\nexport const CONTROL_INPUT_CUSTOM_TYPE = \"mikan.control_input\";\nexport const RUN_CAUSE_CUSTOM_TYPE = \"mikan.run_cause\";\n\nexport interface SessionInspection {\n getHeader(): SessionHeader;\n getEntries(): Promise<SessionEntry[]>;\n getSessionName(): Promise<string | undefined>;\n buildSessionContext(): Promise<SessionContext>;\n}\n\nexport interface SessionHeader {\n id: string;\n createdAt: number;\n parentSessionId?: string;\n}\n\nexport interface ThreadRootMessage {\n text?: string;\n userName?: string;\n user?: string;\n}\n\nexport interface ResolvedSessionScope {\n threadRootMessage: ThreadRootMessage | null;\n}\n\nexport interface SessionListing {\n key: string;\n id: string;\n createdAt: number;\n root: boolean;\n parentSessionId: string | undefined;\n forkEntryId: string | undefined;\n}\n\nexport type ImportedSessionEntry =\n | { type: \"message\"; message: Message }\n | { type: \"compaction\"; summary: string; timestamp: number }\n | { type: \"custom\"; customType: string; data: unknown; timestamp: number };\n\nexport interface ImportedSession {\n key: string;\n id: string;\n createdAt: number;\n root: boolean;\n name: string | undefined;\n entries: ImportedSessionEntry[];\n}\n\nexport interface LogRecord {\n message: ConversationLogMessage;\n index: number;\n}\n\nexport interface ChatHistorySyncOptions {\n isCommandText: (text: string) => boolean;\n recentDays?: number;\n maxTopLevelMessages?: number;\n now?: () => Date;\n}\n\nexport interface ResolveChatSessionScopeOptions {\n office: Office;\n sessionKey: string;\n currentMessageId?: string;\n}\n\nexport interface SyncChatSessionOptions {\n office: Office;\n sessionKey: string;\n sessionManager: SessionStore;\n currentMessageId?: string;\n}\n\nexport interface ResetChatSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface RegisterThreadSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface HasMaterializedSessionOptions {\n office: Office;\n sessionKey: string;\n}\n\nexport interface ThreadBootstrapWaitOptions {\n parentSessionKey: string;\n sessionKey: string;\n hasThreadSession: () => Promise<boolean>;\n isParentRunning: () => boolean;\n sleep?: (ms: number) => Promise<void>;\n pollMs?: number;\n}\n"]}
|
package/dist/settings/apply.js
CHANGED
|
@@ -9,7 +9,7 @@ export function applyConversationSettings(runtime, office, patch) {
|
|
|
9
9
|
let runtimeSwitched = null;
|
|
10
10
|
if (affectsCachedRunner(patch) && runtime) {
|
|
11
11
|
if (!runtime.switchConversationModel(office.address, patch.provider ?? "", patch.model ?? "")) {
|
|
12
|
-
return { ok: false
|
|
12
|
+
return { ok: false };
|
|
13
13
|
}
|
|
14
14
|
runtimeSwitched = true;
|
|
15
15
|
}
|
|
@@ -23,7 +23,7 @@ export function applyGlobalSettings(runtime, patch) {
|
|
|
23
23
|
}
|
|
24
24
|
export function applyOfficeVisibility(runtime, office, visibility) {
|
|
25
25
|
if (runtime && !runtime.refreshConversationEnvironment(office.address)) {
|
|
26
|
-
return { ok: false
|
|
26
|
+
return { ok: false };
|
|
27
27
|
}
|
|
28
28
|
setOfficeVisibilityOverride(office, visibility);
|
|
29
29
|
return { ok: true, runtimeSwitched: runtime ? true : null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/settings/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAUpB,SAAS,mBAAmB,CAAC,KAA2B;IACtD,OAAO,CACL,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,aAAa,KAAK,SAAS;QACjC,KAAK,CAAC,UAAU,KAAK,SAAS,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAuC,EACvC,MAAc,EACd,KAA2B;IAE3B,IAAI,eAAe,GAAmB,IAAI,CAAC;IAC3C,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/settings/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAUpB,SAAS,mBAAmB,CAAC,KAA2B;IACtD,OAAO,CACL,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,aAAa,KAAK,SAAS;QACjC,KAAK,CAAC,UAAU,KAAK,SAAS,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAuC,EACvC,MAAc,EACd,KAA2B;IAE3B,IAAI,eAAe,GAAmB,IAAI,CAAC;IAC3C,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA6C,EAC7C,KAA2B;IAE3B,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,kBAAkB,GACtB,mBAAmB,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAuC,EACvC,MAAc,EACd,UAA4B;IAE5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,2BAA2B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9D,CAAC","sourcesContent":["import {\n setOfficeVisibilityOverride,\n updateConversationSettings,\n updateGlobalSettings,\n} from \"./index.js\";\nimport type { Office } from \"../office/types.js\";\nimport type {\n AgentConfig,\n GlobalRunnerCacheControl,\n OfficeAddress,\n RunnerCacheControl,\n SettingsApplyResult,\n} from \"../types.js\";\n\nfunction affectsCachedRunner(patch: Partial<AgentConfig>): boolean {\n return (\n patch.provider !== undefined ||\n patch.model !== undefined ||\n patch.thinkingLevel !== undefined ||\n patch.mcpServers !== undefined\n );\n}\n\nexport function applyConversationSettings(\n runtime: RunnerCacheControl | undefined,\n office: Office,\n patch: Partial<AgentConfig>,\n): SettingsApplyResult {\n let runtimeSwitched: boolean | null = null;\n if (affectsCachedRunner(patch) && runtime) {\n if (!runtime.switchConversationModel(office.address, patch.provider ?? \"\", patch.model ?? \"\")) {\n return { ok: false };\n }\n runtimeSwitched = true;\n }\n updateConversationSettings(office, patch);\n return { ok: true, runtimeSwitched };\n}\n\nexport function applyGlobalSettings(\n runtime: GlobalRunnerCacheControl | undefined,\n patch: Partial<AgentConfig>,\n): { ok: true; staleConversations: OfficeAddress[] } {\n updateGlobalSettings(patch);\n const staleConversations =\n affectsCachedRunner(patch) && runtime ? runtime.refreshAllConversations().busy : [];\n return { ok: true, staleConversations };\n}\n\nexport function applyOfficeVisibility(\n runtime: RunnerCacheControl | undefined,\n office: Office,\n visibility: \"private\" | null,\n): SettingsApplyResult {\n if (runtime && !runtime.refreshConversationEnvironment(office.address)) {\n return { ok: false };\n }\n setOfficeVisibilityOverride(office, visibility);\n return { ok: true, runtimeSwitched: runtime ? true : null };\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -146,7 +146,9 @@ export interface MessagingBot {
|
|
|
146
146
|
openDirectConversation?(userId: string): Promise<string>;
|
|
147
147
|
fetchHistory?(channel: string, options?: PlatformHistoryOptions): Promise<PlatformHistoryMessage[]>;
|
|
148
148
|
listUsers?(): Promise<PlatformUserInfo[]>;
|
|
149
|
-
logBotResponse?(channel: string, text: string, ts: string, threadTs?: string
|
|
149
|
+
logBotResponse?(channel: string, text: string, ts: string, threadTs?: string, extra?: {
|
|
150
|
+
answer?: RunAnswer;
|
|
151
|
+
}): void;
|
|
150
152
|
enqueueEvent(event: ConversationEvent): boolean;
|
|
151
153
|
getMessagingInfo(): MessagingInfo;
|
|
152
154
|
postPrivate?(conversationId: string, userId: string, text: string): Promise<void>;
|
|
@@ -236,10 +238,16 @@ export interface AgentConfig {
|
|
|
236
238
|
};
|
|
237
239
|
mcpServers?: Record<string, McpServerConfig>;
|
|
238
240
|
}
|
|
241
|
+
export interface RunAnswer {
|
|
242
|
+
replyTo: string;
|
|
243
|
+
sessionKey: string;
|
|
244
|
+
}
|
|
239
245
|
export interface ConversationLogMessage {
|
|
240
246
|
date?: string;
|
|
241
247
|
ts?: string;
|
|
242
248
|
threadTs?: string;
|
|
249
|
+
replyTo?: string;
|
|
250
|
+
sessionKey?: string;
|
|
243
251
|
user?: string;
|
|
244
252
|
userName?: string;
|
|
245
253
|
text?: string;
|
|
@@ -352,7 +360,6 @@ export type SettingsApplyResult = {
|
|
|
352
360
|
runtimeSwitched: boolean | null;
|
|
353
361
|
} | {
|
|
354
362
|
ok: false;
|
|
355
|
-
reason: "busy";
|
|
356
363
|
};
|
|
357
364
|
export interface CreateRunnerOptions {
|
|
358
365
|
sandboxConfig: SandboxConfig;
|
|
@@ -381,7 +388,7 @@ export interface SessionViewTokenCreateOptions {
|
|
|
381
388
|
platformUserId: string;
|
|
382
389
|
conversationId: string;
|
|
383
390
|
sessionKey: string;
|
|
384
|
-
|
|
391
|
+
office: Office;
|
|
385
392
|
platformUserName?: string;
|
|
386
393
|
}
|
|
387
394
|
export interface SessionViewTokenStoreLike {
|