page-agent-sdk 2.7.1 → 2.9.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
@@ -24,7 +24,7 @@ At its core, it gives the AI a **standardized, safe JSON-operation channel**. AI
24
24
 
25
25
  | Constraint | Mechanism | Effect |
26
26
  |---|---|---|
27
- | **Scope control** | Declared schema fields (`data`) — only declared top-level keys are writable; schema shape auto-whitelist (top-level keys limit visible + writable; undeclared fields hidden/denied; whole-set becomes merge to prevent accidental deletion) | AI touching undeclared fields → `PATH_DENIED` |
27
+ | **Scope control** | Declared schema fields (`data`) — only declared keys are writable; schema shape auto-whitelist (top-level + sub-path recursively projected by sub-schema; undeclared fields hidden/denied; whole-set becomes merge to prevent accidental deletion; `interceptors.write`-supplied invisible fields persisted) | AI touching undeclared fields → `PATH_DENIED` |
28
28
  | **Validity check** | zod schema — `write`/`set`/`edit` validated against schema | Invalid type/enum/structure → structured error, no write |
29
29
  | **Incremental op** | `write` with `patch`/`patches` (batch, atomic rollback) or advanced `edit_data` patches by `jsonPath` (set/remove/merge/append) | Avoid re-sending the whole large JSON; precise local edits; use `patches` to edit many at once |
30
30
  | **Large-object retrieval** | `read` supports `fields` (projection) + `depth` (truncation) to shrink payload; `query_data` (JSONPath)/`search_data` (text)/`eval_script` (sandboxed JS) | Efficient retrieval + pinpoint location in large JSON |
@@ -182,6 +182,8 @@ ChatDialog, MessageContent, CodePreview, useChat
182
182
  | | `mcp` | `McpServerConfig[]` | Remote MCP servers (http/sse/websocket) |
183
183
  | | `middleware` | `Middleware[]` | Custom middleware (appended to built-in stack) |
184
184
  | | `streaming` / `title` / `placeholder` / `debug` | — | UI/debug |
185
+ | | `drawer` | `boolean` · default `false` | Drawer mode: ChatDialog slides in from right + mask + close button (replaces collapse arrow); clicking mask/close defaults to `hide` (keeps agent/history/in-flight generation; `mount`/`show` resumes). Pass `onClose` to customize |
186
+ | | `onClose` | `() => void` | Drawer mode close callback (default `hide`; pass to override and sync external mount state) |
185
187
 
186
188
  ### Extension points
187
189
 
@@ -371,10 +373,21 @@ createChatSdk({
371
373
  maxRetries: 2, maxParallelTools: 1,
372
374
  subagent: { allowedTools: [...] },
373
375
  middleware: [/* custom middleware */],
374
- onEvent(e) { // SDK event callback: subscribe to common moments (data change / message update / tool call / error), replaces polling
376
+ onEvent(e) { // SDK event callback: data change / message update / tool call / usage / session_restored / error, replaces polling
375
377
  if (e.type === 'data_change') refreshUI()
378
+ if (e.type === 'usage') console.log('round tokens', e.usage, 'cumulative', e.cumulative)
379
+ if (e.type === 'session_restored') toast(`restored ${e.rounds} rounds`)
376
380
  },
381
+ // onAudit: (entry) => logAudit(entry), // structured audit of data writes (independent of debug)
377
382
  }).mount()
383
+
384
+ // Convenience API
385
+ // sdk.exportData() // deep copy of main data bind (backup/migrate)
386
+ // sdk.importData(json) // replace bind in-place (preserves reactive ref; schema-validated by default)
387
+ // sdk.setSkills(skills) // runtime swap the entire skill list (same-name overwrites; clears cache, index re-renders next round)
388
+ // sdk.invalidateSkillCache(name?) // invalidate skill full-text cache (proactive; omit name to clear all)
389
+ // sdk.usage // cumulative token usage {prompt_tokens, completion_tokens, total_tokens}
390
+ // sdk.hide() / sdk.show() // drawer mode hide/show (keeps agent/history/in-flight generation; mount after hide resumes via show, no rebuild)
378
391
  ```
379
392
 
380
393
  ## Examples
@@ -390,9 +403,28 @@ After `npm run dev`, visit the corresponding page:
390
403
  | planner-demo | `/examples/planner-demo/` | Plan-reflect-execute (high-temp creative planner + low-temp reflector) |
391
404
  | subagent-demo | `/examples/subagent-demo/` | Subagent parallel orchestration |
392
405
  | mcp-demo | `/examples/mcp-demo/` | MCP remote tools (needs `npm run mcp:mock`) |
406
+ | animation-demo | `/examples/animation-demo/` | ChatDialog enter/collapse/unmount animations + inline/drawer + hide/show |
407
+ | multi-agent-demo | `/examples/multi-agent-demo/` | Multi-agent parallel + exclusive switch (3 independent agents, drawer hide/show keeps each history) |
393
408
 
394
409
  Framework-agnostic integration: `demo/plain.html` (importmap + esm.sh).
395
410
 
411
+ ### Multi-agent parallel + exclusive switch
412
+
413
+ A single page can host multiple independent agents (each `createChatSdk` + distinct `id` for isolation), each managing its own `data`/history/tools, running their own generation tasks **in parallel**; **exclusive** chatbox switching uses `drawer` + `hide()`/`show()` — `hide` the old one (keeps agent/history/in-flight generation), `show` the new one (history resumes), no unmount, no lost conversation:
414
+
415
+ ```ts
416
+ const agents = [agentA, agentB, agentC] // each createChatSdk({ id, drawer: true, data, ... })
417
+ await Promise.all(agents.map(a => a.mount())) // ready in parallel
418
+ agents.slice(1).forEach(a => a.hide()) // show only the first initially
419
+
420
+ let active = 0
421
+ function switchTo(i: number) {
422
+ agents[active].hide(); active = i; agents[i].show() // exclusive switch, each history preserved
423
+ }
424
+ ```
425
+
426
+ > Multiple agents operating on the same `data` need coordination (optimistic lock `expectedHash` or `jsonPath` partitioning); each managing its own `data` object has no conflict (recommended). Full example: `examples/multi-agent-demo/`.
427
+
396
428
  ## Documentation
397
429
 
398
430
  | Doc | Contents |
@@ -407,8 +439,8 @@ Framework-agnostic integration: `demo/plain.html` (importmap + esm.sh).
407
439
  ## Self-tests
408
440
 
409
441
  ```bash
410
- npm test # 434 assertions (tsx, source-level; no LLM dependency)
411
- npm run test:e2e # 131 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 / error scenes)
442
+ npm test # 461 assertions (tsx, source-level; no LLM dependency)
443
+ npm run test:e2e # 151 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)
412
444
  ```
413
445
 
414
446
  ## Local npm package test
package/README.zh-CN.md CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  | 约束 | 机制 | 作用 |
26
26
  |---|---|---|
27
- | **范围控制** | schema 校验(`data`)—— 只能改 schema 允许的值;schema 形状自动白名单(顶层 key 限制可见 + 可写,未声明字段隐藏/拒改/整体 set 转 merge 防误删) | AI 传非法值 → 拒绝;非声明字段 → `PATH_DENIED` |
27
+ | **范围控制** | schema 校验(`data`)—— 只能改 schema 允许的值;schema 形状自动白名单(顶层 + 子路径按子 schema 递归投影,未声明字段隐藏/拒改/整体 set 转 merge 防误删;`interceptors.write` 补充的不可见字段落地保留) | AI 传非法值 → 拒绝;非声明字段 → `PATH_DENIED` |
28
28
  | **合法性校验** | zod schema —— `write`/`set`/`edit` 按 schema 校验 | 类型/枚举/结构不合法 → 结构化错误,不写入 |
29
29
  | **增量操作** | `write` 的 `patch`/`patches`(批量,原子回滚)或 advanced `edit_data` 按 `jsonPath` 发 patch(set/remove/merge/append) | 避免重传整个大 JSON,精确改局部;一次改多处用 `patches` |
30
30
  | **大对象检索** | `read` 支持 `fields`(字段裁剪)+ `depth`(深度截断)减体积;`query_data`(JSONPath)/`search_data`(文本)/`eval_script`(沙箱 JS) | 大 JSON 高效检索 + 局部定位 |
@@ -182,6 +182,8 @@ ChatDialog, MessageContent, CodePreview, useChat
182
182
  | | `mcp` | `McpServerConfig[]` | 远程 MCP server(http/sse/websocket) |
183
183
  | | `middleware` | `Middleware[]` | 自定义中间件(拼到内置栈末尾) |
184
184
  | | `streaming` / `title` / `placeholder` / `debug` | — | UI/调试 |
185
+ | | `drawer` | `boolean` · 默认 `false` | 抽屉模式:ChatDialog 从右滑入 + 遮罩 + 关闭按钮(替代收起下箭头);点遮罩/关闭按钮默认 `hide`(保留 agent/历史/生成进程,再 `mount`/`show` 恢复),传 `onClose` 自定义 |
186
+ | | `onClose` | `() => void` | 抽屉模式关闭回调(默认 `hide`;传此选项覆盖默认,便于同步外部挂载状态) |
185
187
 
186
188
  ### 扩展点
187
189
 
@@ -316,10 +318,21 @@ createChatSdk({
316
318
  maxRetries: 2, maxParallelTools: 1,
317
319
  subagent: { allowedTools: [...] },
318
320
  middleware: [/* 自定义中间件 */],
319
- onEvent(e) { // SDK 事件回调:订阅常用时机(主数据变化/消息更新/工具调用/错误),替代轮询
321
+ onEvent(e) { // SDK 事件回调:订阅常用时机(主数据变化/消息更新/工具调用/用量/会话恢复/错误),替代轮询
320
322
  if (e.type === 'data_change') refreshUI()
323
+ if (e.type === 'usage') console.log('本轮 token', e.usage, '累计', e.cumulative)
324
+ if (e.type === 'session_restored') toast(`已恢复 ${e.rounds} 轮对话`)
321
325
  },
326
+ // onAudit: (entry) => logAudit(entry), // 数据写操作结构化审计(独立于 debug)
322
327
  }).mount()
328
+
329
+ // 便捷 API
330
+ // sdk.exportData() // 深拷贝主数据 bind(备份/迁移)
331
+ // sdk.importData(json) // 整体替换 bind(就地还原保留 reactive 引用,默认经 schema 校验)
332
+ // sdk.setSkills(skills) // 运行时替换整个 skill 列表(同名覆盖;清缓存,下轮索引重渲染)
333
+ // sdk.invalidateSkillCache(name?) // 清 skill 全文缓存(动态 skill 内容变化时主动失效)
334
+ // sdk.usage // 累计 token 用量 {prompt_tokens, completion_tokens, total_tokens}
335
+ // sdk.hide() / sdk.show() // 抽屉模式隐藏/显示(保留 agent/历史/生成进程;hide 后再 mount 直接 show 不重建)
323
336
  ```
324
337
 
325
338
  ## 示例
@@ -335,9 +348,28 @@ createChatSdk({
335
348
  | planner-demo | `/examples/planner-demo/` | 规划-反思-执行(高温创意 planner + 低温 reflector) |
336
349
  | subagent-demo | `/examples/subagent-demo/` | 子 agent 并行编排 |
337
350
  | mcp-demo | `/examples/mcp-demo/` | MCP 远程工具(需 `npm run mcp:mock`) |
351
+ | animation-demo | `/examples/animation-demo/` | ChatDialog 入场/收起/卸载动画 + inline/drawer 模式 + hide/show |
352
+ | multi-agent-demo | `/examples/multi-agent-demo/` | 多 Agent 并行 + 互斥切换(三独立 agent,drawer hide/show 保留各自历史) |
338
353
 
339
354
  框架无关集成:`demo/plain.html`(importmap + esm.sh)。
340
355
 
356
+ ### 多 Agent 并行 + 互斥切换
357
+
358
+ 同一页面可挂多个独立 Agent(各自 `createChatSdk` + 不同 `id` 隔离),各管各 `data`/历史/工具,可**并行**跑各自生成任务;聊天框**互斥切换**用 `drawer` + `hide()`/`show()`——切换时 `hide` 旧的(保留 agent/历史/生成进程)、`show` 新的(历史恢复),不卸载不丢对话:
359
+
360
+ ```ts
361
+ const agents = [agentA, agentB, agentC] // 各自 createChatSdk({ id, drawer: true, data, ... })
362
+ await Promise.all(agents.map(a => a.mount())) // 并行就绪
363
+ agents.slice(1).forEach(a => a.hide()) // 初始只显示第一个
364
+
365
+ let active = 0
366
+ function switchTo(i: number) {
367
+ agents[active].hide(); active = i; agents[i].show() // 互斥切换,历史各自保留
368
+ }
369
+ ```
370
+
371
+ > 多 agent 操作同一 `data` 需协调(乐观锁 `expectedHash` 或按 `jsonPath` 分区);各管各 `data` 对象则无冲突(推荐)。完整示例见 `examples/multi-agent-demo/`。
372
+
341
373
  ## 文档
342
374
 
343
375
  | 文档 | 内容 |
@@ -352,8 +384,8 @@ createChatSdk({
352
384
  ## 自测
353
385
 
354
386
  ```bash
355
- npm test # 434 项断言(tsx 源码级,不依赖 LLM)
356
- npm run test:e2e # 131 项集成断言(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 配置 / 错误场景)
387
+ npm test # 461 项断言(tsx 源码级,不依赖 LLM)
388
+ npm run test:e2e # 151 项集成断言(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 配置 / 错误场景)
357
389
  ```
358
390
 
359
391
  ## 本地 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-cc5d7052]{z-index:9000;pointer-events:none;position:fixed;inset:0}.drawer-mask[data-v-cc5d7052]{pointer-events:auto;background:#00000040;position:absolute;inset:0}.drawer-panel[data-v-cc5d7052]{--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-cc5d7052]{z-index:1}.drawer-header[data-v-cc5d7052]{color:#fff;background:linear-gradient(135deg,#1f2937,#111827);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.drawer-title[data-v-cc5d7052]{font-size:15px;font-weight:600}.tab-group[data-v-cc5d7052]{gap:4px;display:flex}.tab-btn[data-v-cc5d7052]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;padding:4px 12px;font-size:13px;transition:background .2s}.tab-btn[data-v-cc5d7052]:hover{background:#ffffff38}.tab-btn.active[data-v-cc5d7052]{background:#ffffff73;font-weight:600}.info-body[data-v-cc5d7052]{padding:4px 0}.info-section[data-v-cc5d7052]{margin-bottom:14px}.info-title[data-v-cc5d7052]{color:#2d5a47;border-bottom:1px solid #f3f4f6;margin-bottom:6px;padding-bottom:4px;font-size:12px;font-weight:600}.info-item[data-v-cc5d7052]{background:#f9fafb;border-radius:6px;margin-bottom:4px;padding:6px 8px}.info-name[data-v-cc5d7052]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;font-weight:600}.info-desc[data-v-cc5d7052]{color:#6b7280;margin-top:2px;font-size:11px;line-height:1.5}.info-desc.muted[data-v-cc5d7052]{color:#9ca3af}.src-tag[data-v-cc5d7052]{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-cc5d7052]{color:#6b7280;background:#f3f4f6}.src-tag.mcp[data-v-cc5d7052]{color:#7c3aed;background:#f3e8ff}.src-tag.user[data-v-cc5d7052]{color:#2563eb;background:#dbeafe}.info-todo[data-v-cc5d7052]{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-cc5d7052]{color:#fff;border-radius:8px;flex-shrink:0;padding:1px 6px;font-size:10px}.info-pre[data-v-cc5d7052]{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-cc5d7052]{gap:4px;display:flex}.hd-btn[data-v-cc5d7052]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;width:28px;height:28px}.hd-btn[data-v-cc5d7052]:hover{background:#ffffff40}.drawer-filters[data-v-cc5d7052]{background:#fafafa;border-bottom:1px solid #f3f4f6;flex-wrap:wrap;gap:6px;padding:10px 16px;display:flex}.filter-chip[data-v-cc5d7052]{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-cc5d7052]:hover{border-color:var(--chip-color,var(--cs-primary))}.filter-chip.active[data-v-cc5d7052]{background:var(--chip-color,var(--cs-primary));border-color:var(--chip-color,var(--cs-primary));color:#fff}.chip-count[data-v-cc5d7052]{background:#00000014;border-radius:8px;padding:0 5px;font-size:11px}.filter-chip.active .chip-count[data-v-cc5d7052]{background:#ffffff40}.drawer-body[data-v-cc5d7052]{flex:1;padding:12px;overflow-y:auto}.empty[data-v-cc5d7052]{text-align:center;color:#9ca3af;padding:40px 20px;font-size:13px}.log-item[data-v-cc5d7052]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-bottom:10px;overflow:hidden}.log-head[data-v-cc5d7052]{background:#f9fafb;align-items:center;gap:8px;padding:8px 10px;display:flex}.log-type[data-v-cc5d7052]{color:#fff;white-space:nowrap;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.log-source[data-v-cc5d7052]{color:#7c3aed;white-space:nowrap;background:#f3e8ff;border-radius:4px;padding:2px 8px;font-size:10px;font-weight:600}.log-time[data-v-cc5d7052]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.log-body[data-v-cc5d7052]{padding:10px 12px}.log-footer[data-v-cc5d7052]{border-top:1px dashed #f3f4f6;gap:8px;padding:6px 12px;display:flex}.raw-toggle[data-v-cc5d7052]{color:var(--cs-primary);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11px}.raw-toggle[data-v-cc5d7052]:hover{text-decoration:underline}.log-raw[data-v-cc5d7052]{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-cc5d7052]{grid-template-columns:1fr 1fr;gap:6px;margin-bottom:8px;display:grid}.kv[data-v-cc5d7052]{background:#f9fafb;border-radius:6px;flex-direction:column;padding:6px 8px;display:flex}.kv .k[data-v-cc5d7052]{color:#9ca3af;text-transform:uppercase;font-size:10px}.kv .v[data-v-cc5d7052]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;font-weight:600}.section-label[data-v-cc5d7052]{color:#6b7280;margin:10px 0 4px;font-size:11px;font-weight:600}.chip-row[data-v-cc5d7052]{flex-wrap:wrap;gap:4px;display:flex}.tool-chip[data-v-cc5d7052]{color:#2d5a47;background:#ecf5ef;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.msg-list[data-v-cc5d7052]{flex-direction:column;gap:4px;display:flex}.msg-row[data-v-cc5d7052]{background:#f9fafb;border-radius:6px;align-items:flex-start;gap:6px;padding:5px 8px;display:flex}.msg-role[data-v-cc5d7052]{color:#fff;border-radius:3px;flex-shrink:0;margin-top:1px;padding:2px 6px;font-size:9px;font-weight:700}.msg-text[data-v-cc5d7052]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;font-size:12px;line-height:1.5}.msg-tool-hint[data-v-cc5d7052]{color:#7c3aed;flex-shrink:0;font-size:10px}.badge-row[data-v-cc5d7052]{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.badge[data-v-cc5d7052]{color:#2d5a47;background:#dbeee4;border-radius:10px;padding:2px 8px;font-size:11px;font-weight:600}.badge.muted[data-v-cc5d7052]{color:#6b7280;background:#f3f4f6}.badge.warn[data-v-cc5d7052]{color:#92400e;background:#fef3c7}.resp-content[data-v-cc5d7052]{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-cc5d7052]{flex-direction:column;gap:6px;display:flex}.tc-card[data-v-cc5d7052]{border:1px solid #e5e7eb;border-radius:6px;overflow:hidden}.tc-card.inline[data-v-cc5d7052]{margin-top:4px}.tc-name[data-v-cc5d7052]{color:#2d5a47;background:#ecf5ef;padding:5px 8px;font-size:12px;font-weight:600}.tc-args[data-v-cc5d7052]{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-cc5d7052]{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.usage[data-v-cc5d7052]{color:#047857;background:#ecfdf5;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.err-box[data-v-cc5d7052]{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-cc5d7052]{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.tc-inline[data-v-cc5d7052]{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-cc5d7052]{color:#2d5a47;white-space:nowrap;font-weight:600}.tc-inline-args[data-v-cc5d7052]{color:#16402f;word-break:break-all;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.tc-id[data-v-cc5d7052]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.view-toggle[data-v-cc5d7052]{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-cc5d7052]:hover{background:#dbeee4}.drawer-enter-active[data-v-cc5d7052],.drawer-leave-active[data-v-cc5d7052]{transition:opacity .25s}.drawer-enter-active .drawer-panel[data-v-cc5d7052],.drawer-leave-active .drawer-panel[data-v-cc5d7052]{transition:transform .25s}.drawer-enter-from[data-v-cc5d7052],.drawer-leave-to[data-v-cc5d7052]{opacity:0}.drawer-enter-from .drawer-panel[data-v-cc5d7052],.drawer-leave-to .drawer-panel[data-v-cc5d7052]{transform:translate(100%)}.flow-section[data-v-cc5d7052]{margin-bottom:14px}.flow-section-title[data-v-cc5d7052]{color:#6b7280;margin-bottom:6px;padding-left:2px;font-size:11px;font-weight:600}.flow-round[data-v-cc5d7052]{border:1px solid #e5e7eb;border-radius:8px;margin-bottom:12px;overflow:hidden}.flow-round-head[data-v-cc5d7052]{color:#fff;background:var(--cs-primary);padding:5px 10px;font-size:12px;font-weight:600}.flow-round-body[data-v-cc5d7052]{flex-direction:column;gap:3px;padding:6px;display:flex}.flow-node[data-v-cc5d7052]{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-cc5d7052]{border-left-color:#059669}.flow-node.llm_response[data-v-cc5d7052]{border-left-color:#d97706}.flow-node.tool_call[data-v-cc5d7052]{border-left-color:#7c3aed}.flow-node.tool_result[data-v-cc5d7052]{border-left-color:#2563eb}.flow-node.error[data-v-cc5d7052]{background:#fef2f2;border-left-color:#dc2626}.flow-node.middleware[data-v-cc5d7052]{border-left-color:#0891b2}.flow-ico[data-v-cc5d7052]{flex-shrink:0;font-size:13px}.flow-label[data-v-cc5d7052]{color:#374151;white-space:nowrap;flex-shrink:0;font-weight:600}.flow-detail[data-v-cc5d7052]{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-cc5d7052]{color:#9ca3af;flex-shrink:0;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.chat-dialog[data-v-6f6e6133]{--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;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014}.chat-dialog.collapsed[data-v-6f6e6133]{height:52px}.chat-header[data-v-6f6e6133]{background:var(--cs-primary);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.header-left[data-v-6f6e6133]{align-items:center;gap:8px;display:flex}.header-icon[data-v-6f6e6133]{font-size:20px}.header-title[data-v-6f6e6133]{font-size:15px;font-weight:600}.status-dot[data-v-6f6e6133]{background:#4ade80;border-radius:50%;width:8px;height:8px}.status-dot.pulse[data-v-6f6e6133]{animation:1.5s infinite pulse-6f6e6133}@keyframes pulse-6f6e6133{0%,to{opacity:1}50%{opacity:.4}}.header-actions[data-v-6f6e6133]{gap:4px;display:flex}.action-btn[data-v-6f6e6133]{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-6f6e6133]:hover:not(:disabled){background:#ffffff4d}.action-btn[data-v-6f6e6133]:disabled{opacity:.4;cursor:not-allowed}.action-btn.debug-btn[data-v-6f6e6133]{position:relative}.action-btn.debug-btn.active[data-v-6f6e6133]{background:#ffffff73}.debug-badge[data-v-6f6e6133]{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-6f6e6133]{overscroll-behavior:contain;flex:1;min-height:0;padding:16px;overflow-y:auto}.empty-state[data-v-6f6e6133]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-icon[data-v-6f6e6133]{margin-bottom:12px;font-size:48px}.empty-state p[data-v-6f6e6133]{font-size:14px}.message-row[data-v-6f6e6133]{align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.message-row.user[data-v-6f6e6133]{flex-direction:row-reverse}.message-avatar[data-v-6f6e6133]{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-6f6e6133]{background:#ecf5ef}.message-content[data-v-6f6e6133]{min-width:0;max-width:80%}.message-bubble[data-v-6f6e6133]{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-6f6e6133]{color:#1f2937;white-space:normal;overflow-wrap:anywhere;background:#f3f4f6;border-bottom-left-radius:4px}.message-row.user .message-bubble[data-v-6f6e6133]{background:var(--cs-primary);color:#fff;border-bottom-right-radius:4px}.message-row.user .message-content[data-v-6f6e6133]{flex-direction:column;align-items:flex-end;display:flex}.message-time[data-v-6f6e6133]{color:#9ca3af;margin-top:4px;padding:0 4px;font-size:11px}.typing[data-v-6f6e6133]{gap:4px;padding:12px 16px;display:flex}.typing .dot[data-v-6f6e6133]{background:#9ca3af;border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite bounce-6f6e6133}.typing .dot[data-v-6f6e6133]:nth-child(2){animation-delay:.2s}.typing .dot[data-v-6f6e6133]:nth-child(3){animation-delay:.4s}@keyframes bounce-6f6e6133{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.typing-text[data-v-6f6e6133]{color:#9ca3af;font-size:13px}.reasoning-block[data-v-6f6e6133]{background:#f0f7f3;border:1px dashed #b8d4c5;border-radius:8px;margin-bottom:6px;overflow:hidden}.reasoning-header[data-v-6f6e6133]{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-6f6e6133]{font-size:13px}.reasoning-title[data-v-6f6e6133]{font-weight:600}.reasoning-toggle[data-v-6f6e6133]{margin-left:auto}.reasoning-body[data-v-6f6e6133]{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-6f6e6133]{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}.step-item[data-v-6f6e6133]{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-6f6e6133]{align-items:center;gap:5px;display:inline-flex}.step-icon[data-v-6f6e6133]{font-size:11px}.step-name[data-v-6f6e6133]{font-family:SF Mono,Monaco,Consolas,monospace}.step-count[data-v-6f6e6133]{color:#0891b2;font-size:10px;font-weight:600}.step-status.running[data-v-6f6e6133]{color:#0891b2}.step-children[data-v-6f6e6133]{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-6f6e6133]{color:#7c3aed;letter-spacing:.3px;font-size:10px;font-weight:600}.step-child[data-v-6f6e6133]{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-6f6e6133]{color:#6d28d9}.step-child .step-status.running[data-v-6f6e6133]{color:#8b5cf6}.stream-cursor[data-v-6f6e6133],.typing-cursor[data-v-6f6e6133]{vertical-align:text-bottom;background:var(--cs-primary);width:7px;height:14px;margin-left:2px;animation:1s steps(2,end) infinite blink-6f6e6133;display:inline-block}@keyframes blink-6f6e6133{0%,50%{opacity:1}51%,to{opacity:0}}.error-bar[data-v-6f6e6133]{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-6f6e6133]{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-6f6e6133],.error-bar .undo-btn[data-v-6f6e6133]{flex-shrink:0;margin-top:1px}.retry-btn[data-v-6f6e6133]{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-6f6e6133]:hover{background:#b91c1c}.chat-footer[data-v-6f6e6133]{background:#fafafa;border-top:1px solid #f3f4f6;align-items:flex-end;gap:8px;padding:12px 16px;display:flex}.chat-input[data-v-6f6e6133]{resize:none;overflow-wrap:anywhere;word-break:break-word;border:1px solid #e5e7eb;border-radius:8px;outline:none;flex:1;max-height:100px;padding:9px 12px;font-family:inherit;font-size:13px;line-height:1.5;transition:border-color .2s;overflow-y:auto}.chat-input[data-v-6f6e6133]:focus{border-color:var(--cs-primary);box-shadow:0 0 0 2px rgba(var(--cs-primary-rgb), .1)}.send-btn[data-v-6f6e6133]{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-6f6e6133]:hover:not(:disabled){opacity:.9;transform:scale(1.05)}.send-btn[data-v-6f6e6133]:active:not(:disabled){transform:scale(.95)}.send-btn[data-v-6f6e6133]:disabled{opacity:.4;cursor:not-allowed}.send-btn.stop-btn[data-v-6f6e6133]{background:#9ca3af}.send-btn.stop-btn[data-v-6f6e6133]:hover:not(:disabled){background:#6b7280;transform:none}.cap-badge[data-v-6f6e6133]{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-6f6e6133]{opacity:0;gap:6px;margin-top:4px;transition:opacity .2s;display:flex}.message-row.assistant:hover .msg-actions[data-v-6f6e6133]{opacity:1}.msg-action-btn[data-v-6f6e6133]{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-6f6e6133]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.undo-btn[data-v-6f6e6133]{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-6f6e6133]:hover{background:#fde68a}.undo-foot-btn[data-v-6f6e6133]{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-6f6e6133]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.approval-bar[data-v-6f6e6133]{background:#fffbeb;border:1px solid #f59e0b;border-radius:10px;margin:8px 12px;padding:10px 12px}.approval-head[data-v-6f6e6133]{color:#92400e;align-items:center;gap:6px;font-size:13px;display:flex}.approval-icon[data-v-6f6e6133]{font-size:15px}.approval-title code[data-v-6f6e6133]{color:#78350f;background:#fef3c7;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.approval-toggle[data-v-6f6e6133]{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-6f6e6133]:hover{background:#fef3c7}.approval-args[data-v-6f6e6133]{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-6f6e6133]{justify-content:flex-end;gap:8px;display:flex}.approval-actions button[data-v-6f6e6133]{cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;transition:opacity .2s}.approval-deny[data-v-6f6e6133]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.approval-deny[data-v-6f6e6133]:hover{color:#374151;background:#e5e7eb}.approval-allow[data-v-6f6e6133]{background:var(--cs-primary);color:#fff}.approval-allow[data-v-6f6e6133]:hover{opacity:.9}.approval-question[data-v-6f6e6133]{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-6f6e6133]{color:#92400e;margin:4px 0 8px;font-size:12px;line-height:1.5}.approval-recommend[data-v-6f6e6133]{color:#1f4d3a;margin:4px 0 8px;font-size:12px}.approval-opt[data-v-6f6e6133]{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-6f6e6133]:hover{background:var(--cs-primary);color:#fff}.conflict-bar[data-v-6f6e6133]{background:#fef2f2;border:1px solid #dc2626;border-radius:10px;margin:8px 12px;padding:10px 12px}.conflict-head[data-v-6f6e6133]{color:#991b1b;align-items:center;gap:6px;font-size:13px;display:flex}.conflict-icon[data-v-6f6e6133]{font-size:15px}.conflict-title code[data-v-6f6e6133]{color:#7f1d1d;background:#fee2e2;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.conflict-detail[data-v-6f6e6133]{color:#7f1d1d;margin:6px 0 8px;font-size:12px;line-height:1.5}.conflict-actions[data-v-6f6e6133]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.conflict-actions button[data-v-6f6e6133]{cursor:pointer;border:none;border-radius:6px;padding:5px 14px;font-size:13px;transition:opacity .2s}.conflict-keep[data-v-6f6e6133]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.conflict-keep[data-v-6f6e6133]:hover{color:#374151;background:#e5e7eb}.conflict-overwrite[data-v-6f6e6133]{color:#fff;background:#dc2626}.conflict-overwrite[data-v-6f6e6133]:hover{opacity:.9}.conflict-restore[data-v-6f6e6133]{color:#dc2626;background:#fff;border:1px solid #dc2626}.conflict-restore[data-v-6f6e6133]:hover{background:#fee2e2}.conflict-toggle[data-v-6f6e6133]{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-6f6e6133]:hover{background:#fee2e2}.conflict-diff[data-v-6f6e6133]{gap:8px;margin:4px 0 8px;display:flex}.conflict-diff-col[data-v-6f6e6133]{flex:1;min-width:0}.conflict-diff-label[data-v-6f6e6133]{color:#7f1d1d;margin-bottom:2px;font-size:11px}.conflict-diff-pre[data-v-6f6e6133]{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}.chat-mask[data-v-1dc203ad]{z-index:9998;background:#00000073;animation:.28s cs-mask-in-1dc203ad;position:fixed;inset:0}@keyframes cs-mask-in-1dc203ad{0%{opacity:0}to{opacity:1}}.chat-dialog.drawer[data-v-1dc203ad]{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-1dc203ad;position:fixed;top:0;bottom:0;right:0}@keyframes cs-drawer-slide-in-1dc203ad{0%{transform:translate(100%)}to{transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-mask[data-v-1dc203ad],.chat-dialog.drawer[data-v-1dc203ad]{animation:none}}.chat-dialog[data-v-1dc203ad]{--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-1dc203ad;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014}@keyframes cs-drawer-in-1dc203ad{0%{opacity:0;transform:translate(32px)}to{opacity:1;transform:translate(0)}}@media (prefers-reduced-motion:reduce){.chat-dialog[data-v-1dc203ad]{animation:none}}.chat-dialog.collapsed[data-v-1dc203ad]{height:52px}.cs-slide-enter-active[data-v-1dc203ad],.cs-slide-leave-active[data-v-1dc203ad]{transition:opacity .22s,transform .22s}.cs-slide-enter-from[data-v-1dc203ad],.cs-slide-leave-to[data-v-1dc203ad]{opacity:0;transform:translateY(-6px)}.chat-dialog.cs-leaving[data-v-1dc203ad]{opacity:0;pointer-events:none;transform:scale(.96)translateY(8px)}.chat-dialog.drawer.cs-leaving[data-v-1dc203ad]{transform:translate(100%)}.chat-mask.cs-leaving[data-v-1dc203ad]{opacity:0}.chat-dialog.cs-hidden[data-v-1dc203ad],.chat-mask.cs-hidden[data-v-1dc203ad]{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .2s,visibility 0s .2s}.chat-header[data-v-1dc203ad]{background:var(--cs-primary);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.header-left[data-v-1dc203ad]{align-items:center;gap:8px;display:flex}.header-icon[data-v-1dc203ad]{font-size:20px}.header-title[data-v-1dc203ad]{font-size:15px;font-weight:600}.status-dot[data-v-1dc203ad]{background:#4ade80;border-radius:50%;width:8px;height:8px}.status-dot.pulse[data-v-1dc203ad]{animation:1.5s infinite pulse-1dc203ad}@keyframes pulse-1dc203ad{0%,to{opacity:1}50%{opacity:.4}}.header-actions[data-v-1dc203ad]{gap:4px;display:flex}.action-btn[data-v-1dc203ad]{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-1dc203ad]:hover:not(:disabled){background:#ffffff4d}.action-btn[data-v-1dc203ad]:disabled{opacity:.4;cursor:not-allowed}.action-btn.debug-btn[data-v-1dc203ad]{position:relative}.action-btn.debug-btn.active[data-v-1dc203ad]{background:#ffffff73}.debug-badge[data-v-1dc203ad]{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-1dc203ad]{overscroll-behavior:contain;flex:1;min-height:0;padding:16px;overflow-y:auto}.empty-state[data-v-1dc203ad]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-icon[data-v-1dc203ad]{margin-bottom:12px;font-size:48px}.empty-state p[data-v-1dc203ad]{font-size:14px}.message-row[data-v-1dc203ad]{align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.message-row.user[data-v-1dc203ad]{flex-direction:row-reverse}.message-avatar[data-v-1dc203ad]{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-1dc203ad]{background:#ecf5ef}.message-content[data-v-1dc203ad]{min-width:0;max-width:80%}.message-bubble[data-v-1dc203ad]{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-1dc203ad]{color:#1f2937;white-space:normal;overflow-wrap:anywhere;background:#f3f4f6;border-bottom-left-radius:4px}.message-row.user .message-bubble[data-v-1dc203ad]{background:var(--cs-primary);color:#fff;border-bottom-right-radius:4px}.message-row.user .message-content[data-v-1dc203ad]{flex-direction:column;align-items:flex-end;display:flex}.message-time[data-v-1dc203ad]{color:#9ca3af;margin-top:4px;padding:0 4px;font-size:11px}.typing[data-v-1dc203ad]{gap:4px;padding:12px 16px;display:flex}.typing .dot[data-v-1dc203ad]{background:#9ca3af;border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite bounce-1dc203ad}.typing .dot[data-v-1dc203ad]:nth-child(2){animation-delay:.2s}.typing .dot[data-v-1dc203ad]:nth-child(3){animation-delay:.4s}@keyframes bounce-1dc203ad{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.typing-text[data-v-1dc203ad]{color:#9ca3af;font-size:13px}.reasoning-block[data-v-1dc203ad]{background:#f0f7f3;border:1px dashed #b8d4c5;border-radius:8px;margin-bottom:6px;overflow:hidden}.reasoning-header[data-v-1dc203ad]{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-1dc203ad]{font-size:13px}.reasoning-title[data-v-1dc203ad]{font-weight:600}.reasoning-toggle[data-v-1dc203ad]{margin-left:auto}.reasoning-body[data-v-1dc203ad]{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-1dc203ad]{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}.step-item[data-v-1dc203ad]{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-1dc203ad]{align-items:center;gap:5px;display:inline-flex}.step-icon[data-v-1dc203ad]{font-size:11px}.step-name[data-v-1dc203ad]{font-family:SF Mono,Monaco,Consolas,monospace}.step-count[data-v-1dc203ad]{color:#0891b2;font-size:10px;font-weight:600}.step-status.running[data-v-1dc203ad]{color:#0891b2}.step-children[data-v-1dc203ad]{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-1dc203ad]{color:#7c3aed;letter-spacing:.3px;font-size:10px;font-weight:600}.step-child[data-v-1dc203ad]{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-1dc203ad]{color:#6d28d9}.step-child .step-status.running[data-v-1dc203ad]{color:#8b5cf6}.stream-cursor[data-v-1dc203ad],.typing-cursor[data-v-1dc203ad]{vertical-align:text-bottom;background:var(--cs-primary);width:7px;height:14px;margin-left:2px;animation:1s steps(2,end) infinite blink-1dc203ad;display:inline-block}@keyframes blink-1dc203ad{0%,50%{opacity:1}51%,to{opacity:0}}.error-bar[data-v-1dc203ad]{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-1dc203ad]{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-1dc203ad],.error-bar .undo-btn[data-v-1dc203ad]{flex-shrink:0;margin-top:1px}.retry-btn[data-v-1dc203ad]{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-1dc203ad]:hover{background:#b91c1c}.chat-footer[data-v-1dc203ad]{background:#fafafa;border-top:1px solid #f3f4f6;align-items:flex-end;gap:8px;padding:12px 16px;display:flex}.chat-input[data-v-1dc203ad]{resize:none;overflow-wrap:anywhere;word-break:break-word;border:1px solid #e5e7eb;border-radius:8px;outline:none;flex:1;max-height:100px;padding:9px 12px;font-family:inherit;font-size:13px;line-height:1.5;transition:border-color .2s;overflow-y:auto}.chat-input[data-v-1dc203ad]:focus{border-color:var(--cs-primary);box-shadow:0 0 0 2px rgba(var(--cs-primary-rgb), .1)}.send-btn[data-v-1dc203ad]{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-1dc203ad]:hover:not(:disabled){opacity:.9;transform:scale(1.05)}.send-btn[data-v-1dc203ad]:active:not(:disabled){transform:scale(.95)}.send-btn[data-v-1dc203ad]:disabled{opacity:.4;cursor:not-allowed}.send-btn.stop-btn[data-v-1dc203ad]{background:#9ca3af}.send-btn.stop-btn[data-v-1dc203ad]:hover:not(:disabled){background:#6b7280;transform:none}.cap-badge[data-v-1dc203ad]{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-1dc203ad]{opacity:0;gap:6px;margin-top:4px;transition:opacity .2s;display:flex}.message-row.assistant:hover .msg-actions[data-v-1dc203ad]{opacity:1}.msg-action-btn[data-v-1dc203ad]{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-1dc203ad]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.undo-btn[data-v-1dc203ad]{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-1dc203ad]:hover{background:#fde68a}.undo-foot-btn[data-v-1dc203ad]{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-1dc203ad]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.approval-bar[data-v-1dc203ad]{background:#fffbeb;border:1px solid #f59e0b;border-radius:10px;margin:8px 12px;padding:10px 12px}.approval-head[data-v-1dc203ad]{color:#92400e;align-items:center;gap:6px;font-size:13px;display:flex}.approval-icon[data-v-1dc203ad]{font-size:15px}.approval-title code[data-v-1dc203ad]{color:#78350f;background:#fef3c7;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.approval-toggle[data-v-1dc203ad]{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-1dc203ad]:hover{background:#fef3c7}.approval-args[data-v-1dc203ad]{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-1dc203ad]{justify-content:flex-end;gap:8px;display:flex}.approval-actions button[data-v-1dc203ad]{cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;transition:opacity .2s}.approval-deny[data-v-1dc203ad]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.approval-deny[data-v-1dc203ad]:hover{color:#374151;background:#e5e7eb}.approval-allow[data-v-1dc203ad]{background:var(--cs-primary);color:#fff}.approval-allow[data-v-1dc203ad]:hover{opacity:.9}.approval-question[data-v-1dc203ad]{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-1dc203ad]{color:#92400e;margin:4px 0 8px;font-size:12px;line-height:1.5}.approval-recommend[data-v-1dc203ad]{color:#1f4d3a;margin:4px 0 8px;font-size:12px}.approval-opt[data-v-1dc203ad]{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-1dc203ad]:hover{background:var(--cs-primary);color:#fff}.conflict-bar[data-v-1dc203ad]{background:#fef2f2;border:1px solid #dc2626;border-radius:10px;margin:8px 12px;padding:10px 12px}.conflict-head[data-v-1dc203ad]{color:#991b1b;align-items:center;gap:6px;font-size:13px;display:flex}.conflict-icon[data-v-1dc203ad]{font-size:15px}.conflict-title code[data-v-1dc203ad]{color:#7f1d1d;background:#fee2e2;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.conflict-detail[data-v-1dc203ad]{color:#7f1d1d;margin:6px 0 8px;font-size:12px;line-height:1.5}.conflict-actions[data-v-1dc203ad]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.conflict-actions button[data-v-1dc203ad]{cursor:pointer;border:none;border-radius:6px;padding:5px 14px;font-size:13px;transition:opacity .2s}.conflict-keep[data-v-1dc203ad]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.conflict-keep[data-v-1dc203ad]:hover{color:#374151;background:#e5e7eb}.conflict-overwrite[data-v-1dc203ad]{color:#fff;background:#dc2626}.conflict-overwrite[data-v-1dc203ad]:hover{opacity:.9}.conflict-restore[data-v-1dc203ad]{color:#dc2626;background:#fff;border:1px solid #dc2626}.conflict-restore[data-v-1dc203ad]:hover{background:#fee2e2}.conflict-toggle[data-v-1dc203ad]{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-1dc203ad]:hover{background:#fee2e2}.conflict-diff[data-v-1dc203ad]{gap:8px;margin:4px 0 8px;display:flex}.conflict-diff-col[data-v-1dc203ad]{flex:1;min-width:0}.conflict-diff-label[data-v-1dc203ad]{color:#7f1d1d;margin-bottom:2px;font-size:11px}.conflict-diff-pre[data-v-1dc203ad]{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*/