@averyyy/pi-server 1.2.0-piclient.2 → 1.3.0-piclient.2
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 +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +0 -5
- package/dist/server.js.map +1 -1
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +0 -2
- package/dist/session-persistence.js.map +1 -1
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +0 -1
- package/dist/session-store.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
|
|
27
27
|
### Fixed
|
|
28
28
|
|
|
29
|
+
- Rejected newer WAL records that overlap the session snapshot instead of silently dropping them, while continuing to ignore revisions already included in the snapshot.
|
|
30
|
+
- Removed repeated leaf and compaction-run checks after the same synchronous checks had already succeeded.
|
|
29
31
|
- Registered the OpenAI Decisions API for custom classifier providers, including image inputs over chunked requests.
|
|
30
32
|
- Preserved native provider authentication and raw/simple dispatch through the request adapter, including server-side bearer and federation credentials.
|
|
31
33
|
- Preserved sampling parameters, tool choice, deferred controls, environment overrides, API-specific options, parsed provider events, and authoritative failed assistant messages in proxy streams.
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAA6C,MAAM,WAAW,CAAC;AAc/G,OAAO,EAWN,KAAK,OAAO,EAIZ,KAAK,cAAc,EAKnB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,MAAM,EAMX,KAAK,mBAAmB,EACxB,MAAM,uBAAuB,CAAC;AAc/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,OAAO,EAWN,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAGzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAc5D,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1D;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAA6C,MAAM,WAAW,CAAC;AAc/G,OAAO,EAWN,KAAK,OAAO,EAIZ,KAAK,cAAc,EAKnB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,MAAM,EAMX,KAAK,mBAAmB,EACxB,MAAM,uBAAuB,CAAC;AAc/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,OAAO,EAWN,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAGzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAc5D,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1D;AA6lCD,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,mBAAmB,CAAC,GACnE,OAAO,CAOT;AAgaD,wBAAgB,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA6JxG;AAsED,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,UAAU,CAU9E"}
|
package/dist/server.js
CHANGED
|
@@ -825,11 +825,6 @@ async function handleSessionCompact(config, body, res, models) {
|
|
|
825
825
|
}
|
|
826
826
|
let run;
|
|
827
827
|
if (body.runId) {
|
|
828
|
-
const existingRun = getStreamRun(body.sessionId, body.runId);
|
|
829
|
-
if (existingRun?.status === "aborted") {
|
|
830
|
-
sendJson(res, 409, { error: "Compaction run was aborted", code: PiServerErrorCode.INVALID_REQUEST });
|
|
831
|
-
return;
|
|
832
|
-
}
|
|
833
828
|
if (existingRun?.status === "running") {
|
|
834
829
|
sendError(res, 409, "A run with this runId is already in progress", PiServerErrorCode.RUN_IN_PROGRESS);
|
|
835
830
|
return;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createServer, type Server as HttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createRequire } from \"node:module\";\nimport {\n\ttype CompactionCacheRequestOptions,\n\ttype CompactionPreparationOptions,\n\ttype CompactionSettings,\n\tcompactLegacy,\n\tconvertToLlm,\n\tDEFAULT_COMPACTION_SETTINGS,\n\ttype LegacyCompactResult,\n\ttype ProxyAssistantMessageEvent,\n\tprepareLegacyCompaction,\n\ttype SessionTreeEntry,\n} from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AnyModel,\n\ttype AssistantImages,\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype CacheRetention,\n\ttype ClassifierApi,\n\ttype ClassifierContext,\n\ttype ClassifierModel,\n\ttype ClassifierOptions,\n\ttype ClassifierResult,\n\ttype Context,\n\tcreateModels,\n\tcreateProvider,\n\ttype DeferredCancelOptions,\n\ttype DeferredHandle,\n\ttype ImageApi,\n\ttype ImageModel,\n\ttype ImagesContext,\n\ttype ImagesOptions,\n\ttype Message,\n\ttype Model,\n\ttype Models,\n\ttype ModelsSimpleStreamOptions,\n\ttype ProviderClassifier,\n\ttype ProviderRequestOptions,\n\ttype ProviderStreamOptions,\n\ttype ProviderStreams,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { cloudflareWorkersAISystemOneApi } from \"@earendil-works/pi-ai/api/cloudflare-workers-ai-system-one.lazy\";\nimport { llamaCppClassifyApi } from \"@earendil-works/pi-ai/api/llama-cpp-classify.lazy\";\nimport { openAIDecisionsApi } from \"@earendil-works/pi-ai/api/openai-decisions.lazy\";\nimport { typesafeSystemOneApi } from \"@earendil-works/pi-ai/api/typesafe-system-one.lazy\";\nimport {\n\tgetBuiltinProviderForModel,\n\tgetEnvApiKey,\n\tgetImagesApiProvider,\n\tstream as streamApi,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { getProviderEnvValue } from \"@earendil-works/pi-ai/utils/provider-env\";\nimport type { ServerConfig } from \"./config.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { PiServerError, PiServerErrorCode, type PiServerErrorResponse } from \"./error-codes.ts\";\nimport { encodeErrorEvent, encodeProxyEvent } from \"./event-encoding.ts\";\nimport { hashPiServerProviderMessages, type PiServerProviderCallbackRequest } from \"./pi-server-protocol.ts\";\nimport { ReceiveUploadError, receiveUpload } from \"./receive-upload.ts\";\nimport { CHUNK_ENDPOINT, type RequestChunkBody, receiveRequestChunk } from \"./request-chunks.ts\";\nimport { deletePersistedSession, loadPersistedSessions, savePersistedSession } from \"./session-persistence.ts\";\nimport {\n\tappendCompactionEntry,\n\tappendMessages,\n\tappendSessionEntries,\n\tdeleteSession as deleteSessionFromStore,\n\tgetOrCreateSession,\n\tgetSession,\n\tgetSessionBranch,\n\tlistSessions,\n\treplaceMessages,\n\treplaceSessionTree,\n\ttype SessionState,\n\ttype SessionStaticContext,\n\tsetStaticContext,\n\tswitchSessionLeaf,\n} from \"./session-store.ts\";\n\nexport { loadConfig, type ServerConfig } from \"./config.ts\";\n\ninterface PackageMetadata {\n\tversion: string;\n}\n\nconst packageMetadata = createRequire(import.meta.url)(\"../package.json\") as PackageMetadata;\nconst PI_SERVER_VERSION = packageMetadata.version;\n\ninterface SessionInitBody {\n\tsessionId: string;\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface StreamRequestBody {\n\tsessionId: string;\n\trunId?: string;\n\tmodel: Model<any>;\n\toptions?: SimpleStreamOptions;\n\tstaticContext?: SessionStaticContext;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n\tobserveProviderStreamEvents?: boolean;\n\trequestKind?: \"api\" | \"simple\" | \"deferred\";\n\tdeferredHandle?: DeferredHandle;\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n}\n\ninterface SessionSyncBody {\n\tsessionId: string;\n\tmessages: Message[];\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionAppendBody {\n\tsessionId: string;\n\tmessages: Message[];\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionTreeSyncBody {\n\tsessionId: string;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionTreeSwitchBody {\n\tsessionId: string;\n\tleafId: string | null;\n}\n\ninterface SessionCompactBody {\n\tsessionId: string;\n\trunId?: string;\n\tmodel: Model<any>;\n\toptions?: SimpleStreamOptions;\n\tsettings?: CompactionSettings;\n\tpreparation?: CompactionPreparationOptions;\n\tcustomInstructions?: string;\n\tcacheContextHash?: string;\n\tcacheStaticContextHash?: string;\n\tcacheFallbackReason?: string;\n\tbaseTreeHash?: string;\n\tfullResponse?: boolean;\n\tstreamResponse?: boolean;\n}\n\nfunction createRequestModels(model: Model<any>, options: SimpleStreamOptions) {\n\tconst models = createModels();\n\tconst builtin = getBuiltinProviderForModel(model);\n\tconst requestApiStream: ProviderStreams[\"stream\"] = (requestModel, context, streamOptions) =>\n\t\tbuiltin\n\t\t\t? builtin.stream(requestModel, context, streamOptions)\n\t\t\t: streamApi(requestModel, context, streamOptions as ProviderStreamOptions | undefined);\n\tconst requestStream: ProviderStreams[\"streamSimple\"] = (requestModel, context, streamOptions) => {\n\t\tconst requestOptions = {\n\t\t\t...streamOptions,\n\t\t\t...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n\t\t};\n\t\treturn builtin\n\t\t\t? builtin.streamSimple(requestModel, context, requestOptions)\n\t\t\t: streamSimple(requestModel, context, requestOptions);\n\t};\n\tmodels.setProvider(\n\t\tcreateProvider({\n\t\t\tid: model.provider,\n\t\t\tname: model.provider,\n\t\t\tmodels: [model],\n\t\t\tauth: builtin\n\t\t\t\t? {\n\t\t\t\t\t\t...builtin.auth,\n\t\t\t\t\t\tapiKey: {\n\t\t\t\t\t\t\tname: builtin.auth.apiKey?.name ?? \"pi-server request auth\",\n\t\t\t\t\t\t\tresolve: async (request) => {\n\t\t\t\t\t\t\t\tconst resolved = await builtin.auth.apiKey?.resolve(request);\n\t\t\t\t\t\t\t\tif (resolved) return resolved;\n\t\t\t\t\t\t\t\t// Declared request credentials are validated by the native provider.\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptions.apiKey !== undefined ||\n\t\t\t\t\t\t\t\t\toptions.headers !== undefined ||\n\t\t\t\t\t\t\t\t\tmodel.headers !== undefined\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn { auth: { apiKey: options.apiKey, headers: options.headers }, env: options.env };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tapiKey: {\n\t\t\t\t\t\t\tname: \"pi-server request auth\",\n\t\t\t\t\t\t\tresolve: async () => ({ auth: { apiKey: options.apiKey, headers: options.headers } }),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\tapi: {\n\t\t\t\tstream: requestApiStream,\n\t\t\t\tstreamSimple: requestStream,\n\t\t\t},\n\t\t}),\n\t);\n\treturn models;\n}\n\ninterface StreamRunRecord {\n\tcallbacks: Map<string, { resolve: (result: unknown) => void; reject: (error: Error) => void }>;\n\tcallbackConnectionClosed: boolean;\n\tsessionId: string;\n\trunId: string;\n\tkind: \"stream\" | \"compact\" | \"image\" | \"classifier\" | \"deferred-cancel\";\n\tstatus: \"running\" | \"completed\" | \"failed\" | \"aborted\";\n\tmessage?: AssistantMessage;\n\tcacheRetention?: CacheRetention;\n\tcompactResult?: SessionCompactSuccessBody;\n\toperationResult?:\n\t\t| AssistantImages\n\t\t| ClassifierResult\n\t\t| { cancelled: true; stopReason: \"stop\" | \"aborted\"; errorMessage?: string };\n\terrorMessage?: string;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tcancelRequested: boolean;\n\tcontroller: AbortController;\n\tsettled: Promise<void>;\n\tresolveSettled: (() => void) | undefined;\n}\n\nconst STREAM_HEARTBEAT = \": keep-alive\\n\\n\";\nconst JSON_HEARTBEAT = \" \\n\";\nconst STREAM_HEARTBEAT_INTERVAL_MS = 25_000;\nconst STREAM_RUN_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst streamRuns = new Map<string, StreamRunRecord>();\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\treq.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n\t\treq.on(\"error\", reject);\n\t});\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n\tconst data = JSON.stringify(body);\n\tres.writeHead(status, { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(data) });\n\tres.end(data);\n}\n\nfunction sendError(\n\tres: ServerResponse,\n\tstatus: number,\n\tmessage: string,\n\tcode?: PiServerErrorCode,\n\tdetails?: Record<string, unknown>,\n): void {\n\tconst body: PiServerErrorResponse = { error: message };\n\tif (code) body.code = code;\n\tif (details) body.details = details;\n\tsendJson(res, status, body);\n}\n\nfunction logRequestError(req: IncomingMessage, error: unknown): void {\n\tconst message = error instanceof Error ? error.stack || error.message : String(error);\n\tconsole.error(`${req.method ?? \"UNKNOWN\"} ${req.url ?? \"/\"} failed: ${message}`);\n}\n\nfunction authenticate(config: ServerConfig, req: IncomingMessage): boolean {\n\tif (!config.authToken) return true;\n\tconst header = req.headers.authorization;\n\tif (!header) return false;\n\tconst token = header.startsWith(\"Bearer \") ? header.slice(7) : header;\n\treturn token === config.authToken;\n}\n\nfunction sessionResponseBody(session: SessionState) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t};\n}\n\nfunction persistSession(config: ServerConfig, session: SessionState): void {\n\tsavePersistedSession(config.sessionStoreDir, session);\n}\n\nfunction runKey(sessionId: string, runId: string): string {\n\treturn `${sessionId}\\0${runId}`;\n}\n\nfunction getStreamRun(sessionId: string, runId: string): StreamRunRecord | undefined {\n\treturn streamRuns.get(runKey(sessionId, runId));\n}\n\nfunction createRunRecord(sessionId: string, runId: string, kind: StreamRunRecord[\"kind\"]): StreamRunRecord {\n\tlet resolveSettled: (() => void) | undefined;\n\tconst settled = new Promise<void>((resolve) => {\n\t\tresolveSettled = resolve;\n\t});\n\treturn {\n\t\tcallbacks: new Map(),\n\t\tcallbackConnectionClosed: false,\n\t\tsessionId,\n\t\trunId,\n\t\tkind,\n\t\tstatus: \"running\",\n\t\tcreatedAt: Date.now(),\n\t\tupdatedAt: Date.now(),\n\t\tcancelRequested: false,\n\t\tcontroller: new AbortController(),\n\t\tsettled,\n\t\tresolveSettled,\n\t};\n}\n\nfunction settleRun(run: StreamRunRecord | undefined): void {\n\tif (!run) return;\n\trejectProviderCallbacks(run, new Error(\"Provider run settled before callback reply\"));\n\tconst resolve = run.resolveSettled;\n\trun.resolveSettled = undefined;\n\tresolve?.();\n}\n\nfunction startStreamRun(sessionId: string, runId: string, kind: StreamRunRecord[\"kind\"] = \"stream\"): StreamRunRecord {\n\tconst existing = getStreamRun(sessionId, runId);\n\tif (existing?.status === \"completed\" || existing?.status === \"aborted\") return existing;\n\tconst run = existing ?? createRunRecord(sessionId, runId, kind);\n\tif (existing) {\n\t\trun.callbackConnectionClosed = false;\n\t\trun.message = undefined;\n\t\trun.cacheRetention = undefined;\n\t\trun.errorMessage = undefined;\n\t\trun.cancelRequested = false;\n\t\trun.controller = new AbortController();\n\t\tlet resolveSettled: (() => void) | undefined;\n\t\trun.settled = new Promise<void>((resolve) => {\n\t\t\tresolveSettled = resolve;\n\t\t});\n\t\trun.resolveSettled = resolveSettled;\n\t}\n\trun.kind = kind;\n\trun.status = \"running\";\n\trun.updatedAt = Date.now();\n\tstreamRuns.set(runKey(sessionId, runId), run);\n\treturn run;\n}\n\nfunction streamRunResponseBody(run: StreamRunRecord) {\n\treturn {\n\t\tsessionId: run.sessionId,\n\t\trunId: run.runId,\n\t\tstatus: run.status,\n\t\tcreatedAt: run.createdAt,\n\t\tupdatedAt: run.updatedAt,\n\t\t...(run.message ? { message: run.message } : {}),\n\t\t...(run.cacheRetention !== undefined ? { cacheRetention: run.cacheRetention } : {}),\n\t\t...(run.compactResult ? { compactResult: run.compactResult } : {}),\n\t\t...(run.operationResult ? { operationResult: run.operationResult } : {}),\n\t\t...(run.errorMessage ? { errorMessage: run.errorMessage } : {}),\n\t};\n}\n\nfunction replayStreamRun(run: StreamRunRecord): ProxyAssistantMessageEvent[] {\n\tif (!run.message) return [];\n\tif (\n\t\trun.message.stopReason !== \"stop\" &&\n\t\trun.message.stopReason !== \"length\" &&\n\t\trun.message.stopReason !== \"toolUse\" &&\n\t\trun.message.stopReason !== \"deferred\"\n\t) {\n\t\treturn [];\n\t}\n\tconst events: ProxyAssistantMessageEvent[] = [{ type: \"start\" }];\n\tfor (const [contentIndex, content] of run.message.content.entries()) {\n\t\tswitch (content.type) {\n\t\t\tcase \"text\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"text_start\", contentIndex },\n\t\t\t\t\t{ type: \"text_delta\", contentIndex, delta: content.text },\n\t\t\t\t\t{ type: \"text_end\", contentIndex, contentSignature: content.textSignature },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"thinking\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"thinking_start\", contentIndex },\n\t\t\t\t\t{ type: \"thinking_delta\", contentIndex, delta: content.thinking },\n\t\t\t\t\t{ type: \"thinking_end\", contentIndex, contentSignature: content.thinkingSignature },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"toolCall\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"toolcall_start\", contentIndex, id: content.id, toolName: content.name },\n\t\t\t\t\t{ type: \"toolcall_delta\", contentIndex, delta: JSON.stringify(content.arguments) },\n\t\t\t\t\t{ type: \"toolcall_end\", contentIndex, toolCall: content },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tevents.push({\n\t\ttype: \"done\",\n\t\treason: run.message.stopReason,\n\t\tusage: run.message.usage,\n\t\tdeferred: run.message.deferred,\n\t\tmessage: run.message,\n\t});\n\treturn events;\n}\n\nfunction completeStreamRun(run: StreamRunRecord | undefined, message: AssistantMessage): void {\n\tif (!run) return;\n\tif (run.cancelRequested) {\n\t\trun.status = \"aborted\";\n\t\trun.message = undefined;\n\t\trun.errorMessage = \"Stream run aborted\";\n\t\trun.updatedAt = Date.now();\n\t\treturn;\n\t}\n\trun.status = \"completed\";\n\trun.message = message;\n\trun.errorMessage = undefined;\n\trun.updatedAt = Date.now();\n}\n\nfunction failStreamRun(run: StreamRunRecord | undefined, errorMessage: string, message?: AssistantMessage): void {\n\tif (!run) return;\n\tif (run.cancelRequested) {\n\t\trun.status = \"aborted\";\n\t\trun.errorMessage = \"Stream run aborted\";\n\t\trun.updatedAt = Date.now();\n\t\treturn;\n\t}\n\trun.status = \"failed\";\n\trun.message = message;\n\trun.errorMessage = errorMessage;\n\trun.updatedAt = Date.now();\n}\n\nfunction touchStreamRun(run: StreamRunRecord | undefined): void {\n\tif (run) run.updatedAt = Date.now();\n}\n\nfunction rejectProviderCallbacks(run: StreamRunRecord, error: Error): void {\n\tconst pending = [...run.callbacks.values()];\n\trun.callbacks.clear();\n\tfor (const callback of pending) callback.reject(error);\n}\n\nfunction createProviderCallbacks<TModel extends AnyModel>(\n\trun: StreamRunRecord,\n\tres: ServerResponse,\n\tcallbacks: { onPayload?: boolean; onResponse?: boolean } | undefined,\n): Pick<ProviderRequestOptions<TModel>, \"onPayload\" | \"onResponse\"> {\n\tif (!callbacks?.onPayload && !callbacks?.onResponse) return {};\n\tres.once(\"close\", () => {\n\t\trun.callbackConnectionClosed = true;\n\t\trejectProviderCallbacks(run, new Error(\"Provider callback connection closed\"));\n\t});\n\trun.controller.signal.addEventListener(\n\t\t\"abort\",\n\t\t() => rejectProviderCallbacks(run, new DOMException(\"Provider run aborted\", \"AbortError\")),\n\t\t{ once: true },\n\t);\n\tconst requestCallback = (request: PiServerProviderCallbackRequest): Promise<unknown> => {\n\t\tif (run.controller.signal.aborted) return Promise.reject(new DOMException(\"Provider run aborted\", \"AbortError\"));\n\t\tif (run.callbackConnectionClosed || res.destroyed || res.writableEnded)\n\t\t\treturn Promise.reject(new Error(\"Provider callback connection closed\"));\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\trun.callbacks.set(request.callbackId, { resolve, reject });\n\t\t\ttry {\n\t\t\t\twriteServerSentEvent(res, \"provider_callback\", request);\n\t\t\t} catch (error) {\n\t\t\t\trun.callbacks.delete(request.callbackId);\n\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t});\n\t};\n\treturn {\n\t\t...(callbacks.onPayload\n\t\t\t? {\n\t\t\t\t\tonPayload: (payload: unknown, model: TModel) =>\n\t\t\t\t\t\trequestCallback({\n\t\t\t\t\t\t\tcallbackId: randomUUID(),\n\t\t\t\t\t\t\tkind: \"payload\",\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(callbacks.onResponse\n\t\t\t? {\n\t\t\t\t\tonResponse: async (response, model) => {\n\t\t\t\t\t\tawait requestCallback({\n\t\t\t\t\t\t\tcallbackId: randomUUID(),\n\t\t\t\t\t\t\tkind: \"response\",\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction handleProviderCallbackReply(body: unknown, res: ServerResponse): void {\n\tif (!body || typeof body !== \"object\") {\n\t\tsendError(res, 400, \"Provider callback reply must be an object\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tconst reply = body as {\n\t\tsessionId?: unknown;\n\t\trunId?: unknown;\n\t\tcallbackId?: unknown;\n\t\tresult?: unknown;\n\t\terror?: unknown;\n\t};\n\tif (typeof reply.sessionId !== \"string\" || typeof reply.runId !== \"string\" || typeof reply.callbackId !== \"string\") {\n\t\tsendError(res, 400, \"sessionId, runId and callbackId are required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tconst run = getStreamRun(reply.sessionId, reply.runId);\n\tconst pending = run?.callbacks.get(reply.callbackId);\n\tif (!run || run.status !== \"running\" || !pending) {\n\t\tsendError(res, 409, \"Provider callback is no longer pending\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tlet error: Error | undefined;\n\tif (reply.error !== undefined) {\n\t\tconst remoteError = reply.error as { name?: unknown; message?: unknown } | null;\n\t\tif (!remoteError || typeof remoteError.name !== \"string\" || typeof remoteError.message !== \"string\") {\n\t\t\tsendError(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t\"Provider callback error requires string name and message\",\n\t\t\t\tPiServerErrorCode.INVALID_REQUEST,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\terror = new Error(remoteError.message);\n\t\terror.name = remoteError.name;\n\t}\n\trun.callbacks.delete(reply.callbackId);\n\tsendJson(res, 200, { accepted: true, callbackId: reply.callbackId, runId: reply.runId });\n\tif (error) pending.reject(error);\n\telse pending.resolve(reply.result);\n}\n\nfunction writeStreamEvent(res: ServerResponse, event: ProxyAssistantMessageEvent): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.write(encodeProxyEvent(event));\n\t}\n}\n\nfunction writeStreamError(res: ServerResponse, message: string): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.write(encodeErrorEvent(message));\n\t}\n}\n\nfunction endStreamResponse(res: ServerResponse): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.end();\n\t}\n}\n\nfunction cleanupExpiredStreamRuns(nowMs: number): void {\n\tfor (const [key, run] of streamRuns) {\n\t\tif (nowMs - run.updatedAt > STREAM_RUN_TTL_MS) {\n\t\t\tstreamRuns.delete(key);\n\t\t}\n\t}\n}\n\nasync function deleteStreamRunsForSession(sessionId: string): Promise<void> {\n\tconst runs = [...streamRuns.entries()].filter(([, run]) => run.sessionId === sessionId);\n\tfor (const [, run] of runs) {\n\t\tif (run.status !== \"running\") continue;\n\t\trun.cancelRequested = true;\n\t\trun.updatedAt = Date.now();\n\t\trun.controller.abort();\n\t\trejectProviderCallbacks(run, new DOMException(\"Provider session deleted\", \"AbortError\"));\n\t}\n\tawait Promise.all(runs.map(([, run]) => run.settled));\n\tfor (const [key, run] of runs) {\n\t\tif (streamRuns.get(key) === run) streamRuns.delete(key);\n\t}\n}\n\nconst streamRunCleanupTimer = setInterval(() => cleanupExpiredStreamRuns(Date.now()), STREAM_RUN_TTL_MS / 4);\nstreamRunCleanupTimer.unref();\n\nfunction sessionHistoryFullResponseBody(session: SessionState, baseMessageCount: number) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tentries: session.entries,\n\t\tbaseMessageCount,\n\t\tmessages: session.messages.slice(baseMessageCount),\n\t};\n}\n\nfunction sessionTreePatchResponseBody(\n\tsession: SessionState,\n\tbaseMessageCount: number,\n\tentriesFrom: number,\n\tbaseRevision: number | undefined,\n) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tbaseMessageCount,\n\t\tmessages: session.messages.slice(baseMessageCount),\n\t\ttreePatch: {\n\t\t\tentriesFrom,\n\t\t\tbaseRevision,\n\t\t\tentries: session.entries.slice(entriesFrom),\n\t\t\tleafId: session.leafId,\n\t\t\trevision: session.revision,\n\t\t},\n\t};\n}\n\ntype PreparedCompaction = Parameters<typeof compactLegacy>[0];\n\ninterface PreparedSessionCompact {\n\tmodels: Models;\n\tsession: SessionState;\n\tsessionId: string;\n\trevision: number;\n\ttreeHash: string;\n\tleafId: string | null;\n\tentryCount: number;\n\tpreparation: PreparedCompaction;\n\toptions: SimpleStreamOptions;\n\tcacheContext?: Context;\n\tcacheFallbackReason: string;\n}\n\ninterface SessionCompactSuccessBody {\n\tsuccess: true;\n\tcompaction: Omit<LegacyCompactResult, \"retainedTail\">;\n\tcompactionEntry: SessionTreeEntry;\n\tsessionId: string;\n\tstaticContextHash: string;\n\ttreeHash: string;\n\tmessageCount: number;\n\tentryCount: number;\n\tleafId: string | null;\n\trevision: number;\n\tstaticContext?: SessionStaticContext;\n\ttreePatch?: {\n\t\tbaseTreeHash: string;\n\t\tentriesFrom: number;\n\t\tentries: SessionTreeEntry[];\n\t\tleafId: string | null;\n\t\trevision: number;\n\t};\n\tentries?: SessionTreeEntry[];\n\tmessages?: Message[];\n}\n\ninterface SessionCompactHttpResponse {\n\tstatus: number;\n\tbody: PiServerErrorResponse | SessionCompactSuccessBody;\n}\n\nfunction handleSessionInit(config: ServerConfig, body: SessionInitBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t} else {\n\t\tgetOrCreateSession(body.sessionId);\n\t}\n\tconst session = getSession(body.sessionId)!;\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionUpdate(\n\tconfig: ServerConfig,\n\tbody: SessionInitBody & { staticContext: SessionStaticContext },\n\tres: ServerResponse,\n): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!body.staticContext) {\n\t\tsendError(res, 400, \"staticContext is required for update\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tsetStaticContext(body.sessionId, body.staticContext);\n\tconst session = getSession(body.sessionId)!;\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionSync(config: ServerConfig, body: SessionSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.messages)) {\n\t\tsendError(res, 400, \"messages is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = replaceMessages(body.sessionId, body.messages);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionAppend(config: ServerConfig, body: SessionAppendBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.messages)) {\n\t\tsendError(res, 400, \"messages is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = appendMessages(body.sessionId, body.messages);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionTreeSync(config: ServerConfig, body: SessionTreeSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.entries)) {\n\t\tsendError(res, 400, \"entries is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = replaceSessionTree(body.sessionId, body.entries, body.leafId ?? null);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionTreeAppend(config: ServerConfig, body: SessionTreeSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.entries)) {\n\t\tsendError(res, 400, \"entries is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\ttry {\n\t\tif (body.staticContext) {\n\t\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t\t}\n\t\tconst session = appendSessionEntries(body.sessionId, body.entries, body.leafId ?? null);\n\t\tpersistSession(config, session);\n\t\tsendJson(res, 200, sessionResponseBody(session));\n\t} catch (error) {\n\t\tif (error instanceof PiServerError) {\n\t\t\tsendError(res, 400, error.message, error.code, error.details);\n\t\t} else {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tsendError(res, 500, message, PiServerErrorCode.INTERNAL_ERROR);\n\t\t}\n\t}\n}\n\nfunction handleSessionTreeSwitch(config: ServerConfig, body: SessionTreeSwitchBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\ttry {\n\t\tconst session = switchSessionLeaf(body.sessionId, body.leafId ?? null);\n\t\tpersistSession(config, session);\n\t\tsendJson(res, 200, sessionResponseBody(session));\n\t} catch (error) {\n\t\tif (error instanceof PiServerError) {\n\t\t\tsendError(res, 400, error.message, error.code, error.details);\n\t\t} else {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tsendError(res, 500, message, PiServerErrorCode.INTERNAL_ERROR);\n\t\t}\n\t}\n}\n\nfunction prepareSessionCompact(\n\tbody: SessionCompactBody,\n\tmodels?: Models,\n): PreparedSessionCompact | SessionCompactHttpResponse {\n\tif (!body.sessionId) {\n\t\treturn { status: 400, body: { error: \"sessionId is required\" } };\n\t}\n\tif (!body.model) {\n\t\treturn { status: 400, body: { error: \"model is required\" } };\n\t}\n\tconst validDigest = (value: string | undefined): boolean => value === undefined || /^[a-f0-9]{64}$/.test(value);\n\tif (!validDigest(body.cacheContextHash) || !validDigest(body.cacheStaticContextHash)) {\n\t\treturn { status: 400, body: { error: \"cache context digests must be 64-character SHA-256 hex strings\" } };\n\t}\n\tif ((body.cacheContextHash === undefined) !== (body.cacheStaticContextHash === undefined)) {\n\t\treturn { status: 400, body: { error: \"cacheContextHash and cacheStaticContextHash must be supplied together\" } };\n\t}\n\n\tconst session = getSession(body.sessionId);\n\tif (!session) {\n\t\treturn { status: 404, body: { error: \"session not found\", code: PiServerErrorCode.SESSION_NOT_FOUND } };\n\t}\n\n\tconst entries = getSessionBranch(session);\n\tconst leaf = entries.at(-1);\n\tif (leaf?.type === \"compaction\") {\n\t\tif (!leaf.firstKeptEntryId) {\n\t\t\treturn { status: 400, body: { error: \"Stored compaction is missing firstKeptEntryId\" } };\n\t\t}\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\tsuccess: true,\n\t\t\t\tcompaction: {\n\t\t\t\t\tsummary: leaf.summary,\n\t\t\t\t\tfirstKeptEntryId: leaf.firstKeptEntryId,\n\t\t\t\t\ttokensBefore: leaf.tokensBefore,\n\t\t\t\t\tdetails: leaf.details,\n\t\t\t\t},\n\t\t\t\tcompactionEntry: leaf,\n\t\t\t\t...sessionResponseBody(session),\n\t\t\t\tentries: session.entries,\n\t\t\t\tmessages: session.messages,\n\t\t\t},\n\t\t};\n\t}\n\tconst preparationResult = prepareLegacyCompaction(\n\t\tentries,\n\t\tbody.settings ?? DEFAULT_COMPACTION_SETTINGS,\n\t\tbody.preparation,\n\t);\n\tif (!preparationResult.ok) {\n\t\treturn { status: 400, body: { error: preparationResult.error.message } };\n\t}\n\tif (!preparationResult.value) {\n\t\treturn { status: 400, body: { error: \"Nothing to compact\" } };\n\t}\n\n\tconst options = body.options ?? {};\n\tlet cacheContext: Context | undefined;\n\tlet cacheFallbackReason = body.cacheFallbackReason ?? \"cache_context_digest_missing\";\n\tif (body.cacheContextHash && body.cacheStaticContextHash) {\n\t\tif (options.sessionId !== session.sessionId) {\n\t\t\tcacheFallbackReason = \"session_id_mismatch\";\n\t\t} else if (options.cacheRetention === \"none\") {\n\t\t\tcacheFallbackReason = \"prompt_cache_disabled\";\n\t\t} else if (body.cacheStaticContextHash !== session.staticContextHash) {\n\t\t\tcacheFallbackReason = \"static_context_hash_mismatch\";\n\t\t} else {\n\t\t\tconst projectedMessages = convertToLlm(session.messages);\n\t\t\tconst priorAssistant = [...session.messages].reverse().find((message) => message.role === \"assistant\");\n\t\t\tif (hashPiServerProviderMessages(projectedMessages) !== body.cacheContextHash) {\n\t\t\t\tcacheFallbackReason = \"request_context_digest_mismatch\";\n\t\t\t} else if (\n\t\t\t\t!priorAssistant ||\n\t\t\t\tpriorAssistant.provider !== body.model.provider ||\n\t\t\t\tpriorAssistant.model !== body.model.id ||\n\t\t\t\tpriorAssistant.api !== body.model.api\n\t\t\t) {\n\t\t\t\tcacheFallbackReason = \"summary_model_mismatch\";\n\t\t\t} else {\n\t\t\t\tcacheContext = buildStreamContext(session, { contextOverlay: projectedMessages });\n\t\t\t\tcacheFallbackReason = \"exact_prefix_unavailable\";\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmodels: models ?? createRequestModels(body.model, options),\n\t\tsession,\n\t\tsessionId: session.sessionId,\n\t\trevision: session.revision,\n\t\ttreeHash: session.treeHash,\n\t\tleafId: session.leafId,\n\t\tentryCount: session.entries.length,\n\t\tpreparation: preparationResult.value,\n\t\toptions,\n\t\tcacheContext,\n\t\tcacheFallbackReason,\n\t};\n}\n\nfunction sessionCompactConflict(\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tcurrentSession: SessionState | undefined,\n): SessionCompactHttpResponse {\n\treturn {\n\t\tstatus: 409,\n\t\tbody: {\n\t\t\terror: \"Session changed while compaction was running\",\n\t\t\tcode: PiServerErrorCode.SESSION_STATE_CONFLICT,\n\t\t\tdetails: {\n\t\t\t\tsessionId: body.sessionId,\n\t\t\t\texpectedRevision: prepared.revision,\n\t\t\t\texpectedTreeHash: prepared.treeHash,\n\t\t\t\texpectedLeafId: prepared.leafId,\n\t\t\t\tactualRevision: currentSession?.revision ?? null,\n\t\t\t\tactualTreeHash: currentSession?.treeHash ?? null,\n\t\t\t\tactualLeafId: currentSession?.leafId ?? null,\n\t\t\t},\n\t\t},\n\t};\n}\n\nasync function completeSessionCompact(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\trun?: StreamRunRecord,\n): Promise<SessionCompactHttpResponse> {\n\tconst result = await compactLegacy(\n\t\tprepared.preparation,\n\t\tprepared.models,\n\t\tbody.model,\n\t\tbody.customInstructions,\n\t\trun?.controller.signal,\n\t\tprepared.options.reasoning,\n\t\tundefined,\n\t\tundefined,\n\t\tprepared.cacheContext,\n\t\tprepared.options as CompactionCacheRequestOptions,\n\t\tprepared.cacheFallbackReason,\n\t);\n\tif (!result.ok) {\n\t\treturn { status: 500, body: { error: result.error.message, code: PiServerErrorCode.INTERNAL_ERROR } };\n\t}\n\tif (run?.cancelRequested || run?.controller.signal.aborted) {\n\t\treturn { status: 409, body: { error: \"Compaction aborted\", code: PiServerErrorCode.INVALID_REQUEST } };\n\t}\n\n\tconst currentSession = getSession(prepared.sessionId);\n\tif (\n\t\t!currentSession ||\n\t\tcurrentSession !== prepared.session ||\n\t\tcurrentSession.revision !== prepared.revision ||\n\t\tcurrentSession.treeHash !== prepared.treeHash ||\n\t\tcurrentSession.leafId !== prepared.leafId\n\t) {\n\t\treturn sessionCompactConflict(body, prepared, currentSession);\n\t}\n\n\tconst baseTreeHash = prepared.treeHash;\n\tconst baseEntryCount = prepared.entryCount;\n\tconst compaction = result.value;\n\tconst { session: updatedSession, entry: compactionEntry } = appendCompactionEntry(body.sessionId, compaction);\n\tpersistSession(config, updatedSession);\n\tif (!body.fullResponse && body.baseTreeHash === baseTreeHash) {\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\tsuccess: true,\n\t\t\t\tcompaction: compaction satisfies LegacyCompactResult,\n\t\t\t\tcompactionEntry,\n\t\t\t\t...sessionResponseBody(updatedSession),\n\t\t\t\tstaticContext: updatedSession.staticContext,\n\t\t\t\ttreePatch: {\n\t\t\t\t\tbaseTreeHash,\n\t\t\t\t\tentriesFrom: baseEntryCount,\n\t\t\t\t\tentries: [compactionEntry],\n\t\t\t\t\tleafId: updatedSession.leafId,\n\t\t\t\t\trevision: updatedSession.revision,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tstatus: 200,\n\t\tbody: {\n\t\t\tsuccess: true,\n\t\t\tcompaction: compaction satisfies LegacyCompactResult,\n\t\t\tcompactionEntry,\n\t\t\t...sessionResponseBody(updatedSession),\n\t\t\tstaticContext: updatedSession.staticContext,\n\t\t\tentries: updatedSession.entries,\n\t\t\tmessages: updatedSession.messages,\n\t\t},\n\t};\n}\n\nfunction writeServerSentEvent(res: ServerResponse, event: string, body: unknown): void {\n\tres.write(`event: ${event}\\n`);\n\tres.write(`data: ${JSON.stringify(body)}\\n\\n`);\n}\n\nasync function handleSessionCompactStream(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tres: ServerResponse,\n\trun?: StreamRunRecord,\n): Promise<void> {\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded) {\n\t\t\tres.write(STREAM_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\ttry {\n\t\tconst result = await completeSessionCompact(config, body, prepared, run);\n\t\tfinishCompactRun(run, result);\n\t\twriteServerSentEvent(res, result.status >= 400 ? \"error\" : \"result\", result.body);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (run?.status === \"running\") {\n\t\t\trun.status = run.cancelRequested ? \"aborted\" : \"failed\";\n\t\t\trun.errorMessage = message;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\twriteServerSentEvent(res, \"error\", { error: message });\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tres.end();\n\t}\n}\n\nasync function handleSessionCompactJsonStream(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tres: ServerResponse,\n\trun?: StreamRunRecord,\n): Promise<void> {\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(JSON_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded) {\n\t\t\tres.write(JSON_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\ttry {\n\t\tconst result = await completeSessionCompact(config, body, prepared, run);\n\t\tfinishCompactRun(run, result);\n\t\tres.write(JSON.stringify(result.body));\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (run?.status === \"running\") {\n\t\t\trun.status = run.cancelRequested ? \"aborted\" : \"failed\";\n\t\t\trun.errorMessage = message;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\tres.write(JSON.stringify({ error: message }));\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tres.end();\n\t}\n}\n\nfunction finishCompactRun(run: StreamRunRecord | undefined, result: SessionCompactHttpResponse): void {\n\tif (!run) return;\n\tif (run.cancelRequested || run.controller.signal.aborted) {\n\t\trun.status = \"aborted\";\n\t\trun.errorMessage = \"Compaction aborted\";\n\t} else {\n\t\trun.status = result.status >= 400 ? \"failed\" : \"completed\";\n\t\tif (result.status >= 400 && \"error\" in result.body) {\n\t\t\trun.errorMessage = result.body.error;\n\t\t} else if (\"success\" in result.body) {\n\t\t\trun.compactResult = { ...result.body, entries: result.body.entries?.slice() };\n\t\t}\n\t}\n\trun.updatedAt = Date.now();\n}\n\nasync function handleSessionCompact(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tres: ServerResponse,\n\tmodels?: Models,\n): Promise<void> {\n\tconst existingRun = body.runId ? getStreamRun(body.sessionId, body.runId) : undefined;\n\tif (existingRun?.status === \"aborted\") {\n\t\tsendJson(res, 409, { error: \"Compaction run was aborted\", code: PiServerErrorCode.INVALID_REQUEST });\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"completed\" && existingRun.compactResult) {\n\t\tsendJson(res, 200, existingRun.compactResult);\n\t\treturn;\n\t}\n\tconst prepared = prepareSessionCompact(body, models);\n\tif (\"status\" in prepared) {\n\t\tsendJson(res, prepared.status, prepared.body);\n\t\treturn;\n\t}\n\n\tlet run: StreamRunRecord | undefined;\n\tif (body.runId) {\n\t\tconst existingRun = getStreamRun(body.sessionId, body.runId);\n\t\tif (existingRun?.status === \"aborted\") {\n\t\t\tsendJson(res, 409, { error: \"Compaction run was aborted\", code: PiServerErrorCode.INVALID_REQUEST });\n\t\t\treturn;\n\t\t}\n\t\tif (existingRun?.status === \"running\") {\n\t\t\tsendError(res, 409, \"A run with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\t\treturn;\n\t\t}\n\t\trun = startStreamRun(body.sessionId, body.runId, \"compact\");\n\t}\n\n\tif (body.streamResponse) {\n\t\tawait handleSessionCompactStream(config, body, prepared, res, run);\n\t\treturn;\n\t}\n\n\tawait handleSessionCompactJsonStream(config, body, prepared, res, run);\n}\n\nfunction handleSessionHistory(\n\tsessionId: string,\n\tfrom: number | undefined,\n\tentriesFrom: number | undefined,\n\trevision: number | undefined,\n\tbaseTreeHash: string | undefined,\n\tres: ServerResponse,\n): void {\n\tconst session = getSession(sessionId);\n\tif (!session) {\n\t\tsendError(res, 404, \"session not found\", PiServerErrorCode.SESSION_NOT_FOUND);\n\t\treturn;\n\t}\n\tconst baseMessageCount = from ?? 0;\n\tif (\n\t\tentriesFrom !== undefined &&\n\t\tentriesFrom <= session.entries.length &&\n\t\t(revision === undefined || revision <= session.revision) &&\n\t\t(baseTreeHash === undefined || baseTreeHash === session.prefixHashes[entriesFrom])\n\t) {\n\t\tsendJson(res, 200, sessionTreePatchResponseBody(session, baseMessageCount, entriesFrom, revision));\n\t\treturn;\n\t}\n\tsendJson(res, 200, sessionHistoryFullResponseBody(session, baseMessageCount));\n}\n\nfunction handleSessionRun(sessionId: string, runId: string, res: ServerResponse): void {\n\tconst run = getStreamRun(sessionId, runId);\n\tif (!run) {\n\t\tsendError(res, 404, \"run not found\", PiServerErrorCode.RUN_NOT_FOUND);\n\t\treturn;\n\t}\n\tsendJson(res, 200, streamRunResponseBody(run));\n}\n\nasync function handleSessionRunAbort(sessionId: string, runId: string, res: ServerResponse): Promise<void> {\n\tif (!sessionId || !runId) {\n\t\tsendError(res, 400, \"sessionId and runId are required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\n\tlet run = getStreamRun(sessionId, runId);\n\tif (!run) {\n\t\trun = createRunRecord(sessionId, runId, \"stream\");\n\t\trun.status = \"aborted\";\n\t\trun.cancelRequested = true;\n\t\trun.errorMessage = \"Stream run aborted before it started\";\n\t\trun.updatedAt = Date.now();\n\t\tsettleRun(run);\n\t\tstreamRuns.set(runKey(sessionId, runId), run);\n\t\tsendJson(res, 200, streamRunResponseBody(run));\n\t\treturn;\n\t}\n\n\tif (run.status !== \"running\") {\n\t\tawait run.settled;\n\t\tsendJson(res, 200, streamRunResponseBody(run));\n\t\treturn;\n\t}\n\n\trun.cancelRequested = true;\n\trun.updatedAt = Date.now();\n\trun.controller.abort();\n\trejectProviderCallbacks(run, new DOMException(\"Provider run aborted\", \"AbortError\"));\n\tawait run.settled;\n\tsendJson(res, 200, streamRunResponseBody(run));\n}\n\nexport function buildStreamContext(\n\tsession: SessionState,\n\tbody: Pick<StreamRequestBody, \"contextOverlay\" | \"ephemeralMessages\">,\n): Context {\n\tconst messages = body.contextOverlay ?? [...session.messages, ...(body.ephemeralMessages ?? [])];\n\treturn {\n\t\tsystemPrompt: session.staticContext?.systemPrompt,\n\t\tmessages,\n\t\ttools: session.staticContext?.tools,\n\t};\n}\n\nfunction handleStream(config: ServerConfig, body: StreamRequestBody, res: ServerResponse, models?: Models): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!body.model) {\n\t\tsendError(res, 400, \"model is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif ((body.callbacks?.onPayload || body.callbacks?.onResponse) && !body.runId) {\n\t\tsendError(res, 400, \"runId is required for provider callbacks\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\n\tcleanupExpiredStreamRuns(Date.now());\n\n\tconst session = getOrCreateSession(body.sessionId);\n\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t\tpersistSession(config, session);\n\t}\n\n\tif (!session.staticContext && !body.staticContext) {\n\t\tsendError(\n\t\t\tres,\n\t\t\t400,\n\t\t\t\"Session has no static context. Initialize with /api/session/init first.\",\n\t\t\tPiServerErrorCode.SESSION_NO_STATIC_CONTEXT,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (body.ephemeralMessages !== undefined && !Array.isArray(body.ephemeralMessages)) {\n\t\tsendError(res, 400, \"ephemeralMessages must be an array\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (body.contextOverlay !== undefined && !Array.isArray(body.contextOverlay)) {\n\t\tsendError(res, 400, \"contextOverlay must be an array\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\n\tconst context = buildStreamContext(session, body);\n\tconst existingRun = body.runId ? getStreamRun(body.sessionId, body.runId) : undefined;\n\n\tconst resolvedModel = body.model;\n\n\tif (existingRun?.status === \"completed\") {\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t});\n\t\tres.flushHeaders();\n\t\tres.write(STREAM_HEARTBEAT);\n\t\tif (existingRun.cacheRetention !== undefined) {\n\t\t\twriteServerSentEvent(res, \"cache_policy\", { cacheRetention: existingRun.cacheRetention });\n\t\t}\n\t\tfor (const event of replayStreamRun(existingRun)) {\n\t\t\twriteStreamEvent(res, event);\n\t\t}\n\t\tendStreamResponse(res);\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"aborted\") {\n\t\tsendError(res, 409, \"The stream run was aborted\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"running\") {\n\t\tsendError(res, 409, \"A stream with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\treturn;\n\t}\n\n\tconst run = body.runId ? startStreamRun(body.sessionId, body.runId) : undefined;\n\tconst streamOptions: ModelsSimpleStreamOptions = {\n\t\t...(body.options ?? {}),\n\t\ttransformPreparedStreamOptions: (prepared) => {\n\t\t\t// Resolve after auth env merging, then pin the same policy for native dispatch.\n\t\t\tconst cacheRetention =\n\t\t\t\tprepared.cacheRetention ??\n\t\t\t\t(getProviderEnvValue(\"PI_CACHE_RETENTION\", prepared.env) === \"long\" ? \"long\" : \"short\");\n\t\t\tif (cacheRetention !== \"none\" && cacheRetention !== \"short\" && cacheRetention !== \"long\") {\n\t\t\t\tthrow new Error(\"Invalid cache retention policy\");\n\t\t\t}\n\t\t\tif (run) run.cacheRetention = cacheRetention;\n\t\t\twriteServerSentEvent(res, \"cache_policy\", { cacheRetention });\n\t\t\treturn { ...prepared, cacheRetention };\n\t\t},\n\t\t...(run ? { signal: run.controller.signal } : {}),\n\t\t...(run ? createProviderCallbacks<Model<string>>(run, res, body.callbacks) : {}),\n\t\t...(body.observeProviderStreamEvents\n\t\t\t? {\n\t\t\t\t\tonProviderStreamEvent: (data: unknown, model: Model<string>) => {\n\t\t\t\t\t\twriteStreamEvent(res, {\n\t\t\t\t\t\t\ttype: \"provider_stream_event\",\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded && !res.destroyed) {\n\t\t\tres.write(STREAM_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\tlet stream: AsyncIterable<AssistantMessageEvent>;\n\ttry {\n\t\tif (body.requestKind === \"deferred\") {\n\t\t\tif (!body.deferredHandle) throw new Error(\"deferredHandle is required for deferred fetch\");\n\t\t\tstream = (models ?? builtinModels()).streamDeferred(resolvedModel, body.deferredHandle, streamOptions);\n\t\t} else {\n\t\t\tconst requestModels = models ?? createRequestModels(resolvedModel, streamOptions);\n\t\t\tstream =\n\t\t\t\tbody.requestKind === \"api\"\n\t\t\t\t\t? requestModels.stream(resolvedModel, context, streamOptions)\n\t\t\t\t\t: requestModels.streamSimple(resolvedModel, context, streamOptions);\n\t\t}\n\t} catch (err) {\n\t\tclearInterval(heartbeat);\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tfailStreamRun(run, message);\n\t\tsettleRun(run);\n\t\twriteStreamError(res, message);\n\t\tendStreamResponse(res);\n\t\treturn;\n\t}\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tfor await (const event of stream) {\n\t\t\t\tconst proxyEvent = toProxyEvent(event);\n\t\t\t\tif (proxyEvent) {\n\t\t\t\t\ttouchStreamRun(run);\n\t\t\t\t\twriteStreamEvent(res, proxyEvent);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\tcompleteStreamRun(run, event.message);\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\tfailStreamRun(run, event.error.errorMessage ?? event.reason, event.error);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tfailStreamRun(run, message);\n\t\t\twriteStreamError(res, message);\n\t\t} finally {\n\t\t\tclearInterval(heartbeat);\n\t\t\tif (run?.status === \"running\") {\n\t\t\t\tfailStreamRun(run, run.cancelRequested ? \"Stream run aborted\" : \"Stream ended before a terminal event\");\n\t\t\t}\n\t\t\tsettleRun(run);\n\t\t\tendStreamResponse(res);\n\t\t}\n\t})();\n}\n\nasync function handlePostRequest(\n\tconfig: ServerConfig,\n\tpathname: string,\n\tbody: unknown,\n\tres: ServerResponse,\n\tmodels: Models,\n\tstreamModels?: Models,\n): Promise<boolean> {\n\tif (pathname === \"/api/provider-callback\") {\n\t\thandleProviderCallbackReply(body, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/generate-images\") {\n\t\tawait handleModelOperation(models, { ...(body as ImageOperationBody), kind: \"image\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/classify\") {\n\t\tawait handleModelOperation(models, { ...(body as ClassifierOperationBody), kind: \"classifier\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/cancel-deferred\") {\n\t\tawait handleModelOperation(models, { ...(body as DeferredCancelBody), kind: \"deferred-cancel\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/receive\") {\n\t\ttry {\n\t\t\tsendJson(res, 200, receiveUpload(config.uploadDir, body));\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof ReceiveUploadError)) throw error;\n\t\t\tsendJson(res, error.status, { error: error.message });\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/init\") {\n\t\thandleSessionInit(config, body as SessionInitBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/update\") {\n\t\thandleSessionUpdate(config, body as SessionInitBody & { staticContext: SessionStaticContext }, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/sync\") {\n\t\thandleSessionSync(config, body as SessionSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/append\") {\n\t\thandleSessionAppend(config, body as SessionAppendBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/sync\") {\n\t\thandleSessionTreeSync(config, body as SessionTreeSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/append\") {\n\t\thandleSessionTreeAppend(config, body as SessionTreeSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/switch\") {\n\t\thandleSessionTreeSwitch(config, body as SessionTreeSwitchBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/compact\") {\n\t\tawait handleSessionCompact(config, body as SessionCompactBody, res, streamModels);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/stream\") {\n\t\thandleStream(config, body as StreamRequestBody, res, streamModels);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nconst CLASSIFIER_APIS: Record<string, ProviderClassifier> = {\n\t\"typesafe-system-one\": typesafeSystemOneApi(),\n\t\"cloudflare-workers-ai-system-one\": cloudflareWorkersAISystemOneApi(),\n\t\"llama-cpp-classify\": llamaCppClassifyApi(),\n\t\"openai-decisions\": openAIDecisionsApi(),\n};\n\ninterface ImageOperationBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: ImageModel<ImageApi>;\n\tcontext: ImagesContext;\n\toptions?: ImagesOptions;\n}\n\ninterface ClassifierOperationBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: ClassifierModel<ClassifierApi>;\n\tcontext: ClassifierContext;\n\toptions?: ClassifierOptions;\n}\n\ninterface DeferredCancelBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: Model<string>;\n\thandle: DeferredHandle;\n\toptions?: DeferredCancelOptions;\n}\n\nasync function handleModelOperation(\n\tmodels: Models,\n\tbody:\n\t\t| (ImageOperationBody & { kind: \"image\" })\n\t\t| (ClassifierOperationBody & { kind: \"classifier\" })\n\t\t| (DeferredCancelBody & { kind: \"deferred-cancel\" }),\n\tres: ServerResponse,\n): Promise<void> {\n\tif (\n\t\t!body.sessionId ||\n\t\t!body.runId ||\n\t\t!body.model ||\n\t\t(body.kind === \"deferred-cancel\" ? !body.handle : !body.context)\n\t) {\n\t\tsendError(\n\t\t\tres,\n\t\t\t400,\n\t\t\t\"sessionId, runId, model and operation input are required\",\n\t\t\tPiServerErrorCode.REQUIRED_FIELD_MISSING,\n\t\t);\n\t\treturn;\n\t}\n\tconst existing = getStreamRun(body.sessionId, body.runId);\n\tif (existing && existing.kind !== body.kind) {\n\t\tsendError(res, 409, \"runId belongs to a different operation\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (existing?.status === \"running\") {\n\t\tsendError(res, 409, \"A run with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\treturn;\n\t}\n\tif (existing?.status === \"aborted\") {\n\t\tsendError(res, 409, \"Model operation was aborted\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tconst run = existing?.operationResult ? existing : startStreamRun(body.sessionId, body.runId, body.kind);\n\tres.writeHead(200, { \"Content-Type\": \"text/event-stream\", \"Cache-Control\": \"no-cache\", Connection: \"keep-alive\" });\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.destroyed && !res.writableEnded) res.write(STREAM_HEARTBEAT);\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\ttry {\n\t\tif (!run.operationResult) {\n\t\t\tconst requestModels =\n\t\t\t\tbody.kind === \"deferred-cancel\" ? models : resolveOperationModels(models, body.model, body.options);\n\t\t\tconst result =\n\t\t\t\tbody.kind === \"deferred-cancel\"\n\t\t\t\t\t? await requestModels\n\t\t\t\t\t\t\t.cancelDeferred(body.model, body.handle, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<Model<string>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.then(() => ({ cancelled: true as const, stopReason: \"stop\" as const }))\n\t\t\t\t\t: body.kind === \"image\"\n\t\t\t\t\t\t? await requestModels.generateImages(body.model, body.context, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<ImageModel<ImageApi>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: await requestModels.classify(body.model, body.context, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<ClassifierModel<ClassifierApi>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t});\n\t\t\trun.operationResult = run.cancelRequested\n\t\t\t\t? { ...result, stopReason: \"aborted\", errorMessage: \"Model operation aborted\" }\n\t\t\t\t: result;\n\t\t\trun.status =\n\t\t\t\trun.cancelRequested || result.stopReason === \"aborted\"\n\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t: result.stopReason === \"error\"\n\t\t\t\t\t\t? \"failed\"\n\t\t\t\t\t\t: \"completed\";\n\t\t\trun.errorMessage = \"errorMessage\" in result ? result.errorMessage : undefined;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\tif (!res.destroyed && !res.writableEnded) writeServerSentEvent(res, \"result\", run.operationResult);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tfailStreamRun(run, message);\n\t\tif (!res.destroyed && !res.writableEnded) writeServerSentEvent(res, \"error\", { error: message });\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tendStreamResponse(res);\n\t}\n}\n\nfunction resolveOperationModels(models: Models, model: AnyModel, options?: ImagesOptions | ClassifierOptions): Models {\n\tconst provider = models.getProvider(model.provider);\n\tconst hasDeclaredApi = provider\n\t\t?.getAllModels?.()\n\t\t.some((candidate) => candidate.type === model.type && candidate.api === model.api);\n\tif (\n\t\thasDeclaredApi &&\n\t\t((model.type === \"image\" && provider?.generateImages) || (model.type === \"classifier\" && provider?.classify))\n\t)\n\t\treturn models;\n\tconst requestModels = createModels();\n\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider, options?.env);\n\tconst auth = provider?.auth ?? {\n\t\tapiKey: {\n\t\t\tname: \"pi-server request auth\",\n\t\t\tresolve: async () => ({ auth: { apiKey, headers: options?.headers } }),\n\t\t},\n\t};\n\tif (model.type === \"image\") {\n\t\tconst api = getImagesApiProvider(model.api);\n\t\tif (!api) throw new Error(`No image API registered on pi-server: ${model.api}`);\n\t\trequestModels.setProvider(\n\t\t\tcreateProvider({ id: model.provider, models: [model], auth, images: { [model.api]: api } }),\n\t\t);\n\t} else if (model.type === \"classifier\") {\n\t\tconst api = CLASSIFIER_APIS[model.api];\n\t\tif (!api) throw new Error(`No classifier API registered on pi-server: ${model.api}`);\n\t\trequestModels.setProvider(\n\t\t\tcreateProvider({ id: model.provider, models: [model], auth, classifiers: { [model.api]: api } }),\n\t\t);\n\t} else {\n\t\tthrow new Error(\"Image generation and classification require an operation-specific model type\");\n\t}\n\treturn requestModels;\n}\n\nexport function createPiServer(configOverride?: Partial<ServerConfig>, streamModels?: Models): HttpServer {\n\tconst config = loadConfig(configOverride);\n\tconst models = streamModels ?? builtinModels();\n\tloadPersistedSessions(config.sessionStoreDir);\n\n\tconst server = createServer(async (req, res) => {\n\t\tconst url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/health\") {\n\t\t\tsendJson(res, 200, { status: \"ok\" });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!authenticate(config, req)) {\n\t\t\tconst body =\n\t\t\t\treq.method === \"GET\" && url.pathname === \"/\"\n\t\t\t\t\t? { error: \"Unauthorized\", version: PI_SERVER_VERSION }\n\t\t\t\t\t: { error: \"Unauthorized\" };\n\t\t\tsendJson(res, 401, body);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/api/sessions\") {\n\t\t\tsendJson(res, 200, { sessions: listSessions() });\n\t\t\treturn;\n\t\t}\n\t\tif (req.method === \"GET\" && url.pathname === \"/api/models\") {\n\t\t\ttry {\n\t\t\t\tconst stripHeaders = <T extends { headers?: unknown }>(model: T): T => ({ ...model, headers: undefined });\n\t\t\t\tsendJson(res, 200, {\n\t\t\t\t\tmodels: models.getAllModels().map(stripHeaders),\n\t\t\t\t\tavailable: (await models.getAllAvailable()).map(stripHeaders),\n\t\t\t\t\tproviders: models.getProviders().map((provider) => ({\n\t\t\t\t\t\tid: provider.id,\n\t\t\t\t\t\tfetchDeferred: provider.fetchDeferred !== undefined,\n\t\t\t\t\t\tcancelDeferred: provider.cancelDeferred !== undefined,\n\t\t\t\t\t})),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tsendError(\n\t\t\t\t\tres,\n\t\t\t\t\t500,\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\tPiServerErrorCode.INTERNAL_ERROR,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst runMatch = /^\\/api\\/session\\/([^/]+)\\/runs\\/([^/]+)$/.exec(url.pathname);\n\t\tif (req.method === \"GET\" && runMatch) {\n\t\t\thandleSessionRun(decodeURIComponent(runMatch[1]), decodeURIComponent(runMatch[2]), res);\n\t\t\treturn;\n\t\t}\n\n\t\tconst runAbortMatch = /^\\/api\\/session\\/([^/]+)\\/runs\\/([^/]+)\\/abort$/.exec(url.pathname);\n\t\tif (req.method === \"POST\" && runAbortMatch) {\n\t\t\tawait readBody(req);\n\t\t\tawait handleSessionRunAbort(decodeURIComponent(runAbortMatch[1]), decodeURIComponent(runAbortMatch[2]), res);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname.startsWith(\"/api/session/\") && url.pathname.endsWith(\"/history\")) {\n\t\t\tconst encodedSessionId = url.pathname.slice(\"/api/session/\".length, -\"/history\".length);\n\t\t\tconst fromParam = url.searchParams.get(\"from\");\n\t\t\tconst from = fromParam === null ? undefined : Number(fromParam);\n\t\t\tif (from !== undefined && (!Number.isInteger(from) || from < 0)) {\n\t\t\t\tsendError(res, 400, \"from must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst entriesFromParam = url.searchParams.get(\"entriesFrom\");\n\t\t\tconst entriesFrom = entriesFromParam === null ? undefined : Number(entriesFromParam);\n\t\t\tif (entriesFrom !== undefined && (!Number.isInteger(entriesFrom) || entriesFrom < 0)) {\n\t\t\t\tsendError(res, 400, \"entriesFrom must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst revisionParam = url.searchParams.get(\"revision\");\n\t\t\tconst revision = revisionParam === null ? undefined : Number(revisionParam);\n\t\t\tif (revision !== undefined && (!Number.isInteger(revision) || revision < 0)) {\n\t\t\t\tsendError(res, 400, \"revision must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleSessionHistory(\n\t\t\t\tdecodeURIComponent(encodedSessionId),\n\t\t\t\tfrom,\n\t\t\t\tentriesFrom,\n\t\t\t\trevision,\n\t\t\t\turl.searchParams.get(\"baseTreeHash\") ?? undefined,\n\t\t\t\tres,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === CHUNK_ENDPOINT) {\n\t\t\ttry {\n\t\t\t\tconst body = JSON.parse(await readBody(req)) as RequestChunkBody;\n\t\t\t\tconst chunkResult = receiveRequestChunk(body);\n\t\t\t\tif (!chunkResult.complete) {\n\t\t\t\t\tsendJson(res, 200, chunkResult.ack);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst handled = await handlePostRequest(\n\t\t\t\t\tconfig,\n\t\t\t\t\tchunkResult.target,\n\t\t\t\t\tJSON.parse(chunkResult.bodyJson) as unknown,\n\t\t\t\t\tres,\n\t\t\t\t\tmodels,\n\t\t\t\t\tstreamModels,\n\t\t\t\t);\n\t\t\t\tif (!handled && !res.headersSent) {\n\t\t\t\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogRequestError(req, err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 400, err instanceof Error ? err.message : String(err), PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t} else {\n\t\t\t\t\tres.write(encodeErrorEvent(err instanceof Error ? err.message : String(err)));\n\t\t\t\t\tres.end();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\") {\n\t\t\ttry {\n\t\t\t\tconst body = JSON.parse(await readBody(req)) as unknown;\n\t\t\t\tif (await handlePostRequest(config, url.pathname, body, res, models, streamModels)) return;\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogRequestError(req, err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 500, err instanceof Error ? err.message : String(err), PiServerErrorCode.INTERNAL_ERROR);\n\t\t\t\t} else {\n\t\t\t\t\tres.write(encodeErrorEvent(err instanceof Error ? err.message : String(err)));\n\t\t\t\t\tres.end();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (req.method === \"DELETE\" && url.pathname.startsWith(\"/api/session/\")) {\n\t\t\tconst sessionId = decodeURIComponent(url.pathname.slice(\"/api/session/\".length));\n\t\t\tdeleteSessionFromStore(sessionId);\n\t\t\tdeletePersistedSession(config.sessionStoreDir, sessionId);\n\t\t\tawait deleteStreamRunsForSession(sessionId);\n\t\t\tsendJson(res, 200, { deleted: sessionId });\n\t\t\treturn;\n\t\t}\n\n\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t});\n\n\treturn server;\n}\n\nfunction toProxyEvent(event: AssistantMessageEvent): ProxyAssistantMessageEvent | undefined {\n\tswitch (event.type) {\n\t\tcase \"start\":\n\t\t\treturn { type: \"start\" };\n\t\tcase \"text_start\":\n\t\t\treturn { type: \"text_start\", contentIndex: event.contentIndex };\n\t\tcase \"text_delta\":\n\t\t\treturn { type: \"text_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"text_end\":\n\t\t\treturn {\n\t\t\t\ttype: \"text_end\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tcontentSignature:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"text\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { textSignature?: string }).textSignature\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\tcase \"thinking_start\":\n\t\t\treturn { type: \"thinking_start\", contentIndex: event.contentIndex };\n\t\tcase \"thinking_delta\":\n\t\t\treturn { type: \"thinking_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"thinking_end\":\n\t\t\treturn {\n\t\t\t\ttype: \"thinking_end\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tcontentSignature:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"thinking\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { thinkingSignature?: string }).thinkingSignature\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\tcase \"toolcall_start\":\n\t\t\treturn {\n\t\t\t\ttype: \"toolcall_start\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tid:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"toolCall\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { id: string }).id\n\t\t\t\t\t\t: \"\",\n\t\t\t\ttoolName:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"toolCall\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { name: string }).name\n\t\t\t\t\t\t: \"\",\n\t\t\t};\n\t\tcase \"toolcall_delta\":\n\t\t\treturn { type: \"toolcall_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"toolcall_end\":\n\t\t\treturn { type: \"toolcall_end\", contentIndex: event.contentIndex, toolCall: event.toolCall };\n\t\tcase \"done\":\n\t\t\treturn {\n\t\t\t\ttype: \"done\",\n\t\t\t\treason: event.reason,\n\t\t\t\tusage: event.message.usage,\n\t\t\t\tdeferred: event.message.deferred,\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\tcase \"error\":\n\t\t\treturn {\n\t\t\t\ttype: \"error\",\n\t\t\t\treason: event.reason,\n\t\t\t\terrorMessage: event.error.errorMessage,\n\t\t\t\tmessage: event.error,\n\t\t\t\tusage: event.error.usage,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nexport function startServer(configOverride?: Partial<ServerConfig>): HttpServer {\n\tconst config = loadConfig(configOverride);\n\tconst server = createPiServer(configOverride);\n\tserver.listen(config.port, config.host, () => {\n\t\tconst address = server.address();\n\t\tconst port = typeof address === \"object\" && address !== null ? address.port : config.port;\n\t\tconst host = config.host.includes(\":\") && !config.host.startsWith(\"[\") ? `[${config.host}]` : config.host;\n\t\tconsole.log(`pi-server listening on ${host}:${port}`);\n\t});\n\treturn server;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createServer, type Server as HttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { createRequire } from \"node:module\";\nimport {\n\ttype CompactionCacheRequestOptions,\n\ttype CompactionPreparationOptions,\n\ttype CompactionSettings,\n\tcompactLegacy,\n\tconvertToLlm,\n\tDEFAULT_COMPACTION_SETTINGS,\n\ttype LegacyCompactResult,\n\ttype ProxyAssistantMessageEvent,\n\tprepareLegacyCompaction,\n\ttype SessionTreeEntry,\n} from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AnyModel,\n\ttype AssistantImages,\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype CacheRetention,\n\ttype ClassifierApi,\n\ttype ClassifierContext,\n\ttype ClassifierModel,\n\ttype ClassifierOptions,\n\ttype ClassifierResult,\n\ttype Context,\n\tcreateModels,\n\tcreateProvider,\n\ttype DeferredCancelOptions,\n\ttype DeferredHandle,\n\ttype ImageApi,\n\ttype ImageModel,\n\ttype ImagesContext,\n\ttype ImagesOptions,\n\ttype Message,\n\ttype Model,\n\ttype Models,\n\ttype ModelsSimpleStreamOptions,\n\ttype ProviderClassifier,\n\ttype ProviderRequestOptions,\n\ttype ProviderStreamOptions,\n\ttype ProviderStreams,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport { cloudflareWorkersAISystemOneApi } from \"@earendil-works/pi-ai/api/cloudflare-workers-ai-system-one.lazy\";\nimport { llamaCppClassifyApi } from \"@earendil-works/pi-ai/api/llama-cpp-classify.lazy\";\nimport { openAIDecisionsApi } from \"@earendil-works/pi-ai/api/openai-decisions.lazy\";\nimport { typesafeSystemOneApi } from \"@earendil-works/pi-ai/api/typesafe-system-one.lazy\";\nimport {\n\tgetBuiltinProviderForModel,\n\tgetEnvApiKey,\n\tgetImagesApiProvider,\n\tstream as streamApi,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { getProviderEnvValue } from \"@earendil-works/pi-ai/utils/provider-env\";\nimport type { ServerConfig } from \"./config.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { PiServerError, PiServerErrorCode, type PiServerErrorResponse } from \"./error-codes.ts\";\nimport { encodeErrorEvent, encodeProxyEvent } from \"./event-encoding.ts\";\nimport { hashPiServerProviderMessages, type PiServerProviderCallbackRequest } from \"./pi-server-protocol.ts\";\nimport { ReceiveUploadError, receiveUpload } from \"./receive-upload.ts\";\nimport { CHUNK_ENDPOINT, type RequestChunkBody, receiveRequestChunk } from \"./request-chunks.ts\";\nimport { deletePersistedSession, loadPersistedSessions, savePersistedSession } from \"./session-persistence.ts\";\nimport {\n\tappendCompactionEntry,\n\tappendMessages,\n\tappendSessionEntries,\n\tdeleteSession as deleteSessionFromStore,\n\tgetOrCreateSession,\n\tgetSession,\n\tgetSessionBranch,\n\tlistSessions,\n\treplaceMessages,\n\treplaceSessionTree,\n\ttype SessionState,\n\ttype SessionStaticContext,\n\tsetStaticContext,\n\tswitchSessionLeaf,\n} from \"./session-store.ts\";\n\nexport { loadConfig, type ServerConfig } from \"./config.ts\";\n\ninterface PackageMetadata {\n\tversion: string;\n}\n\nconst packageMetadata = createRequire(import.meta.url)(\"../package.json\") as PackageMetadata;\nconst PI_SERVER_VERSION = packageMetadata.version;\n\ninterface SessionInitBody {\n\tsessionId: string;\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface StreamRequestBody {\n\tsessionId: string;\n\trunId?: string;\n\tmodel: Model<any>;\n\toptions?: SimpleStreamOptions;\n\tstaticContext?: SessionStaticContext;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n\tobserveProviderStreamEvents?: boolean;\n\trequestKind?: \"api\" | \"simple\" | \"deferred\";\n\tdeferredHandle?: DeferredHandle;\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n}\n\ninterface SessionSyncBody {\n\tsessionId: string;\n\tmessages: Message[];\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionAppendBody {\n\tsessionId: string;\n\tmessages: Message[];\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionTreeSyncBody {\n\tsessionId: string;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\tstaticContext?: SessionStaticContext;\n}\n\ninterface SessionTreeSwitchBody {\n\tsessionId: string;\n\tleafId: string | null;\n}\n\ninterface SessionCompactBody {\n\tsessionId: string;\n\trunId?: string;\n\tmodel: Model<any>;\n\toptions?: SimpleStreamOptions;\n\tsettings?: CompactionSettings;\n\tpreparation?: CompactionPreparationOptions;\n\tcustomInstructions?: string;\n\tcacheContextHash?: string;\n\tcacheStaticContextHash?: string;\n\tcacheFallbackReason?: string;\n\tbaseTreeHash?: string;\n\tfullResponse?: boolean;\n\tstreamResponse?: boolean;\n}\n\nfunction createRequestModels(model: Model<any>, options: SimpleStreamOptions) {\n\tconst models = createModels();\n\tconst builtin = getBuiltinProviderForModel(model);\n\tconst requestApiStream: ProviderStreams[\"stream\"] = (requestModel, context, streamOptions) =>\n\t\tbuiltin\n\t\t\t? builtin.stream(requestModel, context, streamOptions)\n\t\t\t: streamApi(requestModel, context, streamOptions as ProviderStreamOptions | undefined);\n\tconst requestStream: ProviderStreams[\"streamSimple\"] = (requestModel, context, streamOptions) => {\n\t\tconst requestOptions = {\n\t\t\t...streamOptions,\n\t\t\t...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n\t\t};\n\t\treturn builtin\n\t\t\t? builtin.streamSimple(requestModel, context, requestOptions)\n\t\t\t: streamSimple(requestModel, context, requestOptions);\n\t};\n\tmodels.setProvider(\n\t\tcreateProvider({\n\t\t\tid: model.provider,\n\t\t\tname: model.provider,\n\t\t\tmodels: [model],\n\t\t\tauth: builtin\n\t\t\t\t? {\n\t\t\t\t\t\t...builtin.auth,\n\t\t\t\t\t\tapiKey: {\n\t\t\t\t\t\t\tname: builtin.auth.apiKey?.name ?? \"pi-server request auth\",\n\t\t\t\t\t\t\tresolve: async (request) => {\n\t\t\t\t\t\t\t\tconst resolved = await builtin.auth.apiKey?.resolve(request);\n\t\t\t\t\t\t\t\tif (resolved) return resolved;\n\t\t\t\t\t\t\t\t// Declared request credentials are validated by the native provider.\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptions.apiKey !== undefined ||\n\t\t\t\t\t\t\t\t\toptions.headers !== undefined ||\n\t\t\t\t\t\t\t\t\tmodel.headers !== undefined\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn { auth: { apiKey: options.apiKey, headers: options.headers }, env: options.env };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tapiKey: {\n\t\t\t\t\t\t\tname: \"pi-server request auth\",\n\t\t\t\t\t\t\tresolve: async () => ({ auth: { apiKey: options.apiKey, headers: options.headers } }),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\tapi: {\n\t\t\t\tstream: requestApiStream,\n\t\t\t\tstreamSimple: requestStream,\n\t\t\t},\n\t\t}),\n\t);\n\treturn models;\n}\n\ninterface StreamRunRecord {\n\tcallbacks: Map<string, { resolve: (result: unknown) => void; reject: (error: Error) => void }>;\n\tcallbackConnectionClosed: boolean;\n\tsessionId: string;\n\trunId: string;\n\tkind: \"stream\" | \"compact\" | \"image\" | \"classifier\" | \"deferred-cancel\";\n\tstatus: \"running\" | \"completed\" | \"failed\" | \"aborted\";\n\tmessage?: AssistantMessage;\n\tcacheRetention?: CacheRetention;\n\tcompactResult?: SessionCompactSuccessBody;\n\toperationResult?:\n\t\t| AssistantImages\n\t\t| ClassifierResult\n\t\t| { cancelled: true; stopReason: \"stop\" | \"aborted\"; errorMessage?: string };\n\terrorMessage?: string;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tcancelRequested: boolean;\n\tcontroller: AbortController;\n\tsettled: Promise<void>;\n\tresolveSettled: (() => void) | undefined;\n}\n\nconst STREAM_HEARTBEAT = \": keep-alive\\n\\n\";\nconst JSON_HEARTBEAT = \" \\n\";\nconst STREAM_HEARTBEAT_INTERVAL_MS = 25_000;\nconst STREAM_RUN_TTL_MS = 60 * 60 * 1000; // 1 hour\nconst streamRuns = new Map<string, StreamRunRecord>();\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\treq.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n\t\treq.on(\"error\", reject);\n\t});\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n\tconst data = JSON.stringify(body);\n\tres.writeHead(status, { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(data) });\n\tres.end(data);\n}\n\nfunction sendError(\n\tres: ServerResponse,\n\tstatus: number,\n\tmessage: string,\n\tcode?: PiServerErrorCode,\n\tdetails?: Record<string, unknown>,\n): void {\n\tconst body: PiServerErrorResponse = { error: message };\n\tif (code) body.code = code;\n\tif (details) body.details = details;\n\tsendJson(res, status, body);\n}\n\nfunction logRequestError(req: IncomingMessage, error: unknown): void {\n\tconst message = error instanceof Error ? error.stack || error.message : String(error);\n\tconsole.error(`${req.method ?? \"UNKNOWN\"} ${req.url ?? \"/\"} failed: ${message}`);\n}\n\nfunction authenticate(config: ServerConfig, req: IncomingMessage): boolean {\n\tif (!config.authToken) return true;\n\tconst header = req.headers.authorization;\n\tif (!header) return false;\n\tconst token = header.startsWith(\"Bearer \") ? header.slice(7) : header;\n\treturn token === config.authToken;\n}\n\nfunction sessionResponseBody(session: SessionState) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t};\n}\n\nfunction persistSession(config: ServerConfig, session: SessionState): void {\n\tsavePersistedSession(config.sessionStoreDir, session);\n}\n\nfunction runKey(sessionId: string, runId: string): string {\n\treturn `${sessionId}\\0${runId}`;\n}\n\nfunction getStreamRun(sessionId: string, runId: string): StreamRunRecord | undefined {\n\treturn streamRuns.get(runKey(sessionId, runId));\n}\n\nfunction createRunRecord(sessionId: string, runId: string, kind: StreamRunRecord[\"kind\"]): StreamRunRecord {\n\tlet resolveSettled: (() => void) | undefined;\n\tconst settled = new Promise<void>((resolve) => {\n\t\tresolveSettled = resolve;\n\t});\n\treturn {\n\t\tcallbacks: new Map(),\n\t\tcallbackConnectionClosed: false,\n\t\tsessionId,\n\t\trunId,\n\t\tkind,\n\t\tstatus: \"running\",\n\t\tcreatedAt: Date.now(),\n\t\tupdatedAt: Date.now(),\n\t\tcancelRequested: false,\n\t\tcontroller: new AbortController(),\n\t\tsettled,\n\t\tresolveSettled,\n\t};\n}\n\nfunction settleRun(run: StreamRunRecord | undefined): void {\n\tif (!run) return;\n\trejectProviderCallbacks(run, new Error(\"Provider run settled before callback reply\"));\n\tconst resolve = run.resolveSettled;\n\trun.resolveSettled = undefined;\n\tresolve?.();\n}\n\nfunction startStreamRun(sessionId: string, runId: string, kind: StreamRunRecord[\"kind\"] = \"stream\"): StreamRunRecord {\n\tconst existing = getStreamRun(sessionId, runId);\n\tif (existing?.status === \"completed\" || existing?.status === \"aborted\") return existing;\n\tconst run = existing ?? createRunRecord(sessionId, runId, kind);\n\tif (existing) {\n\t\trun.callbackConnectionClosed = false;\n\t\trun.message = undefined;\n\t\trun.cacheRetention = undefined;\n\t\trun.errorMessage = undefined;\n\t\trun.cancelRequested = false;\n\t\trun.controller = new AbortController();\n\t\tlet resolveSettled: (() => void) | undefined;\n\t\trun.settled = new Promise<void>((resolve) => {\n\t\t\tresolveSettled = resolve;\n\t\t});\n\t\trun.resolveSettled = resolveSettled;\n\t}\n\trun.kind = kind;\n\trun.status = \"running\";\n\trun.updatedAt = Date.now();\n\tstreamRuns.set(runKey(sessionId, runId), run);\n\treturn run;\n}\n\nfunction streamRunResponseBody(run: StreamRunRecord) {\n\treturn {\n\t\tsessionId: run.sessionId,\n\t\trunId: run.runId,\n\t\tstatus: run.status,\n\t\tcreatedAt: run.createdAt,\n\t\tupdatedAt: run.updatedAt,\n\t\t...(run.message ? { message: run.message } : {}),\n\t\t...(run.cacheRetention !== undefined ? { cacheRetention: run.cacheRetention } : {}),\n\t\t...(run.compactResult ? { compactResult: run.compactResult } : {}),\n\t\t...(run.operationResult ? { operationResult: run.operationResult } : {}),\n\t\t...(run.errorMessage ? { errorMessage: run.errorMessage } : {}),\n\t};\n}\n\nfunction replayStreamRun(run: StreamRunRecord): ProxyAssistantMessageEvent[] {\n\tif (!run.message) return [];\n\tif (\n\t\trun.message.stopReason !== \"stop\" &&\n\t\trun.message.stopReason !== \"length\" &&\n\t\trun.message.stopReason !== \"toolUse\" &&\n\t\trun.message.stopReason !== \"deferred\"\n\t) {\n\t\treturn [];\n\t}\n\tconst events: ProxyAssistantMessageEvent[] = [{ type: \"start\" }];\n\tfor (const [contentIndex, content] of run.message.content.entries()) {\n\t\tswitch (content.type) {\n\t\t\tcase \"text\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"text_start\", contentIndex },\n\t\t\t\t\t{ type: \"text_delta\", contentIndex, delta: content.text },\n\t\t\t\t\t{ type: \"text_end\", contentIndex, contentSignature: content.textSignature },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"thinking\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"thinking_start\", contentIndex },\n\t\t\t\t\t{ type: \"thinking_delta\", contentIndex, delta: content.thinking },\n\t\t\t\t\t{ type: \"thinking_end\", contentIndex, contentSignature: content.thinkingSignature },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"toolCall\":\n\t\t\t\tevents.push(\n\t\t\t\t\t{ type: \"toolcall_start\", contentIndex, id: content.id, toolName: content.name },\n\t\t\t\t\t{ type: \"toolcall_delta\", contentIndex, delta: JSON.stringify(content.arguments) },\n\t\t\t\t\t{ type: \"toolcall_end\", contentIndex, toolCall: content },\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tevents.push({\n\t\ttype: \"done\",\n\t\treason: run.message.stopReason,\n\t\tusage: run.message.usage,\n\t\tdeferred: run.message.deferred,\n\t\tmessage: run.message,\n\t});\n\treturn events;\n}\n\nfunction completeStreamRun(run: StreamRunRecord | undefined, message: AssistantMessage): void {\n\tif (!run) return;\n\tif (run.cancelRequested) {\n\t\trun.status = \"aborted\";\n\t\trun.message = undefined;\n\t\trun.errorMessage = \"Stream run aborted\";\n\t\trun.updatedAt = Date.now();\n\t\treturn;\n\t}\n\trun.status = \"completed\";\n\trun.message = message;\n\trun.errorMessage = undefined;\n\trun.updatedAt = Date.now();\n}\n\nfunction failStreamRun(run: StreamRunRecord | undefined, errorMessage: string, message?: AssistantMessage): void {\n\tif (!run) return;\n\tif (run.cancelRequested) {\n\t\trun.status = \"aborted\";\n\t\trun.errorMessage = \"Stream run aborted\";\n\t\trun.updatedAt = Date.now();\n\t\treturn;\n\t}\n\trun.status = \"failed\";\n\trun.message = message;\n\trun.errorMessage = errorMessage;\n\trun.updatedAt = Date.now();\n}\n\nfunction touchStreamRun(run: StreamRunRecord | undefined): void {\n\tif (run) run.updatedAt = Date.now();\n}\n\nfunction rejectProviderCallbacks(run: StreamRunRecord, error: Error): void {\n\tconst pending = [...run.callbacks.values()];\n\trun.callbacks.clear();\n\tfor (const callback of pending) callback.reject(error);\n}\n\nfunction createProviderCallbacks<TModel extends AnyModel>(\n\trun: StreamRunRecord,\n\tres: ServerResponse,\n\tcallbacks: { onPayload?: boolean; onResponse?: boolean } | undefined,\n): Pick<ProviderRequestOptions<TModel>, \"onPayload\" | \"onResponse\"> {\n\tif (!callbacks?.onPayload && !callbacks?.onResponse) return {};\n\tres.once(\"close\", () => {\n\t\trun.callbackConnectionClosed = true;\n\t\trejectProviderCallbacks(run, new Error(\"Provider callback connection closed\"));\n\t});\n\trun.controller.signal.addEventListener(\n\t\t\"abort\",\n\t\t() => rejectProviderCallbacks(run, new DOMException(\"Provider run aborted\", \"AbortError\")),\n\t\t{ once: true },\n\t);\n\tconst requestCallback = (request: PiServerProviderCallbackRequest): Promise<unknown> => {\n\t\tif (run.controller.signal.aborted) return Promise.reject(new DOMException(\"Provider run aborted\", \"AbortError\"));\n\t\tif (run.callbackConnectionClosed || res.destroyed || res.writableEnded)\n\t\t\treturn Promise.reject(new Error(\"Provider callback connection closed\"));\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\trun.callbacks.set(request.callbackId, { resolve, reject });\n\t\t\ttry {\n\t\t\t\twriteServerSentEvent(res, \"provider_callback\", request);\n\t\t\t} catch (error) {\n\t\t\t\trun.callbacks.delete(request.callbackId);\n\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\t\t});\n\t};\n\treturn {\n\t\t...(callbacks.onPayload\n\t\t\t? {\n\t\t\t\t\tonPayload: (payload: unknown, model: TModel) =>\n\t\t\t\t\t\trequestCallback({\n\t\t\t\t\t\t\tcallbackId: randomUUID(),\n\t\t\t\t\t\t\tkind: \"payload\",\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t\tpayload,\n\t\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(callbacks.onResponse\n\t\t\t? {\n\t\t\t\t\tonResponse: async (response, model) => {\n\t\t\t\t\t\tawait requestCallback({\n\t\t\t\t\t\t\tcallbackId: randomUUID(),\n\t\t\t\t\t\t\tkind: \"response\",\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t\tresponse,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction handleProviderCallbackReply(body: unknown, res: ServerResponse): void {\n\tif (!body || typeof body !== \"object\") {\n\t\tsendError(res, 400, \"Provider callback reply must be an object\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tconst reply = body as {\n\t\tsessionId?: unknown;\n\t\trunId?: unknown;\n\t\tcallbackId?: unknown;\n\t\tresult?: unknown;\n\t\terror?: unknown;\n\t};\n\tif (typeof reply.sessionId !== \"string\" || typeof reply.runId !== \"string\" || typeof reply.callbackId !== \"string\") {\n\t\tsendError(res, 400, \"sessionId, runId and callbackId are required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tconst run = getStreamRun(reply.sessionId, reply.runId);\n\tconst pending = run?.callbacks.get(reply.callbackId);\n\tif (!run || run.status !== \"running\" || !pending) {\n\t\tsendError(res, 409, \"Provider callback is no longer pending\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tlet error: Error | undefined;\n\tif (reply.error !== undefined) {\n\t\tconst remoteError = reply.error as { name?: unknown; message?: unknown } | null;\n\t\tif (!remoteError || typeof remoteError.name !== \"string\" || typeof remoteError.message !== \"string\") {\n\t\t\tsendError(\n\t\t\t\tres,\n\t\t\t\t400,\n\t\t\t\t\"Provider callback error requires string name and message\",\n\t\t\t\tPiServerErrorCode.INVALID_REQUEST,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\terror = new Error(remoteError.message);\n\t\terror.name = remoteError.name;\n\t}\n\trun.callbacks.delete(reply.callbackId);\n\tsendJson(res, 200, { accepted: true, callbackId: reply.callbackId, runId: reply.runId });\n\tif (error) pending.reject(error);\n\telse pending.resolve(reply.result);\n}\n\nfunction writeStreamEvent(res: ServerResponse, event: ProxyAssistantMessageEvent): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.write(encodeProxyEvent(event));\n\t}\n}\n\nfunction writeStreamError(res: ServerResponse, message: string): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.write(encodeErrorEvent(message));\n\t}\n}\n\nfunction endStreamResponse(res: ServerResponse): void {\n\tif (!res.writableEnded && !res.destroyed) {\n\t\tres.end();\n\t}\n}\n\nfunction cleanupExpiredStreamRuns(nowMs: number): void {\n\tfor (const [key, run] of streamRuns) {\n\t\tif (nowMs - run.updatedAt > STREAM_RUN_TTL_MS) {\n\t\t\tstreamRuns.delete(key);\n\t\t}\n\t}\n}\n\nasync function deleteStreamRunsForSession(sessionId: string): Promise<void> {\n\tconst runs = [...streamRuns.entries()].filter(([, run]) => run.sessionId === sessionId);\n\tfor (const [, run] of runs) {\n\t\tif (run.status !== \"running\") continue;\n\t\trun.cancelRequested = true;\n\t\trun.updatedAt = Date.now();\n\t\trun.controller.abort();\n\t\trejectProviderCallbacks(run, new DOMException(\"Provider session deleted\", \"AbortError\"));\n\t}\n\tawait Promise.all(runs.map(([, run]) => run.settled));\n\tfor (const [key, run] of runs) {\n\t\tif (streamRuns.get(key) === run) streamRuns.delete(key);\n\t}\n}\n\nconst streamRunCleanupTimer = setInterval(() => cleanupExpiredStreamRuns(Date.now()), STREAM_RUN_TTL_MS / 4);\nstreamRunCleanupTimer.unref();\n\nfunction sessionHistoryFullResponseBody(session: SessionState, baseMessageCount: number) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tentries: session.entries,\n\t\tbaseMessageCount,\n\t\tmessages: session.messages.slice(baseMessageCount),\n\t};\n}\n\nfunction sessionTreePatchResponseBody(\n\tsession: SessionState,\n\tbaseMessageCount: number,\n\tentriesFrom: number,\n\tbaseRevision: number | undefined,\n) {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tstaticContextHash: session.staticContextHash,\n\t\ttreeHash: session.treeHash,\n\t\tmessageCount: session.messages.length,\n\t\tentryCount: session.entries.length,\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tbaseMessageCount,\n\t\tmessages: session.messages.slice(baseMessageCount),\n\t\ttreePatch: {\n\t\t\tentriesFrom,\n\t\t\tbaseRevision,\n\t\t\tentries: session.entries.slice(entriesFrom),\n\t\t\tleafId: session.leafId,\n\t\t\trevision: session.revision,\n\t\t},\n\t};\n}\n\ntype PreparedCompaction = Parameters<typeof compactLegacy>[0];\n\ninterface PreparedSessionCompact {\n\tmodels: Models;\n\tsession: SessionState;\n\tsessionId: string;\n\trevision: number;\n\ttreeHash: string;\n\tleafId: string | null;\n\tentryCount: number;\n\tpreparation: PreparedCompaction;\n\toptions: SimpleStreamOptions;\n\tcacheContext?: Context;\n\tcacheFallbackReason: string;\n}\n\ninterface SessionCompactSuccessBody {\n\tsuccess: true;\n\tcompaction: Omit<LegacyCompactResult, \"retainedTail\">;\n\tcompactionEntry: SessionTreeEntry;\n\tsessionId: string;\n\tstaticContextHash: string;\n\ttreeHash: string;\n\tmessageCount: number;\n\tentryCount: number;\n\tleafId: string | null;\n\trevision: number;\n\tstaticContext?: SessionStaticContext;\n\ttreePatch?: {\n\t\tbaseTreeHash: string;\n\t\tentriesFrom: number;\n\t\tentries: SessionTreeEntry[];\n\t\tleafId: string | null;\n\t\trevision: number;\n\t};\n\tentries?: SessionTreeEntry[];\n\tmessages?: Message[];\n}\n\ninterface SessionCompactHttpResponse {\n\tstatus: number;\n\tbody: PiServerErrorResponse | SessionCompactSuccessBody;\n}\n\nfunction handleSessionInit(config: ServerConfig, body: SessionInitBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t} else {\n\t\tgetOrCreateSession(body.sessionId);\n\t}\n\tconst session = getSession(body.sessionId)!;\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionUpdate(\n\tconfig: ServerConfig,\n\tbody: SessionInitBody & { staticContext: SessionStaticContext },\n\tres: ServerResponse,\n): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!body.staticContext) {\n\t\tsendError(res, 400, \"staticContext is required for update\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tsetStaticContext(body.sessionId, body.staticContext);\n\tconst session = getSession(body.sessionId)!;\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionSync(config: ServerConfig, body: SessionSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.messages)) {\n\t\tsendError(res, 400, \"messages is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = replaceMessages(body.sessionId, body.messages);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionAppend(config: ServerConfig, body: SessionAppendBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.messages)) {\n\t\tsendError(res, 400, \"messages is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = appendMessages(body.sessionId, body.messages);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionTreeSync(config: ServerConfig, body: SessionTreeSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.entries)) {\n\t\tsendError(res, 400, \"entries is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t}\n\tconst session = replaceSessionTree(body.sessionId, body.entries, body.leafId ?? null);\n\tpersistSession(config, session);\n\tsendJson(res, 200, sessionResponseBody(session));\n}\n\nfunction handleSessionTreeAppend(config: ServerConfig, body: SessionTreeSyncBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!Array.isArray(body.entries)) {\n\t\tsendError(res, 400, \"entries is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\ttry {\n\t\tif (body.staticContext) {\n\t\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t\t}\n\t\tconst session = appendSessionEntries(body.sessionId, body.entries, body.leafId ?? null);\n\t\tpersistSession(config, session);\n\t\tsendJson(res, 200, sessionResponseBody(session));\n\t} catch (error) {\n\t\tif (error instanceof PiServerError) {\n\t\t\tsendError(res, 400, error.message, error.code, error.details);\n\t\t} else {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tsendError(res, 500, message, PiServerErrorCode.INTERNAL_ERROR);\n\t\t}\n\t}\n}\n\nfunction handleSessionTreeSwitch(config: ServerConfig, body: SessionTreeSwitchBody, res: ServerResponse): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\ttry {\n\t\tconst session = switchSessionLeaf(body.sessionId, body.leafId ?? null);\n\t\tpersistSession(config, session);\n\t\tsendJson(res, 200, sessionResponseBody(session));\n\t} catch (error) {\n\t\tif (error instanceof PiServerError) {\n\t\t\tsendError(res, 400, error.message, error.code, error.details);\n\t\t} else {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tsendError(res, 500, message, PiServerErrorCode.INTERNAL_ERROR);\n\t\t}\n\t}\n}\n\nfunction prepareSessionCompact(\n\tbody: SessionCompactBody,\n\tmodels?: Models,\n): PreparedSessionCompact | SessionCompactHttpResponse {\n\tif (!body.sessionId) {\n\t\treturn { status: 400, body: { error: \"sessionId is required\" } };\n\t}\n\tif (!body.model) {\n\t\treturn { status: 400, body: { error: \"model is required\" } };\n\t}\n\tconst validDigest = (value: string | undefined): boolean => value === undefined || /^[a-f0-9]{64}$/.test(value);\n\tif (!validDigest(body.cacheContextHash) || !validDigest(body.cacheStaticContextHash)) {\n\t\treturn { status: 400, body: { error: \"cache context digests must be 64-character SHA-256 hex strings\" } };\n\t}\n\tif ((body.cacheContextHash === undefined) !== (body.cacheStaticContextHash === undefined)) {\n\t\treturn { status: 400, body: { error: \"cacheContextHash and cacheStaticContextHash must be supplied together\" } };\n\t}\n\n\tconst session = getSession(body.sessionId);\n\tif (!session) {\n\t\treturn { status: 404, body: { error: \"session not found\", code: PiServerErrorCode.SESSION_NOT_FOUND } };\n\t}\n\n\tconst entries = getSessionBranch(session);\n\tconst leaf = entries.at(-1);\n\tif (leaf?.type === \"compaction\") {\n\t\tif (!leaf.firstKeptEntryId) {\n\t\t\treturn { status: 400, body: { error: \"Stored compaction is missing firstKeptEntryId\" } };\n\t\t}\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\tsuccess: true,\n\t\t\t\tcompaction: {\n\t\t\t\t\tsummary: leaf.summary,\n\t\t\t\t\tfirstKeptEntryId: leaf.firstKeptEntryId,\n\t\t\t\t\ttokensBefore: leaf.tokensBefore,\n\t\t\t\t\tdetails: leaf.details,\n\t\t\t\t},\n\t\t\t\tcompactionEntry: leaf,\n\t\t\t\t...sessionResponseBody(session),\n\t\t\t\tentries: session.entries,\n\t\t\t\tmessages: session.messages,\n\t\t\t},\n\t\t};\n\t}\n\tconst preparationResult = prepareLegacyCompaction(\n\t\tentries,\n\t\tbody.settings ?? DEFAULT_COMPACTION_SETTINGS,\n\t\tbody.preparation,\n\t);\n\tif (!preparationResult.ok) {\n\t\treturn { status: 400, body: { error: preparationResult.error.message } };\n\t}\n\tif (!preparationResult.value) {\n\t\treturn { status: 400, body: { error: \"Nothing to compact\" } };\n\t}\n\n\tconst options = body.options ?? {};\n\tlet cacheContext: Context | undefined;\n\tlet cacheFallbackReason = body.cacheFallbackReason ?? \"cache_context_digest_missing\";\n\tif (body.cacheContextHash && body.cacheStaticContextHash) {\n\t\tif (options.sessionId !== session.sessionId) {\n\t\t\tcacheFallbackReason = \"session_id_mismatch\";\n\t\t} else if (options.cacheRetention === \"none\") {\n\t\t\tcacheFallbackReason = \"prompt_cache_disabled\";\n\t\t} else if (body.cacheStaticContextHash !== session.staticContextHash) {\n\t\t\tcacheFallbackReason = \"static_context_hash_mismatch\";\n\t\t} else {\n\t\t\tconst projectedMessages = convertToLlm(session.messages);\n\t\t\tconst priorAssistant = [...session.messages].reverse().find((message) => message.role === \"assistant\");\n\t\t\tif (hashPiServerProviderMessages(projectedMessages) !== body.cacheContextHash) {\n\t\t\t\tcacheFallbackReason = \"request_context_digest_mismatch\";\n\t\t\t} else if (\n\t\t\t\t!priorAssistant ||\n\t\t\t\tpriorAssistant.provider !== body.model.provider ||\n\t\t\t\tpriorAssistant.model !== body.model.id ||\n\t\t\t\tpriorAssistant.api !== body.model.api\n\t\t\t) {\n\t\t\t\tcacheFallbackReason = \"summary_model_mismatch\";\n\t\t\t} else {\n\t\t\t\tcacheContext = buildStreamContext(session, { contextOverlay: projectedMessages });\n\t\t\t\tcacheFallbackReason = \"exact_prefix_unavailable\";\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmodels: models ?? createRequestModels(body.model, options),\n\t\tsession,\n\t\tsessionId: session.sessionId,\n\t\trevision: session.revision,\n\t\ttreeHash: session.treeHash,\n\t\tleafId: session.leafId,\n\t\tentryCount: session.entries.length,\n\t\tpreparation: preparationResult.value,\n\t\toptions,\n\t\tcacheContext,\n\t\tcacheFallbackReason,\n\t};\n}\n\nfunction sessionCompactConflict(\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tcurrentSession: SessionState | undefined,\n): SessionCompactHttpResponse {\n\treturn {\n\t\tstatus: 409,\n\t\tbody: {\n\t\t\terror: \"Session changed while compaction was running\",\n\t\t\tcode: PiServerErrorCode.SESSION_STATE_CONFLICT,\n\t\t\tdetails: {\n\t\t\t\tsessionId: body.sessionId,\n\t\t\t\texpectedRevision: prepared.revision,\n\t\t\t\texpectedTreeHash: prepared.treeHash,\n\t\t\t\texpectedLeafId: prepared.leafId,\n\t\t\t\tactualRevision: currentSession?.revision ?? null,\n\t\t\t\tactualTreeHash: currentSession?.treeHash ?? null,\n\t\t\t\tactualLeafId: currentSession?.leafId ?? null,\n\t\t\t},\n\t\t},\n\t};\n}\n\nasync function completeSessionCompact(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\trun?: StreamRunRecord,\n): Promise<SessionCompactHttpResponse> {\n\tconst result = await compactLegacy(\n\t\tprepared.preparation,\n\t\tprepared.models,\n\t\tbody.model,\n\t\tbody.customInstructions,\n\t\trun?.controller.signal,\n\t\tprepared.options.reasoning,\n\t\tundefined,\n\t\tundefined,\n\t\tprepared.cacheContext,\n\t\tprepared.options as CompactionCacheRequestOptions,\n\t\tprepared.cacheFallbackReason,\n\t);\n\tif (!result.ok) {\n\t\treturn { status: 500, body: { error: result.error.message, code: PiServerErrorCode.INTERNAL_ERROR } };\n\t}\n\tif (run?.cancelRequested || run?.controller.signal.aborted) {\n\t\treturn { status: 409, body: { error: \"Compaction aborted\", code: PiServerErrorCode.INVALID_REQUEST } };\n\t}\n\n\tconst currentSession = getSession(prepared.sessionId);\n\tif (\n\t\t!currentSession ||\n\t\tcurrentSession !== prepared.session ||\n\t\tcurrentSession.revision !== prepared.revision ||\n\t\tcurrentSession.treeHash !== prepared.treeHash ||\n\t\tcurrentSession.leafId !== prepared.leafId\n\t) {\n\t\treturn sessionCompactConflict(body, prepared, currentSession);\n\t}\n\n\tconst baseTreeHash = prepared.treeHash;\n\tconst baseEntryCount = prepared.entryCount;\n\tconst compaction = result.value;\n\tconst { session: updatedSession, entry: compactionEntry } = appendCompactionEntry(body.sessionId, compaction);\n\tpersistSession(config, updatedSession);\n\tif (!body.fullResponse && body.baseTreeHash === baseTreeHash) {\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\tsuccess: true,\n\t\t\t\tcompaction: compaction satisfies LegacyCompactResult,\n\t\t\t\tcompactionEntry,\n\t\t\t\t...sessionResponseBody(updatedSession),\n\t\t\t\tstaticContext: updatedSession.staticContext,\n\t\t\t\ttreePatch: {\n\t\t\t\t\tbaseTreeHash,\n\t\t\t\t\tentriesFrom: baseEntryCount,\n\t\t\t\t\tentries: [compactionEntry],\n\t\t\t\t\tleafId: updatedSession.leafId,\n\t\t\t\t\trevision: updatedSession.revision,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}\n\treturn {\n\t\tstatus: 200,\n\t\tbody: {\n\t\t\tsuccess: true,\n\t\t\tcompaction: compaction satisfies LegacyCompactResult,\n\t\t\tcompactionEntry,\n\t\t\t...sessionResponseBody(updatedSession),\n\t\t\tstaticContext: updatedSession.staticContext,\n\t\t\tentries: updatedSession.entries,\n\t\t\tmessages: updatedSession.messages,\n\t\t},\n\t};\n}\n\nfunction writeServerSentEvent(res: ServerResponse, event: string, body: unknown): void {\n\tres.write(`event: ${event}\\n`);\n\tres.write(`data: ${JSON.stringify(body)}\\n\\n`);\n}\n\nasync function handleSessionCompactStream(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tres: ServerResponse,\n\trun?: StreamRunRecord,\n): Promise<void> {\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded) {\n\t\t\tres.write(STREAM_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\ttry {\n\t\tconst result = await completeSessionCompact(config, body, prepared, run);\n\t\tfinishCompactRun(run, result);\n\t\twriteServerSentEvent(res, result.status >= 400 ? \"error\" : \"result\", result.body);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (run?.status === \"running\") {\n\t\t\trun.status = run.cancelRequested ? \"aborted\" : \"failed\";\n\t\t\trun.errorMessage = message;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\twriteServerSentEvent(res, \"error\", { error: message });\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tres.end();\n\t}\n}\n\nasync function handleSessionCompactJsonStream(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tprepared: PreparedSessionCompact,\n\tres: ServerResponse,\n\trun?: StreamRunRecord,\n): Promise<void> {\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(JSON_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded) {\n\t\t\tres.write(JSON_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\ttry {\n\t\tconst result = await completeSessionCompact(config, body, prepared, run);\n\t\tfinishCompactRun(run, result);\n\t\tres.write(JSON.stringify(result.body));\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (run?.status === \"running\") {\n\t\t\trun.status = run.cancelRequested ? \"aborted\" : \"failed\";\n\t\t\trun.errorMessage = message;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\tres.write(JSON.stringify({ error: message }));\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tres.end();\n\t}\n}\n\nfunction finishCompactRun(run: StreamRunRecord | undefined, result: SessionCompactHttpResponse): void {\n\tif (!run) return;\n\tif (run.cancelRequested || run.controller.signal.aborted) {\n\t\trun.status = \"aborted\";\n\t\trun.errorMessage = \"Compaction aborted\";\n\t} else {\n\t\trun.status = result.status >= 400 ? \"failed\" : \"completed\";\n\t\tif (result.status >= 400 && \"error\" in result.body) {\n\t\t\trun.errorMessage = result.body.error;\n\t\t} else if (\"success\" in result.body) {\n\t\t\trun.compactResult = { ...result.body, entries: result.body.entries?.slice() };\n\t\t}\n\t}\n\trun.updatedAt = Date.now();\n}\n\nasync function handleSessionCompact(\n\tconfig: ServerConfig,\n\tbody: SessionCompactBody,\n\tres: ServerResponse,\n\tmodels?: Models,\n): Promise<void> {\n\tconst existingRun = body.runId ? getStreamRun(body.sessionId, body.runId) : undefined;\n\tif (existingRun?.status === \"aborted\") {\n\t\tsendJson(res, 409, { error: \"Compaction run was aborted\", code: PiServerErrorCode.INVALID_REQUEST });\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"completed\" && existingRun.compactResult) {\n\t\tsendJson(res, 200, existingRun.compactResult);\n\t\treturn;\n\t}\n\tconst prepared = prepareSessionCompact(body, models);\n\tif (\"status\" in prepared) {\n\t\tsendJson(res, prepared.status, prepared.body);\n\t\treturn;\n\t}\n\n\tlet run: StreamRunRecord | undefined;\n\tif (body.runId) {\n\t\tif (existingRun?.status === \"running\") {\n\t\t\tsendError(res, 409, \"A run with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\t\treturn;\n\t\t}\n\t\trun = startStreamRun(body.sessionId, body.runId, \"compact\");\n\t}\n\n\tif (body.streamResponse) {\n\t\tawait handleSessionCompactStream(config, body, prepared, res, run);\n\t\treturn;\n\t}\n\n\tawait handleSessionCompactJsonStream(config, body, prepared, res, run);\n}\n\nfunction handleSessionHistory(\n\tsessionId: string,\n\tfrom: number | undefined,\n\tentriesFrom: number | undefined,\n\trevision: number | undefined,\n\tbaseTreeHash: string | undefined,\n\tres: ServerResponse,\n): void {\n\tconst session = getSession(sessionId);\n\tif (!session) {\n\t\tsendError(res, 404, \"session not found\", PiServerErrorCode.SESSION_NOT_FOUND);\n\t\treturn;\n\t}\n\tconst baseMessageCount = from ?? 0;\n\tif (\n\t\tentriesFrom !== undefined &&\n\t\tentriesFrom <= session.entries.length &&\n\t\t(revision === undefined || revision <= session.revision) &&\n\t\t(baseTreeHash === undefined || baseTreeHash === session.prefixHashes[entriesFrom])\n\t) {\n\t\tsendJson(res, 200, sessionTreePatchResponseBody(session, baseMessageCount, entriesFrom, revision));\n\t\treturn;\n\t}\n\tsendJson(res, 200, sessionHistoryFullResponseBody(session, baseMessageCount));\n}\n\nfunction handleSessionRun(sessionId: string, runId: string, res: ServerResponse): void {\n\tconst run = getStreamRun(sessionId, runId);\n\tif (!run) {\n\t\tsendError(res, 404, \"run not found\", PiServerErrorCode.RUN_NOT_FOUND);\n\t\treturn;\n\t}\n\tsendJson(res, 200, streamRunResponseBody(run));\n}\n\nasync function handleSessionRunAbort(sessionId: string, runId: string, res: ServerResponse): Promise<void> {\n\tif (!sessionId || !runId) {\n\t\tsendError(res, 400, \"sessionId and runId are required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\n\tlet run = getStreamRun(sessionId, runId);\n\tif (!run) {\n\t\trun = createRunRecord(sessionId, runId, \"stream\");\n\t\trun.status = \"aborted\";\n\t\trun.cancelRequested = true;\n\t\trun.errorMessage = \"Stream run aborted before it started\";\n\t\trun.updatedAt = Date.now();\n\t\tsettleRun(run);\n\t\tstreamRuns.set(runKey(sessionId, runId), run);\n\t\tsendJson(res, 200, streamRunResponseBody(run));\n\t\treturn;\n\t}\n\n\tif (run.status !== \"running\") {\n\t\tawait run.settled;\n\t\tsendJson(res, 200, streamRunResponseBody(run));\n\t\treturn;\n\t}\n\n\trun.cancelRequested = true;\n\trun.updatedAt = Date.now();\n\trun.controller.abort();\n\trejectProviderCallbacks(run, new DOMException(\"Provider run aborted\", \"AbortError\"));\n\tawait run.settled;\n\tsendJson(res, 200, streamRunResponseBody(run));\n}\n\nexport function buildStreamContext(\n\tsession: SessionState,\n\tbody: Pick<StreamRequestBody, \"contextOverlay\" | \"ephemeralMessages\">,\n): Context {\n\tconst messages = body.contextOverlay ?? [...session.messages, ...(body.ephemeralMessages ?? [])];\n\treturn {\n\t\tsystemPrompt: session.staticContext?.systemPrompt,\n\t\tmessages,\n\t\ttools: session.staticContext?.tools,\n\t};\n}\n\nfunction handleStream(config: ServerConfig, body: StreamRequestBody, res: ServerResponse, models?: Models): void {\n\tif (!body.sessionId) {\n\t\tsendError(res, 400, \"sessionId is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif (!body.model) {\n\t\tsendError(res, 400, \"model is required\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\tif ((body.callbacks?.onPayload || body.callbacks?.onResponse) && !body.runId) {\n\t\tsendError(res, 400, \"runId is required for provider callbacks\", PiServerErrorCode.REQUIRED_FIELD_MISSING);\n\t\treturn;\n\t}\n\n\tcleanupExpiredStreamRuns(Date.now());\n\n\tconst session = getOrCreateSession(body.sessionId);\n\n\tif (body.staticContext) {\n\t\tsetStaticContext(body.sessionId, body.staticContext);\n\t\tpersistSession(config, session);\n\t}\n\n\tif (!session.staticContext && !body.staticContext) {\n\t\tsendError(\n\t\t\tres,\n\t\t\t400,\n\t\t\t\"Session has no static context. Initialize with /api/session/init first.\",\n\t\t\tPiServerErrorCode.SESSION_NO_STATIC_CONTEXT,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (body.ephemeralMessages !== undefined && !Array.isArray(body.ephemeralMessages)) {\n\t\tsendError(res, 400, \"ephemeralMessages must be an array\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (body.contextOverlay !== undefined && !Array.isArray(body.contextOverlay)) {\n\t\tsendError(res, 400, \"contextOverlay must be an array\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\n\tconst context = buildStreamContext(session, body);\n\tconst existingRun = body.runId ? getStreamRun(body.sessionId, body.runId) : undefined;\n\n\tconst resolvedModel = body.model;\n\n\tif (existingRun?.status === \"completed\") {\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t});\n\t\tres.flushHeaders();\n\t\tres.write(STREAM_HEARTBEAT);\n\t\tif (existingRun.cacheRetention !== undefined) {\n\t\t\twriteServerSentEvent(res, \"cache_policy\", { cacheRetention: existingRun.cacheRetention });\n\t\t}\n\t\tfor (const event of replayStreamRun(existingRun)) {\n\t\t\twriteStreamEvent(res, event);\n\t\t}\n\t\tendStreamResponse(res);\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"aborted\") {\n\t\tsendError(res, 409, \"The stream run was aborted\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (existingRun?.status === \"running\") {\n\t\tsendError(res, 409, \"A stream with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\treturn;\n\t}\n\n\tconst run = body.runId ? startStreamRun(body.sessionId, body.runId) : undefined;\n\tconst streamOptions: ModelsSimpleStreamOptions = {\n\t\t...(body.options ?? {}),\n\t\ttransformPreparedStreamOptions: (prepared) => {\n\t\t\t// Resolve after auth env merging, then pin the same policy for native dispatch.\n\t\t\tconst cacheRetention =\n\t\t\t\tprepared.cacheRetention ??\n\t\t\t\t(getProviderEnvValue(\"PI_CACHE_RETENTION\", prepared.env) === \"long\" ? \"long\" : \"short\");\n\t\t\tif (cacheRetention !== \"none\" && cacheRetention !== \"short\" && cacheRetention !== \"long\") {\n\t\t\t\tthrow new Error(\"Invalid cache retention policy\");\n\t\t\t}\n\t\t\tif (run) run.cacheRetention = cacheRetention;\n\t\t\twriteServerSentEvent(res, \"cache_policy\", { cacheRetention });\n\t\t\treturn { ...prepared, cacheRetention };\n\t\t},\n\t\t...(run ? { signal: run.controller.signal } : {}),\n\t\t...(run ? createProviderCallbacks<Model<string>>(run, res, body.callbacks) : {}),\n\t\t...(body.observeProviderStreamEvents\n\t\t\t? {\n\t\t\t\t\tonProviderStreamEvent: (data: unknown, model: Model<string>) => {\n\t\t\t\t\t\twriteStreamEvent(res, {\n\t\t\t\t\t\t\ttype: \"provider_stream_event\",\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tmodel: { ...model, headers: undefined },\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n\n\tres.writeHead(200, {\n\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\"Cache-Control\": \"no-cache\",\n\t\tConnection: \"keep-alive\",\n\t});\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.writableEnded && !res.destroyed) {\n\t\t\tres.write(STREAM_HEARTBEAT);\n\t\t}\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\n\tlet stream: AsyncIterable<AssistantMessageEvent>;\n\ttry {\n\t\tif (body.requestKind === \"deferred\") {\n\t\t\tif (!body.deferredHandle) throw new Error(\"deferredHandle is required for deferred fetch\");\n\t\t\tstream = (models ?? builtinModels()).streamDeferred(resolvedModel, body.deferredHandle, streamOptions);\n\t\t} else {\n\t\t\tconst requestModels = models ?? createRequestModels(resolvedModel, streamOptions);\n\t\t\tstream =\n\t\t\t\tbody.requestKind === \"api\"\n\t\t\t\t\t? requestModels.stream(resolvedModel, context, streamOptions)\n\t\t\t\t\t: requestModels.streamSimple(resolvedModel, context, streamOptions);\n\t\t}\n\t} catch (err) {\n\t\tclearInterval(heartbeat);\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tfailStreamRun(run, message);\n\t\tsettleRun(run);\n\t\twriteStreamError(res, message);\n\t\tendStreamResponse(res);\n\t\treturn;\n\t}\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tfor await (const event of stream) {\n\t\t\t\tconst proxyEvent = toProxyEvent(event);\n\t\t\t\tif (proxyEvent) {\n\t\t\t\t\ttouchStreamRun(run);\n\t\t\t\t\twriteStreamEvent(res, proxyEvent);\n\t\t\t\t}\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\tcompleteStreamRun(run, event.message);\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\tfailStreamRun(run, event.error.errorMessage ?? event.reason, event.error);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tfailStreamRun(run, message);\n\t\t\twriteStreamError(res, message);\n\t\t} finally {\n\t\t\tclearInterval(heartbeat);\n\t\t\tif (run?.status === \"running\") {\n\t\t\t\tfailStreamRun(run, run.cancelRequested ? \"Stream run aborted\" : \"Stream ended before a terminal event\");\n\t\t\t}\n\t\t\tsettleRun(run);\n\t\t\tendStreamResponse(res);\n\t\t}\n\t})();\n}\n\nasync function handlePostRequest(\n\tconfig: ServerConfig,\n\tpathname: string,\n\tbody: unknown,\n\tres: ServerResponse,\n\tmodels: Models,\n\tstreamModels?: Models,\n): Promise<boolean> {\n\tif (pathname === \"/api/provider-callback\") {\n\t\thandleProviderCallbackReply(body, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/generate-images\") {\n\t\tawait handleModelOperation(models, { ...(body as ImageOperationBody), kind: \"image\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/classify\") {\n\t\tawait handleModelOperation(models, { ...(body as ClassifierOperationBody), kind: \"classifier\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/cancel-deferred\") {\n\t\tawait handleModelOperation(models, { ...(body as DeferredCancelBody), kind: \"deferred-cancel\" }, res);\n\t\treturn true;\n\t}\n\tif (pathname === \"/api/receive\") {\n\t\ttry {\n\t\t\tsendJson(res, 200, receiveUpload(config.uploadDir, body));\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof ReceiveUploadError)) throw error;\n\t\t\tsendJson(res, error.status, { error: error.message });\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/init\") {\n\t\thandleSessionInit(config, body as SessionInitBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/update\") {\n\t\thandleSessionUpdate(config, body as SessionInitBody & { staticContext: SessionStaticContext }, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/sync\") {\n\t\thandleSessionSync(config, body as SessionSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/append\") {\n\t\thandleSessionAppend(config, body as SessionAppendBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/sync\") {\n\t\thandleSessionTreeSync(config, body as SessionTreeSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/append\") {\n\t\thandleSessionTreeAppend(config, body as SessionTreeSyncBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/tree/switch\") {\n\t\thandleSessionTreeSwitch(config, body as SessionTreeSwitchBody, res);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/session/compact\") {\n\t\tawait handleSessionCompact(config, body as SessionCompactBody, res, streamModels);\n\t\treturn true;\n\t}\n\n\tif (pathname === \"/api/stream\") {\n\t\thandleStream(config, body as StreamRequestBody, res, streamModels);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nconst CLASSIFIER_APIS: Record<string, ProviderClassifier> = {\n\t\"typesafe-system-one\": typesafeSystemOneApi(),\n\t\"cloudflare-workers-ai-system-one\": cloudflareWorkersAISystemOneApi(),\n\t\"llama-cpp-classify\": llamaCppClassifyApi(),\n\t\"openai-decisions\": openAIDecisionsApi(),\n};\n\ninterface ImageOperationBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: ImageModel<ImageApi>;\n\tcontext: ImagesContext;\n\toptions?: ImagesOptions;\n}\n\ninterface ClassifierOperationBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: ClassifierModel<ClassifierApi>;\n\tcontext: ClassifierContext;\n\toptions?: ClassifierOptions;\n}\n\ninterface DeferredCancelBody {\n\tcallbacks?: { onPayload?: boolean; onResponse?: boolean };\n\tsessionId: string;\n\trunId: string;\n\tmodel: Model<string>;\n\thandle: DeferredHandle;\n\toptions?: DeferredCancelOptions;\n}\n\nasync function handleModelOperation(\n\tmodels: Models,\n\tbody:\n\t\t| (ImageOperationBody & { kind: \"image\" })\n\t\t| (ClassifierOperationBody & { kind: \"classifier\" })\n\t\t| (DeferredCancelBody & { kind: \"deferred-cancel\" }),\n\tres: ServerResponse,\n): Promise<void> {\n\tif (\n\t\t!body.sessionId ||\n\t\t!body.runId ||\n\t\t!body.model ||\n\t\t(body.kind === \"deferred-cancel\" ? !body.handle : !body.context)\n\t) {\n\t\tsendError(\n\t\t\tres,\n\t\t\t400,\n\t\t\t\"sessionId, runId, model and operation input are required\",\n\t\t\tPiServerErrorCode.REQUIRED_FIELD_MISSING,\n\t\t);\n\t\treturn;\n\t}\n\tconst existing = getStreamRun(body.sessionId, body.runId);\n\tif (existing && existing.kind !== body.kind) {\n\t\tsendError(res, 409, \"runId belongs to a different operation\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tif (existing?.status === \"running\") {\n\t\tsendError(res, 409, \"A run with this runId is already in progress\", PiServerErrorCode.RUN_IN_PROGRESS);\n\t\treturn;\n\t}\n\tif (existing?.status === \"aborted\") {\n\t\tsendError(res, 409, \"Model operation was aborted\", PiServerErrorCode.INVALID_REQUEST);\n\t\treturn;\n\t}\n\tconst run = existing?.operationResult ? existing : startStreamRun(body.sessionId, body.runId, body.kind);\n\tres.writeHead(200, { \"Content-Type\": \"text/event-stream\", \"Cache-Control\": \"no-cache\", Connection: \"keep-alive\" });\n\tres.flushHeaders();\n\tres.write(STREAM_HEARTBEAT);\n\tconst heartbeat = setInterval(() => {\n\t\ttouchStreamRun(run);\n\t\tif (!res.destroyed && !res.writableEnded) res.write(STREAM_HEARTBEAT);\n\t}, STREAM_HEARTBEAT_INTERVAL_MS);\n\theartbeat.unref();\n\ttry {\n\t\tif (!run.operationResult) {\n\t\t\tconst requestModels =\n\t\t\t\tbody.kind === \"deferred-cancel\" ? models : resolveOperationModels(models, body.model, body.options);\n\t\t\tconst result =\n\t\t\t\tbody.kind === \"deferred-cancel\"\n\t\t\t\t\t? await requestModels\n\t\t\t\t\t\t\t.cancelDeferred(body.model, body.handle, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<Model<string>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.then(() => ({ cancelled: true as const, stopReason: \"stop\" as const }))\n\t\t\t\t\t: body.kind === \"image\"\n\t\t\t\t\t\t? await requestModels.generateImages(body.model, body.context, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<ImageModel<ImageApi>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: await requestModels.classify(body.model, body.context, {\n\t\t\t\t\t\t\t\t...body.options,\n\t\t\t\t\t\t\t\t...createProviderCallbacks<ClassifierModel<ClassifierApi>>(run, res, body.callbacks),\n\t\t\t\t\t\t\t\tsignal: run.controller.signal,\n\t\t\t\t\t\t\t});\n\t\t\trun.operationResult = run.cancelRequested\n\t\t\t\t? { ...result, stopReason: \"aborted\", errorMessage: \"Model operation aborted\" }\n\t\t\t\t: result;\n\t\t\trun.status =\n\t\t\t\trun.cancelRequested || result.stopReason === \"aborted\"\n\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t: result.stopReason === \"error\"\n\t\t\t\t\t\t? \"failed\"\n\t\t\t\t\t\t: \"completed\";\n\t\t\trun.errorMessage = \"errorMessage\" in result ? result.errorMessage : undefined;\n\t\t\trun.updatedAt = Date.now();\n\t\t}\n\t\tif (!res.destroyed && !res.writableEnded) writeServerSentEvent(res, \"result\", run.operationResult);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tfailStreamRun(run, message);\n\t\tif (!res.destroyed && !res.writableEnded) writeServerSentEvent(res, \"error\", { error: message });\n\t} finally {\n\t\tclearInterval(heartbeat);\n\t\tsettleRun(run);\n\t\tendStreamResponse(res);\n\t}\n}\n\nfunction resolveOperationModels(models: Models, model: AnyModel, options?: ImagesOptions | ClassifierOptions): Models {\n\tconst provider = models.getProvider(model.provider);\n\tconst hasDeclaredApi = provider\n\t\t?.getAllModels?.()\n\t\t.some((candidate) => candidate.type === model.type && candidate.api === model.api);\n\tif (\n\t\thasDeclaredApi &&\n\t\t((model.type === \"image\" && provider?.generateImages) || (model.type === \"classifier\" && provider?.classify))\n\t)\n\t\treturn models;\n\tconst requestModels = createModels();\n\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider, options?.env);\n\tconst auth = provider?.auth ?? {\n\t\tapiKey: {\n\t\t\tname: \"pi-server request auth\",\n\t\t\tresolve: async () => ({ auth: { apiKey, headers: options?.headers } }),\n\t\t},\n\t};\n\tif (model.type === \"image\") {\n\t\tconst api = getImagesApiProvider(model.api);\n\t\tif (!api) throw new Error(`No image API registered on pi-server: ${model.api}`);\n\t\trequestModels.setProvider(\n\t\t\tcreateProvider({ id: model.provider, models: [model], auth, images: { [model.api]: api } }),\n\t\t);\n\t} else if (model.type === \"classifier\") {\n\t\tconst api = CLASSIFIER_APIS[model.api];\n\t\tif (!api) throw new Error(`No classifier API registered on pi-server: ${model.api}`);\n\t\trequestModels.setProvider(\n\t\t\tcreateProvider({ id: model.provider, models: [model], auth, classifiers: { [model.api]: api } }),\n\t\t);\n\t} else {\n\t\tthrow new Error(\"Image generation and classification require an operation-specific model type\");\n\t}\n\treturn requestModels;\n}\n\nexport function createPiServer(configOverride?: Partial<ServerConfig>, streamModels?: Models): HttpServer {\n\tconst config = loadConfig(configOverride);\n\tconst models = streamModels ?? builtinModels();\n\tloadPersistedSessions(config.sessionStoreDir);\n\n\tconst server = createServer(async (req, res) => {\n\t\tconst url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/health\") {\n\t\t\tsendJson(res, 200, { status: \"ok\" });\n\t\t\treturn;\n\t\t}\n\n\t\tif (!authenticate(config, req)) {\n\t\t\tconst body =\n\t\t\t\treq.method === \"GET\" && url.pathname === \"/\"\n\t\t\t\t\t? { error: \"Unauthorized\", version: PI_SERVER_VERSION }\n\t\t\t\t\t: { error: \"Unauthorized\" };\n\t\t\tsendJson(res, 401, body);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname === \"/api/sessions\") {\n\t\t\tsendJson(res, 200, { sessions: listSessions() });\n\t\t\treturn;\n\t\t}\n\t\tif (req.method === \"GET\" && url.pathname === \"/api/models\") {\n\t\t\ttry {\n\t\t\t\tconst stripHeaders = <T extends { headers?: unknown }>(model: T): T => ({ ...model, headers: undefined });\n\t\t\t\tsendJson(res, 200, {\n\t\t\t\t\tmodels: models.getAllModels().map(stripHeaders),\n\t\t\t\t\tavailable: (await models.getAllAvailable()).map(stripHeaders),\n\t\t\t\t\tproviders: models.getProviders().map((provider) => ({\n\t\t\t\t\t\tid: provider.id,\n\t\t\t\t\t\tfetchDeferred: provider.fetchDeferred !== undefined,\n\t\t\t\t\t\tcancelDeferred: provider.cancelDeferred !== undefined,\n\t\t\t\t\t})),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tsendError(\n\t\t\t\t\tres,\n\t\t\t\t\t500,\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\tPiServerErrorCode.INTERNAL_ERROR,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst runMatch = /^\\/api\\/session\\/([^/]+)\\/runs\\/([^/]+)$/.exec(url.pathname);\n\t\tif (req.method === \"GET\" && runMatch) {\n\t\t\thandleSessionRun(decodeURIComponent(runMatch[1]), decodeURIComponent(runMatch[2]), res);\n\t\t\treturn;\n\t\t}\n\n\t\tconst runAbortMatch = /^\\/api\\/session\\/([^/]+)\\/runs\\/([^/]+)\\/abort$/.exec(url.pathname);\n\t\tif (req.method === \"POST\" && runAbortMatch) {\n\t\t\tawait readBody(req);\n\t\t\tawait handleSessionRunAbort(decodeURIComponent(runAbortMatch[1]), decodeURIComponent(runAbortMatch[2]), res);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"GET\" && url.pathname.startsWith(\"/api/session/\") && url.pathname.endsWith(\"/history\")) {\n\t\t\tconst encodedSessionId = url.pathname.slice(\"/api/session/\".length, -\"/history\".length);\n\t\t\tconst fromParam = url.searchParams.get(\"from\");\n\t\t\tconst from = fromParam === null ? undefined : Number(fromParam);\n\t\t\tif (from !== undefined && (!Number.isInteger(from) || from < 0)) {\n\t\t\t\tsendError(res, 400, \"from must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst entriesFromParam = url.searchParams.get(\"entriesFrom\");\n\t\t\tconst entriesFrom = entriesFromParam === null ? undefined : Number(entriesFromParam);\n\t\t\tif (entriesFrom !== undefined && (!Number.isInteger(entriesFrom) || entriesFrom < 0)) {\n\t\t\t\tsendError(res, 400, \"entriesFrom must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst revisionParam = url.searchParams.get(\"revision\");\n\t\t\tconst revision = revisionParam === null ? undefined : Number(revisionParam);\n\t\t\tif (revision !== undefined && (!Number.isInteger(revision) || revision < 0)) {\n\t\t\t\tsendError(res, 400, \"revision must be a non-negative integer\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandleSessionHistory(\n\t\t\t\tdecodeURIComponent(encodedSessionId),\n\t\t\t\tfrom,\n\t\t\t\tentriesFrom,\n\t\t\t\trevision,\n\t\t\t\turl.searchParams.get(\"baseTreeHash\") ?? undefined,\n\t\t\t\tres,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\" && url.pathname === CHUNK_ENDPOINT) {\n\t\t\ttry {\n\t\t\t\tconst body = JSON.parse(await readBody(req)) as RequestChunkBody;\n\t\t\t\tconst chunkResult = receiveRequestChunk(body);\n\t\t\t\tif (!chunkResult.complete) {\n\t\t\t\t\tsendJson(res, 200, chunkResult.ack);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst handled = await handlePostRequest(\n\t\t\t\t\tconfig,\n\t\t\t\t\tchunkResult.target,\n\t\t\t\t\tJSON.parse(chunkResult.bodyJson) as unknown,\n\t\t\t\t\tres,\n\t\t\t\t\tmodels,\n\t\t\t\t\tstreamModels,\n\t\t\t\t);\n\t\t\t\tif (!handled && !res.headersSent) {\n\t\t\t\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogRequestError(req, err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 400, err instanceof Error ? err.message : String(err), PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t} else {\n\t\t\t\t\tres.write(encodeErrorEvent(err instanceof Error ? err.message : String(err)));\n\t\t\t\t\tres.end();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (req.method === \"POST\") {\n\t\t\ttry {\n\t\t\t\tconst body = JSON.parse(await readBody(req)) as unknown;\n\t\t\t\tif (await handlePostRequest(config, url.pathname, body, res, models, streamModels)) return;\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tlogRequestError(req, err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tsendError(res, 500, err instanceof Error ? err.message : String(err), PiServerErrorCode.INTERNAL_ERROR);\n\t\t\t\t} else {\n\t\t\t\t\tres.write(encodeErrorEvent(err instanceof Error ? err.message : String(err)));\n\t\t\t\t\tres.end();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (req.method === \"DELETE\" && url.pathname.startsWith(\"/api/session/\")) {\n\t\t\tconst sessionId = decodeURIComponent(url.pathname.slice(\"/api/session/\".length));\n\t\t\tdeleteSessionFromStore(sessionId);\n\t\t\tdeletePersistedSession(config.sessionStoreDir, sessionId);\n\t\t\tawait deleteStreamRunsForSession(sessionId);\n\t\t\tsendJson(res, 200, { deleted: sessionId });\n\t\t\treturn;\n\t\t}\n\n\t\tsendError(res, 404, \"Not found\", PiServerErrorCode.INVALID_REQUEST);\n\t});\n\n\treturn server;\n}\n\nfunction toProxyEvent(event: AssistantMessageEvent): ProxyAssistantMessageEvent | undefined {\n\tswitch (event.type) {\n\t\tcase \"start\":\n\t\t\treturn { type: \"start\" };\n\t\tcase \"text_start\":\n\t\t\treturn { type: \"text_start\", contentIndex: event.contentIndex };\n\t\tcase \"text_delta\":\n\t\t\treturn { type: \"text_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"text_end\":\n\t\t\treturn {\n\t\t\t\ttype: \"text_end\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tcontentSignature:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"text\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { textSignature?: string }).textSignature\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\tcase \"thinking_start\":\n\t\t\treturn { type: \"thinking_start\", contentIndex: event.contentIndex };\n\t\tcase \"thinking_delta\":\n\t\t\treturn { type: \"thinking_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"thinking_end\":\n\t\t\treturn {\n\t\t\t\ttype: \"thinking_end\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tcontentSignature:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"thinking\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { thinkingSignature?: string }).thinkingSignature\n\t\t\t\t\t\t: undefined,\n\t\t\t};\n\t\tcase \"toolcall_start\":\n\t\t\treturn {\n\t\t\t\ttype: \"toolcall_start\",\n\t\t\t\tcontentIndex: event.contentIndex,\n\t\t\t\tid:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"toolCall\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { id: string }).id\n\t\t\t\t\t\t: \"\",\n\t\t\t\ttoolName:\n\t\t\t\t\tevent.partial.content[event.contentIndex]?.type === \"toolCall\"\n\t\t\t\t\t\t? (event.partial.content[event.contentIndex] as { name: string }).name\n\t\t\t\t\t\t: \"\",\n\t\t\t};\n\t\tcase \"toolcall_delta\":\n\t\t\treturn { type: \"toolcall_delta\", contentIndex: event.contentIndex, delta: event.delta };\n\t\tcase \"toolcall_end\":\n\t\t\treturn { type: \"toolcall_end\", contentIndex: event.contentIndex, toolCall: event.toolCall };\n\t\tcase \"done\":\n\t\t\treturn {\n\t\t\t\ttype: \"done\",\n\t\t\t\treason: event.reason,\n\t\t\t\tusage: event.message.usage,\n\t\t\t\tdeferred: event.message.deferred,\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\tcase \"error\":\n\t\t\treturn {\n\t\t\t\ttype: \"error\",\n\t\t\t\treason: event.reason,\n\t\t\t\terrorMessage: event.error.errorMessage,\n\t\t\t\tmessage: event.error,\n\t\t\t\tusage: event.error.usage,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nexport function startServer(configOverride?: Partial<ServerConfig>): HttpServer {\n\tconst config = loadConfig(configOverride);\n\tconst server = createPiServer(configOverride);\n\tserver.listen(config.port, config.host, () => {\n\t\tconst address = server.address();\n\t\tconst port = typeof address === \"object\" && address !== null ? address.port : config.port;\n\t\tconst host = config.host.includes(\":\") && !config.host.startsWith(\"[\") ? `[${config.host}]` : config.host;\n\t\tconsole.log(`pi-server listening on ${host}:${port}`);\n\t});\n\treturn server;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-persistence.d.ts","sourceRoot":"","sources":["../src/session-persistence.ts"],"names":[],"mappings":"AAeA,OAAO,EAKN,KAAK,YAAY,EAEjB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-persistence.d.ts","sourceRoot":"","sources":["../src/session-persistence.ts"],"names":[],"mappings":"AAeA,OAAO,EAKN,KAAK,YAAY,EAEjB,MAAM,oBAAoB,CAAC;AAiP5B,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAsBnE;AAkCD,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAazF;AAED,wBAAgB,sBAAsB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIvF"}
|
|
@@ -166,8 +166,6 @@ function applyWalRecord(session, record) {
|
|
|
166
166
|
if (record.revision <= session.revision)
|
|
167
167
|
return;
|
|
168
168
|
if (record.baseEntryCount < session.entries.length) {
|
|
169
|
-
if (record.baseEntryCount + record.entries.length <= session.entries.length)
|
|
170
|
-
return;
|
|
171
169
|
throw new Error(`Persisted session WAL overlaps snapshot for ${record.sessionId}`);
|
|
172
170
|
}
|
|
173
171
|
if (record.baseEntryCount !== session.entries.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../src/session-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\ttruncateSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SessionTreeEntry } from \"@earendil-works/pi-agent-core\";\nimport {\n\texportSessionState,\n\tmarkSessionPersisted,\n\ttype PersistedSessionState,\n\trestoreSessionState,\n\ttype SessionState,\n\ttype SessionStaticContext,\n} from \"./session-store.ts\";\n\nconst PERSISTED_SESSION_VERSION = 1;\nconst WAL_SNAPSHOT_INTERVAL = 32;\nconst REPLACE_RETRY_DELAYS_MS = [25, 50, 100, 200, 400];\n\ninterface PersistedSessionFile {\n\tversion: 1;\n\tsession: PersistedSessionState;\n}\n\ninterface PersistedSessionWalRecord {\n\tversion: 1;\n\tsessionId: string;\n\tbaseEntryCount: number;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\trevision: number;\n\tupdatedAt: number;\n\tstaticContext: SessionStaticContext | undefined;\n}\n\ninterface PersistedSessionMeta {\n\tentryCount: number;\n\twalRecords: number;\n}\n\nconst persistedSessions = new Map<string, PersistedSessionMeta>();\n\nfunction sessionFileName(sessionId: string): string {\n\treturn `${createHash(\"sha256\").update(sessionId).digest(\"hex\")}.json`;\n}\n\nfunction sessionPath(sessionStoreDir: string, sessionId: string): string {\n\treturn join(sessionStoreDir, sessionFileName(sessionId));\n}\n\nfunction walPath(sessionStoreDir: string, sessionId: string): string {\n\treturn `${sessionPath(sessionStoreDir, sessionId)}.wal`;\n}\n\nfunction persistedSessionKey(sessionStoreDir: string, sessionId: string): string {\n\treturn `${sessionStoreDir}\\0${sessionId}`;\n}\n\nfunction isRetryableRenameError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn process.platform === \"win32\" && code === \"EPERM\";\n}\n\nfunction sleepSync(ms: number): void {\n\tAtomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\n}\n\nfunction replaceFileSync(sourcePath: string, targetPath: string): void {\n\tfor (let attempt = 0; attempt <= REPLACE_RETRY_DELAYS_MS.length; attempt++) {\n\t\ttry {\n\t\t\trenameSync(sourcePath, targetPath);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (!isRetryableRenameError(error) || attempt === REPLACE_RETRY_DELAYS_MS.length) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tsleepSync(REPLACE_RETRY_DELAYS_MS[attempt]);\n\t\t}\n\t}\n}\n\nfunction assertRecord(value: unknown, path: string): asserts value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${path} must be an object`);\n\t}\n}\n\nfunction assertString(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(`${path} must be a string`);\n\t}\n}\n\nfunction assertNumber(value: unknown, path: string): asserts value is number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new Error(`${path} must be a finite number`);\n\t}\n}\n\nfunction assertNullableString(value: unknown, path: string): asserts value is string | null {\n\tif (value !== null && typeof value !== \"string\") {\n\t\tthrow new Error(`${path} must be a string or null`);\n\t}\n}\n\nfunction assertStaticContext(value: unknown): asserts value is SessionStaticContext | undefined {\n\tif (value === undefined) return;\n\tassertRecord(value, \"session.staticContext\");\n\tconst systemPrompt = value.systemPrompt;\n\tif (systemPrompt !== undefined && typeof systemPrompt !== \"string\") {\n\t\tthrow new Error(\"session.staticContext.systemPrompt must be a string\");\n\t}\n\tconst tools = value.tools;\n\tif (tools !== undefined) {\n\t\tif (!Array.isArray(tools)) {\n\t\t\tthrow new Error(\"session.staticContext.tools must be an array\");\n\t\t}\n\t\tfor (const [index, tool] of tools.entries()) {\n\t\t\tassertRecord(tool, `session.staticContext.tools[${index}]`);\n\t\t\tassertString(tool.name, `session.staticContext.tools[${index}].name`);\n\t\t\tassertString(tool.description, `session.staticContext.tools[${index}].description`);\n\t\t\tif (tool.parameters === undefined) {\n\t\t\t\tthrow new Error(`session.staticContext.tools[${index}].parameters is required`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertSessionTreeEntries(value: unknown): asserts value is SessionTreeEntry[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error(\"session.entries must be an array\");\n\t}\n\tfor (const [index, entry] of value.entries()) {\n\t\tassertRecord(entry, `session.entries[${index}]`);\n\t\tassertString(entry.type, `session.entries[${index}].type`);\n\t\tassertString(entry.id, `session.entries[${index}].id`);\n\t\tassertNullableString(entry.parentId, `session.entries[${index}].parentId`);\n\t\tassertString(entry.timestamp, `session.entries[${index}].timestamp`);\n\t\tif (entry.type === \"message\") {\n\t\t\tassertRecord(entry.message, `session.entries[${index}].message`);\n\t\t}\n\t}\n}\n\nfunction assertPersistedSessionState(value: unknown): asserts value is PersistedSessionState {\n\tassertRecord(value, \"session\");\n\tassertString(value.sessionId, \"session.sessionId\");\n\tassertStaticContext(value.staticContext);\n\tassertSessionTreeEntries(value.entries);\n\tassertNullableString(value.leafId, \"session.leafId\");\n\tassertNumber(value.revision, \"session.revision\");\n\tassertNumber(value.createdAt, \"session.createdAt\");\n\tassertNumber(value.updatedAt, \"session.updatedAt\");\n}\n\nfunction assertPersistedWalRecord(\n\tvalue: unknown,\n\tsourcePath: string,\n\tlineNumber: number,\n): asserts value is PersistedSessionWalRecord {\n\tconst path = `${sourcePath}:${lineNumber}`;\n\tassertRecord(value, path);\n\tif (value.version !== PERSISTED_SESSION_VERSION) {\n\t\tthrow new Error(`Unsupported persisted session WAL version in ${path}`);\n\t}\n\tassertString(value.sessionId, `${path}.sessionId`);\n\tassertNumber(value.baseEntryCount, `${path}.baseEntryCount`);\n\tassertSessionTreeEntries(value.entries);\n\tassertNullableString(value.leafId, `${path}.leafId`);\n\tassertNumber(value.revision, `${path}.revision`);\n\tassertNumber(value.updatedAt, `${path}.updatedAt`);\n\tassertStaticContext(value.staticContext);\n}\n\nfunction parsePersistedSessionFile(raw: string, sourcePath: string): PersistedSessionFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tthrow new Error(`Persisted session file contains invalid JSON: ${sourcePath}`, { cause: error });\n\t}\n\tassertRecord(parsed, \"persisted session file\");\n\tif (parsed.version !== PERSISTED_SESSION_VERSION) {\n\t\tthrow new Error(`Unsupported persisted session version in ${sourcePath}`);\n\t}\n\tassertPersistedSessionState(parsed.session);\n\treturn {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsession: parsed.session,\n\t};\n}\n\nclass PersistedSessionWalSyntaxError extends Error {\n\tconstructor(sourcePath: string, lineNumber: number, cause: unknown) {\n\t\tsuper(`Persisted session WAL contains invalid JSON: ${sourcePath}:${lineNumber}`, { cause });\n\t\tthis.name = \"PersistedSessionWalSyntaxError\";\n\t}\n}\n\nfunction parseWalLine(raw: string, sourcePath: string, lineNumber: number): PersistedSessionWalRecord {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tthrow new PersistedSessionWalSyntaxError(sourcePath, lineNumber, error);\n\t}\n\tassertPersistedWalRecord(parsed, sourcePath, lineNumber);\n\treturn parsed;\n}\n\nfunction applyWalRecord(session: PersistedSessionState, record: PersistedSessionWalRecord): void {\n\tif (record.sessionId !== session.sessionId) {\n\t\tthrow new Error(`Persisted session WAL sessionId does not match snapshot: ${record.sessionId}`);\n\t}\n\tif (record.revision <= session.revision) return;\n\tif (record.baseEntryCount < session.entries.length) {\n\t\tif (record.baseEntryCount + record.entries.length <= session.entries.length) return;\n\t\tthrow new Error(`Persisted session WAL overlaps snapshot for ${record.sessionId}`);\n\t}\n\tif (record.baseEntryCount !== session.entries.length) {\n\t\tthrow new Error(`Persisted session WAL has a gap for ${record.sessionId}`);\n\t}\n\tsession.entries.push(...record.entries.map((entry) => ({ ...entry })));\n\tsession.leafId = record.leafId;\n\tsession.revision = record.revision;\n\tsession.updatedAt = record.updatedAt;\n\tsession.staticContext = record.staticContext;\n}\n\nfunction applyPersistedWal(sessionStoreDir: string, session: PersistedSessionState): number {\n\tconst filePath = walPath(sessionStoreDir, session.sessionId);\n\tif (!existsSync(filePath)) return 0;\n\tconst lines = readFileSync(filePath, \"utf-8\").split(\"\\n\");\n\tlet applied = 0;\n\tfor (const [index, line] of lines.entries()) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tapplyWalRecord(session, parseWalLine(line, filePath, index + 1));\n\t\t\tapplied++;\n\t\t} catch (error) {\n\t\t\tconst isPhysicalTail = lines.slice(index + 1).every((remainingLine) => !remainingLine.trim());\n\t\t\tif (isPhysicalTail && error instanceof PersistedSessionWalSyntaxError) {\n\t\t\t\tconst prefix = lines.slice(0, index).join(\"\\n\");\n\t\t\t\tconst truncateAt = Buffer.byteLength(prefix, \"utf8\") + (index > 0 ? 1 : 0);\n\t\t\t\ttruncateSync(filePath, truncateAt);\n\t\t\t\tconsole.warn(`Discarding torn WAL tail line at ${filePath}:${index + 1}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\treturn applied;\n}\n\nexport function loadPersistedSessions(sessionStoreDir: string): void {\n\tif (!existsSync(sessionStoreDir)) return;\n\tconst entries = readdirSync(sessionStoreDir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n\t\tconst filePath = join(sessionStoreDir, entry.name);\n\t\ttry {\n\t\t\tconst persisted = parsePersistedSessionFile(readFileSync(filePath, \"utf-8\"), filePath);\n\t\t\tconst expectedFileName = sessionFileName(persisted.session.sessionId);\n\t\t\tif (entry.name !== expectedFileName) {\n\t\t\t\tthrow new Error(`Persisted session file name does not match sessionId: ${filePath}`);\n\t\t\t}\n\t\t\tconst walRecords = applyPersistedWal(sessionStoreDir, persisted.session);\n\t\t\trestoreSessionState(persisted.session);\n\t\t\tpersistedSessions.set(persistedSessionKey(sessionStoreDir, persisted.session.sessionId), {\n\t\t\t\tentryCount: persisted.session.entries.length,\n\t\t\t\twalRecords,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to load session from ${filePath}, skipping:`, error);\n\t\t}\n\t}\n}\n\nfunction writeSnapshot(sessionStoreDir: string, session: SessionState): void {\n\tmkdirSync(sessionStoreDir, { recursive: true });\n\tconst filePath = sessionPath(sessionStoreDir, session.sessionId);\n\tconst tempPath = `${filePath}.${randomUUID()}.tmp`;\n\tconst body: PersistedSessionFile = {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsession: exportSessionState(session),\n\t};\n\ttry {\n\t\twriteFileSync(tempPath, JSON.stringify(body), \"utf-8\");\n\t\treplaceFileSync(tempPath, filePath);\n\t\trmSync(walPath(sessionStoreDir, session.sessionId), { force: true });\n\t} catch (error) {\n\t\trmSync(tempPath, { force: true });\n\t\tthrow error;\n\t}\n}\n\nfunction appendWalRecord(sessionStoreDir: string, session: SessionState, baseEntryCount: number): void {\n\tconst record: PersistedSessionWalRecord = {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsessionId: session.sessionId,\n\t\tbaseEntryCount,\n\t\tentries: session.persistenceChange?.kind === \"wal\" ? session.persistenceChange.entries : [],\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tupdatedAt: session.updatedAt,\n\t\tstaticContext: session.staticContext,\n\t};\n\tappendFileSync(walPath(sessionStoreDir, session.sessionId), `${JSON.stringify(record)}\\n`, \"utf-8\");\n}\n\nexport function savePersistedSession(sessionStoreDir: string, session: SessionState): void {\n\tconst key = persistedSessionKey(sessionStoreDir, session.sessionId);\n\tconst meta = persistedSessions.get(key);\n\tif (meta && !session.persistenceChange) return;\n\tif (!meta || session.persistenceChange?.kind === \"snapshot\" || meta.walRecords >= WAL_SNAPSHOT_INTERVAL) {\n\t\twriteSnapshot(sessionStoreDir, session);\n\t\tpersistedSessions.set(key, { entryCount: session.entries.length, walRecords: 0 });\n\t\tmarkSessionPersisted(session);\n\t\treturn;\n\t}\n\tappendWalRecord(sessionStoreDir, session, meta.entryCount);\n\tpersistedSessions.set(key, { entryCount: session.entries.length, walRecords: meta.walRecords + 1 });\n\tmarkSessionPersisted(session);\n}\n\nexport function deletePersistedSession(sessionStoreDir: string, sessionId: string): void {\n\trmSync(sessionPath(sessionStoreDir, sessionId), { force: true });\n\trmSync(walPath(sessionStoreDir, sessionId), { force: true });\n\tpersistedSessions.delete(persistedSessionKey(sessionStoreDir, sessionId));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../src/session-persistence.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n\tappendFileSync,\n\texistsSync,\n\tmkdirSync,\n\treaddirSync,\n\treadFileSync,\n\trenameSync,\n\trmSync,\n\ttruncateSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SessionTreeEntry } from \"@earendil-works/pi-agent-core\";\nimport {\n\texportSessionState,\n\tmarkSessionPersisted,\n\ttype PersistedSessionState,\n\trestoreSessionState,\n\ttype SessionState,\n\ttype SessionStaticContext,\n} from \"./session-store.ts\";\n\nconst PERSISTED_SESSION_VERSION = 1;\nconst WAL_SNAPSHOT_INTERVAL = 32;\nconst REPLACE_RETRY_DELAYS_MS = [25, 50, 100, 200, 400];\n\ninterface PersistedSessionFile {\n\tversion: 1;\n\tsession: PersistedSessionState;\n}\n\ninterface PersistedSessionWalRecord {\n\tversion: 1;\n\tsessionId: string;\n\tbaseEntryCount: number;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\trevision: number;\n\tupdatedAt: number;\n\tstaticContext: SessionStaticContext | undefined;\n}\n\ninterface PersistedSessionMeta {\n\tentryCount: number;\n\twalRecords: number;\n}\n\nconst persistedSessions = new Map<string, PersistedSessionMeta>();\n\nfunction sessionFileName(sessionId: string): string {\n\treturn `${createHash(\"sha256\").update(sessionId).digest(\"hex\")}.json`;\n}\n\nfunction sessionPath(sessionStoreDir: string, sessionId: string): string {\n\treturn join(sessionStoreDir, sessionFileName(sessionId));\n}\n\nfunction walPath(sessionStoreDir: string, sessionId: string): string {\n\treturn `${sessionPath(sessionStoreDir, sessionId)}.wal`;\n}\n\nfunction persistedSessionKey(sessionStoreDir: string, sessionId: string): string {\n\treturn `${sessionStoreDir}\\0${sessionId}`;\n}\n\nfunction isRetryableRenameError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn process.platform === \"win32\" && code === \"EPERM\";\n}\n\nfunction sleepSync(ms: number): void {\n\tAtomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);\n}\n\nfunction replaceFileSync(sourcePath: string, targetPath: string): void {\n\tfor (let attempt = 0; attempt <= REPLACE_RETRY_DELAYS_MS.length; attempt++) {\n\t\ttry {\n\t\t\trenameSync(sourcePath, targetPath);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (!isRetryableRenameError(error) || attempt === REPLACE_RETRY_DELAYS_MS.length) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tsleepSync(REPLACE_RETRY_DELAYS_MS[attempt]);\n\t\t}\n\t}\n}\n\nfunction assertRecord(value: unknown, path: string): asserts value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${path} must be an object`);\n\t}\n}\n\nfunction assertString(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(`${path} must be a string`);\n\t}\n}\n\nfunction assertNumber(value: unknown, path: string): asserts value is number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) {\n\t\tthrow new Error(`${path} must be a finite number`);\n\t}\n}\n\nfunction assertNullableString(value: unknown, path: string): asserts value is string | null {\n\tif (value !== null && typeof value !== \"string\") {\n\t\tthrow new Error(`${path} must be a string or null`);\n\t}\n}\n\nfunction assertStaticContext(value: unknown): asserts value is SessionStaticContext | undefined {\n\tif (value === undefined) return;\n\tassertRecord(value, \"session.staticContext\");\n\tconst systemPrompt = value.systemPrompt;\n\tif (systemPrompt !== undefined && typeof systemPrompt !== \"string\") {\n\t\tthrow new Error(\"session.staticContext.systemPrompt must be a string\");\n\t}\n\tconst tools = value.tools;\n\tif (tools !== undefined) {\n\t\tif (!Array.isArray(tools)) {\n\t\t\tthrow new Error(\"session.staticContext.tools must be an array\");\n\t\t}\n\t\tfor (const [index, tool] of tools.entries()) {\n\t\t\tassertRecord(tool, `session.staticContext.tools[${index}]`);\n\t\t\tassertString(tool.name, `session.staticContext.tools[${index}].name`);\n\t\t\tassertString(tool.description, `session.staticContext.tools[${index}].description`);\n\t\t\tif (tool.parameters === undefined) {\n\t\t\t\tthrow new Error(`session.staticContext.tools[${index}].parameters is required`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertSessionTreeEntries(value: unknown): asserts value is SessionTreeEntry[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error(\"session.entries must be an array\");\n\t}\n\tfor (const [index, entry] of value.entries()) {\n\t\tassertRecord(entry, `session.entries[${index}]`);\n\t\tassertString(entry.type, `session.entries[${index}].type`);\n\t\tassertString(entry.id, `session.entries[${index}].id`);\n\t\tassertNullableString(entry.parentId, `session.entries[${index}].parentId`);\n\t\tassertString(entry.timestamp, `session.entries[${index}].timestamp`);\n\t\tif (entry.type === \"message\") {\n\t\t\tassertRecord(entry.message, `session.entries[${index}].message`);\n\t\t}\n\t}\n}\n\nfunction assertPersistedSessionState(value: unknown): asserts value is PersistedSessionState {\n\tassertRecord(value, \"session\");\n\tassertString(value.sessionId, \"session.sessionId\");\n\tassertStaticContext(value.staticContext);\n\tassertSessionTreeEntries(value.entries);\n\tassertNullableString(value.leafId, \"session.leafId\");\n\tassertNumber(value.revision, \"session.revision\");\n\tassertNumber(value.createdAt, \"session.createdAt\");\n\tassertNumber(value.updatedAt, \"session.updatedAt\");\n}\n\nfunction assertPersistedWalRecord(\n\tvalue: unknown,\n\tsourcePath: string,\n\tlineNumber: number,\n): asserts value is PersistedSessionWalRecord {\n\tconst path = `${sourcePath}:${lineNumber}`;\n\tassertRecord(value, path);\n\tif (value.version !== PERSISTED_SESSION_VERSION) {\n\t\tthrow new Error(`Unsupported persisted session WAL version in ${path}`);\n\t}\n\tassertString(value.sessionId, `${path}.sessionId`);\n\tassertNumber(value.baseEntryCount, `${path}.baseEntryCount`);\n\tassertSessionTreeEntries(value.entries);\n\tassertNullableString(value.leafId, `${path}.leafId`);\n\tassertNumber(value.revision, `${path}.revision`);\n\tassertNumber(value.updatedAt, `${path}.updatedAt`);\n\tassertStaticContext(value.staticContext);\n}\n\nfunction parsePersistedSessionFile(raw: string, sourcePath: string): PersistedSessionFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tthrow new Error(`Persisted session file contains invalid JSON: ${sourcePath}`, { cause: error });\n\t}\n\tassertRecord(parsed, \"persisted session file\");\n\tif (parsed.version !== PERSISTED_SESSION_VERSION) {\n\t\tthrow new Error(`Unsupported persisted session version in ${sourcePath}`);\n\t}\n\tassertPersistedSessionState(parsed.session);\n\treturn {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsession: parsed.session,\n\t};\n}\n\nclass PersistedSessionWalSyntaxError extends Error {\n\tconstructor(sourcePath: string, lineNumber: number, cause: unknown) {\n\t\tsuper(`Persisted session WAL contains invalid JSON: ${sourcePath}:${lineNumber}`, { cause });\n\t\tthis.name = \"PersistedSessionWalSyntaxError\";\n\t}\n}\n\nfunction parseWalLine(raw: string, sourcePath: string, lineNumber: number): PersistedSessionWalRecord {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\tthrow new PersistedSessionWalSyntaxError(sourcePath, lineNumber, error);\n\t}\n\tassertPersistedWalRecord(parsed, sourcePath, lineNumber);\n\treturn parsed;\n}\n\nfunction applyWalRecord(session: PersistedSessionState, record: PersistedSessionWalRecord): void {\n\tif (record.sessionId !== session.sessionId) {\n\t\tthrow new Error(`Persisted session WAL sessionId does not match snapshot: ${record.sessionId}`);\n\t}\n\tif (record.revision <= session.revision) return;\n\tif (record.baseEntryCount < session.entries.length) {\n\t\tthrow new Error(`Persisted session WAL overlaps snapshot for ${record.sessionId}`);\n\t}\n\tif (record.baseEntryCount !== session.entries.length) {\n\t\tthrow new Error(`Persisted session WAL has a gap for ${record.sessionId}`);\n\t}\n\tsession.entries.push(...record.entries.map((entry) => ({ ...entry })));\n\tsession.leafId = record.leafId;\n\tsession.revision = record.revision;\n\tsession.updatedAt = record.updatedAt;\n\tsession.staticContext = record.staticContext;\n}\n\nfunction applyPersistedWal(sessionStoreDir: string, session: PersistedSessionState): number {\n\tconst filePath = walPath(sessionStoreDir, session.sessionId);\n\tif (!existsSync(filePath)) return 0;\n\tconst lines = readFileSync(filePath, \"utf-8\").split(\"\\n\");\n\tlet applied = 0;\n\tfor (const [index, line] of lines.entries()) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tapplyWalRecord(session, parseWalLine(line, filePath, index + 1));\n\t\t\tapplied++;\n\t\t} catch (error) {\n\t\t\tconst isPhysicalTail = lines.slice(index + 1).every((remainingLine) => !remainingLine.trim());\n\t\t\tif (isPhysicalTail && error instanceof PersistedSessionWalSyntaxError) {\n\t\t\t\tconst prefix = lines.slice(0, index).join(\"\\n\");\n\t\t\t\tconst truncateAt = Buffer.byteLength(prefix, \"utf8\") + (index > 0 ? 1 : 0);\n\t\t\t\ttruncateSync(filePath, truncateAt);\n\t\t\t\tconsole.warn(`Discarding torn WAL tail line at ${filePath}:${index + 1}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\treturn applied;\n}\n\nexport function loadPersistedSessions(sessionStoreDir: string): void {\n\tif (!existsSync(sessionStoreDir)) return;\n\tconst entries = readdirSync(sessionStoreDir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tif (!entry.isFile() || !entry.name.endsWith(\".json\")) continue;\n\t\tconst filePath = join(sessionStoreDir, entry.name);\n\t\ttry {\n\t\t\tconst persisted = parsePersistedSessionFile(readFileSync(filePath, \"utf-8\"), filePath);\n\t\t\tconst expectedFileName = sessionFileName(persisted.session.sessionId);\n\t\t\tif (entry.name !== expectedFileName) {\n\t\t\t\tthrow new Error(`Persisted session file name does not match sessionId: ${filePath}`);\n\t\t\t}\n\t\t\tconst walRecords = applyPersistedWal(sessionStoreDir, persisted.session);\n\t\t\trestoreSessionState(persisted.session);\n\t\t\tpersistedSessions.set(persistedSessionKey(sessionStoreDir, persisted.session.sessionId), {\n\t\t\t\tentryCount: persisted.session.entries.length,\n\t\t\t\twalRecords,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to load session from ${filePath}, skipping:`, error);\n\t\t}\n\t}\n}\n\nfunction writeSnapshot(sessionStoreDir: string, session: SessionState): void {\n\tmkdirSync(sessionStoreDir, { recursive: true });\n\tconst filePath = sessionPath(sessionStoreDir, session.sessionId);\n\tconst tempPath = `${filePath}.${randomUUID()}.tmp`;\n\tconst body: PersistedSessionFile = {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsession: exportSessionState(session),\n\t};\n\ttry {\n\t\twriteFileSync(tempPath, JSON.stringify(body), \"utf-8\");\n\t\treplaceFileSync(tempPath, filePath);\n\t\trmSync(walPath(sessionStoreDir, session.sessionId), { force: true });\n\t} catch (error) {\n\t\trmSync(tempPath, { force: true });\n\t\tthrow error;\n\t}\n}\n\nfunction appendWalRecord(sessionStoreDir: string, session: SessionState, baseEntryCount: number): void {\n\tconst record: PersistedSessionWalRecord = {\n\t\tversion: PERSISTED_SESSION_VERSION,\n\t\tsessionId: session.sessionId,\n\t\tbaseEntryCount,\n\t\tentries: session.persistenceChange?.kind === \"wal\" ? session.persistenceChange.entries : [],\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tupdatedAt: session.updatedAt,\n\t\tstaticContext: session.staticContext,\n\t};\n\tappendFileSync(walPath(sessionStoreDir, session.sessionId), `${JSON.stringify(record)}\\n`, \"utf-8\");\n}\n\nexport function savePersistedSession(sessionStoreDir: string, session: SessionState): void {\n\tconst key = persistedSessionKey(sessionStoreDir, session.sessionId);\n\tconst meta = persistedSessions.get(key);\n\tif (meta && !session.persistenceChange) return;\n\tif (!meta || session.persistenceChange?.kind === \"snapshot\" || meta.walRecords >= WAL_SNAPSHOT_INTERVAL) {\n\t\twriteSnapshot(sessionStoreDir, session);\n\t\tpersistedSessions.set(key, { entryCount: session.entries.length, walRecords: 0 });\n\t\tmarkSessionPersisted(session);\n\t\treturn;\n\t}\n\tappendWalRecord(sessionStoreDir, session, meta.entryCount);\n\tpersistedSessions.set(key, { entryCount: session.entries.length, walRecords: meta.walRecords + 1 });\n\tmarkSessionPersisted(session);\n}\n\nexport function deletePersistedSession(sessionStoreDir: string, sessionId: string): void {\n\trmSync(sessionPath(sessionStoreDir, sessionId), { force: true });\n\trmSync(walPath(sessionStoreDir, sessionId), { force: true });\n\tpersistedSessions.delete(persistedSessionKey(sessionStoreDir, sessionId));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC/G,OAAO,EAA2B,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAUzF,MAAM,WAAW,oBAAoB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAChD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAChD,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,wBAAwB,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAQ3G,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAqBlE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAEtE;AAED,wBAAgB,YAAY,IAAI,cAAc,EAAE,CAc/C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAU/E;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,YAAY,CAmBlF;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,YAAY,CAU/F;AAYD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAe1E;AAgCD,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,GACnB,YAAY,CAWd;AAED,wBAAgB,oBAAoB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,GACnB,YAAY,
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/session-store.js
CHANGED
|
@@ -187,7 +187,6 @@ export function appendSessionEntries(sessionId, entries, leafId) {
|
|
|
187
187
|
return session;
|
|
188
188
|
}
|
|
189
189
|
session.entries.push(...entriesToAppend);
|
|
190
|
-
assertValidLeaf(session.entries, leafId);
|
|
191
190
|
session.leafId = leafId;
|
|
192
191
|
appendTreeHashes(session, entriesToAppend);
|
|
193
192
|
session.revision++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { buildLegacySessionContext, convertToLlm, type SessionTreeEntry } from \"@earendil-works/pi-agent-core\";\nimport { getCurrentSystemMessage, type Message, type Tool } from \"@earendil-works/pi-ai\";\nimport { PiServerError, PiServerErrorCode } from \"./error-codes.ts\";\nimport {\n\tappendPiServerTreeHash,\n\tbuildPiServerTreePrefixHashes,\n\thashPiServerSessionEntries,\n\thashPiServerStaticContext,\n\thashPiServerTreeEntry,\n} from \"./pi-server-protocol.ts\";\n\nexport interface SessionStaticContext {\n\tsystemPrompt?: string;\n\ttools?: Tool[];\n}\n\nexport interface SessionState {\n\tsessionId: string;\n\tstaticContext: SessionStaticContext | undefined;\n\tstaticContextHash: string;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\ttreeHash: string;\n\tprefixHashes: string[];\n\tmessages: Message[];\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tpersistenceChange: SessionPersistenceChange | undefined;\n}\n\nexport interface SessionSummary {\n\tsessionId: string;\n\tstaticContextHash: string;\n\ttreeHash: string;\n\tmessageCount: number;\n\tentryCount: number;\n\tleafId: string | null;\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n}\n\nexport interface PersistedSessionState {\n\tsessionId: string;\n\tstaticContext: SessionStaticContext | undefined;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n}\n\nexport type SessionPersistenceChange = { kind: \"snapshot\" } | { kind: \"wal\"; entries: SessionTreeEntry[] };\n\nconst sessions = new Map<string, SessionState>();\n\nfunction hashStaticContext(ctx: SessionStaticContext | undefined): string {\n\treturn hashPiServerStaticContext(ctx);\n}\n\nexport function getOrCreateSession(sessionId: string): SessionState {\n\tlet session = sessions.get(sessionId);\n\tif (!session) {\n\t\tconst now = Date.now();\n\t\tsession = {\n\t\t\tsessionId,\n\t\t\tstaticContext: undefined,\n\t\t\tstaticContextHash: \"\",\n\t\t\tentries: [],\n\t\t\tleafId: null,\n\t\t\ttreeHash: hashPiServerSessionEntries([]),\n\t\t\tprefixHashes: buildPiServerTreePrefixHashes([]),\n\t\t\tmessages: [],\n\t\t\trevision: 0,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tpersistenceChange: { kind: \"snapshot\" },\n\t\t};\n\t\tsessions.set(sessionId, session);\n\t}\n\treturn session;\n}\n\nexport function getSession(sessionId: string): SessionState | undefined {\n\treturn sessions.get(sessionId);\n}\n\nexport function hashSessionEntries(entries: SessionTreeEntry[]): string {\n\treturn hashPiServerSessionEntries(entries);\n}\n\nexport function listSessions(): SessionSummary[] {\n\treturn Array.from(sessions.values())\n\t\t.map((session) => ({\n\t\t\tsessionId: session.sessionId,\n\t\t\tstaticContextHash: session.staticContextHash,\n\t\t\ttreeHash: session.treeHash,\n\t\t\tmessageCount: session.messages.length,\n\t\t\tentryCount: session.entries.length,\n\t\t\tleafId: session.leafId,\n\t\t\trevision: session.revision,\n\t\t\tcreatedAt: session.createdAt,\n\t\t\tupdatedAt: session.updatedAt,\n\t\t}))\n\t\t.sort((a, b) => b.updatedAt - a.updatedAt || a.sessionId.localeCompare(b.sessionId));\n}\n\nexport function exportSessionState(session: SessionState): PersistedSessionState {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tentries: session.entries.map((entry) => ({ ...entry })),\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tcreatedAt: session.createdAt,\n\t\tupdatedAt: session.updatedAt,\n\t};\n}\n\nexport function restoreSessionState(persisted: PersistedSessionState): SessionState {\n\tassertValidLeaf(persisted.entries, persisted.leafId);\n\tconst session: SessionState = {\n\t\tsessionId: persisted.sessionId,\n\t\tstaticContext: persisted.staticContext,\n\t\tstaticContextHash: hashStaticContext(persisted.staticContext),\n\t\tentries: persisted.entries.map((entry) => ({ ...entry })),\n\t\tleafId: persisted.leafId,\n\t\ttreeHash: hashSessionEntries(persisted.entries),\n\t\tprefixHashes: buildPiServerTreePrefixHashes(persisted.entries),\n\t\tmessages: [],\n\t\trevision: persisted.revision,\n\t\tcreatedAt: persisted.createdAt,\n\t\tupdatedAt: persisted.updatedAt,\n\t\tpersistenceChange: undefined,\n\t};\n\trefreshActiveMessages(session);\n\tsessions.set(session.sessionId, session);\n\treturn session;\n}\n\nexport function setStaticContext(sessionId: string, context: SessionStaticContext): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst newHash = hashStaticContext(context);\n\tif (session.staticContextHash === newHash) return session;\n\tsession.staticContext = context;\n\tsession.staticContextHash = newHash;\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\tmarkWalPersistenceChange(session, []);\n\treturn session;\n}\n\nfunction entryToMessageEntry(message: Message, parentId: string | null): SessionTreeEntry {\n\treturn {\n\t\ttype: \"message\",\n\t\tid: randomUUID(),\n\t\tparentId,\n\t\ttimestamp: new Date(message.timestamp).toISOString(),\n\t\tmessage,\n\t};\n}\n\nexport function getSessionBranch(session: SessionState): SessionTreeEntry[] {\n\tconst byId = new Map(session.entries.map((entry) => [entry.id, entry]));\n\tconst branch: SessionTreeEntry[] = [];\n\tlet current = session.leafId ? byId.get(session.leafId) : undefined;\n\tconst seen = new Set<string>();\n\twhile (current) {\n\t\tif (seen.has(current.id)) {\n\t\t\tthrow new Error(`session tree contains a parent cycle at entry ${current.id}`);\n\t\t}\n\t\tseen.add(current.id);\n\t\tbranch.push(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\tbranch.reverse();\n\treturn branch;\n}\n\nfunction deriveActiveMessages(session: SessionState): Message[] {\n\tconst branch = getSessionBranch(session);\n\treturn convertToLlm(buildLegacySessionContext(branch).messages);\n}\n\nfunction refreshActiveMessages(session: SessionState): void {\n\tsession.messages = deriveActiveMessages(session);\n}\n\nfunction refreshTreeHashes(session: SessionState): void {\n\tsession.prefixHashes = buildPiServerTreePrefixHashes(session.entries);\n\tsession.treeHash = session.prefixHashes[session.prefixHashes.length - 1];\n}\n\nfunction appendTreeHashes(session: SessionState, entries: SessionTreeEntry[]): void {\n\tfor (const entry of entries) {\n\t\tsession.treeHash = appendPiServerTreeHash(session.treeHash, hashPiServerTreeEntry(entry));\n\t\tsession.prefixHashes.push(session.treeHash);\n\t}\n}\n\nfunction assertValidLeaf(entries: SessionTreeEntry[], leafId: string | null): void {\n\tif (leafId === null) return;\n\tif (!entries.some((entry) => entry.id === leafId)) {\n\t\tthrow new PiServerError(`leafId ${leafId} does not exist in session tree`, PiServerErrorCode.LEAF_ID_NOT_FOUND, {\n\t\t\tleafId,\n\t\t});\n\t}\n}\n\nexport function replaceSessionTree(\n\tsessionId: string,\n\tentries: SessionTreeEntry[],\n\tleafId: string | null,\n): SessionState {\n\tassertValidLeaf(entries, leafId);\n\tconst session = getOrCreateSession(sessionId);\n\tsession.entries = entries.map((entry) => ({ ...entry }));\n\tsession.leafId = leafId;\n\trefreshTreeHashes(session);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tsession.persistenceChange = { kind: \"snapshot\" };\n\treturn session;\n}\n\nexport function appendSessionEntries(\n\tsessionId: string,\n\tentries: SessionTreeEntry[],\n\tleafId: string | null,\n): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst knownEntries = new Map(session.entries.map((entry) => [entry.id, entry]));\n\tconst entriesToAppend: SessionTreeEntry[] = [];\n\tfor (const entry of entries) {\n\t\tconst knownEntry = knownEntries.get(entry.id);\n\t\tif (knownEntry) {\n\t\t\tif (!isDeepStrictEqual(knownEntry, entry)) {\n\t\t\t\tthrow new PiServerError(`entry ${entry.id} already exists`, PiServerErrorCode.ENTRY_ALREADY_EXISTS, {\n\t\t\t\t\tentryId: entry.id,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.parentId !== null && !knownEntries.has(entry.parentId)) {\n\t\t\tthrow new PiServerError(\n\t\t\t\t`parent entry ${entry.parentId} does not exist`,\n\t\t\t\tPiServerErrorCode.PARENT_ENTRY_NOT_FOUND,\n\t\t\t\t{ parentId: entry.parentId },\n\t\t\t);\n\t\t}\n\t\tconst entryToAppend = { ...entry };\n\t\tentriesToAppend.push(entryToAppend);\n\t\tknownEntries.set(entryToAppend.id, entryToAppend);\n\t}\n\tif (leafId !== null && !knownEntries.has(leafId)) {\n\t\tthrow new PiServerError(`leafId ${leafId} does not exist in session tree`, PiServerErrorCode.LEAF_ID_NOT_FOUND, {\n\t\t\tleafId,\n\t\t});\n\t}\n\tif (entriesToAppend.length === 0 && session.leafId === leafId) {\n\t\treturn session;\n\t}\n\tsession.entries.push(...entriesToAppend);\n\tassertValidLeaf(session.entries, leafId);\n\tsession.leafId = leafId;\n\tappendTreeHashes(session, entriesToAppend);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, entriesToAppend);\n\treturn session;\n}\n\nexport function switchSessionLeaf(sessionId: string, leafId: string | null): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tassertValidLeaf(session.entries, leafId);\n\tsession.leafId = leafId;\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, []);\n\treturn session;\n}\n\nexport function appendCompactionEntry(\n\tsessionId: string,\n\tcompaction: { summary: string; firstKeptEntryId: string; tokensBefore: number; details?: unknown },\n): { session: SessionState; entry: SessionTreeEntry } {\n\tconst session = getOrCreateSession(sessionId);\n\tconst timestamp = new Date().toISOString();\n\tconst systemMessage = getCurrentSystemMessage(buildLegacySessionContext(getSessionBranch(session)).messages);\n\tconst entry: SessionTreeEntry = {\n\t\ttype: \"compaction\",\n\t\tid: randomUUID(),\n\t\tparentId: session.leafId,\n\t\ttimestamp,\n\t\tsummary: compaction.summary,\n\t\tfirstKeptEntryId: compaction.firstKeptEntryId,\n\t\ttokensBefore: compaction.tokensBefore,\n\t\tdetails: compaction.details,\n\t\t...(systemMessage ? { systemMessage: { ...systemMessage, timestamp: new Date(timestamp).getTime() } } : {}),\n\t};\n\tsession.entries.push(entry);\n\tsession.leafId = entry.id;\n\tappendTreeHashes(session, [entry]);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, [entry]);\n\treturn { session, entry };\n}\n\nexport function appendMessages(sessionId: string, delta: Message[]): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst entries = delta.map((message) => {\n\t\tconst entry = entryToMessageEntry(message, session.leafId);\n\t\tsession.leafId = entry.id;\n\t\treturn entry;\n\t});\n\tsession.entries.push(...entries);\n\tappendTreeHashes(session, entries);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, entries);\n\treturn session;\n}\n\nexport function replaceMessages(sessionId: string, messages: Message[]): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tlet parentId: string | null = null;\n\tsession.entries = messages.map((message) => {\n\t\tconst entry = entryToMessageEntry(message, parentId);\n\t\tparentId = entry.id;\n\t\treturn entry;\n\t});\n\tsession.leafId = parentId;\n\trefreshTreeHashes(session);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tsession.persistenceChange = { kind: \"snapshot\" };\n\treturn session;\n}\n\nexport function deleteSession(sessionId: string): boolean {\n\treturn sessions.delete(sessionId);\n}\n\nexport function clearAllSessions(): void {\n\tsessions.clear();\n}\n\nfunction markWalPersistenceChange(session: SessionState, entries: SessionTreeEntry[]): void {\n\tif (session.persistenceChange?.kind === \"snapshot\") return;\n\tsession.persistenceChange = {\n\t\tkind: \"wal\",\n\t\tentries: [...(session.persistenceChange?.entries ?? []), ...entries.map((entry) => ({ ...entry }))],\n\t};\n}\n\nexport function markSessionPersisted(session: SessionState): void {\n\tsession.persistenceChange = undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { buildLegacySessionContext, convertToLlm, type SessionTreeEntry } from \"@earendil-works/pi-agent-core\";\nimport { getCurrentSystemMessage, type Message, type Tool } from \"@earendil-works/pi-ai\";\nimport { PiServerError, PiServerErrorCode } from \"./error-codes.ts\";\nimport {\n\tappendPiServerTreeHash,\n\tbuildPiServerTreePrefixHashes,\n\thashPiServerSessionEntries,\n\thashPiServerStaticContext,\n\thashPiServerTreeEntry,\n} from \"./pi-server-protocol.ts\";\n\nexport interface SessionStaticContext {\n\tsystemPrompt?: string;\n\ttools?: Tool[];\n}\n\nexport interface SessionState {\n\tsessionId: string;\n\tstaticContext: SessionStaticContext | undefined;\n\tstaticContextHash: string;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\ttreeHash: string;\n\tprefixHashes: string[];\n\tmessages: Message[];\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n\tpersistenceChange: SessionPersistenceChange | undefined;\n}\n\nexport interface SessionSummary {\n\tsessionId: string;\n\tstaticContextHash: string;\n\ttreeHash: string;\n\tmessageCount: number;\n\tentryCount: number;\n\tleafId: string | null;\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n}\n\nexport interface PersistedSessionState {\n\tsessionId: string;\n\tstaticContext: SessionStaticContext | undefined;\n\tentries: SessionTreeEntry[];\n\tleafId: string | null;\n\trevision: number;\n\tcreatedAt: number;\n\tupdatedAt: number;\n}\n\nexport type SessionPersistenceChange = { kind: \"snapshot\" } | { kind: \"wal\"; entries: SessionTreeEntry[] };\n\nconst sessions = new Map<string, SessionState>();\n\nfunction hashStaticContext(ctx: SessionStaticContext | undefined): string {\n\treturn hashPiServerStaticContext(ctx);\n}\n\nexport function getOrCreateSession(sessionId: string): SessionState {\n\tlet session = sessions.get(sessionId);\n\tif (!session) {\n\t\tconst now = Date.now();\n\t\tsession = {\n\t\t\tsessionId,\n\t\t\tstaticContext: undefined,\n\t\t\tstaticContextHash: \"\",\n\t\t\tentries: [],\n\t\t\tleafId: null,\n\t\t\ttreeHash: hashPiServerSessionEntries([]),\n\t\t\tprefixHashes: buildPiServerTreePrefixHashes([]),\n\t\t\tmessages: [],\n\t\t\trevision: 0,\n\t\t\tcreatedAt: now,\n\t\t\tupdatedAt: now,\n\t\t\tpersistenceChange: { kind: \"snapshot\" },\n\t\t};\n\t\tsessions.set(sessionId, session);\n\t}\n\treturn session;\n}\n\nexport function getSession(sessionId: string): SessionState | undefined {\n\treturn sessions.get(sessionId);\n}\n\nexport function hashSessionEntries(entries: SessionTreeEntry[]): string {\n\treturn hashPiServerSessionEntries(entries);\n}\n\nexport function listSessions(): SessionSummary[] {\n\treturn Array.from(sessions.values())\n\t\t.map((session) => ({\n\t\t\tsessionId: session.sessionId,\n\t\t\tstaticContextHash: session.staticContextHash,\n\t\t\ttreeHash: session.treeHash,\n\t\t\tmessageCount: session.messages.length,\n\t\t\tentryCount: session.entries.length,\n\t\t\tleafId: session.leafId,\n\t\t\trevision: session.revision,\n\t\t\tcreatedAt: session.createdAt,\n\t\t\tupdatedAt: session.updatedAt,\n\t\t}))\n\t\t.sort((a, b) => b.updatedAt - a.updatedAt || a.sessionId.localeCompare(b.sessionId));\n}\n\nexport function exportSessionState(session: SessionState): PersistedSessionState {\n\treturn {\n\t\tsessionId: session.sessionId,\n\t\tstaticContext: session.staticContext,\n\t\tentries: session.entries.map((entry) => ({ ...entry })),\n\t\tleafId: session.leafId,\n\t\trevision: session.revision,\n\t\tcreatedAt: session.createdAt,\n\t\tupdatedAt: session.updatedAt,\n\t};\n}\n\nexport function restoreSessionState(persisted: PersistedSessionState): SessionState {\n\tassertValidLeaf(persisted.entries, persisted.leafId);\n\tconst session: SessionState = {\n\t\tsessionId: persisted.sessionId,\n\t\tstaticContext: persisted.staticContext,\n\t\tstaticContextHash: hashStaticContext(persisted.staticContext),\n\t\tentries: persisted.entries.map((entry) => ({ ...entry })),\n\t\tleafId: persisted.leafId,\n\t\ttreeHash: hashSessionEntries(persisted.entries),\n\t\tprefixHashes: buildPiServerTreePrefixHashes(persisted.entries),\n\t\tmessages: [],\n\t\trevision: persisted.revision,\n\t\tcreatedAt: persisted.createdAt,\n\t\tupdatedAt: persisted.updatedAt,\n\t\tpersistenceChange: undefined,\n\t};\n\trefreshActiveMessages(session);\n\tsessions.set(session.sessionId, session);\n\treturn session;\n}\n\nexport function setStaticContext(sessionId: string, context: SessionStaticContext): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst newHash = hashStaticContext(context);\n\tif (session.staticContextHash === newHash) return session;\n\tsession.staticContext = context;\n\tsession.staticContextHash = newHash;\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\tmarkWalPersistenceChange(session, []);\n\treturn session;\n}\n\nfunction entryToMessageEntry(message: Message, parentId: string | null): SessionTreeEntry {\n\treturn {\n\t\ttype: \"message\",\n\t\tid: randomUUID(),\n\t\tparentId,\n\t\ttimestamp: new Date(message.timestamp).toISOString(),\n\t\tmessage,\n\t};\n}\n\nexport function getSessionBranch(session: SessionState): SessionTreeEntry[] {\n\tconst byId = new Map(session.entries.map((entry) => [entry.id, entry]));\n\tconst branch: SessionTreeEntry[] = [];\n\tlet current = session.leafId ? byId.get(session.leafId) : undefined;\n\tconst seen = new Set<string>();\n\twhile (current) {\n\t\tif (seen.has(current.id)) {\n\t\t\tthrow new Error(`session tree contains a parent cycle at entry ${current.id}`);\n\t\t}\n\t\tseen.add(current.id);\n\t\tbranch.push(current);\n\t\tcurrent = current.parentId ? byId.get(current.parentId) : undefined;\n\t}\n\tbranch.reverse();\n\treturn branch;\n}\n\nfunction deriveActiveMessages(session: SessionState): Message[] {\n\tconst branch = getSessionBranch(session);\n\treturn convertToLlm(buildLegacySessionContext(branch).messages);\n}\n\nfunction refreshActiveMessages(session: SessionState): void {\n\tsession.messages = deriveActiveMessages(session);\n}\n\nfunction refreshTreeHashes(session: SessionState): void {\n\tsession.prefixHashes = buildPiServerTreePrefixHashes(session.entries);\n\tsession.treeHash = session.prefixHashes[session.prefixHashes.length - 1];\n}\n\nfunction appendTreeHashes(session: SessionState, entries: SessionTreeEntry[]): void {\n\tfor (const entry of entries) {\n\t\tsession.treeHash = appendPiServerTreeHash(session.treeHash, hashPiServerTreeEntry(entry));\n\t\tsession.prefixHashes.push(session.treeHash);\n\t}\n}\n\nfunction assertValidLeaf(entries: SessionTreeEntry[], leafId: string | null): void {\n\tif (leafId === null) return;\n\tif (!entries.some((entry) => entry.id === leafId)) {\n\t\tthrow new PiServerError(`leafId ${leafId} does not exist in session tree`, PiServerErrorCode.LEAF_ID_NOT_FOUND, {\n\t\t\tleafId,\n\t\t});\n\t}\n}\n\nexport function replaceSessionTree(\n\tsessionId: string,\n\tentries: SessionTreeEntry[],\n\tleafId: string | null,\n): SessionState {\n\tassertValidLeaf(entries, leafId);\n\tconst session = getOrCreateSession(sessionId);\n\tsession.entries = entries.map((entry) => ({ ...entry }));\n\tsession.leafId = leafId;\n\trefreshTreeHashes(session);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tsession.persistenceChange = { kind: \"snapshot\" };\n\treturn session;\n}\n\nexport function appendSessionEntries(\n\tsessionId: string,\n\tentries: SessionTreeEntry[],\n\tleafId: string | null,\n): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst knownEntries = new Map(session.entries.map((entry) => [entry.id, entry]));\n\tconst entriesToAppend: SessionTreeEntry[] = [];\n\tfor (const entry of entries) {\n\t\tconst knownEntry = knownEntries.get(entry.id);\n\t\tif (knownEntry) {\n\t\t\tif (!isDeepStrictEqual(knownEntry, entry)) {\n\t\t\t\tthrow new PiServerError(`entry ${entry.id} already exists`, PiServerErrorCode.ENTRY_ALREADY_EXISTS, {\n\t\t\t\t\tentryId: entry.id,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.parentId !== null && !knownEntries.has(entry.parentId)) {\n\t\t\tthrow new PiServerError(\n\t\t\t\t`parent entry ${entry.parentId} does not exist`,\n\t\t\t\tPiServerErrorCode.PARENT_ENTRY_NOT_FOUND,\n\t\t\t\t{ parentId: entry.parentId },\n\t\t\t);\n\t\t}\n\t\tconst entryToAppend = { ...entry };\n\t\tentriesToAppend.push(entryToAppend);\n\t\tknownEntries.set(entryToAppend.id, entryToAppend);\n\t}\n\tif (leafId !== null && !knownEntries.has(leafId)) {\n\t\tthrow new PiServerError(`leafId ${leafId} does not exist in session tree`, PiServerErrorCode.LEAF_ID_NOT_FOUND, {\n\t\t\tleafId,\n\t\t});\n\t}\n\tif (entriesToAppend.length === 0 && session.leafId === leafId) {\n\t\treturn session;\n\t}\n\tsession.entries.push(...entriesToAppend);\n\tsession.leafId = leafId;\n\tappendTreeHashes(session, entriesToAppend);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, entriesToAppend);\n\treturn session;\n}\n\nexport function switchSessionLeaf(sessionId: string, leafId: string | null): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tassertValidLeaf(session.entries, leafId);\n\tsession.leafId = leafId;\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, []);\n\treturn session;\n}\n\nexport function appendCompactionEntry(\n\tsessionId: string,\n\tcompaction: { summary: string; firstKeptEntryId: string; tokensBefore: number; details?: unknown },\n): { session: SessionState; entry: SessionTreeEntry } {\n\tconst session = getOrCreateSession(sessionId);\n\tconst timestamp = new Date().toISOString();\n\tconst systemMessage = getCurrentSystemMessage(buildLegacySessionContext(getSessionBranch(session)).messages);\n\tconst entry: SessionTreeEntry = {\n\t\ttype: \"compaction\",\n\t\tid: randomUUID(),\n\t\tparentId: session.leafId,\n\t\ttimestamp,\n\t\tsummary: compaction.summary,\n\t\tfirstKeptEntryId: compaction.firstKeptEntryId,\n\t\ttokensBefore: compaction.tokensBefore,\n\t\tdetails: compaction.details,\n\t\t...(systemMessage ? { systemMessage: { ...systemMessage, timestamp: new Date(timestamp).getTime() } } : {}),\n\t};\n\tsession.entries.push(entry);\n\tsession.leafId = entry.id;\n\tappendTreeHashes(session, [entry]);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, [entry]);\n\treturn { session, entry };\n}\n\nexport function appendMessages(sessionId: string, delta: Message[]): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tconst entries = delta.map((message) => {\n\t\tconst entry = entryToMessageEntry(message, session.leafId);\n\t\tsession.leafId = entry.id;\n\t\treturn entry;\n\t});\n\tsession.entries.push(...entries);\n\tappendTreeHashes(session, entries);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tmarkWalPersistenceChange(session, entries);\n\treturn session;\n}\n\nexport function replaceMessages(sessionId: string, messages: Message[]): SessionState {\n\tconst session = getOrCreateSession(sessionId);\n\tlet parentId: string | null = null;\n\tsession.entries = messages.map((message) => {\n\t\tconst entry = entryToMessageEntry(message, parentId);\n\t\tparentId = entry.id;\n\t\treturn entry;\n\t});\n\tsession.leafId = parentId;\n\trefreshTreeHashes(session);\n\tsession.revision++;\n\tsession.updatedAt = Date.now();\n\trefreshActiveMessages(session);\n\tsession.persistenceChange = { kind: \"snapshot\" };\n\treturn session;\n}\n\nexport function deleteSession(sessionId: string): boolean {\n\treturn sessions.delete(sessionId);\n}\n\nexport function clearAllSessions(): void {\n\tsessions.clear();\n}\n\nfunction markWalPersistenceChange(session: SessionState, entries: SessionTreeEntry[]): void {\n\tif (session.persistenceChange?.kind === \"snapshot\") return;\n\tsession.persistenceChange = {\n\t\tkind: \"wal\",\n\t\tentries: [...(session.persistenceChange?.entries ?? []), ...entries.map((entry) => ({ ...entry }))],\n\t};\n}\n\nexport function markSessionPersisted(session: SessionState): void {\n\tsession.persistenceChange = undefined;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@averyyy/pi-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0-piclient.2",
|
|
4
4
|
"description": "Proxy server for pi-client that stores session state and forwards incremental requests to upstream LLM providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"prepublishOnly": "npm run clean && npm run build"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@1.
|
|
31
|
-
"@earendil-works/pi-agent-core": "npm:@averyyy/pi-agent-core@1.
|
|
30
|
+
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@1.3.0-piclient.2",
|
|
31
|
+
"@earendil-works/pi-agent-core": "npm:@averyyy/pi-agent-core@1.3.0-piclient.2"
|
|
32
32
|
},
|
|
33
33
|
"keywords": [
|
|
34
34
|
"pi-server",
|