zen-gitsync 2.17.5 → 2.17.7
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 +35 -2
- package/package.json +1 -1
- package/scripts/release.js +139 -48
- package/src/aiCommit.js +6 -3
- package/src/cli/ai/agent.js +106 -311
- package/src/cli/ai/cli.integration.test.js +99 -0
- package/src/cli/ai/context.js +90 -0
- package/src/cli/ai/modelSetup.js +44 -8
- package/src/cli/ai/runtime.test.js +152 -0
- package/src/cli/ai/safety.js +27 -4
- package/src/cli/ai/safety.test.js +13 -0
- package/src/cli/ai/telemetry.js +43 -0
- package/src/cli/ai/termui.js +154 -41
- package/src/cli/ai/termui.test.js +63 -14
- package/src/cli/ai/tools.js +27 -5
- package/src/cli/ai/tools.test.js +23 -0
- package/src/cli/ai/transport.js +89 -0
- package/src/cli/ai/turn.js +126 -0
- package/src/config.js +88 -5
- package/src/ui/public/assets/{AgentView-DJOdvJEV.js → AgentView-CZc191Xm.js} +3 -3
- package/src/ui/public/assets/AgentView-CzUeyQfR.css +1 -0
- package/src/ui/public/assets/{AppVersionBadge-D2Li5_R-.js → AppVersionBadge-Gs5lUl7P.js} +2 -2
- package/src/ui/public/assets/{BranchSelector-CSd5uaVm.js → BranchSelector-IjaFk0S-.js} +1 -1
- package/src/ui/public/assets/{CommitForm-Ckg9-zay.js → CommitForm-C-sowOXH.js} +3 -3
- package/src/ui/public/assets/{CommonDialog-B8XOXtz_.js → CommonDialog-QyptFD1R.js} +1 -1
- package/src/ui/public/assets/{EditorView-Crj8S2TI.js → EditorView-CvvluFCY.js} +1 -1
- package/src/ui/public/assets/{FileDiffViewer-DL07IMz5.js → FileDiffViewer-BXVsdCxE.js} +1 -1
- package/src/ui/public/assets/{FlowExecutionViewer-DvVT19Qv.js → FlowExecutionViewer-CRxipXru.js} +1 -1
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-kRhK9IyL.js → FlowOrchestrationWorkspace-AE1ZHTKF.js} +1 -1
- package/src/ui/public/assets/{IconButton-pqSYKRT8.js → IconButton-BmSueF_H.js} +1 -1
- package/src/ui/public/assets/{LogList-BrN6qtFb.js → LogList-iaVA-_aC.js} +1 -1
- package/src/ui/public/assets/{MindmapView-CSsT0NDZ.js → MindmapView-DcG4jpCh.js} +1 -1
- package/src/ui/public/assets/{MonitorView-edRyBybQ.js → MonitorView-DO59syvl.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-DZ8VgU79.js → ProjectStartupButton-DYppceyw.js} +1 -1
- package/src/ui/public/assets/{RemoteManagerDialog-pu9szuYB.js → RemoteManagerDialog-CDbxG6pZ.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-BSFehgY5.js → RemoteRepoCard-Cko2KB8w.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-DbEydLSU.js → SourceMapView-CwWPVdz-.js} +1 -1
- package/src/ui/public/assets/{SvgIcon-BVCbrPws.js → SvgIcon-Cf7nOKc8.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-DPyYaGCE.js → TemplateManager-DWPDjWxM.js} +1 -1
- package/src/ui/public/assets/{UserInputNode-DXHeCjzG.js → UserInputNode-YOziN-5A.js} +1 -1
- package/src/ui/public/assets/WorkbenchView-DNnEpIYy.js +13 -0
- package/src/ui/public/assets/WorkbenchView-v3QFn6Ln.css +1 -0
- package/src/ui/public/assets/_plugin-vue_export-helper-CQjg8MXm.js +19 -0
- package/src/ui/public/assets/configStore-C7HOx5S1.js +1 -0
- package/src/ui/public/assets/{gitStore-BJbNtjxA.js → gitStore-DIsBd6n4.js} +1 -1
- package/src/ui/public/assets/index-FOe1cHkh.css +1 -0
- package/src/ui/public/assets/index-MmcnT2Dn.js +24 -0
- package/src/ui/public/assets/{previewSandbox-BZV6Eqhv.js → previewSandbox-TKucqLxt.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 +40 -9
- package/src/ui/server/routes/fileOpen.js +48 -2
- package/src/ui/server/routes/gAiLauncher.test.js +70 -0
- package/src/ui/server/routes/workbench/agentChat.js +34 -8
- package/src/ui/server/routes/workbench/index.js +37 -6
- package/src/ui/server/routes/workbench/jobStore.js +4 -0
- package/src/ui/server/routes/workbench/llmClient.js +15 -8
- package/src/ui/server/routes/workbench/taskRunner.js +276 -96
- package/src/ui/server/routes/workbench/taskRunner.opencode.test.js +126 -0
- 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-CKXtZAJn.css +0 -1
- package/src/ui/public/assets/WorkbenchView-DGcirla3.js +0 -13
- package/src/ui/public/assets/_plugin-vue_export-helper-C-YBnnP5.js +0 -19
- package/src/ui/public/assets/configStore-DoobmT7N.js +0 -1
- package/src/ui/public/assets/index-ClqvC4kJ.css +0 -1
- package/src/ui/public/assets/index-ndDaGoRO.js +0 -24
|
@@ -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-MmcnT2Dn.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-CQjg8MXm.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/SvgIcon-Cf7nOKc8.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/IconButton-BmSueF_H.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/configStore-C7HOx5S1.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-DIsBd6n4.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-TKucqLxt.js">
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/FileDiffViewer-BXVsdCxE.js">
|
|
28
|
+
<link rel="modulepreload" crossorigin href="/assets/toolsStore-BiC2mmC3.js">
|
|
29
|
+
<link rel="modulepreload" crossorigin href="/assets/CommonDialog-QyptFD1R.js">
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/assets/TemplateManager-DWPDjWxM.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-FOe1cHkh.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 = [
|
|
@@ -983,10 +986,10 @@ export function registerConfigRoutes({
|
|
|
983
986
|
}
|
|
984
987
|
})
|
|
985
988
|
|
|
986
|
-
//
|
|
989
|
+
// 保存通用设置(主题、语言、工作台任务执行器)
|
|
987
990
|
app.post('/api/config/save-general-settings', express.json(), async (req, res) => {
|
|
988
991
|
try {
|
|
989
|
-
const { theme, locale } = req.body
|
|
992
|
+
const { theme, locale, taskExecutor } = req.body
|
|
990
993
|
|
|
991
994
|
// 读取原始配置以保留项目设置
|
|
992
995
|
const rawConfig = await configManager.readRawConfigFile()
|
|
@@ -998,10 +1001,15 @@ export function registerConfigRoutes({
|
|
|
998
1001
|
if (locale && ['zh-CN', 'en-US'].includes(locale)) {
|
|
999
1002
|
rawConfig.locale = locale
|
|
1000
1003
|
}
|
|
1004
|
+
// 任务执行器是全局配置(跨项目共享);白名单外的值静默忽略,不落盘
|
|
1005
|
+
const normalizedExecutor = configManager.normalizeTaskExecutor(taskExecutor)
|
|
1006
|
+
if (normalizedExecutor) {
|
|
1007
|
+
rawConfig.taskExecutor = normalizedExecutor
|
|
1008
|
+
}
|
|
1001
1009
|
|
|
1002
1010
|
// 直接写入原始配置,避免覆盖项目设置
|
|
1003
1011
|
await configManager.writeRawConfigFile(rawConfig)
|
|
1004
|
-
res.json({ success: true })
|
|
1012
|
+
res.json({ success: true, taskExecutor: normalizedExecutor || undefined })
|
|
1005
1013
|
} catch (error) {
|
|
1006
1014
|
res.status(500).json({ success: false, error: error.message })
|
|
1007
1015
|
}
|
|
@@ -1051,6 +1059,28 @@ export function registerConfigRoutes({
|
|
|
1051
1059
|
}
|
|
1052
1060
|
})
|
|
1053
1061
|
|
|
1062
|
+
// 保存 AI 智能体运行时设置(aiMaxToolIterations 是全局配置,存配置文件顶层,跨项目共享)
|
|
1063
|
+
app.post('/api/config/save-ai-settings', express.json(), async (req, res) => {
|
|
1064
|
+
try {
|
|
1065
|
+
const { aiMaxToolIterations } = req.body || {}
|
|
1066
|
+
// 越界值在这里夹取到 [MIN, MAX],而不是拒绝 —— 与 loadConfig 的规范化保持同一套语义
|
|
1067
|
+
const normalized = configManager.normalizeAiMaxToolIterations(aiMaxToolIterations)
|
|
1068
|
+
if (normalized === null) {
|
|
1069
|
+
return res.status(400).json({
|
|
1070
|
+
success: false,
|
|
1071
|
+
error: `aiMaxToolIterations 非法: ${aiMaxToolIterations}`
|
|
1072
|
+
})
|
|
1073
|
+
}
|
|
1074
|
+
const rawConfig = await configManager.readRawConfigFile()
|
|
1075
|
+
rawConfig.aiMaxToolIterations = normalized
|
|
1076
|
+
await configManager.writeRawConfigFile(rawConfig)
|
|
1077
|
+
res.json({ success: true, aiMaxToolIterations: normalized })
|
|
1078
|
+
} catch (error) {
|
|
1079
|
+
logger.error('[save-ai-settings] failed:', error)
|
|
1080
|
+
res.status(500).json({ success: false, error: error.message })
|
|
1081
|
+
}
|
|
1082
|
+
})
|
|
1083
|
+
|
|
1054
1084
|
// 保存 AI 模型配置(models 是全局配置,存在配置文件顶层,跨项目共享)
|
|
1055
1085
|
app.post('/api/config/save-models', express.json(), async (req, res) => {
|
|
1056
1086
|
try {
|
|
@@ -1075,9 +1105,8 @@ export function registerConfigRoutes({
|
|
|
1075
1105
|
}
|
|
1076
1106
|
try {
|
|
1077
1107
|
const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }))
|
|
1078
|
-
|
|
1079
|
-
const headers = {
|
|
1080
|
-
if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`
|
|
1108
|
+
// 连通性探测同样要带客户端身份/会话头,否则 OpenCode 网关这条请求就被风控挡了
|
|
1109
|
+
const { url, headers } = buildAiChatRequest({ baseURL, model, apiKey })
|
|
1081
1110
|
const body = JSON.stringify({
|
|
1082
1111
|
model,
|
|
1083
1112
|
messages: [{ role: 'user', content: 'Hello, reply with just "ok".' }],
|
|
@@ -1161,9 +1190,11 @@ ${diffText || '(no staged content, please infer from the file list)'}`
|
|
|
1161
1190
|
logger.debug('[generate-commit] locale:', userLocale, '| prompt length:', prompt.length)
|
|
1162
1191
|
logger.debug('[generate-commit] prompt:\n' + prompt)
|
|
1163
1192
|
const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }))
|
|
1164
|
-
const url =
|
|
1165
|
-
|
|
1166
|
-
|
|
1193
|
+
const { url, headers } = buildAiChatRequest({
|
|
1194
|
+
baseURL: defaultModel.baseURL,
|
|
1195
|
+
model: defaultModel.model,
|
|
1196
|
+
apiKey: defaultModel.apiKey,
|
|
1197
|
+
})
|
|
1167
1198
|
const body = JSON.stringify({
|
|
1168
1199
|
model: defaultModel.model,
|
|
1169
1200
|
messages: [{ role: 'user', content: prompt }],
|
|
@@ -17,7 +17,11 @@ import { asyncRoute, HttpError } from '../utils/asyncRoute.js';
|
|
|
17
17
|
import path from 'path';
|
|
18
18
|
import os from 'os';
|
|
19
19
|
import open from 'open';
|
|
20
|
-
import { spawn, spawnSync } from 'child_process';
|
|
20
|
+
import { spawn, spawnSync, execFile } from 'child_process';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
import { promisify } from 'node:util';
|
|
23
|
+
|
|
24
|
+
const execFileAsync = promisify(execFile);
|
|
21
25
|
|
|
22
26
|
const TOOL_INSTALL_PACKAGES = Object.freeze({
|
|
23
27
|
claude: '@anthropic-ai/claude-code',
|
|
@@ -367,6 +371,32 @@ async function launchOpenCode(dirPath) {
|
|
|
367
371
|
return launchInTerminal(dirPath, 'opencode');
|
|
368
372
|
}
|
|
369
373
|
|
|
374
|
+
// Run the CLI shipped with this server, even when `g` is not in PATH or points
|
|
375
|
+
// to another install. Directory paths remain spawn options, never CMD source.
|
|
376
|
+
export async function launchGai(dirPath, {
|
|
377
|
+
platform = process.platform,
|
|
378
|
+
spawnFn = execFileAsync,
|
|
379
|
+
terminalFn = launchInTerminal,
|
|
380
|
+
} = {}) {
|
|
381
|
+
const entry = fileURLToPath(new URL('../../../gitCommit.js', import.meta.url));
|
|
382
|
+
if (platform !== 'win32') return terminalFn(dirPath, process.execPath, [entry, 'ai']);
|
|
383
|
+
|
|
384
|
+
const psLiteral = value => `'${String(value).replace(/'/g, "''")}'`;
|
|
385
|
+
const encode = value => Buffer.from(value, 'utf16le').toString('base64');
|
|
386
|
+
const command = `& ${psLiteral(process.execPath)} ${psLiteral(entry)} 'ai'`;
|
|
387
|
+
// The hidden launcher opens a visible interactive console. -NoExit leaves
|
|
388
|
+
// startup errors readable; no model request is sent until the user types.
|
|
389
|
+
const launcher = [
|
|
390
|
+
"$ErrorActionPreference = 'Stop';",
|
|
391
|
+
"Start-Process -FilePath (Join-Path $PSHOME 'powershell.exe')",
|
|
392
|
+
`-ArgumentList '-NoLogo','-NoProfile','-NoExit','-EncodedCommand','${encode(command)}'`,
|
|
393
|
+
'-WorkingDirectory (Get-Location).ProviderPath -WindowStyle Normal',
|
|
394
|
+
].join(' ');
|
|
395
|
+
return spawnFn('powershell.exe', ['-NoLogo', '-NoProfile', '-NonInteractive', '-EncodedCommand', encode(launcher)], {
|
|
396
|
+
cwd: dirPath, windowsHide: true, timeout: 10000,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
|
|
370
400
|
async function launchKimiCode(dirPath) {
|
|
371
401
|
if (process.platform === 'win32') {
|
|
372
402
|
const executable = await findKimiExecutable();
|
|
@@ -548,8 +578,24 @@ async function launchToolInstaller(installer, dirPath = process.cwd(), { update
|
|
|
548
578
|
}
|
|
549
579
|
|
|
550
580
|
export function registerFileOpenRoutes({
|
|
551
|
-
app
|
|
581
|
+
app,
|
|
582
|
+
launchAi = launchGai,
|
|
552
583
|
}) {
|
|
584
|
+
app.post('/api/open-directory-with-g-ai', asyncRoute(async (req, res) => {
|
|
585
|
+
const dirPath = req.body?.path;
|
|
586
|
+
if (typeof dirPath !== 'string' || !dirPath.trim() || /[\0\r\n]/.test(dirPath)) {
|
|
587
|
+
throw new HttpError(400, '目录路径不能为空或包含控制字符');
|
|
588
|
+
}
|
|
589
|
+
const target = path.resolve(dirPath);
|
|
590
|
+
let stat;
|
|
591
|
+
try { stat = await fs.stat(target); }
|
|
592
|
+
catch { throw new HttpError(400, '目录不存在或不可访问'); }
|
|
593
|
+
if (!stat.isDirectory()) throw new HttpError(400, '指定路径不是目录');
|
|
594
|
+
try { await launchAi(target); }
|
|
595
|
+
catch (error) { throw new HttpError(400, `无法启动 g ai: ${error.message}`); }
|
|
596
|
+
res.json({ success: true, message: '已在新终端中启动 g ai' });
|
|
597
|
+
}));
|
|
598
|
+
|
|
553
599
|
// 打开文件
|
|
554
600
|
app.post('/api/open-file', asyncRoute(async (req, res) => {
|
|
555
601
|
try {
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
import { promises as fs } from 'node:fs'
|
|
4
|
+
import os from 'node:os'
|
|
5
|
+
import path from 'node:path'
|
|
6
|
+
import { launchGai, registerFileOpenRoutes } from './fileOpen.js'
|
|
7
|
+
|
|
8
|
+
test('Windows g ai launcher keeps directory characters out of shell source', async () => {
|
|
9
|
+
const directory = "C:\\项目 & test's %name%\\current"
|
|
10
|
+
let actual
|
|
11
|
+
await launchGai(directory, { platform: 'win32', spawnFn: async (...args) => { actual = args } })
|
|
12
|
+
assert.equal(actual[0], 'powershell.exe')
|
|
13
|
+
assert.equal(actual[2].cwd, directory)
|
|
14
|
+
assert.equal(actual[2].windowsHide, true)
|
|
15
|
+
const script = Buffer.from(actual[1].at(-1), 'base64').toString('utf16le')
|
|
16
|
+
assert.doesNotMatch(script, /%name%|test's/)
|
|
17
|
+
assert.match(script, /-WorkingDirectory \(Get-Location\).ProviderPath/)
|
|
18
|
+
assert.match(script, /-WindowStyle Normal/)
|
|
19
|
+
const inner = script.match(/'-EncodedCommand','([^']+)'/)[1]
|
|
20
|
+
const command = Buffer.from(inner, 'base64').toString('utf16le')
|
|
21
|
+
assert.ok(command.includes(process.execPath.replace(/'/g, "''")))
|
|
22
|
+
assert.match(command, /gitCommit\.js' 'ai'$/)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test('POSIX launches the bundled CLI with structured arguments in the selected directory', async () => {
|
|
26
|
+
let actual
|
|
27
|
+
await launchGai('/tmp/project with spaces', { platform: 'linux', terminalFn: async (...args) => { actual = args } })
|
|
28
|
+
assert.equal(actual[0], '/tmp/project with spaces')
|
|
29
|
+
assert.equal(actual[1], process.execPath)
|
|
30
|
+
assert.equal(actual[2][1], 'ai')
|
|
31
|
+
assert.ok((await fs.stat(actual[2][0])).isFile())
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('g ai endpoint validates directories and reports launch failures', async t => {
|
|
35
|
+
const fixture = await fs.mkdtemp(path.join(os.tmpdir(), 'zen-g-ai-launch-'))
|
|
36
|
+
const project = path.join(fixture, "项目 & test's %name%")
|
|
37
|
+
await fs.mkdir(project)
|
|
38
|
+
const file = path.join(fixture, 'file.txt')
|
|
39
|
+
await fs.writeFile(file, 'not a directory')
|
|
40
|
+
t.after(async () => {
|
|
41
|
+
assert.equal(path.dirname(fixture), path.resolve(os.tmpdir()))
|
|
42
|
+
assert.ok(path.basename(fixture).startsWith('zen-g-ai-launch-'))
|
|
43
|
+
await fs.rm(fixture, { recursive: true, force: true })
|
|
44
|
+
})
|
|
45
|
+
const routes = new Map(), launches = []
|
|
46
|
+
let fail = false
|
|
47
|
+
registerFileOpenRoutes({
|
|
48
|
+
app: { get: () => {}, post: (url, handler) => routes.set(url, handler) },
|
|
49
|
+
launchAi: async directory => { if (fail) throw new Error('terminal unavailable'); launches.push(directory) },
|
|
50
|
+
})
|
|
51
|
+
const handler = routes.get('/api/open-directory-with-g-ai')
|
|
52
|
+
async function request(body) {
|
|
53
|
+
const response = { code: 200, body: null, status(code) { this.code = code; return this }, json(value) { this.body = value; return this } }
|
|
54
|
+
await handler({ method: 'POST', path: '/api/open-directory-with-g-ai', body }, response)
|
|
55
|
+
return response
|
|
56
|
+
}
|
|
57
|
+
for (const value of [undefined, '', ' ', {}, 42, 'bad\npath', file, path.join(fixture, 'missing')]) {
|
|
58
|
+
const response = await request({ path: value })
|
|
59
|
+
assert.equal(response.code, 400)
|
|
60
|
+
assert.equal(response.body.success, false)
|
|
61
|
+
}
|
|
62
|
+
assert.equal(launches.length, 0)
|
|
63
|
+
const good = await request({ path: project })
|
|
64
|
+
assert.equal(good.body.success, true)
|
|
65
|
+
assert.deepEqual(launches, [project])
|
|
66
|
+
fail = true
|
|
67
|
+
const error = await request({ path: project })
|
|
68
|
+
assert.equal(error.code, 400)
|
|
69
|
+
assert.match(error.body.error, /terminal unavailable/)
|
|
70
|
+
})
|