@runfusion/fusion 0.9.4 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/bin.js +7418 -5792
  2. package/dist/client/assets/AgentDetailView-B5tq9ius.css +1 -0
  3. package/dist/client/assets/AgentDetailView-DQBjJSPJ.js +18 -0
  4. package/dist/client/assets/AgentsView-DlA0yHBg.js +522 -0
  5. package/dist/client/assets/AgentsView-xm_3NO4M.css +1 -0
  6. package/dist/client/assets/ChatView-DK5CmiAk.js +1 -0
  7. package/dist/client/assets/{DevServerView-LOrDrAYm.js → DevServerView-BVixhlF0.js} +1 -1
  8. package/dist/client/assets/{DirectoryPicker-Bgp6PCbu.js → DirectoryPicker-tvBgHxa7.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-CNbnZ7Q3.js → DocumentsView-DVw_wT6V.js} +1 -1
  10. package/dist/client/assets/{InsightsView-CmJwV-ZC.js → InsightsView-G3MZhwSx.js} +2 -2
  11. package/dist/client/assets/{MemoryView-Bwi5p79s.js → MemoryView-Bl9gx2Dw.js} +2 -2
  12. package/dist/client/assets/{NodesView-1pZii99I.js → NodesView-dwVhD4V2.js} +4 -4
  13. package/dist/client/assets/{PiExtensionsManager-CokhM-MB.js → PiExtensionsManager-CEHp6_Mj.js} +3 -3
  14. package/dist/client/assets/PluginManager-Dx0mcwat.js +1 -0
  15. package/dist/client/assets/ResearchView-BvlLYC_1.js +1 -0
  16. package/dist/client/assets/{RoadmapsView-BTo3BT0I.js → RoadmapsView-DdYXssP2.js} +2 -2
  17. package/dist/client/assets/SettingsModal-Bgjg_4CD.js +31 -0
  18. package/dist/client/assets/{SettingsModal-D5slUUsC.js → SettingsModal-CGWipm3s.js} +1 -1
  19. package/dist/client/assets/SettingsModal-CriZP5Lp.css +1 -0
  20. package/dist/client/assets/{SetupWizardModal-1qSn8Yl0.js → SetupWizardModal-CKsJduYM.js} +1 -1
  21. package/dist/client/assets/{SkillsView-CY3I5OYc.js → SkillsView-C4Tz7CxC.js} +1 -1
  22. package/dist/client/assets/{TodoView-B1GDwwhR.js → TodoView-ByXJ90yL.js} +2 -2
  23. package/dist/client/assets/{folder-open-DPESt6bg.js → folder-open-CxOUgHDf.js} +1 -1
  24. package/dist/client/assets/index-BCz4ye4p.css +1 -0
  25. package/dist/client/assets/index-D7gT6mCr.js +656 -0
  26. package/dist/client/assets/{list-checks-D7D9kx7Y.js → list-checks--sf9u9ox.js} +1 -1
  27. package/dist/client/assets/{star-C59_6aNu.js → star-CF1f2iPu.js} +1 -1
  28. package/dist/client/assets/{upload-1I0eQddJ.js → upload-rOBd4OhB.js} +1 -1
  29. package/dist/client/assets/{users-DH50eBCX.js → users-De-vFat1.js} +1 -1
  30. package/dist/client/fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
  31. package/dist/client/index.html +16 -2
  32. package/dist/client/version.json +1 -1
  33. package/dist/extension.js +20717 -19343
  34. package/dist/pi-claude-cli/index.ts +31 -5
  35. package/dist/pi-claude-cli/package.json +1 -1
  36. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +90 -0
  37. package/dist/pi-claude-cli/src/__tests__/provider.test.ts +13 -3
  38. package/dist/pi-claude-cli/src/process-manager.ts +65 -0
  39. package/package.json +1 -1
  40. package/skill/fusion/SKILL.md +2 -0
  41. package/skill/fusion/references/engine-tools.md +4 -0
  42. package/skill/fusion/references/extension-tools.md +76 -0
  43. package/skill/fusion/references/fusion-capabilities.md +8 -0
  44. package/dist/client/assets/AgentDetailView-5W1q48YS.js +0 -18
  45. package/dist/client/assets/AgentDetailView-DIBOY8V-.css +0 -1
  46. package/dist/client/assets/AgentsView-DcEnemu0.js +0 -522
  47. package/dist/client/assets/AgentsView-MotzGhZJ.css +0 -1
  48. package/dist/client/assets/ChatView-CTc6mP8y.js +0 -1
  49. package/dist/client/assets/PluginManager-cHaGKMgY.js +0 -1
  50. package/dist/client/assets/ResearchView-CQDI2y7Q.js +0 -1
  51. package/dist/client/assets/SettingsModal-EEQwF0Ql.js +0 -31
  52. package/dist/client/assets/SettingsModal-FfIAhzcJ.css +0 -1
  53. package/dist/client/assets/index-2_pvFDiN.css +0 -1
  54. package/dist/client/assets/index-DNIrnlpO.js +0 -656
@@ -1 +0,0 @@
1
- .active-agents-panel{margin-top:var(--space-xl);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);cursor:pointer;transition:background .15s,border-color .15s}.live-agent-card:hover{background:var(--bg-hover);border-color:var(--border-strong, var(--border))}.live-agent-card:focus-visible{outline:2px solid var(--accent, var(--color-primary));outline-offset:2px}.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{display:flex;flex-direction:column;gap:var(--space-xs)}.live-agent-card-status{font-style:normal;font-weight:500;color:var(--text-primary);opacity:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-status-sub{font-style:italic;opacity:.6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.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}.live-agent-card-footer-actions{display:flex;align-items:center;gap:var(--space-sm)}.live-agent-card-footer-meta{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;min-width:0}.live-agent-card-next-heartbeat{color:var(--text-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-logs-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);font-size:11px;color:var(--text-secondary);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.live-agent-card-logs-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong, var(--border))}@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)));max-height:calc(100dvh - (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-runtime-mode-toggle{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.agent-runtime-mode-option{position:relative;margin:0}.agent-runtime-mode-option input{position:absolute;opacity:0;pointer-events:none}.agent-runtime-mode-option span{display:flex;align-items:center;justify-content:center;min-height:calc(var(--space-xl) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;padding:var(--space-sm) var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-runtime-mode-option span:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-runtime-mode-option input:focus-visible+span{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-runtime-mode-option--active span{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.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}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch;justify-content:stretch}.agent-dialog{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;border-left:0;border-right:0}.agent-dialog-header{padding:calc(var(--space-md) + env(safe-area-inset-top)) var(--space-md) var(--space-md)}.agent-dialog-footer{padding:var(--space-md) var(--space-md) calc(var(--space-md) + env(safe-area-inset-bottom))}.agent-dialog-steps{padding:var(--space-sm) var(--space-md);overflow-x:auto;flex-wrap:nowrap;flex-shrink:0}.agent-dialog-header,.agent-dialog-footer{flex-shrink:0}.agent-dialog-body{padding:var(--space-md);flex:1 1 auto;min-height:0;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.agent-dialog-footer{flex-wrap:wrap;gap:var(--space-xs)}.agent-dialog-footer>.btn{flex:1 1 auto;min-width: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 +0,0 @@
1
- import{r as s,j as t}from"./vendor-react-K0fH_qHe.js";import{j as ze,aG as Mt,g as Tt,aH as At,a as $t,aI as Pt,aJ as Rt,aK as Dt,aL as Et,aM as Ft,aN as Lt,s as _t,aO as It,aP as zt,aQ as Ot,h as Ut,aR as Ht,a7 as Vt,a8 as Gt,S as Bt,N as Xe,D as Ze,ak as Kt,aS as qt,B as Ae,a4 as et,a5 as tt,aT as Jt,aU as Wt,aV as Qt,aW as Yt,aX as Xt,aY as Zt,aZ as st,i as es,u as nt,l as ts}from"./index-DNIrnlpO.js";import"./vendor-xterm-DzcZoU0P.js";const Ie="kb-chat-active-session";function ss(a){const r=a?.toolCalls;if(!Array.isArray(r))return;const c=r.map(l=>{if(!l||typeof l!="object")return null;const o=l,C=typeof o.toolName=="string"?o.toolName:"";if(!C)return null;const M=o.args;return{toolName:C,...M&&typeof M=="object"?{args:M}:{},isError:!!o.isError,result:o.result,status:"completed"}}).filter(l=>l!==null);return c.length>0?c:void 0}function at(a){return{id:a.id,sessionId:a.sessionId,role:a.role,content:a.content,thinkingOutput:a.thinkingOutput,toolCalls:ss(a.metadata),attachments:a.attachments,createdAt:a.createdAt}}function ns(a){const[r,c]=s.useState([]),[l,o]=s.useState(null),[C,M]=s.useState(!0),[R,k]=s.useState([]),[V,I]=s.useState(!1),[p,F]=s.useState(!1),[G,D]=s.useState(""),[E,T]=s.useState(""),[z,A]=s.useState([]),[B,H]=s.useState(""),[se,ne]=s.useState(""),[$,K]=s.useState(!0),[u,w]=s.useState(new Map),x=s.useRef(null),P=s.useRef(!1),O=s.useRef(""),Se=s.useRef(r),W=s.useRef(l),je=s.useRef(p);Se.current=r,W.current=l,je.current=p,s.useEffect(()=>{O.current=B},[B]);const oe=s.useRef(new Set),ae=s.useRef(0),ye=s.useRef(a);ye.current!==a&&(ye.current=a,ae.current++),s.useEffect(()=>{const d=ae.current;ze(void 0,a).then(g=>{if(ae.current!==d)return;const h=new Map;for(const j of g)h.set(j.id,j);w(h)}).catch(()=>{})},[a]);const ie=s.useCallback(async()=>{M(!0);try{const g=[...(await Mt(a)).sessions].sort((h,j)=>new Date(j.updatedAt).getTime()-new Date(h.updatedAt).getTime());c(g)}catch{}finally{M(!1)}},[a]);s.useEffect(()=>{ie()},[ie]);const X=s.useRef(()=>{});s.useEffect(()=>{if(C)return;const d=Tt(Ie,a);d&&r.find(h=>h.id===d)&&X.current(d)},[C,r,a]);const q=s.useCallback(async(d,g)=>{I(!0);try{const h=await At(d,{limit:50,...g},a),j=h.messages.map(at);g?.offset&&g.offset>0?k(Z=>[...j,...Z]):k(j),K(h.messages.length>=50)}catch{}finally{I(!1)}},[a]),re=s.useCallback((d,g)=>{x.current&&(x.current.close(),x.current=null);const h=g??r.find(j=>j.id===d);o(h||null),D(""),T(""),A([]),F(!1),K(!0),d?q(d):k([]),d?$t(Ie,d,a):Pt(Ie,a)},[r,q,a]);X.current=re;const ge=s.useCallback(async d=>{const g=await Rt(d,a);x.current&&(x.current.close(),x.current=null);const h={id:g.session.id,title:g.session.title,agentId:g.session.agentId,status:g.session.status,modelProvider:g.session.modelProvider,modelId:g.session.modelId,createdAt:g.session.createdAt,updatedAt:g.session.updatedAt};return c(j=>[h,...j]),re(h.id,h),k([]),h},[a,re]),fe=s.useCallback(async d=>{await Dt(d,{status:"archived"},a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),de=s.useCallback(async d=>{l?.id===d&&x.current&&(x.current.close(),x.current=null),await Et(d,a),c(g=>g.filter(h=>h.id!==d)),l?.id===d&&(o(null),k([]))},[l,a]),pe=s.useCallback(async()=>{!l||!$||await q(l.id,{offset:R.length})},[l,$,q,R.length]),le=s.useCallback(()=>{l&&(P.current=!0,x.current?.close(),x.current=null,Ft(l.id,a).catch(()=>{}),F(!1),D(""),T(""),A([]))},[l,a]),Q=s.useCallback(()=>{O.current="",H("")},[]),Y=s.useCallback((d,g)=>{if(!l)return;if(p){O.current=d,H(d);return}P.current=!1,x.current&&(x.current.close(),x.current=null);const h=`temp-${Date.now()}`,j={id:h,sessionId:l.id,role:"user",content:d,createdAt:new Date().toISOString()};k(b=>[...b,j]),D(""),T(""),A([]),F(!0);let Z="",U="",L=[];const we={onThinking:b=>{U+=b,T(U)},onText:b=>{Z+=b,D(Z)},onToolStart:b=>{L=[...L,{toolName:b.toolName,args:b.args,isError:!1,status:"running"}],A(L)},onToolEnd:b=>{const f=[...L];for(let S=f.length-1;S>=0;S--){const N=f[S];if(N?.toolName===b.toolName&&N.status==="running"){f[S]={...N,status:"completed",isError:b.isError,result:b.result},L=f,A(f);return}}L=[...f,{toolName:b.toolName,isError:b.isError,result:b.result,status:"completed"}],A(L)},onDone:b=>{const f={id:b.messageId||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:Z,thinkingOutput:U,toolCalls:L.length>0?L:void 0,createdAt:new Date().toISOString()};oe.current.add(f.id),k(N=>[...N,f]),D(""),T(""),A([]),F(!1),x.current=null,setTimeout(()=>{oe.current.delete(f.id)},1e3),ie();const S=O.current.trim();S&&(O.current="",H(""),Y(S))},onError:b=>{if(k(f=>f.filter(S=>S.id!==h)),D(""),T(""),A([]),F(!1),x.current=null,console.error("[useChat] Stream error:",b),!P.current){const f=O.current.trim();f&&(O.current="",H(""),Y(f))}}};x.current=Lt(l.id,d,we,g,a)},[l,p,a,ie]),be=se?r.filter(d=>d.title?.toLowerCase().includes(se.toLowerCase())||d.agentId.toLowerCase().includes(se.toLowerCase())):r;return s.useEffect(()=>{const d=ae.current,g=a?`?projectId=${encodeURIComponent(a)}`:"",h=()=>ae.current!==d,j=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>N.some(m=>m.id===S.id)?N:[S,...N])},Z=f=>{if(h())return;const S=JSON.parse(f.data);c(N=>[...N.map(ce=>ce.id===S.id?S:ce)]),W.current?.id===S.id&&o(S)},U=f=>{if(h())return;const{id:S}=JSON.parse(f.data);c(N=>N.filter(m=>m.id!==S)),W.current?.id===S&&(o(null),k([]))},L=f=>{if(h())return;const S=JSON.parse(f.data),N=at(S);oe.current.has(N.id)||W.current?.id===N.sessionId&&!je.current&&k(m=>m.some(ce=>ce.id===N.id)?m:[...m,N])},we=f=>{if(h())return;const{id:S}=JSON.parse(f.data);k(N=>N.filter(m=>m.id!==S))};return _t(`/api/events${g}`,{events:{"chat:session:created":j,"chat:session:updated":Z,"chat:session:deleted":U,"chat:message:added":L,"chat:message:deleted":we}})},[a]),s.useEffect(()=>()=>{x.current&&(x.current.close(),x.current=null)},[]),{sessions:r,activeSession:l,sessionsLoading:C,messages:R,messagesLoading:V,isStreaming:p,streamingText:G,streamingThinking:E,streamingToolCalls:z,pendingMessage:B,selectSession:re,createSession:ge,archiveSession:fe,deleteSession:de,sendMessage:Y,stopStreaming:le,clearPendingMessage:Q,loadMoreMessages:pe,hasMoreMessages:$,searchQuery:se,setSearchQuery:ne,filteredSessions:be,refreshSessions:ie,agentsMap:u}}function it(a){const r=new Date(a),l=new Date().getTime()-r.getTime(),o=Math.floor(l/1e3),C=Math.floor(o/60),M=Math.floor(C/60),R=Math.floor(M/24);return o<60?"just now":C<60?`${C}m ago`:M<24?`${M}h ago`:R<7?`${R}d ago`:r.toLocaleDateString()}function rt(a,r){if(!a||!r)return null;const c=r.toLowerCase();if(c.includes("claude")){let o=r.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 o=o.replace(/\s+/g," "),o.length>30?o.slice(0,30)+"…":o}if(c.includes("gpt")||c.includes("openai")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}if(c.includes("gemini")){const o=r.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 o.length>30?o.slice(0,30)+"…":o}const l=r.replace(/-/g," ").replace(/^\w/,o=>o.toUpperCase()).replace(/\s+/g," ").trim();return l.length>30?l.slice(0,30)+"…":l}function $e(a,r){return a.length<=r?a:`${a.slice(0,r)}…`}function as(a){if(!a)return null;const r=Object.entries(a);return r.length===0?null:r.map(([c,l])=>{const o=typeof l=="string"?l:(()=>{try{return JSON.stringify(l)}catch{return String(l)}})();return`${c}=${$e(o,50)}`}).join(", ")}function is(a){if(a===void 0)return null;if(typeof a=="string")return $e(a,200);try{return $e(JSON.stringify(a),200)}catch{return $e(String(a),200)}}function lt(a){if(!a||a.length===0)return null;const r=(p,F)=>{const G=p.status==="running",D=p.status==="completed"&&p.isError,E=as(p.args),T=is(p.result),z=G?E:T?`result: ${T}`:E?`args: ${E}`:null,A=G?"running":D?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${G?" chat-tool-call--running":""}${D?" chat-tool-call--error":""}`,open:G,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",children:p.toolName}),z&&t.jsx("span",{className:"chat-tool-call-preview",title:z,children:z}),t.jsx("span",{className:"chat-tool-call-status-text",children:A})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[E&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:E})]}),T&&t.jsxs("div",{className:`chat-tool-call-row${D?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:T})]})]})]},`${p.toolName}-${F}`)},c="chat-tool-calls";if(a.length===1)return t.jsxs("div",{className:c,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(a[0],0)]});const l=a.filter(p=>p.status==="running").length,o=a.filter(p=>p.status==="completed"&&p.isError).length,C=l>0,M=Array.from(new Set(a.map(p=>p.toolName))),R=M.slice(0,5),k=Math.max(0,M.length-R.length),V=k>0?`${R.join(", ")}, +${k} more`:R.join(", "),I=C?`(${l} running)`:o>0?`(${o} ${o===1?"error":"errors"})`:null;return t.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:C,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(st,{size:12,"aria-hidden":"true"}),t.jsxs("span",{children:[a.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:V,children:V}),I&&t.jsx("span",{className:"chat-tool-calls-group-status",children:I})]}),a.map((p,F)=>r(p,F))]})})}const rs={pre:({children:a,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:a}),table:({children:a,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:a})},Pe="__fn_agent__",ls=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ct(a){const r=/(^|[\s])\/([^\s]*)$/.exec(a);if(!r)return null;const c=r[1]??"",l=r[2]??"",o=r.index+c.length;return{filter:l,start:o,end:a.length}}function cs(a,r){const c=a.slice(0,r),l=/(^|[\s\n])@([\w-]*)$/.exec(c);if(!l)return null;const o=l[2]??"",C=c.length-o.length-1;return{filter:o,start:C,end:r}}function os({projectId:a,onClose:r,onCreate:c}){const[l,o]=s.useState("agent"),[C,M]=s.useState([]),[R,k]=s.useState(!0),[V,I]=s.useState(""),[p,F]=s.useState([]),[G,D]=s.useState(!0),[E,T]=s.useState(""),[z,A]=s.useState([]),[B,H]=s.useState([]);s.useEffect(()=>{let u=!1;return k(!0),ze(void 0,a).then(w=>{u||M(w)}).catch(()=>{u||M([])}).finally(()=>{u||k(!1)}),()=>{u=!0}},[a]),s.useEffect(()=>{D(!0),es().then(u=>{F(u.models),A(u.favoriteProviders),H(u.favoriteModels)}).catch(()=>{F([]),A([]),H([])}).finally(()=>{D(!1)})},[]);const se=s.useCallback(async u=>{const w=z,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];A(P);try{await nt({favoriteProviders:P,favoriteModels:B})}catch{A(w)}},[z,B]),ne=s.useCallback(async u=>{const w=B,P=w.includes(u)?w.filter(O=>O!==u):[u,...w];H(P);try{await nt({favoriteProviders:z,favoriteModels:P})}catch{H(w)}},[B,z]),$=u=>{if(u.preventDefault(),l==="agent"){if(!V)return;c({agentId:V});return}if(!E)return;const w=E.indexOf("/");if(w<=0)return;const x=E.slice(0,w),P=E.slice(w+1);c({agentId:Pe,modelProvider:x,modelId:P})},K=l==="agent"?!V:!E;return t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog",onClick:u=>u.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.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:()=>{o("agent"),T("")},children:"Agent"}),t.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:()=>{o("model"),I("")},children:"Model"})]}),t.jsxs("form",{onSubmit:$,children:[l==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",R?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):C.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:C.map(u=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${V===u.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>I(u.id),"data-testid":`agent-option-${u.id}`,children:[t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:u.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:u.role})]},u.id))})]}),l==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:G?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(ts,{models:p,value:E,onChange:T,label:"Model",placeholder:"Select a model",favoriteProviders:z,onToggleFavorite:se,favoriteModels:B,onToggleModelFavorite:ne})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:K,children:"Create"})]})]})]})})}function gs({projectId:a,addToast:r}){const{activeSession:c,sessionsLoading:l,messages:o,messagesLoading:C,isStreaming:M,streamingText:R,streamingThinking:k,streamingToolCalls:V,selectSession:I,createSession:p,archiveSession:F,deleteSession:G,sendMessage:D,stopStreaming:E,pendingMessage:T,clearPendingMessage:z,searchQuery:A,setSearchQuery:B,filteredSessions:H}=ns(a),[se,ne]=s.useState(!1),[$,K]=s.useState(""),[u,w]=s.useState(null),[x,P]=s.useState(null),[O,Se]=s.useState(!0),[W,je]=s.useState(new Map),[oe,ae]=s.useState([]),[ye,ie]=s.useState(!0),[X,q]=s.useState(!1),[re,ge]=s.useState(""),[fe,de]=s.useState(0),[pe,le]=s.useState(""),[Q,Y]=s.useState(!1),[be,d]=s.useState(0),[g,h]=s.useState(-1),[j,Z]=s.useState(()=>new Set),[U,L]=s.useState([]),[we,b]=s.useState(!1),[,f]=s.useState(!1),[S,N]=s.useState({top:0,left:0}),m=It({projectId:a}),ce=s.useCallback(e=>{if(!e||!m.mentionActive)return;const n=e.getBoundingClientRect();N({top:n.top-260,left:n.left+8})},[m.mentionActive]),Oe=s.useRef(null),ee=s.useRef(null),Ue=s.useRef(null),_=s.useRef(null),He=s.useRef(null),Ve=s.useRef([]),ke=s.useRef(0),ue=zt()==="mobile",{keyboardOverlap:Ce,viewportHeight:Ge}=Ot({enabled:ue&&!!c}),ot=Ce>0?{"--keyboard-overlap":`${Ce}px`,...Ge!==null?{"--vv-height":`${Ge}px`}:{}}:{},J=s.useMemo(()=>{const e=re.trim().toLowerCase();return(e?oe.filter(i=>i.name.toLowerCase().includes(e)):oe).slice(0,10)},[oe,re]),xe=s.useMemo(()=>Array.from(W.values()),[W]),he=s.useMemo(()=>{const e=pe.trim().toLowerCase();return e?xe.filter(n=>n.name.toLowerCase().includes(e)):xe},[xe,pe]),Be=s.useMemo(()=>{const e=new Map;for(const n of xe)e.set(n.name.toLowerCase(),n);return e},[xe]);s.useEffect(()=>{de(0)},[J]),s.useEffect(()=>{d(0)},[pe,Q]),s.useEffect(()=>()=>{ee.current!==null&&window.clearTimeout(ee.current)},[]),s.useEffect(()=>{Oe.current?.scrollIntoView({behavior:"smooth"})},[o,R]),s.useEffect(()=>{if(Ce<=0)return;const e=Ue.current;e&&(e.scrollTop=e.scrollHeight)},[Ce]),s.useEffect(()=>{const e=()=>w(null);if(u)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[u]),s.useEffect(()=>{let e=!1;const n=a;return ze(void 0,a).then(i=>{if(e||n!==a)return;const v=new Map;for(const y of i)v.set(y.id,y);je(v)}).catch(()=>{}),()=>{e=!0}},[a]),s.useEffect(()=>{let e=!1;return ie(!0),Ut(a).then(n=>{e||ae(n)}).catch(()=>{e||ae([])}).finally(()=>{e||ie(!1)}),()=>{e=!0}},[a]),s.useEffect(()=>{Ve.current=U},[U]),s.useEffect(()=>()=>{for(const e of Ve.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl)},[]);const Me=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const i of Array.from(e)){if(!ls.includes(i.type))continue;const v=i.type.startsWith("image/");n.push({file:i,previewUrl:v?URL.createObjectURL(i):""})}n.length>0&&L(i=>[...i,...n])},[]),dt=s.useCallback(e=>{L(n=>{const i=n[e];return i?.previewUrl&&URL.revokeObjectURL(i.previewUrl),n.filter((v,y)=>y!==e)})},[]),ut=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const i=Array.from(n).filter(v=>v.type.startsWith("image/"));i.length!==0&&Me(i)},[Me]),ht=s.useCallback(async e=>{try{await p(e),ne(!1),ue&&Se(!1)}catch{r("Failed to create chat session","error")}},[p,r,ue]),Re=s.useCallback(()=>{const e=$.trim(),n=U.map(i=>i.file);!e&&n.length===0||!c||(K(""),q(!1),ge(""),Y(!1),le(""),h(-1),D(e,n),L(i=>{for(const v of i)v.previewUrl&&URL.revokeObjectURL(v.previewUrl);return[]}))},[$,U,c,D]),De=s.useCallback(e=>{K(n=>{const i=ct(n);if(!i)return n;const v=`/skill:${e.name} `,y=n.slice(0,i.start)+v+n.slice(i.end);return window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus())}),y}),q(!1),ge(""),de(0)},[]),Ee=s.useCallback(e=>{const n=_.current;if(!n||g<0)return;const i=n.selectionStart??ke.current,v=n.selectionEnd??i,y=Math.max(i,v),Ne=Math.min(g,y),me=`${`@${e.name.replace(/\s+/g,"_")}`} `,_e=$.slice(0,Ne)+me+$.slice(y),ve=Ne+me.length;K(_e),Y(!1),le(""),d(0),h(-1),window.requestAnimationFrame(()=>{_.current&&(_.current.style.height="auto",_.current.style.height=`${Math.min(_.current.scrollHeight,120)}px`,_.current.focus(),_.current.setSelectionRange(ve,ve))})},[g,$]),mt=s.useCallback(e=>{const n=/@([\w-]+)/g,i=[];let v=0,y=n.exec(e);for(;y;){const[Ne,Ye=""]=y,me=y.index;me>v&&i.push(e.slice(v,me));const _e=Ye.replace(/_/g," ").toLowerCase(),ve=Be.get(_e);ve?i.push(t.jsxs("span",{className:"chat-mention-chip",children:["@",ve.name.replace(/\s+/g,"_")]},`${ve.id}-${me}`)):i.push(Ne),v=me+Ne.length,y=n.exec(e)}return v<e.length&&i.push(e.slice(v)),i.length===0?e:i},[Be]),Ke=s.useCallback(e=>c?`/api/chat/sessions/${encodeURIComponent(c.id)}/attachments/${encodeURIComponent(e)}`:"",[c]),gt=s.useCallback(e=>!e||e.length===0?null:t.jsx("div",{className:"chat-message-attachments",children:e.map(n=>{const i=n.mimeType.startsWith("image/"),v=n.id||n.filename,y=Ke(n.filename);return i?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:y,alt:n.originalName})},v):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:y,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(Ht,{size:14}),t.jsx("span",{children:n.originalName})]},v)})}),[Ke]),ft=s.useCallback(e=>{if(ke.current=e.currentTarget.selectionStart??ke.current,m.mentionActive&&m.files.length>0){if(m.handleKeyDown(e,$),e.key==="Enter"||e.key==="Tab"){const n=m.files[m.selectedIndex];if(n){const i=m.selectFile(n,$);K(i),m.dismissMention(),f(!1)}}return}if(Q&&e.key==="ArrowDown"){e.preventDefault(),he.length>0&&d(n=>(n+1)%he.length);return}if(Q&&e.key==="ArrowUp"){e.preventDefault(),he.length>0&&d(n=>n===0?he.length-1:n-1);return}if(Q&&e.key==="Enter"){e.preventDefault();const n=he[be]??he[0];n&&Ee(n);return}if(Q&&e.key==="Escape"){e.preventDefault(),Y(!1),le(""),h(-1);return}if(X&&e.key==="ArrowDown"){e.preventDefault(),J.length>0&&de(n=>(n+1)%J.length);return}if(X&&e.key==="ArrowUp"){e.preventDefault(),J.length>0&&de(n=>n===0?J.length-1:n-1);return}if(X&&(e.key==="Enter"||e.key==="Tab")&&J.length>0){e.preventDefault();const n=J[fe]??J[0];n&&De(n);return}if(X&&e.key==="Escape"){e.preventDefault(),q(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Re())},[Q,he,be,Ee,X,J,fe,De,Re,m,$]),Te=s.useCallback((e,n)=>{const i=cs(e,n);if(i){Y(!0),le(i.filter),h(i.start);return}Y(!1),le(""),h(-1)},[]),pt=s.useCallback(e=>{const n=e.target,i=n.value,v=n.selectionStart??i.length;ke.current=v,K(i);const y=ct(i);y?(q(!0),ge(y.filter)):(q(!1),ge("")),Te(i,v),m.detectMention(i,v),f(m.mentionActive),m.mentionActive&&ce(n),n.style.height="auto",n.style.height=`${Math.min(n.scrollHeight,120)}px`},[Te]),Fe=s.useCallback(e=>{const n=e.currentTarget,i=n.selectionStart??n.value.length;ke.current=i,Te(n.value,i),m.detectMention(n.value,i),f(m.mentionActive),m.mentionActive&&ce(n)},[Te,m,ce]),xt=s.useCallback(e=>{e.key!=="Escape"&&Fe(e)},[Fe]),vt=s.useCallback(()=>{ee.current!==null&&window.clearTimeout(ee.current),ee.current=window.setTimeout(()=>{q(!1),Y(!1),le(""),h(-1),f(!1),m.dismissMention(),ee.current=null},120)},[m]),St=s.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),bt=s.useCallback(async e=>{w(null);try{await F(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[F,r]),wt=s.useCallback(async e=>{P(null),w(null);try{await G(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[G,r]),kt=s.useCallback(e=>{I(e),ue&&Se(!1)},[I,ue]),Nt=s.useCallback(()=>{I(""),Se(!0)},[I]),jt=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(Zt,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>ne(!0),children:[t.jsx(Ze,{size:16}),"New Chat"]})]}),te=rt(c?.modelProvider,c?.modelId),qe=c?.agentId===Pe?te??"Fusion":c?.title||W.get(c?.agentId??"")?.name||c?.agentId||"Chat",yt=!!(te&&te!==qe),Le=W.get(c?.agentId??"")?.name||(c?.agentId===Pe?te??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Je=!!(te&&te!==Le),Ct=T.length>50?`${T.slice(0,50)}…`:T,We=s.useCallback(e=>{Z(n=>{const i=new Set(n);return i.has(e)?i.delete(e):i.add(e),i})},[]),Qe=s.useCallback((e,n=!1)=>n?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(Vt,{remarkPlugins:[Gt],components:rs,children:e})}),[]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${O?"":" chat-sidebar--hidden"}`,children:[t.jsx("div",{className:"chat-sidebar-search",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Bt,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:A,onChange:e=>B(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):H.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):H.map(e=>t.jsxs("div",{className:`chat-session-item${c?.id===e.id?" chat-session-item--active":""}`,onClick:()=>kt(e.id),onContextMenu:n=>{n.preventDefault(),w({sessionId:e.id,x:n.clientX,y:n.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:n=>{n.stopPropagation(),P(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(Xe,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsx("span",{children:W.get(e.agentId)?.name||(e.agentId===Pe?rt(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))}),t.jsx("span",{children:e.updatedAt?it(e.updatedAt):""})]})]},e.id))}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>ne(!0),"data-testid":"chat-new-btn",children:[t.jsx(Ze,{size:14}),"New Chat"]})})]}),u&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:u.y,left:u.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>bt(u.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Kt,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{w(null),P(u.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(Xe,{size:14}),"Delete"]})]}),x&&t.jsx("div",{className:"chat-new-dialog-backdrop",onClick:()=>P(null),children:t.jsxs("div",{className:"chat-new-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.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."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>P(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void wt(x),children:"Delete"})]})]})}),t.jsxs("div",{className:"chat-thread",style:ot,children:[(c||!ue)&&t.jsxs("div",{className:"chat-thread-header",children:[ue&&c&&t.jsx("button",{className:"btn-icon",onClick:Nt,"data-testid":"chat-back-btn",children:t.jsx(qt,{size:16})}),t.jsx(Ae,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:qe}),yt&&t.jsx("span",{className:"chat-model-tag",children:te})]}),t.jsxs("div",{className:"chat-messages",ref:Ue,children:[C?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):o.length===0&&!c?jt():o.length===0&&c?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsxs(t.Fragment,{children:[o.map(e=>{const n=e.role==="assistant",i=j.has(e.id);return t.jsxs("div",{className:`chat-message chat-message--${e.role}`,"data-testid":`chat-message-${e.id}`,children:[n&&t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${i?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":i?"Show rendered markdown":"Show plain text",onClick:()=>We(e.id),children:i?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),n?Qe(e.content,i):t.jsx("div",{className:"chat-message-content",children:mt(e.content)}),lt(e.toolCalls),e.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:e.thinkingOutput})]}),gt(e.attachments),t.jsx("div",{className:"chat-message-time",children:it(e.createdAt)})]},e.id)}),M&&t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[t.jsxs("div",{className:"chat-message-avatar",children:[t.jsx(Ae,{size:14}),t.jsx("span",{children:Le}),Je&&t.jsx("span",{className:"chat-model-tag",children:te}),t.jsx("button",{type:"button",className:`chat-message-render-toggle${j.has("__streaming__")?" chat-message-render-toggle--plain":""}`,"data-testid":"chat-message-render-toggle","aria-label":j.has("__streaming__")?"Show rendered markdown":"Show plain text",onClick:()=>We("__streaming__"),children:j.has("__streaming__")?t.jsx(et,{size:14}):t.jsx(tt,{size:14})})]}),R?Qe(R,j.has("__streaming__")):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:k?"Thinking…":"Connecting…"}),lt(V),k&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:k})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}),t.jsx("div",{ref:Oe})]}),c&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:He,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{Me(e.target.files),e.target.value=""}}),X&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:ye?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):J.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:re?"No skills found":"No skills available"}):J.map((e,n)=>t.jsxs("button",{type:"button",role:"option","aria-selected":n===fe,className:`chat-skill-menu-item${n===fe?" chat-skill-menu-item--highlighted":""}`,onMouseDown:i=>i.preventDefault(),onMouseEnter:()=>de(n),onClick:()=>De(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),U.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:U.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>dt(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>He.current?.click(),children:t.jsx(Jt,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${we?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),b(!0)},onDragLeave:()=>b(!1),onDrop:e=>{e.preventDefault(),b(!1),Me(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:_,className:"chat-input-textarea",placeholder:"Type a message...",value:$,onChange:pt,onKeyDown:ft,onKeyUp:xt,onClick:Fe,onBlur:vt,onFocus:St,onPaste:ut,rows:1,"data-testid":"chat-input"}),t.jsx(Wt,{agents:xe,filter:pe,highlightedIndex:be,visible:Q,onSelect:Ee,position:"below"}),t.jsx(Qt,{visible:m.mentionActive&&!Q,position:S,files:m.files,selectedIndex:m.selectedIndex,onSelect:e=>{const n=m.selectFile(e,$);K(n),m.dismissMention(),f(!1),_.current?.focus()},loading:m.loading}),T&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${Ct}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:z,children:"×"})]})]}),M?t.jsx("button",{className:"chat-input-stop",onClick:E,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(Yt,{size:14})}):t.jsx("button",{className:"chat-input-send",onClick:()=>void Re(),disabled:!$.trim()&&U.length===0,"data-testid":"chat-send-btn",children:t.jsx(Xt,{size:16})})]})]})]}),se&&t.jsx(os,{projectId:a,onClose:()=>ne(!1),onCreate:ht})]})}export{gs as ChatView};
@@ -1 +0,0 @@
1
- import{r as u,j as s}from"./vendor-react-K0fH_qHe.js";import{p as ee,dC as se,s as ne,X as k,aj as te,D as A,dD as O,N as _,R as ie,dE as ae,aA as le,c9 as re,dF as ce,dG as de,dH as ue,dI as oe,dJ as H,c6 as ge}from"./index-DNIrnlpO.js";import{D as me}from"./DirectoryPicker-Bgp6PCbu.js";import"./vendor-xterm-DzcZoU0P.js";import"./folder-open-DPESt6bg.js";const V=[{id:"fusion-plugin-hermes-runtime",name:"Hermes Runtime",path:"./plugins/fusion-plugin-hermes-runtime",experimental:!0},{id:"fusion-plugin-paperclip-runtime",name:"Paperclip Runtime",path:"./plugins/fusion-plugin-paperclip-runtime"},{id:"fusion-plugin-openclaw-runtime",name:"OpenClaw Runtime",path:"./plugins/fusion-plugin-openclaw-runtime",experimental:!0}],j={started:"var(--color-success)",loaded:"var(--color-warning)",error:"var(--color-error)",stopped:"var(--color-muted)",installed:"var(--color-info)"};function fe({addToast:l,projectId:c}){const[N,x]=u.useState([]),[S,w]=u.useState(!0),[G,f]=u.useState(!1),[b,v]=u.useState(""),[C,P]=u.useState(!1),[h,I]=u.useState(null),[i,y]=u.useState(null),[a,p]=u.useState({}),[J,$]=u.useState(!1),[R,E]=u.useState(null),{confirm:M}=ee(),o=u.useCallback(async()=>{try{w(!0);const e=await se(c);x(e)}catch(e){l(`Failed to load plugins: ${e instanceof Error?e.message:String(e)}`,"error")}finally{w(!1)}},[c,l]);u.useEffect(()=>{o()},[o]);const K=u.useRef([]);K.current=N,u.useEffect(()=>{const e=c?`?projectId=${encodeURIComponent(c)}`:"",n=g=>{try{const t=JSON.parse(g.data);if(c&&t.projectId&&t.projectId!==c)return;switch(t.transition){case"installing":case"enabled":case"disabled":case"settings-updated":x(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],enabled:t.enabled,state:t.state,settings:t.settings,error:t.error},r}else return o(),d});break;case"uninstalled":x(d=>d.filter(m=>m.id!==t.pluginId));break;case"error":x(d=>{const m=d.findIndex(r=>r.id===t.pluginId);if(m>=0){const r=[...d];return r[m]={...r[m],state:t.state,error:t.error},r}return d});break}}catch{}};return ne(`/api/events${e}`,{events:{"plugin:lifecycle":n},onReconnect:()=>{o()}})},[c,o]);const z=async()=>{if(!b.trim()){l("Please enter a plugin path","error");return}try{P(!0),await H({path:b},c),l("Plugin installed successfully","success"),f(!1),v(""),await o()}catch(e){l(`Failed to install plugin: ${e instanceof Error?e.message:String(e)}`,"error")}finally{P(!1)}},X=async e=>{try{E(e.id),await H({path:e.path},c),l(`${e.name} installed successfully`,"success"),await o()}catch(n){l(`Failed to install ${e.name}: ${n instanceof Error?n.message:String(n)}`,"error")}finally{E(null)}},F=async e=>{try{await ue(e.id,c),l(`${e.name} enabled`,"success"),await o()}catch(n){l(`Failed to enable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},B=async e=>{try{await de(e.id,c),l(`${e.name} disabled`,"success"),await o()}catch(n){l(`Failed to disable plugin: ${n instanceof Error?n.message:String(n)}`,"error")}},D=async e=>{try{I(e.id),await ce(e.id,c),l(`${e.name} reloaded`,"success"),await o()}catch(n){l(`Failed to reload plugin: ${n instanceof Error?n.message:String(n)}`,"error")}finally{I(null)}},L=async e=>{if(await M({title:"Uninstall Plugin",message:`Are you sure you want to uninstall "${e.name}"?`,danger:!0}))try{await oe(e.id,c),l(`${e.name} uninstalled`,"success"),await o(),y(null)}catch(g){l(`Failed to uninstall plugin: ${g instanceof Error?g.message:String(g)}`,"error")}},Q=async e=>{y(e);try{$(!0);const n=await ge(e.id,c);p(n)}catch{p({})}finally{$(!1)}},W=async()=>{if(i)try{await re(i.id,a,c),l("Settings saved","success")}catch(e){l(`Failed to save settings: ${e instanceof Error?e.message:String(e)}`,"error")}};if(i)return s.jsxs("div",{className:"plugin-manager-detail","data-testid":"plugin-manager-detail",children:[s.jsxs("div",{className:"plugin-manager-detail-header",children:[s.jsx("button",{className:"btn-icon",onClick:()=>y(null),"aria-label":"Back to plugin list",children:s.jsx(k,{size:16})}),s.jsxs("div",{className:"plugin-detail-title",children:[s.jsx("h4",{className:"plugin-detail-name",children:i.name}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[i.state]||j.installed},children:i.state})]})]}),s.jsxs("div",{className:"plugin-detail-content",children:[s.jsxs("div",{className:"plugin-detail-card",children:[i.description&&s.jsx("p",{className:"plugin-description",children:i.description}),i.author&&s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Author:"}),i.author]}),i.homepage&&s.jsxs("p",{className:"plugin-detail-meta-row plugin-homepage",children:[s.jsx("span",{className:"text-muted",children:"Homepage:"}),s.jsxs("a",{href:i.homepage,target:"_blank",rel:"noopener noreferrer",children:[i.homepage,s.jsx(te,{size:12})]})]}),s.jsxs("p",{className:"plugin-detail-meta-row",children:[s.jsx("span",{className:"text-muted",children:"Version:"}),i.version]})]}),s.jsxs("div",{className:"plugin-detail-card",children:[s.jsx("h5",{className:"plugin-detail-section-heading",children:"Settings"}),J?s.jsx("p",{className:"text-muted",children:"Loading..."}):i.settingsSchema&&Object.keys(i.settingsSchema).length>0?s.jsxs("div",{className:"plugin-settings-form",children:[Object.entries(i.settingsSchema).map(([e,n])=>{const g=`setting-${e}-help`;return s.jsxs("div",{className:"form-group",children:[s.jsxs("label",{htmlFor:`setting-${e}`,children:[n.label||e,n.required&&" *"]}),n.type==="string"&&!n.multiline&&s.jsx("input",{type:"text",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="string"&&n.multiline&&s.jsx("textarea",{id:`setting-${e}`,rows:4,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="password"&&s.jsx("input",{type:"password",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),placeholder:n.description,"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="number"&&s.jsx("input",{type:"number",id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:Number(t.target.value)}),"aria-describedby":n.description&&!n.required?g:void 0}),n.type==="boolean"&&s.jsxs("label",{className:"checkbox-label",children:[s.jsx("input",{type:"checkbox",checked:a[e]??!1,onChange:t=>p({...a,[e]:t.target.checked})}),n.description]}),n.type==="enum"&&s.jsxs("select",{id:`setting-${e}`,value:a[e]??"",onChange:t=>p({...a,[e]:t.target.value}),"aria-describedby":n.description&&!n.required?g:void 0,children:[s.jsx("option",{value:"",children:"Select..."}),n.enumValues?.map(t=>s.jsx("option",{value:t,children:t},t))]}),n.type==="array"&&s.jsxs("div",{className:"plugin-settings-array",children:[a[e]?.map((t,d)=>s.jsxs("div",{className:"plugin-settings-array-item",children:[s.jsx("input",{type:n.itemType==="number"?"number":"text",value:t??"",onChange:m=>{const r=m.target.value,q=[...a[e]||[]];q[d]=n.itemType==="number"?Number(r):r,p({...a,[e]:q})}}),s.jsx("button",{className:"btn-icon",onClick:()=>{const r=[...a[e]||[]];r.splice(d,1),p({...a,[e]:r})},"aria-label":"Remove item",children:s.jsx(k,{size:14})})]},d)),s.jsxs("button",{className:"btn btn-secondary",onClick:()=>{const t=a[e]||[],d=n.itemType==="number"?0:"";p({...a,[e]:[...t,d]})},children:[s.jsx(A,{size:14})," Add Item"]})]}),n.description&&!n.required&&!n.multiline&&s.jsx("span",{id:g,className:"form-help",children:n.description})]},e)}),s.jsx("button",{className:"btn btn-primary",onClick:W,children:"Save Settings"})]}):s.jsx("p",{className:"text-muted",children:"No configurable settings."})]}),s.jsxs("div",{className:"plugin-detail-actions",children:[i.state==="started"&&s.jsxs("button",{className:"btn btn-secondary",onClick:()=>D(i),disabled:h===i.id,children:[s.jsx(O,{size:14,className:h===i.id?"spin":""}),h===i.id?"Reloading...":"Reload"]}),i.enabled?s.jsx("button",{className:"btn btn-secondary",onClick:()=>B(i),children:"Disable"}):s.jsx("button",{className:"btn btn-primary",onClick:()=>F(i),children:"Enable"}),s.jsxs("button",{className:"btn btn-danger",onClick:()=>L(i),children:[s.jsx(_,{size:14})," Uninstall"]})]})]})]});const Y=new Set(N.map(e=>e.id)),Z=new Set(V.map(e=>e.id)),U=N.filter(e=>!Z.has(e.id)),T=()=>s.jsxs("section",{className:"plugin-bundled-runtime-section","aria-label":"Bundled Runtime Plugins",children:[s.jsxs("div",{className:"plugin-bundled-runtime-header",children:[s.jsx("h4",{className:"plugin-bundled-runtime-heading",children:"Bundled Runtime Plugins"}),s.jsx("p",{className:"plugin-bundled-runtime-description",children:"Install Fusion's bundled runtimes directly from this screen."})]}),s.jsx("div",{className:"plugin-bundled-runtime-list","aria-label":"Bundled runtime plugin recommendations",children:V.map(e=>{const n=Y.has(e.id);return s.jsxs("div",{className:"plugin-bundled-runtime-item",children:[s.jsxs("div",{className:"plugin-bundled-runtime-meta",children:[s.jsx("span",{className:"plugin-bundled-runtime-name",children:e.name}),e.experimental&&s.jsx("span",{className:"plugin-bundled-runtime-badge",children:"Experimental"}),s.jsx("span",{className:`plugin-bundled-runtime-status ${n?"plugin-bundled-runtime-status--installed":"plugin-bundled-runtime-status--available"}`,children:n?"Installed":"Not installed"})]}),s.jsx("button",{className:`btn ${n?"btn-secondary":"btn-primary"} btn-sm`,onClick:()=>X(e),disabled:n||R===e.id,children:n?"Installed":R===e.id?"Installing...":`Install ${e.name}`})]},e.id)})})]});return s.jsxs("div",{className:"plugin-manager","data-testid":"plugin-manager",children:[s.jsxs("div",{className:"plugin-manager-header",children:[s.jsx("span",{className:"plugin-manager-header-title",children:"Installed Plugins"}),s.jsxs("div",{className:"plugin-manager-actions",children:[s.jsxs("button",{className:"btn btn-sm btn-ghost",onClick:o,title:"Refresh","aria-label":"Refresh plugin list",children:[s.jsx(ie,{size:14,className:S?"spin":""}),"Refresh"]}),s.jsxs("button",{className:"btn btn-primary btn-sm",onClick:()=>f(!0),children:[s.jsx(A,{size:14})," Install"]})]})]}),G&&s.jsxs("div",{className:"plugin-install-form",children:[s.jsxs("p",{className:"plugin-install-hint",children:["Browse to a plugin package root (contains ",s.jsx("code",{children:"manifest.json"}),") or a built ",s.jsx("code",{children:"dist"})," directory."]}),s.jsx(me,{value:b,onChange:v,placeholder:"Absolute path to plugin directory or dist folder",onInputKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),z())}}),s.jsxs("div",{className:"plugin-install-actions",children:[s.jsx("button",{className:"btn btn-primary",onClick:z,disabled:C||!b.trim(),children:C?"Installing...":"Install Plugin"}),s.jsx("button",{className:"btn btn-secondary",onClick:()=>{f(!1),v("")},children:"Cancel"})]})]}),S?s.jsx("div",{className:"settings-empty-state",children:"Loading plugins..."}):s.jsxs(s.Fragment,{children:[U.length===0?s.jsxs("div",{className:"settings-empty-state",children:[s.jsx(ae,{size:32,className:"text-muted"}),s.jsx("p",{children:"No plugins installed."}),s.jsx("p",{className:"text-muted",children:"Install a plugin to get started, or use a bundled runtime below."})]}):s.jsx("div",{className:"plugin-list",children:U.map(e=>s.jsxs("div",{className:"plugin-item",children:[s.jsxs("div",{className:"plugin-info",children:[s.jsx("span",{className:"plugin-name",children:e.name}),s.jsxs("span",{className:"plugin-version text-muted",children:["v",e.version]}),s.jsx("span",{className:"plugin-state-badge",style:{color:j[e.state]||j.installed},children:e.state})]}),s.jsxs("div",{className:"plugin-actions",children:[e.state==="started"&&s.jsx("button",{className:"btn-icon",onClick:()=>D(e),disabled:h===e.id,title:"Reload",children:s.jsx(O,{size:14,className:h===e.id?"spin":""})}),s.jsxs("label",{className:"toggle-switch",children:[s.jsx("input",{type:"checkbox",checked:e.enabled,onChange:()=>e.enabled?B(e):F(e)}),s.jsx("span",{className:"toggle-slider"})]}),s.jsx("button",{className:"btn-icon",onClick:()=>Q(e),title:"Settings",children:s.jsx(le,{size:14})}),s.jsx("button",{className:"btn-icon",onClick:()=>L(e),title:"Uninstall",children:s.jsx(_,{size:14})})]})]},e.id))}),T()]})]})}export{fe as PluginManager,j as STATE_COLORS};
@@ -1 +0,0 @@
1
- import{r as c,j as e}from"./vendor-react-K0fH_qHe.js";import{am as $,an as B,s as H,ao as z,ap as G,aq as J,ar as W,as as K,at as X,L as Y,S as Z}from"./index-DNIrnlpO.js";import"./vendor-xterm-DzcZoU0P.js";const ee=300,se=4e3;function re(A){const a=A?.projectId,[_,r]=c.useState([]),[i,w]=c.useState(null),[p,m]=c.useState(null),[R,S]=c.useState({available:!0}),[T,C]=c.useState(!0),[F,E]=c.useState(null),[x,q]=c.useState(""),f=c.useRef(0),j=c.useRef(0),y=c.useRef(a);c.useEffect(()=>{y.current!==a&&(y.current=a,j.current++)},[a]);const o=c.useCallback(async(t=x)=>{const n=++f.current,h=a;E(null);try{const u=await $({q:t||void 0,limit:100},h);if(n!==f.current||h!==a)return;r(u.runs),S(u.availability),i&&!u.runs.some(l=>l.id===i)&&(w(null),m(null))}catch(u){if(n!==f.current||h!==a)return;E(u instanceof Error?u.message:"Failed to load research runs")}finally{n===f.current&&C(!1)}},[a,x,i]),b=c.useCallback(async t=>{const n=await B(t,a);return m(n.run),S(n.availability),n.run},[a]);return c.useEffect(()=>{C(!0);const t=window.setTimeout(()=>{o(x)},ee);return()=>window.clearTimeout(t)},[o,x]),c.useEffect(()=>{if(!i){m(null);return}b(i)},[b,i]),c.useEffect(()=>{const t=j.current,n=()=>j.current!==t,h=a?`?projectId=${encodeURIComponent(a)}`:"";let u=!0;const l=()=>{!u||n()||(o(),i&&b(i))},P=H(`/api/events${h}`,{events:{"research:run:created":l,"research:run:updated":l,"research:run:completed":l,"research:run:failed":l,"research:run:cancelled":l},onReconnect:l}),v=window.setInterval(l,se);return()=>{u=!1,P(),window.clearInterval(v)}},[a,o,i,b]),{runs:_,selectedRun:p,selectedRunId:i,setSelectedRunId:w,availability:R,loading:T,error:F,searchQuery:x,setSearchQuery:q,refresh:o,createRun:t=>X(t,a),cancelRun:async t=>{const n=await K(t,a);return i===t&&m(n.run),await o(),n},retryRun:async t=>{const n=await W(t,a);return i===t&&m(n.run),await o(),n},exportRun:(t,n)=>J(t,n,a),createTaskFromRun:(t,n)=>G(t,{title:n},a),attachRunToTask:(t,n,h)=>z(t,{taskId:n,mode:h},a),statusCounts:_.reduce((t,n)=>(t[n.status]+=1,t),{pending:0,running:0,completed:0,failed:0,cancelled:0})}}const te=["web-search","page-fetch","github","local-docs","llm-synthesis"],ae={"web-search":"Web Search","page-fetch":"Page Fetch",github:"GitHub","local-docs":"Local Docs","llm-synthesis":"LLM Synthesis"};function le({projectId:A,addToast:a}){const{runs:_,selectedRun:r,selectedRunId:i,setSelectedRunId:w,availability:p,loading:m,error:R,searchQuery:S,setSearchQuery:T,createRun:C,cancelRun:F,retryRun:E,exportRun:x,createTaskFromRun:q,attachRunToTask:f,statusCounts:j,refresh:y}=re({projectId:A}),[o,b]=c.useState(""),[t,n]=c.useState(!1),[h,u]=c.useState(["web-search","llm-synthesis"]),[l,P]=c.useState(""),[v,L]=c.useState(null),V=p.supportedProviders??te,M=c.useMemo(()=>r?r.status:"No run selected",[r]),U=c.useMemo(()=>r?r.status==="pending"?"status-dot status-dot--pending":r.status==="running"?"status-dot status-dot--connecting":r.status==="completed"?"status-dot status-dot--online":r.status==="failed"||r.status==="cancelled"?"status-dot status-dot--error":"status-dot":"status-dot",[r]),D=p.supportedExportFormats??["markdown","json","html"],I=async(s,d,N)=>{L(s);try{await d(),a?.(N,"success"),await y()}catch(g){a?.(g instanceof Error?g.message:"Action failed","error")}finally{L(null)}},O=async s=>{if(r){L(`export-${s}`);try{const d=await x(r.id,s),N=new Blob([d.content],{type:"text/plain;charset=utf-8"}),g=URL.createObjectURL(N),k=document.createElement("a");k.href=g,k.download=d.filename,document.body.appendChild(k),k.click(),k.remove(),URL.revokeObjectURL(g),a?.(`Exported ${d.filename}`,"success")}catch(d){a?.(d instanceof Error?d.message:"Export failed","error")}finally{L(null)}}},Q=async()=>{if(o.trim()){n(!0);try{const s=await C({query:o.trim(),providers:h});w(s.run.id),b(""),a?.("Research run created","success"),await y()}catch(s){a?.(s instanceof Error?s.message:"Failed to create run","error")}finally{n(!1)}}};return e.jsxs("section",{className:"research-view","aria-label":"Research view",children:[e.jsxs("header",{className:"research-view__header",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"research-view__title",children:"Research"}),e.jsx("p",{className:"research-view__subtitle",children:"Create and track research runs with cited findings."})]}),e.jsx("button",{className:"btn",type:"button",onClick:()=>void y(),children:"Refresh"})]}),p.available?e.jsxs("div",{className:"research-view__layout",children:[e.jsxs("aside",{className:"research-view__sidebar card",children:[e.jsxs("div",{className:"research-view__form",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"research-query",children:"Query"}),e.jsx("textarea",{id:"research-query",className:"input research-view__textarea",value:o,onChange:s=>b(s.target.value)})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"Providers"}),e.jsx("div",{className:"research-view__providers",children:V.map(s=>e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:h.includes(s),onChange:()=>{u(d=>d.includes(s)?d.filter(N=>N!==s):[...d,s])}}),e.jsx("span",{children:ae[s]??s})]},s))})]}),e.jsxs("button",{className:"btn btn-primary",type:"button",disabled:!o.trim()||t,onClick:()=>void Q(),children:[t?e.jsx(Y,{className:"animate-spin",size:14}):null,"Create Run"]})]}),e.jsxs("div",{className:"research-view__history-header form-group",children:[e.jsx("label",{htmlFor:"research-run-search",children:"Search"}),e.jsxs("div",{className:"research-view__history-search-row",children:[e.jsx(Z,{size:14}),e.jsx("input",{id:"research-run-search",className:"input",placeholder:"Search runs",value:S,onChange:s=>T(s.target.value)})]})]}),e.jsx("div",{className:"research-view__history","data-testid":"research-state-running",children:_.map(s=>e.jsxs("button",{className:`research-view__history-item${i===s.id?" research-view__history-item--active":""}`,onClick:()=>w(s.id),children:[e.jsx("span",{className:"card-id",children:s.id}),e.jsx("span",{children:s.title})]},s.id))})]}),e.jsxs("div",{className:"research-view__reader card",children:[m&&e.jsx("p",{"data-testid":"research-state-loading",children:"Loading research runs…"}),!m&&R&&e.jsx("p",{"data-testid":"research-state-error",children:R}),!m&&!R&&_.length===0&&e.jsx("p",{"data-testid":"research-state-empty",children:"No research runs yet"}),r&&e.jsxs("div",{children:[e.jsxs("div",{className:"research-view__status-row",children:[e.jsx("span",{className:U}),e.jsx("strong",{children:M})]}),e.jsx("h3",{className:"research-view__run-title",children:r.title}),e.jsx("p",{className:"research-view__run-query",children:r.query}),e.jsx("p",{className:"research-view__run-summary","data-testid":"research-state-results",children:r.results?.summary??"No summary yet."}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn",type:"button",disabled:v==="cancel",onClick:()=>void I("cancel",()=>F(r.id),"Run cancelled"),children:"Cancel"}),e.jsx("button",{className:"btn",type:"button",disabled:v==="retry",onClick:()=>void I("retry",()=>E(r.id),"Run retried"),children:"Retry"}),D.includes("markdown")&&e.jsx("button",{className:"btn",type:"button",disabled:v==="export-markdown",onClick:()=>void O("markdown"),children:"Export MD"}),D.includes("json")&&e.jsx("button",{className:"btn",type:"button",disabled:v==="export-json",onClick:()=>void O("json"),children:"Export JSON"}),D.includes("html")&&e.jsx("button",{className:"btn",type:"button",disabled:v==="export-html",onClick:()=>void O("html"),children:"Export HTML"})]}),e.jsxs("div",{className:"research-view__actions",children:[e.jsx("button",{className:"btn btn-primary",type:"button",disabled:v==="create-task",onClick:()=>void I("create-task",()=>q(r.id,`Research: ${r.title}`),"Task created from research"),children:"Create Task"}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"research-task-id",children:"Task ID"}),e.jsx("input",{id:"research-task-id",className:"input",placeholder:"Task ID",value:l,onChange:s=>P(s.target.value)})]}),e.jsx("button",{className:"btn",type:"button",disabled:!l.trim()||v==="attach-task",onClick:()=>void I("attach-task",()=>f(r.id,l.trim(),"document"),"Attached to task"),children:"Attach to Task"})]}),r.error&&e.jsx("p",{className:"research-view__error",children:r.error}),Array.isArray(r.results?.findings)&&r.results.findings.length>0&&e.jsx("div",{className:"research-view__findings",children:r.results.findings.map(s=>e.jsxs("article",{className:"research-view__finding card",children:[e.jsx("h4",{children:s.heading}),e.jsx("p",{children:s.content})]},s.heading))}),Array.isArray(r.results?.citations)&&r.results.citations.length>0&&e.jsx("ul",{className:"research-view__citations",children:r.results.citations.map(s=>e.jsx("li",{children:e.jsx("a",{href:s,target:"_blank",rel:"noreferrer",children:s})},s))}),r.events.length>0&&e.jsxs("details",{children:[e.jsx("summary",{children:"Run history"}),e.jsx("ul",{className:"research-view__events",children:r.events.map(s=>e.jsx("li",{children:s.message},s.id))})]})]}),!r&&_.length>0&&e.jsx("p",{children:"Select a run to view details."}),e.jsxs("div",{className:"research-view__stats",children:[e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Running"}),e.jsx("div",{className:"research-view__stat-value",children:j.running})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Completed"}),e.jsx("div",{className:"research-view__stat-value",children:j.completed})]}),e.jsxs("div",{className:"research-view__stat-card",children:[e.jsx("div",{className:"research-view__stat-label",children:"Failed"}),e.jsx("div",{className:"research-view__stat-value",children:j.failed})]})]})]})]}):e.jsxs("div",{className:"research-view__state research-view__state--error card","data-testid":"research-state-unavailable",children:[e.jsx("p",{children:p.reason??"Research is unavailable for this project."}),p.setupInstructions&&e.jsx("p",{children:p.setupInstructions})]})]})}export{le as ResearchView};