@averyyy/pi-coding-agent 0.82.1-piclient.4 → 0.82.1-piclient.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -2
- package/dist/core/agent-session.d.ts +0 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -27
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/model-runtime.d.ts +0 -7
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +0 -66
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/pi-server-client.d.ts +1 -3
- package/dist/core/pi-server-client.d.ts.map +1 -1
- package/dist/core/pi-server-client.js +301 -55
- package/dist/core/pi-server-client.js.map +1 -1
- package/dist/core/pi-server-compact-state.d.ts +1 -1
- package/dist/core/pi-server-compact-state.d.ts.map +1 -1
- package/dist/core/pi-server-compact-state.js +2 -1
- package/dist/core/pi-server-compact-state.js.map +1 -1
- package/dist/core/pi-server-run-state.d.ts +2 -1
- package/dist/core/pi-server-run-state.d.ts.map +1 -1
- package/dist/core/pi-server-run-state.js +5 -3
- package/dist/core/pi-server-run-state.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +0 -5
- package/dist/core/sdk.js.map +1 -1
- package/package.json +4 -4
- package/dist/core/pi-server-provider-execution.d.ts +0 -19
- package/dist/core/pi-server-provider-execution.d.ts.map +0 -1
- package/dist/core/pi-server-provider-execution.js +0 -43
- package/dist/core/pi-server-provider-execution.js.map +0 -1
- package/dist/core/provider-execution-contract.d.ts +0 -36
- package/dist/core/provider-execution-contract.d.ts.map +0 -1
- package/dist/core/provider-execution-contract.js +0 -30
- package/dist/core/provider-execution-contract.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-server-run-state.js","sourceRoot":"","sources":["../../src/core/pi-server-run-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash } from \"node:crypto\";\nimport { closeSync, existsSync, fsyncSync, openSync, readFileSync, truncateSync, writeSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst RUN_STATE_VERSION = 1;\nconst RUN_STATE_MAX_BYTES = 8 * 1024 * 1024;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\nconst IDENTIFIER_MAX_CHARS = 1024;\n\ninterface PiServerRunStateBase {\n\tversion: typeof RUN_STATE_VERSION;\n\tsequence: number;\n\ttimestamp: number;\n}\n\nexport interface PiServerPendingRunState extends PiServerRunStateBase {\n\tkind: \"run\";\n\tserverHash: string;\n\tsessionId: string;\n\trunId: string;\n\tbaseTreeHash: string;\n\tbaseEntryCount: number;\n\tbaseLeafId: string | null;\n\trequestHash: string;\n}\n\ninterface PiServerAcknowledgedRunState extends PiServerRunStateBase {\n\tkind: \"ack\";\n\trunId: string;\n\tresolution: \"server_ack\";\n}\n\ntype PiServerRunStateRecord = PiServerPendingRunState | PiServerAcknowledgedRunState;\n\ninterface PiServerRunStateEnvelope {\n\tpayload: string;\n\tsha256: string;\n}\n\nexport interface WritePiServerPendingRunInput {\n\tserverHash: string;\n\tsessionId: string;\n\trunId: string;\n\tbaseTreeHash: string;\n\tbaseEntryCount: number;\n\tbaseLeafId: string | null;\n\trequestHash: string;\n\ttimestamp?: number;\n}\n\ninterface ParsedPiServerRunState {\n\tnextSequence: number;\n\tpending: PiServerPendingRunState | undefined;\n}\n\nexport interface PiServerRunStateLease {\n\treadonly path: string;\n\treadonly database: DatabaseSync;\n\tactive: boolean;\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function acquirePiServerRunStateLease(path: string): PiServerRunStateLease {\n\tconst normalizedPath = resolve(path);\n\tconst database = new DatabaseSync(`${normalizedPath}.lock.sqlite`);\n\tlet transactionStarted = false;\n\ttry {\n\t\tdatabase.exec(\"PRAGMA busy_timeout = 0\");\n\t\tdatabase.exec(\"CREATE TABLE IF NOT EXISTS run_state_lock (id INTEGER PRIMARY KEY CHECK (id = 1))\");\n\t\tdatabase.exec(\"BEGIN IMMEDIATE\");\n\t\ttransactionStarted = true;\n\t\treturn { path: normalizedPath, database, active: true };\n\t} catch (error) {\n\t\tif (transactionStarted) {\n\t\t\ttry {\n\t\t\t\tdatabase.exec(\"ROLLBACK\");\n\t\t\t} catch {\n\t\t\t\t// Closing the connection below is the authoritative lock release.\n\t\t\t}\n\t\t}\n\t\tdatabase.close();\n\t\tthrow new Error(`Cannot acquire pi-server run lease for ${normalizedPath}; another process owns the session`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport function releasePiServerRunStateLease(lease: PiServerRunStateLease): void {\n\tif (!lease.active) return;\n\tlease.active = false;\n\ttry {\n\t\tlease.database.exec(\"ROLLBACK\");\n\t} catch {\n\t\t// close() still releases the OS-backed SQLite transaction after connection failure.\n\t}\n\ttry {\n\t\tlease.database.close();\n\t} catch {\n\t\t// The lease is already unusable and close() is idempotent at this abstraction boundary.\n\t}\n}\n\nfunction assertPiServerRunStateLease(path: string, lease: PiServerRunStateLease): void {\n\tif (!lease.active) {\n\t\tthrow new Error(\"Cannot use a released pi-server run lease\");\n\t}\n\tconst normalizedPath = resolve(path);\n\tif (lease.path !== normalizedPath) {\n\t\tthrow new Error(`Pi-server run lease path mismatch: expected ${normalizedPath}, received ${lease.path}`);\n\t}\n}\n\nfunction withRunStateLease<T>(path: string, lease: PiServerRunStateLease | undefined, operation: () => T): T {\n\tif (lease) {\n\t\tassertPiServerRunStateLease(path, lease);\n\t\treturn operation();\n\t}\n\tconst acquiredLease = acquirePiServerRunStateLease(path);\n\ttry {\n\t\treturn operation();\n\t} finally {\n\t\treleasePiServerRunStateLease(acquiredLease);\n\t}\n}\n\nfunction assertObject(value: unknown, path: string): asserts value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${path} must be an object`);\n\t}\n}\n\nfunction assertIdentifier(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > IDENTIFIER_MAX_CHARS) {\n\t\tthrow new Error(`${path} must be a non-empty string up to ${IDENTIFIER_MAX_CHARS} characters`);\n\t}\n}\n\nfunction assertHash(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\" || !SHA256_PATTERN.test(value)) {\n\t\tthrow new Error(`${path} must be a 64-character hex digest`);\n\t}\n}\n\nfunction assertNonNegativeSafeInteger(value: unknown, path: string): asserts value is number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new Error(`${path} must be a non-negative safe integer`);\n\t}\n}\n\nfunction parseRecord(payload: string, lineNumber: number): PiServerRunStateRecord {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(payload) as unknown;\n\t} catch (error) {\n\t\tthrow new Error(`pi-server run state payload is invalid JSON at line ${lineNumber}`, { cause: error });\n\t}\n\tassertObject(value, `pi-server run state line ${lineNumber}`);\n\tif (value.version !== RUN_STATE_VERSION) {\n\t\tthrow new Error(`Unsupported pi-server run state version at line ${lineNumber}`);\n\t}\n\tassertNonNegativeSafeInteger(value.sequence, `pi-server run state line ${lineNumber}.sequence`);\n\tassertNonNegativeSafeInteger(value.timestamp, `pi-server run state line ${lineNumber}.timestamp`);\n\tif (value.kind === \"ack\") {\n\t\tassertIdentifier(value.runId, `pi-server run state line ${lineNumber}.runId`);\n\t\tif (value.resolution !== \"server_ack\") {\n\t\t\tthrow new Error(`pi-server run state acknowledgement resolution is invalid at line ${lineNumber}`);\n\t\t}\n\t\treturn {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"ack\",\n\t\t\tsequence: value.sequence,\n\t\t\ttimestamp: value.timestamp,\n\t\t\trunId: value.runId,\n\t\t\tresolution: value.resolution,\n\t\t};\n\t}\n\tif (value.kind !== \"run\") {\n\t\tthrow new Error(`Unsupported pi-server run state record kind at line ${lineNumber}`);\n\t}\n\tassertHash(value.serverHash, `pi-server run state line ${lineNumber}.serverHash`);\n\tassertIdentifier(value.sessionId, `pi-server run state line ${lineNumber}.sessionId`);\n\tassertIdentifier(value.runId, `pi-server run state line ${lineNumber}.runId`);\n\tassertHash(value.baseTreeHash, `pi-server run state line ${lineNumber}.baseTreeHash`);\n\tassertNonNegativeSafeInteger(value.baseEntryCount, `pi-server run state line ${lineNumber}.baseEntryCount`);\n\tif (value.baseLeafId !== null) {\n\t\tassertIdentifier(value.baseLeafId, `pi-server run state line ${lineNumber}.baseLeafId`);\n\t}\n\tassertHash(value.requestHash, `pi-server run state line ${lineNumber}.requestHash`);\n\treturn {\n\t\tversion: RUN_STATE_VERSION,\n\t\tkind: \"run\",\n\t\tsequence: value.sequence,\n\t\ttimestamp: value.timestamp,\n\t\tserverHash: value.serverHash,\n\t\tsessionId: value.sessionId,\n\t\trunId: value.runId,\n\t\tbaseTreeHash: value.baseTreeHash,\n\t\tbaseEntryCount: value.baseEntryCount,\n\t\tbaseLeafId: value.baseLeafId,\n\t\trequestHash: value.requestHash,\n\t};\n}\n\nfunction parseRunStateFile(path: string): ParsedPiServerRunState {\n\tif (!existsSync(path)) {\n\t\treturn { nextSequence: 0, pending: undefined };\n\t}\n\tconst encoded = readFileSync(path);\n\tif (encoded.byteLength > RUN_STATE_MAX_BYTES) {\n\t\tthrow new Error(`pi-server run state exceeds ${RUN_STATE_MAX_BYTES} bytes: ${path}`);\n\t}\n\tconst content = encoded.toString(\"utf-8\");\n\tconst hasCompleteTail = content.endsWith(\"\\n\");\n\tconst lines = content.split(\"\\n\");\n\tif (!hasCompleteTail) {\n\t\tlines.pop();\n\t}\n\tlet expectedSequence = 0;\n\tlet pending: PiServerPendingRunState | undefined;\n\tfor (const [index, line] of lines.entries()) {\n\t\tif (line.length === 0) continue;\n\t\tlet envelopeValue: unknown;\n\t\ttry {\n\t\t\tenvelopeValue = JSON.parse(line) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`pi-server run state envelope is invalid JSON at line ${index + 1}`, { cause: error });\n\t\t}\n\t\tassertObject(envelopeValue, `pi-server run state envelope line ${index + 1}`);\n\t\tif (typeof envelopeValue.payload !== \"string\") {\n\t\t\tthrow new Error(`pi-server run state envelope payload must be a string at line ${index + 1}`);\n\t\t}\n\t\tassertHash(envelopeValue.sha256, `pi-server run state envelope line ${index + 1}.sha256`);\n\t\tif (sha256(envelopeValue.payload) !== envelopeValue.sha256) {\n\t\t\tthrow new Error(`pi-server run state checksum mismatch at line ${index + 1}`);\n\t\t}\n\t\tconst record = parseRecord(envelopeValue.payload, index + 1);\n\t\tif (record.sequence !== expectedSequence) {\n\t\t\tthrow new Error(\n\t\t\t\t`pi-server run state sequence mismatch at line ${index + 1}: expected ${expectedSequence}, received ${record.sequence}`,\n\t\t\t);\n\t\t}\n\t\texpectedSequence++;\n\t\tif (record.kind === \"run\") {\n\t\t\tif (pending) {\n\t\t\t\tthrow new Error(`pi-server run state contains a new run before ${pending.runId} was acknowledged`);\n\t\t\t}\n\t\t\tpending = record;\n\t\t} else {\n\t\t\tif (!pending || pending.runId !== record.runId) {\n\t\t\t\tthrow new Error(`pi-server run state acknowledgement does not match the pending run at line ${index + 1}`);\n\t\t\t}\n\t\t\tpending = undefined;\n\t\t}\n\t}\n\treturn { nextSequence: expectedSequence, pending };\n}\n\nfunction appendRecord(path: string, record: PiServerRunStateRecord): void {\n\tconst payload = JSON.stringify(record);\n\tconst envelope: PiServerRunStateEnvelope = { payload, sha256: sha256(payload) };\n\tconst encoded = Buffer.from(`${JSON.stringify(envelope)}\\n`, \"utf-8\");\n\tconst existing = existsSync(path) ? readFileSync(path) : Buffer.alloc(0);\n\tconst validBytes = existing.lastIndexOf(0x0a) + 1;\n\tif (validBytes !== existing.byteLength) {\n\t\ttruncateSync(path, validBytes);\n\t}\n\tconst existingBytes = validBytes;\n\tif (existingBytes + encoded.byteLength > RUN_STATE_MAX_BYTES) {\n\t\tthrow new Error(`pi-server run state would exceed ${RUN_STATE_MAX_BYTES} bytes: ${path}`);\n\t}\n\tconst fileExisted = existsSync(path);\n\tconst handle = openSync(path, \"a\", 0o600);\n\ttry {\n\t\tlet written = 0;\n\t\twhile (written < encoded.byteLength) {\n\t\t\tconst bytesWritten = writeSync(handle, encoded, written, encoded.byteLength - written);\n\t\t\tif (bytesWritten === 0) {\n\t\t\t\tthrow new Error(`Failed to make progress writing pi-server run state: ${path}`);\n\t\t\t}\n\t\t\twritten += bytesWritten;\n\t\t}\n\t\tfsyncSync(handle);\n\t} finally {\n\t\tcloseSync(handle);\n\t}\n\tif (!fileExisted && process.platform !== \"win32\") {\n\t\tconst directoryHandle = openSync(dirname(path), \"r\");\n\t\ttry {\n\t\t\tfsyncSync(directoryHandle);\n\t\t} finally {\n\t\t\tcloseSync(directoryHandle);\n\t\t}\n\t}\n}\n\nexport function getPiServerRunStatePath(sessionFile: string): string {\n\treturn `${sessionFile}.pi-server-runs.jsonl`;\n}\n\nexport function hashPiServerIdentity(serverUrl: string): string {\n\treturn sha256(serverUrl);\n}\n\nexport function readPiServerPendingRun(\n\tpath: string,\n\tlease?: PiServerRunStateLease,\n): PiServerPendingRunState | undefined {\n\tif (lease) {\n\t\tassertPiServerRunStateLease(path, lease);\n\t}\n\t// The append-only checksum envelope makes an unlocked observer read safe: a concurrent\n\t// incomplete final record is ignored. Lifecycle decisions pass the owning lease.\n\treturn parseRunStateFile(path).pending;\n}\n\nexport function writePiServerPendingRun(\n\tpath: string,\n\tinput: WritePiServerPendingRunInput,\n\tlease?: PiServerRunStateLease,\n): PiServerPendingRunState {\n\treturn withRunStateLease(path, lease, () => {\n\t\tconst state = parseRunStateFile(path);\n\t\tif (state.pending) {\n\t\t\tthrow new Error(`pi-server run ${state.pending.runId} must be acknowledged before starting another run`);\n\t\t}\n\t\tif (state.nextSequence > 0) {\n\t\t\t// All earlier runs are acknowledged. Truncating before the new durable marker is safe:\n\t\t\t// the caller cannot submit the new provider request until this function returns.\n\t\t\ttruncateSync(path, 0);\n\t\t\tstate.nextSequence = 0;\n\t\t}\n\t\tconst timestamp = input.timestamp ?? Date.now();\n\t\tassertNonNegativeSafeInteger(timestamp, \"pi-server run state timestamp\");\n\t\tassertHash(input.serverHash, \"pi-server run state serverHash\");\n\t\tassertIdentifier(input.sessionId, \"pi-server run state sessionId\");\n\t\tassertIdentifier(input.runId, \"pi-server run state runId\");\n\t\tassertHash(input.baseTreeHash, \"pi-server run state baseTreeHash\");\n\t\tassertNonNegativeSafeInteger(input.baseEntryCount, \"pi-server run state baseEntryCount\");\n\t\tif (input.baseLeafId !== null) {\n\t\t\tassertIdentifier(input.baseLeafId, \"pi-server run state baseLeafId\");\n\t\t}\n\t\tassertHash(input.requestHash, \"pi-server run state requestHash\");\n\t\tconst record: PiServerPendingRunState = {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"run\",\n\t\t\tsequence: state.nextSequence,\n\t\t\ttimestamp,\n\t\t\tserverHash: input.serverHash,\n\t\t\tsessionId: input.sessionId,\n\t\t\trunId: input.runId,\n\t\t\tbaseTreeHash: input.baseTreeHash,\n\t\t\tbaseEntryCount: input.baseEntryCount,\n\t\t\tbaseLeafId: input.baseLeafId,\n\t\t\trequestHash: input.requestHash,\n\t\t};\n\t\tappendRecord(path, record);\n\t\treturn record;\n\t});\n}\n\nexport function acknowledgePiServerPendingRun(\n\tpath: string,\n\trunId: string,\n\ttimestamp = Date.now(),\n\tlease?: PiServerRunStateLease,\n): void {\n\twithRunStateLease(path, lease, () => {\n\t\tconst state = parseRunStateFile(path);\n\t\tif (!state.pending) return;\n\t\tif (state.pending.runId !== runId) {\n\t\t\tthrow new Error(`Cannot acknowledge pi-server run ${runId}; pending run is ${state.pending.runId}`);\n\t\t}\n\t\tassertNonNegativeSafeInteger(timestamp, \"pi-server run acknowledgement timestamp\");\n\t\tappendRecord(path, {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"ack\",\n\t\t\tsequence: state.nextSequence,\n\t\t\ttimestamp,\n\t\t\trunId,\n\t\t\tresolution: \"server_ack\",\n\t\t});\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pi-server-run-state.js","sourceRoot":"","sources":["../../src/core/pi-server-run-state.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { createHash } from \"node:crypto\";\nimport { closeSync, existsSync, fsyncSync, openSync, readFileSync, truncateSync, writeSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { DatabaseSync } from \"node:sqlite\";\n\nconst RUN_STATE_VERSION = 1;\nconst RUN_STATE_MAX_BYTES = 8 * 1024 * 1024;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\nconst IDENTIFIER_MAX_CHARS = 1024;\n\ninterface PiServerRunStateBase {\n\tversion: typeof RUN_STATE_VERSION;\n\tsequence: number;\n\ttimestamp: number;\n}\n\nexport interface PiServerPendingRunState extends PiServerRunStateBase {\n\tkind: \"run\";\n\tserverHash: string;\n\tsessionId: string;\n\trunId: string;\n\tbaseTreeHash: string;\n\tbaseEntryCount: number;\n\tbaseLeafId: string | null;\n\trequestHash: string;\n}\n\ninterface PiServerAcknowledgedRunState extends PiServerRunStateBase {\n\tkind: \"ack\";\n\trunId: string;\n\tresolution: PiServerRunAcknowledgementResolution;\n}\n\ntype PiServerRunStateRecord = PiServerPendingRunState | PiServerAcknowledgedRunState;\n\nexport type PiServerRunAcknowledgementResolution =\n\t| \"server_ack\"\n\t| \"server_authoritative_missing\"\n\t| \"server_authoritative_rebind\";\n\ninterface PiServerRunStateEnvelope {\n\tpayload: string;\n\tsha256: string;\n}\n\nexport interface WritePiServerPendingRunInput {\n\tserverHash: string;\n\tsessionId: string;\n\trunId: string;\n\tbaseTreeHash: string;\n\tbaseEntryCount: number;\n\tbaseLeafId: string | null;\n\trequestHash: string;\n\ttimestamp?: number;\n}\n\ninterface ParsedPiServerRunState {\n\tnextSequence: number;\n\tpending: PiServerPendingRunState | undefined;\n}\n\nexport interface PiServerRunStateLease {\n\treadonly path: string;\n\treadonly database: DatabaseSync;\n\tactive: boolean;\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function acquirePiServerRunStateLease(path: string): PiServerRunStateLease {\n\tconst normalizedPath = resolve(path);\n\tconst database = new DatabaseSync(`${normalizedPath}.lock.sqlite`);\n\tlet transactionStarted = false;\n\ttry {\n\t\tdatabase.exec(\"PRAGMA busy_timeout = 0\");\n\t\tdatabase.exec(\"CREATE TABLE IF NOT EXISTS run_state_lock (id INTEGER PRIMARY KEY CHECK (id = 1))\");\n\t\tdatabase.exec(\"BEGIN IMMEDIATE\");\n\t\ttransactionStarted = true;\n\t\treturn { path: normalizedPath, database, active: true };\n\t} catch (error) {\n\t\tif (transactionStarted) {\n\t\t\ttry {\n\t\t\t\tdatabase.exec(\"ROLLBACK\");\n\t\t\t} catch {\n\t\t\t\t// Closing the connection below is the authoritative lock release.\n\t\t\t}\n\t\t}\n\t\tdatabase.close();\n\t\tthrow new Error(`Cannot acquire pi-server run lease for ${normalizedPath}; another process owns the session`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport function releasePiServerRunStateLease(lease: PiServerRunStateLease): void {\n\tif (!lease.active) return;\n\tlease.active = false;\n\ttry {\n\t\tlease.database.exec(\"ROLLBACK\");\n\t} catch {\n\t\t// close() still releases the OS-backed SQLite transaction after connection failure.\n\t}\n\ttry {\n\t\tlease.database.close();\n\t} catch {\n\t\t// The lease is already unusable and close() is idempotent at this abstraction boundary.\n\t}\n}\n\nfunction assertPiServerRunStateLease(path: string, lease: PiServerRunStateLease): void {\n\tif (!lease.active) {\n\t\tthrow new Error(\"Cannot use a released pi-server run lease\");\n\t}\n\tconst normalizedPath = resolve(path);\n\tif (lease.path !== normalizedPath) {\n\t\tthrow new Error(`Pi-server run lease path mismatch: expected ${normalizedPath}, received ${lease.path}`);\n\t}\n}\n\nfunction withRunStateLease<T>(path: string, lease: PiServerRunStateLease | undefined, operation: () => T): T {\n\tif (lease) {\n\t\tassertPiServerRunStateLease(path, lease);\n\t\treturn operation();\n\t}\n\tconst acquiredLease = acquirePiServerRunStateLease(path);\n\ttry {\n\t\treturn operation();\n\t} finally {\n\t\treleasePiServerRunStateLease(acquiredLease);\n\t}\n}\n\nfunction assertObject(value: unknown, path: string): asserts value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new Error(`${path} must be an object`);\n\t}\n}\n\nfunction assertIdentifier(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\" || value.length === 0 || value.length > IDENTIFIER_MAX_CHARS) {\n\t\tthrow new Error(`${path} must be a non-empty string up to ${IDENTIFIER_MAX_CHARS} characters`);\n\t}\n}\n\nfunction assertHash(value: unknown, path: string): asserts value is string {\n\tif (typeof value !== \"string\" || !SHA256_PATTERN.test(value)) {\n\t\tthrow new Error(`${path} must be a 64-character hex digest`);\n\t}\n}\n\nfunction assertNonNegativeSafeInteger(value: unknown, path: string): asserts value is number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new Error(`${path} must be a non-negative safe integer`);\n\t}\n}\n\nfunction parseRecord(payload: string, lineNumber: number): PiServerRunStateRecord {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(payload) as unknown;\n\t} catch (error) {\n\t\tthrow new Error(`pi-server run state payload is invalid JSON at line ${lineNumber}`, { cause: error });\n\t}\n\tassertObject(value, `pi-server run state line ${lineNumber}`);\n\tif (value.version !== RUN_STATE_VERSION) {\n\t\tthrow new Error(`Unsupported pi-server run state version at line ${lineNumber}`);\n\t}\n\tassertNonNegativeSafeInteger(value.sequence, `pi-server run state line ${lineNumber}.sequence`);\n\tassertNonNegativeSafeInteger(value.timestamp, `pi-server run state line ${lineNumber}.timestamp`);\n\tif (value.kind === \"ack\") {\n\t\tassertIdentifier(value.runId, `pi-server run state line ${lineNumber}.runId`);\n\t\tif (\n\t\t\tvalue.resolution !== \"server_ack\" &&\n\t\t\tvalue.resolution !== \"server_authoritative_missing\" &&\n\t\t\tvalue.resolution !== \"server_authoritative_rebind\"\n\t\t) {\n\t\t\tthrow new Error(`pi-server run state acknowledgement resolution is invalid at line ${lineNumber}`);\n\t\t}\n\t\treturn {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"ack\",\n\t\t\tsequence: value.sequence,\n\t\t\ttimestamp: value.timestamp,\n\t\t\trunId: value.runId,\n\t\t\tresolution: value.resolution,\n\t\t};\n\t}\n\tif (value.kind !== \"run\") {\n\t\tthrow new Error(`Unsupported pi-server run state record kind at line ${lineNumber}`);\n\t}\n\tassertHash(value.serverHash, `pi-server run state line ${lineNumber}.serverHash`);\n\tassertIdentifier(value.sessionId, `pi-server run state line ${lineNumber}.sessionId`);\n\tassertIdentifier(value.runId, `pi-server run state line ${lineNumber}.runId`);\n\tassertHash(value.baseTreeHash, `pi-server run state line ${lineNumber}.baseTreeHash`);\n\tassertNonNegativeSafeInteger(value.baseEntryCount, `pi-server run state line ${lineNumber}.baseEntryCount`);\n\tif (value.baseLeafId !== null) {\n\t\tassertIdentifier(value.baseLeafId, `pi-server run state line ${lineNumber}.baseLeafId`);\n\t}\n\tassertHash(value.requestHash, `pi-server run state line ${lineNumber}.requestHash`);\n\treturn {\n\t\tversion: RUN_STATE_VERSION,\n\t\tkind: \"run\",\n\t\tsequence: value.sequence,\n\t\ttimestamp: value.timestamp,\n\t\tserverHash: value.serverHash,\n\t\tsessionId: value.sessionId,\n\t\trunId: value.runId,\n\t\tbaseTreeHash: value.baseTreeHash,\n\t\tbaseEntryCount: value.baseEntryCount,\n\t\tbaseLeafId: value.baseLeafId,\n\t\trequestHash: value.requestHash,\n\t};\n}\n\nfunction parseRunStateFile(path: string): ParsedPiServerRunState {\n\tif (!existsSync(path)) {\n\t\treturn { nextSequence: 0, pending: undefined };\n\t}\n\tconst encoded = readFileSync(path);\n\tif (encoded.byteLength > RUN_STATE_MAX_BYTES) {\n\t\tthrow new Error(`pi-server run state exceeds ${RUN_STATE_MAX_BYTES} bytes: ${path}`);\n\t}\n\tconst content = encoded.toString(\"utf-8\");\n\tconst hasCompleteTail = content.endsWith(\"\\n\");\n\tconst lines = content.split(\"\\n\");\n\tif (!hasCompleteTail) {\n\t\tlines.pop();\n\t}\n\tlet expectedSequence = 0;\n\tlet pending: PiServerPendingRunState | undefined;\n\tfor (const [index, line] of lines.entries()) {\n\t\tif (line.length === 0) continue;\n\t\tlet envelopeValue: unknown;\n\t\ttry {\n\t\t\tenvelopeValue = JSON.parse(line) as unknown;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`pi-server run state envelope is invalid JSON at line ${index + 1}`, { cause: error });\n\t\t}\n\t\tassertObject(envelopeValue, `pi-server run state envelope line ${index + 1}`);\n\t\tif (typeof envelopeValue.payload !== \"string\") {\n\t\t\tthrow new Error(`pi-server run state envelope payload must be a string at line ${index + 1}`);\n\t\t}\n\t\tassertHash(envelopeValue.sha256, `pi-server run state envelope line ${index + 1}.sha256`);\n\t\tif (sha256(envelopeValue.payload) !== envelopeValue.sha256) {\n\t\t\tthrow new Error(`pi-server run state checksum mismatch at line ${index + 1}`);\n\t\t}\n\t\tconst record = parseRecord(envelopeValue.payload, index + 1);\n\t\tif (record.sequence !== expectedSequence) {\n\t\t\tthrow new Error(\n\t\t\t\t`pi-server run state sequence mismatch at line ${index + 1}: expected ${expectedSequence}, received ${record.sequence}`,\n\t\t\t);\n\t\t}\n\t\texpectedSequence++;\n\t\tif (record.kind === \"run\") {\n\t\t\tif (pending) {\n\t\t\t\tthrow new Error(`pi-server run state contains a new run before ${pending.runId} was acknowledged`);\n\t\t\t}\n\t\t\tpending = record;\n\t\t} else {\n\t\t\tif (!pending || pending.runId !== record.runId) {\n\t\t\t\tthrow new Error(`pi-server run state acknowledgement does not match the pending run at line ${index + 1}`);\n\t\t\t}\n\t\t\tpending = undefined;\n\t\t}\n\t}\n\treturn { nextSequence: expectedSequence, pending };\n}\n\nfunction appendRecord(path: string, record: PiServerRunStateRecord): void {\n\tconst payload = JSON.stringify(record);\n\tconst envelope: PiServerRunStateEnvelope = { payload, sha256: sha256(payload) };\n\tconst encoded = Buffer.from(`${JSON.stringify(envelope)}\\n`, \"utf-8\");\n\tconst existing = existsSync(path) ? readFileSync(path) : Buffer.alloc(0);\n\tconst validBytes = existing.lastIndexOf(0x0a) + 1;\n\tif (validBytes !== existing.byteLength) {\n\t\ttruncateSync(path, validBytes);\n\t}\n\tconst existingBytes = validBytes;\n\tif (existingBytes + encoded.byteLength > RUN_STATE_MAX_BYTES) {\n\t\tthrow new Error(`pi-server run state would exceed ${RUN_STATE_MAX_BYTES} bytes: ${path}`);\n\t}\n\tconst fileExisted = existsSync(path);\n\tconst handle = openSync(path, \"a\", 0o600);\n\ttry {\n\t\tlet written = 0;\n\t\twhile (written < encoded.byteLength) {\n\t\t\tconst bytesWritten = writeSync(handle, encoded, written, encoded.byteLength - written);\n\t\t\tif (bytesWritten === 0) {\n\t\t\t\tthrow new Error(`Failed to make progress writing pi-server run state: ${path}`);\n\t\t\t}\n\t\t\twritten += bytesWritten;\n\t\t}\n\t\tfsyncSync(handle);\n\t} finally {\n\t\tcloseSync(handle);\n\t}\n\tif (!fileExisted && process.platform !== \"win32\") {\n\t\tconst directoryHandle = openSync(dirname(path), \"r\");\n\t\ttry {\n\t\t\tfsyncSync(directoryHandle);\n\t\t} finally {\n\t\t\tcloseSync(directoryHandle);\n\t\t}\n\t}\n}\n\nexport function getPiServerRunStatePath(sessionFile: string): string {\n\treturn `${sessionFile}.pi-server-runs.jsonl`;\n}\n\nexport function hashPiServerIdentity(serverUrl: string): string {\n\treturn sha256(serverUrl);\n}\n\nexport function readPiServerPendingRun(\n\tpath: string,\n\tlease?: PiServerRunStateLease,\n): PiServerPendingRunState | undefined {\n\tif (lease) {\n\t\tassertPiServerRunStateLease(path, lease);\n\t}\n\t// The append-only checksum envelope makes an unlocked observer read safe: a concurrent\n\t// incomplete final record is ignored. Lifecycle decisions pass the owning lease.\n\treturn parseRunStateFile(path).pending;\n}\n\nexport function writePiServerPendingRun(\n\tpath: string,\n\tinput: WritePiServerPendingRunInput,\n\tlease?: PiServerRunStateLease,\n): PiServerPendingRunState {\n\treturn withRunStateLease(path, lease, () => {\n\t\tconst state = parseRunStateFile(path);\n\t\tif (state.pending) {\n\t\t\tthrow new Error(`pi-server run ${state.pending.runId} must be acknowledged before starting another run`);\n\t\t}\n\t\tif (state.nextSequence > 0) {\n\t\t\t// All earlier runs are acknowledged. Truncating before the new durable marker is safe:\n\t\t\t// the caller cannot submit the new provider request until this function returns.\n\t\t\ttruncateSync(path, 0);\n\t\t\tstate.nextSequence = 0;\n\t\t}\n\t\tconst timestamp = input.timestamp ?? Date.now();\n\t\tassertNonNegativeSafeInteger(timestamp, \"pi-server run state timestamp\");\n\t\tassertHash(input.serverHash, \"pi-server run state serverHash\");\n\t\tassertIdentifier(input.sessionId, \"pi-server run state sessionId\");\n\t\tassertIdentifier(input.runId, \"pi-server run state runId\");\n\t\tassertHash(input.baseTreeHash, \"pi-server run state baseTreeHash\");\n\t\tassertNonNegativeSafeInteger(input.baseEntryCount, \"pi-server run state baseEntryCount\");\n\t\tif (input.baseLeafId !== null) {\n\t\t\tassertIdentifier(input.baseLeafId, \"pi-server run state baseLeafId\");\n\t\t}\n\t\tassertHash(input.requestHash, \"pi-server run state requestHash\");\n\t\tconst record: PiServerPendingRunState = {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"run\",\n\t\t\tsequence: state.nextSequence,\n\t\t\ttimestamp,\n\t\t\tserverHash: input.serverHash,\n\t\t\tsessionId: input.sessionId,\n\t\t\trunId: input.runId,\n\t\t\tbaseTreeHash: input.baseTreeHash,\n\t\t\tbaseEntryCount: input.baseEntryCount,\n\t\t\tbaseLeafId: input.baseLeafId,\n\t\t\trequestHash: input.requestHash,\n\t\t};\n\t\tappendRecord(path, record);\n\t\treturn record;\n\t});\n}\n\nexport function acknowledgePiServerPendingRun(\n\tpath: string,\n\trunId: string,\n\ttimestamp = Date.now(),\n\tlease?: PiServerRunStateLease,\n\tresolution: PiServerRunAcknowledgementResolution = \"server_ack\",\n): void {\n\twithRunStateLease(path, lease, () => {\n\t\tconst state = parseRunStateFile(path);\n\t\tif (!state.pending) return;\n\t\tif (state.pending.runId !== runId) {\n\t\t\tthrow new Error(`Cannot acknowledge pi-server run ${runId}; pending run is ${state.pending.runId}`);\n\t\t}\n\t\tassertNonNegativeSafeInteger(timestamp, \"pi-server run acknowledgement timestamp\");\n\t\tappendRecord(path, {\n\t\t\tversion: RUN_STATE_VERSION,\n\t\t\tkind: \"ack\",\n\t\t\tsequence: state.nextSequence,\n\t\t\ttimestamp,\n\t\t\trunId,\n\t\t\tresolution,\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":"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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 { assertPiServerProviderExecution } from \"./pi-server-provider-execution.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 piServerExecution =\n\t\t\t\tprocess.env.PI_SERVER_MODE === \"true\"\n\t\t\t\t\t? assertPiServerProviderExecution(modelRuntime, model, headerRunner)\n\t\t\t\t\t: undefined;\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\tproviderExecutionFingerprint: piServerExecution?.providerExecutionFingerprint,\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 { 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"]}
|
package/dist/core/sdk.js
CHANGED
|
@@ -11,7 +11,6 @@ import { convertToLlm } from "./messages.js";
|
|
|
11
11
|
import { findInitialModel } from "./model-resolver.js";
|
|
12
12
|
import { ModelRuntime } from "./model-runtime.js";
|
|
13
13
|
import { streamPiServer } from "./pi-server-client.js";
|
|
14
|
-
import { assertPiServerProviderExecution } from "./pi-server-provider-execution.js";
|
|
15
14
|
import { getPiServerRunStatePath } from "./pi-server-run-state.js";
|
|
16
15
|
import { mergeProviderAttributionHeaders } from "./provider-attribution.js";
|
|
17
16
|
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
@@ -195,9 +194,6 @@ export async function createAgentSession(options = {}) {
|
|
|
195
194
|
const extensionRunnerRef = {};
|
|
196
195
|
const streamWithPiServerRunMode = (runMode) => async (model, context, options) => {
|
|
197
196
|
const headerRunner = extensionRunnerRef.current;
|
|
198
|
-
const piServerExecution = process.env.PI_SERVER_MODE === "true"
|
|
199
|
-
? assertPiServerProviderExecution(modelRuntime, model, headerRunner)
|
|
200
|
-
: undefined;
|
|
201
197
|
const providerRetrySettings = settingsManager.getProviderRetrySettings();
|
|
202
198
|
const httpIdleTimeoutMs = settingsManager.getHttpIdleTimeoutMs();
|
|
203
199
|
// SDKs treat timeout=0 as 0ms (immediate timeout), not "no timeout".
|
|
@@ -239,7 +235,6 @@ export async function createAgentSession(options = {}) {
|
|
|
239
235
|
sessionTree: piServerContext?.sessionTree,
|
|
240
236
|
ephemeralMessages: piServerContext?.ephemeralMessages,
|
|
241
237
|
contextOverlay: piServerContext?.contextOverlay,
|
|
242
|
-
providerExecutionFingerprint: piServerExecution?.providerExecutionFingerprint,
|
|
243
238
|
piServerRunStatePath: piServerSessionFile ? getPiServerRunStatePath(piServerSessionFile) : undefined,
|
|
244
239
|
onHistoryReconciled: runMode === "main-durable" && activeAgentSession
|
|
245
240
|
? (snapshot) => activeAgentSession.reconcilePiServerHistory(snapshot)
|
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 { assertPiServerProviderExecution } from \"./pi-server-provider-execution.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 piServerExecution =\n\t\t\t\tprocess.env.PI_SERVER_MODE === \"true\"\n\t\t\t\t\t? assertPiServerProviderExecution(modelRuntime, model, headerRunner)\n\t\t\t\t\t: undefined;\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\tproviderExecutionFingerprint: piServerExecution?.providerExecutionFingerprint,\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 { 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@averyyy/pi-coding-agent",
|
|
3
|
-
"version": "0.82.1-piclient.
|
|
3
|
+
"version": "0.82.1-piclient.6",
|
|
4
4
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
"prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@earendil-works/pi-agent-core": "npm:@averyyy/pi-agent-core@0.82.1-piclient.
|
|
50
|
-
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@0.82.1-piclient.
|
|
51
|
-
"@earendil-works/pi-tui": "npm:@averyyy/pi-tui@0.82.1-piclient.
|
|
49
|
+
"@earendil-works/pi-agent-core": "npm:@averyyy/pi-agent-core@0.82.1-piclient.6",
|
|
50
|
+
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@0.82.1-piclient.6",
|
|
51
|
+
"@earendil-works/pi-tui": "npm:@averyyy/pi-tui@0.82.1-piclient.6",
|
|
52
52
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
53
53
|
"chalk": "5.6.2",
|
|
54
54
|
"cross-spawn": "7.0.6",
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
2
|
-
import type { ModelRuntime } from "./model-runtime.ts";
|
|
3
|
-
import type { ProviderExecutionContract } from "./provider-execution-contract.ts";
|
|
4
|
-
interface ProviderHookRegistry {
|
|
5
|
-
hasHandlers(eventType: string): boolean;
|
|
6
|
-
}
|
|
7
|
-
export interface PiServerProviderExecutionPreflight {
|
|
8
|
-
contract: ProviderExecutionContract;
|
|
9
|
-
providerExecutionFingerprint: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Reject execution paths that pi-server cannot reproduce exactly.
|
|
13
|
-
*
|
|
14
|
-
* This preflight is synchronous and credential-free so callers can run it
|
|
15
|
-
* before extension hooks, auth resolution, session mutation, or network I/O.
|
|
16
|
-
*/
|
|
17
|
-
export declare function assertPiServerProviderExecution(modelRuntime: ModelRuntime, model: Model<Api>, hooks?: ProviderHookRegistry): PiServerProviderExecutionPreflight;
|
|
18
|
-
export {};
|
|
19
|
-
//# sourceMappingURL=pi-server-provider-execution.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi-server-provider-execution.d.ts","sourceRoot":"","sources":["../../src/core/pi-server-provider-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAQlF,UAAU,oBAAoB;IAC7B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,kCAAkC;IAClD,QAAQ,EAAE,yBAAyB,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAC9C,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,KAAK,CAAC,EAAE,oBAAoB,GAC1B,kCAAkC,CAwCpC","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getCompatProviderExecutionRoute } from \"@earendil-works/pi-ai/compat\";\nimport { hashRemoteProviderExecution } from \"@earendil-works/pi-ai/provider-execution-node\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { ProviderExecutionContract } from \"./provider-execution-contract.ts\";\n\nconst PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS = [\n\t\"before_provider_request\",\n\t\"before_provider_headers\",\n\t\"after_provider_response\",\n] as const;\n\ninterface ProviderHookRegistry {\n\thasHandlers(eventType: string): boolean;\n}\n\nexport interface PiServerProviderExecutionPreflight {\n\tcontract: ProviderExecutionContract;\n\tproviderExecutionFingerprint: string;\n}\n\n/**\n * Reject execution paths that pi-server cannot reproduce exactly.\n *\n * This preflight is synchronous and credential-free so callers can run it\n * before extension hooks, auth resolution, session mutation, or network I/O.\n */\nexport function assertPiServerProviderExecution(\n\tmodelRuntime: ModelRuntime,\n\tmodel: Model<Api>,\n\thooks?: ProviderHookRegistry,\n): PiServerProviderExecutionPreflight {\n\tconst contract = modelRuntime.getProviderExecutionContract(model);\n\tif (!contract.descriptor.piServerCompatible) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +\n\t\t\t\t`mode=${contract.descriptor.mode}, executor=${contract.descriptor.executor.kind}. ` +\n\t\t\t\t\"Run this model with plain pi or remove the custom provider executor.\",\n\t\t);\n\t}\n\n\tconst activeHooks = PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS.filter((eventType) => hooks?.hasHandlers(eventType));\n\tif (activeHooks.length > 0) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider hooks for ${model.provider}/${model.id}: ` +\n\t\t\t\t`${activeHooks.join(\", \")}. Run this model with plain pi or disable these hooks.`,\n\t\t);\n\t}\n\tconst executor = contract.descriptor.executor;\n\tif (executor.kind !== \"builtin_provider\" && executor.kind !== \"builtin_api\") {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot serialize provider executor ${executor.kind} for ${model.provider}/${model.id}`,\n\t\t);\n\t}\n\tconst activeRoute = getCompatProviderExecutionRoute(model);\n\tif (\n\t\t(activeRoute.kind !== \"builtin_provider\" && activeRoute.kind !== \"builtin_api\") ||\n\t\tactiveRoute.kind !== executor.kind ||\n\t\tactiveRoute.id !== executor.id\n\t) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +\n\t\t\t\t`model runtime selected ${executor.kind}/${executor.id}, but active pi-ai compat route is ` +\n\t\t\t\t`${activeRoute.kind}/${activeRoute.id}. Remove the runtime API override or use plain pi.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tcontract,\n\t\tproviderExecutionFingerprint: hashRemoteProviderExecution(model, activeRoute),\n\t};\n}\n"]}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { getCompatProviderExecutionRoute } from "@earendil-works/pi-ai/compat";
|
|
2
|
-
import { hashRemoteProviderExecution } from "@earendil-works/pi-ai/provider-execution-node";
|
|
3
|
-
const PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS = [
|
|
4
|
-
"before_provider_request",
|
|
5
|
-
"before_provider_headers",
|
|
6
|
-
"after_provider_response",
|
|
7
|
-
];
|
|
8
|
-
/**
|
|
9
|
-
* Reject execution paths that pi-server cannot reproduce exactly.
|
|
10
|
-
*
|
|
11
|
-
* This preflight is synchronous and credential-free so callers can run it
|
|
12
|
-
* before extension hooks, auth resolution, session mutation, or network I/O.
|
|
13
|
-
*/
|
|
14
|
-
export function assertPiServerProviderExecution(modelRuntime, model, hooks) {
|
|
15
|
-
const contract = modelRuntime.getProviderExecutionContract(model);
|
|
16
|
-
if (!contract.descriptor.piServerCompatible) {
|
|
17
|
-
throw new Error(`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +
|
|
18
|
-
`mode=${contract.descriptor.mode}, executor=${contract.descriptor.executor.kind}. ` +
|
|
19
|
-
"Run this model with plain pi or remove the custom provider executor.");
|
|
20
|
-
}
|
|
21
|
-
const activeHooks = PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS.filter((eventType) => hooks?.hasHandlers(eventType));
|
|
22
|
-
if (activeHooks.length > 0) {
|
|
23
|
-
throw new Error(`pi-server mode cannot preserve native pi provider hooks for ${model.provider}/${model.id}: ` +
|
|
24
|
-
`${activeHooks.join(", ")}. Run this model with plain pi or disable these hooks.`);
|
|
25
|
-
}
|
|
26
|
-
const executor = contract.descriptor.executor;
|
|
27
|
-
if (executor.kind !== "builtin_provider" && executor.kind !== "builtin_api") {
|
|
28
|
-
throw new Error(`pi-server mode cannot serialize provider executor ${executor.kind} for ${model.provider}/${model.id}`);
|
|
29
|
-
}
|
|
30
|
-
const activeRoute = getCompatProviderExecutionRoute(model);
|
|
31
|
-
if ((activeRoute.kind !== "builtin_provider" && activeRoute.kind !== "builtin_api") ||
|
|
32
|
-
activeRoute.kind !== executor.kind ||
|
|
33
|
-
activeRoute.id !== executor.id) {
|
|
34
|
-
throw new Error(`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +
|
|
35
|
-
`model runtime selected ${executor.kind}/${executor.id}, but active pi-ai compat route is ` +
|
|
36
|
-
`${activeRoute.kind}/${activeRoute.id}. Remove the runtime API override or use plain pi.`);
|
|
37
|
-
}
|
|
38
|
-
return {
|
|
39
|
-
contract,
|
|
40
|
-
providerExecutionFingerprint: hashRemoteProviderExecution(model, activeRoute),
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=pi-server-provider-execution.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi-server-provider-execution.js","sourceRoot":"","sources":["../../src/core/pi-server-provider-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAI5F,MAAM,oCAAoC,GAAG;IAC5C,yBAAyB;IACzB,yBAAyB;IACzB,yBAAyB;CAChB,CAAC;AAWX;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAC9C,YAA0B,EAC1B,KAAiB,EACjB,KAA4B,EACS;IACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACd,mEAAmE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI;YAChG,QAAQ,QAAQ,CAAC,UAAU,CAAC,IAAI,cAAc,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI;YACnF,sEAAsE,CACvE,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,oCAAoC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9G,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,+DAA+D,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI;YAC5F,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CAClF,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC9C,IAAI,QAAQ,CAAC,IAAI,KAAK,kBAAkB,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CACd,qDAAqD,QAAQ,CAAC,IAAI,QAAQ,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CACtG,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAC3D,IACC,CAAC,WAAW,CAAC,IAAI,KAAK,kBAAkB,IAAI,WAAW,CAAC,IAAI,KAAK,aAAa,CAAC;QAC/E,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAClC,WAAW,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAC7B,CAAC;QACF,MAAM,IAAI,KAAK,CACd,mEAAmE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,IAAI;YAChG,0BAA0B,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,qCAAqC;YAC3F,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,oDAAoD,CAC1F,CAAC;IACH,CAAC;IAED,OAAO;QACN,QAAQ;QACR,4BAA4B,EAAE,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC;KAC7E,CAAC;AAAA,CACF","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getCompatProviderExecutionRoute } from \"@earendil-works/pi-ai/compat\";\nimport { hashRemoteProviderExecution } from \"@earendil-works/pi-ai/provider-execution-node\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport type { ProviderExecutionContract } from \"./provider-execution-contract.ts\";\n\nconst PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS = [\n\t\"before_provider_request\",\n\t\"before_provider_headers\",\n\t\"after_provider_response\",\n] as const;\n\ninterface ProviderHookRegistry {\n\thasHandlers(eventType: string): boolean;\n}\n\nexport interface PiServerProviderExecutionPreflight {\n\tcontract: ProviderExecutionContract;\n\tproviderExecutionFingerprint: string;\n}\n\n/**\n * Reject execution paths that pi-server cannot reproduce exactly.\n *\n * This preflight is synchronous and credential-free so callers can run it\n * before extension hooks, auth resolution, session mutation, or network I/O.\n */\nexport function assertPiServerProviderExecution(\n\tmodelRuntime: ModelRuntime,\n\tmodel: Model<Api>,\n\thooks?: ProviderHookRegistry,\n): PiServerProviderExecutionPreflight {\n\tconst contract = modelRuntime.getProviderExecutionContract(model);\n\tif (!contract.descriptor.piServerCompatible) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +\n\t\t\t\t`mode=${contract.descriptor.mode}, executor=${contract.descriptor.executor.kind}. ` +\n\t\t\t\t\"Run this model with plain pi or remove the custom provider executor.\",\n\t\t);\n\t}\n\n\tconst activeHooks = PI_SERVER_UNSUPPORTED_PROVIDER_HOOKS.filter((eventType) => hooks?.hasHandlers(eventType));\n\tif (activeHooks.length > 0) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider hooks for ${model.provider}/${model.id}: ` +\n\t\t\t\t`${activeHooks.join(\", \")}. Run this model with plain pi or disable these hooks.`,\n\t\t);\n\t}\n\tconst executor = contract.descriptor.executor;\n\tif (executor.kind !== \"builtin_provider\" && executor.kind !== \"builtin_api\") {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot serialize provider executor ${executor.kind} for ${model.provider}/${model.id}`,\n\t\t);\n\t}\n\tconst activeRoute = getCompatProviderExecutionRoute(model);\n\tif (\n\t\t(activeRoute.kind !== \"builtin_provider\" && activeRoute.kind !== \"builtin_api\") ||\n\t\tactiveRoute.kind !== executor.kind ||\n\t\tactiveRoute.id !== executor.id\n\t) {\n\t\tthrow new Error(\n\t\t\t`pi-server mode cannot preserve native pi provider execution for ${model.provider}/${model.id}: ` +\n\t\t\t\t`model runtime selected ${executor.kind}/${executor.id}, but active pi-ai compat route is ` +\n\t\t\t\t`${activeRoute.kind}/${activeRoute.id}. Remove the runtime API override or use plain pi.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tcontract,\n\t\tproviderExecutionFingerprint: hashRemoteProviderExecution(model, activeRoute),\n\t};\n}\n"]}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { Api } from "@earendil-works/pi-ai";
|
|
2
|
-
export type ProviderExecutionMode = "builtin" | "serializable_overlay" | "provider_config_stream_simple" | "native_provider";
|
|
3
|
-
export type ProviderExecutionKind = "builtin_provider" | "builtin_api" | "provider_config_stream_simple" | "native_provider";
|
|
4
|
-
export type ProviderExecutionExecutor = {
|
|
5
|
-
kind: "builtin_provider";
|
|
6
|
-
id: string;
|
|
7
|
-
} | {
|
|
8
|
-
kind: "builtin_api";
|
|
9
|
-
id: Api;
|
|
10
|
-
} | {
|
|
11
|
-
kind: "provider_config_stream_simple";
|
|
12
|
-
id: string;
|
|
13
|
-
} | {
|
|
14
|
-
kind: "native_provider";
|
|
15
|
-
id: string;
|
|
16
|
-
};
|
|
17
|
-
export interface ProviderExecutionContractDescriptor {
|
|
18
|
-
version: 1;
|
|
19
|
-
mode: ProviderExecutionMode;
|
|
20
|
-
providerId: string;
|
|
21
|
-
modelId: string;
|
|
22
|
-
api: Api;
|
|
23
|
-
executor: ProviderExecutionExecutor;
|
|
24
|
-
overlays: {
|
|
25
|
-
modelsJson: boolean;
|
|
26
|
-
extensionConfig: boolean;
|
|
27
|
-
};
|
|
28
|
-
piServerCompatible: boolean;
|
|
29
|
-
}
|
|
30
|
-
export interface ProviderExecutionContract {
|
|
31
|
-
descriptor: ProviderExecutionContractDescriptor;
|
|
32
|
-
fingerprint: string;
|
|
33
|
-
}
|
|
34
|
-
export declare function hashProviderExecutionContract(descriptor: ProviderExecutionContractDescriptor): string;
|
|
35
|
-
export declare function createProviderExecutionContract(descriptor: ProviderExecutionContractDescriptor): ProviderExecutionContract;
|
|
36
|
-
//# sourceMappingURL=provider-execution-contract.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-execution-contract.d.ts","sourceRoot":"","sources":["../../src/core/provider-execution-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAC9B,SAAS,GACT,sBAAsB,GACtB,+BAA+B,GAC/B,iBAAiB,CAAC;AAErB,MAAM,MAAM,qBAAqB,GAC9B,kBAAkB,GAClB,aAAa,GACb,+BAA+B,GAC/B,iBAAiB,CAAC;AAErB,MAAM,MAAM,yBAAyB,GAClC;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,EAAE,EAAE,GAAG,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,+BAA+B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,WAAW,mCAAmC;IACnD,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,yBAAyB,CAAC;IACpC,QAAQ,EAAE;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACzC,UAAU,EAAE,mCAAmC,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;CACpB;AAkBD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,mCAAmC,GAAG,MAAM,CAIrG;AAED,wBAAgB,+BAA+B,CAC9C,UAAU,EAAE,mCAAmC,GAC7C,yBAAyB,CAK3B","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Api } from \"@earendil-works/pi-ai\";\n\nexport type ProviderExecutionMode =\n\t| \"builtin\"\n\t| \"serializable_overlay\"\n\t| \"provider_config_stream_simple\"\n\t| \"native_provider\";\n\nexport type ProviderExecutionKind =\n\t| \"builtin_provider\"\n\t| \"builtin_api\"\n\t| \"provider_config_stream_simple\"\n\t| \"native_provider\";\n\nexport type ProviderExecutionExecutor =\n\t| { kind: \"builtin_provider\"; id: string }\n\t| { kind: \"builtin_api\"; id: Api }\n\t| { kind: \"provider_config_stream_simple\"; id: string }\n\t| { kind: \"native_provider\"; id: string };\n\nexport interface ProviderExecutionContractDescriptor {\n\tversion: 1;\n\tmode: ProviderExecutionMode;\n\tproviderId: string;\n\tmodelId: string;\n\tapi: Api;\n\texecutor: ProviderExecutionExecutor;\n\toverlays: {\n\t\tmodelsJson: boolean;\n\t\textensionConfig: boolean;\n\t};\n\tpiServerCompatible: boolean;\n}\n\nexport interface ProviderExecutionContract {\n\tdescriptor: ProviderExecutionContractDescriptor;\n\tfingerprint: string;\n}\n\nfunction canonicalJson(value: unknown): string | undefined {\n\tif (Array.isArray(value)) {\n\t\treturn `[${value.map((item) => canonicalJson(item) ?? \"null\").join(\",\")}]`;\n\t}\n\tif (value !== null && typeof value === \"object\") {\n\t\tconst record = value as Record<string, unknown>;\n\t\tconst properties: string[] = [];\n\t\tfor (const key of Object.keys(record).sort()) {\n\t\t\tconst serialized = canonicalJson(record[key]);\n\t\t\tif (serialized !== undefined) properties.push(`${JSON.stringify(key)}:${serialized}`);\n\t\t}\n\t\treturn `{${properties.join(\",\")}}`;\n\t}\n\treturn JSON.stringify(value);\n}\n\nexport function hashProviderExecutionContract(descriptor: ProviderExecutionContractDescriptor): string {\n\tconst serialized = canonicalJson(descriptor);\n\tif (serialized === undefined) throw new Error(\"Failed to serialize provider execution contract\");\n\treturn createHash(\"sha256\").update(serialized).digest(\"hex\");\n}\n\nexport function createProviderExecutionContract(\n\tdescriptor: ProviderExecutionContractDescriptor,\n): ProviderExecutionContract {\n\treturn {\n\t\tdescriptor,\n\t\tfingerprint: hashProviderExecutionContract(descriptor),\n\t};\n}\n"]}
|