@runfusion/fusion 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/bin.js +2188 -323
  2. package/dist/client/assets/{AgentDetailView-CDZED6Dy.css → AgentDetailView-BMrHuWGs.css} +1 -1
  3. package/dist/client/assets/{AgentDetailView-zycSdnO8.js → AgentDetailView-CkuuGA1O.js} +1 -1
  4. package/dist/client/assets/AgentsView-CWFLMIDP.js +522 -0
  5. package/dist/client/assets/AgentsView-DETxUmHS.css +1 -0
  6. package/dist/client/assets/{ChatView-BOd-sxbT.js → ChatView-C_T91ebd.js} +1 -1
  7. package/dist/client/assets/{DevServerView-09GQf34f.js → DevServerView-ChWTzTvy.js} +1 -1
  8. package/dist/client/assets/{DirectoryPicker-CcdN1Zs7.js → DirectoryPicker-BMJIT7HD.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-CS8aiwtz.js → DocumentsView-CjfVl8mZ.js} +1 -1
  10. package/dist/client/assets/{InsightsView-Bu9Cv8Ol.js → InsightsView-Rb735C9_.js} +1 -1
  11. package/dist/client/assets/{MemoryView-CtqgDtV9.js → MemoryView-LLc_uNtG.js} +1 -1
  12. package/dist/client/assets/NodesView-BYVG2yY-.css +1 -0
  13. package/dist/client/assets/{NodesView-BInPcedy.js → NodesView-BviqBWRA.js} +1 -1
  14. package/dist/client/assets/{PiExtensionsManager-COxkYM2m.js → PiExtensionsManager-CriZBkQe.js} +1 -1
  15. package/dist/client/assets/{PluginManager-CXUWZBOc.js → PluginManager-BywTPbLB.js} +1 -1
  16. package/dist/client/assets/{RoadmapsView-BbCexaoi.js → RoadmapsView-Dhl--4vY.js} +1 -1
  17. package/dist/client/assets/{SetupWizardModal-Cakxqkad.js → SetupWizardModal-CVtmwoJC.js} +1 -1
  18. package/dist/client/assets/{SkillsView-D3iqYCVf.js → SkillsView-CG9y4fsE.js} +1 -1
  19. package/dist/client/assets/{folder-open-kO5Hsk66.js → folder-open-BVDq27HP.js} +1 -1
  20. package/dist/client/assets/index-CikysL-d.js +644 -0
  21. package/dist/client/assets/index-Da1qmtc7.css +1 -0
  22. package/dist/client/assets/{upload-DHBQat92.js → upload-BDvpReDO.js} +1 -1
  23. package/dist/client/index.html +2 -2
  24. package/dist/extension.js +12 -10
  25. package/package.json +4 -4
  26. package/dist/client/assets/AgentsView-DoQkkDLf.css +0 -1
  27. package/dist/client/assets/AgentsView-pO7WiBS5.js +0 -522
  28. package/dist/client/assets/NodesView-DlQZHGXA.css +0 -1
  29. package/dist/client/assets/index-BiSuUXCa.css +0 -1
  30. package/dist/client/assets/index-y194HxzU.js +0 -644
@@ -0,0 +1 @@
1
+ .active-agents-panel{margin-bottom:var(--space-lg)}.active-agents-panel-header{display:flex;align-items:center;gap:var(--space-sm);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md)}.active-agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--space-md)}.live-agent-card{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md)}.live-agent-card-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.live-agent-card-name{display:flex;align-items:center;gap:var(--space-sm);font-weight:600;font-size:13px}.live-agent-pulse{width:8px;height:8px;background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.live-agent-task{font-family:var(--font-mono)}.live-agent-card-transcript{font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-muted);max-height:120px;overflow-y:auto}.live-agent-card-empty{font-style:italic;opacity:.6}.live-agent-card-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-footer{display:flex;align-items:center;justify-content:space-between;font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-top:var(--space-sm);border-top:1px solid var(--border)}.live-agent-streaming-dot{color:var(--color-success);animation:pulse 1.5s infinite}@media(max-width:768px){.active-agents-grid{grid-template-columns:1fr}.live-agent-card{min-width:0;overflow:hidden}}.agent-token-stats-panel{margin-bottom:var(--space-lg);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);box-shadow:var(--shadow-sm)}.agent-token-stats-panel__header{margin-bottom:var(--space-md)}.agent-token-stats-panel__title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;color:var(--text)}.agent-token-stats-panel__totals{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-2xl) * 4),1fr));gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-token-stats-panel__total-card{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.agent-token-stats-panel__total-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8)}.agent-token-stats-panel__total-value{color:var(--text);font-size:calc(var(--space-lg) + var(--space-xs));line-height:1.2;font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__table-wrapper{overflow-x:auto}.agent-token-stats-panel__table{width:100%;border-collapse:collapse}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-sm);border-bottom:1px solid var(--border);color:var(--text);text-align:right;font-size:calc(var(--space-sm) + var(--space-xs))}.agent-token-stats-panel__table thead th{text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8);color:var(--text-muted);font-weight:600}.agent-token-stats-panel__table th:first-child,.agent-token-stats-panel__table td:first-child{text-align:left}.agent-token-stats-panel__agent-cell{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-token-stats-panel__agent-name{color:var(--text)}.agent-token-stats-panel__agent-id{color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:none;letter-spacing:normal}.agent-token-stats-panel__total-cell{font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__empty{padding:var(--space-md);border:1px dashed var(--border);border-radius:var(--radius-sm);color:var(--text-muted);background:color-mix(in srgb,var(--surface) 85%,transparent);font-size:calc(var(--space-sm) + var(--space-xs))}@media(max-width:768px){.agent-token-stats-panel{padding:var(--space-sm)}.agent-token-stats-panel__totals{grid-template-columns:1fr}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-xs) var(--space-sm)}}.agent-dialog-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(var(--space-xs));display:flex;align-items:center;justify-content:center;z-index:100;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:calc(var(--space-xl) * 21 + var(--space-md));max-height:calc(100vh - (var(--space-xl) + var(--space-lg)));display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border)}.agent-dialog-header-title{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .75)}.agent-dialog-body{flex:1;overflow-y:auto;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-top:1px solid var(--border)}.agent-dialog-steps{display:flex;gap:calc(var(--space-sm) - var(--space-xs) * .5);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));justify-content:center}.agent-dialog-step{width:calc(var(--space-2xl) + var(--space-sm));height:var(--space-xs);border-radius:calc(var(--space-xs) * .5);background:var(--border);transition:background var(--transition-fast)}.agent-dialog-step.active{background:var(--todo)}.agent-dialog-step.completed{background:var(--color-success)}.agent-dialog-field{margin-bottom:var(--space-lg)}.agent-dialog-field label{display:block;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;margin-bottom:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-field .input,.agent-dialog-field .select{width:100%;box-sizing:border-box}.agent-dialog-section{margin-bottom:var(--space-lg)}.agent-dialog-section-header{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);margin-bottom:var(--space-md);padding-bottom:var(--space-xs);border-bottom:1px solid var(--border)}.agent-dialog-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-lg)}.agent-dialog-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-dialog-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-dialog-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-dialog-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-dialog-tab-panel{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 3 + var(--space-sm)),1fr));gap:var(--space-sm)}.agent-role-option{display:flex;flex-direction:column;align-items:center;padding:var(--space-md) var(--space-sm);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);font-family:var(--font-primary);color:var(--text)}.agent-role-option:hover{border-color:var(--text-muted);background:var(--card-hover)}.agent-role-option:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-role-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent);box-shadow:var(--focus-ring)}.agent-role-option-icon{font-size:calc(var(--space-lg) + var(--space-xs));line-height:1}.agent-role-option-label{font-size:calc(var(--space-sm) + var(--space-xs));margin-top:var(--space-xs)}.agent-dialog-icon-prefix{margin-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-ai-generate{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-md)}.btn--ai-generate{width:100%;display:flex;align-items:center;justify-content:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);background:var(--cta-bg, var(--todo));color:var(--cta-text, var(--text));font-weight:600;border:1px solid transparent}.btn--ai-generate:hover{opacity:.9;filter:brightness(1.1)}.agent-dialog-ai-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-align:center;margin:calc(var(--space-sm) - var(--space-xs) * .5) 0 0}.agent-dialog-summary{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-dialog-summary-row{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.agent-dialog-summary-row:last-child{border-bottom:none}.agent-dialog-summary-row-label{color:var(--text-muted);font-size:13px}.agent-dialog-summary-row-label--fixed{flex:0 0 calc(var(--space-xl) * 4 - var(--space-xs) * 1.5)}.agent-dialog-summary-row-value{font-weight:600}.agent-dialog-summary-row-value--body{font-weight:400}.agent-dialog-summary--spaced{margin-bottom:var(--space-md)}.agent-dialog-summary-row-value--muted{font-style:italic;color:var(--text-muted)}.agent-dialog-summary-row-value--capitalize{text-transform:capitalize}.agent-presets{margin-bottom:var(--space-lg)}.agent-presets-header{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md);display:flex;align-items:center;gap:var(--space-sm)}.agent-presets-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 5 + var(--space-lg) + var(--space-xs)),1fr));gap:var(--space-sm);margin-bottom:var(--space-lg);max-height:calc(var(--space-xl) * 16 + var(--space-lg));overflow-y:auto}.agent-preset-card{display:flex;flex-direction:column;align-items:center;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast);background:var(--bg-secondary);font-family:var(--font-primary);color:var(--text)}.agent-preset-card:hover{border-color:var(--todo);background:var(--bg-tertiary)}.agent-preset-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-preset-card.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-preset-icon{font-size:var(--space-xl);margin-bottom:var(--space-xs)}.agent-preset-name{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;text-align:center;margin-bottom:var(--space-xs)}.agent-preset-role{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);text-transform:capitalize}.agent-preset-description{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:calc(var(--space-xs) * .5)}.agent-dialog-header-sparkle{margin-right:var(--space-sm)}.agent-dialog-error-banner{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border-radius:var(--radius-md);margin-bottom:var(--space-md)}.agent-dialog-textarea{resize:vertical}.agent-dialog-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);margin-top:var(--space-xs);display:flex;justify-content:space-between;gap:var(--space-sm)}.agent-dialog-loading-center{display:flex;flex-direction:column;align-items:center;padding:var(--space-2xl) var(--space-lg);gap:var(--space-md)}.agent-dialog-spinner{width:var(--space-2xl);height:var(--space-2xl);border:calc(var(--space-xs) * .75) solid var(--border);border-top-color:var(--todo);border-radius:50%}.agent-dialog-loading-text{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0}.agent-dialog-expand-btn{background:none;border:none;color:var(--todo);cursor:pointer;font-size:calc(var(--space-sm) + var(--space-xs));margin-left:var(--space-sm);padding:0}.agent-dialog-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.agent-generation-prompt-box{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-family:var(--font-mono);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow:auto;position:relative}.agent-generation-prompt-box--collapsed{max-height:calc(var(--space-xl) * 6 + var(--space-sm) + var(--space-xs) * .5);overflow:hidden}.agent-generation-prompt-fade{position:absolute;bottom:0;left:0;right:0;height:calc(var(--space-lg) + var(--space-xl));background:linear-gradient(transparent,var(--bg-secondary));pointer-events:none}.agent-dialog-required{color:var(--color-error)}.agent-dialog-optional{color:var(--text-muted);font-weight:400}.agent-dialog-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:var(--space-md)}.agent-dialog-info{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:0;margin-bottom:var(--space-md)}.agent-dialog-loading{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) 0}.skill-multiselect{display:flex;flex-direction:column;gap:var(--space-sm)}.skill-multiselect-label{font-size:13px;font-weight:500;color:var(--text-secondary)}.skill-multiselect-chips{display:flex;flex-wrap:wrap;gap:4px}.skill-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;background:var(--bg-tertiary);color:var(--text-secondary);border-radius:4px;font-size:12px;line-height:1.4}.skill-chip-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-chip-remove{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;background:transparent;border:none;border-radius:2px;color:var(--text-muted);font-size:14px;line-height:1;cursor:pointer;transition:color .15s,background .15s}.skill-chip-remove:hover:not(:disabled){color:var(--text-primary);background:var(--bg-hover)}.skill-chip-remove:disabled{opacity:.5;cursor:not-allowed}.skill-multiselect-add{min-height:32px}.skill-multiselect-loading,.skill-multiselect-empty{font-size:13px;color:var(--text-muted);padding:4px 0}.skill-multiselect-dropdown{width:100%;font-size:13px}.agent-dialog-skills-hint{margin-top:4px;font-size:12px}.skill-badge-row{display:flex;flex-wrap:wrap;gap:4px}.skill-badge{display:inline-block;padding:2px 6px;background:var(--bg-tertiary);color:var(--text-secondary);border-radius:4px;font-size:11px;line-height:1.4}.badge-skill{background:var(--bg-tertiary);color:var(--text-secondary)}.agent-board-skills{display:flex;flex-wrap:wrap;gap:4px;padding:4px 8px}.skill-badge-sm{display:inline-block;padding:1px 5px;background:var(--bg-tertiary);color:var(--text-secondary);border-radius:3px;font-size:10px;line-height:1.4}.skill-badge-extra{background:var(--bg-secondary)}.agent-tree__skill{display:inline-block;padding:1px 5px;background:var(--bg-tertiary);color:var(--text-secondary);border-radius:3px;font-size:10px;line-height:1.4;margin-left:6px}.org-chart-node__skill{display:inline-block;padding:1px 5px;background:var(--bg-tertiary);color:var(--text-secondary);border-radius:3px;font-size:10px;line-height:1.4}.divider{color:var(--border)}.text-muted{color:var(--text-muted)}.link{display:inline-flex;align-items:center;gap:4px;color:var(--todo);text-decoration:none}.link:hover{text-decoration:underline}.text-secondary{color:var(--text-muted)}.agent-import-skills-section{margin-top:var(--space-lg)}.agent-import-skill-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 6);overflow-y:auto}.agent-import-skill-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border)}.agent-import-skill-icon{flex-shrink:0}.agent-import-skill-details{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.agent-import-skill-name{font-weight:500;color:var(--text)}.agent-import-skill-description{color:var(--text-muted)}.agent-import-empty{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);text-align:center;padding:var(--space-lg)}.agent-import-result{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm)}.agent-import-result-icon{color:var(--color-success);margin-bottom:var(--space-xs)}.agent-import-result-title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.agent-import-result-company{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0 0 var(--space-md) 0}.agent-import-result-stats{display:flex;gap:var(--space-lg);margin-bottom:var(--space-md);padding:var(--space-md);background:var(--bg-secondary);border-radius:var(--radius-md)}.agent-import-result-stat{display:flex;align-items:center;gap:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);padding:var(--space-xs) var(--space-sm)}.agent-import-result-stat--success{color:var(--color-success)}.agent-import-result-stat--skipped{color:var(--color-warning)}.agent-import-result-stat--error{color:var(--color-error)}.agent-import-result-stat--success:before,.agent-import-result-stat--skipped:before,.agent-import-result-stat--error:before{content:"";width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.agent-import-result-stat--success:before{background:var(--color-success)}.agent-import-result-stat--skipped:before{background:var(--color-warning)}.agent-import-result-stat--error:before{background:var(--color-error)}.agent-import-result-agents{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left}.agent-import-result-agent{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-success) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-errors{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left;margin-top:var(--space-sm)}.agent-import-result-error{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--color-error);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-divider{align-self:stretch;height:1px;background:var(--border);margin:var(--space-md) 0}.agent-import-result-section-title{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--space-sm) 0}.agent-import-browse{margin-bottom:var(--space-md)}.agent-import-browse-header{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-browse-search{position:relative;display:flex;align-items:center}.agent-import-browse-search-icon{position:absolute;left:var(--space-sm);color:var(--text-muted);pointer-events:none}.agent-import-browse-search-input{width:100%;padding:var(--space-sm) var(--space-sm) var(--space-sm) calc(var(--space-sm) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-browse-search-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-browse-selected{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent);border-radius:var(--radius-md)}.agent-import-browse-selected-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-browse-selected-name{flex:1;font-weight:500;color:var(--todo)}.agent-import-browse-loading{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl) 0;color:var(--text-muted)}.agent-import-browse-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.agent-import-browse-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-browse-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);padding:var(--space-sm);cursor:pointer;border-bottom:1px solid var(--border);transition:background-color var(--transition-fast)}.agent-import-browse-item:last-child{border-bottom:none}.agent-import-browse-item:hover{background:var(--surface-hover)}.agent-import-browse-item:focus-visible{outline:none;background:var(--surface-hover);box-shadow:var(--focus-ring)}.agent-import-browse-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border-color:var(--todo)}.agent-import-browse-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-import-browse-item-name{font-weight:500;color:var(--text)}.agent-import-browse-item-installs{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap}.agent-import-browse-item-tagline{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.agent-import-browse-item-repo{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono)}.agent-import-browse-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-controls-actions{display:flex;gap:var(--space-sm)}.agent-global-controls{display:flex;align-items:center;padding:var(--space-md) var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.heartbeat-multiplier-label{font-weight:500;color:var(--text);white-space:nowrap}.agent-import-dialog{max-width:calc(var(--space-xl) * 23 + var(--space-sm))}.agent-import-description{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin:0 0 var(--space-md) 0;line-height:1.5}.agent-import-description code{background:var(--surface-hover);padding:calc(var(--space-xs) * .25) var(--space-xs);border-radius:calc(var(--radius-sm) - var(--space-xs) * .25);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-file-upload{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-file-input{display:none}.agent-import-upload-btn{display:inline-flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-import-file-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider:before,.agent-import-divider:after{content:"";flex:1;height:1px;background:var(--border)}.agent-import-textarea{width:100%;min-height:calc(var(--space-xl) * 5);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5;resize:vertical}.agent-import-textarea:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-company{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-company-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:.04em}.agent-import-company-name{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-count{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin-bottom:var(--space-md)}.agent-import-selection-controls{display:flex;gap:var(--space-sm);flex-wrap:wrap;margin-bottom:var(--space-md)}.agent-import-agent-list{display:flex;flex-direction:column;gap:calc(var(--space-sm) - var(--space-xs) * .5);max-height:calc(var(--space-xl) * 11 + var(--space-lg));overflow-y:auto}.agent-import-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-agent-icon{font-size:calc(var(--space-md) + var(--space-xs) * 1.5);line-height:1;flex-shrink:0}.agent-import-agent-details{display:flex;flex-direction:column;min-width:0}.agent-import-agent-name{font-weight:500;font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-import-agent-meta{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-import-agent-title{color:var(--text-muted)}.agent-import-agent-role{text-transform:capitalize}.agent-import-agent-model{color:var(--text-muted)}
@@ -1 +1 @@
1
- import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{i as Le,ax as lt,g as ct,ay as rt,a as ot,az as dt,aA as ut,aB as ht,aC as mt,aD as gt,aE as ft,s as pt,aF as xt,aG as St,f as vt,w as Pe,S as bt,I as Be,aj as wt,aH as Nt,B as Ce,aI as kt,aJ as Ct,aK as Mt,aL as jt,aM as yt,aN as Tt,h as At,j as $t}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";const Re="kb-chat-active-session";function Dt(n){const i=n?.toolCalls;if(!Array.isArray(i))return;const r=i.map(l=>{if(!l||typeof l!="object")return null;const c=l,x=typeof c.toolName=="string"?c.toolName:"";if(!x)return null;const b=c.args;return{toolName:x,...b&&typeof b=="object"?{args:b}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function He(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Dt(n.metadata),createdAt:n.createdAt}}function Et(n){const[i,r]=s.useState([]),[l,c]=s.useState(null),[x,b]=s.useState(!0),[M,w]=s.useState([]),[X,z]=s.useState(!1),[O,L]=s.useState(!1),[re,D]=s.useState(""),[V,T]=s.useState(""),[pe,E]=s.useState([]),[S,P]=s.useState(""),[Z,U]=s.useState(""),[A,B]=s.useState(!0),[q,ne]=s.useState(new Map),k=s.useRef(null),J=s.useRef(!1),K=s.useRef(""),xe=s.useRef(i),H=s.useRef(l),we=s.useRef(O);xe.current=i,H.current=l,we.current=O,s.useEffect(()=>{K.current=S},[S]);const ae=s.useRef(new Set),ee=s.useRef(0),Ne=s.useRef(n);Ne.current!==n&&(Ne.current=n,ee.current++),s.useEffect(()=>{const o=ee.current;Le(void 0,n).then(h=>{if(ee.current!==o)return;const u=new Map;for(const N of h)u.set(N.id,N);ne(u)}).catch(()=>{})},[n]);const te=s.useCallback(async()=>{b(!0);try{const h=[...(await lt(n)).sessions].sort((u,N)=>new Date(N.updatedAt).getTime()-new Date(u.updatedAt).getTime());r(h)}catch{}finally{b(!1)}},[n]);s.useEffect(()=>{te()},[te]);const Q=s.useRef(()=>{});s.useEffect(()=>{if(x)return;const o=ct(Re,n);o&&i.find(u=>u.id===o)&&Q.current(o)},[x,i,n]);const I=s.useCallback(async(o,h)=>{z(!0);try{const u=await rt(o,{limit:50,...h},n),N=u.messages.map(He);h?.offset&&h.offset>0?w(W=>[...N,...W]):w(N),B(u.messages.length>=50)}catch{}finally{z(!1)}},[n]),oe=s.useCallback(o=>{k.current&&(k.current.close(),k.current=null);const h=i.find(u=>u.id===o);c(h||null),D(""),T(""),E([]),L(!1),B(!0),o?I(o):w([]),o?ot(Re,o,n):dt(Re,n)},[i,I,n]);Q.current=oe;const de=s.useCallback(async o=>{const h=await ut(o,n),u={id:h.session.id,title:h.session.title,agentId:h.session.agentId,status:h.session.status,modelProvider:h.session.modelProvider,modelId:h.session.modelId,createdAt:h.session.createdAt,updatedAt:h.session.updatedAt};return r(N=>[u,...N]),c(u),w([]),D(""),T(""),E([]),L(!1),B(!0),u},[n]),ue=s.useCallback(async o=>{await ht(o,{status:"archived"},n),r(h=>h.filter(u=>u.id!==o)),l?.id===o&&(c(null),w([]))},[l,n]),ie=s.useCallback(async o=>{l?.id===o&&k.current&&(k.current.close(),k.current=null),await mt(o,n),r(h=>h.filter(u=>u.id!==o)),l?.id===o&&(c(null),w([]))},[l,n]),he=s.useCallback(async()=>{!l||!A||await I(l.id,{offset:M.length})},[l,A,I,M.length]),se=s.useCallback(()=>{l&&(J.current=!0,k.current?.close(),k.current=null,gt(l.id,n).catch(()=>{}),L(!1),D(""),T(""),E([]))},[l,n]),_=s.useCallback(()=>{K.current="",P("")},[]),G=s.useCallback(o=>{if(!l)return;if(O){K.current=o,P(o);return}J.current=!1,k.current&&(k.current.close(),k.current=null);const h=`temp-${Date.now()}`,u={id:h,sessionId:l.id,role:"user",content:o,createdAt:new Date().toISOString()};w(p=>[...p,u]),D(""),T(""),E([]),L(!0);let N="",W="",R=[];const m={onThinking:p=>{W+=p,T(W)},onText:p=>{N+=p,D(N)},onToolStart:p=>{R=[...R,{toolName:p.toolName,args:p.args,isError:!1,status:"running"}],E(R)},onToolEnd:p=>{const C=[...R];for(let g=C.length-1;g>=0;g--){const v=C[g];if(v?.toolName===p.toolName&&v.status==="running"){C[g]={...v,status:"completed",isError:p.isError,result:p.result},R=C,E(C);return}}R=[...C,{toolName:p.toolName,isError:p.isError,result:p.result,status:"completed"}],E(R)},onDone:p=>{const C={id:p.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:N,thinkingOutput:W,toolCalls:R.length>0?R:void 0,createdAt:new Date().toISOString()};ae.current.add(C.id),w(v=>[...v,C]),D(""),T(""),E([]),L(!1),k.current=null,setTimeout(()=>{ae.current.delete(C.id)},1e3),te();const g=K.current.trim();g&&(K.current="",P(""),G(g))},onError:p=>{if(w(C=>C.filter(g=>g.id!==h)),D(""),T(""),E([]),L(!1),k.current=null,console.error("[useChat] Stream error:",p),!J.current){const C=K.current.trim();C&&(K.current="",P(""),G(C))}}};k.current=ft(l.id,o,m,n)},[l,O,n,te]),Se=Z?i.filter(o=>o.title?.toLowerCase().includes(Z.toLowerCase())||o.agentId.toLowerCase().includes(Z.toLowerCase())):i;return s.useEffect(()=>{const o=ee.current,h=n?`?projectId=${encodeURIComponent(n)}`:"",u=()=>ee.current!==o,N=g=>{if(u())return;const v=JSON.parse(g.data);r(f=>f.some(j=>j.id===v.id)?f:[v,...f])},W=g=>{if(u())return;const v=JSON.parse(g.data);r(f=>[...f.map(ve=>ve.id===v.id?v:ve)]),H.current?.id===v.id&&c(v)},R=g=>{if(u())return;const{id:v}=JSON.parse(g.data);r(f=>f.filter(j=>j.id!==v)),H.current?.id===v&&(c(null),w([]))},m=g=>{if(u())return;const v=JSON.parse(g.data),f=He(v);ae.current.has(f.id)||H.current?.id===f.sessionId&&!we.current&&w(j=>j.some(ve=>ve.id===f.id)?j:[...j,f])},p=g=>{if(u())return;const{id:v}=JSON.parse(g.data);w(f=>f.filter(j=>j.id!==v))};return pt(`/api/events${h}`,{events:{"chat:session:created":N,"chat:session:updated":W,"chat:session:deleted":R,"chat:message:added":m,"chat:message:deleted":p}})},[n]),s.useEffect(()=>()=>{k.current&&(k.current.close(),k.current=null)},[]),{sessions:i,activeSession:l,sessionsLoading:x,messages:M,messagesLoading:X,isStreaming:O,streamingText:re,streamingThinking:V,streamingToolCalls:pe,pendingMessage:S,selectSession:oe,createSession:de,archiveSession:ue,deleteSession:ie,sendMessage:G,stopStreaming:se,clearPendingMessage:_,loadMoreMessages:he,hasMoreMessages:A,searchQuery:Z,setSearchQuery:U,filteredSessions:Se,refreshSessions:te,agentsMap:q}}function _e(n){const i=new Date(n),l=new Date().getTime()-i.getTime(),c=Math.floor(l/1e3),x=Math.floor(c/60),b=Math.floor(x/60),M=Math.floor(b/24);return c<60?"just now":x<60?`${x}m ago`:b<24?`${b}h ago`:M<7?`${M}d ago`:i.toLocaleDateString()}function Ge(n,i){if(!n||!i)return null;const r=i.toLowerCase();if(r.includes("claude")){let c=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(r.includes("gpt")||r.includes("openai")){const c=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(r.includes("gemini")){const c=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=i.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function Me(n,i){return n.length>i?`${n.slice(0,i)}…`:n}function Pt(n){if(!n)return null;const i=Object.entries(n);return i.length===0?null:i.map(([r,l])=>{let c="";if(typeof l=="string")c=l;else try{c=JSON.stringify(l)}catch{c=String(l)}return`${r}=${Me(c,50)}`}).join(", ")}function Rt(n){if(n===void 0)return null;if(typeof n=="string")return Me(n,200);try{return Me(JSON.stringify(n),200)}catch{return Me(String(n),200)}}function Ue(n){return!n||n.length===0?null:e.jsxs("div",{className:"chat-tool-calls","data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(Tt,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:"Tool calls"})]}),n.map((i,r)=>{const l=i.status==="running",c=i.status==="completed"&&i.isError,x=Pt(i.args),b=Rt(i.result),M=l?x:b?`result: ${b}`:x?`args: ${x}`:null,w=l?"running":c?"error":"completed";return e.jsxs("details",{className:`chat-tool-call${l?" chat-tool-call--running":""}${c?" chat-tool-call--error":""}`,open:l,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",children:i.toolName}),M&&e.jsx("span",{className:"chat-tool-call-preview",title:M,children:M}),e.jsx("span",{className:"chat-tool-call-status-text",children:w})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[x&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:"args"}),e.jsx("span",{className:"chat-tool-call-value",children:x})]}),b&&e.jsxs("div",{className:`chat-tool-call-row${c?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:"result"}),e.jsx("span",{className:"chat-tool-call-value",children:b})]})]})]},`${i.toolName}-${r}`)})]})}const je="__fn_agent__";function qe(n){const i=/(^|[\s])\/([^\s]*)$/.exec(n);if(!i)return null;const r=i[1]??"",l=i[2]??"",c=i.index+r.length;return{filter:l,start:c,end:n.length}}function Lt(n,i){const r=n.slice(0,i),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",x=r.length-c.length-1;return{filter:c,start:x,end:i}}function It({projectId:n,onClose:i,onCreate:r}){const[l,c]=s.useState("agent"),[x,b]=s.useState([]),[M,w]=s.useState(!0),[X,z]=s.useState(""),[O,L]=s.useState([]),[re,D]=s.useState(!0),[V,T]=s.useState("");s.useEffect(()=>{let S=!1;return w(!0),Le(void 0,n).then(P=>{S||b(P)}).catch(()=>{S||b([])}).finally(()=>{S||w(!1)}),()=>{S=!0}},[n]),s.useEffect(()=>{D(!0),At().then(S=>{L(S.models)}).catch(()=>{L([])}).finally(()=>{D(!1)})},[]);const pe=S=>{if(S.preventDefault(),l==="agent"){if(!X)return;r({agentId:X});return}if(!V)return;const P=V.indexOf("/");if(P<=0)return;const Z=V.slice(0,P),U=V.slice(P+1);r({agentId:je,modelProvider:Z,modelId:U})},E=l==="agent"?!X:!V;return e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog",onClick:S=>S.stopPropagation(),children:[e.jsx("h3",{children:"New Chat"}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),T("")},children:"Agent"}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{c("model"),z("")},children:"Model"})]}),e.jsxs("form",{onSubmit:pe,children:[l==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",M?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):x.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:x.map(S=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${X===S.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>z(S.id),"data-testid":`agent-option-${S.id}`,children:[e.jsx(Ce,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:S.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:S.role})]},S.id))})]}),l==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:re?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):e.jsx($t,{models:O,value:V,onChange:T,label:"Model",placeholder:"Select a model"})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:E,children:"Create"})]})]})]})})}function Vt({projectId:n,addToast:i}){const{activeSession:r,sessionsLoading:l,messages:c,messagesLoading:x,isStreaming:b,streamingText:M,streamingThinking:w,streamingToolCalls:X,selectSession:z,createSession:O,archiveSession:L,deleteSession:re,sendMessage:D,stopStreaming:V,pendingMessage:T,clearPendingMessage:pe,searchQuery:E,setSearchQuery:S,filteredSessions:P}=Et(n),[Z,U]=s.useState(!1),[A,B]=s.useState(""),[q,ne]=s.useState(null),[k,J]=s.useState(null),[K,xe]=s.useState(!0),[H,we]=s.useState(new Map),[ae,ee]=s.useState([]),[Ne,te]=s.useState(!0),[Q,I]=s.useState(!1),[oe,de]=s.useState(""),[ue,ie]=s.useState(0),[he,se]=s.useState(""),[_,G]=s.useState(!1),[Se,o]=s.useState(0),[h,u]=s.useState(-1),[,N]=s.useState(!1),[W,R]=s.useState({top:0,left:0}),m=xt({projectId:n}),p=s.useCallback(t=>{if(!t||!m.mentionActive)return;const a=t.getBoundingClientRect();R({top:a.top-260,left:a.left+8})},[m.mentionActive]),C=s.useRef(null),g=s.useRef(null),v=s.useRef(null),f=s.useRef(null),j=s.useRef(0),me=St()==="mobile",F=s.useMemo(()=>{const t=oe.trim().toLowerCase();return(t?ae.filter(d=>d.name.toLowerCase().includes(t)):ae).slice(0,10)},[ae,oe]),ge=s.useMemo(()=>Array.from(H.values()),[H]),le=s.useMemo(()=>{const t=he.trim().toLowerCase();return t?ge.filter(a=>a.name.toLowerCase().includes(t)):ge},[ge,he]),Ie=s.useMemo(()=>{const t=new Map;for(const a of ge)t.set(a.name.toLowerCase(),a);return t},[ge]);s.useEffect(()=>{ie(0)},[F]),s.useEffect(()=>{o(0)},[he,_]),s.useEffect(()=>()=>{g.current!==null&&window.clearTimeout(g.current)},[]),s.useEffect(()=>{C.current?.scrollIntoView({behavior:"smooth"})},[c,M]),s.useEffect(()=>{const t=()=>ne(null);if(q)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[q]),s.useEffect(()=>{let t=!1;const a=n;return Le(void 0,n).then(d=>{if(t||a!==n)return;const y=new Map;for(const $ of d)y.set($.id,$);we(y)}).catch(()=>{}),()=>{t=!0}},[n]),s.useEffect(()=>{let t=!1;return te(!0),vt(n).then(a=>{t||ee(a)}).catch(()=>{t||ee([])}).finally(()=>{t||te(!1)}),()=>{t=!0}},[n]);const Je=s.useCallback(async t=>{try{await O(t),U(!1),me&&xe(!1)}catch{i("Failed to create chat session","error")}},[O,i,me]),ye=s.useCallback(()=>{const t=A.trim();!t||!r||(B(""),I(!1),de(""),G(!1),se(""),u(-1),D(t))},[A,r,D]),Te=s.useCallback(t=>{B(a=>{const d=qe(a);if(!d)return a;const y=`/skill:${t.name} `,$=a.slice(0,d.start)+y+a.slice(d.end);return window.requestAnimationFrame(()=>{f.current&&(f.current.style.height="auto",f.current.style.height=`${Math.min(f.current.scrollHeight,120)}px`,f.current.focus())}),$}),I(!1),de(""),ie(0)},[]),Ae=s.useCallback(t=>{const a=f.current;if(!a||h<0)return;const d=a.selectionStart??j.current,y=a.selectionEnd??d,$=Math.max(d,y),be=Math.min(h,$),ce=`${`@${t.name.replace(/\s+/g,"_")}`} `,Ee=A.slice(0,be)+ce+A.slice($),fe=be+ce.length;B(Ee),G(!1),se(""),o(0),u(-1),window.requestAnimationFrame(()=>{f.current&&(f.current.style.height="auto",f.current.style.height=`${Math.min(f.current.scrollHeight,120)}px`,f.current.focus(),f.current.setSelectionRange(fe,fe))})},[h,A]),Fe=s.useCallback(t=>{const a=/@([\w-]+)/g,d=[];let y=0,$=a.exec(t);for(;$;){const[be,Ve=""]=$,ce=$.index;ce>y&&d.push(t.slice(y,ce));const Ee=Ve.replace(/_/g," ").toLowerCase(),fe=Ie.get(Ee);fe?d.push(e.jsxs("span",{className:"chat-mention-chip",children:["@",fe.name.replace(/\s+/g,"_")]},`${fe.id}-${ce}`)):d.push(be),y=ce+be.length,$=a.exec(t)}return y<t.length&&d.push(t.slice(y)),d.length===0?t:d},[Ie]),Ke=s.useCallback(t=>{if(j.current=t.currentTarget.selectionStart??j.current,m.mentionActive&&m.files.length>0){if(m.handleKeyDown(t,A),t.key==="Enter"||t.key==="Tab"){const a=m.files[m.selectedIndex];if(a){const d=m.selectFile(a,A);B(d),m.dismissMention(),N(!1)}}return}if(_&&t.key==="ArrowDown"){t.preventDefault(),le.length>0&&o(a=>(a+1)%le.length);return}if(_&&t.key==="ArrowUp"){t.preventDefault(),le.length>0&&o(a=>a===0?le.length-1:a-1);return}if(_&&t.key==="Enter"){t.preventDefault();const a=le[Se]??le[0];a&&Ae(a);return}if(_&&t.key==="Escape"){t.preventDefault(),G(!1),se(""),u(-1);return}if(Q&&t.key==="ArrowDown"){t.preventDefault(),F.length>0&&ie(a=>(a+1)%F.length);return}if(Q&&t.key==="ArrowUp"){t.preventDefault(),F.length>0&&ie(a=>a===0?F.length-1:a-1);return}if(Q&&(t.key==="Enter"||t.key==="Tab")&&F.length>0){t.preventDefault();const a=F[ue]??F[0];a&&Te(a);return}if(Q&&t.key==="Escape"){t.preventDefault(),I(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),ye())},[_,le,Se,Ae,Q,F,ue,Te,ye,m,A]),ke=s.useCallback((t,a)=>{const d=Lt(t,a);if(d){G(!0),se(d.filter),u(d.start);return}G(!1),se(""),u(-1)},[]),Qe=s.useCallback(t=>{const a=t.target,d=a.value,y=a.selectionStart??d.length;j.current=y,B(d);const $=qe(d);$?(I(!0),de($.filter)):(I(!1),de("")),ke(d,y),m.detectMention(d,y),N(m.mentionActive),m.mentionActive&&p(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[ke]),$e=s.useCallback(t=>{const a=t.currentTarget,d=a.selectionStart??a.value.length;j.current=d,ke(a.value,d),m.detectMention(a.value,d),N(m.mentionActive),m.mentionActive&&p(a)},[ke,m,p]),We=s.useCallback(t=>{t.key!=="Escape"&&$e(t)},[$e]),Ye=s.useCallback(()=>{g.current!==null&&window.clearTimeout(g.current),g.current=window.setTimeout(()=>{I(!1),G(!1),se(""),u(-1),N(!1),m.dismissMention(),g.current=null},120)},[m]),Xe=s.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),Ze=s.useCallback(async t=>{ne(null);try{await L(t),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[L,i]),et=s.useCallback(async t=>{J(null),ne(null);try{await re(t),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[re,i]),tt=s.useCallback(t=>{z(t),me&&xe(!1)},[z,me]),st=s.useCallback(()=>{z(""),xe(!0)},[z]),nt=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(yt,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:"Start a new conversation"}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>U(!0),children:[e.jsx(Pe,{size:16}),"New Chat"]})]}),Y=Ge(r?.modelProvider,r?.modelId),ze=r?.agentId===je?Y??"Fusion":r?.title||H.get(r?.agentId??"")?.name||r?.agentId||"Chat",at=!!(Y&&Y!==ze),De=H.get(r?.agentId??"")?.name||(r?.agentId===je?Y??"Fusion":r?.agentId?.slice(0,30)??"Fusion"),Oe=!!(Y&&Y!==De),it=T.length>50?`${T.slice(0,50)}…`:T;return e.jsxs("div",{className:"chat-view",children:[e.jsxs("div",{className:`chat-sidebar${K?"":" chat-sidebar--hidden"}`,children:[e.jsx("div",{className:"chat-sidebar-header",children:e.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>U(!0),"data-testid":"chat-new-btn",children:[e.jsx(Pe,{size:14}),"New Chat"]})}),e.jsx("div",{className:"chat-sidebar-search",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx(bt,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:E,onChange:t=>S(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):P.length===0?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):P.map(t=>e.jsxs("div",{className:`chat-session-item${r?.id===t.id?" chat-session-item--active":""}`,onClick:()=>tt(t.id),onContextMenu:a=>{a.preventDefault(),ne({sessionId:t.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),J(t.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:e.jsx(Be,{size:14})}),e.jsx("div",{className:"chat-session-title",children:t.title||"Untitled"}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||"No messages"}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsx("span",{children:H.get(t.agentId)?.name||(t.agentId===je?Ge(t.modelProvider,t.modelId)??"Fusion":t.agentId.slice(0,30))}),e.jsx("span",{children:t.updatedAt?_e(t.updatedAt):""})]})]},t.id))}),e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>U(!0),"data-testid":"chat-new-btn-mobile",children:[e.jsx(Pe,{size:14}),"New Chat"]})})]}),q&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:q.y,left:q.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>Ze(q.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(wt,{size:14}),"Archive"]}),e.jsxs("button",{onClick:()=>{ne(null),J(q.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(Be,{size:14}),"Delete"]})]}),k&&e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>J(null),children:e.jsxs("div",{className:"chat-new-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:"Delete Conversation?"}),e.jsx("p",{style:{fontSize:"14px",color:"var(--text-secondary)",marginBottom:"16px"},children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>J(null),children:"Cancel"}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void et(k),children:"Delete"})]})]})}),e.jsxs("div",{className:"chat-thread",children:[(r||!me)&&e.jsxs("div",{className:"chat-thread-header",children:[me&&r&&e.jsx("button",{className:"btn-icon",onClick:st,"data-testid":"chat-back-btn",children:e.jsx(Nt,{size:16})}),e.jsx(Ce,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:ze}),at&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),e.jsxs("div",{className:"chat-messages",ref:v,children:[x?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!r?nt():c.length===0&&r?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):e.jsxs(e.Fragment,{children:[c.map(t=>e.jsxs("div",{className:`chat-message chat-message--${t.role}`,"data-testid":`chat-message-${t.id}`,children:[t.role==="assistant"&&e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(Ce,{size:14}),e.jsx("span",{children:De}),Oe&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),e.jsx("div",{className:"chat-message-content",children:Fe(t.content)}),Ue(t.toolCalls),t.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:t.thinkingOutput})]}),e.jsx("div",{className:"chat-message-time",children:_e(t.createdAt)})]},t.id)),b&&e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(Ce,{size:14}),e.jsx("span",{children:De}),Oe&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),M?e.jsx("div",{className:"chat-message-content",children:Fe(M)}):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:w?"Thinking…":"Connecting…"}),Ue(X),w&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:w})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}),e.jsx("div",{ref:C})]}),r&&e.jsxs("div",{className:"chat-input-area",children:[Q&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:Ne?e.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):F.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:oe?"No skills found":"No skills available"}):F.map((t,a)=>e.jsxs("button",{type:"button",role:"option","aria-selected":a===ue,className:`chat-skill-menu-item${a===ue?" chat-skill-menu-item--highlighted":""}`,onMouseDown:d=>d.preventDefault(),onMouseEnter:()=>ie(a),onClick:()=>Te(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),e.jsxs("div",{className:"chat-input-wrapper",children:[e.jsx("textarea",{ref:f,className:"chat-input-textarea",placeholder:"Type a message...",value:A,onChange:Qe,onKeyDown:Ke,onKeyUp:We,onClick:$e,onBlur:Ye,onFocus:Xe,rows:1,"data-testid":"chat-input"}),e.jsx(kt,{agents:ge,filter:he,highlightedIndex:Se,visible:_,onSelect:Ae,position:"below"}),e.jsx(Ct,{visible:m.mentionActive&&!_,position:W,files:m.files,selectedIndex:m.selectedIndex,onSelect:t=>{const a=m.selectFile(t,A);B(a),m.dismissMention(),N(!1),f.current?.focus()},loading:m.loading}),T&&e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:`Queued: ${it}`}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:pe,children:"×"})]})]}),b?e.jsx("button",{className:"chat-input-stop",onClick:V,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:e.jsx(Mt,{size:14})}):e.jsx("button",{className:"chat-input-send",onClick:()=>void ye(),disabled:!A.trim(),"data-testid":"chat-send-btn",children:e.jsx(jt,{size:16})})]})]}),Z&&e.jsx(It,{projectId:n,onClose:()=>U(!1),onCreate:Je})]})}export{Vt as ChatView};
1
+ import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{i as Le,ax as lt,g as ct,ay as rt,a as ot,az as dt,aA as ut,aB as ht,aC as mt,aD as gt,aE as ft,s as pt,aF as xt,aG as St,f as vt,w as Pe,S as bt,I as Be,aj as wt,aH as Nt,B as Ce,aI as kt,aJ as Ct,aK as Mt,aL as jt,aM as yt,aN as Tt,h as At,j as $t}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";const Re="kb-chat-active-session";function Dt(n){const i=n?.toolCalls;if(!Array.isArray(i))return;const r=i.map(l=>{if(!l||typeof l!="object")return null;const c=l,x=typeof c.toolName=="string"?c.toolName:"";if(!x)return null;const b=c.args;return{toolName:x,...b&&typeof b=="object"?{args:b}:{},isError:!!c.isError,result:c.result,status:"completed"}}).filter(l=>l!==null);return r.length>0?r:void 0}function He(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Dt(n.metadata),createdAt:n.createdAt}}function Et(n){const[i,r]=s.useState([]),[l,c]=s.useState(null),[x,b]=s.useState(!0),[M,w]=s.useState([]),[X,z]=s.useState(!1),[O,L]=s.useState(!1),[re,D]=s.useState(""),[V,T]=s.useState(""),[pe,E]=s.useState([]),[S,P]=s.useState(""),[Z,U]=s.useState(""),[A,B]=s.useState(!0),[q,ne]=s.useState(new Map),k=s.useRef(null),J=s.useRef(!1),K=s.useRef(""),xe=s.useRef(i),H=s.useRef(l),we=s.useRef(O);xe.current=i,H.current=l,we.current=O,s.useEffect(()=>{K.current=S},[S]);const ae=s.useRef(new Set),ee=s.useRef(0),Ne=s.useRef(n);Ne.current!==n&&(Ne.current=n,ee.current++),s.useEffect(()=>{const o=ee.current;Le(void 0,n).then(h=>{if(ee.current!==o)return;const u=new Map;for(const N of h)u.set(N.id,N);ne(u)}).catch(()=>{})},[n]);const te=s.useCallback(async()=>{b(!0);try{const h=[...(await lt(n)).sessions].sort((u,N)=>new Date(N.updatedAt).getTime()-new Date(u.updatedAt).getTime());r(h)}catch{}finally{b(!1)}},[n]);s.useEffect(()=>{te()},[te]);const Q=s.useRef(()=>{});s.useEffect(()=>{if(x)return;const o=ct(Re,n);o&&i.find(u=>u.id===o)&&Q.current(o)},[x,i,n]);const I=s.useCallback(async(o,h)=>{z(!0);try{const u=await rt(o,{limit:50,...h},n),N=u.messages.map(He);h?.offset&&h.offset>0?w(W=>[...N,...W]):w(N),B(u.messages.length>=50)}catch{}finally{z(!1)}},[n]),oe=s.useCallback(o=>{k.current&&(k.current.close(),k.current=null);const h=i.find(u=>u.id===o);c(h||null),D(""),T(""),E([]),L(!1),B(!0),o?I(o):w([]),o?ot(Re,o,n):dt(Re,n)},[i,I,n]);Q.current=oe;const de=s.useCallback(async o=>{const h=await ut(o,n),u={id:h.session.id,title:h.session.title,agentId:h.session.agentId,status:h.session.status,modelProvider:h.session.modelProvider,modelId:h.session.modelId,createdAt:h.session.createdAt,updatedAt:h.session.updatedAt};return r(N=>[u,...N]),c(u),w([]),D(""),T(""),E([]),L(!1),B(!0),u},[n]),ue=s.useCallback(async o=>{await ht(o,{status:"archived"},n),r(h=>h.filter(u=>u.id!==o)),l?.id===o&&(c(null),w([]))},[l,n]),ie=s.useCallback(async o=>{l?.id===o&&k.current&&(k.current.close(),k.current=null),await mt(o,n),r(h=>h.filter(u=>u.id!==o)),l?.id===o&&(c(null),w([]))},[l,n]),he=s.useCallback(async()=>{!l||!A||await I(l.id,{offset:M.length})},[l,A,I,M.length]),se=s.useCallback(()=>{l&&(J.current=!0,k.current?.close(),k.current=null,gt(l.id,n).catch(()=>{}),L(!1),D(""),T(""),E([]))},[l,n]),_=s.useCallback(()=>{K.current="",P("")},[]),G=s.useCallback(o=>{if(!l)return;if(O){K.current=o,P(o);return}J.current=!1,k.current&&(k.current.close(),k.current=null);const h=`temp-${Date.now()}`,u={id:h,sessionId:l.id,role:"user",content:o,createdAt:new Date().toISOString()};w(p=>[...p,u]),D(""),T(""),E([]),L(!0);let N="",W="",R=[];const m={onThinking:p=>{W+=p,T(W)},onText:p=>{N+=p,D(N)},onToolStart:p=>{R=[...R,{toolName:p.toolName,args:p.args,isError:!1,status:"running"}],E(R)},onToolEnd:p=>{const C=[...R];for(let g=C.length-1;g>=0;g--){const v=C[g];if(v?.toolName===p.toolName&&v.status==="running"){C[g]={...v,status:"completed",isError:p.isError,result:p.result},R=C,E(C);return}}R=[...C,{toolName:p.toolName,isError:p.isError,result:p.result,status:"completed"}],E(R)},onDone:p=>{const C={id:p.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:N,thinkingOutput:W,toolCalls:R.length>0?R:void 0,createdAt:new Date().toISOString()};ae.current.add(C.id),w(v=>[...v,C]),D(""),T(""),E([]),L(!1),k.current=null,setTimeout(()=>{ae.current.delete(C.id)},1e3),te();const g=K.current.trim();g&&(K.current="",P(""),G(g))},onError:p=>{if(w(C=>C.filter(g=>g.id!==h)),D(""),T(""),E([]),L(!1),k.current=null,console.error("[useChat] Stream error:",p),!J.current){const C=K.current.trim();C&&(K.current="",P(""),G(C))}}};k.current=ft(l.id,o,m,n)},[l,O,n,te]),Se=Z?i.filter(o=>o.title?.toLowerCase().includes(Z.toLowerCase())||o.agentId.toLowerCase().includes(Z.toLowerCase())):i;return s.useEffect(()=>{const o=ee.current,h=n?`?projectId=${encodeURIComponent(n)}`:"",u=()=>ee.current!==o,N=g=>{if(u())return;const v=JSON.parse(g.data);r(f=>f.some(j=>j.id===v.id)?f:[v,...f])},W=g=>{if(u())return;const v=JSON.parse(g.data);r(f=>[...f.map(ve=>ve.id===v.id?v:ve)]),H.current?.id===v.id&&c(v)},R=g=>{if(u())return;const{id:v}=JSON.parse(g.data);r(f=>f.filter(j=>j.id!==v)),H.current?.id===v&&(c(null),w([]))},m=g=>{if(u())return;const v=JSON.parse(g.data),f=He(v);ae.current.has(f.id)||H.current?.id===f.sessionId&&!we.current&&w(j=>j.some(ve=>ve.id===f.id)?j:[...j,f])},p=g=>{if(u())return;const{id:v}=JSON.parse(g.data);w(f=>f.filter(j=>j.id!==v))};return pt(`/api/events${h}`,{events:{"chat:session:created":N,"chat:session:updated":W,"chat:session:deleted":R,"chat:message:added":m,"chat:message:deleted":p}})},[n]),s.useEffect(()=>()=>{k.current&&(k.current.close(),k.current=null)},[]),{sessions:i,activeSession:l,sessionsLoading:x,messages:M,messagesLoading:X,isStreaming:O,streamingText:re,streamingThinking:V,streamingToolCalls:pe,pendingMessage:S,selectSession:oe,createSession:de,archiveSession:ue,deleteSession:ie,sendMessage:G,stopStreaming:se,clearPendingMessage:_,loadMoreMessages:he,hasMoreMessages:A,searchQuery:Z,setSearchQuery:U,filteredSessions:Se,refreshSessions:te,agentsMap:q}}function _e(n){const i=new Date(n),l=new Date().getTime()-i.getTime(),c=Math.floor(l/1e3),x=Math.floor(c/60),b=Math.floor(x/60),M=Math.floor(b/24);return c<60?"just now":x<60?`${x}m ago`:b<24?`${b}h ago`:M<7?`${M}d ago`:i.toLocaleDateString()}function Ge(n,i){if(!n||!i)return null;const r=i.toLowerCase();if(r.includes("claude")){let c=i.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return c=c.replace(/\s+/g," "),c.length>30?c.slice(0,30)+"…":c}if(r.includes("gpt")||r.includes("openai")){const c=i.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return c.length>30?c.slice(0,30)+"…":c}if(r.includes("gemini")){const c=i.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return c.length>30?c.slice(0,30)+"…":c}const l=i.replace(/-/g," ").replace(/^\w/,c=>c.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function Me(n,i){return n.length>i?`${n.slice(0,i)}…`:n}function Pt(n){if(!n)return null;const i=Object.entries(n);return i.length===0?null:i.map(([r,l])=>{let c="";if(typeof l=="string")c=l;else try{c=JSON.stringify(l)}catch{c=String(l)}return`${r}=${Me(c,50)}`}).join(", ")}function Rt(n){if(n===void 0)return null;if(typeof n=="string")return Me(n,200);try{return Me(JSON.stringify(n),200)}catch{return Me(String(n),200)}}function Ue(n){return!n||n.length===0?null:e.jsxs("div",{className:"chat-tool-calls","data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(Tt,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:"Tool calls"})]}),n.map((i,r)=>{const l=i.status==="running",c=i.status==="completed"&&i.isError,x=Pt(i.args),b=Rt(i.result),M=l?x:b?`result: ${b}`:x?`args: ${x}`:null,w=l?"running":c?"error":"completed";return e.jsxs("details",{className:`chat-tool-call${l?" chat-tool-call--running":""}${c?" chat-tool-call--error":""}`,open:l,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",children:i.toolName}),M&&e.jsx("span",{className:"chat-tool-call-preview",title:M,children:M}),e.jsx("span",{className:"chat-tool-call-status-text",children:w})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[x&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:"args"}),e.jsx("span",{className:"chat-tool-call-value",children:x})]}),b&&e.jsxs("div",{className:`chat-tool-call-row${c?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:"result"}),e.jsx("span",{className:"chat-tool-call-value",children:b})]})]})]},`${i.toolName}-${r}`)})]})}const je="__fn_agent__";function qe(n){const i=/(^|[\s])\/([^\s]*)$/.exec(n);if(!i)return null;const r=i[1]??"",l=i[2]??"",c=i.index+r.length;return{filter:l,start:c,end:n.length}}function Lt(n,i){const r=n.slice(0,i),l=/(^|[\s\n])@([\w-]*)$/.exec(r);if(!l)return null;const c=l[2]??"",x=r.length-c.length-1;return{filter:c,start:x,end:i}}function It({projectId:n,onClose:i,onCreate:r}){const[l,c]=s.useState("agent"),[x,b]=s.useState([]),[M,w]=s.useState(!0),[X,z]=s.useState(""),[O,L]=s.useState([]),[re,D]=s.useState(!0),[V,T]=s.useState("");s.useEffect(()=>{let S=!1;return w(!0),Le(void 0,n).then(P=>{S||b(P)}).catch(()=>{S||b([])}).finally(()=>{S||w(!1)}),()=>{S=!0}},[n]),s.useEffect(()=>{D(!0),At().then(S=>{L(S.models)}).catch(()=>{L([])}).finally(()=>{D(!1)})},[]);const pe=S=>{if(S.preventDefault(),l==="agent"){if(!X)return;r({agentId:X});return}if(!V)return;const P=V.indexOf("/");if(P<=0)return;const Z=V.slice(0,P),U=V.slice(P+1);r({agentId:je,modelProvider:Z,modelId:U})},E=l==="agent"?!X:!V;return e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:i,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog",onClick:S=>S.stopPropagation(),children:[e.jsx("h3",{children:"New Chat"}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{c("agent"),T("")},children:"Agent"}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${l==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{c("model"),z("")},children:"Model"})]}),e.jsxs("form",{onSubmit:pe,children:[l==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",M?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):x.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:x.map(S=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${X===S.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>z(S.id),"data-testid":`agent-option-${S.id}`,children:[e.jsx(Ce,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:S.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:S.role})]},S.id))})]}),l==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:re?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):e.jsx($t,{models:O,value:V,onChange:T,label:"Model",placeholder:"Select a model"})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:i,children:"Cancel"}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:E,children:"Create"})]})]})]})})}function Vt({projectId:n,addToast:i}){const{activeSession:r,sessionsLoading:l,messages:c,messagesLoading:x,isStreaming:b,streamingText:M,streamingThinking:w,streamingToolCalls:X,selectSession:z,createSession:O,archiveSession:L,deleteSession:re,sendMessage:D,stopStreaming:V,pendingMessage:T,clearPendingMessage:pe,searchQuery:E,setSearchQuery:S,filteredSessions:P}=Et(n),[Z,U]=s.useState(!1),[A,B]=s.useState(""),[q,ne]=s.useState(null),[k,J]=s.useState(null),[K,xe]=s.useState(!0),[H,we]=s.useState(new Map),[ae,ee]=s.useState([]),[Ne,te]=s.useState(!0),[Q,I]=s.useState(!1),[oe,de]=s.useState(""),[ue,ie]=s.useState(0),[he,se]=s.useState(""),[_,G]=s.useState(!1),[Se,o]=s.useState(0),[h,u]=s.useState(-1),[,N]=s.useState(!1),[W,R]=s.useState({top:0,left:0}),m=xt({projectId:n}),p=s.useCallback(t=>{if(!t||!m.mentionActive)return;const a=t.getBoundingClientRect();R({top:a.top-260,left:a.left+8})},[m.mentionActive]),C=s.useRef(null),g=s.useRef(null),v=s.useRef(null),f=s.useRef(null),j=s.useRef(0),me=St()==="mobile",F=s.useMemo(()=>{const t=oe.trim().toLowerCase();return(t?ae.filter(d=>d.name.toLowerCase().includes(t)):ae).slice(0,10)},[ae,oe]),ge=s.useMemo(()=>Array.from(H.values()),[H]),le=s.useMemo(()=>{const t=he.trim().toLowerCase();return t?ge.filter(a=>a.name.toLowerCase().includes(t)):ge},[ge,he]),Ie=s.useMemo(()=>{const t=new Map;for(const a of ge)t.set(a.name.toLowerCase(),a);return t},[ge]);s.useEffect(()=>{ie(0)},[F]),s.useEffect(()=>{o(0)},[he,_]),s.useEffect(()=>()=>{g.current!==null&&window.clearTimeout(g.current)},[]),s.useEffect(()=>{C.current?.scrollIntoView({behavior:"smooth"})},[c,M]),s.useEffect(()=>{const t=()=>ne(null);if(q)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[q]),s.useEffect(()=>{let t=!1;const a=n;return Le(void 0,n).then(d=>{if(t||a!==n)return;const y=new Map;for(const $ of d)y.set($.id,$);we(y)}).catch(()=>{}),()=>{t=!0}},[n]),s.useEffect(()=>{let t=!1;return te(!0),vt(n).then(a=>{t||ee(a)}).catch(()=>{t||ee([])}).finally(()=>{t||te(!1)}),()=>{t=!0}},[n]);const Je=s.useCallback(async t=>{try{await O(t),U(!1),me&&xe(!1)}catch{i("Failed to create chat session","error")}},[O,i,me]),ye=s.useCallback(()=>{const t=A.trim();!t||!r||(B(""),I(!1),de(""),G(!1),se(""),u(-1),D(t))},[A,r,D]),Te=s.useCallback(t=>{B(a=>{const d=qe(a);if(!d)return a;const y=`/skill:${t.name} `,$=a.slice(0,d.start)+y+a.slice(d.end);return window.requestAnimationFrame(()=>{f.current&&(f.current.style.height="auto",f.current.style.height=`${Math.min(f.current.scrollHeight,120)}px`,f.current.focus())}),$}),I(!1),de(""),ie(0)},[]),Ae=s.useCallback(t=>{const a=f.current;if(!a||h<0)return;const d=a.selectionStart??j.current,y=a.selectionEnd??d,$=Math.max(d,y),be=Math.min(h,$),ce=`${`@${t.name.replace(/\s+/g,"_")}`} `,Ee=A.slice(0,be)+ce+A.slice($),fe=be+ce.length;B(Ee),G(!1),se(""),o(0),u(-1),window.requestAnimationFrame(()=>{f.current&&(f.current.style.height="auto",f.current.style.height=`${Math.min(f.current.scrollHeight,120)}px`,f.current.focus(),f.current.setSelectionRange(fe,fe))})},[h,A]),Fe=s.useCallback(t=>{const a=/@([\w-]+)/g,d=[];let y=0,$=a.exec(t);for(;$;){const[be,Ve=""]=$,ce=$.index;ce>y&&d.push(t.slice(y,ce));const Ee=Ve.replace(/_/g," ").toLowerCase(),fe=Ie.get(Ee);fe?d.push(e.jsxs("span",{className:"chat-mention-chip",children:["@",fe.name.replace(/\s+/g,"_")]},`${fe.id}-${ce}`)):d.push(be),y=ce+be.length,$=a.exec(t)}return y<t.length&&d.push(t.slice(y)),d.length===0?t:d},[Ie]),Ke=s.useCallback(t=>{if(j.current=t.currentTarget.selectionStart??j.current,m.mentionActive&&m.files.length>0){if(m.handleKeyDown(t,A),t.key==="Enter"||t.key==="Tab"){const a=m.files[m.selectedIndex];if(a){const d=m.selectFile(a,A);B(d),m.dismissMention(),N(!1)}}return}if(_&&t.key==="ArrowDown"){t.preventDefault(),le.length>0&&o(a=>(a+1)%le.length);return}if(_&&t.key==="ArrowUp"){t.preventDefault(),le.length>0&&o(a=>a===0?le.length-1:a-1);return}if(_&&t.key==="Enter"){t.preventDefault();const a=le[Se]??le[0];a&&Ae(a);return}if(_&&t.key==="Escape"){t.preventDefault(),G(!1),se(""),u(-1);return}if(Q&&t.key==="ArrowDown"){t.preventDefault(),F.length>0&&ie(a=>(a+1)%F.length);return}if(Q&&t.key==="ArrowUp"){t.preventDefault(),F.length>0&&ie(a=>a===0?F.length-1:a-1);return}if(Q&&(t.key==="Enter"||t.key==="Tab")&&F.length>0){t.preventDefault();const a=F[ue]??F[0];a&&Te(a);return}if(Q&&t.key==="Escape"){t.preventDefault(),I(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),ye())},[_,le,Se,Ae,Q,F,ue,Te,ye,m,A]),ke=s.useCallback((t,a)=>{const d=Lt(t,a);if(d){G(!0),se(d.filter),u(d.start);return}G(!1),se(""),u(-1)},[]),Qe=s.useCallback(t=>{const a=t.target,d=a.value,y=a.selectionStart??d.length;j.current=y,B(d);const $=qe(d);$?(I(!0),de($.filter)):(I(!1),de("")),ke(d,y),m.detectMention(d,y),N(m.mentionActive),m.mentionActive&&p(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[ke]),$e=s.useCallback(t=>{const a=t.currentTarget,d=a.selectionStart??a.value.length;j.current=d,ke(a.value,d),m.detectMention(a.value,d),N(m.mentionActive),m.mentionActive&&p(a)},[ke,m,p]),We=s.useCallback(t=>{t.key!=="Escape"&&$e(t)},[$e]),Ye=s.useCallback(()=>{g.current!==null&&window.clearTimeout(g.current),g.current=window.setTimeout(()=>{I(!1),G(!1),se(""),u(-1),N(!1),m.dismissMention(),g.current=null},120)},[m]),Xe=s.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),Ze=s.useCallback(async t=>{ne(null);try{await L(t),i("Conversation archived","success")}catch{i("Failed to archive conversation","error")}},[L,i]),et=s.useCallback(async t=>{J(null),ne(null);try{await re(t),i("Conversation deleted","success")}catch{i("Failed to delete conversation","error")}},[re,i]),tt=s.useCallback(t=>{z(t),me&&xe(!1)},[z,me]),st=s.useCallback(()=>{z(""),xe(!0)},[z]),nt=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(yt,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:"Start a new conversation"}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>U(!0),children:[e.jsx(Pe,{size:16}),"New Chat"]})]}),Y=Ge(r?.modelProvider,r?.modelId),ze=r?.agentId===je?Y??"Fusion":r?.title||H.get(r?.agentId??"")?.name||r?.agentId||"Chat",at=!!(Y&&Y!==ze),De=H.get(r?.agentId??"")?.name||(r?.agentId===je?Y??"Fusion":r?.agentId?.slice(0,30)??"Fusion"),Oe=!!(Y&&Y!==De),it=T.length>50?`${T.slice(0,50)}…`:T;return e.jsxs("div",{className:"chat-view",children:[e.jsxs("div",{className:`chat-sidebar${K?"":" chat-sidebar--hidden"}`,children:[e.jsx("div",{className:"chat-sidebar-header",children:e.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>U(!0),"data-testid":"chat-new-btn",children:[e.jsx(Pe,{size:14}),"New Chat"]})}),e.jsx("div",{className:"chat-sidebar-search",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx(bt,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:E,onChange:t=>S(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):P.length===0?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):P.map(t=>e.jsxs("div",{className:`chat-session-item${r?.id===t.id?" chat-session-item--active":""}`,onClick:()=>tt(t.id),onContextMenu:a=>{a.preventDefault(),ne({sessionId:t.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),J(t.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:e.jsx(Be,{size:14})}),e.jsx("div",{className:"chat-session-title",children:t.title||"Untitled"}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||"No messages"}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsx("span",{children:H.get(t.agentId)?.name||(t.agentId===je?Ge(t.modelProvider,t.modelId)??"Fusion":t.agentId.slice(0,30))}),e.jsx("span",{children:t.updatedAt?_e(t.updatedAt):""})]})]},t.id))}),e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>U(!0),"data-testid":"chat-new-btn-mobile",children:[e.jsx(Pe,{size:14}),"New Chat"]})})]}),q&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:q.y,left:q.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>Ze(q.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(wt,{size:14}),"Archive"]}),e.jsxs("button",{onClick:()=>{ne(null),J(q.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(Be,{size:14}),"Delete"]})]}),k&&e.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>J(null),children:e.jsxs("div",{className:"chat-new-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:"Delete Conversation?"}),e.jsx("p",{style:{fontSize:"14px",color:"var(--text-secondary)",marginBottom:"16px"},children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>J(null),children:"Cancel"}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void et(k),children:"Delete"})]})]})}),e.jsxs("div",{className:"chat-thread",children:[(r||!me)&&e.jsxs("div",{className:"chat-thread-header",children:[me&&r&&e.jsx("button",{className:"btn-icon",onClick:st,"data-testid":"chat-back-btn",children:e.jsx(Nt,{size:16})}),e.jsx(Ce,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:ze}),at&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),e.jsxs("div",{className:"chat-messages",ref:v,children:[x?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):c.length===0&&!r?nt():c.length===0&&r?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):e.jsxs(e.Fragment,{children:[c.map(t=>e.jsxs("div",{className:`chat-message chat-message--${t.role}`,"data-testid":`chat-message-${t.id}`,children:[t.role==="assistant"&&e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(Ce,{size:14}),e.jsx("span",{children:De}),Oe&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),e.jsx("div",{className:"chat-message-content",children:Fe(t.content)}),Ue(t.toolCalls),t.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:t.thinkingOutput})]}),e.jsx("div",{className:"chat-message-time",children:_e(t.createdAt)})]},t.id)),b&&e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[e.jsxs("div",{className:"chat-message-avatar",children:[e.jsx(Ce,{size:14}),e.jsx("span",{children:De}),Oe&&e.jsx("span",{className:"chat-model-tag",children:Y})]}),M?e.jsx("div",{className:"chat-message-content",children:Fe(M)}):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:w?"Thinking…":"Connecting…"}),Ue(X),w&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:w})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}),e.jsx("div",{ref:C})]}),r&&e.jsxs("div",{className:"chat-input-area",children:[Q&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:Ne?e.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):F.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:oe?"No skills found":"No skills available"}):F.map((t,a)=>e.jsxs("button",{type:"button",role:"option","aria-selected":a===ue,className:`chat-skill-menu-item${a===ue?" chat-skill-menu-item--highlighted":""}`,onMouseDown:d=>d.preventDefault(),onMouseEnter:()=>ie(a),onClick:()=>Te(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),e.jsxs("div",{className:"chat-input-wrapper",children:[e.jsx("textarea",{ref:f,className:"chat-input-textarea",placeholder:"Type a message...",value:A,onChange:Qe,onKeyDown:Ke,onKeyUp:We,onClick:$e,onBlur:Ye,onFocus:Xe,rows:1,"data-testid":"chat-input"}),e.jsx(kt,{agents:ge,filter:he,highlightedIndex:Se,visible:_,onSelect:Ae,position:"below"}),e.jsx(Ct,{visible:m.mentionActive&&!_,position:W,files:m.files,selectedIndex:m.selectedIndex,onSelect:t=>{const a=m.selectFile(t,A);B(a),m.dismissMention(),N(!1),f.current?.focus()},loading:m.loading}),T&&e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:`Queued: ${it}`}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:pe,children:"×"})]})]}),b?e.jsx("button",{className:"chat-input-stop",onClick:V,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:e.jsx(Mt,{size:14})}):e.jsx("button",{className:"chat-input-send",onClick:()=>void ye(),disabled:!A.trim(),"data-testid":"chat-send-btn",children:e.jsx(jt,{size:16})})]})]}),Z&&e.jsx(It,{projectId:n,onClose:()=>U(!1),onCreate:Je})]})}export{Vt as ChatView};
@@ -1,4 +1,4 @@
1
- import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c as De,bo as Me,bp as de,bq as et,br as ue,s as Ue,bs as ge,bt as we,bu as xe,bv as ye,bw as tt,bx as ae,by as rt,bz as st,bA as nt,bB as at,bC as it,bD as ie,L as ee,S as lt,bE as ct,bF as ot,K as dt,T as Ae,bG as ut,E as vt,aK as mt,a3 as ft,ai as pt,R as ht}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{c as De,bo as Me,bp as de,bq as et,br as ue,s as Ue,bs as ge,bt as we,bu as xe,bv as ye,bw as tt,bx as ae,by as rt,bz as st,bA as nt,bB as at,bC as it,bD as ie,L as ee,S as lt,bE as ct,bF as ot,K as dt,T as Ae,bG as ut,E as vt,aK as mt,a3 as ft,ai as pt,R as ht}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as t,j as r}from"./vendor-react-K0fH_qHe.js";import{bV as f,bW as b,D as x,a7 as g,a2 as P,a3 as C,L as H,ae as O}from"./index-y194HxzU.js";import{F as v}from"./folder-open-kO5Hsk66.js";function S({value:d,onChange:l,placeholder:y,onInputKeyDown:j,nodeId:h,localNodeId:p}){const[e,a]=t.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),c=t.useCallback(async(s,n=!1)=>{a(i=>({...i,loading:!0,error:null}));try{const i=await f(s,n,h,p);a(u=>({...u,loading:!1,currentPath:i.currentPath,parentPath:i.parentPath,entries:i.entries}))}catch(i){a(u=>({...u,loading:!1,error:i instanceof Error?i.message:"Failed to browse directory"}))}},[h,p]),k=t.useCallback(()=>{a(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);t.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&c(d||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,d,e.showHidden,c,h,p]);const o=t.useCallback(s=>{c(s,e.showHidden)},[c,e.showHidden]),w=t.useCallback(()=>{l(e.currentPath),a(s=>({...s,isOpen:!1}))},[e.currentPath,l]),N=t.useCallback(()=>{a(s=>{const n=!s.showHidden;return{...s,showHidden:n}})},[]);t.useEffect(()=>{e.isOpen&&e.currentPath&&c(e.currentPath,e.showHidden)},[e.showHidden]);const m=e.currentPath?e.currentPath.split("/").filter(Boolean):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"directory-picker-input",value:d,onChange:s=>l(s.target.value),onKeyDown:j,placeholder:y||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"directory-picker-browse-btn",onClick:k,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(v,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsxs("div",{className:"directory-picker-breadcrumbs",children:[r.jsx("button",{className:"directory-picker-breadcrumb",onClick:()=>o("/"),title:"Root",children:"/"}),m.map((s,n)=>{const i="/"+m.slice(0,n+1).join("/");return r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[r.jsx(x,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{className:"directory-picker-breadcrumb",onClick:()=>o(i),title:i,children:s})]},i)})]}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{className:"directory-picker-up-btn",onClick:()=>o(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(g,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{className:"directory-picker-hidden-toggle",onClick:N,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(P,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(H,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(O,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{className:"directory-picker-entry",onClick:()=>o(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(x,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{className:"btn-primary directory-picker-select-btn",onClick:w,children:"Select"})]})]})]})}export{S as D};
1
+ import{r as t,j as r}from"./vendor-react-K0fH_qHe.js";import{bV as f,bW as b,D as x,a7 as g,a2 as P,a3 as C,L as H,ae as O}from"./index-CikysL-d.js";import{F as v}from"./folder-open-BVDq27HP.js";function S({value:d,onChange:l,placeholder:y,onInputKeyDown:j,nodeId:h,localNodeId:p}){const[e,a]=t.useState({isOpen:!1,loading:!1,error:null,currentPath:"",parentPath:null,entries:[],showHidden:!1}),c=t.useCallback(async(s,n=!1)=>{a(i=>({...i,loading:!0,error:null}));try{const i=await f(s,n,h,p);a(u=>({...u,loading:!1,currentPath:i.currentPath,parentPath:i.parentPath,entries:i.entries}))}catch(i){a(u=>({...u,loading:!1,error:i instanceof Error?i.message:"Failed to browse directory"}))}},[h,p]),k=t.useCallback(()=>{a(s=>s.isOpen?{...s,isOpen:!1}:{...s,isOpen:!0})},[]);t.useEffect(()=>{e.isOpen&&!e.loading&&e.entries.length===0&&!e.error&&c(d||void 0,e.showHidden)},[e.isOpen,e.loading,e.entries.length,e.error,d,e.showHidden,c,h,p]);const o=t.useCallback(s=>{c(s,e.showHidden)},[c,e.showHidden]),w=t.useCallback(()=>{l(e.currentPath),a(s=>({...s,isOpen:!1}))},[e.currentPath,l]),N=t.useCallback(()=>{a(s=>{const n=!s.showHidden;return{...s,showHidden:n}})},[]);t.useEffect(()=>{e.isOpen&&e.currentPath&&c(e.currentPath,e.showHidden)},[e.showHidden]);const m=e.currentPath?e.currentPath.split("/").filter(Boolean):[];return r.jsxs("div",{className:"directory-picker",children:[r.jsxs("div",{className:"directory-picker-input-row",children:[r.jsx("input",{type:"text",className:"directory-picker-input",value:d,onChange:s=>l(s.target.value),onKeyDown:j,placeholder:y||"/path/to/your/project"}),r.jsxs("button",{type:"button",className:"directory-picker-browse-btn",onClick:k,"aria-label":e.isOpen?"Close directory browser":"Browse directories",children:[e.isOpen?r.jsx(v,{size:16}):r.jsx(b,{size:16}),r.jsx("span",{children:"Browse"})]})]}),e.isOpen&&r.jsxs("div",{className:"directory-picker-browser",role:"tree","aria-label":"Directory browser",children:[r.jsxs("div",{className:"directory-picker-breadcrumbs",children:[r.jsx("button",{className:"directory-picker-breadcrumb",onClick:()=>o("/"),title:"Root",children:"/"}),m.map((s,n)=>{const i="/"+m.slice(0,n+1).join("/");return r.jsxs("span",{className:"directory-picker-breadcrumb-item",children:[r.jsx(x,{size:12,className:"directory-picker-breadcrumb-sep"}),r.jsx("button",{className:"directory-picker-breadcrumb",onClick:()=>o(i),title:i,children:s})]},i)})]}),r.jsxs("div",{className:"directory-picker-toolbar",children:[e.parentPath&&r.jsxs("button",{className:"directory-picker-up-btn",onClick:()=>o(e.parentPath),"aria-label":"Go to parent directory",title:"Parent directory",children:[r.jsx(g,{size:14}),r.jsx("span",{children:"Up"})]}),r.jsxs("button",{className:"directory-picker-hidden-toggle",onClick:N,"aria-label":e.showHidden?"Hide hidden directories":"Show hidden directories",title:e.showHidden?"Hide hidden":"Show hidden",children:[e.showHidden?r.jsx(P,{size:14}):r.jsx(C,{size:14}),r.jsx("span",{children:e.showHidden?"Hide hidden":"Show hidden"})]})]}),e.loading?r.jsxs("div",{className:"directory-picker-loading",children:[r.jsx(H,{size:20,className:"animate-spin"}),r.jsx("span",{children:"Loading…"})]}):e.error?r.jsxs("div",{className:"directory-picker-error",children:[r.jsx(O,{size:16}),r.jsx("span",{children:e.error})]}):r.jsx("div",{className:"directory-picker-entries",children:e.entries.length===0?r.jsx("div",{className:"directory-picker-empty",children:"No subdirectories"}):e.entries.map(s=>r.jsxs("button",{className:"directory-picker-entry",onClick:()=>o(s.path),role:"treeitem",title:s.path,children:[r.jsx(b,{size:16,className:"directory-picker-entry-icon"}),r.jsx("span",{className:"directory-picker-entry-name",children:s.name}),s.hasChildren&&r.jsx(x,{size:14,className:"directory-picker-entry-arrow"})]},s.path))}),r.jsxs("div",{className:"directory-picker-actions",children:[r.jsx("span",{className:"directory-picker-selected-path",title:e.currentPath,children:e.currentPath}),r.jsx("button",{type:"button",className:"btn btn-primary directory-picker-select-btn",onClick:w,children:"Select"})]})]})]})}export{S as D};
@@ -1 +1 @@
1
- import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{Y as oe,$ as G,a0 as le,a1 as ie,F as z,a2 as de,a3 as ue,S as me,X as he,R as pe,a4 as fe,a5 as W,a6 as V,K as X,D as je,a7 as xe}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";function we(n){const{projectId:c,searchQuery:u,includeProjectFiles:a=!0}=n??{},[x,l]=s.useState([]),[h,i]=s.useState([]),[o,p]=s.useState(!0),[k,b]=s.useState(null),f=s.useRef(null),g=s.useRef(!1),m=s.useRef(null),j=s.useCallback(async()=>{f.current&&f.current.abort();const C=new AbortController;f.current=C;const E=!g.current;E&&p(!0),b(null);const L=oe(u?{q:u}:void 0,c),y=a?G(c):Promise.resolve({files:[]}),[v,F]=await Promise.allSettled([L,y]);if(C.signal.aborted)return;let R=null;if(v.status==="fulfilled"?(l(v.value),g.current=!0):R=v.reason instanceof Error?v.reason.message:String(v.reason),F.status==="fulfilled"){const M=F.value.files,P=u?.trim().toLowerCase(),T=P?M.filter(N=>N.name.toLowerCase().includes(P)||N.path.toLowerCase().includes(P)):M;i(T)}b(R),E&&p(!1)},[a,c,u]);return s.useEffect(()=>(m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{j()},300),()=>{m.current&&clearTimeout(m.current)}),[j]),s.useEffect(()=>(j(),()=>{f.current&&f.current.abort()}),[]),{documents:x,projectFiles:h,loading:o,error:k,refresh:j}}function ke(n,c){const[u,a]=s.useState([]),[x,l]=s.useState(!0),[h,i]=s.useState(null),o=s.useRef(null),p=s.useRef(!1),k=c?.showHidden??!1,b=s.useCallback(async f=>{o.current&&o.current.abort();const g=new AbortController;o.current=g;const m=!p.current;m&&l(!0),i(null);try{const j=await G(n,{showHidden:f?.showHidden??k});if(g.signal.aborted)return;a(j.files),p.current=!0}catch(j){if(g.signal.aborted)return;i(j instanceof Error?j.message:String(j))}finally{!g.signal.aborted&&m&&l(!1)}},[n,k]);return s.useEffect(()=>(p.current=!1,b({showHidden:k}),()=>{o.current&&o.current.abort()}),[b,k]),{files:u,loading:x,error:h,refresh:b}}const be=768;function Y(n){return n?new Date(n).toLocaleString():""}function ge(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function ve(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ne({document:n,renderMarkdown:c,onToggleMarkdown:u}){const[a,x]=s.useState(!1),l=ve(n.content),h=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(z,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>x(i=>!i),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(xe,{size:14}):e.jsx(X,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:Y(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:u,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:l}),h&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Se({taskId:n,taskTitle:c,documents:u,onOpenTask:a,renderMarkdownStates:x,onToggleMarkdown:l}){const[h,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(o=>!o),"aria-expanded":h,"aria-label":`${h?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:h?e.jsx(X,{size:16}):e.jsx(je,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[u.length," doc",u.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),h&&e.jsx("div",{className:"documents-group-content",children:u.map(o=>e.jsx(Ne,{document:o,renderMarkdown:x.get(o.id)??!1,onToggleMarkdown:()=>l(o.id)},o.id))})]})}function ye({projectId:n,addToast:c,onOpenDetail:u}){const[a,x]=s.useState("project"),[l,h]=s.useState(""),[i,o]=s.useState(null),[p,k]=s.useState(!1),[b,f]=s.useState(null),[g,m]=s.useState(!1),[j,C]=s.useState(null),[E,L]=s.useState(!1),y=s.useRef(0),v=s.useRef(!1),[F,R]=s.useState(!1),[M,P]=s.useState(new Map),T=a==="tasks"?l.trim():"",{documents:N,loading:D,error:_,refresh:B}=we({projectId:n,searchQuery:T||void 0,includeProjectFiles:!1}),{files:S,loading:$,error:J,refresh:O}=ke(n,{showHidden:p});s.useEffect(()=>{const t=()=>{L(window.innerWidth<=be)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{v.current=!1,x("project"),o(null),k(!1),f(null),C(null),m(!1),R(!1),P(new Map)},[n]),s.useEffect(()=>{v.current||D||$||(S.length>0?x("project"):N.length>0&&x("tasks"),v.current=!0)},[N.length,D,S.length,$]);const H=s.useMemo(()=>{const t=new Map;for(const r of N){const d=t.get(r.taskId)||[];t.set(r.taskId,[...d,r])}return Array.from(t.entries()).map(([r,d])=>{const w=[...d].sort((re,ce)=>ce.updatedAt.localeCompare(re.updatedAt));return{taskId:r,taskTitle:w[0]?.taskTitle,documents:w,latestUpdated:w[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[N]),A=s.useMemo(()=>{const t=l.trim().toLowerCase();return t?S.filter(r=>{const d=r.path.toLowerCase(),w=r.name.toLowerCase();return d.includes(t)||w.includes(t)}):S},[S,l]);s.useEffect(()=>{if(!i)return;S.some(r=>r.path===i.path)||(o(null),f(null),C(null),m(!1))},[S,i]);const Z=s.useCallback(t=>{h(t.target.value)},[]),I=s.useCallback(()=>{h("")},[]),Q=s.useCallback(t=>{x(t)},[]),ee=s.useCallback(async t=>{try{const r=await le(t,n);u(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,u,c]),se=s.useCallback(async t=>{o(t),m(!0),C(null),f(null);const r=y.current+1;y.current=r;try{const d=await ie("project",t.path,n);if(y.current!==r)return;f(d.content)}catch(d){if(y.current!==r)return;const w=d instanceof Error?d.message:`Failed to open ${t.path}`;C(w),c(w,"error")}finally{y.current===r&&m(!1)}},[n,c]),te=s.useCallback(()=>{o(null),f(null),C(null),m(!1)},[]),ne=s.useCallback(t=>{P(r=>{const d=new Map(r),w=d.get(t)??!1;return d.set(t,!w),d})},[]),U=a==="project"?J:_,ae=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),q=a==="project"?A.length:N.length,K=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(z,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[q," result",q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>Q("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>Q("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:H.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>k(t=>!t),"aria-pressed":p,"aria-label":p?"Hide hidden project files":"Show hidden project files",title:p?"Hide hidden files":"Show hidden files",children:[p?e.jsx(de,{size:14}):e.jsx(ue,{size:14}),p?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(me,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:K,value:l,onChange:Z,"aria-label":K}),l&&e.jsx("button",{className:"documents-search-clear",onClick:I,"aria-label":"Clear search",children:e.jsx(he,{size:16})})]})]}),e.jsx("div",{className:"documents-view-content",children:U?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",U]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ae(),"aria-label":"Retry loading documents",children:[e.jsx(pe,{size:16}),"Retry"]})]}):a==="project"?$&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):A.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No project markdown files match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${E?" documents-project-layout--mobile":""}`,children:[(!E||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:A.map(t=>{const r=i?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void se(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ge(t.size)," · ",Y(t.mtime)]})]})},t.path)})})}),(!E||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[E&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:te,"aria-label":"Back to project files list",children:[e.jsx(fe,{size:14}),"Back to files"]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(t=>!t),"aria-label":F?"Switch to plain text":"Switch to markdown","aria-pressed":F,title:F?"Switch to plain text":"Switch to markdown",children:F?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):j?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:j}):F?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:b??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:b??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):D&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No task documents match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:H.map(({taskId:t,taskTitle:r,documents:d})=>e.jsx(Se,{taskId:t,taskTitle:r,documents:d,onOpenTask:ee,renderMarkdownStates:M,onToggleMarkdown:ne},t))})})})]})}export{ye as DocumentsView};
1
+ import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{Y as oe,$ as G,a0 as le,a1 as ie,F as z,a2 as de,a3 as ue,S as me,X as he,R as pe,a4 as fe,a5 as W,a6 as V,K as X,D as je,a7 as xe}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";function we(n){const{projectId:c,searchQuery:u,includeProjectFiles:a=!0}=n??{},[x,l]=s.useState([]),[h,i]=s.useState([]),[o,p]=s.useState(!0),[k,b]=s.useState(null),f=s.useRef(null),g=s.useRef(!1),m=s.useRef(null),j=s.useCallback(async()=>{f.current&&f.current.abort();const C=new AbortController;f.current=C;const E=!g.current;E&&p(!0),b(null);const L=oe(u?{q:u}:void 0,c),y=a?G(c):Promise.resolve({files:[]}),[v,F]=await Promise.allSettled([L,y]);if(C.signal.aborted)return;let R=null;if(v.status==="fulfilled"?(l(v.value),g.current=!0):R=v.reason instanceof Error?v.reason.message:String(v.reason),F.status==="fulfilled"){const M=F.value.files,P=u?.trim().toLowerCase(),T=P?M.filter(N=>N.name.toLowerCase().includes(P)||N.path.toLowerCase().includes(P)):M;i(T)}b(R),E&&p(!1)},[a,c,u]);return s.useEffect(()=>(m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{j()},300),()=>{m.current&&clearTimeout(m.current)}),[j]),s.useEffect(()=>(j(),()=>{f.current&&f.current.abort()}),[]),{documents:x,projectFiles:h,loading:o,error:k,refresh:j}}function ke(n,c){const[u,a]=s.useState([]),[x,l]=s.useState(!0),[h,i]=s.useState(null),o=s.useRef(null),p=s.useRef(!1),k=c?.showHidden??!1,b=s.useCallback(async f=>{o.current&&o.current.abort();const g=new AbortController;o.current=g;const m=!p.current;m&&l(!0),i(null);try{const j=await G(n,{showHidden:f?.showHidden??k});if(g.signal.aborted)return;a(j.files),p.current=!0}catch(j){if(g.signal.aborted)return;i(j instanceof Error?j.message:String(j))}finally{!g.signal.aborted&&m&&l(!1)}},[n,k]);return s.useEffect(()=>(p.current=!1,b({showHidden:k}),()=>{o.current&&o.current.abort()}),[b,k]),{files:u,loading:x,error:h,refresh:b}}const be=768;function Y(n){return n?new Date(n).toLocaleString():""}function ge(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(n>=10*1024?0:1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function ve(n,c=200){return n.length<=c?n:`${n.substring(0,c)}…`}function Ne({document:n,renderMarkdown:c,onToggleMarkdown:u}){const[a,x]=s.useState(!1),l=ve(n.content),h=n.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(z,{size:14}),e.jsx("span",{className:"document-card-key-text",children:n.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",n.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>x(i=>!i),title:a?"Collapse":"Expand","aria-label":a?"Collapse content":"Expand content",children:a?e.jsx(xe,{size:14}):e.jsx(X,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:n.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:Y(n.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${a?" document-card-content--expanded":""}`,children:[a?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:u,"aria-label":c?"Switch to plain text":"Switch to markdown","aria-pressed":c,title:c?"Switch to plain text":"Switch to markdown",children:c?"Markdown":"Plain"})}),c?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:n.content})})}):e.jsx("pre",{className:"document-card-content-text",children:n.content})]}):e.jsx("p",{className:"document-card-preview",children:l}),h&&!a&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Se({taskId:n,taskTitle:c,documents:u,onOpenTask:a,renderMarkdownStates:x,onToggleMarkdown:l}){const[h,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(o=>!o),"aria-expanded":h,"aria-label":`${h?"Collapse":"Expand"} documents for task ${n}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:h?e.jsx(X,{size:16}):e.jsx(je,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:n}),e.jsx("span",{className:"documents-group-task-title",children:c||"Untitled"})]}),e.jsxs("span",{className:"documents-group-count",children:[u.length," doc",u.length!==1?"s":""]}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>a(n),"aria-label":`Open task ${n}: ${c||"Untitled"}`,children:"Open task"})]}),h&&e.jsx("div",{className:"documents-group-content",children:u.map(o=>e.jsx(Ne,{document:o,renderMarkdown:x.get(o.id)??!1,onToggleMarkdown:()=>l(o.id)},o.id))})]})}function ye({projectId:n,addToast:c,onOpenDetail:u}){const[a,x]=s.useState("project"),[l,h]=s.useState(""),[i,o]=s.useState(null),[p,k]=s.useState(!1),[b,f]=s.useState(null),[g,m]=s.useState(!1),[j,C]=s.useState(null),[E,L]=s.useState(!1),y=s.useRef(0),v=s.useRef(!1),[F,R]=s.useState(!1),[M,P]=s.useState(new Map),T=a==="tasks"?l.trim():"",{documents:N,loading:D,error:_,refresh:B}=we({projectId:n,searchQuery:T||void 0,includeProjectFiles:!1}),{files:S,loading:$,error:J,refresh:O}=ke(n,{showHidden:p});s.useEffect(()=>{const t=()=>{L(window.innerWidth<=be)};return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[]),s.useEffect(()=>{v.current=!1,x("project"),o(null),k(!1),f(null),C(null),m(!1),R(!1),P(new Map)},[n]),s.useEffect(()=>{v.current||D||$||(S.length>0?x("project"):N.length>0&&x("tasks"),v.current=!0)},[N.length,D,S.length,$]);const H=s.useMemo(()=>{const t=new Map;for(const r of N){const d=t.get(r.taskId)||[];t.set(r.taskId,[...d,r])}return Array.from(t.entries()).map(([r,d])=>{const w=[...d].sort((re,ce)=>ce.updatedAt.localeCompare(re.updatedAt));return{taskId:r,taskTitle:w[0]?.taskTitle,documents:w,latestUpdated:w[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[N]),A=s.useMemo(()=>{const t=l.trim().toLowerCase();return t?S.filter(r=>{const d=r.path.toLowerCase(),w=r.name.toLowerCase();return d.includes(t)||w.includes(t)}):S},[S,l]);s.useEffect(()=>{if(!i)return;S.some(r=>r.path===i.path)||(o(null),f(null),C(null),m(!1))},[S,i]);const Z=s.useCallback(t=>{h(t.target.value)},[]),I=s.useCallback(()=>{h("")},[]),Q=s.useCallback(t=>{x(t)},[]),ee=s.useCallback(async t=>{try{const r=await le(t,n);u(r)}catch{c(`Failed to open task ${t}`,"error")}},[n,u,c]),se=s.useCallback(async t=>{o(t),m(!0),C(null),f(null);const r=y.current+1;y.current=r;try{const d=await ie("project",t.path,n);if(y.current!==r)return;f(d.content)}catch(d){if(y.current!==r)return;const w=d instanceof Error?d.message:`Failed to open ${t.path}`;C(w),c(w,"error")}finally{y.current===r&&m(!1)}},[n,c]),te=s.useCallback(()=>{o(null),f(null),C(null),m(!1)},[]),ne=s.useCallback(t=>{P(r=>{const d=new Map(r),w=d.get(t)??!1;return d.set(t,!w),d})},[]),U=a==="project"?J:_,ae=s.useCallback(async()=>{if(a==="project"){await O();return}await B()},[a,O,B]),q=a==="project"?A.length:N.length,K=a==="project"?"Search project markdown files…":"Search task documents…";return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(z,{size:20}),"Documents"]}),e.jsxs("span",{className:"documents-view-count",children:[q," result",q!==1?"s":""]})]}),e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${a==="project"?" active":""}`,role:"tab","aria-selected":a==="project","aria-label":"Show project markdown files",onClick:()=>Q("project"),children:["Project Files",e.jsx("span",{className:"documents-tab-count",children:S.length})]}),e.jsxs("button",{className:`btn documents-tab${a==="tasks"?" active":""}`,role:"tab","aria-selected":a==="tasks","aria-label":"Show task documents",onClick:()=>Q("tasks"),children:["Task Documents",e.jsx("span",{className:"documents-tab-count",children:H.length})]})]}),a==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>k(t=>!t),"aria-pressed":p,"aria-label":p?"Hide hidden project files":"Show hidden project files",title:p?"Hide hidden files":"Show hidden files",children:[p?e.jsx(de,{size:14}):e.jsx(ue,{size:14}),p?"Hide Hidden":"Show Hidden"]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(me,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:K,value:l,onChange:Z,"aria-label":K}),l&&e.jsx("button",{className:"documents-search-clear",onClick:I,"aria-label":"Clear search",children:e.jsx(he,{size:16})})]})]}),e.jsx("div",{className:"documents-view-content",children:U?e.jsxs("div",{className:"documents-view-error",children:[e.jsxs("p",{children:["Failed to load ",a==="project"?"project files":"task documents",": ",U]}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void ae(),"aria-label":"Retry loading documents",children:[e.jsx(pe,{size:16}),"Retry"]})]}):a==="project"?$&&S.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading project markdown files…"})}):A.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No project markdown files match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No Markdown files found in this project."})]})}):e.jsxs("div",{className:`documents-project-layout${E?" documents-project-layout--mobile":""}`,children:[(!E||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:A.map(t=>{const r=i?.path===t.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void se(t),"aria-label":`Open ${t.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:t.name}),e.jsx("span",{className:"markdown-file-item-path",children:t.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ge(t.size)," · ",Y(t.mtime)]})]})},t.path)})})}),(!E||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[E&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:te,"aria-label":"Back to project files list",children:[e.jsx(fe,{size:14}),"Back to files"]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(t=>!t),"aria-label":F?"Switch to plain text":"Switch to markdown","aria-pressed":F,title:F?"Switch to plain text":"Switch to markdown",children:F?"Markdown":"Plain"})]}),g?e.jsx("p",{className:"documents-content-state",children:"Loading file content…"}):j?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:j}):F?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(W,{remarkPlugins:[V],children:b??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:b??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:"Select a Markdown file to view its content."})})]})]}):D&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:"Loading task documents…"})}):H.length===0?e.jsx("div",{className:"documents-view-empty",children:l.trim()?e.jsxs("p",{children:['No task documents match "',l.trim(),'".']}):e.jsxs(e.Fragment,{children:[e.jsx(z,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:"No task documents yet."}),e.jsx("p",{className:"documents-view-empty-hint",children:"Documents are created in task detail tabs."})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:H.map(({taskId:t,taskTitle:r,documents:d})=>e.jsx(Se,{taskId:t,taskTitle:r,documents:d,onOpenTask:ee,renderMarkdownStates:M,onToggleMarkdown:ne},t))})})})]})}export{ye as DocumentsView};
@@ -1,4 +1,4 @@
1
- import{r as c,j as s}from"./vendor-react-K0fH_qHe.js";import{c as U,a8 as Q,a9 as V,aa as W,ab as X,ac as J,ad as x,X as T,R as j,C as q,ae as F,af as G,ag as _,ah as K,w as B,ai as Z,aj as ss,ak as P}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as c,j as s}from"./vendor-react-K0fH_qHe.js";import{c as U,a8 as Q,a9 as V,aa as W,ab as X,ac as J,ad as x,X as T,R as j,C as q,ae as F,af as G,ag as _,ah as K,w as B,ai as Z,aj as ss,ak as P}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,2 +1,2 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{b9 as Ae,ba as je,bb as Se,bc as Fe,o as ze,bd as De,be as Ie,bf as Le,bg as Ne,bh as Ce,bi as Re,bj as Te,bk as Ee,bl as We,n as qe,bm as Pe,L as w,bn as ke}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";const U=".fusion/memory/MEMORY.md",_e=5e4,Oe="0 3 * * *",Ue="0 4 * * *";function oe(i){return{memoryEnabled:i.memoryEnabled!==!1,memoryAutoSummarizeEnabled:i.memoryAutoSummarizeEnabled??!1,memoryAutoSummarizeThresholdChars:i.memoryAutoSummarizeThresholdChars??_e,memoryAutoSummarizeSchedule:i.memoryAutoSummarizeSchedule??Oe,memoryDreamsEnabled:i.memoryDreamsEnabled??!1,memoryDreamsSchedule:i.memoryDreamsSchedule??Ue}}function Me(i,t){return i.some(m=>m.path===t)?t:i.find(m=>m.path===U)?.path??i[0]?.path??U}function Qe(i={}){const{projectId:t}=i,[m,x]=a.useState(""),[A,N]=a.useState(!0),[j,S]=a.useState(!1),[h,y]=a.useState(!1),[n,g]=a.useState(null),[Q,J]=a.useState(!0),[X,F]=a.useState(!1),[b,R]=a.useState(()=>oe({})),[C,ee]=a.useState(!0),[ce,B]=a.useState(!1),[c,f]=a.useState([]),[se,z]=a.useState(!0),[o,E]=a.useState(U),[T,u]=a.useState(""),[d,te]=a.useState(!1),[H,p]=a.useState(!1),[ae,$]=a.useState(!1),[ne,Y]=a.useState(!1),[G,W]=a.useState(null),[k,q]=a.useState(!0),[de,D]=a.useState(!1),[ue,V]=a.useState(!1),[re,Z]=a.useState(null),{status:K,loading:v,refresh:ie}=Ae({projectId:t}),I=a.useCallback(s=>{u(s),p(!0)},[]),P=a.useCallback(async s=>{te(!0);try{const{content:r}=await je(s,t);E(s),u(r),p(!1)}finally{te(!1)}},[t]),M=a.useCallback(async()=>{z(!0);try{const{files:s}=await Se(t);if(f(s),s.length===0){E(U),u(""),p(!1);return}const r=Me(s,o);r!==o&&await P(r)}finally{z(!1)}},[t,o,P]);a.useEffect(()=>{let s=!1;async function r(){try{const l=await We(t);s||(x(l.content),N(!1))}catch{s||(x(""),N(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Ce(t);s||(g(l.content),F(l.exists),J(!1))}catch{s||(g(null),F(!1),J(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){ee(!0);try{const l=await qe(t);s||R(oe(l))}catch{s||R(oe({}))}finally{s||ee(!1)}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){z(!0);try{const{files:l}=await Se(t);if(s)return;if(f(l),l.length===0){E(U),u(""),p(!1);return}const me=Me(l,o),{content:we}=await je(me,t);if(s)return;E(me),u(we),p(!1)}catch{s||(f([]),E(U),u(""),p(!1))}finally{s||z(!1)}}return r(),()=>{s=!0}},[t,o]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Ne(t);s||(W(l),q(!1))}catch{s||(W(null),q(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Pe(t);s||Z(l)}catch{s||Z(null)}}return r(),()=>{s=!0}},[t]);const le=a.useCallback(s=>{x(s),S(!0)},[]),he=a.useCallback(async()=>{if(j){y(!0);try{await Fe(m,t),S(!1)}finally{y(!1)}}},[m,j,t]),ye=a.useCallback(async s=>{B(!0);try{const r=await ze(s,t);R(oe(r))}finally{B(!1)}},[t]),ge=a.useCallback(async s=>{await P(s)},[P]),pe=a.useCallback(async()=>{if(H){$(!0);try{await De(o,T,t),p(!1),await M()}finally{$(!1)}}},[T,H,o,t,M]),xe=a.useCallback(async()=>{V(!0);try{const s=await Ie(t);return await ie(),s}finally{V(!1)}},[t,ie]),be=a.useCallback(async s=>Le(s,t),[t]),_=a.useCallback(async()=>{try{const s=await Ne(t);W(s)}catch{W(null)}},[t]),L=a.useCallback(async()=>{try{const s=await Ce(t);g(s.content),F(s.exists)}catch{g(null),F(!1)}},[t]),fe=a.useCallback(async s=>{await Re(s,t),await L()},[t,L]),ve=a.useCallback(async()=>{Y(!0);try{const s=await Te(t);return await Promise.all([L(),_()]),{success:s.success,summary:s.summary}}finally{Y(!1)}},[t,L,_]),O=a.useCallback(async s=>{D(!0);try{const r=s?await Ee(s,t):await Ee(t);if(s){const l=r.path??s;E(l),u(r.content),p(!1),await M();return}x(r.content),S(!0)}finally{D(!1)}},[t,M]);return{workingMemory:m,workingMemoryLoading:A,workingMemoryDirty:j,setWorkingMemory:le,saveWorkingMemory:he,savingWorkingMemory:h,insightsContent:n,insightsLoading:Q,insightsExists:X,refreshInsights:L,saveInsights:fe,memorySettings:b,settingsLoading:C,savingMemorySettings:ce,saveMemorySettings:ye,memoryFiles:c,memoryFilesLoading:se,selectedFilePath:o,selectedFileContent:T,selectedFileLoading:d,selectedFileDirty:H,setSelectedFileContent:I,selectFile:ge,saveSelectedFile:pe,savingSelectedFile:ae,reloadMemoryFiles:M,backendStatus:K,backendLoading:v,extractInsights:ve,extracting:ne,auditReport:G,auditLoading:k,refreshAudit:_,compactMemory:O,compacting:de,installQmdAction:xe,installingQmd:ue,testRetrieval:be,stats:re}}const Be={Patterns:"pattern",Principles:"principle",Conventions:"convention",Pitfalls:"pitfall",Context:"context"},He={"long-term":"Long-term",daily:"Daily",dreams:"Dreams"},$e={"long-term":"Curated durable decisions, conventions, constraints, and pitfalls promoted from dreams.",daily:"Raw daily observations, open loops, and running context for dream processing.",dreams:"Synthesized patterns and open loops promoted from daily memory."};function Ye(i){if(!i)return[];const t=[],m=i.split(/(?=^## )/m);for(const x of m){const A=x.trim();if(!A)continue;const N=A.match(/^##\s+(.+?)(\n|$)/);if(N){const j=N[1].trim(),S=Be[j]??j.toLowerCase(),h=A.slice(N[0].length).trim(),y=h.split(`
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{b9 as Ae,ba as je,bb as Se,bc as Fe,o as ze,bd as De,be as Ie,bf as Le,bg as Ne,bh as Ce,bi as Re,bj as Te,bk as Ee,bl as We,n as qe,bm as Pe,L as w,bn as ke}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";const U=".fusion/memory/MEMORY.md",_e=5e4,Oe="0 3 * * *",Ue="0 4 * * *";function oe(i){return{memoryEnabled:i.memoryEnabled!==!1,memoryAutoSummarizeEnabled:i.memoryAutoSummarizeEnabled??!1,memoryAutoSummarizeThresholdChars:i.memoryAutoSummarizeThresholdChars??_e,memoryAutoSummarizeSchedule:i.memoryAutoSummarizeSchedule??Oe,memoryDreamsEnabled:i.memoryDreamsEnabled??!1,memoryDreamsSchedule:i.memoryDreamsSchedule??Ue}}function Me(i,t){return i.some(m=>m.path===t)?t:i.find(m=>m.path===U)?.path??i[0]?.path??U}function Qe(i={}){const{projectId:t}=i,[m,x]=a.useState(""),[A,N]=a.useState(!0),[j,S]=a.useState(!1),[h,y]=a.useState(!1),[n,g]=a.useState(null),[Q,J]=a.useState(!0),[X,F]=a.useState(!1),[b,R]=a.useState(()=>oe({})),[C,ee]=a.useState(!0),[ce,B]=a.useState(!1),[c,f]=a.useState([]),[se,z]=a.useState(!0),[o,E]=a.useState(U),[T,u]=a.useState(""),[d,te]=a.useState(!1),[H,p]=a.useState(!1),[ae,$]=a.useState(!1),[ne,Y]=a.useState(!1),[G,W]=a.useState(null),[k,q]=a.useState(!0),[de,D]=a.useState(!1),[ue,V]=a.useState(!1),[re,Z]=a.useState(null),{status:K,loading:v,refresh:ie}=Ae({projectId:t}),I=a.useCallback(s=>{u(s),p(!0)},[]),P=a.useCallback(async s=>{te(!0);try{const{content:r}=await je(s,t);E(s),u(r),p(!1)}finally{te(!1)}},[t]),M=a.useCallback(async()=>{z(!0);try{const{files:s}=await Se(t);if(f(s),s.length===0){E(U),u(""),p(!1);return}const r=Me(s,o);r!==o&&await P(r)}finally{z(!1)}},[t,o,P]);a.useEffect(()=>{let s=!1;async function r(){try{const l=await We(t);s||(x(l.content),N(!1))}catch{s||(x(""),N(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Ce(t);s||(g(l.content),F(l.exists),J(!1))}catch{s||(g(null),F(!1),J(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){ee(!0);try{const l=await qe(t);s||R(oe(l))}catch{s||R(oe({}))}finally{s||ee(!1)}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){z(!0);try{const{files:l}=await Se(t);if(s)return;if(f(l),l.length===0){E(U),u(""),p(!1);return}const me=Me(l,o),{content:we}=await je(me,t);if(s)return;E(me),u(we),p(!1)}catch{s||(f([]),E(U),u(""),p(!1))}finally{s||z(!1)}}return r(),()=>{s=!0}},[t,o]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Ne(t);s||(W(l),q(!1))}catch{s||(W(null),q(!1))}}return r(),()=>{s=!0}},[t]),a.useEffect(()=>{let s=!1;async function r(){try{const l=await Pe(t);s||Z(l)}catch{s||Z(null)}}return r(),()=>{s=!0}},[t]);const le=a.useCallback(s=>{x(s),S(!0)},[]),he=a.useCallback(async()=>{if(j){y(!0);try{await Fe(m,t),S(!1)}finally{y(!1)}}},[m,j,t]),ye=a.useCallback(async s=>{B(!0);try{const r=await ze(s,t);R(oe(r))}finally{B(!1)}},[t]),ge=a.useCallback(async s=>{await P(s)},[P]),pe=a.useCallback(async()=>{if(H){$(!0);try{await De(o,T,t),p(!1),await M()}finally{$(!1)}}},[T,H,o,t,M]),xe=a.useCallback(async()=>{V(!0);try{const s=await Ie(t);return await ie(),s}finally{V(!1)}},[t,ie]),be=a.useCallback(async s=>Le(s,t),[t]),_=a.useCallback(async()=>{try{const s=await Ne(t);W(s)}catch{W(null)}},[t]),L=a.useCallback(async()=>{try{const s=await Ce(t);g(s.content),F(s.exists)}catch{g(null),F(!1)}},[t]),fe=a.useCallback(async s=>{await Re(s,t),await L()},[t,L]),ve=a.useCallback(async()=>{Y(!0);try{const s=await Te(t);return await Promise.all([L(),_()]),{success:s.success,summary:s.summary}}finally{Y(!1)}},[t,L,_]),O=a.useCallback(async s=>{D(!0);try{const r=s?await Ee(s,t):await Ee(t);if(s){const l=r.path??s;E(l),u(r.content),p(!1),await M();return}x(r.content),S(!0)}finally{D(!1)}},[t,M]);return{workingMemory:m,workingMemoryLoading:A,workingMemoryDirty:j,setWorkingMemory:le,saveWorkingMemory:he,savingWorkingMemory:h,insightsContent:n,insightsLoading:Q,insightsExists:X,refreshInsights:L,saveInsights:fe,memorySettings:b,settingsLoading:C,savingMemorySettings:ce,saveMemorySettings:ye,memoryFiles:c,memoryFilesLoading:se,selectedFilePath:o,selectedFileContent:T,selectedFileLoading:d,selectedFileDirty:H,setSelectedFileContent:I,selectFile:ge,saveSelectedFile:pe,savingSelectedFile:ae,reloadMemoryFiles:M,backendStatus:K,backendLoading:v,extractInsights:ve,extracting:ne,auditReport:G,auditLoading:k,refreshAudit:_,compactMemory:O,compacting:de,installQmdAction:xe,installingQmd:ue,testRetrieval:be,stats:re}}const Be={Patterns:"pattern",Principles:"principle",Conventions:"convention",Pitfalls:"pitfall",Context:"context"},He={"long-term":"Long-term",daily:"Daily",dreams:"Dreams"},$e={"long-term":"Curated durable decisions, conventions, constraints, and pitfalls promoted from dreams.",daily:"Raw daily observations, open loops, and running context for dream processing.",dreams:"Synthesized patterns and open loops promoted from daily memory."};function Ye(i){if(!i)return[];const t=[],m=i.split(/(?=^## )/m);for(const x of m){const A=x.trim();if(!A)continue;const N=A.match(/^##\s+(.+?)(\n|$)/);if(N){const j=N[1].trim(),S=Be[j]??j.toLowerCase(),h=A.slice(N[0].length).trim(),y=h.split(`
2
2
  `).map(n=>n.replace(/^-\s+/,"").trim()).filter(n=>n.length>0&&(n.startsWith("- ")||n.startsWith("* ")));(y.length>0||h.length>0)&&t.push({name:j,key:S,items:y.length>0?y:h.length>0?[h]:[],expanded:!0})}}return t}function Ge(i){if(!i)return null;const t=i.match(/##\s+Last\s+Updated:\s*(\d{4}-\d{2}-\d{2})/i);return t?t[1]:null}function Ve(i){return i.reduce((t,m)=>t+m.items.length,0)}function Ze(i){switch(i){case"file":return"File (.fusion/memory/)";case"readonly":return"Read-Only";case"qmd":return"QMD (Quantized Memory Distillation)";default:return i}}function Ke(i){switch(i){case"healthy":return"Healthy";case"warning":return"Warning";case"issues":return"Issues Found"}}function ss({projectId:i,addToast:t}){const[m,x]=a.useState("working"),[A,N]=a.useState(new Set),[j,S]=a.useState(!1),[h,y]=a.useState(null),[n,g]=a.useState({memoryEnabled:!0,memoryAutoSummarizeEnabled:!1,memoryAutoSummarizeThresholdChars:5e4,memoryAutoSummarizeSchedule:"0 3 * * *",memoryDreamsEnabled:!1,memoryDreamsSchedule:"0 4 * * *"}),[Q,J]=a.useState(""),[X,F]=a.useState(!1),[b,R]=a.useState(null),{insightsContent:C,insightsLoading:ee,insightsExists:ce,saveInsights:B,memorySettings:c,settingsLoading:f,saveMemorySettings:se,savingMemorySettings:z,backendStatus:o,backendLoading:E,extractInsights:T,extracting:u,auditReport:d,auditLoading:te,refreshAudit:H,compactMemory:p,compacting:ae,installQmdAction:$,installingQmd:ne,testRetrieval:Y,memoryFiles:G,memoryFilesLoading:W,selectedFilePath:k,selectedFileContent:q,selectedFileLoading:de,selectedFileDirty:D,setSelectedFileContent:ue,selectFile:V,saveSelectedFile:re,savingSelectedFile:Z}=Qe({projectId:i});a.useEffect(()=>{g(c)},[c]);const K=a.useMemo(()=>n.memoryEnabled!==c.memoryEnabled||n.memoryAutoSummarizeEnabled!==c.memoryAutoSummarizeEnabled||n.memoryAutoSummarizeThresholdChars!==c.memoryAutoSummarizeThresholdChars||n.memoryAutoSummarizeSchedule!==c.memoryAutoSummarizeSchedule||n.memoryDreamsEnabled!==c.memoryDreamsEnabled||n.memoryDreamsSchedule!==c.memoryDreamsSchedule,[n,c]),v=a.useMemo(()=>G.find(s=>s.path===k),[G,k]),ie=v?$e[v.layer]:"Edits the selected memory file.",I=a.useMemo(()=>Ye(C),[C]),P=a.useMemo(()=>Ve(I),[I]),M=a.useMemo(()=>Ge(C),[C]),le=a.useCallback(s=>{N(r=>{const l=new Set(r);return l.has(s)?l.delete(s):l.add(s),l})},[]),he=a.useCallback(async s=>{try{await V(s)}catch{t("Failed to load memory file","error")}},[V,t]),ye=a.useCallback(async()=>{try{await re(),t("Memory saved","success")}catch{t("Failed to save memory","error")}},[re,t]),ge=a.useCallback(async()=>{if(!K)return;const s={};n.memoryEnabled!==c.memoryEnabled&&(s.memoryEnabled=n.memoryEnabled),n.memoryAutoSummarizeEnabled!==c.memoryAutoSummarizeEnabled&&(s.memoryAutoSummarizeEnabled=n.memoryAutoSummarizeEnabled),n.memoryAutoSummarizeThresholdChars!==c.memoryAutoSummarizeThresholdChars&&(s.memoryAutoSummarizeThresholdChars=n.memoryAutoSummarizeThresholdChars),n.memoryAutoSummarizeSchedule!==c.memoryAutoSummarizeSchedule&&(s.memoryAutoSummarizeSchedule=n.memoryAutoSummarizeSchedule),n.memoryDreamsEnabled!==c.memoryDreamsEnabled&&(s.memoryDreamsEnabled=n.memoryDreamsEnabled),n.memoryDreamsSchedule!==c.memoryDreamsSchedule&&(s.memoryDreamsSchedule=n.memoryDreamsSchedule);try{await se(s),t("Memory settings saved","success")}catch{t("Failed to save memory settings","error")}},[K,n,c,se,t]),pe=a.useCallback(async()=>{try{const s=await $();t(s.qmdAvailable?"qmd installed successfully":"qmd install finished, but qmd is still unavailable",s.qmdAvailable?"success":"info")}catch{t("Failed to install qmd","error")}},[$,t]),xe=a.useCallback(async()=>{F(!0),R(null);try{const s=await Y(Q);R(s),t(s.qmdAvailable?"Memory retrieval test complete":"qmd is not installed; local fallback was used",s.qmdAvailable?"success":"info")}catch{t("Failed to test memory retrieval","error")}finally{F(!1)}},[Q,Y,t]),be=a.useCallback(async()=>{try{await p(k),t("Memory file compacted","success")}catch{t("Failed to compact memory","error")}},[p,k,t]),_=a.useCallback(async()=>{try{const s=await T();t(s.summary,"success")}catch(s){t(s instanceof Error?s.message:"Failed to extract insights","error")}},[T,t]),L=a.useCallback(async()=>{if(h!==null)try{await B(h),S(!1),y(null),t("Insights saved","success")}catch{t("Failed to save insights","error")}},[h,B,t]),fe=a.useCallback(()=>{y(C??""),S(!0)},[C]),ve=a.useCallback(()=>{S(!1),y(null)},[]),O=o?.capabilities?.writable??!1;return e.jsxs("div",{className:"memory-view",children:[e.jsx("div",{className:"memory-view-header",children:e.jsxs("div",{children:[e.jsx("h2",{children:"Memory"}),e.jsx("p",{className:"memory-view-description",children:"Working memory, long-term insights, and engine status"})]})}),e.jsxs("div",{className:"memory-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":m==="working",className:`memory-view-tab${m==="working"?" memory-view-tab--active":""}`,onClick:()=>x("working"),"data-testid":"memory-tab-working",children:"Working Memory"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="insights",className:`memory-view-tab${m==="insights"?" memory-view-tab--active":""}`,onClick:()=>x("insights"),"data-testid":"memory-tab-insights",children:"Insights"}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="engines",className:`memory-view-tab${m==="engines"?" memory-view-tab--active":""}`,onClick:()=>x("engines"),"data-testid":"memory-tab-engines",children:"Engines"})]}),e.jsxs("div",{className:"memory-view-content",children:[m==="working"&&e.jsxs("div",{className:"memory-working-tab",children:[!O&&e.jsx("div",{className:"memory-readonly-banner",children:"This memory backend is read-only. Changes cannot be saved."}),W||de?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading memory file…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-editor-section",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryViewFilePath",children:"Memory File"}),e.jsx("select",{id:"memoryViewFilePath",className:"select",value:k,onChange:s=>{he(s.target.value)},disabled:D,children:G.map(s=>e.jsxs("option",{value:s.path,children:[s.label," - ",s.path]},s.path))}),e.jsx("small",{children:D?"Save or discard the current edits before switching files.":"Choose any project memory file to view or edit."})]}),v&&e.jsxs("div",{className:"memory-file-summary",children:[e.jsx("span",{children:He[v.layer]}),e.jsx("strong",{children:v.path}),e.jsxs("small",{children:[v.size.toLocaleString()," bytes · updated ",new Date(v.updatedAt).toLocaleString()]})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:v?.label||"Memory Editor"}),e.jsx("small",{children:ie}),e.jsx("div",{className:"memory-editor-container",children:e.jsx(ke,{content:q,onChange:ue,readOnly:!O,filePath:k})})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsxs("span",{className:"memory-char-count",children:[q.length," characters"]}),e.jsx("div",{style:{flex:1}}),O&&q.length>0&&e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:be,disabled:ae||D,children:ae?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Compacting…"]}):"Compact Selected File"}),D&&O&&e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:ye,disabled:Z,children:Z?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save"})]}),e.jsxs("div",{className:"memory-config-section",children:[e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryDreamsEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryDreamsEnabled",type:"checkbox",checked:n.memoryDreamsEnabled,onChange:s=>{g(r=>({...r,memoryDreamsEnabled:s.target.checked}))},disabled:!n.memoryEnabled||f}),"Process dreams from daily memory"]}),e.jsx("small",{children:"Turns daily notes into DREAMS.md and promotes reusable lessons into MEMORY.md."})]}),n.memoryEnabled&&n.memoryDreamsEnabled&&e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryDreamsSchedule",children:"Dream Schedule"}),e.jsx("input",{id:"memoryDreamsSchedule",type:"text",className:"input",value:n.memoryDreamsSchedule,onChange:s=>{g(r=>({...r,memoryDreamsSchedule:s.target.value}))},placeholder:"0 4 * * *",disabled:f}),e.jsx("small",{children:"Cron expression for dream processing."})]})]}),e.jsxs("div",{className:"memory-settings-group",children:[e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:"memoryAutoSummarizeEnabled",className:"checkbox-label",children:[e.jsx("input",{id:"memoryAutoSummarizeEnabled",type:"checkbox",checked:n.memoryAutoSummarizeEnabled,onChange:s=>{g(r=>({...r,memoryAutoSummarizeEnabled:s.target.checked}))},disabled:!n.memoryEnabled||f}),"Auto-Summarize Memory"]}),e.jsx("small",{children:"Automatically compact memory when it exceeds the threshold on a schedule"})]}),n.memoryEnabled&&n.memoryAutoSummarizeEnabled&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeThresholdChars",children:"Compaction Threshold (chars)"}),e.jsx("input",{id:"memoryAutoSummarizeThresholdChars",type:"number",className:"input",value:n.memoryAutoSummarizeThresholdChars,onChange:s=>{g(r=>({...r,memoryAutoSummarizeThresholdChars:parseInt(s.target.value,10)||5e4}))},min:1e3,disabled:f}),e.jsx("small",{children:"Memory will be compacted when it exceeds this character count"})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"memoryAutoSummarizeSchedule",children:"Schedule (cron)"}),e.jsx("input",{id:"memoryAutoSummarizeSchedule",type:"text",className:"input",value:n.memoryAutoSummarizeSchedule,onChange:s=>{g(r=>({...r,memoryAutoSummarizeSchedule:s.target.value}))},placeholder:"0 3 * * *",disabled:f}),e.jsx("small",{children:"Cron expression for auto-summarize schedule (default: daily at 3 AM)"})]})]})]}),!n.memoryEnabled&&e.jsx("div",{className:"settings-empty-state memory-status-message",children:"Memory is currently disabled. Enable memory tools in Settings to edit these automations."}),K&&e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:ge,disabled:z||f,children:z?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Saving…"]}):"Save Settings"})})]})]})]}),m==="insights"&&e.jsx("div",{className:"memory-insights-tab",children:ee?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading insights…"})]}):j?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"memory-editor-container",children:e.jsx(ke,{content:h??"",onChange:y,readOnly:!1,filePath:".fusion/memory/INSIGHTS.md"})}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:ve,children:"Cancel"}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:L,children:"Save Insights"})]})]}):!ce||I.length===0?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx("p",{children:"No insights extracted yet."}),e.jsx("p",{children:'Insights are automatically extracted from working memory. Click "Extract Now" to trigger extraction manually.'}),e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:_,disabled:u,style:{marginTop:"var(--space-md)"},children:u?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-stats-row",children:[e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:P}),e.jsx("div",{className:"memory-stat-label",children:"Total Insights"})]}),e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",children:I.length}),e.jsx("div",{className:"memory-stat-label",children:"Categories"})]}),M&&e.jsxs("div",{className:"memory-stat-card",children:[e.jsx("div",{className:"memory-stat-value",style:{fontSize:"16px"},children:M}),e.jsx("div",{className:"memory-stat-label",children:"Last Updated"})]})]}),e.jsxs("div",{className:"memory-action-bar",children:[e.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:_,disabled:u,children:u?e.jsxs(e.Fragment,{children:[e.jsx(w,{size:14,className:"animate-spin"}),"Extracting…"]}):"Extract Now"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:fe,children:"Edit Raw"})]}),e.jsx("div",{className:"memory-categories-list",children:I.map(s=>{const r=!A.has(s.key);return e.jsxs("div",{className:"memory-category-section",children:[e.jsxs("div",{className:"memory-category-header",onClick:()=>le(s.key),role:"button",tabIndex:0,onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),le(s.key))},children:[e.jsx("h4",{children:s.name}),e.jsx("span",{className:"memory-category-count",children:s.items.length})]}),r&&e.jsx("div",{className:"memory-category-items",children:s.items.map((l,me)=>e.jsx("div",{className:"memory-insight-item",children:l.replace(/^-\s+/,"").replace(/^\*\s+/,"")},me))})]},s.key)})})]})}),m==="engines"&&e.jsx("div",{className:"memory-engines-tab",children:E||te?e.jsxs("div",{className:"memory-empty-state",children:[e.jsx(w,{size:20,className:"animate-spin"}),e.jsx("span",{children:"Loading engine status…"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"memory-engine-card memory-qmd-card",children:[e.jsx("h3",{children:"QMD Integration"}),o?.qmdAvailable?e.jsxs("div",{className:"memory-engine-status",children:[e.jsx("span",{className:"memory-health-badge memory-health-badge--healthy",children:"Installed"}),e.jsx("span",{className:"memory-char-count",children:"qmd is available on PATH."})]}):e.jsxs("div",{className:"settings-empty-state memory-status-message",children:[e.jsxs("span",{children:["qmd is not installed. Search will use local files. Install indexed retrieval: ",e.jsx("code",{children:o?.qmdInstallCommand||"bun install -g @tobilu/qmd"})]}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:pe,disabled:ne,children:ne?"Installing…":"Install qmd"})]}),e.jsxs("div",{style:{display:"flex",gap:"var(--space-xs)",marginTop:"var(--space-sm)",flexWrap:"wrap"},children:[o?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),o?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),o?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),o?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),e.jsxs("div",{className:"memory-engine-card memory-retrieval-card",children:[e.jsx("h3",{children:"Test Memory Search"}),e.jsxs("div",{className:"memory-retrieval-input-row",children:[e.jsx("input",{type:"text",className:"input",value:Q,onChange:s=>J(s.target.value),placeholder:"Search memory with qmd"}),e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:xe,disabled:X,children:X?"Testing…":"Test Retrieval"})]}),e.jsx("small",{className:"settings-muted",children:"Runs the same qmd-backed memory_search path agents use."}),b&&e.jsxs("div",{className:"memory-test-result",children:[e.jsxs("strong",{children:[b.results.length," result",b.results.length===1?"":"s"," ",'for "',b.query,'"']}),e.jsxs("small",{children:["qmd ",b.qmdAvailable?"available":"missing"," · ",b.usedFallback?"local fallback used":"qmd path used"]}),b.results.length>0?e.jsx("ul",{children:b.results.map((s,r)=>e.jsxs("li",{children:[e.jsxs("span",{children:[s.path,":",s.lineStart]}),e.jsx("p",{children:s.snippet})]},`${s.path}-${s.lineStart}-${r}`))}):e.jsx("small",{children:"No matching memory found."})]})]}),e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Current Backend"}),e.jsx("div",{className:"memory-engine-status",children:e.jsx("span",{style:{fontWeight:500},children:Ze(o?.currentBackend??"unknown")})}),e.jsxs("div",{style:{display:"flex",gap:"var(--space-xs)",marginTop:"var(--space-sm)",flexWrap:"wrap"},children:[o?.capabilities?.readable&&e.jsx("span",{className:"memory-capability-badge",children:"Readable"}),o?.capabilities?.writable&&e.jsx("span",{className:"memory-capability-badge",children:"Writable"}),o?.capabilities?.supportsAtomicWrite&&e.jsx("span",{className:"memory-capability-badge",children:"Atomic Writes"}),o?.capabilities?.persistent&&e.jsx("span",{className:"memory-capability-badge",children:"Persistent"})]})]}),d&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"var(--space-md)"},children:[e.jsx("h3",{children:"Health Status"}),e.jsx("span",{className:`memory-health-badge memory-health-badge--${d.health}`,children:Ke(d.health)})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"var(--space-md)"},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",textTransform:"uppercase",marginBottom:"var(--space-xs)"},children:"Working Memory"}),e.jsxs("div",{style:{fontWeight:500},children:[d.workingMemory.size," chars"]}),e.jsxs("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:[d.workingMemory.sectionCount," sections"]})]}),e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",textTransform:"uppercase",marginBottom:"var(--space-xs)"},children:"Insights Memory"}),e.jsxs("div",{style:{fontWeight:500},children:[d.insightsMemory.size," chars"]}),e.jsxs("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:[d.insightsMemory.insightCount," insights"]})]})]}),e.jsxs("div",{style:{marginTop:"var(--space-md)",paddingTop:"var(--space-md)",borderTop:"1px solid var(--border)"},children:[e.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",textTransform:"uppercase",marginBottom:"var(--space-xs)"},children:"Last Extraction"}),e.jsx("div",{style:{fontWeight:500},children:d.extraction.success?e.jsx("span",{style:{color:"var(--color-success)"},children:"Success"}):e.jsx("span",{style:{color:"var(--color-error)"},children:"Failed"})}),e.jsx("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:d.extraction.summary||`${d.extraction.insightCount} insights extracted`})]}),e.jsxs("div",{style:{marginTop:"var(--space-md)",paddingTop:"var(--space-md)",borderTop:"1px solid var(--border)"},children:[e.jsx("div",{style:{fontSize:"12px",color:"var(--text-muted)",textTransform:"uppercase",marginBottom:"var(--space-xs)"},children:"Pruning"}),e.jsx("div",{style:{fontWeight:500},children:d.pruning.applied?e.jsx("span",{style:{color:"var(--color-warning)"},children:"Applied"}):e.jsx("span",{style:{color:"var(--text-muted)"},children:"Not needed"})}),d.pruning.applied&&e.jsx("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:d.pruning.reason})]})]}),d&&d.checks.length>0&&e.jsxs("div",{className:"memory-engine-card",children:[e.jsx("h3",{children:"Audit Checks"}),e.jsx("div",{children:d.checks.map(s=>e.jsxs("div",{className:"memory-audit-check",children:[e.jsx("span",{className:s.passed?"memory-audit-check-passed":"memory-audit-check-failed",children:s.passed?"✓":"✗"}),e.jsxs("div",{style:{flex:1},children:[e.jsx("div",{style:{fontWeight:500},children:s.name}),e.jsx("div",{style:{fontSize:"13px",color:"var(--text-muted)"},children:s.details})]})]},s.id))})]}),e.jsx("div",{className:"memory-action-bar",children:e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm",onClick:()=>H(),children:"Run Audit"})}),e.jsxs("div",{style:{marginTop:"var(--space-lg)",fontSize:"13px",color:"var(--text-muted)"},children:["Note: Change backend type in"," ",e.jsx("span",{style:{cursor:"pointer",textDecoration:"underline"},onClick:()=>{t("Open Settings → Memory to change backend type","info")},children:"Settings → Memory"})]})]})})]})]})}export{ss as MemoryView};
@@ -0,0 +1 @@
1
+ .nodes-management-overlay{display:flex;flex-direction:column;gap:var(--space-md);height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.nodes-management-overlay__header{display:flex;justify-content:flex-end}.nodes-view{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-sm) var(--space-md) var(--space-xl)}.nodes-view-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-sm)}.nodes-view-title{display:flex;align-items:center;gap:var(--space-sm)}.nodes-view-title h2{margin:0;display:flex;align-items:center;gap:var(--space-sm)}.nodes-view-count{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) / 4)}.nodes-view-actions{display:flex;gap:var(--space-sm)}.nodes-view-close{margin-left:auto}.nodes-view-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-xl) * 5.833),1fr));gap:var(--space-sm)}.nodes-view-stat{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-sm) var(--space-md);display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.nodes-view-stat span{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.nodes-view-stat strong{font-size:calc(var(--space-lg) + var(--space-xs) / 2)}.nodes-view-stat--online strong{color:var(--color-success)}.nodes-view-stat--offline strong{color:var(--color-error)}.nodes-view-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-lg) * 20),1fr));gap:var(--space-md)}.nodes-view-empty{padding:var(--space-xl);border:1px dashed var(--border);border-radius:var(--radius);text-align:center;color:var(--text-muted);display:flex;flex-direction:column;align-items:center;gap:var(--space-md)}.nodes-view-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) / 4)}.node-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),transform var(--transition-fast)}.node-card:hover{border-color:var(--accent);transform:translateY(calc(var(--space-xs) * -.25))}.node-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.node-card--loading{min-height:calc(var(--space-xl) * 9.167);opacity:.55;pointer-events:none}.node-card__header{display:flex;align-items:center;justify-content:space-between}.node-card__title-wrap{display:flex;align-items:center;gap:var(--space-sm)}.node-card__icon{width:calc(var(--space-lg) * 2.125);height:calc(var(--space-lg) * 2.125);border-radius:var(--radius-sm);display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent)}.node-card__name{margin:0;font-size:calc(var(--space-md) + var(--space-xs));line-height:1.25}.node-card__meta-row{margin-top:var(--space-xs);display:flex;align-items:center;gap:var(--space-xs)}.node-card__type-badge{border:1px solid var(--border);border-radius:var(--radius-pill);padding:var(--space-xs) var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.node-card__status{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .75);font-weight:600}.node-card__status-indicator{width:var(--space-sm);height:var(--space-sm);border-radius:50%}.node-card__status--online .node-card__status-indicator{background:var(--color-success)}.node-card__status--offline .node-card__status-indicator,.node-card__status--error .node-card__status-indicator{background:var(--color-error)}.node-card__status--connecting .node-card__status-indicator{background:var(--color-warning)}.node-card__auth-indicator{display:inline-flex;align-items:center;margin-left:var(--space-xs);vertical-align:middle}.node-card__url{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);word-break:break-all}.node-card__metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.node-card__metric{display:flex;flex-direction:column;gap:var(--space-xs)}.node-card__metric-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:uppercase;letter-spacing:.03em}.node-card__metric-value{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.node-card__sync{display:flex;align-items:center;gap:var(--space-xs);margin-top:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.node-card__sync-dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.node-card__sync-time{color:var(--text-muted)}.node-detail-modal__sync-status{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-sm);margin-bottom:var(--space-sm)}.node-detail-modal__sync-dot{width:calc(var(--space-sm) + var(--space-xs) / 2);height:calc(var(--space-sm) + var(--space-xs) / 2);border-radius:50%;flex-shrink:0}.node-detail-modal__sync-diff{color:var(--color-warning);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__sync-actions{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-sm)}.node-detail-modal__sync-error{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);margin-top:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--color-error) 10%,transparent);border:1px solid color-mix(in srgb,var(--color-error) 30%,transparent);border-radius:var(--radius-sm);color:var(--color-error);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__sync-error-dismiss{background:transparent;border:none;color:var(--color-error);cursor:pointer;padding:calc(var(--space-xs) / 2);display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm)}.node-detail-modal__sync-error-dismiss:hover{background:color-mix(in srgb,var(--color-error) 20%,transparent)}.nodes-view-stat--synced strong{color:var(--color-success)}.node-card__actions{display:flex;gap:var(--space-xs);flex-wrap:wrap}.node-card__action{display:inline-flex;align-items:center;gap:var(--space-xs)}.node-card__action--remove{margin-left:auto}.node-card__action--remove:not(.btn-danger){color:var(--color-error);border-color:color-mix(in srgb,var(--color-error) 45%,var(--border))}.node-card__action--remove.is-armed{background:color-mix(in srgb,var(--color-error) 14%,transparent)}.add-node-modal{width:min(calc(var(--space-lg) * 32.5),calc(100vw - (var(--space-lg) * 2)))}.add-node-modal__body{display:flex;flex-direction:column;gap:var(--space-md)}.add-node-modal__description{font-size:calc(var(--space-sm) + var(--space-xs) * .625);color:var(--text-muted);margin-bottom:var(--space-sm);padding:0}.add-node-modal__field{display:flex;flex-direction:column;gap:var(--space-xs)}.add-node-modal__field>span{font-size:calc(var(--space-sm) + var(--space-xs) * .625);font-weight:600;color:var(--text-secondary)}.add-node-modal__field .input{width:100%;padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.add-node-modal__field .input:focus{border-color:var(--accent);box-shadow:var(--focus-ring-strong)}.add-node-modal__field .input[aria-invalid=true]{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 5%,var(--surface))}.add-node-modal__field .input[aria-invalid=true]:focus{box-shadow:var(--glow-danger)}.add-node-modal__hint{font-size:calc(var(--space-sm) + var(--space-xs) * .375);color:var(--text-dim);margin-top:calc(var(--space-xs) / 2)}.add-node-modal__error{margin-top:calc(var(--space-xs) / 2)}.add-node-modal__type-toggle{display:flex;gap:0;border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;background:var(--surface)}.add-node-modal__type-btn{flex:1;padding:calc(var(--space-sm) + var(--space-xs) / 2) var(--space-lg);border:none;background:transparent;color:var(--text-secondary);font-size:calc(var(--space-sm) + var(--space-xs) * .625);font-weight:500;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.add-node-modal__type-btn:hover:not(:disabled){background:color-mix(in srgb,var(--bg) 50%,var(--surface))}.add-node-modal__type-btn:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--accent);z-index:1}.add-node-modal__type-btn.active{background:var(--accent);color:var(--bg)}.add-node-modal__type-btn:disabled{opacity:.6;cursor:not-allowed}.add-node-modal__remote-fields{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--transition-normal);overflow:hidden}.add-node-modal__remote-fields[data-visible=true]{grid-template-rows:1fr}.add-node-modal__remote-fields>*{overflow:hidden}.node-detail-modal{max-width:calc(var(--space-lg) * 53.75);width:min(calc(var(--space-lg) * 53.75),calc(100vw - (var(--space-lg) * 2)))}.node-detail-modal__body{display:flex;flex-direction:column;gap:var(--space-md);max-height:min(72vh,680px);overflow-y:auto}.node-detail-modal__section{border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-md)}.node-detail-modal__section h4{margin:0 0 var(--space-sm) 0}.node-detail-modal__section-header{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.node-detail-modal__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.node-detail-modal__field{display:flex;flex-direction:column;gap:var(--space-xs)}.node-detail-modal__field--full{grid-column:span 2}.node-detail-modal__field span{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.node-detail-modal__edit-actions{margin-top:var(--space-sm);display:flex;gap:var(--space-xs)}.node-detail-modal__project-list{margin:0;padding-left:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.node-detail-modal__project-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.node-detail-modal__project-item code{color:var(--text-muted)}.node-detail-modal__empty{margin:0;color:var(--text-muted)}.node-detail-modal__health-row{display:flex;flex-wrap:wrap;gap:var(--space-md)}.node-detail-modal__actions{justify-content:space-between}.mesh-topology{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);min-height:calc(var(--space-2xl) * 6.25);padding:var(--space-md);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md)}.mesh-topology__svg{width:100%;max-width:calc(var(--space-2xl) * 12.5);height:auto;aspect-ratio:1}.mesh-topology__node{transition:filter var(--transition-fast)}.mesh-topology__node:hover{filter:brightness(1.1)}.mesh-topology__node-circle{stroke:var(--border);stroke-width:calc(var(--space-xs) / 2);transition:fill var(--transition-fast)}.mesh-topology__node-label{font-size:calc(var(--space-sm) + var(--space-xs) * .75);fill:var(--text);font-weight:500}.mesh-topology__node-type-badge{fill:color-mix(in srgb,var(--surface) 75%,var(--bg));stroke:var(--border);stroke-width:calc(var(--space-xs) / 4)}.mesh-topology__node-type-text{font-size:calc(var(--space-sm) + var(--space-xs) / 2);font-weight:700;fill:var(--text-muted);text-transform:uppercase;letter-spacing:.03em}.mesh-topology__link{stroke:var(--border);stroke-width:calc((var(--space-xs) * 3) / 8);stroke-dasharray:var(--space-xs),var(--space-xs);opacity:.6}.mesh-topology__legend{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.mesh-topology__legend-item{display:flex;align-items:center;gap:var(--space-sm)}.mesh-topology__notice{margin:var(--space-md) 0 0;text-align:center;color:var(--text-dim);font-size:calc(var(--space-sm) + var(--space-xs))}.mesh-topology__legend-dot{width:calc(var(--space-sm) + var(--space-xs) / 2);height:calc(var(--space-sm) + var(--space-xs) / 2);border-radius:50%;border:1px solid var(--border)}.mesh-topology--empty{justify-content:center}.mesh-topology__empty-state{text-align:center;color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) / 2)}.connect-node-modal{width:min(calc(var(--space-lg) * 30),calc(100vw - (var(--space-lg) * 2)))}.connect-node-form{display:flex;flex-direction:column;gap:var(--space-md)}.connect-node-form .form-group{padding:0;margin-top:0}.connect-node-form .form-group:last-of-type{margin-bottom:0}.connect-node-field{display:flex;flex-direction:column;gap:var(--space-xs)}.connect-node-field__input{width:100%}.connect-node-field__input[aria-invalid=true]{border-color:var(--color-error);background:color-mix(in srgb,var(--color-error) 5%,var(--surface))}.connect-node-field__input[aria-invalid=true]:focus-visible{border-color:var(--color-error);box-shadow:var(--glow-danger)}.connect-node-url-preview{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--surface) 50%,var(--bg));border-radius:var(--radius-sm);border-left:var(--space-xs) solid var(--accent);font-size:calc(var(--space-sm) + var(--space-xs))}.connect-node-url-preview-label{color:var(--text-muted)}.connect-node-url-preview code{font-family:var(--font-mono);color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs))}.connect-node-actions{display:flex;justify-content:flex-end;gap:var(--space-sm);padding:var(--modal-padding);border-top:1px solid var(--border)}.nodes-view-topology{margin-bottom:var(--space-md)}.nodes-view-section-title{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text);margin:0 0 var(--space-sm)}.nodes-view .node-status-indicator{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .625)}.nodes-view .node-status-indicator__label,.nodes-view .node-status-indicator--local{color:var(--text-muted)}.nodes-view .node-status-indicator--remote{color:var(--text)}.nodes-view .node-status-indicator__dot{width:var(--space-sm);height:var(--space-sm);border-radius:50%;position:relative;display:inline-block}.nodes-view .node-status-indicator__dot--online{background:var(--color-success);box-shadow:var(--glow-success)}.nodes-view .node-status-indicator__dot--offline,.nodes-view .node-status-indicator__dot--error{background:var(--color-error)}.nodes-view .node-status-indicator__dot--connecting{background:var(--color-warning);animation:pulse-warning 1.5s ease-in-out infinite}.nodes-view .node-status-indicator__spinner{position:absolute;inset:0;border:calc(var(--space-xs) / 2) solid transparent;border-top-color:currentColor;border-radius:50%;animation:spin 1s linear infinite}.nodes-view .node-status-indicator__name{font-weight:500}.nodes-view .node-status-indicator__details{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}@keyframes pulse-warning{0%,to{opacity:1;box-shadow:var(--glow-warning)}50%{opacity:.6;box-shadow:0 0 calc(var(--space-sm) + var(--space-xs)) var(--color-warning)}}@media(max-width:768px){.nodes-view{padding-inline:var(--space-sm)}.nodes-view-grid,.node-card__metrics,.node-detail-modal__grid{grid-template-columns:1fr}.node-detail-modal__field--full{grid-column:span 1}.add-node-modal{width:calc(100vw - (var(--space-md) * 2))}.add-node-modal__type-toggle{width:100%}.add-node-modal__type-btn{flex:1;padding:var(--space-md) var(--space-lg)}.add-node-modal__field input{min-height:calc(var(--space-2xl) + var(--space-md))}.add-node-modal__remote-fields{transition:none}.connect-node-modal{width:calc(100vw - (var(--space-md) * 2))}.connect-node-field__input{min-height:calc(var(--space-2xl) + var(--space-md))}.nodes-view-header{padding:var(--space-sm) var(--space-md);flex-wrap:wrap;gap:var(--space-sm)}.nodes-view-title h2{font-size:calc(var(--space-md) + var(--space-xs))}.nodes-view-title h2 svg{flex-shrink:0}.nodes-view-count{font-size:calc(var(--space-sm) + var(--space-xs))}.nodes-view-actions{flex-wrap:wrap;gap:var(--space-sm);width:100%;justify-content:flex-end}.nodes-view-close{min-height:calc(var(--space-xl) + var(--space-md));min-width:calc(var(--space-xl) + var(--space-md))}.nodes-view-actions .btn{min-height:calc(var(--space-xl) + var(--space-md))}.nodes-view-stats{grid-template-columns:repeat(2,1fr);gap:var(--space-sm)}.nodes-view-stat{padding:var(--space-xs) var(--space-sm)}.nodes-view-stat span{font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.nodes-view-stat strong{font-size:calc(var(--space-md) + var(--space-xs) / 2)}.nodes-view-empty{padding:var(--space-xl) var(--space-md);text-align:center}.nodes-view-error{padding:var(--space-md);margin:var(--space-md) 0}.nodes-view-topology{padding:var(--space-sm) 0}.nodes-view-section-title{font-size:calc(var(--space-md) + var(--space-xs) / 4)}}.settings-sync-log{display:flex;flex-direction:column;gap:var(--space-sm)}.settings-sync-log__header{display:flex;align-items:center;gap:var(--space-xs);cursor:pointer;padding:var(--space-xs) 0;border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text);font:inherit;text-align:left;transition:background-color var(--transition-fast)}.settings-sync-log__header:hover{background:var(--surface-hover)}.settings-sync-log__header:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:var(--surface-hover)}.settings-sync-log__chevron{transform:rotate(0);transition:transform var(--transition-fast)}.settings-sync-log__chevron--expanded{transform:rotate(180deg)}.settings-sync-log__filters{display:flex;gap:var(--space-sm);align-items:center;flex-wrap:wrap}.settings-sync-log__filters label{display:flex;align-items:center;gap:var(--space-xs);font-size:12px;color:var(--text-muted)}.settings-sync-log__filters select{font-size:12px;padding:4px 8px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text)}.settings-sync-log__filters select:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.settings-sync-log__list{display:flex;flex-direction:column}.settings-sync-log__entry{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-xs) 0;border-bottom:1px solid var(--border)}.settings-sync-log__entry:last-child{border-bottom:none}.settings-sync-log__entry-timestamp{font-size:12px;color:var(--text-muted);min-width:140px}.settings-sync-log__entry-direction{display:flex;align-items:center;color:var(--text-muted)}.settings-sync-log__entry-result{display:inline-flex;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:500}.settings-sync-log__badge--success{background:color-mix(in srgb,var(--color-success, #2da44e) 14%,transparent);color:var(--color-success, #2da44e)}.settings-sync-log__badge--conflict{background:color-mix(in srgb,#d29922 14%,transparent);color:#d29922}.settings-sync-log__badge--error{background:color-mix(in srgb,var(--color-error, #cf222e) 14%,transparent);color:var(--color-error, #cf222e)}.settings-sync-log__entry-node{font-weight:500;font-size:12px}.settings-sync-log__entry-details{font-size:12px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.settings-sync-log__empty{text-align:center;color:var(--text-muted);padding:var(--space-md);font-size:13px}.project-node-selector{display:flex;flex-direction:column;gap:6px}.project-node-selector__label{color:var(--text-muted);font-size:12px}.project-node-selector select{width:100%;max-width:320px}.project-node-selector__option--dim{color:var(--text-muted)}.node-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--accent) 14%,transparent);border:1px solid color-mix(in srgb,var(--accent) 36%,transparent);color:var(--text-muted);font-size:11px;width:fit-content;margin-top:4px}@media(max-width:768px){.settings-sync-conflict-modal__diff-panel{grid-template-columns:1fr}}.settings-sync-conflict-modal{max-width:860px;width:min(860px,calc(100vw - 32px))}.settings-sync-conflict-modal__conflict-list{display:flex;flex-direction:column;gap:var(--space-md);max-height:min(50vh,400px);overflow-y:auto}.settings-sync-conflict-modal__conflict-item{border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-md)}.settings-sync-conflict-modal__key{font-weight:600;font-family:monospace;margin-bottom:var(--space-sm)}.settings-sync-conflict-modal__diff-panel{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-sm)}.settings-sync-conflict-modal__diff-side{border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.settings-sync-conflict-modal__diff-label{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding:4px 8px;border-bottom:1px solid var(--border);background:var(--surface)}.settings-sync-conflict-modal__diff-content{padding:var(--space-xs) var(--space-sm);white-space:pre;font-family:monospace;font-size:12px;line-height:1.5;overflow-x:auto}.settings-sync-conflict-modal__resolution{display:flex;gap:var(--space-md);align-items:center}.settings-sync-conflict-modal__resolution label{display:flex;align-items:center;gap:var(--space-xs);cursor:pointer}.settings-sync-conflict-modal__resolution input[type=radio]{cursor:pointer}.settings-sync-conflict-modal__manual-input{width:100%;font-family:monospace;font-size:12px;min-height:80px;margin-top:var(--space-xs);padding:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);resize:vertical}.settings-sync-conflict-modal__manual-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.settings-sync-conflict-modal__bulk-actions{display:flex;gap:var(--space-xs);padding-top:var(--space-sm);border-top:1px solid var(--border)}.settings-sync-conflict-modal__footer{display:flex;justify-content:flex-end;gap:var(--space-xs)}
@@ -1,4 +1,4 @@
1
- import{r as n,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Y,al as xe,am as ge,an as pe,ao as je,ap as Z,aq as Q,A as T,ar as _e,I as Ne,K as be,as as ee,at as ve,au as Ce,X as B,av as ke,aw as Se,R as J,w as G,G as we}from"./index-y194HxzU.js";import{U as se}from"./upload-DHBQat92.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as n,j as e}from"./vendor-react-K0fH_qHe.js";import{c as Y,al as xe,am as ge,an as pe,ao as je,ap as Z,aq as Q,A as T,ar as _e,I as Ne,K as be,as as ee,at as ve,au as Ce,X as B,av as ke,aw as Se,R as J,w as G,G as we}from"./index-CikysL-d.js";import{U as se}from"./upload-BDvpReDO.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{r as n,j as e}from"./vendor-react-K0fH_qHe.js";import{c as A,bX as H,bY as J,bZ as Q,R as $,bN as y,w as V,K as T,D as ee,I as se,b_ as L,F as D,b$ as ae,c0 as te,c1 as _,X as ie}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as n,j as e}from"./vendor-react-K0fH_qHe.js";import{c as A,bX as H,bY as J,bZ as Q,R as $,bN as y,w as V,K as T,D as ee,I as se,b_ as L,F as D,b$ as ae,c0 as te,c1 as _,X as ie}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{bL as H,s as J,X as k,ai as K,w as D,bM as O,I as A,R as Q,bN as X,ar as G,bO as W,bP as Y,bQ as Z,bR as T,bS as ee,bT as se,bU as te}from"./index-y194HxzU.js";import{D as ne}from"./DirectoryPicker-CcdN1Zs7.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-kO5Hsk66.js";const j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function oe({addToast:r,projectId:d}){const[N,h]=o.useState([]),[S,w]=o.useState(!0),[U,f]=o.useState(!1),[b,v]=o.useState(""),[C,P]=o.useState(!1),[x,$]=o.useState(null),[a,y]=o.useState(null),[i,g]=o.useState({}),[V,R]=o.useState(!1),p=o.useCallback(async()=>{try{w(!0);const s=await H(d);h(s)}catch(s){r(`Failed to load plugins: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},[d,r]);o.useEffect(()=>{p()},[p]);const B=o.useRef([]);B.current=N,o.useEffect(()=>{const s=d?`?projectId=${encodeURIComponent(d)}`:"",t=m=>{try{const n=JSON.parse(m.data);if(d&&n.projectId&&n.projectId!==d)return;switch(n.transition){case"installing":case"enabled":case"disabled":case"settings-updated":h(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],enabled:n.enabled,state:n.state,settings:n.settings,error:n.error},l}else return p(),c});break;case"uninstalled":h(c=>c.filter(u=>u.id!==n.pluginId));break;case"error":h(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],state:n.state,error:n.error},l}return c});break}}catch{}};return J(`/api/events${s}`,{events:{"plugin:lifecycle":t},onReconnect:()=>{p()}})},[d,p]);const E=async()=>{if(!b.trim()){r("Please enter a plugin path","error");return}try{P(!0),await se({path:b},d),r("Plugin installed successfully","success"),f(!1),v(""),await p()}catch(s){r(`Failed to install plugin: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},I=async s=>{try{await T(s.id,d),r(`${s.name} enabled`,"success"),await p()}catch(t){r(`Failed to enable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},z=async s=>{try{await Z(s.id,d),r(`${s.name} disabled`,"success"),await p()}catch(t){r(`Failed to disable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},L=async s=>{try{$(s.id),await Y(s.id,d),r(`${s.name} reloaded`,"success"),await p()}catch(t){r(`Failed to reload plugin: ${t instanceof Error?t.message:String(t)}`,"error")}finally{$(null)}},q=async s=>{if(confirm(`Are you sure you want to uninstall "${s.name}"?`))try{await ee(s.id,d),r(`${s.name} uninstalled`,"success"),await p(),y(null)}catch(t){r(`Failed to uninstall plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},M=async s=>{y(s);try{R(!0);const t=await te(s.id,d);g(t)}catch{g({})}finally{R(!1)}},_=async()=>{if(a)try{await W(a.id,i,d),r("Settings saved","success")}catch(s){r(`Failed to save settings: ${s instanceof Error?s.message:String(s)}`,"error")}};return a?e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:e.jsx(k,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsx("h3",{children:a.name}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[a.state]||j.installed},children:a.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[a.description&&e.jsx("p",{className:"plugin-description",children:a.description}),a.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Author:"}),a.author]}),a.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:"Homepage:"}),e.jsxs("a",{href:a.homepage,target:"_blank",rel:"noopener noreferrer",children:[a.homepage,e.jsx(K,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Version:"}),a.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h4",{className:"settings-section-heading",children:"Settings"}),V?e.jsx("p",{className:"text-muted",children:"Loading..."}):a.settingsSchema&&Object.keys(a.settingsSchema).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(a.settingsSchema).map(([s,t])=>{const m=`setting-${s}-help`;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${s}`,children:[t.label||s,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{type:"text",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{id:`setting-${s}`,rows:4,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="password"&&e.jsx("input",{type:"password",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="number"&&e.jsx("input",{type:"number",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:Number(n.target.value)}),"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:i[s]??!1,onChange:n=>g({...i,[s]:n.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),"aria-describedby":t.description&&!t.required?m:void 0,children:[e.jsx("option",{value:"",children:"Select..."}),t.enumValues?.map(n=>e.jsx("option",{value:n,children:n},n))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[i[s]?.map((n,c)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{type:t.itemType==="number"?"number":"text",value:n??"",onChange:u=>{const l=u.target.value,F=[...i[s]||[]];F[c]=t.itemType==="number"?Number(l):l,g({...i,[s]:F})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const l=[...i[s]||[]];l.splice(c,1),g({...i,[s]:l})},"aria-label":"Remove item",children:e.jsx(k,{size:14})})]},c)),e.jsxs("button",{className:"btn-secondary",onClick:()=>{const n=i[s]||[],c=t.itemType==="number"?0:"";g({...i,[s]:[...n,c]})},children:[e.jsx(D,{size:14})," Add Item"]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:m,className:"form-help",children:t.description})]},s)}),e.jsx("button",{className:"btn-primary",onClick:_,children:"Save Settings"})]}):e.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),e.jsxs("div",{className:"plugin-detail-actions",children:[a.state==="started"&&e.jsxs("button",{className:"btn-secondary",onClick:()=>L(a),disabled:x===a.id,children:[e.jsx(O,{size:14,className:x===a.id?"spin":""}),x===a.id?"Reloading...":"Reload"]}),a.enabled?e.jsx("button",{className:"btn-secondary",onClick:()=>z(a),children:"Disable"}):e.jsx("button",{className:"btn-primary",onClick:()=>I(a),children:"Enable"}),e.jsxs("button",{className:"btn-danger",onClick:()=>q(a),children:[e.jsx(A,{size:14})," Uninstall"]})]})]})]}):e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsx("div",{className:"plugin-manager-header",children:e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsx("button",{className:"btn-icon",onClick:p,title:"Refresh",children:e.jsx(Q,{size:16,className:S?"spin":""})}),e.jsxs("button",{className:"btn-primary",onClick:()=>f(!0),children:[e.jsx(D,{size:14})," Install"]})]})}),U&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",e.jsx("code",{children:"manifest.json"}),") or a built ",e.jsx("code",{children:"dist"})," directory."]}),e.jsx(ne,{value:b,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),E())}}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn-primary",onClick:E,disabled:C||!b.trim(),children:C?"Installing...":"Install Plugin"}),e.jsx("button",{className:"btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?e.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):N.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(X,{size:32,className:"text-muted"}),e.jsx("p",{children:"No plugins installed."}),e.jsx("p",{className:"text-muted",children:"Install a plugin to get started."})]}):e.jsx("div",{className:"plugin-list",children:N.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsxs("div",{className:"plugin-info",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[s.state]||j.installed},children:s.state})]}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>L(s),disabled:x===s.id,title:"Reload",children:e.jsx(O,{size:14,className:x===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?z(s):I(s)}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>M(s),title:"Settings",children:e.jsx(G,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>q(s),title:"Uninstall",children:e.jsx(A,{size:14})})]})]},s.id))})]})}export{oe as PluginManager,j as STATE_COLORS};
1
+ import{r as o,j as e}from"./vendor-react-K0fH_qHe.js";import{bL as H,s as J,X as k,ai as K,w as D,bM as O,I as A,R as Q,bN as X,ar as G,bO as W,bP as Y,bQ as Z,bR as T,bS as ee,bT as se,bU as te}from"./index-CikysL-d.js";import{D as ne}from"./DirectoryPicker-BMJIT7HD.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-BVDq27HP.js";const j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function oe({addToast:r,projectId:d}){const[N,h]=o.useState([]),[S,w]=o.useState(!0),[U,f]=o.useState(!1),[b,v]=o.useState(""),[C,P]=o.useState(!1),[x,$]=o.useState(null),[a,y]=o.useState(null),[i,g]=o.useState({}),[V,R]=o.useState(!1),p=o.useCallback(async()=>{try{w(!0);const s=await H(d);h(s)}catch(s){r(`Failed to load plugins: ${s instanceof Error?s.message:String(s)}`,"error")}finally{w(!1)}},[d,r]);o.useEffect(()=>{p()},[p]);const B=o.useRef([]);B.current=N,o.useEffect(()=>{const s=d?`?projectId=${encodeURIComponent(d)}`:"",t=m=>{try{const n=JSON.parse(m.data);if(d&&n.projectId&&n.projectId!==d)return;switch(n.transition){case"installing":case"enabled":case"disabled":case"settings-updated":h(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],enabled:n.enabled,state:n.state,settings:n.settings,error:n.error},l}else return p(),c});break;case"uninstalled":h(c=>c.filter(u=>u.id!==n.pluginId));break;case"error":h(c=>{const u=c.findIndex(l=>l.id===n.pluginId);if(u>=0){const l=[...c];return l[u]={...l[u],state:n.state,error:n.error},l}return c});break}}catch{}};return J(`/api/events${s}`,{events:{"plugin:lifecycle":t},onReconnect:()=>{p()}})},[d,p]);const E=async()=>{if(!b.trim()){r("Please enter a plugin path","error");return}try{P(!0),await se({path:b},d),r("Plugin installed successfully","success"),f(!1),v(""),await p()}catch(s){r(`Failed to install plugin: ${s instanceof Error?s.message:String(s)}`,"error")}finally{P(!1)}},I=async s=>{try{await T(s.id,d),r(`${s.name} enabled`,"success"),await p()}catch(t){r(`Failed to enable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},z=async s=>{try{await Z(s.id,d),r(`${s.name} disabled`,"success"),await p()}catch(t){r(`Failed to disable plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},L=async s=>{try{$(s.id),await Y(s.id,d),r(`${s.name} reloaded`,"success"),await p()}catch(t){r(`Failed to reload plugin: ${t instanceof Error?t.message:String(t)}`,"error")}finally{$(null)}},q=async s=>{if(confirm(`Are you sure you want to uninstall "${s.name}"?`))try{await ee(s.id,d),r(`${s.name} uninstalled`,"success"),await p(),y(null)}catch(t){r(`Failed to uninstall plugin: ${t instanceof Error?t.message:String(t)}`,"error")}},M=async s=>{y(s);try{R(!0);const t=await te(s.id,d);g(t)}catch{g({})}finally{R(!1)}},_=async()=>{if(a)try{await W(a.id,i,d),r("Settings saved","success")}catch(s){r(`Failed to save settings: ${s instanceof Error?s.message:String(s)}`,"error")}};return a?e.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[e.jsxs("div",{className:"plugin-manager-detail-header",children:[e.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:e.jsx(k,{size:16})}),e.jsxs("div",{className:"plugin-detail-title",children:[e.jsx("h3",{children:a.name}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[a.state]||j.installed},children:a.state})]})]}),e.jsxs("div",{className:"plugin-detail-content",children:[e.jsxs("div",{className:"plugin-detail-card",children:[a.description&&e.jsx("p",{className:"plugin-description",children:a.description}),a.author&&e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Author:"}),a.author]}),a.homepage&&e.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[e.jsx("span",{className:"text-muted",children:"Homepage:"}),e.jsxs("a",{href:a.homepage,target:"_blank",rel:"noopener noreferrer",children:[a.homepage,e.jsx(K,{size:12})]})]}),e.jsxs("p",{className:"plugin-detail-meta-row",children:[e.jsx("span",{className:"text-muted",children:"Version:"}),a.version]})]}),e.jsxs("div",{className:"plugin-detail-card",children:[e.jsx("h4",{className:"settings-section-heading",children:"Settings"}),V?e.jsx("p",{className:"text-muted",children:"Loading..."}):a.settingsSchema&&Object.keys(a.settingsSchema).length>0?e.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(a.settingsSchema).map(([s,t])=>{const m=`setting-${s}-help`;return e.jsxs("div",{className:"form-group",children:[e.jsxs("label",{htmlFor:`setting-${s}`,children:[t.label||s,t.required&&" *"]}),t.type==="string"&&!t.multiline&&e.jsx("input",{type:"text",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="string"&&t.multiline&&e.jsx("textarea",{id:`setting-${s}`,rows:4,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="password"&&e.jsx("input",{type:"password",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),placeholder:t.description,"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="number"&&e.jsx("input",{type:"number",id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:Number(n.target.value)}),"aria-describedby":t.description&&!t.required?m:void 0}),t.type==="boolean"&&e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:i[s]??!1,onChange:n=>g({...i,[s]:n.target.checked})}),t.description]}),t.type==="enum"&&e.jsxs("select",{id:`setting-${s}`,value:i[s]??"",onChange:n=>g({...i,[s]:n.target.value}),"aria-describedby":t.description&&!t.required?m:void 0,children:[e.jsx("option",{value:"",children:"Select..."}),t.enumValues?.map(n=>e.jsx("option",{value:n,children:n},n))]}),t.type==="array"&&e.jsxs("div",{className:"plugin-settings-array",children:[i[s]?.map((n,c)=>e.jsxs("div",{className:"plugin-settings-array-item",children:[e.jsx("input",{type:t.itemType==="number"?"number":"text",value:n??"",onChange:u=>{const l=u.target.value,F=[...i[s]||[]];F[c]=t.itemType==="number"?Number(l):l,g({...i,[s]:F})}}),e.jsx("button",{className:"btn-icon",onClick:()=>{const l=[...i[s]||[]];l.splice(c,1),g({...i,[s]:l})},"aria-label":"Remove item",children:e.jsx(k,{size:14})})]},c)),e.jsxs("button",{className:"btn-secondary",onClick:()=>{const n=i[s]||[],c=t.itemType==="number"?0:"";g({...i,[s]:[...n,c]})},children:[e.jsx(D,{size:14})," Add Item"]})]}),t.description&&!t.required&&!t.multiline&&e.jsx("span",{id:m,className:"form-help",children:t.description})]},s)}),e.jsx("button",{className:"btn-primary",onClick:_,children:"Save Settings"})]}):e.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),e.jsxs("div",{className:"plugin-detail-actions",children:[a.state==="started"&&e.jsxs("button",{className:"btn-secondary",onClick:()=>L(a),disabled:x===a.id,children:[e.jsx(O,{size:14,className:x===a.id?"spin":""}),x===a.id?"Reloading...":"Reload"]}),a.enabled?e.jsx("button",{className:"btn-secondary",onClick:()=>z(a),children:"Disable"}):e.jsx("button",{className:"btn-primary",onClick:()=>I(a),children:"Enable"}),e.jsxs("button",{className:"btn-danger",onClick:()=>q(a),children:[e.jsx(A,{size:14})," Uninstall"]})]})]})]}):e.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[e.jsx("div",{className:"plugin-manager-header",children:e.jsxs("div",{className:"plugin-manager-actions",children:[e.jsx("button",{className:"btn-icon",onClick:p,title:"Refresh",children:e.jsx(Q,{size:16,className:S?"spin":""})}),e.jsxs("button",{className:"btn-primary",onClick:()=>f(!0),children:[e.jsx(D,{size:14})," Install"]})]})}),U&&e.jsxs("div",{className:"plugin-install-form",children:[e.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",e.jsx("code",{children:"manifest.json"}),") or a built ",e.jsx("code",{children:"dist"})," directory."]}),e.jsx(ne,{value:b,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),E())}}),e.jsxs("div",{className:"plugin-install-actions",children:[e.jsx("button",{className:"btn-primary",onClick:E,disabled:C||!b.trim(),children:C?"Installing...":"Install Plugin"}),e.jsx("button",{className:"btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?e.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):N.length===0?e.jsxs("div",{className:"settings-empty-state",children:[e.jsx(X,{size:32,className:"text-muted"}),e.jsx("p",{children:"No plugins installed."}),e.jsx("p",{className:"text-muted",children:"Install a plugin to get started."})]}):e.jsx("div",{className:"plugin-list",children:N.map(s=>e.jsxs("div",{className:"plugin-item",children:[e.jsxs("div",{className:"plugin-info",children:[e.jsx("span",{className:"plugin-name",children:s.name}),e.jsxs("span",{className:"plugin-version text-muted",children:["v",s.version]}),e.jsx("span",{className:"plugin-state-badge",style:{color:j[s.state]||j.installed},children:s.state})]}),e.jsxs("div",{className:"plugin-actions",children:[s.state==="started"&&e.jsx("button",{className:"btn-icon",onClick:()=>L(s),disabled:x===s.id,title:"Reload",children:e.jsx(O,{size:14,className:x===s.id?"spin":""})}),e.jsxs("label",{className:"toggle-switch",children:[e.jsx("input",{type:"checkbox",checked:s.enabled,onChange:()=>s.enabled?z(s):I(s)}),e.jsx("span",{className:"toggle-slider"})]}),e.jsx("button",{className:"btn-icon",onClick:()=>M(s),title:"Settings",children:e.jsx(G,{size:14})}),e.jsx("button",{className:"btn-icon",onClick:()=>q(s),title:"Uninstall",children:e.jsx(A,{size:14})})]})]},s.id))})]})}export{oe as PluginManager,j as STATE_COLORS};
@@ -1,4 +1,4 @@
1
- import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as St,aO as Et,aP as kt,aQ as Ft,aR as Dt,aS as Mt,aT as tt,aU as Rt,aV as It,aW as at,aX as $t,aY as zt,aZ as At,a_ as Ot,a$ as Bt,b0 as Ht,b1 as Gt,b2 as Tt,aG as Pt,w as Ae,b3 as me,X as ae,at as Ee,I as Le,a7 as Lt,ad as ut,as as rt,a4 as Vt,b4 as Ye,b5 as Ut}from"./index-y194HxzU.js";import"./vendor-xterm-DzcZoU0P.js";/**
1
+ import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as St,aO as Et,aP as kt,aQ as Ft,aR as Dt,aS as Mt,aT as tt,aU as Rt,aV as It,aW as at,aX as $t,aY as zt,aZ as At,a_ as Ot,a$ as Bt,b0 as Ht,b1 as Gt,b2 as Tt,aG as Pt,w as Ae,b3 as me,X as ae,at as Ee,I as Le,a7 as Lt,ad as ut,as as rt,a4 as Vt,b4 as Ye,b5 as Ut}from"./index-CikysL-d.js";import"./vendor-xterm-DzcZoU0P.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.