@averyyy/pi-coding-agent 0.82.1-piclient.6 → 0.82.1-piclient.7
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 +0 -12
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -5
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -12
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +89 -317
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/pi-server-client.d.ts +2 -54
- package/dist/core/pi-server-client.d.ts.map +1 -1
- package/dist/core/pi-server-client.js +272 -2320
- package/dist/core/pi-server-client.js.map +1 -1
- package/dist/core/pi-server-protocol.d.ts +0 -2
- package/dist/core/pi-server-protocol.d.ts.map +1 -1
- package/dist/core/pi-server-protocol.js +1 -24
- package/dist/core/pi-server-protocol.js.map +1 -1
- package/dist/core/pi-server-request.d.ts +0 -28
- package/dist/core/pi-server-request.d.ts.map +1 -1
- package/dist/core/pi-server-request.js +75 -492
- package/dist/core/pi-server-request.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +53 -69
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -86
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +144 -737
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +1 -3
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +26 -46
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -13
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +0 -15
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +29 -98
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/package.json +4 -4
- package/dist/cli/tool-effects.d.ts +0 -6
- package/dist/cli/tool-effects.d.ts.map +0 -1
- package/dist/cli/tool-effects.js +0 -164
- package/dist/cli/tool-effects.js.map +0 -1
- package/dist/core/pi-server-compact-state.d.ts +0 -81
- package/dist/core/pi-server-compact-state.d.ts.map +0 -1
- package/dist/core/pi-server-compact-state.js +0 -439
- package/dist/core/pi-server-compact-state.js.map +0 -1
- package/dist/core/pi-server-run-state.d.ts +0 -42
- package/dist/core/pi-server-run-state.d.ts.map +0 -1
- package/dist/core/pi-server-run-state.js +0 -320
- package/dist/core/pi-server-run-state.js.map +0 -1
- package/dist/core/tool-effect-journal.d.ts +0 -103
- package/dist/core/tool-effect-journal.d.ts.map +0 -1
- package/dist/core/tool-effect-journal.js +0 -1442
- package/dist/core/tool-effect-journal.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-server-request.js","sourceRoot":"","sources":["../../src/core/pi-server-request.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash, randomUUID } from \"node:crypto\";\n\nconst DEFAULT_MAX_REQUEST_KB = 512;\nconst CHUNK_ENDPOINT = \"/api/request/chunk\";\nconst CHUNK_UPLOAD_CONCURRENCY = 4;\nconst CHUNK_MAX_TOTAL_CHUNKS = 4096;\nconst CHUNK_UPLOAD_RETRY_DELAYS_MS = [100, 250, 500] as const;\nconst LEGACY_CHUNK_ACK_MAX_BYTES = 4096;\nconst DEFAULT_CHUNK_REQUEST_MEMO_LIMIT = 128;\nconst DEFAULT_RESPONSE_NO_PROGRESS_TIMEOUT_MS = 90_000;\nexport const PI_SERVER_CHUNK_ACK_HEADER = \"X-Pi-Chunk-Ack\";\nexport const PI_SERVER_CHUNK_ACK_VALUE = \"1\";\nexport const PI_SERVER_CHUNK_FINAL_VALUE = \"0\";\nexport const PI_SERVER_CHUNK_SEGMENT_ENCODING = \"base64-segment-v1\";\nexport const PI_SERVER_RESPONSE_HEADER_TIMEOUT_MS = 30_000;\n\nexport interface PiServerRequestOptions {\n\tserverUrl: string;\n\tauthToken: string;\n\tsignal?: AbortSignal;\n\tresponseHeaderTimeoutMs?: number;\n\tmaxChunkRequestMemos?: number;\n}\n\ninterface ChunkBody {\n\trequestId: string;\n\ttarget: string;\n\tchunkIndex: number;\n\ttotalChunks: number;\n\tsha256: string;\n\tchunk: string;\n\tencoding: typeof PI_SERVER_CHUNK_SEGMENT_ENCODING;\n\trawTotalBytes: number;\n\trawChunkBytes: number;\n}\n\ninterface ChunkAckBody {\n\treceived: unknown;\n\trequestId: unknown;\n\tchunkIndex: unknown;\n\ttotalChunks: unknown;\n}\n\ninterface ChunkRequestMemo {\n\trequestId: string;\n\tmaxBytes: number;\n}\n\ninterface ChunkResponseInspection {\n\tacknowledged: boolean;\n\tresponse?: Response;\n}\n\ninterface BodyNoProgressState {\n\treadonly timeoutMs: number;\n\tdeadlineMs: number;\n}\n\nexport class PiServerTransportHeaderTimeoutError extends Error {\n\treadonly code = \"PI_SERVER_TRANSPORT_HEADER_TIMEOUT\";\n\treadonly timeoutMs: number;\n\n\tconstructor(method: string, endpoint: string, timeoutMs: number) {\n\t\tsuper(`pi-server transport header timeout after ${timeoutMs} ms (ETIMEDOUT): ${method} ${endpoint}`);\n\t\tthis.name = \"PiServerTransportHeaderTimeoutError\";\n\t\tthis.timeoutMs = timeoutMs;\n\t}\n}\n\nclass PiServerTransportBodyNoProgressError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`pi-server response made no progress for ${timeoutMs}ms`);\n\t\tthis.name = \"PiServerTransportBodyNoProgressError\";\n\t}\n}\n\nexport class PiServerChunkRequestMemoLimitError extends Error {\n\treadonly code = \"PI_SERVER_CHUNK_REQUEST_MEMO_LIMIT\";\n\treadonly limit: number;\n\n\tconstructor(limit: number) {\n\t\tsuper(\n\t\t\t`pi-server chunk request identity limit (${limit}) reached; refusing to allocate a new requestId while prior requests remain uncertain`,\n\t\t);\n\t\tthis.name = \"PiServerChunkRequestMemoLimitError\";\n\t\tthis.limit = limit;\n\t}\n}\n\nexport class PiServerChunkAckProtocolError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"PiServerChunkAckProtocolError\";\n\t}\n}\n\nexport class PiServerTransportBodyLimitError extends Error {\n\treadonly code = \"PI_SERVER_TRANSPORT_BODY_LIMIT\";\n\treadonly maxBytes: number;\n\n\tconstructor(maxBytes: number) {\n\t\tsuper(`pi-server response body exceeded ${maxBytes} bytes`);\n\t\tthis.name = \"PiServerTransportBodyLimitError\";\n\t\tthis.maxBytes = maxBytes;\n\t}\n}\n\nfunction jsonByteLength(value: unknown): number {\n\treturn Buffer.byteLength(JSON.stringify(value), \"utf-8\");\n}\n\nexport function getMaxRequestBytes(): number {\n\tconst raw = process.env.PI_CLIENT_MAX_REQUEST_KB;\n\tif (raw === undefined || raw === \"\") return DEFAULT_MAX_REQUEST_KB * 1024;\n\n\tconst value = Number(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"PI_CLIENT_MAX_REQUEST_KB must be a positive number\");\n\t}\n\treturn Math.floor(value * 1024);\n}\n\nfunction makeHeaders(authToken: string): Record<string, string> {\n\treturn {\n\t\t\"Content-Type\": \"application/json\",\n\t\t...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n\t};\n}\n\nfunction sha256(value: string | Uint8Array): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction isTransientChunkResponse(status: number): boolean {\n\treturn status === 408 || status === 425 || status === 429 || status >= 500;\n}\n\nfunction waitForChunkRetry(delayMs: number, signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return Promise.reject(signal.reason);\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, delayMs);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\treject(signal?.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\"));\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isChunkAckBody(value: unknown): value is ChunkAckBody {\n\treturn (\n\t\tisRecord(value) && \"received\" in value && \"requestId\" in value && \"chunkIndex\" in value && \"totalChunks\" in value\n\t);\n}\n\nfunction getResponseNoProgressTimeoutMs(): number {\n\tconst raw = process.env.PI_SERVER_RESPONSE_NO_PROGRESS_TIMEOUT_MS;\n\tconst value = raw === undefined ? DEFAULT_RESPONSE_NO_PROGRESS_TIMEOUT_MS : Number(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"PI_SERVER_RESPONSE_NO_PROGRESS_TIMEOUT_MS must be positive finite milliseconds\");\n\t}\n\treturn value;\n}\n\nfunction createBodyNoProgressState(): BodyNoProgressState {\n\tconst timeoutMs = getResponseNoProgressTimeoutMs();\n\treturn { timeoutMs, deadlineMs: Date.now() + timeoutMs };\n}\n\nasync function readPiServerBodyChunk(\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tstate: BodyNoProgressState,\n): Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>> {\n\twhile (true) {\n\t\tconst remainingMs = state.deadlineMs - Date.now();\n\t\tif (remainingMs <= 0) {\n\t\t\tthrow new PiServerTransportBodyNoProgressError(state.timeoutMs);\n\t\t}\n\t\tconst result = await new Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>>(\n\t\t\t(resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treject(new PiServerTransportBodyNoProgressError(state.timeoutMs));\n\t\t\t\t}, remainingMs);\n\t\t\t\ttimeout.unref();\n\t\t\t\tvoid reader.read().then(\n\t\t\t\t\t(value) => {\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tresolve(value);\n\t\t\t\t\t},\n\t\t\t\t\t(error: unknown) => {\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t\tif (result.done || result.value.byteLength > 0) {\n\t\t\tif (!result.done) state.deadlineMs = Date.now() + state.timeoutMs;\n\t\t\treturn result;\n\t\t}\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tsetTimeout(resolve, 0);\n\t\t});\n\t}\n}\n\nexport async function readPiServerResponseText(\n\tresponse: Response,\n\tmaxBytes = Number.POSITIVE_INFINITY,\n): Promise<string> {\n\tif (\n\t\t(maxBytes !== Number.POSITIVE_INFINITY && (!Number.isSafeInteger(maxBytes) || maxBytes <= 0)) ||\n\t\tmaxBytes === Number.NEGATIVE_INFINITY\n\t) {\n\t\tthrow new Error(\"pi-server response body limit must be positive safe-integer bytes or Infinity\");\n\t}\n\tif (!response.body) throw new Error(\"pi-server response body was missing\");\n\tconst reader = response.body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst noProgress = createBodyNoProgressState();\n\tlet body = \"\";\n\tlet bodyBytes = 0;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst result = await readPiServerBodyChunk(reader, noProgress);\n\t\t\tif (result.done) {\n\t\t\t\tbody += decoder.decode();\n\t\t\t\treturn body;\n\t\t\t}\n\t\t\tbodyBytes += result.value.byteLength;\n\t\t\tif (bodyBytes > maxBytes) {\n\t\t\t\tthrow new PiServerTransportBodyLimitError(maxBytes);\n\t\t\t}\n\t\t\tbody += decoder.decode(result.value, { stream: true });\n\t\t}\n\t} catch (error) {\n\t\tvoid reader.cancel().catch(() => undefined);\n\t\tthrow error;\n\t}\n}\n\nexport async function readPiServerResponseJson(\n\tresponse: Response,\n\tmaxBytes = Number.POSITIVE_INFINITY,\n): Promise<unknown> {\n\treturn JSON.parse(await readPiServerResponseText(response, maxBytes)) as unknown;\n}\n\nfunction rebuildResponse(response: Response, body: ConstructorParameters<typeof Response>[0]): Response {\n\treturn new Response(body, {\n\t\tstatus: response.status,\n\t\tstatusText: response.statusText,\n\t\theaders: response.headers,\n\t});\n}\n\nasync function discardResponse(response: Response | undefined): Promise<void> {\n\tif (!response?.body || response.bodyUsed || response.body.locked) return;\n\ttry {\n\t\tawait response.body.cancel();\n\t} catch {\n\t\t// The response is already unusable and must not replace the selected final response.\n\t}\n}\n\nasync function inspectLegacyChunkAck(\n\tresponse: Response,\n\trequestId: string,\n\tchunkIndex: number,\n\ttotalChunks: number,\n): Promise<ChunkResponseInspection> {\n\tconst contentLength = Number(response.headers.get(\"Content-Length\"));\n\tif (Number.isFinite(contentLength) && contentLength > LEGACY_CHUNK_ACK_MAX_BYTES) {\n\t\treturn { acknowledged: false, response };\n\t}\n\tif (!response.body) return { acknowledged: false, response };\n\tconst reader = response.body.getReader();\n\tconst noProgress = createBodyNoProgressState();\n\tconst chunks: Uint8Array[] = [];\n\tlet bodyBytes = 0;\n\ttry {\n\t\twhile (true) {\n\t\t\tconst result = await readPiServerBodyChunk(reader, noProgress);\n\t\t\tif (result.done) break;\n\t\t\tchunks.push(result.value);\n\t\t\tbodyBytes += result.value.byteLength;\n\t\t\tif (bodyBytes > LEGACY_CHUNK_ACK_MAX_BYTES) {\n\t\t\t\tlet prefixIndex = 0;\n\t\t\t\tconst rebuiltBody = new ReadableStream<Uint8Array>({\n\t\t\t\t\tasync pull(controller) {\n\t\t\t\t\t\tif (prefixIndex < chunks.length) {\n\t\t\t\t\t\t\tconst prefix = chunks[prefixIndex];\n\t\t\t\t\t\t\tchunks[prefixIndex] = new Uint8Array();\n\t\t\t\t\t\t\tprefixIndex++;\n\t\t\t\t\t\t\tcontroller.enqueue(prefix);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst next = await readPiServerBodyChunk(reader, noProgress);\n\t\t\t\t\t\t\tif (next.done) {\n\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontroller.enqueue(next.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\t\tvoid reader.cancel(error).catch(() => undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tcancel(reason) {\n\t\t\t\t\t\treturn reader.cancel(reason);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn { acknowledged: false, response: rebuildResponse(response, rebuiltBody) };\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tvoid reader.cancel().catch(() => undefined);\n\t\tthrow error;\n\t}\n\n\tconst encoded = Buffer.concat(\n\t\tchunks.map((chunk) => Buffer.from(chunk)),\n\t\tbodyBytes,\n\t);\n\tconst rebuilt = rebuildResponse(response, encoded);\n\ttry {\n\t\tconst body = JSON.parse(encoded.toString(\"utf-8\")) as unknown;\n\t\tconst acknowledged =\n\t\t\tisChunkAckBody(body) &&\n\t\t\tbody.received === true &&\n\t\t\tbody.requestId === requestId &&\n\t\t\tbody.chunkIndex === chunkIndex &&\n\t\t\tbody.totalChunks === totalChunks;\n\t\treturn acknowledged ? { acknowledged: true } : { acknowledged: false, response: rebuilt };\n\t} catch {\n\t\treturn { acknowledged: false, response: rebuilt };\n\t}\n}\n\nasync function inspectChunkResponse(\n\tresponse: Response,\n\trequestId: string,\n\tchunkIndex: number,\n\ttotalChunks: number,\n): Promise<ChunkResponseInspection> {\n\tconst marker = response.headers.get(PI_SERVER_CHUNK_ACK_HEADER);\n\tif (marker === PI_SERVER_CHUNK_FINAL_VALUE) {\n\t\treturn { acknowledged: false, response };\n\t}\n\tif (marker === PI_SERVER_CHUNK_ACK_VALUE) {\n\t\tif (!response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\tawait discardResponse(response);\n\t\t\tthrow new PiServerChunkAckProtocolError(\"pi-server chunk acknowledgement must use application/json\");\n\t\t}\n\t\tconst text = await readPiServerResponseText(response, LEGACY_CHUNK_ACK_MAX_BYTES);\n\t\tlet body: unknown;\n\t\ttry {\n\t\t\tbody = JSON.parse(text) as unknown;\n\t\t} catch {\n\t\t\tthrow new PiServerChunkAckProtocolError(\"pi-server chunk acknowledgement was not valid JSON\");\n\t\t}\n\t\tif (\n\t\t\t!isChunkAckBody(body) ||\n\t\t\tbody.received !== true ||\n\t\t\tbody.requestId !== requestId ||\n\t\t\tbody.chunkIndex !== chunkIndex ||\n\t\t\tbody.totalChunks !== totalChunks\n\t\t) {\n\t\t\tthrow new PiServerChunkAckProtocolError(\"pi-server chunk acknowledgement did not match its request envelope\");\n\t\t}\n\t\treturn { acknowledged: true };\n\t}\n\tif (marker !== null) {\n\t\tawait discardResponse(response);\n\t\tthrow new PiServerChunkAckProtocolError(\n\t\t\t`pi-server returned unsupported ${PI_SERVER_CHUNK_ACK_HEADER} value: ${marker}`,\n\t\t);\n\t}\n\tif (!response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\treturn { acknowledged: false, response };\n\t}\n\treturn inspectLegacyChunkAck(response, requestId, chunkIndex, totalChunks);\n}\n\nfunction getRawChunkLayout(\n\ttarget: string,\n\trequestId: string,\n\trawBodyBytes: number,\n\tmaxBytes: number,\n): { rawChunkBytes: number; totalChunks: number } {\n\tlet totalChunks = 1;\n\twhile (true) {\n\t\tconst emptyEnvelopeBytes = jsonByteLength({\n\t\t\trequestId,\n\t\t\ttarget,\n\t\t\tchunkIndex: totalChunks - 1,\n\t\t\ttotalChunks,\n\t\t\tsha256: \"0\".repeat(64),\n\t\t\tchunk: \"\",\n\t\t\tencoding: PI_SERVER_CHUNK_SEGMENT_ENCODING,\n\t\t\trawTotalBytes: rawBodyBytes,\n\t\t\t// Using the total body size here is conservative because every\n\t\t\t// derived chunk size is no larger and therefore has no more digits.\n\t\t\trawChunkBytes: rawBodyBytes,\n\t\t} satisfies ChunkBody);\n\t\tconst encodedChunkBytes = Math.floor((maxBytes - emptyEnvelopeBytes) / 4) * 4;\n\t\tconst rawChunkBytes = Math.floor(encodedChunkBytes / 4) * 3;\n\t\tif (rawChunkBytes <= 0) {\n\t\t\tthrow new Error(\"PI_CLIENT_MAX_REQUEST_KB is too small for pi-server chunk envelopes\");\n\t\t}\n\t\tconst nextTotalChunks = Math.ceil(rawBodyBytes / rawChunkBytes);\n\t\tif (nextTotalChunks > CHUNK_MAX_TOTAL_CHUNKS) {\n\t\t\tthrow new Error(`pi-server chunk request exceeds the ${CHUNK_MAX_TOTAL_CHUNKS}-chunk protocol limit`);\n\t\t}\n\t\tif (nextTotalChunks === totalChunks) {\n\t\t\treturn { rawChunkBytes, totalChunks };\n\t\t}\n\t\tif (nextTotalChunks < totalChunks) {\n\t\t\tthrow new Error(\"pi-server chunk layout did not converge monotonically\");\n\t\t}\n\t\ttotalChunks = nextTotalChunks;\n\t}\n}\n\nexport class ChunkRequest {\n\toptions: PiServerRequestOptions;\n\treadonly #chunkRequestMemos = new Map<string, ChunkRequestMemo>();\n\treadonly #maxChunkRequestMemos: number;\n\n\tconstructor(options: PiServerRequestOptions) {\n\t\tconst maxChunkRequestMemos = options.maxChunkRequestMemos ?? DEFAULT_CHUNK_REQUEST_MEMO_LIMIT;\n\t\tif (!Number.isSafeInteger(maxChunkRequestMemos) || maxChunkRequestMemos <= 0) {\n\t\t\tthrow new Error(\"maxChunkRequestMemos must be a positive safe integer\");\n\t\t}\n\t\tthis.options = options;\n\t\tthis.#maxChunkRequestMemos = maxChunkRequestMemos;\n\t}\n\n\tasync getJson(endpoint: string): Promise<Response> {\n\t\treturn this.#fetchWithResponseHeaderTimeout(endpoint, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: makeHeaders(this.options.authToken),\n\t\t});\n\t}\n\n\tasync deleteJson(endpoint: string): Promise<Response> {\n\t\treturn this.#fetchWithResponseHeaderTimeout(endpoint, {\n\t\t\tmethod: \"DELETE\",\n\t\t\theaders: makeHeaders(this.options.authToken),\n\t\t});\n\t}\n\n\tasync postJson(endpoint: string, body: unknown): Promise<Response> {\n\t\tconst rawBody = Buffer.from(JSON.stringify(body), \"utf-8\");\n\t\tconst memoKey = `${endpoint}\\0${sha256(rawBody)}`;\n\t\tlet memo = this.#chunkRequestMemos.get(memoKey);\n\t\tconst maxBytes = memo?.maxBytes ?? getMaxRequestBytes();\n\t\tif (memo === undefined && rawBody.byteLength <= maxBytes) {\n\t\t\treturn this.#postRawJson(endpoint, rawBody.toString(\"utf-8\"));\n\t\t}\n\n\t\tif (memo === undefined) {\n\t\t\tif (this.#chunkRequestMemos.size >= this.#maxChunkRequestMemos) {\n\t\t\t\tthrow new PiServerChunkRequestMemoLimitError(this.#maxChunkRequestMemos);\n\t\t\t}\n\t\t\tmemo = { requestId: randomUUID(), maxBytes };\n\t\t\tthis.#chunkRequestMemos.set(memoKey, memo);\n\t\t}\n\n\t\tconst { requestId } = memo;\n\t\tlet layout: { rawChunkBytes: number; totalChunks: number };\n\t\ttry {\n\t\t\tlayout = getRawChunkLayout(endpoint, requestId, rawBody.byteLength, memo.maxBytes);\n\t\t} catch (error) {\n\t\t\tif (this.#chunkRequestMemos.get(memoKey) === memo) {\n\t\t\t\tthis.#chunkRequestMemos.delete(memoKey);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tlet nextIndex = 0;\n\t\tlet finalResponse: Response | undefined;\n\t\tlet transientFailureResponse: Response | undefined;\n\t\tlet fatalError: unknown;\n\n\t\tconst stopped = () => finalResponse !== undefined || fatalError !== undefined;\n\t\tconst replaceTransientFailureResponse = async (response: Response): Promise<void> => {\n\t\t\tconst previous = transientFailureResponse;\n\t\t\ttransientFailureResponse = response;\n\t\t\tif (previous !== response) await discardResponse(previous);\n\t\t};\n\n\t\tconst uploadChunk = async (index: number): Promise<void> => {\n\t\t\tconst start = index * layout.rawChunkBytes;\n\t\t\tconst chunk = rawBody\n\t\t\t\t.subarray(start, Math.min(start + layout.rawChunkBytes, rawBody.byteLength))\n\t\t\t\t.toString(\"base64\");\n\t\t\tlet lastError: unknown;\n\t\t\tlet lastTransientResponse: Response | undefined;\n\n\t\t\ttry {\n\t\t\t\tfor (let attempt = 0; attempt <= CHUNK_UPLOAD_RETRY_DELAYS_MS.length; attempt++) {\n\t\t\t\t\tif (stopped()) return;\n\t\t\t\t\tif (attempt > 0) {\n\t\t\t\t\t\tawait waitForChunkRetry(CHUNK_UPLOAD_RETRY_DELAYS_MS[attempt - 1], this.options.signal);\n\t\t\t\t\t\tif (stopped()) return;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst chunkBody: ChunkBody = {\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\ttarget: endpoint,\n\t\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\t\ttotalChunks: layout.totalChunks,\n\t\t\t\t\t\tsha256: sha256(chunk),\n\t\t\t\t\t\tchunk,\n\t\t\t\t\t\tencoding: PI_SERVER_CHUNK_SEGMENT_ENCODING,\n\t\t\t\t\t\trawTotalBytes: rawBody.byteLength,\n\t\t\t\t\t\trawChunkBytes: layout.rawChunkBytes,\n\t\t\t\t\t};\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet response = await this.#postRawJson(CHUNK_ENDPOINT, JSON.stringify(chunkBody));\n\t\t\t\t\t\tif (stopped()) {\n\t\t\t\t\t\t\tawait discardResponse(response);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\t\tconst inspection = await inspectChunkResponse(response, requestId, index, layout.totalChunks);\n\t\t\t\t\t\t\tif (inspection.acknowledged) return;\n\t\t\t\t\t\t\tif (!inspection.response) {\n\t\t\t\t\t\t\t\tthrow new PiServerChunkAckProtocolError(\n\t\t\t\t\t\t\t\t\t\"pi-server chunk response inspection lost its response\",\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresponse = inspection.response;\n\t\t\t\t\t\t\tif (stopped()) {\n\t\t\t\t\t\t\t\tawait discardResponse(response);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isTransientChunkResponse(response.status)) {\n\t\t\t\t\t\t\tawait discardResponse(lastTransientResponse);\n\t\t\t\t\t\t\tlastTransientResponse = response;\n\t\t\t\t\t\t\tlastError = new Error(\n\t\t\t\t\t\t\t\t`pi-server chunk ${index + 1}/${layout.totalChunks} returned HTTP ${response.status}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (finalResponse === undefined && fatalError === undefined) {\n\t\t\t\t\t\t\tfinalResponse = response;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait discardResponse(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (this.options.signal?.aborted) {\n\t\t\t\t\t\t\tthrow this.options.signal.reason ?? error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\terror instanceof PiServerChunkAckProtocolError ||\n\t\t\t\t\t\t\terror instanceof PiServerTransportBodyLimitError\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tfatalError = error;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastError = error;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (lastTransientResponse !== undefined) {\n\t\t\t\t\tawait replaceTransientFailureResponse(lastTransientResponse);\n\t\t\t\t\tlastTransientResponse = undefined;\n\t\t\t\t}\n\t\t\t\tif (lastError instanceof Error) {\n\t\t\t\t\tthrow lastError;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`pi-server chunk ${index + 1}/${layout.totalChunks} failed after bounded retries`);\n\t\t\t} finally {\n\t\t\t\tif (stopped()) await discardResponse(lastTransientResponse);\n\t\t\t}\n\t\t};\n\n\t\tconst uploadWorker = async (): Promise<void> => {\n\t\t\twhile (!stopped()) {\n\t\t\t\tconst index = nextIndex;\n\t\t\t\tif (index >= layout.totalChunks) return;\n\t\t\t\tnextIndex++;\n\t\t\t\tawait uploadChunk(index);\n\t\t\t}\n\t\t};\n\n\t\tconst results = await Promise.allSettled(\n\t\t\tArray.from({ length: Math.min(CHUNK_UPLOAD_CONCURRENCY, layout.totalChunks) }, () => uploadWorker()),\n\t\t);\n\n\t\tif (fatalError !== undefined) {\n\t\t\tawait discardResponse(finalResponse);\n\t\t\tawait discardResponse(transientFailureResponse);\n\t\t\tthrow fatalError;\n\t\t}\n\t\tif (this.options.signal?.aborted) {\n\t\t\tawait discardResponse(finalResponse);\n\t\t\tawait discardResponse(transientFailureResponse);\n\t\t\tthrow this.options.signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n\t\t}\n\t\tif (finalResponse !== undefined) {\n\t\t\tawait discardResponse(transientFailureResponse);\n\t\t\tif (this.#chunkRequestMemos.get(memoKey) === memo) {\n\t\t\t\tthis.#chunkRequestMemos.delete(memoKey);\n\t\t\t}\n\t\t\treturn finalResponse;\n\t\t}\n\t\tif (transientFailureResponse !== undefined) {\n\t\t\treturn transientFailureResponse;\n\t\t}\n\t\tfor (const result of results) {\n\t\t\tif (result.status === \"rejected\") {\n\t\t\t\tthrow result.reason;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(\"No final chunk response received from pi-server\");\n\t}\n\n\tasync #postRawJson(endpoint: string, rawJson: string): Promise<Response> {\n\t\treturn this.#fetchWithResponseHeaderTimeout(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: makeHeaders(this.options.authToken),\n\t\t\tbody: rawJson,\n\t\t});\n\t}\n\n\tasync #fetchWithResponseHeaderTimeout(endpoint: string, init: RequestInit): Promise<Response> {\n\t\tconst timeoutMs = this.options.responseHeaderTimeoutMs ?? PI_SERVER_RESPONSE_HEADER_TIMEOUT_MS;\n\t\tif (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n\t\t\tthrow new Error(\"responseHeaderTimeoutMs must be a positive finite number\");\n\t\t}\n\n\t\tconst method = init.method ?? \"GET\";\n\t\tconst timeoutError = new PiServerTransportHeaderTimeoutError(method, endpoint, timeoutMs);\n\t\tconst timeoutController = new AbortController();\n\t\tconst signal = this.options.signal\n\t\t\t? AbortSignal.any([this.options.signal, timeoutController.signal])\n\t\t\t: timeoutController.signal;\n\t\tconst timeout = setTimeout(() => {\n\t\t\ttimeoutController.abort(timeoutError);\n\t\t}, timeoutMs);\n\t\ttimeout.unref();\n\n\t\ttry {\n\t\t\treturn await fetch(`${this.options.serverUrl}${endpoint}`, {\n\t\t\t\t...init,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (timeoutController.signal.aborted && !this.options.signal?.aborted) {\n\t\t\t\tthrow timeoutError;\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pi-server-request.js","sourceRoot":"","sources":["../../src/core/pi-server-request.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash, randomUUID } from \"node:crypto\";\n\nconst DEFAULT_MAX_REQUEST_KB = 512;\nconst CHUNK_ENDPOINT = \"/api/request/chunk\";\nconst CHUNK_UPLOAD_CONCURRENCY = 4;\n\nexport interface PiServerRequestOptions {\n\tserverUrl: string;\n\tauthToken: string;\n\tsignal?: AbortSignal;\n}\n\ninterface ChunkBody {\n\trequestId: string;\n\ttarget: string;\n\tchunkIndex: number;\n\ttotalChunks: number;\n\tsha256: string;\n\tchunk: string;\n}\n\ninterface ChunkAckBody {\n\treceived: unknown;\n\trequestId: unknown;\n\tchunkIndex: unknown;\n\ttotalChunks: unknown;\n}\n\nfunction jsonByteLength(value: unknown): number {\n\treturn Buffer.byteLength(JSON.stringify(value), \"utf-8\");\n}\n\nexport function getMaxRequestBytes(): number {\n\tconst raw = process.env.PI_CLIENT_MAX_REQUEST_KB;\n\tif (raw === undefined || raw === \"\") return DEFAULT_MAX_REQUEST_KB * 1024;\n\n\tconst value = Number(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"PI_CLIENT_MAX_REQUEST_KB must be a positive number\");\n\t}\n\treturn Math.floor(value * 1024);\n}\n\nfunction makeHeaders(authToken: string): Record<string, string> {\n\treturn {\n\t\t\"Content-Type\": \"application/json\",\n\t\t...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n\t};\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isChunkAckBody(value: unknown): value is ChunkAckBody {\n\treturn (\n\t\tisRecord(value) && \"received\" in value && \"requestId\" in value && \"chunkIndex\" in value && \"totalChunks\" in value\n\t);\n}\n\nasync function isChunkAck(\n\tresponse: Response,\n\trequestId: string,\n\tchunkIndex: number,\n\ttotalChunks: number,\n): Promise<boolean> {\n\tif (!response.headers.get(\"Content-Type\")?.includes(\"application/json\")) return false;\n\ttry {\n\t\tconst body = (await response.clone().json()) as unknown;\n\t\treturn (\n\t\t\tisChunkAckBody(body) &&\n\t\t\tbody.received === true &&\n\t\t\tbody.requestId === requestId &&\n\t\t\tbody.chunkIndex === chunkIndex &&\n\t\t\tbody.totalChunks === totalChunks\n\t\t);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction chunkBodyFits(\n\ttarget: string,\n\trequestId: string,\n\tencodedLength: number,\n\tchunkLength: number,\n\tmaxBytes: number,\n): boolean {\n\tconst total = Math.ceil(encodedLength / chunkLength);\n\tconst body: ChunkBody = {\n\t\trequestId,\n\t\ttarget,\n\t\tchunkIndex: Math.max(0, total - 1),\n\t\ttotalChunks: total,\n\t\tsha256: \"0\".repeat(64),\n\t\tchunk: \"x\".repeat(Math.min(chunkLength, encodedLength)),\n\t};\n\treturn jsonByteLength(body) <= maxBytes;\n}\n\nfunction splitEncodedBody(target: string, requestId: string, encoded: string, maxBytes: number): string[] {\n\tif (!chunkBodyFits(target, requestId, encoded.length, 1, maxBytes)) {\n\t\tthrow new Error(\"PI_CLIENT_MAX_REQUEST_KB is too small for pi-server chunk envelopes\");\n\t}\n\n\tlet low = 1;\n\tlet high = encoded.length;\n\tlet best = 1;\n\twhile (low <= high) {\n\t\tconst mid = Math.floor((low + high) / 2);\n\t\tif (chunkBodyFits(target, requestId, encoded.length, mid, maxBytes)) {\n\t\t\tbest = mid;\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\thigh = mid - 1;\n\t\t}\n\t}\n\n\tconst chunks: string[] = [];\n\tfor (let offset = 0; offset < encoded.length; offset += best) {\n\t\tchunks.push(encoded.slice(offset, offset + best));\n\t}\n\treturn chunks;\n}\n\nexport class ChunkRequest {\n\toptions: PiServerRequestOptions;\n\n\tconstructor(options: PiServerRequestOptions) {\n\t\tthis.options = options;\n\t}\n\n\tasync getJson(endpoint: string): Promise<Response> {\n\t\treturn fetch(`${this.options.serverUrl}${endpoint}`, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: makeHeaders(this.options.authToken),\n\t\t\tsignal: this.options.signal,\n\t\t});\n\t}\n\n\tasync postJson(endpoint: string, body: unknown): Promise<Response> {\n\t\tconst rawJson = JSON.stringify(body);\n\t\tconst maxBytes = getMaxRequestBytes();\n\t\tif (Buffer.byteLength(rawJson, \"utf-8\") <= maxBytes) {\n\t\t\treturn this.#postRawJson(endpoint, rawJson);\n\t\t}\n\n\t\tconst requestId = randomUUID();\n\t\tconst encoded = Buffer.from(rawJson, \"utf-8\").toString(\"base64\");\n\t\tconst chunks = splitEncodedBody(endpoint, requestId, encoded, maxBytes);\n\t\tlet nextIndex = 0;\n\t\tlet finalResponse: Response | undefined;\n\t\tlet failureResponse: Response | undefined;\n\n\t\tconst uploadWorker = async (): Promise<void> => {\n\t\t\twhile (nextIndex < chunks.length && finalResponse === undefined && failureResponse === undefined) {\n\t\t\t\tconst index = nextIndex;\n\t\t\t\tnextIndex++;\n\t\t\t\tconst chunk = chunks[index];\n\t\t\t\tconst chunkBody: ChunkBody = {\n\t\t\t\t\trequestId,\n\t\t\t\t\ttarget: endpoint,\n\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\ttotalChunks: chunks.length,\n\t\t\t\t\tsha256: sha256(chunk),\n\t\t\t\t\tchunk,\n\t\t\t\t};\n\t\t\t\tconst response = await this.#postRawJson(CHUNK_ENDPOINT, JSON.stringify(chunkBody));\n\t\t\t\tif (finalResponse !== undefined || failureResponse !== undefined) return;\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tfailureResponse = response;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!(await isChunkAck(response, requestId, index, chunks.length))) {\n\t\t\t\t\tfinalResponse = response;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tawait Promise.all(\n\t\t\tArray.from({ length: Math.min(CHUNK_UPLOAD_CONCURRENCY, chunks.length) }, () => uploadWorker()),\n\t\t);\n\n\t\tif (failureResponse) return failureResponse;\n\t\tif (finalResponse) return finalResponse;\n\n\t\tthrow new Error(\"No final chunk response received from pi-server\");\n\t}\n\n\tasync #postRawJson(endpoint: string, rawJson: string): Promise<Response> {\n\t\treturn fetch(`${this.options.serverUrl}${endpoint}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: makeHeaders(this.options.authToken),\n\t\t\tbody: rawJson,\n\t\t\tsignal: this.options.signal,\n\t\t});\n\t}\n}\n"]}
|
package/dist/core/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"AAEA,OAAO,EAKN,KAAK,aAAa,EAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAsB,KAAK,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,8BAA8B,CAAC;AAG1G,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,KAAK,EAAmB,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGtH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAgC,KAAK,oBAAoB,EAAkB,MAAM,uBAAuB,CAAC;AAGhH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAwB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EACN,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,eAAe,EAEf,qBAAqB,EACrB,MAAM,kBAAkB,CAAC;AAO1B,MAAM,WAAW,yBAAyB;IACzC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,oGAAoG;IACpG,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,iEAAiE;IACjE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gEAAgE;IAChE,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,CAAC,CAAC;IAE3E;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gEAAgE;IAChE,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,oEAAoE;IACpE,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,uEAAuE;IACvE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACxC,0BAA0B;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,mEAAmE;IACnE,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAID,cAAc,4BAA4B,CAAC;AAC3C,YAAY,EACX,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACd,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACN,qBAAqB,EAErB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,YAAY,GACZ,CAAC;AAYF,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,oBAAoB,CAAC;IAClC,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CACvC,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,OAAO,EAAE,GACxB,mBAAmB,CAqBrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA+RnH","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport {\n\tAgent,\n\ttype AgentMessage,\n\ttype StreamFn,\n\tsetDefaultStreamFn,\n\ttype ThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, type Message, type Model, streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport { type PiServerHistorySnapshot, type PiServerTreeSnapshot, streamPiServer } from \"./pi-server-client.ts\";\nimport { getPiServerRunStatePath } from \"./pi-server-run-state.ts\";\nimport { mergeProviderAttributionHeaders } from \"./provider-attribution.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport { DefaultResourceLoader } from \"./resource-loader.ts\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { time } from \"./timings.ts\";\nimport {\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype ToolName,\n\twithFileMutationQueue,\n} from \"./tools/index.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn. Agent core remains\n// provider-agnostic and does not import pi-ai/compat itself.\nsetDefaultStreamFn(streamSimple);\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Canonical model/auth runtime. Defaults to a runtime using agentDir/auth.json and models.json. */\n\tmodelRuntime?: ModelRuntime;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (read, bash, edit, write)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, pi enables the default built-in tools (read, bash, edit, write)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Optional denylist of tool names to disable. Applies after `tools` when both are provided. */\n\texcludeTools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Whether to generate a display name with an extra provider request after the first turn. */\n\tautoSessionName?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport * from \"./agent-session-runtime.ts\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tInlineExtension,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nexport type { PromptTemplate } from \"./prompt-templates.ts\";\nexport type { Skill } from \"./skills.ts\";\nexport type { Tool } from \"./tools/index.ts\";\n\nexport {\n\twithFileMutationQueue,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction messagesEqual(left: Message[], right: Message[]): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport interface PiServerContextSync {\n\tsessionTree: PiServerTreeSnapshot;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n}\n\nexport function buildPiServerContextSync(\n\tsessionManager: SessionManager,\n\tcontextMessages: Message[],\n): PiServerContextSync {\n\tconst entries = sessionManager.getEntries();\n\tconst localContextMessages = convertToLlm(sessionManager.buildSessionContext().messages);\n\tif (messagesEqual(localContextMessages, contextMessages)) {\n\t\treturn { sessionTree: { entries, leafId: sessionManager.getLeafId() } };\n\t}\n\n\tconst hasLocalPrefix =\n\t\tlocalContextMessages.length <= contextMessages.length &&\n\t\tmessagesEqual(localContextMessages, contextMessages.slice(0, localContextMessages.length));\n\tif (hasLocalPrefix) {\n\t\treturn {\n\t\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\t\tephemeralMessages: contextMessages.slice(localContextMessages.length),\n\t\t};\n\t}\n\n\treturn {\n\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\tcontextOverlay: contextMessages,\n\t};\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@earendil-works/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir));\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRuntime.getModel(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && modelRuntime.hasConfiguredAuth(restoredModel.provider)) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst allowedToolNames = options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\tconst excludedToolNames = options.excludeTools;\n\tconst excludedToolNameSet = excludedToolNames ? new Set(excludedToolNames) : undefined;\n\tconst initialActiveToolNames: string[] = (\n\t\toptions.tools ? [...options.tools] : options.noTools ? [] : defaultActiveToolNames\n\t).filter((name) => !excludedToolNameSet?.has(name));\n\n\tlet agent: Agent;\n\tlet agentSession: AgentSession | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tconst streamWithPiServerRunMode =\n\t\t(runMode: \"main-durable\" | \"auxiliary-transient\"): StreamFn =>\n\t\tasync (model, context, options) => {\n\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\tconst timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\toptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\tconst activeAgentSession = agentSession;\n\t\t\tconst piServerContext =\n\t\t\t\trunMode === \"main-durable\" && activeAgentSession\n\t\t\t\t\t? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages as Message[])\n\t\t\t\t\t: undefined;\n\t\t\tconst mainSessionId = sessionManager.getSessionId();\n\t\t\tconst piServerSessionId = runMode === \"main-durable\" ? mainSessionId : (options?.sessionId ?? randomUUID());\n\t\t\tif (runMode === \"auxiliary-transient\" && piServerSessionId === mainSessionId) {\n\t\t\t\tthrow new Error(\"Auxiliary provider streams must use a session id independent from the main session\");\n\t\t\t}\n\t\t\tconst piServerSessionFile =\n\t\t\t\trunMode === \"main-durable\" ? activeAgentSession?.sessionManager.getSessionFile() : undefined;\n\t\t\tconst commonOptions = {\n\t\t\t\t...options,\n\t\t\t\tsessionId: piServerSessionId,\n\t\t\t\ttimeoutMs,\n\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t};\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\") {\n\t\t\t\tconst auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });\n\t\t\t\tif (!auth) {\n\t\t\t\t\tthrow new Error(`Provider is not configured: ${model.provider}`);\n\t\t\t\t}\n\t\t\t\tlet headers = mergeProviderAttributionHeaders(\n\t\t\t\t\tmodel,\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\tpiServerSessionId,\n\t\t\t\t\tauth.auth.headers,\n\t\t\t\t\toptions?.headers,\n\t\t\t\t);\n\t\t\t\tif (headerRunner?.hasHandlers(\"before_provider_headers\")) {\n\t\t\t\t\theaders = await headerRunner.emitBeforeProviderHeaders(headers ?? {});\n\t\t\t\t}\n\t\t\t\tconst requestModel = auth.auth.baseUrl ? { ...model, baseUrl: auth.auth.baseUrl } : model;\n\t\t\t\treturn streamPiServer(requestModel, context, {\n\t\t\t\t\t...commonOptions,\n\t\t\t\t\trunMode,\n\t\t\t\t\tsessionTree: piServerContext?.sessionTree,\n\t\t\t\t\tephemeralMessages: piServerContext?.ephemeralMessages,\n\t\t\t\t\tcontextOverlay: piServerContext?.contextOverlay,\n\t\t\t\t\tpiServerRunStatePath: piServerSessionFile ? getPiServerRunStatePath(piServerSessionFile) : undefined,\n\t\t\t\t\tonHistoryReconciled:\n\t\t\t\t\t\trunMode === \"main-durable\" && activeAgentSession\n\t\t\t\t\t\t\t? (snapshot: PiServerHistorySnapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tapiKey: auth.auth.apiKey,\n\t\t\t\t\tenv: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,\n\t\t\t\t\theaders,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn modelRuntime.streamSimple(model, context, {\n\t\t\t\t...commonOptions,\n\t\t\t\ttransformHeaders: async (requestHeaders) => {\n\t\t\t\t\tconst headers = mergeProviderAttributionHeaders(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\tpiServerSessionId,\n\t\t\t\t\t\trequestHeaders,\n\t\t\t\t\t);\n\t\t\t\t\treturn headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t\t? headerRunner.emitBeforeProviderHeaders(headers ?? {})\n\t\t\t\t\t\t: (headers ?? {});\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\tconst mainStreamFunction = streamWithPiServerRunMode(\"main-durable\");\n\tconst auxiliaryStreamFunction = streamWithPiServerRunMode(\"auxiliary-transient\");\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: mainStreamFunction,\n\t\tonPayload: async (payload, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.state.messages = existingSession.messages;\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRuntime,\n\t\tinitialActiveToolNames,\n\t\tallowedToolNames,\n\t\texcludedToolNames,\n\t\textensionRunnerRef,\n\t\tauxiliaryStreamFunction: process.env.PI_SERVER_MODE === \"true\" ? auxiliaryStreamFunction : undefined,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tautoSessionName: options.autoSessionName,\n\t});\n\tagentSession = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, setDefaultStreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, type Message, type Model, streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport { type PiServerHistorySnapshot, type PiServerTreeSnapshot, streamPiServer } from \"./pi-server-client.ts\";\nimport { mergeProviderAttributionHeaders } from \"./provider-attribution.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport { DefaultResourceLoader } from \"./resource-loader.ts\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { time } from \"./timings.ts\";\nimport {\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype ToolName,\n\twithFileMutationQueue,\n} from \"./tools/index.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn. Agent core remains\n// provider-agnostic and does not import pi-ai/compat itself.\nsetDefaultStreamFn(streamSimple);\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Canonical model/auth runtime. Defaults to a runtime using agentDir/auth.json and models.json. */\n\tmodelRuntime?: ModelRuntime;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (read, bash, edit, write)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, pi enables the default built-in tools (read, bash, edit, write)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Optional denylist of tool names to disable. Applies after `tools` when both are provided. */\n\texcludeTools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Whether to generate a display name with an extra provider request after the first turn. */\n\tautoSessionName?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport * from \"./agent-session-runtime.ts\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tInlineExtension,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nexport type { PromptTemplate } from \"./prompt-templates.ts\";\nexport type { Skill } from \"./skills.ts\";\nexport type { Tool } from \"./tools/index.ts\";\n\nexport {\n\twithFileMutationQueue,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction messagesEqual(left: Message[], right: Message[]): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport interface PiServerContextSync {\n\tsessionTree: PiServerTreeSnapshot;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n}\n\nexport function buildPiServerContextSync(\n\tsessionManager: SessionManager,\n\tcontextMessages: Message[],\n): PiServerContextSync {\n\tconst entries = sessionManager.getEntries();\n\tconst localContextMessages = convertToLlm(sessionManager.buildSessionContext().messages);\n\tif (messagesEqual(localContextMessages, contextMessages)) {\n\t\treturn { sessionTree: { entries, leafId: sessionManager.getLeafId() } };\n\t}\n\n\tconst hasLocalPrefix =\n\t\tlocalContextMessages.length <= contextMessages.length &&\n\t\tmessagesEqual(localContextMessages, contextMessages.slice(0, localContextMessages.length));\n\tif (hasLocalPrefix) {\n\t\treturn {\n\t\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\t\tephemeralMessages: contextMessages.slice(localContextMessages.length),\n\t\t};\n\t}\n\n\treturn {\n\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\tcontextOverlay: contextMessages,\n\t};\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@earendil-works/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir));\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRuntime.getModel(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && modelRuntime.hasConfiguredAuth(restoredModel.provider)) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst allowedToolNames = options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\tconst excludedToolNames = options.excludeTools;\n\tconst excludedToolNameSet = excludedToolNames ? new Set(excludedToolNames) : undefined;\n\tconst initialActiveToolNames: string[] = (\n\t\toptions.tools ? [...options.tools] : options.noTools ? [] : defaultActiveToolNames\n\t).filter((name) => !excludedToolNameSet?.has(name));\n\n\tlet agent: Agent;\n\tlet agentSession: AgentSession | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: async (model, context, options) => {\n\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\tconst timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\toptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\tconst activeAgentSession = agentSession;\n\t\t\tconst piServerContext = activeAgentSession\n\t\t\t\t? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages as Message[])\n\t\t\t\t: undefined;\n\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\tconst commonOptions = {\n\t\t\t\t...options,\n\t\t\t\ttimeoutMs,\n\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t};\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\") {\n\t\t\t\tconst auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });\n\t\t\t\tif (!auth) {\n\t\t\t\t\tthrow new Error(`Provider is not configured: ${model.provider}`);\n\t\t\t\t}\n\t\t\t\tlet headers = mergeProviderAttributionHeaders(\n\t\t\t\t\tmodel,\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\toptions?.sessionId,\n\t\t\t\t\tauth.auth.headers,\n\t\t\t\t\toptions?.headers,\n\t\t\t\t);\n\t\t\t\tif (headerRunner?.hasHandlers(\"before_provider_headers\")) {\n\t\t\t\t\theaders = await headerRunner.emitBeforeProviderHeaders(headers ?? {});\n\t\t\t\t}\n\t\t\t\treturn streamPiServer(model, context, {\n\t\t\t\t\t...commonOptions,\n\t\t\t\t\tsessionTree: piServerContext?.sessionTree,\n\t\t\t\t\tephemeralMessages: piServerContext?.ephemeralMessages,\n\t\t\t\t\tcontextOverlay: piServerContext?.contextOverlay,\n\t\t\t\t\tonHistoryReconciled: activeAgentSession\n\t\t\t\t\t\t? (snapshot: PiServerHistorySnapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tapiKey: auth.auth.apiKey,\n\t\t\t\t\tenv: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,\n\t\t\t\t\theaders,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn modelRuntime.streamSimple(model, context, {\n\t\t\t\t...commonOptions,\n\t\t\t\ttransformHeaders: async (requestHeaders) => {\n\t\t\t\t\tconst headers = mergeProviderAttributionHeaders(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\toptions?.sessionId,\n\t\t\t\t\t\trequestHeaders,\n\t\t\t\t\t);\n\t\t\t\t\treturn headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t\t? headerRunner.emitBeforeProviderHeaders(headers ?? {})\n\t\t\t\t\t\t: (headers ?? {});\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonPayload: async (payload, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.state.messages = existingSession.messages;\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRuntime,\n\t\tinitialActiveToolNames,\n\t\tallowedToolNames,\n\t\texcludedToolNames,\n\t\textensionRunnerRef,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tautoSessionName: options.autoSessionName,\n\t});\n\tagentSession = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|
package/dist/core/sdk.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
1
|
import { join } from "node:path";
|
|
3
|
-
import { Agent, setDefaultStreamFn
|
|
2
|
+
import { Agent, setDefaultStreamFn } from "@earendil-works/pi-agent-core";
|
|
4
3
|
import { clampThinkingLevel, streamSimple } from "@earendil-works/pi-ai/compat";
|
|
5
4
|
import { getAgentDir } from "../config.js";
|
|
6
5
|
import { resolvePath } from "../utils/paths.js";
|
|
@@ -11,7 +10,6 @@ import { convertToLlm } from "./messages.js";
|
|
|
11
10
|
import { findInitialModel } from "./model-resolver.js";
|
|
12
11
|
import { ModelRuntime } from "./model-runtime.js";
|
|
13
12
|
import { streamPiServer } from "./pi-server-client.js";
|
|
14
|
-
import { getPiServerRunStatePath } from "./pi-server-run-state.js";
|
|
15
13
|
import { mergeProviderAttributionHeaders } from "./provider-attribution.js";
|
|
16
14
|
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
17
15
|
import { getDefaultSessionDir, SessionManager } from "./session-manager.js";
|
|
@@ -192,70 +190,6 @@ export async function createAgentSession(options = {}) {
|
|
|
192
190
|
});
|
|
193
191
|
};
|
|
194
192
|
const extensionRunnerRef = {};
|
|
195
|
-
const streamWithPiServerRunMode = (runMode) => async (model, context, options) => {
|
|
196
|
-
const headerRunner = extensionRunnerRef.current;
|
|
197
|
-
const providerRetrySettings = settingsManager.getProviderRetrySettings();
|
|
198
|
-
const httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();
|
|
199
|
-
// SDKs treat timeout=0 as 0ms (immediate timeout), not "no timeout".
|
|
200
|
-
// Use max int32 to effectively disable the timeout.
|
|
201
|
-
const effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;
|
|
202
|
-
const timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;
|
|
203
|
-
const websocketConnectTimeoutMs = options?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();
|
|
204
|
-
const activeAgentSession = agentSession;
|
|
205
|
-
const piServerContext = runMode === "main-durable" && activeAgentSession
|
|
206
|
-
? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages)
|
|
207
|
-
: undefined;
|
|
208
|
-
const mainSessionId = sessionManager.getSessionId();
|
|
209
|
-
const piServerSessionId = runMode === "main-durable" ? mainSessionId : (options?.sessionId ?? randomUUID());
|
|
210
|
-
if (runMode === "auxiliary-transient" && piServerSessionId === mainSessionId) {
|
|
211
|
-
throw new Error("Auxiliary provider streams must use a session id independent from the main session");
|
|
212
|
-
}
|
|
213
|
-
const piServerSessionFile = runMode === "main-durable" ? activeAgentSession?.sessionManager.getSessionFile() : undefined;
|
|
214
|
-
const commonOptions = {
|
|
215
|
-
...options,
|
|
216
|
-
sessionId: piServerSessionId,
|
|
217
|
-
timeoutMs,
|
|
218
|
-
websocketConnectTimeoutMs,
|
|
219
|
-
maxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,
|
|
220
|
-
maxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,
|
|
221
|
-
};
|
|
222
|
-
if (process.env.PI_SERVER_MODE === "true") {
|
|
223
|
-
const auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });
|
|
224
|
-
if (!auth) {
|
|
225
|
-
throw new Error(`Provider is not configured: ${model.provider}`);
|
|
226
|
-
}
|
|
227
|
-
let headers = mergeProviderAttributionHeaders(model, settingsManager, piServerSessionId, auth.auth.headers, options?.headers);
|
|
228
|
-
if (headerRunner?.hasHandlers("before_provider_headers")) {
|
|
229
|
-
headers = await headerRunner.emitBeforeProviderHeaders(headers ?? {});
|
|
230
|
-
}
|
|
231
|
-
const requestModel = auth.auth.baseUrl ? { ...model, baseUrl: auth.auth.baseUrl } : model;
|
|
232
|
-
return streamPiServer(requestModel, context, {
|
|
233
|
-
...commonOptions,
|
|
234
|
-
runMode,
|
|
235
|
-
sessionTree: piServerContext?.sessionTree,
|
|
236
|
-
ephemeralMessages: piServerContext?.ephemeralMessages,
|
|
237
|
-
contextOverlay: piServerContext?.contextOverlay,
|
|
238
|
-
piServerRunStatePath: piServerSessionFile ? getPiServerRunStatePath(piServerSessionFile) : undefined,
|
|
239
|
-
onHistoryReconciled: runMode === "main-durable" && activeAgentSession
|
|
240
|
-
? (snapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)
|
|
241
|
-
: undefined,
|
|
242
|
-
apiKey: auth.auth.apiKey,
|
|
243
|
-
env: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,
|
|
244
|
-
headers,
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
return modelRuntime.streamSimple(model, context, {
|
|
248
|
-
...commonOptions,
|
|
249
|
-
transformHeaders: async (requestHeaders) => {
|
|
250
|
-
const headers = mergeProviderAttributionHeaders(model, settingsManager, piServerSessionId, requestHeaders);
|
|
251
|
-
return headerRunner?.hasHandlers("before_provider_headers")
|
|
252
|
-
? headerRunner.emitBeforeProviderHeaders(headers ?? {})
|
|
253
|
-
: (headers ?? {});
|
|
254
|
-
},
|
|
255
|
-
});
|
|
256
|
-
};
|
|
257
|
-
const mainStreamFunction = streamWithPiServerRunMode("main-durable");
|
|
258
|
-
const auxiliaryStreamFunction = streamWithPiServerRunMode("auxiliary-transient");
|
|
259
193
|
agent = new Agent({
|
|
260
194
|
initialState: {
|
|
261
195
|
systemPrompt: "",
|
|
@@ -264,7 +198,58 @@ export async function createAgentSession(options = {}) {
|
|
|
264
198
|
tools: [],
|
|
265
199
|
},
|
|
266
200
|
convertToLlm: convertToLlmWithBlockImages,
|
|
267
|
-
streamFn:
|
|
201
|
+
streamFn: async (model, context, options) => {
|
|
202
|
+
const providerRetrySettings = settingsManager.getProviderRetrySettings();
|
|
203
|
+
const httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();
|
|
204
|
+
// SDKs treat timeout=0 as 0ms (immediate timeout), not "no timeout".
|
|
205
|
+
// Use max int32 to effectively disable the timeout.
|
|
206
|
+
const effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;
|
|
207
|
+
const timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;
|
|
208
|
+
const websocketConnectTimeoutMs = options?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();
|
|
209
|
+
const activeAgentSession = agentSession;
|
|
210
|
+
const piServerContext = activeAgentSession
|
|
211
|
+
? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages)
|
|
212
|
+
: undefined;
|
|
213
|
+
const headerRunner = extensionRunnerRef.current;
|
|
214
|
+
const commonOptions = {
|
|
215
|
+
...options,
|
|
216
|
+
timeoutMs,
|
|
217
|
+
websocketConnectTimeoutMs,
|
|
218
|
+
maxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,
|
|
219
|
+
maxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,
|
|
220
|
+
};
|
|
221
|
+
if (process.env.PI_SERVER_MODE === "true") {
|
|
222
|
+
const auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });
|
|
223
|
+
if (!auth) {
|
|
224
|
+
throw new Error(`Provider is not configured: ${model.provider}`);
|
|
225
|
+
}
|
|
226
|
+
let headers = mergeProviderAttributionHeaders(model, settingsManager, options?.sessionId, auth.auth.headers, options?.headers);
|
|
227
|
+
if (headerRunner?.hasHandlers("before_provider_headers")) {
|
|
228
|
+
headers = await headerRunner.emitBeforeProviderHeaders(headers ?? {});
|
|
229
|
+
}
|
|
230
|
+
return streamPiServer(model, context, {
|
|
231
|
+
...commonOptions,
|
|
232
|
+
sessionTree: piServerContext?.sessionTree,
|
|
233
|
+
ephemeralMessages: piServerContext?.ephemeralMessages,
|
|
234
|
+
contextOverlay: piServerContext?.contextOverlay,
|
|
235
|
+
onHistoryReconciled: activeAgentSession
|
|
236
|
+
? (snapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)
|
|
237
|
+
: undefined,
|
|
238
|
+
apiKey: auth.auth.apiKey,
|
|
239
|
+
env: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,
|
|
240
|
+
headers,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return modelRuntime.streamSimple(model, context, {
|
|
244
|
+
...commonOptions,
|
|
245
|
+
transformHeaders: async (requestHeaders) => {
|
|
246
|
+
const headers = mergeProviderAttributionHeaders(model, settingsManager, options?.sessionId, requestHeaders);
|
|
247
|
+
return headerRunner?.hasHandlers("before_provider_headers")
|
|
248
|
+
? headerRunner.emitBeforeProviderHeaders(headers ?? {})
|
|
249
|
+
: (headers ?? {});
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
},
|
|
268
253
|
onPayload: async (payload, _model) => {
|
|
269
254
|
const runner = extensionRunnerRef.current;
|
|
270
255
|
if (!runner?.hasHandlers("before_provider_request")) {
|
|
@@ -323,7 +308,6 @@ export async function createAgentSession(options = {}) {
|
|
|
323
308
|
allowedToolNames,
|
|
324
309
|
excludedToolNames,
|
|
325
310
|
extensionRunnerRef,
|
|
326
|
-
auxiliaryStreamFunction: process.env.PI_SERVER_MODE === "true" ? auxiliaryStreamFunction : undefined,
|
|
327
311
|
sessionStartEvent: options.sessionStartEvent,
|
|
328
312
|
autoSessionName: options.autoSessionName,
|
|
329
313
|
});
|
package/dist/core/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport {\n\tAgent,\n\ttype AgentMessage,\n\ttype StreamFn,\n\tsetDefaultStreamFn,\n\ttype ThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, type Message, type Model, streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport { type PiServerHistorySnapshot, type PiServerTreeSnapshot, streamPiServer } from \"./pi-server-client.ts\";\nimport { getPiServerRunStatePath } from \"./pi-server-run-state.ts\";\nimport { mergeProviderAttributionHeaders } from \"./provider-attribution.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport { DefaultResourceLoader } from \"./resource-loader.ts\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { time } from \"./timings.ts\";\nimport {\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype ToolName,\n\twithFileMutationQueue,\n} from \"./tools/index.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn. Agent core remains\n// provider-agnostic and does not import pi-ai/compat itself.\nsetDefaultStreamFn(streamSimple);\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Canonical model/auth runtime. Defaults to a runtime using agentDir/auth.json and models.json. */\n\tmodelRuntime?: ModelRuntime;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (read, bash, edit, write)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, pi enables the default built-in tools (read, bash, edit, write)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Optional denylist of tool names to disable. Applies after `tools` when both are provided. */\n\texcludeTools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Whether to generate a display name with an extra provider request after the first turn. */\n\tautoSessionName?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport * from \"./agent-session-runtime.ts\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tInlineExtension,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nexport type { PromptTemplate } from \"./prompt-templates.ts\";\nexport type { Skill } from \"./skills.ts\";\nexport type { Tool } from \"./tools/index.ts\";\n\nexport {\n\twithFileMutationQueue,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction messagesEqual(left: Message[], right: Message[]): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport interface PiServerContextSync {\n\tsessionTree: PiServerTreeSnapshot;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n}\n\nexport function buildPiServerContextSync(\n\tsessionManager: SessionManager,\n\tcontextMessages: Message[],\n): PiServerContextSync {\n\tconst entries = sessionManager.getEntries();\n\tconst localContextMessages = convertToLlm(sessionManager.buildSessionContext().messages);\n\tif (messagesEqual(localContextMessages, contextMessages)) {\n\t\treturn { sessionTree: { entries, leafId: sessionManager.getLeafId() } };\n\t}\n\n\tconst hasLocalPrefix =\n\t\tlocalContextMessages.length <= contextMessages.length &&\n\t\tmessagesEqual(localContextMessages, contextMessages.slice(0, localContextMessages.length));\n\tif (hasLocalPrefix) {\n\t\treturn {\n\t\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\t\tephemeralMessages: contextMessages.slice(localContextMessages.length),\n\t\t};\n\t}\n\n\treturn {\n\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\tcontextOverlay: contextMessages,\n\t};\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@earendil-works/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir));\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRuntime.getModel(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && modelRuntime.hasConfiguredAuth(restoredModel.provider)) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst allowedToolNames = options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\tconst excludedToolNames = options.excludeTools;\n\tconst excludedToolNameSet = excludedToolNames ? new Set(excludedToolNames) : undefined;\n\tconst initialActiveToolNames: string[] = (\n\t\toptions.tools ? [...options.tools] : options.noTools ? [] : defaultActiveToolNames\n\t).filter((name) => !excludedToolNameSet?.has(name));\n\n\tlet agent: Agent;\n\tlet agentSession: AgentSession | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tconst streamWithPiServerRunMode =\n\t\t(runMode: \"main-durable\" | \"auxiliary-transient\"): StreamFn =>\n\t\tasync (model, context, options) => {\n\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\tconst timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\toptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\tconst activeAgentSession = agentSession;\n\t\t\tconst piServerContext =\n\t\t\t\trunMode === \"main-durable\" && activeAgentSession\n\t\t\t\t\t? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages as Message[])\n\t\t\t\t\t: undefined;\n\t\t\tconst mainSessionId = sessionManager.getSessionId();\n\t\t\tconst piServerSessionId = runMode === \"main-durable\" ? mainSessionId : (options?.sessionId ?? randomUUID());\n\t\t\tif (runMode === \"auxiliary-transient\" && piServerSessionId === mainSessionId) {\n\t\t\t\tthrow new Error(\"Auxiliary provider streams must use a session id independent from the main session\");\n\t\t\t}\n\t\t\tconst piServerSessionFile =\n\t\t\t\trunMode === \"main-durable\" ? activeAgentSession?.sessionManager.getSessionFile() : undefined;\n\t\t\tconst commonOptions = {\n\t\t\t\t...options,\n\t\t\t\tsessionId: piServerSessionId,\n\t\t\t\ttimeoutMs,\n\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t};\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\") {\n\t\t\t\tconst auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });\n\t\t\t\tif (!auth) {\n\t\t\t\t\tthrow new Error(`Provider is not configured: ${model.provider}`);\n\t\t\t\t}\n\t\t\t\tlet headers = mergeProviderAttributionHeaders(\n\t\t\t\t\tmodel,\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\tpiServerSessionId,\n\t\t\t\t\tauth.auth.headers,\n\t\t\t\t\toptions?.headers,\n\t\t\t\t);\n\t\t\t\tif (headerRunner?.hasHandlers(\"before_provider_headers\")) {\n\t\t\t\t\theaders = await headerRunner.emitBeforeProviderHeaders(headers ?? {});\n\t\t\t\t}\n\t\t\t\tconst requestModel = auth.auth.baseUrl ? { ...model, baseUrl: auth.auth.baseUrl } : model;\n\t\t\t\treturn streamPiServer(requestModel, context, {\n\t\t\t\t\t...commonOptions,\n\t\t\t\t\trunMode,\n\t\t\t\t\tsessionTree: piServerContext?.sessionTree,\n\t\t\t\t\tephemeralMessages: piServerContext?.ephemeralMessages,\n\t\t\t\t\tcontextOverlay: piServerContext?.contextOverlay,\n\t\t\t\t\tpiServerRunStatePath: piServerSessionFile ? getPiServerRunStatePath(piServerSessionFile) : undefined,\n\t\t\t\t\tonHistoryReconciled:\n\t\t\t\t\t\trunMode === \"main-durable\" && activeAgentSession\n\t\t\t\t\t\t\t? (snapshot: PiServerHistorySnapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tapiKey: auth.auth.apiKey,\n\t\t\t\t\tenv: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,\n\t\t\t\t\theaders,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn modelRuntime.streamSimple(model, context, {\n\t\t\t\t...commonOptions,\n\t\t\t\ttransformHeaders: async (requestHeaders) => {\n\t\t\t\t\tconst headers = mergeProviderAttributionHeaders(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\tpiServerSessionId,\n\t\t\t\t\t\trequestHeaders,\n\t\t\t\t\t);\n\t\t\t\t\treturn headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t\t? headerRunner.emitBeforeProviderHeaders(headers ?? {})\n\t\t\t\t\t\t: (headers ?? {});\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\tconst mainStreamFunction = streamWithPiServerRunMode(\"main-durable\");\n\tconst auxiliaryStreamFunction = streamWithPiServerRunMode(\"auxiliary-transient\");\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: mainStreamFunction,\n\t\tonPayload: async (payload, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.state.messages = existingSession.messages;\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRuntime,\n\t\tinitialActiveToolNames,\n\t\tallowedToolNames,\n\t\texcludedToolNames,\n\t\textensionRunnerRef,\n\t\tauxiliaryStreamFunction: process.env.PI_SERVER_MODE === \"true\" ? auxiliaryStreamFunction : undefined,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tautoSessionName: options.autoSessionName,\n\t});\n\tagentSession = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { Agent, type AgentMessage, setDefaultStreamFn, type ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { clampThinkingLevel, type Message, type Model, streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../config.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ExtensionRunner, LoadExtensionsResult, SessionStartEvent, ToolDefinition } from \"./extensions/index.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { ModelRuntime } from \"./model-runtime.ts\";\nimport { type PiServerHistorySnapshot, type PiServerTreeSnapshot, streamPiServer } from \"./pi-server-client.ts\";\nimport { mergeProviderAttributionHeaders } from \"./provider-attribution.ts\";\nimport type { ResourceLoader } from \"./resource-loader.ts\";\nimport { DefaultResourceLoader } from \"./resource-loader.ts\";\nimport { getDefaultSessionDir, SessionManager } from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { time } from \"./timings.ts\";\nimport {\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype ToolName,\n\twithFileMutationQueue,\n} from \"./tools/index.ts\";\n\n// Preserve the pre-0.81 fallback for extensions that construct Agent instances\n// or invoke low-level agent loops without supplying streamFn. Agent core remains\n// provider-agnostic and does not import pi-ai/compat itself.\nsetDefaultStreamFn(streamSimple);\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Canonical model/auth runtime. Defaults to a runtime using agentDir/auth.json and models.json. */\n\tmodelRuntime?: ModelRuntime;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/**\n\t * Optional default tool suppression mode when no explicit allowlist is provided.\n\t *\n\t * - \"all\": start with no tools enabled\n\t * - \"builtin\": disable the default built-in tools (read, bash, edit, write)\n\t * but keep extension/custom tools enabled\n\t */\n\tnoTools?: \"all\" | \"builtin\";\n\t/**\n\t * Optional allowlist of tool names.\n\t *\n\t * When omitted, pi enables the default built-in tools (read, bash, edit, write)\n\t * and leaves extension/custom tools enabled unless `noTools` changes that default.\n\t * When provided, only the listed tool names are enabled.\n\t */\n\ttools?: string[];\n\t/** Optional denylist of tool names to disable. Applies after `tools` when both are provided. */\n\texcludeTools?: string[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\t/** Session start event metadata for extension runtime startup. */\n\tsessionStartEvent?: SessionStartEvent;\n\t/** Whether to generate a display name with an extra provider request after the first turn. */\n\tautoSessionName?: boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport * from \"./agent-session-runtime.ts\";\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tInlineExtension,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nexport type { PromptTemplate } from \"./prompt-templates.ts\";\nexport type { Skill } from \"./skills.ts\";\nexport type { Tool } from \"./tools/index.ts\";\n\nexport {\n\twithFileMutationQueue,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction messagesEqual(left: Message[], right: Message[]): boolean {\n\treturn JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport interface PiServerContextSync {\n\tsessionTree: PiServerTreeSnapshot;\n\tephemeralMessages?: Message[];\n\tcontextOverlay?: Message[];\n}\n\nexport function buildPiServerContextSync(\n\tsessionManager: SessionManager,\n\tcontextMessages: Message[],\n): PiServerContextSync {\n\tconst entries = sessionManager.getEntries();\n\tconst localContextMessages = convertToLlm(sessionManager.buildSessionContext().messages);\n\tif (messagesEqual(localContextMessages, contextMessages)) {\n\t\treturn { sessionTree: { entries, leafId: sessionManager.getLeafId() } };\n\t}\n\n\tconst hasLocalPrefix =\n\t\tlocalContextMessages.length <= contextMessages.length &&\n\t\tmessagesEqual(localContextMessages, contextMessages.slice(0, localContextMessages.length));\n\tif (hasLocalPrefix) {\n\t\treturn {\n\t\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\t\tephemeralMessages: contextMessages.slice(localContextMessages.length),\n\t\t};\n\t}\n\n\treturn {\n\t\tsessionTree: { entries, leafId: sessionManager.getLeafId() },\n\t\tcontextOverlay: contextMessages,\n\t};\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@earendil-works/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [\"read\", \"bash\"],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());\n\tconst agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd, getDefaultSessionDir(cwd, agentDir));\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRuntime.getModel(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && modelRuntime.hasConfiguredAuth(restoredModel.provider)) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRuntime,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model) {\n\t\tthinkingLevel = \"off\";\n\t} else {\n\t\tthinkingLevel = clampThinkingLevel(model, thinkingLevel) as ThinkingLevel;\n\t}\n\n\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\tconst allowedToolNames = options.tools ?? (options.noTools === \"all\" ? [] : undefined);\n\tconst excludedToolNames = options.excludeTools;\n\tconst excludedToolNameSet = excludedToolNames ? new Set(excludedToolNames) : undefined;\n\tconst initialActiveToolNames: string[] = (\n\t\toptions.tools ? [...options.tools] : options.noTools ? [] : defaultActiveToolNames\n\t).filter((name) => !excludedToolNameSet?.has(name));\n\n\tlet agent: Agent;\n\tlet agentSession: AgentSession | undefined;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tstreamFn: async (model, context, options) => {\n\t\t\tconst providerRetrySettings = settingsManager.getProviderRetrySettings();\n\t\t\tconst httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();\n\t\t\t// SDKs treat timeout=0 as 0ms (immediate timeout), not \"no timeout\".\n\t\t\t// Use max int32 to effectively disable the timeout.\n\t\t\tconst effectiveTimeoutMs = httpIdleTimeoutMs === 0 ? 2147483647 : httpIdleTimeoutMs;\n\t\t\tconst timeoutMs = options?.timeoutMs ?? providerRetrySettings.timeoutMs ?? effectiveTimeoutMs;\n\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\toptions?.websocketConnectTimeoutMs ?? settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\tconst activeAgentSession = agentSession;\n\t\t\tconst piServerContext = activeAgentSession\n\t\t\t\t? buildPiServerContextSync(activeAgentSession.sessionManager, context.messages as Message[])\n\t\t\t\t: undefined;\n\t\t\tconst headerRunner = extensionRunnerRef.current;\n\t\t\tconst commonOptions = {\n\t\t\t\t...options,\n\t\t\t\ttimeoutMs,\n\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t};\n\t\t\tif (process.env.PI_SERVER_MODE === \"true\") {\n\t\t\t\tconst auth = await modelRuntime.getAuth(model, { apiKey: options?.apiKey, env: options?.env });\n\t\t\t\tif (!auth) {\n\t\t\t\t\tthrow new Error(`Provider is not configured: ${model.provider}`);\n\t\t\t\t}\n\t\t\t\tlet headers = mergeProviderAttributionHeaders(\n\t\t\t\t\tmodel,\n\t\t\t\t\tsettingsManager,\n\t\t\t\t\toptions?.sessionId,\n\t\t\t\t\tauth.auth.headers,\n\t\t\t\t\toptions?.headers,\n\t\t\t\t);\n\t\t\t\tif (headerRunner?.hasHandlers(\"before_provider_headers\")) {\n\t\t\t\t\theaders = await headerRunner.emitBeforeProviderHeaders(headers ?? {});\n\t\t\t\t}\n\t\t\t\treturn streamPiServer(model, context, {\n\t\t\t\t\t...commonOptions,\n\t\t\t\t\tsessionTree: piServerContext?.sessionTree,\n\t\t\t\t\tephemeralMessages: piServerContext?.ephemeralMessages,\n\t\t\t\t\tcontextOverlay: piServerContext?.contextOverlay,\n\t\t\t\t\tonHistoryReconciled: activeAgentSession\n\t\t\t\t\t\t? (snapshot: PiServerHistorySnapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tapiKey: auth.auth.apiKey,\n\t\t\t\t\tenv: auth.env || options?.env ? { ...(auth.env ?? {}), ...(options?.env ?? {}) } : undefined,\n\t\t\t\t\theaders,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn modelRuntime.streamSimple(model, context, {\n\t\t\t\t...commonOptions,\n\t\t\t\ttransformHeaders: async (requestHeaders) => {\n\t\t\t\t\tconst headers = mergeProviderAttributionHeaders(\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tsettingsManager,\n\t\t\t\t\t\toptions?.sessionId,\n\t\t\t\t\t\trequestHeaders,\n\t\t\t\t\t);\n\t\t\t\t\treturn headerRunner?.hasHandlers(\"before_provider_headers\")\n\t\t\t\t\t\t? headerRunner.emitBeforeProviderHeaders(headers ?? {})\n\t\t\t\t\t\t: (headers ?? {});\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonPayload: async (payload, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t},\n\t\tonResponse: async (response, _model) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait runner.emit({\n\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders: response.headers,\n\t\t\t});\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.state.messages = existingSession.messages;\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRuntime,\n\t\tinitialActiveToolNames,\n\t\tallowedToolNames,\n\t\texcludedToolNames,\n\t\textensionRunnerRef,\n\t\tsessionStartEvent: options.sessionStartEvent,\n\t\tautoSessionName: options.autoSessionName,\n\t});\n\tagentSession = session;\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
|