@huyooo/ai-chat-core 0.3.24 → 0.3.25

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.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ChatCatalogCompileItem → ModelConfig(official / byok,独立接入与接 Ones 共用)
3
+ */
4
+ import type { ChatCatalogCompileItem } from '../compile-item';
5
+ import type { LLMConfig, ModelConfig, ModelEndpoint, RuntimeConfigValue } from '../../llm-config';
6
+ export type ChatModelCompileAccess = {
7
+ mode: 'official';
8
+ accessKey: RuntimeConfigValue;
9
+ headers?: ModelEndpoint['headers'];
10
+ } | {
11
+ mode: 'self_key';
12
+ accessKey: RuntimeConfigValue;
13
+ };
14
+ export declare function compileChatModelConfig(item: ChatCatalogCompileItem, access: ChatModelCompileAccess): ModelConfig;
15
+ export interface ResolveDefaultChatOfferingOptions {
16
+ preferredOfferingModelId?: string;
17
+ preferredProfileId?: string;
18
+ }
19
+ /** 从已编译 models 与目录解析默认 offeringModelId(接 Ones 时传入 preferredProfileId) */
20
+ export declare function resolveDefaultChatOfferingModelId(catalog: ChatCatalogCompileItem[], models: LLMConfig['models'], options?: ResolveDefaultChatOfferingOptions): string;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 目录项:接 Ones modelOptions 或手写等价结构,用于 compile official / byok
3
+ */
4
+ import type { ModelFamilyId } from '../families';
5
+ import type { ProtocolId } from '../protocols/types';
6
+ export interface ChatCatalogCompileItem {
7
+ offeringModelId: string;
8
+ profileId?: string;
9
+ supplierId: string;
10
+ supplierName?: string;
11
+ officialEligible?: boolean;
12
+ displayName: string;
13
+ providerModelId: string;
14
+ protocolId?: string;
15
+ chatRuntimeProtocol: ProtocolId;
16
+ protocolBaseUrl: string;
17
+ protocolPath: string;
18
+ family: ModelFamilyId;
19
+ supportsThinking: boolean;
20
+ supportsVision: boolean;
21
+ contextWindowTokens: number;
22
+ maxOutputTokens: number;
23
+ status?: 'active' | 'deprecated';
24
+ tags?: string[];
25
+ officialProxyBaseUrl?: string;
26
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 协议目录校验(浏览器安全,不含平台出站)
3
+ */
4
+ import type { ProtocolId } from '../protocols/types';
5
+ export declare function isChatRuntimeProtocolId(value: string): value is ProtocolId;
6
+ export declare function resolveChatRuntimeProtocol(stored?: string | null): ProtocolId | null;
7
+ export declare function resolveOfficialProxyBaseUrl(stored?: string | null): string | null;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @huyooo/ai-chat-core/catalog
3
+ *
4
+ * 独立接入与 Ones 管理端共用的轻量入口(浏览器安全):
5
+ * - 协议 UI 词汇
6
+ * - 接入方式展示文案
7
+ * - 协议 ID 校验
8
+ *
9
+ * 平台模型目录、出站代理、Mongo DTO 在 ai-server/src/catalog。
10
+ */
11
+ export type { ChatCatalogCompileItem } from './compile-item';
12
+ export { isChatRuntimeProtocolId, resolveChatRuntimeProtocol, resolveOfficialProxyBaseUrl, } from './constants';
13
+ export { CHAT_RUNTIME_PROTOCOL_OPTIONS, formatChatRuntimeProtocolLabel, } from './ui/runtime-protocol-options';
14
+ export { CHAT_ACCESS_MODE_SELF_KEY_LABEL, CHAT_ACCESS_MODE_OFFICIAL_LABEL, formatChatAccessModeLabel, } from './ui/access-mode-labels';
15
+ export type { ChatAccessModeLabelKey } from './ui/access-mode-labels';
16
+ export type { ChatModelCompileAccess, ResolveDefaultChatOfferingOptions, } from './compile/model-config';
17
+ export { compileChatModelConfig, resolveDefaultChatOfferingModelId, } from './compile/model-config';
@@ -0,0 +1,5 @@
1
+ /** 对话接入方式(compileChatModelConfig mode)的中文展示名 */
2
+ export declare const CHAT_ACCESS_MODE_OFFICIAL_LABEL = "\u5B98\u65B9\u7EBF\u8DEF";
3
+ export declare const CHAT_ACCESS_MODE_SELF_KEY_LABEL = "\u81EA\u5907\u5BC6\u94A5";
4
+ export type ChatAccessModeLabelKey = 'official' | 'self_key';
5
+ export declare function formatChatAccessModeLabel(mode: ChatAccessModeLabelKey): string;
package/dist/catalog.d.ts CHANGED
@@ -1,7 +1,4 @@
1
1
  /**
2
- * 模型目录 / Ones 管理端共用常量(浏览器安全,不含 ChatRuntime / Node 依赖)
2
+ * @huyooo/ai-chat-core/catalog 子路径入口(与 dist/catalog.js 对齐)
3
3
  */
4
- export type { CatalogSupplierKind } from './chat-supplier-constants';
5
- export { PROXY_SUPPLIER_IDS, isProxySupplierId, normalizeCatalogSupplierKind, resolveCatalogSupplierKind, } from './chat-supplier-constants';
6
- export type { ChatServerUpstream } from './chat-catalog-constants';
7
- export { CHAT_RUNTIME_PROTOCOL_OPTIONS, formatChatRuntimeProtocolLabel, } from './chat-runtime-protocol-options';
4
+ export * from './catalog/index';
package/dist/catalog.js CHANGED
@@ -1 +1 @@
1
- const e=[`openrouter`,`volcengine-ark-coding-plan`,`volcengine-ark-agent-plan`];function t(t){for(let n of e)if(n===t)return!0;return!1}function n(e){return e===`agent_proxy`?`agent_proxy`:`agent_vendor`}function r(e,r){return t(e)?`agent_proxy`:n(r)}const i=[`ark_v1`,`deepseek_v1`,`qwen_v1`,`qwen_text_v1`,`glm_v1`,`moonshot_v1`,`minimax_v1`,`vercel_gateway_v1`,`anthropic_v1`,`gemini_v1`,`openai_v1`,`openai_chat_v1`,`grok_v1`],a={ark_v1:`ark_v1 · 火山 Responses`,deepseek_v1:`deepseek_v1 · DeepSeek Chat`,qwen_v1:`qwen_v1 · 通义多模态`,qwen_text_v1:`qwen_text_v1 · 通义文本生成`,glm_v1:`glm_v1 · 智谱 GLM`,moonshot_v1:`moonshot_v1 · Kimi`,minimax_v1:`minimax_v1 · MiniMax Anthropic 兼容`,vercel_gateway_v1:`vercel_gateway_v1 · Vercel AI Gateway`,anthropic_v1:`anthropic_v1 · Anthropic Messages`,gemini_v1:`gemini_v1 · Gemini Generate`,openai_v1:`openai_v1 · OpenAI Responses`,openai_chat_v1:`openai_chat_v1 · OpenAI Chat Completions 兼容`,grok_v1:`grok_v1 · xAI Grok`},o=i.map(e=>({value:e,label:a[e]}));function s(e){let t=e?.trim();return t?o.find(e=>e.value===t)?.label??t:`—`}export{o as CHAT_RUNTIME_PROTOCOL_OPTIONS,e as PROXY_SUPPLIER_IDS,s as formatChatRuntimeProtocolLabel,t as isProxySupplierId,n as normalizeCatalogSupplierKind,r as resolveCatalogSupplierKind};
1
+ const e=[`ark_v1`,`deepseek_v1`,`qwen_v1`,`qwen_text_v1`,`glm_v1`,`moonshot_v1`,`minimax_v1`,`vercel_gateway_v1`,`anthropic_v1`,`gemini_v1`,`openai_v1`,`openai_chat_v1`,`grok_v1`],t=new Set(e);function n(e){return t.has(e)}function r(e){let t=e?.trim();return t&&n(t)?t:null}function i(e){return e?.trim().replace(/\/+$/,``)||null}const a={ark_v1:`ark_v1 · 火山 Responses`,deepseek_v1:`deepseek_v1 · DeepSeek Chat`,qwen_v1:`qwen_v1 · 通义多模态`,qwen_text_v1:`qwen_text_v1 · 通义文本生成`,glm_v1:`glm_v1 · 智谱 GLM`,moonshot_v1:`moonshot_v1 · Kimi`,minimax_v1:`minimax_v1 · MiniMax Anthropic 兼容`,vercel_gateway_v1:`vercel_gateway_v1 · Vercel AI Gateway`,anthropic_v1:`anthropic_v1 · Anthropic Messages`,gemini_v1:`gemini_v1 · Gemini Generate`,openai_v1:`openai_v1 · OpenAI Responses`,openai_chat_v1:`openai_chat_v1 · OpenAI Chat Completions 兼容`,grok_v1:`grok_v1 · xAI Grok`},o=e.map(e=>({value:e,label:a[e]}));function s(e){let t=e?.trim();return t?o.find(e=>e.value===t)?.label??t:`—`}const c=`官方线路`,l=`自备密钥`;function u(e){return e===`official`?c:l}function d(e){let t=e.trim();return t?t.startsWith(`/`)?t:`/${t}`:``}function f(e){return e?.trim().replace(/\/+$/,``)||null}function p(e,t,n){let r=f(e.officialProxyBaseUrl);if(!r)throw Error(`供应商 ${e.supplierId} 不支持官方线路`);return{baseUrl:r,path:d(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId,headers:n}}function m(e,t){return{baseUrl:e.protocolBaseUrl.replace(/\/$/,``),path:d(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId}}function h(e){return{displayName:e.displayName,family:e.family,supportsThinking:e.supportsThinking,supportsVision:e.supportsVision,contextWindowTokens:e.contextWindowTokens,maxOutputTokens:e.maxOutputTokens}}function g(e,t){let n={supplierId:e.supplierId,offeringModelId:e.offeringModelId,...e.profileId?{profileId:e.profileId}:{},...e.protocolId?{protocolId:e.protocolId}:{},...e.status===`deprecated`?{status:`deprecated`}:{}};return t.mode===`official`?{...h(e),endpoint:p(e,t.accessKey,t.headers),metadata:{...n,source:`huyooo-official`}}:{...h(e),endpoint:m(e,t.accessKey),metadata:{...n,source:`self_key`}}}function _(e,t,n){let r=n?.preferredOfferingModelId?.trim();if(r&&t[r])return r;let i=n?.preferredProfileId?.trim();if(i){let n=e.find(e=>e.profileId===i&&t[e.offeringModelId]);if(n)return n.offeringModelId}let a=e.find(e=>e.officialEligible&&t[e.offeringModelId]);if(a)return a.offeringModelId;let o=Object.keys(t)[0];if(!o)throw Error(`没有可用对话模型,请检查目录与出站配置`);return o}export{c as CHAT_ACCESS_MODE_OFFICIAL_LABEL,l as CHAT_ACCESS_MODE_SELF_KEY_LABEL,o as CHAT_RUNTIME_PROTOCOL_OPTIONS,g as compileChatModelConfig,u as formatChatAccessModeLabel,s as formatChatRuntimeProtocolLabel,n as isChatRuntimeProtocolId,r as resolveChatRuntimeProtocol,_ as resolveDefaultChatOfferingModelId,i as resolveOfficialProxyBaseUrl};
package/dist/index.d.ts CHANGED
@@ -59,20 +59,14 @@ export { createManagedSkillSummary, createManagedSkillDetail } from './skills';
59
59
  export type { SkillManagementOptions, OnSkillCreate, OnSkillUpdate, OnSkillDelete, OnSkillSetEnabled, OnSkillLoadContent, OnSkillLoadReference, } from './skills';
60
60
  export { getModelEndpoint, resolveEndpointUrl, resolveChatModel, findEndpointByProtocol, } from './llm-config';
61
61
  export type { LLMConfig, ModelEndpoint, ModelConfig, CompressionConfig, } from './llm-config';
62
- export type { ChatModelIntegrationExport } from './build-chat-integration-export';
63
- export { buildChatModelIntegrationExport } from './build-chat-integration-export';
64
62
  export { BUILTIN_PROTOCOL_IDS, BUILTIN_PROTOCOL_FACTORIES, getBuiltinProtocolFactories, isRegisteredProtocolId, } from './protocols/registry';
65
- export { isChatRuntimeProtocolId, resolveChatRuntimeProtocol, resolveOfficialProxyBaseUrl, resolveServerSupplierPolicy, SERVER_LLM_PROXY_PATH_BY_PROTOCOL, } from './chat-catalog-constants';
66
- export type { ChatServerSupplierPolicy, ChatServerUpstream, } from './chat-catalog-constants';
67
- export type { CatalogSupplierKind } from './chat-supplier-constants';
68
- export { PROXY_SUPPLIER_IDS, isProxySupplierId, normalizeCatalogSupplierKind, resolveCatalogSupplierKind, } from './chat-supplier-constants';
69
- export { CHAT_RUNTIME_PROTOCOL_OPTIONS, formatChatRuntimeProtocolLabel, } from './chat-runtime-protocol-options';
70
- export type { ChatModelCatalogItem, ChatSupplierOption, } from './chat-catalog-types';
71
- export { DEFAULT_CHAT_PROFILE_ID } from './chat-catalog-types';
72
- export type { ChatModelCompileAccess, ResolveDefaultChatOfferingOptions, } from './compile-chat-model-config';
73
- export { compileChatModelConfig, resolveDefaultChatOfferingModelId, } from './compile-chat-model-config';
74
- export type { ServerChatEnv } from './server-chat-endpoint';
75
- export { getServerChatUpstream, resolveServerChatEndpoint, } from './server-chat-endpoint';
63
+ export type { ChatCatalogCompileItem } from './catalog/compile-item';
64
+ export type { ChatModelCompileAccess, ResolveDefaultChatOfferingOptions, } from './catalog/compile/model-config';
65
+ export { compileChatModelConfig, resolveDefaultChatOfferingModelId, } from './catalog/compile/model-config';
66
+ export { isChatRuntimeProtocolId, resolveChatRuntimeProtocol, resolveOfficialProxyBaseUrl, } from './catalog/constants';
67
+ export { CHAT_RUNTIME_PROTOCOL_OPTIONS, formatChatRuntimeProtocolLabel, } from './catalog/ui/runtime-protocol-options';
68
+ export { CHAT_ACCESS_MODE_SELF_KEY_LABEL, CHAT_ACCESS_MODE_OFFICIAL_LABEL, formatChatAccessModeLabel, } from './catalog/ui/access-mode-labels';
69
+ export type { ChatAccessModeLabelKey } from './catalog/ui/access-mode-labels';
76
70
  export { partRegistry } from './parts';
77
71
  export type { PartMeta, PartSearchQuery, PartRegistry, ManagedPartSummary, ManagedPartDetail, } from './parts';
78
72
  export { createManagedPartSummary, createManagedPartDetail } from './parts';
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
- import{FormatRegistry as e,Kind as t,Type as n,Type as r}from"@sinclair/typebox";import i from"pino";import a from"pino-pretty";import o from"node:path";import s from"node:fs";import{Client as c}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as l}from"@modelcontextprotocol/sdk/client/stdio.js";import{SSEClientTransport as u}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as d}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{TypeCompiler as f}from"@sinclair/typebox/compiler";function p(e,t){return{data:e,message:t}}function m(e){return typeof e==`object`&&!!e}function h(e){return m(e)?`data`in e||`message`in e||`text`in e||`_summary`in e||`metadata`in e:!1}function g(e){return e?h(e)?e:{data:e}:{data:{}}}function _(e){let t={status:`ok`,data:e.data??{}},n=e.message??e.text;return n!==void 0&&(t.message=n),e._summary!==void 0&&(t._summary=e._summary),e.metadata!==void 0&&(t._meta=e.metadata),t}function v(e){return m(e)&&(e.type===`action`||e.type===`render`)?typeof e.name==`string`:!1}function y(e,t){let n=e.metadata;if(!n||!Object.prototype.hasOwnProperty.call(n,`ui`))return t;let r=n.ui;if(r!=null)return v(r)?r:t}function b(e,t){let n={auto:0,"destructive-only":1,manual:2};return e?t?n[e]>=n[t]?e:t:e:t}function x(e,t){let n={read:0,write:1,destructive:2};return e?t?n[e]>=n[t]?e:t:e:t}function S(e,t){let n={none:0,"local-app":1,"os-service":2,"remote-service":3};return e?t?n[e]>=n[t]?e:t:e:t}function C(e,t){return{approvalPolicy:b(e?.approvalPolicy,t?.approvalPolicy),sideEffectLevel:x(e?.sideEffectLevel,t?.sideEffectLevel),hostDependency:S(e?.hostDependency,t?.hostDependency),riskSummary:t?.riskSummary??e?.riskSummary,riskTags:t?.riskTags??e?.riskTags,riskSignals:t?.riskSignals??e?.riskSignals}}async function w(e,t){return C(e?{approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}:{},e?.assessInputGovernance?await e.assessInputGovernance(t):void 0)}var T=class extends Error{toolError;constructor(e){super(e.message),this.name=`ToolException`,this.toolError=e}};function E(e){return e instanceof T}function D(e){throw new T(typeof e==`string`?{message:e,code:`OPERATION_FAILED`}:e)}const O={type:`object`,description:`工具失败时的平台标准错误结构。成功结果使用工具自己的 resolvedOutputSchema。`,properties:{status:{type:`string`,enum:[`error`],description:`固定为 error,表示工具执行失败。`},failureReason:{type:`string`,description:`执行层失败原因,例如 parse_error、denied、timeout、execution_error。`},error:{type:`object`,description:`结构化错误信息。`,properties:{code:{type:`string`,description:`稳定错误码,例如 INVALID_PARAMS、NETWORK_ERROR、NOT_FOUND。`},message:{type:`string`,description:`给用户和模型看的错误说明。`},category:{type:`string`,enum:[`validation`,`permission`,`network`,`not_found`,`conflict`,`runtime`,`external`],description:`错误分类,用于判断是否换参数、重试、申请权限或停止。`},retryable:{type:`boolean`,description:`是否建议用相同目标稍后重试。`},suggestion:{type:`string`,description:`可选修复建议。`},details:{type:`object`,description:`可选调试详情,字段随错误码变化。`,additionalProperties:!0}},required:[`message`],additionalProperties:!1}},required:[`status`,`failureReason`,`error`],additionalProperties:!1};function k(e){return Object.prototype.hasOwnProperty.call(e,t)}function A(e){let t={};for(let n of[`description`,`default`,`title`,`format`,`pattern`,`minLength`,`maxLength`,`minimum`,`maximum`,`exclusiveMinimum`,`exclusiveMaximum`,`multipleOf`,`minItems`,`maxItems`,`uniqueItems`]){let r=e[n];r!==void 0&&(t[n]=r)}let n=e.additionalProperties;return typeof n==`boolean`?t.additionalProperties=n:n&&typeof n==`object`&&(t.additionalProperties=M(n)),t}function j(e,t){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?r.Literal(e,t):e===null?r.Null(t):r.Any(t)}function ee(e,t){let n=A(t),i=e.map(e=>j(e,{}));return i.length===1?j(e[0],n):r.Union(i,n)}function M(e){if(k(e))return e;if(Object.prototype.hasOwnProperty.call(e,`const`))return j(e.const,A(e));let t=Array.isArray(e.enum)?e.enum:void 0;if(t&&t.length>0)return ee(t,e);let n=Array.isArray(e.oneOf)?e.oneOf:Array.isArray(e.anyOf)?e.anyOf:void 0;if(n&&n.length>0)return r.Union(n.map(e=>e&&typeof e==`object`?M(e):r.Any()),A(e));let i=e.type;if(Array.isArray(i))return r.Union(i.map(t=>M({...e,type:t,oneOf:void 0,anyOf:void 0})),A(e));let a=A(e);if(i===`string`)return r.String(a);if(i===`number`)return r.Number(a);if(i===`integer`)return r.Integer(a);if(i===`boolean`)return r.Boolean(a);if(i===`null`)return r.Null(a);if(i===`array`){let t=e.items,n=t&&typeof t==`object`?M(t):r.Any();return r.Array(n,a)}if(i===`object`||typeof e.properties==`object`){let t=e.properties,n=Array.isArray(e.required)?new Set(e.required.filter(e=>typeof e==`string`)):new Set,i=t&&typeof t==`object`?Object.entries(t):[],o={};for(let[e,t]of i){let i=t&&typeof t==`object`?M(t):r.Any();o[e]=n.has(e)?i:r.Optional(i)}return r.Object(o,a)}return r.Any(a)}function te(e){let t=e.description?e:{...e,description:`工具成功时的业务数据。`};return r.Object({status:r.Literal(`ok`,{description:`固定为 ok,表示工具执行成功。`}),data:M(t),message:r.Optional(r.String({description:`可选。给用户和模型看的简短说明,不承载业务数据。`}))},{description:`工具成功时的平台标准返回结构。业务字段固定放在 data 内。`})}function ne(e){return{tools:[e]}}function re(e){return{tools:e}}async function ie(e){let t=[];for(let n of e){let e=await n;`tools`in e&&Array.isArray(e.tools)?t.push(...e.tools):`name`in e&&`execute`in e&&t.push(e)}return t}function N(e){return{type:`agent_status`,data:{phase:e}}}const ae=[`thinking_start`,`thinking_delta`,`thinking_end`,`tool_call_start`,`tool_call_result`,`tool_call_output`,`tool_approval_request`,`tool_call_request`,`text_start`,`text_delta`,`text_end`,`done`,`error`,`abort`,`data`,`step_start`,`step_end`,`assistant_segment_start`,`compact_start`,`compact_end`,`content_compress_start`,`content_compress_end`,`agent_status`];function oe(e){return{type:`thinking_start`,data:{blockId:e,startedAt:Date.now()}}}function se(e,t){return{type:`thinking_delta`,data:{blockId:e,content:t}}}function ce(e,t){let n=Date.now();return{type:`thinking_end`,data:{blockId:e,endedAt:n,duration:n-t}}}function le(e,t,n,r,i){return{type:`tool_call_start`,data:{id:e,name:t,args:n,...r?{ui:r}:{},...i?.approvalPolicy?{approvalPolicy:i.approvalPolicy}:{},...i?.sideEffectLevel?{sideEffectLevel:i.sideEffectLevel}:{},...i?.hostDependency?{hostDependency:i.hostDependency}:{},...i?.riskSummary?{riskSummary:i.riskSummary}:{},...i?.riskTags?.length?{riskTags:i.riskTags}:{},...i?.riskSignals?.length?{riskSignals:i.riskSignals}:{},startedAt:Date.now()}}}function P(e,t,n,r,i,a,o,s,c){let l=Date.now();return{type:`tool_call_result`,data:{id:e,name:t,result:n,success:r,failureReason:s,error:a,endedAt:l,duration:l-i,ui:o,...c?.approvalPolicy?{approvalPolicy:c.approvalPolicy}:{},...c?.sideEffectLevel?{sideEffectLevel:c.sideEffectLevel}:{},...c?.hostDependency?{hostDependency:c.hostDependency}:{},...c?.riskSummary?{riskSummary:c.riskSummary}:{},...c?.riskTags?.length?{riskTags:c.riskTags}:{},...c?.riskSignals?.length?{riskSignals:c.riskSignals}:{}}}}function ue(e,t,n,r){return{type:`tool_call_output`,data:{id:e,name:t,stream:n,chunk:r,at:Date.now()}}}function de(e,t,n,r,i){return{type:`tool_call_request`,data:{id:e,name:t,args:n,...r?{ui:r}:{},...i?.approvalPolicy?{approvalPolicy:i.approvalPolicy}:{},...i?.sideEffectLevel?{sideEffectLevel:i.sideEffectLevel}:{},...i?.hostDependency?{hostDependency:i.hostDependency}:{},...i?.riskSummary?{riskSummary:i.riskSummary}:{},...i?.riskTags?.length?{riskTags:i.riskTags}:{},...i?.riskSignals?.length?{riskSignals:i.riskSignals}:{},requestedAt:Date.now()}}}function fe(e){return{type:`text_start`,data:{blockId:e}}}function pe(e,t){return{type:`text_delta`,data:{blockId:e,content:t}}}function me(e){return{type:`text_end`,data:{blockId:e}}}function he(e,t,n,r){return{type:`done`,data:{text:e,finishReason:t,usage:n,duration:r}}}function F(e){return{type:`error`,data:e}}function I(e,t={}){return F({category:`api`,message:e,...t})}function ge(e,t,n){return F({category:`rate_limit`,message:e,code:`RATE_LIMIT`,statusCode:429,retryable:!0,retryAfter:t,context:n})}function _e(e,t,n){return F({category:`tool`,message:e,code:`TOOL_ERROR`,context:t,cause:n,retryable:!1})}function ve(e,t){return F({category:`timeout`,message:e,code:`TIMEOUT`,retryable:!0,context:t})}function ye(e,t){return F({category:`parse`,message:e,code:`PARSE_ERROR`,cause:t,retryable:!1})}function be(e){return{type:`abort`,data:{reason:e,abortedAt:Date.now()}}}function xe(e,t){return{type:`step_start`,data:{stepNumber:e,description:t,startedAt:Date.now()}}}function L(e,t){let n=Date.now();return{type:`step_end`,data:{stepNumber:e,endedAt:n,duration:n-t}}}function R(e,t){return{type:`assistant_segment_start`,data:{reason:e,...typeof t==`number`?{stepNumber:t}:{},startedAt:Date.now()}}}function Se(e,t){return{type:`compact_start`,data:{estimatedTokens:e,budget:t,startedAt:Date.now()}}}function Ce(e,t,n,r,i,a,o,s){let c=Date.now();return{type:`compact_end`,data:{success:e,...o?{summaryContent:o}:{},...s?{model:s}:{},tokensBeforeCompact:t,compressedTokens:n,originalMessageCount:r,compressedMessageCount:i,endedAt:c,duration:c-a}}}function we(e,t){return{type:`content_compress_start`,data:{originalTokens:e,budget:t,startedAt:Date.now()}}}function Te(e,t,n,r,i,a){return{type:`content_compress_end`,data:{success:e,...i?{summary:i}:{},...a?{model:a}:{},originalTokens:t,compressedTokens:n,duration:Date.now()-r}}}function Ee(e){return e.type.startsWith(`thinking_`)}function De(e){return e.type.startsWith(`tool_`)}function Oe(e){return e.type===`text_start`||e.type===`text_delta`||e.type===`text_end`}function ke(e){return e.type===`done`||e.type===`error`||e.type===`abort`}function Ae(e){return e.type===`error`}function je(e){return e.type===`abort`}function Me(e){return e.type.startsWith(`step_`)}function Ne(e){return e.type===`assistant_segment_start`}function Pe(e){return e.type===`error`?e.data.retryable===!0:!1}function Fe(e,t){let n=t??e.defaultModel;if(!n)throw Error(`未指定 model,且 LLMConfig.defaultModel 未配置`);return n}function Ie(e){let t=e.path??``;return t?`${e.baseUrl.replace(/\/$/,``)}${t}`:e.baseUrl}function Le(e,t){return e.models[t]?.endpoint}function Re(e,t){for(let n of Object.values(e.models)){let e=n?.endpoint;if(e?.protocol===t)return e}}const ze=[`ark_v1`,`deepseek_v1`,`qwen_v1`,`qwen_text_v1`,`glm_v1`,`moonshot_v1`,`minimax_v1`,`vercel_gateway_v1`,`anthropic_v1`,`gemini_v1`,`openai_v1`,`openai_chat_v1`,`grok_v1`];let Be=null;function Ve(){return process.env.NODE_ENV===`development`}function He(){let e=process.env.LOG_LEVEL?.toLowerCase();return e&&[`debug`,`info`,`warn`,`error`].includes(e)?e:Ve()?`debug`:`info`}function Ue(){let e=He();if(Ve()){let t=a({colorize:!0,translateTime:`SYS:standard`});return i({level:e},t)}return i({level:e},i.destination(1))}function We(e){let t=e.level??(e.isDev?`debug`:`info`),n=[];if(e.isDev?n.push({stream:a({colorize:!0,translateTime:`SYS:standard`}),level:t}):n.push({stream:i.destination(1),level:t}),e.baseDir){let r=o.join(e.baseDir,`logs`);try{s.mkdirSync(r,{recursive:!0})}catch{}let a=o.join(r,`ai-chat.log`);n.push({stream:i.destination(a),level:t})}return i({level:t},i.multistream(n))}function Ge(e){Be=We(e)}function Ke(){return Be??Ue()}function z(e){return Ke().child({module:e})}const qe={400:`请求参数错误`,401:`API 认证失败,请检查 API Key 配置`,402:`账户余额不足,请充值后重试`,403:`没有权限访问此模型`,404:`请求的模型或接口不存在`,429:`请求过于频繁,请稍后重试`,500:`API 服务器内部错误,请稍后重试`,502:`API 网关错误,请稍后重试`,503:`API 服务暂时不可用,请稍后重试`,504:`API 请求超时,请稍后重试`};function B(e,t,n){let r=Je(t)?.message,i=qe[e];if(r){let t=r.length>300?r.slice(0,300)+`...`:r;return`${i??`${n} 错误 (${e})`}(${t})`}return i??`${n} 错误 (${e})`}function Je(e){try{let t=JSON.parse(e);if(t?.error?.message)return{message:t.error.message,type:t.error.type};if(typeof t?.error==`string`)return{message:t.error,type:t.code};if(typeof t?.error_msg==`string`)return{message:t.error_msg};if(typeof t?.message==`string`)return{message:t.message}}catch{}return null}const Ye=z(`SSEReader`);async function*V(e){let t=new TextDecoder,n=``;for(;;){let{done:r,value:i}=await e.read();if(r)break;n+=t.decode(i,{stream:!0});let a=n.split(`
2
- `);n=a.pop()||``;for(let e of a){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(!(!t||t===`[DONE]`))try{yield JSON.parse(t)}catch(t){Ye.warn({line:e.slice(0,100),error:String(t)},`SSE JSON 解析失败`)}}}}const Xe=z(`ArkProtocol`);var Ze=class{name=`ark`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n);Xe.debug({url:this.apiUrl,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 ARK 请求`);let i=await fetch(this.apiUrl,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!i.ok){let e=await i.text();Xe.error({status:i.status,body:e.slice(0,500)},`ARK API 错误`),yield{type:`error`,error:B(i.status,e,`ARK`)};return}let a=i.body?.getReader();if(!a){yield{type:`error`,error:`无法获取响应流`};return}yield*this.parseSSE(a)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,stream:!0,max_output_tokens:n.maxOutputTokens,input:r},a=[];for(let e of t)a.push({type:`function`,name:e.name,description:e.description,parameters:e.parameters});return a.length>0&&(i.tools=a),n.enableThinking&&(i.thinking={type:`enabled`}),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`input_text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images)e.push({type:`input_image`,image_url:t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`});t.push({role:`user`,content:e});break}case`assistant`:if(n.toolCalls?.length){n.content&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:n.content}]});for(let e of n.toolCalls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments})}else t.push({role:`developer`,content:`[上一轮AI回复]: ${n.content}`});break;case`tool`:t.push({type:`function_call_output`,call_id:n.toolCallId,output:n.content});break}return t}async*parseSSE(e){let t=new Map,n=null,r=!1,i=!1,a;for await(let o of V(e)){let e=o.response?.usage??o.usage;if(e){let t=e,n=t.input_tokens??t.prompt_tokens??0,r=t.output_tokens??t.completion_tokens??0,i=t.output_tokens_details,o=t.input_tokens_details;a={promptTokens:n,completionTokens:r,totalTokens:n+r,reasoningTokens:i?.reasoning_tokens??0,cachedTokens:o?.cached_tokens??0}}switch(o.type){case`response.output_item.added`:{let e=o.item;e?.type===`function_call`&&e.call_id&&(e.name||Xe.warn({id:e.call_id},`function_call added 缺少 name`),n=e.call_id,t.set(n,{id:n,name:e.name||``,arguments:e.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:n,name:e.name||``}});break}case`response.function_call_arguments.delta`:if(n){let e=t.get(n);e&&(e.arguments+=o.delta||``,yield{type:`tool_call_delta`,toolCall:{id:n,arguments:o.delta||``}})}break;case`response.function_call_arguments.done`:case`response.output_item.done`:{let e=o.item;if(e?.type===`function_call`&&e.call_id){let n=e.call_id,r=t.get(n);t.set(n,{id:n,name:e.name||r?.name||``,arguments:e.arguments||r?.arguments||`{}`})}break}case`response.output_text.delta`:o.delta&&(i||(i=!0,r||(r=!0,yield{type:`thinking_done`})),yield{type:`text_delta`,delta:o.delta});break;case`response.reasoning_summary_text.delta`:o.delta&&!r&&(yield{type:`thinking_delta`,delta:o.delta});break}}if(t.size>0){for(let e of t.values())yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:`stop`,usage:a}}};function Qe(e){return new Ze(e)}z(`OpenAISSE`);function $e(e){let t=e.completion_tokens_details,n=e.prompt_tokens_details;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:t?.reasoning_tokens??0,cachedTokens:n?.cached_tokens??e.prompt_cache_hit_tokens??0}}function et(e,t){return e?e===`tool_calls`||e===`length`||e===`error`?e:t?.includes(e)?`error`:`stop`:`stop`}async function*tt(e,t){let n=new Map,r=!1,i=!1,a,o,s=t?.parseUsage??$e,c=t?.thinkingField;for await(let t of e){t.usage&&(a=s(t.usage));let e=t.choices?.[0];if(!e)continue;let l=e.delta;if(!l)continue;if(c&&!i){let e=c(l);e&&(yield{type:`thinking_delta`,delta:e})}let u=l.content;u&&(!r&&!i&&c&&(i=!0,yield{type:`thinking_done`}),r=!0,yield{type:`text_delta`,delta:u});let d=l.tool_calls;if(d?.length)for(let e of d){let t=e.index??0,r=e.function,i=n.get(t);if(i)r?.arguments&&(i.arguments+=r.arguments);else{let i=e.id||`call_${t}`,a=r?.name||``;n.set(t,{id:i,name:a,arguments:r?.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}}}}let f=e.finish_reason;f&&(o=f)}let l=Array.from(n.values());if(l.length>0){for(let e of l)yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else{let e=et(o,t?.errorFinishReasons);e===`error`&&(yield{type:`error`,error:`${t?.protocolName??`LLM`} 推理异常 (finish_reason: ${o})`}),yield{type:`done`,finishReason:e,usage:a}}}const nt=z(`DeepSeekProtocol`),rt={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`content_filter`,`insufficient_system_resource`],protocolName:`DeepSeek`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:e.completion_tokens_details?.reasoning_tokens??0,cachedTokens:e.prompt_cache_hit_tokens??0})};var it=class{name=`deepseek`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;nt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 DeepSeek 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();nt.error({status:a.status,body:e.slice(0,500)},`DeepSeek API 错误`),yield{type:`error`,error:B(a.status,e,`DeepSeek`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*tt(V(o),rt)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0},max_tokens:n.maxOutputTokens};return n.enableThinking&&(i.thinking={type:`enabled`}),t.length>0&&(i.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function at(e){return new it(e)}const ot=z(`QwenProtocol`);function st(e){if(typeof e==`string`)return e;if(Array.isArray(e)){for(let t of e)if(typeof t==`object`&&t&&`text`in t)return t.text||``}return``}function ct(e,t){return e?t?e===t?``:e.startsWith(t)?e.slice(t.length):e:e:``}var lt=class{name;apiKey;apiUrl;headers;endpoint;constructor(e,t=`multimodal`){this.name=t===`text`?`qwen-text`:`qwen`,this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{},this.endpoint=t}async*stream(e,t,n){let r=this.endpoint===`multimodal`,i=this.apiUrl,a=ut(e,t,n,r);ot.debug({url:i,model:n.model,endpoint:r?`multimodal-generation`:`text-generation`,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Qwen 请求(DashScope 原生)`);let o=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`,"X-DashScope-SSE":`enable`},body:JSON.stringify(a),signal:n.signal});if(!o.ok){let e=await o.text();ot.error({status:o.status,body:e.slice(0,500)},`Qwen API 错误`),yield{type:`error`,error:B(o.status,e,`Qwen`)};return}let s=o.body?.getReader();if(!s){yield{type:`error`,error:`无法获取响应流`};return}yield*ft(s,r)}};function ut(e,t,n,r){let i=dt(e,r),a={result_format:`message`,incremental_output:!0};return n.enableThinking&&(a.enable_thinking=!0,a.thinking_budget=38400),t.length>0&&(a.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),{model:n.model,input:{messages:i},parameters:a}}function dt(e,t){let n=[];for(let r of e)switch(r.role){case`system`:n.push({role:`system`,content:t?[{text:r.content}]:r.content});break;case`user`:{let e=r.content||(r.images?.length?`请分析这张图片`:``);if(t){let t=[{text:e}];if(r.images?.length)for(let e of r.images)t.push({image:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`});n.push({role:`user`,content:t})}else n.push({role:`user`,content:e});break}case`assistant`:r.toolCalls?.length?n.push({role:`assistant`,content:t?r.content?[{text:r.content}]:[]:r.content||null,...r.thinkingContent?{reasoning_content:r.thinkingContent}:{},tool_calls:r.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):n.push({role:`assistant`,content:t?r.content?[{text:r.content}]:[]:r.content});break;case`tool`:n.push({role:`tool`,tool_call_id:r.toolCallId,content:r.content});break}return n}async function*ft(e,t){let n=new Map,r=!1,i=!1,a,o=``,s=``;for await(let c of V(e)){if(c.code){yield{type:`error`,error:`${c.code}: ${c.message}`};return}if(c.usage){let e=c.usage;a={promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:e.output_tokens_details?.reasoning_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0}}let e=c.output?.choices?.[0];if(!e)continue;let l=e.message;if(!l)continue;let u=typeof l.reasoning_content==`string`?l.reasoning_content:``;if(u&&!i){let e=ct(u,o);o=u,e&&(yield{type:`thinking_delta`,delta:e})}let d=t?st(l.content):l.content||``,f=ct(d,s);f?(s=d,!r&&!i&&(i=!0,yield{type:`thinking_done`}),r=!0,yield{type:`text_delta`,delta:f}):d&&(s=d);let p=l.tool_calls;if(p?.length)for(let e of p){let t=e.index??0,r=e.function,i=n.get(t);if(i)r?.arguments&&(i.arguments+=r.arguments);else{e.id||ot.warn({index:t},`SSE tool_call 首块缺少 id`),r?.name||ot.warn({index:t,id:e.id},`SSE tool_call 首块缺少 name`);let i=e.id||`call_${t}`,a=r?.name||``;n.set(t,{id:i,name:a,arguments:r?.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}}}}let m=e.finish_reason;if(m&&m!==`null`){let e=Array.from(n.values());if(e.length>0){for(let t of e)yield{type:`tool_call_done`,toolCall:t};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:m===`tool_calls`||m===`length`||m===`error`?m:`stop`,usage:a};return}}let c=Array.from(n.values());if(c.length>0){for(let e of c)yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:`stop`,usage:a}}function pt(e){return new lt(e)}function mt(e){return new lt(e,`text`)}const ht=z(`GlmProtocol`),gt={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`sensitive`,`network_error`],protocolName:`GLM`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0})};var _t=class{name=`glm`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;ht.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 GLM 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();ht.error({status:a.status,body:e.slice(0,500)},`GLM API 错误`),yield{type:`error`,error:B(a.status,e,`GLM`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}let s=!1,c=!1,l=!1;for await(let e of tt(V(o),gt))e.type===`thinking_delta`&&(s=!0),e.type===`text_delta`&&(c=!0),(e.type===`tool_call_start`||e.type===`tool_call_done`)&&(l=!0),yield e;let u={model:n.model,toolsCount:t.length,hadThinkingDelta:s,hadTextDelta:c,hadToolCall:l};!s&&!c&&!l?ht.debug(u,`GLM 流结束:未产出思考/正文/工具调用(常见于工具或上下文过大)`):ht.debug(u,`GLM 流结束`)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i=n.maxOutputTokens,a={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0},max_tokens:i};return n.enableThinking?(a.thinking={type:`enabled`},a.temperature=1):a.thinking={type:`disabled`},t.length>0&&(a.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),a}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function vt(e){return new _t(e)}const yt=z(`MoonshotProtocol`),bt={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`content_filter`],protocolName:`Moonshot`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0})};var xt=class{name=`moonshot`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;yt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Moonshot 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();yt.error({status:a.status,body:e.slice(0,500)},`Moonshot API 错误`),yield{type:`error`,error:B(a.status,e,`Moonshot`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*tt(V(o),bt)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0}};return n.enableThinking&&(i.reasoning={enabled:!0},i.temperature=1),t.length>0&&(i.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function St(e){return new xt(e)}function Ct(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function wt(e,t){let n=e?.trim()?e:`{}`,r;try{r=JSON.parse(n)}catch(e){throw Error(`[${t.protocol}] tool call arguments must be valid JSON: ${t.toolName}(${t.toolCallId}): ${String(e)}`)}if(!Ct(r))throw Error(`[${t.protocol}] tool call arguments must be a JSON object: ${t.toolName}(${t.toolCallId})`);return r}const Tt=z(`MiniMaxProtocol`);var Et=class{name=`minimax`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;Tt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 MiniMax 请求(Anthropic 格式)`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,"x-api-key":this.apiKey,"anthropic-version":`2023-06-01`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();Tt.error({status:a.status,body:e.slice(0,500)},`MiniMax API 错误`),yield{type:`error`,error:B(a.status,e,`MiniMax`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*this.parseAnthropicSSE(o)}buildRequestBody(e,t,n){let{systemPrompt:r,convertedMessages:i}=this.convertMessages(e),a={model:n.model,messages:i,max_tokens:n.maxOutputTokens,stream:!0};return r&&(a.system=r),t.length>0&&(a.tools=t.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))),a}convertMessages(e){let t=``,n=[];for(let r of e)switch(r.role){case`system`:t+=(t?`
1
+ import{FormatRegistry as e,Kind as t,Type as n,Type as r}from"@sinclair/typebox";import i from"pino";import a from"pino-pretty";import o from"node:path";import s from"node:fs";import{Client as c}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as l}from"@modelcontextprotocol/sdk/client/stdio.js";import{SSEClientTransport as u}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as d}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{TypeCompiler as f}from"@sinclair/typebox/compiler";function p(e,t){return{data:e,message:t}}function m(e){return typeof e==`object`&&!!e}function h(e){return m(e)?`data`in e||`message`in e||`text`in e||`_summary`in e||`metadata`in e:!1}function g(e){return e?h(e)?e:{data:e}:{data:{}}}function _(e){let t={status:`ok`,data:e.data??{}},n=e.message??e.text;return n!==void 0&&(t.message=n),e._summary!==void 0&&(t._summary=e._summary),e.metadata!==void 0&&(t._meta=e.metadata),t}function v(e){return m(e)&&(e.type===`action`||e.type===`render`)?typeof e.name==`string`:!1}function y(e,t){let n=e.metadata;if(!n||!Object.prototype.hasOwnProperty.call(n,`ui`))return t;let r=n.ui;if(r!=null)return v(r)?r:t}function b(e,t){let n={auto:0,"destructive-only":1,manual:2};return e?t?n[e]>=n[t]?e:t:e:t}function x(e,t){let n={read:0,write:1,destructive:2};return e?t?n[e]>=n[t]?e:t:e:t}function S(e,t){let n={none:0,"local-app":1,"os-service":2,"remote-service":3};return e?t?n[e]>=n[t]?e:t:e:t}function C(e,t){return{approvalPolicy:b(e?.approvalPolicy,t?.approvalPolicy),sideEffectLevel:x(e?.sideEffectLevel,t?.sideEffectLevel),hostDependency:S(e?.hostDependency,t?.hostDependency),riskSummary:t?.riskSummary??e?.riskSummary,riskTags:t?.riskTags??e?.riskTags,riskSignals:t?.riskSignals??e?.riskSignals}}async function w(e,t){return C(e?{approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}:{},e?.assessInputGovernance?await e.assessInputGovernance(t):void 0)}var T=class extends Error{toolError;constructor(e){super(e.message),this.name=`ToolException`,this.toolError=e}};function E(e){return e instanceof T}function D(e){throw new T(typeof e==`string`?{message:e,code:`OPERATION_FAILED`}:e)}const O={type:`object`,description:`工具失败时的平台标准错误结构。成功结果使用工具自己的 resolvedOutputSchema。`,properties:{status:{type:`string`,enum:[`error`],description:`固定为 error,表示工具执行失败。`},failureReason:{type:`string`,description:`执行层失败原因,例如 parse_error、denied、timeout、execution_error。`},error:{type:`object`,description:`结构化错误信息。`,properties:{code:{type:`string`,description:`稳定错误码,例如 INVALID_PARAMS、NETWORK_ERROR、NOT_FOUND。`},message:{type:`string`,description:`给用户和模型看的错误说明。`},category:{type:`string`,enum:[`validation`,`permission`,`network`,`not_found`,`conflict`,`runtime`,`external`],description:`错误分类,用于判断是否换参数、重试、申请权限或停止。`},retryable:{type:`boolean`,description:`是否建议用相同目标稍后重试。`},suggestion:{type:`string`,description:`可选修复建议。`},details:{type:`object`,description:`可选调试详情,字段随错误码变化。`,additionalProperties:!0}},required:[`message`],additionalProperties:!1}},required:[`status`,`failureReason`,`error`],additionalProperties:!1};function k(e){return Object.prototype.hasOwnProperty.call(e,t)}function A(e){let t={};for(let n of[`description`,`default`,`title`,`format`,`pattern`,`minLength`,`maxLength`,`minimum`,`maximum`,`exclusiveMinimum`,`exclusiveMaximum`,`multipleOf`,`minItems`,`maxItems`,`uniqueItems`]){let r=e[n];r!==void 0&&(t[n]=r)}let n=e.additionalProperties;return typeof n==`boolean`?t.additionalProperties=n:n&&typeof n==`object`&&(t.additionalProperties=M(n)),t}function j(e,t){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`?r.Literal(e,t):e===null?r.Null(t):r.Any(t)}function ee(e,t){let n=A(t),i=e.map(e=>j(e,{}));return i.length===1?j(e[0],n):r.Union(i,n)}function M(e){if(k(e))return e;if(Object.prototype.hasOwnProperty.call(e,`const`))return j(e.const,A(e));let t=Array.isArray(e.enum)?e.enum:void 0;if(t&&t.length>0)return ee(t,e);let n=Array.isArray(e.oneOf)?e.oneOf:Array.isArray(e.anyOf)?e.anyOf:void 0;if(n&&n.length>0)return r.Union(n.map(e=>e&&typeof e==`object`?M(e):r.Any()),A(e));let i=e.type;if(Array.isArray(i))return r.Union(i.map(t=>M({...e,type:t,oneOf:void 0,anyOf:void 0})),A(e));let a=A(e);if(i===`string`)return r.String(a);if(i===`number`)return r.Number(a);if(i===`integer`)return r.Integer(a);if(i===`boolean`)return r.Boolean(a);if(i===`null`)return r.Null(a);if(i===`array`){let t=e.items,n=t&&typeof t==`object`?M(t):r.Any();return r.Array(n,a)}if(i===`object`||typeof e.properties==`object`){let t=e.properties,n=Array.isArray(e.required)?new Set(e.required.filter(e=>typeof e==`string`)):new Set,i=t&&typeof t==`object`?Object.entries(t):[],o={};for(let[e,t]of i){let i=t&&typeof t==`object`?M(t):r.Any();o[e]=n.has(e)?i:r.Optional(i)}return r.Object(o,a)}return r.Any(a)}function te(e){let t=e.description?e:{...e,description:`工具成功时的业务数据。`};return r.Object({status:r.Literal(`ok`,{description:`固定为 ok,表示工具执行成功。`}),data:M(t),message:r.Optional(r.String({description:`可选。给用户和模型看的简短说明,不承载业务数据。`}))},{description:`工具成功时的平台标准返回结构。业务字段固定放在 data 内。`})}function ne(e){return{tools:[e]}}function re(e){return{tools:e}}async function ie(e){let t=[];for(let n of e){let e=await n;`tools`in e&&Array.isArray(e.tools)?t.push(...e.tools):`name`in e&&`execute`in e&&t.push(e)}return t}function ae(e){return{type:`agent_status`,data:{phase:e}}}const oe=[`thinking_start`,`thinking_delta`,`thinking_end`,`tool_call_start`,`tool_call_result`,`tool_call_output`,`tool_approval_request`,`tool_call_request`,`text_start`,`text_delta`,`text_end`,`done`,`error`,`abort`,`data`,`step_start`,`step_end`,`assistant_segment_start`,`compact_start`,`compact_end`,`content_compress_start`,`content_compress_end`,`agent_status`];function se(e){return{type:`thinking_start`,data:{blockId:e,startedAt:Date.now()}}}function ce(e,t){return{type:`thinking_delta`,data:{blockId:e,content:t}}}function le(e,t){let n=Date.now();return{type:`thinking_end`,data:{blockId:e,endedAt:n,duration:n-t}}}function ue(e,t,n,r,i){return{type:`tool_call_start`,data:{id:e,name:t,args:n,...r?{ui:r}:{},...i?.approvalPolicy?{approvalPolicy:i.approvalPolicy}:{},...i?.sideEffectLevel?{sideEffectLevel:i.sideEffectLevel}:{},...i?.hostDependency?{hostDependency:i.hostDependency}:{},...i?.riskSummary?{riskSummary:i.riskSummary}:{},...i?.riskTags?.length?{riskTags:i.riskTags}:{},...i?.riskSignals?.length?{riskSignals:i.riskSignals}:{},startedAt:Date.now()}}}function N(e,t,n,r,i,a,o,s,c){let l=Date.now();return{type:`tool_call_result`,data:{id:e,name:t,result:n,success:r,failureReason:s,error:a,endedAt:l,duration:l-i,ui:o,...c?.approvalPolicy?{approvalPolicy:c.approvalPolicy}:{},...c?.sideEffectLevel?{sideEffectLevel:c.sideEffectLevel}:{},...c?.hostDependency?{hostDependency:c.hostDependency}:{},...c?.riskSummary?{riskSummary:c.riskSummary}:{},...c?.riskTags?.length?{riskTags:c.riskTags}:{},...c?.riskSignals?.length?{riskSignals:c.riskSignals}:{}}}}function de(e,t,n,r){return{type:`tool_call_output`,data:{id:e,name:t,stream:n,chunk:r,at:Date.now()}}}function fe(e,t,n,r,i){return{type:`tool_call_request`,data:{id:e,name:t,args:n,...r?{ui:r}:{},...i?.approvalPolicy?{approvalPolicy:i.approvalPolicy}:{},...i?.sideEffectLevel?{sideEffectLevel:i.sideEffectLevel}:{},...i?.hostDependency?{hostDependency:i.hostDependency}:{},...i?.riskSummary?{riskSummary:i.riskSummary}:{},...i?.riskTags?.length?{riskTags:i.riskTags}:{},...i?.riskSignals?.length?{riskSignals:i.riskSignals}:{},requestedAt:Date.now()}}}function pe(e){return{type:`text_start`,data:{blockId:e}}}function me(e,t){return{type:`text_delta`,data:{blockId:e,content:t}}}function he(e){return{type:`text_end`,data:{blockId:e}}}function ge(e,t,n,r){return{type:`done`,data:{text:e,finishReason:t,usage:n,duration:r}}}function P(e){return{type:`error`,data:e}}function F(e,t={}){return P({category:`api`,message:e,...t})}function _e(e,t,n){return P({category:`rate_limit`,message:e,code:`RATE_LIMIT`,statusCode:429,retryable:!0,retryAfter:t,context:n})}function ve(e,t,n){return P({category:`tool`,message:e,code:`TOOL_ERROR`,context:t,cause:n,retryable:!1})}function ye(e,t){return P({category:`timeout`,message:e,code:`TIMEOUT`,retryable:!0,context:t})}function be(e,t){return P({category:`parse`,message:e,code:`PARSE_ERROR`,cause:t,retryable:!1})}function xe(e){return{type:`abort`,data:{reason:e,abortedAt:Date.now()}}}function Se(e,t){return{type:`step_start`,data:{stepNumber:e,description:t,startedAt:Date.now()}}}function I(e,t){let n=Date.now();return{type:`step_end`,data:{stepNumber:e,endedAt:n,duration:n-t}}}function L(e,t){return{type:`assistant_segment_start`,data:{reason:e,...typeof t==`number`?{stepNumber:t}:{},startedAt:Date.now()}}}function Ce(e,t){return{type:`compact_start`,data:{estimatedTokens:e,budget:t,startedAt:Date.now()}}}function we(e,t,n,r,i,a,o,s){let c=Date.now();return{type:`compact_end`,data:{success:e,...o?{summaryContent:o}:{},...s?{model:s}:{},tokensBeforeCompact:t,compressedTokens:n,originalMessageCount:r,compressedMessageCount:i,endedAt:c,duration:c-a}}}function Te(e,t){return{type:`content_compress_start`,data:{originalTokens:e,budget:t,startedAt:Date.now()}}}function Ee(e,t,n,r,i,a){return{type:`content_compress_end`,data:{success:e,...i?{summary:i}:{},...a?{model:a}:{},originalTokens:t,compressedTokens:n,duration:Date.now()-r}}}function De(e){return e.type.startsWith(`thinking_`)}function Oe(e){return e.type.startsWith(`tool_`)}function ke(e){return e.type===`text_start`||e.type===`text_delta`||e.type===`text_end`}function Ae(e){return e.type===`done`||e.type===`error`||e.type===`abort`}function je(e){return e.type===`error`}function Me(e){return e.type===`abort`}function Ne(e){return e.type.startsWith(`step_`)}function Pe(e){return e.type===`assistant_segment_start`}function Fe(e){return e.type===`error`?e.data.retryable===!0:!1}function Ie(e,t){let n=t??e.defaultModel;if(!n)throw Error(`未指定 model,且 LLMConfig.defaultModel 未配置`);return n}function Le(e){let t=e.path??``;return t?`${e.baseUrl.replace(/\/$/,``)}${t}`:e.baseUrl}function Re(e,t){return e.models[t]?.endpoint}function ze(e,t){for(let n of Object.values(e.models)){let e=n?.endpoint;if(e?.protocol===t)return e}}const Be=[`ark_v1`,`deepseek_v1`,`qwen_v1`,`qwen_text_v1`,`glm_v1`,`moonshot_v1`,`minimax_v1`,`vercel_gateway_v1`,`anthropic_v1`,`gemini_v1`,`openai_v1`,`openai_chat_v1`,`grok_v1`];let Ve=null;function He(){return process.env.NODE_ENV===`development`}function Ue(){let e=process.env.LOG_LEVEL?.toLowerCase();return e&&[`debug`,`info`,`warn`,`error`].includes(e)?e:He()?`debug`:`info`}function We(){let e=Ue();if(He()){let t=a({colorize:!0,translateTime:`SYS:standard`});return i({level:e},t)}return i({level:e},i.destination(1))}function Ge(e){let t=e.level??(e.isDev?`debug`:`info`),n=[];if(e.isDev?n.push({stream:a({colorize:!0,translateTime:`SYS:standard`}),level:t}):n.push({stream:i.destination(1),level:t}),e.baseDir){let r=o.join(e.baseDir,`logs`);try{s.mkdirSync(r,{recursive:!0})}catch{}let a=o.join(r,`ai-chat.log`);n.push({stream:i.destination(a),level:t})}return i({level:t},i.multistream(n))}function Ke(e){Ve=Ge(e)}function qe(){return Ve??We()}function R(e){return qe().child({module:e})}const Je={400:`请求参数错误`,401:`API 认证失败,请检查 API Key 配置`,402:`账户余额不足,请充值后重试`,403:`没有权限访问此模型`,404:`请求的模型或接口不存在`,429:`请求过于频繁,请稍后重试`,500:`API 服务器内部错误,请稍后重试`,502:`API 网关错误,请稍后重试`,503:`API 服务暂时不可用,请稍后重试`,504:`API 请求超时,请稍后重试`};function z(e,t,n){let r=Ye(t)?.message,i=Je[e];if(r){let t=r.length>300?r.slice(0,300)+`...`:r;return`${i??`${n} 错误 (${e})`}(${t})`}return i??`${n} 错误 (${e})`}function Ye(e){try{let t=JSON.parse(e);if(t?.error?.message)return{message:t.error.message,type:t.error.type};if(typeof t?.error==`string`)return{message:t.error,type:t.code};if(typeof t?.error_msg==`string`)return{message:t.error_msg};if(typeof t?.message==`string`)return{message:t.message}}catch{}return null}const Xe=R(`SSEReader`);async function*B(e){let t=new TextDecoder,n=``;for(;;){let{done:r,value:i}=await e.read();if(r)break;n+=t.decode(i,{stream:!0});let a=n.split(`
2
+ `);n=a.pop()||``;for(let e of a){if(!e.startsWith(`data:`))continue;let t=e.slice(5).trim();if(!(!t||t===`[DONE]`))try{yield JSON.parse(t)}catch(t){Xe.warn({line:e.slice(0,100),error:String(t)},`SSE JSON 解析失败`)}}}}const Ze=R(`ArkProtocol`);var Qe=class{name=`ark`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n);Ze.debug({url:this.apiUrl,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 ARK 请求`);let i=await fetch(this.apiUrl,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!i.ok){let e=await i.text();Ze.error({status:i.status,body:e.slice(0,500)},`ARK API 错误`),yield{type:`error`,error:z(i.status,e,`ARK`)};return}let a=i.body?.getReader();if(!a){yield{type:`error`,error:`无法获取响应流`};return}yield*this.parseSSE(a)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,stream:!0,max_output_tokens:n.maxOutputTokens,input:r},a=[];for(let e of t)a.push({type:`function`,name:e.name,description:e.description,parameters:e.parameters});return a.length>0&&(i.tools=a),n.enableThinking&&(i.thinking={type:`enabled`}),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`input_text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images)e.push({type:`input_image`,image_url:t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`});t.push({role:`user`,content:e});break}case`assistant`:if(n.toolCalls?.length){n.content&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:n.content}]});for(let e of n.toolCalls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments})}else t.push({role:`developer`,content:`[上一轮AI回复]: ${n.content}`});break;case`tool`:t.push({type:`function_call_output`,call_id:n.toolCallId,output:n.content});break}return t}async*parseSSE(e){let t=new Map,n=null,r=!1,i=!1,a;for await(let o of B(e)){let e=o.response?.usage??o.usage;if(e){let t=e,n=t.input_tokens??t.prompt_tokens??0,r=t.output_tokens??t.completion_tokens??0,i=t.output_tokens_details,o=t.input_tokens_details;a={promptTokens:n,completionTokens:r,totalTokens:n+r,reasoningTokens:i?.reasoning_tokens??0,cachedTokens:o?.cached_tokens??0}}switch(o.type){case`response.output_item.added`:{let e=o.item;e?.type===`function_call`&&e.call_id&&(e.name||Ze.warn({id:e.call_id},`function_call added 缺少 name`),n=e.call_id,t.set(n,{id:n,name:e.name||``,arguments:e.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:n,name:e.name||``}});break}case`response.function_call_arguments.delta`:if(n){let e=t.get(n);e&&(e.arguments+=o.delta||``,yield{type:`tool_call_delta`,toolCall:{id:n,arguments:o.delta||``}})}break;case`response.function_call_arguments.done`:case`response.output_item.done`:{let e=o.item;if(e?.type===`function_call`&&e.call_id){let n=e.call_id,r=t.get(n);t.set(n,{id:n,name:e.name||r?.name||``,arguments:e.arguments||r?.arguments||`{}`})}break}case`response.output_text.delta`:o.delta&&(i||(i=!0,r||(r=!0,yield{type:`thinking_done`})),yield{type:`text_delta`,delta:o.delta});break;case`response.reasoning_summary_text.delta`:o.delta&&!r&&(yield{type:`thinking_delta`,delta:o.delta});break}}if(t.size>0){for(let e of t.values())yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:`stop`,usage:a}}};function $e(e){return new Qe(e)}R(`OpenAISSE`);function et(e){let t=e.completion_tokens_details,n=e.prompt_tokens_details;return{promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:t?.reasoning_tokens??0,cachedTokens:n?.cached_tokens??e.prompt_cache_hit_tokens??0}}function tt(e,t){return e?e===`tool_calls`||e===`length`||e===`error`?e:t?.includes(e)?`error`:`stop`:`stop`}async function*nt(e,t){let n=new Map,r=!1,i=!1,a,o,s=t?.parseUsage??et,c=t?.thinkingField;for await(let t of e){t.usage&&(a=s(t.usage));let e=t.choices?.[0];if(!e)continue;let l=e.delta;if(!l)continue;if(c&&!i){let e=c(l);e&&(yield{type:`thinking_delta`,delta:e})}let u=l.content;u&&(!r&&!i&&c&&(i=!0,yield{type:`thinking_done`}),r=!0,yield{type:`text_delta`,delta:u});let d=l.tool_calls;if(d?.length)for(let e of d){let t=e.index??0,r=e.function,i=n.get(t);if(i)r?.arguments&&(i.arguments+=r.arguments);else{let i=e.id||`call_${t}`,a=r?.name||``;n.set(t,{id:i,name:a,arguments:r?.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}}}}let f=e.finish_reason;f&&(o=f)}let l=Array.from(n.values());if(l.length>0){for(let e of l)yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else{let e=tt(o,t?.errorFinishReasons);e===`error`&&(yield{type:`error`,error:`${t?.protocolName??`LLM`} 推理异常 (finish_reason: ${o})`}),yield{type:`done`,finishReason:e,usage:a}}}const rt=R(`DeepSeekProtocol`),it={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`content_filter`,`insufficient_system_resource`],protocolName:`DeepSeek`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:e.completion_tokens_details?.reasoning_tokens??0,cachedTokens:e.prompt_cache_hit_tokens??0})};var at=class{name=`deepseek`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;rt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 DeepSeek 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();rt.error({status:a.status,body:e.slice(0,500)},`DeepSeek API 错误`),yield{type:`error`,error:z(a.status,e,`DeepSeek`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*nt(B(o),it)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0},max_tokens:n.maxOutputTokens};return n.enableThinking&&(i.thinking={type:`enabled`}),t.length>0&&(i.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function ot(e){return new at(e)}const st=R(`QwenProtocol`);function ct(e){if(typeof e==`string`)return e;if(Array.isArray(e)){for(let t of e)if(typeof t==`object`&&t&&`text`in t)return t.text||``}return``}function lt(e,t){return e?t?e===t?``:e.startsWith(t)?e.slice(t.length):e:e:``}var ut=class{name;apiKey;apiUrl;headers;endpoint;constructor(e,t=`multimodal`){this.name=t===`text`?`qwen-text`:`qwen`,this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{},this.endpoint=t}async*stream(e,t,n){let r=this.endpoint===`multimodal`,i=this.apiUrl,a=dt(e,t,n,r);st.debug({url:i,model:n.model,endpoint:r?`multimodal-generation`:`text-generation`,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Qwen 请求(DashScope 原生)`);let o=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`,"X-DashScope-SSE":`enable`},body:JSON.stringify(a),signal:n.signal});if(!o.ok){let e=await o.text();st.error({status:o.status,body:e.slice(0,500)},`Qwen API 错误`),yield{type:`error`,error:z(o.status,e,`Qwen`)};return}let s=o.body?.getReader();if(!s){yield{type:`error`,error:`无法获取响应流`};return}yield*pt(s,r)}};function dt(e,t,n,r){let i=ft(e,r),a={result_format:`message`,incremental_output:!0};return n.enableThinking&&(a.enable_thinking=!0,a.thinking_budget=38400),t.length>0&&(a.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),{model:n.model,input:{messages:i},parameters:a}}function ft(e,t){let n=[];for(let r of e)switch(r.role){case`system`:n.push({role:`system`,content:t?[{text:r.content}]:r.content});break;case`user`:{let e=r.content||(r.images?.length?`请分析这张图片`:``);if(t){let t=[{text:e}];if(r.images?.length)for(let e of r.images)t.push({image:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`});n.push({role:`user`,content:t})}else n.push({role:`user`,content:e});break}case`assistant`:r.toolCalls?.length?n.push({role:`assistant`,content:t?r.content?[{text:r.content}]:[]:r.content||null,...r.thinkingContent?{reasoning_content:r.thinkingContent}:{},tool_calls:r.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):n.push({role:`assistant`,content:t?r.content?[{text:r.content}]:[]:r.content});break;case`tool`:n.push({role:`tool`,tool_call_id:r.toolCallId,content:r.content});break}return n}async function*pt(e,t){let n=new Map,r=!1,i=!1,a,o=``,s=``;for await(let c of B(e)){if(c.code){yield{type:`error`,error:`${c.code}: ${c.message}`};return}if(c.usage){let e=c.usage;a={promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0,reasoningTokens:e.output_tokens_details?.reasoning_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0}}let e=c.output?.choices?.[0];if(!e)continue;let l=e.message;if(!l)continue;let u=typeof l.reasoning_content==`string`?l.reasoning_content:``;if(u&&!i){let e=lt(u,o);o=u,e&&(yield{type:`thinking_delta`,delta:e})}let d=t?ct(l.content):l.content||``,f=lt(d,s);f?(s=d,!r&&!i&&(i=!0,yield{type:`thinking_done`}),r=!0,yield{type:`text_delta`,delta:f}):d&&(s=d);let p=l.tool_calls;if(p?.length)for(let e of p){let t=e.index??0,r=e.function,i=n.get(t);if(i)r?.arguments&&(i.arguments+=r.arguments);else{e.id||st.warn({index:t},`SSE tool_call 首块缺少 id`),r?.name||st.warn({index:t,id:e.id},`SSE tool_call 首块缺少 name`);let i=e.id||`call_${t}`,a=r?.name||``;n.set(t,{id:i,name:a,arguments:r?.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}}}}let m=e.finish_reason;if(m&&m!==`null`){let e=Array.from(n.values());if(e.length>0){for(let t of e)yield{type:`tool_call_done`,toolCall:t};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:m===`tool_calls`||m===`length`||m===`error`?m:`stop`,usage:a};return}}let c=Array.from(n.values());if(c.length>0){for(let e of c)yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:a}}else yield{type:`done`,finishReason:`stop`,usage:a}}function mt(e){return new ut(e)}function ht(e){return new ut(e,`text`)}const gt=R(`GlmProtocol`),_t={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`sensitive`,`network_error`],protocolName:`GLM`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0})};var vt=class{name=`glm`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;gt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 GLM 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();gt.error({status:a.status,body:e.slice(0,500)},`GLM API 错误`),yield{type:`error`,error:z(a.status,e,`GLM`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}let s=!1,c=!1,l=!1;for await(let e of nt(B(o),_t))e.type===`thinking_delta`&&(s=!0),e.type===`text_delta`&&(c=!0),(e.type===`tool_call_start`||e.type===`tool_call_done`)&&(l=!0),yield e;let u={model:n.model,toolsCount:t.length,hadThinkingDelta:s,hadTextDelta:c,hadToolCall:l};!s&&!c&&!l?gt.debug(u,`GLM 流结束:未产出思考/正文/工具调用(常见于工具或上下文过大)`):gt.debug(u,`GLM 流结束`)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i=n.maxOutputTokens,a={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0},max_tokens:i};return n.enableThinking?(a.thinking={type:`enabled`},a.temperature=1):a.thinking={type:`disabled`},t.length>0&&(a.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),a}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function yt(e){return new vt(e)}const bt=R(`MoonshotProtocol`),xt={thinkingField:e=>e.reasoning_content,errorFinishReasons:[`content_filter`],protocolName:`Moonshot`,parseUsage:e=>({promptTokens:e.prompt_tokens??0,completionTokens:e.completion_tokens??0,totalTokens:e.total_tokens??0,cachedTokens:e.prompt_tokens_details?.cached_tokens??0})};var St=class{name=`moonshot`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;bt.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Moonshot 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();bt.error({status:a.status,body:e.slice(0,500)},`Moonshot API 错误`),yield{type:`error`,error:z(a.status,e,`Moonshot`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*nt(B(o),xt)}buildRequestBody(e,t,n){let r=this.convertMessages(e),i={model:n.model,messages:r,stream:!0,stream_options:{include_usage:!0}};return n.enableThinking&&(i.reasoning={enabled:!0},i.temperature=1),t.length>0&&(i.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),i}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,...n.thinkingContent?{reasoning_content:n.thinkingContent}:{},tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function Ct(e){return new St(e)}function wt(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function Tt(e,t){let n=e?.trim()?e:`{}`,r;try{r=JSON.parse(n)}catch(e){throw Error(`[${t.protocol}] tool call arguments must be valid JSON: ${t.toolName}(${t.toolCallId}): ${String(e)}`)}if(!wt(r))throw Error(`[${t.protocol}] tool call arguments must be a JSON object: ${t.toolName}(${t.toolCallId})`);return r}const Et=R(`MiniMaxProtocol`);var Dt=class{name=`minimax`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;Et.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 MiniMax 请求(Anthropic 格式)`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,"x-api-key":this.apiKey,"anthropic-version":`2023-06-01`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();Et.error({status:a.status,body:e.slice(0,500)},`MiniMax API 错误`),yield{type:`error`,error:z(a.status,e,`MiniMax`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*this.parseAnthropicSSE(o)}buildRequestBody(e,t,n){let{systemPrompt:r,convertedMessages:i}=this.convertMessages(e),a={model:n.model,messages:i,max_tokens:n.maxOutputTokens,stream:!0};return r&&(a.system=r),t.length>0&&(a.tools=t.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))),a}convertMessages(e){let t=``,n=[];for(let r of e)switch(r.role){case`system`:t+=(t?`
3
3
 
4
- `:``)+r.content;break;case`user`:n.push({role:`user`,content:[{type:`text`,text:r.content||``}]});break;case`assistant`:if(r.toolCalls?.length){let e=[];r.content&&e.push({type:`text`,text:r.content});for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:wt(t.arguments,{protocol:this.name,toolCallId:t.id,toolName:t.name})});n.push({role:`assistant`,content:e})}else n.push({role:`assistant`,content:[{type:`text`,text:r.content||``}]});break;case`tool`:n.push({role:`user`,content:[{type:`tool_result`,tool_use_id:r.toolCallId,content:r.content}]});break}return{systemPrompt:t,convertedMessages:n}}async*parseAnthropicSSE(e){let t=!1,n=!1,r=new Map,i=0,a=0;for await(let o of V(e))switch(o.type){case`message_start`:{let e=o.message?.usage;e?.input_tokens&&(i=e.input_tokens);break}case`content_block_start`:{let e=o.content_block;if(e?.type===`tool_use`){e.id||Tt.warn({index:o.index},`content_block_start tool_use 缺少 id`),e.name||Tt.warn({index:o.index,id:e.id},`content_block_start tool_use 缺少 name`);let t=o.index??r.size,n=e.id||`call_${t}`,i=e.name||``;r.set(t,{id:n,name:i,arguments:``,jsonBuffer:``}),yield{type:`tool_call_start`,toolCall:{id:n,name:i}}}break}case`content_block_delta`:{let e=o.delta;if(!e)break;if(e.type===`thinking_delta`&&e.thinking)n||(t=!0,yield{type:`thinking_delta`,delta:e.thinking});else if(e.type===`text_delta`&&e.text)t&&!n&&(n=!0,yield{type:`thinking_done`}),yield{type:`text_delta`,delta:e.text};else if(e.type===`input_json_delta`&&e.partial_json!==void 0){let t=o.index,n=r.get(t);n&&(n.jsonBuffer+=e.partial_json)}break}case`content_block_stop`:{let e=o.index,t=r.get(e);t&&(t.arguments=t.jsonBuffer,yield{type:`tool_call_done`,toolCall:{id:t.id,name:t.name,arguments:t.arguments}});break}case`message_delta`:{let e=o.usage;e?.output_tokens&&(a=e.output_tokens);break}case`message_stop`:{let e=r.size>0,o={promptTokens:i,completionTokens:a,totalTokens:i+a};t&&!n&&(n=!0,yield{type:`thinking_done`}),yield{type:`done`,finishReason:e?`tool_calls`:`stop`,usage:o};return}}t&&!n&&(yield{type:`thinking_done`}),yield{type:`done`,finishReason:r.size>0?`tool_calls`:`stop`,usage:{promptTokens:i,completionTokens:a,totalTokens:i+a}}}};function Dt(e){return new Et(e)}const Ot=z(`VercelGateway`);function kt(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images){let n=t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`;e.push({type:`file`,data:n,mediaType:`image/jpeg`})}t.push({role:`user`,content:e});break}case`assistant`:{let e=[];if(n.thinkingContent){let t={type:`reasoning`,text:n.thinkingContent};n.toolCalls?.[0]?.thoughtSignature&&(t.providerOptions={google:{thoughtSignature:n.toolCalls[0].thoughtSignature},vertex:{thoughtSignature:n.toolCalls[0].thoughtSignature}}),e.push(t)}if(n.toolCalls?.length){n.content&&e.push({type:`text`,text:n.content});for(let t of n.toolCalls){let n={type:`tool-call`,toolCallId:t.id,toolName:t.name,input:wt(t.arguments,{protocol:`vercel-gateway`,toolCallId:t.id,toolName:t.name})};t.thoughtSignature&&(n.providerOptions={google:{thoughtSignature:t.thoughtSignature},vertex:{thoughtSignature:t.thoughtSignature}}),e.push(n)}}else e.push({type:`text`,text:n.content||``});t.push({role:`assistant`,content:e});break}case`tool`:t.push({role:`tool`,content:[{type:`tool-result`,toolCallId:n.toolCallId||``,toolName:n.toolName||`unknown`,output:At(n.content)}]});break}return t}function At(e){try{return{type:`json`,value:JSON.parse(e)}}catch{return{type:`text`,value:e}}}function jt(e){if(e.length!==0)return e.map(e=>({type:`function`,name:e.name,description:e.description,inputSchema:e.parameters}))}function Mt(e,t){if(e.startsWith(`google/`))return t?{google:{thinkingConfig:{thinkingLevel:`high`,includeThoughts:!0}}}:void 0;if(e.startsWith(`openai/`))return{openai:{reasoningEffort:t?`high`:`low`,reasoningSummary:t?`detailed`:`auto`}};if(e.startsWith(`anthropic/`))return t?{anthropic:{thinking:{type:`enabled`,budgetTokens:1e4}}}:void 0}function Nt(e,t,n){let r={prompt:kt(e)};r.maxOutputTokens=n.maxOutputTokens;let i=Mt(n.model,n.enableThinking);i&&(r.providerOptions=i);let a=jt(t);return a&&(r.tools=a),r}async function*Pt(e){let t=!1,n=new Map;for await(let r of V(e))switch(r.type){case`reasoning-delta`:{let e=r.delta;e&&(yield{type:`thinking_delta`,delta:e});break}case`reasoning-end`:yield{type:`thinking_done`};break;case`text-delta`:{let e=r.delta;e&&(yield{type:`text_delta`,delta:e});break}case`tool-input-start`:{t=!0;let e=r.id,i=r.toolName,a=Ft(r);n.set(e,{name:i,args:``,thoughtSignature:a}),yield{type:`tool_call_start`,toolCall:{id:e,name:i}};break}case`tool-input-delta`:{let e=r.id,t=r.delta;if(e&&t){let r=n.get(e);r&&(r.args+=t),yield{type:`tool_call_delta`,toolCall:{id:e,arguments:t}}}break}case`tool-call`:{let e=r.toolCallId,t=r.toolName,i=r.input??`{}`,a=n.get(e),o=Ft(r)||a?.thoughtSignature;yield{type:`tool_call_done`,toolCall:{id:e,name:t||a?.name||``,arguments:i||a?.args||`{}`,...o?{thoughtSignature:o}:{}}},n.delete(e);break}case`finish`:{let e=r.usage,n;if(e){let t=e.inputTokens,r=e.outputTokens;n={promptTokens:t?.total??0,completionTokens:r?.total??0,totalTokens:(t?.total??0)+(r?.total??0),reasoningTokens:r?.reasoning??0,cachedTokens:t?.cacheRead??0}}let i=r.finishReason?.unified??`stop`;yield{type:`done`,finishReason:t||i===`tool-calls`?`tool_calls`:i===`length`?`length`:i===`error`?`error`:`stop`,usage:n};return}case`error`:{let e=r.error;yield{type:`error`,error:typeof e==`string`?e:JSON.stringify(e)};break}}yield{type:`done`,finishReason:t?`tool_calls`:`stop`}}function Ft(e){let t=e.providerMetadata,n=t?.vertex?.thoughtSignature??t?.google?.thoughtSignature;return typeof n==`string`?n:void 0}var It=class{name=`vercel_gateway`;apiKey;constructor(e){this.apiKey=e.apiKey}async*stream(e,t,n){let r=Nt(e,t,n);Ot.debug({model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Vercel Gateway V3 请求`);let i=await fetch(`https://ai-gateway.vercel.sh/v3/ai/language-model`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.apiKey}`,"ai-gateway-protocol-version":`0.0.1`,"ai-gateway-auth-method":`api-key`,"ai-language-model-specification-version":`3`,"ai-language-model-id":n.model,"ai-language-model-streaming":`true`},body:JSON.stringify(r),signal:n.signal});if(!i.ok){let e=await i.text();Ot.error({status:i.status,body:e.slice(0,500)},`Vercel Gateway 错误`),yield{type:`error`,error:B(i.status,e,`Vercel Gateway`)};return}let a=i.body?.getReader();if(!a){yield{type:`error`,error:`无法获取响应流`};return}yield*Pt(a)}};function Lt(e){return new It(e)}const Rt=z(`AnthropicProtocol`);var zt=class{name=`anthropic`;apiKey;apiUrl;headers;isDirect;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{},this.isDirect=this.apiUrl.includes(`api.anthropic.com`)}async*stream(e,t,n){let{systemPrompt:r,convertedMessages:i}=Vt(e),a=Bt(r,i,t,n),o=this.apiUrl;Rt.debug({url:o,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Anthropic 请求`);let s={...this.headers,"Content-Type":`application/json`,"anthropic-version":`2023-06-01`};this.isDirect?s[`x-api-key`]=this.apiKey:s.Authorization=`Bearer ${this.apiKey}`;let c=await fetch(o,{method:`POST`,headers:s,body:JSON.stringify(a),signal:n.signal});if(!c.ok){let e=await c.text();Rt.error({status:c.status,body:e.slice(0,500)},`Anthropic API 错误`),yield{type:`error`,error:B(c.status,e,`Anthropic`)};return}let l=c.body?.getReader();if(!l){yield{type:`error`,error:`无法获取响应流`};return}yield*Ht(l)}};function Bt(e,t,n,r){let i=r.maxOutputTokens,a={model:r.model,messages:t,max_tokens:i,stream:!0};return e&&(a.system=e),r.enableThinking&&(r.model.includes(`opus-4-6`)||r.model.includes(`opus-4.6`)?a.thinking={type:`adaptive`}:a.thinking={type:`enabled`,budget_tokens:Math.min(1e4,i-1)}),n.length>0&&(a.tools=n.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))),a}function Vt(e){let t,n=[];for(let r of e)switch(r.role){case`system`:t=r.content;break;case`user`:{let e=r.content||(r.images?.length?`请分析这张图片`:``);if(r.images?.length){let t=[{type:`text`,text:e}];for(let e of r.images){let n=e.startsWith(`data:`)?e.replace(/^data:image\/\w+;base64,/,``):e;t.push({type:`image`,source:{type:`base64`,media_type:`image/jpeg`,data:n}})}n.push({role:`user`,content:t})}else n.push({role:`user`,content:e});break}case`assistant`:if(r.toolCalls?.length){let e=[];r.thinkingContent&&e.push({type:`thinking`,thinking:r.thinkingContent,signature:r.thinkingSignature||``}),r.content&&e.push({type:`text`,text:r.content});for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:wt(t.arguments,{protocol:`anthropic`,toolCallId:t.id,toolName:t.name})});n.push({role:`assistant`,content:e})}else r.content&&n.push({role:`assistant`,content:r.content});break;case`tool`:n.push({role:`user`,content:[{type:`tool_result`,tool_use_id:r.toolCallId,content:r.content}]});break}return{systemPrompt:t,convertedMessages:n}}async function*Ht(e){let t=``,n=new Map,r=``,i=!1,a=``,o;for await(let s of V(e))switch(s.type){case`message_start`:{let e=s.message?.usage;e&&(o={promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:(e.input_tokens??0)+(e.output_tokens??0),cachedTokens:(e.cache_read_input_tokens??0)+(e.cache_creation_input_tokens??0)});break}case`content_block_start`:{let e=s.content_block;if(!e)break;switch(e.type){case`thinking`:t=`thinking`;break;case`text`:t=`text`;break;case`tool_use`:{t=`tool_use`;let i=e.id,a=e.name;r=i,n.set(i,{id:i,name:a,arguments:``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}};break}}break}case`content_block_delta`:{let e=s.delta;if(!e)break;switch(e.type){case`thinking_delta`:e.thinking&&(i=!0,yield{type:`thinking_delta`,delta:e.thinking});break;case`signature_delta`:e.signature&&(a=e.signature);break;case`text_delta`:e.text&&(yield{type:`text_delta`,delta:e.text});break;case`input_json_delta`:if(r&&e.partial_json){let t=n.get(r);t&&(t.arguments+=e.partial_json,yield{type:`tool_call_delta`,toolCall:{id:r,arguments:e.partial_json}})}break}break}case`content_block_stop`:if(t===`thinking`&&i)yield{type:`thinking_done`,thinkingSignature:a};else if(t===`tool_use`&&r){let e=n.get(r);e&&(yield{type:`tool_call_done`,toolCall:e}),r=``}t=``;break;case`message_delta`:{let e=s.delta,t=s.usage;if(t){let e=o?.promptTokens??0,n=t.output_tokens??o?.completionTokens??0,r=(t.cache_read_input_tokens??0)+(t.cache_creation_input_tokens??0);o={promptTokens:e,completionTokens:n,totalTokens:e+n,cachedTokens:r||o?.cachedTokens}}let n=e?.stop_reason;if(n){yield{type:`done`,finishReason:n===`tool_use`?`tool_calls`:n===`max_tokens`?`length`:`stop`,usage:o};return}break}case`message_stop`:yield{type:`done`,finishReason:n.size>0?`tool_calls`:`stop`,usage:o};return;case`error`:{let e=s.error?.message||JSON.stringify(s);Rt.error({error:e},`Anthropic SSE error`),yield{type:`error`,error:e};return}}yield{type:`done`,finishReason:n.size>0?`tool_calls`:`stop`,usage:o}}function Ut(e){return new zt(e)}const Wt=z(`GeminiProtocol`);function Gt(e,t,n){let r=e.replace(/\{model\}/g,t);!r.includes(`:streamGenerateContent`)&&!r.includes(`:generateContent`)?r=`${r.replace(/\/$/,``)}/models/${t}:streamGenerateContent`:r.includes(`:generateContent`)&&!r.includes(`:streamGenerateContent`)&&(r=r.replace(`:generateContent`,`:streamGenerateContent`));let i=r.includes(`googleapis.com`),a=r.includes(`?`)?`&`:`?`;return i?`${r}${a}key=${n}&alt=sse`:`${r}${a}alt=sse`}var Kt=class{name=`gemini`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=qt(e,t,n),i=this.apiUrl.includes(`googleapis.com`),a=Gt(this.apiUrl,n.model,this.apiKey);Wt.debug({url:a.replace(this.apiKey,`***`),model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Gemini 请求`);let o={...this.headers,"Content-Type":`application/json`};i||(o.Authorization=`Bearer ${this.apiKey}`);let s=await fetch(a,{method:`POST`,headers:o,body:JSON.stringify(r),signal:n.signal});if(!s.ok){let e=await s.text();Wt.error({status:s.status,body:e.slice(0,500)},`Gemini API 错误`),yield{type:`error`,error:B(s.status,e,`Gemini`)};return}let c=s.body?.getReader();if(!c){yield{type:`error`,error:`无法获取响应流`};return}yield*Xt(c)}};function qt(e,t,n){let{systemInstruction:r,contents:i}=Yt(e),a={contents:i,generationConfig:{maxOutputTokens:n.maxOutputTokens}};if(r&&(a.systemInstruction=r),n.enableThinking&&(a.generationConfig.thinkingConfig={thinkingBudget:24576,includeThoughts:!0}),t.length>0){let e=new Map;for(let n of t)e.has(n.name)||e.set(n.name,{name:n.name,description:n.description,parametersJsonSchema:Jt(n.parameters)});a.tools=[{functionDeclarations:Array.from(e.values())}]}return a}function Jt(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(Jt);let t=e,n={};for(let[e,r]of Object.entries(t))e===`$ref`||e===`$defs`||(n[e]=Jt(r));return n}function Yt(e){let t,n=[];for(let r of e)switch(r.role){case`system`:t={parts:[{text:r.content}]};break;case`user`:{let e=!!(r.images?.length||r.attachments?.length),t=[{text:r.content||(e?`请分析这个媒体文件`:``)}];if(r.images?.length)for(let e of r.images)if(e.startsWith(`data:`)){let n=e.match(/^data:([^;]+);base64,(.+)$/);n&&t.push({inlineData:{mimeType:n[1],data:n[2]}})}else t.push({inlineData:{mimeType:`image/jpeg`,data:e}});if(r.attachments?.length)for(let e of r.attachments)t.push({fileData:{mimeType:e.mimeType,fileUri:e.fileUri}});n.push({role:`user`,parts:t});break}case`assistant`:if(r.toolCalls?.length){let e=[];for(let t of r.toolCalls){let n={functionCall:{name:t.name,args:wt(t.arguments,{protocol:`gemini`,toolCallId:t.id,toolName:t.name})}};n.thoughtSignature=t.thoughtSignature??`skip_thought_signature_validator`,e.push(n)}n.push({role:`model`,parts:e})}else n.push({role:`model`,parts:[{text:r.content}]});break;case`tool`:n.push({role:`user`,parts:[{functionResponse:{name:r.toolName||`unknown`,response:{result:r.content}}}]});break}return{systemInstruction:t,contents:n}}async function*Xt(e){let t=new Map,n=[],r=!1,i=0;for await(let a of V(e)){let e=a.candidates?.[0],o=e?.content?.parts;if(o){for(let e of o){if(e.text&&e.thought===!0){yield{type:`thinking_delta`,delta:e.text};continue}if(e.text&&(n.push({type:`text`,text:e.text}),r||(r=!0,yield{type:`thinking_done`}),yield{type:`text_delta`,delta:e.text}),e.inlineData){let t=e.inlineData,r=t.mimeType,i=t.data;typeof r==`string`&&typeof i==`string`&&n.push({type:`inline_data`,mimeType:r,data:i})}if(e.functionCall){let n=e.functionCall,r=`gemini-${i++}`,a={id:r,name:n.name,arguments:JSON.stringify(n.args||{})};e.thoughtSignature&&(a.thoughtSignature=e.thoughtSignature),t.set(r,a),yield{type:`tool_call_start`,toolCall:{id:r,name:a.name}},yield{type:`tool_call_done`,toolCall:a}}}if(e?.finishReason){let e=a.usageMetadata,r=e?{promptTokens:e.promptTokenCount??0,completionTokens:e.candidatesTokenCount??0,totalTokens:e.totalTokenCount??0,reasoningTokens:e.thoughtsTokenCount??0,cachedTokens:e.cachedContentTokenCount??0}:void 0;yield{type:`done`,finishReason:t.size>0?`tool_calls`:`stop`,usage:r,outputParts:n};return}}}yield{type:`done`,finishReason:t.size>0?`tool_calls`:`stop`,outputParts:n}}function Zt(e){return new Kt(e)}function Qt(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`input_text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images)e.push({type:`input_image`,image_url:t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`});t.push({role:`user`,content:e});break}case`assistant`:if(n.toolCalls?.length){n.content&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:n.content}]});for(let e of n.toolCalls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments})}else t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({type:`function_call_output`,call_id:n.toolCallId,output:n.content});break}return t}function $t(e){return e.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))}async function*en(e,t){let n=new Map,r=null,i=!1,a=!1,o=!1,s;for await(let c of V(e)){let e=c.response?.usage??c.usage;if(e){let t=e,n=t.input_tokens??0,r=t.output_tokens??0,i=t.output_tokens_details,a=t.input_tokens_details;s={promptTokens:n,completionTokens:r,totalTokens:t.total_tokens??n+r,reasoningTokens:i?.reasoning_tokens??0,cachedTokens:a?.cached_tokens??0}}switch(c.type){case`response.output_item.added`:{let e=c.item;if(!e)break;if(e.type===`function_call`&&e.call_id){r=e.call_id;let t=e.name||``;n.set(r,{id:r,name:t,arguments:e.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:r,name:t}}}e.type===`reasoning`&&(i=!0);break}case`response.function_call_arguments.delta`:if(r){let e=n.get(r);e&&(e.arguments+=c.delta||``,yield{type:`tool_call_delta`,toolCall:{id:r,arguments:c.delta||``}})}break;case`response.function_call_arguments.done`:case`response.output_item.done`:{let e=c.item;if(e?.type===`function_call`&&e.call_id){let t=e.call_id,r=n.get(t);n.set(t,{id:t,name:e.name||r?.name||``,arguments:e.arguments||r?.arguments||`{}`})}break}case`response.output_text.delta`:c.delta&&(o||(o=!0,i&&!a&&(a=!0,yield{type:`thinking_done`})),yield{type:`text_delta`,delta:c.delta});break;case`response.reasoning_summary_text.delta`:c.delta&&!a&&(yield{type:`thinking_delta`,delta:c.delta});break;case`response.failed`:yield{type:`error`,error:c.response?.error?.message||`${t.protocolName} Responses API 失败`};break}}if(n.size>0){for(let e of n.values())yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:s}}else yield{type:`done`,finishReason:`stop`,usage:s}}const tn=z(`OpenAIProtocol`);var nn=class{name=`openai`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r={model:n.model,input:Qt(e),stream:!0,max_output_tokens:n.maxOutputTokens,store:!1};n.enableThinking&&(r.reasoning={effort:`high`}),t.length>0&&(r.tools=$t(t));let i=this.apiUrl;tn.debug({url:i.replace(this.apiKey,`***`),model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`OpenAI Responses 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();tn.error({status:a.status,body:e.slice(0,500)},`OpenAI API 错误`),yield{type:`error`,error:B(a.status,e,`OpenAI`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*en(o,{protocolName:`OpenAI`})}};function rn(e){return new nn(e)}const an=z(`OpenAIChatProtocol`);var on=class{name=`openai-chat`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;an.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 OpenAI Chat 兼容请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();an.error({status:a.status,body:e.slice(0,500)},`OpenAI Chat 兼容 API 错误`),yield{type:`error`,error:B(a.status,e,`OpenAI Chat`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*tt(V(o),{protocolName:`OpenAI Chat`})}buildRequestBody(e,t,n){let r={model:n.model,messages:this.convertMessages(e),stream:!0,stream_options:{include_usage:!0},max_tokens:n.maxOutputTokens};return t.length>0&&(r.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),r}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function sn(e){return new on(e)}const cn=z(`GrokProtocol`);var ln=class{name=`grok`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r={model:n.model,input:Qt(e),stream:!0,max_output_tokens:n.maxOutputTokens,store:!1};n.enableThinking&&(r.reasoning={effort:`high`}),t.length>0&&(r.tools=$t(t));let i=this.apiUrl;cn.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Grok Responses 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();cn.error({status:a.status,body:e.slice(0,500)},`Grok API 错误`),yield{type:`error`,error:B(a.status,e,`Grok`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*en(o,{protocolName:`Grok`})}};function un(e){return new ln(e)}const dn=new Set(ze),fn={ark_v1:Qe,deepseek_v1:at,qwen_v1:pt,qwen_text_v1:mt,glm_v1:vt,moonshot_v1:St,minimax_v1:Dt,vercel_gateway_v1:Lt,anthropic_v1:Ut,gemini_v1:Zt,openai_v1:rn,openai_chat_v1:sn,grok_v1:un};function pn(){return fn}function mn(e){return dn.has(e)}const hn={id:`doubao`,displayName:`Doubao`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning`,toolCallFormat:`responses`},gn={id:`deepseek`,displayName:`DeepSeek`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`thinking_object`,toolCallFormat:`openai`},_n={id:`qwen`,displayName:`Qwen`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`thinking_enabled`,toolCallFormat:`openai`},vn={id:`glm`,displayName:`GLM`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`thinking_object`,toolCallFormat:`openai`},yn={id:`moonshot`,displayName:`Kimi`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning_object`,toolCallFormat:`openai`},bn={id:`minimax`,displayName:`MiniMax`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`anthropic_native`,thinkingAlwaysOn:!0,toolCallFormat:`openai`},xn={id:`gemini`,displayName:`Gemini`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`thought_signature`,toolCallFormat:`gemini`},Sn={id:`gpt`,displayName:`GPT`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning`,toolCallFormat:`responses`},Cn={id:`claude`,displayName:`Claude`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`anthropic_native`,toolCallFormat:`openai`},wn={doubao:hn,deepseek:gn,qwen:_n,glm:vn,moonshot:yn,minimax:bn,gemini:xn,gpt:Sn,claude:Cn,grok:{id:`grok`,displayName:`Grok`,supportsVision:!0,supportsThinking:!1,thinkingFormat:`none`,toolCallFormat:`openai`}};function H(e,t,n){let{family:r}=t;if(typeof r==`object`)return r;let i=r;return n.families?.[i]??wn[i]}const Tn=z(`ModelAdapter`),En=pn();var Dn=class{name=`model`;llmConfig;protocolFactories;constructor(e){this.llmConfig=e,this.protocolFactories=e.protocols?{...En,...e.protocols}:En,this.validateModels()}validateModels(){let e=[];for(let[t,n]of Object.entries(this.llmConfig.models))n&&(H(t,n,this.llmConfig)||e.push(`模型 ${t}: family "${String(n.family)}" 无法解析,请检查是否在 MODEL_FAMILIES 或 LLMConfig.families 中定义`),(!n.maxOutputTokens||n.maxOutputTokens<=0)&&e.push(`模型 ${t}: maxOutputTokens 未指定或无效,请为每个模型显式配置`),(!n.contextWindowTokens||n.contextWindowTokens<=0)&&e.push(`模型 ${t}: contextWindowTokens 未指定或无效,压缩器依赖此值`),n.endpoint?this.protocolFactories[n.endpoint.protocol]||e.push(`模型 ${t}: 协议 "${n.endpoint.protocol}" 未注册,请检查是否在内置协议或 LLMConfig.protocols 中定义`):e.push(`模型 ${t}: endpoint 未配置`));if(e.length>0)throw Error(`LLMConfig 校验失败:\n${e.join(`
5
- `)}`)}resolveRuntimeValue(e){return typeof e==`function`?e()??``:e??``}resolveHeaders(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e)){let e=this.resolveRuntimeValue(r);e&&(t[n]=e)}return t}createProtocolForEndpoint(e){let t=Ie(e),n=this.resolveRuntimeValue(e.vendorKey??e.accessKey),r=this.protocolFactories[e.protocol];if(!r)throw Error(`未知协议: ${e.protocol},请在 LLMConfig.protocols 中注册`);return r({apiKey:n,apiUrl:t,headers:this.resolveHeaders(e.headers)})}get supportedModels(){return Object.keys(this.llmConfig.models)}supportsModel(e){return Le(this.llmConfig,e)!==void 0}getModelFamilyConfig(e){let t=this.llmConfig.models[e];if(t)return H(e,t,this.llmConfig)}async*streamOnce(e,t,n){let r=e.filter(e=>!(e.role===`assistant`&&!e.content&&!e.toolCalls?.length));yield*this.streamModelEndpoint(r,t,n)}async*streamModelEndpoint(e,t,n){let{model:r}=n,i=this.llmConfig.models[r];if(!i){yield{type:`error`,error:`模型 ${r} 未在 LLMConfig.models 中配置`};return}let a=H(r,i,this.llmConfig);if(!a){yield{type:`error`,error:`模型 ${r} 无法解析家族配置,请在 ModelConfig.family 或 LLMConfig.families 中指定`};return}let o=Le(this.llmConfig,r);if(!o){yield{type:`error`,error:`模型 ${r} 未配置 endpoint`};return}try{let s=this.createProtocolForEndpoint(o);Tn.info({model:r,protocol:o.protocol,providerModelId:o.providerModelId},`请求 LLM`);for await(let r of s.stream(e,t,{model:o.providerModelId,familyConfig:a,maxOutputTokens:i.maxOutputTokens,enableThinking:n.enableThinking??!1,signal:n.signal}))yield r}catch(e){yield{type:`error`,error:e instanceof Error?e.message:String(e)}}}};function On(e){if(e>=1e6&&e%1e6==0)return`${e/1e6}M`;if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${parseFloat(t.toFixed(1))}M`}let t=e/1e3;return Number.isInteger(t)?`${t}K`:`${parseFloat(t.toFixed(1))}K`}function kn(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n.trim():void 0}function An(e){let t=kn(e,`profileKind`);if(t===`provider_api_key`||t===`vendor_api_key`)return`原厂 API Key`;if(t===`compatible_gateway`||t===`model_proxy`)return`模型代理服务`;let n=kn(e,`source`);if(n===`huyooo-official`||n===`official`)return`官方服务`;if(n===`vendor-api-key`||n===`provider_api_key`||n===`user-profile`)return`原厂 API Key`;if(n===`model-proxy`||n===`compatible_gateway`)return`模型代理服务`;if(n===`coding-plan`)return`Coding Plan`}function jn(e){let t=An(e);return t?`配置来源:${t}`:void 0}function Mn(e){let t=[];for(let[n,r]of Object.entries(e.models)){if(!r||r.visible===!1)continue;let i=H(n,r,e),a=r.displayName??n,o=r.supportsThinking,s=r.supportsVision,c=i?.thinkingAlwaysOn??!1,l=[];s&&l.push(`多模态`),o&&l.push(c?`深度思考(始终开启)`:`深度思考`),r.contextWindowTokens&&l.push(`长上下文(${On(r.contextWindowTokens)})`);let u=jn(r.metadata);t.push({modelId:n,displayName:a,supportsThinking:o,thinkingAlwaysOn:c,supportsVision:s,contextWindowTokens:r.contextWindowTokens,maxOutputTokens:r.maxOutputTokens,tooltip:{features:l.length>0?l:void 0,description:u}})}return t}function Nn(e,t){let n=t.models[e];if(n)return{contextWindowTokens:n.contextWindowTokens,maxOutputTokens:n.maxOutputTokens}}function Pn(e){return e.replace(/[^a-zA-Z0-9_]/g,`_`)}function Fn(e,t,n){let r=!!e.assetId,i=Pn(e.assetId??e.name),a=Pn(e.name),o=e.alias??(r?`${i}__${a}`:i);return{id:e.id??(r?`${n}:${i}:${a}`:`${n}:${i}`),assetId:i,alias:o}}function In(e,t,n,r){let i=Fn(e,t,n);return{id:i.id,assetId:i.assetId,name:e.name,alias:i.alias,displayName:e.displayName??e.name,description:e.description,parameters:e.parameters,outputSchema:e.outputSchema,resolvedOutputSchema:e.resolvedOutputSchema??(e.outputSchema?te(e.outputSchema):void 0),errorSchema:e.errorSchema??O,category:r?.category??e.category??`general`,tags:r?.tags??e.tags??[],source:n,provider:t,ui:e.ui,requiresApproval:e.requiresApproval,approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}}function Ln(e,t){return e.id===t||e.alias===t||(!e.assetId||e.assetId===e.name?e.assetId===t:!1)}function Rn(e){return e.id??(e.assetId?`${e.assetId}:${e.name}`:e.name)}function zn(e,t){return{...e,id:t.id,assetId:t.assetId,alias:t.alias,displayName:t.displayName,name:t.alias}}function Bn(e,t=`bundled`){let n=new Map,r=new Set,i=[];function a(e){for(let t of r)t(e)}function o(t){return In(t.tool,e,t.source,{category:t.category,tags:t.tags})}function s(e){return o(e).id}function c(e){for(let t of n.values())if(Ln(o(t),e))return t}function l(e){for(let t of n.entries())if(Ln(o(t[1]),e))return t}function u(){i=Array.from(n.values()).map(o)}return{id:e,source:t,async init(){},async destroy(){n.clear(),i=[],r.clear()},getDescriptors(){return i.slice()},async loadTool(e){return c(e)?.tool??null},addChangeListener(e){r.add(e)},removeChangeListener(e){r.delete(e)},register(r,i){let c={tool:r,source:i?.source??t,category:i?.category,tags:i?.tags};n.set(s(c),c),u(),a({type:`added`,tools:[o(c)],provider:e})},registerAll(r,i){let c=[];for(let e of r){let r={tool:e,source:i?.source??t,category:i?.category,tags:i?.tags};n.set(s(r),r),c.push(o(r))}u(),c.length>0&&a({type:`added`,tools:c,provider:e})},unregister(t){let r=l(t);if(!r)return;let[i,s]=r;n.delete(i),u(),a({type:`removed`,tools:[o(s)],provider:e})},replace(r,i){let c=l(r.id??r.alias??r.name),d=c?.[1],f={tool:r,source:i?.source??d?.source??t,category:i?.category??d?.category,tags:i?.tags??d?.tags};c&&n.delete(c[0]),n.set(s(f),f),u(),a({type:`updated`,tools:[o(f)],provider:e})},has(e){return!!c(e)}}}const U=z(`MCP`);function W(e){return typeof e==`object`&&!!e}function Vn(e){let t=[];if(Array.isArray(e))for(let n of e)W(n)&&(n.type===`text`&&typeof n.text==`string`?t.push(n.text):n.type===`image`?t.push(`[image: ${n.mimeType||`unknown`}]`):n.type===`resource`&&t.push(JSON.stringify(n)));return t.join(`
6
- `)||JSON.stringify(e)}function Hn(e){let t={type:typeof e.type==`string`?e.type:`string`};if(typeof e.description==`string`&&(t.description=e.description),Array.isArray(e.enum)&&(t.enum=e.enum),W(e.items)&&(t.items=Hn(e.items)),W(e.properties)){t.properties={};for(let[n,r]of Object.entries(e.properties))W(r)&&(t.properties[n]=Hn(r))}return Array.isArray(e.required)&&(t.required=e.required.filter(e=>typeof e==`string`)),t}function Un(e){let t={},n=[];if(W(e.properties))for(let[n,r]of Object.entries(e.properties))W(r)&&(t[n]=Hn(r));return Array.isArray(e.required)&&n.push(...e.required.filter(e=>typeof e==`string`)),{type:`object`,properties:t,required:n.length>0?n:void 0}}function Wn(e){let{name:t,source:n}=e,r=n??`bundled`,i=null,a=null,o=`disconnected`,s,f,p=0,m=!1,h=null,g=e.transport===`streamableHttp`?e.sessionId:void 0,_=new Map,v=new Set,y=new Set,b=[];function x(e){for(let t of v)t(e)}function S(){let e={provider:t,status:o,error:s};for(let t of y)t(e)}function C(){b=Array.from(_.values()).map(w)}function w(e){return In(e,t,r,{category:`mcp`})}function T(e,n){let r=Un(e.inputSchema);return{name:e.name,assetId:t,description:e.description||`MCP tool from ${t}`,parameters:r,execute:async t=>{let r=await n.callTool({name:e.name,arguments:t}),i=Vn(r.content);return r.isError&&D({message:i,code:`OPERATION_FAILED`,retryable:!0}),{text:i,_summary:i}}}}function E(e){if(!i||o!==`connected`)return;let n=new Set(_.keys()),r=new Set(e.map(e=>e.name)),a=[...n].filter(e=>!r.has(e)),s=[];for(let e of a){let t=_.get(e);t&&s.push(w(t)),_.delete(e)}let c=[];for(let t of e){let e=T(t,i);_.set(e.name,e),n.has(e.name)||c.push(w(e))}C(),U.info({serverName:t,added:c.map(e=>e.name),removed:a},`[${t}] 工具列表已更新: +${c.length} -${a.length}`),s.length>0&&x({type:`removed`,tools:s,provider:t}),c.length>0&&x({type:`added`,tools:c,provider:t})}function O(){h&&=(clearTimeout(h),null)}function k(){if(m||!(e.transport===`streamableHttp`?e.reconnect?.enabled!==!1:e.reconnect?.enabled===!0))return;let n=e.reconnect?.maxRetries??5,r=e.reconnect?.initialDelayMs??1e3,i=e.reconnect?.maxDelayMs??3e4;if(p>=n){o=`error`,s=`重连失败(已尝试 ${n} 次)`,S(),U.error({name:t,attempts:n},`[${t}] 重连次数耗尽`);return}let a=Math.min(r*2**p,i),c=Math.random()*.3*a,l=Math.round(a+c);p++,U.info({name:t,attempt:p,delay:l},`[${t}] ${l}ms 后重连 (${p}/${n})`),h=setTimeout(async()=>{try{await j.reconnect(),p=0,U.info({name:t},`[${t}] 重连成功`)}catch{k()}},l)}function A(){m||(o=`disconnected`,s=`连接意外断开`,S(),U.warn({name:t},`[${t}] 连接意外断开`),k())}let j={id:t,source:r,async init(){O(),U.info({name:t},`[${t}] 正在连接...`),o=`connecting`,S();let n=new c({name:`ai-chat-mcp-client`,version:`1.0.0`},{listChanged:{tools:{debounceMs:300,onChanged:(e,n)=>{if(e){U.error({name:t,error:e},`[${t}] 工具列表刷新失败`);return}E(n??[])}}}}),r;if(e.transport===`stdio`){if(!e.command)throw Error(`[${t}] stdio 模式必须指定 command`);r=new l({command:e.command,args:e.args,env:e.env,cwd:e.cwd})}else if(e.transport===`streamableHttp`){if(!e.url)throw Error(`[${t}] streamableHttp 模式必须指定 url`);r=new d(new URL(e.url),{requestInit:e.headers?{headers:e.headers}:void 0,sessionId:g,reconnectionOptions:e.reconnectionOptions?{initialReconnectionDelay:e.reconnectionOptions.initialReconnectionDelay??1e3,maxReconnectionDelay:e.reconnectionOptions.maxReconnectionDelay??3e4,reconnectionDelayGrowFactor:e.reconnectionOptions.reconnectionDelayGrowFactor??1.5,maxRetries:e.reconnectionOptions.maxRetries??2}:void 0})}else if(e.transport===`sse`){if(!e.url)throw Error(`[${t}] sse 模式必须指定 url`);U.warn({name:t},`[${t}] SSEClientTransport 已被 SDK 标记 deprecated,建议迁移到 streamableHttp`),r=new u(new URL(e.url),e.headers?{requestInit:{headers:e.headers}}:void 0)}else throw Error(`[${t}] 不支持的传输方式`);try{await n.connect(r),n.onclose=A,i=n,a=r,o=`connected`,f=Date.now(),s=void 0,r instanceof d&&(g=r.sessionId),S(),U.info({name:t},`[${t}] 已连接`);let{tools:e}=await n.listTools(),c=[];for(let t of e){let e=T(t,n);_.set(e.name,e),c.push(w(e))}C(),U.info({name:t,toolCount:_.size,toolNames:[..._.keys()]},`[${t}] 发现 ${_.size} 个工具`),c.length>0&&x({type:`added`,tools:c,provider:t})}catch(e){throw o=`error`,s=e instanceof Error?e.message:String(e),S(),U.error({name:t,error:s},`[${t}] 连接失败`),e}},async destroy(){O(),m=!0;let e=b.slice();if(a instanceof d)try{await a.terminateSession()}catch{}if(i)try{await i.close(),U.info({name:t},`[${t}] 已断开`)}catch(e){U.error({name:t,error:e},`[${t}] 断开失败`)}i=null,a=null,o=`disconnected`,_.clear(),b=[],e.length>0&&x({type:`removed`,tools:e,provider:t}),v.clear(),y.clear(),m=!1},async reconnect(){O(),new Set(_.keys());let e=b.slice();if(m=!0,i)try{await i.close()}catch{}i=null,a=null,m=!1,_.clear(),b=[],e.length>0&&x({type:`removed`,tools:e,provider:t,reconnecting:!0}),await j.init()},getDescriptors(){return b.slice()},async loadTool(e){for(let t of _.values())if(Ln(w(t),e))return t;return null},addChangeListener(e){v.add(e)},removeChangeListener(e){v.delete(e)},addConnectionStatusListener(e){y.add(e)},removeConnectionStatusListener(e){y.delete(e)},getStatus(){return o},getError(){return s},getConfig(){return e},getConnectionInfo(){return{name:t,status:o,toolCount:_.size,error:s,lastConnectedAt:f,reconnectAttempts:p}}};return j}const G={email:`email`,uuidAny:`uuid-any`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ulid`,nanoid:`nanoid`,url:`url`,uri:`uri`,uuid:`uuid`,ipv4:`ipv4`,ipv6:`ipv6`,ip:`ip`,cidr:`cidr`,hostname:`hostname`,date:`date`,time:`time`,dateTime:`date-time`,datetime:`datetime`,duration:`duration`,phone:`phone`,phoneCn:`phone-cn`,phoneE164:`phone-e164`,objectId:`objectid`,slug:`slug`,base64:`base64`,base64url:`base64url`,jwt:`jwt`,hexColor:`hex-color`,rgbColor:`rgb-color`,color:`color`,emoji:`emoji`,semver:`semver`,creditCard:`credit-card`},Gn=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Kn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,qn=/^c[^\s-]{8,}$/i,Jn=/^[0-9a-z]+$/,Yn=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Xn=/^[A-Za-z0-9_-]{21}$/,Zn=/^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,63}\b[-a-zA-Z0-9()@:%_+.~#?&/=]*$/,Qn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,$n=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,er=/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,3}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,2}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$/,tr=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:3[0-2]|[12]?[0-9])$/,nr=/^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)*(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$/,rr=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$/,ir=/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\.\d{1,3})?$/,ar=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\.\d{1,3})?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$/,or=/^P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/,sr=/^1[3-9]\d{9}$/,cr=/^\+[1-9]\d{6,14}$/,lr=/^[0-9a-fA-F]{24}$/,ur=/^#(?:[0-9a-fA-F]{3}){1,2}$/,dr=/^rgba?\(\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\s*,\s*(?:0|1|0?\.\d+))?\s*\)$/,fr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,pr=/^[A-Za-z0-9_-]+$/,mr=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,hr=/^[\p{Emoji}]+$/u,gr=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,_r=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;let vr=!1;function yr(e){let t=e.replace(/\D/g,``);if(t.length<13||t.length>19)return!1;let n=0,r=!1;for(let e=t.length-1;e>=0;e--){let i=parseInt(t[e],10);r&&(i*=2,i>9&&(i-=9)),n+=i,r=!r}return n%10==0}function br(){vr||(vr=!0,e.Set(G.email,e=>Gn.test(e)),e.Set(G.uuidAny,e=>Kn.test(e)),e.Set(G.cuid,e=>qn.test(e)),e.Set(G.cuid2,e=>Jn.test(e)&&e.length>=1),e.Set(G.ulid,e=>Yn.test(e)),e.Set(G.nanoid,e=>Xn.test(e)),e.Set(G.url,e=>Zn.test(e)),e.Set(G.uri,e=>Zn.test(e)),e.Set(G.uuid,e=>Qn.test(e)),e.Set(G.ipv4,e=>$n.test(e)),e.Set(G.ipv6,e=>er.test(e)),e.Set(G.ip,e=>$n.test(e)||er.test(e)),e.Set(G.cidr,e=>tr.test(e)),e.Set(G.hostname,e=>nr.test(e)),e.Set(G.date,e=>rr.test(e)),e.Set(G.time,e=>ir.test(e)),e.Set(G.dateTime,e=>ar.test(e)),e.Set(G.datetime,e=>ar.test(e)),e.Set(G.duration,e=>or.test(e)),e.Set(G.phone,e=>sr.test(e)),e.Set(G.phoneCn,e=>sr.test(e)),e.Set(G.phoneE164,e=>cr.test(e)),e.Set(G.objectId,e=>lr.test(e)),e.Set(G.slug,e=>gr.test(e)),e.Set(G.base64,e=>fr.test(e)),e.Set(G.base64url,e=>pr.test(e)),e.Set(G.jwt,e=>mr.test(e)),e.Set(G.hexColor,e=>ur.test(e)),e.Set(G.rgbColor,e=>dr.test(e)),e.Set(G.color,e=>ur.test(e)||dr.test(e)),e.Set(G.emoji,e=>hr.test(e)),e.Set(G.semver,e=>_r.test(e)),e.Set(G.creditCard,yr))}function xr(t,n){e.Set(t,n)}function Sr(t){return e.Has(t)}const Cr=new WeakMap,wr=new WeakMap;br();function Tr(e){let t=Cr.get(e);return t||(t=f.Compile(e),Cr.set(e,t)),t}function Er(e){return e.replace(/^\//,``).replace(/\//g,`.`)}function Dr(e,t){return e?`${e}: ${t}`:t}function Or(e){let t=wr.get(e);return t||(t=M(e),wr.set(e,t)),Tr(t)}function kr(e){D({message:`参数校验失败: ${e.length>0?e.join(`; `):`输入不符合工具参数定义`}`,code:`INVALID_PARAMS`,suggestion:`请根据工具的 inputSchema 修正参数类型和结构后重试`,retryable:!0})}function Ar(e,t){let n=Tr(e);if(n.Check(t))return t;kr(Array.from(n.Errors(t),e=>Dr(Er(e.path),e.message)))}function jr(e,t){let n=Or(e);if(n.Check(t))return t;kr(Array.from(n.Errors(t),e=>Dr(Er(e.path),e.message)))}function Mr(e){return e.inputSchema}function Nr(e){return e.outputSchema}function Pr(e){let t=Nr(e);if(t)return te(t)}function Fr(e,t){return Ar(e.inputSchema,t)}function Ir(e){if(`parameters`in e)throw Error(`defineTool 只支持 TypeBox inputSchema;不要使用 parameters JSON Schema`);let t=Mr(e);return{id:e.id,name:e.name,alias:e.alias,displayName:e.displayName,description:e.description,parameters:t,outputSchema:Nr(e),resolvedOutputSchema:Pr(e),errorSchema:e.errorSchema??O,ui:e.ui,requiresApproval:e.requiresApproval,approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency,assessInputGovernance:e.assessInputGovernance?async t=>e.assessInputGovernance?.(Fr(e,t)):void 0,category:e.category,tags:e.tags,timeout:e.timeout,execute:async(t,n)=>e.execute(Fr(e,t),n)}}const Lr=z(`ToolManager`);function Rr(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.assetId.toLowerCase().includes(n)||e.alias.toLowerCase().includes(n)||e.displayName.toLowerCase().includes(n)||e.id.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n))||e.category.toLowerCase().includes(n))}function zr(){let e=new Map,t=new Set,n=new Set,r=new Set,i=new Map,a=new Map,o=new Map,s=new Map,c=[],l=new Map,u=new Map;function d(e,t,n){let r=l.get(e)??{totalCalls:0,successCount:0,errorCount:0,totalDurationMs:0};r.totalCalls++,t?r.successCount++:r.errorCount++,r.totalDurationMs+=n,r.lastCallAt=Date.now(),l.set(e,r)}async function f(e){let t={reason:e,toolNames:[...s.keys()]};await Promise.all([...r].map(e=>Promise.resolve(e(t))))}function p(t){let n=i.get(t);if(n)return e.get(n)?.getDescriptors().find(e=>e.id===t)}function m(t){let n=p(t);if(n)return n;let r=a.get(t);if(r){let e=p(r);if(e)return e}for(let n of e.values()){let e=n.getDescriptors().find(e=>Ln(e,t));if(e)return e}}async function h(t){let n=e.get(t.provider);return n?n.loadTool(t.id):null}function _(e){let t=Rn(e);return{...e,execute:async(n,r)=>{let i=n;for(let t of c)if(t.beforeExecute){let n=await t.beforeExecute(e.name,i);n&&(i=n)}let a=Date.now();try{let n=jr(e.parameters,i),o=g(await e.execute(n,r)),s=Date.now()-a;for(let t of c)if(t.afterExecute){let r=await t.afterExecute(e.name,n,o,s);r&&(o=r)}return d(t,!0,s),o}catch(n){d(t,!1,Date.now()-a);for(let t of c)t.onError&&await t.onError(e.name,i,n).catch(()=>{});throw n}}}}function v(e){let t=m(e);t&&h(t).then(e=>{e&&(o.set(t.id,e),s.set(t.alias,_(zn(e,t))),f(`reloaded`))}).catch(()=>{})}function y(e){let n=!1;if(e.type===`removed`){if(e.reconnecting){let t=new Set(e.tools.map(e=>e.id).filter(e=>o.has(e)));t.size>0&&u.set(e.provider,t)}for(let t of e.tools)i.get(t.id)===e.provider&&i.delete(t.id),a.get(t.alias)===t.id&&a.delete(t.alias),o.delete(t.id)&&(n=!0),s.delete(t.alias)&&(n=!0)}if(e.type===`added`){for(let t of e.tools){let n=a.get(t.alias);n&&n!==t.id?Lr.warn({alias:t.alias,newProvider:e.provider,existingDescriptorId:n},`工具 alias 冲突: "${t.alias}" (${e.provider}) 与已有 (${n}) 冲突,保留先注册的`):a.set(t.alias,t.id),i.set(t.id,e.provider)}let t=u.get(e.provider);if(t){let n=e.tools.map(e=>e.id).filter(e=>t.has(e));n.length>0&&x.enable(n).catch(()=>{}),u.delete(e.provider)}}if(e.type===`updated`)for(let t of e.tools){i.set(t.id,e.provider);for(let[e,n]of a)n===t.id&&e!==t.alias&&a.delete(e);if(a.set(t.alias,t.id),o.has(t.id)){for(let[e,r]of s)Rn(r)===t.id&&(s.delete(e),n=!0);v(t.id)}}n&&f(`provider_changed`);for(let n of t)n(e)}function b(e){for(let t of n)t(e)}let x={async addProvider(t){e.has(t.id)&&await x.removeProvider(t.id),t.addChangeListener(y),t.addConnectionStatusListener&&t.addConnectionStatusListener(b);try{await t.init(),e.set(t.id,t)}catch(e){t.removeChangeListener(y),t.removeConnectionStatusListener&&t.removeConnectionStatusListener(b);for(let[e,n]of i)n===t.id&&i.delete(e);for(let[e,t]of a)i.has(t)||a.delete(e);throw e}},async removeProvider(t){let n=e.get(t);if(!n)return;n.removeChangeListener(y),n.removeConnectionStatusListener&&n.removeConnectionStatusListener(b);let r=n.getDescriptors(),c=!1;for(let e of r)i.get(e.id)===t&&i.delete(e.id),a.get(e.alias)===e.id&&a.delete(e.alias),o.delete(e.id)&&(c=!0),s.delete(e.alias)&&(c=!0);await n.destroy(),e.delete(t),c&&await f(`provider_changed`)},getProviders(){return Array.from(e.values()).map(e=>({id:e.id,source:e.source,toolCount:e.getDescriptors().length}))},getProvider(t){return e.get(t)},getDescriptor(e){return m(e)},hasDescriptor(e){return m(e)!==void 0},getAllDescriptors(){let t=[];for(let n of e.values())t.push(...n.getDescriptors());return t},search(e){let t=x.getAllDescriptors();if(e?.keyword){let n=e.keyword;t=t.filter(e=>Rr(e,n))}if(e?.category){let n=e.category.toLowerCase();t=t.filter(e=>e.category.toLowerCase()===n)}if(e?.tags?.length){let n=e.tags.map(e=>e.toLowerCase());t=t.filter(e=>{let t=e.tags.map(e=>e.toLowerCase());return n.every(e=>t.includes(e))})}return e?.source&&(t=t.filter(t=>t.source===e.source)),t},async enable(e){let t=[],n=!1;for(let r of e){let e=m(r);if(!e)continue;if(s.has(e.alias)){let n=s.get(e.alias);n&&t.push(n);continue}let i=await h(e);if(!i)continue;o.set(e.id,i);let a=_(zn(i,e));s.set(e.alias,a),t.push(a),n=!0}return n&&await f(`enabled`),t},disable(e){let t=!1;for(let n of e){let e=m(n);if(e){o.delete(e.id)&&(t=!0),s.delete(e.alias)&&(t=!0);continue}s.delete(n)&&(t=!0)}t&&f(`disabled`)},async enableAll(){let t=[],n=!1;for(let r of e.values()){let e=r.getDescriptors();for(let i of e){if(s.has(i.alias)){let e=s.get(i.alias);e&&t.push(e);continue}let e=await r.loadTool(i.id);if(e){o.set(i.id,e);let r=_(zn(e,i));s.set(i.alias,r),t.push(r),n=!0}}}return n&&await f(`enabled`),t},getSessionTools(){return s},getSessionToolNames(){return[...s.keys()]},use(e){c.push(e);let t=!1;for(let[e,n]of o){let r=p(e);r&&(s.set(r.alias,_(zn(n,r))),t=!0)}t&&f(`middleware_updated`)},addChangeListener(e){t.add(e)},removeChangeListener(e){t.delete(e)},addConnectionStatusListener(e){n.add(e)},removeConnectionStatusListener(e){n.delete(e)},addSessionToolsChangeListener(e){r.add(e)},removeSessionToolsChangeListener(e){r.delete(e)},categories(){let e=new Map;for(let t of x.getAllDescriptors())e.set(t.category,(e.get(t.category)??0)+1);return Array.from(e.entries()).map(([e,t])=>({category:e,count:t}))},getStats(){return new Map(l)},getToolStats(e){let t=m(e);return t?l.get(t.id):l.get(e)},getMcpConnectionInfos(){let t=[];for(let n of e.values())n.getConnectionInfo&&t.push(n.getConnectionInfo());return t},async destroy(){let c=[...e.keys()];await Promise.allSettled(c.map(e=>x.removeProvider(e))),o.clear(),s.clear(),i.clear(),a.clear(),l.clear(),u.clear(),t.clear(),n.clear(),await f(`destroyed`),r.clear()}};return x}function Br(e,t){return{...e,...t.sideEffectLevel?{sideEffectLevel:t.sideEffectLevel}:{},...t.approvalPolicy?{approvalPolicy:t.approvalPolicy}:{},...t.hostDependency?{hostDependency:t.hostDependency}:{}}}function Vr(e){return e===`read`||e===`write`||e===`destructive`}function Hr(e){return e===`auto`||e===`manual`||e===`destructive-only`}function Ur(e){return e===`none`||e===`local-app`||e===`os-service`||e===`remote-service`}function Wr(e){return e.governance?{...e,governance:e.governance}:{kind:e.kind,scope:e.scope,runtime:e.runtime}}function Gr(e={}){return Br({sideEffectLevel:`write`,approvalPolicy:`auto`,executionIsolation:`in-process`,hostDependency:`none`},e)}function Kr(e={}){return Br({sideEffectLevel:`write`,approvalPolicy:`manual`,executionIsolation:`mcp`,hostDependency:`none`},e)}function qr(e={}){return Br({sideEffectLevel:`read`,approvalPolicy:`auto`,executionIsolation:`part-render`,hostDependency:`none`},e)}function Jr(e={}){return Br({sideEffectLevel:`read`,approvalPolicy:`auto`,executionIsolation:`prompt-injection`,hostDependency:`none`},e)}function Yr(e){if(e)return{sideEffectLevel:e.sideEffectLevel,approvalPolicy:e.approvalPolicy,hostDependency:e.hostDependency}}function Xr(e){let t={};return Vr(e.sideEffectLevel)&&(t.sideEffectLevel=e.sideEffectLevel),Hr(e.approvalPolicy)&&(t.approvalPolicy=e.approvalPolicy),Ur(e.hostDependency)&&(t.hostDependency=e.hostDependency),Object.keys(t).length>0?t:void 0}const Zr={auto:0,"destructive-only":1,manual:2};function Qr(e,t){return Zr[e]>=Zr[t]?e:t}function $r(e,t){let n={read:0,write:1,destructive:2};return n[e]>=n[t]?e:t}function ei(e,t=`auto`){let n=Gr({sideEffectLevel:e,approvalPolicy:t,hostDependency:`os-service`});return{approvalPolicy:n.approvalPolicy,sideEffectLevel:n.sideEffectLevel,hostDependency:n.hostDependency}}function ti(e){return{...ei(e.level,e.recommendedApprovalPolicy),riskSummary:e.summary,riskTags:e.tags,riskSignals:e.signals}}function ni(e,t={}){let n=e.trim(),r=[],i=new Set,a=null;function o(e){a=a?$r(a,e.level):e.level,r.push(e.signal);for(let t of e.tags??[])i.add(t)}for(let e of[{pattern:/(^|\s)rm\s+-[^\n]*r[^\n]*f\b/,signal:`检测到 rm -rf 类删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\bgit\s+reset\s+--hard\b/,signal:`检测到 git reset --hard`,tags:[`git`]},{pattern:/\bgit\s+clean\b[^\n]*\s-f/,signal:`检测到 git clean 强制清理`,tags:[`git`,`delete`]},{pattern:/\bdd\s+if=.*of=\/dev\//,signal:`检测到 dd 直接写块设备`,tags:[`system`]},{pattern:/\bmkfs(\.[a-z0-9_-]+)?\b/,signal:`检测到格式化文件系统命令`,tags:[`system`]},{pattern:/\bdiskutil\s+erase(Disk|Volume)\b/,signal:`检测到磁盘抹除命令`,tags:[`system`]},{pattern:/\b(format|shutdown|reboot|poweroff|halt)\b/i,signal:`检测到系统级破坏/关机命令`,tags:[`system`]},{pattern:/\b(del|erase)\b[^\n]*\s\/f\b/i,signal:`检测到 Windows 强制删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\brd\b[^\n]*\s\/s\b[^\n]*\s\/q\b/i,signal:`检测到 Windows 递归删除目录命令`,tags:[`filesystem`,`delete`]},{pattern:/\b(curl|wget)\b[^\n|]*\|\s*(sh|bash|zsh|fish|pwsh|powershell)\b/i,signal:`检测到网络下载后直接交给 shell 执行`,tags:[`network`,`shell-eval`]},{pattern:/\b(bash|sh|zsh|fish)\s+-c\b/,signal:`检测到 shell -c 动态执行命令`,tags:[`shell-eval`]},{pattern:/\bpowershell(\.exe)?\s+-Command\b/i,signal:`检测到 PowerShell 动态执行命令`,tags:[`shell-eval`]}])e.pattern.test(n)&&o({level:`destructive`,signal:e.signal,tags:e.tags});for(let e of[{pattern:/(^|\s)rm\s+([^-][^\n]*)/,signal:`检测到文件删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\b(npm|pnpm|yarn)\s+(install|add|remove|uninstall|update)\b/,signal:`检测到依赖变更命令`,tags:[`package-manager`]},{pattern:/\bgit\s+(commit|push|merge|rebase|pull)\b/,signal:`检测到 Git 写操作命令`,tags:[`git`]},{pattern:/(^|\s)(mv|cp|mkdir|touch|chmod|chown)\b/,signal:`检测到文件系统写操作命令`,tags:[`filesystem`]},{pattern:/\bsed\b[^\n]*\s-i(\b|['"])/,signal:`检测到 sed 原地修改命令`,tags:[`filesystem`]},{pattern:/\bkill(\s+-9)?\b/,signal:`检测到进程控制命令`,tags:[`process`]},{pattern:/\b(curl|wget)\b/,signal:`检测到网络访问命令`,tags:[`network`]},{pattern:/^\s*(python|python3|node|tsx|ts-node|deno|ruby|perl)\b/,signal:`检测到脚本解释器执行入口`,tags:[`script`]},{pattern:/^\s*(make|just)\b/,signal:`检测到任务脚本执行入口`,tags:[`script`]}])e.pattern.test(n)&&o({level:`write`,signal:e.signal,tags:e.tags});if([/^\s*(pwd|ls|cat|rg|which|echo|env)\b/,/^\s*git\s+(status|diff|log|show)\b/,/^\s*(curl|wget)\b[^\n]*(https?:\/\/|\s+-I\b|\s+--head\b)/,/^\s*(npm|pnpm|yarn)\s+(test|run\s+test)\b/].some(e=>e.test(n))&&o({level:`read`,signal:`命令模式符合只读查询或测试执行`,tags:n.startsWith(`git `)?[`git`]:void 0}),!a){let e=t.unknownCommandLevel??`write`;o({level:e,signal:e===`destructive`?`未识别命令且策略要求按 destructive 处理`:`未识别为只读命令,保守按写操作处理`})}for(let e of i){let n=t.elevateTagsToLevel?.[e];n&&(a=$r(a??`write`,n),r.push(`策略已将 ${e} 标签提升为 ${n}`))}let s=a??`write`,c=s===`destructive`?`manual`:`auto`;(i.has(`system`)||i.has(`shell-eval`))&&(c=`manual`),t.approvalByLevel?.[s]&&(c=Qr(c,t.approvalByLevel[s]));for(let e of i){let n=t.approvalByTag?.[e];n&&(c=Qr(c,n))}return{level:s,summary:s===`read`?`检测到只读或低风险命令`:s===`destructive`?`检测到高风险命令:${r.join(`,`)}`:`检测到可能修改环境的命令:${r.join(`,`)}`,signals:r,tags:Array.from(i),recommendedApprovalPolicy:c}}function ri(e,t={}){let n=e.category===`mcp`,r=t.governance??(n?void 0:Gr({approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}));return{...Wr({kind:`tool`,scope:e.source===`system`||e.source===`bundled`?`core`:e.source===`user`?`local`:`external`,runtime:n?`mcp-provider`:`in-process`,governance:r}),ref:e.alias,id:e.id,assetId:e.assetId,alias:e.alias,name:e.name,displayName:e.displayName,description:e.description,category:e.category,tags:e.tags,source:e.source,provider:e.provider,...t}}function ii(e,t){return{...ri(e),outputSchema:e.outputSchema,resolvedOutputSchema:e.resolvedOutputSchema,errorSchema:e.errorSchema,...t}}function ai(e){let t=e.enabled??!1;return{...Wr({kind:`mcp-server`,scope:`local`,runtime:`mcp-provider`,governance:Kr(e.governance)}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags??[],enabled:t,status:e.connectionInfo?.status??(t?`disconnected`:`disabled`),toolCount:e.connectionInfo?.toolCount??0,error:e.connectionInfo?.error,hasDistBundle:e.hasDistBundle,projectDir:e.projectDir,...e.extra}}function oi(e){return{...ai(e),meta:e.meta,code:e.code,dependencies:e.dependencies,...e.extra}}const si=z(`ContextCompressor`);function K(e){return e?Math.ceil(e.length/3.2):0}function ci(e){let t=4;if(t+=K(e.content),e.toolCalls)for(let n of e.toolCalls)t+=K(n.name),t+=K(n.arguments),t+=10;return e.images&&(t+=e.images.length*85),t}function q(e){let t=3;for(let n of e)t+=ci(n);return t}function J(e){let t=e.compactThresholdRatio??.8;return Math.floor(e.contextWindowTokens*t)-e.maxOutputTokens}function li(e,t){return q(e)>J(t)}function ui(e,t){let n=t.keepRecentMessages??6,r=e[0]?.role===`system`?1:0,i=r;for(let t=r;t<e.length;t++)if(e[t].role===`user`){i=t+1;break}let a=Math.max(i,e.length-n),o=e.slice(a),s=e.slice(i,a);if(s.length<2)return{summarizeMessages:[],keepMessages:e.slice(r)};let c=q(e),l=J(t);return si.info({estimatedTokens:c,budget:l,middleCount:s.length,keepCount:o.length},`准备 AI 总结: ~${c} tokens > budget ${l}, 总结 ${s.length} 条中间消息, 保留最近 ${o.length} 条`),{summarizeMessages:[{role:`system`,content:hi},{role:`user`,content:gi(s)}],keepMessages:o}}function di(e,t,n){let r=e[0]?.role===`system`?e[0]:null,i=r?1:0,a=null;for(let t=i;t<e.length;t++)if(e[t].role===`user`){a=e[t];break}let o=[];r&&o.push(r),a&&o.push(a),o.push({role:`system`,content:`[对话历史摘要]\n${t}`}),o.push(...n);let s=q(o);return si.info({originalCount:e.length,resultCount:o.length,tokens:s},`AI 总结应用完成: ${e.length} → ${o.length} 条消息, ~${s} tokens`),o}function fi(e,t){return e.role===`user`?ci(e)>J(t):!1}function pi(e){return{summarizeMessages:[{role:`system`,content:mi},{role:`user`,content:e.content}]}}const mi=`你是一个文档压缩助手。用户将发送一段很长的文本(可能包含提问/指令 + 超长文档内容)。
4
+ `:``)+r.content;break;case`user`:n.push({role:`user`,content:[{type:`text`,text:r.content||``}]});break;case`assistant`:if(r.toolCalls?.length){let e=[];r.content&&e.push({type:`text`,text:r.content});for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:Tt(t.arguments,{protocol:this.name,toolCallId:t.id,toolName:t.name})});n.push({role:`assistant`,content:e})}else n.push({role:`assistant`,content:[{type:`text`,text:r.content||``}]});break;case`tool`:n.push({role:`user`,content:[{type:`tool_result`,tool_use_id:r.toolCallId,content:r.content}]});break}return{systemPrompt:t,convertedMessages:n}}async*parseAnthropicSSE(e){let t=!1,n=!1,r=new Map,i=0,a=0;for await(let o of B(e))switch(o.type){case`message_start`:{let e=o.message?.usage;e?.input_tokens&&(i=e.input_tokens);break}case`content_block_start`:{let e=o.content_block;if(e?.type===`tool_use`){e.id||Et.warn({index:o.index},`content_block_start tool_use 缺少 id`),e.name||Et.warn({index:o.index,id:e.id},`content_block_start tool_use 缺少 name`);let t=o.index??r.size,n=e.id||`call_${t}`,i=e.name||``;r.set(t,{id:n,name:i,arguments:``,jsonBuffer:``}),yield{type:`tool_call_start`,toolCall:{id:n,name:i}}}break}case`content_block_delta`:{let e=o.delta;if(!e)break;if(e.type===`thinking_delta`&&e.thinking)n||(t=!0,yield{type:`thinking_delta`,delta:e.thinking});else if(e.type===`text_delta`&&e.text)t&&!n&&(n=!0,yield{type:`thinking_done`}),yield{type:`text_delta`,delta:e.text};else if(e.type===`input_json_delta`&&e.partial_json!==void 0){let t=o.index,n=r.get(t);n&&(n.jsonBuffer+=e.partial_json)}break}case`content_block_stop`:{let e=o.index,t=r.get(e);t&&(t.arguments=t.jsonBuffer,yield{type:`tool_call_done`,toolCall:{id:t.id,name:t.name,arguments:t.arguments}});break}case`message_delta`:{let e=o.usage;e?.output_tokens&&(a=e.output_tokens);break}case`message_stop`:{let e=r.size>0,o={promptTokens:i,completionTokens:a,totalTokens:i+a};t&&!n&&(n=!0,yield{type:`thinking_done`}),yield{type:`done`,finishReason:e?`tool_calls`:`stop`,usage:o};return}}t&&!n&&(yield{type:`thinking_done`}),yield{type:`done`,finishReason:r.size>0?`tool_calls`:`stop`,usage:{promptTokens:i,completionTokens:a,totalTokens:i+a}}}};function Ot(e){return new Dt(e)}const kt=R(`VercelGateway`);function At(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images){let n=t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`;e.push({type:`file`,data:n,mediaType:`image/jpeg`})}t.push({role:`user`,content:e});break}case`assistant`:{let e=[];if(n.thinkingContent){let t={type:`reasoning`,text:n.thinkingContent};n.toolCalls?.[0]?.thoughtSignature&&(t.providerOptions={google:{thoughtSignature:n.toolCalls[0].thoughtSignature},vertex:{thoughtSignature:n.toolCalls[0].thoughtSignature}}),e.push(t)}if(n.toolCalls?.length){n.content&&e.push({type:`text`,text:n.content});for(let t of n.toolCalls){let n={type:`tool-call`,toolCallId:t.id,toolName:t.name,input:Tt(t.arguments,{protocol:`vercel-gateway`,toolCallId:t.id,toolName:t.name})};t.thoughtSignature&&(n.providerOptions={google:{thoughtSignature:t.thoughtSignature},vertex:{thoughtSignature:t.thoughtSignature}}),e.push(n)}}else e.push({type:`text`,text:n.content||``});t.push({role:`assistant`,content:e});break}case`tool`:t.push({role:`tool`,content:[{type:`tool-result`,toolCallId:n.toolCallId||``,toolName:n.toolName||`unknown`,output:jt(n.content)}]});break}return t}function jt(e){try{return{type:`json`,value:JSON.parse(e)}}catch{return{type:`text`,value:e}}}function Mt(e){if(e.length!==0)return e.map(e=>({type:`function`,name:e.name,description:e.description,inputSchema:e.parameters}))}function Nt(e,t){if(e.startsWith(`google/`))return t?{google:{thinkingConfig:{thinkingLevel:`high`,includeThoughts:!0}}}:void 0;if(e.startsWith(`openai/`))return{openai:{reasoningEffort:t?`high`:`low`,reasoningSummary:t?`detailed`:`auto`}};if(e.startsWith(`anthropic/`))return t?{anthropic:{thinking:{type:`enabled`,budgetTokens:1e4}}}:void 0}function Pt(e,t,n){let r={prompt:At(e)};r.maxOutputTokens=n.maxOutputTokens;let i=Nt(n.model,n.enableThinking);i&&(r.providerOptions=i);let a=Mt(t);return a&&(r.tools=a),r}async function*Ft(e){let t=!1,n=new Map;for await(let r of B(e))switch(r.type){case`reasoning-delta`:{let e=r.delta;e&&(yield{type:`thinking_delta`,delta:e});break}case`reasoning-end`:yield{type:`thinking_done`};break;case`text-delta`:{let e=r.delta;e&&(yield{type:`text_delta`,delta:e});break}case`tool-input-start`:{t=!0;let e=r.id,i=r.toolName,a=It(r);n.set(e,{name:i,args:``,thoughtSignature:a}),yield{type:`tool_call_start`,toolCall:{id:e,name:i}};break}case`tool-input-delta`:{let e=r.id,t=r.delta;if(e&&t){let r=n.get(e);r&&(r.args+=t),yield{type:`tool_call_delta`,toolCall:{id:e,arguments:t}}}break}case`tool-call`:{let e=r.toolCallId,t=r.toolName,i=r.input??`{}`,a=n.get(e),o=It(r)||a?.thoughtSignature;yield{type:`tool_call_done`,toolCall:{id:e,name:t||a?.name||``,arguments:i||a?.args||`{}`,...o?{thoughtSignature:o}:{}}},n.delete(e);break}case`finish`:{let e=r.usage,n;if(e){let t=e.inputTokens,r=e.outputTokens;n={promptTokens:t?.total??0,completionTokens:r?.total??0,totalTokens:(t?.total??0)+(r?.total??0),reasoningTokens:r?.reasoning??0,cachedTokens:t?.cacheRead??0}}let i=r.finishReason?.unified??`stop`;yield{type:`done`,finishReason:t||i===`tool-calls`?`tool_calls`:i===`length`?`length`:i===`error`?`error`:`stop`,usage:n};return}case`error`:{let e=r.error;yield{type:`error`,error:typeof e==`string`?e:JSON.stringify(e)};break}}yield{type:`done`,finishReason:t?`tool_calls`:`stop`}}function It(e){let t=e.providerMetadata,n=t?.vertex?.thoughtSignature??t?.google?.thoughtSignature;return typeof n==`string`?n:void 0}var Lt=class{name=`vercel_gateway`;apiKey;constructor(e){this.apiKey=e.apiKey}async*stream(e,t,n){let r=Pt(e,t,n);kt.debug({model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Vercel Gateway V3 请求`);let i=await fetch(`https://ai-gateway.vercel.sh/v3/ai/language-model`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.apiKey}`,"ai-gateway-protocol-version":`0.0.1`,"ai-gateway-auth-method":`api-key`,"ai-language-model-specification-version":`3`,"ai-language-model-id":n.model,"ai-language-model-streaming":`true`},body:JSON.stringify(r),signal:n.signal});if(!i.ok){let e=await i.text();kt.error({status:i.status,body:e.slice(0,500)},`Vercel Gateway 错误`),yield{type:`error`,error:z(i.status,e,`Vercel Gateway`)};return}let a=i.body?.getReader();if(!a){yield{type:`error`,error:`无法获取响应流`};return}yield*Ft(a)}};function Rt(e){return new Lt(e)}const zt=R(`AnthropicProtocol`);var Bt=class{name=`anthropic`;apiKey;apiUrl;headers;isDirect;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{},this.isDirect=this.apiUrl.includes(`api.anthropic.com`)}async*stream(e,t,n){let{systemPrompt:r,convertedMessages:i}=Ht(e),a=Vt(r,i,t,n),o=this.apiUrl;zt.debug({url:o,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 Anthropic 请求`);let s={...this.headers,"Content-Type":`application/json`,"anthropic-version":`2023-06-01`};this.isDirect?s[`x-api-key`]=this.apiKey:s.Authorization=`Bearer ${this.apiKey}`;let c=await fetch(o,{method:`POST`,headers:s,body:JSON.stringify(a),signal:n.signal});if(!c.ok){let e=await c.text();zt.error({status:c.status,body:e.slice(0,500)},`Anthropic API 错误`),yield{type:`error`,error:z(c.status,e,`Anthropic`)};return}let l=c.body?.getReader();if(!l){yield{type:`error`,error:`无法获取响应流`};return}yield*Ut(l)}};function Vt(e,t,n,r){let i=r.maxOutputTokens,a={model:r.model,messages:t,max_tokens:i,stream:!0};return e&&(a.system=e),r.enableThinking&&(r.model.includes(`opus-4-6`)||r.model.includes(`opus-4.6`)?a.thinking={type:`adaptive`}:a.thinking={type:`enabled`,budget_tokens:Math.min(1e4,i-1)}),n.length>0&&(a.tools=n.map(e=>({name:e.name,description:e.description,input_schema:e.parameters}))),a}function Ht(e){let t,n=[];for(let r of e)switch(r.role){case`system`:t=r.content;break;case`user`:{let e=r.content||(r.images?.length?`请分析这张图片`:``);if(r.images?.length){let t=[{type:`text`,text:e}];for(let e of r.images){let n=e.startsWith(`data:`)?e.replace(/^data:image\/\w+;base64,/,``):e;t.push({type:`image`,source:{type:`base64`,media_type:`image/jpeg`,data:n}})}n.push({role:`user`,content:t})}else n.push({role:`user`,content:e});break}case`assistant`:if(r.toolCalls?.length){let e=[];r.thinkingContent&&e.push({type:`thinking`,thinking:r.thinkingContent,signature:r.thinkingSignature||``}),r.content&&e.push({type:`text`,text:r.content});for(let t of r.toolCalls)e.push({type:`tool_use`,id:t.id,name:t.name,input:Tt(t.arguments,{protocol:`anthropic`,toolCallId:t.id,toolName:t.name})});n.push({role:`assistant`,content:e})}else r.content&&n.push({role:`assistant`,content:r.content});break;case`tool`:n.push({role:`user`,content:[{type:`tool_result`,tool_use_id:r.toolCallId,content:r.content}]});break}return{systemPrompt:t,convertedMessages:n}}async function*Ut(e){let t=``,n=new Map,r=``,i=!1,a=``,o;for await(let s of B(e))switch(s.type){case`message_start`:{let e=s.message?.usage;e&&(o={promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:(e.input_tokens??0)+(e.output_tokens??0),cachedTokens:(e.cache_read_input_tokens??0)+(e.cache_creation_input_tokens??0)});break}case`content_block_start`:{let e=s.content_block;if(!e)break;switch(e.type){case`thinking`:t=`thinking`;break;case`text`:t=`text`;break;case`tool_use`:{t=`tool_use`;let i=e.id,a=e.name;r=i,n.set(i,{id:i,name:a,arguments:``}),yield{type:`tool_call_start`,toolCall:{id:i,name:a}};break}}break}case`content_block_delta`:{let e=s.delta;if(!e)break;switch(e.type){case`thinking_delta`:e.thinking&&(i=!0,yield{type:`thinking_delta`,delta:e.thinking});break;case`signature_delta`:e.signature&&(a=e.signature);break;case`text_delta`:e.text&&(yield{type:`text_delta`,delta:e.text});break;case`input_json_delta`:if(r&&e.partial_json){let t=n.get(r);t&&(t.arguments+=e.partial_json,yield{type:`tool_call_delta`,toolCall:{id:r,arguments:e.partial_json}})}break}break}case`content_block_stop`:if(t===`thinking`&&i)yield{type:`thinking_done`,thinkingSignature:a};else if(t===`tool_use`&&r){let e=n.get(r);e&&(yield{type:`tool_call_done`,toolCall:e}),r=``}t=``;break;case`message_delta`:{let e=s.delta,t=s.usage;if(t){let e=o?.promptTokens??0,n=t.output_tokens??o?.completionTokens??0,r=(t.cache_read_input_tokens??0)+(t.cache_creation_input_tokens??0);o={promptTokens:e,completionTokens:n,totalTokens:e+n,cachedTokens:r||o?.cachedTokens}}let n=e?.stop_reason;if(n){yield{type:`done`,finishReason:n===`tool_use`?`tool_calls`:n===`max_tokens`?`length`:`stop`,usage:o};return}break}case`message_stop`:yield{type:`done`,finishReason:n.size>0?`tool_calls`:`stop`,usage:o};return;case`error`:{let e=s.error?.message||JSON.stringify(s);zt.error({error:e},`Anthropic SSE error`),yield{type:`error`,error:e};return}}yield{type:`done`,finishReason:n.size>0?`tool_calls`:`stop`,usage:o}}function Wt(e){return new Bt(e)}const Gt=R(`GeminiProtocol`);function Kt(e,t,n){let r=e.replace(/\{model\}/g,t);!r.includes(`:streamGenerateContent`)&&!r.includes(`:generateContent`)?r=`${r.replace(/\/$/,``)}/models/${t}:streamGenerateContent`:r.includes(`:generateContent`)&&!r.includes(`:streamGenerateContent`)&&(r=r.replace(`:generateContent`,`:streamGenerateContent`));let i=r.includes(`googleapis.com`),a=r.includes(`?`)?`&`:`?`;return i?`${r}${a}key=${n}&alt=sse`:`${r}${a}alt=sse`}var qt=class{name=`gemini`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=Jt(e,t,n),i=this.apiUrl.includes(`googleapis.com`),a=Kt(this.apiUrl,n.model,this.apiKey);Gt.debug({url:a.replace(this.apiKey,`***`),model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Gemini 请求`);let o={...this.headers,"Content-Type":`application/json`};i||(o.Authorization=`Bearer ${this.apiKey}`);let s=await fetch(a,{method:`POST`,headers:o,body:JSON.stringify(r),signal:n.signal});if(!s.ok){let e=await s.text();Gt.error({status:s.status,body:e.slice(0,500)},`Gemini API 错误`),yield{type:`error`,error:z(s.status,e,`Gemini`)};return}let c=s.body?.getReader();if(!c){yield{type:`error`,error:`无法获取响应流`};return}yield*Zt(c)}};function Jt(e,t,n){let{systemInstruction:r,contents:i}=Xt(e),a={contents:i,generationConfig:{maxOutputTokens:n.maxOutputTokens}};if(r&&(a.systemInstruction=r),n.enableThinking&&(a.generationConfig.thinkingConfig={thinkingBudget:24576,includeThoughts:!0}),t.length>0){let e=new Map;for(let n of t)e.has(n.name)||e.set(n.name,{name:n.name,description:n.description,parametersJsonSchema:Yt(n.parameters)});a.tools=[{functionDeclarations:Array.from(e.values())}]}return a}function Yt(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(Yt);let t=e,n={};for(let[e,r]of Object.entries(t))e===`$ref`||e===`$defs`||(n[e]=Yt(r));return n}function Xt(e){let t,n=[];for(let r of e)switch(r.role){case`system`:t={parts:[{text:r.content}]};break;case`user`:{let e=!!(r.images?.length||r.attachments?.length),t=[{text:r.content||(e?`请分析这个媒体文件`:``)}];if(r.images?.length)for(let e of r.images)if(e.startsWith(`data:`)){let n=e.match(/^data:([^;]+);base64,(.+)$/);n&&t.push({inlineData:{mimeType:n[1],data:n[2]}})}else t.push({inlineData:{mimeType:`image/jpeg`,data:e}});if(r.attachments?.length)for(let e of r.attachments)t.push({fileData:{mimeType:e.mimeType,fileUri:e.fileUri}});n.push({role:`user`,parts:t});break}case`assistant`:if(r.toolCalls?.length){let e=[];for(let t of r.toolCalls){let n={functionCall:{name:t.name,args:Tt(t.arguments,{protocol:`gemini`,toolCallId:t.id,toolName:t.name})}};n.thoughtSignature=t.thoughtSignature??`skip_thought_signature_validator`,e.push(n)}n.push({role:`model`,parts:e})}else n.push({role:`model`,parts:[{text:r.content}]});break;case`tool`:n.push({role:`user`,parts:[{functionResponse:{name:r.toolName||`unknown`,response:{result:r.content}}}]});break}return{systemInstruction:t,contents:n}}async function*Zt(e){let t=new Map,n=[],r=!1,i=0;for await(let a of B(e)){let e=a.candidates?.[0],o=e?.content?.parts;if(o){for(let e of o){if(e.text&&e.thought===!0){yield{type:`thinking_delta`,delta:e.text};continue}if(e.text&&(n.push({type:`text`,text:e.text}),r||(r=!0,yield{type:`thinking_done`}),yield{type:`text_delta`,delta:e.text}),e.inlineData){let t=e.inlineData,r=t.mimeType,i=t.data;typeof r==`string`&&typeof i==`string`&&n.push({type:`inline_data`,mimeType:r,data:i})}if(e.functionCall){let n=e.functionCall,r=`gemini-${i++}`,a={id:r,name:n.name,arguments:JSON.stringify(n.args||{})};e.thoughtSignature&&(a.thoughtSignature=e.thoughtSignature),t.set(r,a),yield{type:`tool_call_start`,toolCall:{id:r,name:a.name}},yield{type:`tool_call_done`,toolCall:a}}}if(e?.finishReason){let e=a.usageMetadata,r=e?{promptTokens:e.promptTokenCount??0,completionTokens:e.candidatesTokenCount??0,totalTokens:e.totalTokenCount??0,reasoningTokens:e.thoughtsTokenCount??0,cachedTokens:e.cachedContentTokenCount??0}:void 0;yield{type:`done`,finishReason:t.size>0?`tool_calls`:`stop`,usage:r,outputParts:n};return}}}yield{type:`done`,finishReason:t.size>0?`tool_calls`:`stop`,outputParts:n}}function Qt(e){return new qt(e)}function $t(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=[{type:`input_text`,text:n.content||(n.images?.length?`请分析这张图片`:``)}];if(n.images?.length)for(let t of n.images)e.push({type:`input_image`,image_url:t.startsWith(`data:`)?t:`data:image/jpeg;base64,${t}`});t.push({role:`user`,content:e});break}case`assistant`:if(n.toolCalls?.length){n.content&&t.push({type:`message`,role:`assistant`,content:[{type:`output_text`,text:n.content}]});for(let e of n.toolCalls)t.push({type:`function_call`,call_id:e.id,name:e.name,arguments:e.arguments})}else t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({type:`function_call_output`,call_id:n.toolCallId,output:n.content});break}return t}function en(e){return e.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters}))}async function*tn(e,t){let n=new Map,r=null,i=!1,a=!1,o=!1,s;for await(let c of B(e)){let e=c.response?.usage??c.usage;if(e){let t=e,n=t.input_tokens??0,r=t.output_tokens??0,i=t.output_tokens_details,a=t.input_tokens_details;s={promptTokens:n,completionTokens:r,totalTokens:t.total_tokens??n+r,reasoningTokens:i?.reasoning_tokens??0,cachedTokens:a?.cached_tokens??0}}switch(c.type){case`response.output_item.added`:{let e=c.item;if(!e)break;if(e.type===`function_call`&&e.call_id){r=e.call_id;let t=e.name||``;n.set(r,{id:r,name:t,arguments:e.arguments||``}),yield{type:`tool_call_start`,toolCall:{id:r,name:t}}}e.type===`reasoning`&&(i=!0);break}case`response.function_call_arguments.delta`:if(r){let e=n.get(r);e&&(e.arguments+=c.delta||``,yield{type:`tool_call_delta`,toolCall:{id:r,arguments:c.delta||``}})}break;case`response.function_call_arguments.done`:case`response.output_item.done`:{let e=c.item;if(e?.type===`function_call`&&e.call_id){let t=e.call_id,r=n.get(t);n.set(t,{id:t,name:e.name||r?.name||``,arguments:e.arguments||r?.arguments||`{}`})}break}case`response.output_text.delta`:c.delta&&(o||(o=!0,i&&!a&&(a=!0,yield{type:`thinking_done`})),yield{type:`text_delta`,delta:c.delta});break;case`response.reasoning_summary_text.delta`:c.delta&&!a&&(yield{type:`thinking_delta`,delta:c.delta});break;case`response.failed`:yield{type:`error`,error:c.response?.error?.message||`${t.protocolName} Responses API 失败`};break}}if(n.size>0){for(let e of n.values())yield{type:`tool_call_done`,toolCall:e};yield{type:`done`,finishReason:`tool_calls`,usage:s}}else yield{type:`done`,finishReason:`stop`,usage:s}}const nn=R(`OpenAIProtocol`);var rn=class{name=`openai`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r={model:n.model,input:$t(e),stream:!0,max_output_tokens:n.maxOutputTokens,store:!1};n.enableThinking&&(r.reasoning={effort:`high`}),t.length>0&&(r.tools=en(t));let i=this.apiUrl;nn.debug({url:i.replace(this.apiKey,`***`),model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`OpenAI Responses 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();nn.error({status:a.status,body:e.slice(0,500)},`OpenAI API 错误`),yield{type:`error`,error:z(a.status,e,`OpenAI`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*tn(o,{protocolName:`OpenAI`})}};function an(e){return new rn(e)}const on=R(`OpenAIChatProtocol`);var sn=class{name=`openai-chat`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r=this.buildRequestBody(e,t,n),i=this.apiUrl;on.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`发送 OpenAI Chat 兼容请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();on.error({status:a.status,body:e.slice(0,500)},`OpenAI Chat 兼容 API 错误`),yield{type:`error`,error:z(a.status,e,`OpenAI Chat`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*nt(B(o),{protocolName:`OpenAI Chat`})}buildRequestBody(e,t,n){let r={model:n.model,messages:this.convertMessages(e),stream:!0,stream_options:{include_usage:!0},max_tokens:n.maxOutputTokens};return t.length>0&&(r.tools=t.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))),r}convertMessages(e){let t=[];for(let n of e)switch(n.role){case`system`:t.push({role:`system`,content:n.content});break;case`user`:{let e=n.content||(n.images?.length?`请分析这张图片`:``);if(n.images?.length){let r=[{type:`text`,text:e}];for(let e of n.images)r.push({type:`image_url`,image_url:{url:e.startsWith(`data:`)?e:`data:image/jpeg;base64,${e}`}});t.push({role:`user`,content:r})}else t.push({role:`user`,content:e});break}case`assistant`:n.toolCalls?.length?t.push({role:`assistant`,content:n.content||null,tool_calls:n.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.name,arguments:e.arguments}}))}):t.push({role:`assistant`,content:n.content});break;case`tool`:t.push({role:`tool`,tool_call_id:n.toolCallId,content:n.content});break}return t}};function cn(e){return new sn(e)}const ln=R(`GrokProtocol`);var un=class{name=`grok`;apiKey;apiUrl;headers;constructor(e){this.apiKey=e.apiKey,this.apiUrl=e.apiUrl,this.headers=e.headers??{}}async*stream(e,t,n){let r={model:n.model,input:$t(e),stream:!0,max_output_tokens:n.maxOutputTokens,store:!1};n.enableThinking&&(r.reasoning={effort:`high`}),t.length>0&&(r.tools=en(t));let i=this.apiUrl;ln.debug({url:i,model:n.model,enableThinking:n.enableThinking,toolsCount:t.length},`Grok Responses 请求`);let a=await fetch(i,{method:`POST`,headers:{...this.headers,Authorization:`Bearer ${this.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(r),signal:n.signal});if(!a.ok){let e=await a.text();ln.error({status:a.status,body:e.slice(0,500)},`Grok API 错误`),yield{type:`error`,error:z(a.status,e,`Grok`)};return}let o=a.body?.getReader();if(!o){yield{type:`error`,error:`无法获取响应流`};return}yield*tn(o,{protocolName:`Grok`})}};function dn(e){return new un(e)}const fn=new Set(Be),pn={ark_v1:$e,deepseek_v1:ot,qwen_v1:mt,qwen_text_v1:ht,glm_v1:yt,moonshot_v1:Ct,minimax_v1:Ot,vercel_gateway_v1:Rt,anthropic_v1:Wt,gemini_v1:Qt,openai_v1:an,openai_chat_v1:cn,grok_v1:dn};function mn(){return pn}function hn(e){return fn.has(e)}const gn={id:`doubao`,displayName:`Doubao`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning`,toolCallFormat:`responses`},_n={id:`deepseek`,displayName:`DeepSeek`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`thinking_object`,toolCallFormat:`openai`},vn={id:`qwen`,displayName:`Qwen`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`thinking_enabled`,toolCallFormat:`openai`},yn={id:`glm`,displayName:`GLM`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`thinking_object`,toolCallFormat:`openai`},bn={id:`moonshot`,displayName:`Kimi`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning_object`,toolCallFormat:`openai`},xn={id:`minimax`,displayName:`MiniMax`,supportsVision:!1,supportsThinking:!0,thinkingFormat:`anthropic_native`,thinkingAlwaysOn:!0,toolCallFormat:`openai`},Sn={id:`gemini`,displayName:`Gemini`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`thought_signature`,toolCallFormat:`gemini`},Cn={id:`gpt`,displayName:`GPT`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`reasoning`,toolCallFormat:`responses`},wn={id:`claude`,displayName:`Claude`,supportsVision:!0,supportsThinking:!0,thinkingFormat:`anthropic_native`,toolCallFormat:`openai`},Tn={doubao:gn,deepseek:_n,qwen:vn,glm:yn,moonshot:bn,minimax:xn,gemini:Sn,gpt:Cn,claude:wn,grok:{id:`grok`,displayName:`Grok`,supportsVision:!0,supportsThinking:!1,thinkingFormat:`none`,toolCallFormat:`openai`}};function V(e,t,n){let{family:r}=t;if(typeof r==`object`)return r;let i=r;return n.families?.[i]??Tn[i]}const En=R(`ModelAdapter`),Dn=mn();var On=class{name=`model`;llmConfig;protocolFactories;constructor(e){this.llmConfig=e,this.protocolFactories=e.protocols?{...Dn,...e.protocols}:Dn,this.validateModels()}validateModels(){let e=[];for(let[t,n]of Object.entries(this.llmConfig.models))n&&(V(t,n,this.llmConfig)||e.push(`模型 ${t}: family "${String(n.family)}" 无法解析,请检查是否在 MODEL_FAMILIES 或 LLMConfig.families 中定义`),(!n.maxOutputTokens||n.maxOutputTokens<=0)&&e.push(`模型 ${t}: maxOutputTokens 未指定或无效,请为每个模型显式配置`),(!n.contextWindowTokens||n.contextWindowTokens<=0)&&e.push(`模型 ${t}: contextWindowTokens 未指定或无效,压缩器依赖此值`),n.endpoint?this.protocolFactories[n.endpoint.protocol]||e.push(`模型 ${t}: 协议 "${n.endpoint.protocol}" 未注册,请检查是否在内置协议或 LLMConfig.protocols 中定义`):e.push(`模型 ${t}: endpoint 未配置`));if(e.length>0)throw Error(`LLMConfig 校验失败:\n${e.join(`
5
+ `)}`)}resolveRuntimeValue(e){return typeof e==`function`?e()??``:e??``}resolveHeaders(e){if(!e)return;let t={};for(let[n,r]of Object.entries(e)){let e=this.resolveRuntimeValue(r);e&&(t[n]=e)}return t}createProtocolForEndpoint(e){let t=Le(e),n=this.resolveRuntimeValue(e.vendorKey??e.accessKey),r=this.protocolFactories[e.protocol];if(!r)throw Error(`未知协议: ${e.protocol},请在 LLMConfig.protocols 中注册`);return r({apiKey:n,apiUrl:t,headers:this.resolveHeaders(e.headers)})}get supportedModels(){return Object.keys(this.llmConfig.models)}supportsModel(e){return Re(this.llmConfig,e)!==void 0}getModelFamilyConfig(e){let t=this.llmConfig.models[e];if(t)return V(e,t,this.llmConfig)}async*streamOnce(e,t,n){let r=e.filter(e=>!(e.role===`assistant`&&!e.content&&!e.toolCalls?.length));yield*this.streamModelEndpoint(r,t,n)}async*streamModelEndpoint(e,t,n){let{model:r}=n,i=this.llmConfig.models[r];if(!i){yield{type:`error`,error:`模型 ${r} 未在 LLMConfig.models 中配置`};return}let a=V(r,i,this.llmConfig);if(!a){yield{type:`error`,error:`模型 ${r} 无法解析家族配置,请在 ModelConfig.family 或 LLMConfig.families 中指定`};return}let o=Re(this.llmConfig,r);if(!o){yield{type:`error`,error:`模型 ${r} 未配置 endpoint`};return}try{let s=this.createProtocolForEndpoint(o);En.info({model:r,protocol:o.protocol,providerModelId:o.providerModelId},`请求 LLM`);for await(let r of s.stream(e,t,{model:o.providerModelId,familyConfig:a,maxOutputTokens:i.maxOutputTokens,enableThinking:n.enableThinking??!1,signal:n.signal}))yield r}catch(e){yield{type:`error`,error:e instanceof Error?e.message:String(e)}}}};function kn(e){if(e>=1e6&&e%1e6==0)return`${e/1e6}M`;if(e>=1e6){let t=e/1e6;return Number.isInteger(t)?`${t}M`:`${parseFloat(t.toFixed(1))}M`}let t=e/1e3;return Number.isInteger(t)?`${t}K`:`${parseFloat(t.toFixed(1))}K`}function An(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n.trim():void 0}function jn(e){let t=An(e,`profileKind`);if(t===`provider_api_key`||t===`vendor_api_key`)return`原厂 API Key`;if(t===`compatible_gateway`||t===`model_proxy`)return`模型代理服务`;let n=An(e,`source`);if(n===`huyooo-official`||n===`official`)return`官方服务`;if(n===`vendor-api-key`||n===`provider_api_key`||n===`user-profile`)return`原厂 API Key`;if(n===`model-proxy`||n===`compatible_gateway`)return`模型代理服务`;if(n===`coding-plan`)return`Coding Plan`}function Mn(e){let t=jn(e);return t?`配置来源:${t}`:void 0}function Nn(e){let t=[];for(let[n,r]of Object.entries(e.models)){if(!r||r.visible===!1)continue;let i=V(n,r,e),a=r.displayName??n,o=r.supportsThinking,s=r.supportsVision,c=i?.thinkingAlwaysOn??!1,l=[];s&&l.push(`多模态`),o&&l.push(c?`深度思考(始终开启)`:`深度思考`),r.contextWindowTokens&&l.push(`长上下文(${kn(r.contextWindowTokens)})`);let u=Mn(r.metadata);t.push({modelId:n,displayName:a,supportsThinking:o,thinkingAlwaysOn:c,supportsVision:s,contextWindowTokens:r.contextWindowTokens,maxOutputTokens:r.maxOutputTokens,tooltip:{features:l.length>0?l:void 0,description:u}})}return t}function Pn(e,t){let n=t.models[e];if(n)return{contextWindowTokens:n.contextWindowTokens,maxOutputTokens:n.maxOutputTokens}}function Fn(e){return e.replace(/[^a-zA-Z0-9_]/g,`_`)}function In(e,t,n){let r=!!e.assetId,i=Fn(e.assetId??e.name),a=Fn(e.name),o=e.alias??(r?`${i}__${a}`:i);return{id:e.id??(r?`${n}:${i}:${a}`:`${n}:${i}`),assetId:i,alias:o}}function Ln(e,t,n,r){let i=In(e,t,n);return{id:i.id,assetId:i.assetId,name:e.name,alias:i.alias,displayName:e.displayName??e.name,description:e.description,parameters:e.parameters,outputSchema:e.outputSchema,resolvedOutputSchema:e.resolvedOutputSchema??(e.outputSchema?te(e.outputSchema):void 0),errorSchema:e.errorSchema??O,category:r?.category??e.category??`general`,tags:r?.tags??e.tags??[],source:n,provider:t,ui:e.ui,requiresApproval:e.requiresApproval,approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}}function Rn(e,t){return e.id===t||e.alias===t||(!e.assetId||e.assetId===e.name?e.assetId===t:!1)}function zn(e){return e.id??(e.assetId?`${e.assetId}:${e.name}`:e.name)}function Bn(e,t){return{...e,id:t.id,assetId:t.assetId,alias:t.alias,displayName:t.displayName,name:t.alias}}function Vn(e,t=`bundled`){let n=new Map,r=new Set,i=[];function a(e){for(let t of r)t(e)}function o(t){return Ln(t.tool,e,t.source,{category:t.category,tags:t.tags})}function s(e){return o(e).id}function c(e){for(let t of n.values())if(Rn(o(t),e))return t}function l(e){for(let t of n.entries())if(Rn(o(t[1]),e))return t}function u(){i=Array.from(n.values()).map(o)}return{id:e,source:t,async init(){},async destroy(){n.clear(),i=[],r.clear()},getDescriptors(){return i.slice()},async loadTool(e){return c(e)?.tool??null},addChangeListener(e){r.add(e)},removeChangeListener(e){r.delete(e)},register(r,i){let c={tool:r,source:i?.source??t,category:i?.category,tags:i?.tags};n.set(s(c),c),u(),a({type:`added`,tools:[o(c)],provider:e})},registerAll(r,i){let c=[];for(let e of r){let r={tool:e,source:i?.source??t,category:i?.category,tags:i?.tags};n.set(s(r),r),c.push(o(r))}u(),c.length>0&&a({type:`added`,tools:c,provider:e})},unregister(t){let r=l(t);if(!r)return;let[i,s]=r;n.delete(i),u(),a({type:`removed`,tools:[o(s)],provider:e})},replace(r,i){let c=l(r.id??r.alias??r.name),d=c?.[1],f={tool:r,source:i?.source??d?.source??t,category:i?.category??d?.category,tags:i?.tags??d?.tags};c&&n.delete(c[0]),n.set(s(f),f),u(),a({type:`updated`,tools:[o(f)],provider:e})},has(e){return!!c(e)}}}const H=R(`MCP`);function U(e){return typeof e==`object`&&!!e}function Hn(e){let t=[];if(Array.isArray(e))for(let n of e)U(n)&&(n.type===`text`&&typeof n.text==`string`?t.push(n.text):n.type===`image`?t.push(`[image: ${n.mimeType||`unknown`}]`):n.type===`resource`&&t.push(JSON.stringify(n)));return t.join(`
6
+ `)||JSON.stringify(e)}function Un(e){let t={type:typeof e.type==`string`?e.type:`string`};if(typeof e.description==`string`&&(t.description=e.description),Array.isArray(e.enum)&&(t.enum=e.enum),U(e.items)&&(t.items=Un(e.items)),U(e.properties)){t.properties={};for(let[n,r]of Object.entries(e.properties))U(r)&&(t.properties[n]=Un(r))}return Array.isArray(e.required)&&(t.required=e.required.filter(e=>typeof e==`string`)),t}function Wn(e){let t={},n=[];if(U(e.properties))for(let[n,r]of Object.entries(e.properties))U(r)&&(t[n]=Un(r));return Array.isArray(e.required)&&n.push(...e.required.filter(e=>typeof e==`string`)),{type:`object`,properties:t,required:n.length>0?n:void 0}}function Gn(e){let{name:t,source:n}=e,r=n??`bundled`,i=null,a=null,o=`disconnected`,s,f,p=0,m=!1,h=null,g=e.transport===`streamableHttp`?e.sessionId:void 0,_=new Map,v=new Set,y=new Set,b=[];function x(e){for(let t of v)t(e)}function S(){let e={provider:t,status:o,error:s};for(let t of y)t(e)}function C(){b=Array.from(_.values()).map(w)}function w(e){return Ln(e,t,r,{category:`mcp`})}function T(e,n){let r=Wn(e.inputSchema);return{name:e.name,assetId:t,description:e.description||`MCP tool from ${t}`,parameters:r,execute:async t=>{let r=await n.callTool({name:e.name,arguments:t}),i=Hn(r.content);return r.isError&&D({message:i,code:`OPERATION_FAILED`,retryable:!0}),{text:i,_summary:i}}}}function E(e){if(!i||o!==`connected`)return;let n=new Set(_.keys()),r=new Set(e.map(e=>e.name)),a=[...n].filter(e=>!r.has(e)),s=[];for(let e of a){let t=_.get(e);t&&s.push(w(t)),_.delete(e)}let c=[];for(let t of e){let e=T(t,i);_.set(e.name,e),n.has(e.name)||c.push(w(e))}C(),H.info({serverName:t,added:c.map(e=>e.name),removed:a},`[${t}] 工具列表已更新: +${c.length} -${a.length}`),s.length>0&&x({type:`removed`,tools:s,provider:t}),c.length>0&&x({type:`added`,tools:c,provider:t})}function O(){h&&=(clearTimeout(h),null)}function k(){if(m||!(e.transport===`streamableHttp`?e.reconnect?.enabled!==!1:e.reconnect?.enabled===!0))return;let n=e.reconnect?.maxRetries??5,r=e.reconnect?.initialDelayMs??1e3,i=e.reconnect?.maxDelayMs??3e4;if(p>=n){o=`error`,s=`重连失败(已尝试 ${n} 次)`,S(),H.error({name:t,attempts:n},`[${t}] 重连次数耗尽`);return}let a=Math.min(r*2**p,i),c=Math.random()*.3*a,l=Math.round(a+c);p++,H.info({name:t,attempt:p,delay:l},`[${t}] ${l}ms 后重连 (${p}/${n})`),h=setTimeout(async()=>{try{await j.reconnect(),p=0,H.info({name:t},`[${t}] 重连成功`)}catch{k()}},l)}function A(){m||(o=`disconnected`,s=`连接意外断开`,S(),H.warn({name:t},`[${t}] 连接意外断开`),k())}let j={id:t,source:r,async init(){O(),H.info({name:t},`[${t}] 正在连接...`),o=`connecting`,S();let n=new c({name:`ai-chat-mcp-client`,version:`1.0.0`},{listChanged:{tools:{debounceMs:300,onChanged:(e,n)=>{if(e){H.error({name:t,error:e},`[${t}] 工具列表刷新失败`);return}E(n??[])}}}}),r;if(e.transport===`stdio`){if(!e.command)throw Error(`[${t}] stdio 模式必须指定 command`);r=new l({command:e.command,args:e.args,env:e.env,cwd:e.cwd})}else if(e.transport===`streamableHttp`){if(!e.url)throw Error(`[${t}] streamableHttp 模式必须指定 url`);r=new d(new URL(e.url),{requestInit:e.headers?{headers:e.headers}:void 0,sessionId:g,reconnectionOptions:e.reconnectionOptions?{initialReconnectionDelay:e.reconnectionOptions.initialReconnectionDelay??1e3,maxReconnectionDelay:e.reconnectionOptions.maxReconnectionDelay??3e4,reconnectionDelayGrowFactor:e.reconnectionOptions.reconnectionDelayGrowFactor??1.5,maxRetries:e.reconnectionOptions.maxRetries??2}:void 0})}else if(e.transport===`sse`){if(!e.url)throw Error(`[${t}] sse 模式必须指定 url`);H.warn({name:t},`[${t}] SSEClientTransport 已被 SDK 标记 deprecated,建议迁移到 streamableHttp`),r=new u(new URL(e.url),e.headers?{requestInit:{headers:e.headers}}:void 0)}else throw Error(`[${t}] 不支持的传输方式`);try{await n.connect(r),n.onclose=A,i=n,a=r,o=`connected`,f=Date.now(),s=void 0,r instanceof d&&(g=r.sessionId),S(),H.info({name:t},`[${t}] 已连接`);let{tools:e}=await n.listTools(),c=[];for(let t of e){let e=T(t,n);_.set(e.name,e),c.push(w(e))}C(),H.info({name:t,toolCount:_.size,toolNames:[..._.keys()]},`[${t}] 发现 ${_.size} 个工具`),c.length>0&&x({type:`added`,tools:c,provider:t})}catch(e){throw o=`error`,s=e instanceof Error?e.message:String(e),S(),H.error({name:t,error:s},`[${t}] 连接失败`),e}},async destroy(){O(),m=!0;let e=b.slice();if(a instanceof d)try{await a.terminateSession()}catch{}if(i)try{await i.close(),H.info({name:t},`[${t}] 已断开`)}catch(e){H.error({name:t,error:e},`[${t}] 断开失败`)}i=null,a=null,o=`disconnected`,_.clear(),b=[],e.length>0&&x({type:`removed`,tools:e,provider:t}),v.clear(),y.clear(),m=!1},async reconnect(){O(),new Set(_.keys());let e=b.slice();if(m=!0,i)try{await i.close()}catch{}i=null,a=null,m=!1,_.clear(),b=[],e.length>0&&x({type:`removed`,tools:e,provider:t,reconnecting:!0}),await j.init()},getDescriptors(){return b.slice()},async loadTool(e){for(let t of _.values())if(Rn(w(t),e))return t;return null},addChangeListener(e){v.add(e)},removeChangeListener(e){v.delete(e)},addConnectionStatusListener(e){y.add(e)},removeConnectionStatusListener(e){y.delete(e)},getStatus(){return o},getError(){return s},getConfig(){return e},getConnectionInfo(){return{name:t,status:o,toolCount:_.size,error:s,lastConnectedAt:f,reconnectAttempts:p}}};return j}const W={email:`email`,uuidAny:`uuid-any`,cuid:`cuid`,cuid2:`cuid2`,ulid:`ulid`,nanoid:`nanoid`,url:`url`,uri:`uri`,uuid:`uuid`,ipv4:`ipv4`,ipv6:`ipv6`,ip:`ip`,cidr:`cidr`,hostname:`hostname`,date:`date`,time:`time`,dateTime:`date-time`,datetime:`datetime`,duration:`duration`,phone:`phone`,phoneCn:`phone-cn`,phoneE164:`phone-e164`,objectId:`objectid`,slug:`slug`,base64:`base64`,base64url:`base64url`,jwt:`jwt`,hexColor:`hex-color`,rgbColor:`rgb-color`,color:`color`,emoji:`emoji`,semver:`semver`,creditCard:`credit-card`},Kn=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,qn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Jn=/^c[^\s-]{8,}$/i,Yn=/^[0-9a-z]+$/,Xn=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Zn=/^[A-Za-z0-9_-]{21}$/,Qn=/^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,63}\b[-a-zA-Z0-9()@:%_+.~#?&/=]*$/,$n=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,er=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,tr=/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,7}:$|^(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}$|^(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}$|^(?:[0-9a-fA-F]{1,3}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}$|^(?:[0-9a-fA-F]{1,2}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}$/,nr=/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/(?:3[0-2]|[12]?[0-9])$/,rr=/^(?=.{1,253}$)(?:(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)*(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$/,ir=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])$/,ar=/^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\.\d{1,3})?$/,or=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])T(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\.\d{1,3})?(?:Z|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$/,sr=/^P(?:\d+Y)?(?:\d+M)?(?:\d+W)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/,cr=/^1[3-9]\d{9}$/,lr=/^\+[1-9]\d{6,14}$/,ur=/^[0-9a-fA-F]{24}$/,dr=/^#(?:[0-9a-fA-F]{3}){1,2}$/,fr=/^rgba?\(\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\s*,\s*(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\s*,\s*(?:0|1|0?\.\d+))?\s*\)$/,pr=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,mr=/^[A-Za-z0-9_-]+$/,hr=/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/,gr=/^[\p{Emoji}]+$/u,_r=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,vr=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;let yr=!1;function br(e){let t=e.replace(/\D/g,``);if(t.length<13||t.length>19)return!1;let n=0,r=!1;for(let e=t.length-1;e>=0;e--){let i=parseInt(t[e],10);r&&(i*=2,i>9&&(i-=9)),n+=i,r=!r}return n%10==0}function xr(){yr||(yr=!0,e.Set(W.email,e=>Kn.test(e)),e.Set(W.uuidAny,e=>qn.test(e)),e.Set(W.cuid,e=>Jn.test(e)),e.Set(W.cuid2,e=>Yn.test(e)&&e.length>=1),e.Set(W.ulid,e=>Xn.test(e)),e.Set(W.nanoid,e=>Zn.test(e)),e.Set(W.url,e=>Qn.test(e)),e.Set(W.uri,e=>Qn.test(e)),e.Set(W.uuid,e=>$n.test(e)),e.Set(W.ipv4,e=>er.test(e)),e.Set(W.ipv6,e=>tr.test(e)),e.Set(W.ip,e=>er.test(e)||tr.test(e)),e.Set(W.cidr,e=>nr.test(e)),e.Set(W.hostname,e=>rr.test(e)),e.Set(W.date,e=>ir.test(e)),e.Set(W.time,e=>ar.test(e)),e.Set(W.dateTime,e=>or.test(e)),e.Set(W.datetime,e=>or.test(e)),e.Set(W.duration,e=>sr.test(e)),e.Set(W.phone,e=>cr.test(e)),e.Set(W.phoneCn,e=>cr.test(e)),e.Set(W.phoneE164,e=>lr.test(e)),e.Set(W.objectId,e=>ur.test(e)),e.Set(W.slug,e=>_r.test(e)),e.Set(W.base64,e=>pr.test(e)),e.Set(W.base64url,e=>mr.test(e)),e.Set(W.jwt,e=>hr.test(e)),e.Set(W.hexColor,e=>dr.test(e)),e.Set(W.rgbColor,e=>fr.test(e)),e.Set(W.color,e=>dr.test(e)||fr.test(e)),e.Set(W.emoji,e=>gr.test(e)),e.Set(W.semver,e=>vr.test(e)),e.Set(W.creditCard,br))}function Sr(t,n){e.Set(t,n)}function Cr(t){return e.Has(t)}const wr=new WeakMap,Tr=new WeakMap;xr();function Er(e){let t=wr.get(e);return t||(t=f.Compile(e),wr.set(e,t)),t}function Dr(e){return e.replace(/^\//,``).replace(/\//g,`.`)}function Or(e,t){return e?`${e}: ${t}`:t}function kr(e){let t=Tr.get(e);return t||(t=M(e),Tr.set(e,t)),Er(t)}function Ar(e){D({message:`参数校验失败: ${e.length>0?e.join(`; `):`输入不符合工具参数定义`}`,code:`INVALID_PARAMS`,suggestion:`请根据工具的 inputSchema 修正参数类型和结构后重试`,retryable:!0})}function jr(e,t){let n=Er(e);if(n.Check(t))return t;Ar(Array.from(n.Errors(t),e=>Or(Dr(e.path),e.message)))}function Mr(e,t){let n=kr(e);if(n.Check(t))return t;Ar(Array.from(n.Errors(t),e=>Or(Dr(e.path),e.message)))}function Nr(e){return e.inputSchema}function Pr(e){return e.outputSchema}function Fr(e){let t=Pr(e);if(t)return te(t)}function Ir(e,t){return jr(e.inputSchema,t)}function Lr(e){if(`parameters`in e)throw Error(`defineTool 只支持 TypeBox inputSchema;不要使用 parameters JSON Schema`);let t=Nr(e);return{id:e.id,name:e.name,alias:e.alias,displayName:e.displayName,description:e.description,parameters:t,outputSchema:Pr(e),resolvedOutputSchema:Fr(e),errorSchema:e.errorSchema??O,ui:e.ui,requiresApproval:e.requiresApproval,approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency,assessInputGovernance:e.assessInputGovernance?async t=>e.assessInputGovernance?.(Ir(e,t)):void 0,category:e.category,tags:e.tags,timeout:e.timeout,execute:async(t,n)=>e.execute(Ir(e,t),n)}}const Rr=R(`ToolManager`);function zr(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.assetId.toLowerCase().includes(n)||e.alias.toLowerCase().includes(n)||e.displayName.toLowerCase().includes(n)||e.id.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n))||e.category.toLowerCase().includes(n))}function Br(){let e=new Map,t=new Set,n=new Set,r=new Set,i=new Map,a=new Map,o=new Map,s=new Map,c=[],l=new Map,u=new Map;function d(e,t,n){let r=l.get(e)??{totalCalls:0,successCount:0,errorCount:0,totalDurationMs:0};r.totalCalls++,t?r.successCount++:r.errorCount++,r.totalDurationMs+=n,r.lastCallAt=Date.now(),l.set(e,r)}async function f(e){let t={reason:e,toolNames:[...s.keys()]};await Promise.all([...r].map(e=>Promise.resolve(e(t))))}function p(t){let n=i.get(t);if(n)return e.get(n)?.getDescriptors().find(e=>e.id===t)}function m(t){let n=p(t);if(n)return n;let r=a.get(t);if(r){let e=p(r);if(e)return e}for(let n of e.values()){let e=n.getDescriptors().find(e=>Rn(e,t));if(e)return e}}async function h(t){let n=e.get(t.provider);return n?n.loadTool(t.id):null}function _(e){let t=zn(e);return{...e,execute:async(n,r)=>{let i=n;for(let t of c)if(t.beforeExecute){let n=await t.beforeExecute(e.name,i);n&&(i=n)}let a=Date.now();try{let n=Mr(e.parameters,i),o=g(await e.execute(n,r)),s=Date.now()-a;for(let t of c)if(t.afterExecute){let r=await t.afterExecute(e.name,n,o,s);r&&(o=r)}return d(t,!0,s),o}catch(n){d(t,!1,Date.now()-a);for(let t of c)t.onError&&await t.onError(e.name,i,n).catch(()=>{});throw n}}}}function v(e){let t=m(e);t&&h(t).then(e=>{e&&(o.set(t.id,e),s.set(t.alias,_(Bn(e,t))),f(`reloaded`))}).catch(()=>{})}function y(e){let n=!1;if(e.type===`removed`){if(e.reconnecting){let t=new Set(e.tools.map(e=>e.id).filter(e=>o.has(e)));t.size>0&&u.set(e.provider,t)}for(let t of e.tools)i.get(t.id)===e.provider&&i.delete(t.id),a.get(t.alias)===t.id&&a.delete(t.alias),o.delete(t.id)&&(n=!0),s.delete(t.alias)&&(n=!0)}if(e.type===`added`){for(let t of e.tools){let n=a.get(t.alias);n&&n!==t.id?Rr.warn({alias:t.alias,newProvider:e.provider,existingDescriptorId:n},`工具 alias 冲突: "${t.alias}" (${e.provider}) 与已有 (${n}) 冲突,保留先注册的`):a.set(t.alias,t.id),i.set(t.id,e.provider)}let t=u.get(e.provider);if(t){let n=e.tools.map(e=>e.id).filter(e=>t.has(e));n.length>0&&x.enable(n).catch(()=>{}),u.delete(e.provider)}}if(e.type===`updated`)for(let t of e.tools){i.set(t.id,e.provider);for(let[e,n]of a)n===t.id&&e!==t.alias&&a.delete(e);if(a.set(t.alias,t.id),o.has(t.id)){for(let[e,r]of s)zn(r)===t.id&&(s.delete(e),n=!0);v(t.id)}}n&&f(`provider_changed`);for(let n of t)n(e)}function b(e){for(let t of n)t(e)}let x={async addProvider(t){e.has(t.id)&&await x.removeProvider(t.id),t.addChangeListener(y),t.addConnectionStatusListener&&t.addConnectionStatusListener(b);try{await t.init(),e.set(t.id,t)}catch(e){t.removeChangeListener(y),t.removeConnectionStatusListener&&t.removeConnectionStatusListener(b);for(let[e,n]of i)n===t.id&&i.delete(e);for(let[e,t]of a)i.has(t)||a.delete(e);throw e}},async removeProvider(t){let n=e.get(t);if(!n)return;n.removeChangeListener(y),n.removeConnectionStatusListener&&n.removeConnectionStatusListener(b);let r=n.getDescriptors(),c=!1;for(let e of r)i.get(e.id)===t&&i.delete(e.id),a.get(e.alias)===e.id&&a.delete(e.alias),o.delete(e.id)&&(c=!0),s.delete(e.alias)&&(c=!0);await n.destroy(),e.delete(t),c&&await f(`provider_changed`)},getProviders(){return Array.from(e.values()).map(e=>({id:e.id,source:e.source,toolCount:e.getDescriptors().length}))},getProvider(t){return e.get(t)},getDescriptor(e){return m(e)},hasDescriptor(e){return m(e)!==void 0},getAllDescriptors(){let t=[];for(let n of e.values())t.push(...n.getDescriptors());return t},search(e){let t=x.getAllDescriptors();if(e?.keyword){let n=e.keyword;t=t.filter(e=>zr(e,n))}if(e?.category){let n=e.category.toLowerCase();t=t.filter(e=>e.category.toLowerCase()===n)}if(e?.tags?.length){let n=e.tags.map(e=>e.toLowerCase());t=t.filter(e=>{let t=e.tags.map(e=>e.toLowerCase());return n.every(e=>t.includes(e))})}return e?.source&&(t=t.filter(t=>t.source===e.source)),t},async enable(e){let t=[],n=!1;for(let r of e){let e=m(r);if(!e)continue;if(s.has(e.alias)){let n=s.get(e.alias);n&&t.push(n);continue}let i=await h(e);if(!i)continue;o.set(e.id,i);let a=_(Bn(i,e));s.set(e.alias,a),t.push(a),n=!0}return n&&await f(`enabled`),t},disable(e){let t=!1;for(let n of e){let e=m(n);if(e){o.delete(e.id)&&(t=!0),s.delete(e.alias)&&(t=!0);continue}s.delete(n)&&(t=!0)}t&&f(`disabled`)},async enableAll(){let t=[],n=!1;for(let r of e.values()){let e=r.getDescriptors();for(let i of e){if(s.has(i.alias)){let e=s.get(i.alias);e&&t.push(e);continue}let e=await r.loadTool(i.id);if(e){o.set(i.id,e);let r=_(Bn(e,i));s.set(i.alias,r),t.push(r),n=!0}}}return n&&await f(`enabled`),t},getSessionTools(){return s},getSessionToolNames(){return[...s.keys()]},use(e){c.push(e);let t=!1;for(let[e,n]of o){let r=p(e);r&&(s.set(r.alias,_(Bn(n,r))),t=!0)}t&&f(`middleware_updated`)},addChangeListener(e){t.add(e)},removeChangeListener(e){t.delete(e)},addConnectionStatusListener(e){n.add(e)},removeConnectionStatusListener(e){n.delete(e)},addSessionToolsChangeListener(e){r.add(e)},removeSessionToolsChangeListener(e){r.delete(e)},categories(){let e=new Map;for(let t of x.getAllDescriptors())e.set(t.category,(e.get(t.category)??0)+1);return Array.from(e.entries()).map(([e,t])=>({category:e,count:t}))},getStats(){return new Map(l)},getToolStats(e){let t=m(e);return t?l.get(t.id):l.get(e)},getMcpConnectionInfos(){let t=[];for(let n of e.values())n.getConnectionInfo&&t.push(n.getConnectionInfo());return t},async destroy(){let c=[...e.keys()];await Promise.allSettled(c.map(e=>x.removeProvider(e))),o.clear(),s.clear(),i.clear(),a.clear(),l.clear(),u.clear(),t.clear(),n.clear(),await f(`destroyed`),r.clear()}};return x}function Vr(e,t){return{...e,...t.sideEffectLevel?{sideEffectLevel:t.sideEffectLevel}:{},...t.approvalPolicy?{approvalPolicy:t.approvalPolicy}:{},...t.hostDependency?{hostDependency:t.hostDependency}:{}}}function Hr(e){return e===`read`||e===`write`||e===`destructive`}function Ur(e){return e===`auto`||e===`manual`||e===`destructive-only`}function Wr(e){return e===`none`||e===`local-app`||e===`os-service`||e===`remote-service`}function G(e){return e.governance?{...e,governance:e.governance}:{kind:e.kind,scope:e.scope,runtime:e.runtime}}function Gr(e={}){return Vr({sideEffectLevel:`write`,approvalPolicy:`auto`,executionIsolation:`in-process`,hostDependency:`none`},e)}function Kr(e={}){return Vr({sideEffectLevel:`write`,approvalPolicy:`manual`,executionIsolation:`mcp`,hostDependency:`none`},e)}function qr(e={}){return Vr({sideEffectLevel:`read`,approvalPolicy:`auto`,executionIsolation:`part-render`,hostDependency:`none`},e)}function Jr(e={}){return Vr({sideEffectLevel:`read`,approvalPolicy:`auto`,executionIsolation:`prompt-injection`,hostDependency:`none`},e)}function Yr(e){if(e)return{sideEffectLevel:e.sideEffectLevel,approvalPolicy:e.approvalPolicy,hostDependency:e.hostDependency}}function Xr(e){let t={};return Hr(e.sideEffectLevel)&&(t.sideEffectLevel=e.sideEffectLevel),Ur(e.approvalPolicy)&&(t.approvalPolicy=e.approvalPolicy),Wr(e.hostDependency)&&(t.hostDependency=e.hostDependency),Object.keys(t).length>0?t:void 0}const Zr={auto:0,"destructive-only":1,manual:2};function Qr(e,t){return Zr[e]>=Zr[t]?e:t}function $r(e,t){let n={read:0,write:1,destructive:2};return n[e]>=n[t]?e:t}function ei(e,t=`auto`){let n=Gr({sideEffectLevel:e,approvalPolicy:t,hostDependency:`os-service`});return{approvalPolicy:n.approvalPolicy,sideEffectLevel:n.sideEffectLevel,hostDependency:n.hostDependency}}function ti(e){return{...ei(e.level,e.recommendedApprovalPolicy),riskSummary:e.summary,riskTags:e.tags,riskSignals:e.signals}}function ni(e,t={}){let n=e.trim(),r=[],i=new Set,a=null;function o(e){a=a?$r(a,e.level):e.level,r.push(e.signal);for(let t of e.tags??[])i.add(t)}for(let e of[{pattern:/(^|\s)rm\s+-[^\n]*r[^\n]*f\b/,signal:`检测到 rm -rf 类删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\bgit\s+reset\s+--hard\b/,signal:`检测到 git reset --hard`,tags:[`git`]},{pattern:/\bgit\s+clean\b[^\n]*\s-f/,signal:`检测到 git clean 强制清理`,tags:[`git`,`delete`]},{pattern:/\bdd\s+if=.*of=\/dev\//,signal:`检测到 dd 直接写块设备`,tags:[`system`]},{pattern:/\bmkfs(\.[a-z0-9_-]+)?\b/,signal:`检测到格式化文件系统命令`,tags:[`system`]},{pattern:/\bdiskutil\s+erase(Disk|Volume)\b/,signal:`检测到磁盘抹除命令`,tags:[`system`]},{pattern:/\b(format|shutdown|reboot|poweroff|halt)\b/i,signal:`检测到系统级破坏/关机命令`,tags:[`system`]},{pattern:/\b(del|erase)\b[^\n]*\s\/f\b/i,signal:`检测到 Windows 强制删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\brd\b[^\n]*\s\/s\b[^\n]*\s\/q\b/i,signal:`检测到 Windows 递归删除目录命令`,tags:[`filesystem`,`delete`]},{pattern:/\b(curl|wget)\b[^\n|]*\|\s*(sh|bash|zsh|fish|pwsh|powershell)\b/i,signal:`检测到网络下载后直接交给 shell 执行`,tags:[`network`,`shell-eval`]},{pattern:/\b(bash|sh|zsh|fish)\s+-c\b/,signal:`检测到 shell -c 动态执行命令`,tags:[`shell-eval`]},{pattern:/\bpowershell(\.exe)?\s+-Command\b/i,signal:`检测到 PowerShell 动态执行命令`,tags:[`shell-eval`]}])e.pattern.test(n)&&o({level:`destructive`,signal:e.signal,tags:e.tags});for(let e of[{pattern:/(^|\s)rm\s+([^-][^\n]*)/,signal:`检测到文件删除命令`,tags:[`filesystem`,`delete`]},{pattern:/\b(npm|pnpm|yarn)\s+(install|add|remove|uninstall|update)\b/,signal:`检测到依赖变更命令`,tags:[`package-manager`]},{pattern:/\bgit\s+(commit|push|merge|rebase|pull)\b/,signal:`检测到 Git 写操作命令`,tags:[`git`]},{pattern:/(^|\s)(mv|cp|mkdir|touch|chmod|chown)\b/,signal:`检测到文件系统写操作命令`,tags:[`filesystem`]},{pattern:/\bsed\b[^\n]*\s-i(\b|['"])/,signal:`检测到 sed 原地修改命令`,tags:[`filesystem`]},{pattern:/\bkill(\s+-9)?\b/,signal:`检测到进程控制命令`,tags:[`process`]},{pattern:/\b(curl|wget)\b/,signal:`检测到网络访问命令`,tags:[`network`]},{pattern:/^\s*(python|python3|node|tsx|ts-node|deno|ruby|perl)\b/,signal:`检测到脚本解释器执行入口`,tags:[`script`]},{pattern:/^\s*(make|just)\b/,signal:`检测到任务脚本执行入口`,tags:[`script`]}])e.pattern.test(n)&&o({level:`write`,signal:e.signal,tags:e.tags});if([/^\s*(pwd|ls|cat|rg|which|echo|env)\b/,/^\s*git\s+(status|diff|log|show)\b/,/^\s*(curl|wget)\b[^\n]*(https?:\/\/|\s+-I\b|\s+--head\b)/,/^\s*(npm|pnpm|yarn)\s+(test|run\s+test)\b/].some(e=>e.test(n))&&o({level:`read`,signal:`命令模式符合只读查询或测试执行`,tags:n.startsWith(`git `)?[`git`]:void 0}),!a){let e=t.unknownCommandLevel??`write`;o({level:e,signal:e===`destructive`?`未识别命令且策略要求按 destructive 处理`:`未识别为只读命令,保守按写操作处理`})}for(let e of i){let n=t.elevateTagsToLevel?.[e];n&&(a=$r(a??`write`,n),r.push(`策略已将 ${e} 标签提升为 ${n}`))}let s=a??`write`,c=s===`destructive`?`manual`:`auto`;(i.has(`system`)||i.has(`shell-eval`))&&(c=`manual`),t.approvalByLevel?.[s]&&(c=Qr(c,t.approvalByLevel[s]));for(let e of i){let n=t.approvalByTag?.[e];n&&(c=Qr(c,n))}return{level:s,summary:s===`read`?`检测到只读或低风险命令`:s===`destructive`?`检测到高风险命令:${r.join(`,`)}`:`检测到可能修改环境的命令:${r.join(`,`)}`,signals:r,tags:Array.from(i),recommendedApprovalPolicy:c}}function ri(e,t={}){let n=e.category===`mcp`,r=t.governance??(n?void 0:Gr({approvalPolicy:e.approvalPolicy,sideEffectLevel:e.sideEffectLevel,hostDependency:e.hostDependency}));return{...G({kind:`tool`,scope:e.source===`system`||e.source===`bundled`?`core`:e.source===`user`?`local`:`external`,runtime:n?`mcp-provider`:`in-process`,governance:r}),ref:e.alias,id:e.id,assetId:e.assetId,alias:e.alias,name:e.name,displayName:e.displayName,description:e.description,category:e.category,tags:e.tags,source:e.source,provider:e.provider,...t}}function ii(e,t){return{...ri(e),outputSchema:e.outputSchema,resolvedOutputSchema:e.resolvedOutputSchema,errorSchema:e.errorSchema,...t}}function ai(e){let t=e.enabled??!1;return{...G({kind:`mcp-server`,scope:`local`,runtime:`mcp-provider`,governance:Kr(e.governance)}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags??[],enabled:t,status:e.connectionInfo?.status??(t?`disconnected`:`disabled`),toolCount:e.connectionInfo?.toolCount??0,error:e.connectionInfo?.error,hasDistBundle:e.hasDistBundle,projectDir:e.projectDir,...e.extra}}function oi(e){return{...ai(e),meta:e.meta,code:e.code,dependencies:e.dependencies,...e.extra}}const si=R(`ContextCompressor`);function K(e){return e?Math.ceil(e.length/3.2):0}function ci(e){let t=4;if(t+=K(e.content),e.toolCalls)for(let n of e.toolCalls)t+=K(n.name),t+=K(n.arguments),t+=10;return e.images&&(t+=e.images.length*85),t}function q(e){let t=3;for(let n of e)t+=ci(n);return t}function J(e){let t=e.compactThresholdRatio??.8;return Math.floor(e.contextWindowTokens*t)-e.maxOutputTokens}function li(e,t){return q(e)>J(t)}function ui(e,t){let n=t.keepRecentMessages??6,r=e[0]?.role===`system`?1:0,i=r;for(let t=r;t<e.length;t++)if(e[t].role===`user`){i=t+1;break}let a=Math.max(i,e.length-n),o=e.slice(a),s=e.slice(i,a);if(s.length<2)return{summarizeMessages:[],keepMessages:e.slice(r)};let c=q(e),l=J(t);return si.info({estimatedTokens:c,budget:l,middleCount:s.length,keepCount:o.length},`准备 AI 总结: ~${c} tokens > budget ${l}, 总结 ${s.length} 条中间消息, 保留最近 ${o.length} 条`),{summarizeMessages:[{role:`system`,content:hi},{role:`user`,content:gi(s)}],keepMessages:o}}function di(e,t,n){let r=e[0]?.role===`system`?e[0]:null,i=r?1:0,a=null;for(let t=i;t<e.length;t++)if(e[t].role===`user`){a=e[t];break}let o=[];r&&o.push(r),a&&o.push(a),o.push({role:`system`,content:`[对话历史摘要]\n${t}`}),o.push(...n);let s=q(o);return si.info({originalCount:e.length,resultCount:o.length,tokens:s},`AI 总结应用完成: ${e.length} → ${o.length} 条消息, ~${s} tokens`),o}function fi(e,t){return e.role===`user`?ci(e)>J(t):!1}function pi(e){return{summarizeMessages:[{role:`system`,content:mi},{role:`user`,content:e.content}]}}const mi=`你是一个文档压缩助手。用户将发送一段很长的文本(可能包含提问/指令 + 超长文档内容)。
7
7
 
8
8
  你的任务:
9
9
  1. 准确识别并保留用户的提问或指令(原文保留,不要改写)
@@ -29,11 +29,11 @@ import{FormatRegistry as e,Kind as t,Type as n,Type as r}from"@sinclair/typebox"
29
29
 
30
30
  ---
31
31
 
32
- `)}const Y=z(`ContextSummarizer`);async function _i(e,t,n,r){let{summarizeMessages:i,keepMessages:a}=ui(t,n);if(i.length===0)return Y.info(`中间历史太短,跳过 AI 总结`),{messages:t,success:!0};let o=i[0].content,s=i[1].content;Y.info({model:r,tokens:q(i),messageCount:t.length},`开始 AI 总结 (${r}): ~${q(i)} tokens, ${t.length} 条消息`);try{let n=await e(o,s,r);if(!n.trim())return Y.warn(`AI 总结返回空内容`),{messages:t,success:!1};let i=di(t,n,a);return Y.info({originalCount:t.length,compressedCount:i.length,tokens:q(i)},`AI 总结完成: ${t.length} → ${i.length} 条消息, ~${q(i)} tokens`),{messages:i,success:!0,summaryContent:n}}catch(e){return Y.error({err:e},`AI 总结异常`),{messages:t,success:!1}}}async function vi(e,t,n){let{summarizeMessages:r}=pi(t),i=r[0].content,a=r[1].content,o=K(t.content);Y.info({model:n,originalTokens:o},`开始单条消息压缩 (${n}): ~${o} tokens`);try{let t=await e(i,a,n);if(!t.trim())return Y.warn(`单条消息压缩返回空内容`),{summary:``,success:!1,originalTokens:o,compressedTokens:0};let r=K(t),s=`${t}\n\n(原文约 ${o} tokens,已由 AI 压缩提取要点)`;return Y.info({originalTokens:o,compressedTokens:r},`单条消息压缩完成: ~${o} → ~${r} tokens`),{summary:s,success:!0,originalTokens:o,compressedTokens:r}}catch(e){return Y.error({err:e},`单条消息压缩异常`),{summary:``,success:!1,originalTokens:o,compressedTokens:0}}}const yi=z(`Compression`);async function*bi(e,t,n,r){if(!li(e,t))return e;if(!n||!r)return yi.warn(`上下文超限但未配置 summarize 回调或模型,跳过压缩`),e;let i=r,a=Date.now(),o=q(e),s=J(t),c=e.length;yield Se(o,s);let{messages:l,success:u,summaryContent:d}=await _i(n,e,t,i);return yield Ce(u,o,q(l),c,l.length,a,d,i),l}async function*xi(e,t,n,r){let i=e[e.length-1];if(!i||i.role!==`user`||!fi(i,t))return e;if(!n)return yi.warn(`单条消息超长但未配置 summarize 回调,跳过压缩`),e;let a=ci(i),o=J(t),s=Date.now(),c=r?.longModel??`qwen-long`;yield we(a,o);let l=await vi(n,i,c);if(l.success){let t=[...e];return t[t.length-1]={...i,content:l.summary},yield Te(!0,l.originalTokens,l.compressedTokens,s,l.summary,c),t}return yield Te(!1,l.originalTokens,0,s),e}const X=z(`Orchestrator`);function Si(){return process.env.NODE_ENV===`development`}function Ci(e){if(e!=null&&Number.isFinite(e)&&!(e<=0))return Math.floor(e)}function wi(e){let t=e??``,n=t.trim()?t:`{}`;try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`function.arguments must be a JSON object`);return{ok:!0,args:e,argumentsJson:JSON.stringify(e)}}catch(n){X.warn({args:e?.slice(0,200),error:String(n)},`工具调用参数 JSON 解析失败`);let r=`工具调用参数不是合法 JSON 对象,已拒绝执行工具`,i={message:r,code:`INVALID_TOOL_ARGUMENTS_JSON`,category:`validation`,retryable:!0,suggestion:`请根据工具 inputSchema 重新生成 JSON 对象形式的 function.arguments。`};return{ok:!1,args:{},argumentsJson:`{}`,error:i,result:JSON.stringify(Ei({message:r,failureReason:`parse_error`,code:i.code,category:i.category,retryable:i.retryable,suggestion:i.suggestion,details:t?{rawArgumentsPreview:t.slice(0,500)}:void 0,cause:String(n)}))}}}function Ti(e){let{autoRunConfig:t,tool:n,governance:r}=e;return t?.mode===`manual`?{needsApproval:!0,reason:`manual-mode`}:n?n.requiresApproval===!0||r?.approvalPolicy===`manual`?{needsApproval:!0,reason:`tool-policy`}:r?.approvalPolicy===`destructive-only`&&r.sideEffectLevel===`destructive`?{needsApproval:!0,reason:`destructive-only`}:{needsApproval:!1}:{needsApproval:!1}}function Ei(e){let{message:t,failureReason:n,code:r,category:i,retryable:a,suggestion:o,details:s,cause:c,stack:l}=e,u={...s??{},...c?{cause:c}:{},...l?{stack:l}:{}};return{status:`error`,failureReason:n,error:{message:t,...r?{code:r}:{},...i?{category:i}:{},...a===void 0?{}:{retryable:a},...o?{suggestion:o}:{},...Object.keys(u).length>0?{details:u}:{}}}}function Di(e,t){return e===`INVALID_PARAMS`?`validation`:e===`PERMISSION_DENIED`||e===`TOOL_NOT_ENABLED`?`permission`:e===`NETWORK_ERROR`?`network`:e===`NOT_FOUND`?`not_found`:e===`TIMEOUT`?`runtime`:t}const Oi=`This tool call failed. In the final answer, explicitly mention the failure or the verified retry outcome; do not report this step as passed unless a later successful retry clearly verified it.`;function ki(e,t){if(t)return e;try{let t=JSON.parse(e),n=t&&typeof t==`object`&&!Array.isArray(t)?{...t}:{value:t};return n._modelNotice=Oi,JSON.stringify(n)}catch{return`${Oi}\n${e}`}}var Ai=class{config;constructor(e){this.config={...e}}async*chat(e,t,n,r){let i=Date.now(),a=Ci(r.maxIterations??this.config.maxIterations),o=Ci(r.maxDurationMs??this.config.maxDurationMs),s=Ci(r.maxToolCalls??this.config.maxToolCalls),c=Ci(r.maxTotalTokens??this.config.maxTotalTokens);X.info({model:r.model,messagePreview:t.slice(0,50)+(t.length>50?`...`:``)},`开始对话`),Si()&&X.info({model:r.model,compiledPrompt:t},`完整编译 Prompt`);let l=this.buildMessages(n,t),u=this.config.llmConfig?Nn(r.model,this.config.llmConfig):void 0,d=u?{contextWindowTokens:u.contextWindowTokens,maxOutputTokens:u.maxOutputTokens}:{contextWindowTokens:128e3,maxOutputTokens:8192};l=yield*xi(l,d,this.config.summarize,this.config.compressionConfig),l=yield*bi(l,d,this.config.summarize,r.model);let f=0,p=0,m=``,h=`stop`,g,_=0,v=e=>`${e}-${++_}`,y={promptTokens:0,completionTokens:0,totalTokens:0,reasoningTokens:0,cachedTokens:0},b=!1;for(;;){if(n.signal.aborted){yield be(`请求已取消`);return}if(o!==void 0&&Date.now()-i>=o){g=`max_duration`,h=`max_duration`;break}if(a!==void 0&&f>=a){g=`max_iterations`,h=`max_iterations`;break}f++,f>1&&(l=yield*bi(l,d,this.config.summarize,r.model)),n.refreshTools&&(n.tools=await n.refreshTools());let u=Date.now();X.info({model:r.model,iterations:f},`第 ${f} 轮开始`),yield xe(f),yield N(`thinking`);let _=0,x=!1,S=!1,C=!1,T=``,E=``,D=``,O=``;try{let d=[],k=!1,A=e.streamOnce(l,n.tools,{model:r.model,enableThinking:r.enableThinking,signal:n.signal});for await(let e of A)switch(e.type){case`thinking_delta`:if(!e.delta||S)break;T+=e.delta;{let t=e.delta;if(!x){if(t=t.replace(/^\n+/,``),!t)break;x=!0,_=Date.now(),D=v(`thinking`),yield N(null),yield oe(D)}yield se(D,t)}break;case`thinking_done`:if(e.thinkingSignature&&(E=e.thinkingSignature),S)break;S=!0,x&&(yield ce(D,_));break;case`text_delta`:e.delta&&(x&&!S&&(S=!0,yield ce(D,_)),C||(C=!0,O=v(`text`),yield R(`step`,f),yield N(null),yield fe(O)),m+=e.delta,yield pe(O,e.delta));break;case`tool_call_done`:e.toolCall&&(d.push({id:e.toolCall.id||``,name:e.toolCall.name||``,arguments:e.toolCall.arguments||`{}`,thoughtSignature:e.toolCall.thoughtSignature}),k=!0);break;case`done`:x&&!S&&(S=!0,yield ce(D,_)),C&&=(yield me(O),!1),X.info({finishReason:e.finishReason,usage:e.usage,iterations:f},`第 ${f} 轮完成`),e.finishReason&&(h=e.finishReason),e.finishReason===`tool_calls`&&(k=!0),e.usage&&(b=!0,y.promptTokens+=e.usage.promptTokens||0,y.completionTokens+=e.usage.completionTokens||0,y.totalTokens+=e.usage.totalTokens||0,y.reasoningTokens+=e.usage.reasoningTokens||0,y.cachedTokens+=e.usage.cachedTokens||0);break;case`error`:X.error({error:e.error},`收到 error`),yield I(e.error??`未知错误`);return;default:break}if(k&&d.length>0){if(a!==void 0&&f>=a){h=`max_iterations`,g=`max_iterations`,yield L(f,u);break}if(o!==void 0&&Date.now()-i>=o){h=`max_duration`,g=`max_duration`,yield L(f,u);break}if(c!==void 0&&y.totalTokens>=c){h=`max_tokens`,g=`max_tokens`,yield L(f,u);break}if(s!==void 0&&p+d.length>s){h=`max_tool_calls`,g=`max_tool_calls`,yield L(f,u);break}let e=n.clientToolNames,_=e?d.filter(t=>e.has(t.name)):[];if(_.length>0){X.info({toolNames:_.map(e=>e.name)},`检测到客户端工具调用,透传给客户端`),yield N(null);for(let e of _){yield R(`tool_call`,f);let t=wi(e.arguments);if(!t.ok){yield P(e.id,e.name,t.result??``,!1,Date.now(),t.error,void 0,`parse_error`,{});continue}let n=this.config.tools?.get(e.name),r=await w(n,t.args);yield de(e.id,e.name,t.args,n?.ui,r)}let e=Date.now()-i;yield he(m,`tool_calls`,void 0,e);return}yield N(null);let v=d.map(e=>({toolCall:e,parsedArgs:wi(e.arguments)}));l.push({role:`assistant`,content:m,toolCalls:v.map(({toolCall:e,parsedArgs:t})=>({...e,arguments:t.argumentsJson})),...T?{thinkingContent:T}:{},...E?{thinkingSignature:E}:{}});for(let{toolCall:e,parsedArgs:a}of v){if(o!==void 0&&Date.now()-i>=o){h=`max_duration`,g=`max_duration`;break}if(s!==void 0&&p>=s){h=`max_tool_calls`,g=`max_tool_calls`;break}if(yield R(`tool_call`,f),!a.ok){let t=Date.now();yield P(e.id,e.name,a.result??``,!1,t,a.error,void 0,`parse_error`,{}),l.push({role:`tool`,content:ki(a.result??``,!1),toolCallId:e.id,toolName:e.name}),p++;continue}if(yield*this.executeSingleTool({toolCall:e,args:a.args,messages:l,context:n,options:r,message:t}),p++,n.signal.aborted){yield be(`请求已取消`);return}}if(g){yield L(f,u);break}yield L(f,u),m=``;continue}if(!m&&!C){X.warn({model:r.model,thinkingOnly:x,finishReason:h,toolsCount:n.tools?.length??0},`模型返回空响应`);let e=`模型未生成正文,请重试或更换模型。`,t=v(`text`);yield R(`step`,f),yield fe(t),yield pe(t,e),yield me(t),m=e}yield L(f,u);break}catch(e){yield L(f,u),n.signal.aborted?yield be(`请求已取消`):yield I(e instanceof Error?e.message:String(e));return}}g&&X.warn({finishReason:g,maxIterations:a,maxDurationMs:o,maxToolCalls:s,maxTotalTokens:c,iterations:f,toolCallsExecuted:p,totalTokens:y.totalTokens,durationMs:Date.now()-i},`命中执行预算限制:${g}`);let x=Date.now()-i,S=b?{promptTokens:y.promptTokens,completionTokens:y.completionTokens,totalTokens:y.totalTokens,...y.reasoningTokens>0?{reasoningTokens:y.reasoningTokens}:{},...y.cachedTokens>0?{cachedTokens:y.cachedTokens}:{}}:void 0;X.info({model:r.model,duration:`${x}ms`,iterations:f,tokens:S?.totalTokens,finishReason:h},`对话完成`),yield he(m,h,S,x)}buildMessages(e,t){let n=[];e.systemPrompt&&n.push({role:`system`,content:e.systemPrompt});for(let t of e.history){let e={role:t.role,content:t.content};t.tool_calls&&(e.toolCalls=t.tool_calls.map(e=>({id:e.id,name:e.function.name,arguments:e.function.arguments,thoughtSignature:e.thought_signature}))),t.role===`tool`&&t.tool_call_id&&(e.toolCallId=t.tool_call_id),n.push(e)}return t&&n.push({role:`user`,content:t,images:e.images}),n}async*executeSingleTool(e){let{toolCall:t,args:n,messages:r,context:i,message:a}=e,o=Date.now(),s=new Set(i.tools.map(e=>e.name));if(!s.has(t.name)){let e=this.config.getToolDescriptor?.(t.name),n=!!e||!!this.config.tools?.has(t.name),i=e?.alias??t.name,a=n,s=n?`工具 "${t.name}" 存在,但未在当前聊天工具定义中启用`:`工具 "${t.name}" 未在当前聊天工具定义中声明`,c=n?`请先调用 tool_enable,参数 {"items":[{"ref":"${i}","enabled":true}]};工具定义刷新后再调用 "${i}"。`:`请先使用 tool_search 查找可用工具,并只调用当前已声明的工具。`,l=`denied`,u=JSON.stringify(Ei({message:s,failureReason:l,code:`TOOL_NOT_ENABLED`,category:`permission`,retryable:a,suggestion:c})),d={message:s,code:`TOOL_NOT_ENABLED`,category:`permission`,retryable:a};yield P(t.id,t.name,u,!1,o,d,void 0,l,{}),r.push({role:`tool`,content:ki(u,!1),toolCallId:t.id,toolName:t.name});return}let c=this.config.getAutoRunConfig?await this.config.getAutoRunConfig():e.options.autoRunConfig||this.config.autoRunConfig,l=this.config.tools?.get(t.name),u,d=!0;if(l?.parameters)try{jr(l.parameters,n)}catch(e){d=!1,X.warn({toolName:t.name,error:String(e)},`工具参数校验失败,跳过审批并交由执行层返回错误`)}if(d)try{u=await w(l,n)}catch(e){X.warn({toolName:t.name,error:String(e)},`工具输入治理预判失败,已提升为 manual`),u={approvalPolicy:`manual`}}else u=l?{approvalPolicy:l.approvalPolicy,sideEffectLevel:l.sideEffectLevel,hostDependency:l.hostDependency}:{};let f=Ti({autoRunConfig:c,tool:l,governance:u});if(d&&f.needsApproval&&this.config.onToolApprovalRequest){let e=this.config.getToolDescriptor?.(t.name),i={toolName:e?.name,extensionId:e?.assetId,alias:e?.alias,displayName:e?.displayName};if(X.info({toolName:t.name},`发送工具批准请求`),yield{type:`tool_approval_request`,data:{id:t.id,name:t.name,...i,args:n,reason:f.reason??`tool-policy`,approvalPolicy:u.approvalPolicy,sideEffectLevel:u.sideEffectLevel,hostDependency:u.hostDependency,...u.riskSummary?{riskSummary:u.riskSummary}:{},...u.riskTags?.length?{riskTags:u.riskTags}:{},...u.riskSignals?.length?{riskSignals:u.riskSignals}:{},requestedAt:Date.now()}},!await this.config.onToolApprovalRequest({id:t.id,name:t.name,...i,args:n})){let e=`denied`,n=JSON.stringify(Ei({message:`用户跳过了此工具`,failureReason:e,code:`TOOL_CALL_SKIPPED`,category:`permission`,retryable:!0,suggestion:`如果需要执行该工具,请重新发起请求并批准工具调用。`}));yield P(t.id,t.name,n,!1,o,{message:`用户跳过了此工具`,code:`TOOL_CALL_SKIPPED`,category:`permission`,retryable:!0,suggestion:`如果需要执行该工具,请重新发起请求并批准工具调用。`},void 0,e,u),r.push({role:`tool`,content:ki(n,!1),toolCallId:t.id,toolName:t.name});return}}yield le(t.id,t.name,n,l?.ui,u);let p=this.config.tools?.get(t.name),m=i.signal,h;if(p?.timeout){let e=new AbortController;h=setTimeout(()=>e.abort(),p.timeout),i.signal.addEventListener(`abort`,()=>e.abort(),{once:!0}),m=e.signal}let v,b,x=!0,S=l?.ui,C;try{let e=[],r=null,i=()=>r?.(),a=t=>{e.push(t),i()},o=!1,c,d,f={toolCallId:t.id,toolName:t.name,allowedToolNames:Array.from(s),governance:u,onStdout:e=>{e&&a(ue(t.id,t.name,`stdout`,e))},onStderr:e=>{e&&a(ue(t.id,t.name,`stderr`,e))}};for(this.config.executeTool(t.name,n,m,f).then(e=>{c=e,o=!0,i()}).catch(e=>{d=e,o=!0,i()});!o||e.length>0;){for(;e.length>0;){let t=e.shift();t&&(yield t)}if(o)break;await new Promise(e=>r=e),r=null}if(d)throw d;let p=g(c);S=y(p,l?.ui),v=JSON.stringify(_(p))}catch(e){if(x=!1,E(e))b=e.toolError,C=e.toolError.code===`TIMEOUT`?`timeout`:`execution_error`,v=JSON.stringify(Ei({message:e.toolError.message,failureReason:C,code:e.toolError.code,category:e.toolError.category??Di(e.toolError.code,`runtime`),retryable:e.toolError.retryable,suggestion:e.toolError.suggestion,details:e.toolError.details,cause:e.cause?String(e.cause):void 0}));else{let t=e instanceof Error?e.message:String(e);b={message:t},C=`execution_error`,v=JSON.stringify(Ei({message:t,failureReason:C,category:`runtime`,cause:e instanceof Error&&e.cause?String(e.cause):void 0,stack:e instanceof Error?e.stack:void 0}))}}h!==void 0&&clearTimeout(h),yield P(t.id,t.name,v,x,o,b,S,C,u),r.push({role:`tool`,content:ki(v,x),toolCallId:t.id,toolName:t.name})}};function ji(e){return new Ai(e)}function Mi(){return`tool-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var Ni=class{config;adapter;orchestrator;toolExecutor;abortController=null;toolRuntimeManager;toolConfig;mcpConfigs;initialized=!1;constructor(e,t){if(!e.cwd)throw Error(`AgentConfig.cwd is required (browser-safe: no process.cwd() fallback)`);if(!e.systemPrompt.trim())throw Error(`AgentConfig.systemPrompt is required`);this.config={llmConfig:e.llmConfig,systemPrompt:e.systemPrompt,cwd:e.cwd,maxIterations:e.maxIterations,maxDurationMs:e.maxDurationMs,maxToolCalls:e.maxToolCalls,maxTotalTokens:e.maxTotalTokens,dataEngine:e.dataEngine,audit:e.audit},this.toolExecutor=t,this.toolConfig=e.tools,this.mcpConfigs=e.mcpServers,this.toolRuntimeManager=zr(),this.adapter=new Dn(e.llmConfig);let n=this.createDefaultSummarize();this.orchestrator=new Ai({maxIterations:e.maxIterations,maxDurationMs:e.maxDurationMs,maxToolCalls:e.maxToolCalls,maxTotalTokens:e.maxTotalTokens,executeTool:this.executeTool.bind(this),tools:this.toolRuntimeManager.getSessionTools(),getToolDescriptor:this.toolRuntimeManager.getDescriptor,onToolApprovalRequest:e.onToolApprovalRequest,getAutoRunConfig:e.getAutoRunConfig,summarize:n,compressionConfig:e.llmConfig.compression,llmConfig:e.llmConfig})}async asyncInit(){if(!this.initialized){if(this.initialized=!0,this.toolConfig){let e=await ie(this.toolConfig),t=Bn(`builtin`);for(let n of e)t.register(n,{source:n.source,category:n.category,tags:n.tags});await this.toolRuntimeManager.addProvider(t),await this.toolRuntimeManager.enable(t.getDescriptors().map(e=>e.id))}if(this.mcpConfigs?.length){let e=await Promise.allSettled(this.mcpConfigs.map(async e=>{let t=Wn(e);await this.toolRuntimeManager.addProvider(t);let n=t.getDescriptors();await this.toolRuntimeManager.enable(n.map(e=>e.id))}));for(let t=0;t<e.length;t++)e[t].status}}}getModelFamilyConfig(e){let t=this.config.llmConfig.models[e];if(t)return H(e,t,this.config.llmConfig)}getModelEndpointInfo(e){let t=this.config.llmConfig.models[e];return{available:this.adapter.supportsModel(e),familyConfig:t?H(e,t,this.config.llmConfig):void 0}}buildSystemPrompt(e){let t=Fe(this.config.llmConfig,e.model),n=this.config.llmConfig.models[t];n&&H(t,n,this.config.llmConfig);let r=this.config.systemPrompt;e.platformPrompt&&(r+=`
32
+ `)}const Y=R(`ContextSummarizer`);async function _i(e,t,n,r){let{summarizeMessages:i,keepMessages:a}=ui(t,n);if(i.length===0)return Y.info(`中间历史太短,跳过 AI 总结`),{messages:t,success:!0};let o=i[0].content,s=i[1].content;Y.info({model:r,tokens:q(i),messageCount:t.length},`开始 AI 总结 (${r}): ~${q(i)} tokens, ${t.length} 条消息`);try{let n=await e(o,s,r);if(!n.trim())return Y.warn(`AI 总结返回空内容`),{messages:t,success:!1};let i=di(t,n,a);return Y.info({originalCount:t.length,compressedCount:i.length,tokens:q(i)},`AI 总结完成: ${t.length} → ${i.length} 条消息, ~${q(i)} tokens`),{messages:i,success:!0,summaryContent:n}}catch(e){return Y.error({err:e},`AI 总结异常`),{messages:t,success:!1}}}async function vi(e,t,n){let{summarizeMessages:r}=pi(t),i=r[0].content,a=r[1].content,o=K(t.content);Y.info({model:n,originalTokens:o},`开始单条消息压缩 (${n}): ~${o} tokens`);try{let t=await e(i,a,n);if(!t.trim())return Y.warn(`单条消息压缩返回空内容`),{summary:``,success:!1,originalTokens:o,compressedTokens:0};let r=K(t),s=`${t}\n\n(原文约 ${o} tokens,已由 AI 压缩提取要点)`;return Y.info({originalTokens:o,compressedTokens:r},`单条消息压缩完成: ~${o} → ~${r} tokens`),{summary:s,success:!0,originalTokens:o,compressedTokens:r}}catch(e){return Y.error({err:e},`单条消息压缩异常`),{summary:``,success:!1,originalTokens:o,compressedTokens:0}}}const yi=R(`Compression`);async function*bi(e,t,n,r){if(!li(e,t))return e;if(!n||!r)return yi.warn(`上下文超限但未配置 summarize 回调或模型,跳过压缩`),e;let i=r,a=Date.now(),o=q(e),s=J(t),c=e.length;yield Ce(o,s);let{messages:l,success:u,summaryContent:d}=await _i(n,e,t,i);return yield we(u,o,q(l),c,l.length,a,d,i),l}async function*xi(e,t,n,r){let i=e[e.length-1];if(!i||i.role!==`user`||!fi(i,t))return e;if(!n)return yi.warn(`单条消息超长但未配置 summarize 回调,跳过压缩`),e;let a=ci(i),o=J(t),s=Date.now(),c=r?.longModel??`qwen-long`;yield Te(a,o);let l=await vi(n,i,c);if(l.success){let t=[...e];return t[t.length-1]={...i,content:l.summary},yield Ee(!0,l.originalTokens,l.compressedTokens,s,l.summary,c),t}return yield Ee(!1,l.originalTokens,0,s),e}const X=R(`Orchestrator`);function Si(){return process.env.NODE_ENV===`development`}function Ci(e){if(e!=null&&Number.isFinite(e)&&!(e<=0))return Math.floor(e)}function wi(e){let t=e??``,n=t.trim()?t:`{}`;try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`function.arguments must be a JSON object`);return{ok:!0,args:e,argumentsJson:JSON.stringify(e)}}catch(n){X.warn({args:e?.slice(0,200),error:String(n)},`工具调用参数 JSON 解析失败`);let r=`工具调用参数不是合法 JSON 对象,已拒绝执行工具`,i={message:r,code:`INVALID_TOOL_ARGUMENTS_JSON`,category:`validation`,retryable:!0,suggestion:`请根据工具 inputSchema 重新生成 JSON 对象形式的 function.arguments。`};return{ok:!1,args:{},argumentsJson:`{}`,error:i,result:JSON.stringify(Ei({message:r,failureReason:`parse_error`,code:i.code,category:i.category,retryable:i.retryable,suggestion:i.suggestion,details:t?{rawArgumentsPreview:t.slice(0,500)}:void 0,cause:String(n)}))}}}function Ti(e){let{autoRunConfig:t,tool:n,governance:r}=e;return t?.mode===`manual`?{needsApproval:!0,reason:`manual-mode`}:n?n.requiresApproval===!0||r?.approvalPolicy===`manual`?{needsApproval:!0,reason:`tool-policy`}:r?.approvalPolicy===`destructive-only`&&r.sideEffectLevel===`destructive`?{needsApproval:!0,reason:`destructive-only`}:{needsApproval:!1}:{needsApproval:!1}}function Ei(e){let{message:t,failureReason:n,code:r,category:i,retryable:a,suggestion:o,details:s,cause:c,stack:l}=e,u={...s??{},...c?{cause:c}:{},...l?{stack:l}:{}};return{status:`error`,failureReason:n,error:{message:t,...r?{code:r}:{},...i?{category:i}:{},...a===void 0?{}:{retryable:a},...o?{suggestion:o}:{},...Object.keys(u).length>0?{details:u}:{}}}}function Di(e,t){return e===`INVALID_PARAMS`?`validation`:e===`PERMISSION_DENIED`||e===`TOOL_NOT_ENABLED`?`permission`:e===`NETWORK_ERROR`?`network`:e===`NOT_FOUND`?`not_found`:e===`TIMEOUT`?`runtime`:t}const Oi=`This tool call failed. In the final answer, explicitly mention the failure or the verified retry outcome; do not report this step as passed unless a later successful retry clearly verified it.`;function ki(e,t){if(t)return e;try{let t=JSON.parse(e),n=t&&typeof t==`object`&&!Array.isArray(t)?{...t}:{value:t};return n._modelNotice=Oi,JSON.stringify(n)}catch{return`${Oi}\n${e}`}}var Ai=class{config;constructor(e){this.config={...e}}async*chat(e,t,n,r){let i=Date.now(),a=Ci(r.maxIterations??this.config.maxIterations),o=Ci(r.maxDurationMs??this.config.maxDurationMs),s=Ci(r.maxToolCalls??this.config.maxToolCalls),c=Ci(r.maxTotalTokens??this.config.maxTotalTokens);X.info({model:r.model,messagePreview:t.slice(0,50)+(t.length>50?`...`:``)},`开始对话`),Si()&&X.info({model:r.model,compiledPrompt:t},`完整编译 Prompt`);let l=this.buildMessages(n,t),u=this.config.llmConfig?Pn(r.model,this.config.llmConfig):void 0,d=u?{contextWindowTokens:u.contextWindowTokens,maxOutputTokens:u.maxOutputTokens}:{contextWindowTokens:128e3,maxOutputTokens:8192};l=yield*xi(l,d,this.config.summarize,this.config.compressionConfig),l=yield*bi(l,d,this.config.summarize,r.model);let f=0,p=0,m=``,h=`stop`,g,_=0,v=e=>`${e}-${++_}`,y={promptTokens:0,completionTokens:0,totalTokens:0,reasoningTokens:0,cachedTokens:0},b=!1;for(;;){if(n.signal.aborted){yield xe(`请求已取消`);return}if(o!==void 0&&Date.now()-i>=o){g=`max_duration`,h=`max_duration`;break}if(a!==void 0&&f>=a){g=`max_iterations`,h=`max_iterations`;break}f++,f>1&&(l=yield*bi(l,d,this.config.summarize,r.model)),n.refreshTools&&(n.tools=await n.refreshTools());let u=Date.now();X.info({model:r.model,iterations:f},`第 ${f} 轮开始`),yield Se(f),yield ae(`thinking`);let _=0,x=!1,S=!1,C=!1,T=``,E=``,D=``,O=``;try{let d=[],k=!1,A=e.streamOnce(l,n.tools,{model:r.model,enableThinking:r.enableThinking,signal:n.signal});for await(let e of A)switch(e.type){case`thinking_delta`:if(!e.delta||S)break;T+=e.delta;{let t=e.delta;if(!x){if(t=t.replace(/^\n+/,``),!t)break;x=!0,_=Date.now(),D=v(`thinking`),yield ae(null),yield se(D)}yield ce(D,t)}break;case`thinking_done`:if(e.thinkingSignature&&(E=e.thinkingSignature),S)break;S=!0,x&&(yield le(D,_));break;case`text_delta`:e.delta&&(x&&!S&&(S=!0,yield le(D,_)),C||(C=!0,O=v(`text`),yield L(`step`,f),yield ae(null),yield pe(O)),m+=e.delta,yield me(O,e.delta));break;case`tool_call_done`:e.toolCall&&(d.push({id:e.toolCall.id||``,name:e.toolCall.name||``,arguments:e.toolCall.arguments||`{}`,thoughtSignature:e.toolCall.thoughtSignature}),k=!0);break;case`done`:x&&!S&&(S=!0,yield le(D,_)),C&&=(yield he(O),!1),X.info({finishReason:e.finishReason,usage:e.usage,iterations:f},`第 ${f} 轮完成`),e.finishReason&&(h=e.finishReason),e.finishReason===`tool_calls`&&(k=!0),e.usage&&(b=!0,y.promptTokens+=e.usage.promptTokens||0,y.completionTokens+=e.usage.completionTokens||0,y.totalTokens+=e.usage.totalTokens||0,y.reasoningTokens+=e.usage.reasoningTokens||0,y.cachedTokens+=e.usage.cachedTokens||0);break;case`error`:X.error({error:e.error},`收到 error`),yield F(e.error??`未知错误`);return;default:break}if(k&&d.length>0){if(a!==void 0&&f>=a){h=`max_iterations`,g=`max_iterations`,yield I(f,u);break}if(o!==void 0&&Date.now()-i>=o){h=`max_duration`,g=`max_duration`,yield I(f,u);break}if(c!==void 0&&y.totalTokens>=c){h=`max_tokens`,g=`max_tokens`,yield I(f,u);break}if(s!==void 0&&p+d.length>s){h=`max_tool_calls`,g=`max_tool_calls`,yield I(f,u);break}let e=n.clientToolNames,_=e?d.filter(t=>e.has(t.name)):[];if(_.length>0){X.info({toolNames:_.map(e=>e.name)},`检测到客户端工具调用,透传给客户端`),yield ae(null);for(let e of _){yield L(`tool_call`,f);let t=wi(e.arguments);if(!t.ok){yield N(e.id,e.name,t.result??``,!1,Date.now(),t.error,void 0,`parse_error`,{});continue}let n=this.config.tools?.get(e.name),r=await w(n,t.args);yield fe(e.id,e.name,t.args,n?.ui,r)}let e=Date.now()-i;yield ge(m,`tool_calls`,void 0,e);return}yield ae(null);let v=d.map(e=>({toolCall:e,parsedArgs:wi(e.arguments)}));l.push({role:`assistant`,content:m,toolCalls:v.map(({toolCall:e,parsedArgs:t})=>({...e,arguments:t.argumentsJson})),...T?{thinkingContent:T}:{},...E?{thinkingSignature:E}:{}});for(let{toolCall:e,parsedArgs:a}of v){if(o!==void 0&&Date.now()-i>=o){h=`max_duration`,g=`max_duration`;break}if(s!==void 0&&p>=s){h=`max_tool_calls`,g=`max_tool_calls`;break}if(yield L(`tool_call`,f),!a.ok){let t=Date.now();yield N(e.id,e.name,a.result??``,!1,t,a.error,void 0,`parse_error`,{}),l.push({role:`tool`,content:ki(a.result??``,!1),toolCallId:e.id,toolName:e.name}),p++;continue}if(yield*this.executeSingleTool({toolCall:e,args:a.args,messages:l,context:n,options:r,message:t}),p++,n.signal.aborted){yield xe(`请求已取消`);return}}if(g){yield I(f,u);break}yield I(f,u),m=``;continue}if(!m&&!C){X.warn({model:r.model,thinkingOnly:x,finishReason:h,toolsCount:n.tools?.length??0},`模型返回空响应`);let e=`模型未生成正文,请重试或更换模型。`,t=v(`text`);yield L(`step`,f),yield pe(t),yield me(t,e),yield he(t),m=e}yield I(f,u);break}catch(e){yield I(f,u),n.signal.aborted?yield xe(`请求已取消`):yield F(e instanceof Error?e.message:String(e));return}}g&&X.warn({finishReason:g,maxIterations:a,maxDurationMs:o,maxToolCalls:s,maxTotalTokens:c,iterations:f,toolCallsExecuted:p,totalTokens:y.totalTokens,durationMs:Date.now()-i},`命中执行预算限制:${g}`);let x=Date.now()-i,S=b?{promptTokens:y.promptTokens,completionTokens:y.completionTokens,totalTokens:y.totalTokens,...y.reasoningTokens>0?{reasoningTokens:y.reasoningTokens}:{},...y.cachedTokens>0?{cachedTokens:y.cachedTokens}:{}}:void 0;X.info({model:r.model,duration:`${x}ms`,iterations:f,tokens:S?.totalTokens,finishReason:h},`对话完成`),yield ge(m,h,S,x)}buildMessages(e,t){let n=[];e.systemPrompt&&n.push({role:`system`,content:e.systemPrompt});for(let t of e.history){let e={role:t.role,content:t.content};t.tool_calls&&(e.toolCalls=t.tool_calls.map(e=>({id:e.id,name:e.function.name,arguments:e.function.arguments,thoughtSignature:e.thought_signature}))),t.role===`tool`&&t.tool_call_id&&(e.toolCallId=t.tool_call_id),n.push(e)}return t&&n.push({role:`user`,content:t,images:e.images}),n}async*executeSingleTool(e){let{toolCall:t,args:n,messages:r,context:i,message:a}=e,o=Date.now(),s=new Set(i.tools.map(e=>e.name));if(!s.has(t.name)){let e=this.config.getToolDescriptor?.(t.name),n=!!e||!!this.config.tools?.has(t.name),i=e?.alias??t.name,a=n,s=n?`工具 "${t.name}" 存在,但未在当前聊天工具定义中启用`:`工具 "${t.name}" 未在当前聊天工具定义中声明`,c=n?`请先调用 tool_enable,参数 {"items":[{"ref":"${i}","enabled":true}]};工具定义刷新后再调用 "${i}"。`:`请先使用 tool_search 查找可用工具,并只调用当前已声明的工具。`,l=`denied`,u=JSON.stringify(Ei({message:s,failureReason:l,code:`TOOL_NOT_ENABLED`,category:`permission`,retryable:a,suggestion:c})),d={message:s,code:`TOOL_NOT_ENABLED`,category:`permission`,retryable:a};yield N(t.id,t.name,u,!1,o,d,void 0,l,{}),r.push({role:`tool`,content:ki(u,!1),toolCallId:t.id,toolName:t.name});return}let c=this.config.getAutoRunConfig?await this.config.getAutoRunConfig():e.options.autoRunConfig||this.config.autoRunConfig,l=this.config.tools?.get(t.name),u,d=!0;if(l?.parameters)try{Mr(l.parameters,n)}catch(e){d=!1,X.warn({toolName:t.name,error:String(e)},`工具参数校验失败,跳过审批并交由执行层返回错误`)}if(d)try{u=await w(l,n)}catch(e){X.warn({toolName:t.name,error:String(e)},`工具输入治理预判失败,已提升为 manual`),u={approvalPolicy:`manual`}}else u=l?{approvalPolicy:l.approvalPolicy,sideEffectLevel:l.sideEffectLevel,hostDependency:l.hostDependency}:{};let f=Ti({autoRunConfig:c,tool:l,governance:u});if(d&&f.needsApproval&&this.config.onToolApprovalRequest){let e=this.config.getToolDescriptor?.(t.name),i={toolName:e?.name,extensionId:e?.assetId,alias:e?.alias,displayName:e?.displayName};if(X.info({toolName:t.name},`发送工具批准请求`),yield{type:`tool_approval_request`,data:{id:t.id,name:t.name,...i,args:n,reason:f.reason??`tool-policy`,approvalPolicy:u.approvalPolicy,sideEffectLevel:u.sideEffectLevel,hostDependency:u.hostDependency,...u.riskSummary?{riskSummary:u.riskSummary}:{},...u.riskTags?.length?{riskTags:u.riskTags}:{},...u.riskSignals?.length?{riskSignals:u.riskSignals}:{},requestedAt:Date.now()}},!await this.config.onToolApprovalRequest({id:t.id,name:t.name,...i,args:n})){let e=`denied`,n=JSON.stringify(Ei({message:`用户跳过了此工具`,failureReason:e,code:`TOOL_CALL_SKIPPED`,category:`permission`,retryable:!0,suggestion:`如果需要执行该工具,请重新发起请求并批准工具调用。`}));yield N(t.id,t.name,n,!1,o,{message:`用户跳过了此工具`,code:`TOOL_CALL_SKIPPED`,category:`permission`,retryable:!0,suggestion:`如果需要执行该工具,请重新发起请求并批准工具调用。`},void 0,e,u),r.push({role:`tool`,content:ki(n,!1),toolCallId:t.id,toolName:t.name});return}}yield ue(t.id,t.name,n,l?.ui,u);let p=this.config.tools?.get(t.name),m=i.signal,h;if(p?.timeout){let e=new AbortController;h=setTimeout(()=>e.abort(),p.timeout),i.signal.addEventListener(`abort`,()=>e.abort(),{once:!0}),m=e.signal}let v,b,x=!0,S=l?.ui,C;try{let e=[],r=null,i=()=>r?.(),a=t=>{e.push(t),i()},o=!1,c,d,f={toolCallId:t.id,toolName:t.name,allowedToolNames:Array.from(s),governance:u,onStdout:e=>{e&&a(de(t.id,t.name,`stdout`,e))},onStderr:e=>{e&&a(de(t.id,t.name,`stderr`,e))}};for(this.config.executeTool(t.name,n,m,f).then(e=>{c=e,o=!0,i()}).catch(e=>{d=e,o=!0,i()});!o||e.length>0;){for(;e.length>0;){let t=e.shift();t&&(yield t)}if(o)break;await new Promise(e=>r=e),r=null}if(d)throw d;let p=g(c);S=y(p,l?.ui),v=JSON.stringify(_(p))}catch(e){if(x=!1,E(e))b=e.toolError,C=e.toolError.code===`TIMEOUT`?`timeout`:`execution_error`,v=JSON.stringify(Ei({message:e.toolError.message,failureReason:C,code:e.toolError.code,category:e.toolError.category??Di(e.toolError.code,`runtime`),retryable:e.toolError.retryable,suggestion:e.toolError.suggestion,details:e.toolError.details,cause:e.cause?String(e.cause):void 0}));else{let t=e instanceof Error?e.message:String(e);b={message:t},C=`execution_error`,v=JSON.stringify(Ei({message:t,failureReason:C,category:`runtime`,cause:e instanceof Error&&e.cause?String(e.cause):void 0,stack:e instanceof Error?e.stack:void 0}))}}h!==void 0&&clearTimeout(h),yield N(t.id,t.name,v,x,o,b,S,C,u),r.push({role:`tool`,content:ki(v,x),toolCallId:t.id,toolName:t.name})}};function ji(e){return new Ai(e)}function Mi(){return`tool-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var Ni=class{config;adapter;orchestrator;toolExecutor;abortController=null;toolRuntimeManager;toolConfig;mcpConfigs;initialized=!1;constructor(e,t){if(!e.cwd)throw Error(`AgentConfig.cwd is required (browser-safe: no process.cwd() fallback)`);if(!e.systemPrompt.trim())throw Error(`AgentConfig.systemPrompt is required`);this.config={llmConfig:e.llmConfig,systemPrompt:e.systemPrompt,cwd:e.cwd,maxIterations:e.maxIterations,maxDurationMs:e.maxDurationMs,maxToolCalls:e.maxToolCalls,maxTotalTokens:e.maxTotalTokens,dataEngine:e.dataEngine,audit:e.audit},this.toolExecutor=t,this.toolConfig=e.tools,this.mcpConfigs=e.mcpServers,this.toolRuntimeManager=Br(),this.adapter=new On(e.llmConfig);let n=this.createDefaultSummarize();this.orchestrator=new Ai({maxIterations:e.maxIterations,maxDurationMs:e.maxDurationMs,maxToolCalls:e.maxToolCalls,maxTotalTokens:e.maxTotalTokens,executeTool:this.executeTool.bind(this),tools:this.toolRuntimeManager.getSessionTools(),getToolDescriptor:this.toolRuntimeManager.getDescriptor,onToolApprovalRequest:e.onToolApprovalRequest,getAutoRunConfig:e.getAutoRunConfig,summarize:n,compressionConfig:e.llmConfig.compression,llmConfig:e.llmConfig})}async asyncInit(){if(!this.initialized){if(this.initialized=!0,this.toolConfig){let e=await ie(this.toolConfig),t=Vn(`builtin`);for(let n of e)t.register(n,{source:n.source,category:n.category,tags:n.tags});await this.toolRuntimeManager.addProvider(t),await this.toolRuntimeManager.enable(t.getDescriptors().map(e=>e.id))}if(this.mcpConfigs?.length){let e=await Promise.allSettled(this.mcpConfigs.map(async e=>{let t=Gn(e);await this.toolRuntimeManager.addProvider(t);let n=t.getDescriptors();await this.toolRuntimeManager.enable(n.map(e=>e.id))}));for(let t=0;t<e.length;t++)e[t].status}}}getModelFamilyConfig(e){let t=this.config.llmConfig.models[e];if(t)return V(e,t,this.config.llmConfig)}getModelEndpointInfo(e){let t=this.config.llmConfig.models[e];return{available:this.adapter.supportsModel(e),familyConfig:t?V(e,t,this.config.llmConfig):void 0}}buildSystemPrompt(e){let t=Ie(this.config.llmConfig,e.model),n=this.config.llmConfig.models[t];n&&V(t,n,this.config.llmConfig);let r=this.config.systemPrompt;e.platformPrompt&&(r+=`
33
33
 
34
34
  `+e.platformPrompt),e.skillContents?.length&&(r+=`
35
35
 
36
36
  【用户指令】
37
37
  `+e.skillContents.join(`
38
38
 
39
- `));let i=this.findSearchTool();return e.enableWebSearch&&i&&(r+=`\n\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 ${i.name} 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。`),r}createToolContext(e,t){let n=this.config.cwd,r=this.toolExecutor;return{toolCallId:t?.toolCallId,toolName:t?.toolName,allowedToolNames:t?.allowedToolNames,cwd:n,exec:async(i,a,o)=>{let s=a?.length?`${i} ${a.join(` `)}`:i,c=await r.executeCommand(s,n,e,{onStdout:t?.onStdout,onStderr:t?.onStderr},o?.timeout);return{stdout:c.output??``,stderr:c.error??``,exitCode:c.success?0:1}},signal:e,onStdout:t?.onStdout,onStderr:t?.onStderr,dataEngine:this.config.dataEngine}}async executeTool(e,t,n,r){let i=this.toolRuntimeManager.getSessionTools().get(e);if(!i)return{error:`未知工具: ${e}`};let a=this.toolRuntimeManager.getDescriptor(e),o=r?.governance,s=Mi(),c=this.config.audit,l=c?.startToolCall({id:r?.toolCallId,traceId:s,extensionId:a?.assetId??i.assetId??null,toolName:a?.name??r?.toolName??i.name,displayName:a?.displayName??i.displayName??null,source:a?.source??i.source??null,cwd:this.config.cwd,args:t,approvalPolicy:o?.approvalPolicy??a?.approvalPolicy??i.approvalPolicy??null,sideEffectLevel:o?.sideEffectLevel??a?.sideEffectLevel??i.sideEffectLevel??null,hostDependency:o?.hostDependency??a?.hostDependency??i.hostDependency??null,metadata:{alias:a?.alias??i.alias??e,provider:a?.provider,category:a?.category??i.category,tags:a?.tags??i.tags}})??r?.toolCallId,u=this.createToolContext(n,{...r,toolCallId:l??r?.toolCallId,toolName:a?.name??r?.toolName??i.name});try{let e=await(c?c.runWithContext({toolCallId:l??null,traceId:s},()=>i.execute(t,u)):i.execute(t,u));return l&&c?.finishToolCall({toolCallId:l,traceId:s,result:e}),e}catch(e){throw l&&c?.failToolCall({toolCallId:l,traceId:s,error:e}),e}}getToolDefinitions(e,t){let n=this.toolRuntimeManager.getSessionTools(),r=Array.from(n.values()),i=e===void 0?r:r.filter(t=>e.includes(t.name));if(t?.length){for(let e of t)if(!i.some(t=>t.name===e)){let t=n.get(e);t&&(i=[...i,t])}}return i.map(e=>({name:e.name,description:e.description,parameters:e.parameters}))}findSearchTool(){for(let e of this.toolRuntimeManager.getSessionTools().values())if(e.ui?.type===`render`&&e.ui.name.endsWith(`_search`))return e}getSearchToolNames(){let e=[];for(let t of this.toolRuntimeManager.getSessionTools().values())t.ui?.type===`render`&&t.ui.name.endsWith(`_search`)&&e.push(t.name);return e}getAllTools(){return this.toolRuntimeManager.getSessionToolNames().map(e=>{let t=this.toolRuntimeManager.getDescriptor(e);return t?{name:t.alias,description:t.description,displayName:t.displayName,assetId:t.assetId,source:t.source,category:t.category,parameters:t.parameters,outputSchema:t.outputSchema,resolvedOutputSchema:t.resolvedOutputSchema,errorSchema:t.errorSchema,approvalPolicy:t.approvalPolicy,sideEffectLevel:t.sideEffectLevel,hostDependency:t.hostDependency}:null}).filter(e=>!!e)}async ensureInitialized(){await this.asyncInit()}getToolRuntimeManager(){return this.toolRuntimeManager}async*chat(e,t={},n){await this.ensureInitialized(),this.abortController=new AbortController;let r=this.abortController.signal,i=Fe(this.config.llmConfig,t.model);if(!this.adapter.supportsModel(i)){yield I(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}let a=this.config.llmConfig.models[i];if(!a){yield I(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}if(!H(i,a,this.config.llmConfig)){yield I(`模型 ${i} 无法解析家族配置`,{code:`MODEL_NOT_SUPPORTED`});return}let o=a.supportsThinking,s=(t.thinkingMode??(o?`enabled`:`disabled`))===`enabled`?`enabled`:`disabled`,c=this.buildSystemPrompt(t),l=t.mode===`ask`,u=!l&&t.enableWebSearch?this.getSearchToolNames():void 0,d=async()=>{if(l)return[];let e=t.resolveEnabledTools?await t.resolveEnabledTools():t.enabledTools;return this.getToolDefinitions(e,u)},f=await d(),p=t.userTools||[],m=p.map(e=>({name:e.name,description:e.description,parameters:{...e.parameters,required:e.parameters.required||[]}})),h=[...f,...m],g=p.length>0?new Set(p.map(e=>e.name)):void 0,_=s===`enabled`&&o,v={systemPrompt:c,history:t.history||[],tools:h,refreshTools:m.length>0?async()=>[...await d(),...m]:d,signal:r,images:n,clientToolNames:g};try{yield*this.orchestrator.chat(this.adapter,e,v,{model:i,enableThinking:_,autoRunConfig:t.autoRunConfig,maxIterations:t.maxIterations,maxDurationMs:t.maxDurationMs,maxToolCalls:t.maxToolCalls,maxTotalTokens:t.maxTotalTokens})}finally{this.abortController=null}}abort(){this.abortController&&this.abortController.abort()}setCwd(e){this.config.cwd=e}getConfig(){return{...this.config}}getSupportedModels(){return Mn(this.config.llmConfig)}getMcpConnections(){return this.toolRuntimeManager.getMcpConnectionInfos()}createDefaultSummarize(){return async(e,t,n)=>{if(!this.adapter.supportsModel(n))throw Error(`压缩模型 ${n} 无可用路由,请在 LLMConfig.models 中配置`);let r=new AbortController,i=[{role:`system`,content:e},{role:`user`,content:t}],a=``;for await(let e of this.adapter.streamOnce(i,[],{model:n,signal:r.signal}))if(e.type===`text_delta`&&e.delta&&(a+=e.delta),e.type===`error`)throw Error(e.error??`压缩请求失败`);return a.trim()}}async destroy(){await this.toolRuntimeManager.destroy()}};function Pi(e){return e.replace(/_v\d+$/,``)}function Fi(e,t){let n=t.toLowerCase();return!!(e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function Ii(){let e=new Map;return{add(t){e.set(t.id,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>Fi(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function Z(e,t={}){return{...Wr({kind:`skill`,scope:e.source===`system`||e.source===`bundled`?`core`:`local`,runtime:`prompt-injection`,governance:t.governance??Jr()}),ref:e.id,id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:e.source,enabled:e.enabled,references:e.references,scripts:e.scripts,dirPath:e.dirPath,displayName:e.displayName,shortDescription:e.shortDescription,defaultPrompt:e.defaultPrompt,...t}}function Li(e,t={}){return{...Z(e),...t}}function Q(e){return typeof e==`string`?e:``}function $(e){return typeof e==`string`?e:void 0}function Ri(e,t){return typeof e==`boolean`?e:t}function zi(e){if(Array.isArray(e))return e.filter(e=>typeof e==`string`)}function Bi(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=Object.entries(e).filter(e=>typeof e[0]==`string`&&typeof e[1]==`string`);return Object.fromEntries(t)}function Vi(e){let t=$(e);if(t)return t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Hi(e){return e===`system`||e===`bundled`||e===`market`||e===`user`}function Ui(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.id==`string`&&typeof t.enabled==`boolean`}function Wi(e){return{keyword:$(e.keyword),category:$(e.category),tags:$(e.tags),source:Hi(e.source)?e.source:void 0}}function Gi(e){return{id:Q(e.id),name:Q(e.name),description:Q(e.description),instructions:Q(e.instructions),category:$(e.category)??`通用`,tags:zi(e.tags)??[],icon:$(e.icon)??`✨`}}function Ki(e,t){return{id:Q(e.id),name:Q(e.name),description:Q(e.description),instructions:Q(e.instructions),category:$(e.category)??t?.category??`通用`,tags:zi(e.tags)??t?.tags??[],icon:$(e.icon)??t?.icon??`✨`}}function qi(e){return Array.isArray(e.items)?e.items.filter(Ui):[]}function Ji(e){return{id:Q(e.id),referenceName:Q(e.referenceName)}}function Yi(e){return{id:Q(e.id)}}function Xi(e,t,n={}){return{count:t.length,[e]:t,...n}}function Zi(e,t,n={}){return{[e]:t,...n}}function Qi(e,t,n,r={}){return{action:e,[t]:n,...r}}function $i(e,t={}){return{action:`enabled`,results:e,enabledCount:e.filter(e=>e.enabled&&!e.error).length,disabledCount:e.filter(e=>!e.enabled&&!e.error).length,...t}}function ea(e){return{id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:`user`,enabled:!0,references:[],scripts:[]}}function ta(e,t,n){let r=e.registry.get(t);return r?r.source===`user`?{meta:r}:{error:`技能 "${t}" 是 ${r.source} 技能,仅可${n} user 来源的技能`}:{error:`技能 "${t}" 不存在${n===`更新`?`。如需新建,请使用 skill_create。`:``}`}}function na(e,t){let n=e.registry.search({keyword:t.keyword,category:t.category,tags:Vi(t.tags),source:t.source});return n.length===0?Xi(`skills`,[],{found:0,hint:`没有匹配的技能。尝试更宽泛的关键词,或省略过滤条件。`,categories:e.registry.categories()}):Xi(`skills`,n.map(e=>Z(e)),{found:n.length})}function ra(e){return Xi(`skills`,e.registry.listEnabled().map(e=>Z(e)))}async function ia(e,t){if(!e.onSkillCreate)return{error:`当前环境未配置技能持久化,无法创建技能`};if(e.registry.has(t.id))return{error:`技能 "${t.id}" 已存在。如需更新,请使用 skill_update。`};let n=await e.onSkillCreate(t);if(`error`in n)return{error:n.error};let r=e.registry.get(t.id)??ea(t);return e.registry.add(r),await e.onSkillSetEnabled(t.id,!0),Qi(`created`,`skill`,Z(e.registry.get(t.id)??{...r,enabled:!0}),{message:`技能 "${t.name}" 已创建并启用,将在下次对话中生效`})}async function aa(e,t){if(!e.onSkillUpdate)return{error:`当前环境未配置技能持久化,无法更新技能`};let n=ta(e,t.id,`更新`);if(n.error)return{error:n.error};let r=n.meta,i={...r,name:t.name,description:t.description,category:t.category||r.category,tags:t.tags,icon:t.icon},a=await e.onSkillUpdate({id:t.id,name:i.name,description:i.description,instructions:t.instructions,category:i.category,tags:i.tags,icon:i.icon});return`error`in a?{error:a.error}:(e.registry.add(i),Qi(`updated`,`skill`,Z(i),{enabled:r.enabled,message:`技能 "${i.name}" 已更新${r.enabled?`,将在下次对话中生效`:``}`}))}async function oa(e,t){if(t.length===0)return{error:`请传入至少一个技能`};let n=[];for(let r of t){if(!e.registry.has(r.id)){n.push({id:r.id,enabled:!1,error:`技能不存在: ${r.id}`});continue}e.registry.setEnabled(r.id,r.enabled),await e.onSkillSetEnabled(r.id,r.enabled);let t=e.registry.get(r.id);n.push({id:r.id,enabled:r.enabled,skill:t?Z(t):void 0})}let r=n.filter(e=>!e.error).length;return $i(n,{message:`已更新 ${r} 个技能的状态`})}async function sa(e,t){if(!e.onSkillDelete)return{error:`当前环境未配置技能持久化,无法删除技能`};let n=ta(e,t,`删除`);if(n.error)return{error:n.error};let r=n.meta,i=await e.onSkillDelete(t);return i.ok?(e.registry.remove(t),Qi(`deleted`,`skill`,Z(r),{message:`技能 "${r.name}" 已彻底删除`})):{error:i.error??`删除失败`}}async function ca(e,t){let n=e.registry.get(t);if(!n)return{error:`技能 "${t}" 不存在`};let r=await e.onSkillLoadContent(t);return`error`in r?Zi(`skill`,Li(n,{instructionsError:r.error})):Zi(`skill`,Li(n,{instructions:r.instructions}))}async function la(e,t){return e.onSkillLoadReference(t.id,t.referenceName)}function ua(e){return[{name:`skill_search`,description:`搜索可用技能。按关键词/分类/标签/来源查找,返回匹配技能的名称和描述。找到后用 skill_enable 启用,或用 skill_inspect 查看详情。`,parameters:{type:`object`,properties:{keyword:{type:`string`,description:`关键词(匹配名称、描述、标签)`},category:{type:`string`,description:`按分类过滤`},tags:{type:`string`,description:`按标签过滤(逗号分隔,AND 逻辑)`},source:{type:`string`,description:`按来源过滤:system | bundled | market | user`}}},execute:async t=>na(e,Wi(t))},{name:`skill_list`,description:`列出当前已启用的技能,这些技能的指令会被注入到系统提示中。`,parameters:{type:`object`,properties:{}},execute:async()=>ra(e)},{name:`skill_create`,description:`创建一个新技能。传入结构化参数,系统自动完成持久化和注册。创建成功后默认启用。当需求只是沉淀策略、约束和知识,而不需要执行逻辑或渲染 UI 时,优先创建 skill。`+(e.onSkillCreate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID(kebab-case,全局唯一,如 "my-skill")`},name:{type:`string`,description:`技能名称`},description:{type:`string`,description:`一句话描述`},instructions:{type:`string`,description:`技能指令内容(Markdown 格式)`},category:{type:`string`,description:`分类,默认 "通用"`},tags:{type:`array`,description:`标签列表`,items:{type:`string`}},icon:{type:`string`,description:`Emoji 图标,默认 "✨"`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>ia(e,Gi(t))},{name:`skill_update`,description:`原地更新已存在的技能。覆盖指令内容和元数据,保留当前启用状态。`+(e.onSkillUpdate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要更新的技能 ID(必须已存在)`},name:{type:`string`,description:`新的技能名称`},description:{type:`string`,description:`新的一句话描述`},instructions:{type:`string`,description:`新的技能指令内容(Markdown 格式)`},category:{type:`string`,description:`新的分类`},tags:{type:`array`,description:`新的标签列表`,items:{type:`string`}},icon:{type:`string`,description:`新的 Emoji 图标`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>{let n=Yi(t).id;return aa(e,Ki(t,e.registry.get(n)))}},{name:`skill_enable`,description:`批量设置技能的启用/禁用状态。启用的技能会被注入系统提示。`,parameters:{type:`object`,properties:{items:{type:`array`,description:`每项包含 id 和 enabled`,items:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},enabled:{type:`boolean`,description:`true 启用,false 禁用`}},required:[`id`,`enabled`]}}},required:[`items`]},execute:async t=>oa(e,qi(t))},{name:`skill_delete`,description:`彻底删除技能(从注册表和持久化存储中移除)。仅可删除 user 来源的技能。`+(e.onSkillDelete?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要删除的技能 ID`}},required:[`id`]},execute:async t=>sa(e,Yi(t).id)},{name:`skill_inspect`,description:`查看技能的完整指令内容和元数据。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`}},required:[`id`]},execute:async t=>ca(e,Yi(t).id)},{name:`skill_load_reference`,description:`读取技能的某个参考文档内容。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},referenceName:{type:`string`,description:`参考文档文件名(从 skill_inspect 返回的 references 列表中获取)`}},required:[`id`,`referenceName`]},execute:async t=>la(e,Ji(t))}]}function da(e){return{tools:ua(e)}}const fa=`doubao-seed-2-0-pro-260215`;function pa(e){return mn(e)}const ma={"openai/responses":`/openai/v1/responses`,"anthropic/messages":`/anthropic/v1/messages`,"google/gemini-generate":`/google-ai-studio/v1beta/models/{model}:generateContent`,"xai-grok/chat-completions":`/grok/v1/responses`};function ha(e){let t=e?.trim();return t&&pa(t)?t:null}function ga(e){return e?.trim().replace(/\/+$/,``)||null}function _a(e){let t=e?.serverUpstream;if(t===`direct`)return{serverUpstream:`direct`,proxyPathPrefix:null};if(t===`llm_proxy`){let t=e?.proxyPathPrefix?.trim();return t?{serverUpstream:`llm_proxy`,proxyPathPrefix:t.startsWith(`/`)?t:`/${t}`}:null}return null}function va(e,t){let n=e.replace(/\/$/,``),r=t.trim();return r?`${n}${r.startsWith(`/`)?r:`/${r}`}`:n}function ya(e){let t=e.trim();return t?t.startsWith(`/`)?t:`/${t}`:``}function ba(e){return _a(e)?.serverUpstream===`llm_proxy`?`llm-proxy`:`direct`}function xa(e,t){let n=_a(e);if(!n)return null;if(n.serverUpstream===`llm_proxy`){let r=t.llmProxyApiKey?.trim();if(!r||!n.proxyPathPrefix)return null;let i=ma[e.protocolId]??va(n.proxyPathPrefix,e.protocolPath);return{protocol:e.chatRuntimeProtocol,baseUrl:t.llmProxyBaseUrl.replace(/\/$/,``),path:ya(i),accessKey:r,providerModelId:e.providerModelId}}let r=t.supplierApiKeys[e.supplierId]?.trim();return r?{protocol:e.chatRuntimeProtocol,baseUrl:e.protocolBaseUrl.replace(/\/$/,``),path:ya(e.protocolPath),accessKey:r,providerModelId:e.providerModelId}:null}function Sa(e){let t=e.trim();return t?t.startsWith(`/`)?t:`/${t}`:``}function Ca(e,t,n){let r=ga(e.officialProxyBaseUrl);if(!r)throw Error(`供应商 ${e.supplierId} 不支持官方线路`);return{baseUrl:r,path:Sa(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId,headers:n}}function wa(e,t){return{baseUrl:e.protocolBaseUrl.replace(/\/$/,``),path:Sa(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId}}function Ta(e){return{displayName:e.displayName,family:e.family,supportsThinking:e.supportsThinking,supportsVision:e.supportsVision,contextWindowTokens:e.contextWindowTokens,maxOutputTokens:e.maxOutputTokens}}function Ea(e,t){let n=null,r={supplierId:e.supplierId,offeringModelId:e.offeringModelId,profileId:e.profileId,protocolId:e.protocolId,...e.status===`deprecated`?{status:`deprecated`}:{}};if(t.mode===`official`)n=Ca(e,t.accessKey,t.headers),r.source=`huyooo-official`;else if(t.mode===`byok`)n=wa(e,t.accessKey),r.source=`byok`;else{if(n=xa(e,t.env),!n)return null;r.source=`huyooo-official`,r.upstream=ba(e)}return{...Ta(e),endpoint:n,metadata:r}}function Da(e,t,n){let r=n?.preferredOfferingModelId?.trim();if(r&&t[r])return r;let i=n?.preferredProfileId?.trim()||`doubao-seed-2-0-pro-260215`,a=e.find(e=>e.profileId===i&&t[e.offeringModelId]);if(a)return a.offeringModelId;let o=e.find(e=>e.officialEligible&&t[e.offeringModelId]);if(o)return o.offeringModelId;let s=Object.keys(t)[0];if(!s)throw Error(`没有可用对话模型,请检查目录与出站配置`);return s}function Oa(e,t){return{models:{[e]:t},defaultModel:e}}function ka(e){let t=Ea(e,{mode:`byok`,accessKey:`YOUR_API_KEY`});if(!t)throw Error(`模型 ${e.offeringModelId} 无法编译 BYOK endpoint`);let n={catalogItem:e,llmConfigByok:Oa(e.offeringModelId,t),downstreamApis:{modelOptions:{method:`POST`,path:`/modelCatalog/chat/modelOptions`,body:{supplierIds:[e.supplierId]}},supplierOptions:{method:`POST`,path:`/modelCatalog/chat/supplierOptions`},integrationExport:{method:`POST`,path:`/modelCatalog/chat/integrationExport`,body:{offeringModelId:e.offeringModelId}},reloadRuntime:{method:`POST`,path:`/modelCatalog/chat/reloadRuntime`}},compileHints:[`SuperX / Electron:拉 modelOptions 后 compileChatModelConfig(item, { mode: "official", accessKey, headers }) 与 { mode: "byok", accessKey }`,`ai-server 平台对话:compileChatModelConfig(item, { mode: "server", env: ServerChatEnv })`,`请求 model 时可传 offeringModelId、profileId(${e.profileId})或 providerModelId(${e.providerModelId})`]};if(e.officialEligible){let t=Ea(e,{mode:`official`,accessKey:`YOUR_HUYOOO_SESSION_OR_OFFICIAL_TOKEN`,headers:{}});t&&(n.llmConfigOfficial=Oa(e.offeringModelId,t))}return n}const Aa=[`openrouter`,`volcengine-ark-coding-plan`,`volcengine-ark-agent-plan`];function ja(e){for(let t of Aa)if(t===e)return!0;return!1}function Ma(e){return e===`agent_proxy`?`agent_proxy`:`agent_vendor`}function Na(e,t){return ja(e)?`agent_proxy`:Ma(t)}const Pa={ark_v1:`ark_v1 · 火山 Responses`,deepseek_v1:`deepseek_v1 · DeepSeek Chat`,qwen_v1:`qwen_v1 · 通义多模态`,qwen_text_v1:`qwen_text_v1 · 通义文本生成`,glm_v1:`glm_v1 · 智谱 GLM`,moonshot_v1:`moonshot_v1 · Kimi`,minimax_v1:`minimax_v1 · MiniMax Anthropic 兼容`,vercel_gateway_v1:`vercel_gateway_v1 · Vercel AI Gateway`,anthropic_v1:`anthropic_v1 · Anthropic Messages`,gemini_v1:`gemini_v1 · Gemini Generate`,openai_v1:`openai_v1 · OpenAI Responses`,openai_chat_v1:`openai_chat_v1 · OpenAI Chat Completions 兼容`,grok_v1:`grok_v1 · xAI Grok`},Fa=ze.map(e=>({value:e,label:Pa[e]}));function Ia(e){let t=e?.trim();return t?Fa.find(e=>e.value===t)?.label??t:`—`}function La(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function Ra(){let e=new Map;return{add(t){e.set(t.name,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>La(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function za(e,t={}){return{...Wr({kind:`part`,scope:e.source===`user`?`local`:`core`,runtime:`part-render`,governance:t.governance??qr()}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags,source:e.source,enabled:e.enabled,...t}}function Ba(e,t){return{...za(e),...t}}export{zt as AnthropicProtocol,Ze as ArkProtocol,fn as BUILTIN_PROTOCOL_FACTORIES,ze as BUILTIN_PROTOCOL_IDS,ae as CHAT_EVENT_TYPES,Fa as CHAT_RUNTIME_PROTOCOL_OPTIONS,Cn as CLAUDE_FAMILY,Ai as ChatOrchestrator,Ni as ChatRuntime,gn as DEEPSEEK_FAMILY,fa as DEFAULT_CHAT_PROFILE_ID,hn as DOUBAO_FAMILY,it as DeepSeekProtocol,xn as GEMINI_FAMILY,Sn as GPT_FAMILY,wn as MODEL_FAMILIES,Dn as ModelAdapter,on as OpenAIChatProtocol,Aa as PROXY_SUPPLIER_IDS,_n as QWEN_FAMILY,lt as QwenProtocol,ma as SERVER_LLM_PROXY_PATH_BY_PROTOCOL,O as STANDARD_TOOL_ERROR_SCHEMA,G as TOOL_FORMATS,T as ToolException,n as Type,ni as analyzeCommandRisk,ka as buildChatModelIntegrationExport,Mn as buildModelOptions,Ea as compileChatModelConfig,be as createAbort,Qi as createActionResult,Ut as createAnthropicProtocol,I as createApiError,Qe as createArkProtocol,Wr as createAssetSummaryBase,R as createAssistantSegmentStart,Xi as createCollectionResult,ti as createCommandGovernanceSnapshot,ei as createCommandToolMetadata,at as createDeepSeekProtocol,he as createDone,F as createError,Bn as createInProcessProvider,Zi as createInspectResult,Kr as createLocalMcpServerGovernance,Gr as createLocalToolGovernance,oi as createManagedMcpServerDetail,ai as createManagedMcpServerSummary,Ba as createManagedPartDetail,za as createManagedPartSummary,Li as createManagedSkillDetail,Z as createManagedSkillSummary,ii as createManagedToolDetail,ri as createManagedToolSummary,Wn as createMcpProvider,z as createModuleLogger,sn as createOpenAIChatProtocol,ji as createOrchestrator,ye as createParseError,qr as createPartAssetGovernance,pt as createQwenProtocol,mt as createQwenTextProtocol,ge as createRateLimitError,te as createResolvedOutputSchema,L as createStepEnd,xe as createStepStart,pe as createTextDelta,se as createThinkingDelta,ce as createThinkingEnd,oe as createThinkingStart,ve as createTimeoutError,$i as createToggleResult,ue as createToolCallOutput,de as createToolCallRequest,P as createToolCallResult,le as createToolCallStart,_e as createToolError,zr as createToolRuntimeManager,Lt as createVercelGatewayProtocol,Ir as defineTool,Re as findEndpointByProtocol,Ia as formatChatRuntimeProtocolLabel,On as formatContextWindow,Pi as getBaseProtocol,Ri as getBooleanWithDefault,pn as getBuiltinProtocolFactories,Ke as getLogger,Nn as getModelContextConfigFromLLM,Le as getModelEndpoint,$ as getOptionalString,Q as getRequiredString,ba as getServerChatUpstream,zi as getStringArray,Bi as getStringRecord,Sr as hasToolFormat,Ge as initLogger,je as isAbortEvent,Ne as isAssistantSegmentEvent,pa as isChatRuntimeProtocolId,Ae as isErrorEvent,ja as isProxySupplierId,mn as isRegisteredProtocolId,Pe as isRetryableError,ke as isStatusEvent,Me as isStepEvent,Oe as isTextEvent,Ee as isThinkingEvent,E as isToolError,De as isToolEvent,h as isToolResult,C as mergeToolGovernance,Ma as normalizeCatalogSupplierKind,g as normalizeToolResult,Ra as partRegistry,Xr as readAssetGovernanceOverrides,xr as registerToolFormat,br as registerToolFormats,Na as resolveCatalogSupplierKind,Fe as resolveChatModel,ha as resolveChatRuntimeProtocol,Da as resolveDefaultChatOfferingModelId,Ie as resolveEndpointUrl,H as resolveModelFamilyConfig,ga as resolveOfficialProxyBaseUrl,xa as resolveServerChatEndpoint,_a as resolveServerSupplierPolicy,w as resolveToolGovernanceSnapshot,y as resolveToolResultUi,ie as resolveTools,_ as serializeToolResult,da as skillManagementPlugin,Ii as skillRegistry,Vi as splitCommaSeparatedStrings,D as throwToolError,Yr as toAssetGovernanceOverrides,ne as tool,p as toolOk,re as tools,jr as validateJsonSchemaArgs,Ar as validateTypeBoxArgs};
39
+ `));let i=this.findSearchTool();return e.enableWebSearch&&i&&(r+=`\n\n【联网搜索】当用户问题需要实时信息/最新事实/可引用来源时,请先调用 ${i.name} 工具获取结果,然后基于返回的 title/url/snippet 作答,并在回答中给出来源链接。`),r}createToolContext(e,t){let n=this.config.cwd,r=this.toolExecutor;return{toolCallId:t?.toolCallId,toolName:t?.toolName,allowedToolNames:t?.allowedToolNames,cwd:n,exec:async(i,a,o)=>{let s=a?.length?`${i} ${a.join(` `)}`:i,c=await r.executeCommand(s,n,e,{onStdout:t?.onStdout,onStderr:t?.onStderr},o?.timeout);return{stdout:c.output??``,stderr:c.error??``,exitCode:c.success?0:1}},signal:e,onStdout:t?.onStdout,onStderr:t?.onStderr,dataEngine:this.config.dataEngine}}async executeTool(e,t,n,r){let i=this.toolRuntimeManager.getSessionTools().get(e);if(!i)return{error:`未知工具: ${e}`};let a=this.toolRuntimeManager.getDescriptor(e),o=r?.governance,s=Mi(),c=this.config.audit,l=c?.startToolCall({id:r?.toolCallId,traceId:s,extensionId:a?.assetId??i.assetId??null,toolName:a?.name??r?.toolName??i.name,displayName:a?.displayName??i.displayName??null,source:a?.source??i.source??null,cwd:this.config.cwd,args:t,approvalPolicy:o?.approvalPolicy??a?.approvalPolicy??i.approvalPolicy??null,sideEffectLevel:o?.sideEffectLevel??a?.sideEffectLevel??i.sideEffectLevel??null,hostDependency:o?.hostDependency??a?.hostDependency??i.hostDependency??null,metadata:{alias:a?.alias??i.alias??e,provider:a?.provider,category:a?.category??i.category,tags:a?.tags??i.tags}})??r?.toolCallId,u=this.createToolContext(n,{...r,toolCallId:l??r?.toolCallId,toolName:a?.name??r?.toolName??i.name});try{let e=await(c?c.runWithContext({toolCallId:l??null,traceId:s},()=>i.execute(t,u)):i.execute(t,u));return l&&c?.finishToolCall({toolCallId:l,traceId:s,result:e}),e}catch(e){throw l&&c?.failToolCall({toolCallId:l,traceId:s,error:e}),e}}getToolDefinitions(e,t){let n=this.toolRuntimeManager.getSessionTools(),r=Array.from(n.values()),i=e===void 0?r:r.filter(t=>e.includes(t.name));if(t?.length){for(let e of t)if(!i.some(t=>t.name===e)){let t=n.get(e);t&&(i=[...i,t])}}return i.map(e=>({name:e.name,description:e.description,parameters:e.parameters}))}findSearchTool(){for(let e of this.toolRuntimeManager.getSessionTools().values())if(e.ui?.type===`render`&&e.ui.name.endsWith(`_search`))return e}getSearchToolNames(){let e=[];for(let t of this.toolRuntimeManager.getSessionTools().values())t.ui?.type===`render`&&t.ui.name.endsWith(`_search`)&&e.push(t.name);return e}getAllTools(){return this.toolRuntimeManager.getSessionToolNames().map(e=>{let t=this.toolRuntimeManager.getDescriptor(e);return t?{name:t.alias,description:t.description,displayName:t.displayName,assetId:t.assetId,source:t.source,category:t.category,parameters:t.parameters,outputSchema:t.outputSchema,resolvedOutputSchema:t.resolvedOutputSchema,errorSchema:t.errorSchema,approvalPolicy:t.approvalPolicy,sideEffectLevel:t.sideEffectLevel,hostDependency:t.hostDependency}:null}).filter(e=>!!e)}async ensureInitialized(){await this.asyncInit()}getToolRuntimeManager(){return this.toolRuntimeManager}async*chat(e,t={},n){await this.ensureInitialized(),this.abortController=new AbortController;let r=this.abortController.signal,i=Ie(this.config.llmConfig,t.model);if(!this.adapter.supportsModel(i)){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}let a=this.config.llmConfig.models[i];if(!a){yield F(`模型 ${i} 未在 LLMConfig.models 中配置`,{code:`MODEL_NOT_SUPPORTED`});return}if(!V(i,a,this.config.llmConfig)){yield F(`模型 ${i} 无法解析家族配置`,{code:`MODEL_NOT_SUPPORTED`});return}let o=a.supportsThinking,s=(t.thinkingMode??(o?`enabled`:`disabled`))===`enabled`?`enabled`:`disabled`,c=this.buildSystemPrompt(t),l=t.mode===`ask`,u=!l&&t.enableWebSearch?this.getSearchToolNames():void 0,d=async()=>{if(l)return[];let e=t.resolveEnabledTools?await t.resolveEnabledTools():t.enabledTools;return this.getToolDefinitions(e,u)},f=await d(),p=t.userTools||[],m=p.map(e=>({name:e.name,description:e.description,parameters:{...e.parameters,required:e.parameters.required||[]}})),h=[...f,...m],g=p.length>0?new Set(p.map(e=>e.name)):void 0,_=s===`enabled`&&o,v={systemPrompt:c,history:t.history||[],tools:h,refreshTools:m.length>0?async()=>[...await d(),...m]:d,signal:r,images:n,clientToolNames:g};try{yield*this.orchestrator.chat(this.adapter,e,v,{model:i,enableThinking:_,autoRunConfig:t.autoRunConfig,maxIterations:t.maxIterations,maxDurationMs:t.maxDurationMs,maxToolCalls:t.maxToolCalls,maxTotalTokens:t.maxTotalTokens})}finally{this.abortController=null}}abort(){this.abortController&&this.abortController.abort()}setCwd(e){this.config.cwd=e}getConfig(){return{...this.config}}getSupportedModels(){return Nn(this.config.llmConfig)}getMcpConnections(){return this.toolRuntimeManager.getMcpConnectionInfos()}createDefaultSummarize(){return async(e,t,n)=>{if(!this.adapter.supportsModel(n))throw Error(`压缩模型 ${n} 无可用路由,请在 LLMConfig.models 中配置`);let r=new AbortController,i=[{role:`system`,content:e},{role:`user`,content:t}],a=``;for await(let e of this.adapter.streamOnce(i,[],{model:n,signal:r.signal}))if(e.type===`text_delta`&&e.delta&&(a+=e.delta),e.type===`error`)throw Error(e.error??`压缩请求失败`);return a.trim()}}async destroy(){await this.toolRuntimeManager.destroy()}};function Pi(e){return e.replace(/_v\d+$/,``)}function Fi(e,t){let n=t.toLowerCase();return!!(e.id.toLowerCase().includes(n)||e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function Ii(){let e=new Map;return{add(t){e.set(t.id,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>Fi(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function Z(e,t={}){return{...G({kind:`skill`,scope:e.source===`system`||e.source===`bundled`?`core`:`local`,runtime:`prompt-injection`,governance:t.governance??Jr()}),ref:e.id,id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:e.source,enabled:e.enabled,references:e.references,scripts:e.scripts,dirPath:e.dirPath,displayName:e.displayName,shortDescription:e.shortDescription,defaultPrompt:e.defaultPrompt,...t}}function Li(e,t={}){return{...Z(e),...t}}function Q(e){return typeof e==`string`?e:``}function $(e){return typeof e==`string`?e:void 0}function Ri(e,t){return typeof e==`boolean`?e:t}function zi(e){if(Array.isArray(e))return e.filter(e=>typeof e==`string`)}function Bi(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=Object.entries(e).filter(e=>typeof e[0]==`string`&&typeof e[1]==`string`);return Object.fromEntries(t)}function Vi(e){let t=$(e);if(t)return t.split(`,`).map(e=>e.trim()).filter(Boolean)}function Hi(e){return e===`system`||e===`bundled`||e===`market`||e===`user`}function Ui(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.id==`string`&&typeof t.enabled==`boolean`}function Wi(e){return{keyword:$(e.keyword),category:$(e.category),tags:$(e.tags),source:Hi(e.source)?e.source:void 0}}function Gi(e){return{id:Q(e.id),name:Q(e.name),description:Q(e.description),instructions:Q(e.instructions),category:$(e.category)??`通用`,tags:zi(e.tags)??[],icon:$(e.icon)??`✨`}}function Ki(e,t){return{id:Q(e.id),name:Q(e.name),description:Q(e.description),instructions:Q(e.instructions),category:$(e.category)??t?.category??`通用`,tags:zi(e.tags)??t?.tags??[],icon:$(e.icon)??t?.icon??`✨`}}function qi(e){return Array.isArray(e.items)?e.items.filter(Ui):[]}function Ji(e){return{id:Q(e.id),referenceName:Q(e.referenceName)}}function Yi(e){return{id:Q(e.id)}}function Xi(e,t,n={}){return{count:t.length,[e]:t,...n}}function Zi(e,t,n={}){return{[e]:t,...n}}function Qi(e,t,n,r={}){return{action:e,[t]:n,...r}}function $i(e,t={}){return{action:`enabled`,results:e,enabledCount:e.filter(e=>e.enabled&&!e.error).length,disabledCount:e.filter(e=>!e.enabled&&!e.error).length,...t}}function ea(e){return{id:e.id,name:e.name,description:e.description,category:e.category,tags:e.tags,icon:e.icon,source:`user`,enabled:!0,references:[],scripts:[]}}function ta(e,t,n){let r=e.registry.get(t);return r?r.source===`user`?{meta:r}:{error:`技能 "${t}" 是 ${r.source} 技能,仅可${n} user 来源的技能`}:{error:`技能 "${t}" 不存在${n===`更新`?`。如需新建,请使用 skill_create。`:``}`}}function na(e,t){let n=e.registry.search({keyword:t.keyword,category:t.category,tags:Vi(t.tags),source:t.source});return n.length===0?Xi(`skills`,[],{found:0,hint:`没有匹配的技能。尝试更宽泛的关键词,或省略过滤条件。`,categories:e.registry.categories()}):Xi(`skills`,n.map(e=>Z(e)),{found:n.length})}function ra(e){return Xi(`skills`,e.registry.listEnabled().map(e=>Z(e)))}async function ia(e,t){if(!e.onSkillCreate)return{error:`当前环境未配置技能持久化,无法创建技能`};if(e.registry.has(t.id))return{error:`技能 "${t.id}" 已存在。如需更新,请使用 skill_update。`};let n=await e.onSkillCreate(t);if(`error`in n)return{error:n.error};let r=e.registry.get(t.id)??ea(t);return e.registry.add(r),await e.onSkillSetEnabled(t.id,!0),Qi(`created`,`skill`,Z(e.registry.get(t.id)??{...r,enabled:!0}),{message:`技能 "${t.name}" 已创建并启用,将在下次对话中生效`})}async function aa(e,t){if(!e.onSkillUpdate)return{error:`当前环境未配置技能持久化,无法更新技能`};let n=ta(e,t.id,`更新`);if(n.error)return{error:n.error};let r=n.meta,i={...r,name:t.name,description:t.description,category:t.category||r.category,tags:t.tags,icon:t.icon},a=await e.onSkillUpdate({id:t.id,name:i.name,description:i.description,instructions:t.instructions,category:i.category,tags:i.tags,icon:i.icon});return`error`in a?{error:a.error}:(e.registry.add(i),Qi(`updated`,`skill`,Z(i),{enabled:r.enabled,message:`技能 "${i.name}" 已更新${r.enabled?`,将在下次对话中生效`:``}`}))}async function oa(e,t){if(t.length===0)return{error:`请传入至少一个技能`};let n=[];for(let r of t){if(!e.registry.has(r.id)){n.push({id:r.id,enabled:!1,error:`技能不存在: ${r.id}`});continue}e.registry.setEnabled(r.id,r.enabled),await e.onSkillSetEnabled(r.id,r.enabled);let t=e.registry.get(r.id);n.push({id:r.id,enabled:r.enabled,skill:t?Z(t):void 0})}let r=n.filter(e=>!e.error).length;return $i(n,{message:`已更新 ${r} 个技能的状态`})}async function sa(e,t){if(!e.onSkillDelete)return{error:`当前环境未配置技能持久化,无法删除技能`};let n=ta(e,t,`删除`);if(n.error)return{error:n.error};let r=n.meta,i=await e.onSkillDelete(t);return i.ok?(e.registry.remove(t),Qi(`deleted`,`skill`,Z(r),{message:`技能 "${r.name}" 已彻底删除`})):{error:i.error??`删除失败`}}async function ca(e,t){let n=e.registry.get(t);if(!n)return{error:`技能 "${t}" 不存在`};let r=await e.onSkillLoadContent(t);return`error`in r?Zi(`skill`,Li(n,{instructionsError:r.error})):Zi(`skill`,Li(n,{instructions:r.instructions}))}async function la(e,t){return e.onSkillLoadReference(t.id,t.referenceName)}function ua(e){return[{name:`skill_search`,description:`搜索可用技能。按关键词/分类/标签/来源查找,返回匹配技能的名称和描述。找到后用 skill_enable 启用,或用 skill_inspect 查看详情。`,parameters:{type:`object`,properties:{keyword:{type:`string`,description:`关键词(匹配名称、描述、标签)`},category:{type:`string`,description:`按分类过滤`},tags:{type:`string`,description:`按标签过滤(逗号分隔,AND 逻辑)`},source:{type:`string`,description:`按来源过滤:system | bundled | market | user`}}},execute:async t=>na(e,Wi(t))},{name:`skill_list`,description:`列出当前已启用的技能,这些技能的指令会被注入到系统提示中。`,parameters:{type:`object`,properties:{}},execute:async()=>ra(e)},{name:`skill_create`,description:`创建一个新技能。传入结构化参数,系统自动完成持久化和注册。创建成功后默认启用。当需求只是沉淀策略、约束和知识,而不需要执行逻辑或渲染 UI 时,优先创建 skill。`+(e.onSkillCreate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID(kebab-case,全局唯一,如 "my-skill")`},name:{type:`string`,description:`技能名称`},description:{type:`string`,description:`一句话描述`},instructions:{type:`string`,description:`技能指令内容(Markdown 格式)`},category:{type:`string`,description:`分类,默认 "通用"`},tags:{type:`array`,description:`标签列表`,items:{type:`string`}},icon:{type:`string`,description:`Emoji 图标,默认 "✨"`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>ia(e,Gi(t))},{name:`skill_update`,description:`原地更新已存在的技能。覆盖指令内容和元数据,保留当前启用状态。`+(e.onSkillUpdate?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要更新的技能 ID(必须已存在)`},name:{type:`string`,description:`新的技能名称`},description:{type:`string`,description:`新的一句话描述`},instructions:{type:`string`,description:`新的技能指令内容(Markdown 格式)`},category:{type:`string`,description:`新的分类`},tags:{type:`array`,description:`新的标签列表`,items:{type:`string`}},icon:{type:`string`,description:`新的 Emoji 图标`}},required:[`id`,`name`,`description`,`instructions`]},execute:async t=>{let n=Yi(t).id;return aa(e,Ki(t,e.registry.get(n)))}},{name:`skill_enable`,description:`批量设置技能的启用/禁用状态。启用的技能会被注入系统提示。`,parameters:{type:`object`,properties:{items:{type:`array`,description:`每项包含 id 和 enabled`,items:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},enabled:{type:`boolean`,description:`true 启用,false 禁用`}},required:[`id`,`enabled`]}}},required:[`items`]},execute:async t=>oa(e,qi(t))},{name:`skill_delete`,description:`彻底删除技能(从注册表和持久化存储中移除)。仅可删除 user 来源的技能。`+(e.onSkillDelete?``:`(当前环境未配置技能持久化,此功能不可用)`),parameters:{type:`object`,properties:{id:{type:`string`,description:`要删除的技能 ID`}},required:[`id`]},execute:async t=>sa(e,Yi(t).id)},{name:`skill_inspect`,description:`查看技能的完整指令内容和元数据。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`}},required:[`id`]},execute:async t=>ca(e,Yi(t).id)},{name:`skill_load_reference`,description:`读取技能的某个参考文档内容。`,parameters:{type:`object`,properties:{id:{type:`string`,description:`技能 ID`},referenceName:{type:`string`,description:`参考文档文件名(从 skill_inspect 返回的 references 列表中获取)`}},required:[`id`,`referenceName`]},execute:async t=>la(e,Ji(t))}]}function da(e){return{tools:ua(e)}}function fa(e){let t=e.trim();return t?t.startsWith(`/`)?t:`/${t}`:``}function pa(e){return e?.trim().replace(/\/+$/,``)||null}function ma(e,t,n){let r=pa(e.officialProxyBaseUrl);if(!r)throw Error(`供应商 ${e.supplierId} 不支持官方线路`);return{baseUrl:r,path:fa(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId,headers:n}}function ha(e,t){return{baseUrl:e.protocolBaseUrl.replace(/\/$/,``),path:fa(e.protocolPath),accessKey:t,protocol:e.chatRuntimeProtocol,providerModelId:e.providerModelId}}function ga(e){return{displayName:e.displayName,family:e.family,supportsThinking:e.supportsThinking,supportsVision:e.supportsVision,contextWindowTokens:e.contextWindowTokens,maxOutputTokens:e.maxOutputTokens}}function _a(e,t){let n={supplierId:e.supplierId,offeringModelId:e.offeringModelId,...e.profileId?{profileId:e.profileId}:{},...e.protocolId?{protocolId:e.protocolId}:{},...e.status===`deprecated`?{status:`deprecated`}:{}};return t.mode===`official`?{...ga(e),endpoint:ma(e,t.accessKey,t.headers),metadata:{...n,source:`huyooo-official`}}:{...ga(e),endpoint:ha(e,t.accessKey),metadata:{...n,source:`self_key`}}}function va(e,t,n){let r=n?.preferredOfferingModelId?.trim();if(r&&t[r])return r;let i=n?.preferredProfileId?.trim();if(i){let n=e.find(e=>e.profileId===i&&t[e.offeringModelId]);if(n)return n.offeringModelId}let a=e.find(e=>e.officialEligible&&t[e.offeringModelId]);if(a)return a.offeringModelId;let o=Object.keys(t)[0];if(!o)throw Error(`没有可用对话模型,请检查目录与出站配置`);return o}const ya=new Set(Be);function ba(e){return ya.has(e)}function xa(e){let t=e?.trim();return t&&ba(t)?t:null}function Sa(e){return e?.trim().replace(/\/+$/,``)||null}const Ca={ark_v1:`ark_v1 · 火山 Responses`,deepseek_v1:`deepseek_v1 · DeepSeek Chat`,qwen_v1:`qwen_v1 · 通义多模态`,qwen_text_v1:`qwen_text_v1 · 通义文本生成`,glm_v1:`glm_v1 · 智谱 GLM`,moonshot_v1:`moonshot_v1 · Kimi`,minimax_v1:`minimax_v1 · MiniMax Anthropic 兼容`,vercel_gateway_v1:`vercel_gateway_v1 · Vercel AI Gateway`,anthropic_v1:`anthropic_v1 · Anthropic Messages`,gemini_v1:`gemini_v1 · Gemini Generate`,openai_v1:`openai_v1 · OpenAI Responses`,openai_chat_v1:`openai_chat_v1 · OpenAI Chat Completions 兼容`,grok_v1:`grok_v1 · xAI Grok`},wa=Be.map(e=>({value:e,label:Ca[e]}));function Ta(e){let t=e?.trim();return t?wa.find(e=>e.value===t)?.label??t:`—`}const Ea=`官方线路`,Da=`自备密钥`;function Oa(e){return e===`official`?Ea:Da}function ka(e,t){let n=t.toLowerCase();return!!(e.name.toLowerCase().includes(n)||e.description.toLowerCase().includes(n)||e.category.toLowerCase().includes(n)||e.tags.some(e=>e.toLowerCase().includes(n)))}function Aa(){let e=new Map;return{add(t){e.set(t.name,{...t})},remove(t){e.delete(t)},search(t){let n=Array.from(e.values());if(t?.keyword){let e=t.keyword;n=n.filter(t=>ka(t,e))}if(t?.category){let e=t.category.toLowerCase();n=n.filter(t=>t.category.toLowerCase()===e)}if(t?.tags?.length){let e=t.tags.map(e=>e.toLowerCase());n=n.filter(t=>{let n=t.tags.map(e=>e.toLowerCase());return e.every(e=>n.includes(e))})}return t?.source&&(n=n.filter(e=>e.source===t.source)),t?.enabledOnly&&(n=n.filter(e=>e.enabled)),n},get(t){let n=e.get(t);return n?{...n}:void 0},setEnabled(t,n){let r=e.get(t);r&&(r.enabled=n)},listEnabled(){return Array.from(e.values()).filter(e=>e.enabled)},entries(){return Array.from(e.values())},has(t){return e.has(t)},get size(){return e.size},categories(){let t=new Map;for(let n of e.values())t.set(n.category,(t.get(n.category)??0)+1);return Array.from(t.entries()).map(([e,t])=>({category:e,count:t}))}}}function ja(e,t={}){return{...G({kind:`part`,scope:e.source===`user`?`local`:`core`,runtime:`part-render`,governance:t.governance??qr()}),ref:e.name,name:e.name,description:e.description,category:e.category,tags:e.tags,source:e.source,enabled:e.enabled,...t}}function Ma(e,t){return{...ja(e),...t}}export{Bt as AnthropicProtocol,Qe as ArkProtocol,pn as BUILTIN_PROTOCOL_FACTORIES,Be as BUILTIN_PROTOCOL_IDS,Ea as CHAT_ACCESS_MODE_OFFICIAL_LABEL,Da as CHAT_ACCESS_MODE_SELF_KEY_LABEL,oe as CHAT_EVENT_TYPES,wa as CHAT_RUNTIME_PROTOCOL_OPTIONS,wn as CLAUDE_FAMILY,Ai as ChatOrchestrator,Ni as ChatRuntime,_n as DEEPSEEK_FAMILY,gn as DOUBAO_FAMILY,at as DeepSeekProtocol,Sn as GEMINI_FAMILY,Cn as GPT_FAMILY,Tn as MODEL_FAMILIES,On as ModelAdapter,sn as OpenAIChatProtocol,vn as QWEN_FAMILY,ut as QwenProtocol,O as STANDARD_TOOL_ERROR_SCHEMA,W as TOOL_FORMATS,T as ToolException,n as Type,ni as analyzeCommandRisk,Nn as buildModelOptions,_a as compileChatModelConfig,xe as createAbort,Qi as createActionResult,Wt as createAnthropicProtocol,F as createApiError,$e as createArkProtocol,G as createAssetSummaryBase,L as createAssistantSegmentStart,Xi as createCollectionResult,ti as createCommandGovernanceSnapshot,ei as createCommandToolMetadata,ot as createDeepSeekProtocol,ge as createDone,P as createError,Vn as createInProcessProvider,Zi as createInspectResult,Kr as createLocalMcpServerGovernance,Gr as createLocalToolGovernance,oi as createManagedMcpServerDetail,ai as createManagedMcpServerSummary,Ma as createManagedPartDetail,ja as createManagedPartSummary,Li as createManagedSkillDetail,Z as createManagedSkillSummary,ii as createManagedToolDetail,ri as createManagedToolSummary,Gn as createMcpProvider,R as createModuleLogger,cn as createOpenAIChatProtocol,ji as createOrchestrator,be as createParseError,qr as createPartAssetGovernance,mt as createQwenProtocol,ht as createQwenTextProtocol,_e as createRateLimitError,te as createResolvedOutputSchema,I as createStepEnd,Se as createStepStart,me as createTextDelta,ce as createThinkingDelta,le as createThinkingEnd,se as createThinkingStart,ye as createTimeoutError,$i as createToggleResult,de as createToolCallOutput,fe as createToolCallRequest,N as createToolCallResult,ue as createToolCallStart,ve as createToolError,Br as createToolRuntimeManager,Rt as createVercelGatewayProtocol,Lr as defineTool,ze as findEndpointByProtocol,Oa as formatChatAccessModeLabel,Ta as formatChatRuntimeProtocolLabel,kn as formatContextWindow,Pi as getBaseProtocol,Ri as getBooleanWithDefault,mn as getBuiltinProtocolFactories,qe as getLogger,Pn as getModelContextConfigFromLLM,Re as getModelEndpoint,$ as getOptionalString,Q as getRequiredString,zi as getStringArray,Bi as getStringRecord,Cr as hasToolFormat,Ke as initLogger,Me as isAbortEvent,Pe as isAssistantSegmentEvent,ba as isChatRuntimeProtocolId,je as isErrorEvent,hn as isRegisteredProtocolId,Fe as isRetryableError,Ae as isStatusEvent,Ne as isStepEvent,ke as isTextEvent,De as isThinkingEvent,E as isToolError,Oe as isToolEvent,h as isToolResult,C as mergeToolGovernance,g as normalizeToolResult,Aa as partRegistry,Xr as readAssetGovernanceOverrides,Sr as registerToolFormat,xr as registerToolFormats,Ie as resolveChatModel,xa as resolveChatRuntimeProtocol,va as resolveDefaultChatOfferingModelId,Le as resolveEndpointUrl,V as resolveModelFamilyConfig,Sa as resolveOfficialProxyBaseUrl,w as resolveToolGovernanceSnapshot,y as resolveToolResultUi,ie as resolveTools,_ as serializeToolResult,da as skillManagementPlugin,Ii as skillRegistry,Vi as splitCommaSeparatedStrings,D as throwToolError,Yr as toAssetGovernanceOverrides,ne as tool,p as toolOk,re as tools,Mr as validateJsonSchemaArgs,jr as validateTypeBoxArgs};
@@ -17,7 +17,7 @@ export interface ModelEndpoint {
17
17
  baseUrl: string;
18
18
  /** 访问 key(代理 token 或厂商 key) */
19
19
  accessKey: RuntimeConfigValue;
20
- /** 可选,透传给厂商的 key(BYOK,优先于 accessKey) */
20
+ /** 可选,透传给厂商的 key(自备密钥线路,优先于 accessKey) */
21
21
  vendorKey?: RuntimeConfigValue;
22
22
  /** 协议类型(内置或自定义 protocolId) */
23
23
  protocol: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huyooo/ai-chat-core",
3
- "version": "0.3.24",
3
+ "version": "0.3.25",
4
4
  "description": "AI Chat Core - HybridAgent with Doubao + Gemini",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,39 +0,0 @@
1
- /**
2
- * 从 Mongo 编译后的 ChatModelCatalogItem 生成 ai-chat 接入说明(供 ai-server / Ones 导出)
3
- */
4
- import type { ChatModelCatalogItem } from './chat-catalog-types';
5
- import type { LLMConfig } from './llm-config';
6
- export interface ChatModelIntegrationExport {
7
- catalogItem: ChatModelCatalogItem;
8
- /** BYOK:直连 protocolBaseUrl */
9
- llmConfigByok: Pick<LLMConfig, 'models' | 'defaultModel'>;
10
- /** 原厂可走 Huyooo 官方代理时提供 */
11
- llmConfigOfficial?: Pick<LLMConfig, 'models' | 'defaultModel'>;
12
- downstreamApis: {
13
- modelOptions: {
14
- method: 'POST';
15
- path: string;
16
- body?: {
17
- supplierIds?: string[];
18
- };
19
- };
20
- supplierOptions: {
21
- method: 'POST';
22
- path: string;
23
- };
24
- integrationExport: {
25
- method: 'POST';
26
- path: string;
27
- body: {
28
- offeringModelId: string;
29
- };
30
- };
31
- reloadRuntime: {
32
- method: 'POST';
33
- path: string;
34
- };
35
- };
36
- compileHints: string[];
37
- }
38
- /** 生成可复制/下发的接入导出包 */
39
- export declare function buildChatModelIntegrationExport(item: ChatModelCatalogItem): ChatModelIntegrationExport;
@@ -1,23 +0,0 @@
1
- /**
2
- * 模型目录与 ChatRuntime 编译共用常量(llmProxy path 模板 + Mongo 字段读取)
3
- * 目录事实(chatRuntimeProtocol / supplier 出站)一律来自 Mongo,runtime 不做常量兜底。
4
- */
5
- import type { ProtocolId } from './protocols/types';
6
- /** 校验 Mongo chatRuntimeProtocol 是否为已注册 ProtocolId */
7
- export declare function isChatRuntimeProtocolId(value: string): value is ProtocolId;
8
- export type ChatServerUpstream = 'direct' | 'llm_proxy';
9
- export interface ChatServerSupplierPolicy {
10
- serverUpstream: ChatServerUpstream;
11
- proxyPathPrefix: string | null;
12
- }
13
- /** llmProxy 出站时按 protocolId 拼完整 path(编译规则,非 Mongo 兜底) */
14
- export declare const SERVER_LLM_PROXY_PATH_BY_PROTOCOL: Record<string, string>;
15
- /** 读取 Mongo modelAccessProtocol.chatRuntimeProtocol;缺失或无效 → null */
16
- export declare function resolveChatRuntimeProtocol(stored?: string | null): ProtocolId | null;
17
- /** 读取 Mongo aiSupplier.officialProxyBaseUrl;缺失 → null */
18
- export declare function resolveOfficialProxyBaseUrl(stored?: string | null): string | null;
19
- /** 读取 Mongo aiSupplier 出站策略;不完整 → null */
20
- export declare function resolveServerSupplierPolicy(stored?: {
21
- serverUpstream?: ChatServerUpstream | null;
22
- proxyPathPrefix?: string | null;
23
- }): ChatServerSupplierPolicy | null;
@@ -1,45 +0,0 @@
1
- /**
2
- * 对话模型目录 DTO(Mongo offering 编译结果,ai-server / SuperX / 下游共用)
3
- */
4
- import type { ModelFamilyId } from './families';
5
- import type { ProtocolId } from './protocols/types';
6
- import type { CatalogSupplierKind } from './chat-supplier-constants';
7
- import type { ChatServerUpstream } from './chat-catalog-constants';
8
- export type { ChatServerUpstream };
9
- export interface ChatSupplierOption {
10
- key: string;
11
- label: string;
12
- supplierKind: CatalogSupplierKind;
13
- /** 是否可走 Huyooo 官方 AI 代理(原厂供应商) */
14
- officialEligible: boolean;
15
- }
16
- export interface ChatModelCatalogItem {
17
- offeringModelId: string;
18
- profileId: string;
19
- supplierId: string;
20
- supplierName: string;
21
- supplierKind: CatalogSupplierKind;
22
- officialEligible: boolean;
23
- /** 是否开放给平台对话(Mongo platformChat) */
24
- platformChat: boolean;
25
- displayName: string;
26
- providerModelId: string;
27
- protocolId: string;
28
- chatRuntimeProtocol: ProtocolId;
29
- protocolBaseUrl: string;
30
- protocolPath: string;
31
- family: ModelFamilyId;
32
- supportsThinking: boolean;
33
- supportsVision: boolean;
34
- contextWindowTokens: number;
35
- maxOutputTokens: number;
36
- status: 'active' | 'deprecated';
37
- tags?: string[];
38
- /** 来自 aiSupplier:Huyooo 官方代理 baseUrl */
39
- officialProxyBaseUrl?: string;
40
- /** 来自 aiSupplier:ai-server 平台对话出站 */
41
- serverUpstream?: 'direct' | 'llm_proxy';
42
- proxyPathPrefix?: string | null;
43
- }
44
- /** 平台 / SuperX 默认对话 profileId(编译时解析为 offeringModelId) */
45
- export declare const DEFAULT_CHAT_PROFILE_ID = "doubao-seed-2-0-pro-260215";
@@ -1,11 +0,0 @@
1
- /**
2
- * 模型目录供应商分类(ai-server / Ones 共用,与 Mongo supplierKind 一致)
3
- */
4
- export type CatalogSupplierKind = 'agent_vendor' | 'agent_proxy';
5
- /** 固定为代理的接入方(非原厂 API) */
6
- export declare const PROXY_SUPPLIER_IDS: readonly ["openrouter", "volcengine-ark-coding-plan", "volcengine-ark-agent-plan"];
7
- export declare function isProxySupplierId(supplierId: string): boolean;
8
- /** 未写入库的历史数据视为原厂 */
9
- export declare function normalizeCatalogSupplierKind(kind?: CatalogSupplierKind): CatalogSupplierKind;
10
- /** 按 supplierId 解析类型:OpenRouter / 方舟套餐等始终为代理 */
11
- export declare function resolveCatalogSupplierKind(supplierId: string, kind?: CatalogSupplierKind): CatalogSupplierKind;
@@ -1,25 +0,0 @@
1
- /**
2
- * ChatModelCatalogItem → ModelConfig 统一编译(SuperX / ai-server 共用)
3
- */
4
- import type { ChatModelCatalogItem } from './chat-catalog-types';
5
- import type { LLMConfig, ModelConfig, ModelEndpoint, RuntimeConfigValue } from './llm-config';
6
- import { type ServerChatEnv } from './server-chat-endpoint';
7
- export type ChatModelCompileAccess = {
8
- mode: 'official';
9
- accessKey: RuntimeConfigValue;
10
- headers?: ModelEndpoint['headers'];
11
- } | {
12
- mode: 'byok';
13
- accessKey: RuntimeConfigValue;
14
- } | {
15
- mode: 'server';
16
- env: ServerChatEnv;
17
- };
18
- /** 将目录项编译为 ChatRuntime ModelConfig;server 模式在无法出站时返回 null */
19
- export declare function compileChatModelConfig(item: ChatModelCatalogItem, access: ChatModelCompileAccess): ModelConfig | null;
20
- export interface ResolveDefaultChatOfferingOptions {
21
- preferredOfferingModelId?: string;
22
- preferredProfileId?: string;
23
- }
24
- /** 从已编译 models 与 catalog 解析默认 offeringModelId */
25
- export declare function resolveDefaultChatOfferingModelId(catalog: ChatModelCatalogItem[], models: LLMConfig['models'], options?: ResolveDefaultChatOfferingOptions): string;
@@ -1,22 +0,0 @@
1
- /**
2
- * ai-server 平台对话:catalog item → 出站 endpoint(env 注入,策略来自 Mongo supplier)
3
- */
4
- import type { ChatModelCatalogItem } from './chat-catalog-types';
5
- import type { ModelEndpoint } from './llm-config';
6
- /** ai-server 编译 endpoint 所需环境变量 */
7
- export interface ServerChatEnv {
8
- llmProxyBaseUrl: string;
9
- llmProxyApiKey?: string;
10
- supplierApiKeys: {
11
- 'volcengine-doubao'?: string;
12
- 'aliyun-qwen'?: string;
13
- deepseek?: string;
14
- 'zhipu-glm'?: string;
15
- 'moonshot-kimi'?: string;
16
- minimax?: string;
17
- };
18
- }
19
- /** 服务端出站策略标签(metadata.upstream) */
20
- export declare function getServerChatUpstream(item: Pick<ChatModelCatalogItem, 'serverUpstream' | 'proxyPathPrefix'>): 'llm-proxy' | 'direct';
21
- /** 将 catalog 项解析为 ai-server 平台对话 endpoint;Mongo 策略或 env 不完整时返回 null */
22
- export declare function resolveServerChatEndpoint(item: ChatModelCatalogItem, env: ServerChatEnv): ModelEndpoint | null;