page-agent-sdk 2.10.3 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/page-agent-sdk.svg)](https://www.npmjs.com/package/page-agent-sdk)
10
10
  [![license](https://img.shields.io/badge/license-ISC-blue.svg)](https://github.com/whyymj/chat-sdk/blob/master/LICENSE)
11
- [![tests](https://img.shields.io/badge/self%20tests-434%20asserts-brightgreen.svg)](#self-tests)
11
+ [![tests](https://img.shields.io/badge/self%20tests-524%20asserts-brightgreen.svg)](#self-tests)
12
12
 
13
13
  ---
14
14
 
@@ -137,6 +137,8 @@ The core of letting AI safely edit JSON is a **three-layer decoupled split** —
137
137
  ```ts
138
138
  // entry & tool construction
139
139
  createChatSdk, defineTool, defineSkill, presets, z
140
+ // proxy connection (prevent apiKey leakage: proxy mode / direct mode)
141
+ createProxyLlm
140
142
  // harness & middleware (custom orchestration)
141
143
  createAgent, createSubagentMiddleware, createSubagentsMiddleware,
142
144
  createVerifyMiddleware, createWriteBackCheck, createApprovalMiddleware,
@@ -160,6 +162,7 @@ ChatDialog, MessageContent, CodePreview, SkillPanel, useChat
160
162
  | | `llm` | `LLMConfig \| BaseChatModel` · **required** | `LLMConfig={apiKey,baseUrl?,model?,temperature?,maxTokens?}`; OpenAI-compatible (default DeepSeek) |
161
163
  | | `id` | `string` | Stable id (multi-agent isolation + persistence resume; random+warn if omitted) |
162
164
  | | `systemPrompt` | `string` | Agent identity (no hardcoded business; inject via this). Optional — built-in default (JSON operation assistant + `reliableWriteRules`) used if omitted; passing your own fully overrides it. `appendReliableWriteRules` defaults to `true`: auto-appends `reliableWriteRules` with a `---` separator; set `false` to disable |
165
+ | | `augmentSystem` | `(ctx:{state,data?}) => string \| undefined` | Dynamic system prompt injection hook: called each turn, returns a string injected as a segment based on runtime state/data; return undefined to skip; callback errors degrade to skip (no crash). `ctx.data` is taken from liveData() each turn (auto-syncs after setData), enabling dynamic component descriptions / partial schema hints. Not set = current behavior |
163
166
  | **Page data** | `data` | `{schema,bind,description?}` | Single main object: declare zod schema (validation + field descriptions auto-injected into prompt) + bind (reactive/plain object, tools read/write directly, no `window`) + description |
164
167
  | | `tools` / `skills` / `memory` | `Tool[]` / `SkillSpec[]` / `string` | Custom tools / skills / AGENTS.md-style directives |
165
168
  | **Capability toggles** | `capabilities` | `{planning?,dataOps?,fetch?,skills?,vfs?,summarization?,memory?,subagent?,verify?}` | Default all on (`verify` default off); `false` to turn off |
@@ -245,7 +248,7 @@ src/core/
245
248
  ├── composables/ # useChat / useContextManager / useMarkdown
246
249
  ├── components/ # ChatDialog / MessageContent / CodePreview / DebugDrawer
247
250
  └── types/index.ts index.ts # types / sole library entry
248
- examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo
251
+ examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo / proxy-demo
249
252
  doc/ # usage-guide / architecture / context-management / architecture-files
250
253
  CLAUDE.md # architecture + gotchas + coding conventions (agent must-read)
251
254
  ```
@@ -300,7 +303,7 @@ src/core/
300
303
  ├── composables/ # useChat / useContextManager / useMarkdown
301
304
  ├── components/ # ChatDialog / MessageContent / CodePreview / DebugDrawer
302
305
  └── types/index.ts index.ts # types / sole library entry
303
- examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo
306
+ examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo / proxy-demo
304
307
  doc/ # usage-guide / architecture / context-management / architecture-files
305
308
  CLAUDE.md # architecture + gotchas + coding conventions (agent must-read)
306
309
  ```
@@ -405,6 +408,15 @@ createChatSdk({
405
408
  // skillStorage: { id: 'shared' } // manually specify the same id to share the same skill set across pages/agents
406
409
  // sdk.usage // cumulative token usage {prompt_tokens, completion_tokens, total_tokens}
407
410
  // sdk.hide() / sdk.show() // drawer mode hide/show (keeps agent/history/in-flight generation; mount after hide resumes via show, no rebuild)
411
+ // Runtime dynamic reconfiguration (zero-breakage; not calling = current behavior):
412
+ // sdk.setTools(tools) // replace user tools at runtime (built-ins untouched; internal rebind to LLM; next round uses new set)
413
+ // sdk.addTool(tool) // append user tool at runtime (dedup by name)
414
+ // sdk.removeTool(name) // remove user tool at runtime (built-ins untouched); returns whether removed
415
+ // sdk.setLlm(llm) // switch LLM at runtime (quota-exhausted→cheaper model / complex task→stronger model / switch provider; param BaseChatModel or LLMConfig; rebind + re-resolve model caps)
416
+ // sdk.setMemory(text) // update persistent memory directive at runtime (next augmentPrompt injects latest)
417
+ // sdk.setSubagents(configs) // replace pre-declared subagents at runtime (regenerates use_<id> delegation tools + rebind; requires subagents:[] at creation)
418
+ // sdk.addSubagent(config) // append pre-declared subagent at runtime
419
+ // sdk.removeSubagent(id) // remove pre-declared subagent at runtime; returns whether removed
408
420
  ```
409
421
 
410
422
  ## Examples
@@ -422,6 +434,7 @@ After `npm run dev`, visit the corresponding page:
422
434
  | mcp-demo | `/examples/mcp-demo/` | MCP remote tools (needs `npm run mcp:mock`) |
423
435
  | animation-demo | `/examples/animation-demo/` | ChatDialog enter/collapse/unmount animations + inline/drawer + hide/show |
424
436
  | multi-agent-demo | `/examples/multi-agent-demo/` | Multi-agent parallel + exclusive switch (3 independent agents, drawer hide/show keeps each history) |
437
+ | proxy-demo | `/examples/proxy-demo/` | Proxy connection to prevent apiKey leakage (browser holds only userToken, proxy injects real key; includes auto-refresh on expired token; needs `npm run proxy:mock`) |
425
438
 
426
439
  Framework-agnostic integration: `demo/plain.html` (importmap + esm.sh).
427
440
 
@@ -456,8 +469,8 @@ function switchTo(i: number) {
456
469
  ## Self-tests
457
470
 
458
471
  ```bash
459
- npm test # 474 assertions (tsx, source-level; no LLM dependency)
460
- npm run test:e2e # 173 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / hide/show / error scenes)
472
+ npm test # 524 assertions (tsx, source-level; no LLM dependency)
473
+ npm run test:e2e # 210 integration assertions (node, built dist; covers APIs/options/modules/simple&complex scenes: default systemPrompt(capability overview) / dynamic register + inspect sync / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints reflect config) / custom tools/middleware/skills/memory injection / runtime dynamic reconfiguration(setTools/addTool/removeTool/setLlm/setMemory/setSubagents reflect) / switchSession(on/off) / shareContext on/off sharing/independent / storage backends + object config / presets(3) / checkpoint / exports complete(39+ fns/components) / util fns usable(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount boundary / hook multi-listener / llm config / hide/show / error scenes)
461
474
  ```
462
475
 
463
476
  ## Local npm package test
package/README.zh-CN.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/page-agent-sdk.svg)](https://www.npmjs.com/package/page-agent-sdk)
10
10
  [![license](https://img.shields.io/badge/license-ISC-blue.svg)](https://github.com/whyymj/chat-sdk/blob/master/LICENSE)
11
- [![tests](https://img.shields.io/badge/self%20tests-364%20asserts-brightgreen.svg)](#自测)
11
+ [![tests](https://img.shields.io/badge/self%20tests-524%20asserts-brightgreen.svg)](#自测)
12
12
 
13
13
  ---
14
14
 
@@ -137,6 +137,8 @@ SDK 让 AI 安全改 JSON 的核心是**三层解耦配合**——各司其职
137
137
  ```ts
138
138
  // 入口与工具构造
139
139
  createChatSdk, defineTool, defineSkill, presets, z
140
+ // 代理连接(防 apiKey 泄露:proxy 代理模式 / direct 直连模式)
141
+ createProxyLlm
140
142
  // harness 与中间件(自定义编排)
141
143
  createAgent, createSubagentMiddleware, createSubagentsMiddleware,
142
144
  createVerifyMiddleware, createWriteBackCheck, createApprovalMiddleware,
@@ -160,6 +162,7 @@ ChatDialog, MessageContent, CodePreview, SkillPanel, useChat
160
162
  | | `llm` | `LLMConfig \| BaseChatModel` · **必传** | `LLMConfig={apiKey,baseUrl?,model?,temperature?,maxTokens?}`;兼容 OpenAI 协议(默认 DeepSeek) |
161
163
  | | `id` | `string` | 稳定 id(多 agent 隔离 + 持久化恢复;不传随机+warn) |
162
164
  | | `systemPrompt` | `string` | Agent 身份(不硬编码业务,靠这注入)。可选——不传用内置默认(JSON 操作助手 + `reliableWriteRules`);传了则完全覆盖。`appendReliableWriteRules` 默认 `true`:自动用 `---` 分隔线追加 reliableWriteRules;设 `false` 关闭 |
165
+ | | `augmentSystem` | `(ctx:{state,data?}) => string \| undefined` | 动态 system prompt 注入钩子:每轮调,按运行时 state/data 返回字符串作为一段注入;返回 undefined 跳过;回调抛错降级跳过(不崩)。`ctx.data` 每轮从 liveData() 取最新(setData 后自动同步),可据此动态算当前组件说明 / 部分 schema 描述。不配 = 现状行为 |
163
166
  | **页面数据** | `data` | `{schema,bind,description?}` | 单主对象:声明 zod schema(校验 + 字段描述自动注入提示词)+ bind(reactive/普通对象,工具直接读写,不挂 window)+ description |
164
167
  | | `tools` / `skills` / `memory` | `Tool[]` / `SkillSpec[]` / `string` | 自定义工具 / 技能 / AGENTS.md 风格持久指令 |
165
168
  | **能力开关** | `capabilities` | `{planning?,dataOps?,fetch?,skills?,vfs?,summarization?,memory?,subagent?,verify?}` | 默认全开(`verify` 默认关);`false` 关掉省 token |
@@ -245,7 +248,7 @@ src/core/
245
248
  ├── composables/ # useChat / useContextManager / useMarkdown
246
249
  ├── components/ # ChatDialog / MessageContent / CodePreview / DebugDrawer
247
250
  └── types/index.ts index.ts # 类型 / 库唯一入口
248
- examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo
251
+ examples/ # page-demo / nested-demo / dynamic-demo / human-confirm-demo / planner-demo / subagent-demo / mcp-demo / toolsets-demo / proxy-demo
249
252
  doc/ # usage-guide / architecture / context-management / architecture-files
250
253
  CLAUDE.md # 架构要点 + 约定坑 + 编码规范(agent 必读)
251
254
  ```
@@ -350,6 +353,15 @@ createChatSdk({
350
353
  // skillStorage: { id: 'shared' } // 手动指定同一 id → 跨页面/跨 agent 复用同一套用户 skill
351
354
  // sdk.usage // 累计 token 用量 {prompt_tokens, completion_tokens, total_tokens}
352
355
  // sdk.hide() / sdk.show() // 抽屉模式隐藏/显示(保留 agent/历史/生成进程;hide 后再 mount 直接 show 不重建)
356
+ // 运行时动态重配置(零破坏,不调用 = 现状):
357
+ // sdk.setTools(tools) // 运行时替换用户工具集(内置不动,内部 rebind 重新绑定到 LLM,下一轮即生效)
358
+ // sdk.addTool(tool) // 运行时追加用户工具(去重 by name)
359
+ // sdk.removeTool(name) // 运行时移除用户工具(内置不动);返回是否移除成功
360
+ // sdk.setLlm(llm) // 运行时切换 LLM(配额耗尽切便宜模型/复杂任务切强模型/切 provider;参数 BaseChatModel 或 LLMConfig;rebind + 重解析模型能力)
361
+ // sdk.setMemory(text) // 运行时更新持久指令 memory(下一轮 augmentPrompt 注入最新)
362
+ // sdk.setSubagents(configs) // 运行时替换预声明子 agent(重新生成 use_<id> 委派工具 + rebind;需创建时配 subagents:[])
363
+ // sdk.addSubagent(config) // 运行时追加预声明子 agent
364
+ // sdk.removeSubagent(id) // 运行时移除预声明子 agent;返回是否移除成功
353
365
  ```
354
366
 
355
367
  ## 示例
@@ -367,6 +379,7 @@ createChatSdk({
367
379
  | mcp-demo | `/examples/mcp-demo/` | MCP 远程工具(需 `npm run mcp:mock`) |
368
380
  | animation-demo | `/examples/animation-demo/` | ChatDialog 入场/收起/卸载动画 + inline/drawer 模式 + hide/show |
369
381
  | multi-agent-demo | `/examples/multi-agent-demo/` | 多 Agent 并行 + 互斥切换(三独立 agent,drawer hide/show 保留各自历史) |
382
+ | proxy-demo | `/examples/proxy-demo/` | 代理连接防 apiKey 泄露(浏览器只持 userToken,代理注入真实 key;含 token 过期自动刷新;需 `npm run proxy:mock`) |
370
383
 
371
384
  框架无关集成:`demo/plain.html`(importmap + esm.sh)。
372
385
 
@@ -401,8 +414,8 @@ function switchTo(i: number) {
401
414
  ## 自测
402
415
 
403
416
  ```bash
404
- npm test # 474 项断言(tsx 源码级,不依赖 LLM)
405
- npm run test:e2e # 173 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
417
+ npm test # 524 项断言(tsx 源码级,不依赖 LLM)
418
+ npm run test:e2e # 210 项集成断言(node 跑构建产物 dist;覆盖各 API/配置项/功能模块/简单与复杂场景:默认 systemPrompt(含能力概述) / 动态注册与 inspect 同步 / inspect(tools/middleware/subagent/verify/mcp/todos/lastCompression/checkpoints 反映配置) / 自定义 tools/middleware/skills/memory 注入 / 运行时动态重配置(setTools/addTool/removeTool/setLlm/setMemory/setSubagents 反映) / switchSession(开/未开) / shareContext 开/关共享独立 / storage 后端+对象配置 / presets 三预设 / checkpoint / 导出项完整(39+ 函数/组件) / 工具函数可用(isQuotaError/estimateTokens/jpEval/searchJson) / source=builtin / mount 边界 / hook 多监听器 / llm 配置 / 错误场景)
406
419
  ```
407
420
 
408
421
  ## 本地 npm 包测试
@@ -1,2 +1,2 @@
1
- .code-preview-overlay[data-v-3d6e2a95]{z-index:9999;background:#00000080;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.code-preview-modal[data-v-3d6e2a95]{background:#fff;border-radius:12px;flex-direction:column;width:90%;max-width:900px;height:80vh;display:flex;overflow:hidden;box-shadow:0 20px 60px #0000004d}.preview-header[data-v-3d6e2a95]{color:#fff;background:#1f2937;align-items:center;gap:12px;padding:10px 16px;display:flex}.preview-title[data-v-3d6e2a95]{font-size:14px;font-weight:600}.preview-tabs[data-v-3d6e2a95]{gap:4px;margin-left:auto;display:flex}.preview-tabs button[data-v-3d6e2a95]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;padding:4px 12px;font-size:13px}.preview-tabs button.active[data-v-3d6e2a95]{background:#667eea}.preview-tabs button[data-v-3d6e2a95]:disabled{opacity:.4;cursor:not-allowed}.preview-actions[data-v-3d6e2a95]{gap:4px;display:flex}.icon-btn[data-v-3d6e2a95]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:flex}.icon-btn[data-v-3d6e2a95]:hover{background:#ffffff40}.preview-body[data-v-3d6e2a95]{background:#f9fafb;flex:1;overflow:hidden}.preview-iframe[data-v-3d6e2a95]{background:#fff;border:none;width:100%;height:100%}.preview-source[data-v-3d6e2a95]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;height:100%;margin:0;padding:16px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;overflow:auto}.message-md{overflow-wrap:anywhere;word-break:break-word;font-size:13px;line-height:1.6}.message-md p{margin:0 0 8px}.message-md p:last-child{margin-bottom:0}.message-md table{border-collapse:collapse;max-width:100%;margin:8px 0;display:block;overflow-x:auto}.message-md th,.message-md td{white-space:nowrap;border:1px solid #e5e7eb;padding:4px 8px;font-size:12px}.message-md th{background:#f9fafb}.message-md img{max-width:100%}.message-md ul,.message-md ol{margin:6px 0;padding-left:20px}.message-md li{margin:2px 0}.message-md h1,.message-md h2,.message-md h3{margin:10px 0 6px;font-weight:600}.message-md h1{font-size:18px}.message-md h2{font-size:16px}.message-md h3{font-size:15px}.message-md a{color:#667eea;text-decoration:underline}.message-md code:not(.hljs){color:#4338ca;background:#667eea1a;border-radius:4px;padding:1px 5px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px}.message-md .code-block{background:#1f2937;border-radius:8px;margin:10px 0;padding:0;position:relative;overflow:hidden}.message-md .code-block code{color:#e5e7eb;background:0 0;padding:12px 14px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.message-md .code-toolbar{background:#00000040;border-bottom:1px solid #ffffff14;align-items:center;gap:8px;padding:6px 12px;display:flex}.message-md .code-lang{color:#9ca3af;text-transform:lowercase;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.message-md .code-action-btn{color:#e5e7eb;cursor:pointer;background:#ffffff1a;border:none;border-radius:4px;margin-left:auto;padding:3px 10px;font-size:12px;transition:background .2s}.message-md .code-action-btn:hover{background:#fff3}.message-md .code-action-btn.preview-btn{color:#fff;background:#667eea;margin-left:4px}.message-md .code-action-btn.preview-btn:hover{background:#5568d3}.message-md .hljs{color:#e5e7eb}.message-md .hljs-keyword{color:#c084fc}.message-md .hljs-string{color:#86efac}.message-md .hljs-comment{color:#6b7280;font-style:italic}.message-md .hljs-number{color:#fca5a5}.message-md .hljs-function .hljs-title,.message-md .hljs-title{color:#93c5fd}.message-md .hljs-tag{color:#fca5a5}.message-md .hljs-attr{color:#fcd34d}.message-md .hljs-built_in{color:#67e8f9}.debug-drawer[data-v-01f829a3]{z-index:9000;pointer-events:none;position:fixed;inset:0}.drawer-mask[data-v-01f829a3]{pointer-events:auto;background:#00000040;position:absolute;inset:0}.drawer-panel[data-v-01f829a3]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;pointer-events:auto;z-index:2;background:#fff;flex-direction:column;width:520px;max-width:90vw;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-8px 0 32px #00000026}.drawer-mask[data-v-01f829a3]{z-index:1}.drawer-header[data-v-01f829a3]{color:#fff;background:linear-gradient(135deg,#1f2937,#111827);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.drawer-title[data-v-01f829a3]{font-size:15px;font-weight:600}.tab-group[data-v-01f829a3]{gap:4px;display:flex}.tab-btn[data-v-01f829a3]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;padding:4px 12px;font-size:13px;transition:background .2s}.tab-btn[data-v-01f829a3]:hover{background:#ffffff38}.tab-btn.active[data-v-01f829a3]{background:#ffffff73;font-weight:600}.info-body[data-v-01f829a3]{padding:4px 0}.info-section[data-v-01f829a3]{margin-bottom:14px}.info-title[data-v-01f829a3]{color:#2d5a47;border-bottom:1px solid #f3f4f6;margin-bottom:6px;padding-bottom:4px;font-size:12px;font-weight:600}.info-item[data-v-01f829a3]{background:#f9fafb;border-radius:6px;margin-bottom:4px;padding:6px 8px}.info-name[data-v-01f829a3]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;font-weight:600}.info-desc[data-v-01f829a3]{color:#6b7280;margin-top:2px;font-size:11px;line-height:1.5}.info-desc.muted[data-v-01f829a3]{color:#9ca3af}.info-hint[data-v-01f829a3]{color:#9ca3af;margin-left:6px;font-size:10px;font-weight:400}.skill-toggle[data-v-01f829a3]{cursor:pointer;align-items:center;gap:4px;display:flex}.skill-toggle[data-v-01f829a3]:hover{color:var(--cs-primary,#1f4d3a)}.skill-arrow[data-v-01f829a3]{color:#9ca3af;font-size:8px;transition:transform .15s;display:inline-block}.skill-arrow.open[data-v-01f829a3]{transform:rotate(90deg)}.skill-content[data-v-01f829a3]{margin-top:6px}.skill-loading[data-v-01f829a3]{color:#6b7280;padding:6px 8px;font-size:11px}.skill-error[data-v-01f829a3]{color:#dc2626;padding:6px 8px;font-size:11px}.skill-pre[data-v-01f829a3]{color:#374151;white-space:pre-wrap;word-break:break-word;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;max-height:320px;margin:0;padding:8px 10px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.6;overflow:auto}.src-tag[data-v-01f829a3]{vertical-align:middle;border-radius:8px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;display:inline-block}.src-tag.builtin[data-v-01f829a3]{color:#6b7280;background:#f3f4f6}.src-tag.mcp[data-v-01f829a3]{color:#7c3aed;background:#f3e8ff}.src-tag.user[data-v-01f829a3]{color:#2563eb;background:#dbeafe}.info-todo[data-v-01f829a3]{color:#374151;background:#f9fafb;border-radius:6px;align-items:center;gap:6px;margin-bottom:4px;padding:4px 8px;font-size:12px;display:flex}.todo-tag[data-v-01f829a3]{color:#fff;border-radius:8px;flex-shrink:0;padding:1px 6px;font-size:10px}.info-pre[data-v-01f829a3]{color:#4b5563;white-space:pre-wrap;word-break:break-word;background:#f9fafb;border-radius:6px;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow-y:auto}.header-actions[data-v-01f829a3]{gap:4px;display:flex}.hd-btn[data-v-01f829a3]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;width:28px;height:28px}.hd-btn[data-v-01f829a3]:hover{background:#ffffff40}.drawer-filters[data-v-01f829a3]{background:#fafafa;border-bottom:1px solid #f3f4f6;flex-wrap:wrap;gap:6px;padding:10px 16px;display:flex}.filter-chip[data-v-01f829a3]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:14px;align-items:center;gap:4px;padding:4px 10px;font-size:12px;transition:all .2s;display:inline-flex}.filter-chip[data-v-01f829a3]:hover{border-color:var(--chip-color,var(--cs-primary))}.filter-chip.active[data-v-01f829a3]{background:var(--chip-color,var(--cs-primary));border-color:var(--chip-color,var(--cs-primary));color:#fff}.chip-count[data-v-01f829a3]{background:#00000014;border-radius:8px;padding:0 5px;font-size:11px}.filter-chip.active .chip-count[data-v-01f829a3]{background:#ffffff40}.drawer-body[data-v-01f829a3]{flex:1;padding:12px;overflow-y:auto}.empty[data-v-01f829a3]{text-align:center;color:#9ca3af;padding:40px 20px;font-size:13px}.log-item[data-v-01f829a3]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-bottom:10px;overflow:hidden}.log-head[data-v-01f829a3]{background:#f9fafb;align-items:center;gap:8px;padding:8px 10px;display:flex}.log-type[data-v-01f829a3]{color:#fff;white-space:nowrap;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.log-source[data-v-01f829a3]{color:#7c3aed;white-space:nowrap;background:#f3e8ff;border-radius:4px;padding:2px 8px;font-size:10px;font-weight:600}.log-time[data-v-01f829a3]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.log-body[data-v-01f829a3]{padding:10px 12px}.log-footer[data-v-01f829a3]{border-top:1px dashed #f3f4f6;gap:8px;padding:6px 12px;display:flex}.raw-toggle[data-v-01f829a3]{color:var(--cs-primary);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11px}.raw-toggle[data-v-01f829a3]:hover{text-decoration:underline}.log-raw[data-v-01f829a3]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;border-top:1px solid #f3f4f6;max-height:280px;margin:0;padding:10px 12px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.kv-grid[data-v-01f829a3]{grid-template-columns:1fr 1fr;gap:6px;margin-bottom:8px;display:grid}.kv[data-v-01f829a3]{background:#f9fafb;border-radius:6px;flex-direction:column;padding:6px 8px;display:flex}.kv .k[data-v-01f829a3]{color:#9ca3af;text-transform:uppercase;font-size:10px}.kv .v[data-v-01f829a3]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;font-weight:600}.section-label[data-v-01f829a3]{color:#6b7280;margin:10px 0 4px;font-size:11px;font-weight:600}.chip-row[data-v-01f829a3]{flex-wrap:wrap;gap:4px;display:flex}.tool-chip[data-v-01f829a3]{color:#2d5a47;background:#ecf5ef;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.msg-list[data-v-01f829a3]{flex-direction:column;gap:4px;display:flex}.msg-row[data-v-01f829a3]{background:#f9fafb;border-radius:6px;align-items:flex-start;gap:6px;padding:5px 8px;display:flex}.msg-role[data-v-01f829a3]{color:#fff;border-radius:3px;flex-shrink:0;margin-top:1px;padding:2px 6px;font-size:9px;font-weight:700}.msg-text[data-v-01f829a3]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;font-size:12px;line-height:1.5}.msg-tool-hint[data-v-01f829a3]{color:#7c3aed;flex-shrink:0;font-size:10px}.badge-row[data-v-01f829a3]{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.badge[data-v-01f829a3]{color:#2d5a47;background:#dbeee4;border-radius:10px;padding:2px 8px;font-size:11px;font-weight:600}.badge.muted[data-v-01f829a3]{color:#6b7280;background:#f3f4f6}.badge.warn[data-v-01f829a3]{color:#92400e;background:#fef3c7}.resp-content[data-v-01f829a3]{color:#1f2937;white-space:pre-wrap;word-break:break-word;background:#fffbeb;border-left:3px solid #d97706;border-radius:4px;margin-bottom:8px;padding:6px 10px;font-size:12px}.tc-list[data-v-01f829a3]{flex-direction:column;gap:6px;display:flex}.tc-card[data-v-01f829a3]{border:1px solid #e5e7eb;border-radius:6px;overflow:hidden}.tc-card.inline[data-v-01f829a3]{margin-top:4px}.tc-name[data-v-01f829a3]{color:#2d5a47;background:#ecf5ef;padding:5px 8px;font-size:12px;font-weight:600}.tc-args[data-v-01f829a3]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow-y:auto}.usage-row[data-v-01f829a3]{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.usage[data-v-01f829a3]{color:#047857;background:#ecfdf5;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.err-box[data-v-01f829a3]{color:#991b1b;white-space:pre-wrap;word-break:break-word;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:8px 10px;font-size:12px}.msg-detail[data-v-01f829a3]{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.tc-inline[data-v-01f829a3]{background:#f0f7f3;border:1px solid #c3dcd0;border-radius:4px;align-items:baseline;gap:4px;padding:2px 6px;font-size:11px;display:flex}.tc-inline-name[data-v-01f829a3]{color:#2d5a47;white-space:nowrap;font-weight:600}.tc-inline-args[data-v-01f829a3]{color:#16402f;word-break:break-all;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.tc-id[data-v-01f829a3]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.view-toggle[data-v-01f829a3]{color:#2d5a47;cursor:pointer;background:#ecf5ef;border:1px solid #b8d4c5;border-radius:10px;margin-left:auto;padding:2px 8px;font-size:11px}.view-toggle[data-v-01f829a3]:hover{background:#dbeee4}.drawer-enter-active[data-v-01f829a3],.drawer-leave-active[data-v-01f829a3]{transition:opacity .25s}.drawer-enter-active .drawer-panel[data-v-01f829a3],.drawer-leave-active .drawer-panel[data-v-01f829a3]{transition:transform .25s}.drawer-enter-from[data-v-01f829a3],.drawer-leave-to[data-v-01f829a3]{opacity:0}.drawer-enter-from .drawer-panel[data-v-01f829a3],.drawer-leave-to .drawer-panel[data-v-01f829a3]{transform:translate(100%)}.flow-section[data-v-01f829a3]{margin-bottom:14px}.flow-section-title[data-v-01f829a3]{color:#6b7280;margin-bottom:6px;padding-left:2px;font-size:11px;font-weight:600}.flow-round[data-v-01f829a3]{border:1px solid #e5e7eb;border-radius:8px;margin-bottom:12px;overflow:hidden}.flow-round-head[data-v-01f829a3]{color:#fff;background:var(--cs-primary);padding:5px 10px;font-size:12px;font-weight:600}.flow-round-body[data-v-01f829a3]{flex-direction:column;gap:3px;padding:6px;display:flex}.flow-node[data-v-01f829a3]{border-left:3px solid var(--cs-primary);background:#f9fafb;border-radius:6px;align-items:center;gap:6px;padding:5px 8px;font-size:12px;display:flex}.flow-node.llm_request[data-v-01f829a3]{border-left-color:#059669}.flow-node.llm_response[data-v-01f829a3]{border-left-color:#d97706}.flow-node.tool_call[data-v-01f829a3]{border-left-color:#7c3aed}.flow-node.tool_result[data-v-01f829a3]{border-left-color:#2563eb}.flow-node.error[data-v-01f829a3]{background:#fef2f2;border-left-color:#dc2626}.flow-node.middleware[data-v-01f829a3]{border-left-color:#0891b2}.flow-ico[data-v-01f829a3]{flex-shrink:0;font-size:13px}.flow-label[data-v-01f829a3]{color:#374151;white-space:nowrap;flex-shrink:0;font-weight:600}.flow-detail[data-v-01f829a3]{color:#6b7280;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow:hidden}.flow-time[data-v-01f829a3]{color:#9ca3af;flex-shrink:0;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.skill-mask[data-v-c6a22ea5]{z-index:10002;background:#00000059;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.skill-panel[data-v-c6a22ea5]{color:#1f2937;background:#fff;border-radius:12px;width:480px;max-width:92vw;max-height:86vh;padding:18px 20px;font-size:13px;overflow:auto;box-shadow:0 12px 40px #0003}.skill-header[data-v-c6a22ea5]{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.skill-title[data-v-c6a22ea5]{font-size:16px;font-weight:600}.skill-close[data-v-c6a22ea5]{cursor:pointer;color:#6b7280;background:0 0;border:none;border-radius:6px;padding:4px 8px;font-size:16px}.skill-close[data-v-c6a22ea5]:hover{background:#f3f4f6}.skill-section[data-v-c6a22ea5]{background:#f9fafb;border-radius:8px;margin-bottom:16px;padding:12px}.section-title[data-v-c6a22ea5]{color:#374151;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:13px;font-weight:600;display:flex}.field[data-v-c6a22ea5]{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}.field-label[data-v-c6a22ea5]{color:#6b7280;font-size:12px}.field-input[data-v-c6a22ea5]{border:1px solid #d1d5db;border-radius:6px;padding:6px 10px;font-family:inherit;font-size:13px}.field-input[data-v-c6a22ea5]:focus{border-color:#6366f1;outline:none;box-shadow:0 0 0 2px #6366f126}.field-input[data-v-c6a22ea5]:disabled{color:#9ca3af;cursor:not-allowed;background:#f3f4f6}textarea.field-input[data-v-c6a22ea5]{resize:vertical;font-family:ui-monospace,monospace}.skill-error[data-v-c6a22ea5]{color:#dc2626;margin-bottom:8px;font-size:12px}.btn[data-v-c6a22ea5]{cursor:pointer;border:none;border-radius:6px;padding:6px 14px;font-size:13px}.btn-primary[data-v-c6a22ea5]{color:#fff;background:#4338ca}.btn-primary[data-v-c6a22ea5]:hover{background:#3730a3}.btn-ghost[data-v-c6a22ea5]{color:#6b7280;background:0 0;border:1px solid #e5e7eb}.btn-ghost[data-v-c6a22ea5]:hover{background:#f3f4f6}.btn-cancel[data-v-c6a22ea5]{margin-left:8px;padding:2px 8px;font-size:11px}.btn-edit[data-v-c6a22ea5]{color:#4338ca;border-color:#c7d2fe;padding:3px 10px;font-size:12px}.btn-edit[data-v-c6a22ea5]:hover{background:#eef2ff}.btn-del[data-v-c6a22ea5]{color:#dc2626;border-color:#fecaca;padding:3px 10px;font-size:12px}.btn-del[data-v-c6a22ea5]:hover{background:#fef2f2}.empty-hint[data-v-c6a22ea5]{color:#9ca3af;font-size:12px}.skill-list[data-v-c6a22ea5]{margin:0;padding:0;list-style:none}.skill-item[data-v-c6a22ea5]{border-bottom:1px dashed #e5e7eb;justify-content:space-between;align-items:center;padding:6px 0;display:flex}.skill-item[data-v-c6a22ea5]:last-child{border-bottom:none}.skill-name[data-v-c6a22ea5]{color:#4338ca;font-family:ui-monospace,monospace;font-size:12px}.skill-name.active[data-v-c6a22ea5]{color:#3730a3;font-weight:600}.skill-actions[data-v-c6a22ea5]{gap:6px;display:flex}.skill-hint[data-v-c6a22ea5]{color:#6b7280;background:#eef2ff;border-radius:6px;padding:10px 12px;font-size:12px;line-height:1.6}.skill-hint code[data-v-c6a22ea5]{color:#4338ca;background:#e0e7ff;border-radius:3px;padding:1px 5px;font-size:11px}.cs-skill-fade-enter-active[data-v-c6a22ea5],.cs-skill-fade-leave-active[data-v-c6a22ea5]{transition:opacity .2s}.cs-skill-fade-enter-from[data-v-c6a22ea5],.cs-skill-fade-leave-to[data-v-c6a22ea5]{opacity:0}.chat-mask[data-v-d3eca61c]{z-index:9998;background:#00000073;animation:.28s cs-mask-in-d3eca61c;position:fixed;inset:0}@keyframes cs-mask-in-d3eca61c{0%{opacity:0}to{opacity:1}}.chat-dialog.drawer[data-v-d3eca61c]{z-index:9999;border-radius:0;width:420px;max-width:92vw;height:100vh;animation:.3s cubic-bezier(.16,1,.3,1) cs-drawer-slide-in-d3eca61c;position:fixed;top:0;bottom:0;right:0}@keyframes cs-drawer-slide-in-d3eca61c{0%{transform:translate(100%)}to{transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-mask[data-v-d3eca61c],.chat-dialog.drawer[data-v-d3eca61c]{animation:none}}.chat-dialog[data-v-d3eca61c]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;--cs-bg:#fff;--cs-bubble-ai:#f3f4f6;--cs-radius:12px;border-radius:var(--cs-radius);background:var(--cs-bg);flex-direction:column;width:100%;height:100%;transition:all .3s;animation:.28s cubic-bezier(.16,1,.3,1) cs-drawer-in-d3eca61c;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014}@keyframes cs-drawer-in-d3eca61c{0%{opacity:0;transform:translate(32px)}to{opacity:1;transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-dialog[data-v-d3eca61c]{animation:none}}.chat-dialog.collapsed[data-v-d3eca61c]{height:52px}.cs-slide-enter-active[data-v-d3eca61c],.cs-slide-leave-active[data-v-d3eca61c]{transition:opacity .22s,transform .22s}.cs-slide-enter-from[data-v-d3eca61c],.cs-slide-leave-to[data-v-d3eca61c]{opacity:0;transform:translateY(-6px)}.chat-dialog.cs-leaving[data-v-d3eca61c]{opacity:0;pointer-events:none;transform:scale(.96)translateY(8px)}.chat-dialog.drawer.cs-leaving[data-v-d3eca61c]{transform:translate(100%)}.chat-mask.cs-leaving[data-v-d3eca61c]{opacity:0}.chat-dialog.cs-hidden[data-v-d3eca61c],.chat-mask.cs-hidden[data-v-d3eca61c]{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s,visibility 0s .2s}.chat-header[data-v-d3eca61c]{background:var(--cs-primary);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.header-left[data-v-d3eca61c]{align-items:center;gap:8px;display:flex}.header-icon[data-v-d3eca61c]{font-size:20px}.header-title[data-v-d3eca61c]{font-size:15px;font-weight:600}.status-dot[data-v-d3eca61c]{background:#4ade80;border-radius:50%;width:8px;height:8px}.status-dot.pulse[data-v-d3eca61c]{animation:1.5s infinite pulse-d3eca61c}@keyframes pulse-d3eca61c{0%,to{opacity:1}50%{opacity:.4}}.header-actions[data-v-d3eca61c]{gap:4px;display:flex}.action-btn[data-v-d3eca61c]{color:#fff;cursor:pointer;background:#ffffff26;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;transition:background .2s;display:flex}.action-btn[data-v-d3eca61c]:hover:not(:disabled){background:#ffffff4d}.action-btn[data-v-d3eca61c]:disabled{opacity:.4;cursor:not-allowed}.action-btn.debug-btn[data-v-d3eca61c]{position:relative}.action-btn.debug-btn.active[data-v-d3eca61c]{background:#ffffff73}.debug-badge[data-v-d3eca61c]{color:#fff;background:#ef4444;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-2px;right:-2px}.chat-body[data-v-d3eca61c]{overscroll-behavior:contain;flex:1;min-height:0;padding:16px;overflow-y:auto}.empty-state[data-v-d3eca61c]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-icon[data-v-d3eca61c]{margin-bottom:12px;font-size:48px}.empty-state p[data-v-d3eca61c]{font-size:14px}.message-row[data-v-d3eca61c]{align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.message-row.user[data-v-d3eca61c]{flex-direction:row-reverse}.message-avatar[data-v-d3eca61c]{background:#f3f4f6;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:16px;display:flex}.message-row.user .message-avatar[data-v-d3eca61c]{background:#ecf5ef}.message-content[data-v-d3eca61c]{min-width:0;max-width:80%}.message-bubble[data-v-d3eca61c]{overflow-wrap:anywhere;word-break:break-word;white-space:pre-wrap;border-radius:12px;padding:9px 13px;font-size:13px;line-height:1.6}.message-row.assistant .message-bubble[data-v-d3eca61c]{color:#1f2937;white-space:normal;overflow-wrap:anywhere;background:#f3f4f6;border-bottom-left-radius:4px}.message-row.user .message-bubble[data-v-d3eca61c]{background:var(--cs-primary);color:#fff;border-bottom-right-radius:4px}.message-row.user .message-content[data-v-d3eca61c]{flex-direction:column;align-items:flex-end;display:flex}.message-time[data-v-d3eca61c]{color:#9ca3af;margin-top:4px;padding:0 4px;font-size:11px}.typing[data-v-d3eca61c]{gap:4px;padding:12px 16px;display:flex}.typing .dot[data-v-d3eca61c]{background:#9ca3af;border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite bounce-d3eca61c}.typing .dot[data-v-d3eca61c]:nth-child(2){animation-delay:.2s}.typing .dot[data-v-d3eca61c]:nth-child(3){animation-delay:.4s}@keyframes bounce-d3eca61c{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.typing-text[data-v-d3eca61c]{color:#9ca3af;font-size:13px}.reasoning-block[data-v-d3eca61c]{background:#f0f7f3;border:1px dashed #b8d4c5;border-radius:8px;margin-bottom:6px;overflow:hidden}.reasoning-header[data-v-d3eca61c]{cursor:pointer;-webkit-user-select:none;user-select:none;color:#2d5a47;align-items:center;gap:6px;padding:5px 10px;font-size:12px;display:flex}.reasoning-icon[data-v-d3eca61c]{font-size:13px}.reasoning-title[data-v-d3eca61c]{font-weight:600}.reasoning-toggle[data-v-d3eca61c]{margin-left:auto}.reasoning-body[data-v-d3eca61c]{color:#16402f;white-space:pre-wrap;word-break:break-word;border-top:1px dashed #b8d4c5;max-height:240px;padding:8px 10px;font-size:12px;line-height:1.6;overflow-y:auto}.steps-block[data-v-d3eca61c]{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}.step-item[data-v-d3eca61c]{color:#0e7490;background:#ecfeff;border:1px solid #a5f3fc;border-radius:10px;flex-direction:column;align-self:flex-start;align-items:flex-start;gap:3px;max-width:100%;padding:2px 8px;font-size:11px;display:flex}.step-head[data-v-d3eca61c]{align-items:center;gap:5px;display:inline-flex}.step-icon[data-v-d3eca61c]{font-size:11px}.step-name[data-v-d3eca61c]{font-family:SF Mono,Monaco,Consolas,monospace}.step-count[data-v-d3eca61c]{color:#0891b2;font-size:10px;font-weight:600}.step-status.running[data-v-d3eca61c]{color:#0891b2}.step-children[data-v-d3eca61c]{background:#faf5ff;border-left:2px solid #c4b5fd;border-radius:0 8px 8px 0;flex-direction:column;gap:3px;margin-top:4px;padding:4px 8px 4px 10px;display:flex}.step-children-label[data-v-d3eca61c]{color:#7c3aed;letter-spacing:.3px;font-size:10px;font-weight:600}.step-child[data-v-d3eca61c]{color:#6d28d9;background:#ede9fe;border:1px solid #ddd6fe;border-radius:8px;align-items:center;gap:5px;padding:1px 7px;font-size:10px;display:inline-flex}.step-child .step-name[data-v-d3eca61c]{color:#6d28d9}.step-child .step-status.running[data-v-d3eca61c]{color:#8b5cf6}.stream-cursor[data-v-d3eca61c],.typing-cursor[data-v-d3eca61c]{vertical-align:text-bottom;background:var(--cs-primary);width:7px;height:14px;margin-left:2px;animation:1s steps(2,end) infinite blink-d3eca61c;display:inline-block}@keyframes blink-d3eca61c{0%,50%{opacity:1}51%,to{opacity:0}}.error-bar[data-v-d3eca61c]{color:#dc2626;background:#fef2f2;border-radius:8px;align-items:flex-start;gap:10px;margin-top:8px;padding:8px 12px;font-size:13px;display:flex}.error-text[data-v-d3eca61c]{word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;flex:1;min-width:0;max-height:120px;line-height:1.5;overflow-y:auto}.error-bar .retry-btn[data-v-d3eca61c],.error-bar .undo-btn[data-v-d3eca61c]{flex-shrink:0;margin-top:1px}.retry-btn[data-v-d3eca61c]{color:#fff;cursor:pointer;background:#dc2626;border:none;border-radius:6px;flex-shrink:0;padding:3px 12px;font-size:12px;font-weight:600;transition:background .2s}.retry-btn[data-v-d3eca61c]:hover{background:#b91c1c}.chat-footer[data-v-d3eca61c]{padding:12px 16px;padding-bottom:calc(12px + env(safe-area-inset-bottom,0px));background:#fafafa;border-top:1px solid #f3f4f6;flex-shrink:0;align-items:flex-end;gap:8px;display:flex}.chat-input[data-v-d3eca61c]{resize:vertical;overflow-wrap:anywhere;word-break:break-word;border:1px solid #e5e7eb;border-radius:8px;outline:none;flex:1;min-height:38px;max-height:50vh;padding:9px 12px;font-family:inherit;font-size:13px;line-height:1.5;transition:border-color .2s;overflow-y:auto}.chat-input[data-v-d3eca61c]:focus{border-color:var(--cs-primary);box-shadow:0 0 0 2px rgba(var(--cs-primary-rgb), .1)}.send-btn[data-v-d3eca61c]{background:var(--cs-primary);color:#fff;cursor:pointer;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;transition:opacity .2s,transform .1s;display:flex}.send-btn[data-v-d3eca61c]:hover:not(:disabled){opacity:.9;transform:scale(1.05)}.send-btn[data-v-d3eca61c]:active:not(:disabled){transform:scale(.95)}.send-btn[data-v-d3eca61c]:disabled{opacity:.4;cursor:not-allowed}.send-btn.stop-btn[data-v-d3eca61c]{background:#9ca3af}.send-btn.stop-btn[data-v-d3eca61c]:hover:not(:disabled){background:#6b7280;transform:none}.cap-badge[data-v-d3eca61c]{color:#6b7280;white-space:nowrap;-webkit-user-select:none;user-select:none;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px}.msg-actions[data-v-d3eca61c]{opacity:0;gap:6px;margin-top:4px;transition:opacity .2s;display:flex}.message-row.assistant:hover .msg-actions[data-v-d3eca61c]{opacity:1}.msg-action-btn[data-v-d3eca61c]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:6px;padding:2px 8px;font-size:11px;transition:all .2s}.msg-action-btn[data-v-d3eca61c]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.undo-btn[data-v-d3eca61c]{color:#92400e;cursor:pointer;background:#fffbeb;border:1px solid #f59e0b;border-radius:6px;margin-left:6px;padding:2px 10px;font-size:11px;transition:all .2s}.undo-btn[data-v-d3eca61c]:hover{background:#fde68a}.undo-foot-btn[data-v-d3eca61c]{color:#6b7280;cursor:pointer;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px;transition:all .2s}.undo-foot-btn[data-v-d3eca61c]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.approval-bar[data-v-d3eca61c]{background:#fffbeb;border:1px solid #f59e0b;border-radius:10px;margin:8px 12px;padding:10px 12px}.approval-head[data-v-d3eca61c]{color:#92400e;align-items:center;gap:6px;font-size:13px;display:flex}.approval-icon[data-v-d3eca61c]{font-size:15px}.approval-title code[data-v-d3eca61c]{color:#78350f;background:#fef3c7;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.approval-toggle[data-v-d3eca61c]{color:#92400e;cursor:pointer;background:0 0;border:none;border-radius:4px;margin-left:auto;padding:2px 8px;font-size:12px}.approval-toggle[data-v-d3eca61c]:hover{background:#fef3c7}.approval-args[data-v-d3eca61c]{color:#57534e;white-space:pre-wrap;word-break:break-all;background:#fff;border:1px solid #fde68a;border-radius:6px;max-height:140px;margin:8px 0;padding:8px;font-size:12px;overflow:auto}.approval-actions[data-v-d3eca61c]{justify-content:flex-end;gap:8px;display:flex}.approval-actions button[data-v-d3eca61c]{cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;transition:opacity .2s}.approval-deny[data-v-d3eca61c]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.approval-deny[data-v-d3eca61c]:hover{color:#374151;background:#e5e7eb}.approval-allow[data-v-d3eca61c]{background:var(--cs-primary);color:#fff}.approval-allow[data-v-d3eca61c]:hover{opacity:.9}.approval-question[data-v-d3eca61c]{color:#57534e;white-space:pre-wrap;background:#fff;border:1px solid #fde68a;border-radius:6px;margin:8px 0;padding:8px 10px;font-size:13px;line-height:1.5}.approval-context[data-v-d3eca61c]{color:#92400e;margin:4px 0 8px;font-size:12px;line-height:1.5}.approval-recommend[data-v-d3eca61c]{color:#1f4d3a;margin:4px 0 8px;font-size:12px}.approval-opt[data-v-d3eca61c]{border:1px solid var(--cs-primary);color:var(--cs-primary);cursor:pointer;background:#fff;border-radius:6px;padding:5px 14px;font-size:13px;transition:all .2s}.approval-opt[data-v-d3eca61c]:hover{background:var(--cs-primary);color:#fff}.conflict-bar[data-v-d3eca61c]{background:#fef2f2;border:1px solid #dc2626;border-radius:10px;margin:8px 12px;padding:10px 12px}.conflict-head[data-v-d3eca61c]{color:#991b1b;align-items:center;gap:6px;font-size:13px;display:flex}.conflict-icon[data-v-d3eca61c]{font-size:15px}.conflict-title code[data-v-d3eca61c]{color:#7f1d1d;background:#fee2e2;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.conflict-detail[data-v-d3eca61c]{color:#7f1d1d;margin:6px 0 8px;font-size:12px;line-height:1.5}.conflict-actions[data-v-d3eca61c]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.conflict-actions button[data-v-d3eca61c]{cursor:pointer;border:none;border-radius:6px;padding:5px 14px;font-size:13px;transition:opacity .2s}.conflict-keep[data-v-d3eca61c]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.conflict-keep[data-v-d3eca61c]:hover{color:#374151;background:#e5e7eb}.conflict-overwrite[data-v-d3eca61c]{color:#fff;background:#dc2626}.conflict-overwrite[data-v-d3eca61c]:hover{opacity:.9}.conflict-restore[data-v-d3eca61c]{color:#dc2626;background:#fff;border:1px solid #dc2626}.conflict-restore[data-v-d3eca61c]:hover{background:#fee2e2}.conflict-toggle[data-v-d3eca61c]{color:#991b1b;cursor:pointer;background:0 0;border:none;border-radius:4px;margin:2px 0 6px;padding:2px 8px;font-size:12px}.conflict-toggle[data-v-d3eca61c]:hover{background:#fee2e2}.conflict-diff[data-v-d3eca61c]{gap:8px;margin:4px 0 8px;display:flex}.conflict-diff-col[data-v-d3eca61c]{flex:1;min-width:0}.conflict-diff-label[data-v-d3eca61c]{color:#7f1d1d;margin-bottom:2px;font-size:11px}.conflict-diff-pre[data-v-d3eca61c]{color:#57534e;white-space:pre-wrap;word-break:break-all;background:#fff;border:1px solid #fecaca;border-radius:6px;max-height:140px;margin:0;padding:6px;font-size:11px;overflow:auto}
1
+ .code-preview-overlay[data-v-3d6e2a95]{z-index:9999;background:#00000080;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.code-preview-modal[data-v-3d6e2a95]{background:#fff;border-radius:12px;flex-direction:column;width:90%;max-width:900px;height:80vh;display:flex;overflow:hidden;box-shadow:0 20px 60px #0000004d}.preview-header[data-v-3d6e2a95]{color:#fff;background:#1f2937;align-items:center;gap:12px;padding:10px 16px;display:flex}.preview-title[data-v-3d6e2a95]{font-size:14px;font-weight:600}.preview-tabs[data-v-3d6e2a95]{gap:4px;margin-left:auto;display:flex}.preview-tabs button[data-v-3d6e2a95]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;padding:4px 12px;font-size:13px}.preview-tabs button.active[data-v-3d6e2a95]{background:#667eea}.preview-tabs button[data-v-3d6e2a95]:disabled{opacity:.4;cursor:not-allowed}.preview-actions[data-v-3d6e2a95]{gap:4px;display:flex}.icon-btn[data-v-3d6e2a95]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:flex}.icon-btn[data-v-3d6e2a95]:hover{background:#ffffff40}.preview-body[data-v-3d6e2a95]{background:#f9fafb;flex:1;overflow:hidden}.preview-iframe[data-v-3d6e2a95]{background:#fff;border:none;width:100%;height:100%}.preview-source[data-v-3d6e2a95]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;height:100%;margin:0;padding:16px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;overflow:auto}.message-md{overflow-wrap:anywhere;word-break:break-word;font-size:13px;line-height:1.6}.message-md p{margin:0 0 8px}.message-md p:last-child{margin-bottom:0}.message-md table{border-collapse:collapse;max-width:100%;margin:8px 0;display:block;overflow-x:auto}.message-md th,.message-md td{white-space:nowrap;border:1px solid #e5e7eb;padding:4px 8px;font-size:12px}.message-md th{background:#f9fafb}.message-md img{max-width:100%}.message-md ul,.message-md ol{margin:6px 0;padding-left:20px}.message-md li{margin:2px 0}.message-md h1,.message-md h2,.message-md h3{margin:10px 0 6px;font-weight:600}.message-md h1{font-size:18px}.message-md h2{font-size:16px}.message-md h3{font-size:15px}.message-md a{color:#667eea;text-decoration:underline}.message-md code:not(.hljs){color:#4338ca;background:#667eea1a;border-radius:4px;padding:1px 5px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px}.message-md .code-block{background:#1f2937;border-radius:8px;margin:10px 0;padding:0;position:relative;overflow:hidden}.message-md .code-block code{color:#e5e7eb;background:0 0;padding:12px 14px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.message-md .code-toolbar{background:#00000040;border-bottom:1px solid #ffffff14;align-items:center;gap:8px;padding:6px 12px;display:flex}.message-md .code-lang{color:#9ca3af;text-transform:lowercase;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.message-md .code-action-btn{color:#e5e7eb;cursor:pointer;background:#ffffff1a;border:none;border-radius:4px;margin-left:auto;padding:3px 10px;font-size:12px;transition:background .2s}.message-md .code-action-btn:hover{background:#fff3}.message-md .code-action-btn.preview-btn{color:#fff;background:#667eea;margin-left:4px}.message-md .code-action-btn.preview-btn:hover{background:#5568d3}.message-md .hljs{color:#e5e7eb}.message-md .hljs-keyword{color:#c084fc}.message-md .hljs-string{color:#86efac}.message-md .hljs-comment{color:#6b7280;font-style:italic}.message-md .hljs-number{color:#fca5a5}.message-md .hljs-function .hljs-title,.message-md .hljs-title{color:#93c5fd}.message-md .hljs-tag{color:#fca5a5}.message-md .hljs-attr{color:#fcd34d}.message-md .hljs-built_in{color:#67e8f9}.debug-drawer[data-v-01f829a3]{z-index:9000;pointer-events:none;position:fixed;inset:0}.drawer-mask[data-v-01f829a3]{pointer-events:auto;background:#00000040;position:absolute;inset:0}.drawer-panel[data-v-01f829a3]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;pointer-events:auto;z-index:2;background:#fff;flex-direction:column;width:520px;max-width:90vw;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-8px 0 32px #00000026}.drawer-mask[data-v-01f829a3]{z-index:1}.drawer-header[data-v-01f829a3]{color:#fff;background:linear-gradient(135deg,#1f2937,#111827);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.drawer-title[data-v-01f829a3]{font-size:15px;font-weight:600}.tab-group[data-v-01f829a3]{gap:4px;display:flex}.tab-btn[data-v-01f829a3]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;padding:4px 12px;font-size:13px;transition:background .2s}.tab-btn[data-v-01f829a3]:hover{background:#ffffff38}.tab-btn.active[data-v-01f829a3]{background:#ffffff73;font-weight:600}.info-body[data-v-01f829a3]{padding:4px 0}.info-section[data-v-01f829a3]{margin-bottom:14px}.info-title[data-v-01f829a3]{color:#2d5a47;border-bottom:1px solid #f3f4f6;margin-bottom:6px;padding-bottom:4px;font-size:12px;font-weight:600}.info-item[data-v-01f829a3]{background:#f9fafb;border-radius:6px;margin-bottom:4px;padding:6px 8px}.info-name[data-v-01f829a3]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;font-weight:600}.info-desc[data-v-01f829a3]{color:#6b7280;margin-top:2px;font-size:11px;line-height:1.5}.info-desc.muted[data-v-01f829a3]{color:#9ca3af}.info-hint[data-v-01f829a3]{color:#9ca3af;margin-left:6px;font-size:10px;font-weight:400}.skill-toggle[data-v-01f829a3]{cursor:pointer;align-items:center;gap:4px;display:flex}.skill-toggle[data-v-01f829a3]:hover{color:var(--cs-primary,#1f4d3a)}.skill-arrow[data-v-01f829a3]{color:#9ca3af;font-size:8px;transition:transform .15s;display:inline-block}.skill-arrow.open[data-v-01f829a3]{transform:rotate(90deg)}.skill-content[data-v-01f829a3]{margin-top:6px}.skill-loading[data-v-01f829a3]{color:#6b7280;padding:6px 8px;font-size:11px}.skill-error[data-v-01f829a3]{color:#dc2626;padding:6px 8px;font-size:11px}.skill-pre[data-v-01f829a3]{color:#374151;white-space:pre-wrap;word-break:break-word;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;max-height:320px;margin:0;padding:8px 10px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.6;overflow:auto}.src-tag[data-v-01f829a3]{vertical-align:middle;border-radius:8px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;display:inline-block}.src-tag.builtin[data-v-01f829a3]{color:#6b7280;background:#f3f4f6}.src-tag.mcp[data-v-01f829a3]{color:#7c3aed;background:#f3e8ff}.src-tag.user[data-v-01f829a3]{color:#2563eb;background:#dbeafe}.info-todo[data-v-01f829a3]{color:#374151;background:#f9fafb;border-radius:6px;align-items:center;gap:6px;margin-bottom:4px;padding:4px 8px;font-size:12px;display:flex}.todo-tag[data-v-01f829a3]{color:#fff;border-radius:8px;flex-shrink:0;padding:1px 6px;font-size:10px}.info-pre[data-v-01f829a3]{color:#4b5563;white-space:pre-wrap;word-break:break-word;background:#f9fafb;border-radius:6px;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow-y:auto}.header-actions[data-v-01f829a3]{gap:4px;display:flex}.hd-btn[data-v-01f829a3]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;width:28px;height:28px}.hd-btn[data-v-01f829a3]:hover{background:#ffffff40}.drawer-filters[data-v-01f829a3]{background:#fafafa;border-bottom:1px solid #f3f4f6;flex-wrap:wrap;gap:6px;padding:10px 16px;display:flex}.filter-chip[data-v-01f829a3]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:14px;align-items:center;gap:4px;padding:4px 10px;font-size:12px;transition:all .2s;display:inline-flex}.filter-chip[data-v-01f829a3]:hover{border-color:var(--chip-color,var(--cs-primary))}.filter-chip.active[data-v-01f829a3]{background:var(--chip-color,var(--cs-primary));border-color:var(--chip-color,var(--cs-primary));color:#fff}.chip-count[data-v-01f829a3]{background:#00000014;border-radius:8px;padding:0 5px;font-size:11px}.filter-chip.active .chip-count[data-v-01f829a3]{background:#ffffff40}.drawer-body[data-v-01f829a3]{flex:1;padding:12px;overflow-y:auto}.empty[data-v-01f829a3]{text-align:center;color:#9ca3af;padding:40px 20px;font-size:13px}.log-item[data-v-01f829a3]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-bottom:10px;overflow:hidden}.log-head[data-v-01f829a3]{background:#f9fafb;align-items:center;gap:8px;padding:8px 10px;display:flex}.log-type[data-v-01f829a3]{color:#fff;white-space:nowrap;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.log-source[data-v-01f829a3]{color:#7c3aed;white-space:nowrap;background:#f3e8ff;border-radius:4px;padding:2px 8px;font-size:10px;font-weight:600}.log-time[data-v-01f829a3]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.log-body[data-v-01f829a3]{padding:10px 12px}.log-footer[data-v-01f829a3]{border-top:1px dashed #f3f4f6;gap:8px;padding:6px 12px;display:flex}.raw-toggle[data-v-01f829a3]{color:var(--cs-primary);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11px}.raw-toggle[data-v-01f829a3]:hover{text-decoration:underline}.log-raw[data-v-01f829a3]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;border-top:1px solid #f3f4f6;max-height:280px;margin:0;padding:10px 12px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.kv-grid[data-v-01f829a3]{grid-template-columns:1fr 1fr;gap:6px;margin-bottom:8px;display:grid}.kv[data-v-01f829a3]{background:#f9fafb;border-radius:6px;flex-direction:column;padding:6px 8px;display:flex}.kv .k[data-v-01f829a3]{color:#9ca3af;text-transform:uppercase;font-size:10px}.kv .v[data-v-01f829a3]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;font-weight:600}.section-label[data-v-01f829a3]{color:#6b7280;margin:10px 0 4px;font-size:11px;font-weight:600}.chip-row[data-v-01f829a3]{flex-wrap:wrap;gap:4px;display:flex}.tool-chip[data-v-01f829a3]{color:#2d5a47;background:#ecf5ef;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.msg-list[data-v-01f829a3]{flex-direction:column;gap:4px;display:flex}.msg-row[data-v-01f829a3]{background:#f9fafb;border-radius:6px;align-items:flex-start;gap:6px;padding:5px 8px;display:flex}.msg-role[data-v-01f829a3]{color:#fff;border-radius:3px;flex-shrink:0;margin-top:1px;padding:2px 6px;font-size:9px;font-weight:700}.msg-text[data-v-01f829a3]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;font-size:12px;line-height:1.5}.msg-tool-hint[data-v-01f829a3]{color:#7c3aed;flex-shrink:0;font-size:10px}.badge-row[data-v-01f829a3]{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.badge[data-v-01f829a3]{color:#2d5a47;background:#dbeee4;border-radius:10px;padding:2px 8px;font-size:11px;font-weight:600}.badge.muted[data-v-01f829a3]{color:#6b7280;background:#f3f4f6}.badge.warn[data-v-01f829a3]{color:#92400e;background:#fef3c7}.resp-content[data-v-01f829a3]{color:#1f2937;white-space:pre-wrap;word-break:break-word;background:#fffbeb;border-left:3px solid #d97706;border-radius:4px;margin-bottom:8px;padding:6px 10px;font-size:12px}.tc-list[data-v-01f829a3]{flex-direction:column;gap:6px;display:flex}.tc-card[data-v-01f829a3]{border:1px solid #e5e7eb;border-radius:6px;overflow:hidden}.tc-card.inline[data-v-01f829a3]{margin-top:4px}.tc-name[data-v-01f829a3]{color:#2d5a47;background:#ecf5ef;padding:5px 8px;font-size:12px;font-weight:600}.tc-args[data-v-01f829a3]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow-y:auto}.usage-row[data-v-01f829a3]{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.usage[data-v-01f829a3]{color:#047857;background:#ecfdf5;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.err-box[data-v-01f829a3]{color:#991b1b;white-space:pre-wrap;word-break:break-word;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:8px 10px;font-size:12px}.msg-detail[data-v-01f829a3]{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.tc-inline[data-v-01f829a3]{background:#f0f7f3;border:1px solid #c3dcd0;border-radius:4px;align-items:baseline;gap:4px;padding:2px 6px;font-size:11px;display:flex}.tc-inline-name[data-v-01f829a3]{color:#2d5a47;white-space:nowrap;font-weight:600}.tc-inline-args[data-v-01f829a3]{color:#16402f;word-break:break-all;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.tc-id[data-v-01f829a3]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.view-toggle[data-v-01f829a3]{color:#2d5a47;cursor:pointer;background:#ecf5ef;border:1px solid #b8d4c5;border-radius:10px;margin-left:auto;padding:2px 8px;font-size:11px}.view-toggle[data-v-01f829a3]:hover{background:#dbeee4}.drawer-enter-active[data-v-01f829a3],.drawer-leave-active[data-v-01f829a3]{transition:opacity .25s}.drawer-enter-active .drawer-panel[data-v-01f829a3],.drawer-leave-active .drawer-panel[data-v-01f829a3]{transition:transform .25s}.drawer-enter-from[data-v-01f829a3],.drawer-leave-to[data-v-01f829a3]{opacity:0}.drawer-enter-from .drawer-panel[data-v-01f829a3],.drawer-leave-to .drawer-panel[data-v-01f829a3]{transform:translate(100%)}.flow-section[data-v-01f829a3]{margin-bottom:14px}.flow-section-title[data-v-01f829a3]{color:#6b7280;margin-bottom:6px;padding-left:2px;font-size:11px;font-weight:600}.flow-round[data-v-01f829a3]{border:1px solid #e5e7eb;border-radius:8px;margin-bottom:12px;overflow:hidden}.flow-round-head[data-v-01f829a3]{color:#fff;background:var(--cs-primary);padding:5px 10px;font-size:12px;font-weight:600}.flow-round-body[data-v-01f829a3]{flex-direction:column;gap:3px;padding:6px;display:flex}.flow-node[data-v-01f829a3]{border-left:3px solid var(--cs-primary);background:#f9fafb;border-radius:6px;align-items:center;gap:6px;padding:5px 8px;font-size:12px;display:flex}.flow-node.llm_request[data-v-01f829a3]{border-left-color:#059669}.flow-node.llm_response[data-v-01f829a3]{border-left-color:#d97706}.flow-node.tool_call[data-v-01f829a3]{border-left-color:#7c3aed}.flow-node.tool_result[data-v-01f829a3]{border-left-color:#2563eb}.flow-node.error[data-v-01f829a3]{background:#fef2f2;border-left-color:#dc2626}.flow-node.middleware[data-v-01f829a3]{border-left-color:#0891b2}.flow-ico[data-v-01f829a3]{flex-shrink:0;font-size:13px}.flow-label[data-v-01f829a3]{color:#374151;white-space:nowrap;flex-shrink:0;font-weight:600}.flow-detail[data-v-01f829a3]{color:#6b7280;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow:hidden}.flow-time[data-v-01f829a3]{color:#9ca3af;flex-shrink:0;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.skill-mask[data-v-c6a22ea5]{z-index:10002;background:#00000059;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.skill-panel[data-v-c6a22ea5]{color:#1f2937;background:#fff;border-radius:12px;width:480px;max-width:92vw;max-height:86vh;padding:18px 20px;font-size:13px;overflow:auto;box-shadow:0 12px 40px #0003}.skill-header[data-v-c6a22ea5]{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.skill-title[data-v-c6a22ea5]{font-size:16px;font-weight:600}.skill-close[data-v-c6a22ea5]{cursor:pointer;color:#6b7280;background:0 0;border:none;border-radius:6px;padding:4px 8px;font-size:16px}.skill-close[data-v-c6a22ea5]:hover{background:#f3f4f6}.skill-section[data-v-c6a22ea5]{background:#f9fafb;border-radius:8px;margin-bottom:16px;padding:12px}.section-title[data-v-c6a22ea5]{color:#374151;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:13px;font-weight:600;display:flex}.field[data-v-c6a22ea5]{flex-direction:column;gap:4px;margin-bottom:10px;display:flex}.field-label[data-v-c6a22ea5]{color:#6b7280;font-size:12px}.field-input[data-v-c6a22ea5]{border:1px solid #d1d5db;border-radius:6px;padding:6px 10px;font-family:inherit;font-size:13px}.field-input[data-v-c6a22ea5]:focus{border-color:#6366f1;outline:none;box-shadow:0 0 0 2px #6366f126}.field-input[data-v-c6a22ea5]:disabled{color:#9ca3af;cursor:not-allowed;background:#f3f4f6}textarea.field-input[data-v-c6a22ea5]{resize:vertical;font-family:ui-monospace,monospace}.skill-error[data-v-c6a22ea5]{color:#dc2626;margin-bottom:8px;font-size:12px}.btn[data-v-c6a22ea5]{cursor:pointer;border:none;border-radius:6px;padding:6px 14px;font-size:13px}.btn-primary[data-v-c6a22ea5]{color:#fff;background:#4338ca}.btn-primary[data-v-c6a22ea5]:hover{background:#3730a3}.btn-ghost[data-v-c6a22ea5]{color:#6b7280;background:0 0;border:1px solid #e5e7eb}.btn-ghost[data-v-c6a22ea5]:hover{background:#f3f4f6}.btn-cancel[data-v-c6a22ea5]{margin-left:8px;padding:2px 8px;font-size:11px}.btn-edit[data-v-c6a22ea5]{color:#4338ca;border-color:#c7d2fe;padding:3px 10px;font-size:12px}.btn-edit[data-v-c6a22ea5]:hover{background:#eef2ff}.btn-del[data-v-c6a22ea5]{color:#dc2626;border-color:#fecaca;padding:3px 10px;font-size:12px}.btn-del[data-v-c6a22ea5]:hover{background:#fef2f2}.empty-hint[data-v-c6a22ea5]{color:#9ca3af;font-size:12px}.skill-list[data-v-c6a22ea5]{margin:0;padding:0;list-style:none}.skill-item[data-v-c6a22ea5]{border-bottom:1px dashed #e5e7eb;justify-content:space-between;align-items:center;padding:6px 0;display:flex}.skill-item[data-v-c6a22ea5]:last-child{border-bottom:none}.skill-name[data-v-c6a22ea5]{color:#4338ca;font-family:ui-monospace,monospace;font-size:12px}.skill-name.active[data-v-c6a22ea5]{color:#3730a3;font-weight:600}.skill-actions[data-v-c6a22ea5]{gap:6px;display:flex}.skill-hint[data-v-c6a22ea5]{color:#6b7280;background:#eef2ff;border-radius:6px;padding:10px 12px;font-size:12px;line-height:1.6}.skill-hint code[data-v-c6a22ea5]{color:#4338ca;background:#e0e7ff;border-radius:3px;padding:1px 5px;font-size:11px}.cs-skill-fade-enter-active[data-v-c6a22ea5],.cs-skill-fade-leave-active[data-v-c6a22ea5]{transition:opacity .2s}.cs-skill-fade-enter-from[data-v-c6a22ea5],.cs-skill-fade-leave-to[data-v-c6a22ea5]{opacity:0}.chat-mask[data-v-58dec249]{z-index:9998;background:#00000073;animation:.28s cs-mask-in-58dec249;position:fixed;inset:0}@keyframes cs-mask-in-58dec249{0%{opacity:0}to{opacity:1}}.chat-dialog.drawer[data-v-58dec249]{z-index:9999;border-radius:0;width:420px;max-width:92vw;height:100vh;animation:.3s cubic-bezier(.16,1,.3,1) cs-drawer-slide-in-58dec249;position:fixed;top:0;bottom:0;right:0}@keyframes cs-drawer-slide-in-58dec249{0%{transform:translate(100%)}to{transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-mask[data-v-58dec249],.chat-dialog.drawer[data-v-58dec249]{animation:none}}.chat-dialog[data-v-58dec249]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;--cs-bg:#fff;--cs-bubble-ai:#f3f4f6;--cs-radius:12px;border-radius:var(--cs-radius);background:var(--cs-bg);flex-direction:column;width:100%;height:100%;transition:all .3s;animation:.28s cubic-bezier(.16,1,.3,1) cs-drawer-in-58dec249;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014}@keyframes cs-drawer-in-58dec249{0%{opacity:0;transform:translate(32px)}to{opacity:1;transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-dialog[data-v-58dec249]{animation:none}}.chat-dialog.collapsed[data-v-58dec249]{height:52px}.cs-slide-enter-active[data-v-58dec249],.cs-slide-leave-active[data-v-58dec249]{transition:opacity .22s,transform .22s}.cs-slide-enter-from[data-v-58dec249],.cs-slide-leave-to[data-v-58dec249]{opacity:0;transform:translateY(-6px)}.chat-dialog.cs-leaving[data-v-58dec249]{opacity:0;pointer-events:none;transform:scale(.96)translateY(8px)}.chat-dialog.drawer.cs-leaving[data-v-58dec249]{transform:translate(100%)}.chat-mask.cs-leaving[data-v-58dec249]{opacity:0}.chat-dialog.cs-hidden[data-v-58dec249],.chat-mask.cs-hidden[data-v-58dec249]{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s,visibility 0s .2s}.chat-header[data-v-58dec249]{background:var(--cs-primary);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.header-left[data-v-58dec249]{align-items:center;gap:8px;display:flex}.header-icon[data-v-58dec249]{font-size:20px}.header-title[data-v-58dec249]{font-size:15px;font-weight:600}.status-dot[data-v-58dec249]{background:#4ade80;border-radius:50%;width:8px;height:8px}.status-dot.pulse[data-v-58dec249]{animation:1.5s infinite pulse-58dec249}@keyframes pulse-58dec249{0%,to{opacity:1}50%{opacity:.4}}.header-actions[data-v-58dec249]{gap:4px;display:flex}.action-btn[data-v-58dec249]{color:#fff;cursor:pointer;background:#ffffff26;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;transition:background .2s;display:flex}.action-btn[data-v-58dec249]:hover:not(:disabled){background:#ffffff4d}.action-btn[data-v-58dec249]:disabled{opacity:.4;cursor:not-allowed}.action-btn.debug-btn[data-v-58dec249]{position:relative}.action-btn.debug-btn.active[data-v-58dec249]{background:#ffffff73}.debug-badge[data-v-58dec249]{color:#fff;background:#ef4444;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-2px;right:-2px}.chat-body[data-v-58dec249]{overscroll-behavior:contain;flex:1;min-height:0;padding:16px;overflow-y:auto}.empty-state[data-v-58dec249]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-icon[data-v-58dec249]{margin-bottom:12px;font-size:48px}.empty-state p[data-v-58dec249]{font-size:14px}.message-row[data-v-58dec249]{align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.message-row.user[data-v-58dec249]{flex-direction:row-reverse}.message-avatar[data-v-58dec249]{background:#f3f4f6;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:16px;display:flex}.message-row.user .message-avatar[data-v-58dec249]{background:#ecf5ef}.message-content[data-v-58dec249]{min-width:0;max-width:80%}.message-bubble[data-v-58dec249]{overflow-wrap:anywhere;word-break:break-word;white-space:pre-wrap;border-radius:12px;padding:9px 13px;font-size:13px;line-height:1.6}.message-row.assistant .message-bubble[data-v-58dec249]{color:#1f2937;white-space:normal;overflow-wrap:anywhere;background:#f3f4f6;border-bottom-left-radius:4px}.message-row.user .message-bubble[data-v-58dec249]{background:var(--cs-primary);color:#fff;border-bottom-right-radius:4px}.message-row.user .message-content[data-v-58dec249]{flex-direction:column;align-items:flex-end;display:flex}.message-time[data-v-58dec249]{color:#9ca3af;margin-top:4px;padding:0 4px;font-size:11px}.typing[data-v-58dec249]{gap:4px;padding:12px 16px;display:flex}.typing .dot[data-v-58dec249]{background:#9ca3af;border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite bounce-58dec249}.typing .dot[data-v-58dec249]:nth-child(2){animation-delay:.2s}.typing .dot[data-v-58dec249]:nth-child(3){animation-delay:.4s}@keyframes bounce-58dec249{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.typing-text[data-v-58dec249]{color:#9ca3af;font-size:13px}.reasoning-block[data-v-58dec249]{background:#f0f7f3;border:1px dashed #b8d4c5;border-radius:8px;margin-bottom:6px;overflow:hidden}.reasoning-header[data-v-58dec249]{cursor:pointer;-webkit-user-select:none;user-select:none;color:#2d5a47;align-items:center;gap:6px;padding:5px 10px;font-size:12px;display:flex}.reasoning-icon[data-v-58dec249]{font-size:13px}.reasoning-title[data-v-58dec249]{font-weight:600}.reasoning-toggle[data-v-58dec249]{margin-left:auto}.reasoning-body[data-v-58dec249]{color:#16402f;white-space:pre-wrap;word-break:break-word;border-top:1px dashed #b8d4c5;padding:8px 10px;font-size:12px;line-height:1.6}.steps-block[data-v-58dec249]{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}.step-item[data-v-58dec249]{color:#0e7490;background:#ecfeff;border:1px solid #a5f3fc;border-radius:10px;flex-direction:column;align-self:flex-start;align-items:flex-start;gap:3px;max-width:100%;padding:2px 8px;font-size:11px;display:flex}.step-head[data-v-58dec249]{align-items:center;gap:5px;display:inline-flex}.step-icon[data-v-58dec249]{font-size:11px}.step-name[data-v-58dec249]{font-family:SF Mono,Monaco,Consolas,monospace}.step-count[data-v-58dec249]{color:#0891b2;font-size:10px;font-weight:600}.step-status.running[data-v-58dec249]{color:#0891b2}.step-children[data-v-58dec249]{background:#faf5ff;border-left:2px solid #c4b5fd;border-radius:0 8px 8px 0;flex-direction:column;gap:3px;margin-top:4px;padding:4px 8px 4px 10px;display:flex}.step-children-label[data-v-58dec249]{color:#7c3aed;letter-spacing:.3px;font-size:10px;font-weight:600}.step-child[data-v-58dec249]{color:#6d28d9;background:#ede9fe;border:1px solid #ddd6fe;border-radius:8px;align-items:center;gap:5px;padding:1px 7px;font-size:10px;display:inline-flex}.step-child .step-name[data-v-58dec249]{color:#6d28d9}.step-child .step-status.running[data-v-58dec249]{color:#8b5cf6}.stream-cursor[data-v-58dec249],.typing-cursor[data-v-58dec249]{vertical-align:text-bottom;background:var(--cs-primary);width:7px;height:14px;margin-left:2px;animation:1s steps(2,end) infinite blink-58dec249;display:inline-block}@keyframes blink-58dec249{0%,50%{opacity:1}51%,to{opacity:0}}.error-bar[data-v-58dec249]{color:#dc2626;background:#fef2f2;border-radius:8px;align-items:flex-start;gap:10px;margin-top:8px;padding:8px 12px;font-size:13px;display:flex}.error-text[data-v-58dec249]{word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;flex:1;min-width:0;max-height:120px;line-height:1.5;overflow-y:auto}.error-bar .retry-btn[data-v-58dec249],.error-bar .undo-btn[data-v-58dec249]{flex-shrink:0;margin-top:1px}.retry-btn[data-v-58dec249]{color:#fff;cursor:pointer;background:#dc2626;border:none;border-radius:6px;flex-shrink:0;padding:3px 12px;font-size:12px;font-weight:600;transition:background .2s}.retry-btn[data-v-58dec249]:hover{background:#b91c1c}.chat-footer[data-v-58dec249]{padding:12px 16px;padding-bottom:calc(12px + env(safe-area-inset-bottom,0px));background:#fafafa;border-top:1px solid #f3f4f6;flex-shrink:0;align-items:flex-end;gap:8px;display:flex}.chat-input[data-v-58dec249]{resize:vertical;overflow-wrap:anywhere;word-break:break-word;border:1px solid #e5e7eb;border-radius:8px;outline:none;flex:1;min-height:38px;max-height:50vh;padding:9px 12px;font-family:inherit;font-size:13px;line-height:1.5;transition:border-color .2s;overflow-y:auto}.chat-input[data-v-58dec249]:focus{border-color:var(--cs-primary);box-shadow:0 0 0 2px rgba(var(--cs-primary-rgb), .1)}.send-btn[data-v-58dec249]{background:var(--cs-primary);color:#fff;cursor:pointer;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;transition:opacity .2s,transform .1s;display:flex}.send-btn[data-v-58dec249]:hover:not(:disabled){opacity:.9;transform:scale(1.05)}.send-btn[data-v-58dec249]:active:not(:disabled){transform:scale(.95)}.send-btn[data-v-58dec249]:disabled{opacity:.4;cursor:not-allowed}.send-btn.stop-btn[data-v-58dec249]{background:#9ca3af}.send-btn.stop-btn[data-v-58dec249]:hover:not(:disabled){background:#6b7280;transform:none}.cap-badge[data-v-58dec249]{color:#6b7280;white-space:nowrap;-webkit-user-select:none;user-select:none;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px}.msg-actions[data-v-58dec249]{opacity:0;gap:6px;margin-top:4px;transition:opacity .2s;display:flex}.message-row.assistant:hover .msg-actions[data-v-58dec249]{opacity:1}.msg-action-btn[data-v-58dec249]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:6px;padding:2px 8px;font-size:11px;transition:all .2s}.msg-action-btn[data-v-58dec249]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.undo-btn[data-v-58dec249]{color:#92400e;cursor:pointer;background:#fffbeb;border:1px solid #f59e0b;border-radius:6px;margin-left:6px;padding:2px 10px;font-size:11px;transition:all .2s}.undo-btn[data-v-58dec249]:hover{background:#fde68a}.undo-foot-btn[data-v-58dec249]{color:#6b7280;cursor:pointer;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px;transition:all .2s}.undo-foot-btn[data-v-58dec249]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.approval-bar[data-v-58dec249]{background:#fffbeb;border:1px solid #f59e0b;border-radius:10px;margin:8px 12px;padding:10px 12px}.approval-head[data-v-58dec249]{color:#92400e;align-items:center;gap:6px;font-size:13px;display:flex}.approval-icon[data-v-58dec249]{font-size:15px}.approval-title code[data-v-58dec249]{color:#78350f;background:#fef3c7;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.approval-toggle[data-v-58dec249]{color:#92400e;cursor:pointer;background:0 0;border:none;border-radius:4px;margin-left:auto;padding:2px 8px;font-size:12px}.approval-toggle[data-v-58dec249]:hover{background:#fef3c7}.approval-args[data-v-58dec249]{color:#57534e;white-space:pre-wrap;word-break:break-all;background:#fff;border:1px solid #fde68a;border-radius:6px;max-height:140px;margin:8px 0;padding:8px;font-size:12px;overflow:auto}.approval-actions[data-v-58dec249]{justify-content:flex-end;gap:8px;display:flex}.approval-actions button[data-v-58dec249]{cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;transition:opacity .2s}.approval-deny[data-v-58dec249]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.approval-deny[data-v-58dec249]:hover{color:#374151;background:#e5e7eb}.approval-allow[data-v-58dec249]{background:var(--cs-primary);color:#fff}.approval-allow[data-v-58dec249]:hover{opacity:.9}.approval-question[data-v-58dec249]{color:#57534e;white-space:pre-wrap;background:#fff;border:1px solid #fde68a;border-radius:6px;margin:8px 0;padding:8px 10px;font-size:13px;line-height:1.5}.approval-context[data-v-58dec249]{color:#92400e;margin:4px 0 8px;font-size:12px;line-height:1.5}.approval-recommend[data-v-58dec249]{color:#1f4d3a;margin:4px 0 8px;font-size:12px}.approval-opt[data-v-58dec249]{border:1px solid var(--cs-primary);color:var(--cs-primary);cursor:pointer;background:#fff;border-radius:6px;padding:5px 14px;font-size:13px;transition:all .2s}.approval-opt[data-v-58dec249]:hover{background:var(--cs-primary);color:#fff}.conflict-bar[data-v-58dec249]{background:#fef2f2;border:1px solid #dc2626;border-radius:10px;margin:8px 12px;padding:10px 12px}.conflict-head[data-v-58dec249]{color:#991b1b;align-items:center;gap:6px;font-size:13px;display:flex}.conflict-icon[data-v-58dec249]{font-size:15px}.conflict-title code[data-v-58dec249]{color:#7f1d1d;background:#fee2e2;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.conflict-detail[data-v-58dec249]{color:#7f1d1d;margin:6px 0 8px;font-size:12px;line-height:1.5}.conflict-actions[data-v-58dec249]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.conflict-actions button[data-v-58dec249]{cursor:pointer;border:none;border-radius:6px;padding:5px 14px;font-size:13px;transition:opacity .2s}.conflict-keep[data-v-58dec249]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.conflict-keep[data-v-58dec249]:hover{color:#374151;background:#e5e7eb}.conflict-overwrite[data-v-58dec249]{color:#fff;background:#dc2626}.conflict-overwrite[data-v-58dec249]:hover{opacity:.9}.conflict-restore[data-v-58dec249]{color:#dc2626;background:#fff;border:1px solid #dc2626}.conflict-restore[data-v-58dec249]:hover{background:#fee2e2}.conflict-toggle[data-v-58dec249]{color:#991b1b;cursor:pointer;background:0 0;border:none;border-radius:4px;margin:2px 0 6px;padding:2px 8px;font-size:12px}.conflict-toggle[data-v-58dec249]:hover{background:#fee2e2}.conflict-diff[data-v-58dec249]{gap:8px;margin:4px 0 8px;display:flex}.conflict-diff-col[data-v-58dec249]{flex:1;min-width:0}.conflict-diff-label[data-v-58dec249]{color:#7f1d1d;margin-bottom:2px;font-size:11px}.conflict-diff-pre[data-v-58dec249]{color:#57534e;white-space:pre-wrap;word-break:break-all;background:#fff;border:1px solid #fecaca;border-radius:6px;max-height:140px;margin:0;padding:6px;font-size:11px;overflow:auto}
2
2
  /*$vite$:1*/