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.
- package/README.md +13 -0
- package/package.json +2 -1
- package/scripts/release.js +93 -66
- package/src/aiCommit.js +6 -3
- package/src/cli/ai/agent.js +23 -8
- package/src/cli/ai/modelSetup.js +6 -8
- package/src/config.js +57 -4
- package/src/ui/public/assets/{AgentView-BkNdHFRW.js → AgentView-BC3F0F6m.js} +3 -3
- package/src/ui/public/assets/AgentView-CzUeyQfR.css +1 -0
- package/src/ui/public/assets/{AppVersionBadge-pJ33fsvn.js → AppVersionBadge-DV6KuLqb.js} +2 -2
- package/src/ui/public/assets/{BranchSelector-Ixv2uRS6.js → BranchSelector-DGXDAOkR.js} +1 -1
- package/src/ui/public/assets/{CommitForm-DqJvDzSw.js → CommitForm-BYBj7UUa.js} +1 -1
- package/src/ui/public/assets/{CommonDialog-DfT04-V7.js → CommonDialog-DWMCeujE.js} +1 -1
- package/src/ui/public/assets/{EditorView-Br0JBESF.js → EditorView-D-TEQZso.js} +1 -1
- package/src/ui/public/assets/{FileDiffViewer-C3DxCngU.js → FileDiffViewer-C4ZANajI.js} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-C_FOK1_9.js → FlowExecutionViewer-DUv7mBuG.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-wu9ieYbz.js → FlowOrchestrationWorkspace-BiSuvzL7.js} +1 -1
- package/src/ui/public/assets/{IconButton-CQB_swX6.js → IconButton-BltPKVbV.js} +1 -1
- package/src/ui/public/assets/{LogList-CSpeYuAd.js → LogList-BY1Haq9r.js} +1 -1
- package/src/ui/public/assets/{MindmapView-8AHGHv9g.js → MindmapView-BKsvCnYv.js} +1 -1
- package/src/ui/public/assets/{MonitorView-Do6DcGd9.js → MonitorView-B3_NaJRy.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-DwrukeUb.js → ProjectStartupButton-DP3eDVRp.js} +1 -1
- package/src/ui/public/assets/{RemoteManagerDialog-Dhdwvb2y.js → RemoteManagerDialog-Bl9b_iRv.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-DjKHYGRi.js → RemoteRepoCard-TQ3DxDnq.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-COuEBUTw.js → SourceMapView-BF-Mzv3V.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-C6aJB-3Q.js → SvgIcon-DxazW7dI.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-Th1ibeIh.js → TemplateManager-BN6gWFWX.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-B8F60XEE.js → UserInputNode-CPwvIfP6.js} +1 -1
- package/src/ui/public/assets/WorkbenchView-CDu61WWs.js +13 -0
- package/src/ui/public/assets/WorkbenchView-DEejub9Z.css +1 -0
- package/src/ui/public/assets/_plugin-vue_export-helper-B7A-NgBp.js +19 -0
- package/src/ui/public/assets/configStore-Dx84lvTX.js +1 -0
- package/src/ui/public/assets/{gitStore-QokQdW7C.js → gitStore-CYrdjXPU.js} +1 -1
- package/src/ui/public/assets/index-DNHOYMCg.js +24 -0
- package/src/ui/public/assets/index-Dsfmp6w8.css +1 -0
- package/src/ui/public/assets/{previewSandbox-CA1fFxdo.js → previewSandbox-D_j5PWX1.js} +0 -0
- package/src/ui/public/assets/{toolsStore-Bu8Ujw_A.js → toolsStore-BiC2mmC3.js} +1 -1
- package/src/ui/public/assets/{vendor-CwZs6S_i.js → vendor-92fKgtnz.js} +7 -7
- package/src/ui/public/assets/{vendor-_6pgW9Z2.css → vendor-B1UrVTTI.css} +1 -1
- package/src/ui/public/index.html +14 -14
- package/src/ui/server/routes/codeAnalysis.js +6 -3
- package/src/ui/server/routes/config.js +32 -6
- package/src/ui/server/routes/workbench/agentChat.js +34 -8
- package/src/ui/server/routes/workbench/llmClient.js +15 -8
- package/src/utils/aiEndpoint.js +231 -0
- package/src/utils/aiEndpoint.test.js +175 -0
- package/src/ui/public/assets/AgentView-BsN9y4Kg.css +0 -1
- package/src/ui/public/assets/WorkbenchView-CML-A0y6.css +0 -1
- package/src/ui/public/assets/WorkbenchView-jutdH9WI.js +0 -13
- package/src/ui/public/assets/_plugin-vue_export-helper-nUAWISuX.js +0 -19
- package/src/ui/public/assets/configStore-CRYvJSvr.js +0 -1
- package/src/ui/public/assets/index-BLO9MkBC.js +0 -24
- 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}
|
package/src/ui/public/index.html
CHANGED
|
@@ -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-
|
|
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-
|
|
18
|
-
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/SvgIcon-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/IconButton-
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/configStore-
|
|
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-
|
|
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-
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-
|
|
28
|
-
<link rel="modulepreload" crossorigin href="/assets/toolsStore-
|
|
29
|
-
<link rel="modulepreload" crossorigin href="/assets/CommonDialog-
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/assets/TemplateManager-
|
|
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-
|
|
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-
|
|
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
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
1079
|
-
const headers = {
|
|
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 =
|
|
1165
|
-
|
|
1166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
143
|
-
const headers = {
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: `已达单轮最大工具调用次数(${
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
176
|
+
// 抽 error.message,别把整坨 JSON 甩给用户(网关的报错说明都在 message 里)
|
|
177
|
+
throw new Error(describeAiHttpError(errText, resp.status));
|
|
171
178
|
}
|
|
172
179
|
|
|
173
180
|
// SSE 格式:每行 "data: {...}",最后 "data: [DONE]"
|