pi-namespace-patch 1.1.0-namespace.3 → 1.2.0-namespace.1
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 +63 -0
- package/README.md +4 -7
- package/dist/bundle/chunks/anthropic-messages-Q7SXESRX.js +6 -0
- package/dist/bundle/chunks/{azure-openai-responses-6A4PNZTH.js → azure-openai-responses-LM52U7CK.js} +1 -1
- package/dist/bundle/chunks/chunk-3ZATHNCK.js +9 -0
- package/dist/bundle/chunks/chunk-5GTPJSRI.js +7 -0
- package/dist/bundle/chunks/chunk-6MWTY2OB.js +130 -0
- package/dist/bundle/chunks/chunk-6QGV3IWD.js +6 -0
- package/dist/bundle/chunks/{chunk-SYCGMWFH.js → chunk-AKJ3ZOR3.js} +1 -1
- package/dist/bundle/chunks/chunk-C2AEIDJZ.js +2 -0
- package/dist/bundle/chunks/{chunk-LTSARG5Q.js → chunk-CQ3XTLTY.js} +1 -1
- package/dist/bundle/chunks/{chunk-UH5J7I7X.js → chunk-D7PHKNBM.js} +26 -92
- package/dist/bundle/chunks/chunk-DOST5PQW.js +82 -0
- package/dist/bundle/chunks/{chunk-GXLAGZ3Z.js → chunk-GDR5JFDJ.js} +1 -1
- package/dist/bundle/chunks/{chunk-Q7ROD45H.js → chunk-H7S5Z6OB.js} +77 -71
- package/dist/bundle/chunks/{chunk-CH4ZBH45.js → chunk-HACVPRBJ.js} +1 -1
- package/dist/bundle/chunks/{chunk-O7YIWAPD.js → chunk-ITZNWD4K.js} +1 -1
- package/dist/bundle/chunks/chunk-RDZVAGPR.js +2 -0
- package/dist/bundle/chunks/{chunk-VLRCF7MR.js → chunk-TN4NLWHF.js} +1 -1
- package/dist/bundle/chunks/{chunk-Y4NYF362.js → chunk-WBQBCFWG.js} +1 -1
- package/dist/bundle/chunks/chunk-WJUNYZC5.js +2 -0
- package/dist/bundle/chunks/{chunk-33CRHCAK.js → chunk-XIX7LUWI.js} +1 -1
- package/dist/bundle/chunks/{cli-OQYLWLA3.js → cli-SWM4FQ6V.js} +3 -3
- package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-U3AH4ODQ.js → cloudflare-workers-ai-system-one-UTBL2KOF.js} +1 -1
- package/dist/bundle/chunks/codemode-worker.js +17 -9
- package/dist/bundle/chunks/easter-egg-3d-OX6RUCIS.js +2 -0
- package/dist/bundle/chunks/execute-3CFUPDLS.js +499 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-X2VFFS4I.js → google-generative-ai-DXKP72HC.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-KMGHFTSP.js → google-vertex-W6SIDOVV.js} +1 -1
- package/dist/bundle/chunks/{mistral-conversations-PRZLM26U.js → mistral-conversations-GBMHTSYF.js} +1 -1
- package/dist/bundle/chunks/openai-codex-responses-RN6B5UPP.js +10 -0
- package/dist/bundle/chunks/{openai-completions-WWQW7S3V.js → openai-completions-QW2B4SML.js} +1 -1
- package/dist/bundle/chunks/{openai-decisions-QLZKZLAK.js → openai-decisions-WVPMQ4JD.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-KV7QHJY6.js → openai-responses-KDJUSIU7.js} +1 -1
- package/dist/bundle/chunks/runtime-366HE7CW.js +2 -0
- package/dist/bundle/chunks/{typesafe-system-one-B4NNEG67.js → typesafe-system-one-ZSK3RN4B.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-KHZAOPVZ.js +2 -0
- package/dist/bundle/cli-runtime.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/agent-session.d.ts +14 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +89 -57
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +20 -13
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bug-report.d.ts +9 -1
- package/dist/core/bug-report.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts +6 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +7 -8
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +4 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +2 -3
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +31 -7
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/key-id-schema.d.ts +6 -0
- package/dist/core/key-id-schema.d.ts.map +1 -0
- package/dist/core/key-id-schema.js +16 -0
- package/dist/core/key-id-schema.js.map +1 -0
- package/dist/core/keybindings-schema.d.ts +4 -0
- package/dist/core/keybindings-schema.d.ts.map +1 -0
- package/dist/core/keybindings-schema.js +16 -0
- package/dist/core/keybindings-schema.js.map +1 -0
- package/dist/core/keybindings.d.ts +194 -62
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +26 -23
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +695 -74
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +16 -166
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +11 -6
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +3 -3
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +2 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +12 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +82 -24
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +5 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/settings-defaults.d.ts +65 -0
- package/dist/core/settings-defaults.d.ts.map +1 -0
- package/dist/core/settings-defaults.js +66 -0
- package/dist/core/settings-defaults.js.map +1 -0
- package/dist/core/settings-manager.d.ts +4 -147
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +48 -44
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +228 -0
- package/dist/core/settings-schema.d.ts.map +1 -0
- package/dist/core/settings-schema.js +287 -0
- package/dist/core/settings-schema.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +18 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +46 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +7 -40
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +64 -45
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +2 -1
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts +2 -2
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +9 -3
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +6 -12
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +44 -32
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/mcp/cli.js +5 -8
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +26 -23
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/resources.d.ts +0 -6
- package/dist/extensions/mcp/resources.d.ts.map +1 -1
- package/dist/extensions/mcp/resources.js +1 -1
- package/dist/extensions/mcp/resources.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +3 -6
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +4 -39
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +2 -3
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +62 -6
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/tool-search/tool.d.ts +0 -2
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +2 -4
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +3 -2
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +2 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +11 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +105 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.js +94 -0
- package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +13 -16
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +21 -29
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +4 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +6 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/docs/cli-integration.md +1 -1
- package/docs/cli.md +1 -1
- package/docs/codemode.md +1 -1
- package/docs/compaction.md +2 -2
- package/docs/environment-variables.md +2 -1
- package/docs/extensions.md +7 -4
- package/docs/keybindings.md +1 -0
- package/docs/mcp.md +1 -1
- package/docs/models.md +1 -0
- package/docs/providers.md +20 -0
- package/docs/settings.md +3 -1
- package/docs/themes.md +4 -2
- package/docs/tui.md +1 -1
- package/examples/README.md +0 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/plan-mode/index.ts +6 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +9 -20
- package/schemas/keybindings.schema.json +393 -0
- package/schemas/models.schema.json +1157 -0
- package/schemas/settings.schema.json +765 -0
- package/schemas/theme.schema.json +365 -0
- package/dist/bundle/chunks/anthropic-messages-KT2ID7DZ.js +0 -6
- package/dist/bundle/chunks/chunk-BK6FEHYX.js +0 -20
- package/dist/bundle/chunks/chunk-J757S5U3.js +0 -2
- package/dist/bundle/chunks/chunk-MXTZIDYW.js +0 -15
- package/dist/bundle/chunks/chunk-OTL6MGLJ.js +0 -134
- package/dist/bundle/chunks/chunk-W5MPVSHA.js +0 -82
- package/dist/bundle/chunks/easter-egg-3d-TQFQS342.js +0 -2
- package/dist/bundle/chunks/execute-7IRB5TUX.js +0 -490
- package/dist/bundle/chunks/openai-codex-responses-ZSLJZYOE.js +0 -10
- package/dist/bundle/chunks/runtime-ROGZ2EXI.js +0 -2
- package/dist/bundle/chunks/virtual-modules-4Y4G76EB.js +0 -2
- package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
- package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme-json.js +0 -132
- package/dist/modes/interactive/theme/theme-json.js.map +0 -1
- package/dist/modes/interactive/theme/theme-schema.json +0 -361
- package/examples/plugins/pi-example-plugin/README.md +0 -38
- package/examples/plugins/pi-example-plugin/package.json +0 -10
- package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
- package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
- package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
|
@@ -8,4 +8,4 @@ ${value}`);return parts.join(`
|
|
|
8
8
|
|
|
9
9
|
`)}function createInitialSystemMessage(systemPrompt,tools){let hasSystemPrompt=systemPrompt!==void 0&&systemPrompt.length>0,hasTools=tools!==void 0&&tools.length>0;if(!(!hasSystemPrompt&&!hasTools))return{role:"system",content:systemPrompt??"",...hasTools?{toolsAdded:tools}:{},timestamp:0}}function normalizeContext(context){let initialMessage=createInitialSystemMessage(context.systemPrompt,context.tools);return{messages:initialMessage?[initialMessage,...context.messages]:context.messages}}function isSystemMessage(message){return message.role==="system"}function getInitialSystemMessage(messages){let first=messages[0];return first&&isSystemMessage(first)?first:void 0}function withoutInitialSystemMessage(messages){return getInitialSystemMessage(messages)?messages.slice(1):messages}function getCurrentTools(messages){let tools=new Map;for(let message of messages)if(isSystemMessage(message)){for(let tool of message.toolsRemoved??[])tools.delete(tool.name);for(let tool of message.toolsAdded??[])tools.set(tool.name,tool)}return[...tools.values()]}function getCurrentSystemMessage(messages){let content=[],sections=new Map,timestamp;for(let message of messages){if(!isSystemMessage(message))continue;timestamp??=message.timestamp;let text=contentText(message.content);text.length>0&&content.push(text);for(let[name,value]of Object.entries(message.sections??{}))value===null?sections.delete(name):sections.set(name,value)}let tools=getCurrentTools(messages);if(!(timestamp===void 0&&tools.length===0))return{role:"system",content:content.join(`
|
|
10
10
|
|
|
11
|
-
`),...sections.size>0?{sections:Object.fromEntries(sections)}:{},...tools.length>0?{toolsAdded:tools}:{},timestamp:timestamp??0}}function getCurrentSystemPrompt(messages){let message=getCurrentSystemMessage(messages);return message?getSystemMessageText(message):""}function collapseSystemMessages(context){let head=getCurrentSystemMessage(context.messages),messages=context.messages.filter(message=>message.role!=="system");return{messages:head?[head,...messages]:messages}}function resolveTranscript(context,supportsMidConvoSystemMessages){return supportsMidConvoSystemMessages?context:collapseSystemMessages(context)}function toToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:JSON.parse(JSON.stringify(tool.parameters)),...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function declarationsEqual(left,right){return JSON.stringify(toToolDeclaration(left))===JSON.stringify(toToolDeclaration(right))}function getToolStateChanges(previous,current){let previousTools=new Map(previous.map(tool=>[tool.name,tool])),currentTools=new Map(current.map(tool=>[tool.name,tool]));return{toolsAdded:current.filter(tool=>{let previousTool=previousTools.get(tool.name);return previousTool===void 0||!declarationsEqual(previousTool,tool)}).map(toToolDeclaration),toolsRemoved:previous.filter(tool=>{let currentTool=currentTools.get(tool.name);return currentTool===void 0||!declarationsEqual(tool,currentTool)}).map(tool=>({name:tool.name}))}}function getDeclaredTools(messages){let definitions=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[])definitions.set(tool.name,tool);return[...definitions.values()]}function hasToolRedefinitions(messages){let declared=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[]){let previous=declared.get(tool.name);if(previous!==void 0&&!declarationsEqual(previous,tool))return!0;declared.set(tool.name,tool)}return!1}function hasNonAdditiveToolChanges(messages){let declared=new Set;for(let message of messages)if(isSystemMessage(message)){if((message.toolsRemoved?.length??0)>0)return!0;for(let tool of message.toolsAdded??[]){if(declared.has(tool.name))return!0;declared.add(tool.name)}}return!1}function resolveTranscriptTools(messages,supportsToolAdditions){let anchorsAdditions=supportsToolAdditions&&!hasNonAdditiveToolChanges(messages);return{requestTools:anchorsAdditions?getInitialSystemMessage(messages)?.toolsAdded??[]:getCurrentTools(messages),anchorsAdditions}}function createSetupErrorMessage(model,error,timestamp){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:error instanceof Error?error.message:String(error),timestamp}}function hasResult(source){return typeof source.result=="function"}async function forwardStream(target,source){for await(let event of source)target.push(event);target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let startedAt=Date.now(),outer=new AssistantMessageEventStream;return setup().then(inner=>forwardStream(outer,inner)).catch(error=>{let message=createSetupErrorMessage(model,error,startedAt);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{credentials=new Map;chains=new Map;enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var ModelsError=class extends Error{code;constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext;if(overrides?.apiKey!==void 0&&provider.auth.apiKey)return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,signal,overrides?.minOAuthValidityMs);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}return provider.auth.apiKey?resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,void 0,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]||await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3,DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3;async function refreshStoredOAuthCredential(credentials,providerId,oauth,needsRefresh,signal){let post,lockWait=new AbortController,cancelLockWait=()=>lockWait.abort(signal.reason);signal.addEventListener("abort",cancelLockWait,{once:!0}),signal.aborted&&cancelLockWait();try{post=await credentials.modify(providerId,async current=>{if(signal.removeEventListener("abort",cancelLockWait),signal.throwIfAborted(),current?.type==="oauth"&&needsRefresh(current))try{return await oauth.refresh(current,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS))}catch(error){throw new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error})}},{signal:lockWait.signal})}catch(error){throw error instanceof ModelsError?error:(signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error}))}finally{signal.removeEventListener("abort",cancelLockWait)}return post?.type==="oauth"?post:void 0}async function resolveStoredOAuth(credentials,providerId,oauth,stored,signal,minOAuthValidityMs){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,credential=stored;if(expiresSoon(credential)){let post=await refreshStoredOAuthCredential(credentials,providerId,oauth,expiresSoon,signal);if(!post)return;if(credential=post,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}try{return{auth:await oauth.toAuth(credential),source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}var InMemoryModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function getModelType(model){return model.type??"chat"}function isModelType(model,type){return getModelType(model)===type}function assertChatModel(model){if(!isModelType(model,"chat"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a chat model`)}function assertImageModel(model){if(!isModelType(model,"image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not an image model`)}function assertClassifierModel(model){if(!isModelType(model,"classifier"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a classifier model`)}function assertClassifierInputSupported(model,context){if(context.images?.length&&!model.input.includes("image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} does not accept image input`)}function imageErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function classifierErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}var KNOWN_MODEL_TYPES={chat:!0,image:!0,classifier:!0};function hasKnownModelType(model){return Object.hasOwn(KNOWN_MODEL_TYPES,getModelType(model))}function withKnownModelTypes(entry){return{...entry,models:entry.models.filter(hasKnownModelType)}}function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(options){this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getAllModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getAllModels?.()??entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getAllModels?.()??entry.getModels())}catch{}return models}getModelsOfType(type,provider){return this.getAllModels(provider).filter(model=>isModelType(model,type))}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}getModelOfType(type,provider,id){return this.getModelsOfType(type,provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?withKnownModelTypes(structuredClone(stored)):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await this.resolveRefreshCredential(provider,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async resolveRefreshCredential(provider,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;return oauth?Date.now()<stored.expires?stored:signal.aborted?void 0:refreshStoredOAuthCredential(this.credentials,provider.id,oauth,current=>Date.now()>=current.expires,signal):void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:this.authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){if(credential?.type==="oauth")return provider.auth.oauth?{source:"OAuth",type:"oauth"}:void 0;let apiKey=provider.auth.apiKey;if(!apiKey)return;if(apiKey.check)try{return await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal})}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});return resolution?{source:resolution.source,type:"api_key"}:void 0}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}async getAuthenticatedProviders(providerId,signal){signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).filter(entry=>entry.auth!==void 0)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getModels();return provider.filterModels?.(models,credential)??models}))();return raceWithAbortSignal(available,signal)}async getAvailableOfType(type,providerId,options){return(await this.getAllAvailable(providerId,options)).filter(model=>isModelType(model,type))}getAllAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getAllModels?.()??provider.getModels();if(provider.filterAllModels)return provider.filterAllModels(models,credential);if(!provider.filterModels)return models;let availableChatIds=new Set(provider.filterModels(provider.getModels(),credential).map(model=>model.id));return models.filter(model=>!isModelType(model,"chat")||availableChatIds.has(model.id))}))();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction,options){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let loginOperation=method.login({...interaction,signal},options),credential=await raceWithAbortSignal(loginOperation,signal),mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async()=>(mutationStarted=!0,markMutationStarted?.(),credential),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}requireChatProvider(model){return assertChatModel(model),this.requireProvider(model)}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,transcript,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,transcript,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireChatProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireChatProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}async generateImages(model,context,options){try{assertImageModel(model);let provider=this.requireProvider(model);if(!provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.generateImages(requestModel,context,requestOptions)}catch(error){return imageErrorResult(model,error,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model),assertClassifierInputSupported(model,context);let provider=this.requireProvider(model);if(!provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.classify(requestModel,context,requestOptions)}catch(error){return classifierErrorResult(model,error,options?.signal?.aborted)}}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let single=input.api&&typeof input.api.stream=="function"?input.api:void 0,byApi=single||!input.api?void 0:input.api,images=input.images,classifiers=input.classifiers,streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0),imageImplementations=Object.values(images??{}).filter(entry=>entry!==void 0),classifierImplementations=Object.values(classifiers??{}).filter(entry=>entry!==void 0);if(streams.length===0&&imageImplementations.length===0&&classifierImplementations.length===0)throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>getModelType(entry)===getModelType(model)&&entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,auth:input.auth,getModels:()=>currentModels().filter(model=>isModelType(model,"chat")),getAllModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let fetched=await fetchModels(context);if(context.signal.aborted)return;let refreshed=fetched.filter(hasKnownModelType);await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,filterAllModels:input.filterAllModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))};return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),images&&imageImplementations.length>0&&(provider.generateImages=async(model,context,options)=>{let implementation=images[model.api];return implementation?implementation.generateImages(model,context,options):imageErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no image generation implementation for "${model.api}"`))}),classifiers&&classifierImplementations.length>0&&(provider.classify=async(model,context,options)=>{let implementation=classifiers[model.api];return implementation?implementation.classify(model,context,options):classifierErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no classifier implementation for "${model.api}"`))}),provider}function hasApi(model,api){return isModelType(model,"chat")&&model.api===api}function calculateCost(model,usage){let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,rates=model.cost,matchedThreshold=-1;for(let tier of model.cost.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"];function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>{let mapped=model.thinkingLevelMap?.[level];return mapped===null?!1:level==="xhigh"||level==="max"?mapped!==void 0:!0}):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function modelsAreEqual(a,b){return!a||!b?!1:getModelType(a)===getModelType(b)&&a.id===b.id&&a.provider===b.provider}export{lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,ModelsError,InMemoryModelsStore,getModelType,isModelType,assertChatModel,assertImageModel,assertClassifierModel,assertClassifierInputSupported,imageErrorResult,classifierErrorResult,contentText,getSystemMessageText,renderSystemMessageUpdate,createInitialSystemMessage,normalizeContext,getInitialSystemMessage,withoutInitialSystemMessage,getCurrentTools,getCurrentSystemMessage,getCurrentSystemPrompt,collapseSystemMessages,resolveTranscript,toToolDeclaration,declarationsEqual,getToolStateChanges,getDeclaredTools,hasToolRedefinitions,hasNonAdditiveToolChanges,resolveTranscriptTools,createModels,createProvider,hasApi,calculateCost,getSupportedThinkingLevels,clampThinkingLevel,modelsAreEqual};
|
|
11
|
+
`),...sections.size>0?{sections:Object.fromEntries(sections)}:{},...tools.length>0?{toolsAdded:tools}:{},timestamp:timestamp??0}}function getCurrentSystemPrompt(messages){let message=getCurrentSystemMessage(messages);return message?getSystemMessageText(message):""}function collapseSystemMessages(context){let head=getCurrentSystemMessage(context.messages),messages=context.messages.filter(message=>message.role!=="system");return{messages:head?[head,...messages]:messages}}function resolveTranscript(context,supportsMidConvoSystemMessages){return supportsMidConvoSystemMessages?context:collapseSystemMessages(context)}function toToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:JSON.parse(JSON.stringify(tool.parameters)),...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function declarationsEqual(left,right){return JSON.stringify(toToolDeclaration(left))===JSON.stringify(toToolDeclaration(right))}function getToolStateChanges(previous,current){let previousTools=new Map(previous.map(tool=>[tool.name,tool])),currentTools=new Map(current.map(tool=>[tool.name,tool]));return{toolsAdded:current.filter(tool=>{let previousTool=previousTools.get(tool.name);return previousTool===void 0||!declarationsEqual(previousTool,tool)}).map(toToolDeclaration),toolsRemoved:previous.filter(tool=>{let currentTool=currentTools.get(tool.name);return currentTool===void 0||!declarationsEqual(tool,currentTool)}).map(tool=>({name:tool.name}))}}function getDeclaredTools(messages){let definitions=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[])definitions.set(tool.name,tool);return[...definitions.values()]}function hasToolRedefinitions(messages){let declared=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[]){let previous=declared.get(tool.name);if(previous!==void 0&&!declarationsEqual(previous,tool))return!0;declared.set(tool.name,tool)}return!1}function hasNonAdditiveToolChanges(messages){let declared=new Set;for(let message of messages)if(isSystemMessage(message)){if((message.toolsRemoved?.length??0)>0)return!0;for(let tool of message.toolsAdded??[]){if(declared.has(tool.name))return!0;declared.add(tool.name)}}return!1}function resolveTranscriptTools(messages,supportsToolAdditions){let anchorsAdditions=supportsToolAdditions&&!hasNonAdditiveToolChanges(messages);return{requestTools:anchorsAdditions?getInitialSystemMessage(messages)?.toolsAdded??[]:getCurrentTools(messages),anchorsAdditions}}function createSetupErrorMessage(model,error,timestamp){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:error instanceof Error?error.message:String(error),timestamp}}function hasResult(source){return typeof source.result=="function"}async function forwardStream(target,source){for await(let event of source)target.push(event);target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let startedAt=Date.now(),outer=new AssistantMessageEventStream;return setup().then(inner=>forwardStream(outer,inner)).catch(error=>{let message=createSetupErrorMessage(model,error,startedAt);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{credentials=new Map;chains=new Map;enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var ModelsError=class extends Error{code;constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext;if(overrides?.apiKey!==void 0&&provider.auth.apiKey)return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,signal,overrides?.minOAuthValidityMs);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}return provider.auth.apiKey?resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,void 0,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]||await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3,DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3;async function refreshStoredOAuthCredential(credentials,providerId,oauth,needsRefresh,signal){let post,lockWait=new AbortController,cancelLockWait=()=>lockWait.abort(signal.reason);signal.addEventListener("abort",cancelLockWait,{once:!0}),signal.aborted&&cancelLockWait();try{post=await credentials.modify(providerId,async current=>{if(signal.removeEventListener("abort",cancelLockWait),signal.throwIfAborted(),current?.type==="oauth"&&needsRefresh(current))try{return await oauth.refresh(current,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS))}catch(error){throw new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error})}},{signal:lockWait.signal})}catch(error){throw error instanceof ModelsError?error:(signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error}))}finally{signal.removeEventListener("abort",cancelLockWait)}return post?.type==="oauth"?post:void 0}async function resolveStoredOAuth(credentials,providerId,oauth,stored,signal,minOAuthValidityMs){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,credential=stored;if(expiresSoon(credential)){let post=await refreshStoredOAuthCredential(credentials,providerId,oauth,expiresSoon,signal);if(!post)return;if(credential=post,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}try{return{auth:await oauth.toAuth(credential),source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}var InMemoryModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function getModelType(model){return model.type??"chat"}function isModelType(model,type){return getModelType(model)===type}function assertChatModel(model){if(!isModelType(model,"chat"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a chat model`)}function assertImageModel(model){if(!isModelType(model,"image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not an image model`)}function assertClassifierModel(model){if(!isModelType(model,"classifier"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a classifier model`)}function assertClassifierInputSupported(model,context){if(context.images?.length&&!model.input.includes("image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} does not accept image input`)}function imageErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function classifierErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}var KNOWN_MODEL_TYPES={chat:!0,image:!0,classifier:!0};function hasKnownModelType(model){return Object.hasOwn(KNOWN_MODEL_TYPES,getModelType(model))}function withKnownModelTypes(entry){return{...entry,models:entry.models.filter(hasKnownModelType)}}function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(options){this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getAllModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getAllModels?.()??entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getAllModels?.()??entry.getModels())}catch{}return models}getModelsOfType(type,provider){return this.getAllModels(provider).filter(model=>isModelType(model,type))}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}getModelOfType(type,provider,id){return this.getModelsOfType(type,provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?withKnownModelTypes(structuredClone(stored)):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal,baseUrl:provider.baseUrl})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await this.resolveRefreshCredential(provider,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async resolveRefreshCredential(provider,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;return oauth?Date.now()<stored.expires?stored:signal.aborted?void 0:refreshStoredOAuthCredential(this.credentials,provider.id,oauth,current=>Date.now()>=current.expires,signal):void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:this.authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){if(credential?.type==="oauth")return provider.auth.oauth?{source:"OAuth",type:"oauth"}:void 0;let apiKey=provider.auth.apiKey;if(!apiKey)return;if(apiKey.check)try{return await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal})}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});return resolution?{source:resolution.source,type:"api_key"}:void 0}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}async getAuthenticatedProviders(providerId,signal){signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).filter(entry=>entry.auth!==void 0)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getModels();return provider.filterModels?.(models,credential)??models}))();return raceWithAbortSignal(available,signal)}async getAvailableOfType(type,providerId,options){return(await this.getAllAvailable(providerId,options)).filter(model=>isModelType(model,type))}getAllAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getAllModels?.()??provider.getModels();if(provider.filterAllModels)return provider.filterAllModels(models,credential);if(!provider.filterModels)return models;let availableChatIds=new Set(provider.filterModels(provider.getModels(),credential).map(model=>model.id));return models.filter(model=>!isModelType(model,"chat")||availableChatIds.has(model.id))}))();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction,options){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let loginOperation=method.login({...interaction,signal},options),credential=await raceWithAbortSignal(loginOperation,signal),mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async()=>(mutationStarted=!0,markMutationStarted?.(),credential),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}requireChatProvider(model){return assertChatModel(model),this.requireProvider(model)}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,transcript,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,transcript,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireChatProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireChatProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}async generateImages(model,context,options){try{assertImageModel(model);let provider=this.requireProvider(model);if(!provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.generateImages(requestModel,context,requestOptions)}catch(error){return imageErrorResult(model,error,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model),assertClassifierInputSupported(model,context);let provider=this.requireProvider(model);if(!provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.classify(requestModel,context,requestOptions)}catch(error){return classifierErrorResult(model,error,options?.signal?.aborted)}}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let single=input.api&&typeof input.api.stream=="function"?input.api:void 0,byApi=single||!input.api?void 0:input.api,images=input.images,classifiers=input.classifiers,streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0),imageImplementations=Object.values(images??{}).filter(entry=>entry!==void 0),classifierImplementations=Object.values(classifiers??{}).filter(entry=>entry!==void 0);if(streams.length===0&&imageImplementations.length===0&&classifierImplementations.length===0)throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>getModelType(entry)===getModelType(model)&&entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,auth:input.auth,getModels:()=>currentModels().filter(model=>isModelType(model,"chat")),getAllModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let fetched=await fetchModels(context);if(context.signal.aborted)return;let refreshed=fetched.filter(hasKnownModelType);await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,filterAllModels:input.filterAllModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))};return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),images&&imageImplementations.length>0&&(provider.generateImages=async(model,context,options)=>{let implementation=images[model.api];return implementation?implementation.generateImages(model,context,options):imageErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no image generation implementation for "${model.api}"`))}),classifiers&&classifierImplementations.length>0&&(provider.classify=async(model,context,options)=>{let implementation=classifiers[model.api];return implementation?implementation.classify(model,context,options):classifierErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no classifier implementation for "${model.api}"`))}),provider}function hasApi(model,api){return isModelType(model,"chat")&&model.api===api}function calculateCost(model,usage){let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,rates=model.cost,matchedThreshold=-1;for(let tier of model.cost.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"];function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>{let mapped=model.thinkingLevelMap?.[level];return mapped===null?!1:level==="xhigh"||level==="max"?mapped!==void 0:!0}):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function modelsAreEqual(a,b){return!a||!b?!1:getModelType(a)===getModelType(b)&&a.id===b.id&&a.provider===b.provider}export{lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,ModelsError,InMemoryModelsStore,getModelType,isModelType,assertChatModel,assertImageModel,assertClassifierModel,assertClassifierInputSupported,imageErrorResult,classifierErrorResult,contentText,getSystemMessageText,renderSystemMessageUpdate,createInitialSystemMessage,normalizeContext,getInitialSystemMessage,withoutInitialSystemMessage,getCurrentTools,getCurrentSystemMessage,getCurrentSystemPrompt,collapseSystemMessages,resolveTranscript,toToolDeclaration,declarationsEqual,getToolStateChanges,getDeclaredTools,hasToolRedefinitions,hasNonAdditiveToolChanges,resolveTranscriptTools,createModels,createProvider,hasApi,calculateCost,getSupportedThinkingLevels,clampThinkingLevel,modelsAreEqual};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{isRecord,parseClassifierUsage,postClassifierRequest,requiredNumber}from"./chunk-
|
|
2
|
+
import{isRecord,parseClassifierUsage,postClassifierRequest,requiredNumber}from"./chunk-XIX7LUWI.js";import{formatProviderError,normalizeProviderError}from"./chunk-TEPMHNKQ.js";function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer=value[id];if(!isRecord(answer))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer.type!=="choice"||typeof answer.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer.choice,probabilities:probabilities(label,answer.probabilities,id),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer.score,`score for ${id}`),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else{if(answer.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}async function classifySystemOne(transport,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(context.images?.length)throw new Error(`${transport.label} does not support image input`);let body=await postClassifierRequest(transport.label,transport.url(model),model,transport.payload(model,wireRequest(context)),options),result=transport.output(body),usage=parseClassifierUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport.label} error`),output}}export{classifySystemOne};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
+
function combineAbortSignals(signals){let activeSignals=signals.filter(signal=>signal!==void 0);if(activeSignals.length===0)return{cleanup:()=>{}};if(activeSignals.length===1)return{signal:activeSignals[0],cleanup:()=>{}};let controller=new AbortController,listeners=[],abort=signal=>{controller.signal.aborted||controller.abort(signal.reason)};for(let signal of activeSignals){if(signal.aborted){abort(signal);break}let listener=()=>abort(signal);signal.addEventListener("abort",listener,{once:!0}),listeners.push({signal,listener})}return{signal:controller.signal,cleanup:()=>{for(let{signal,listener}of listeners)signal.removeEventListener("abort",listener)}}}export{combineAbortSignals};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{shortHash}from"./chunk-PJACZCIR.js";import{appendGrammarToolInputJsonDelta,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-
|
|
2
|
+
import{shortHash}from"./chunk-PJACZCIR.js";import{appendGrammarToolInputJsonDelta,getGrammarToolInput,getJsonSchemaToolParameters,resolveGrammarConstrainedSampling,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-WBQBCFWG.js";import{sanitizeSurrogates}from"./chunk-L2ZPNLYD.js";import{parseStreamingJson}from"./chunk-TRDNDS6A.js";import{calculateCost,getSystemMessageText,renderSystemMessageUpdate,resolveTranscript,resolveTranscriptTools}from"./chunk-HACVPRBJ.js";function encodeTextSignatureV1(id,phase){let payload={v:1,id};return phase&&(payload.phase=phase),JSON.stringify(payload)}function parseTextSignature(signature){if(signature){if(signature.startsWith("{"))try{let parsed=JSON.parse(signature);if(parsed.v===1&&typeof parsed.id=="string")return parsed.phase==="commentary"||parsed.phase==="final_answer"?{id:parsed.id,phase:parsed.phase}:{id:parsed.id}}catch{}return{id:signature}}}function convertToolResultOutput(model,content){let textResult=content.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
3
3
|
`),images=content.filter(c=>c.type==="image"),hasText=textResult.length>0;if(images.length===0||!model.input.includes("image"))return sanitizeSurrogates(hasText?textResult:images.length>0?"(see attached image)":"(no tool output)");let output=[];hasText&&output.push({type:"input_text",text:sanitizeSurrogates(textResult)});for(let image of images)output.push({type:"input_image",detail:"auto",image_url:`data:${image.mimeType};base64,${image.data}`});return output}function convertResponsesMessages(model,context,allowedToolCallProviders,options){let normalizedContext=resolveTranscript(context,options?.supportsMidConvoSystemMessages),messages=[],normalizeIdPart=part=>{let sanitized=part.replace(/[^a-zA-Z0-9_-]/g,"_");return(sanitized.length>64?sanitized.slice(0,64):sanitized).replace(/_+$/,"")},buildForeignResponsesItemId=itemId=>{let normalized=`fc_${shortHash(itemId)}`;return normalized.length>64?normalized.slice(0,64):normalized},normalizeToolCallId=(id,_targetModel,source)=>{if(!allowedToolCallProviders.has(model.provider)||!id.includes("|"))return normalizeIdPart(id);let[callId,itemId]=id.split("|"),normalizedCallId=normalizeIdPart(callId),normalizedItemId=source.provider!==model.provider||source.api!==model.api?buildForeignResponsesItemId(itemId):normalizeIdPart(itemId);return normalizedItemId.startsWith("fc_")||(normalizedItemId=normalizeIdPart(`fc_${normalizedItemId}`)),`${normalizedCallId}|${normalizedItemId}`},transformedMessages=transformMessages(normalizedContext.messages,model,normalizeToolCallId),transcriptTools=resolveTranscriptTools(normalizedContext.messages,(options?.supportsAdditionalTools??!1)||(options?.supportsToolSearch??!1)),appendSystemToolAdditions=(message,seed)=>{let tools=transcriptTools.anchorsAdditions?message.toolsAdded??[]:[];if(tools.length===0)return;if(options?.supportsAdditionalTools){messages.push({type:"additional_tools",role:"developer",tools:convertResponsesTools(tools,options.toolOptions)});return}if(!options?.supportsToolSearch)return;let names=tools.map(tool=>tool.name),callId=`pi_tool_load_${shortHash(`${seed}:${names.join(",")}`)}`;messages.push({type:"tool_search_call",call_id:callId,execution:"client",status:"completed",arguments:{query:names.join(" "),limit:names.length}}),messages.push({type:"tool_search_output",call_id:callId,execution:"client",status:"completed",tools:convertResponsesTools(tools,{...options.toolOptions,toolSearchResult:!0})})},includeInitialSystemMessage=options?.includeSystemPrompt??!0,compat=model.compat,instructionRole=model.reasoning&&compat?.supportsDeveloperRole!==!1?"developer":"system",msgIndex=0,sourceIndex=0;for(let msg of transformedMessages){let isLeadingSystemMessage=sourceIndex++===0&&msg.role==="system";if(msg.role==="system"){if(isLeadingSystemMessage||appendSystemToolAdditions(msg,`system:${msgIndex}`),!isLeadingSystemMessage||includeInitialSystemMessage){let text=isLeadingSystemMessage?getSystemMessageText(msg):renderSystemMessageUpdate(msg);text.length>0&&messages.push({role:instructionRole,content:sanitizeSurrogates(text)})}}else if(msg.role==="user")if(typeof msg.content=="string")messages.push({role:"user",content:[{type:"input_text",text:sanitizeSurrogates(msg.content)}]});else{let content=msg.content.map(item=>item.type==="text"?{type:"input_text",text:sanitizeSurrogates(item.text)}:{type:"input_image",detail:"auto",image_url:`data:${item.mimeType};base64,${item.data}`});if(content.length===0)continue;messages.push({role:"user",content})}else if(msg.role==="assistant"){let output=[],assistantMsg=msg,isSameProviderAndApi=assistantMsg.provider===model.provider&&assistantMsg.api===model.api,isSameModel=isSameProviderAndApi&&assistantMsg.model===model.id,isDifferentModel=isSameProviderAndApi&&assistantMsg.model!==model.id,textBlockIndex=0;for(let block of msg.content)if(block.type==="thinking"){if(block.thinkingSignature){let reasoningItem=JSON.parse(block.thinkingSignature);output.push(reasoningItem)}}else if(block.type==="text"){let textBlock=block,parsedSignature=parseTextSignature(textBlock.textSignature),fallbackMessageId=textBlockIndex===0?`msg_pi_${msgIndex}`:`msg_pi_${msgIndex}_${textBlockIndex}`;textBlockIndex++;let msgId=parsedSignature?.id;msgId?msgId.length>64&&(msgId=`msg_${shortHash(msgId)}`):msgId=fallbackMessageId,output.push({type:"message",role:"assistant",content:[{type:"output_text",text:sanitizeSurrogates(textBlock.text),annotations:[]}],status:"completed",id:msgId,phase:parsedSignature?.phase})}else if(block.type==="toolCall"){let toolCall=block,[callId,itemIdRaw]=toolCall.id.split("|"),customInputProperty=options?.grammarToolInputProperties?.get(toolCall.name),itemId=itemIdRaw,itemIdPrefix=customInputProperty===void 0?"fc_":"ctc_";(isDifferentModel||!itemId?.startsWith(itemIdPrefix))&&(itemId=void 0),customInputProperty!==void 0?output.push({type:"custom_tool_call",id:itemId,call_id:callId,name:toolCall.name,input:sanitizeSurrogates(getGrammarToolInput(toolCall.name,toolCall.arguments,customInputProperty)),...isSameModel&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}}):output.push({type:"function_call",id:itemId,call_id:callId,name:toolCall.name,arguments:JSON.stringify(toolCall.arguments),...isSameModel&&toolCall.namespace!==void 0?{namespace:toolCall.namespace}:{}})}if(output.length===0)continue;messages.push(...output)}else if(msg.role==="toolResult"){let[callId]=msg.toolCallId.split("|"),output=convertToolResultOutput(model,msg.content);options?.grammarToolInputProperties?.has(msg.toolName)?messages.push({type:"custom_tool_call_output",call_id:callId,output}):messages.push({type:"function_call_output",call_id:callId,output})}isLeadingSystemMessage||msgIndex++}return messages}function convertResponsesTools(tools,options){let defaultStrict=options?.strict===void 0?!1:options.strict,supportsStrictMode=options?.supportsStrictMode??!0,supportsOpenAIGrammarTools=options?.supportsOpenAIGrammarTools??!1;return tools.map(tool=>{let grammar=resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools);if(grammar)return{type:"custom",name:tool.name,description:tool.description,format:{type:"grammar",syntax:grammar.format,definition:grammar.definition},...options?.toolSearchResult?{defer_loading:!0}:{}};let strict=resolveJsonSchemaStrictSampling(tool,supportsStrictMode)??defaultStrict,functionTool={type:"function",name:tool.name,description:tool.description,parameters:getJsonSchemaToolParameters(tool,strict===!0),...options?.toolSearchResult?{defer_loading:!0}:{}};return supportsStrictMode&&(functionTool.strict=strict),functionTool})}function getCustomToolCallInput(block){let property=block.customInput?.property;if(property===void 0)return"";let value=block.arguments[property];return typeof value=="string"?value:""}function appendCustomToolCallInput(block,nextInput,close){let customInput=block.customInput;if(!customInput)return;let delta=appendGrammarToolInputJsonDelta(customInput.jsonBuffer,customInput.property,nextInput,close);return block.arguments={[customInput.property]:nextInput},delta}async function processResponsesStream(openaiStream,output,stream,model,options){let sawTerminalResponseEvent=!1,outputSlots=new Map,reasoningBlocksById=new Map,applyMessagePhaseStopReason=item=>{item.type==="message"&&item.phase==="final_answer"&&(output.stopReason="stop")},getSlot=(outputIndex,type)=>{let slot=outputSlots.get(outputIndex);return slot?.type===type?slot:void 0},pushToolCallDelta=(slot,delta)=>{delta!==void 0&&stream.push({type:"toolcall_delta",contentIndex:slot.contentIndex,delta,partial:output})},createSlot=(outputIndex,item)=>{if(item.type==="reasoning"){let block={type:"thinking",thinking:""};output.content.push(block);let slot={type:"thinking",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"thinking_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="message"){applyMessagePhaseStopReason(item);let block={type:"text",text:""};output.content.push(block);let slot={type:"text",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"text_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="function_call"){let block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{},...item.namespace!==void 0?{namespace:item.namespace}:{},partialJson:item.arguments||""};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}if(item.type==="custom_tool_call"){let inputProperty=options?.grammarToolInputProperties?.get(item.name)??"input",input=item.input||"",block={type:"toolCall",id:`${item.call_id}|${item.id}`,name:item.name,arguments:{[inputProperty]:input},...item.namespace!==void 0?{namespace:item.namespace}:{},customInput:{property:inputProperty,jsonBuffer:{input:"",started:!1,closed:!1}}};output.content.push(block);let slot={type:"toolCall",block,contentIndex:output.content.length-1};return outputSlots.set(outputIndex,slot),stream.push({type:"toolcall_start",contentIndex:slot.contentIndex,partial:output}),slot}},getOrCreateSlot=(outputIndex,item)=>outputSlots.get(outputIndex)??createSlot(outputIndex,item),backfillReasoningSignatures=responseOutput=>{for(let item of responseOutput){if(item.type!=="reasoning"||!item.encrypted_content)continue;let block=reasoningBlocksById.get(item.id);if(!block?.thinkingSignature)continue;let storedItem=JSON.parse(block.thinkingSignature);storedItem.encrypted_content||(block.thinkingSignature=JSON.stringify({...storedItem,encrypted_content:item.encrypted_content}))}},finalizeResponse=response=>{if(sawTerminalResponseEvent=!0,backfillReasoningSignatures(response.output??[]),response?.id&&(output.responseId=response.id),response?.usage){let inputDetails=response.usage.input_tokens_details,cachedTokens=inputDetails?.cached_tokens||0,cacheWriteTokens=inputDetails?.cache_write_tokens||0;output.usage={input:Math.max(0,(response.usage.input_tokens||0)-cachedTokens-cacheWriteTokens),output:response.usage.output_tokens||0,cacheRead:cachedTokens,cacheWrite:cacheWriteTokens,reasoning:response.usage.output_tokens_details?.reasoning_tokens||0,totalTokens:response.usage.total_tokens||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}if(calculateCost(model,output.usage),options?.applyServiceTierPricing){let serviceTier=options.resolveServiceTier?options.resolveServiceTier(response?.service_tier,options.serviceTier):response?.service_tier??options.serviceTier;options.applyServiceTierPricing(output.usage,serviceTier)}let status=response?.status,incompleteDetails=response?.incomplete_details,incompleteReason=typeof incompleteDetails?.reason=="string"?incompleteDetails.reason:void 0;output.rawStopReason=incompleteReason?`${status}.${incompleteReason}`:status;let mappedStop=mapStopReason(status,incompleteReason);output.stopReason=mappedStop.stopReason,mappedStop.errorMessage===void 0?delete output.errorMessage:output.errorMessage=mappedStop.errorMessage,output.content.some(b=>b.type==="toolCall")&&output.stopReason==="stop"&&(output.stopReason="toolUse")};for await(let event of openaiStream)if(await options?.onProviderStreamEvent?.(event,model),event.type==="response.created")output.responseId=event.response.id;else if(event.type==="response.output_item.added")createSlot(event.output_index,event.item);else if(event.type==="response.reasoning_summary_text.delta"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=event.delta,stream.push({type:"thinking_delta",contentIndex:slot.contentIndex,delta:event.delta,partial:output})}else if(event.type==="response.reasoning_summary_part.done"){let slot=getSlot(event.output_index,"thinking");if(!slot)continue;slot.block.thinking+=`
|
|
4
4
|
|
|
5
5
|
`,stream.push({type:"thinking_delta",contentIndex:slot.contentIndex,delta:`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{clampThinkingLevel,getSystemMessageText}from"./chunk-CH4ZBH45.js";function loadNodeOs(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:os")??null}var nodeOs=loadNodeOs();function getPiUserAgent(){return nodeOs?`pi (${nodeOs.platform()} ${nodeOs.release()}; ${nodeOs.arch()})`:"pi (browser)"}var UnsupportedStrictJsonSchemaError=class extends Error{},UNSUPPORTED_STRICT_SCHEMA_KEYS=["$ref","$defs","definitions","allOf","oneOf","patternProperties","dependentSchemas","dependencies","unevaluatedProperties","propertyNames","contains","prefixItems","not","if","then","else"];function isJsonSchemaObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isStructuredSchema(schema){if(!isJsonSchemaObject(schema))return!1;let types=typeof schema.type=="string"?[schema.type]:Array.isArray(schema.type)?schema.type:[];return types.includes("object")||types.includes("array")||schema.properties!==void 0||schema.items!==void 0}function schemaAllowsNull(schema){return isJsonSchemaObject(schema)?schema.type==="null"||Array.isArray(schema.type)&&schema.type.includes("null")||schema.const===null||Array.isArray(schema.enum)&&schema.enum.includes(null)?!0:Array.isArray(schema.anyOf)&&schema.anyOf.some(variant=>schemaAllowsNull(variant)):!1}function makeJsonSchemaNodeStrict(schema,isUnsupportedKeyword){if(!isJsonSchemaObject(schema))throw new UnsupportedStrictJsonSchemaError("boolean schemas are unsupported");for(let key of UNSUPPORTED_STRICT_SCHEMA_KEYS)if(schema[key]!==void 0)throw new UnsupportedStrictJsonSchemaError(`${key} schemas are unsupported`);if(isUnsupportedKeyword){for(let[key,value]of Object.entries(schema))if(isUnsupportedKeyword(key,value))throw new UnsupportedStrictJsonSchemaError(`${key}: ${JSON.stringify(value)} is unsupported`)}if(schema.anyOf!==void 0){if(!Array.isArray(schema.anyOf)||schema.anyOf.length===0)throw new UnsupportedStrictJsonSchemaError("anyOf must contain at least one schema");for(let variant of schema.anyOf){if(isStructuredSchema(variant))throw new UnsupportedStrictJsonSchemaError("object and array unions are unsupported");makeJsonSchemaNodeStrict(variant,isUnsupportedKeyword)}}if(schema.items!==void 0){if(Array.isArray(schema.items))throw new UnsupportedStrictJsonSchemaError("tuple schemas are unsupported");makeJsonSchemaNodeStrict(schema.items,isUnsupportedKeyword)}let isObjectSchema=schema.type==="object";if(schema.properties!==void 0&&!isObjectSchema)throw new UnsupportedStrictJsonSchemaError("properties require type object");if(!isObjectSchema)return;if(schema.additionalProperties!==void 0&&schema.additionalProperties!==!1)throw new UnsupportedStrictJsonSchemaError("schema-valued or true additionalProperties is unsupported");if(schema.properties!==void 0&&!isJsonSchemaObject(schema.properties))throw new UnsupportedStrictJsonSchemaError("object properties must be a schema map");if(schema.required!==void 0&&(!Array.isArray(schema.required)||schema.required.some(key=>typeof key!="string")))throw new UnsupportedStrictJsonSchemaError("object required must be a string array");let properties=schema.properties??{},propertyNames=Object.keys(properties),required=new Set(Array.isArray(schema.required)?schema.required:[]);if([...required].some(key=>!propertyNames.includes(key)))throw new UnsupportedStrictJsonSchemaError("required contains an unknown property");for(let[key,property]of Object.entries(properties))makeJsonSchemaNodeStrict(property,isUnsupportedKeyword),!required.has(key)&&!schemaAllowsNull(property)&&(properties[key]={anyOf:[property,{type:"null"}]});schema.required=propertyNames,schema.additionalProperties=!1}function makeStrictJsonSchema(schema,isUnsupportedKeyword){let cloned=structuredClone(schema);if(!isJsonSchemaObject(cloned))throw new UnsupportedStrictJsonSchemaError("root schema must have type object");if(makeJsonSchemaNodeStrict(cloned,isUnsupportedKeyword),cloned.type!=="object")throw new UnsupportedStrictJsonSchemaError("root schema must have type object");return cloned}function getJsonSchemaToolParameters(tool,strict){return strict===!0?makeStrictJsonSchema(tool.parameters):tool.parameters}function getGrammarToolInput(toolName,arguments_,inputProperty){let input=arguments_[inputProperty];if(typeof input!="string")throw new Error(`Grammar tool call "${toolName}" requires argument "${inputProperty}" to be a string.`);return input}function appendGrammarToolInputJsonDelta(buffer,inputProperty,nextInput,close){if(buffer.closed){if(close&&nextInput===buffer.input)return;throw new Error(`grammar tool input for property "${inputProperty}" changed after it was closed`)}if(!nextInput.startsWith(buffer.input))throw new Error(`grammar tool input for property "${inputProperty}" changed non-monotonically`);let inputDelta=nextInput.slice(buffer.input.length);if(!close&&inputDelta.length===0)return;let delta="";return buffer.started||(delta+=`{${JSON.stringify(inputProperty)}:"`,buffer.started=!0),delta+=JSON.stringify(inputDelta).slice(1,-1),buffer.input=nextInput,close&&(delta+='"}',buffer.closed=!0),delta}function inferGrammarInputProperty(tool){let schema=tool.parameters;if(schema.type!=="object")throw new Error("grammar constrained sampling requires an object parameter schema");if(!Array.isArray(schema.required)||schema.required.length!==1||typeof schema.required[0]!="string")throw new Error("grammar constrained sampling requires exactly one required string property");let inputProperty=schema.required[0];if(!schema.properties?.[inputProperty])throw new Error(`grammar constrained sampling requires a properties entry for ${inputProperty}`);if(schema.properties[inputProperty]?.type!=="string")throw new Error(`grammar constrained sampling property ${inputProperty} must have type string`);return inputProperty}function resolveJsonSchemaStrictSampling(tool,supportsStrictMode,isUnsupportedKeyword){let config=tool.constrainedSampling;if(!(!config||config.type!=="json_schema")){if(supportsStrictMode)try{return makeStrictJsonSchema(tool.parameters,isUnsupportedKeyword),!0}catch(error){if(!(error instanceof UnsupportedStrictJsonSchemaError))throw error;if(config.strict!=="require")return;throw new Error(`Tool "${tool.name}" requires JSON-schema constrained sampling, but ${error.message}.`)}if(config.strict==="require")throw new Error(`Tool "${tool.name}" requires JSON-schema constrained sampling, but strict tools are unsupported.`)}}function resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools){let config=tool.constrainedSampling;if(!config||config.type!=="grammar"||!supportsOpenAIGrammarTools)return;let larkDefinition=config.variants.openai_lark,regexDefinition=config.variants.openai_regex,hasLarkDefinition=typeof larkDefinition=="string"&&larkDefinition.trim().length>0,hasRegexDefinition=typeof regexDefinition=="string"&®exDefinition.trim().length>0;if(!hasLarkDefinition&&!hasRegexDefinition)throw new Error(`Tool "${tool.name}" cannot use grammar constrained sampling: no supported grammar variant was provided.`);try{return{format:hasLarkDefinition?"lark":"regex",definition:hasLarkDefinition?larkDefinition:regexDefinition,inputProperty:inferGrammarInputProperty(tool)}}catch(error){let message=error instanceof Error?error.message:String(error);throw new Error(`Tool "${tool.name}" cannot use grammar constrained sampling: ${message}.`)}}function createGrammarToolInputProperties(tools,supportsOpenAIGrammarTools){let properties=new Map;for(let tool of tools??[]){let grammar=resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools);grammar&&properties.set(tool.name,grammar.inputProperty)}return properties}var CHARS_PER_TOKEN=3.5,ESTIMATED_IMAGE_CHARS=4800;function calculateContextTokens(usage){return usage.totalTokens||usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function safeJsonStringify(value){try{return JSON.stringify(value)??"undefined"}catch{return"[unserializable]"}}function estimateTextAndImageContentChars(content){if(typeof content=="string")return content.length;let chars=0;for(let block of content)chars+=block.type==="text"?block.text.length:ESTIMATED_IMAGE_CHARS;return chars}function estimateTextTokens(text){return Math.ceil(text.length/CHARS_PER_TOKEN)}function estimateTextAndImageContentTokens(content){return Math.ceil(estimateTextAndImageContentChars(content)/CHARS_PER_TOKEN)}function estimateMessageTokens(message){let chars=0;if(message.role==="system")return estimateTextTokens(getSystemMessageText(message))+estimateToolsTokens(message.toolsAdded)+estimateToolsTokens(message.toolsRemoved);if(message.role==="user"||message.role==="toolResult")return estimateTextAndImageContentTokens(message.content);for(let block of message.content)block.type==="text"?chars+=block.text.length:block.type==="thinking"?chars+=block.thinking.length:chars+=block.name.length+safeJsonStringify(block.arguments).length;return Math.ceil(chars/CHARS_PER_TOKEN)}function getLastAssistantUsageInfo(messages){let latestPrefixTimestamp=Number.NEGATIVE_INFINITY,usageInfo;for(let i=0;i<messages.length;i++){let message=messages[i];if(message.role==="assistant"){let assistant=message;assistant.timestamp>=latestPrefixTimestamp&&assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens(assistant.usage)>0&&(usageInfo={usage:assistant.usage,index:i})}latestPrefixTimestamp=Math.max(latestPrefixTimestamp,message.timestamp)}return usageInfo}function estimateContextTokens(context){let messages="messages"in context?context.messages:context,usageInfo=getLastAssistantUsageInfo(messages);if(usageInfo){let usageTokens=calculateContextTokens(usageInfo.usage),trailingTokens=0;for(let i=usageInfo.index+1;i<messages.length;i++)trailingTokens+=estimateMessageTokens(messages[i]);return{tokens:usageTokens+trailingTokens,usageTokens,trailingTokens,lastUsageIndex:usageInfo.index}}let tokens=0;for(let message of messages)tokens+=estimateMessageTokens(message);return{tokens,usageTokens:0,trailingTokens:tokens,lastUsageIndex:null}}function estimateToolsTokens(tools){return!tools||tools.length===0?0:estimateTextTokens(safeJsonStringify(tools))}var CONTEXT_SAFETY_TOKENS=4096,MIN_MAX_TOKENS=1;function clampMaxTokensToContext(model,context,maxTokens){if(model.contextWindow<=0)return Math.max(MIN_MAX_TOKENS,maxTokens);let available=model.contextWindow-estimateContextTokens(context).tokens-CONTEXT_SAFETY_TOKENS;return Math.min(maxTokens,Math.max(MIN_MAX_TOKENS,available))}function resolveSamplingParams(model,thinkingLevel,requestParams){let effectiveThinkingLevel=clampThinkingLevel(model,thinkingLevel),thinkingLevelParams=model.samplingParamsByThinkingLevel?.[effectiveThinkingLevel];return model.samplingParams||thinkingLevelParams||requestParams?{...model.samplingParams,...thinkingLevelParams,...requestParams}:void 0}function buildBaseOptions(model,context,options,apiKey){let samplingParams=resolveSamplingParams(model,options?.reasoning??"off",options?.samplingParams);return{temperature:options?.temperature,samplingParams,maxTokens:clampMaxTokensToContext(model,context,options?.maxTokens??model.maxTokens),signal:options?.signal,telemetryContext:options?.telemetryContext,apiKey:apiKey||options?.apiKey,fetch:options?.fetch,transport:options?.transport,cacheRetention:options?.cacheRetention,sessionId:options?.sessionId,headers:options?.headers,onPayload:options?.onPayload,onResponse:options?.onResponse,onProviderStreamEvent:options?.onProviderStreamEvent,timeoutMs:options?.timeoutMs,websocketConnectTimeoutMs:options?.websocketConnectTimeoutMs,maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,metadata:options?.metadata,env:options?.env}}var MIN_ANSWER_TOKENS=1024,DEFAULT_THINKING_BUDGETS={minimal:1024,low:2048,medium:8192,high:16384};function clampReasoning(effort){return effort==="xhigh"||effort==="max"?"high":effort}function thinkingBudgetForLevel(reasoningLevel,customBudgets){let budgets={...DEFAULT_THINKING_BUDGETS,...customBudgets},level=clampReasoning(reasoningLevel);return budgets[level]}function clampThinkingBudgetToAnswerRoom(thinkingBudget,ceiling){return Math.min(thinkingBudget,Math.max(0,ceiling-MIN_ANSWER_TOKENS))}function adjustMaxTokensForThinking(baseMaxTokens,modelMaxTokens,reasoningLevel,customBudgets){let thinkingBudget=thinkingBudgetForLevel(reasoningLevel,customBudgets),maxTokens=baseMaxTokens===void 0?modelMaxTokens:Math.min(baseMaxTokens+thinkingBudget,modelMaxTokens);return maxTokens<=thinkingBudget&&(thinkingBudget=clampThinkingBudgetToAnswerRoom(thinkingBudget,maxTokens)),{maxTokens,thinkingBudget}}var NON_VISION_USER_IMAGE_PLACEHOLDER="(image omitted: model does not support images)",NON_VISION_TOOL_IMAGE_PLACEHOLDER="(tool image omitted: model does not support images)";function replaceImagesWithPlaceholder(content,placeholder){let result=[],previousWasPlaceholder=!1;for(let block of content){if(block.type==="image"){previousWasPlaceholder||result.push({type:"text",text:placeholder}),previousWasPlaceholder=!0;continue}result.push(block),previousWasPlaceholder=block.text===placeholder}return result}function downgradeUnsupportedImages(messages,model){return model.input.includes("image")?messages:messages.map(msg=>msg.role==="user"&&Array.isArray(msg.content)?{...msg,content:replaceImagesWithPlaceholder(msg.content,NON_VISION_USER_IMAGE_PLACEHOLDER)}:msg.role==="toolResult"?{...msg,content:replaceImagesWithPlaceholder(msg.content,NON_VISION_TOOL_IMAGE_PLACEHOLDER)}:msg)}function transformMessages(messages,model,normalizeToolCallId){let toolCallIdMap=new Map,normalizedMessages=messages.map(msg=>msg.content==null?{...msg,content:[]}:msg),transformed=downgradeUnsupportedImages(normalizedMessages,model).map(msg=>{if(msg.role==="system"||msg.role==="user")return msg;if(msg.role==="toolResult"){let normalizedId=toolCallIdMap.get(msg.toolCallId);return normalizedId&&normalizedId!==msg.toolCallId?{...msg,toolCallId:normalizedId}:msg}if(msg.role==="assistant"){let assistantMsg=msg,isSameModel=assistantMsg.provider===model.provider&&assistantMsg.api===model.api&&assistantMsg.model===model.id,transformedContent=assistantMsg.content.flatMap(block=>{if(block.type==="thinking")return block.redacted?isSameModel?block:[]:isSameModel&&block.thinkingSignature?block:!block.thinking||block.thinking.trim()===""?[]:isSameModel?block:{type:"text",text:block.thinking};if(block.type==="text")return isSameModel?block:{type:"text",text:block.text};if(block.type==="toolCall"){let toolCall=block,normalizedToolCall=toolCall;if(!isSameModel&&toolCall.thoughtSignature&&(normalizedToolCall={...toolCall},delete normalizedToolCall.thoughtSignature),!isSameModel&&normalizeToolCallId){let normalizedId=normalizeToolCallId(toolCall.id,model,assistantMsg);normalizedId!==toolCall.id&&(toolCallIdMap.set(toolCall.id,normalizedId),normalizedToolCall={...normalizedToolCall,id:normalizedId})}return normalizedToolCall}return block});return{...assistantMsg,content:transformedContent}}return msg}),result=[],pendingToolCalls=[],existingToolResultIds=new Set,heldSystemMessages=[],closePendingToolCalls=()=>{if(pendingToolCalls.length>0){for(let tc of pendingToolCalls)existingToolResultIds.has(tc.id)||result.push({role:"toolResult",toolCallId:tc.id,toolName:tc.name,content:[{type:"text",text:"No result provided"}],isError:!0,timestamp:Date.now()});pendingToolCalls=[],existingToolResultIds=new Set}result.push(...heldSystemMessages),heldSystemMessages.length=0};for(let i=0;i<transformed.length;i++){let msg=transformed[i];if(msg.role==="assistant"){closePendingToolCalls();let assistantMsg=msg;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted")continue;let toolCalls=assistantMsg.content.filter(b=>b.type==="toolCall");toolCalls.length>0&&(pendingToolCalls=toolCalls,existingToolResultIds=new Set),result.push(msg)}else msg.role==="toolResult"?(existingToolResultIds.add(msg.toolCallId),result.push(msg)):msg.role==="system"?pendingToolCalls.length>0?heldSystemMessages.push(msg):result.push(msg):(msg.role==="user"&&closePendingToolCalls(),result.push(msg))}return closePendingToolCalls(),result}export{getPiUserAgent,getJsonSchemaToolParameters,getGrammarToolInput,appendGrammarToolInputJsonDelta,resolveJsonSchemaStrictSampling,resolveGrammarConstrainedSampling,createGrammarToolInputProperties,clampMaxTokensToContext,resolveSamplingParams,buildBaseOptions,thinkingBudgetForLevel,clampThinkingBudgetToAnswerRoom,adjustMaxTokensForThinking,transformMessages};
|
|
2
|
+
import{clampThinkingLevel,getSystemMessageText}from"./chunk-HACVPRBJ.js";function loadNodeOs(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:os")??null}var nodeOs=loadNodeOs();function getPiUserAgent(){return nodeOs?`pi (${nodeOs.platform()} ${nodeOs.release()}; ${nodeOs.arch()})`:"pi (browser)"}var UnsupportedStrictJsonSchemaError=class extends Error{},UNSUPPORTED_STRICT_SCHEMA_KEYS=["$ref","$defs","definitions","allOf","oneOf","patternProperties","dependentSchemas","dependencies","unevaluatedProperties","propertyNames","contains","prefixItems","not","if","then","else"];function isJsonSchemaObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isStructuredSchema(schema){if(!isJsonSchemaObject(schema))return!1;let types=typeof schema.type=="string"?[schema.type]:Array.isArray(schema.type)?schema.type:[];return types.includes("object")||types.includes("array")||schema.properties!==void 0||schema.items!==void 0}function schemaAllowsNull(schema){return isJsonSchemaObject(schema)?schema.type==="null"||Array.isArray(schema.type)&&schema.type.includes("null")||schema.const===null||Array.isArray(schema.enum)&&schema.enum.includes(null)?!0:Array.isArray(schema.anyOf)&&schema.anyOf.some(variant=>schemaAllowsNull(variant)):!1}function makeJsonSchemaNodeStrict(schema,isUnsupportedKeyword){if(!isJsonSchemaObject(schema))throw new UnsupportedStrictJsonSchemaError("boolean schemas are unsupported");for(let key of UNSUPPORTED_STRICT_SCHEMA_KEYS)if(schema[key]!==void 0)throw new UnsupportedStrictJsonSchemaError(`${key} schemas are unsupported`);if(isUnsupportedKeyword){for(let[key,value]of Object.entries(schema))if(isUnsupportedKeyword(key,value))throw new UnsupportedStrictJsonSchemaError(`${key}: ${JSON.stringify(value)} is unsupported`)}if(schema.anyOf!==void 0){if(!Array.isArray(schema.anyOf)||schema.anyOf.length===0)throw new UnsupportedStrictJsonSchemaError("anyOf must contain at least one schema");for(let variant of schema.anyOf){if(isStructuredSchema(variant))throw new UnsupportedStrictJsonSchemaError("object and array unions are unsupported");makeJsonSchemaNodeStrict(variant,isUnsupportedKeyword)}}if(schema.items!==void 0){if(Array.isArray(schema.items))throw new UnsupportedStrictJsonSchemaError("tuple schemas are unsupported");makeJsonSchemaNodeStrict(schema.items,isUnsupportedKeyword)}let isObjectSchema=schema.type==="object";if(schema.properties!==void 0&&!isObjectSchema)throw new UnsupportedStrictJsonSchemaError("properties require type object");if(!isObjectSchema)return;if(schema.additionalProperties!==void 0&&schema.additionalProperties!==!1)throw new UnsupportedStrictJsonSchemaError("schema-valued or true additionalProperties is unsupported");if(schema.properties!==void 0&&!isJsonSchemaObject(schema.properties))throw new UnsupportedStrictJsonSchemaError("object properties must be a schema map");if(schema.required!==void 0&&(!Array.isArray(schema.required)||schema.required.some(key=>typeof key!="string")))throw new UnsupportedStrictJsonSchemaError("object required must be a string array");let properties=schema.properties??{},propertyNames=Object.keys(properties),required=new Set(Array.isArray(schema.required)?schema.required:[]);if([...required].some(key=>!propertyNames.includes(key)))throw new UnsupportedStrictJsonSchemaError("required contains an unknown property");for(let[key,property]of Object.entries(properties))makeJsonSchemaNodeStrict(property,isUnsupportedKeyword),!required.has(key)&&!schemaAllowsNull(property)&&(properties[key]={anyOf:[property,{type:"null"}]});schema.required=propertyNames,schema.additionalProperties=!1}function makeStrictJsonSchema(schema,isUnsupportedKeyword){let cloned=structuredClone(schema);if(!isJsonSchemaObject(cloned))throw new UnsupportedStrictJsonSchemaError("root schema must have type object");if(makeJsonSchemaNodeStrict(cloned,isUnsupportedKeyword),cloned.type!=="object")throw new UnsupportedStrictJsonSchemaError("root schema must have type object");return cloned}function getJsonSchemaToolParameters(tool,strict){return strict===!0?makeStrictJsonSchema(tool.parameters):tool.parameters}function getGrammarToolInput(toolName,arguments_,inputProperty){let input=arguments_[inputProperty];if(typeof input!="string")throw new Error(`Grammar tool call "${toolName}" requires argument "${inputProperty}" to be a string.`);return input}function appendGrammarToolInputJsonDelta(buffer,inputProperty,nextInput,close){if(buffer.closed){if(close&&nextInput===buffer.input)return;throw new Error(`grammar tool input for property "${inputProperty}" changed after it was closed`)}if(!nextInput.startsWith(buffer.input))throw new Error(`grammar tool input for property "${inputProperty}" changed non-monotonically`);let inputDelta=nextInput.slice(buffer.input.length);if(!close&&inputDelta.length===0)return;let delta="";return buffer.started||(delta+=`{${JSON.stringify(inputProperty)}:"`,buffer.started=!0),delta+=JSON.stringify(inputDelta).slice(1,-1),buffer.input=nextInput,close&&(delta+='"}',buffer.closed=!0),delta}function inferGrammarInputProperty(tool){let schema=tool.parameters;if(schema.type!=="object")throw new Error("grammar constrained sampling requires an object parameter schema");if(!Array.isArray(schema.required)||schema.required.length!==1||typeof schema.required[0]!="string")throw new Error("grammar constrained sampling requires exactly one required string property");let inputProperty=schema.required[0];if(!schema.properties?.[inputProperty])throw new Error(`grammar constrained sampling requires a properties entry for ${inputProperty}`);if(schema.properties[inputProperty]?.type!=="string")throw new Error(`grammar constrained sampling property ${inputProperty} must have type string`);return inputProperty}function resolveJsonSchemaStrictSampling(tool,supportsStrictMode,isUnsupportedKeyword){let config=tool.constrainedSampling;if(!(!config||config.type!=="json_schema")){if(supportsStrictMode)try{return makeStrictJsonSchema(tool.parameters,isUnsupportedKeyword),!0}catch(error){if(!(error instanceof UnsupportedStrictJsonSchemaError))throw error;if(config.strict!=="require")return;throw new Error(`Tool "${tool.name}" requires JSON-schema constrained sampling, but ${error.message}.`)}if(config.strict==="require")throw new Error(`Tool "${tool.name}" requires JSON-schema constrained sampling, but strict tools are unsupported.`)}}function resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools){let config=tool.constrainedSampling;if(!config||config.type!=="grammar"||!supportsOpenAIGrammarTools)return;let larkDefinition=config.variants.openai_lark,regexDefinition=config.variants.openai_regex,hasLarkDefinition=typeof larkDefinition=="string"&&larkDefinition.trim().length>0,hasRegexDefinition=typeof regexDefinition=="string"&®exDefinition.trim().length>0;if(!hasLarkDefinition&&!hasRegexDefinition)throw new Error(`Tool "${tool.name}" cannot use grammar constrained sampling: no supported grammar variant was provided.`);try{return{format:hasLarkDefinition?"lark":"regex",definition:hasLarkDefinition?larkDefinition:regexDefinition,inputProperty:inferGrammarInputProperty(tool)}}catch(error){let message=error instanceof Error?error.message:String(error);throw new Error(`Tool "${tool.name}" cannot use grammar constrained sampling: ${message}.`)}}function createGrammarToolInputProperties(tools,supportsOpenAIGrammarTools){let properties=new Map;for(let tool of tools??[]){let grammar=resolveGrammarConstrainedSampling(tool,supportsOpenAIGrammarTools);grammar&&properties.set(tool.name,grammar.inputProperty)}return properties}var CHARS_PER_TOKEN=3.5,ESTIMATED_IMAGE_CHARS=4800;function calculateContextTokens(usage){return usage.totalTokens||usage.input+usage.output+usage.cacheRead+usage.cacheWrite}function safeJsonStringify(value){try{return JSON.stringify(value)??"undefined"}catch{return"[unserializable]"}}function estimateTextAndImageContentChars(content){if(typeof content=="string")return content.length;let chars=0;for(let block of content)chars+=block.type==="text"?block.text.length:ESTIMATED_IMAGE_CHARS;return chars}function estimateTextTokens(text){return Math.ceil(text.length/CHARS_PER_TOKEN)}function estimateTextAndImageContentTokens(content){return Math.ceil(estimateTextAndImageContentChars(content)/CHARS_PER_TOKEN)}function estimateMessageTokens(message){let chars=0;if(message.role==="system")return estimateTextTokens(getSystemMessageText(message))+estimateToolsTokens(message.toolsAdded)+estimateToolsTokens(message.toolsRemoved);if(message.role==="user"||message.role==="toolResult")return estimateTextAndImageContentTokens(message.content);for(let block of message.content)block.type==="text"?chars+=block.text.length:block.type==="thinking"?chars+=block.thinking.length:chars+=block.name.length+safeJsonStringify(block.arguments).length;return Math.ceil(chars/CHARS_PER_TOKEN)}function getLastAssistantUsageInfo(messages){let latestPrefixTimestamp=Number.NEGATIVE_INFINITY,usageInfo;for(let i=0;i<messages.length;i++){let message=messages[i];if(message.role==="assistant"){let assistant=message;assistant.timestamp>=latestPrefixTimestamp&&assistant.stopReason!=="aborted"&&assistant.stopReason!=="error"&&calculateContextTokens(assistant.usage)>0&&(usageInfo={usage:assistant.usage,index:i})}latestPrefixTimestamp=Math.max(latestPrefixTimestamp,message.timestamp)}return usageInfo}function estimateContextTokens(context){let messages="messages"in context?context.messages:context,usageInfo=getLastAssistantUsageInfo(messages);if(usageInfo){let usageTokens=calculateContextTokens(usageInfo.usage),trailingTokens=0;for(let i=usageInfo.index+1;i<messages.length;i++)trailingTokens+=estimateMessageTokens(messages[i]);return{tokens:usageTokens+trailingTokens,usageTokens,trailingTokens,lastUsageIndex:usageInfo.index}}let tokens=0;for(let message of messages)tokens+=estimateMessageTokens(message);return{tokens,usageTokens:0,trailingTokens:tokens,lastUsageIndex:null}}function estimateToolsTokens(tools){return!tools||tools.length===0?0:estimateTextTokens(safeJsonStringify(tools))}var CONTEXT_SAFETY_TOKENS=4096,MIN_MAX_TOKENS=1;function clampMaxTokensToContext(model,context,maxTokens){if(model.contextWindow<=0)return Math.max(MIN_MAX_TOKENS,maxTokens);let available=model.contextWindow-estimateContextTokens(context).tokens-CONTEXT_SAFETY_TOKENS;return Math.min(maxTokens,Math.max(MIN_MAX_TOKENS,available))}function resolveSamplingParams(model,thinkingLevel,requestParams){let effectiveThinkingLevel=clampThinkingLevel(model,thinkingLevel),thinkingLevelParams=model.samplingParamsByThinkingLevel?.[effectiveThinkingLevel];return model.samplingParams||thinkingLevelParams||requestParams?{...model.samplingParams,...thinkingLevelParams,...requestParams}:void 0}function buildBaseOptions(model,context,options,apiKey){let samplingParams=resolveSamplingParams(model,options?.reasoning??"off",options?.samplingParams);return{temperature:options?.temperature,samplingParams,maxTokens:clampMaxTokensToContext(model,context,options?.maxTokens??model.maxTokens),signal:options?.signal,telemetryContext:options?.telemetryContext,apiKey:apiKey||options?.apiKey,fetch:options?.fetch,transport:options?.transport,cacheRetention:options?.cacheRetention,sessionId:options?.sessionId,headers:options?.headers,onPayload:options?.onPayload,onResponse:options?.onResponse,onProviderStreamEvent:options?.onProviderStreamEvent,timeoutMs:options?.timeoutMs,websocketConnectTimeoutMs:options?.websocketConnectTimeoutMs,maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,metadata:options?.metadata,env:options?.env}}var MIN_ANSWER_TOKENS=1024,DEFAULT_THINKING_BUDGETS={minimal:1024,low:2048,medium:8192,high:16384};function clampReasoning(effort){return effort==="xhigh"||effort==="max"?"high":effort}function thinkingBudgetForLevel(reasoningLevel,customBudgets){let budgets={...DEFAULT_THINKING_BUDGETS,...customBudgets},level=clampReasoning(reasoningLevel);return budgets[level]}function clampThinkingBudgetToAnswerRoom(thinkingBudget,ceiling){return Math.min(thinkingBudget,Math.max(0,ceiling-MIN_ANSWER_TOKENS))}function adjustMaxTokensForThinking(baseMaxTokens,modelMaxTokens,reasoningLevel,customBudgets){let thinkingBudget=thinkingBudgetForLevel(reasoningLevel,customBudgets),maxTokens=baseMaxTokens===void 0?modelMaxTokens:Math.min(baseMaxTokens+thinkingBudget,modelMaxTokens);return maxTokens<=thinkingBudget&&(thinkingBudget=clampThinkingBudgetToAnswerRoom(thinkingBudget,maxTokens)),{maxTokens,thinkingBudget}}var NON_VISION_USER_IMAGE_PLACEHOLDER="(image omitted: model does not support images)",NON_VISION_TOOL_IMAGE_PLACEHOLDER="(tool image omitted: model does not support images)";function replaceImagesWithPlaceholder(content,placeholder){let result=[],previousWasPlaceholder=!1;for(let block of content){if(block.type==="image"){previousWasPlaceholder||result.push({type:"text",text:placeholder}),previousWasPlaceholder=!0;continue}result.push(block),previousWasPlaceholder=block.text===placeholder}return result}function downgradeUnsupportedImages(messages,model){return model.input.includes("image")?messages:messages.map(msg=>msg.role==="user"&&Array.isArray(msg.content)?{...msg,content:replaceImagesWithPlaceholder(msg.content,NON_VISION_USER_IMAGE_PLACEHOLDER)}:msg.role==="toolResult"?{...msg,content:replaceImagesWithPlaceholder(msg.content,NON_VISION_TOOL_IMAGE_PLACEHOLDER)}:msg)}function transformMessages(messages,model,normalizeToolCallId){let toolCallIdMap=new Map,normalizedMessages=messages.map(msg=>msg.content==null?{...msg,content:[]}:msg),transformed=downgradeUnsupportedImages(normalizedMessages,model).map(msg=>{if(msg.role==="system"||msg.role==="user")return msg;if(msg.role==="toolResult"){let normalizedId=toolCallIdMap.get(msg.toolCallId);return normalizedId&&normalizedId!==msg.toolCallId?{...msg,toolCallId:normalizedId}:msg}if(msg.role==="assistant"){let assistantMsg=msg,isSameModel=assistantMsg.provider===model.provider&&assistantMsg.api===model.api&&assistantMsg.model===model.id,transformedContent=assistantMsg.content.flatMap(block=>{if(block.type==="thinking")return block.redacted?isSameModel?block:[]:isSameModel&&block.thinkingSignature?block:!block.thinking||block.thinking.trim()===""?[]:isSameModel?block:{type:"text",text:block.thinking};if(block.type==="text")return isSameModel?block:{type:"text",text:block.text};if(block.type==="toolCall"){let toolCall=block,normalizedToolCall=toolCall;if(!isSameModel&&toolCall.thoughtSignature&&(normalizedToolCall={...toolCall},delete normalizedToolCall.thoughtSignature),!isSameModel&&normalizeToolCallId){let normalizedId=normalizeToolCallId(toolCall.id,model,assistantMsg);normalizedId!==toolCall.id&&(toolCallIdMap.set(toolCall.id,normalizedId),normalizedToolCall={...normalizedToolCall,id:normalizedId})}return normalizedToolCall}return block});return{...assistantMsg,content:transformedContent}}return msg}),result=[],pendingToolCalls=[],existingToolResultIds=new Set,heldSystemMessages=[],closePendingToolCalls=()=>{if(pendingToolCalls.length>0){for(let tc of pendingToolCalls)existingToolResultIds.has(tc.id)||result.push({role:"toolResult",toolCallId:tc.id,toolName:tc.name,content:[{type:"text",text:"No result provided"}],isError:!0,timestamp:Date.now()});pendingToolCalls=[],existingToolResultIds=new Set}result.push(...heldSystemMessages),heldSystemMessages.length=0};for(let i=0;i<transformed.length;i++){let msg=transformed[i];if(msg.role==="assistant"){closePendingToolCalls();let assistantMsg=msg;if(assistantMsg.stopReason==="error"||assistantMsg.stopReason==="aborted")continue;let toolCalls=assistantMsg.content.filter(b=>b.type==="toolCall");toolCalls.length>0&&(pendingToolCalls=toolCalls,existingToolResultIds=new Set),result.push(msg)}else msg.role==="toolResult"?(existingToolResultIds.add(msg.toolCallId),result.push(msg)):msg.role==="system"?pendingToolCalls.length>0?heldSystemMessages.push(msg):result.push(msg):(msg.role==="user"&&closePendingToolCalls(),result.push(msg))}return closePendingToolCalls(),result}export{getPiUserAgent,getJsonSchemaToolParameters,getGrammarToolInput,appendGrammarToolInputJsonDelta,resolveJsonSchemaStrictSampling,resolveGrammarConstrainedSampling,createGrammarToolInputProperties,clampMaxTokensToContext,resolveSamplingParams,buildBaseOptions,thinkingBudgetForLevel,clampThinkingBudgetToAnswerRoom,adjustMaxTokensForThinking,transformMessages};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
+
import{__commonJS,__require,__toESM}from"./chunk-4L3WN2XY.js";var require_windows=__commonJS({"node_modules/isexe/windows.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs=__require("fs");function checkPathExt(path,options){var pathext=options.pathExt!==void 0?options.pathExt:process.env.PATHEXT;if(!pathext||(pathext=pathext.split(";"),pathext.indexOf("")!==-1))return!0;for(var i=0;i<pathext.length;i++){var p=pathext[i].toLowerCase();if(p&&path.substr(-p.length).toLowerCase()===p)return!0}return!1}function checkStat(stat,path,options){return!stat.isSymbolicLink()&&!stat.isFile()?!1:checkPathExt(path,options)}function isexe(path,options,cb){fs.stat(path,function(er,stat){cb(er,er?!1:checkStat(stat,path,options))})}function sync(path,options){return checkStat(fs.statSync(path),path,options)}}});var require_mode=__commonJS({"node_modules/isexe/mode.js"(exports,module){module.exports=isexe;isexe.sync=sync;var fs=__require("fs");function isexe(path,options,cb){fs.stat(path,function(er,stat){cb(er,er?!1:checkStat(stat,options))})}function sync(path,options){return checkStat(fs.statSync(path),options)}function checkStat(stat,options){return stat.isFile()&&checkMode(stat,options)}function checkMode(stat,options){var mod=stat.mode,uid=stat.uid,gid=stat.gid,myUid=options.uid!==void 0?options.uid:process.getuid&&process.getuid(),myGid=options.gid!==void 0?options.gid:process.getgid&&process.getgid(),u=parseInt("100",8),g=parseInt("010",8),o=parseInt("001",8),ug=u|g,ret=mod&o||mod&g&&gid===myGid||mod&u&&uid===myUid||mod&ug&&myUid===0;return ret}}});var require_isexe=__commonJS({"node_modules/isexe/index.js"(exports,module){var fs=__require("fs"),core;process.platform==="win32"||global.TESTING_WINDOWS?core=require_windows():core=require_mode();module.exports=isexe;isexe.sync=sync;function isexe(path,options,cb){if(typeof options=="function"&&(cb=options,options={}),!cb){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(resolve2,reject){isexe(path,options||{},function(er,is){er?reject(er):resolve2(is)})})}core(path,options||{},function(er,is){er&&(er.code==="EACCES"||options&&options.ignoreErrors)&&(er=null,is=!1),cb(er,is)})}function sync(path,options){try{return core.sync(path,options||{})}catch(er){if(options&&options.ignoreErrors||er.code==="EACCES")return!1;throw er}}}});var require_which=__commonJS({"node_modules/which/which.js"(exports,module){var isWindows=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",path=__require("path"),COLON=isWindows?";":":",isexe=require_isexe(),getNotFoundError=cmd=>Object.assign(new Error(`not found: ${cmd}`),{code:"ENOENT"}),getPathInfo=(cmd,opt)=>{let colon=opt.colon||COLON,pathEnv=cmd.match(/\//)||isWindows&&cmd.match(/\\/)?[""]:[...isWindows?[process.cwd()]:[],...(opt.path||process.env.PATH||"").split(colon)],pathExtExe=isWindows?opt.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",pathExt=isWindows?pathExtExe.split(colon):[""];return isWindows&&cmd.indexOf(".")!==-1&&pathExt[0]!==""&&pathExt.unshift(""),{pathEnv,pathExt,pathExtExe}},which=(cmd,opt,cb)=>{typeof opt=="function"&&(cb=opt,opt={}),opt||(opt={});let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[],step=i=>new Promise((resolve2,reject)=>{if(i===pathEnv.length)return opt.all&&found.length?resolve2(found):reject(getNotFoundError(cmd));let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;resolve2(subStep(p,i,0))}),subStep=(p,i,ii)=>new Promise((resolve2,reject)=>{if(ii===pathExt.length)return resolve2(step(i+1));let ext=pathExt[ii];isexe(p+ext,{pathExt:pathExtExe},(er,is)=>{if(!er&&is)if(opt.all)found.push(p+ext);else return resolve2(p+ext);return resolve2(subStep(p,i,ii+1))})});return cb?step(0).then(res=>cb(null,res),cb):step(0)},whichSync=(cmd,opt)=>{opt=opt||{};let{pathEnv,pathExt,pathExtExe}=getPathInfo(cmd,opt),found=[];for(let i=0;i<pathEnv.length;i++){let ppRaw=pathEnv[i],pathPart=/^".*"$/.test(ppRaw)?ppRaw.slice(1,-1):ppRaw,pCmd=path.join(pathPart,cmd),p=!pathPart&&/^\.[\\\/]/.test(cmd)?cmd.slice(0,2)+pCmd:pCmd;for(let j=0;j<pathExt.length;j++){let cur=p+pathExt[j];try{if(isexe.sync(cur,{pathExt:pathExtExe}))if(opt.all)found.push(cur);else return cur}catch{}}}if(opt.all&&found.length)return found;if(opt.nothrow)return null;throw getNotFoundError(cmd)};module.exports=which;which.sync=whichSync}});var require_path_key=__commonJS({"node_modules/path-key/index.js"(exports,module){"use strict";var pathKey=(options={})=>{let environment=options.env||process.env;return(options.platform||process.platform)!=="win32"?"PATH":Object.keys(environment).reverse().find(key=>key.toUpperCase()==="PATH")||"Path"};module.exports=pathKey;module.exports.default=pathKey}});var require_resolveCommand=__commonJS({"node_modules/cross-spawn/lib/util/resolveCommand.js"(exports,module){"use strict";var path=__require("path"),which=require_which(),getPathKey=require_path_key();function resolveCommandAttempt(parsed,withoutPathExt){let env=parsed.options.env||process.env,cwd=process.cwd(),hasCustomCwd=parsed.options.cwd!=null,shouldSwitchCwd=hasCustomCwd&&process.chdir!==void 0&&!process.chdir.disabled;if(shouldSwitchCwd)try{process.chdir(parsed.options.cwd)}catch{}let resolved;try{resolved=which.sync(parsed.command,{path:env[getPathKey({env})],pathExt:withoutPathExt?path.delimiter:void 0})}catch{}finally{shouldSwitchCwd&&process.chdir(cwd)}return resolved&&(resolved=path.resolve(hasCustomCwd?parsed.options.cwd:"",resolved)),resolved}function resolveCommand(parsed){return resolveCommandAttempt(parsed)||resolveCommandAttempt(parsed,!0)}module.exports=resolveCommand}});var require_escape=__commonJS({"node_modules/cross-spawn/lib/util/escape.js"(exports,module){"use strict";var metaCharsRegExp=/([()\][%!^"`<>&|;, *?])/g;function escapeCommand(arg){return arg=arg.replace(metaCharsRegExp,"^$1"),arg}function escapeArgument(arg,doubleEscapeMetaChars){return arg=`${arg}`,arg=arg.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),arg=arg.replace(/(?=(\\+?)?)\1$/,"$1$1"),arg=`"${arg}"`,arg=arg.replace(metaCharsRegExp,"^$1"),doubleEscapeMetaChars&&(arg=arg.replace(metaCharsRegExp,"^$1")),arg}module.exports.command=escapeCommand;module.exports.argument=escapeArgument}});var require_shebang_regex=__commonJS({"node_modules/shebang-regex/index.js"(exports,module){"use strict";module.exports=/^#!(.*)/}});var require_shebang_command=__commonJS({"node_modules/shebang-command/index.js"(exports,module){"use strict";var shebangRegex=require_shebang_regex();module.exports=(string="")=>{let match=string.match(shebangRegex);if(!match)return null;let[path,argument]=match[0].replace(/#! ?/,"").split(" "),binary=path.split("/").pop();return binary==="env"?argument:argument?`${binary} ${argument}`:binary}}});var require_readShebang=__commonJS({"node_modules/cross-spawn/lib/util/readShebang.js"(exports,module){"use strict";var fs=__require("fs"),shebangCommand=require_shebang_command();function readShebang(command){let buffer=Buffer.alloc(150),fd;try{fd=fs.openSync(command,"r"),fs.readSync(fd,buffer,0,150,0),fs.closeSync(fd)}catch{}return shebangCommand(buffer.toString())}module.exports=readShebang}});var require_parse=__commonJS({"node_modules/cross-spawn/lib/parse.js"(exports,module){"use strict";var path=__require("path"),resolveCommand=require_resolveCommand(),escape=require_escape(),readShebang=require_readShebang(),isWin=process.platform==="win32",isExecutableRegExp=/\.(?:com|exe)$/i,isCmdShimRegExp=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function detectShebang(parsed){parsed.file=resolveCommand(parsed);let shebang=parsed.file&&readShebang(parsed.file);return shebang?(parsed.args.unshift(parsed.file),parsed.command=shebang,resolveCommand(parsed)):parsed.file}function parseNonShell(parsed){if(!isWin)return parsed;let commandFile=detectShebang(parsed),needsShell=!isExecutableRegExp.test(commandFile);if(parsed.options.forceShell||needsShell){let needsDoubleEscapeMetaChars=isCmdShimRegExp.test(commandFile);parsed.command=path.normalize(parsed.command),parsed.command=escape.command(parsed.command),parsed.args=parsed.args.map(arg=>escape.argument(arg,needsDoubleEscapeMetaChars));let shellCommand=[parsed.command].concat(parsed.args).join(" ");parsed.args=["/d","/s","/c",`"${shellCommand}"`],parsed.command=process.env.comspec||"cmd.exe",parsed.options.windowsVerbatimArguments=!0}return parsed}function parse(command,args,options){args&&!Array.isArray(args)&&(options=args,args=null),args=args?args.slice(0):[],options=Object.assign({},options);let parsed={command,args,options,file:void 0,original:{command,args}};return options.shell?parsed:parseNonShell(parsed)}module.exports=parse}});var require_enoent=__commonJS({"node_modules/cross-spawn/lib/enoent.js"(exports,module){"use strict";var isWin=process.platform==="win32";function notFoundError(original,syscall){return Object.assign(new Error(`${syscall} ${original.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${syscall} ${original.command}`,path:original.command,spawnargs:original.args})}function hookChildProcess(cp,parsed){if(!isWin)return;let originalEmit=cp.emit;cp.emit=function(name,arg1){if(name==="exit"){let err=verifyENOENT(arg1,parsed);if(err)return originalEmit.call(cp,"error",err)}return originalEmit.apply(cp,arguments)}}function verifyENOENT(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawn"):null}function verifyENOENTSync(status,parsed){return isWin&&status===1&&!parsed.file?notFoundError(parsed.original,"spawnSync"):null}module.exports={hookChildProcess,verifyENOENT,verifyENOENTSync,notFoundError}}});var require_cross_spawn=__commonJS({"node_modules/cross-spawn/index.js"(exports,module){"use strict";var cp=__require("child_process"),parse=require_parse(),enoent=require_enoent();function spawn(command,args,options){let parsed=parse(command,args,options),spawned=cp.spawn(parsed.command,parsed.args,parsed.options);return enoent.hookChildProcess(spawned,parsed),spawned}function spawnSync(command,args,options){let parsed=parse(command,args,options),result=cp.spawnSync(parsed.command,parsed.args,parsed.options);return result.error=result.error||enoent.verifyENOENTSync(result.status,parsed),result}module.exports=spawn;module.exports.spawn=spawn;module.exports.sync=spawnSync;module.exports._parse=parse;module.exports._enoent=enoent}});import{accessSync,constants,existsSync,readFileSync,realpathSync as realpathSync2}from"fs";import{createRequire}from"module";import{homedir as homedir2}from"os";import{basename,dirname,join as join2,resolve,sep as sep2,win32}from"path";import{fileURLToPath as fileURLToPath2}from"url";var import_cross_spawn=__toESM(require_cross_spawn(),1);import{spawn as nodeSpawn,spawnSync as nodeSpawnSync}from"node:child_process";var EXIT_STDIO_GRACE_MS=100;function spawnProcess(command,args,options){return process.platform==="win32"?(0,import_cross_spawn.default)(command,args,options):nodeSpawn(command,args,options)}function spawnProcessSync(command,args,options){return process.platform==="win32"?import_cross_spawn.default.sync(command,args,options):nodeSpawnSync(command,args,options)}function waitForChildProcess(child){return new Promise((resolve2,reject)=>{let settled=!1,exited=!1,exitCode=null,postExitTimer,stdoutEnded=child.stdout===null,stderrEnded=child.stderr===null,cleanup=()=>{postExitTimer&&(clearTimeout(postExitTimer),postExitTimer=void 0),child.removeListener("error",onError),child.removeListener("exit",onExit),child.removeListener("close",onClose),child.stdout?.removeListener("end",onStdoutEnd),child.stderr?.removeListener("end",onStderrEnd),child.stdout?.removeListener("data",onData),child.stderr?.removeListener("data",onData)},finalize=code=>{settled||(settled=!0,cleanup(),child.stdout?.destroy(),child.stderr?.destroy(),resolve2(code))},maybeFinalizeAfterExit=()=>{!exited||settled||stdoutEnded&&stderrEnded&&finalize(exitCode)},armIdleTimer=()=>{postExitTimer&&clearTimeout(postExitTimer),postExitTimer=setTimeout(()=>finalize(exitCode),EXIT_STDIO_GRACE_MS)},onData=()=>{exited&&!settled&&armIdleTimer()},onStdoutEnd=()=>{stdoutEnded=!0,maybeFinalizeAfterExit()},onStderrEnd=()=>{stderrEnded=!0,maybeFinalizeAfterExit()},onError=err=>{settled||(settled=!0,cleanup(),reject(err))},onExit=code=>{exited=!0,exitCode=code,maybeFinalizeAfterExit(),settled||armIdleTimer()},onClose=code=>{finalize(code)};child.stdout?.once("end",onStdoutEnd),child.stderr?.once("end",onStderrEnd),child.stdout?.on("data",onData),child.stderr?.on("data",onData),child.once("error",onError),child.once("exit",onExit),child.once("close",onClose)})}import{realpathSync,statSync}from"node:fs";import{homedir}from"node:os";import{isAbsolute,join,resolve as nodeResolvePath,relative,sep}from"node:path";import{fileURLToPath}from"node:url";var UNICODE_SPACES=/[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;function canonicalizePath(path){try{return realpathSync(path)}catch{return path}}function getFileRevision(path){try{let stats=statSync(path,{bigint:!0});return`${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeNs}:${stats.ctimeNs}`}catch{return}}function isLocalPath(value){let trimmed=value.trim();return!(trimmed.startsWith("npm:")||trimmed.startsWith("git:")||trimmed.startsWith("github:")||trimmed.startsWith("http:")||trimmed.startsWith("https:")||trimmed.startsWith("ssh:")||trimmed.startsWith("builtin:"))}function normalizeWindowsShellPath(filePath){if(!filePath.startsWith("/")||filePath.startsWith("//")||filePath.includes("\\"))return filePath;let match=filePath.match(/^\/(?:mnt\/|cygdrive\/)?([a-z])(?:\/(.*))?$/i);if(!match)return filePath;let suffix=match[2]?.replaceAll("/","\\");return`${match[1].toUpperCase()}:\\${suffix??""}`}function normalizePath(input,options={}){let normalized=options.trim?input.trim():input;if(options.normalizeUnicodeSpaces&&(normalized=normalized.replace(UNICODE_SPACES," ")),options.stripAtPrefix&&normalized.startsWith("@")&&(normalized=normalized.slice(1)),process.platform==="win32"&&(normalized=normalizeWindowsShellPath(normalized)),options.expandTilde??!0){let home=options.homeDir??homedir();if(normalized==="~")return home;if(normalized.startsWith("~/")||process.platform==="win32"&&normalized.startsWith("~\\"))return join(home,normalized.slice(2))}return/^file:\/\//.test(normalized)?fileURLToPath(normalized):normalized}function resolvePath(input,baseDir=process.cwd(),options={}){let normalized=normalizePath(input,options),normalizedBaseDir=normalizePath(baseDir);return isAbsolute(normalized)?nodeResolvePath(normalized):nodeResolvePath(normalizedBaseDir,normalized)}function getCwdRelativePath(filePath,cwd){let resolvedCwd=resolvePath(cwd),resolvedPath=resolvePath(filePath,resolvedCwd),relativePath=relative(resolvedCwd,resolvedPath);return relativePath===""||relativePath!==".."&&!relativePath.startsWith(`..${sep}`)&&!isAbsolute(relativePath)?relativePath||".":void 0}function formatPathRelativeToCwdOrAbsolute(filePath,cwd){let absolutePath=resolvePath(filePath,cwd);return(getCwdRelativePath(absolutePath,cwd)??absolutePath).split(sep).join("/")}function markPathIgnoredByCloudSync(path){let attrs=process.platform==="darwin"?["com.dropbox.ignored","com.apple.fileprovider.ignore#P"]:process.platform==="linux"?["user.com.dropbox.ignored"]:[];for(let attr of attrs)process.platform==="darwin"?spawnProcessSync("xattr",["-w",attr,"1",path],{encoding:"utf-8",stdio:"ignore"}):spawnProcessSync("setfattr",["-n",attr,"-v","1",path],{encoding:"utf-8",stdio:"ignore"})}function splitBom(content){return content.startsWith("\uFEFF")?{bom:"\uFEFF",text:content.slice(1)}:{bom:"",text:content}}function stripBom(content){return splitBom(content).text}var __filename=fileURLToPath2(import.meta.url),__dirname=dirname(__filename),isBunBinary=import.meta.url.includes("$bunfs")||import.meta.url.includes("~BUN")||import.meta.url.includes("%7EBUN"),isBunRuntime=!!process.versions.bun,isBundledNode=!0;function normalizeSelfUpdatePackageTarget(target){return typeof target=="string"?{packageName:target,installSpec:target}:{packageName:target.packageName,installSpec:target.installSpec??target.packageName}}function makeSelfUpdateCommand(installStep,uninstallStep){return uninstallStep?{...installStep,display:`${uninstallStep.display} && ${installStep.display}`,steps:[uninstallStep,installStep]}:installStep}function makeSelfUpdateCommandStep(command,args){return{command,args,display:[command,...args].map(arg=>/\s/.test(arg)?`"${arg}"`:arg).join(" ")}}function detectInstallMethod(){if(isBunBinary)return"bun-binary";let resolvedPath=`${__dirname}\0${process.execPath||""}`.toLowerCase().replace(/\\/g,"/");return resolvedPath.includes("/pnpm/")||resolvedPath.includes("/.pnpm/")?"pnpm":resolvedPath.includes("/yarn/")||resolvedPath.includes("/.yarn/")?"yarn":isBunRuntime||resolvedPath.includes("/install/global/node_modules/")?"bun":resolvedPath.includes("/npm/")||resolvedPath.includes("/node_modules/")?"npm":"unknown"}function getInferredNpmInstall(){let packageDir=getPackageDir(),path=process.platform==="win32"||packageDir.includes("\\")?win32:{basename,dirname},parent=path.dirname(packageDir),root;if(path.basename(parent).startsWith("@")&&path.basename(path.dirname(parent))==="node_modules"?root=path.dirname(parent):path.basename(parent)==="node_modules"&&(root=parent),!root)return;let rootParent=path.dirname(root);if(path.basename(rootParent)==="lib")return{root,prefix:path.dirname(rootParent)}}function getSelfUpdateCommandForMethod(method,installedPackageName,updatePackageTarget=installedPackageName,npmCommand){let target=normalizeSelfUpdatePackageTarget(updatePackageTarget);switch(method){case"bun-binary":return;case"pnpm":{let match=readCommandOutput("pnpm",["root","-g"])?void 0:/^(.*[\\/]global[\\/][^\\/]+)[\\/]\.pnpm[\\/]/.exec(getPackageDir()),binDirArgs=match?[`--config.global-bin-dir=${process.env.PNPM_HOME||dirname(dirname(match[1]))}`]:[];return makeSelfUpdateCommand(makeSelfUpdateCommandStep("pnpm",["install","-g","--ignore-scripts","--config.minimumReleaseAge=0",...binDirArgs,target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("pnpm",["remove","-g",...binDirArgs,installedPackageName]))}case"yarn":return makeSelfUpdateCommand(makeSelfUpdateCommandStep("yarn",["global","add","--ignore-scripts",target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("yarn",["global","remove",installedPackageName]));case"bun":return makeSelfUpdateCommand(makeSelfUpdateCommandStep("bun",["install","-g","--ignore-scripts","--minimum-release-age=0",target.installSpec]),target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep("bun",["uninstall","-g",installedPackageName]));case"npm":{let[command="npm",...npmArgs]=npmCommand??[],inferred=npmCommand?.length?void 0:getInferredNpmInstall(),prefixArgs=[...npmArgs,...inferred?["--prefix",inferred.prefix]:[]],installStep=makeSelfUpdateCommandStep(command,[...prefixArgs,"install","-g","--ignore-scripts","--min-release-age=0",target.installSpec]),uninstallStep=target.packageName===installedPackageName?void 0:makeSelfUpdateCommandStep(command,[...prefixArgs,"uninstall","-g",installedPackageName]);return makeSelfUpdateCommand(installStep,uninstallStep)}case"unknown":return}}function readCommandOutput(command,args,options={}){let result=spawnProcessSync(command,args,{encoding:"utf-8",stdio:["ignore","pipe","pipe"]});if(result.status===0)return result.stdout.trim()||void 0;if(options.requireSuccess){let reason=result.error?.message||result.stderr.trim()||`exit code ${result.status??"unknown"}`;throw new Error(`Failed to run ${[command,...args].join(" ")}: ${reason}`)}}function getGlobalPackageRoots(method,_packageName,npmCommand){switch(method){case"npm":{let configured=!!npmCommand?.length,[command="npm",...npmArgs]=npmCommand??[];if(configured&&command==="bun"){let bunBin=readCommandOutput(command,[...npmArgs,"pm","bin","-g"],{requireSuccess:!0}),roots=[join2(homedir2(),".bun","install","global","node_modules")];return bunBin&&roots.push(join2(dirname(bunBin),"install","global","node_modules")),roots}let root=readCommandOutput(command,[...npmArgs,"root","-g"],{requireSuccess:configured}),inferred=configured?void 0:getInferredNpmInstall();return[root,inferred?.root].filter(x=>!!x)}case"pnpm":{let root=readCommandOutput("pnpm",["root","-g"]);if(root)return[root,dirname(root)];let match=/^(.*[\\/]global[\\/][^\\/]+)[\\/]\.pnpm[\\/]/.exec(getPackageDir());return match?[match[1]]:[]}case"yarn":{let dir=readCommandOutput("yarn",["global","dir"]);return dir?[dir,join2(dir,"node_modules")]:[]}case"bun":{let bunBin=readCommandOutput("bun",["pm","bin","-g"]),roots=[join2(homedir2(),".bun","install","global","node_modules")];return bunBin&&roots.push(join2(dirname(bunBin),"install","global","node_modules")),roots}case"bun-binary":case"unknown":return[]}}function normalizeExistingPathForComparison(path,resolveSymlinks){let resolvedPath=resolve(path);if(!existsSync(resolvedPath))return;let normalizedPath=resolvedPath;if(resolveSymlinks)try{normalizedPath=realpathSync2(resolvedPath)}catch{return}return process.platform==="win32"&&(normalizedPath=normalizedPath.toLowerCase()),normalizedPath}function getPathComparisonCandidates(path){return Array.from(new Set([normalizeExistingPathForComparison(path,!1),normalizeExistingPathForComparison(path,!0)].filter(candidate=>!!candidate)))}function getEntrypointPackageDir(){let entrypoint=process.argv[1];if(!entrypoint)return;let dir=dirname(entrypoint);for(;dir!==dirname(dir);){if(existsSync(join2(dir,"package.json")))return dir;dir=dirname(dir)}}function isSelfUpdatePathWritable(){let packageDir=getPackageDir();try{return accessSync(packageDir,constants.W_OK),accessSync(dirname(packageDir),constants.W_OK),!0}catch{return!1}}function isManagedByGlobalPackageManager(method,packageName,npmCommand){let packageDirCandidates=[getPackageDir(),getEntrypointPackageDir()].filter(dir=>!!dir).flatMap(dir=>getPathComparisonCandidates(dir));return getGlobalPackageRoots(method,packageName,npmCommand).some(root=>getPathComparisonCandidates(root).some(normalizedRoot=>{let rootPrefix=normalizedRoot.endsWith(sep2)?normalizedRoot:`${normalizedRoot}${sep2}`;return packageDirCandidates.some(packageDir=>packageDir.startsWith(rootPrefix))}))}function getSelfUpdateCommand(packageName,npmCommand,updatePackageTarget=packageName){let method=detectInstallMethod(),command=getSelfUpdateCommandForMethod(method,packageName,updatePackageTarget,npmCommand);if(!(!command||!isManagedByGlobalPackageManager(method,packageName,npmCommand)||!isSelfUpdatePathWritable()))return command}function getSelfUpdateUnavailableInstruction(packageName,npmCommand,updatePackageTarget=packageName){let method=detectInstallMethod(),target=normalizeSelfUpdatePackageTarget(updatePackageTarget);if(method==="bun-binary")return"Download from: https://github.com/earendil-works/pi/releases/latest";let command=getSelfUpdateCommandForMethod(method,packageName,target,npmCommand);return command?isManagedByGlobalPackageManager(method,packageName,npmCommand)&&!isSelfUpdatePathWritable()?`This installation is managed by a global ${method} install, but the install path is not writable. Update it yourself with: ${command.display}`:`This installation is not managed by a global ${method} install. Update it with the package manager, wrapper, or source checkout that provides it.`:`Update ${target.installSpec} using the package manager, wrapper, or source checkout that provides this installation.`}function findNodePackageDir(startDir){let dir=startDir;for(;dir!==dirname(dir);){if(existsSync(join2(dir,"package.json"))){let parent=dirname(dir);return basename(dir)==="dist"&&existsSync(join2(parent,"package.json"))?parent:dir}dir=dirname(dir)}return startDir}function getPackageDir(){let envDir=process.env.PI_PACKAGE_DIR;return envDir?normalizePath(envDir):isBunBinary?dirname(process.execPath):findNodePackageDir(__dirname)}function getThemesDir(){if(isBunBinary)return join2(getPackageDir(),"theme");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"modes","interactive","theme")}function getExportTemplateDir(){if(isBunBinary)return join2(getPackageDir(),"export-html");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"core","export-html")}function getPackageJsonPath(){return join2(getPackageDir(),"package.json")}function getReadmePath(){return resolve(join2(getPackageDir(),"README.md"))}function getDocsPath(){return resolve(join2(getPackageDir(),"docs"))}function getExamplesPath(){return resolve(join2(getPackageDir(),"examples"))}function getChangelogPath(){return resolve(join2(getPackageDir(),"CHANGELOG.md"))}function getInteractiveAssetsDir(){if(isBunBinary)return join2(getPackageDir(),"assets");let packageDir=getPackageDir(),srcOrDist=existsSync(join2(packageDir,"src"))?"src":"dist";return join2(packageDir,srcOrDist,"modes","interactive","assets")}function getBundledInteractiveAssetPath(name){return join2(getInteractiveAssetsDir(),name)}var quickJSWasmPath;function getQuickJSWasmPath(){return quickJSWasmPath??=createRequire(import.meta.url).resolve("quickjs-wasi/quickjs.wasm"),quickJSWasmPath}function resolveCodemodeWorkerSpecifier(runtime,moduleUrl){if(runtime==="bun-binary")return"./src/extensions/codemode/worker.ts";if(runtime==="bundled-node")return new URL("./codemode-worker.js",moduleUrl)}var codemodeWorkerDataUrl;function getCodemodeWorkerSpecifier(){let runtime=isBunBinary?"bun-binary":isBundledNode?"bundled-node":"unbundled",specifier=resolveCodemodeWorkerSpecifier(runtime,import.meta.url);return runtime!=="bundled-node"||!(specifier instanceof URL)?specifier:(codemodeWorkerDataUrl??=new URL(`data:text/javascript;base64,${readFileSync(specifier).toString("base64")}`),codemodeWorkerDataUrl)}function detectInstallChange(packageJsonPath=startupPackageJsonPath){if(isBunBinary||!packageJsonPath)return;let installed;try{installed=JSON.parse(stripBom(readFileSync(packageJsonPath,"utf-8")))}catch(error){return error.code==="ENOENT"?{kind:"removed"}:void 0}return installed.version&&installed.version!==VERSION?{kind:"updated",version:installed.version}:void 0}var pkg={},startupPackageJsonPath;try{let packageJsonPath=getPackageJsonPath();pkg=JSON.parse(stripBom(readFileSync(packageJsonPath,"utf-8"))),startupPackageJsonPath=packageJsonPath}catch(e){if(e.code!=="ENOENT")throw e}var piConfigName=pkg.piConfig?.name,PACKAGE_NAME=pkg.name||"@earendil-works/pi-coding-agent",APP_NAME=piConfigName||"pi",APP_TITLE=piConfigName?APP_NAME:"\u03C0",CONFIG_DIR_NAME=pkg.piConfig?.configDir||".pi",VERSION=pkg.version||"0.0.0",ENV_AGENT_DIR=`${APP_NAME.toUpperCase()}_CODING_AGENT_DIR`,ENV_SESSION_DIR=`${APP_NAME.toUpperCase()}_CODING_AGENT_SESSION_DIR`;function expandTildePath(path){return normalizePath(path)}var DEFAULT_SHARE_VIEWER_URL="https://pi.dev/session/";function getShareViewerUrl(gistId){return`${process.env.PI_SHARE_VIEWER_URL||DEFAULT_SHARE_VIEWER_URL}#${gistId}`}function getAgentDir(){let envDir=process.env[ENV_AGENT_DIR];return envDir?expandTildePath(envDir):join2(homedir2(),CONFIG_DIR_NAME,"agent")}function getCustomThemesDir(){return join2(getAgentDir(),"themes")}function getAuthPath(){return join2(getAgentDir(),"auth.json")}function getSettingsPath(){return join2(getAgentDir(),"settings.json")}function getBinDir(){return join2(getAgentDir(),"bin")}function getSessionsDir(){return join2(getAgentDir(),"sessions")}function getDebugLogPath(){return join2(getAgentDir(),`${APP_NAME}-debug.log`)}export{require_cross_spawn,spawnProcess,spawnProcessSync,waitForChildProcess,canonicalizePath,getFileRevision,isLocalPath,normalizePath,resolvePath,getCwdRelativePath,formatPathRelativeToCwdOrAbsolute,markPathIgnoredByCloudSync,splitBom,stripBom,isBunBinary,isBundledNode,detectInstallMethod,getSelfUpdateCommand,getSelfUpdateUnavailableInstruction,getPackageDir,getThemesDir,getExportTemplateDir,getReadmePath,getDocsPath,getExamplesPath,getChangelogPath,getBundledInteractiveAssetPath,getQuickJSWasmPath,getCodemodeWorkerSpecifier,detectInstallChange,PACKAGE_NAME,APP_NAME,APP_TITLE,CONFIG_DIR_NAME,VERSION,ENV_AGENT_DIR,ENV_SESSION_DIR,expandTildePath,getShareViewerUrl,getAgentDir,getCustomThemesDir,getAuthPath,getSettingsPath,getBinDir,getSessionsDir,getDebugLogPath};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{retryProviderRequest}from"./chunk-PMRZO46Y.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-UTB4DTYQ.js";import{calculateCost}from"./chunk-
|
|
2
|
+
import{retryProviderRequest}from"./chunk-PMRZO46Y.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-UTB4DTYQ.js";import{calculateCost}from"./chunk-HACVPRBJ.js";function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field}`);return value}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function postClassifierRequest(label,url,model,body,options,noRetryStatuses){if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=body,transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,json}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(url,{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(label,next,await next.text());return{response:next,json:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal,noRetryStatuses});return await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),json}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseClassifierUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:input+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}export{isRecord,requiredNumber,postClassifierRequest,parseClassifierUsage};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{McpOAuthCredentialStore,McpServerConnection,McpServerLog,McpSignInCancelledError,createDefaultTransport,signInMcpServer}from"./chunk-
|
|
2
|
+
import{McpOAuthCredentialStore,McpServerConnection,McpServerLog,McpSignInCancelledError,createDefaultTransport,signInMcpServer}from"./chunk-DOST5PQW.js";import{ProjectTrustStore,addMcpServerConfig,loadMcpConfig,openBrowser,removeMcpServerConfig}from"./chunk-GDR5JFDJ.js";import{getMcpToolExposure,validateMcpServerConfig}from"./chunk-5GTPJSRI.js";import"./chunk-3ZATHNCK.js";import{source_default}from"./chunk-6QGV3IWD.js";import{APP_NAME,CONFIG_DIR_NAME}from"./chunk-WJUNYZC5.js";import"./chunk-4L3WN2XY.js";import{existsSync}from"node:fs";import{join}from"node:path";import{createInterface}from"node:readline/promises";var HELP=`${source_default.bold("Usage:")}
|
|
3
3
|
${APP_NAME} mcp add <server> [options] -- <command> [args...]
|
|
4
4
|
${APP_NAME} mcp add <server> [options] --url <url>
|
|
5
5
|
${APP_NAME} mcp remove <server> [-l]
|
|
@@ -39,13 +39,13 @@ Options for add:
|
|
|
39
39
|
|
|
40
40
|
Other options:
|
|
41
41
|
--json Print the list as JSON
|
|
42
|
-
--timeout <seconds>
|
|
42
|
+
--timeout <seconds> Time limit for the whole sign-in (default: 300)`,HELP_HINT=source_default.dim(`Use "${APP_NAME} mcp --help" for usage.`),DEFAULT_LOGIN_TIMEOUT_SECONDS=300;function errorMessage(error){return error instanceof Error?error.message:String(error)}function describeTransport(entry){let{config}=entry;return"url"in config?config.url:[config.command,...config.args??[]].join(" ")}function createConnection(entry,options,credentials){return new McpServerConnection({entry,cwd:options.cwd,createTransport:createDefaultTransport,credentials,log:new McpServerLog(join(options.agentDir,"mcp.log")),onTools:()=>{}})}var OPTION_ALIASES=new Map([["-l","--local"]]);function parseOptions(args,known,error,maxPositionals=Number.POSITIVE_INFINITY){let positional=[],values=new Map,lists=new Map;for(let index=0;index<args.length;index++){let arg=OPTION_ALIASES.get(args[index])??args[index];if(arg==="--"||positional.length>=maxPositionals){positional.push(...args.slice(arg==="--"?index+1:index));break}if(!arg.startsWith("--")){positional.push(arg);continue}let name=arg.slice(2),kind=known[name];if(!kind){error(`Unknown option ${arg}.
|
|
43
43
|
${HELP_HINT}`);return}if(kind==="flag"){values.set(name,!0);continue}let value=args[++index];if(value===void 0){error(`${arg} needs a value.`);return}kind==="list"?lists.set(name,[...lists.get(name)??[],value]):values.set(name,value)}return{positional,values,lists}}async function runMcpCommand(args,options){let log=options.log??(line=>console.log(line)),error=options.error??(line=>console.error(line)),[command,...rest]=args;if(command===void 0||command==="help"||args.includes("--help")||args.includes("-h"))return log(HELP),0;let projectConfig=join(options.cwd,CONFIG_DIR_NAME,"mcp.json");if(command==="add"||command==="remove")return command==="add"?add(rest,projectConfig,options,log,error):remove(rest,projectConfig,options,log,error);let projectTrusted=new ProjectTrustStore(options.agentDir).get(options.cwd)===!0,loaded=loadMcpConfig({agentDir:options.agentDir,cwd:options.cwd,projectTrusted}),untrustedNote=!projectTrusted&&existsSync(projectConfig)?`${projectConfig} is ignored because the project is not trusted. Start ${APP_NAME} in the project to trust it.`:void 0,credentials=options.credentials??new McpOAuthCredentialStore;switch(command){case"list":{let parsed=parseOptions(rest,{json:"flag"},error);return parsed?parsed.positional.length>0?(error(`Usage: ${APP_NAME} mcp list [--json]
|
|
44
44
|
${HELP_HINT}`),1):list(loaded,parsed.values.has("json"),untrustedNote,options,credentials,log):1}case"login":case"logout":{let parsed=parseOptions(rest,command==="login"?{timeout:"value"}:{},error);if(!parsed)return 1;let[name,...extra]=parsed.positional;if(!name||extra.length>0)return error(`Usage: ${APP_NAME} mcp ${command} <server>
|
|
45
45
|
${HELP_HINT}`),1;let entry=loaded.servers.find(server=>server.name===name);if(!entry)return error(`No MCP server named "${name}".${untrustedNote?` ${untrustedNote}`:""} Configured: ${loaded.servers.map(server=>server.name).join(", ")||"none"}.`),1;let connection=createConnection(entry,options,credentials),url=connection.oauthUrl;if(!url)return error(`MCP server "${name}" does not use OAuth. Only HTTP servers without an Authorization header do.`),1;if(command==="logout"){let removed=credentials.remove(name,url);return log(removed?`Signed out of MCP server "${name}".`:`No stored credentials for MCP server "${name}".`),0}let timeout=Number(parsed.values.get("timeout")??DEFAULT_LOGIN_TIMEOUT_SECONDS);if(!Number.isFinite(timeout)||timeout<=0)return error("--timeout must be a positive number of seconds."),1;try{return await login(entry,connection,url,timeout*1e3,options,credentials,log,error)}finally{await connection.close()}}default:return error(`Unknown mcp command "${command}".
|
|
46
46
|
${HELP_HINT}`),1}}function parsePairs(option,pairs,error){if(!pairs)return{};let record={};for(let pair of pairs){let separator=pair.indexOf("=");if(separator<=0){error(`--${option} expects KEY=VALUE, got "${pair}".`);return}record[pair.slice(0,separator)]=pair.slice(separator+1)}return record}function add(args,projectConfig,options,log,error){let usage=`Usage: ${APP_NAME} mcp add <server> [options] (--url <url> | -- <command> [args...])
|
|
47
47
|
${HELP_HINT}`,parsed=parseOptions(args,{local:"flag",url:"value",env:"list",cwd:"value",header:"list","bearer-token-env-var":"value","oauth-client-id":"value","oauth-client-secret":"value","oauth-callback-port":"value","oauth-client-name":"value",exposure:"value",description:"value"},error,2);if(!parsed)return 1;let{positional,values,lists}=parsed,[name,...command]=positional,url=values.get("url");if(!name||url===void 0==(command.length===0))return error(usage),1;let value=option=>{let found=values.get(option);return typeof found=="string"?found:void 0},exposure=value("exposure"),misplaced=(url===void 0?["header","bearer-token-env-var","oauth-client-id","oauth-client-secret","oauth-callback-port","oauth-client-name"]:["env","cwd"]).find(option=>values.has(option)||lists.has(option));if(misplaced)return error(`--${misplaced} only applies to ${url===void 0?"HTTP servers (--url)":"stdio servers"}.`),1;let config;if(typeof url=="string"){let headers=parsePairs("header",lists.get("header"),error);if(!headers)return 1;let bearer=value("bearer-token-env-var");bearer!==void 0&&(headers.Authorization=`Bearer \${${bearer}}`);let port=value("oauth-callback-port"),oauth={...value("oauth-client-id")===void 0?{}:{clientId:value("oauth-client-id")},...value("oauth-client-secret")===void 0?{}:{clientSecret:value("oauth-client-secret")},...port===void 0?{}:{callbackPort:Number(port)},...value("oauth-client-name")===void 0?{}:{clientName:value("oauth-client-name")}};config={url,...Object.keys(headers).length>0?{headers}:{},...Object.keys(oauth).length>0?{oauth}:{}}}else{let env=parsePairs("env",lists.get("env"),error);if(!env)return 1;let[executable,...commandArgs]=command;config={command:executable,...commandArgs.length>0?{args:commandArgs}:{},...Object.keys(env).length>0?{env}:{},...value("cwd")===void 0?{}:{cwd:value("cwd")}}}exposure!==void 0&&(config.exposure=exposure);let description=value("description");description!==void 0&&(config.description=description);let validated=validateMcpServerConfig(name,config);if(typeof validated=="string")return error(validated),1;let project=values.has("local"),path=project?projectConfig:join(options.agentDir,"mcp.json"),scope=project?"project":"global",replaced;try{replaced=addMcpServerConfig(path,name,validated)}catch(addError){return error(`Could not update ${path}: ${errorMessage(addError)}`),1}log(`${replaced?"Replaced":"Added"} ${scope} MCP server "${name}" in ${path}.`),project&&new ProjectTrustStore(options.agentDir).get(options.cwd)!==!0&&log(`The project is not trusted, so ${path} is ignored until you start ${APP_NAME} in the project and trust it.`);let mayNeedSignIn="url"in validated&&!Object.keys(validated.headers??{}).some(header=>header.toLowerCase()==="authorization");return log(`Check it with: ${APP_NAME} mcp list${mayNeedSignIn?`. If it requires sign-in: ${APP_NAME} mcp login ${name}`:""}`),0}function remove(args,projectConfig,options,log,error){let parsed=parseOptions(args,{local:"flag"},error);if(!parsed)return 1;let[name,...extra]=parsed.positional;if(!name||extra.length>0)return error(`Usage: ${APP_NAME} mcp remove <server> [-l]
|
|
48
|
-
${HELP_HINT}`),1;let project=parsed.values.has("local"),globalConfig=join(options.agentDir,"mcp.json"),path=project?projectConfig:globalConfig,scope=project?"project":"global",removed;try{removed=removeMcpServerConfig(path,name)}catch(removeError){return error(`Could not update ${path}: ${errorMessage(removeError)}`),1}if(removed)return log(`Removed ${scope} MCP server "${name}" from ${path}.`),0;let other=loadMcpConfig({agentDir:options.agentDir,cwd:options.cwd,projectTrusted:!0}).servers.find(server=>server.name===name&&server.scope!==scope);return error(`No ${scope} MCP server named "${name}" in ${path}.${other?` It is defined in ${other.source}${other.scope==="project"?"; use --local":"; omit --local"}.`:""}`),1}async function list(loaded,json,untrustedNote,options,credentials,log){let reports=await Promise.all(loaded.servers.map(async entry=>{let report={name:entry.name,scope:entry.scope??"global",source:entry.source,...entry.override?{override:entry.override}:{},enabled:entry.config.enabled!==!1,exposure:entry.config.exposure??"codemode",transport:describeTransport(entry),state:"disabled",tools:[]};if(!report.enabled)return report;let connection=createConnection(entry,options,credentials);try{await connection.getClient()}catch{}report.state=connection.state,report.tools=connection.tools.map(tool=>tool.name);let overrides=connection.tools.flatMap(tool=>{let exposure=getMcpToolExposure(entry.config,tool.name);return exposure===report.exposure?[]:[[tool.name,exposure]]});return overrides.length>0&&(report.toolExposure=Object.fromEntries(overrides)),connection.hasResources&&(report.resources
|
|
48
|
+
${HELP_HINT}`),1;let project=parsed.values.has("local"),globalConfig=join(options.agentDir,"mcp.json"),path=project?projectConfig:globalConfig,scope=project?"project":"global",removed;try{removed=removeMcpServerConfig(path,name)}catch(removeError){return error(`Could not update ${path}: ${errorMessage(removeError)}`),1}if(removed)return log(`Removed ${scope} MCP server "${name}" from ${path}.`),0;let other=loadMcpConfig({agentDir:options.agentDir,cwd:options.cwd,projectTrusted:!0}).servers.find(server=>server.name===name&&server.scope!==scope);return error(`No ${scope} MCP server named "${name}" in ${path}.${other?` It is defined in ${other.source}${other.scope==="project"?"; use --local":"; omit --local"}.`:""}`),1}async function list(loaded,json,untrustedNote,options,credentials,log){let reports=await Promise.all(loaded.servers.map(async entry=>{let report={name:entry.name,scope:entry.scope??"global",source:entry.source,...entry.override?{override:entry.override}:{},enabled:entry.config.enabled!==!1,exposure:entry.config.exposure??"codemode",transport:describeTransport(entry),state:"disabled",tools:[]};if(!report.enabled)return report;let connection=createConnection(entry,options,credentials);try{await connection.getClient()}catch{}report.state=connection.state,report.tools=connection.tools.map(tool=>tool.name);let overrides=connection.tools.flatMap(tool=>{let exposure=getMcpToolExposure(entry.config,tool.name);return exposure===report.exposure?[]:[[tool.name,exposure]]});return overrides.length>0&&(report.toolExposure=Object.fromEntries(overrides)),connection.hasResources&&(report.resources=!0),connection.state!=="connected"&&connection.error&&(report.error=connection.error),await connection.close(),report})),failed=loaded.errors.length>0||reports.some(report=>report.enabled&&report.state!=="connected");if(json)return log(JSON.stringify({servers:reports,errors:loaded.errors,...untrustedNote?{note:untrustedNote}:{}},null,2)),failed?1:0;reports.length===0&&loaded.errors.length===0&&log(`No MCP servers configured. Add them to ${join(options.agentDir,"mcp.json")} or .pi/mcp.json.`);for(let report of reports){let state=report.state==="connected"?`connected, ${report.tools.length} tool${report.tools.length===1?"":"s"}`:report.state==="needs-auth"?"needs sign-in":report.state;if(log(`${report.name}: ${state} (${report.exposure}, ${report.scope})`),log(` ${report.transport}`),report.override&&log(` project override: ${report.override}`),report.state==="needs-auth"&&log(` sign in with: ${APP_NAME} mcp login ${report.name}`),report.tools.length>0){let tools=report.tools.map(tool=>{let exposure=report.toolExposure?.[tool];return exposure?`${tool} [${exposure}]`:tool});log(` tools: ${tools.join(", ")}`)}report.resources&&log(" offers resources"),report.error&&log(` ${report.error.split(`
|
|
49
49
|
`).join(`
|
|
50
50
|
`)}`)}for(let configError of loaded.errors)log(`config error: ${configError}`);return untrustedNote&&log(untrustedNote),failed?1:0}async function login(entry,connection,url,timeoutMs,options,credentials,log,error){let{name}=entry;try{return await connection.getClient(),log(`Already signed in to MCP server "${name}" (${connection.tools.length} tools).`),0}catch{if(connection.state!=="needs-auth")return error(`MCP server "${name}" failed to connect: ${connection.error??"unknown error"}`),1}let openUrl=options.openUrl??openBrowser,interactive=process.stdin.isTTY===!0&&options.openUrl===void 0;try{await signInMcpServer({serverUrl:url,store:credentials.forServer(name,url),settings:connection.oauthSettings(),challenge:connection.challenge,prompt:{showAuthorizationUrl:authorizationUrl=>{log(`Sign in to MCP server "${name}" in your browser:
|
|
51
51
|
${authorizationUrl.href}`),openUrl(authorizationUrl.href)},promptForRedirectUrl:signal=>waitForRedirectUrl(signal,interactive)},signal:AbortSignal.timeout(timeoutMs)})}catch(signInError){return error(signInError instanceof McpSignInCancelledError?`Sign-in to MCP server "${name}" was cancelled or not completed within ${Math.round(timeoutMs/1e3)} seconds.`:`Sign-in to MCP server "${name}" failed: ${errorMessage(signInError)}`),1}connection.challenge=void 0;try{await connection.reconnect()}catch(connectError){return error(`Signed in, but ${errorMessage(connectError)}`),1}return log(`Signed in to MCP server "${name}" (${connection.tools.length} tools).`),0}async function waitForRedirectUrl(signal,interactive){if(!interactive){signal.aborted||await new Promise(resolve=>signal.addEventListener("abort",resolve,{once:!0}));return}let readline=createInterface({input:process.stdin,output:process.stderr});try{return await readline.question("If the browser cannot reach this machine, paste the URL it was redirected to: ",{signal})}catch{return}finally{readline.close()}}export{runMcpCommand};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{classifySystemOne}from"./chunk-
|
|
2
|
+
import{classifySystemOne}from"./chunk-ITZNWD4K.js";import{isRecord}from"./chunk-XIX7LUWI.js";import"./chunk-TEPMHNKQ.js";import"./chunk-PMRZO46Y.js";import"./chunk-UTB4DTYQ.js";import"./chunk-HACVPRBJ.js";import"./chunk-LPXNMA2W.js";import"./chunk-4L3WN2XY.js";var LABEL="Cloudflare Workers AI";function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message=>message!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let result=body.result;if(!isRecord(result))throw new Error(`${LABEL} returned an unexpected response`);if("answers"in result)return result;if(result.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(result.state)})`);if(!isRecord(result.result))throw new Error(`${LABEL} returned an unexpected response`);return result.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options);export{classify};
|