zen-gitsync 2.17.4 → 2.17.6

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.
Files changed (53) hide show
  1. package/README.md +13 -0
  2. package/package.json +2 -1
  3. package/scripts/release.js +93 -66
  4. package/src/aiCommit.js +6 -3
  5. package/src/cli/ai/agent.js +23 -8
  6. package/src/cli/ai/modelSetup.js +6 -8
  7. package/src/config.js +57 -4
  8. package/src/ui/public/assets/{AgentView-BkNdHFRW.js → AgentView-BC3F0F6m.js} +3 -3
  9. package/src/ui/public/assets/AgentView-CzUeyQfR.css +1 -0
  10. package/src/ui/public/assets/{AppVersionBadge-pJ33fsvn.js → AppVersionBadge-DV6KuLqb.js} +2 -2
  11. package/src/ui/public/assets/{BranchSelector-Ixv2uRS6.js → BranchSelector-DGXDAOkR.js} +1 -1
  12. package/src/ui/public/assets/{CommitForm-DqJvDzSw.js → CommitForm-BYBj7UUa.js} +1 -1
  13. package/src/ui/public/assets/{CommonDialog-DfT04-V7.js → CommonDialog-DWMCeujE.js} +1 -1
  14. package/src/ui/public/assets/{EditorView-Br0JBESF.js → EditorView-D-TEQZso.js} +1 -1
  15. package/src/ui/public/assets/{FileDiffViewer-C3DxCngU.js → FileDiffViewer-C4ZANajI.js} +1 -1
  16. package/src/ui/public/assets/{FlowExecutionViewer-C_FOK1_9.js → FlowExecutionViewer-DUv7mBuG.js} +1 -1
  17. package/src/ui/public/assets/{FlowOrchestrationWorkspace-wu9ieYbz.js → FlowOrchestrationWorkspace-BiSuvzL7.js} +1 -1
  18. package/src/ui/public/assets/{IconButton-CQB_swX6.js → IconButton-BltPKVbV.js} +1 -1
  19. package/src/ui/public/assets/{LogList-CSpeYuAd.js → LogList-BY1Haq9r.js} +1 -1
  20. package/src/ui/public/assets/{MindmapView-8AHGHv9g.js → MindmapView-BKsvCnYv.js} +1 -1
  21. package/src/ui/public/assets/{MonitorView-Do6DcGd9.js → MonitorView-B3_NaJRy.js} +1 -1
  22. package/src/ui/public/assets/{ProjectStartupButton-DwrukeUb.js → ProjectStartupButton-DP3eDVRp.js} +1 -1
  23. package/src/ui/public/assets/{RemoteManagerDialog-Dhdwvb2y.js → RemoteManagerDialog-Bl9b_iRv.js} +1 -1
  24. package/src/ui/public/assets/{RemoteRepoCard-DjKHYGRi.js → RemoteRepoCard-TQ3DxDnq.js} +1 -1
  25. package/src/ui/public/assets/{SourceMapView-COuEBUTw.js → SourceMapView-BF-Mzv3V.js} +1 -1
  26. package/src/ui/public/assets/{SvgIcon-C6aJB-3Q.js → SvgIcon-DxazW7dI.js} +1 -1
  27. package/src/ui/public/assets/{TemplateManager-Th1ibeIh.js → TemplateManager-BN6gWFWX.js} +1 -1
  28. package/src/ui/public/assets/{UserInputNode-B8F60XEE.js → UserInputNode-CPwvIfP6.js} +1 -1
  29. package/src/ui/public/assets/WorkbenchView-CDu61WWs.js +13 -0
  30. package/src/ui/public/assets/WorkbenchView-DEejub9Z.css +1 -0
  31. package/src/ui/public/assets/_plugin-vue_export-helper-B7A-NgBp.js +19 -0
  32. package/src/ui/public/assets/configStore-Dx84lvTX.js +1 -0
  33. package/src/ui/public/assets/{gitStore-QokQdW7C.js → gitStore-CYrdjXPU.js} +1 -1
  34. package/src/ui/public/assets/index-DNHOYMCg.js +24 -0
  35. package/src/ui/public/assets/index-Dsfmp6w8.css +1 -0
  36. package/src/ui/public/assets/{previewSandbox-CA1fFxdo.js → previewSandbox-D_j5PWX1.js} +0 -0
  37. package/src/ui/public/assets/{toolsStore-Bu8Ujw_A.js → toolsStore-BiC2mmC3.js} +1 -1
  38. package/src/ui/public/assets/{vendor-CwZs6S_i.js → vendor-92fKgtnz.js} +7 -7
  39. package/src/ui/public/assets/{vendor-_6pgW9Z2.css → vendor-B1UrVTTI.css} +1 -1
  40. package/src/ui/public/index.html +14 -14
  41. package/src/ui/server/routes/codeAnalysis.js +6 -3
  42. package/src/ui/server/routes/config.js +32 -6
  43. package/src/ui/server/routes/workbench/agentChat.js +34 -8
  44. package/src/ui/server/routes/workbench/llmClient.js +15 -8
  45. package/src/utils/aiEndpoint.js +231 -0
  46. package/src/utils/aiEndpoint.test.js +175 -0
  47. package/src/ui/public/assets/AgentView-BsN9y4Kg.css +0 -1
  48. package/src/ui/public/assets/WorkbenchView-CML-A0y6.css +0 -1
  49. package/src/ui/public/assets/WorkbenchView-jutdH9WI.js +0 -13
  50. package/src/ui/public/assets/_plugin-vue_export-helper-nUAWISuX.js +0 -19
  51. package/src/ui/public/assets/configStore-CRYvJSvr.js +0 -1
  52. package/src/ui/public/assets/index-BLO9MkBC.js +0 -24
  53. package/src/ui/public/assets/index-ClqvC4kJ.css +0 -1
@@ -1 +1 @@
1
- .svg-icon[data-v-f85b4ad8]{vertical-align:middle;flex-shrink:0;display:inline-block}.form-wrap[data-v-857572e3]{flex-direction:column;gap:18px;width:100%;display:flex}.field[data-v-857572e3]{flex-direction:column;gap:6px;display:flex}.field-label[data-v-857572e3]{color:var(--text);align-items:center;gap:4px;font-size:13px;font-weight:500;display:flex}.required[data-v-857572e3]{color:var(--error);font-size:12px}.input-wrap[data-v-857572e3]{align-items:center;display:flex;position:relative}.field-icon[data-v-857572e3]{pointer-events:none;flex-shrink:0;position:absolute;left:10px}.text-input[data-v-857572e3]{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);width:100%;height:38px;color:var(--text);font-family:var(--font);transition:border-color var(--t),box-shadow var(--t);outline:none;padding:0 36px 0 34px;font-size:13.5px}.text-input[data-v-857572e3]::placeholder{color:var(--text-muted)}.text-input[data-v-857572e3]:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--primary-dim)}.eye-btn[data-v-857572e3]{cursor:pointer;color:var(--text-dim);transition:color var(--t);background:0 0;border:none;border-radius:4px;align-items:center;padding:4px;display:flex;position:absolute;right:8px}.eye-btn[data-v-857572e3]:hover{color:var(--text)}.combobox[data-v-857572e3]{position:relative}.combo-input-row[data-v-857572e3]{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);transition:border-color var(--t),box-shadow var(--t);align-items:center;display:flex}.combobox.open .combo-input-row[data-v-857572e3],.combo-input-row[data-v-857572e3]:focus-within{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--primary-dim)}.combobox.error .combo-input-row[data-v-857572e3]{border-color:var(--error)}.combo-input[data-v-857572e3]{height:38px;color:var(--text);font-family:var(--font);background:0 0;border:none;outline:none;flex:1;padding:0 4px 0 34px;font-size:13.5px}.combo-input[data-v-857572e3]::placeholder{color:var(--text-muted)}.combo-arrow[data-v-857572e3]{cursor:pointer;height:38px;color:var(--text-dim);transition:color var(--t);border-radius:0 var(--radius) var(--radius) 0;background:0 0;border:none;align-items:center;padding:0 10px;display:flex}.combo-arrow[data-v-857572e3]:hover{color:var(--text)}.combo-clear[data-v-857572e3]{cursor:pointer;height:38px;color:var(--text-dim);transition:color var(--t);background:0 0;border:none;flex-shrink:0;align-items:center;padding:0 6px;display:flex}.combo-clear[data-v-857572e3]:hover{color:var(--text)}.text-input.has-two-right[data-v-857572e3]{padding-right:68px}.dropdown[data-v-857572e3]{z-index:200;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);max-height:220px;padding:4px;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto;box-shadow:0 8px 24px #00000073}.dropdown-item[data-v-857572e3]{cursor:pointer;text-align:left;width:100%;transition:background var(--t);background:0 0;border:none;border-radius:6px;grid-template-columns:1fr auto auto;align-items:center;gap:8px;padding:8px 10px;display:grid}.dropdown-item.has-logo[data-v-857572e3]{grid-template-columns:20px 1fr auto auto}.dropdown-item[data-v-857572e3]:hover{background:var(--bg-surface)}.dropdown-item.active[data-v-857572e3]{background:var(--primary-dim)}.item-label[data-v-857572e3]{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.item-url[data-v-857572e3]{color:var(--text-dim);white-space:nowrap;text-overflow:ellipsis;font-size:11.5px;overflow:hidden}.item-check[data-v-857572e3]{flex-shrink:0}.item-logo[data-v-857572e3]{object-fit:contain;border-radius:3px;flex-shrink:0;width:16px;height:16px}.provider-logo[data-v-857572e3]{object-fit:contain;pointer-events:none;width:15px;height:15px}.dropdown-loading[data-v-857572e3]{color:var(--text-dim);align-items:center;gap:8px;padding:10px 12px;font-size:13px;display:flex}.field-error[data-v-857572e3]{color:var(--error);align-items:center;gap:5px;font-size:12px;display:flex}.test-banner[data-v-857572e3]{border-radius:var(--radius);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:500;display:flex}.test-banner.ok[data-v-857572e3]{background:var(--success-dim);color:var(--success);border:1px solid #10b98140}.test-banner.fail[data-v-857572e3]{background:var(--error-dim);color:var(--error);border:1px solid #ef444440}.actions[data-v-857572e3]{justify-content:space-between;align-items:center;gap:10px;padding-top:4px;display:flex}.actions-right[data-v-857572e3]{gap:10px;display:flex}.btn[data-v-857572e3]{border-radius:var(--radius);height:36px;font-family:var(--font);cursor:pointer;transition:background var(--t),border-color var(--t),opacity var(--t),box-shadow var(--t);white-space:nowrap;border:1px solid #0000;align-items:center;gap:6px;padding:0 16px;font-size:13px;font-weight:500;display:inline-flex}.btn[data-v-857572e3]:disabled{opacity:.5;cursor:not-allowed}.btn-ghost[data-v-857572e3]{color:var(--text-dim);background:0 0;border-color:#0000}.btn-ghost[data-v-857572e3]:hover:not(:disabled){color:var(--text);background:var(--bg-elevated)}.btn-outline[data-v-857572e3]{color:var(--text);border-color:var(--border);background:0 0}.btn-outline[data-v-857572e3]:hover:not(:disabled){border-color:var(--border-focus);background:var(--primary-dim);color:var(--primary)}.btn-primary[data-v-857572e3]{background:var(--primary);color:#fff;border-color:var(--primary)}.btn-primary[data-v-857572e3]:hover:not(:disabled){background:var(--primary-hover);border-color:var(--primary-hover);box-shadow:0 0 0 3px var(--primary-dim)}.banner-enter-active[data-v-857572e3],.banner-leave-active[data-v-857572e3]{transition:opacity .2s,transform .2s}.banner-enter-from[data-v-857572e3],.banner-leave-to[data-v-857572e3]{opacity:0;transform:translateY(-4px)}@keyframes spin-857572e3{to{transform:rotate(360deg)}}.spin[data-v-857572e3]{animation:.8s linear infinite spin-857572e3}.svg-icon[data-v-5461fefd]{vertical-align:middle;flex-shrink:0;display:inline-block}.modal-overlay[data-v-6016a221]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-container[data-v-6016a221]{background:#1a1d27;border:1px solid #2d3348;border-radius:12px;flex-direction:column;width:860px;max-width:95vw;height:600px;max-height:85vh;display:flex;overflow:hidden;box-shadow:0 20px 60px #00000080}.modal-header[data-v-6016a221]{background:#222633;border-bottom:1px solid #2d3348;justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.modal-title[data-v-6016a221]{color:#e4e7ef;align-items:center;gap:8px;margin:0;font-size:1rem;font-weight:600;display:flex}.close-btn[data-v-6016a221]{color:#8b91a8;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px 8px;transition:all .15s;display:inline-flex}.close-btn[data-v-6016a221]:hover{color:#f87171;background:#f871711a}.toolbar[data-v-6016a221]{background:#1e2230;border-bottom:1px solid #2d3348;align-items:center;gap:6px;padding:10px 16px;display:flex}.tool-btn[data-v-6016a221]{color:#e4e7ef;cursor:pointer;white-space:nowrap;background:#2d3348;border:1px solid #3a4160;border-radius:6px;align-items:center;gap:4px;padding:5px 12px;font-size:.82rem;transition:all .15s;display:inline-flex}.tool-btn[data-v-6016a221]:hover:not(:disabled){background:#3a4160}.tool-btn[data-v-6016a221]:disabled{opacity:.4;cursor:not-allowed}.tool-btn-icon[data-v-6016a221]{justify-content:center;gap:0;padding:5px 8px}.address-bar[data-v-6016a221]{background:#2d3348;border:1px solid #3a4160;border-radius:6px;flex:1;align-items:center;gap:6px;min-width:0;margin-left:8px;padding:2px 8px;transition:border-color .15s;display:flex}.address-bar[data-v-6016a221]:focus-within{border-color:#6c8cff}.address-bar.has-error[data-v-6016a221]{border-color:#f87171}.address-bar-icon[data-v-6016a221]{flex-shrink:0}.address-bar-input[data-v-6016a221]{color:#e4e7ef;background:0 0;border:none;outline:none;flex:1;min-width:0;padding:4px 0;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.84rem;line-height:1.3}.address-bar-input[data-v-6016a221]::placeholder{color:#5a6180;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.address-bar-clear[data-v-6016a221]{color:#f87171;cursor:pointer;background:0 0;border:none;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;padding:2px;display:inline-flex}.address-bar-clear[data-v-6016a221]:hover{background:#f871711f}.search-bar[data-v-6016a221]{background:#1e2230;border-bottom:1px solid #2d3348;align-items:center;gap:8px;padding:8px 16px;display:flex}.search-icon[data-v-6016a221]{flex-shrink:0}.search-input[data-v-6016a221]{color:#e4e7ef;background:#2d3348;border:1px solid #3a4160;border-radius:6px;outline:none;flex:1;padding:6px 10px;font-size:.85rem;transition:border-color .2s}.search-input[data-v-6016a221]::placeholder{color:#5a6180}.search-input[data-v-6016a221]:focus{border-color:#6c8cff}.clear-search[data-v-6016a221]{color:#8b91a8;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;display:inline-flex}.clear-search[data-v-6016a221]:hover{color:#f87171}.global-toggle[data-v-6016a221]{flex-shrink:0;align-items:center;gap:6px;margin-left:4px;display:flex}.toggle-label[data-v-6016a221]{color:#5a6180;-webkit-user-select:none;user-select:none;white-space:nowrap;font-size:.78rem}.toggle-switch[data-v-6016a221]{cursor:pointer;background:#2d3348;border:1px solid #3a4160;border-radius:9px;flex-shrink:0;width:34px;height:18px;padding:0;transition:all .2s;position:relative}.toggle-switch.active[data-v-6016a221]{background:#6c8cff;border-color:#6c8cff}.toggle-knob[data-v-6016a221]{background:#8b91a8;border-radius:50%;width:12px;height:12px;transition:all .2s;position:absolute;top:2px;left:2px}.toggle-switch.active .toggle-knob[data-v-6016a221]{background:#fff;left:18px}.index-status[data-v-6016a221]{cursor:pointer;border-radius:4px;flex-shrink:0;align-items:center;gap:4px;padding:2px 6px;transition:all .15s;display:flex}.index-status[data-v-6016a221]:hover{background:#ffffff0d}.index-status.idle[data-v-6016a221]{color:#f59e0b;background:#f59e0b0f;border:1px dashed #f59e0b80}.index-status.idle[data-v-6016a221]:hover{background:#f59e0b24;border-color:#f59e0bd9;transform:translateY(-1px)}.index-status.idle .status-text[data-v-6016a221]{color:#f59e0b;font-weight:500}.status-dot[data-v-6016a221]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.index-status.ready .status-dot[data-v-6016a221]{background:#34d399;box-shadow:0 0 4px #34d399}.index-status.indexing .status-dot[data-v-6016a221]{background:#f59e0b;animation:1s ease-in-out infinite pulse-6016a221}.index-status.idle .status-dot[data-v-6016a221],.index-status.error .status-dot[data-v-6016a221]{background:#6b7280}@keyframes pulse-6016a221{0%,to{opacity:1}50%{opacity:.4}}.status-text[data-v-6016a221]{color:#5a6180;white-space:nowrap;font-size:.72rem}.status-icon[data-v-6016a221]{color:inherit;flex-shrink:0}.engine-badge[data-v-6016a221]{white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:.72rem}.engine-badge.index[data-v-6016a221]{color:#34d399;background:#34d39926}.engine-badge.walk[data-v-6016a221]{color:#f59e0b;background:#f59e0b26}.modal-body[data-v-6016a221]{flex:1;display:flex;overflow:hidden}.sidebar[data-v-6016a221]{background:#1e2230;border-right:1px solid #2d3348;flex-shrink:0;width:160px;overflow-y:auto}.sidebar-section[data-v-6016a221]{border-bottom:1px solid #2d3348;padding:10px 0}.sidebar-title[data-v-6016a221]{color:#5a6180;text-transform:uppercase;letter-spacing:.5px;padding:0 14px 6px;font-size:.72rem;font-weight:600}.sidebar-item[data-v-6016a221]{color:#c0c5d8;cursor:pointer;align-items:center;gap:6px;padding:6px 14px;font-size:.82rem;transition:all .15s;display:flex}.sidebar-item[data-v-6016a221]:hover{color:#6c8cff;background:#6c8cff14}.sidebar-item.active[data-v-6016a221]{color:#6c8cff;background:#6c8cff26}.file-list-container[data-v-6016a221]{flex:1;padding:4px 0;overflow-y:auto}.loading-state[data-v-6016a221],.error-state[data-v-6016a221],.empty-state[data-v-6016a221]{color:#8b91a8;justify-content:center;align-items:center;gap:8px;height:200px;font-size:.9rem;display:flex}.error-state[data-v-6016a221]{color:#f87171}.spinner[data-v-6016a221]{vertical-align:middle;border:2px solid #2d3348;border-top-color:#6c8cff;border-radius:50%;width:16px;height:16px;margin-right:8px;animation:.6s linear infinite spin-6016a221;display:inline-block}@keyframes spin-6016a221{to{transform:rotate(360deg)}}.file-list[data-v-6016a221]{padding:0}.search-results-info[data-v-6016a221]{color:#8b91a8;background:#6c8cff0a;border-bottom:1px solid #2d3348;align-items:center;gap:6px;padding:8px 16px;font-size:.8rem;display:flex}.search-results-info strong[data-v-6016a221]{color:#6c8cff}.truncated-hint[data-v-6016a221]{color:#f59e0b;font-size:.76rem}.elapsed-hint[data-v-6016a221]{color:#5a6180;margin-left:auto;font-size:.74rem}.file-parent-path[data-v-6016a221]{color:#5a6180;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;max-width:200px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.76rem;overflow:hidden}.select-current-dir[data-v-6016a221]{background:#a78bfa14;border-bottom:1px solid #a78bfa26}.select-current-dir[data-v-6016a221]:hover{background:#a78bfa26}.select-current-dir.selected[data-v-6016a221]{background:#a78bfa40}.file-path-hint[data-v-6016a221]{color:#8b91a8;text-overflow:ellipsis;white-space:nowrap;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.78rem;overflow:hidden}.file-row[data-v-6016a221]{cursor:pointer;-webkit-user-select:none;user-select:none;border-bottom:1px solid #2d33484d;align-items:center;gap:8px;padding:7px 16px;transition:background .1s;display:flex}.file-row[data-v-6016a221]:hover{background:#6c8cff0f}.file-row.selected[data-v-6016a221]{background:#6c8cff26;border-color:#6c8cff33}.file-row.is-directory .file-name[data-v-6016a221]{font-weight:500}.file-icon[data-v-6016a221]{flex-shrink:0;align-items:center;display:inline-flex}.file-name[data-v-6016a221]{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.88rem;overflow:hidden}.file-size[data-v-6016a221]{color:#8b91a8;white-space:nowrap;text-align:right;flex-shrink:0;width:70px;font-size:.78rem}.file-modified[data-v-6016a221]{color:#5a6180;white-space:nowrap;text-align:right;flex-shrink:0;width:120px;font-size:.76rem}.modal-footer[data-v-6016a221]{background:#222633;border-top:1px solid #2d3348;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.selected-info[data-v-6016a221]{font-size:.85rem}.no-selection[data-v-6016a221]{color:#5a6180}.has-selection[data-v-6016a221]{color:#6c8cff}.single-path[data-v-6016a221]{text-overflow:ellipsis;white-space:nowrap;max-width:420px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.82rem;display:block;overflow:hidden}.footer-actions[data-v-6016a221]{gap:10px;display:flex}.btn[data-v-6016a221]{cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;padding:8px 20px;font-size:.88rem;font-weight:600;transition:all .15s;display:inline-flex}.btn[data-v-6016a221]:disabled{opacity:.4;cursor:not-allowed}.btn-cancel[data-v-6016a221]{color:#c0c5d8;background:#2d3348}.btn-cancel[data-v-6016a221]:hover:not(:disabled){background:#3a4160}.btn-confirm[data-v-6016a221]{color:#fff;background:#6c8cff}.btn-confirm[data-v-6016a221]:hover:not(:disabled){background:#5a7af0}.mkdir-overlay[data-v-6016a221]{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:20;background:#0000008c;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.mkdir-dialog[data-v-6016a221]{background:#1e2230;border:1px solid #3a4160;border-radius:10px;flex-direction:column;width:420px;max-width:90%;display:flex;overflow:hidden;box-shadow:0 16px 40px #00000080}.mkdir-header[data-v-6016a221]{background:#222633;border-bottom:1px solid #2d3348;align-items:center;gap:8px;padding:14px 18px;display:flex}.mkdir-title[data-v-6016a221]{color:#e4e7ef;font-size:.95rem;font-weight:600}.mkdir-body[data-v-6016a221]{flex-direction:column;gap:6px;padding:16px 18px;display:flex}.mkdir-label[data-v-6016a221]{color:#8b91a8;margin-top:4px;font-size:.78rem}.mkdir-parent-path[data-v-6016a221]{color:#c0c5d8;text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;background:#2d3348;border:1px solid #3a4160;border-radius:6px;padding:6px 10px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.82rem;overflow:hidden}.mkdir-input[data-v-6016a221]{color:#e4e7ef;background:#2d3348;border:1px solid #3a4160;border-radius:6px;outline:none;padding:8px 10px;font-size:.9rem;transition:border-color .15s}.mkdir-input[data-v-6016a221]::placeholder{color:#5a6180}.mkdir-input[data-v-6016a221]:focus{border-color:#a78bfa}.mkdir-input.has-error[data-v-6016a221]{border-color:#f87171}.mkdir-error[data-v-6016a221]{color:#f87171;align-items:center;gap:4px;margin-top:4px;font-size:.78rem;display:flex}.mkdir-hint[data-v-6016a221]{color:#5a6180;margin-top:4px;font-size:.76rem}.mkdir-footer[data-v-6016a221]{background:#1a1d27;border-top:1px solid #2d3348;justify-content:flex-end;gap:10px;padding:12px 18px;display:flex}.modal-theme-light[data-v-6016a221]{background:#fff;border-color:#e2e8f0;box-shadow:0 20px 60px #00000026}.modal-theme-light .modal-header[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .modal-title[data-v-6016a221]{color:#1e293b}.modal-theme-light .close-btn[data-v-6016a221]{color:#64748b}.modal-theme-light .close-btn[data-v-6016a221]:hover{color:#ef4444;background:#ef444414}.modal-theme-light .toolbar[data-v-6016a221]{background:#f1f5f9;border-color:#e2e8f0}.modal-theme-light .tool-btn[data-v-6016a221]{color:#1e293b;background:#e2e8f0;border-color:#cbd5e1}.modal-theme-light .tool-btn[data-v-6016a221]:hover:not(:disabled){background:#cbd5e1}.modal-theme-light .address-bar[data-v-6016a221]{background:#fff;border-color:#cbd5e1}.modal-theme-light .address-bar[data-v-6016a221]:focus-within{border-color:#3b82f6}.modal-theme-light .address-bar.has-error[data-v-6016a221]{border-color:#ef4444}.modal-theme-light .address-bar-input[data-v-6016a221]{color:#1e293b}.modal-theme-light .address-bar-input[data-v-6016a221]::placeholder{color:#94a3b8}.modal-theme-light .address-bar-clear[data-v-6016a221]{color:#ef4444}.modal-theme-light .address-bar-clear[data-v-6016a221]:hover{background:#ef444414}.modal-theme-light .search-bar[data-v-6016a221]{background:#f1f5f9;border-color:#e2e8f0}.modal-theme-light .search-input[data-v-6016a221]{color:#1e293b;background:#fff;border-color:#cbd5e1}.modal-theme-light .search-input[data-v-6016a221]::placeholder{color:#94a3b8}.modal-theme-light .search-input[data-v-6016a221]:focus{border-color:#3b82f6}.modal-theme-light .toggle-label[data-v-6016a221]{color:#94a3b8}.modal-theme-light .toggle-switch[data-v-6016a221]{background:#e2e8f0;border-color:#cbd5e1}.modal-theme-light .toggle-switch.active[data-v-6016a221]{background:#3b82f6;border-color:#3b82f6}.modal-theme-light .toggle-knob[data-v-6016a221]{background:#94a3b8}.modal-theme-light .sidebar[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .sidebar-section[data-v-6016a221]{border-color:#e2e8f0}.modal-theme-light .sidebar-title[data-v-6016a221]{color:#94a3b8}.modal-theme-light .sidebar-item[data-v-6016a221]{color:#475569}.modal-theme-light .sidebar-item[data-v-6016a221]:hover{color:#3b82f6;background:#3b82f60f}.modal-theme-light .sidebar-item.active[data-v-6016a221]{color:#3b82f6;background:#3b82f61a}.modal-theme-light .file-list-container[data-v-6016a221]{background:#fff}.modal-theme-light .file-row[data-v-6016a221]{color:#1e293b;border-color:#e2e8f099}.modal-theme-light .file-row[data-v-6016a221]:hover{background:#3b82f60d}.modal-theme-light .file-row.selected[data-v-6016a221]{background:#3b82f61a;border-color:#3b82f633}.modal-theme-light .file-row.is-directory .file-name[data-v-6016a221]{color:#0f172a}.modal-theme-light .file-size[data-v-6016a221]{color:#64748b}.modal-theme-light .file-modified[data-v-6016a221]{color:#94a3b8}.modal-theme-light .file-path-hint[data-v-6016a221]{color:#64748b}.modal-theme-light .file-parent-path[data-v-6016a221]{color:#94a3b8}.modal-theme-light .select-current-dir[data-v-6016a221]{background:#8b5cf60d;border-color:#8b5cf61a}.modal-theme-light .select-current-dir[data-v-6016a221]:hover{background:#8b5cf61a}.modal-theme-light .select-current-dir.selected[data-v-6016a221]{background:#8b5cf626}.modal-theme-light .search-results-info[data-v-6016a221]{color:#64748b;background:#3b82f608;border-color:#e2e8f0}.modal-theme-light .loading-state[data-v-6016a221],.modal-theme-light .empty-state[data-v-6016a221]{color:#64748b}.modal-theme-light .error-state[data-v-6016a221]{color:#ef4444}.modal-theme-light .modal-footer[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .no-selection[data-v-6016a221]{color:#94a3b8}.modal-theme-light .has-selection[data-v-6016a221]{color:#3b82f6}.modal-theme-light .btn-cancel[data-v-6016a221]{color:#475569;background:#e2e8f0}.modal-theme-light .btn-cancel[data-v-6016a221]:hover:not(:disabled){background:#cbd5e1}.modal-theme-light .btn-confirm[data-v-6016a221]{background:#3b82f6}.modal-theme-light .btn-confirm[data-v-6016a221]:hover:not(:disabled){background:#2563eb}.modal-theme-light.mkdir-dialog[data-v-6016a221],.mkdir-dialog.modal-theme-light[data-v-6016a221]{background:#fff;border-color:#cbd5e1;box-shadow:0 16px 40px #00000026}.modal-theme-light .mkdir-header[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .mkdir-title[data-v-6016a221]{color:#1e293b}.modal-theme-light .mkdir-label[data-v-6016a221]{color:#64748b}.modal-theme-light .mkdir-parent-path[data-v-6016a221]{color:#1e293b;background:#f1f5f9;border-color:#cbd5e1}.modal-theme-light .mkdir-input[data-v-6016a221]{color:#1e293b;background:#fff;border-color:#cbd5e1}.modal-theme-light .mkdir-input[data-v-6016a221]:focus{border-color:#8b5cf6}.modal-theme-light .mkdir-footer[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}:root,[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--acu-bg:#fff;--acu-surface:#f7f7f8;--acu-surface-2:#ededf0;--acu-surface-hover:#f0f0f3;--acu-text:#18181b;--acu-text-secondary:#52525b;--acu-text-muted:#a1a1aa;--acu-border:#e7e7ea;--acu-border-strong:#d4d4d8;--acu-primary:#6366f1;--acu-primary-hover:#5457e5;--acu-primary-active:#4f46e5;--acu-primary-contrast:#fff;--acu-primary-soft:#6366f117;--acu-primary-soft-hover:#6366f124;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#f7f7f8;--acu-bubble-assistant-text:#18181b;--acu-thinking-bg:#fafafa;--acu-thinking-text:#71717a;--acu-thinking-border:#ececef;--acu-thinking-icon:#a1a1aa;--acu-code-bg:#f6f8fa;--acu-code-text:#24292f;--acu-code-border:#e4e4e7;--acu-code-inline-bg:#afb8c133;--acu-code-header-bg:#eceef1;--acu-error:#ef4444;--acu-error-soft:#ef44441a;--acu-success:#10b981;--acu-warning:#f59e0b;--acu-shadow-sm:0 1px 2px #18181b0d;--acu-shadow:0 4px 16px #18181b14;--acu-shadow-lg:0 12px 32px #18181b1f;--acu-radius-xs:4px;--acu-radius-sm:8px;--acu-radius:12px;--acu-radius-lg:16px;--acu-radius-xl:20px;--acu-radius-full:9999px;--acu-space-1:4px;--acu-space-2:8px;--acu-space-3:12px;--acu-space-4:16px;--acu-space-5:20px;--acu-space-6:24px;--acu-space-8:32px;--acu-font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;--acu-font-mono:"SFMono-Regular", "JetBrains Mono", Menlo, Consolas, "Liberation Mono", monospace;--acu-font-size-xs:12px;--acu-font-size-sm:13px;--acu-font-size-base:14px;--acu-font-size-md:15px;--acu-font-size-lg:16px;--acu-font-size-xl:18px;--acu-line-height:1.65;--acu-duration-fast:.12s;--acu-duration:.2s;--acu-easing:cubic-bezier(.4, 0, .2, 1);--acu-max-width:768px;--acu-avatar-size:32px}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--acu-bg:#18181b;--acu-surface:#27272a;--acu-surface-2:#34343a;--acu-surface-hover:#2f2f35;--acu-text:#f4f4f5;--acu-text-secondary:#a1a1aa;--acu-text-muted:#71717a;--acu-border:#323236;--acu-border-strong:#52525b;--acu-primary:#818cf8;--acu-primary-hover:#6366f1;--acu-primary-active:#5457e5;--acu-primary-contrast:#18181b;--acu-primary-soft:#818cf824;--acu-primary-soft-hover:#818cf838;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#27272a;--acu-bubble-assistant-text:#f4f4f5;--acu-thinking-bg:#1f1f23;--acu-thinking-text:#a1a1aa;--acu-thinking-border:#2e2e33;--acu-thinking-icon:#71717a;--acu-code-bg:#0d1117;--acu-code-text:#e6edf3;--acu-code-border:#30363d;--acu-code-inline-bg:#6e768166;--acu-code-header-bg:#161b22;--acu-error:#f87171;--acu-error-soft:#f8717124;--acu-success:#34d399;--acu-warning:#fbbf24;--acu-shadow-sm:0 1px 2px #0000004d;--acu-shadow:0 4px 16px #0006;--acu-shadow-lg:0 12px 32px #00000080}.acu-root,.acu-root *,.acu-root :before,.acu-root :after{box-sizing:border-box}.acu-root{font-family:var(--acu-font-sans);font-size:var(--acu-font-size-base);line-height:var(--acu-line-height);color:var(--acu-text);background:var(--acu-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility}.acu-root a{color:var(--acu-primary);text-decoration:none}.acu-root a:hover{text-decoration:underline}.acu-transition{transition:all var(--acu-duration) var(--acu-easing)}.acu-cursor{vertical-align:text-bottom;background:var(--acu-primary);border-radius:1px;width:7px;height:1.05em;margin-left:2px;animation:1s steps(2,start) infinite acu-blink;display:inline-block}@keyframes acu-blink{to{opacity:0}}.acu-typing-dots{align-items:center;gap:4px;display:inline-flex}.acu-typing-dots span{background:var(--acu-thinking-icon);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite both acu-bounce}.acu-typing-dots span:first-child{animation-delay:-.32s}.acu-typing-dots span:nth-child(2){animation-delay:-.16s}@keyframes acu-bounce{0%,80%,to{opacity:.5;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@keyframes acu-pulse{0%,to{opacity:.55}50%{opacity:1}}.acu-thinking{margin-bottom:var(--acu-space-3);border:1px solid var(--acu-thinking-border);border-radius:var(--acu-radius);background:var(--acu-thinking-bg);overflow:hidden}.acu-thinking.is-streaming{border-color:var(--acu-primary-soft)}.acu-thinking-header{align-items:center;gap:var(--acu-space-2);width:100%;padding:var(--acu-space-2) var(--acu-space-3);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);cursor:pointer;transition:background-color var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;font-family:inherit;display:flex}.acu-thinking-header:hover{background:var(--acu-surface-hover)}.acu-thinking-icon{color:var(--acu-thinking-icon);flex-shrink:0;display:inline-flex}.is-streaming .acu-thinking-icon{color:var(--acu-primary);animation:acu-pulse 2s var(--acu-easing) infinite}.acu-thinking-title{letter-spacing:.01em;font-weight:500}.acu-thinking-chevron{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-thinking-chevron.is-open{transform:rotate(180deg)}.acu-thinking-body{padding:0 var(--acu-space-3) var(--acu-space-3);border-top:1px dashed var(--acu-thinking-border);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);line-height:1.7}.acu-thinking-md .acu-thinking-body{padding-top:var(--acu-space-2);border-top:none}@media (prefers-reduced-motion:reduce){.acu-root *{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.acu-md{font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);color:var(--acu-bubble-assistant-text);word-wrap:break-word;overflow-wrap:anywhere}.acu-md>:first-child{margin-top:0}.acu-md>:last-child{margin-bottom:0}.acu-md p{margin:0 0 var(--acu-space-3)}.acu-md h1,.acu-md h2,.acu-md h3,.acu-md h4,.acu-md h5,.acu-md h6{margin:var(--acu-space-6) 0 var(--acu-space-3);font-weight:650;line-height:1.3}.acu-md h1{font-size:1.5em}.acu-md h2{font-size:1.32em}.acu-md h3{font-size:1.18em}.acu-md h4{font-size:1.06em}.acu-md ul,.acu-md ol{margin:0 0 var(--acu-space-3);padding-left:1.5em}.acu-md li{margin:var(--acu-space-1) 0}.acu-md li::marker{color:var(--acu-text-muted)}.acu-md ul ul,.acu-md ol ol,.acu-md ul ol,.acu-md ol ul{margin:var(--acu-space-1) 0}.acu-md li.task-list-item{margin-left:-1.4em;list-style:none}.acu-md a{color:var(--acu-primary);border-bottom:1px solid var(--acu-primary-soft);transition:border-color var(--acu-duration) var(--acu-easing);text-decoration:none}.acu-md a:hover{border-bottom-color:var(--acu-primary)}.acu-md strong{font-weight:650}.acu-md em{font-style:italic}.acu-md del{color:var(--acu-text-muted)}.acu-md hr{margin:var(--acu-space-5) 0;border:none;border-top:1px solid var(--acu-border)}.acu-md blockquote{margin:0 0 var(--acu-space-3);padding:var(--acu-space-1) var(--acu-space-4);border-left:3px solid var(--acu-primary);background:var(--acu-primary-soft);border-radius:0 var(--acu-radius-sm) var(--acu-radius-sm) 0;color:var(--acu-text-secondary)}.acu-md blockquote>:last-child{margin-bottom:0}.acu-md code:not(pre code){font-family:var(--acu-font-mono);background:var(--acu-code-inline-bg);color:var(--acu-text);border-radius:var(--acu-radius-xs);margin:0 .1em;padding:.15em .4em;font-size:.88em}.acu-md table{width:100%;margin:0 0 var(--acu-space-3);border-collapse:collapse;border-radius:var(--acu-radius-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;font-size:.95em;display:block;overflow:auto hidden}.acu-md table::-webkit-scrollbar{width:6px;height:6px}.acu-md table::-webkit-scrollbar-track{background:0 0}.acu-md table::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-md table::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md th,.acu-md td{padding:var(--acu-space-2) var(--acu-space-3);border:1px solid var(--acu-border);text-align:left}.acu-md th{background:var(--acu-surface);font-weight:600}.acu-md tbody tr:nth-child(2n){background:var(--acu-surface)}.acu-md img.acu-md-img{border-radius:var(--acu-radius-sm);vertical-align:middle;max-width:100%}.acu-md .acu-code-block{margin:0 0 var(--acu-space-3);border:1px solid var(--acu-code-border);border-radius:var(--acu-radius);background:var(--acu-code-bg);overflow:hidden}.acu-md .acu-code-header{padding:0 var(--acu-space-3);background:var(--acu-code-header-bg);border-bottom:1px solid var(--acu-code-border);justify-content:space-between;align-items:center;height:34px;display:flex}.acu-md .acu-code-lang{font-family:var(--acu-font-mono);font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);text-transform:lowercase;letter-spacing:.02em}.acu-md .acu-code-copy{color:var(--acu-text-muted);font-size:var(--acu-font-size-xs);border-radius:var(--acu-radius-xs);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;align-items:center;gap:4px;padding:3px 8px;font-family:inherit;display:inline-flex}.acu-md .acu-code-copy svg{display:block}.acu-md .acu-code-copy:hover{background:var(--acu-surface-2);color:var(--acu-text)}.acu-md .acu-code-copy.is-copied{color:var(--acu-success)}.acu-md .acu-code-copy.is-error{color:var(--acu-error)}.acu-md .shiki{padding:var(--acu-space-4);font-family:var(--acu-font-mono);font-size:var(--acu-font-size-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;margin:0;line-height:1.6;overflow-x:auto;background:var(--acu-code-bg)!important}.acu-md .shiki::-webkit-scrollbar{width:8px;height:8px}.acu-md .shiki::-webkit-scrollbar-track{background:0 0}.acu-md .shiki::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:4px}.acu-md .shiki::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md .shiki code{background:0 0;padding:0;font-family:inherit}.acu-md .shiki,.acu-md .shiki span{color:var(--shiki-light,inherit);font-style:var(--shiki-light-font-style,normal);font-weight:var(--shiki-light-font-weight,normal);-webkit-text-decoration:var(--shiki-light-text-decoration,none);text-decoration:var(--shiki-light-text-decoration,none)}[data-theme=dark] .acu-md .shiki,[data-theme=dark] .acu-md .shiki span{color:var(--shiki-dark,inherit);font-style:var(--shiki-dark-font-style,normal);font-weight:var(--shiki-dark-font-weight,normal);-webkit-text-decoration:var(--shiki-dark-text-decoration,none);text-decoration:var(--shiki-dark-text-decoration,none)}.acu-md .acu-code-fallback{color:var(--acu-code-text)}.acu-thinking-header[data-v-a3ba3b3c]{outline:none}.acu-thinking-header[data-v-a3ba3b3c]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-collapse-enter-active[data-v-a3ba3b3c],.acu-collapse-leave-active[data-v-a3ba3b3c]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-collapse-enter-from[data-v-a3ba3b3c],.acu-collapse-leave-to[data-v-a3ba3b3c]{opacity:0;transform:translateY(-4px)}.acu-thinking-body[data-v-a3ba3b3c] .acu-md{font-size:var(--acu-font-size-sm);color:var(--acu-thinking-text);opacity:.92}.acu-thinking-body[data-v-a3ba3b3c] .acu-md p{margin-bottom:var(--acu-space-2)}.acu-toolcall[data-v-58c008b5]{border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);margin:var(--acu-space-1) 0;background:var(--acu-surface);overflow:hidden}.acu-toolcall-header[data-v-58c008b5]{align-items:center;gap:var(--acu-space-2);cursor:pointer;width:100%;font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);transition:background var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;padding:6px 10px;display:flex}.acu-toolcall-header[data-v-58c008b5]:hover{background:var(--acu-surface-2)}.acu-toolcall-status[data-v-58c008b5]{flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.acu-toolcall-status.is-running[data-v-58c008b5]{color:var(--acu-primary)}.acu-toolcall-status.is-done[data-v-58c008b5]{color:var(--acu-success)}.acu-toolcall-status.is-error[data-v-58c008b5]{color:var(--acu-error)}.acu-toolcall-status.is-pending[data-v-58c008b5]{color:var(--acu-text-muted)}.acu-toolcall-icon[data-v-58c008b5]{color:var(--acu-text-muted);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-toolcall-name[data-v-58c008b5]{color:var(--acu-text);flex-shrink:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;font-weight:600}.acu-toolcall-args[data-v-58c008b5]{color:var(--acu-text-muted);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;overflow:hidden}.acu-toolcall-chevron[data-v-58c008b5]{color:var(--acu-text-muted);transition:transform var(--acu-duration-fast) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-toolcall-chevron.expanded[data-v-58c008b5]{transform:rotate(180deg)}.acu-toolcall-body[data-v-58c008b5]{border-top:1px solid var(--acu-border);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface-2)}.acu-toolcall-section+.acu-toolcall-section[data-v-58c008b5]{margin-top:var(--acu-space-2)}.acu-toolcall-section-label[data-v-58c008b5]{color:var(--acu-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px;font-size:11px}.acu-toolcall-pre[data-v-58c008b5]{background:var(--acu-surface);border-radius:var(--acu-radius-xs);white-space:pre-wrap;word-break:break-all;max-height:300px;color:var(--acu-text);margin:0;padding:8px 10px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;line-height:1.5;overflow-y:auto}.acu-toolcall-pre.is-error[data-v-58c008b5]{color:var(--acu-error)}.acu-toolcall-slide-enter-active[data-v-58c008b5],.acu-toolcall-slide-leave-active[data-v-58c008b5]{transition:all var(--acu-duration-fast) var(--acu-easing);overflow:hidden}.acu-toolcall-slide-enter-from[data-v-58c008b5],.acu-toolcall-slide-leave-to[data-v-58c008b5]{opacity:0;max-height:0;padding-top:0;padding-bottom:0}.acu-spin[data-v-58c008b5]{animation:.8s linear infinite acu-spin-58c008b5}@keyframes acu-spin-58c008b5{to{transform:rotate(360deg)}}.acu-bubble-row[data-v-02d94e76]{gap:var(--acu-space-3);align-items:flex-start;display:flex}.acu-bubble-row.is-user[data-v-02d94e76]{justify-content:flex-end}.acu-avatar[data-v-02d94e76]{width:var(--acu-avatar-size);height:var(--acu-avatar-size);border-radius:var(--acu-radius-full);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.acu-avatar img[data-v-02d94e76]{object-fit:cover;width:100%;height:100%}.acu-avatar--left[data-v-02d94e76]{background:var(--acu-surface-2);color:var(--acu-text-secondary)}.acu-avatar--right[data-v-02d94e76]{background:var(--acu-primary-soft);color:var(--acu-primary)}.acu-bubble-main[data-v-02d94e76]{flex-direction:column;min-width:0;max-width:min(680px,78%);display:flex}.is-user .acu-bubble-main[data-v-02d94e76]{align-items:flex-end}.acu-bubble-name[data-v-02d94e76]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-1);padding-left:2px}.acu-bubble[data-v-02d94e76]{padding:var(--acu-space-3) var(--acu-space-4);border-radius:var(--acu-radius-lg);font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);word-break:break-word;max-width:100%;position:relative}.acu-bubble.is-assistant[data-v-02d94e76]{background:var(--acu-bubble-assistant-bg);color:var(--acu-bubble-assistant-text);border-top-left-radius:var(--acu-radius-xs)}.acu-bubble.is-user[data-v-02d94e76]{background:var(--acu-bubble-user-bg);color:var(--acu-bubble-user-text);border-top-right-radius:var(--acu-radius-xs)}.acu-bubble-content[data-v-02d94e76] .acu-md{color:inherit;font-size:var(--acu-font-size-md)}.acu-bubble-toolcalls[data-v-02d94e76]{margin-bottom:var(--acu-space-2)}.acu-attachments[data-v-02d94e76]{gap:var(--acu-space-2);margin-bottom:var(--acu-space-2);flex-wrap:wrap;display:flex}.acu-attachments.is-user[data-v-02d94e76]{justify-content:flex-end}.acu-att-thumb[data-v-02d94e76]{border-radius:var(--acu-radius);border:1px solid var(--acu-border);background:var(--acu-surface);width:88px;height:88px;overflow:hidden}.acu-att-thumb img[data-v-02d94e76]{object-fit:cover;width:100%;height:100%}.acu-att-file[data-v-02d94e76]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);max-width:220px;display:inline-flex}.acu-att-file-icon[data-v-02d94e76]{color:var(--acu-text-muted);flex-shrink:0}.acu-att-file-info[data-v-02d94e76]{flex-direction:column;min-width:0;display:flex}.acu-att-file-name[data-v-02d94e76]{font-size:var(--acu-font-size-sm);color:var(--acu-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-att-file-size[data-v-02d94e76]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted)}.acu-pending[data-v-02d94e76]{padding:var(--acu-space-1) 0}.acu-bubble-error[data-v-02d94e76]{align-items:center;gap:var(--acu-space-2);margin-top:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-error-soft);color:var(--acu-error);border-radius:var(--acu-radius-sm);font-size:var(--acu-font-size-sm);display:flex}.acu-retry-btn[data-v-02d94e76]{color:inherit;border-radius:var(--acu-radius-xs);font-size:var(--acu-font-size-xs);cursor:pointer;transition:opacity var(--acu-duration-fast) var(--acu-easing);background:0 0;border:1px solid;margin-left:auto;padding:2px 10px;font-family:inherit}.acu-retry-btn[data-v-02d94e76]:hover{opacity:.75}.acu-followup[data-v-09c2fd06]{padding-left:calc(var(--acu-avatar-size) + var(--acu-space-3));margin-top:var(--acu-space-3);margin-bottom:var(--acu-space-2);width:fit-content;max-width:min(680px,78%);animation:acu-followup-in-09c2fd06 .28s var(--acu-easing) both;align-self:flex-start}.acu-followup-title[data-v-09c2fd06]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-2);letter-spacing:.02em}.acu-followup-loading[data-v-09c2fd06]{align-items:center;gap:4px;display:inline-flex}.acu-followup-dot[data-v-09c2fd06]{background:var(--acu-primary);border-radius:50%;width:4px;height:4px;animation:1.2s ease-in-out infinite both acu-followup-bounce-09c2fd06}.acu-followup-dot[data-v-09c2fd06]:first-child{animation-delay:-.32s}.acu-followup-dot[data-v-09c2fd06]:nth-child(2){animation-delay:-.16s}.acu-followup-list[data-v-09c2fd06]{align-items:flex-start;gap:var(--acu-space-2);flex-direction:column;width:fit-content;max-width:100%;display:flex}.acu-followup-item[data-v-09c2fd06]{align-items:center;gap:var(--acu-space-3);font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;text-align:left;width:auto;max-width:100%;transition:all var(--acu-duration) var(--acu-easing);outline:none;padding:10px 14px;display:inline-flex}.acu-followup-item[data-v-09c2fd06]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-followup-item[data-v-09c2fd06]:hover{color:var(--acu-primary);background:var(--acu-primary-soft);border-color:var(--acu-primary)}.acu-followup-item:hover .acu-followup-item-arrow[data-v-09c2fd06]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-followup-item[data-v-09c2fd06]:active{transform:translateY(.5px)}.acu-followup-item-label[data-v-09c2fd06]{white-space:nowrap;text-overflow:ellipsis;max-width:540px;overflow:hidden}.acu-followup-item-arrow[data-v-09c2fd06]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0}@keyframes acu-followup-in-09c2fd06{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes acu-followup-bounce-09c2fd06{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.acu-followup[data-v-09c2fd06]{animation:none}}.acu-message-list[data-v-4468091b]{scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;flex:1;min-height:0;position:relative;overflow:hidden auto}.acu-message-list[data-v-4468091b]::-webkit-scrollbar{width:6px;height:6px}.acu-message-list[data-v-4468091b]::-webkit-scrollbar-track{background:0 0}.acu-message-list[data-v-4468091b]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-message-list[data-v-4468091b]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-message-list[data-v-4468091b]{scroll-behavior:auto}.acu-message-list-inner[data-v-4468091b]{gap:var(--acu-space-5);max-width:var(--acu-max-width);width:100%;padding:var(--acu-space-5) var(--acu-space-4) var(--acu-space-6);flex-direction:column;margin:0 auto;display:flex}.acu-scroll-btn[data-v-4468091b]{bottom:var(--acu-space-3);border:1px solid var(--acu-border);background:var(--acu-bg);width:36px;height:36px;color:var(--acu-text-secondary);border-radius:var(--acu-radius-full);cursor:pointer;box-shadow:var(--acu-shadow);transition:all var(--acu-duration) var(--acu-easing);z-index:2;justify-content:center;align-items:center;margin:0 auto;display:inline-flex;position:sticky;left:50%;transform:translate(-50%)}.acu-scroll-btn[data-v-4468091b]:hover{color:var(--acu-primary);border-color:var(--acu-primary)}.acu-fade-enter-active[data-v-4468091b],.acu-fade-leave-active[data-v-4468091b]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-fade-enter-from[data-v-4468091b],.acu-fade-leave-to[data-v-4468091b]{opacity:0;transform:translate(-50%,6px)}.acu-welcome[data-v-4ea55375]{padding:var(--acu-space-8) var(--acu-space-4);flex:1;justify-content:center;align-items:center;min-height:0;display:flex}.acu-welcome-inner[data-v-4ea55375]{text-align:center;flex-direction:column;align-items:center;width:100%;max-width:640px;display:flex}.acu-welcome-logo[data-v-4ea55375]{border-radius:var(--acu-radius-lg);background:linear-gradient(135deg,var(--acu-primary-soft),var(--acu-surface));width:56px;height:56px;color:var(--acu-primary);margin-bottom:var(--acu-space-5);box-shadow:var(--acu-shadow-sm);justify-content:center;align-items:center;display:inline-flex}.acu-welcome-title[data-v-4ea55375]{color:var(--acu-text);margin:0 0 var(--acu-space-2);letter-spacing:-.01em;font-size:22px;font-weight:650}.acu-welcome-desc[data-v-4ea55375]{font-size:var(--acu-font-size-md);color:var(--acu-text-secondary);margin:0 0 var(--acu-space-6);max-width:440px}.acu-welcome-grid[data-v-4ea55375]{gap:var(--acu-space-3);grid-template-columns:repeat(2,1fr);width:100%;display:grid}@media (width<=560px){.acu-welcome-grid[data-v-4ea55375]{grid-template-columns:1fr}}.acu-preset-q[data-v-4ea55375]{justify-content:space-between;align-items:flex-start;gap:var(--acu-space-3);padding:var(--acu-space-4);text-align:left;background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;transition:all var(--acu-duration) var(--acu-easing);outline:none;font-family:inherit;display:flex}.acu-preset-q[data-v-4ea55375]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-preset-q[data-v-4ea55375]:hover{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:var(--acu-shadow-sm);transform:translateY(-1px)}.acu-preset-q:hover .acu-preset-q-arrow[data-v-4ea55375]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-preset-q-body[data-v-4ea55375]{flex-direction:column;gap:2px;min-width:0;display:flex}.acu-preset-q-label[data-v-4ea55375]{font-size:var(--acu-font-size-md);color:var(--acu-text);font-weight:550}.acu-preset-q-prompt[data-v-4ea55375]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.acu-preset-q-arrow[data-v-4ea55375]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-top:2px}.acu-input-wrap[data-v-1e944ec7]{max-width:var(--acu-max-width);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-lg);width:100%;padding:var(--acu-space-2);transition:border-color var(--acu-duration) var(--acu-easing),box-shadow var(--acu-duration) var(--acu-easing),background-color var(--acu-duration) var(--acu-easing);margin:0 auto;position:relative}.acu-input-wrap[data-v-1e944ec7]:focus-within{border-color:var(--acu-primary);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-dragging[data-v-1e944ec7]{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-disabled[data-v-1e944ec7]{opacity:.6;pointer-events:none}.acu-input-drop-hint[data-v-1e944ec7]{justify-content:center;align-items:center;gap:var(--acu-space-2);color:var(--acu-primary);font-size:var(--acu-font-size-sm);pointer-events:none;z-index:1;flex-direction:column;font-weight:500;display:flex;position:absolute;inset:0}.acu-input-attachments[data-v-1e944ec7]{gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-2) 0;flex-wrap:wrap;display:flex}.acu-input-att[data-v-1e944ec7]{display:inline-flex;position:relative}.acu-input-att-thumb[data-v-1e944ec7]{border-radius:var(--acu-radius-sm);border:1px solid var(--acu-border);width:56px;height:56px;overflow:hidden}.acu-input-att-thumb img[data-v-1e944ec7]{object-fit:cover;width:100%;height:100%}.acu-input-att-file[data-v-1e944ec7]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);color:var(--acu-text-secondary);max-width:180px;display:inline-flex}.acu-input-att-name[data-v-1e944ec7]{font-size:var(--acu-font-size-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-input-att-remove[data-v-1e944ec7]{border-radius:var(--acu-radius-full);background:var(--acu-text);width:18px;height:18px;color:var(--acu-bg);cursor:pointer;box-shadow:var(--acu-shadow-sm);transition:transform var(--acu-duration-fast) var(--acu-easing);border:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:-6px;right:-6px}.acu-input-att-remove[data-v-1e944ec7]:hover{transform:scale(1.12)}.acu-input-row[data-v-1e944ec7]{align-items:flex-end;gap:var(--acu-space-2);padding:var(--acu-space-1) var(--acu-space-1) 0;display:flex}.acu-input-icon-btn[data-v-1e944ec7]{width:36px;height:36px;color:var(--acu-text-muted);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-icon-btn[data-v-1e944ec7]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-icon-btn[data-v-1e944ec7]:hover:not(:disabled){background:var(--acu-surface-2);color:var(--acu-text)}.acu-input-file[data-v-1e944ec7]{display:none}.acu-input-textarea[data-v-1e944ec7]{resize:none;min-height:36px;max-height:200px;font-family:inherit;font-size:var(--acu-font-size-md);color:var(--acu-text);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;background:0 0;border:none;outline:none;flex:1;padding:8px 4px;line-height:1.5}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar{width:4px;height:4px}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-track{background:0 0}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:2px}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-input-textarea[data-v-1e944ec7]::placeholder{color:var(--acu-text-muted)}.acu-input-textarea[data-v-1e944ec7]:disabled{cursor:not-allowed}.acu-input-send[data-v-1e944ec7]{background:var(--acu-primary);width:36px;height:36px;color:var(--acu-primary-contrast);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-send[data-v-1e944ec7]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-send[data-v-1e944ec7]:hover:not(:disabled){background:var(--acu-primary-hover)}.acu-input-send[data-v-1e944ec7]:active:not(:disabled){background:var(--acu-primary-active)}.acu-input-send[data-v-1e944ec7]:disabled{background:var(--acu-surface-2);color:var(--acu-text-muted);cursor:not-allowed}.acu-chat[data-v-4a9f5e51]{background:var(--acu-bg);flex-direction:column;height:100%;min-height:0;display:flex}.acu-chat-body[data-v-4a9f5e51]{flex-direction:column;flex:1;min-height:0;display:flex}.acu-chat-footer[data-v-4a9f5e51]{padding:var(--acu-space-3) var(--acu-space-4) var(--acu-space-4);background:linear-gradient(to top,var(--acu-bg) 70%,transparent);flex-shrink:0}
1
+ .svg-icon[data-v-f85b4ad8]{vertical-align:middle;flex-shrink:0;display:inline-block}.form-wrap[data-v-857572e3]{flex-direction:column;gap:18px;width:100%;display:flex}.field[data-v-857572e3]{flex-direction:column;gap:6px;display:flex}.field-label[data-v-857572e3]{color:var(--text);align-items:center;gap:4px;font-size:13px;font-weight:500;display:flex}.required[data-v-857572e3]{color:var(--error);font-size:12px}.input-wrap[data-v-857572e3]{align-items:center;display:flex;position:relative}.field-icon[data-v-857572e3]{pointer-events:none;flex-shrink:0;position:absolute;left:10px}.text-input[data-v-857572e3]{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);width:100%;height:38px;color:var(--text);font-family:var(--font);transition:border-color var(--t),box-shadow var(--t);outline:none;padding:0 36px 0 34px;font-size:13.5px}.text-input[data-v-857572e3]::placeholder{color:var(--text-muted)}.text-input[data-v-857572e3]:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--primary-dim)}.eye-btn[data-v-857572e3]{cursor:pointer;color:var(--text-dim);transition:color var(--t);background:0 0;border:none;border-radius:4px;align-items:center;padding:4px;display:flex;position:absolute;right:8px}.eye-btn[data-v-857572e3]:hover{color:var(--text)}.combobox[data-v-857572e3]{position:relative}.combo-input-row[data-v-857572e3]{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);transition:border-color var(--t),box-shadow var(--t);align-items:center;display:flex}.combobox.open .combo-input-row[data-v-857572e3],.combo-input-row[data-v-857572e3]:focus-within{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--primary-dim)}.combobox.error .combo-input-row[data-v-857572e3]{border-color:var(--error)}.combo-input[data-v-857572e3]{height:38px;color:var(--text);font-family:var(--font);background:0 0;border:none;outline:none;flex:1;padding:0 4px 0 34px;font-size:13.5px}.combo-input[data-v-857572e3]::placeholder{color:var(--text-muted)}.combo-arrow[data-v-857572e3]{cursor:pointer;height:38px;color:var(--text-dim);transition:color var(--t);border-radius:0 var(--radius) var(--radius) 0;background:0 0;border:none;align-items:center;padding:0 10px;display:flex}.combo-arrow[data-v-857572e3]:hover{color:var(--text)}.combo-clear[data-v-857572e3]{cursor:pointer;height:38px;color:var(--text-dim);transition:color var(--t);background:0 0;border:none;flex-shrink:0;align-items:center;padding:0 6px;display:flex}.combo-clear[data-v-857572e3]:hover{color:var(--text)}.text-input.has-two-right[data-v-857572e3]{padding-right:68px}.dropdown[data-v-857572e3]{z-index:200;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius);max-height:220px;padding:4px;position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto;box-shadow:0 8px 24px #00000073}.dropdown-item[data-v-857572e3]{cursor:pointer;text-align:left;width:100%;transition:background var(--t);background:0 0;border:none;border-radius:6px;grid-template-columns:1fr auto auto;align-items:center;gap:8px;padding:8px 10px;display:grid}.dropdown-item.has-logo[data-v-857572e3]{grid-template-columns:20px 1fr auto auto}.dropdown-item[data-v-857572e3]:hover{background:var(--bg-surface)}.dropdown-item.active[data-v-857572e3]{background:var(--primary-dim)}.item-label[data-v-857572e3]{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.item-url[data-v-857572e3]{color:var(--text-dim);white-space:nowrap;text-overflow:ellipsis;font-size:11.5px;overflow:hidden}.item-check[data-v-857572e3]{flex-shrink:0}.item-logo[data-v-857572e3]{object-fit:contain;border-radius:3px;flex-shrink:0;width:16px;height:16px}.provider-logo[data-v-857572e3]{object-fit:contain;pointer-events:none;width:15px;height:15px}.dropdown-loading[data-v-857572e3]{color:var(--text-dim);align-items:center;gap:8px;padding:10px 12px;font-size:13px;display:flex}.field-error[data-v-857572e3]{color:var(--error);align-items:center;gap:5px;font-size:12px;display:flex}.test-banner[data-v-857572e3]{border-radius:var(--radius);align-items:center;gap:8px;padding:10px 14px;font-size:13px;font-weight:500;display:flex}.test-banner.ok[data-v-857572e3]{background:var(--success-dim);color:var(--success);border:1px solid #10b98140}.test-banner.fail[data-v-857572e3]{background:var(--error-dim);color:var(--error);border:1px solid #ef444440}.actions[data-v-857572e3]{justify-content:space-between;align-items:center;gap:10px;padding-top:4px;display:flex}.actions-right[data-v-857572e3]{gap:10px;display:flex}.btn[data-v-857572e3]{border-radius:var(--radius);height:36px;font-family:var(--font);cursor:pointer;transition:background var(--t),border-color var(--t),opacity var(--t),box-shadow var(--t);white-space:nowrap;border:1px solid #0000;align-items:center;gap:6px;padding:0 16px;font-size:13px;font-weight:500;display:inline-flex}.btn[data-v-857572e3]:disabled{opacity:.5;cursor:not-allowed}.btn-ghost[data-v-857572e3]{color:var(--text-dim);background:0 0;border-color:#0000}.btn-ghost[data-v-857572e3]:hover:not(:disabled){color:var(--text);background:var(--bg-elevated)}.btn-outline[data-v-857572e3]{color:var(--text);border-color:var(--border);background:0 0}.btn-outline[data-v-857572e3]:hover:not(:disabled){border-color:var(--border-focus);background:var(--primary-dim);color:var(--primary)}.btn-primary[data-v-857572e3]{background:var(--primary);color:#fff;border-color:var(--primary)}.btn-primary[data-v-857572e3]:hover:not(:disabled){background:var(--primary-hover);border-color:var(--primary-hover);box-shadow:0 0 0 3px var(--primary-dim)}.banner-enter-active[data-v-857572e3],.banner-leave-active[data-v-857572e3]{transition:opacity .2s,transform .2s}.banner-enter-from[data-v-857572e3],.banner-leave-to[data-v-857572e3]{opacity:0;transform:translateY(-4px)}@keyframes spin-857572e3{to{transform:rotate(360deg)}}.spin[data-v-857572e3]{animation:.8s linear infinite spin-857572e3}.svg-icon[data-v-5461fefd]{vertical-align:middle;flex-shrink:0;display:inline-block}.modal-overlay[data-v-6016a221]{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-container[data-v-6016a221]{background:#1a1d27;border:1px solid #2d3348;border-radius:12px;flex-direction:column;width:860px;max-width:95vw;height:600px;max-height:85vh;display:flex;overflow:hidden;box-shadow:0 20px 60px #00000080}.modal-header[data-v-6016a221]{background:#222633;border-bottom:1px solid #2d3348;justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.modal-title[data-v-6016a221]{color:#e4e7ef;align-items:center;gap:8px;margin:0;font-size:1rem;font-weight:600;display:flex}.close-btn[data-v-6016a221]{color:#8b91a8;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px 8px;transition:all .15s;display:inline-flex}.close-btn[data-v-6016a221]:hover{color:#f87171;background:#f871711a}.toolbar[data-v-6016a221]{background:#1e2230;border-bottom:1px solid #2d3348;align-items:center;gap:6px;padding:10px 16px;display:flex}.tool-btn[data-v-6016a221]{color:#e4e7ef;cursor:pointer;white-space:nowrap;background:#2d3348;border:1px solid #3a4160;border-radius:6px;align-items:center;gap:4px;padding:5px 12px;font-size:.82rem;transition:all .15s;display:inline-flex}.tool-btn[data-v-6016a221]:hover:not(:disabled){background:#3a4160}.tool-btn[data-v-6016a221]:disabled{opacity:.4;cursor:not-allowed}.tool-btn-icon[data-v-6016a221]{justify-content:center;gap:0;padding:5px 8px}.address-bar[data-v-6016a221]{background:#2d3348;border:1px solid #3a4160;border-radius:6px;flex:1;align-items:center;gap:6px;min-width:0;margin-left:8px;padding:2px 8px;transition:border-color .15s;display:flex}.address-bar[data-v-6016a221]:focus-within{border-color:#6c8cff}.address-bar.has-error[data-v-6016a221]{border-color:#f87171}.address-bar-icon[data-v-6016a221]{flex-shrink:0}.address-bar-input[data-v-6016a221]{color:#e4e7ef;background:0 0;border:none;outline:none;flex:1;min-width:0;padding:4px 0;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.84rem;line-height:1.3}.address-bar-input[data-v-6016a221]::placeholder{color:#5a6180;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.address-bar-clear[data-v-6016a221]{color:#f87171;cursor:pointer;background:0 0;border:none;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;padding:2px;display:inline-flex}.address-bar-clear[data-v-6016a221]:hover{background:#f871711f}.search-bar[data-v-6016a221]{background:#1e2230;border-bottom:1px solid #2d3348;align-items:center;gap:8px;padding:8px 16px;display:flex}.search-icon[data-v-6016a221]{flex-shrink:0}.search-input[data-v-6016a221]{color:#e4e7ef;background:#2d3348;border:1px solid #3a4160;border-radius:6px;outline:none;flex:1;padding:6px 10px;font-size:.85rem;transition:border-color .2s}.search-input[data-v-6016a221]::placeholder{color:#5a6180}.search-input[data-v-6016a221]:focus{border-color:#6c8cff}.clear-search[data-v-6016a221]{color:#8b91a8;cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:4px;display:inline-flex}.clear-search[data-v-6016a221]:hover{color:#f87171}.global-toggle[data-v-6016a221]{flex-shrink:0;align-items:center;gap:6px;margin-left:4px;display:flex}.toggle-label[data-v-6016a221]{color:#5a6180;-webkit-user-select:none;user-select:none;white-space:nowrap;font-size:.78rem}.toggle-switch[data-v-6016a221]{cursor:pointer;background:#2d3348;border:1px solid #3a4160;border-radius:9px;flex-shrink:0;width:34px;height:18px;padding:0;transition:all .2s;position:relative}.toggle-switch.active[data-v-6016a221]{background:#6c8cff;border-color:#6c8cff}.toggle-knob[data-v-6016a221]{background:#8b91a8;border-radius:50%;width:12px;height:12px;transition:all .2s;position:absolute;top:2px;left:2px}.toggle-switch.active .toggle-knob[data-v-6016a221]{background:#fff;left:18px}.index-status[data-v-6016a221]{cursor:pointer;border-radius:4px;flex-shrink:0;align-items:center;gap:4px;padding:2px 6px;transition:all .15s;display:flex}.index-status[data-v-6016a221]:hover{background:#ffffff0d}.index-status.idle[data-v-6016a221]{color:#f59e0b;background:#f59e0b0f;border:1px dashed #f59e0b80}.index-status.idle[data-v-6016a221]:hover{background:#f59e0b24;border-color:#f59e0bd9;transform:translateY(-1px)}.index-status.idle .status-text[data-v-6016a221]{color:#f59e0b;font-weight:500}.status-dot[data-v-6016a221]{border-radius:50%;flex-shrink:0;width:6px;height:6px}.index-status.ready .status-dot[data-v-6016a221]{background:#34d399;box-shadow:0 0 4px #34d399}.index-status.indexing .status-dot[data-v-6016a221]{background:#f59e0b;animation:1s ease-in-out infinite pulse-6016a221}.index-status.idle .status-dot[data-v-6016a221],.index-status.error .status-dot[data-v-6016a221]{background:#6b7280}@keyframes pulse-6016a221{0%,to{opacity:1}50%{opacity:.4}}.status-text[data-v-6016a221]{color:#5a6180;white-space:nowrap;font-size:.72rem}.status-icon[data-v-6016a221]{color:inherit;flex-shrink:0}.engine-badge[data-v-6016a221]{white-space:nowrap;border-radius:3px;padding:1px 6px;font-size:.72rem}.engine-badge.index[data-v-6016a221]{color:#34d399;background:#34d39926}.engine-badge.walk[data-v-6016a221]{color:#f59e0b;background:#f59e0b26}.modal-body[data-v-6016a221]{flex:1;display:flex;overflow:hidden}.sidebar[data-v-6016a221]{background:#1e2230;border-right:1px solid #2d3348;flex-shrink:0;width:160px;overflow-y:auto}.sidebar-section[data-v-6016a221]{border-bottom:1px solid #2d3348;padding:10px 0}.sidebar-title[data-v-6016a221]{color:#5a6180;text-transform:uppercase;letter-spacing:.5px;padding:0 14px 6px;font-size:.72rem;font-weight:600}.sidebar-item[data-v-6016a221]{color:#c0c5d8;cursor:pointer;align-items:center;gap:6px;padding:6px 14px;font-size:.82rem;transition:all .15s;display:flex}.sidebar-item[data-v-6016a221]:hover{color:#6c8cff;background:#6c8cff14}.sidebar-item.active[data-v-6016a221]{color:#6c8cff;background:#6c8cff26}.file-list-container[data-v-6016a221]{flex:1;padding:4px 0;overflow-y:auto}.loading-state[data-v-6016a221],.error-state[data-v-6016a221],.empty-state[data-v-6016a221]{color:#8b91a8;justify-content:center;align-items:center;gap:8px;height:200px;font-size:.9rem;display:flex}.error-state[data-v-6016a221]{color:#f87171}.spinner[data-v-6016a221]{vertical-align:middle;border:2px solid #2d3348;border-top-color:#6c8cff;border-radius:50%;width:16px;height:16px;margin-right:8px;animation:.6s linear infinite spin-6016a221;display:inline-block}@keyframes spin-6016a221{to{transform:rotate(360deg)}}.file-list[data-v-6016a221]{padding:0}.search-results-info[data-v-6016a221]{color:#8b91a8;background:#6c8cff0a;border-bottom:1px solid #2d3348;align-items:center;gap:6px;padding:8px 16px;font-size:.8rem;display:flex}.search-results-info strong[data-v-6016a221]{color:#6c8cff}.truncated-hint[data-v-6016a221]{color:#f59e0b;font-size:.76rem}.elapsed-hint[data-v-6016a221]{color:#5a6180;margin-left:auto;font-size:.74rem}.file-parent-path[data-v-6016a221]{color:#5a6180;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;max-width:200px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.76rem;overflow:hidden}.select-current-dir[data-v-6016a221]{background:#a78bfa14;border-bottom:1px solid #a78bfa26}.select-current-dir[data-v-6016a221]:hover{background:#a78bfa26}.select-current-dir.selected[data-v-6016a221]{background:#a78bfa40}.file-path-hint[data-v-6016a221]{color:#8b91a8;text-overflow:ellipsis;white-space:nowrap;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.78rem;overflow:hidden}.file-row[data-v-6016a221]{cursor:pointer;-webkit-user-select:none;user-select:none;border-bottom:1px solid #2d33484d;align-items:center;gap:8px;padding:7px 16px;transition:background .1s;display:flex}.file-row[data-v-6016a221]:hover{background:#6c8cff0f}.file-row.selected[data-v-6016a221]{background:#6c8cff26;border-color:#6c8cff33}.file-row.is-directory .file-name[data-v-6016a221]{font-weight:500}.file-icon[data-v-6016a221]{flex-shrink:0;align-items:center;display:inline-flex}.file-name[data-v-6016a221]{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.88rem;overflow:hidden}.file-size[data-v-6016a221]{color:#8b91a8;white-space:nowrap;text-align:right;flex-shrink:0;width:70px;font-size:.78rem}.file-modified[data-v-6016a221]{color:#5a6180;white-space:nowrap;text-align:right;flex-shrink:0;width:120px;font-size:.76rem}.modal-footer[data-v-6016a221]{background:#222633;border-top:1px solid #2d3348;justify-content:space-between;align-items:center;padding:12px 20px;display:flex}.selected-info[data-v-6016a221]{font-size:.85rem}.no-selection[data-v-6016a221]{color:#5a6180}.has-selection[data-v-6016a221]{color:#6c8cff}.single-path[data-v-6016a221]{text-overflow:ellipsis;white-space:nowrap;max-width:420px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.82rem;display:block;overflow:hidden}.footer-actions[data-v-6016a221]{gap:10px;display:flex}.btn[data-v-6016a221]{cursor:pointer;border:none;border-radius:6px;justify-content:center;align-items:center;padding:8px 20px;font-size:.88rem;font-weight:600;transition:all .15s;display:inline-flex}.btn[data-v-6016a221]:disabled{opacity:.4;cursor:not-allowed}.btn-cancel[data-v-6016a221]{color:#c0c5d8;background:#2d3348}.btn-cancel[data-v-6016a221]:hover:not(:disabled){background:#3a4160}.btn-confirm[data-v-6016a221]{color:#fff;background:#6c8cff}.btn-confirm[data-v-6016a221]:hover:not(:disabled){background:#5a7af0}.mkdir-overlay[data-v-6016a221]{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:20;background:#0000008c;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.mkdir-dialog[data-v-6016a221]{background:#1e2230;border:1px solid #3a4160;border-radius:10px;flex-direction:column;width:420px;max-width:90%;display:flex;overflow:hidden;box-shadow:0 16px 40px #00000080}.mkdir-header[data-v-6016a221]{background:#222633;border-bottom:1px solid #2d3348;align-items:center;gap:8px;padding:14px 18px;display:flex}.mkdir-title[data-v-6016a221]{color:#e4e7ef;font-size:.95rem;font-weight:600}.mkdir-body[data-v-6016a221]{flex-direction:column;gap:6px;padding:16px 18px;display:flex}.mkdir-label[data-v-6016a221]{color:#8b91a8;margin-top:4px;font-size:.78rem}.mkdir-parent-path[data-v-6016a221]{color:#c0c5d8;text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;background:#2d3348;border:1px solid #3a4160;border-radius:6px;padding:6px 10px;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.82rem;overflow:hidden}.mkdir-input[data-v-6016a221]{color:#e4e7ef;background:#2d3348;border:1px solid #3a4160;border-radius:6px;outline:none;padding:8px 10px;font-size:.9rem;transition:border-color .15s}.mkdir-input[data-v-6016a221]::placeholder{color:#5a6180}.mkdir-input[data-v-6016a221]:focus{border-color:#a78bfa}.mkdir-input.has-error[data-v-6016a221]{border-color:#f87171}.mkdir-error[data-v-6016a221]{color:#f87171;align-items:center;gap:4px;margin-top:4px;font-size:.78rem;display:flex}.mkdir-hint[data-v-6016a221]{color:#5a6180;margin-top:4px;font-size:.76rem}.mkdir-footer[data-v-6016a221]{background:#1a1d27;border-top:1px solid #2d3348;justify-content:flex-end;gap:10px;padding:12px 18px;display:flex}.modal-theme-light[data-v-6016a221]{background:#fff;border-color:#e2e8f0;box-shadow:0 20px 60px #00000026}.modal-theme-light .modal-header[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .modal-title[data-v-6016a221]{color:#1e293b}.modal-theme-light .close-btn[data-v-6016a221]{color:#64748b}.modal-theme-light .close-btn[data-v-6016a221]:hover{color:#ef4444;background:#ef444414}.modal-theme-light .toolbar[data-v-6016a221]{background:#f1f5f9;border-color:#e2e8f0}.modal-theme-light .tool-btn[data-v-6016a221]{color:#1e293b;background:#e2e8f0;border-color:#cbd5e1}.modal-theme-light .tool-btn[data-v-6016a221]:hover:not(:disabled){background:#cbd5e1}.modal-theme-light .address-bar[data-v-6016a221]{background:#fff;border-color:#cbd5e1}.modal-theme-light .address-bar[data-v-6016a221]:focus-within{border-color:#3b82f6}.modal-theme-light .address-bar.has-error[data-v-6016a221]{border-color:#ef4444}.modal-theme-light .address-bar-input[data-v-6016a221]{color:#1e293b}.modal-theme-light .address-bar-input[data-v-6016a221]::placeholder{color:#94a3b8}.modal-theme-light .address-bar-clear[data-v-6016a221]{color:#ef4444}.modal-theme-light .address-bar-clear[data-v-6016a221]:hover{background:#ef444414}.modal-theme-light .search-bar[data-v-6016a221]{background:#f1f5f9;border-color:#e2e8f0}.modal-theme-light .search-input[data-v-6016a221]{color:#1e293b;background:#fff;border-color:#cbd5e1}.modal-theme-light .search-input[data-v-6016a221]::placeholder{color:#94a3b8}.modal-theme-light .search-input[data-v-6016a221]:focus{border-color:#3b82f6}.modal-theme-light .toggle-label[data-v-6016a221]{color:#94a3b8}.modal-theme-light .toggle-switch[data-v-6016a221]{background:#e2e8f0;border-color:#cbd5e1}.modal-theme-light .toggle-switch.active[data-v-6016a221]{background:#3b82f6;border-color:#3b82f6}.modal-theme-light .toggle-knob[data-v-6016a221]{background:#94a3b8}.modal-theme-light .sidebar[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .sidebar-section[data-v-6016a221]{border-color:#e2e8f0}.modal-theme-light .sidebar-title[data-v-6016a221]{color:#94a3b8}.modal-theme-light .sidebar-item[data-v-6016a221]{color:#475569}.modal-theme-light .sidebar-item[data-v-6016a221]:hover{color:#3b82f6;background:#3b82f60f}.modal-theme-light .sidebar-item.active[data-v-6016a221]{color:#3b82f6;background:#3b82f61a}.modal-theme-light .file-list-container[data-v-6016a221]{background:#fff}.modal-theme-light .file-row[data-v-6016a221]{color:#1e293b;border-color:#e2e8f099}.modal-theme-light .file-row[data-v-6016a221]:hover{background:#3b82f60d}.modal-theme-light .file-row.selected[data-v-6016a221]{background:#3b82f61a;border-color:#3b82f633}.modal-theme-light .file-row.is-directory .file-name[data-v-6016a221]{color:#0f172a}.modal-theme-light .file-size[data-v-6016a221]{color:#64748b}.modal-theme-light .file-modified[data-v-6016a221]{color:#94a3b8}.modal-theme-light .file-path-hint[data-v-6016a221]{color:#64748b}.modal-theme-light .file-parent-path[data-v-6016a221]{color:#94a3b8}.modal-theme-light .select-current-dir[data-v-6016a221]{background:#8b5cf60d;border-color:#8b5cf61a}.modal-theme-light .select-current-dir[data-v-6016a221]:hover{background:#8b5cf61a}.modal-theme-light .select-current-dir.selected[data-v-6016a221]{background:#8b5cf626}.modal-theme-light .search-results-info[data-v-6016a221]{color:#64748b;background:#3b82f608;border-color:#e2e8f0}.modal-theme-light .loading-state[data-v-6016a221],.modal-theme-light .empty-state[data-v-6016a221]{color:#64748b}.modal-theme-light .error-state[data-v-6016a221]{color:#ef4444}.modal-theme-light .modal-footer[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .no-selection[data-v-6016a221]{color:#94a3b8}.modal-theme-light .has-selection[data-v-6016a221]{color:#3b82f6}.modal-theme-light .btn-cancel[data-v-6016a221]{color:#475569;background:#e2e8f0}.modal-theme-light .btn-cancel[data-v-6016a221]:hover:not(:disabled){background:#cbd5e1}.modal-theme-light .btn-confirm[data-v-6016a221]{background:#3b82f6}.modal-theme-light .btn-confirm[data-v-6016a221]:hover:not(:disabled){background:#2563eb}.modal-theme-light.mkdir-dialog[data-v-6016a221],.mkdir-dialog.modal-theme-light[data-v-6016a221]{background:#fff;border-color:#cbd5e1;box-shadow:0 16px 40px #00000026}.modal-theme-light .mkdir-header[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}.modal-theme-light .mkdir-title[data-v-6016a221]{color:#1e293b}.modal-theme-light .mkdir-label[data-v-6016a221]{color:#64748b}.modal-theme-light .mkdir-parent-path[data-v-6016a221]{color:#1e293b;background:#f1f5f9;border-color:#cbd5e1}.modal-theme-light .mkdir-input[data-v-6016a221]{color:#1e293b;background:#fff;border-color:#cbd5e1}.modal-theme-light .mkdir-input[data-v-6016a221]:focus{border-color:#8b5cf6}.modal-theme-light .mkdir-footer[data-v-6016a221]{background:#f8fafc;border-color:#e2e8f0}:root,[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--acu-bg:#fff;--acu-surface:#f7f7f8;--acu-surface-2:#ededf0;--acu-surface-hover:#f0f0f3;--acu-text:#18181b;--acu-text-secondary:#52525b;--acu-text-muted:#a1a1aa;--acu-border:#e7e7ea;--acu-border-strong:#d4d4d8;--acu-primary:#6366f1;--acu-primary-hover:#5457e5;--acu-primary-active:#4f46e5;--acu-primary-contrast:#fff;--acu-primary-soft:#6366f117;--acu-primary-soft-hover:#6366f124;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#f7f7f8;--acu-bubble-assistant-text:#18181b;--acu-thinking-bg:#fafafa;--acu-thinking-text:#71717a;--acu-thinking-border:#ececef;--acu-thinking-icon:#a1a1aa;--acu-code-bg:#f6f8fa;--acu-code-text:#24292f;--acu-code-border:#e4e4e7;--acu-code-inline-bg:#afb8c133;--acu-code-header-bg:#eceef1;--acu-error:#ef4444;--acu-error-soft:#ef44441a;--acu-success:#10b981;--acu-warning:#f59e0b;--acu-shadow-sm:0 1px 2px #18181b0d;--acu-shadow:0 4px 16px #18181b14;--acu-shadow-lg:0 12px 32px #18181b1f;--acu-radius-xs:4px;--acu-radius-sm:8px;--acu-radius:12px;--acu-radius-lg:16px;--acu-radius-xl:20px;--acu-radius-full:9999px;--acu-space-1:4px;--acu-space-2:8px;--acu-space-3:12px;--acu-space-4:16px;--acu-space-5:20px;--acu-space-6:24px;--acu-space-8:32px;--acu-font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;--acu-font-mono:"SFMono-Regular", "JetBrains Mono", Menlo, Consolas, "Liberation Mono", monospace;--acu-font-size-xs:12px;--acu-font-size-sm:13px;--acu-font-size-base:14px;--acu-font-size-md:15px;--acu-font-size-lg:16px;--acu-font-size-xl:18px;--acu-line-height:1.65;--acu-duration-fast:.12s;--acu-duration:.2s;--acu-easing:cubic-bezier(.4, 0, .2, 1);--acu-max-width:768px;--acu-avatar-size:32px}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--acu-bg:#18181b;--acu-surface:#27272a;--acu-surface-2:#34343a;--acu-surface-hover:#2f2f35;--acu-text:#f4f4f5;--acu-text-secondary:#a1a1aa;--acu-text-muted:#71717a;--acu-border:#323236;--acu-border-strong:#52525b;--acu-primary:#818cf8;--acu-primary-hover:#6366f1;--acu-primary-active:#5457e5;--acu-primary-contrast:#18181b;--acu-primary-soft:#818cf824;--acu-primary-soft-hover:#818cf838;--acu-bubble-user-bg:#6366f1;--acu-bubble-user-text:#fff;--acu-bubble-assistant-bg:#27272a;--acu-bubble-assistant-text:#f4f4f5;--acu-thinking-bg:#1f1f23;--acu-thinking-text:#a1a1aa;--acu-thinking-border:#2e2e33;--acu-thinking-icon:#71717a;--acu-code-bg:#0d1117;--acu-code-text:#e6edf3;--acu-code-border:#30363d;--acu-code-inline-bg:#6e768166;--acu-code-header-bg:#161b22;--acu-error:#f87171;--acu-error-soft:#f8717124;--acu-success:#34d399;--acu-warning:#fbbf24;--acu-shadow-sm:0 1px 2px #0000004d;--acu-shadow:0 4px 16px #0006;--acu-shadow-lg:0 12px 32px #00000080}.acu-root,.acu-root *,.acu-root :before,.acu-root :after{box-sizing:border-box}.acu-root{font-family:var(--acu-font-sans);font-size:var(--acu-font-size-base);line-height:var(--acu-line-height);color:var(--acu-text);background:var(--acu-bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility}.acu-root a{color:var(--acu-primary);text-decoration:none}.acu-root a:hover{text-decoration:underline}.acu-transition{transition:all var(--acu-duration) var(--acu-easing)}.acu-cursor{vertical-align:text-bottom;background:var(--acu-primary);border-radius:1px;width:7px;height:1.05em;margin-left:2px;animation:1s steps(2,start) infinite acu-blink;display:inline-block}@keyframes acu-blink{to{opacity:0}}.acu-typing-dots{align-items:center;gap:4px;display:inline-flex}.acu-typing-dots span{background:var(--acu-thinking-icon);border-radius:50%;width:6px;height:6px;animation:1.4s ease-in-out infinite both acu-bounce}.acu-typing-dots span:first-child{animation-delay:-.32s}.acu-typing-dots span:nth-child(2){animation-delay:-.16s}@keyframes acu-bounce{0%,80%,to{opacity:.5;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@keyframes acu-pulse{0%,to{opacity:.55}50%{opacity:1}}.acu-thinking{margin-bottom:var(--acu-space-3);border:1px solid var(--acu-thinking-border);border-radius:var(--acu-radius);background:var(--acu-thinking-bg);overflow:hidden}.acu-thinking.is-streaming{border-color:var(--acu-primary-soft)}.acu-thinking-header{align-items:center;gap:var(--acu-space-2);width:100%;padding:var(--acu-space-2) var(--acu-space-3);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);cursor:pointer;transition:background-color var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;font-family:inherit;display:flex}.acu-thinking-header:hover{background:var(--acu-surface-hover)}.acu-thinking-icon{color:var(--acu-thinking-icon);flex-shrink:0;display:inline-flex}.is-streaming .acu-thinking-icon{color:var(--acu-primary);animation:acu-pulse 2s var(--acu-easing) infinite}.acu-thinking-title{letter-spacing:.01em;font-weight:500}.acu-thinking-chevron{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-thinking-chevron.is-open{transform:rotate(180deg)}.acu-thinking-body{padding:0 var(--acu-space-3) var(--acu-space-3);border-top:1px dashed var(--acu-thinking-border);color:var(--acu-thinking-text);font-size:var(--acu-font-size-sm);line-height:1.7}.acu-thinking-md .acu-thinking-body{padding-top:var(--acu-space-2);border-top:none}@media (prefers-reduced-motion:reduce){.acu-root *{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.acu-md{font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);color:var(--acu-bubble-assistant-text);word-wrap:break-word;overflow-wrap:anywhere}.acu-md>:first-child{margin-top:0}.acu-md>:last-child{margin-bottom:0}.acu-md p{margin:0 0 var(--acu-space-3)}.acu-md h1,.acu-md h2,.acu-md h3,.acu-md h4,.acu-md h5,.acu-md h6{margin:var(--acu-space-6) 0 var(--acu-space-3);font-weight:650;line-height:1.3}.acu-md h1{font-size:1.5em}.acu-md h2{font-size:1.32em}.acu-md h3{font-size:1.18em}.acu-md h4{font-size:1.06em}.acu-md ul,.acu-md ol{margin:0 0 var(--acu-space-3);padding-left:1.5em}.acu-md li{margin:var(--acu-space-1) 0}.acu-md li::marker{color:var(--acu-text-muted)}.acu-md ul ul,.acu-md ol ol,.acu-md ul ol,.acu-md ol ul{margin:var(--acu-space-1) 0}.acu-md li.task-list-item{margin-left:-1.4em;list-style:none}.acu-md a{color:var(--acu-primary);border-bottom:1px solid var(--acu-primary-soft);transition:border-color var(--acu-duration) var(--acu-easing);text-decoration:none}.acu-md a:hover{border-bottom-color:var(--acu-primary)}.acu-md strong{font-weight:650}.acu-md em{font-style:italic}.acu-md del{color:var(--acu-text-muted)}.acu-md hr{margin:var(--acu-space-5) 0;border:none;border-top:1px solid var(--acu-border)}.acu-md blockquote{margin:0 0 var(--acu-space-3);padding:var(--acu-space-1) var(--acu-space-4);border-left:3px solid var(--acu-primary);background:var(--acu-primary-soft);border-radius:0 var(--acu-radius-sm) var(--acu-radius-sm) 0;color:var(--acu-text-secondary)}.acu-md blockquote>:last-child{margin-bottom:0}.acu-md code:not(pre code){font-family:var(--acu-font-mono);background:var(--acu-code-inline-bg);color:var(--acu-text);border-radius:var(--acu-radius-xs);margin:0 .1em;padding:.15em .4em;font-size:.88em}.acu-md table{width:100%;margin:0 0 var(--acu-space-3);border-collapse:collapse;border-radius:var(--acu-radius-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;font-size:.95em;display:block;overflow:auto hidden}.acu-md table::-webkit-scrollbar{width:6px;height:6px}.acu-md table::-webkit-scrollbar-track{background:0 0}.acu-md table::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-md table::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md th,.acu-md td{padding:var(--acu-space-2) var(--acu-space-3);border:1px solid var(--acu-border);text-align:left}.acu-md th{background:var(--acu-surface);font-weight:600}.acu-md tbody tr:nth-child(2n){background:var(--acu-surface)}.acu-md img.acu-md-img{border-radius:var(--acu-radius-sm);vertical-align:middle;max-width:100%}.acu-md .acu-code-block{margin:0 0 var(--acu-space-3);border:1px solid var(--acu-code-border);border-radius:var(--acu-radius);background:var(--acu-code-bg);overflow:hidden}.acu-md .acu-code-header{padding:0 var(--acu-space-3);background:var(--acu-code-header-bg);border-bottom:1px solid var(--acu-code-border);justify-content:space-between;align-items:center;height:34px;display:flex}.acu-md .acu-code-lang{font-family:var(--acu-font-mono);font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);text-transform:lowercase;letter-spacing:.02em}.acu-md .acu-code-copy{color:var(--acu-text-muted);font-size:var(--acu-font-size-xs);border-radius:var(--acu-radius-xs);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;align-items:center;gap:4px;padding:3px 8px;font-family:inherit;display:inline-flex}.acu-md .acu-code-copy svg{display:block}.acu-md .acu-code-copy:hover{background:var(--acu-surface-2);color:var(--acu-text)}.acu-md .acu-code-copy.is-copied{color:var(--acu-success)}.acu-md .acu-code-copy.is-error{color:var(--acu-error)}.acu-md .shiki{padding:var(--acu-space-4);font-family:var(--acu-font-mono);font-size:var(--acu-font-size-sm);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;margin:0;line-height:1.6;overflow-x:auto;background:var(--acu-code-bg)!important}.acu-md .shiki::-webkit-scrollbar{width:8px;height:8px}.acu-md .shiki::-webkit-scrollbar-track{background:0 0}.acu-md .shiki::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:4px}.acu-md .shiki::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-md .shiki code{background:0 0;padding:0;font-family:inherit}.acu-md .shiki,.acu-md .shiki span{color:var(--shiki-light,inherit);font-style:var(--shiki-light-font-style,normal);font-weight:var(--shiki-light-font-weight,normal);-webkit-text-decoration:var(--shiki-light-text-decoration,none);text-decoration:var(--shiki-light-text-decoration,none)}[data-theme=dark] .acu-md .shiki,[data-theme=dark] .acu-md .shiki span{color:var(--shiki-dark,inherit);font-style:var(--shiki-dark-font-style,normal);font-weight:var(--shiki-dark-font-weight,normal);-webkit-text-decoration:var(--shiki-dark-text-decoration,none);text-decoration:var(--shiki-dark-text-decoration,none)}.acu-md .acu-code-fallback{color:var(--acu-code-text)}.acu-thinking-header[data-v-a3ba3b3c]{outline:none}.acu-thinking-header[data-v-a3ba3b3c]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-collapse-enter-active[data-v-a3ba3b3c],.acu-collapse-leave-active[data-v-a3ba3b3c]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-collapse-enter-from[data-v-a3ba3b3c],.acu-collapse-leave-to[data-v-a3ba3b3c]{opacity:0;transform:translateY(-4px)}.acu-thinking-body[data-v-a3ba3b3c] .acu-md{font-size:var(--acu-font-size-sm);color:var(--acu-thinking-text);opacity:.92}.acu-thinking-body[data-v-a3ba3b3c] .acu-md p{margin-bottom:var(--acu-space-2)}.acu-toolcall[data-v-58c008b5]{border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);margin:var(--acu-space-1) 0;background:var(--acu-surface);overflow:hidden}.acu-toolcall-header[data-v-58c008b5]{align-items:center;gap:var(--acu-space-2);cursor:pointer;width:100%;font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);transition:background var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;padding:6px 10px;display:flex}.acu-toolcall-header[data-v-58c008b5]:hover{background:var(--acu-surface-2)}.acu-toolcall-status[data-v-58c008b5]{flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.acu-toolcall-status.is-running[data-v-58c008b5]{color:var(--acu-primary)}.acu-toolcall-status.is-done[data-v-58c008b5]{color:var(--acu-success)}.acu-toolcall-status.is-error[data-v-58c008b5]{color:var(--acu-error)}.acu-toolcall-status.is-pending[data-v-58c008b5]{color:var(--acu-text-muted)}.acu-toolcall-icon[data-v-58c008b5]{color:var(--acu-text-muted);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-toolcall-name[data-v-58c008b5]{color:var(--acu-text);flex-shrink:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;font-weight:600}.acu-toolcall-args[data-v-58c008b5]{color:var(--acu-text-muted);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;overflow:hidden}.acu-toolcall-chevron[data-v-58c008b5]{color:var(--acu-text-muted);transition:transform var(--acu-duration-fast) var(--acu-easing);flex-shrink:0;margin-left:auto}.acu-toolcall-chevron.expanded[data-v-58c008b5]{transform:rotate(180deg)}.acu-toolcall-body[data-v-58c008b5]{border-top:1px solid var(--acu-border);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface-2)}.acu-toolcall-section+.acu-toolcall-section[data-v-58c008b5]{margin-top:var(--acu-space-2)}.acu-toolcall-section-label[data-v-58c008b5]{color:var(--acu-text-muted);text-transform:uppercase;letter-spacing:.05em;margin-bottom:4px;font-size:11px}.acu-toolcall-pre[data-v-58c008b5]{background:var(--acu-surface);border-radius:var(--acu-radius-xs);white-space:pre-wrap;word-break:break-all;max-height:300px;color:var(--acu-text);margin:0;padding:8px 10px;font-family:JetBrains Mono,Fira Code,Consolas,monospace;font-size:12px;line-height:1.5;overflow-y:auto}.acu-toolcall-pre.is-error[data-v-58c008b5]{color:var(--acu-error)}.acu-toolcall-slide-enter-active[data-v-58c008b5],.acu-toolcall-slide-leave-active[data-v-58c008b5]{transition:all var(--acu-duration-fast) var(--acu-easing);overflow:hidden}.acu-toolcall-slide-enter-from[data-v-58c008b5],.acu-toolcall-slide-leave-to[data-v-58c008b5]{opacity:0;max-height:0;padding-top:0;padding-bottom:0}.acu-spin[data-v-58c008b5]{animation:.8s linear infinite acu-spin-58c008b5}@keyframes acu-spin-58c008b5{to{transform:rotate(360deg)}}.acu-toolgroup[data-v-2344178f]{margin:var(--acu-space-1) 0}.acu-toolgroup-header[data-v-2344178f]{align-items:center;gap:var(--acu-space-2);width:100%;margin-bottom:var(--acu-space-1);border:1px dashed var(--acu-border);border-radius:var(--acu-radius-sm);cursor:pointer;font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);text-align:left;transition:background var(--acu-duration-fast) var(--acu-easing),border-color var(--acu-duration-fast) var(--acu-easing);background:0 0;padding:6px 10px;display:flex}.acu-toolgroup-header[data-v-2344178f]:hover{background:var(--acu-surface-2);border-color:var(--acu-primary)}.acu-toolgroup-header.is-expanded[data-v-2344178f]{background:var(--acu-surface-2);border-style:solid}.acu-toolgroup-status[data-v-2344178f]{flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:inline-flex}.acu-toolgroup-status.is-running[data-v-2344178f]{color:var(--acu-primary)}.acu-toolgroup-status.is-done[data-v-2344178f]{color:var(--acu-success)}.acu-toolgroup-status.is-error[data-v-2344178f]{color:var(--acu-error)}.acu-toolgroup-status.is-pending[data-v-2344178f]{color:var(--acu-text-muted)}.acu-toolgroup-icon[data-v-2344178f]{color:var(--acu-text-muted);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-toolgroup-label[data-v-2344178f]{font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.acu-toolgroup-hint[data-v-2344178f]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);flex-shrink:0;margin-left:auto}.acu-toolgroup-chevron[data-v-2344178f]{color:var(--acu-text-muted);transition:transform var(--acu-duration-fast) var(--acu-easing);flex-shrink:0}.acu-toolgroup-chevron.expanded[data-v-2344178f]{transform:rotate(180deg)}.acu-spin[data-v-2344178f]{animation:.8s linear infinite acu-spin-2344178f}@keyframes acu-spin-2344178f{to{transform:rotate(360deg)}}.acu-message-actions[data-v-e4e15396]{margin-top:var(--acu-space-1);align-items:center;gap:2px;display:flex}.acu-message-actions.is-user[data-v-e4e15396]{justify-content:flex-end}.acu-action-btn[data-v-e4e15396]{border-radius:var(--acu-radius-xs);width:26px;height:26px;color:var(--acu-text-muted);cursor:pointer;background:0 0;border:1px solid #0000;outline:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.acu-action-btn[data-v-e4e15396]:focus-visible{box-shadow:0 0 0 1px var(--acu-bg),0 0 0 3px var(--acu-primary)}.acu-action-btn[data-v-e4e15396]{transition:color var(--acu-duration-fast) var(--acu-easing),background var(--acu-duration-fast) var(--acu-easing),border-color var(--acu-duration-fast) var(--acu-easing)}.acu-action-btn svg[data-v-e4e15396]{flex-shrink:0}.acu-action-btn[data-v-e4e15396]:hover{color:var(--acu-primary);background:var(--acu-surface-2);border-color:var(--acu-border)}.acu-action-btn.is-done[data-v-e4e15396]{color:var(--acu-success)}.acu-action-tip[data-v-e4e15396]{border-radius:var(--acu-radius-xs);background:var(--acu-text);color:var(--acu-bg);white-space:nowrap;pointer-events:none;z-index:3;padding:2px 7px;font-size:11px;line-height:1.5;position:absolute;bottom:calc(100% + 4px);left:0}.is-user .acu-action-tip[data-v-e4e15396]{left:auto;right:0}.acu-tip-enter-active[data-v-e4e15396],.acu-tip-leave-active[data-v-e4e15396]{transition:opacity var(--acu-duration-fast) var(--acu-easing),transform var(--acu-duration-fast) var(--acu-easing)}.acu-tip-enter-from[data-v-e4e15396],.acu-tip-leave-to[data-v-e4e15396]{opacity:0;transform:translateY(3px)}.acu-bubble-row[data-v-00ffb7b8]{gap:var(--acu-space-3);align-items:flex-start;display:flex}.acu-bubble-row.is-user[data-v-00ffb7b8]{justify-content:flex-end}@media (hover:hover){.acu-bubble-row[data-v-00ffb7b8] .acu-message-actions{opacity:0;transition:opacity var(--acu-duration-fast) var(--acu-easing)}.acu-bubble-row[data-v-00ffb7b8]:hover .acu-message-actions,.acu-bubble-row[data-v-00ffb7b8]:focus-within .acu-message-actions{opacity:1}}.acu-avatar[data-v-00ffb7b8]{width:var(--acu-avatar-size);height:var(--acu-avatar-size);border-radius:var(--acu-radius-full);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.acu-avatar img[data-v-00ffb7b8]{object-fit:cover;width:100%;height:100%}.acu-avatar--left[data-v-00ffb7b8]{background:var(--acu-surface-2);color:var(--acu-text-secondary)}.acu-avatar--right[data-v-00ffb7b8]{background:var(--acu-primary-soft);color:var(--acu-primary)}.acu-bubble-main[data-v-00ffb7b8]{flex-direction:column;min-width:0;max-width:min(680px,78%);display:flex}.is-user .acu-bubble-main[data-v-00ffb7b8]{align-items:flex-end}.acu-bubble-name[data-v-00ffb7b8]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-1);padding-left:2px}.acu-bubble[data-v-00ffb7b8]{padding:var(--acu-space-3) var(--acu-space-4);border-radius:var(--acu-radius-lg);font-size:var(--acu-font-size-md);line-height:var(--acu-line-height);word-break:break-word;max-width:100%;position:relative}.acu-bubble.is-assistant[data-v-00ffb7b8]{background:var(--acu-bubble-assistant-bg);color:var(--acu-bubble-assistant-text);border-top-left-radius:var(--acu-radius-xs)}.acu-bubble.is-user[data-v-00ffb7b8]{background:var(--acu-bubble-user-bg);color:var(--acu-bubble-user-text);border-top-right-radius:var(--acu-radius-xs)}.acu-bubble-content[data-v-00ffb7b8] .acu-md{color:inherit;font-size:var(--acu-font-size-md)}.acu-bubble-toolcalls[data-v-00ffb7b8]{margin-bottom:var(--acu-space-2)}.acu-attachments[data-v-00ffb7b8]{gap:var(--acu-space-2);margin-bottom:var(--acu-space-2);flex-wrap:wrap;display:flex}.acu-attachments.is-user[data-v-00ffb7b8]{justify-content:flex-end}.acu-att-thumb[data-v-00ffb7b8]{border-radius:var(--acu-radius);border:1px solid var(--acu-border);background:var(--acu-surface);width:88px;height:88px;overflow:hidden}.acu-att-thumb img[data-v-00ffb7b8]{object-fit:cover;width:100%;height:100%}.acu-att-file[data-v-00ffb7b8]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);max-width:220px;display:inline-flex}.acu-att-file-icon[data-v-00ffb7b8]{color:var(--acu-text-muted);flex-shrink:0}.acu-att-file-info[data-v-00ffb7b8]{flex-direction:column;min-width:0;display:flex}.acu-att-file-name[data-v-00ffb7b8]{font-size:var(--acu-font-size-sm);color:var(--acu-text);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-att-file-size[data-v-00ffb7b8]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted)}.acu-pending[data-v-00ffb7b8]{padding:var(--acu-space-1) 0}.acu-bubble-error[data-v-00ffb7b8]{align-items:center;gap:var(--acu-space-2);margin-top:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-error-soft);color:var(--acu-error);border-radius:var(--acu-radius-sm);font-size:var(--acu-font-size-sm);display:flex}.acu-retry-btn[data-v-00ffb7b8]{color:inherit;border-radius:var(--acu-radius-xs);font-size:var(--acu-font-size-xs);cursor:pointer;transition:opacity var(--acu-duration-fast) var(--acu-easing);background:0 0;border:1px solid;margin-left:auto;padding:2px 10px;font-family:inherit}.acu-retry-btn[data-v-00ffb7b8]:hover{opacity:.75}.acu-followup[data-v-09c2fd06]{padding-left:calc(var(--acu-avatar-size) + var(--acu-space-3));margin-top:var(--acu-space-3);margin-bottom:var(--acu-space-2);width:fit-content;max-width:min(680px,78%);animation:acu-followup-in-09c2fd06 .28s var(--acu-easing) both;align-self:flex-start}.acu-followup-title[data-v-09c2fd06]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);margin-bottom:var(--acu-space-2);letter-spacing:.02em}.acu-followup-loading[data-v-09c2fd06]{align-items:center;gap:4px;display:inline-flex}.acu-followup-dot[data-v-09c2fd06]{background:var(--acu-primary);border-radius:50%;width:4px;height:4px;animation:1.2s ease-in-out infinite both acu-followup-bounce-09c2fd06}.acu-followup-dot[data-v-09c2fd06]:first-child{animation-delay:-.32s}.acu-followup-dot[data-v-09c2fd06]:nth-child(2){animation-delay:-.16s}.acu-followup-list[data-v-09c2fd06]{align-items:flex-start;gap:var(--acu-space-2);flex-direction:column;width:fit-content;max-width:100%;display:flex}.acu-followup-item[data-v-09c2fd06]{align-items:center;gap:var(--acu-space-3);font-family:inherit;font-size:var(--acu-font-size-sm);color:var(--acu-text-secondary);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;text-align:left;width:auto;max-width:100%;transition:all var(--acu-duration) var(--acu-easing);outline:none;padding:10px 14px;display:inline-flex}.acu-followup-item[data-v-09c2fd06]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-followup-item[data-v-09c2fd06]:hover{color:var(--acu-primary);background:var(--acu-primary-soft);border-color:var(--acu-primary)}.acu-followup-item:hover .acu-followup-item-arrow[data-v-09c2fd06]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-followup-item[data-v-09c2fd06]:active{transform:translateY(.5px)}.acu-followup-item-label[data-v-09c2fd06]{white-space:nowrap;text-overflow:ellipsis;max-width:540px;overflow:hidden}.acu-followup-item-arrow[data-v-09c2fd06]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0}@keyframes acu-followup-in-09c2fd06{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes acu-followup-bounce-09c2fd06{0%,80%,to{opacity:.4;transform:scale(.6)}40%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.acu-followup[data-v-09c2fd06]{animation:none}}.acu-message-list[data-v-c8277217]{scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;flex:1;min-height:0;position:relative;overflow:hidden auto}.acu-message-list[data-v-c8277217]::-webkit-scrollbar{width:6px;height:6px}.acu-message-list[data-v-c8277217]::-webkit-scrollbar-track{background:0 0}.acu-message-list[data-v-c8277217]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:3px}.acu-message-list[data-v-c8277217]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-message-list[data-v-c8277217]{scroll-behavior:auto}.acu-message-list-inner[data-v-c8277217]{gap:var(--acu-space-5);max-width:var(--acu-max-width);width:100%;padding:var(--acu-space-5) var(--acu-space-4) var(--acu-space-6);flex-direction:column;margin:0 auto;display:flex}.acu-scroll-btn[data-v-c8277217]{bottom:var(--acu-space-3);border:1px solid var(--acu-border);background:var(--acu-bg);width:36px;height:36px;color:var(--acu-text-secondary);border-radius:var(--acu-radius-full);cursor:pointer;box-shadow:var(--acu-shadow);transition:all var(--acu-duration) var(--acu-easing);z-index:2;justify-content:center;align-items:center;margin:0 auto;display:inline-flex;position:sticky;left:50%;transform:translate(-50%)}.acu-scroll-btn[data-v-c8277217]:hover{color:var(--acu-primary);border-color:var(--acu-primary)}.acu-fade-enter-active[data-v-c8277217],.acu-fade-leave-active[data-v-c8277217]{transition:opacity var(--acu-duration) var(--acu-easing),transform var(--acu-duration) var(--acu-easing)}.acu-fade-enter-from[data-v-c8277217],.acu-fade-leave-to[data-v-c8277217]{opacity:0;transform:translate(-50%,6px)}.acu-welcome[data-v-4ea55375]{padding:var(--acu-space-8) var(--acu-space-4);flex:1;justify-content:center;align-items:center;min-height:0;display:flex}.acu-welcome-inner[data-v-4ea55375]{text-align:center;flex-direction:column;align-items:center;width:100%;max-width:640px;display:flex}.acu-welcome-logo[data-v-4ea55375]{border-radius:var(--acu-radius-lg);background:linear-gradient(135deg,var(--acu-primary-soft),var(--acu-surface));width:56px;height:56px;color:var(--acu-primary);margin-bottom:var(--acu-space-5);box-shadow:var(--acu-shadow-sm);justify-content:center;align-items:center;display:inline-flex}.acu-welcome-title[data-v-4ea55375]{color:var(--acu-text);margin:0 0 var(--acu-space-2);letter-spacing:-.01em;font-size:22px;font-weight:650}.acu-welcome-desc[data-v-4ea55375]{font-size:var(--acu-font-size-md);color:var(--acu-text-secondary);margin:0 0 var(--acu-space-6);max-width:440px}.acu-welcome-grid[data-v-4ea55375]{gap:var(--acu-space-3);grid-template-columns:repeat(2,1fr);width:100%;display:grid}@media (width<=560px){.acu-welcome-grid[data-v-4ea55375]{grid-template-columns:1fr}}.acu-preset-q[data-v-4ea55375]{justify-content:space-between;align-items:flex-start;gap:var(--acu-space-3);padding:var(--acu-space-4);text-align:left;background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius);cursor:pointer;transition:all var(--acu-duration) var(--acu-easing);outline:none;font-family:inherit;display:flex}.acu-preset-q[data-v-4ea55375]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-preset-q[data-v-4ea55375]:hover{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:var(--acu-shadow-sm);transform:translateY(-1px)}.acu-preset-q:hover .acu-preset-q-arrow[data-v-4ea55375]{color:var(--acu-primary);transform:translate(2px,-2px)}.acu-preset-q-body[data-v-4ea55375]{flex-direction:column;gap:2px;min-width:0;display:flex}.acu-preset-q-label[data-v-4ea55375]{font-size:var(--acu-font-size-md);color:var(--acu-text);font-weight:550}.acu-preset-q-prompt[data-v-4ea55375]{font-size:var(--acu-font-size-xs);color:var(--acu-text-muted);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.acu-preset-q-arrow[data-v-4ea55375]{color:var(--acu-text-muted);transition:transform var(--acu-duration) var(--acu-easing),color var(--acu-duration) var(--acu-easing);flex-shrink:0;margin-top:2px}.acu-input-wrap[data-v-1e944ec7]{max-width:var(--acu-max-width);background:var(--acu-surface);border:1px solid var(--acu-border);border-radius:var(--acu-radius-lg);width:100%;padding:var(--acu-space-2);transition:border-color var(--acu-duration) var(--acu-easing),box-shadow var(--acu-duration) var(--acu-easing),background-color var(--acu-duration) var(--acu-easing);margin:0 auto;position:relative}.acu-input-wrap[data-v-1e944ec7]:focus-within{border-color:var(--acu-primary);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-dragging[data-v-1e944ec7]{border-color:var(--acu-primary);background:var(--acu-primary-soft);box-shadow:0 0 0 3px var(--acu-primary-soft)}.acu-input-wrap.is-disabled[data-v-1e944ec7]{opacity:.6;pointer-events:none}.acu-input-drop-hint[data-v-1e944ec7]{justify-content:center;align-items:center;gap:var(--acu-space-2);color:var(--acu-primary);font-size:var(--acu-font-size-sm);pointer-events:none;z-index:1;flex-direction:column;font-weight:500;display:flex;position:absolute;inset:0}.acu-input-attachments[data-v-1e944ec7]{gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-2) 0;flex-wrap:wrap;display:flex}.acu-input-att[data-v-1e944ec7]{display:inline-flex;position:relative}.acu-input-att-thumb[data-v-1e944ec7]{border-radius:var(--acu-radius-sm);border:1px solid var(--acu-border);width:56px;height:56px;overflow:hidden}.acu-input-att-thumb img[data-v-1e944ec7]{object-fit:cover;width:100%;height:100%}.acu-input-att-file[data-v-1e944ec7]{align-items:center;gap:var(--acu-space-2);padding:var(--acu-space-2) var(--acu-space-3);background:var(--acu-bg);border:1px solid var(--acu-border);border-radius:var(--acu-radius-sm);color:var(--acu-text-secondary);max-width:180px;display:inline-flex}.acu-input-att-name[data-v-1e944ec7]{font-size:var(--acu-font-size-xs);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.acu-input-att-remove[data-v-1e944ec7]{border-radius:var(--acu-radius-full);background:var(--acu-text);width:18px;height:18px;color:var(--acu-bg);cursor:pointer;box-shadow:var(--acu-shadow-sm);transition:transform var(--acu-duration-fast) var(--acu-easing);border:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:-6px;right:-6px}.acu-input-att-remove[data-v-1e944ec7]:hover{transform:scale(1.12)}.acu-input-row[data-v-1e944ec7]{align-items:flex-end;gap:var(--acu-space-2);padding:var(--acu-space-1) var(--acu-space-1) 0;display:flex}.acu-input-icon-btn[data-v-1e944ec7]{width:36px;height:36px;color:var(--acu-text-muted);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);background:0 0;border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-icon-btn[data-v-1e944ec7]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-icon-btn[data-v-1e944ec7]:hover:not(:disabled){background:var(--acu-surface-2);color:var(--acu-text)}.acu-input-file[data-v-1e944ec7]{display:none}.acu-input-textarea[data-v-1e944ec7]{resize:none;min-height:36px;max-height:200px;font-family:inherit;font-size:var(--acu-font-size-md);color:var(--acu-text);scrollbar-width:thin;scrollbar-color:var(--acu-border-strong) transparent;background:0 0;border:none;outline:none;flex:1;padding:8px 4px;line-height:1.5}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar{width:4px;height:4px}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-track{background:0 0}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-thumb{background-color:var(--acu-border-strong);border-radius:2px}.acu-input-textarea[data-v-1e944ec7]::-webkit-scrollbar-thumb:hover{background-color:var(--acu-text-muted)}.acu-input-textarea[data-v-1e944ec7]::placeholder{color:var(--acu-text-muted)}.acu-input-textarea[data-v-1e944ec7]:disabled{cursor:not-allowed}.acu-input-send[data-v-1e944ec7]{background:var(--acu-primary);width:36px;height:36px;color:var(--acu-primary-contrast);border-radius:var(--acu-radius-sm);cursor:pointer;transition:all var(--acu-duration-fast) var(--acu-easing);border:none;outline:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.acu-input-send[data-v-1e944ec7]:focus-visible{box-shadow:0 0 0 2px var(--acu-bg),0 0 0 4px var(--acu-primary)}.acu-input-send[data-v-1e944ec7]:hover:not(:disabled){background:var(--acu-primary-hover)}.acu-input-send[data-v-1e944ec7]:active:not(:disabled){background:var(--acu-primary-active)}.acu-input-send[data-v-1e944ec7]:disabled{background:var(--acu-surface-2);color:var(--acu-text-muted);cursor:not-allowed}.acu-chat[data-v-a40ca976]{background:var(--acu-bg);flex-direction:column;height:100%;min-height:0;display:flex}.acu-chat-body[data-v-a40ca976]{flex-direction:column;flex:1;min-height:0;display:flex}.acu-chat-footer[data-v-a40ca976]{padding:var(--acu-space-3) var(--acu-space-4) var(--acu-space-4);background:linear-gradient(to top,var(--acu-bg) 70%,transparent);flex-shrink:0}
@@ -10,28 +10,28 @@
10
10
  <link rel="preconnect" href="https://fonts.googleapis.com" />
11
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
12
  <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
13
- <script type="module" crossorigin src="/assets/index-BLO9MkBC.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-DNHOYMCg.js"></script>
14
14
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/element-plus-KTmRV-so.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/monaco-DkJuNcCr.js">
17
- <link rel="modulepreload" crossorigin href="/assets/vendor-CwZs6S_i.js">
18
- <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-nUAWISuX.js">
19
- <link rel="modulepreload" crossorigin href="/assets/SvgIcon-C6aJB-3Q.js">
20
- <link rel="modulepreload" crossorigin href="/assets/IconButton-CQB_swX6.js">
21
- <link rel="modulepreload" crossorigin href="/assets/configStore-CRYvJSvr.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/vendor-92fKgtnz.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-B7A-NgBp.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/SvgIcon-DxazW7dI.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/IconButton-BltPKVbV.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/configStore-Dx84lvTX.js">
22
22
  <link rel="modulepreload" crossorigin href="/assets/socket-io-TBtw0msS.js">
23
- <link rel="modulepreload" crossorigin href="/assets/gitStore-QokQdW7C.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/gitStore-CYrdjXPU.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/useThemeObserver-B01D-Vl6.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/flow-mindmap-CurCIiCp.js">
26
- <link rel="modulepreload" crossorigin href="/assets/previewSandbox-CA1fFxdo.js">
27
- <link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-C3DxCngU.js">
28
- <link rel="modulepreload" crossorigin href="/assets/toolsStore-Bu8Ujw_A.js">
29
- <link rel="modulepreload" crossorigin href="/assets/CommonDialog-DfT04-V7.js">
30
- <link rel="modulepreload" crossorigin href="/assets/TemplateManager-Th1ibeIh.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/previewSandbox-D_j5PWX1.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-C4ZANajI.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/toolsStore-BiC2mmC3.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/CommonDialog-DWMCeujE.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/TemplateManager-BN6gWFWX.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/vue-flow-CsvDD38k.js">
32
32
  <link rel="stylesheet" crossorigin href="/assets/element-plus-BWbXh9mk.css">
33
33
  <link rel="stylesheet" crossorigin href="/assets/monaco-B2lPvkrc.css">
34
- <link rel="stylesheet" crossorigin href="/assets/vendor-_6pgW9Z2.css">
34
+ <link rel="stylesheet" crossorigin href="/assets/vendor-B1UrVTTI.css">
35
35
  <link rel="stylesheet" crossorigin href="/assets/SvgIcon-BQ6bR7l0.css">
36
36
  <link rel="stylesheet" crossorigin href="/assets/IconButton-CTwyZrv2.css">
37
37
  <link rel="stylesheet" crossorigin href="/assets/flow-mindmap-DnzM9SlK.css">
@@ -40,7 +40,7 @@
40
40
  <link rel="stylesheet" crossorigin href="/assets/CommonDialog-C_RjF9Mp.css">
41
41
  <link rel="stylesheet" crossorigin href="/assets/TemplateManager-C0rm8xfC.css">
42
42
  <link rel="stylesheet" crossorigin href="/assets/vue-flow-CavUTEzp.css">
43
- <link rel="stylesheet" crossorigin href="/assets/index-ClqvC4kJ.css">
43
+ <link rel="stylesheet" crossorigin href="/assets/index-Dsfmp6w8.css">
44
44
  </head>
45
45
  <body>
46
46
  <div id="app"></div>
@@ -15,6 +15,7 @@
15
15
  import express from 'express';
16
16
  import fs from 'fs/promises';
17
17
  import path from 'path';
18
+ import { buildAiChatRequest } from '../../../utils/aiEndpoint.js';
18
19
 
19
20
  // 代码文件扩展名
20
21
  const CODE_EXTENSIONS = [
@@ -349,9 +350,11 @@ async function buildDependencyGraph(subFiles, resolvedDir, rootPath = '') {
349
350
  */
350
351
  async function callLlmJson(model, prompt) {
351
352
  const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }));
352
- const url = `${String(model.baseURL || '').replace(/\/$/, '')}/chat/completions`;
353
- const headers = { 'Content-Type': 'application/json' };
354
- if (model.apiKey) headers['Authorization'] = `Bearer ${model.apiKey}`;
353
+ const { url, headers } = buildAiChatRequest({
354
+ baseURL: model.baseURL,
355
+ model: model.model,
356
+ apiKey: model.apiKey,
357
+ });
355
358
 
356
359
  const body = JSON.stringify({
357
360
  model: model.model,
@@ -19,6 +19,9 @@ import fs from 'fs/promises';
19
19
  import open from 'open';
20
20
  import logger from '../utils/logger.js';
21
21
  import { CONFIG_FILE } from '../../../paths.js';
22
+ // AI 请求的地址/请求头统一走这里:OpenCode 网关要求自报 User-Agent 并带
23
+ // x-opencode-session,否则直接 4xx(见 src/utils/aiEndpoint.js 顶部说明)
24
+ import { buildAiChatRequest } from '../../../utils/aiEndpoint.js';
22
25
 
23
26
  // 跳过的产物/资源/lock 文件(用 stat 一行带过,不打 patch)
24
27
  const SKIP_FILE_PATTERNS = [
@@ -1051,6 +1054,28 @@ export function registerConfigRoutes({
1051
1054
  }
1052
1055
  })
1053
1056
 
1057
+ // 保存 AI 智能体运行时设置(aiMaxToolIterations 是全局配置,存配置文件顶层,跨项目共享)
1058
+ app.post('/api/config/save-ai-settings', express.json(), async (req, res) => {
1059
+ try {
1060
+ const { aiMaxToolIterations } = req.body || {}
1061
+ // 越界值在这里夹取到 [MIN, MAX],而不是拒绝 —— 与 loadConfig 的规范化保持同一套语义
1062
+ const normalized = configManager.normalizeAiMaxToolIterations(aiMaxToolIterations)
1063
+ if (normalized === null) {
1064
+ return res.status(400).json({
1065
+ success: false,
1066
+ error: `aiMaxToolIterations 非法: ${aiMaxToolIterations}`
1067
+ })
1068
+ }
1069
+ const rawConfig = await configManager.readRawConfigFile()
1070
+ rawConfig.aiMaxToolIterations = normalized
1071
+ await configManager.writeRawConfigFile(rawConfig)
1072
+ res.json({ success: true, aiMaxToolIterations: normalized })
1073
+ } catch (error) {
1074
+ logger.error('[save-ai-settings] failed:', error)
1075
+ res.status(500).json({ success: false, error: error.message })
1076
+ }
1077
+ })
1078
+
1054
1079
  // 保存 AI 模型配置(models 是全局配置,存在配置文件顶层,跨项目共享)
1055
1080
  app.post('/api/config/save-models', express.json(), async (req, res) => {
1056
1081
  try {
@@ -1075,9 +1100,8 @@ export function registerConfigRoutes({
1075
1100
  }
1076
1101
  try {
1077
1102
  const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }))
1078
- const url = `${baseURL.replace(/\/$/, '')}/chat/completions`
1079
- const headers = { 'Content-Type': 'application/json' }
1080
- if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`
1103
+ // 连通性探测同样要带客户端身份/会话头,否则 OpenCode 网关这条请求就被风控挡了
1104
+ const { url, headers } = buildAiChatRequest({ baseURL, model, apiKey })
1081
1105
  const body = JSON.stringify({
1082
1106
  model,
1083
1107
  messages: [{ role: 'user', content: 'Hello, reply with just "ok".' }],
@@ -1161,9 +1185,11 @@ ${diffText || '(no staged content, please infer from the file list)'}`
1161
1185
  logger.debug('[generate-commit] locale:', userLocale, '| prompt length:', prompt.length)
1162
1186
  logger.debug('[generate-commit] prompt:\n' + prompt)
1163
1187
  const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }))
1164
- const url = `${defaultModel.baseURL.replace(/\/$/, '')}/chat/completions`
1165
- const headers = { 'Content-Type': 'application/json' }
1166
- if (defaultModel.apiKey) headers['Authorization'] = `Bearer ${defaultModel.apiKey}`
1188
+ const { url, headers } = buildAiChatRequest({
1189
+ baseURL: defaultModel.baseURL,
1190
+ model: defaultModel.model,
1191
+ apiKey: defaultModel.apiKey,
1192
+ })
1167
1193
  const body = JSON.stringify({
1168
1194
  model: defaultModel.model,
1169
1195
  messages: [{ role: 'user', content: prompt }],
@@ -35,10 +35,27 @@ import { agentSessionStore } from './agentSessionStore.js';
35
35
  import { TOOL_DEFINITIONS, executeTool } from '../../../../cli/ai/tools.js';
36
36
  import { checkDangerousCommand } from '../../../../cli/ai/safety.js';
37
37
  import { guardCommand } from '../../../../cli/ai/platformGuard.js';
38
+ import configManager from '../../../../config.js';
39
+ import { buildAiChatRequest, describeAiHttpError } from '../../../../utils/aiEndpoint.js';
38
40
 
39
- const MAX_TOOL_ITERATIONS = 40;
41
+ // 单轮工具调用循环数的兜底值(防失控);实际值取全局配置 aiMaxToolIterations,
42
+ // 与 CLI 侧 src/cli/ai/agent.js 共用同一个配置项。
43
+ const DEFAULT_MAX_TOOL_ITERATIONS = 200;
40
44
  const LLM_TIMEOUT_MS = 300000; // 5 分钟
41
45
 
46
+ // 读取全局配置里的单轮工具调用上限。
47
+ // 读配置失败不该把整轮对话打挂 —— 退回默认值继续跑,比用户消息直接发不出去好。
48
+ async function resolveMaxToolIterations() {
49
+ try {
50
+ const cfg = await configManager.loadConfig();
51
+ const n = Number(cfg?.aiMaxToolIterations);
52
+ if (Number.isFinite(n) && n > 0) return Math.floor(n);
53
+ } catch (err) {
54
+ logger.warn(`[agentChat] 读取 aiMaxToolIterations 失败,回退默认值: ${err?.message || err}`);
55
+ }
56
+ return DEFAULT_MAX_TOOL_ITERATIONS;
57
+ }
58
+
42
59
  // ── 系统提示词构建 ──────────────────────────────────────────
43
60
  // 与 CLI agent.js 的 buildSystemPrompt 保持一致,但标注来源为 Web 端
44
61
  function buildWebSystemPrompt({ cwd, locale }) {
@@ -138,10 +155,14 @@ ${isWin ? `- This is Windows. The following Unix commands do NOT exist here:
138
155
 
139
156
  // ── LLM 流式调用(OpenAI 兼容 + function calling) ──────────
140
157
  // 返回 { content, toolCalls, aborted }
141
- async function streamChatOnce({ model, messages, signal, onToken }) {
142
- const url = `${String(model.baseURL || '').replace(/\/$/, '')}/chat/completions`;
143
- const headers = { 'Content-Type': 'application/json' };
144
- if (model.apiKey) headers['Authorization'] = `Bearer ${model.apiKey}`;
158
+ async function streamChatOnce({ model, messages, signal, onToken, sessionId }) {
159
+ // sessionId = 对话 ID:OpenCode 网关靠它做路由与提示缓存,同一轮对话的所有请求要复用
160
+ const { url, headers } = buildAiChatRequest({
161
+ baseURL: model.baseURL,
162
+ model: model.model,
163
+ apiKey: model.apiKey,
164
+ sessionId,
165
+ });
145
166
 
146
167
  const body = JSON.stringify({
147
168
  model: model.model,
@@ -167,7 +188,8 @@ async function streamChatOnce({ model, messages, signal, onToken }) {
167
188
  const resp = await fetch(url, { method: 'POST', headers, body, signal: controller.signal });
168
189
  if (!resp.ok || !resp.body) {
169
190
  const errText = await resp.text().catch(() => '');
170
- const snippet = errText.length > 300 ? errText.slice(0, 300) + '…' : errText;
191
+ // 抽 error.message:网关/provider 的说明都在里面,整坨 JSON 甩到聊天窗没法看
192
+ const snippet = describeAiHttpError(errText, resp.status);
171
193
  if (resp.status === 400 && /tool|function/i.test(snippet)) {
172
194
  throw new Error(`HTTP 400: 当前模型可能不支持 function calling(${snippet})。请在设置中换用支持工具调用的模型。`);
173
195
  }
@@ -342,7 +364,9 @@ export async function runAgentTurn({ session, model, userMessage, images = [], c
342
364
  // 旧图片降级
343
365
  stripStaleImages(session.messages);
344
366
 
345
- for (let iter = 0; iter < MAX_TOOL_ITERATIONS; iter++) {
367
+ const maxIterations = await resolveMaxToolIterations();
368
+
369
+ for (let iter = 0; iter < maxIterations; iter++) {
346
370
  trimHistory(session.messages);
347
371
  sanitizeMessages(session.messages);
348
372
 
@@ -352,6 +376,8 @@ export async function runAgentTurn({ session, model, userMessage, images = [], c
352
376
  model,
353
377
  messages: session.messages,
354
378
  signal,
379
+ // 整轮对话(含后续工具调用产生的每一轮请求)复用同一个会话 ID
380
+ sessionId: session.sessionId,
355
381
  onToken: ({ thinking, content }) => {
356
382
  if (thinking) send({ type: 'thinking', delta: thinking });
357
383
  if (content) send({ type: 'content', delta: content });
@@ -418,7 +444,7 @@ export async function runAgentTurn({ session, model, userMessage, images = [], c
418
444
  }
419
445
 
420
446
  // 达到最大迭代次数
421
- send({ type: 'done', content: `已达单轮最大工具调用次数(${MAX_TOOL_ITERATIONS}),本轮结束。如需继续请再发一条消息。` });
447
+ send({ type: 'done', content: `已达单轮最大工具调用次数(${maxIterations}),本轮结束。如需继续请再发一条消息。` });
422
448
  return { aborted: false };
423
449
  }
424
450
 
@@ -23,6 +23,7 @@
23
23
  // - cloneMsgContent 深拷贝消息 content(避免外部 mutation 污染请求)
24
24
 
25
25
  import { stripThinkingBlocks, extractFirstJsonObject } from './jsonParse.js';
26
+ import { buildAiChatRequest, describeAiHttpError } from '../../../../utils/aiEndpoint.js';
26
27
 
27
28
  // 非流式调用 LLM,要求返回 JSON 对象。
28
29
  // 失败时抛错;成功时返回已 parse 的对象。
@@ -32,9 +33,11 @@ import { stripThinkingBlocks, extractFirstJsonObject } from './jsonParse.js';
32
33
  export async function callLlmJson(model, prompt, opts = {}) {
33
34
  const { timeoutMs = 60000, images = [] } = opts;
34
35
  const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }));
35
- const url = `${String(model.baseURL || '').replace(/\/$/, '')}/chat/completions`;
36
- const headers = { 'Content-Type': 'application/json' };
37
- if (model.apiKey) headers['Authorization'] = `Bearer ${model.apiKey}`;
36
+ const { url, headers } = buildAiChatRequest({
37
+ baseURL: model.baseURL,
38
+ model: model.model,
39
+ apiKey: model.apiKey,
40
+ });
38
41
 
39
42
  let userContent;
40
43
  if (Array.isArray(images) && images.length > 0) {
@@ -115,11 +118,14 @@ export function cloneMsgContent(c) {
115
118
  * 函数返回 { aborted: true },不抛错——上层决定怎么处理。
116
119
  */
117
120
  export async function callLlmStream(model, input, onDelta, opts = {}) {
118
- const { maxTokens = 2000, timeoutMs = 600000, signal, images = [], systemPrompt } = opts;
121
+ const { maxTokens = 2000, timeoutMs = 600000, signal, images = [], systemPrompt, sessionId } = opts;
119
122
  const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }));
120
- const url = `${String(model.baseURL || '').replace(/\/$/, '')}/chat/completions`;
121
- const headers = { 'Content-Type': 'application/json' };
122
- if (model.apiKey) headers['Authorization'] = `Bearer ${model.apiKey}`;
123
+ const { url, headers } = buildAiChatRequest({
124
+ baseURL: model.baseURL,
125
+ model: model.model,
126
+ apiKey: model.apiKey,
127
+ sessionId,
128
+ });
123
129
 
124
130
  // 判别 input: string(旧,直接拆分)或 messages 数组(新,对话拆分)
125
131
  let messages;
@@ -167,7 +173,8 @@ export async function callLlmStream(model, input, onDelta, opts = {}) {
167
173
  const resp = await fetch(url, { method: 'POST', headers, body, signal: controller.signal });
168
174
  if (!resp.ok || !resp.body) {
169
175
  const errText = await resp.text().catch(() => '');
170
- throw new Error(errText || `HTTP ${resp.status}`);
176
+ // 抽 error.message,别把整坨 JSON 甩给用户(网关的报错说明都在 message 里)
177
+ throw new Error(describeAiHttpError(errText, resp.status));
171
178
  }
172
179
 
173
180
  // SSE 格式:每行 "data: {...}",最后 "data: [DONE]"