@opentiny/next-sdk 0.2.7 → 0.2.9

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.
@@ -1,7 +1,8 @@
1
1
  import { ZodRawShape } from 'zod';
2
2
  import { RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';
4
- import { WebMcpServer } from './WebMcpServer';
4
+ import { WebMcpServer } from '../WebMcpServer';
5
+ import { ToolInvokeEffectConfig } from './effects';
5
6
 
6
7
  /** 页面卸载广播,供 pageToolsOnDemand 模式监听 */
7
8
  export declare const MSG_PAGE_LEAVE = "next-sdk:page-leave";
@@ -35,7 +36,16 @@ export type RouteConfig = {
35
36
  route: string;
36
37
  /** 等待页面响应的超时时间(ms),默认 30000 */
37
38
  timeout?: number;
39
+ /**
40
+ * 是否在调用该工具时启用页面级调用提示效果。
41
+ *
42
+ * - false / 未配置:不启用任何额外效果(保持现有行为)
43
+ * - true:使用默认提示文案(优先取工具标题,其次为工具名)
44
+ * - 对象:可自定义提示文案
45
+ */
46
+ invokeEffect?: boolean | ToolInvokeEffectConfig;
38
47
  };
48
+ export type { ToolInvokeEffectConfig };
39
49
  /**
40
50
  * PageAwareServer 的 registerTool 配置对象类型,与 WebMcpServer.registerTool 保持一致。
41
51
  */
@@ -54,21 +64,35 @@ type RegisterToolConfig<InputArgs extends ZodRawShape, OutputArgs extends ZodRaw
54
64
  export type PageAwareServer = Omit<WebMcpServer, 'registerTool'> & {
55
65
  registerTool<InputArgs extends ZodRawShape, OutputArgs extends ZodRawShape>(name: string, config: RegisterToolConfig<InputArgs, OutputArgs>, handlerOrRoute: ((...args: any[]) => any) | RouteConfig): RegisteredTool;
56
66
  };
67
+ /**
68
+ * 注册一个通用的页面跳转工具(navigate_to_page),供大模型在需要时主动跳转到指定路由。
69
+ *
70
+ * 要求:
71
+ * - 业务侧在应用入口通过 setNavigator 注册导航函数(如 router.push 或 navigateByUrl)
72
+ * - 前端页面在目标路由下调用 registerPageTool,确保 page-ready 能正确广播
73
+ *
74
+ * 工具行为:
75
+ * - 输入 path(如 "/orders"、"/price-protection"),调用 setNavigator 注册的函数执行跳转
76
+ * - 等待目标页面完成挂载并广播 page-ready(或在超时时间到达时兜底返回)
77
+ * - 返回简单的文本说明,提示跳转结果
78
+ */
79
+ export type NavigateToolOptions = {
80
+ /** 工具名称,默认 'navigate_to_page' */
81
+ name?: string;
82
+ /** 工具标题,默认 '页面跳转' */
83
+ title?: string;
84
+ /** 工具描述 */
85
+ description?: string;
86
+ /** 等待 page-ready 的超时时间(ms),默认 1500 */
87
+ timeoutMs?: number;
88
+ };
89
+ export declare function registerNavigateTool(server: WebMcpServer, options?: NavigateToolOptions): RegisteredTool;
57
90
  /**
58
91
  * 包装 WebMcpServer,使 registerTool 第三个参数支持 RouteConfig。
59
92
  *
60
93
  * - 第三个参数为**回调函数**:与原始 registerTool 完全一致,直接透传
61
94
  * - 第三个参数为 **RouteConfig 对象**:自动生成转发 handler,工具调用时
62
95
  * 先导航到目标路由,再通过 postMessage 与页面通信
63
- *
64
- * @example
65
- * const server = withPageTools(new WebMcpServer())
66
- *
67
- * // 路由模式:第三个参数传路由配置(route 必填,timeout 可选,单位 ms,默认 30000)
68
- * server.registerTool('product-guide', { title, inputSchema }, { route: '/comprehensive', timeout: 15000 })
69
- *
70
- * // 普通模式:第三个参数传回调(兼容原有写法)
71
- * server.registerTool('simple-tool', { title }, async (input) => ({ content: [...] }))
72
96
  */
73
97
  export declare function withPageTools(server: WebMcpServer): PageAwareServer;
74
98
  /**
@@ -80,37 +104,6 @@ export declare function withPageTools(server: WebMcpServer): PageAwareServer;
80
104
  * - 广播 page-ready 信号,通知正在等待导航完成的工具
81
105
  *
82
106
  * 返回 cleanup 函数,页面销毁时调用。
83
- *
84
- * @example
85
- * // Vue(Composition API)— 省略 route,默认读 window.location.pathname
86
- * let cleanup: () => void
87
- * onMounted(() => { cleanup = registerPageTool({ handlers: { ... } }) })
88
- * onUnmounted(() => cleanup())
89
- *
90
- * // Vue — 当页面路由与 pathname 不一致时,手动指定 route
91
- * onMounted(() => { cleanup = registerPageTool({ route: '/comprehensive', handlers: { ... } }) })
92
- * onUnmounted(() => cleanup())
93
- *
94
- * // React(Hooks)
95
- * useEffect(() => registerPageTool({ handlers: { ... } }), [])
96
- * // useEffect 直接返回 cleanup 函数,React 会在组件卸载时自动调用
97
- *
98
- * // Angular(实现 OnInit / OnDestroy 接口)
99
- * export class PriceProtectionComponent implements OnInit, OnDestroy {
100
- * private cleanupPageTool!: () => void
101
- *
102
- * ngOnInit(): void {
103
- * this.cleanupPageTool = registerPageTool({
104
- * handlers: {
105
- * 'price-protection-query': async ({ status }) => { ... },
106
- * }
107
- * })
108
- * }
109
- *
110
- * ngOnDestroy(): void {
111
- * this.cleanupPageTool()
112
- * }
113
- * }
114
107
  */
115
108
  export declare function registerPageTool(options: {
116
109
  /**
@@ -129,4 +122,3 @@ export declare function registerPageTool(options: {
129
122
  */
130
123
  handlers: Record<string, (input: any) => Promise<any>>;
131
124
  }): () => void;
132
- export {};
@@ -0,0 +1,36 @@
1
+ /**
2
+ * page-tools/effects - 页面工具调用提示效果模块(框架无关)
3
+ *
4
+ * 作用:
5
+ * - 在调用通过 withPageTools 注册的页面工具时,显示页面级的调用状态提示
6
+ * - 以左下角小 tip 形式展示“当前正在调用的工具”文案,尽量不打扰用户操作
7
+ * - 纯 DOM + CSS 实现,不依赖 Vue/React 等框架
8
+ */
9
+ export type ToolInvokeEffectConfig = {
10
+ /**
11
+ * 自定义提示文案,默认使用“工具标题 || 工具名称”
12
+ * 例如:"正在为你整理订单数据"
13
+ */
14
+ label?: string;
15
+ };
16
+ type RuntimeEffectConfig = {
17
+ label: string;
18
+ };
19
+ /**
20
+ * 在页面上显示工具调用提示效果。
21
+ * - 若当前已有其他工具在执行,仅更新文案,不重复创建 DOM
22
+ * - 会增加 activeCount 计数,需配对调用 hideToolInvokeEffect
23
+ */
24
+ export declare function showToolInvokeEffect(config: RuntimeEffectConfig): void;
25
+ /**
26
+ * 隐藏工具调用提示效果。
27
+ * - 使用引用计数:只有当所有调用结束后才真正移除 Overlay
28
+ */
29
+ export declare function hideToolInvokeEffect(): void;
30
+ /**
31
+ * 将 RouteConfig 中的 invokeEffect 配置编译成运行时效果配置。
32
+ * - boolean / undefined:关闭或开启默认文案
33
+ * - 对象:允许自定义 label
34
+ */
35
+ export declare function resolveRuntimeEffectConfig(toolName: string, toolTitle: string | undefined, value: boolean | ToolInvokeEffectConfig | undefined): RuntimeEffectConfig | undefined;
36
+ export {};
@@ -74,6 +74,8 @@ declare class FloatingBlock {
74
74
  private hideModal;
75
75
  private addStyles;
76
76
  destroy(): void;
77
+ hide(): void;
78
+ show(): void;
77
79
  }
78
80
  export declare const createRemoter: (options?: FloatingBlockOptions) => FloatingBlock;
79
81
  export {};
@@ -45,7 +45,8 @@ export declare function getSkillMdPaths(modules: Record<string, string>): string
45
45
  */
46
46
  export declare function getSkillMdContent(modules: Record<string, string>, path: string): string | undefined;
47
47
  /**
48
- * 根据技能 name 查找其主 SKILL.md 的路径(name 与目录名一致)
48
+ * 根据技能 name 查找其主 SKILL.md 的路径
49
+ * 支持匹配目录名(如 ecommerce)或 SKILL.md 内 frontmatter 定义的 name
49
50
  * - 依赖 getMainSkillPaths,内部已做 normalize
50
51
  */
51
52
  export declare function getMainSkillPathByName(modules: Record<string, string>, name: string): string | undefined;
@@ -43094,15 +43094,24 @@ Thought: 用户想要获取今天的日期,我需要调用日期相关的工
43094
43094
  }
43095
43095
  this.onUpdatedTools?.();
43096
43096
  }
43097
- /** 创建临时允许调用的tools集合 */
43098
- _tempMergeTools(extraTool = {}) {
43099
- const toolsResult = Object.values(this.mcpTools).reduce((acc, curr) => ({ ...acc, ...curr }), {});
43097
+ /** 创建临时允许调用的 tools 集合,合并 mcpTools 与 extraTool */
43098
+ _tempMergeTools(extraTool = {}, deleteIgnored = true) {
43099
+ const toolsResult = Object.values(this.mcpTools).reduce(
43100
+ (acc, curr) => ({ ...acc, ...curr }),
43101
+ {}
43102
+ );
43100
43103
  Object.assign(toolsResult, extraTool);
43101
- this.ignoreToolnames.forEach((name16) => {
43102
- delete toolsResult[name16];
43103
- });
43104
+ if (deleteIgnored) {
43105
+ this.ignoreToolnames.forEach((name16) => {
43106
+ delete toolsResult[name16];
43107
+ });
43108
+ }
43104
43109
  return toolsResult;
43105
43110
  }
43111
+ /** 获取当前激活的 tools 名称列表(过滤 ignoreToolnames) */
43112
+ _getActiveToolNames(tools) {
43113
+ return Object.keys(tools).filter((name16) => !this.ignoreToolnames.includes(name16));
43114
+ }
43106
43115
  /** 生成 ReAct 模式的系统提示词(包含工具描述) */
43107
43116
  _generateReActSystemPrompt(tools, modelName, baseSystemPrompt) {
43108
43117
  const toolsPrompt = generateReActToolsPrompt(tools);
@@ -43446,12 +43455,14 @@ ${observationText}
43446
43455
  throw new Error("LLM is not initialized");
43447
43456
  }
43448
43457
  await this.initClientsAndTools();
43458
+ const allTools = this._tempMergeTools(options.tools, false);
43449
43459
  const chatOptions = {
43450
43460
  // @ts-ignore ProviderV2 是所有llm的父类, 在每一个具体的llm 类都有一个选择model的函数用法
43451
43461
  model: this.llm(model),
43452
43462
  stopWhen: stepCountIs(maxSteps),
43453
43463
  ...options,
43454
- tools: this._tempMergeTools(options.tools)
43464
+ tools: allTools,
43465
+ activeTools: this._getActiveToolNames(allTools)
43455
43466
  };
43456
43467
  let lastUserMessage = null;
43457
43468
  if (options.message && !options.messages) {
@@ -46638,6 +46649,19 @@ ${observationText}
46638
46649
  this.dropdownMenu.parentNode.removeChild(this.dropdownMenu);
46639
46650
  }
46640
46651
  }
46652
+ // 隐藏组件
46653
+ hide() {
46654
+ if (this.floatingBlock) {
46655
+ this.floatingBlock.style.display = "none";
46656
+ }
46657
+ this.closeDropdown();
46658
+ }
46659
+ // 显示组件
46660
+ show() {
46661
+ if (this.floatingBlock) {
46662
+ this.floatingBlock.style.display = "flex";
46663
+ }
46664
+ }
46641
46665
  }
46642
46666
  const createRemoter = (options = {}) => {
46643
46667
  return new FloatingBlock(options);
@@ -42701,15 +42701,24 @@ class AgentModelProvider {
42701
42701
  }
42702
42702
  this.onUpdatedTools?.();
42703
42703
  }
42704
- /** 创建临时允许调用的tools集合 */
42705
- _tempMergeTools(extraTool = {}) {
42706
- const toolsResult = Object.values(this.mcpTools).reduce((acc, curr) => ({ ...acc, ...curr }), {});
42704
+ /** 创建临时允许调用的 tools 集合,合并 mcpTools 与 extraTool */
42705
+ _tempMergeTools(extraTool = {}, deleteIgnored = true) {
42706
+ const toolsResult = Object.values(this.mcpTools).reduce(
42707
+ (acc, curr) => ({ ...acc, ...curr }),
42708
+ {}
42709
+ );
42707
42710
  Object.assign(toolsResult, extraTool);
42708
- this.ignoreToolnames.forEach((name16) => {
42709
- delete toolsResult[name16];
42710
- });
42711
+ if (deleteIgnored) {
42712
+ this.ignoreToolnames.forEach((name16) => {
42713
+ delete toolsResult[name16];
42714
+ });
42715
+ }
42711
42716
  return toolsResult;
42712
42717
  }
42718
+ /** 获取当前激活的 tools 名称列表(过滤 ignoreToolnames) */
42719
+ _getActiveToolNames(tools) {
42720
+ return Object.keys(tools).filter((name16) => !this.ignoreToolnames.includes(name16));
42721
+ }
42713
42722
  /** 生成 ReAct 模式的系统提示词(包含工具描述) */
42714
42723
  _generateReActSystemPrompt(tools, modelName, baseSystemPrompt) {
42715
42724
  const toolsPrompt = generateReActToolsPrompt(tools);
@@ -43053,12 +43062,14 @@ ${observationText}
43053
43062
  throw new Error("LLM is not initialized");
43054
43063
  }
43055
43064
  await this.initClientsAndTools();
43065
+ const allTools = this._tempMergeTools(options.tools, false);
43056
43066
  const chatOptions = {
43057
43067
  // @ts-ignore ProviderV2 是所有llm的父类, 在每一个具体的llm 类都有一个选择model的函数用法
43058
43068
  model: this.llm(model),
43059
43069
  stopWhen: stepCountIs(maxSteps),
43060
43070
  ...options,
43061
- tools: this._tempMergeTools(options.tools)
43071
+ tools: allTools,
43072
+ activeTools: this._getActiveToolNames(allTools)
43062
43073
  };
43063
43074
  let lastUserMessage = null;
43064
43075
  if (options.message && !options.messages) {
@@ -46245,6 +46256,19 @@ class FloatingBlock {
46245
46256
  this.dropdownMenu.parentNode.removeChild(this.dropdownMenu);
46246
46257
  }
46247
46258
  }
46259
+ // 隐藏组件
46260
+ hide() {
46261
+ if (this.floatingBlock) {
46262
+ this.floatingBlock.style.display = "none";
46263
+ }
46264
+ this.closeDropdown();
46265
+ }
46266
+ // 显示组件
46267
+ show() {
46268
+ if (this.floatingBlock) {
46269
+ this.floatingBlock.style.display = "flex";
46270
+ }
46271
+ }
46248
46272
  }
46249
46273
  const createRemoter = (options = {}) => {
46250
46274
  return new FloatingBlock(options);
@@ -34040,12 +34040,19 @@ class EE {
34040
34040
  this.ignoreToolnames = this.ignoreToolnames.filter((s) => s !== o);
34041
34041
  }), this.onUpdatedTools?.();
34042
34042
  }
34043
- /** 创建临时允许调用的tools集合 */
34044
- _tempMergeTools(t = {}) {
34045
- const r = Object.values(this.mcpTools).reduce((n, o) => ({ ...n, ...o }), {});
34046
- return Object.assign(r, t), this.ignoreToolnames.forEach((n) => {
34047
- delete r[n];
34048
- }), r;
34043
+ /** 创建临时允许调用的 tools 集合,合并 mcpTools 与 extraTool */
34044
+ _tempMergeTools(t = {}, r = !0) {
34045
+ const n = Object.values(this.mcpTools).reduce(
34046
+ (o, s) => ({ ...o, ...s }),
34047
+ {}
34048
+ );
34049
+ return Object.assign(n, t), r && this.ignoreToolnames.forEach((o) => {
34050
+ delete n[o];
34051
+ }), n;
34052
+ }
34053
+ /** 获取当前激活的 tools 名称列表(过滤 ignoreToolnames) */
34054
+ _getActiveToolNames(t) {
34055
+ return Object.keys(t).filter((r) => !this.ignoreToolnames.includes(r));
34049
34056
  }
34050
34057
  /** 生成 ReAct 模式的系统提示词(包含工具描述) */
34051
34058
  _generateReActSystemPrompt(t, r, n) {
@@ -34280,25 +34287,26 @@ ${B}
34280
34287
  if (!this.llm)
34281
34288
  throw new Error("LLM is not initialized");
34282
34289
  await this.initClientsAndTools();
34283
- const s = {
34290
+ const s = this._tempMergeTools(o.tools, !1), i = {
34284
34291
  // @ts-ignore ProviderV2 是所有llm的父类, 在每一个具体的llm 类都有一个选择model的函数用法
34285
34292
  model: this.llm(r),
34286
34293
  stopWhen: iu(n),
34287
34294
  ...o,
34288
- tools: this._tempMergeTools(o.tools)
34295
+ tools: s,
34296
+ activeTools: this._getActiveToolNames(s)
34289
34297
  };
34290
- let i = null;
34298
+ let a = null;
34291
34299
  if (o.message && !o.messages)
34292
- i = { role: "user", content: o.message }, this.responseMessages.push(i), s.messages = [...this.responseMessages];
34300
+ a = { role: "user", content: o.message }, this.responseMessages.push(a), i.messages = [...this.responseMessages];
34293
34301
  else if (o.messages && o.messages.length > 0) {
34294
- const l = o.messages[o.messages.length - 1];
34295
- l.role === "user" && (i = l);
34302
+ const c = o.messages[o.messages.length - 1];
34303
+ c.role === "user" && (a = c);
34296
34304
  }
34297
- const a = t(s);
34298
- return a?.response?.then((l) => {
34299
- const c = l.messages?.[0];
34300
- i && c?.role !== "user" && this.responseMessages.push(i), this.responseMessages.push(...l.messages);
34301
- }), a;
34305
+ const l = t(i);
34306
+ return l?.response?.then((c) => {
34307
+ const u = c.messages?.[0];
34308
+ a && u?.role !== "user" && this.responseMessages.push(a), this.responseMessages.push(...c.messages);
34309
+ }), l;
34302
34310
  }
34303
34311
  async chat(t) {
34304
34312
  return this._chat(Kp, t);
@@ -36673,6 +36681,14 @@ class fE {
36673
36681
  destroy() {
36674
36682
  this.floatingBlock.parentNode && this.floatingBlock.parentNode.removeChild(this.floatingBlock), this.dropdownMenu.parentNode && this.dropdownMenu.parentNode.removeChild(this.dropdownMenu);
36675
36683
  }
36684
+ // 隐藏组件
36685
+ hide() {
36686
+ this.floatingBlock && (this.floatingBlock.style.display = "none"), this.closeDropdown();
36687
+ }
36688
+ // 显示组件
36689
+ show() {
36690
+ this.floatingBlock && (this.floatingBlock.style.display = "flex");
36691
+ }
36676
36692
  }
36677
36693
  const $E = (e = {}) => new fE(e);
36678
36694
  export {
package/dist/webagent.js CHANGED
@@ -121,13 +121,13 @@ Thought: 用户想要获取今天的日期,我需要调用日期相关的工
121
121
  - 必须严格按照 XML 格式调用工具
122
122
  - arguments 必须是有效的 JSON 格式
123
123
  - 如果不需要调用工具,直接给出最终答案即可
124
- `,r}function y_(e,t){if(!e||typeof e!="string")return null;const r=e.match(/<tool_call>([\s\S]*?)<\/tool_call>/i);if(r)try{const n=r[1].trim(),o=JSON.parse(n),s=o.name||o.action||o.tool,i=o.arguments||o.args||o.input||{};if(s&&t[s])return{toolName:s,arguments:i}}catch{}return null}const sE={openai:U2,deepseek:Ng};class aE{constructor({llmConfig:t,mcpServers:r}){if(this.mcpServers={},this.mcpClients={},this.mcpTools={},this.ignoreToolnames=[],this.responseMessages=[],this.useReActMode=!1,!t)throw new Error("llmConfig is required to initialize AgentModelProvider");if(this.mcpServers=r||{},this.mcpClients={},this.mcpTools={},t.llm)this.llm=t.llm;else if(t.providerType){const n=t.providerType;let o;typeof n=="string"?o=sE[n]:o=n,this.llm=o({apiKey:t.apiKey,baseURL:t.baseURL})}else throw new Error("Either llmConfig.llm or llmConfig.providerType must be provided");this.useReActMode=t.useReActMode??!1}async _createOneClient(t){try{let r;if("type"in t&&t.type.toLocaleLowerCase()==="streamablehttp"?r=new ka(new URL(t.url)):"type"in t&&t.type==="extension"?r=new kx(t.sessionId):"transport"in t?r=t.transport:r=t,t.useAISdkClient??!1){const o=await z5({transport:r});return o.__transport__=r,o}else{const o=new rE({name:"mcp-web-client",version:"1.0.0"},{capabilities:{roots:{listChanged:!0},sampling:{},elicitation:{}}});return await o.connect(r),o.__transport__=r,o}}catch(r){return this.onError&&this.onError(r?.message||"Failed to create MCP client",r),console.error("Failed to create MCP client",t,r),null}}async _closeOneClient(t){try{const r=t.__transport__;if(r&&r instanceof Ca||r&&r instanceof p_)return;await r?.terminateSession?.(),await r?.close?.(),await t?.close?.()}catch{}}async _createMpcClients(){const t=Object.entries(this.mcpServers),r=await Promise.all(t.map(async([n,o])=>{const s=await this._createOneClient(o);return{serverName:n,client:s}}));this.mcpClients={},r.forEach(({serverName:n,client:o})=>{this.mcpClients[n]=o})}async _getClientTools(t,r){if(!t)return null;try{return typeof t.tools=="function"?await t.tools():await g_(t)}catch(n){return this.onError&&this.onError(n?.message||`Failed to query tools for ${r}`,n),console.error(`Failed to query tools for ${r}`,n),null}}async _createMpcTools(){const t=Object.entries(this.mcpClients),r=await Promise.all(t.map(async([n,o])=>{const s=await this._getClientTools(o,n);return{serverName:n,tools:s}}));this.mcpTools={},r.forEach(({serverName:n,tools:o})=>{const s=o&&typeof o=="object"?o:{};this.mcpTools[n]=s})}async closeAll(){await Promise.all(Object.values(this.mcpClients).map(async t=>{try{await this._closeOneClient(t)}catch(r){this.onError&&this.onError(r?.message||"Failed to close client",r),console.error("Failed to close client",r)}}))}async initClientsAndTools(){await this._createMpcClients(),await this._createMpcTools(),this.onUpdatedTools?.()}async updateMcpServers(t){await this.closeAll(),this.mcpServers=t||this.mcpServers,await this.initClientsAndTools()}async insertMcpServer(t,r){if(this.mcpServers[t])return!1;const n=await this._createOneClient(r);if(!n)return this.onError?.(`Failed to create MCP client: ${t}`),null;this.mcpClients[t]=n;const o=await this._getClientTools(n,t);return this.mcpTools[t]=o&&typeof o=="object"?o:{},this.mcpServers[t]=r,this.onUpdatedTools?.(),n}async removeMcpServer(t){if(!this.mcpServers[t])return;delete this.mcpServers[t];const r=this.mcpClients[t];delete this.mcpClients[t];try{await this._closeOneClient(r)}catch{}const n=this.mcpTools[t];delete this.mcpTools[t],n&&Object.keys(n).forEach(o=>{this.ignoreToolnames=this.ignoreToolnames.filter(s=>s!==o)}),this.onUpdatedTools?.()}_tempMergeTools(t={}){const r=Object.values(this.mcpTools).reduce((n,o)=>({...n,...o}),{});return Object.assign(r,t),this.ignoreToolnames.forEach(n=>{delete r[n]}),r}_generateReActSystemPrompt(t,r,n){const o=oE(t);return n?`${n}${o}`:`你是一个智能助手,可以通过调用工具来完成任务。
124
+ `,r}function y_(e,t){if(!e||typeof e!="string")return null;const r=e.match(/<tool_call>([\s\S]*?)<\/tool_call>/i);if(r)try{const n=r[1].trim(),o=JSON.parse(n),s=o.name||o.action||o.tool,i=o.arguments||o.args||o.input||{};if(s&&t[s])return{toolName:s,arguments:i}}catch{}return null}const sE={openai:U2,deepseek:Ng};class aE{constructor({llmConfig:t,mcpServers:r}){if(this.mcpServers={},this.mcpClients={},this.mcpTools={},this.ignoreToolnames=[],this.responseMessages=[],this.useReActMode=!1,!t)throw new Error("llmConfig is required to initialize AgentModelProvider");if(this.mcpServers=r||{},this.mcpClients={},this.mcpTools={},t.llm)this.llm=t.llm;else if(t.providerType){const n=t.providerType;let o;typeof n=="string"?o=sE[n]:o=n,this.llm=o({apiKey:t.apiKey,baseURL:t.baseURL})}else throw new Error("Either llmConfig.llm or llmConfig.providerType must be provided");this.useReActMode=t.useReActMode??!1}async _createOneClient(t){try{let r;if("type"in t&&t.type.toLocaleLowerCase()==="streamablehttp"?r=new ka(new URL(t.url)):"type"in t&&t.type==="extension"?r=new kx(t.sessionId):"transport"in t?r=t.transport:r=t,t.useAISdkClient??!1){const o=await z5({transport:r});return o.__transport__=r,o}else{const o=new rE({name:"mcp-web-client",version:"1.0.0"},{capabilities:{roots:{listChanged:!0},sampling:{},elicitation:{}}});return await o.connect(r),o.__transport__=r,o}}catch(r){return this.onError&&this.onError(r?.message||"Failed to create MCP client",r),console.error("Failed to create MCP client",t,r),null}}async _closeOneClient(t){try{const r=t.__transport__;if(r&&r instanceof Ca||r&&r instanceof p_)return;await r?.terminateSession?.(),await r?.close?.(),await t?.close?.()}catch{}}async _createMpcClients(){const t=Object.entries(this.mcpServers),r=await Promise.all(t.map(async([n,o])=>{const s=await this._createOneClient(o);return{serverName:n,client:s}}));this.mcpClients={},r.forEach(({serverName:n,client:o})=>{this.mcpClients[n]=o})}async _getClientTools(t,r){if(!t)return null;try{return typeof t.tools=="function"?await t.tools():await g_(t)}catch(n){return this.onError&&this.onError(n?.message||`Failed to query tools for ${r}`,n),console.error(`Failed to query tools for ${r}`,n),null}}async _createMpcTools(){const t=Object.entries(this.mcpClients),r=await Promise.all(t.map(async([n,o])=>{const s=await this._getClientTools(o,n);return{serverName:n,tools:s}}));this.mcpTools={},r.forEach(({serverName:n,tools:o})=>{const s=o&&typeof o=="object"?o:{};this.mcpTools[n]=s})}async closeAll(){await Promise.all(Object.values(this.mcpClients).map(async t=>{try{await this._closeOneClient(t)}catch(r){this.onError&&this.onError(r?.message||"Failed to close client",r),console.error("Failed to close client",r)}}))}async initClientsAndTools(){await this._createMpcClients(),await this._createMpcTools(),this.onUpdatedTools?.()}async updateMcpServers(t){await this.closeAll(),this.mcpServers=t||this.mcpServers,await this.initClientsAndTools()}async insertMcpServer(t,r){if(this.mcpServers[t])return!1;const n=await this._createOneClient(r);if(!n)return this.onError?.(`Failed to create MCP client: ${t}`),null;this.mcpClients[t]=n;const o=await this._getClientTools(n,t);return this.mcpTools[t]=o&&typeof o=="object"?o:{},this.mcpServers[t]=r,this.onUpdatedTools?.(),n}async removeMcpServer(t){if(!this.mcpServers[t])return;delete this.mcpServers[t];const r=this.mcpClients[t];delete this.mcpClients[t];try{await this._closeOneClient(r)}catch{}const n=this.mcpTools[t];delete this.mcpTools[t],n&&Object.keys(n).forEach(o=>{this.ignoreToolnames=this.ignoreToolnames.filter(s=>s!==o)}),this.onUpdatedTools?.()}_tempMergeTools(t={},r=!0){const n=Object.values(this.mcpTools).reduce((o,s)=>({...o,...s}),{});return Object.assign(n,t),r&&this.ignoreToolnames.forEach(o=>{delete n[o]}),n}_getActiveToolNames(t){return Object.keys(t).filter(r=>!this.ignoreToolnames.includes(r))}_generateReActSystemPrompt(t,r,n){const o=oE(t);return n?`${n}${o}`:`你是一个智能助手,可以通过调用工具来完成任务。
125
125
  ${o}`}async _executeReActToolCall(t,r,n){const o=n[t];if(!o)return{success:!1,error:`工具 ${t} 不存在`};try{const s=o,i=s.execute||s.call;return typeof i!="function"?{success:!1,error:`工具 ${t} 没有可执行的函数`}:{success:!0,result:await i(r,{})}}catch(s){return{success:!1,error:s?.message||String(s)||"工具执行失败"}}}async _chatReAct(t,{model:r,maxSteps:n=5,...o}){if(!this.llm)throw new Error("LLM is not initialized");await this.initClientsAndTools();const s=this._tempMergeTools(o.tools);if(Object.keys(s).length===0)return this._chat(t,{model:r,maxSteps:n,...o});let a=[];o.message&&!o.messages?a.push({role:"user",content:o.message}):o.messages?a=[...o.messages]:a=[...this.responseMessages];const l=typeof r=="string"?r:r?.modelId||"default-model",u={role:"system",content:this._generateReActSystemPrompt(s,l,o.system)},m=a[0]?.role==="system"?a:[u,...a];return t===Jl?this._chatReActStream(m,s,l,n,o):this._chatReActNonStream(m,s,l,n,o)}_messageHasImage(t){return t&&Array.isArray(t)?t.some(r=>r&&r.type==="image"):!1}_removeImageFromMessage(t){if(!t||!t.content)return null;if(!Array.isArray(t.content))return t;const r=t.content.filter(n=>n&&n.type!=="image");return r.length===0?null:{...t,content:r}}_buildMessagesForModel(t,r,n=3){const o=[];t&&o.push(t);let s=0;const i=[];for(let a=r.length-1;a>=0;a--){const l=r[a];if(this._messageHasImage(l.content))if(s<n)i.unshift(l),s++;else{const u=this._removeImageFromMessage(l);u&&i.unshift(u)}else i.unshift(l)}return o.push(...i),o}async _chatReActNonStream(t,r,n,o,s){let i=[...t];const a=t[0]?.role==="system"?t[0]:null,l=a?t.slice(1):t;let c=0;const u=s.maxImages??3;for(;c<o;){c++;const p=this._buildMessagesForModel(a,l,u),{tools:f,...g}=s,y=(await sm({model:this.llm(n),messages:p,...g})).text,w={role:"assistant",content:y};l.push(w),i.push(w);const _=y_(y,r);if(!_)return this.responseMessages=i,{text:y,response:{messages:i}};const h=await this._executeReActToolCall(_.toolName,_.arguments,r),k={role:"user",content:`<tool_response>
126
126
  ${h.success?JSON.stringify(h.result):`工具执行失败 - ${h.error}`}
127
127
  </tool_response>`};l.push(k),i.push(k)}return this.responseMessages=i,{text:i[i.length-2]?.content||"",response:{messages:i}}}_chatReActStream(t,r,n,o,s){const i=this,a=this.llm(n);let l,c;const u=new Promise((p,f)=>{l=p,c=f});return{fullStream:new ReadableStream({async start(p){let f=[...t];const g=t[0]?.role==="system"?t[0]:null,v=g?t.slice(1):[...t];let y=0,w="";const _=s.maxImages??3;p.enqueue({type:"start"}),p.enqueue({type:"start-step"});try{for(;y<o;){y++;const h=i._buildMessagesForModel(g,v,_),{tools:T,...b}=s;delete b.system,delete b.onFinish;const k=await Jl({...b,model:a,messages:h});let S="";for await(const Q of k.fullStream)Q.type==="text-delta"?(S+=Q.text||"",p.enqueue({type:"text-delta",text:Q.text})):Q.type==="text-start"?p.enqueue({type:"text-start"}):Q.type==="text-end"||Q.type==="finish-step"||Q.type==="finish"||Q.type==="start"||Q.type==="start-step"||p.enqueue(Q);w+=S;const I={role:"assistant",content:w};v.push(I),f.push(I);const x=y_(w,r);if(!x){p.enqueue({type:"text-end"}),p.enqueue({type:"finish-step"}),p.enqueue({type:"finish"}),p.close(),i.responseMessages=f,l({messages:f});return}if(x.toolName==="computer"&&x.arguments?.action==="terminate"){p.enqueue({type:"text-end"}),p.enqueue({type:"finish-step"}),p.enqueue({type:"finish"}),p.close(),i.responseMessages=f,l({messages:f});return}const j=`react-${Date.now()}`;p.enqueue({type:"tool-input-start",id:j,toolName:x.toolName});const M=JSON.stringify(x.arguments,null,2);p.enqueue({type:"tool-input-delta",id:j,delta:M}),p.enqueue({type:"tool-input-end",id:j}),p.enqueue({type:"tool-call",toolCallId:j,toolName:x.toolName,input:x.arguments});const D=await i._executeReActToolCall(x.toolName,x.arguments,r);let A,O=D.result;if(D.success&&D.result&&typeof D.result=="object"&&D.result.screenshot){A=D.result.screenshot;const{screenshot:Q,...Y}=D.result;O=Y}let H="";if(D.success){O&&Array.isArray(O.content)&&O.content.length>0&&O.content[0].text?H=O.content[0].text:H=JSON.stringify(O);let Q=`<tool_response>
128
128
  ${H}
129
129
  </tool_response>`;A&&(Q+=`
130
- 请检查截图以确认操作是否成功。如果成功,请继续下一步;如果失败,请重试。`),p.enqueue({type:"tool-result",toolCallId:j,result:Q});const Y=A?{role:"user",content:[{type:"text",text:Q},{type:"image",image:A}]}:{role:"user",content:Q};v.push(Y),f.push(Y),w=""}else H=`工具执行失败 - ${D.error}`,p.enqueue({type:"tool-error",toolCallId:j,input:x.arguments,error:{message:H}})}p.enqueue({type:"text-end"}),p.enqueue({type:"finish-step"}),p.enqueue({type:"finish"}),p.close(),i.responseMessages=f,l({messages:f})}catch(h){p.error(h),c(h)}}}),response:u}}async _chat(t,{model:r,maxSteps:n=5,...o}){if(this.useReActMode)return this._chatReAct(t,{model:r,maxSteps:n,...o});if(!this.llm)throw new Error("LLM is not initialized");await this.initClientsAndTools();const s={model:this.llm(r),stopWhen:Zl(n),...o,tools:this._tempMergeTools(o.tools)};let i=null;if(o.message&&!o.messages)i={role:"user",content:o.message},this.responseMessages.push(i),s.messages=[...this.responseMessages];else if(o.messages&&o.messages.length>0){const l=o.messages[o.messages.length-1];l.role==="user"&&(i=l)}const a=t(s);return a?.response?.then(l=>{const c=l.messages?.[0];i&&c?.role!=="user"&&this.responseMessages.push(i),this.responseMessages.push(...l.messages)}),a}async chat(t){return this._chat(sm,t)}async chatStream(t){return this._chat(Jl,t)}}var vo={},Tu,__;function iE(){return __||(__=1,Tu=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Tu}var Su={},fn={},v_;function zn(){if(v_)return fn;v_=1;let e;const t=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return fn.getSymbolSize=function(n){if(!n)throw new Error('"version" cannot be null or undefined');if(n<1||n>40)throw new Error('"version" should be in range from 1 to 40');return n*4+17},fn.getSymbolTotalCodewords=function(n){return t[n]},fn.getBCHDigit=function(r){let n=0;for(;r!==0;)n++,r>>>=1;return n},fn.setToSJISFunction=function(n){if(typeof n!="function")throw new Error('"toSJISFunc" is not a valid function.');e=n},fn.isKanjiModeEnabled=function(){return typeof e<"u"},fn.toSJIS=function(n){return e(n)},fn}var Iu={},w_;function xu(){return w_||(w_=1,(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(r){if(typeof r!="string")throw new Error("Param is not a string");switch(r.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+r)}}e.isValid=function(n){return n&&typeof n.bit<"u"&&n.bit>=0&&n.bit<4},e.from=function(n,o){if(e.isValid(n))return n;try{return t(n)}catch{return o}}})(Iu)),Iu}var Eu,b_;function lE(){if(b_)return Eu;b_=1;function e(){this.buffer=[],this.length=0}return e.prototype={get:function(t){const r=Math.floor(t/8);return(this.buffer[r]>>>7-t%8&1)===1},put:function(t,r){for(let n=0;n<r;n++)this.putBit((t>>>r-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){const r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}},Eu=e,Eu}var $u,k_;function cE(){if(k_)return $u;k_=1;function e(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}return e.prototype.set=function(t,r,n,o){const s=t*this.size+r;this.data[s]=n,o&&(this.reservedBit[s]=!0)},e.prototype.get=function(t,r){return this.data[t*this.size+r]},e.prototype.xor=function(t,r,n){this.data[t*this.size+r]^=n},e.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]},$u=e,$u}var Ru={},C_;function uE(){return C_||(C_=1,(function(e){const t=zn().getSymbolSize;e.getRowColCoords=function(n){if(n===1)return[];const o=Math.floor(n/7)+2,s=t(n),i=s===145?26:Math.ceil((s-13)/(2*o-2))*2,a=[s-7];for(let l=1;l<o-1;l++)a[l]=a[l-1]-i;return a.push(6),a.reverse()},e.getPositions=function(n){const o=[],s=e.getRowColCoords(n),i=s.length;for(let a=0;a<i;a++)for(let l=0;l<i;l++)a===0&&l===0||a===0&&l===i-1||a===i-1&&l===0||o.push([s[a],s[l]]);return o}})(Ru)),Ru}var Pu={},T_;function dE(){if(T_)return Pu;T_=1;const e=zn().getSymbolSize,t=7;return Pu.getPositions=function(n){const o=e(n);return[[0,0],[o-t,0],[0,o-t]]},Pu}var Nu={},S_;function pE(){return S_||(S_=1,(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(o){return o!=null&&o!==""&&!isNaN(o)&&o>=0&&o<=7},e.from=function(o){return e.isValid(o)?parseInt(o,10):void 0},e.getPenaltyN1=function(o){const s=o.size;let i=0,a=0,l=0,c=null,u=null;for(let m=0;m<s;m++){a=l=0,c=u=null;for(let p=0;p<s;p++){let f=o.get(m,p);f===c?a++:(a>=5&&(i+=t.N1+(a-5)),c=f,a=1),f=o.get(p,m),f===u?l++:(l>=5&&(i+=t.N1+(l-5)),u=f,l=1)}a>=5&&(i+=t.N1+(a-5)),l>=5&&(i+=t.N1+(l-5))}return i},e.getPenaltyN2=function(o){const s=o.size;let i=0;for(let a=0;a<s-1;a++)for(let l=0;l<s-1;l++){const c=o.get(a,l)+o.get(a,l+1)+o.get(a+1,l)+o.get(a+1,l+1);(c===4||c===0)&&i++}return i*t.N2},e.getPenaltyN3=function(o){const s=o.size;let i=0,a=0,l=0;for(let c=0;c<s;c++){a=l=0;for(let u=0;u<s;u++)a=a<<1&2047|o.get(c,u),u>=10&&(a===1488||a===93)&&i++,l=l<<1&2047|o.get(u,c),u>=10&&(l===1488||l===93)&&i++}return i*t.N3},e.getPenaltyN4=function(o){let s=0;const i=o.data.length;for(let l=0;l<i;l++)s+=o.data[l];return Math.abs(Math.ceil(s*100/i/5)-10)*t.N4};function r(n,o,s){switch(n){case e.Patterns.PATTERN000:return(o+s)%2===0;case e.Patterns.PATTERN001:return o%2===0;case e.Patterns.PATTERN010:return s%3===0;case e.Patterns.PATTERN011:return(o+s)%3===0;case e.Patterns.PATTERN100:return(Math.floor(o/2)+Math.floor(s/3))%2===0;case e.Patterns.PATTERN101:return o*s%2+o*s%3===0;case e.Patterns.PATTERN110:return(o*s%2+o*s%3)%2===0;case e.Patterns.PATTERN111:return(o*s%3+(o+s)%2)%2===0;default:throw new Error("bad maskPattern:"+n)}}e.applyMask=function(o,s){const i=s.size;for(let a=0;a<i;a++)for(let l=0;l<i;l++)s.isReserved(l,a)||s.xor(l,a,r(o,l,a))},e.getBestMask=function(o,s){const i=Object.keys(e.Patterns).length;let a=0,l=1/0;for(let c=0;c<i;c++){s(c),e.applyMask(c,o);const u=e.getPenaltyN1(o)+e.getPenaltyN2(o)+e.getPenaltyN3(o)+e.getPenaltyN4(o);e.applyMask(c,o),u<l&&(l=u,a=c)}return a}})(Nu)),Nu}var Ni={},I_;function x_(){if(I_)return Ni;I_=1;const e=xu(),t=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return Ni.getBlocksCount=function(o,s){switch(s){case e.L:return t[(o-1)*4+0];case e.M:return t[(o-1)*4+1];case e.Q:return t[(o-1)*4+2];case e.H:return t[(o-1)*4+3];default:return}},Ni.getTotalCodewordsCount=function(o,s){switch(s){case e.L:return r[(o-1)*4+0];case e.M:return r[(o-1)*4+1];case e.Q:return r[(o-1)*4+2];case e.H:return r[(o-1)*4+3];default:return}},Ni}var Mu={},ys={},E_;function fE(){if(E_)return ys;E_=1;const e=new Uint8Array(512),t=new Uint8Array(256);return(function(){let n=1;for(let o=0;o<255;o++)e[o]=n,t[n]=o,n<<=1,n&256&&(n^=285);for(let o=255;o<512;o++)e[o]=e[o-255]})(),ys.log=function(n){if(n<1)throw new Error("log("+n+")");return t[n]},ys.exp=function(n){return e[n]},ys.mul=function(n,o){return n===0||o===0?0:e[t[n]+t[o]]},ys}var $_;function hE(){return $_||($_=1,(function(e){const t=fE();e.mul=function(n,o){const s=new Uint8Array(n.length+o.length-1);for(let i=0;i<n.length;i++)for(let a=0;a<o.length;a++)s[i+a]^=t.mul(n[i],o[a]);return s},e.mod=function(n,o){let s=new Uint8Array(n);for(;s.length-o.length>=0;){const i=s[0];for(let l=0;l<o.length;l++)s[l]^=t.mul(o[l],i);let a=0;for(;a<s.length&&s[a]===0;)a++;s=s.slice(a)}return s},e.generateECPolynomial=function(n){let o=new Uint8Array([1]);for(let s=0;s<n;s++)o=e.mul(o,new Uint8Array([1,t.exp(s)]));return o}})(Mu)),Mu}var Ou,R_;function mE(){if(R_)return Ou;R_=1;const e=hE();function t(r){this.genPoly=void 0,this.degree=r,this.degree&&this.initialize(this.degree)}return t.prototype.initialize=function(n){this.degree=n,this.genPoly=e.generateECPolynomial(this.degree)},t.prototype.encode=function(n){if(!this.genPoly)throw new Error("Encoder not initialized");const o=new Uint8Array(n.length+this.degree);o.set(n);const s=e.mod(o,this.genPoly),i=this.degree-s.length;if(i>0){const a=new Uint8Array(this.degree);return a.set(s,i),a}return s},Ou=t,Ou}var Au={},qu={},Lu={},P_;function N_(){return P_||(P_=1,Lu.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}),Lu}var $r={},M_;function O_(){if(M_)return $r;M_=1;const e="[0-9]+",t="[A-Z $%*+\\-./:]+";let r="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";r=r.replace(/u/g,"\\u");const n="(?:(?![A-Z0-9 $%*+\\-./:]|"+r+`)(?:.|[\r
130
+ 请检查截图以确认操作是否成功。如果成功,请继续下一步;如果失败,请重试。`),p.enqueue({type:"tool-result",toolCallId:j,result:Q});const Y=A?{role:"user",content:[{type:"text",text:Q},{type:"image",image:A}]}:{role:"user",content:Q};v.push(Y),f.push(Y),w=""}else H=`工具执行失败 - ${D.error}`,p.enqueue({type:"tool-error",toolCallId:j,input:x.arguments,error:{message:H}})}p.enqueue({type:"text-end"}),p.enqueue({type:"finish-step"}),p.enqueue({type:"finish"}),p.close(),i.responseMessages=f,l({messages:f})}catch(h){p.error(h),c(h)}}}),response:u}}async _chat(t,{model:r,maxSteps:n=5,...o}){if(this.useReActMode)return this._chatReAct(t,{model:r,maxSteps:n,...o});if(!this.llm)throw new Error("LLM is not initialized");await this.initClientsAndTools();const s=this._tempMergeTools(o.tools,!1),i={model:this.llm(r),stopWhen:Zl(n),...o,tools:s,activeTools:this._getActiveToolNames(s)};let a=null;if(o.message&&!o.messages)a={role:"user",content:o.message},this.responseMessages.push(a),i.messages=[...this.responseMessages];else if(o.messages&&o.messages.length>0){const c=o.messages[o.messages.length-1];c.role==="user"&&(a=c)}const l=t(i);return l?.response?.then(c=>{const u=c.messages?.[0];a&&u?.role!=="user"&&this.responseMessages.push(a),this.responseMessages.push(...c.messages)}),l}async chat(t){return this._chat(sm,t)}async chatStream(t){return this._chat(Jl,t)}}var vo={},Tu,__;function iE(){return __||(__=1,Tu=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Tu}var Su={},fn={},v_;function zn(){if(v_)return fn;v_=1;let e;const t=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return fn.getSymbolSize=function(n){if(!n)throw new Error('"version" cannot be null or undefined');if(n<1||n>40)throw new Error('"version" should be in range from 1 to 40');return n*4+17},fn.getSymbolTotalCodewords=function(n){return t[n]},fn.getBCHDigit=function(r){let n=0;for(;r!==0;)n++,r>>>=1;return n},fn.setToSJISFunction=function(n){if(typeof n!="function")throw new Error('"toSJISFunc" is not a valid function.');e=n},fn.isKanjiModeEnabled=function(){return typeof e<"u"},fn.toSJIS=function(n){return e(n)},fn}var Iu={},w_;function xu(){return w_||(w_=1,(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(r){if(typeof r!="string")throw new Error("Param is not a string");switch(r.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+r)}}e.isValid=function(n){return n&&typeof n.bit<"u"&&n.bit>=0&&n.bit<4},e.from=function(n,o){if(e.isValid(n))return n;try{return t(n)}catch{return o}}})(Iu)),Iu}var Eu,b_;function lE(){if(b_)return Eu;b_=1;function e(){this.buffer=[],this.length=0}return e.prototype={get:function(t){const r=Math.floor(t/8);return(this.buffer[r]>>>7-t%8&1)===1},put:function(t,r){for(let n=0;n<r;n++)this.putBit((t>>>r-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){const r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}},Eu=e,Eu}var $u,k_;function cE(){if(k_)return $u;k_=1;function e(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}return e.prototype.set=function(t,r,n,o){const s=t*this.size+r;this.data[s]=n,o&&(this.reservedBit[s]=!0)},e.prototype.get=function(t,r){return this.data[t*this.size+r]},e.prototype.xor=function(t,r,n){this.data[t*this.size+r]^=n},e.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]},$u=e,$u}var Ru={},C_;function uE(){return C_||(C_=1,(function(e){const t=zn().getSymbolSize;e.getRowColCoords=function(n){if(n===1)return[];const o=Math.floor(n/7)+2,s=t(n),i=s===145?26:Math.ceil((s-13)/(2*o-2))*2,a=[s-7];for(let l=1;l<o-1;l++)a[l]=a[l-1]-i;return a.push(6),a.reverse()},e.getPositions=function(n){const o=[],s=e.getRowColCoords(n),i=s.length;for(let a=0;a<i;a++)for(let l=0;l<i;l++)a===0&&l===0||a===0&&l===i-1||a===i-1&&l===0||o.push([s[a],s[l]]);return o}})(Ru)),Ru}var Pu={},T_;function dE(){if(T_)return Pu;T_=1;const e=zn().getSymbolSize,t=7;return Pu.getPositions=function(n){const o=e(n);return[[0,0],[o-t,0],[0,o-t]]},Pu}var Nu={},S_;function pE(){return S_||(S_=1,(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(o){return o!=null&&o!==""&&!isNaN(o)&&o>=0&&o<=7},e.from=function(o){return e.isValid(o)?parseInt(o,10):void 0},e.getPenaltyN1=function(o){const s=o.size;let i=0,a=0,l=0,c=null,u=null;for(let m=0;m<s;m++){a=l=0,c=u=null;for(let p=0;p<s;p++){let f=o.get(m,p);f===c?a++:(a>=5&&(i+=t.N1+(a-5)),c=f,a=1),f=o.get(p,m),f===u?l++:(l>=5&&(i+=t.N1+(l-5)),u=f,l=1)}a>=5&&(i+=t.N1+(a-5)),l>=5&&(i+=t.N1+(l-5))}return i},e.getPenaltyN2=function(o){const s=o.size;let i=0;for(let a=0;a<s-1;a++)for(let l=0;l<s-1;l++){const c=o.get(a,l)+o.get(a,l+1)+o.get(a+1,l)+o.get(a+1,l+1);(c===4||c===0)&&i++}return i*t.N2},e.getPenaltyN3=function(o){const s=o.size;let i=0,a=0,l=0;for(let c=0;c<s;c++){a=l=0;for(let u=0;u<s;u++)a=a<<1&2047|o.get(c,u),u>=10&&(a===1488||a===93)&&i++,l=l<<1&2047|o.get(u,c),u>=10&&(l===1488||l===93)&&i++}return i*t.N3},e.getPenaltyN4=function(o){let s=0;const i=o.data.length;for(let l=0;l<i;l++)s+=o.data[l];return Math.abs(Math.ceil(s*100/i/5)-10)*t.N4};function r(n,o,s){switch(n){case e.Patterns.PATTERN000:return(o+s)%2===0;case e.Patterns.PATTERN001:return o%2===0;case e.Patterns.PATTERN010:return s%3===0;case e.Patterns.PATTERN011:return(o+s)%3===0;case e.Patterns.PATTERN100:return(Math.floor(o/2)+Math.floor(s/3))%2===0;case e.Patterns.PATTERN101:return o*s%2+o*s%3===0;case e.Patterns.PATTERN110:return(o*s%2+o*s%3)%2===0;case e.Patterns.PATTERN111:return(o*s%3+(o+s)%2)%2===0;default:throw new Error("bad maskPattern:"+n)}}e.applyMask=function(o,s){const i=s.size;for(let a=0;a<i;a++)for(let l=0;l<i;l++)s.isReserved(l,a)||s.xor(l,a,r(o,l,a))},e.getBestMask=function(o,s){const i=Object.keys(e.Patterns).length;let a=0,l=1/0;for(let c=0;c<i;c++){s(c),e.applyMask(c,o);const u=e.getPenaltyN1(o)+e.getPenaltyN2(o)+e.getPenaltyN3(o)+e.getPenaltyN4(o);e.applyMask(c,o),u<l&&(l=u,a=c)}return a}})(Nu)),Nu}var Ni={},I_;function x_(){if(I_)return Ni;I_=1;const e=xu(),t=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return Ni.getBlocksCount=function(o,s){switch(s){case e.L:return t[(o-1)*4+0];case e.M:return t[(o-1)*4+1];case e.Q:return t[(o-1)*4+2];case e.H:return t[(o-1)*4+3];default:return}},Ni.getTotalCodewordsCount=function(o,s){switch(s){case e.L:return r[(o-1)*4+0];case e.M:return r[(o-1)*4+1];case e.Q:return r[(o-1)*4+2];case e.H:return r[(o-1)*4+3];default:return}},Ni}var Mu={},ys={},E_;function fE(){if(E_)return ys;E_=1;const e=new Uint8Array(512),t=new Uint8Array(256);return(function(){let n=1;for(let o=0;o<255;o++)e[o]=n,t[n]=o,n<<=1,n&256&&(n^=285);for(let o=255;o<512;o++)e[o]=e[o-255]})(),ys.log=function(n){if(n<1)throw new Error("log("+n+")");return t[n]},ys.exp=function(n){return e[n]},ys.mul=function(n,o){return n===0||o===0?0:e[t[n]+t[o]]},ys}var $_;function hE(){return $_||($_=1,(function(e){const t=fE();e.mul=function(n,o){const s=new Uint8Array(n.length+o.length-1);for(let i=0;i<n.length;i++)for(let a=0;a<o.length;a++)s[i+a]^=t.mul(n[i],o[a]);return s},e.mod=function(n,o){let s=new Uint8Array(n);for(;s.length-o.length>=0;){const i=s[0];for(let l=0;l<o.length;l++)s[l]^=t.mul(o[l],i);let a=0;for(;a<s.length&&s[a]===0;)a++;s=s.slice(a)}return s},e.generateECPolynomial=function(n){let o=new Uint8Array([1]);for(let s=0;s<n;s++)o=e.mul(o,new Uint8Array([1,t.exp(s)]));return o}})(Mu)),Mu}var Ou,R_;function mE(){if(R_)return Ou;R_=1;const e=hE();function t(r){this.genPoly=void 0,this.degree=r,this.degree&&this.initialize(this.degree)}return t.prototype.initialize=function(n){this.degree=n,this.genPoly=e.generateECPolynomial(this.degree)},t.prototype.encode=function(n){if(!this.genPoly)throw new Error("Encoder not initialized");const o=new Uint8Array(n.length+this.degree);o.set(n);const s=e.mod(o,this.genPoly),i=this.degree-s.length;if(i>0){const a=new Uint8Array(this.degree);return a.set(s,i),a}return s},Ou=t,Ou}var Au={},qu={},Lu={},P_;function N_(){return P_||(P_=1,Lu.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}),Lu}var $r={},M_;function O_(){if(M_)return $r;M_=1;const e="[0-9]+",t="[A-Z $%*+\\-./:]+";let r="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";r=r.replace(/u/g,"\\u");const n="(?:(?![A-Z0-9 $%*+\\-./:]|"+r+`)(?:.|[\r
131
131
  ]))+`;$r.KANJI=new RegExp(r,"g"),$r.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),$r.BYTE=new RegExp(n,"g"),$r.NUMERIC=new RegExp(e,"g"),$r.ALPHANUMERIC=new RegExp(t,"g");const o=new RegExp("^"+r+"$"),s=new RegExp("^"+e+"$"),i=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return $r.testKanji=function(l){return o.test(l)},$r.testNumeric=function(l){return s.test(l)},$r.testAlphanumeric=function(l){return i.test(l)},$r}var A_;function Fn(){return A_||(A_=1,(function(e){const t=N_(),r=O_();e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(s,i){if(!s.ccBits)throw new Error("Invalid mode: "+s);if(!t.isValid(i))throw new Error("Invalid version: "+i);return i>=1&&i<10?s.ccBits[0]:i<27?s.ccBits[1]:s.ccBits[2]},e.getBestModeForData=function(s){return r.testNumeric(s)?e.NUMERIC:r.testAlphanumeric(s)?e.ALPHANUMERIC:r.testKanji(s)?e.KANJI:e.BYTE},e.toString=function(s){if(s&&s.id)return s.id;throw new Error("Invalid mode")},e.isValid=function(s){return s&&s.bit&&s.ccBits};function n(o){if(typeof o!="string")throw new Error("Param is not a string");switch(o.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+o)}}e.from=function(s,i){if(e.isValid(s))return s;try{return n(s)}catch{return i}}})(qu)),qu}var q_;function gE(){return q_||(q_=1,(function(e){const t=zn(),r=x_(),n=xu(),o=Fn(),s=N_(),i=7973,a=t.getBCHDigit(i);function l(p,f,g){for(let v=1;v<=40;v++)if(f<=e.getCapacity(v,g,p))return v}function c(p,f){return o.getCharCountIndicator(p,f)+4}function u(p,f){let g=0;return p.forEach(function(v){const y=c(v.mode,f);g+=y+v.getBitsLength()}),g}function m(p,f){for(let g=1;g<=40;g++)if(u(p,g)<=e.getCapacity(g,f,o.MIXED))return g}e.from=function(f,g){return s.isValid(f)?parseInt(f,10):g},e.getCapacity=function(f,g,v){if(!s.isValid(f))throw new Error("Invalid QR Code version");typeof v>"u"&&(v=o.BYTE);const y=t.getSymbolTotalCodewords(f),w=r.getTotalCodewordsCount(f,g),_=(y-w)*8;if(v===o.MIXED)return _;const h=_-c(v,f);switch(v){case o.NUMERIC:return Math.floor(h/10*3);case o.ALPHANUMERIC:return Math.floor(h/11*2);case o.KANJI:return Math.floor(h/13);case o.BYTE:default:return Math.floor(h/8)}},e.getBestVersionForData=function(f,g){let v;const y=n.from(g,n.M);if(Array.isArray(f)){if(f.length>1)return m(f,y);if(f.length===0)return 1;v=f[0]}else v=f;return l(v.mode,v.getLength(),y)},e.getEncodedBits=function(f){if(!s.isValid(f)||f<7)throw new Error("Invalid QR Code version");let g=f<<12;for(;t.getBCHDigit(g)-a>=0;)g^=i<<t.getBCHDigit(g)-a;return f<<12|g}})(Au)),Au}var ju={},L_;function yE(){if(L_)return ju;L_=1;const e=zn(),t=1335,r=21522,n=e.getBCHDigit(t);return ju.getEncodedBits=function(s,i){const a=s.bit<<3|i;let l=a<<10;for(;e.getBCHDigit(l)-n>=0;)l^=t<<e.getBCHDigit(l)-n;return(a<<10|l)^r},ju}var Uu={},Du,j_;function _E(){if(j_)return Du;j_=1;const e=Fn();function t(r){this.mode=e.NUMERIC,this.data=r.toString()}return t.getBitsLength=function(n){return 10*Math.floor(n/3)+(n%3?n%3*3+1:0)},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(n){let o,s,i;for(o=0;o+3<=this.data.length;o+=3)s=this.data.substr(o,3),i=parseInt(s,10),n.put(i,10);const a=this.data.length-o;a>0&&(s=this.data.substr(o),i=parseInt(s,10),n.put(i,a*3+1))},Du=t,Du}var zu,U_;function vE(){if(U_)return zu;U_=1;const e=Fn(),t=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function r(n){this.mode=e.ALPHANUMERIC,this.data=n}return r.getBitsLength=function(o){return 11*Math.floor(o/2)+6*(o%2)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(o){let s;for(s=0;s+2<=this.data.length;s+=2){let i=t.indexOf(this.data[s])*45;i+=t.indexOf(this.data[s+1]),o.put(i,11)}this.data.length%2&&o.put(t.indexOf(this.data[s]),6)},zu=r,zu}var Fu,D_;function wE(){if(D_)return Fu;D_=1;const e=Fn();function t(r){this.mode=e.BYTE,typeof r=="string"?this.data=new TextEncoder().encode(r):this.data=new Uint8Array(r)}return t.getBitsLength=function(n){return n*8},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(r){for(let n=0,o=this.data.length;n<o;n++)r.put(this.data[n],8)},Fu=t,Fu}var Vu,z_;function bE(){if(z_)return Vu;z_=1;const e=Fn(),t=zn();function r(n){this.mode=e.KANJI,this.data=n}return r.getBitsLength=function(o){return o*13},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(n){let o;for(o=0;o<this.data.length;o++){let s=t.toSJIS(this.data[o]);if(s>=33088&&s<=40956)s-=33088;else if(s>=57408&&s<=60351)s-=49472;else throw new Error("Invalid SJIS character: "+this.data[o]+`
132
132
  Make sure your charset is UTF-8`);s=(s>>>8&255)*192+(s&255),n.put(s,13)}},Vu=r,Vu}var Zu={exports:{}},F_;function kE(){return F_||(F_=1,(function(e){var t={single_source_shortest_paths:function(r,n,o){var s={},i={};i[n]=0;var a=t.PriorityQueue.make();a.push(n,0);for(var l,c,u,m,p,f,g,v,y;!a.empty();){l=a.pop(),c=l.value,m=l.cost,p=r[c]||{};for(u in p)p.hasOwnProperty(u)&&(f=p[u],g=m+f,v=i[u],y=typeof i[u]>"u",(y||v>g)&&(i[u]=g,a.push(u,g),s[u]=c))}if(typeof o<"u"&&typeof i[o]>"u"){var w=["Could not find a path from ",n," to ",o,"."].join("");throw new Error(w)}return s},extract_shortest_path_from_predecessor_list:function(r,n){for(var o=[],s=n;s;)o.push(s),r[s],s=r[s];return o.reverse(),o},find_path:function(r,n,o){var s=t.single_source_shortest_paths(r,n,o);return t.extract_shortest_path_from_predecessor_list(s,o)},PriorityQueue:{make:function(r){var n=t.PriorityQueue,o={},s;r=r||{};for(s in n)n.hasOwnProperty(s)&&(o[s]=n[s]);return o.queue=[],o.sorter=r.sorter||n.default_sorter,o},default_sorter:function(r,n){return r.cost-n.cost},push:function(r,n){var o={value:r,cost:n};this.queue.push(o),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(Zu)),Zu.exports}var V_;function CE(){return V_||(V_=1,(function(e){const t=Fn(),r=_E(),n=vE(),o=wE(),s=bE(),i=O_(),a=zn(),l=kE();function c(w){return unescape(encodeURIComponent(w)).length}function u(w,_,h){const T=[];let b;for(;(b=w.exec(h))!==null;)T.push({data:b[0],index:b.index,mode:_,length:b[0].length});return T}function m(w){const _=u(i.NUMERIC,t.NUMERIC,w),h=u(i.ALPHANUMERIC,t.ALPHANUMERIC,w);let T,b;return a.isKanjiModeEnabled()?(T=u(i.BYTE,t.BYTE,w),b=u(i.KANJI,t.KANJI,w)):(T=u(i.BYTE_KANJI,t.BYTE,w),b=[]),_.concat(h,T,b).sort(function(S,I){return S.index-I.index}).map(function(S){return{data:S.data,mode:S.mode,length:S.length}})}function p(w,_){switch(_){case t.NUMERIC:return r.getBitsLength(w);case t.ALPHANUMERIC:return n.getBitsLength(w);case t.KANJI:return s.getBitsLength(w);case t.BYTE:return o.getBitsLength(w)}}function f(w){return w.reduce(function(_,h){const T=_.length-1>=0?_[_.length-1]:null;return T&&T.mode===h.mode?(_[_.length-1].data+=h.data,_):(_.push(h),_)},[])}function g(w){const _=[];for(let h=0;h<w.length;h++){const T=w[h];switch(T.mode){case t.NUMERIC:_.push([T,{data:T.data,mode:t.ALPHANUMERIC,length:T.length},{data:T.data,mode:t.BYTE,length:T.length}]);break;case t.ALPHANUMERIC:_.push([T,{data:T.data,mode:t.BYTE,length:T.length}]);break;case t.KANJI:_.push([T,{data:T.data,mode:t.BYTE,length:c(T.data)}]);break;case t.BYTE:_.push([{data:T.data,mode:t.BYTE,length:c(T.data)}])}}return _}function v(w,_){const h={},T={start:{}};let b=["start"];for(let k=0;k<w.length;k++){const S=w[k],I=[];for(let x=0;x<S.length;x++){const j=S[x],M=""+k+x;I.push(M),h[M]={node:j,lastCount:0},T[M]={};for(let D=0;D<b.length;D++){const A=b[D];h[A]&&h[A].node.mode===j.mode?(T[A][M]=p(h[A].lastCount+j.length,j.mode)-p(h[A].lastCount,j.mode),h[A].lastCount+=j.length):(h[A]&&(h[A].lastCount=j.length),T[A][M]=p(j.length,j.mode)+4+t.getCharCountIndicator(j.mode,_))}}b=I}for(let k=0;k<b.length;k++)T[b[k]].end=0;return{map:T,table:h}}function y(w,_){let h;const T=t.getBestModeForData(w);if(h=t.from(_,T),h!==t.BYTE&&h.bit<T.bit)throw new Error('"'+w+'" cannot be encoded with mode '+t.toString(h)+`.
133
133
  Suggested mode is: `+t.toString(T));switch(h===t.KANJI&&!a.isKanjiModeEnabled()&&(h=t.BYTE),h){case t.NUMERIC:return new r(w);case t.ALPHANUMERIC:return new n(w);case t.KANJI:return new s(w);case t.BYTE:return new o(w)}}e.fromArray=function(_){return _.reduce(function(h,T){return typeof T=="string"?h.push(y(T,null)):T.data&&h.push(y(T.data,T.mode)),h},[])},e.fromString=function(_,h){const T=m(_,a.isKanjiModeEnabled()),b=g(T),k=v(b,h),S=l.find_path(k.map,"start","end"),I=[];for(let x=1;x<S.length-1;x++)I.push(k.table[S[x]].node);return e.fromArray(f(I))},e.rawSplit=function(_){return e.fromArray(m(_,a.isKanjiModeEnabled()))}})(Uu)),Uu}var Z_;function TE(){if(Z_)return Su;Z_=1;const e=zn(),t=xu(),r=lE(),n=cE(),o=uE(),s=dE(),i=pE(),a=x_(),l=mE(),c=gE(),u=yE(),m=Fn(),p=CE();function f(k,S){const I=k.size,x=s.getPositions(S);for(let j=0;j<x.length;j++){const M=x[j][0],D=x[j][1];for(let A=-1;A<=7;A++)if(!(M+A<=-1||I<=M+A))for(let O=-1;O<=7;O++)D+O<=-1||I<=D+O||(A>=0&&A<=6&&(O===0||O===6)||O>=0&&O<=6&&(A===0||A===6)||A>=2&&A<=4&&O>=2&&O<=4?k.set(M+A,D+O,!0,!0):k.set(M+A,D+O,!1,!0))}}function g(k){const S=k.size;for(let I=8;I<S-8;I++){const x=I%2===0;k.set(I,6,x,!0),k.set(6,I,x,!0)}}function v(k,S){const I=o.getPositions(S);for(let x=0;x<I.length;x++){const j=I[x][0],M=I[x][1];for(let D=-2;D<=2;D++)for(let A=-2;A<=2;A++)D===-2||D===2||A===-2||A===2||D===0&&A===0?k.set(j+D,M+A,!0,!0):k.set(j+D,M+A,!1,!0)}}function y(k,S){const I=k.size,x=c.getEncodedBits(S);let j,M,D;for(let A=0;A<18;A++)j=Math.floor(A/3),M=A%3+I-8-3,D=(x>>A&1)===1,k.set(j,M,D,!0),k.set(M,j,D,!0)}function w(k,S,I){const x=k.size,j=u.getEncodedBits(S,I);let M,D;for(M=0;M<15;M++)D=(j>>M&1)===1,M<6?k.set(M,8,D,!0):M<8?k.set(M+1,8,D,!0):k.set(x-15+M,8,D,!0),M<8?k.set(8,x-M-1,D,!0):M<9?k.set(8,15-M-1+1,D,!0):k.set(8,15-M-1,D,!0);k.set(x-8,8,1,!0)}function _(k,S){const I=k.size;let x=-1,j=I-1,M=7,D=0;for(let A=I-1;A>0;A-=2)for(A===6&&A--;;){for(let O=0;O<2;O++)if(!k.isReserved(j,A-O)){let H=!1;D<S.length&&(H=(S[D]>>>M&1)===1),k.set(j,A-O,H),M--,M===-1&&(D++,M=7)}if(j+=x,j<0||I<=j){j-=x,x=-x;break}}}function h(k,S,I){const x=new r;I.forEach(function(O){x.put(O.mode.bit,4),x.put(O.getLength(),m.getCharCountIndicator(O.mode,k)),O.write(x)});const j=e.getSymbolTotalCodewords(k),M=a.getTotalCodewordsCount(k,S),D=(j-M)*8;for(x.getLengthInBits()+4<=D&&x.put(0,4);x.getLengthInBits()%8!==0;)x.putBit(0);const A=(D-x.getLengthInBits())/8;for(let O=0;O<A;O++)x.put(O%2?17:236,8);return T(x,k,S)}function T(k,S,I){const x=e.getSymbolTotalCodewords(S),j=a.getTotalCodewordsCount(S,I),M=x-j,D=a.getBlocksCount(S,I),A=x%D,O=D-A,H=Math.floor(x/D),Q=Math.floor(M/D),Y=Q+1,W=H-Q,pe=new l(W);let Z=0;const P=new Array(D),B=new Array(D);let F=0;const E=new Uint8Array(k.buffer);for(let se=0;se<D;se++){const ke=se<O?Q:Y;P[se]=E.slice(Z,Z+ke),B[se]=pe.encode(P[se]),Z+=ke,F=Math.max(F,ke)}const N=new Uint8Array(x);let L=0,G,ee;for(G=0;G<F;G++)for(ee=0;ee<D;ee++)G<P[ee].length&&(N[L++]=P[ee][G]);for(G=0;G<W;G++)for(ee=0;ee<D;ee++)N[L++]=B[ee][G];return N}function b(k,S,I,x){let j;if(Array.isArray(k))j=p.fromArray(k);else if(typeof k=="string"){let H=S;if(!H){const Q=p.rawSplit(k);H=c.getBestVersionForData(Q,I)}j=p.fromString(k,H||40)}else throw new Error("Invalid data");const M=c.getBestVersionForData(j,I);if(!M)throw new Error("The amount of data is too big to be stored in a QR Code");if(!S)S=M;else if(S<M)throw new Error(`
@@ -632,4 +632,4 @@ Minimum version required to store current data is: `+M+`.
632
632
  color: white;
633
633
  }
634
634
  }
635
- `,document.head.appendChild(t)}destroy(){this.floatingBlock.parentNode&&this.floatingBlock.parentNode.removeChild(this.floatingBlock),this.dropdownMenu.parentNode&&this.dropdownMenu.parentNode.removeChild(this.dropdownMenu)}}const DE=(e={})=>new UE(e);Mr.AgentModelProvider=aE,Mr.QrCode=Y_,Mr.createRemoter=DE,Mr.getAISDKTools=g_,Object.defineProperty(Mr,Symbol.toStringTag,{value:"Module"})}));
635
+ `,document.head.appendChild(t)}destroy(){this.floatingBlock.parentNode&&this.floatingBlock.parentNode.removeChild(this.floatingBlock),this.dropdownMenu.parentNode&&this.dropdownMenu.parentNode.removeChild(this.dropdownMenu)}hide(){this.floatingBlock&&(this.floatingBlock.style.display="none"),this.closeDropdown()}show(){this.floatingBlock&&(this.floatingBlock.style.display="flex")}}const DE=(e={})=>new UE(e);Mr.AgentModelProvider=aE,Mr.QrCode=Y_,Mr.createRemoter=DE,Mr.getAISDKTools=g_,Object.defineProperty(Mr,Symbol.toStringTag,{value:"Module"})}));
package/index.ts CHANGED
@@ -40,7 +40,7 @@ export { QrCode, type QrCodeOption } from './remoter/QrCode'
40
40
  export type * from './agent/type'
41
41
 
42
42
  // Web MCP 页面工具桥接:工具调用自动导航 + 页面消息通信
43
- export * from './page-tool-bridge'
43
+ export * from './page-tools/bridge'
44
44
 
45
45
  // Web 端 Skill 公共能力:解析 skill 文档、生成 systemPrompt、内置 list_skills / get_skill_content 工具
46
46
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentiny/next-sdk",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "type": "module",
5
5
  "homepage": "https://docs.opentiny.design/next-sdk/guide/",
6
6
  "repository": {