@runfusion/fusion 0.29.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +11265 -3612
- package/dist/client/assets/AgentDetailView-CY-O6VkV.css +1 -0
- package/dist/client/assets/AgentDetailView-Dx7T1-gM.js +18 -0
- package/dist/client/assets/AgentPermissionPolicyEditor-Cbd6SG_T.css +1 -0
- package/dist/client/assets/AgentPermissionPolicyEditor-Ia7QkynK.js +6 -0
- package/dist/client/assets/AgentsView-DBbdPWV-.js +34 -0
- package/dist/client/assets/ChatView-DYpoWnCc.js +1 -0
- package/dist/client/assets/DevServerView-DotHOFZt.js +1 -0
- package/dist/client/assets/{DirectoryPicker-Bb3TIWEa.js → DirectoryPicker-CIj3ZGKv.js} +1 -1
- package/dist/client/assets/DocumentsView-Dt27gDYa.js +1 -0
- package/dist/client/assets/EvalsView-HfWTc8Uv.js +1 -0
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-AsmRLMxm.js → ExperimentalAgentOnboardingModal-U7fXDhhN.js} +1 -1
- package/dist/client/assets/{InsightsView-j7J_vUME.js → InsightsView-C8bsAlMv.js} +3 -3
- package/dist/client/assets/{MemoryView-QWiqVDuQ.js → MemoryView-D-HLtRrr.js} +2 -2
- package/dist/client/assets/{NodesView-Cr4CXr7b.js → NodesView-w3ms-XX2.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-CPZ-82Wl.js → PiExtensionsManager-DFAZAfNn.js} +2 -2
- package/dist/client/assets/PluginManager-DN1VG7Qm.js +1 -0
- package/dist/client/assets/ReliabilityView-D0Rtd7pX.css +1 -0
- package/dist/client/assets/ReliabilityView-DAuqE-zi.js +1 -0
- package/dist/client/assets/ResearchView-DTh8FLUm.css +1 -0
- package/dist/client/assets/ResearchView-YoxEFtNB.js +1 -0
- package/dist/client/assets/{SettingsModal-BAx4gt2A.css → SettingsModal-1Y8N6MkL.css} +1 -1
- package/dist/client/assets/SettingsModal-B86XhYB1.js +31 -0
- package/dist/client/assets/{SettingsModal-8l8vfXns.js → SettingsModal-BRRPoxku.js} +1 -1
- package/dist/client/assets/{SettingsModal-ChnabMhF.css → SettingsModal-sp7SNwS9.css} +1 -1
- package/dist/client/assets/SetupWizardModal-B4eA3bpz.js +1 -0
- package/dist/client/assets/SkillsView-DZIfZoF5.js +1 -0
- package/dist/client/assets/StashRecoveryView-mKXYsqam.js +1 -0
- package/dist/client/assets/{TodoView-rSn0aPsb.js → TodoView-C6sLLEQu.js} +2 -2
- package/dist/client/assets/dashboard-view-DOY8-BIx.js +21 -0
- package/dist/client/assets/{folder-open-Bq_TweLR.js → folder-open-C_fxRMq1.js} +1 -1
- package/dist/client/assets/index-DTFPgu6_.js +695 -0
- package/dist/client/assets/index-DdvAZIzj.css +1 -0
- package/dist/client/assets/{upload-D1y22Www.js → upload-xjku_93-.js} +1 -1
- package/dist/client/assets/{users-UQdBpweI.js → users-CbALDtDk.js} +1 -1
- package/dist/client/assets/vendor-codemirror-jBKmHyH0.js +27 -0
- package/dist/client/index.html +3 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +8344 -1919
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-steps-verdict-contract.test.ts +42 -0
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +2 -2
- package/skill/fusion/references/extension-tools.md +34 -0
- package/skill/fusion/references/fusion-capabilities.md +3 -0
- package/dist/client/assets/AgentDetailView-CWyOv8HJ.js +0 -18
- package/dist/client/assets/AgentDetailView-ChIKbcEi.css +0 -1
- package/dist/client/assets/AgentsView-DljrBNE1.js +0 -34
- package/dist/client/assets/ChatView-BklDUi5_.js +0 -1
- package/dist/client/assets/DevServerView-BqcI1wXr.js +0 -1
- package/dist/client/assets/DocumentsView-BhrdTTh3.js +0 -1
- package/dist/client/assets/EvalsView-DrFp2cLg.js +0 -1
- package/dist/client/assets/PluginManager-DShC4UiM.js +0 -1
- package/dist/client/assets/ResearchView-B5wYC1KE.js +0 -1
- package/dist/client/assets/ResearchView-C7uXon3o.css +0 -1
- package/dist/client/assets/SettingsModal-CYetgxZj.js +0 -31
- package/dist/client/assets/SetupWizardModal-_IK6hTA7.js +0 -1
- package/dist/client/assets/SkillsView-Dilmj1nh.js +0 -1
- package/dist/client/assets/StashRecoveryView-BtL9aAn3.js +0 -1
- package/dist/client/assets/dashboard-view-C_G8JVU7.js +0 -21
- package/dist/client/assets/index-DjfAYMGG.css +0 -1
- package/dist/client/assets/index-tbwUVj8p.js +0 -696
- package/dist/client/assets/star-Dn0V0Cnq.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./vendor-react-K0fH_qHe.js";import{
|
|
1
|
+
import{r as e}from"./vendor-react-K0fH_qHe.js";import{dJ as C}from"./index-DTFPgu6_.js";function L(k={}){const{projectId:d,pollInterval:b=6e4,autoRefresh:p=!1,enabled:t=!0}=k,[S,o]=e.useState(null),[m,l]=e.useState(t),[E,c]=e.useState(null),[R,v]=e.useState(null),r=e.useRef(null),n=e.useRef(null),a=e.useRef(!0),s=e.useCallback(async()=>{if(!t){l(!1),c(null),o(null);return}r.current&&r.current.abort(),r.current=new AbortController,l(!0),c(null),o(null);try{const u=await C(d);if(!a.current)return;o(u),c(null),v(new Date),l(!1)}catch(u){if(u instanceof Error&&u.name==="AbortError"||!a.current)return;const A=u instanceof Error?u.message:"Failed to fetch memory backend status";c(A),l(!1)}},[t,d]);e.useEffect(()=>(a.current=!0,t?(s(),()=>{a.current=!1}):(r.current&&r.current.abort(),o(null),c(null),l(!1),()=>{a.current=!1})),[t,s]),e.useEffect(()=>{if(!(!t||!p))return n.current=setInterval(()=>{s()},b),()=>{n.current&&(clearInterval(n.current),n.current=null)}},[t,p,b,s]),e.useEffect(()=>()=>{a.current=!1,r.current&&r.current.abort(),n.current&&(clearInterval(n.current),n.current=null)},[]);const h=e.useCallback(()=>s(),[s]),f=m?null:S,B=f?.currentBackend??null,i=f?.capabilities??null,y=f?.availableBackends??[],I=i?.readable??!1,g=i?.writable??!1,w=i?.supportsAtomicWrite??!1;return{status:f,currentBackend:B,capabilities:i,availableBackends:y,isReadable:I,isWritable:g,supportsAtomicWrite:w,loading:m,error:E,lastUpdated:R,refresh:h}}export{L as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 2 + var(--space-xs) / 2);display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-help-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-help-btn{display:inline-flex;align-items:center}@media(max-width:768px){.settings-modal .modal-header{flex-wrap:nowrap;align-items:center;column-gap:var(--space-sm)}.settings-modal-heading{flex:1 1 0;min-width:0}.settings-update-check{flex-wrap:wrap;row-gap:var(--space-xs)}.settings-header-actions{margin-left:auto;margin-right:var(--space-sm)}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:12px;font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 2)}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 4);border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal{width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:100dvh;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.modal.settings-modal[style*=--keyboard-overlap]{height:var(--vv-height, 100dvh);min-height:var(--vv-height, 100dvh);max-height:var(--vv-height, 100dvh);transform:translateY(var(--vv-offset-top, 0px));will-change:transform}}.settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:.85rem;color:var(--text-muted);font-weight:500}.settings-update-check{display:flex;align-items:center;gap:var(--space-sm)}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{font-size:.85rem;font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--text-muted)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.backup-stats{display:flex;align-items:center;gap:var(--space-lg);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent)}.backup-stat{display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:var(--space-xs);min-width:0}.backup-stat-value{color:var(--text);font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.backup-stat-label{color:var(--text-muted);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.backup-list{margin-top:var(--space-sm)}.backup-list summary{padding:var(--space-sm) 0;color:var(--text-muted);cursor:pointer;transition:color var(--transition-fast)}.backup-list summary:hover{color:var(--text)}.backup-list summary:focus-visible{outline:none;border-radius:var(--radius-sm);box-shadow:var(--focus-ring-strong)}.backup-list ul{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;margin-top:var(--space-sm);padding:0;list-style:none}.backup-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) 0;border-top:var(--btn-border-width) solid color-mix(in srgb,var(--border) 80%,transparent)}.backup-list li code{min-width:0;color:var(--text);font-family:var(--font-mono);font-size:.75rem;white-space:nowrap;overflow-x:auto}.backup-size{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:right;white-space:nowrap}@media(max-width:768px){.backup-stats{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.backup-stat{align-items:flex-start}.backup-list ul{max-height:calc(var(--space-xl) * 9 + var(--space-md));overflow-y:auto;-webkit-overflow-scrolling:touch}.backup-list li code{white-space:normal;word-break:break-all}}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-mobile-section-picker{display:none}.settings-sidebar{width:170px;min-width:170px;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;padding:var(--space-sm) var(--space-sm);gap:calc(var(--space-xs) / 2);background:color-mix(in srgb,var(--text) 10%,transparent);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-research-source-locked{cursor:default;color:var(--text-muted)!important}.settings-research-source-locked input[type=checkbox]{cursor:not-allowed}.settings-research-source-grid,.settings-research-limits-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.settings-research-limit-field{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-research-limits-error{grid-column:1 / -1}@media(max-width:768px){.settings-research-source-grid,.settings-research-limits-grid{grid-template-columns:1fr}}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:13px;font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;text-align:left;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:4px 0 12px;scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--transition-normal)}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:14px;font-weight:600;padding:var(--space-lg) var(--space-xl) var(--space-md);margin:0 0 var(--space-md);color:var(--text);border-bottom:1px solid var(--border)}.settings-content>.settings-section-heading:first-child,.settings-modal-section>.settings-section-heading:first-child{padding-top:var(--space-md)}.settings-section-heading--spaced{margin-top:var(--space-lg)}.settings-section-description{margin:0;padding:0 var(--space-xl);margin-bottom:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);padding:0 var(--space-xl);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{margin-right:6px;display:inline-flex;vertical-align:middle;color:var(--text-muted)}.settings-scope-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-xl);margin:0 var(--space-xl) var(--space-xs);font-size:12px;border-radius:var(--radius-md);color:var(--text-muted)}.settings-scope-global{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-info) 40%,transparent)}.settings-scope-project{background:color-mix(in srgb,var(--color-success) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.settings-scope-mixed{background:color-mix(in srgb,var(--triage) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--triage) 40%,transparent)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:12px;color:var(--text-muted)}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:.9em}.settings-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs))}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option-content{display:inline-flex;align-items:center;gap:var(--space-xs)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-research-provider-group{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-research-provider-advanced-details{margin-left:var(--space-md)}.settings-research-empty-state{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}@media(max-width:768px){.settings-research-provider-advanced-details{margin-left:0}}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:12px;color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}@media(max-width:768px){.settings-note{padding:0 var(--space-lg)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap;margin:0 var(--space-lg) var(--space-md)}.remote-share-block{margin:0 var(--space-lg) var(--space-md)}.remote-status-url{width:100%;margin-left:0;font-size:.8em}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-lg) var(--space-md)}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:12px;font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.notification-test-feedback{display:flex;flex-direction:column;gap:var(--space-xs);margin-top:var(--space-sm)}.notification-test-feedback-item{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm)}.notification-test-feedback-item--success{border-color:color-mix(in srgb,var(--color-success) 45%,var(--border));background:color-mix(in srgb,var(--color-success) 8%,transparent);color:var(--color-success)}.notification-test-feedback-item--error{border-color:color-mix(in srgb,var(--color-error) 45%,var(--border));background:color-mix(in srgb,var(--color-error) 8%,transparent);color:var(--color-error)}@media(max-width:768px){.notification-provider-actions{flex-direction:column}.notification-provider-actions .btn{width:100%}}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:12px}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:12px}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg);display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-editor-form-group{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:11px;font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:12px}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:12px}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.auth-panel-body{padding-inline:var(--space-md)}.auth-section-hint{padding:var(--space-md) var(--space-lg);margin-bottom:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:13px;color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:calc(var(--space-sm) + var(--space-xs) / 2)}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:var(--space-xs);padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-xs);overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:12px;color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-apikey-section{display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--bg-input);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:13px;width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:11px;color:var(--color-error);padding-right:4px}.auth-provider-actions-row{display:inline-flex;align-items:center;gap:var(--space-sm)}.auth-key-hint{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--todo) 20%,transparent);color:var(--todo)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-description{font-size:13px;color:var(--text-dim);padding-inline:var(--space-xl);margin-block:0 var(--space-md);line-height:1.5}.settings-token-cap-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.settings-model-lane-control-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-control-main{flex:1}.settings-summarization-actions{justify-content:flex-start}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:12px;overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-mobile-section-picker label{color:var(--text-muted);font-weight:600;text-transform:uppercase}.settings-mobile-section-picker select{width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:calc(var(--space-xs) + var(--space-xs) / 2) var(--space-md);white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.notification-provider-card{margin:0 var(--space-lg) var(--space-md)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.settings-content .form-group small{overflow-wrap:break-word;word-break:break-all}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-lg) var(--space-lg) var(--space-md);margin:0 0 var(--space-md)}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-lg)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-lg);padding-right:var(--space-lg)}.form-group{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.settings-scope-banner{padding:var(--space-sm) var(--space-lg)}.memory-editor-frame{min-height:65vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-lg) var(--space-md)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0 var(--space-lg)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2);gap:var(--space-sm)}.auth-section-hint{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-md);padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-group{margin-bottom:var(--space-md)}.auth-group-label{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-card{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-sm)}.auth-provider-header{flex-wrap:wrap;padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2);gap:10px}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-actions-row{width:100%;justify-content:flex-end}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2) 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm) var(--space-md)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}.settings-node-routing-note{padding:var(--space-sm) var(--space-md);font-size:12px}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:12px;color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}}
|
|
1
|
+
.settings-header-actions{--settings-header-action-height: calc(var(--space-md) * 2 + var(--space-xs) / 2);display:flex;align-items:stretch;gap:var(--space-xs);margin-left:auto;margin-right:var(--space-sm)}.settings-header-actions>.settings-github-star-btn,.settings-header-actions>.settings-header-help-btn{height:var(--settings-header-action-height);box-sizing:border-box}.settings-header-help-btn{display:inline-flex;align-items:center}@media(max-width:768px){.settings-modal .modal-header{flex-wrap:nowrap;align-items:center;column-gap:var(--space-sm)}.settings-modal-heading{flex:1 1 0;min-width:0}.settings-update-check{flex-wrap:wrap;row-gap:var(--space-xs)}.settings-header-actions{margin-left:auto;margin-right:var(--space-sm)}}.settings-github-star-btn{display:inline-flex;align-items:stretch;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--card);color:var(--text);font-size:12px;font-weight:500;text-decoration:none;overflow:hidden;transition:border-color var(--transition-fast),background var(--transition-fast)}.settings-github-star-btn:hover{border-color:var(--text-muted);background:var(--card-hover)}.settings-github-star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-color:var(--todo)}.settings-github-star-btn__action{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 2)}.settings-github-star-btn__count{display:inline-flex;align-items:center;padding:var(--space-xs) calc(var(--space-sm) + var(--space-xs) / 4);border-left:var(--btn-border-width) solid var(--border);background:color-mix(in srgb,var(--surface) 60%,var(--card));color:var(--text-muted);font-variant-numeric:tabular-nums}.settings-modal{width:min(95vw,1100px);max-width:95vw;min-width:520px;height:80vh;min-height:480px;max-height:calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);overflow:hidden;resize:both}@media(max-width:768px){.modal-overlay.settings-modal-overlay,.modal-overlay:has(.settings-modal){padding:0;inset:0;align-items:stretch;justify-content:stretch}.modal.settings-modal{width:100vw;min-width:0;max-width:100vw;height:100dvh;min-height:100dvh;max-height:100dvh;margin:0;border:none;border-radius:0;resize:none;flex:1 1 auto}.modal.settings-modal[style*=--keyboard-overlap]{height:var(--vv-height, 100dvh);min-height:var(--vv-height, 100dvh);max-height:var(--vv-height, 100dvh);transform:translateY(var(--vv-offset-top, 0px));will-change:transform}}.settings-modal-heading{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-modal-heading h3{margin:0}.settings-modal-version{margin:0;font-size:.85rem;color:var(--text-muted);font-weight:500}.settings-update-check{display:flex;align-items:center;gap:var(--space-sm)}.settings-version-check-btn{--settings-inline-touch-target: calc(var(--space-lg) + var(--space-lg) + var(--space-xs));display:inline-flex;align-items:center;gap:var(--space-xs);margin:0;min-height:var(--settings-inline-touch-target);padding:var(--space-xs) var(--space-sm);border:none;background:transparent;color:var(--text-muted);cursor:pointer;transition:opacity var(--transition-fast),box-shadow var(--transition-fast)}.settings-version-check-btn:hover:not(:disabled){opacity:.85}.settings-version-check-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.settings-version-check-btn:disabled{cursor:default;opacity:.7}.settings-version-check-btn svg{color:var(--text-muted)}.settings-version-check-btn svg.spinning{animation:settings-update-spin 1s linear infinite}.settings-update-result{font-size:.85rem;font-weight:500}.settings-update-result--up-to-date{color:var(--color-success)}.settings-update-result--available{color:var(--color-info)}.settings-update-result--error{color:var(--text-muted)}.settings-update-result-link{color:var(--color-info);text-decoration:underline;transition:color var(--transition-fast),box-shadow var(--transition-fast)}.settings-update-result-link:hover{color:color-mix(in srgb,var(--color-info) 80%,var(--text))}.settings-update-result-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}@keyframes settings-update-spin{to{transform:rotate(360deg)}}.backup-stats{display:flex;align-items:center;gap:var(--space-lg);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent)}.backup-stat{display:flex;flex:1 1 0;flex-direction:column;align-items:center;gap:var(--space-xs);min-width:0}.backup-stat-value{color:var(--text);font-size:1rem;font-weight:600;font-variant-numeric:tabular-nums}.backup-stat-label{color:var(--text-muted);font-size:.75rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.backup-list{margin-top:var(--space-sm)}.backup-list summary{padding:var(--space-sm) 0;color:var(--text-muted);cursor:pointer;transition:color var(--transition-fast)}.backup-list summary:hover{color:var(--text)}.backup-list summary:focus-visible{outline:none;border-radius:var(--radius-sm);box-shadow:var(--focus-ring-strong)}.backup-list ul{display:flex;flex-direction:column;gap:var(--space-xs);margin:0;margin-top:var(--space-sm);padding:0;list-style:none}.backup-list li{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) 0;border-top:var(--btn-border-width) solid color-mix(in srgb,var(--border) 80%,transparent)}.backup-list li code{min-width:0;color:var(--text);font-family:var(--font-mono);font-size:.75rem;white-space:nowrap;overflow-x:auto}.backup-size{color:var(--text-muted);font-family:var(--font-mono);font-size:.75rem;text-align:right;white-space:nowrap}@media(max-width:768px){.backup-stats{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.backup-stat{align-items:flex-start}.backup-list ul{max-height:calc(var(--space-xl) * 9 + var(--space-md));overflow-y:auto;-webkit-overflow-scrolling:touch}.backup-list li code{white-space:normal;word-break:break-all}}.settings-layout{display:flex;flex:1;flex-direction:row;min-height:0;overflow:hidden}.settings-mobile-section-picker{display:none}.settings-sidebar{width:170px;min-width:170px;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto;padding:var(--space-sm) var(--space-sm);gap:calc(var(--space-xs) / 2);background:color-mix(in srgb,var(--text) 10%,transparent);scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-sidebar::-webkit-scrollbar{width:6px}.settings-sidebar::-webkit-scrollbar-track{background:transparent}.settings-sidebar::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-sidebar::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-research-source-locked{cursor:default;color:var(--text-muted)!important}.settings-research-source-locked input[type=checkbox]{cursor:not-allowed}.settings-research-source-grid,.settings-research-limits-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.settings-research-limit-field{display:flex;flex-direction:column;gap:var(--space-xs)}.settings-research-limits-error{grid-column:1 / -1}@media(max-width:768px){.settings-research-source-grid,.settings-research-limits-grid{grid-template-columns:1fr}}.settings-nav-item{display:block;width:100%;padding:var(--space-sm) var(--space-md);font-size:13px;font-weight:500;color:var(--text-muted);background:none;border:none;border-left:3px solid transparent;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;text-align:left;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.settings-nav-item:hover{background:var(--bg);color:var(--text);border-left-color:var(--border)}.settings-nav-item:focus-visible{box-shadow:var(--focus-ring-strong);outline:none}.settings-nav-item.active{background:var(--bg);color:var(--todo);font-weight:600;border-left-color:var(--todo)}.settings-group-header{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);padding:var(--space-md) var(--space-md) var(--space-xs);margin-top:var(--space-sm);user-select:none}.settings-group-header:first-child{margin-top:0}.settings-content{flex:1;overflow-x:hidden;overflow-y:auto;padding:4px 0 12px;scrollbar-color:var(--border) transparent;scrollbar-width:thin}.settings-content::-webkit-scrollbar{width:6px}.settings-content::-webkit-scrollbar-track{background:transparent}.settings-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-sm)}.settings-content::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.settings-content>*{animation:settingsFadeIn var(--transition-normal)}@keyframes settingsFadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.settings-section-heading{font-size:14px;font-weight:600;padding:var(--space-lg) var(--space-xl) var(--space-md);margin:0 0 var(--space-md);color:var(--text);border-bottom:1px solid var(--border)}.settings-content>.settings-section-heading:first-child,.settings-modal-section>.settings-section-heading:first-child{padding-top:var(--space-md)}.settings-section-heading--spaced{margin-top:var(--space-lg)}.settings-section-description{margin:0;padding:0 var(--space-xl);margin-bottom:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-plugins-subsection-toggle{display:inline-flex;gap:var(--space-xs);padding:0 var(--space-xl);margin:var(--space-md) 0}.settings-plugins-subsection-btn{display:inline-flex;align-items:center;justify-content:center;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-pill);background:var(--surface);color:var(--text-muted);font-size:.85rem;font-weight:600;padding:var(--space-xs) var(--space-md);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-plugins-subsection-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.settings-plugins-subsection-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.settings-plugins-subsection-btn.active{background:color-mix(in srgb,var(--todo) 14%,transparent);border-color:color-mix(in srgb,var(--todo) 45%,var(--border));color:var(--todo)}.settings-plugins-subsection-panel{padding-bottom:var(--space-md)}.settings-scope-icon{margin-right:6px;display:inline-flex;vertical-align:middle;color:var(--text-muted)}.settings-scope-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-xl);margin:0 var(--space-xl) var(--space-xs);font-size:12px;border-radius:var(--radius-md);color:var(--text-muted)}.settings-scope-global{background:color-mix(in srgb,var(--color-info) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-info) 40%,transparent)}.settings-scope-project{background:color-mix(in srgb,var(--color-success) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--color-success) 40%,transparent)}.settings-scope-mixed{background:color-mix(in srgb,var(--triage) 8%,transparent);border-left:3px solid color-mix(in srgb,var(--triage) 40%,transparent)}.settings-note{display:block;padding:0 var(--space-xl);margin-top:var(--space-xs);font-size:12px;color:var(--text-muted)}.settings-overlap-ignore-group code{font-family:var(--font-mono);font-size:.9em}.settings-button-row{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.settings-raw-output{margin:var(--space-sm) 0 0;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);max-height:calc(var(--space-2xl) * 7);overflow:auto;font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs))}.settings-url-output{display:block;margin-top:var(--space-xs);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));overflow-wrap:anywhere;word-break:break-word;overflow-x:auto;max-width:100%}.settings-qr-preview{margin-top:var(--space-sm);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-qr-preview-label{margin:0;font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.settings-qr-preview-image-wrap{width:fit-content;max-width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--card)}.settings-qr-preview-image{display:block;width:min(calc(var(--space-2xl) * 6),100%);height:auto;aspect-ratio:1 / 1}.remote-provider-selector{display:flex;gap:var(--space-xs);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-xs);background:var(--surface)}.remote-provider-option{position:relative;flex:1;cursor:pointer}.remote-provider-option input{position:absolute;opacity:0;width:0;height:0}.remote-provider-option span{display:block;padding:var(--space-sm) var(--space-md);text-align:center;border-radius:var(--radius-sm);border:var(--btn-border-width) solid transparent;color:var(--text-muted);transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.remote-provider-option-content{display:inline-flex;align-items:center;gap:var(--space-xs)}.remote-provider-option input:checked+span{background:var(--card);color:var(--text);border-color:var(--border)}.remote-provider-option input:focus-visible+span{box-shadow:var(--focus-ring-strong)}.remote-status-bar{--status-color: var(--text-muted);display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);margin:0 var(--space-xl) var(--space-md);background:color-mix(in srgb,var(--status-color) 10%,transparent)}.remote-status-bar--running{--status-color: var(--color-success)}.remote-status-bar--starting{--status-color: var(--color-warning)}.remote-status-bar--error{--status-color: var(--color-error)}.remote-status-bar--stopped{--status-color: var(--text-muted)}.remote-share-block{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--text-muted) 5%,transparent)}.remote-share-row{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-share-row .settings-qr-preview-image{margin-top:var(--space-xs)}.remote-status-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;display:inline-block;flex-shrink:0}.remote-status-dot--running{background:var(--color-success)}.remote-status-dot--starting{background:var(--color-warning)}.remote-status-dot--error{background:var(--color-error)}.remote-status-dot--stopped{background:var(--text-muted)}.remote-status-url{margin-left:auto;font-family:var(--font-mono);overflow-wrap:anywhere;word-break:break-word;user-select:all}.remote-provider-settings{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-cli-detection{display:flex;align-items:flex-start;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm)}.remote-cli-detection--available{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.remote-cli-detection--missing{background:color-mix(in srgb,var(--color-warning) 10%,transparent);color:var(--color-warning)}.remote-cli-detection-content{display:flex;flex-direction:column;gap:var(--space-xs);color:var(--text)}.remote-cli-detection .btn{align-self:flex-start}.remote-cli-install-error{color:var(--color-error)}.remote-cli-manual{color:var(--text-dim)}.remote-external-tunnel-panel{display:flex;flex-direction:column;gap:var(--space-sm);margin:0 var(--space-xl) var(--space-md);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.remote-external-tunnel-header{display:flex;align-items:center;gap:var(--space-sm);color:var(--color-info)}.remote-external-tunnel-qr{display:flex;flex-direction:column;gap:var(--space-xs)}.remote-external-tunnel-actions{display:flex;flex-direction:column;gap:var(--space-sm)}.remote-advanced-details{margin:var(--space-lg) var(--space-xl) 0;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);background:var(--surface)}.remote-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-advanced-details>summary::-webkit-details-marker{display:none}.remote-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-advanced-details[open]>summary:before{content:"▾"}.settings-option-details{margin-top:var(--space-xs)}.settings-research-provider-group{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-research-provider-advanced-details{margin-left:var(--space-md)}.settings-research-empty-state{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}@media(max-width:768px){.settings-research-provider-advanced-details{margin-left:0}}.settings-option-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.settings-option-details>summary::-webkit-details-marker{display:none}.settings-option-details>summary:before{content:"▸";margin-right:var(--space-xs)}.settings-option-details[open]>summary:before{content:"▾"}.remote-cf-advanced-details{margin-top:var(--space-xs)}.remote-cf-advanced-details>summary{cursor:pointer;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));list-style:none}.remote-cf-advanced-details>summary::-webkit-details-marker{display:none}.remote-cf-advanced-details>summary:before{content:"▸";margin-right:var(--space-xs)}.remote-cf-advanced-details[open]>summary:before{content:"▾"}.remote-cf-advanced-fields{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.remote-tunnel-actions{margin-top:var(--space-md)}.remote-tunnel-actions .btn{width:100%}.settings-overlap-ignore-list{display:flex;flex-direction:column;gap:var(--space-sm);margin:var(--space-sm) 0}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-sm);align-items:center}.settings-overlap-path-picker-modal{max-width:min(960px,calc(100vw - var(--space-2xl)))}.settings-overlap-path-picker-body{display:flex;flex-direction:column;gap:var(--space-sm);max-height:min(70vh,720px)}.settings-overlap-path-picker-note{margin:0;font-size:12px;color:var(--text-muted)}.settings-section-divider{border-top:1px solid var(--border);margin:var(--space-lg) var(--space-xl)}@media(max-width:768px){.settings-note{padding:0 var(--space-lg)}.settings-overlap-ignore-row,.settings-overlap-ignore-path-controls{grid-template-columns:minmax(0,1fr)}.settings-overlap-ignore-row>.btn{justify-self:start}.settings-overlap-path-picker-modal{max-width:calc(100vw - var(--space-md))}.remote-provider-selector{flex-direction:column}.remote-status-bar{flex-wrap:wrap;margin:0 var(--space-lg) var(--space-md)}.remote-share-block{margin:0 var(--space-lg) var(--space-md)}.remote-status-url{width:100%;margin-left:0;font-size:.8em}.remote-provider-option,.remote-tunnel-actions .btn{min-height:36px}.remote-cli-detection,.remote-external-tunnel-panel{margin:0 var(--space-lg) var(--space-md)}}.ntfy-advanced-disclosure{margin-top:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.ntfy-advanced-disclosure>summary{cursor:pointer;list-style:none;padding:var(--space-sm) var(--space-md);font-size:12px;font-weight:600;color:var(--text)}.ntfy-advanced-disclosure>summary::-webkit-details-marker{display:none}.ntfy-advanced-content{padding:0 var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.settings-inline-link{color:var(--todo);text-decoration:none;transition:text-decoration var(--transition-fast)}.settings-inline-link:hover{text-decoration:underline}.settings-inline-link:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.notification-provider-card{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-lg);background:var(--surface);margin:0 var(--space-xl) var(--space-lg);overflow:hidden}.notification-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border)}.notification-provider-body{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.notification-provider-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);margin-top:var(--space-md)}.notification-test-feedback{display:flex;flex-direction:column;gap:var(--space-xs);margin-top:var(--space-sm)}.notification-test-feedback-item{border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm)}.notification-test-feedback-item--success{border-color:color-mix(in srgb,var(--color-success) 45%,var(--border));background:color-mix(in srgb,var(--color-success) 8%,transparent);color:var(--color-success)}.notification-test-feedback-item--error{border-color:color-mix(in srgb,var(--color-error) 45%,var(--border));background:color-mix(in srgb,var(--color-error) 8%,transparent);color:var(--color-error)}@media(max-width:768px){.notification-provider-actions{flex-direction:column}.notification-provider-actions .btn{width:100%}}.memory-status-message{display:flex;gap:var(--space-md);align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.memory-status-message span{min-width:0}.memory-retrieval-test{margin-top:var(--space-lg)}.memory-test-result{margin:0 var(--space-xl) var(--space-lg);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-test-result strong,.memory-test-result span{color:var(--text);font-size:12px}.memory-test-result small{display:block;margin-top:var(--space-xs);color:var(--text-muted);font-size:12px}.memory-test-result ul{margin:var(--space-md) 0 0;padding:0;list-style:none}.memory-test-result li{padding-top:var(--space-sm);border-top:var(--btn-border-width) solid var(--border)}.memory-test-result li+li{margin-top:var(--space-sm)}.memory-test-result p{margin:var(--space-xs) 0 0;color:var(--text-muted);font-size:12px;line-height:1.5;overflow-wrap:anywhere}.memory-editor-section{margin-top:var(--space-lg);display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-editor-form-group{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.memory-file-summary{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-xs) var(--space-md);align-items:center;margin:0 var(--space-xl) var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.memory-file-summary span{display:inline-flex;align-items:center;justify-content:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 12%,transparent);font-size:11px;font-weight:600}.memory-file-summary strong{min-width:0;overflow-wrap:anywhere;color:var(--text);font-family:var(--font-mono);font-size:12px}.memory-file-summary small{grid-column:2;color:var(--text-muted);font-size:12px}.memory-editor-frame{min-height:50vh;border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.auth-panel-body{padding-inline:var(--space-md)}.auth-section-hint{padding:var(--space-md) var(--space-lg);margin-bottom:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:13px;color:var(--text-muted);border-left:3px solid var(--text-muted)}.auth-provider-group{margin-bottom:calc(var(--space-sm) + var(--space-xs) / 2)}.auth-group-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--text-muted);margin-bottom:var(--space-xs);padding:0 4px}.auth-provider-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-xs);overflow:hidden;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.auth-provider-card:hover{border-color:var(--text-dim)}.auth-provider-card--authenticated{border-color:color-mix(in srgb,var(--color-success) 40%,var(--border));background:color-mix(in srgb,var(--color-success) 5%,var(--surface))}.auth-provider-card--authenticated:hover{border-color:color-mix(in srgb,var(--color-success) 60%,var(--border))}.auth-provider-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);gap:12px}.auth-provider-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.auth-provider-info strong{font-weight:500;color:var(--text)}.auth-provider-icon-slot{display:inline-flex;align-items:center;justify-content:center;inline-size:calc(var(--space-md) + var(--space-xs) * 2);block-size:calc(var(--space-md) + var(--space-xs) * 2);flex-shrink:0}.auth-provider-icon-slot .provider-icon{display:inline-flex}.auth-hint{display:block;padding:12px 4px 0;font-size:12px;color:var(--text-muted);border-top:1px solid var(--border);margin-top:8px}.auth-apikey-section{display:flex;flex-direction:column;gap:var(--space-xs);align-items:flex-end;flex-shrink:0}.auth-apikey-input-row{display:flex;gap:6px;align-items:center}.auth-apikey-input{background:var(--bg-input);border:1px solid var(--border);border-radius:6px;color:var(--text);padding:6px 10px;font-size:13px;width:180px;font-family:monospace}.auth-apikey-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.auth-apikey-input:disabled{opacity:.6}.auth-apikey-progress{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-right:4px}.auth-apikey-error{font-size:11px;color:var(--color-error);padding-right:4px}.auth-provider-actions-row{display:inline-flex;align-items:center;gap:var(--space-sm)}.auth-device-code-panel{margin-top:var(--space-sm);padding:var(--space-sm);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,transparent);display:flex;flex-direction:column;gap:var(--space-sm)}.auth-device-code-pill{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .5);letter-spacing:var(--space-xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-pill);border:var(--btn-border-width) solid var(--border);background:var(--card);color:var(--text);display:inline-flex;align-self:flex-start}.auth-key-hint{font-family:var(--font-mono);font-size:12px;color:var(--text-muted);display:inline-block;margin-top:var(--space-xs);user-select:none}.settings-lane-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;white-space:nowrap}.settings-lane-badge--override{background-color:color-mix(in srgb,var(--todo) 20%,transparent);color:var(--todo)}.settings-lane-badge--inherited{background-color:color-mix(in srgb,var(--text-muted) 15%,transparent);color:var(--text-muted)}.settings-description{font-size:13px;color:var(--text-dim);padding-inline:var(--space-xl);margin-block:0 var(--space-md);line-height:1.5}.settings-token-cap-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-label-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-xs)}.settings-model-lane-control-row{display:flex;align-items:center;gap:var(--space-sm)}.settings-model-lane-control-main{flex:1}.settings-summarization-actions{justify-content:flex-start}.settings-model-presets{display:flex;flex-direction:column;gap:var(--space-md)}.settings-preset-list{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-item{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--card)}.settings-preset-item-meta{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.settings-preset-item-meta strong{color:var(--text);overflow-wrap:anywhere}.settings-preset-summary{font-size:12px;overflow-wrap:anywhere}.settings-preset-item-actions{display:flex;gap:var(--space-xs);flex-wrap:wrap;justify-content:flex-end}.settings-preset-actions{display:flex;justify-content:flex-start}.settings-preset-editor{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:color-mix(in srgb,var(--surface) 85%,var(--card))}.settings-preset-editor-fields{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-preset-editor .form-group{padding:0}.settings-preset-editor-actions{justify-content:flex-start;margin-top:0;padding:0}.settings-preset-auto-select{margin-top:var(--space-sm)}.settings-preset-size-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-sm)}.settings-preset-size-row{padding:0}@media(max-width:768px){.settings-layout{flex-direction:column;min-height:0}.settings-mobile-section-picker{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-md) var(--space-lg);border-bottom:var(--btn-border-width) solid var(--border);background:var(--surface)}.settings-mobile-section-picker label{color:var(--text-muted);font-weight:600;text-transform:uppercase}.settings-mobile-section-picker select{width:100%}.settings-mobile-section-picker select:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.settings-sidebar{display:none}.settings-nav-item{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);border-left:none;border-bottom:2px solid transparent;border-radius:var(--radius-md) var(--radius-md) 0 0;padding:calc(var(--space-xs) + var(--space-xs) / 2) var(--space-md);white-space:nowrap}.settings-nav-item:hover{border-left-color:transparent;border-bottom-color:var(--border)}.settings-nav-item.active{border-left-color:transparent;border-bottom-color:var(--todo)}.settings-group-header{display:none}.notification-provider-card{margin:0 var(--space-lg) var(--space-md)}.notification-provider-header{padding:var(--space-sm) var(--space-md)}.notification-provider-body{padding:var(--space-md)}.settings-scope-icon{margin-right:0}.settings-content{flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.settings-content .form-group small{overflow-wrap:break-word;word-break:break-all}.settings-content input,.settings-content select,.settings-content textarea{font-size:16px}.settings-section-heading{padding:var(--space-lg) var(--space-lg) var(--space-md);margin:0 0 var(--space-md)}.settings-plugins-subsection-toggle{display:flex;width:100%;padding:0 var(--space-lg)}.settings-plugins-subsection-btn{flex:1;min-height:36px}.settings-plugins-subsection-panel{padding-left:var(--space-lg);padding-right:var(--space-lg)}.form-group{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.settings-scope-banner{padding:var(--space-sm) var(--space-lg)}.memory-editor-frame{min-height:65vh}.memory-file-summary{grid-template-columns:1fr;margin:0 var(--space-lg) var(--space-md)}.memory-status-message{align-items:stretch;flex-direction:column}.memory-file-summary span{justify-content:flex-start}.memory-file-summary small{grid-column:auto}.settings-description{padding:0 var(--space-lg)}.settings-content .btn,.settings-preset-item-actions .btn{min-height:36px}.auth-provider-row{flex-wrap:wrap;padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2);gap:var(--space-sm)}.auth-section-hint{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-md);padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-group{margin-bottom:var(--space-md)}.auth-group-label{padding:0 calc(var(--space-md) + var(--space-xs) / 2)}.auth-provider-card{margin:0 calc(var(--space-md) + var(--space-xs) / 2) var(--space-sm)}.auth-provider-header{flex-wrap:wrap;padding:calc(var(--space-sm) + var(--space-xs) / 2) calc(var(--space-md) + var(--space-xs) / 2);gap:10px}.auth-provider-header>div:not(.auth-provider-info):not(.auth-apikey-section){margin-left:auto}.auth-provider-actions-row{width:100%;justify-content:flex-end}.auth-device-code-panel{width:100%}.auth-device-code-pill{max-width:100%;overflow-wrap:anywhere}.auth-provider-info{width:100%;flex-basis:100%}.auth-apikey-section{width:100%;flex-basis:100%;align-items:flex-end}.auth-apikey-input-row{width:100%;flex-wrap:wrap;justify-content:flex-end}.auth-apikey-input{flex:1;min-width:120px;width:auto}.auth-apikey-input-row .btn{flex-shrink:0;margin-left:auto}.auth-hint{padding:var(--space-md) calc(var(--space-md) + var(--space-xs) / 2) 0}.settings-model-presets{gap:var(--space-sm)}.settings-preset-item{flex-direction:column;align-items:stretch;padding:var(--space-sm) var(--space-md)}.settings-preset-item-actions{justify-content:flex-start}.settings-preset-editor{padding:var(--space-sm) var(--space-md)}.settings-preset-editor-actions{flex-wrap:wrap}.settings-preset-size-grid{grid-template-columns:1fr;gap:var(--space-xs)}.settings-node-routing-note{padding:var(--space-sm) var(--space-md);font-size:12px}}.settings-node-routing-note{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);margin-top:var(--space-sm);color:var(--text-muted);font-size:13px;line-height:1.5}.settings-node-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:12px;color:var(--text-muted)}.auth-advanced-disclosure{margin-top:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.auth-advanced-disclosure>summary{cursor:pointer;padding:var(--space-sm) var(--space-md)}.auth-advanced-content{display:flex;flex-direction:column;gap:var(--space-sm);padding:0 var(--space-md) var(--space-md)}.auth-custom-provider-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.auth-custom-provider-actions{display:flex;gap:var(--space-sm)}@media(max-width:768px){.auth-custom-provider-item{flex-direction:column;align-items:flex-start}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{cq as w,b3 as L,cr as O,cs as _,ct as $,X as W,b as Y,C as k,L as q}from"./index-DTFPgu6_.js";import{D as G}from"./DirectoryPicker-CIj3ZGKv.js";import{s as f}from"./projectDetection-G3XuxD2X.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";import"./folder-open-C_fxRMq1.js";function ee({onProjectRegistered:m,onClose:p}){const C="https://github.com/runfusion/fusion/discussions",[z,y]=o.useState(!0),[s,n]=o.useState(()=>({step:w()?"manual":"auth",manualMode:"existing",manualPath:"",manualCloneUrl:"",manualName:"",manualIsolationMode:"in-process",manualNodeId:"",isRegistering:!1,error:null})),[j,M]=o.useState(!1),[i,c]=o.useState(""),[u,x]=o.useState(()=>w()),{nodes:g,loading:I}=L(),S=g.find(a=>a.type==="local")?.id,N=o.useCallback(()=>{y(!1),p?.()},[p]),P=o.useCallback(a=>{n(t=>{const d={manualPath:a};return a&&(!t.manualName||t.manualName===f(t.manualPath))&&(d.manualName=f(a)),{...t,...d}})},[]),R=o.useCallback(async()=>{const a=s.manualPath.trim(),t=s.manualName.trim(),d=s.manualCloneUrl.trim();if(!(!a||!t)&&!(s.manualMode==="clone"&&!d)){n(r=>({...r,isRegistering:!0,error:null}));try{const r={name:t,path:a,isolationMode:s.manualIsolationMode,nodeId:s.manualNodeId||void 0,cloneUrl:s.manualMode==="clone"?d:void 0},h=await O(r);m(h),n(B=>({...B,step:"complete",isRegistering:!1}))}catch(r){n(h=>({...h,isRegistering:!1,error:r instanceof Error?r.message:"Failed to register project"}))}}},[s.manualPath,s.manualName,s.manualCloneUrl,s.manualMode,s.manualIsolationMode,s.manualNodeId,m]),b=o.useCallback(()=>{const a=i.trim();a&&(_(a),x(a),c(""),n(t=>t.step==="auth"?{...t,step:"manual"}:t))},[i]),A=o.useCallback(()=>{$(),x(void 0),c("")},[]),F=o.useCallback(()=>{n(a=>({...a,step:"manual"}))},[]);if(!z)return null;const v=s.manualMode==="existing",l=s.manualMode==="clone",T=s.manualPath.trim().length>0,U=s.manualName.trim().length>0,D=s.manualCloneUrl.trim().length>0,E=s.isRegistering||!T||!U||l&&!D;return e.jsx("div",{className:"modal-overlay open setup-wizard-overlay",role:"dialog","aria-modal":"true","aria-labelledby":"wizard-title",children:e.jsxs("div",{className:"modal setup-wizard-modal",children:[e.jsxs("div",{className:"setup-wizard-header",children:[e.jsxs("div",{className:"setup-wizard-heading",children:[e.jsxs("div",{className:"setup-wizard-brand","aria-label":"Fusion",children:[e.jsxs("svg",{className:"setup-wizard-brand-logo",width:28,height:28,viewBox:"0 0 128 128",fill:"none","aria-label":"Fusion logo",role:"img",children:[e.jsx("circle",{cx:"64",cy:"64",r:"52",stroke:"currentColor",strokeWidth:"8"}),e.jsx("path",{d:"M26 101C44 82 62 64 82 45C90 37 98 30 104 24C96 35 89 47 81 60C70 79 57 95 43 108C38 112 32 108 26 101Z",fill:"currentColor"})]}),e.jsx("span",{className:"setup-wizard-brand-name",children:"Fusion"})]}),e.jsxs("h2",{id:"wizard-title",className:"setup-wizard-title",children:[s.step==="auth"&&"Set Auth Token",s.step==="manual"&&"Welcome to Fusion",s.step==="complete"&&"Setup Complete!"]})]}),s.step!=="complete"&&e.jsx("button",{className:"modal-close",onClick:N,"aria-label":"Close wizard",children:e.jsx(W,{size:20})})]}),e.jsxs("div",{className:"setup-wizard-content",children:[s.step==="auth"&&e.jsxs("div",{className:"setup-wizard-auth-step",children:[e.jsx("p",{className:"setup-wizard-auth-step-description",children:"This dashboard requires an auth token to communicate with the Fusion daemon. Paste the token below to continue."}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"setup-auth-token",children:"Auth Token"}),e.jsx("input",{id:"setup-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:"Paste the daemon auth token",autoComplete:"off",spellCheck:!1,autoFocus:!0}),e.jsxs("p",{className:"form-hint",children:["The token was set via the ",e.jsx("code",{children:"FUSION_DAEMON_TOKEN"})," environment variable when starting the dashboard."]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="manual"&&e.jsxs("div",{className:"setup-wizard-manual",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-name",children:"Project Name"}),e.jsx("input",{id:"project-name",type:"text",value:s.manualName,onChange:a=>n(t=>({...t,manualName:a.target.value})),placeholder:"my-project"}),e.jsx("p",{className:"form-hint",children:l?"By default this follows the destination folder name unless you edit it.":"By default this follows the selected directory name unless you edit it."})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-path",children:l?"Destination Directory":"Project Directory"}),e.jsx(G,{value:s.manualPath,onChange:P,nodeId:s.manualNodeId||void 0,localNodeId:S,placeholder:l?"/path/for/new-clone":"/path/to/your/project"}),e.jsx("p",{className:"form-hint",children:l?"Select or type an absolute destination path. Fusion will clone into this directory.":"Select or type the absolute path to your project"})]}),e.jsxs("div",{className:"setup-wizard-advanced",children:[e.jsxs("button",{type:"button",className:"setup-wizard-advanced-toggle","aria-expanded":j,onClick:()=>M(a=>!a),children:[e.jsx(Y,{size:16,className:"setup-wizard-advanced-chevron"}),e.jsx("span",{children:"Advanced settings"})]}),j&&e.jsxs("div",{className:"setup-wizard-advanced-panel",children:[e.jsxs("fieldset",{className:"setup-wizard-mode-switch","aria-label":"Project setup mode",children:[e.jsx("legend",{children:"Setup Mode"}),e.jsxs("label",{className:`setup-wizard-mode-option${v?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"existing",checked:v,onChange:()=>n(a=>({...a,manualMode:"existing",error:null}))}),e.jsx("span",{children:"Use Existing Directory"})]}),e.jsxs("label",{className:`setup-wizard-mode-option${l?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"setup-mode",value:"clone",checked:l,onChange:()=>n(a=>({...a,manualMode:"clone",error:null}))}),e.jsx("span",{children:"Clone Git Repository"})]})]}),l&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"project-clone-url",children:"Repository URL"}),e.jsx("input",{id:"project-clone-url",type:"text",value:s.manualCloneUrl,onChange:a=>n(t=>({...t,manualCloneUrl:a.target.value})),placeholder:"https://github.com/owner/repo.git"}),e.jsx("p",{className:"form-hint",children:"Fusion will run git clone into the destination directory, then register that cloned folder."})]}),e.jsx("div",{className:"form-group",children:e.jsxs("div",{className:"project-node-selector",children:[e.jsx("span",{className:"project-node-selector__label",children:"Runtime Node"}),e.jsxs("select",{value:s.manualNodeId,onChange:a=>n(t=>({...t,manualNodeId:a.target.value})),disabled:I||s.isRegistering,children:[e.jsx("option",{value:"",children:"Local node"}),g.map(a=>e.jsxs("option",{value:a.id,children:[a.name," (",a.type,")"]},a.id))]})]})}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"Isolation Mode"}),e.jsxs("div",{className:"setup-wizard-isolation-options",children:[e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="in-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"in-process",checked:s.manualIsolationMode==="in-process",onChange:()=>n(a=>({...a,manualIsolationMode:"in-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"In-Process"}),e.jsx("span",{children:"Lower overhead, shared memory. Best for most projects."}),e.jsx("span",{className:"wizard-option-recommended",children:"Recommended"})]})]}),e.jsxs("label",{className:`setup-wizard-isolation-option${s.manualIsolationMode==="child-process"?" selected":""}`,children:[e.jsx("input",{type:"radio",name:"isolation-mode",value:"child-process",checked:s.manualIsolationMode==="child-process",onChange:()=>n(a=>({...a,manualIsolationMode:"child-process"}))}),e.jsxs("div",{className:"setup-wizard-isolation-option-content",children:[e.jsx("strong",{children:"Child-Process"}),e.jsx("span",{children:"Isolated execution with crash containment."})]})]})]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"advanced-auth-token",children:"Browser Auth Token"}),e.jsxs("div",{className:"setup-wizard-auth-token",children:[e.jsx("input",{id:"advanced-auth-token",type:"password",value:i,onChange:a=>c(a.target.value),placeholder:u?"Enter a new token to replace the stored one":"Paste the auth token for this browser",autoComplete:"off",spellCheck:!1}),e.jsxs("div",{className:"setup-wizard-auth-token-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:b,disabled:i.trim().length===0,children:u?"Update token":"Set token"}),u&&e.jsx("button",{type:"button",className:"btn",onClick:A,children:"Reset token"})]})]}),e.jsx("p",{className:"form-hint",children:u?"A token is already stored in this browser. You can update or reset it below.":"No token is stored. Use the auth prompt at the top of the wizard, or set one here."})]})]})]}),s.error&&e.jsx("div",{className:"wizard-error",role:"alert",children:s.error})]}),s.step==="complete"&&e.jsxs("div",{className:"setup-wizard-complete",children:[e.jsxs("div",{className:"setup-wizard-success-streak","aria-hidden":"true",children:[e.jsx("div",{className:"setup-wizard-success-streak-core"}),e.jsx("div",{className:"setup-wizard-success-streak-glow"})]}),e.jsx(k,{size:64,className:"success-icon"}),e.jsx("h3",{children:"All Set!"}),e.jsx("p",{children:"Your project has been registered successfully."}),e.jsx("p",{children:"You can add more projects anytime from the project overview."})]})]}),e.jsxs("div",{className:"setup-wizard-footer",children:[e.jsx("a",{className:"btn setup-wizard-help-link",href:C,target:"_blank",rel:"noreferrer",children:"Need help?"}),s.step==="auth"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:F,children:"Skip"}),e.jsx("button",{className:"btn btn-primary",onClick:b,disabled:i.trim().length===0,children:e.jsx("span",{children:"Set Token & Continue"})})]}),s.step==="manual"&&e.jsx("button",{className:"btn btn-primary",onClick:R,disabled:E,children:s.isRegistering?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:16,className:"animate-spin"}),e.jsx("span",{children:"Registering..."})]}):e.jsx("span",{children:"Register Project"})}),s.step==="complete"&&e.jsxs("button",{className:"btn btn-primary",onClick:N,children:[e.jsx(k,{size:16}),e.jsx("span",{children:"Get Started"})]})]})]})})}export{ee as SetupWizardModal};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as i,j as e}from"./vendor-react-K0fH_qHe.js";import{bs as X,bE as _,bF as q,bG as B,bC as H,X as P,R as J,a as O,b as Y,L as Z,ar as I}from"./index-DTFPgu6_.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function ae({projectId:c,addToast:o,onClose:Q}){const[d,v]=i.useState([]),[f,y]=i.useState(!0),[A,E]=i.useState(!1),[L,p]=i.useState(null),[D,K]=i.useState([]),[m,V]=i.useState(""),[h,g]=i.useState(null),[k,x]=i.useState(null),[W,R]=i.useState(!1),[z,b]=i.useState(null),r=i.useRef(null),[N,G]=i.useState(""),F=m.trim()?d.filter(s=>s.name.toLowerCase().includes(m.toLowerCase())||s.relativePath.toLowerCase().includes(m.toLowerCase())):d,C=i.useCallback(async()=>{y(!0);try{const s=await X(c);v(s)}catch(s){const a=s instanceof Error?s.message:"Failed to load discovered skills";o(a,"error")}finally{y(!1)}},[c,o]),u=i.useCallback(async s=>{const a=l=>{if(!l||typeof l!="object")return!1;const t=l;if(typeof t.status=="number"&&t.status>=500)return!0;if(t.details&&typeof t.details=="object"){const w=t.details;if(typeof w.code=="string"&&w.code.startsWith("upstream_"))return!0}const n=l;return typeof n.error=="string"&&typeof n.code=="string"};E(!0),p(null);try{const l=await _(s,20,c);K(l.entries)}catch(l){if(a(l))p("Catalog is temporarily unavailable. Please try again later.");else{const t=l instanceof Error?l.message:"Failed to load catalog";p(t)}}finally{E(!1)}},[c]);i.useEffect(()=>{C(),u("")},[C,u]);const M=i.useCallback(s=>{V(s),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>{G(s),r.current=null},300)},[]);i.useEffect(()=>()=>{r.current&&(clearTimeout(r.current),r.current=null)},[]),i.useEffect(()=>{u(N)},[N,u]);const T=i.useCallback(async(s,a)=>{const l=!a;v(t=>t.map(n=>n.id===s?{...n,toggling:!0}:n));try{await q(s,l,c),v(t=>t.map(n=>n.id===s?{...n,enabled:l,toggling:!1}:n)),o(`Skill ${l?"enabled":"disabled"}`,"success")}catch(t){v(w=>w.map(S=>S.id===s?{...S,toggling:!1}:S));const n=t instanceof Error?t.message:"Failed to toggle skill";o(`Failed to toggle skill: ${n}`,"error")}},[c,o]),j=i.useCallback(async s=>{R(!0),b(null),x(null);try{const a=await B(s,c);x(a)}catch(a){const l=a instanceof Error?a.message:"Failed to load skill content";b(l)}finally{R(!1)}},[c]),$=i.useCallback((s,a)=>{if(!(a&&a.target.closest(".skills-view-item-toggle"))){if(h===s){g(null),x(null),b(null);return}g(s),j(s)}},[h,j]),U=i.useCallback(s=>{h!==s&&g(s),j(s)},[j,h]);return e.jsxs("div",{className:"skills-view","data-testid":"skills-view",children:[e.jsxs("div",{className:"skills-view-header",children:[e.jsxs("div",{className:"skills-view-title",children:[e.jsxs("h2",{children:[e.jsx(H,{size:20}),"Skills"]}),e.jsxs("span",{className:"skills-view-count","aria-label":`${d.length} discovered skills`,children:[d.length," discovered"]})]}),e.jsxs("div",{className:"skills-view-actions",children:[e.jsx("button",{className:"btn-icon skills-view-close touch-target",onClick:Q,"aria-label":"Close skills view",children:e.jsx(P,{size:16})}),e.jsxs("button",{className:"btn btn-sm touch-target",onClick:()=>void C(),disabled:f,children:[e.jsx(J,{size:14,className:f?"spin":""}),"Refresh"]})]})]}),e.jsxs("div",{className:"skills-view-content",children:[e.jsx("div",{className:"skills-view-search",children:e.jsx("input",{type:"text",className:"form-input",placeholder:"Search skills...",value:m,onChange:s=>M(s.target.value),"aria-label":"Search skills"})}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"discovered-skills-title",children:[e.jsx("h3",{id:"discovered-skills-title",className:"skills-view-section-title",children:"Discovered Skills"}),f?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading discovered skills..."]}):d.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No skills discovered in this project."})}):F.length===0?e.jsx("div",{className:"skills-view-empty",children:e.jsx("p",{children:"No discovered skills match your search."})}):e.jsx("div",{className:"skills-view-list",children:F.map(s=>{const a=h===s.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`skills-view-item${a?" skills-view-item--selected":""}`,onClick:l=>$(s.id,l),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),$(s.id))},"aria-expanded":a,"aria-label":`View details for ${s.name}`,children:[e.jsxs("div",{className:"skills-view-item-info",children:[e.jsxs("span",{className:"skills-view-item-name",children:[a?e.jsx(O,{size:14}):e.jsx(Y,{size:14}),s.name]}),e.jsx("span",{className:"skills-view-item-path",children:s.relativePath}),e.jsx("span",{className:"skills-view-item-source",children:s.metadata.source})]}),e.jsxs("label",{className:"skills-view-item-toggle",onClick:l=>l.stopPropagation(),children:[e.jsx("input",{type:"checkbox",checked:s.enabled,disabled:s.toggling,onChange:()=>void T(s.id,s.enabled),"aria-label":`${s.enabled?"Disable":"Enable"} ${s.name}`}),e.jsx("span",{className:"skills-view-toggle-slider"})]})]}),a&&e.jsxs("div",{className:"skills-view-detail","data-testid":"skill-detail",children:[e.jsxs("div",{className:"skills-view-detail-header",children:[e.jsx("span",{className:"skills-view-detail-title",children:s.name}),e.jsxs("button",{className:"btn btn-sm skills-view-detail-close",onClick:()=>{g(null),x(null),b(null)},"aria-label":"Close skill detail",children:[e.jsx(P,{size:14}),"Close"]})]}),W?e.jsxs("div",{className:"skills-view-detail-loading",children:[e.jsx(Z,{size:16,className:"spin"}),"Loading skill content..."]}):z?e.jsxs("div",{className:"skills-view-detail-error",children:[e.jsx(I,{size:14}),e.jsx("span",{children:z}),e.jsx("button",{className:"btn btn-sm",onClick:()=>U(s.id),children:"Retry"})]}):k?e.jsxs(e.Fragment,{children:[e.jsx("pre",{className:"skills-view-detail-content",children:k.skillMd||"(No SKILL.md found)"}),k.files.length>0&&e.jsxs("div",{className:"skills-view-detail-files",children:[e.jsx("span",{className:"skills-view-detail-files-label",children:"Files:"}),k.files.map(l=>e.jsxs("span",{className:"badge badge--sm",children:[l.name,l.type==="directory"&&"/"]},l.relativePath))]})]}):null]})]},s.id)})})]}),e.jsxs("section",{className:"skills-view-section","aria-labelledby":"catalog-title",children:[e.jsx("h3",{id:"catalog-title",className:"skills-view-section-title",children:"Skills Catalog"}),L?e.jsxs("div",{className:"skills-view-error",children:[e.jsx("p",{children:L}),e.jsx("button",{className:"btn btn-sm",onClick:()=>void u(N),children:"Try Again"})]}):A?e.jsxs("div",{className:"skills-view-loading",children:[e.jsx("span",{className:"spinner"}),"Loading catalog..."]}):D.length===0?e.jsx("div",{className:"skills-view-empty",children:m?e.jsx("p",{children:"No skills match your search."}):e.jsx("p",{children:"No skills available in the catalog."})}):e.jsx("div",{className:"skills-view-grid",children:D.map(s=>e.jsxs("div",{className:"skills-view-card",children:[e.jsx("h4",{className:"skills-view-card-title",children:s.name}),s.description&&e.jsx("p",{className:"skills-view-card-description",children:s.description}),s.tags&&s.tags.length>0&&e.jsx("div",{className:"skills-view-card-tags",children:s.tags.map(a=>e.jsx("span",{className:"badge badge--sm",children:a},a))}),s.installs!==void 0&&e.jsxs("span",{className:"skills-view-card-installs",children:[s.installs.toLocaleString()," installs"]})]},s.id))})]})]})]})}export{ae as SkillsView};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as s}from"./vendor-react-K0fH_qHe.js";import{v as y,cn as i}from"./index-DTFPgu6_.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";function S(){const{confirm:h}=y(),[c,u]=t.useState([]),[d,f]=t.useState(null),[p,x]=t.useState({}),[n,l]=t.useState(null),o=t.useCallback(async()=>{try{f(null);const a=await i("/stash-recovery/orphans");u(a.records??[])}catch(a){f(a instanceof Error?a.message:"Failed to load orphans")}},[]);t.useEffect(()=>{o()},[o]);const j=t.useMemo(()=>{const a=new Map;for(const e of c){const r=e.sourceTaskId??"Unknown source",m=a.get(r)??[];m.push(e),a.set(r,m)}return Array.from(a.entries())},[c]),v=t.useCallback(async a=>{const e=await i(`/stash-recovery/orphans/${a}/apply`,{method:"POST"});x(r=>({...r,[a]:e.ok?"Applied":e.stderr??e.reason??"Apply failed"}))},[]),b=t.useCallback(async a=>{await h({title:"Drop orphaned stash?",message:"This removes the stash entry permanently.",confirmLabel:"Drop",danger:!0})&&(await i(`/stash-recovery/orphans/${a}/drop`,{method:"POST",body:JSON.stringify({confirm:!0})}),await o())},[h,o]),N=t.useCallback(async a=>{l({sha:a,diff:"",truncated:!1,loading:!0,error:null});try{const e=await i(`/stash-recovery/orphans/${a}/diff`);l({sha:a,diff:e.diff??"",truncated:!!e.truncated,loading:!1,error:null})}catch(e){l({sha:a,diff:"",truncated:!1,loading:!1,error:e instanceof Error?e.message:"Failed to load diff"})}},[]);return c.length===0&&!d?s.jsxs("div",{className:"card stash-recovery-view",children:[s.jsx("p",{children:"No orphaned merger autostashes found."}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void o(),children:"Refresh"})]}):s.jsxs("div",{className:"card stash-recovery-view",children:[s.jsxs("div",{className:"stash-recovery-header",children:[s.jsx("h2",{children:"Stash Recovery"}),s.jsxs("span",{children:[c.length," orphans"]}),s.jsx("button",{className:"btn btn-sm",onClick:()=>void o(),children:"Refresh"})]}),d&&s.jsx("div",{className:"form-error",children:d}),j.map(([a,e])=>s.jsxs("section",{children:[s.jsx("h3",{children:a}),e.map(r=>s.jsxs("div",{className:"stash-row",children:[s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"SHA"}),s.jsx("span",{children:r.sha.slice(0,7)})]}),s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"Classification"}),s.jsx("span",{children:r.classification})]}),s.jsxs("div",{className:"stash-field",children:[s.jsx("span",{className:"stash-field-label",children:"Changed paths"}),s.jsxs("span",{children:[r.changedPaths.length," files"]})]}),s.jsxs("div",{className:"stash-row-actions",children:[s.jsx("button",{className:"btn btn-sm stash-action-btn",onClick:()=>void N(r.sha),children:"Inspect diff"}),s.jsx("button",{className:"btn btn-sm stash-action-btn",onClick:()=>void v(r.sha),children:"Apply"})]}),s.jsx("div",{className:"stash-row-actions-danger",children:s.jsx("button",{className:"btn btn-sm btn-danger stash-action-btn",onClick:()=>void b(r.sha),children:"Drop"})}),p[r.sha]&&s.jsx("div",{className:"stash-status",children:p[r.sha]})]},r.sha))]},a)),n&&s.jsx("div",{className:"modal-overlay open",onClick:()=>l(null),children:s.jsxs("div",{className:"modal stash-recovery-diff-modal",role:"dialog","aria-modal":"true","aria-label":`Diff for ${n.sha}`,onClick:a=>a.stopPropagation(),children:[s.jsxs("div",{className:"modal-header",children:[s.jsxs("h3",{children:["Diff for ",n.sha.slice(0,7)]}),s.jsx("button",{className:"modal-close",onClick:()=>l(null),"aria-label":"Close diff dialog",children:"×"})]}),n.loading&&s.jsx("p",{children:"Loading diff…"}),n.error&&s.jsx("div",{className:"form-error",children:n.error}),!n.loading&&!n.error&&s.jsxs(s.Fragment,{children:[s.jsx("pre",{className:"stash-recovery-diff-pre",children:n.diff||"No diff output available."}),n.truncated&&s.jsx("p",{className:"stash-status",children:"Diff output truncated."})]}),s.jsx("div",{className:"modal-actions",children:s.jsx("button",{className:"btn",onClick:()=>l(null),children:"Close"})})]})})]})}export{S as StashRecoveryView};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{r as d,j as e}from"./vendor-react-K0fH_qHe.js";import{c as wt,
|
|
1
|
+
import{r as d,j as e}from"./vendor-react-K0fH_qHe.js";import{c as wt,cd as Ct,ce as St,cf as At,cg as $t,ch as Et,ci as Dt,cj as Ft,ck as Tt,v as Mt,i as Ot,z as G,cl as lt,L as Rt,J as Pt,bt as H,X as Q,cm as ut,aY as mt,Y as bt,ae as Ut,a as _t,at as Kt,B as pt}from"./index-DTFPgu6_.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const Bt=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]],Xt=wt("circle-plus",Bt);function zt(L){const{items:l,...x}=L;return x}function ht(L){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`${L}-${crypto.randomUUID()}`:`${L}-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Vt(L={}){const{projectId:l,addToast:x}=L,[k,N]=d.useState([]),[g,I]=d.useState([]),[X,F]=d.useState(!0),[S,j]=d.useState(null),[$,E]=d.useState(null),[y,f]=d.useState([]),C=d.useRef($);C.current=$,d.useEffect(()=>{let s=!1;async function c(){F(!0),j(null);try{const r=await Tt(l);if(s)return;f(r),N(r.map(zt));const m=C.current&&r.some(i=>i.id===C.current)?C.current:r[0]?.id??null;E(m),I(m?r.find(i=>i.id===m)?.items??[]:[])}catch(r){if(s)return;f([]),N([]),I([]),E(null),j(r instanceof Error?r.message:"Failed to load todo lists")}finally{s||F(!1)}}return c(),()=>{s=!0}},[l]),d.useEffect(()=>{if(!$){I([]);return}const s=y.find(c=>c.id===$);I(s?.items??[])},[y,$]);const z=d.useCallback(async s=>{const c=k,r=y,m=new Date().toISOString(),i={id:ht("temp-list"),projectId:l??"",title:s,createdAt:m,updatedAt:m};j(null),N(n=>[...n,i]),f(n=>[...n,{...i,items:[]}]);try{const n=await Ct(s,l);N(a=>a.map(o=>o.id===i.id?n:o)),f(a=>a.map(o=>o.id===i.id?{...n,items:[]}:o)),C.current||E(n.id)}catch(n){N(c),f(r),j(n instanceof Error?n.message:"Failed to create list"),x?.("Failed to create todo list","error")}},[x,y,k,l]),V=d.useCallback(async(s,c)=>{const r=k,m=y;j(null),N(i=>i.map(n=>n.id===s?{...n,title:c}:n)),f(i=>i.map(n=>n.id===s?{...n,title:c}:n));try{const i=await St(s,c,l);N(n=>n.map(a=>a.id===s?i:a)),f(n=>n.map(a=>a.id===s?{...i,items:a.items}:a))}catch(i){N(r),f(m),j(i instanceof Error?i.message:"Failed to rename list"),x?.("Failed to rename todo list","error")}},[x,y,k,l]),W=d.useCallback(async s=>{const c=k,r=y,m=C.current,i=m===s?k.find(n=>n.id!==s)?.id??null:m;j(null),N(n=>n.filter(a=>a.id!==s)),f(n=>n.filter(a=>a.id!==s)),m===s&&E(i);try{await At(s,l)}catch(n){N(c),f(r),E(m),j(n instanceof Error?n.message:"Failed to delete list"),x?.("Failed to delete todo list","error")}},[x,y,k,l]),T=d.useCallback(async s=>{const c=C.current;if(!c)return;const r=g,m=y,i=new Date().toISOString(),n=g.reduce((o,u)=>Math.max(o,u.sortOrder),-1),a={id:ht("temp-item"),listId:c,text:s,completed:!1,completedAt:null,createdAt:i,updatedAt:i,sortOrder:n+1};j(null),I(o=>[...o,a]),f(o=>o.map(u=>u.id===c?{...u,items:[...u.items,a]}:u));try{const o=await $t(c,s,l);I(u=>u.map(h=>h.id===a.id?o:h)),f(u=>u.map(h=>h.id===c?{...h,items:h.items.map(D=>D.id===a.id?o:D)}:h))}catch(o){I(r),f(m),j(o instanceof Error?o.message:"Failed to create item"),x?.("Failed to create todo item","error")}},[x,g,y,l]),w=d.useCallback(async(s,c)=>{const r=g.find(o=>o.id===s);if(!r)return;const m=g,i=y,n=c.completed??r.completed,a={...r,...c,completed:n,completedAt:n?r.completedAt??new Date().toISOString():null,updatedAt:new Date().toISOString()};j(null),I(o=>o.map(u=>u.id===s?a:u)),f(o=>o.map(u=>u.id===a.listId?{...u,items:u.items.map(h=>h.id===s?a:h)}:u));try{const o=await Et(s,c,l);I(u=>u.map(h=>h.id===s?o:h)),f(u=>u.map(h=>h.id===o.listId?{...h,items:h.items.map(D=>D.id===s?o:D)}:h))}catch(o){I(m),f(i),j(o instanceof Error?o.message:"Failed to update item"),x?.("Failed to update todo item","error")}},[x,g,y,l]),_=d.useCallback(async s=>{const c=g.find(r=>r.id===s);c&&await w(s,{completed:!c.completed})},[g,w]),A=d.useCallback(async s=>{const c=g,r=y;j(null),I(m=>m.filter(i=>i.id!==s)),f(m=>m.map(i=>({...i,items:i.items.filter(n=>n.id!==s)})));try{await Dt(s,l)}catch(m){I(c),f(r),j(m instanceof Error?m.message:"Failed to delete item"),x?.("Failed to delete todo item","error")}},[x,g,y,l]),M=d.useCallback(async s=>{const c=C.current;if(!c)return;const r=g,m=y,i=new Map(g.map(a=>[a.id,a])),n=s.map((a,o)=>{const u=i.get(a);return u?{...u,sortOrder:o}:null}).filter(a=>a!==null);j(null),I(n),f(a=>a.map(o=>o.id===c?{...o,items:n}:o));try{await Ft(c,s,l)}catch(a){I(r),f(m),j(a instanceof Error?a.message:"Failed to reorder items"),x?.("Failed to reorder todo items","error")}},[x,g,y,l]);return{lists:k,items:g,loading:X,error:S,selectedListId:$,setSelectedListId:E,createList:z,renameList:V,deleteList:W,createItem:T,updateItem:w,toggleItem:_,deleteItem:A,reorderItems:M}}function Wt(L){return[...L].sort((l,x)=>l.sortOrder-x.sortOrder)}function Jt({projectId:L,addToast:l,onPlanningMode:x,onTaskCreated:k,mobileKeyboardActive:N=!1}){const{lists:g,items:I,loading:X,error:F,selectedListId:S,setSelectedListId:j,createList:$,renameList:E,deleteList:y,createItem:f,updateItem:C,toggleItem:z,deleteItem:V,reorderItems:W}=Vt({projectId:L,addToast:(t,p)=>{if(p==="success"||p==="error"||p==="info"||p===void 0){l(t,p);return}l(t,"info")}}),[T,w]=d.useState(null),[_,A]=d.useState(""),[M,s]=d.useState(null),[c,r]=d.useState(""),[m,i]=d.useState(""),[n,a]=d.useState(!1),[o,u]=d.useState(""),[h,D]=d.useState([]),[ft,Y]=d.useState(!1),[q,O]=d.useState(!1),[Z,R]=d.useState(null),G=d.useRef(null),{confirm:xt}=Mt(),tt=d.useMemo(()=>g.find(t=>t.id===S)??null,[g,S]),K=d.useMemo(()=>Wt(I.filter(t=>t.listId===S)),[I,S]);function et(){w(null),A(""),i(""),a(!1)}function B(){s(null),r(""),u("")}function gt(t){et(),B(),j(t)}const vt=d.useCallback(async()=>{Y(!0);try{const t=await Ot(void 0,L);D(t),O(!0)}catch(t){l(`Failed to load agents: ${H(t)}`,"error"),O(!1),R(null)}finally{Y(!1)}},[L,l]);d.useEffect(()=>{w(null),A(""),i(""),a(!1),s(null),r(""),u(""),O(!1),R(null)},[S]),d.useEffect(()=>{if(!q)return;const t=p=>{G.current&&!G.current.contains(p.target)&&(O(!1),R(null))};return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[q]);function jt(t){B(),w(t.id),A(t.title),a(!1)}async function st(){if(!T)return;const t=_.trim();if(!t){w(null),A("");return}await E(T,t),w(null),A("")}function nt(){w(null),A("")}function at(t){et(),s(t.id),r(t.text)}async function it(){if(!M)return;const t=c.trim();if(!t){s(null),r("");return}await C(M,{text:t}),s(null),r("")}function ot(){s(null),r("")}async function dt(){const t=m.trim();t&&(await $(t),i(""),a(!1))}async function rt(){if(!S)return;const t=o.trim();t&&(await f(t),u(""))}async function yt(t){await xt({title:"Delete List",message:"Delete this list and all its items?",danger:!0})&&await y(t)}async function It(t){await V(t)}async function ct(t,p){const v=K.map(U=>U.id),b=v.findIndex(U=>U===t);if(b<0)return;const P=p==="up"?b-1:b+1;P<0||P>=v.length||([v[b],v[P]]=[v[P],v[b]],await W(v))}const Lt=d.useCallback(async t=>{try{const p={description:t.text,column:"triage",source:{sourceType:"dashboard_ui"}},v=await lt(p,L);k?.(v),l(`Created ${v.id} from todo`,"success")}catch(p){l(`Failed to create task: ${H(p)}`,"error")}},[L,l,k]),kt=d.useCallback(async(t,p)=>{try{const v={description:t.text,column:"triage",assignedAgentId:p,source:{sourceType:"dashboard_ui"}},b=await lt(v,L);k?.(b);const U=h.find(Nt=>Nt.id===p)?.name??p;l(`Created ${b.id} and assigned to ${U}`,"success"),O(!1),R(null)}catch(v){l(`Failed to create and assign task: ${H(v)}`,"error")}},[L,l,h,k]);return X?e.jsx("div",{className:"todo-view",children:e.jsxs("div",{className:"todo-loading",children:[e.jsx(Rt,{className:"todo-loading-icon","aria-hidden":"true"}),e.jsx("p",{children:"Loading todos..."})]})}):e.jsx("div",{className:`todo-view${N?" todo-view--mobile-keyboard-active":""}`,"data-testid":"todo-view-root",children:e.jsxs("div",{className:"todo-view-layout",children:[e.jsxs("aside",{className:"todo-view-sidebar","aria-label":"Todo lists sidebar",children:[e.jsxs("div",{className:"todo-sidebar-header",children:[e.jsx("h3",{className:"todo-sidebar-title",children:"Lists"}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-add-list-btn",onClick:()=>{B(),a(!0),w(null)},"aria-label":"Add list","data-testid":"add-list-button",children:e.jsx(Pt,{})})]}),n&&e.jsxs("div",{className:"todo-list-item",children:[e.jsx("input",{className:"input todo-inline-edit-input",placeholder:"New list title",value:m,onChange:t=>i(t.target.value),onKeyDown:t=>{t.key==="Enter"&&dt(),t.key==="Escape"&&(i(""),a(!1))},autoFocus:!0,"data-testid":"new-list-input"}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{dt()},"aria-label":"Save list",children:e.jsx(J,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{i(""),a(!1)},"aria-label":"Cancel list",children:e.jsx(Q,{})})]}),g.length===0&&!n?e.jsxs("div",{className:"todo-empty-state",children:[e.jsx(ut,{"aria-hidden":"true"}),e.jsx("p",{children:"No todo lists yet. Create one to get started."}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{B(),a(!0)},children:"Create List"})]}):e.jsx("div",{className:"todo-list-items",role:"list","aria-label":"Todo lists",children:g.map(t=>{const p=t.id===S,v=t.id===T;return e.jsx("div",{className:`todo-list-item${p?" todo-list-item--active":""}`,role:"listitem",children:v?e.jsxs(e.Fragment,{children:[e.jsx("input",{className:"input todo-inline-edit-input",value:_,onChange:b=>A(b.target.value),onKeyDown:b=>{b.key==="Enter"&&st(),b.key==="Escape"&&nt()},autoFocus:!0,"data-testid":`rename-list-input-${t.id}`}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{st()},"aria-label":"Save list rename",children:e.jsx(J,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:nt,"aria-label":"Cancel list rename",children:e.jsx(Q,{})})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"todo-list-select-btn",onClick:()=>gt(t.id),"aria-label":`Select list ${t.title}`,"aria-current":p?"true":void 0,"data-testid":`todo-list-${t.id}`,children:e.jsx("span",{className:"todo-list-item-name",children:t.title})}),e.jsxs("div",{className:"todo-list-item-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{jt(t)},"aria-label":`Rename ${t.title}`,"data-testid":`rename-list-button-${t.id}`,children:e.jsx(mt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon btn-danger todo-icon-btn",onClick:()=>{yt(t.id)},"aria-label":`Delete ${t.title}`,"data-testid":`delete-list-button-${t.id}`,children:e.jsx(bt,{})})]})]})},t.id)})})]}),e.jsxs("section",{className:"todo-view-main","aria-label":"Todo items",children:[F&&e.jsxs("div",{className:"todo-error-banner",role:"alert",children:[e.jsx("span",{className:"todo-error-message",children:F}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>window.location.reload(),children:"Retry"})]}),tt?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"todo-items-header",children:e.jsx("h3",{children:tt.title})}),e.jsxs("div",{className:"todo-add-item-row",children:[e.jsx("input",{className:"input",placeholder:"Add a todo item",value:o,onChange:t=>u(t.target.value),onKeyDown:t=>{t.key==="Enter"&&rt(),t.key==="Escape"&&u("")},"data-testid":"new-item-input"}),e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>{rt()},children:"Add"})]}),K.length===0?e.jsx("div",{className:"todo-empty-state",children:e.jsx("p",{children:"No items in this list. Add one above."})}):e.jsx("div",{className:"todo-items-list",children:K.map((t,p)=>{const v=t.id===M;return e.jsxs("div",{className:"todo-item","data-testid":`todo-item-${t.id}`,children:[e.jsxs("div",{className:"todo-item-main-row",children:[e.jsx("input",{type:"checkbox",checked:t.completed,onChange:()=>{z(t.id)},className:"todo-item-checkbox","aria-label":`Toggle ${t.text}`,"data-testid":`toggle-item-${t.id}`}),v?e.jsx("input",{className:"input todo-inline-edit-input",value:c,onChange:b=>r(b.target.value),onKeyDown:b=>{b.key==="Enter"&&it(),b.key==="Escape"&&ot()},autoFocus:!0,"data-testid":`edit-item-input-${t.id}`}):e.jsx("button",{type:"button",className:`todo-item-text${t.completed?" todo-item-text--completed":""}`,onClick:()=>at(t),children:t.text})]}),e.jsx("div",{className:"todo-item-actions","data-testid":`todo-item-actions-${t.id}`,children:v?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{it()},"aria-label":"Save item edit",children:e.jsx(J,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:ot,"aria-label":"Cancel item edit",children:e.jsx(Q,{})})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"todo-item-reorder-btns",children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-item-reorder-btn",onClick:()=>{ct(t.id,"up")},disabled:p===0,"aria-label":`Move ${t.text} up`,"data-testid":`move-up-${t.id}`,children:e.jsx(Ut,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-item-reorder-btn",onClick:()=>{ct(t.id,"down")},disabled:p===K.length-1,"aria-label":`Move ${t.text} down`,"data-testid":`move-down-${t.id}`,children:e.jsx(_t,{})})]}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{x?.(t.text)},"aria-label":`Start planning from ${t.text}`,"data-testid":`planning-from-${t.id}`,children:e.jsx(Kt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{Lt(t)},"aria-label":`Create task from ${t.text}`,"data-testid":`create-task-from-${t.id}`,children:e.jsx(Xt,{})}),e.jsxs("div",{className:"todo-agent-picker-trigger",ref:Z===t.id?G:void 0,children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{R(t.id),vt()},"aria-label":`Assign ${t.text} to agent`,"data-testid":`assign-agent-for-${t.id}`,children:e.jsx(pt,{})}),q&&Z===t.id&&e.jsx("div",{className:"todo-agent-picker-dropdown",onMouseDown:b=>{b.preventDefault()},children:ft?e.jsx("div",{className:"todo-agent-picker-loading",children:"Loading agents..."}):h.length>0?h.map(b=>e.jsxs("button",{type:"button",className:"todo-agent-picker-item",onClick:()=>{kt(t,b.id)},children:[e.jsx(pt,{}),e.jsx("span",{children:b.name}),e.jsx("span",{className:"todo-agent-picker-role",children:b.role})]},b.id)):e.jsx("div",{className:"todo-agent-picker-empty",children:"No agents available"})})]}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>at(t),"aria-label":`Edit ${t.text}`,"data-testid":`edit-item-${t.id}`,children:e.jsx(mt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon btn-danger todo-icon-btn",onClick:()=>{It(t.id)},"aria-label":`Delete ${t.text}`,"data-testid":`delete-item-${t.id}`,children:e.jsx(bt,{})})]})})]},t.id)})})]}):e.jsxs("div",{className:"todo-empty-state",children:[e.jsx(ut,{"aria-hidden":"true"}),e.jsx("p",{children:"Select a list from the sidebar"})]})]})]})})}export{Jt as TodoView};
|
|
6
|
+
*/const Bt=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M8 12h8",key:"1wcyev"}],["path",{d:"M12 8v8",key:"napkw2"}]],Yt=wt("circle-plus",Bt);function zt(k){const{items:l,...x}=k;return x}function ht(k){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`${k}-${crypto.randomUUID()}`:`${k}-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Jt(k={}){const{projectId:l,addToast:x}=k,[I,N]=d.useState([]),[g,L]=d.useState([]),[Y,F]=d.useState(!0),[S,j]=d.useState(null),[$,E]=d.useState(null),[y,f]=d.useState([]),C=d.useRef($);C.current=$,d.useEffect(()=>{let s=!1;async function c(){F(!0),j(null);try{const r=await Tt(l);if(s)return;f(r),N(r.map(zt));const m=C.current&&r.some(i=>i.id===C.current)?C.current:r[0]?.id??null;E(m),L(m?r.find(i=>i.id===m)?.items??[]:[])}catch(r){if(s)return;f([]),N([]),L([]),E(null),j(r instanceof Error?r.message:"Failed to load todo lists")}finally{s||F(!1)}}return c(),()=>{s=!0}},[l]),d.useEffect(()=>{if(!$){L([]);return}const s=y.find(c=>c.id===$);L(s?.items??[])},[y,$]);const z=d.useCallback(async s=>{const c=I,r=y,m=new Date().toISOString(),i={id:ht("temp-list"),projectId:l??"",title:s,createdAt:m,updatedAt:m};j(null),N(n=>[...n,i]),f(n=>[...n,{...i,items:[]}]);try{const n=await Ct(s,l);N(a=>a.map(o=>o.id===i.id?n:o)),f(a=>a.map(o=>o.id===i.id?{...n,items:[]}:o)),C.current||E(n.id)}catch(n){N(c),f(r),j(n instanceof Error?n.message:"Failed to create list"),x?.("Failed to create todo list","error")}},[x,y,I,l]),J=d.useCallback(async(s,c)=>{const r=I,m=y;j(null),N(i=>i.map(n=>n.id===s?{...n,title:c}:n)),f(i=>i.map(n=>n.id===s?{...n,title:c}:n));try{const i=await St(s,c,l);N(n=>n.map(a=>a.id===s?i:a)),f(n=>n.map(a=>a.id===s?{...i,items:a.items}:a))}catch(i){N(r),f(m),j(i instanceof Error?i.message:"Failed to rename list"),x?.("Failed to rename todo list","error")}},[x,y,I,l]),V=d.useCallback(async s=>{const c=I,r=y,m=C.current,i=m===s?I.find(n=>n.id!==s)?.id??null:m;j(null),N(n=>n.filter(a=>a.id!==s)),f(n=>n.filter(a=>a.id!==s)),m===s&&E(i);try{await At(s,l)}catch(n){N(c),f(r),E(m),j(n instanceof Error?n.message:"Failed to delete list"),x?.("Failed to delete todo list","error")}},[x,y,I,l]),T=d.useCallback(async s=>{const c=C.current;if(!c)return;const r=g,m=y,i=new Date().toISOString(),n=g.reduce((o,u)=>Math.max(o,u.sortOrder),-1),a={id:ht("temp-item"),listId:c,text:s,completed:!1,completedAt:null,createdAt:i,updatedAt:i,sortOrder:n+1};j(null),L(o=>[...o,a]),f(o=>o.map(u=>u.id===c?{...u,items:[...u.items,a]}:u));try{const o=await $t(c,s,l);L(u=>u.map(h=>h.id===a.id?o:h)),f(u=>u.map(h=>h.id===c?{...h,items:h.items.map(D=>D.id===a.id?o:D)}:h))}catch(o){L(r),f(m),j(o instanceof Error?o.message:"Failed to create item"),x?.("Failed to create todo item","error")}},[x,g,y,l]),w=d.useCallback(async(s,c)=>{const r=g.find(o=>o.id===s);if(!r)return;const m=g,i=y,n=c.completed??r.completed,a={...r,...c,completed:n,completedAt:n?r.completedAt??new Date().toISOString():null,updatedAt:new Date().toISOString()};j(null),L(o=>o.map(u=>u.id===s?a:u)),f(o=>o.map(u=>u.id===a.listId?{...u,items:u.items.map(h=>h.id===s?a:h)}:u));try{const o=await Et(s,c,l);L(u=>u.map(h=>h.id===s?o:h)),f(u=>u.map(h=>h.id===o.listId?{...h,items:h.items.map(D=>D.id===s?o:D)}:h))}catch(o){L(m),f(i),j(o instanceof Error?o.message:"Failed to update item"),x?.("Failed to update todo item","error")}},[x,g,y,l]),_=d.useCallback(async s=>{const c=g.find(r=>r.id===s);c&&await w(s,{completed:!c.completed})},[g,w]),A=d.useCallback(async s=>{const c=g,r=y;j(null),L(m=>m.filter(i=>i.id!==s)),f(m=>m.map(i=>({...i,items:i.items.filter(n=>n.id!==s)})));try{await Dt(s,l)}catch(m){L(c),f(r),j(m instanceof Error?m.message:"Failed to delete item"),x?.("Failed to delete todo item","error")}},[x,g,y,l]),M=d.useCallback(async s=>{const c=C.current;if(!c)return;const r=g,m=y,i=new Map(g.map(a=>[a.id,a])),n=s.map((a,o)=>{const u=i.get(a);return u?{...u,sortOrder:o}:null}).filter(a=>a!==null);j(null),L(n),f(a=>a.map(o=>o.id===c?{...o,items:n}:o));try{await Ft(c,s,l)}catch(a){L(r),f(m),j(a instanceof Error?a.message:"Failed to reorder items"),x?.("Failed to reorder todo items","error")}},[x,g,y,l]);return{lists:I,items:g,loading:Y,error:S,selectedListId:$,setSelectedListId:E,createList:z,renameList:J,deleteList:V,createItem:T,updateItem:w,toggleItem:_,deleteItem:A,reorderItems:M}}function Vt(k){return[...k].sort((l,x)=>l.sortOrder-x.sortOrder)}function Qt({projectId:k,addToast:l,onPlanningMode:x,onTaskCreated:I,mobileKeyboardActive:N=!1}){const{lists:g,items:L,loading:Y,error:F,selectedListId:S,setSelectedListId:j,createList:$,renameList:E,deleteList:y,createItem:f,updateItem:C,toggleItem:z,deleteItem:J,reorderItems:V}=Jt({projectId:k,addToast:(t,p)=>{if(p==="success"||p==="error"||p==="info"||p===void 0){l(t,p);return}l(t,"info")}}),[T,w]=d.useState(null),[_,A]=d.useState(""),[M,s]=d.useState(null),[c,r]=d.useState(""),[m,i]=d.useState(""),[n,a]=d.useState(!1),[o,u]=d.useState(""),[h,D]=d.useState([]),[ft,W]=d.useState(!1),[X,O]=d.useState(!1),[Z,R]=d.useState(null),q=d.useRef(null),{confirm:xt}=Mt(),tt=d.useMemo(()=>g.find(t=>t.id===S)??null,[g,S]),K=d.useMemo(()=>Vt(L.filter(t=>t.listId===S)),[L,S]);function et(){w(null),A(""),i(""),a(!1)}function B(){s(null),r(""),u("")}function gt(t){et(),B(),j(t)}const vt=d.useCallback(async()=>{W(!0);try{const t=await Ot(void 0,k);D(t),O(!0)}catch(t){l(`Failed to load agents: ${G(t)}`,"error"),O(!1),R(null)}finally{W(!1)}},[k,l]);d.useEffect(()=>{w(null),A(""),i(""),a(!1),s(null),r(""),u(""),O(!1),R(null)},[S]),d.useEffect(()=>{if(!X)return;const t=p=>{q.current&&!q.current.contains(p.target)&&(O(!1),R(null))};return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[X]);function jt(t){B(),w(t.id),A(t.title),a(!1)}async function st(){if(!T)return;const t=_.trim();if(!t){w(null),A("");return}await E(T,t),w(null),A("")}function nt(){w(null),A("")}function at(t){et(),s(t.id),r(t.text)}async function it(){if(!M)return;const t=c.trim();if(!t){s(null),r("");return}await C(M,{text:t}),s(null),r("")}function ot(){s(null),r("")}async function dt(){const t=m.trim();t&&(await $(t),i(""),a(!1))}async function rt(){if(!S)return;const t=o.trim();t&&(await f(t),u(""))}async function yt(t){await xt({title:"Delete List",message:"Delete this list and all its items?",danger:!0})&&await y(t)}async function Lt(t){await J(t)}async function ct(t,p){const v=K.map(U=>U.id),b=v.findIndex(U=>U===t);if(b<0)return;const P=p==="up"?b-1:b+1;P<0||P>=v.length||([v[b],v[P]]=[v[P],v[b]],await V(v))}const kt=d.useCallback(async t=>{try{const p={description:t.text,column:"triage",source:{sourceType:"dashboard_ui"}},v=await lt(p,k);I?.(v),l(`Created ${v.id} from todo`,"success")}catch(p){l(`Failed to create task: ${G(p)}`,"error")}},[k,l,I]),It=d.useCallback(async(t,p)=>{try{const v={description:t.text,column:"triage",assignedAgentId:p,source:{sourceType:"dashboard_ui"}},b=await lt(v,k);I?.(b);const U=h.find(Nt=>Nt.id===p)?.name??p;l(`Created ${b.id} and assigned to ${U}`,"success"),O(!1),R(null)}catch(v){l(`Failed to create and assign task: ${G(v)}`,"error")}},[k,l,h,I]);return Y?e.jsx("div",{className:"todo-view",children:e.jsxs("div",{className:"todo-loading",children:[e.jsx(Rt,{className:"todo-loading-icon","aria-hidden":"true"}),e.jsx("p",{children:"Loading todos..."})]})}):e.jsx("div",{className:`todo-view${N?" todo-view--mobile-keyboard-active":""}`,"data-testid":"todo-view-root",children:e.jsxs("div",{className:"todo-view-layout",children:[e.jsxs("aside",{className:"todo-view-sidebar","aria-label":"Todo lists sidebar",children:[e.jsxs("div",{className:"todo-sidebar-header",children:[e.jsx("h3",{className:"todo-sidebar-title",children:"Lists"}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-add-list-btn",onClick:()=>{B(),a(!0),w(null)},"aria-label":"Add list","data-testid":"add-list-button",children:e.jsx(Pt,{})})]}),n&&e.jsxs("div",{className:"todo-list-item",children:[e.jsx("input",{className:"input todo-inline-edit-input",placeholder:"New list title",value:m,onChange:t=>i(t.target.value),onKeyDown:t=>{t.key==="Enter"&&dt(),t.key==="Escape"&&(i(""),a(!1))},autoFocus:!0,"data-testid":"new-list-input"}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{dt()},"aria-label":"Save list",children:e.jsx(H,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{i(""),a(!1)},"aria-label":"Cancel list",children:e.jsx(Q,{})})]}),g.length===0&&!n?e.jsxs("div",{className:"todo-empty-state",children:[e.jsx(ut,{"aria-hidden":"true"}),e.jsx("p",{children:"No todo lists yet. Create one to get started."}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>{B(),a(!0)},children:"Create List"})]}):e.jsx("div",{className:"todo-list-items",role:"list","aria-label":"Todo lists",children:g.map(t=>{const p=t.id===S,v=t.id===T;return e.jsx("div",{className:`todo-list-item${p?" todo-list-item--active":""}`,role:"listitem",children:v?e.jsxs(e.Fragment,{children:[e.jsx("input",{className:"input todo-inline-edit-input",value:_,onChange:b=>A(b.target.value),onKeyDown:b=>{b.key==="Enter"&&st(),b.key==="Escape"&&nt()},autoFocus:!0,"data-testid":`rename-list-input-${t.id}`}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{st()},"aria-label":"Save list rename",children:e.jsx(H,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:nt,"aria-label":"Cancel list rename",children:e.jsx(Q,{})})]}):e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"todo-list-select-btn",onClick:()=>gt(t.id),"aria-label":`Select list ${t.title}`,"aria-current":p?"true":void 0,"data-testid":`todo-list-${t.id}`,children:e.jsx("span",{className:"todo-list-item-name",children:t.title})}),e.jsxs("div",{className:"todo-list-item-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{jt(t)},"aria-label":`Rename ${t.title}`,"data-testid":`rename-list-button-${t.id}`,children:e.jsx(mt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon btn-danger todo-icon-btn",onClick:()=>{yt(t.id)},"aria-label":`Delete ${t.title}`,"data-testid":`delete-list-button-${t.id}`,children:e.jsx(bt,{})})]})]})},t.id)})})]}),e.jsxs("section",{className:"todo-view-main","aria-label":"Todo items",children:[F&&e.jsxs("div",{className:"todo-error-banner",role:"alert",children:[e.jsx("span",{className:"todo-error-message",children:F}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>window.location.reload(),children:"Retry"})]}),tt?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"todo-items-header",children:e.jsx("h3",{children:tt.title})}),e.jsxs("div",{className:"todo-add-item-row",children:[e.jsx("input",{className:"input",placeholder:"Add a todo item",value:o,onChange:t=>u(t.target.value),onKeyDown:t=>{t.key==="Enter"&&rt(),t.key==="Escape"&&u("")},"data-testid":"new-item-input"}),e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>{rt()},children:"Add"})]}),K.length===0?e.jsx("div",{className:"todo-empty-state",children:e.jsx("p",{children:"No items in this list. Add one above."})}):e.jsx("div",{className:"todo-items-list",children:K.map((t,p)=>{const v=t.id===M;return e.jsxs("div",{className:"todo-item","data-testid":`todo-item-${t.id}`,children:[e.jsxs("div",{className:"todo-item-main-row",children:[e.jsx("input",{type:"checkbox",checked:t.completed,onChange:()=>{z(t.id)},className:"todo-item-checkbox","aria-label":`Toggle ${t.text}`,"data-testid":`toggle-item-${t.id}`}),v?e.jsx("input",{className:"input todo-inline-edit-input",value:c,onChange:b=>r(b.target.value),onKeyDown:b=>{b.key==="Enter"&&it(),b.key==="Escape"&&ot()},autoFocus:!0,"data-testid":`edit-item-input-${t.id}`}):e.jsx("button",{type:"button",className:`todo-item-text${t.completed?" todo-item-text--completed":""}`,onClick:()=>at(t),children:t.text})]}),e.jsx("div",{className:"todo-item-actions","data-testid":`todo-item-actions-${t.id}`,children:v?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{it()},"aria-label":"Save item edit",children:e.jsx(H,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:ot,"aria-label":"Cancel item edit",children:e.jsx(Q,{})})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"todo-item-reorder-btns",children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-item-reorder-btn",onClick:()=>{ct(t.id,"up")},disabled:p===0,"aria-label":`Move ${t.text} up`,"data-testid":`move-up-${t.id}`,children:e.jsx(Ut,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-item-reorder-btn",onClick:()=>{ct(t.id,"down")},disabled:p===K.length-1,"aria-label":`Move ${t.text} down`,"data-testid":`move-down-${t.id}`,children:e.jsx(_t,{})})]}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{x?.(t.text)},"aria-label":`Start planning from ${t.text}`,"data-testid":`planning-from-${t.id}`,children:e.jsx(Kt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{kt(t)},"aria-label":`Create task from ${t.text}`,"data-testid":`create-task-from-${t.id}`,children:e.jsx(Yt,{})}),e.jsxs("div",{className:"todo-agent-picker-trigger",ref:Z===t.id?q:void 0,children:[e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>{R(t.id),vt()},"aria-label":`Assign ${t.text} to agent`,"data-testid":`assign-agent-for-${t.id}`,children:e.jsx(pt,{})}),X&&Z===t.id&&e.jsx("div",{className:"todo-agent-picker-dropdown",onMouseDown:b=>{b.preventDefault()},children:ft?e.jsx("div",{className:"todo-agent-picker-loading",children:"Loading agents..."}):h.length>0?h.map(b=>e.jsxs("button",{type:"button",className:"todo-agent-picker-item",onClick:()=>{It(t,b.id)},children:[e.jsx(pt,{}),e.jsx("span",{children:b.name}),e.jsx("span",{className:"todo-agent-picker-role",children:b.role})]},b.id)):e.jsx("div",{className:"todo-agent-picker-empty",children:"No agents available"})})]}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon todo-icon-btn",onClick:()=>at(t),"aria-label":`Edit ${t.text}`,"data-testid":`edit-item-${t.id}`,children:e.jsx(mt,{})}),e.jsx("button",{type:"button",className:"btn btn-sm btn-icon btn-danger todo-icon-btn",onClick:()=>{Lt(t.id)},"aria-label":`Delete ${t.text}`,"data-testid":`delete-item-${t.id}`,children:e.jsx(bt,{})})]})})]},t.id)})})]}):e.jsxs("div",{className:"todo-empty-state",children:[e.jsx(ut,{"aria-hidden":"true"}),e.jsx("p",{children:"Select a list from the sidebar"})]})]})]})})}export{Qt as TodoView};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import{r as t,j as R}from"./vendor-react-K0fH_qHe.js";import{co as Ee,cp as ve,t as Ye,w as je,b9 as Xe}from"./index-DTFPgu6_.js";import{c as pe}from"./createLucideIcon-BazL2hk5.js";import"./vendor-xterm-DzcZoU0P.js";import"./vendor-codemirror-jBKmHyH0.js";const xe=4,ke=300,Ae=24;function $e({taskId:o,position:s,scale:r,canDrag:a,onPositionChange:f,onDragStateChange:c,onDragEnd:m,onDoubleTap:M}){const[C,I]=t.useState(!1),w=t.useRef(null),T=t.useRef(s),_=t.useRef(!1),n=t.useRef(null),h=t.useRef(!1);T.current=s,h.current=C;const l=t.useCallback(()=>{n.current=null},[]),b=t.useCallback(u=>{w.current=null,I(!1),h.current=!1,u&&(c?.(!1),m?.(),_.current=!0,l())},[m,c,l]),z=t.useCallback(u=>{if(!u.isPrimary)return;if(u.defaultPrevented){l();return}const P=Date.now();n.current&&P-n.current.timeStamp>ke&&l(),a&&u.stopPropagation();const D=u.currentTarget;a&&typeof D.setPointerCapture=="function"&&D.setPointerCapture(u.pointerId),w.current={pointerId:u.pointerId,pointerType:u.pointerType,startPointer:{x:u.clientX,y:u.clientY},startPosition:T.current,defaultPrevented:u.defaultPrevented,movedBeyondThreshold:!1}},[a,l]),v=t.useCallback(u=>{const P=w.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation();const D=u.clientX-P.startPointer.x,Y=u.clientY-P.startPointer.y,ee=Math.hypot(D,Y);if(ee>=xe&&(P.movedBeyondThreshold=!0),!a){P.movedBeyondThreshold&&l();return}if(!h.current&&ee>=xe&&(I(!0),h.current=!0,c?.(!0),l()),ee<xe)return;const W=r>0?r:1;f(o,{x:P.startPosition.x+D/W,y:P.startPosition.y+Y/W})},[a,c,f,l,r,o]),L=t.useCallback((u,P)=>{if(!M||P.defaultPrevented||P.movedBeyondThreshold)return Date.now()-(n.current?.timeStamp??0)>ke&&l(),!1;if(P.pointerType==="mouse")return l(),!1;const D={timeStamp:Date.now(),point:{x:P.startPointer.x,y:P.startPointer.y}},Y=n.current;return!Y||D.timeStamp-Y.timeStamp>ke||Math.hypot(D.point.x-Y.point.x,D.point.y-Y.point.y)>Ae?(n.current=D,!1):(_.current=!0,l(),M(),!0)},[M,l]),$=t.useCallback(u=>{const P=w.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId);const D=h.current;!D&&L(u,P)&&u.preventDefault(),b(D)},[a,b,L]),G=t.useCallback(u=>{const P=w.current;!P||P.pointerId!==u.pointerId||(a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId),l(),b(h.current))},[a,b,l]),A=t.useCallback(u=>{_.current&&(_.current=!1,u.preventDefault(),u.stopPropagation())},[]);return t.useMemo(()=>({isDragging:C,onPointerDown:z,onPointerMove:v,onPointerUp:$,onPointerCancel:G,onClickCapture:A}),[C,A,G,z,v,$])}const Ge=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Le(o){return o?o.charAt(0).toUpperCase()+o.slice(1):"Executing"}function We({style:o,position:s,scale:r,isSelected:a=!1,isHighlighted:f=!1,isDimmed:c=!1,onMouseEnter:m,onMouseLeave:M,onClick:C,onNodePositionChange:I,onNodeDragStateChange:w,onNodeDragEnd:T,..._}){const{task:n,globalPaused:h,taskStuckTimeoutMs:l,lastFetchTimeMs:b,onOpenDetail:z}=_,v=n.status==="failed",L=n.paused===!0,$=Ee(n,l,b),G=n.column==="triage"&&n.status==="awaiting-approval",A=!h&&!v&&!L&&!$&&!G&&(n.column==="in-progress"||Ge.has(n.status)),u=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,P=n.column==="in-review",D=$e({taskId:n.id,position:s,scale:r,canDrag:a,onPositionChange:I,onDragStateChange:w,onDragEnd:T,onDoubleTap:()=>z(n)});return R.jsxs("div",{className:`graph-task-node${a?" graph-node--draggable graph-task-node--selected":""}${D.isDragging?" graph-node--dragging":""}${f?" graph-task-node--highlighted graph-node--highlighted":""}${c?" graph-task-node--dimmed graph-node--dimmed":""}${A?" graph-task-node--active":""}${P?" graph-task-node--in-review":""}`,style:o,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":A&&u?String(n.currentStep):void 0,onMouseEnter:m,onMouseLeave:M,onClick:C,onDoubleClick:Y=>{Y.defaultPrevented||z(n)},onClickCapture:D.onClickCapture,onPointerDown:D.onPointerDown,onPointerMove:D.onPointerMove,onPointerUp:D.onPointerUp,onPointerCancel:D.onPointerCancel,children:[A?R.jsx("div",{className:"graph-task-active-indicator",children:R.jsx("span",{className:"graph-task-active-indicator-text",children:Le(n.status)})}):null,R.jsx(ve,{..._,onOpenDetail:()=>{},disableDrag:!0})]})}/**
|
|
2
|
+
* @license lucide-react v0.542.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Ue=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],Fe=pe("maximize",Ue);/**
|
|
7
|
+
* @license lucide-react v0.542.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Be=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Ze=pe("rotate-ccw",Be);/**
|
|
12
|
+
* @license lucide-react v0.542.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const Ve=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Ke=pe("zoom-in",Ve);/**
|
|
17
|
+
* @license lucide-react v0.542.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const qe=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]],Je=pe("zoom-out",qe);function Qe({zoom:o,onZoomIn:s,onZoomOut:r,onFitToGraph:a,onResetView:f}){return R.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[R.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:s,children:R.jsx(Ke,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:r,children:R.jsx(Je,{size:16})}),R.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(o*100),"%"]}),R.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:a,children:R.jsx(Fe,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:f,children:R.jsx(Ze,{size:16})})]})}const et=280,tt=100;function nt({edges:o,positions:s,nodeWidth:r=et,nodeHeight:a=tt,nodeHeights:f,highlightedEdgeIds:c}){const m=!!(c&&c.size>0);return R.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[R.jsx("defs",{children:R.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:R.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),o.map(M=>{const C=s.get(M.source),I=s.get(M.target);if(!C||!I)return null;const w=`${M.source}->${M.target}`,T=m&&(c?.has(w)??!1),_=C.x+r/2,n=C.y+(f?.get(M.source)??a),h=I.x+r/2,l=I.y,b=n+(l-n)/2;return R.jsx("path",{"data-testid":"dependency-edge","data-edge-id":w,className:`dependency-graph-edge${T?" graph-edge--highlighted":""}${m&&!T?" graph-edge--dimmed":""}`,d:`M ${_} ${n} C ${_} ${b}, ${h} ${b}, ${h} ${l}`,fill:"none",stroke:T?"var(--todo)":"var(--border)",strokeWidth:T?"var(--space-xs)":"var(--btn-border-width)",opacity:m&&!T?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},w)})]})}const ot=new Set(["triage","todo","in-progress","in-review"]);function rt(o){return o.filter(s=>ot.has(s.column))}const st={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80,orientation:"vertical"};function we(o,s){const r={...st,...s},a=o.nodes.map(n=>n.task.id);if(a.length===0)return new Map;const f=new Map,c=new Map;for(const n of a)c.set(n,0),f.set(n,[]);for(const n of o.edges)!c.has(n.source)||!c.has(n.target)||(f.get(n.target)?.push(n.source),c.set(n.source,(c.get(n.source)??0)+1));const m=a.filter(n=>(c.get(n)??0)===0),M=[];for(;m.length>0;){const n=m.shift();M.push(n);for(const h of f.get(n)??[]){const l=(c.get(h)??0)-1;c.set(h,l),l===0&&m.push(h)}}for(const n of a)M.includes(n)||M.push(n);const C=new Map;for(const n of M){const h=o.edges.filter(b=>b.source===n).map(b=>b.target);let l=0;for(const b of h)l=Math.max(l,(C.get(b)??0)+1);C.set(n,l)}const I=new Map;for(const n of a){const h=C.get(n)??0,l=I.get(h)??[];l.push(n),I.set(h,l)}const w=new Map,T=Array.from(I.keys()).sort((n,h)=>n-h),_=new Map;if(r.orientation==="vertical"){let n=0;for(const h of T){_.set(h,n);const l=I.get(h)??[],b=Math.max(r.nodeHeight,...l.map(z=>r.measuredHeights?.get(z)??r.nodeHeight));n+=b+r.verticalGap}}for(const n of T){const h=I.get(n)??[];if(h.sort(),r.orientation==="horizontal"){const L=-(h.reduce((A,u)=>A+(r.measuredHeights?.get(u)??r.nodeHeight),0)+Math.max(0,h.length-1)*r.verticalGap)/2,$=n*(r.nodeWidth+r.horizontalGap);let G=L;for(const A of h)w.set(A,{x:$,y:G}),G+=(r.measuredHeights?.get(A)??r.nodeHeight)+r.verticalGap;continue}const z=-(h.length*r.nodeWidth+Math.max(0,h.length-1)*r.horizontalGap)/2;h.forEach((v,L)=>{const $=z+L*(r.nodeWidth+r.horizontalGap),G=_.get(n)??n*(r.nodeHeight+r.verticalGap);w.set(v,{x:$,y:G})})}return w}function it(o){return t.useMemo(()=>{const s=o.map(f=>({task:f})),r=new Set(o.map(f=>f.id)),a=o.flatMap(f=>(f.dependencies??[]).filter(c=>r.has(c)).map(c=>({source:f.id,target:c})));return{nodes:s,edges:a}},[o])}const ce=.1,ue=3,Te=40,at=200;function J(o,s,r){return Math.min(r,Math.max(s,o))}function ct(o){if(!(o instanceof HTMLElement))return!1;const s=o.tagName.toLowerCase();return o.isContentEditable||s==="input"||s==="textarea"||s==="select"}function ut(){const[o,s]=t.useState({x:0,y:0}),[r,a]=t.useState(1),[f,c]=t.useState(!1),m=t.useRef(o),M=t.useRef(r),C=t.useRef(null),I=t.useRef(null),w=t.useRef(new Map),T=t.useRef(null),_=t.useRef({minX:0,minY:0,maxX:0,maxY:0});t.useEffect(()=>{m.current=o},[o]),t.useEffect(()=>{M.current=r},[r]),t.useEffect(()=>()=>{C.current!==null&&window.clearTimeout(C.current)},[]);const n=t.useMemo(()=>`translate(${o.x}px, ${o.y}px) scale(${r})`,[o.x,o.y,r]),h=t.useMemo(()=>Math.round(r*100),[r]),l=t.useCallback(i=>{if(!i){C.current!==null&&(window.clearTimeout(C.current),C.current=null),c(!1);return}c(!0),C.current!==null&&window.clearTimeout(C.current),C.current=window.setTimeout(()=>{c(!1),C.current=null},at)},[]),b=t.useCallback((i,d,g,S=M.current)=>{const x=_.current;if(x.maxX<=x.minX||x.maxY<=x.minY)return{x:J(i.x,-d,d),y:J(i.y,-g,g)};const U=d-x.maxX*S,O=-x.minX*S,j=g-x.maxY*S,B=-x.minY*S,Z=U>O?(U+O)/2:J(i.x,U,O),K=j>B?(j+B)/2:J(i.y,j,B);return{x:Z,y:K}},[]),z=t.useCallback((i,d,g,S)=>{const x=M.current,U=m.current,O=J(i,ce,ue),j=O/x,B=b({x:d.x-(d.x-U.x)*j,y:d.y-(d.y-U.y)*j},g,S,O);a(O),s(B)},[b]),v=t.useCallback((i,d,g,S)=>{l(!1);const x=S??{x:d/2,y:g/2};z(M.current*i,x,d,g)},[l,z]),L=t.useCallback((i,d)=>{if(i&&d){v(1.2,i,d);return}a(g=>J(g+.1,ce,ue))},[v]),$=t.useCallback((i,d)=>{if(i&&d){v(1/1.2,i,d);return}a(g=>J(g-.1,ce,ue))},[v]),G=t.useCallback(()=>{l(!0),s({x:0,y:0}),a(1)},[l]),A=t.useCallback((i,d,g,S)=>{if(l(!0),i.size===0){s({x:0,y:0}),a(1);return}const x=S?.nodeWidth??280,U=S?.nodeHeight??100,O=Array.from(i.entries()),j=Math.min(...O.map(([,q])=>q.x)),B=Math.min(...O.map(([,q])=>q.y)),Z=Math.max(...O.map(([,q])=>q.x+x)),K=Math.max(...O.map(([q,me])=>me.y+(S?.measuredHeights?.get(q)??U))),te=Math.max(1,Z-j),X=Math.max(1,K-B),re=Math.max(1,d-Te*2),se=Math.max(1,g-Te*2),ne=J(Math.min(re/te,se/X),ce,ue),he=(d-te*ne)/2-j*ne,de=(g-X*ne)/2-B*ne;a(ne),s(b({x:he,y:de},d,g,ne))},[b,l]),u=t.useCallback((i,d)=>{if(w.current.set(i,d),w.current.size===2){const[g,S]=Array.from(w.current.values());T.current={distance:Math.hypot(g.x-S.x,g.y-S.y),zoom:M.current,pan:m.current,midpoint:{x:(g.x+S.x)/2,y:(g.y+S.y)/2}},I.current=null;return}I.current={start:d,panStart:m.current}},[]),P=t.useCallback((i,d,g,S)=>{if(w.current.has(i)&&w.current.set(i,d),w.current.size===2&&T.current){l(!1);const[O,j]=Array.from(w.current.values()),Z=Math.hypot(O.x-j.x,O.y-j.y)/Math.max(1,T.current.distance),K={x:(O.x+j.x)/2,y:(O.y+j.y)/2},te=J(T.current.zoom*Z,ce,ue),X=te/T.current.zoom,re=b({x:K.x-(T.current.midpoint.x-T.current.pan.x)*X,y:K.y-(T.current.midpoint.y-T.current.pan.y)*X},g,S);a(te),s(re);return}const x=I.current;if(!x)return;l(!1);const U={x:x.panStart.x+(d.x-x.start.x),y:x.panStart.y+(d.y-x.start.y)};s(b(U,g,S))},[b,l]),D=t.useCallback(i=>{if(w.current.delete(i),w.current.size<2&&(T.current=null),w.current.size===1){const[d]=Array.from(w.current.values());I.current={start:d,panStart:m.current};return}w.current.size===0&&(I.current=null)},[]),Y=t.useCallback((i,d,g,S)=>{l(!1);const x={x:m.current.x-i,y:m.current.y-d};s(b(x,g,S))},[b,l]),ee=t.useCallback((i,d,g,S)=>{const x=i<0?1.1:.9;l(!1),z(M.current*x,d,g,S)},[l,z]),W=t.useCallback(i=>{_.current=i},[]),le=t.useCallback((i,d,g,S,x)=>{if(ct(i.target))return;const U=i.metaKey||i.ctrlKey;if(i.key==="Escape"){i.preventDefault(),G();return}if(U){if(i.key==="="||i.key==="+"){i.preventDefault(),v(1.2,d,g);return}if(i.key==="-"){i.preventDefault(),v(1/1.2,d,g);return}if(i.key==="0"){i.preventDefault(),G();return}(i.key==="f"||i.key==="F")&&i.shiftKey&&(i.preventDefault(),A(S,d,g,x))}},[A,G,v]);return{pan:o,zoom:r,zoomPercent:h,transform:n,transitioning:f,zoomIn:L,zoomOut:$,resetView:G,fitToGraph:A,setAnimate:l,onPointerDown:u,onPointerMove:P,onPointerUp:D,onWheelPan:Y,onWheelZoom:ee,handleKeyDown:le,setGraphBounds:W}}function lt(o){const{upstreamMap:s,downstreamMap:r}=t.useMemo(()=>{const f=new Map,c=new Map;for(const m of o)f.set(m.id,new Set(m.dependencies??[])),c.has(m.id)||c.set(m.id,new Set);for(const m of o)for(const M of m.dependencies??[])c.has(M)||c.set(M,new Set),c.get(M)?.add(m.id);return{upstreamMap:f,downstreamMap:c}},[o]);return{getChain:t.useCallback(f=>{if(!s.has(f)&&!r.has(f))return new Set;const c=new Set([f]),m=(M,C)=>{const I=[M],w=new Set([M]);for(;I.length>0;){const T=I.shift();if(!T)continue;const _=C.get(T);if(_)for(const n of _)w.has(n)||(w.add(n),c.add(n),I.push(n))}};return m(f,s),m(f,r),c},[r,s])}}const Me="fusion-plugin-dependency-graph:positions";function fe(o){if(!o||typeof o!="object")return!1;const s=o;return typeof s.x=="number"&&Number.isFinite(s.x)&&typeof s.y=="number"&&Number.isFinite(s.y)}function dt(o){const s=Ye(Me,o);if(!s)return{};try{const r=JSON.parse(s);if(!r||typeof r!="object")return{};const a={};for(const[f,c]of Object.entries(r))fe(c)&&(a[f]=c);return a}catch{return{}}}function ft(o,s,r){const a={};for(const[f,c]of Object.entries(o))s.has(f)&&fe(c)&&(a[f]=c);je(Me,JSON.stringify(a),r)}function pt(o){Xe(Me,o)}function ht(o,s,r){const a={};for(const[f,c]of Object.entries(o))r.has(f)&&fe(c)&&(a[f]=c);for(const[f,c]of Object.entries(s))r.has(f)&&fe(c)&&(a[f]=c);return a}function mt(o,s){const r={};for(const[a,f]of Object.entries(o))s.has(a)&&(r[a]=f);return r}function gt({projectId:o,visibleTaskIds:s}){const[r,a]=t.useState(null);t.useEffect(()=>{a(dt(o))},[o]);const f=t.useCallback(m=>{ft(m,s,o),a(mt(m,s))},[o,s]),c=t.useCallback(()=>{pt(o),a(null)},[o]);return{savedPositions:r,persistPositions:f,clearSavedPositions:c}}const ae=280,Q=100,yt=768,Ce=4;function xt({tasks:o,projectId:s,onOpenTaskDetail:r,onOpenDetail:a,addToast:f,globalPaused:c,onUpdateTask:m,onArchiveTask:M,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:w,onOpenDetailWithTab:T,taskStuckTimeoutMs:_,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:b}){const z=t.useRef(null),v=t.useRef(!1),L=t.useRef(null),$=t.useRef(!1),G=t.useRef(new Map),[A,u]=t.useState(null),[P,D]=t.useState(null),[Y,ee]=t.useState({width:0,height:0}),[W,le]=t.useState(new Map),i=t.useMemo(()=>rt(o),[o]),d=it(i),{getChain:g}=lt(i),S=A??P,x=t.useMemo(()=>S?g(S):new Set,[S,g]),U=t.useMemo(()=>{const e=Y.width||(typeof window<"u"?window.innerWidth:0);return(Y.height||(typeof window<"u"?window.innerHeight:0))>e||e<yt?"horizontal":"vertical"},[Y.height,Y.width]),O=t.useMemo(()=>({nodeWidth:ae,nodeHeight:Q,horizontalGap:40,verticalGap:80,orientation:U,measuredHeights:W}),[W,U]),j=t.useMemo(()=>we(d,O),[d,O]),B=t.useMemo(()=>new Set(i.map(e=>e.id)),[i]),{savedPositions:Z,persistPositions:K,clearSavedPositions:te}=gt({projectId:s,visibleTaskIds:B}),[X,re]=t.useState(j),[se,ne]=t.useState(!1);t.useEffect(()=>{const e={};for(const[y,H]of j.entries())e[y]=H;const p=Z?ht(e,Z,B):e;re(new Map(Object.entries(p)))},[j,Z,B]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=(H,E)=>{ee(k=>k.width===H&&k.height===E?k:{width:H,height:E})};if(typeof ResizeObserver>"u"){p(e.clientWidth||(typeof window<"u"?window.innerWidth:0),e.clientHeight||(typeof window<"u"?window.innerHeight:0));return}p(e.clientWidth,e.clientHeight);const y=new ResizeObserver(H=>{const E=H[0];E&&p(E.contentRect.width,E.contentRect.height)});return y.observe(e),()=>y.disconnect()},[]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=new Set(d.nodes.map(k=>k.task.id)),y=new Map;for(const k of p){const N=e.querySelector(`[data-testid="graph-task-node-${k}"]`);N&&y.set(k,N)}G.current=y,le(k=>{let N=!1;const F=new Map;for(const[oe,ie]of k.entries()){if(!p.has(oe)){N=!0;continue}F.set(oe,ie)}return N?F:k});const H=(k,N)=>{le(F=>{const oe=F.get(k);if(oe!==void 0&&Math.abs(oe-N)<1)return F;const ie=new Map(F);return ie.set(k,N),ie})};for(const[k,N]of y.entries())H(k,N.offsetHeight||Q);if(typeof ResizeObserver>"u")return;const E=new ResizeObserver(k=>{for(const N of k){const F=N.target,oe=Array.from(y.entries()).find(([,ie])=>ie===F)?.[0];oe&&H(oe,F.offsetHeight||Q)}});for(const k of y.values())E.observe(k);return()=>E.disconnect()},[d.nodes,X,Y.height,Y.width]);const{transform:he,zoom:de,transitioning:q,zoomIn:me,zoomOut:De,resetView:Re,fitToGraph:ge,onPointerDown:Ie,onPointerMove:ze,onPointerUp:be,onWheelPan:He,onWheelZoom:Ne,handleKeyDown:Oe,setGraphBounds:Pe}=ut();t.useEffect(()=>{if(v.current||i.length===0)return;if(!!(Z&&Object.keys(Z).length>0)){v.current=!0;return}const p=z.current;p&&(ge(X,p.clientWidth,p.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:W}),v.current=!0)},[i.length,ge,W,X,Z]);const V=t.useMemo(()=>{const e=Array.from(X.values());if(e.length===0)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};const p=Math.min(...e.map(k=>k.x)),y=Math.min(...e.map(k=>k.y)),H=Math.max(...e.map(k=>k.x+ae)),E=Math.max(...Array.from(X.entries()).map(([k,N])=>N.y+(W.get(k)??Q)));return{minX:p,minY:y,maxX:H,maxY:E,width:Math.max(0,H-p),height:Math.max(0,E-y)}},[W,X]),ye=t.useMemo(()=>{if(X.size===0)return X;const e=new Map;for(const[p,y]of X.entries())e.set(p,{x:y.x-V.minX,y:y.y-V.minY});return e},[V.minX,V.minY,X]);t.useEffect(()=>{Pe({minX:0,minY:0,maxX:V.width,maxY:V.height})},[V.height,V.width,Pe]);const Se=t.useCallback(()=>{te();const e=we(d,O);re(e)},[te,d,O]),_e=t.useCallback(()=>{const e={};for(const[p,y]of X.entries())e[p]=y;K(e)},[K,X]);return R.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[R.jsx("div",{ref:z,className:"dependency-graph__viewport",onPointerDown:e=>{se||(L.current={x:e.clientX,y:e.clientY},$.current=!1,Ie(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(se)return;const p=z.current;if(!p)return;const y=L.current;if(y){const H=Math.abs(e.clientX-y.x),E=Math.abs(e.clientY-y.y);(H>Ce||E>Ce)&&($.current=!0)}ze(e.pointerId,{x:e.clientX,y:e.clientY},p.clientWidth,p.clientHeight)},onPointerUp:e=>{se||be(e.pointerId),L.current=null},onPointerCancel:e=>{se||be(e.pointerId),L.current=null,$.current=!1},onWheel:e=>{e.preventDefault();const p=z.current;if(p){if(e.ctrlKey||e.metaKey){const y=p.getBoundingClientRect();Ne(e.deltaY,{x:e.clientX-y.left,y:e.clientY-y.top},p.clientWidth,p.clientHeight);return}He(e.deltaX,e.deltaY,p.clientWidth,p.clientHeight)}},onKeyDown:e=>{const p=z.current;p&&Oe(e,p.clientWidth,p.clientHeight,ye,{nodeWidth:ae,nodeHeight:Q,measuredHeights:W})},tabIndex:0,onClick:()=>{$.current||se||D(null)},children:i.length===0?R.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):R.jsxs("div",{className:`graph-canvas-transform${q?" graph-canvas-transform--animate":""}`,style:{transform:he,width:`${V.width}px`,height:`${V.height}px`},children:[R.jsx(nt,{edges:d.edges,positions:ye,nodeWidth:ae,nodeHeight:Q,nodeHeights:W,highlightedEdgeIds:x.size>0?new Set(d.edges.filter(e=>x.has(e.source)&&x.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),R.jsx("div",{className:"dependency-graph__nodes-layer",children:d.nodes.map(e=>{const p=ye.get(e.task.id);return p?R.jsx(We,{task:e.task,projectId:s,isSelected:P===e.task.id,style:{minHeight:`${Q}px`,left:`${p.x}px`,top:`${p.y}px`},position:p,scale:de,onNodePositionChange:(y,H)=>{re(E=>{const k={x:H.x+V.minX,y:H.y+V.minY},N=E.get(y);if(N&&N.x===k.x&&N.y===k.y)return E;const F=new Map(E);return F.set(y,k),F})},onNodeDragStateChange:ne,onNodeDragEnd:_e,isHighlighted:x.size>0&&x.has(e.task.id),isDimmed:x.size>0&&!x.has(e.task.id),onOpenDetail:a??(y=>r?.(y.id)),addToast:f??(()=>{}),globalPaused:c,onUpdateTask:m,onArchiveTask:M,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:w,onOpenDetailWithTab:T,taskStuckTimeoutMs:_,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:b,onMouseEnter:()=>u(e.task.id),onMouseLeave:()=>u(null),onClick:y=>{y.stopPropagation(),$.current=!1,D(H=>H===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),R.jsx(Qe,{zoom:de,onZoomIn:()=>{const e=z.current;e&&me(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=z.current;e&&De(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{Se();const e=z.current;if(!e)return;const p=we(d,O),y=new Map,H=Array.from(p.values()),E=H.length>0?Math.min(...H.map(N=>N.x)):0,k=H.length>0?Math.min(...H.map(N=>N.y)):0;for(const[N,F]of p.entries())y.set(N,{x:F.x-E,y:F.y-k});ge(y,e.clientWidth,e.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:W})},onResetView:()=>{Se(),Re()}})]})}function kt(o){return new Map((o??[]).map(s=>[s.id,s.name]))}function Tt({context:o}){return t.createElement(xt,{tasks:o?.tasks??[],projectId:o?.projectId,workflowStepNameLookup:kt(o?.workflowSteps),onOpenDetail:o?.openTaskDetail})}export{xt as DependencyGraph,Tt as DependencyGraphDashboardView,Tt as default};
|