@runfusion/fusion 0.2.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +55392 -51635
- package/dist/client/assets/{AgentDetailView-BMrHuWGs.css → AgentDetailView-C1b9PC5l.css} +1 -1
- package/dist/client/assets/{AgentDetailView-B4lRk--v.js → AgentDetailView-DJwWfkpv.js} +1 -1
- package/dist/client/assets/{AgentsView-yCYBY2km.js → AgentsView-DegK8aw-.js} +5 -5
- package/dist/client/assets/ChatView-CYpEShLS.js +1 -0
- package/dist/client/assets/{DevServerView-jXXtoQUx.js → DevServerView-DfCTA9fx.js} +2 -2
- package/dist/client/assets/{DirectoryPicker-izgMlS27.js → DirectoryPicker-B0qNpfLW.js} +1 -1
- package/dist/client/assets/DirectoryPicker-DzKVmxOf.css +1 -0
- package/dist/client/assets/{DocumentsView-DkkoHRwL.js → DocumentsView-CsQxuyz3.js} +1 -1
- package/dist/client/assets/{InsightsView-DaRtUPHX.js → InsightsView-Bzs7A2jv.js} +2 -2
- package/dist/client/assets/MemoryView-Cl5ASqjW.js +2 -0
- package/dist/client/assets/MemoryView-DiajLXby.css +1 -0
- package/dist/client/assets/{NodesView-BsUk_oiU.js → NodesView-BpiqRlvc.js} +1 -1
- package/dist/client/assets/PiExtensionsManager-Cr6EoC7S.js +11 -0
- package/dist/client/assets/PiExtensionsManager-kgTOHPE9.css +1 -0
- package/dist/client/assets/PluginManager-DRiIqol2.css +1 -0
- package/dist/client/assets/PluginManager-DXtQdfns.js +1 -0
- package/dist/client/assets/{RoadmapsView-SQol126Y.js → RoadmapsView-CYPLTTB0.js} +2 -2
- package/dist/client/assets/SettingsModal-CDWvhvrd.css +1 -0
- package/dist/client/assets/SettingsModal-CNdVTVqD.js +1 -0
- package/dist/client/assets/SettingsModal-CyCC7MzL.js +31 -0
- package/dist/client/assets/SettingsModal-G0ESQXRD.css +1 -0
- package/dist/client/assets/{SetupWizardModal-CQc1uGSq.js → SetupWizardModal-BLiljNn7.js} +1 -1
- package/dist/client/assets/SetupWizardModal-BMa6p24b.css +1 -0
- package/dist/client/assets/SkillsView-Dlpw5LKI.js +1 -0
- package/dist/client/assets/{folder-open-CI4TCD7P.js → folder-open-B_38R5AA.js} +1 -1
- package/dist/client/assets/index-DQKtk17v.js +616 -0
- package/dist/client/assets/index-DjOxzdj3.css +1 -0
- package/dist/client/assets/{upload-CAlKC4qI.js → upload-DNQF7XCK.js} +1 -1
- package/dist/client/assets/users-CG2_rCdk.js +6 -0
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -0
- package/dist/extension.js +3222 -937
- package/dist/pi-claude-cli/index.ts +72 -28
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/pi-claude-cli/src/__tests__/event-bridge.test.ts +34 -0
- package/dist/pi-claude-cli/src/__tests__/mcp-config.test.ts +22 -0
- package/dist/pi-claude-cli/src/__tests__/prompt-builder.test.ts +72 -10
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +9 -9
- package/dist/pi-claude-cli/src/event-bridge.ts +17 -6
- package/dist/pi-claude-cli/src/mcp-config.ts +36 -3
- package/dist/pi-claude-cli/src/prompt-builder.ts +111 -7
- package/dist/pi-claude-cli/src/provider.ts +17 -2
- package/package.json +17 -16
- package/skill/fusion/SKILL.md +6 -1
- package/skill/fusion/references/engine-tools.md +54 -0
- package/skill/fusion/references/extension-tools.md +83 -84
- package/skill/fusion/references/fusion-capabilities.md +33 -31
- package/LICENSE +0 -21
- package/dist/client/assets/ChatView-CH9T0dDs.js +0 -1
- package/dist/client/assets/MemoryView-85NKuU3h.js +0 -2
- package/dist/client/assets/MemoryView-DhinauGs.css +0 -1
- package/dist/client/assets/PiExtensionsManager-BF5pxrSE.js +0 -11
- package/dist/client/assets/PiExtensionsManager-K7HQ08L4.css +0 -1
- package/dist/client/assets/PluginManager-ccq3uK50.css +0 -1
- package/dist/client/assets/PluginManager-s6btydh5.js +0 -1
- package/dist/client/assets/SkillsView-BtUhs_QW.js +0 -1
- package/dist/client/assets/index-Ct-OqLpP.css +0 -1
- package/dist/client/assets/index-rNf7s96d.js +0 -649
|
@@ -1 +1 @@
|
|
|
1
|
-
.agent-detail-overlay{position:fixed;inset:0;background:#0009;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:900px;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0000004d}.agent-detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:60px;color:var(--text-muted)}.agent-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:12px 20px;border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-identity{display:flex;align-items:center;gap:var(--space-md);flex-shrink:0;min-width:0}.agent-detail-icon{width:36px;height:36px;border-radius:var(--radius-md);background:var(--todo);display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.agent-detail-info{min-width:0}.agent-detail-info h2{font-size:16px;font-weight:600;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{display:flex;gap:var(--space-xs);margin-top:2px}.agent-detail-controls{display:flex;align-items:center;gap:6px;flex-shrink:0}.btn--compact{padding:5px 10px;font-size:12px;gap:4px}.agent-detail-utility-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.agent-detail-title{display:flex;align-items:center;gap:var(--space-lg)}.agent-detail-actions{display:flex;align-items:center;gap:var(--space-sm)}.agent-detail-tabs{display:flex;gap:4px;padding:0 20px;border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-tab{display:flex;align-items:center;gap:var(--space-xs);padding:10px 12px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.agent-detail-tab:hover{color:var(--text);background:var(--card-hover)}.agent-detail-tab.active{color:var(--todo);border-bottom-color:var(--todo)}.agent-detail-content{flex:1;overflow-y:auto;padding:24px}.agent-detail-footer{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md) 24px;border-top:1px solid var(--border);background:var(--bg-secondary);font-size:12px;color:var(--text-muted)}.agent-detail-id{font-family:var(--font-mono);cursor:pointer}.agent-detail-id:hover{color:var(--text)}.dashboard-tab{display:flex;flex-direction:column;gap:24px}.dashboard-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:20px}.dashboard-section h3{font-size:14px;font-weight:600;margin:0 0 var(--space-lg) 0;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--space-lg)}.info-item{display:flex;flex-direction:column;gap:4px}.info-label{font-size:12px;color:var(--text-muted)}.info-value{font-size:14px;font-weight:500}.inline-badge{display:inline-block;padding:2px var(--space-sm);border-radius:var(--radius-sm);font-size:12px;text-transform:capitalize}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}.stat-card{background:var(--surface);border-radius:var(--radius-md);padding:var(--space-lg);text-align:center}.stat-value{font-size:28px;font-weight:700;color:var(--todo)}.stat-label{font-size:12px;color:var(--text-muted);margin-top:4px}.current-task{display:flex;align-items:center;gap:var(--space-md)}.task-badge{font-family:var(--font-mono);background:var(--surface);padding:6px var(--space-md);border-radius:var(--radius-sm);font-size:14px}.metadata-json{background:var(--surface);padding:var(--space-md);border-radius:var(--radius-sm);font-size:12px;overflow-x:auto;margin:0}.logs-tab{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-md);margin-bottom:var(--space-md);border-bottom:1px solid var(--border)}.logs-count{font-size:12px;color:var(--text-muted)}.streaming-indicator{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--color-success)}.streaming-dot{width:8px;height:8px;background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.logs-container{flex:1;overflow-y:auto;font-family:var(--font-mono);font-size:13px;line-height:1.6;max-height:400px}.logs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:var(--text-muted);text-align:center}.logs-empty p{margin:var(--space-sm) 0 0 0}.log-entry{display:flex;gap:var(--space-sm);padding:4px var(--space-sm);margin:2px 0;border-radius:var(--radius-sm)}.log-timestamp{color:var(--text-muted);font-size:11px;flex-shrink:0}.log-agent{color:var(--text-muted);font-size:11px;font-weight:600;text-transform:uppercase;flex-shrink:0}.log-icon{flex-shrink:0}.log-text{word-break:break-word}.log-detail{color:var(--text-muted);font-size:12px}.runs-tab{display:flex;flex-direction:column;gap:var(--space-md)}.runs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:var(--text-muted);text-align:center}.runs-empty p{margin:var(--space-sm) 0 0 0}.run-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.run-card--active{border-color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 5%,transparent)}.run-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.run-live-indicator{display:flex;align-items:center;gap:6px;font-weight:600;color:var(--in-progress)}.live-dot{width:8px;height:8px;background:var(--in-progress);border-radius:50%;animation:pulse 1.5s infinite}.run-id{font-family:var(--font-mono);font-size:13px;color:var(--text-muted)}.run-status{display:flex;align-items:center;gap:6px;font-size:13px;text-transform:capitalize}.run-status.active{color:var(--in-progress)}.run-status.completed{color:var(--color-success)}.run-status.failed{color:var(--color-error)}.run-status.terminated{color:var(--text-muted)}.run-details{display:flex;gap:var(--space-sm);font-size:12px;color:var(--text-muted)}.agent-tasks-list{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-task-item{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-secondary);text-decoration:none;transition:background var(--transition-fast),border-color var(--transition-fast)}.agent-task-item:hover{background:var(--card-hover);border-color:var(--text-dim)}.agent-task-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-task-id{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--todo)}.agent-task-title{font-size:14px;font-weight:500;color:var(--text);line-height:1.4}.agent-task-status{font-size:12px;color:var(--text-muted)}.agent-task-column{display:inline-flex;align-items:center;padding:2px 8px;border-radius:9999px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.4px}.agent-task-column.column-triage{color:var(--triage, #1f6feb);background:color-mix(in srgb,var(--triage, #1f6feb) 18%,transparent)}.agent-task-column.column-todo{color:var(--todo, #58a6ff);background:color-mix(in srgb,var(--todo, #58a6ff) 18%,transparent)}.agent-task-column.column-in-progress{color:var(--in-progress, #bc8cff);background:color-mix(in srgb,var(--in-progress, #bc8cff) 18%,transparent)}.agent-task-column.column-in-review{color:var(--in-review, #f2cc60);background:color-mix(in srgb,var(--in-review, #f2cc60) 18%,transparent)}.agent-task-column.column-done{color:var(--done, #3fb950);background:color-mix(in srgb,var(--done, #3fb950) 18%,transparent)}.agent-task-column.column-archived{color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 18%,transparent)}.agent-tasks-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:48px;color:var(--text-muted);text-align:center}.agent-tasks-empty p{margin:0}.config-tab{display:flex;flex-direction:column;gap:24px}.config-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:20px}.config-section h3{font-size:16px;font-weight:600;margin:0 0 var(--space-sm) 0}.config-section--danger{border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.config-danger-note{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-content-toolbar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0}.agent-content-mode-toggle{display:flex;align-items:center;gap:var(--space-xs)}.agent-content-mode-toggle .btn{display:inline-flex;align-items:center;gap:6px}.agent-content-preview{overflow-y:auto;padding:var(--space-lg);min-height:150px}.agent-content-placeholder{color:var(--text-muted);text-align:center;padding:var(--space-xl);min-height:150px;display:flex;align-items:center;justify-content:center}.config-description{font-size:14px;color:var(--text-muted);margin:0 0 20px}.config-fields{display:flex;flex-direction:column;gap:var(--space-lg)}.config-field{display:flex;flex-direction:column;gap:6px}.config-field label{font-size:13px;font-weight:500}.config-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-style:italic}.config-error{font-size:11px;color:var(--color-error)}.input--error{border-color:var(--color-error)!important}.config-actions{display:flex;align-items:center;gap:var(--space-md);margin-top:20px;padding-top:var(--space-lg);border-top:1px solid var(--border)}.config-saved-indicator{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--color-success)}.rating-summary-card{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:var(--radius-md);padding:20px;display:flex;flex-direction:column;gap:12px}.rating-score-display{display:flex;align-items:center;gap:12px}.rating-average{font-size:32px;font-weight:700;line-height:1}.rating-stats{display:flex;align-items:center;gap:12px}.rating-count{font-size:14px;color:var(--text-muted)}.rating-trend-badge{font-size:12px;padding:4px 10px;border-radius:12px;font-weight:500}.trend-improving{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.trend-declining{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.trend-stable{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.trend-insufficient{background:var(--bg-tertiary);color:var(--text-muted)}.category-breakdown{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.category-breakdown h4{margin:0 0 var(--space-md) 0;font-size:.875rem;font-weight:600}.category-breakdown .category-item{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid var(--border)}.category-breakdown .category-item:last-child{border-bottom:none}.category-name{text-transform:capitalize;font-size:.875rem}.category-score{font-weight:600;font-size:.875rem}.add-rating-form{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.add-rating-form h4{margin:0;font-size:.875rem;font-weight:600}.star-selector{display:flex;gap:var(--space-xs)}.star-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;border-radius:var(--radius-sm);color:var(--text-muted);transition:background-color var(--transition-fast),color var(--transition-fast)}.star-btn:hover{background:var(--card-hover)}.star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.rating-stars{display:inline-flex;gap:var(--space-xs)}.rating-stars .star-filled{color:var(--color-warning)}.rating-stars .star-empty{color:var(--text-muted)}.add-rating-form .add-rating-category-select,.add-rating-form .add-rating-comment-input{width:100%}.add-rating-form .add-rating-comment-input{resize:vertical;min-height:calc(var(--space-xl) + var(--space-2xl))}.rating-history{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto}.rating-history h4{margin:0 0 var(--space-md) 0;font-size:.875rem;font-weight:600}.rating-history .no-ratings{color:var(--text-muted);font-size:.875rem;text-align:center;padding:var(--space-lg)}.rating-history-item{padding:var(--space-md) 0;border-bottom:1px solid var(--border)}.rating-history-item:last-child{border-bottom:none}.rating-item-header{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.rating-category-badge{font-size:.75rem;padding:calc(var(--space-xs) * .5) var(--space-sm);background:var(--card-hover);border-radius:var(--radius-pill);text-transform:capitalize}.rating-time{font-size:.75rem;color:var(--text-muted);margin-left:auto}.rating-delete-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;color:var(--text-muted);border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.rating-delete-btn:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.rating-comment{margin:var(--space-sm) 0 0 0;font-size:.8125rem;color:var(--text-secondary);line-height:1.4}@media(max-width:768px){.agent-detail-overlay{padding:0;align-items:stretch}.agent-detail-modal{width:100vw;height:100vh;height:100dvh;max-width:100%;max-height:100vh;max-height:100dvh;border-radius:0;border:none}.agent-detail-header{flex-wrap:wrap;gap:var(--space-sm);padding:12px;padding-top:max(12px,env(safe-area-inset-top,0))}.agent-detail-identity{flex:1 1 auto;min-width:0;gap:var(--space-sm)}.agent-detail-icon{width:32px;height:32px;flex-shrink:0}.agent-detail-icon svg{width:16px;height:16px}.agent-detail-info h2{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{flex-wrap:wrap}.agent-detail-controls{flex:1 1 100%;flex-wrap:wrap;gap:6px;order:3}.agent-detail-controls .btn--compact{padding:6px 10px;font-size:12px;min-height:36px}.agent-detail-controls .btn--compact svg{width:14px;height:14px}.agent-detail-utility-actions{flex-shrink:0}.agent-detail-utility-actions .btn-icon{min-height:36px;min-width:36px}.agent-detail-title{flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-actions{flex:1 1 100%;flex-wrap:wrap;gap:6px}.agent-detail-actions .btn{padding:6px 10px;font-size:13px;min-height:36px}.agent-detail-actions .btn svg{width:14px;height:14px}.agent-detail-actions .btn-icon{min-height:36px;min-width:36px}.agent-detail-tabs{padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{padding:12px 14px;font-size:13px;white-space:nowrap;min-height:36px}.agent-detail-content{padding:16px}.agent-detail-footer{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-sm) 16px;padding-bottom:max(var(--space-sm),env(safe-area-inset-bottom,0));font-size:11px}.agent-detail-id{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tab{gap:16px}.dashboard-section{padding:16px}.info-grid{grid-template-columns:repeat(2,1fr);gap:var(--space-md)}.stats-grid{grid-template-columns:repeat(3,1fr);gap:var(--space-md)}.stat-value{font-size:22px}.logs-container{max-height:50vh}.logs-empty{padding:32px 16px}.log-entry{padding:4px 2px;font-size:12px}.log-text{min-width:0;overflow-wrap:anywhere}.run-card{padding:var(--space-md)}.run-header{flex-wrap:wrap;gap:6px}.run-details{flex-wrap:wrap}.run-details .text-muted{min-width:0;overflow-wrap:anywhere}.config-tab{gap:16px}.config-section{padding:16px}.config-section .input,.config-section .select,.config-section textarea{font-size:16px;min-height:36px}.config-actions{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.config-actions .btn{width:100%;justify-content:center}}@media(max-width:480px){.info-grid,.stats-grid{grid-template-columns:1fr}.agent-detail-actions{flex-direction:column;width:100%}.agent-detail-actions .btn{width:100%;justify-content:center}.agent-detail-actions .btn-icon{align-self:flex-end}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch}.agent-dialog{width:100vw!important;height:100vh;height:100dvh;max-width:100%!important;max-height:100vh;max-height:100dvh;border-radius:0;border:none}.agent-dialog-header{padding:max(var(--space-md),env(safe-area-inset-top,0px)) var(--space-lg) var(--space-md) var(--space-lg);flex-shrink:0}.agent-dialog-body{padding:var(--space-lg);-webkit-overflow-scrolling:touch}.agent-dialog-footer{padding:var(--space-md) var(--space-lg);padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px));flex-wrap:wrap;gap:var(--space-sm)}.agent-dialog-field .input,.agent-dialog-field .select,.agent-dialog-field textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-summary-row{flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-dialog-summary-row>span:first-child,.agent-dialog-summary-row-label{width:auto}.agent-dialog-steps{padding:var(--space-sm) var(--space-lg)}.agent-dialog-step{flex:1;width:auto;height:calc(var(--space-xs) - var(--space-xs) * .25)}.agent-dialog-tabs{grid-template-columns:1fr;gap:calc(var(--space-sm) - var(--space-xs) * .5);margin-bottom:var(--space-md)}.agent-dialog-tab{min-height:calc(var(--space-lg) * 2 + var(--space-xs));text-align:left}.agent-import-file-upload{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.agent-import-textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-xl) * 4 + var(--space-xs))}.agent-import-agent-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-result-stats{flex-direction:column;gap:var(--space-sm);align-items:center}.agent-import-browse-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-skill-list{max-height:calc(100dvh - (var(--space-xl) * 15 + var(--space-md)))}}@media(max-width:480px){.agent-dialog-body{padding:var(--space-md)}.agent-dialog-footer{flex-direction:column}.agent-dialog-footer .btn{width:100%;justify-content:center}}.reflections-tab{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.reflections-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.reflections-header h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1rem;font-weight:600;color:var(--text)}.reflections-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md)}.reflections-stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.reflections-stat-card .stat-value{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);font-size:1.5rem;font-weight:700;color:var(--text);margin-bottom:var(--space-xs)}.reflections-stat-card .stat-label{font-size:.75rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.reflections-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-secondary);text-align:center}.reflections-list{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-loading-indicator{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg)}.reflections-ratings-section{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-ratings-section>h4,.reflections-list h4{font-size:.875rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-cards{display:flex;flex-direction:column;gap:var(--space-sm)}.reflection-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:border-color .15s,background-color .15s}.reflection-card:hover{border-color:var(--border-active);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--color-primary)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--color-primary) 15%,transparent);color:var(--color-primary)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-secondary);padding-left:var(--space-md);position:relative}.reflection-insights li:before{content:"•";position:absolute;left:4px;color:var(--color-success)}.reflection-suggestions li:before{content:"→";position:absolute;left:0;color:var(--color-primary)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-secondary);text-align:center}.reflection-empty p{font-size:.875rem}@media(max-width:768px){.reflections-header{flex-wrap:wrap;align-items:flex-start}.reflections-header .btn{width:100%;justify-content:center}}.budget-progress-container{margin-top:4px}.budget-progress-bar{width:100%;height:8px;background:var(--bg-secondary, #161b22);border-radius:4px;overflow:hidden;margin-top:4px}.budget-progress-bar__fill{height:100%;border-radius:4px;transition:width .3s ease,background-color .3s ease}.budget-progress-bar__fill--green{background:var(--state-active-text, #3fb950)}.budget-progress-bar__fill--amber{background:var(--state-paused-text, #e3b541)}.budget-progress-bar__fill--red{background:var(--state-error-text, #f85149)}.budget-progress-label{font-size:.75rem;color:var(--text-secondary, #8b949e);margin-top:4px;display:block}.budget-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;font-size:.75rem;font-weight:500}.budget-warning-banner{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:6px;background:var(--state-error-bg, rgba(248,81,73,.15));color:var(--state-error-text, #f85149);border:1px solid var(--state-error-border, #f85149);font-size:.875rem;margin-bottom:12px}.btn-reset-budget{margin-top:8px}.chat-sidebar-footer{display:none}@media(max-width:768px){.chat-view{flex-direction:column}.chat-sidebar{width:100%;min-width:100%;height:100%;max-height:none;border-right:none;border-bottom:1px solid var(--border);flex-direction:column}.chat-sidebar-header,.chat-sidebar-search{display:none}.chat-sidebar-list{flex:1;min-height:0;overflow-y:auto}.chat-sidebar-footer{display:flex;padding:var(--space-md);border-top:1px solid var(--border);background:var(--bg-secondary)}.chat-sidebar-footer-btn{flex:1;justify-content:center}.chat-sidebar--hidden{display:none}.chat-message{max-width:90%}.chat-new-dialog{width:95vw;margin:16px}.chat-thread-header{padding:8px 12px}.chat-skill-menu{left:var(--space-md);right:calc(var(--space-md) + var(--mobile-nav-height));min-width:0;max-width:none}}.toggle-switch{position:relative;display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--space-xl) + var(--space-lg) + var(--space-xs));min-height:calc(var(--space-xl) + var(--space-lg) + var(--space-xs));cursor:pointer}.toggle-switch input{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.toggle-switch .toggle-slider{width:calc(var(--space-lg) * 2 + var(--space-sm));height:calc(var(--space-md) * 2);background:var(--border);border-radius:var(--radius-pill);transition:background var(--transition-normal);position:relative}.toggle-switch .toggle-slider:after{content:"";position:absolute;top:var(--space-xs);left:var(--space-xs);width:calc(var(--space-md) + var(--space-xs));height:calc(var(--space-md) + var(--space-xs));background:var(--card);border-radius:var(--radius-pill);transition:transform var(--transition-normal)}.toggle-switch input:focus-visible+.toggle-slider{box-shadow:var(--focus-ring-strong)}.toggle-switch input:checked+.toggle-slider{background:var(--in-review)}.toggle-switch input:checked+.toggle-slider:after{transform:translate(calc(var(--space-md) + var(--space-xs)))}.toggle-switch input:disabled+.toggle-slider{opacity:.6;cursor:not-allowed}@media(max-width:768px){.file-mention-popup{max-height:200px}.file-mention-popup-item{min-height:36px;padding:10px 12px}.agent-mention-popup{max-width:280px;min-width:200px}}
|
|
1
|
+
.agent-detail-overlay{position:fixed;inset:0;background:#0009;backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:900px;max-height:85vh;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0000004d}.agent-detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:60px;color:var(--text-muted)}.agent-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);padding:12px 20px;border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-identity{display:flex;align-items:center;gap:var(--space-md);flex-shrink:0;min-width:0}.agent-detail-icon{width:36px;height:36px;border-radius:var(--radius-md);background:var(--todo);display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.agent-detail-info{min-width:0}.agent-detail-info h2{font-size:16px;font-weight:600;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{display:flex;gap:var(--space-xs);margin-top:2px}.agent-detail-controls{display:flex;align-items:center;gap:6px;flex-shrink:0}.btn--compact{padding:5px 10px;font-size:12px;gap:4px}.agent-detail-utility-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.agent-detail-title{display:flex;align-items:center;gap:var(--space-lg)}.agent-detail-actions{display:flex;align-items:center;gap:var(--space-sm)}.agent-detail-tabs{display:flex;gap:4px;padding:0 20px;border-bottom:1px solid var(--border);background:var(--bg-secondary)}.agent-detail-tab{display:flex;align-items:center;gap:var(--space-xs);padding:10px 12px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);font-size:13px;cursor:pointer;transition:all var(--transition-fast)}.agent-detail-tab:hover{color:var(--text);background:var(--card-hover)}.agent-detail-tab.active{color:var(--todo);border-bottom-color:var(--todo)}.agent-detail-content{flex:1;overflow-y:auto;padding:24px}.agent-detail-footer{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md) 24px;border-top:1px solid var(--border);background:var(--bg-secondary);font-size:12px;color:var(--text-muted)}.agent-detail-id{font-family:var(--font-mono);cursor:pointer}.agent-detail-id:hover{color:var(--text)}.dashboard-tab{display:flex;flex-direction:column;gap:24px}.dashboard-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:20px}.dashboard-section h3{font-size:14px;font-weight:600;margin:0 0 var(--space-lg) 0;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px}.info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--space-lg)}.info-item{display:flex;flex-direction:column;gap:4px}.info-label{font-size:12px;color:var(--text-muted)}.info-value{font-size:14px;font-weight:500}.inline-badge{display:inline-block;padding:2px var(--space-sm);border-radius:var(--radius-sm);font-size:12px;text-transform:capitalize}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}.stat-card{background:var(--surface);border-radius:var(--radius-md);padding:var(--space-lg);text-align:center}.stat-value{font-size:28px;font-weight:700;color:var(--todo)}.stat-label{font-size:12px;color:var(--text-muted);margin-top:4px}.current-task{display:flex;align-items:center;gap:var(--space-md)}.task-badge{font-family:var(--font-mono);background:var(--surface);padding:6px var(--space-md);border-radius:var(--radius-sm);font-size:14px}.metadata-json{background:var(--surface);padding:var(--space-md);border-radius:var(--radius-sm);font-size:12px;overflow-x:auto;margin:0}.logs-tab{display:flex;flex-direction:column;height:100%}.logs-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-md);margin-bottom:var(--space-md);border-bottom:1px solid var(--border)}.logs-count{font-size:12px;color:var(--text-muted)}.streaming-indicator{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--color-success)}.streaming-dot{width:8px;height:8px;background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.logs-container{flex:1;overflow-y:auto;font-family:var(--font-mono);font-size:13px;line-height:1.6;max-height:400px}.logs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:var(--text-muted);text-align:center}.logs-empty p{margin:var(--space-sm) 0 0 0}.log-entry{display:flex;gap:var(--space-sm);padding:4px var(--space-sm);margin:2px 0;border-radius:var(--radius-sm)}.log-timestamp{color:var(--text-muted);font-size:11px;flex-shrink:0}.log-agent{color:var(--text-muted);font-size:11px;font-weight:600;text-transform:uppercase;flex-shrink:0}.log-icon{flex-shrink:0}.log-text{word-break:break-word}.log-detail{color:var(--text-muted);font-size:12px}.runs-tab{display:flex;flex-direction:column;gap:var(--space-md)}.runs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px;color:var(--text-muted);text-align:center}.runs-empty p{margin:var(--space-sm) 0 0 0}.run-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.run-card--active{border-color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 5%,transparent)}.run-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-sm)}.run-live-indicator{display:flex;align-items:center;gap:6px;font-weight:600;color:var(--in-progress)}.live-dot{width:8px;height:8px;background:var(--in-progress);border-radius:50%;animation:pulse 1.5s infinite}.run-id{font-family:var(--font-mono);font-size:13px;color:var(--text-muted)}.run-status{display:flex;align-items:center;gap:6px;font-size:13px;text-transform:capitalize}.run-status.active{color:var(--in-progress)}.run-status.completed{color:var(--color-success)}.run-status.failed{color:var(--color-error)}.run-status.terminated{color:var(--text-muted)}.run-details{display:flex;gap:var(--space-sm);font-size:12px;color:var(--text-muted)}.agent-tasks-list{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-task-item{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--bg-secondary);text-decoration:none;transition:background var(--transition-fast),border-color var(--transition-fast)}.agent-task-item:hover{background:var(--card-hover);border-color:var(--text-dim)}.agent-task-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-task-id{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--todo)}.agent-task-title{font-size:14px;font-weight:500;color:var(--text);line-height:1.4}.agent-task-status{font-size:12px;color:var(--text-muted)}.agent-task-column{display:inline-flex;align-items:center;padding:2px 8px;border-radius:9999px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.4px}.agent-task-column.column-triage{color:var(--triage, #1f6feb);background:color-mix(in srgb,var(--triage, #1f6feb) 18%,transparent)}.agent-task-column.column-todo{color:var(--todo, #58a6ff);background:color-mix(in srgb,var(--todo, #58a6ff) 18%,transparent)}.agent-task-column.column-in-progress{color:var(--in-progress, #bc8cff);background:color-mix(in srgb,var(--in-progress, #bc8cff) 18%,transparent)}.agent-task-column.column-in-review{color:var(--in-review, #f2cc60);background:color-mix(in srgb,var(--in-review, #f2cc60) 18%,transparent)}.agent-task-column.column-done{color:var(--done, #3fb950);background:color-mix(in srgb,var(--done, #3fb950) 18%,transparent)}.agent-task-column.column-archived{color:var(--text-muted);background:color-mix(in srgb,var(--text-muted) 18%,transparent)}.agent-tasks-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:48px;color:var(--text-muted);text-align:center}.agent-tasks-empty p{margin:0}.config-tab{display:flex;flex-direction:column;gap:24px}.config-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:20px}.config-section h3{font-size:16px;font-weight:600;margin:0 0 var(--space-sm) 0}.config-section--danger{border:1px solid color-mix(in srgb,var(--color-error) 40%,transparent)}.config-danger-note{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted)}.agent-content-toolbar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0}.agent-content-mode-toggle{display:flex;align-items:center;gap:var(--space-xs)}.agent-content-mode-toggle .btn{display:inline-flex;align-items:center;gap:6px}.agent-content-preview{overflow-y:auto;padding:var(--space-lg);min-height:150px}.agent-content-placeholder{color:var(--text-muted);text-align:center;padding:var(--space-xl);min-height:150px;display:flex;align-items:center;justify-content:center}.config-description{font-size:14px;color:var(--text-muted);margin:0 0 20px}.config-fields{display:flex;flex-direction:column;gap:var(--space-lg)}.config-field{display:flex;flex-direction:column;gap:6px}.config-field label{font-size:13px;font-weight:500}.config-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-style:italic}.config-error{font-size:11px;color:var(--color-error)}.input--error{border-color:var(--color-error)!important}.config-actions{display:flex;align-items:center;gap:var(--space-md);margin-top:20px;padding-top:var(--space-lg);border-top:1px solid var(--border)}.config-saved-indicator{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--color-success)}.rating-summary-card{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:var(--radius-md);padding:20px;display:flex;flex-direction:column;gap:12px}.rating-score-display{display:flex;align-items:center;gap:12px}.rating-average{font-size:32px;font-weight:700;line-height:1}.rating-stats{display:flex;align-items:center;gap:12px}.rating-count{font-size:14px;color:var(--text-muted)}.rating-trend-badge{font-size:12px;padding:4px 10px;border-radius:12px;font-weight:500}.trend-improving{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.trend-declining{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.trend-stable{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.trend-insufficient{background:var(--bg-tertiary);color:var(--text-muted)}.category-breakdown{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg)}.category-breakdown h4{margin:0 0 var(--space-md) 0;font-size:.875rem;font-weight:600}.category-breakdown .category-item{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid var(--border)}.category-breakdown .category-item:last-child{border-bottom:none}.category-name{text-transform:capitalize;font-size:.875rem}.category-score{font-weight:600;font-size:.875rem}.add-rating-form{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.add-rating-form h4{margin:0;font-size:.875rem;font-weight:600}.star-selector{display:flex;gap:var(--space-xs)}.star-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;border-radius:var(--radius-sm);color:var(--text-muted);transition:background-color var(--transition-fast),color var(--transition-fast)}.star-btn:hover{background:var(--card-hover)}.star-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.rating-stars{display:inline-flex;gap:var(--space-xs)}.rating-stars .star-filled{color:var(--color-warning)}.rating-stars .star-empty{color:var(--text-muted)}.add-rating-form .add-rating-category-select,.add-rating-form .add-rating-comment-input{width:100%}.add-rating-form .add-rating-comment-input{resize:vertical;min-height:calc(var(--space-xl) + var(--space-2xl))}.rating-history{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto}.rating-history h4{margin:0 0 var(--space-md) 0;font-size:.875rem;font-weight:600}.rating-history .no-ratings{color:var(--text-muted);font-size:.875rem;text-align:center;padding:var(--space-lg)}.rating-history-item{padding:var(--space-md) 0;border-bottom:1px solid var(--border)}.rating-history-item:last-child{border-bottom:none}.rating-item-header{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.rating-category-badge{font-size:.75rem;padding:calc(var(--space-xs) * .5) var(--space-sm);background:var(--card-hover);border-radius:var(--radius-pill);text-transform:capitalize}.rating-time{font-size:.75rem;color:var(--text-muted);margin-left:auto}.rating-delete-btn{background:none;border:none;padding:var(--space-xs);cursor:pointer;color:var(--text-muted);border-radius:var(--radius-sm);transition:color var(--transition-fast),background-color var(--transition-fast)}.rating-delete-btn:hover{color:var(--color-error);background:color-mix(in srgb,var(--color-error) 10%,transparent)}.rating-comment{margin:var(--space-sm) 0 0 0;font-size:.8125rem;color:var(--text-secondary);line-height:1.4}@media(max-width:768px){.agent-detail-overlay{padding:0;align-items:stretch}.agent-detail-modal{width:100vw;height:100vh;height:100dvh;max-width:100%;max-height:100vh;max-height:100dvh;border-radius:0;border:none}.agent-detail-header{flex-wrap:wrap;gap:var(--space-sm);padding:12px;padding-top:max(12px,env(safe-area-inset-top,0))}.agent-detail-identity{flex:1 1 auto;min-width:0;gap:var(--space-sm)}.agent-detail-icon{width:32px;height:32px;flex-shrink:0}.agent-detail-icon svg{width:16px;height:16px}.agent-detail-info h2{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{flex-wrap:wrap}.agent-detail-controls{flex:1 1 100%;flex-wrap:wrap;gap:6px;order:3}.agent-detail-controls .btn--compact{padding:6px 10px;font-size:12px;min-height:36px}.agent-detail-controls .btn--compact svg{width:14px;height:14px}.agent-detail-utility-actions{flex-shrink:0}.agent-detail-utility-actions .btn-icon{min-height:36px;min-width:36px}.agent-detail-title{flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-actions{flex:1 1 100%;flex-wrap:wrap;gap:6px}.agent-detail-actions .btn{padding:6px 10px;font-size:13px;min-height:36px}.agent-detail-actions .btn svg{width:14px;height:14px}.agent-detail-actions .btn-icon{min-height:36px;min-width:36px}.agent-detail-tabs{padding:0;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{padding:12px 14px;font-size:13px;white-space:nowrap;min-height:36px}.agent-detail-content{padding:16px}.agent-detail-footer{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-sm) 16px;padding-bottom:max(var(--space-sm),env(safe-area-inset-bottom,0));font-size:11px}.agent-detail-id{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tab{gap:16px}.dashboard-section{padding:16px}.info-grid{grid-template-columns:repeat(2,1fr);gap:var(--space-md)}.stats-grid{grid-template-columns:repeat(3,1fr);gap:var(--space-md)}.stat-value{font-size:22px}.logs-container{max-height:50vh}.logs-empty{padding:32px 16px}.log-entry{padding:4px 2px;font-size:12px}.log-text{min-width:0;overflow-wrap:anywhere}.run-card{padding:var(--space-md)}.run-header{flex-wrap:wrap;gap:6px}.run-details{flex-wrap:wrap}.run-details .text-muted{min-width:0;overflow-wrap:anywhere}.config-tab{gap:16px}.config-section{padding:16px}.config-section .input,.config-section .select,.config-section textarea{font-size:16px;min-height:36px}.config-actions{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.config-actions .btn{width:100%;justify-content:center}}@media(max-width:480px){.info-grid,.stats-grid{grid-template-columns:1fr}.agent-detail-actions{flex-direction:column;width:100%}.agent-detail-actions .btn{width:100%;justify-content:center}.agent-detail-actions .btn-icon{align-self:flex-end}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch}.agent-dialog{width:100vw!important;height:100vh;height:100dvh;max-width:100%!important;max-height:100vh;max-height:100dvh;border-radius:0;border:none}.agent-dialog-header{padding:max(var(--space-md),env(safe-area-inset-top,0px)) var(--space-lg) var(--space-md) var(--space-lg);flex-shrink:0}.agent-dialog-body{padding:var(--space-lg);-webkit-overflow-scrolling:touch}.agent-dialog-footer{padding:var(--space-md) var(--space-lg);padding-bottom:max(var(--space-md),env(safe-area-inset-bottom,0px));flex-wrap:wrap;gap:var(--space-sm)}.agent-dialog-field .input,.agent-dialog-field .select,.agent-dialog-field textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-summary-row{flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-dialog-summary-row>span:first-child,.agent-dialog-summary-row-label{width:auto}.agent-dialog-steps{padding:var(--space-sm) var(--space-lg)}.agent-dialog-step{flex:1;width:auto;height:calc(var(--space-xs) - var(--space-xs) * .25)}.agent-dialog-tabs{grid-template-columns:1fr;gap:calc(var(--space-sm) - var(--space-xs) * .5);margin-bottom:var(--space-md)}.agent-dialog-tab{min-height:calc(var(--space-lg) * 2 + var(--space-xs));text-align:left}.agent-import-file-upload{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.agent-import-textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-xl) * 4 + var(--space-xs))}.agent-import-agent-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-result-stats{flex-direction:column;gap:var(--space-sm);align-items:center}.agent-import-browse-list{max-height:calc(100dvh - (var(--space-xl) * 10 + var(--space-lg)))}.agent-import-skill-list{max-height:calc(100dvh - (var(--space-xl) * 15 + var(--space-md)))}}@media(max-width:480px){.agent-dialog-body{padding:var(--space-md)}.agent-dialog-footer{flex-direction:column}.agent-dialog-footer .btn{width:100%;justify-content:center}}.reflections-tab{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.reflections-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.reflections-header h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1rem;font-weight:600;color:var(--text)}.reflections-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md)}.reflections-stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.reflections-stat-card .stat-value{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);font-size:1.5rem;font-weight:700;color:var(--text);margin-bottom:var(--space-xs)}.reflections-stat-card .stat-label{font-size:.75rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.reflections-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-secondary);text-align:center}.reflections-list{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-loading-indicator{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg)}.reflections-ratings-section{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-ratings-section>h4,.reflections-list h4{font-size:.875rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-cards{display:flex;flex-direction:column;gap:var(--space-sm)}.reflection-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:border-color .15s,background-color .15s}.reflection-card:hover{border-color:var(--border-active);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--color-primary)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--color-primary) 15%,transparent);color:var(--color-primary)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-secondary);padding-left:var(--space-md);position:relative}.reflection-insights li:before{content:"•";position:absolute;left:4px;color:var(--color-success)}.reflection-suggestions li:before{content:"→";position:absolute;left:0;color:var(--color-primary)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-secondary);text-align:center}.reflection-empty p{font-size:.875rem}@media(max-width:768px){.reflections-header{flex-wrap:wrap;align-items:flex-start}.reflections-header .btn{width:100%;justify-content:center}}.budget-progress-container{margin-top:4px}.budget-progress-bar{width:100%;height:8px;background:var(--bg-secondary, #161b22);border-radius:4px;overflow:hidden;margin-top:4px}.budget-progress-bar__fill{height:100%;border-radius:4px;transition:width .3s ease,background-color .3s ease}.budget-progress-bar__fill--green{background:var(--state-active-text, #3fb950)}.budget-progress-bar__fill--amber{background:var(--state-paused-text, #e3b541)}.budget-progress-bar__fill--red{background:var(--state-error-text, #f85149)}.budget-progress-label{font-size:.75rem;color:var(--text-secondary, #8b949e);margin-top:4px;display:block}.budget-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;font-size:.75rem;font-weight:500}.budget-warning-banner{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:6px;background:var(--state-error-bg, rgba(248,81,73,.15));color:var(--state-error-text, #f85149);border:1px solid var(--state-error-border, #f85149);font-size:.875rem;margin-bottom:12px}.btn-reset-budget{margin-top:8px}.chat-sidebar-footer{display:none}@media(max-width:768px){.chat-view{flex-direction:column}.chat-sidebar{width:100%;min-width:100%;height:100%;max-height:none;border-right:none;border-bottom:1px solid var(--border);flex-direction:column}.chat-sidebar-header,.chat-sidebar-search{display:none}.chat-sidebar-list{flex:1;min-height:0;overflow-y:auto}.chat-sidebar-footer{display:flex;padding:var(--space-md);border-top:1px solid var(--border);background:var(--bg-secondary)}.chat-sidebar-footer-btn{flex:1;justify-content:center}.chat-sidebar--hidden{display:none}.chat-message{max-width:90%}.chat-new-dialog{width:95vw;margin:16px}.chat-thread-header{padding:8px 12px}.chat-skill-menu{left:var(--space-md);right:calc(var(--space-md) + var(--mobile-nav-height));min-width:0;max-width:none}}@media(max-width:768px){.file-mention-popup{max-height:200px}.file-mention-popup-item{min-height:36px;padding:10px 12px}.agent-mention-popup{max-width:280px;min-width:200px}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as xe,
|
|
1
|
+
import{r as a,j as e}from"./vendor-react-K0fH_qHe.js";import{c as xe,ck as ks,cl as Cs,cm as ws,cn as Rs,L as O,R as ze,af as ts,Z as Ms,ag as Te,I as Ce,K as hs,D as gs,co as Fs,cp as Ts,cq as As,cr as Ls,p as W,cs as Ds,s as as,B as ns,E as Ne,J as is,aJ as ge,X as zs,F as we,A as Se,v as Ee,ct as Es,bJ as $s,aq as Ps,b4 as Bs,ah as fs,M as Is,U as Os,V as _s,cu as Le,cv as Hs,y as Vs,cw as Us,cx as Js,cy as Ws,cz as qs,cA as Gs,cB as $e,a3 as Pe,a5 as Be,a6 as Ie,C as X,a1 as Ks,cC as Ys,cD as Zs,i as Qs,h as Xs,j as et,cE as De,W as st,cF as tt,cG as at,cH as nt,cI as it,cJ as rt,cK as lt,cL as ot,cM as ct,Q as dt,cN as ut,N as mt}from"./index-DQKtk17v.js";import{S as ht}from"./AgentsView-DegK8aw-.js";import"./vendor-xterm-DzcZoU0P.js";import"./upload-DNQF7XCK.js";import"./folder-open-B_38R5AA.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-
|
|
2
|
-
import{c as Fe,s as
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AgentDetailView-DJwWfkpv.js","assets/vendor-react-K0fH_qHe.js","assets/index-DQKtk17v.js","assets/vendor-xterm-DzcZoU0P.js","assets/vendor-xterm-LZoznX6r.css","assets/index-DjOxzdj3.css","assets/upload-DNQF7XCK.js","assets/folder-open-B_38R5AA.js","assets/AgentDetailView-C1b9PC5l.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as Fe,s as rt,A as xe,C as Se,Z as lt,B as De,g as Re,a as et,b as Ae,d as ot,e as ct,f as dt,h as ut,i as mt,u as ze,j as ht,P as gt,k as pt,l as Oe,G as ft,S as bt,L as Te,T as Me,R as $e,F as qe,X as He,m as vt,n as xt,o as yt,p as de,q as Ve,r as wt,t as jt,v as kt,w as Nt,x as It,y as We,z as Ct,D as tt,H as St,E as ke,I as Ke,J as Ue,K as Et,M as At,N as Ne,O as Tt,Q as Be,U as Mt,V as _t,W as Pt,_ as Rt}from"./index-DQKtk17v.js";import{r as s,j as e}from"./vendor-react-K0fH_qHe.js";import{U as nt}from"./upload-DNQF7XCK.js";import{F as $t}from"./folder-open-B_38R5AA.js";/**
|
|
3
3
|
* @license lucide-react v1.7.0 - ISC
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the ISC license.
|
|
@@ -14,7 +14,7 @@ import{c as Fe,s as lt,A as xe,C as Se,Z as ot,B as De,g as Re,a as tt,b as Ae,d
|
|
|
14
14
|
*
|
|
15
15
|
* This source code is licensed under the ISC license.
|
|
16
16
|
* See the LICENSE file in the root directory of this source tree.
|
|
17
|
-
*/const Ot=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],qt=Fe("sliders-horizontal",Ot),Qe=200;function Ht(a,l){const[f,m]=s.useState([]),[c,d]=s.useState(!1),r=s.useRef(null),u=s.useRef(0),o=s.useRef(a),g=s.useRef(l);return(o.current!==a||g.current!==l)&&(o.current=a,g.current=l,u.current++,r.current&&(r.current(),r.current=null),m([]),d(!1)),s.useEffect(()=>{if(!a){m([]),d(!1);return}const N=u.current;let x=`/api/tasks/${encodeURIComponent(a)}/logs/stream`;l&&(x+=`?projectId=${encodeURIComponent(l)}`);const I=lt(x,{events:{"agent:log":p=>{if(u.current===N)try{const w=JSON.parse(p.data),C={type:w.type??"text",text:w.text??w.content??"",timestamp:w.timestamp,content:w.content};m(A=>{const E=[C,...A];return E.length>Qe?E.slice(0,Qe):E})}catch{}}},onOpen:()=>{u.current===N&&d(!0)},onError:()=>{u.current===N&&d(!1)}});return r.current=I,()=>{I(),r.current=null,u.current===N&&d(!1)}},[a,l]),{entries:f,isConnected:c}}function Vt({agent:a,projectId:l,onSelect:f}){const{entries:m,isConnected:c}=Ht(a.taskId,l),d=a.lastHeartbeatAt?Math.floor((Date.now()-new Date(a.lastHeartbeatAt).getTime())/1e3):0,r=()=>{f&&f(a.id)},u=o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),r())};return e.jsxs("div",{className:"live-agent-card",onClick:r,onKeyDown:u,role:"button",tabIndex:0,"aria-label":`Select agent ${a.name}`,children:[e.jsxs("div",{className:"live-agent-card-header",children:[e.jsxs("div",{className:"live-agent-card-name",children:[e.jsx("span",{className:"live-agent-pulse"}),e.jsx("span",{children:a.name})]}),a.taskId&&e.jsx("span",{className:"live-agent-task badge",children:a.taskId})]}),e.jsx("div",{className:"live-agent-card-transcript",children:m.length===0?e.jsx("div",{className:"live-agent-card-empty",children:c?"Waiting for output...":"Connecting..."}):m.slice(0,20).map((o,g)=>e.jsx("div",{className:"live-agent-card-line",children:o.text},g))}),e.jsxs("div",{className:"live-agent-card-footer",children:[e.jsx("span",{className:"text-secondary",children:Wt(d)}),c&&e.jsx(xe,{size:12,className:"live-agent-streaming-dot"})]})]})}function Wt(a){return a<60?`${a}s`:a<3600?`${Math.floor(a/60)}m ${a%60}s`:`${Math.floor(a/3600)}h ${Math.floor(a%3600/60)}m`}function Kt({agents:a,projectId:l,onAgentSelect:f}){const m=Array.from(new Map(a.map(c=>[c.id,c])).values());return m.length===0?null:e.jsxs("div",{className:"active-agents-panel",children:[e.jsxs("div",{className:"active-agents-panel-header",children:[e.jsx(xe,{size:16}),e.jsxs("span",{children:["Active Agents (",m.length,")"]})]}),e.jsx("div",{className:"active-agents-grid",children:m.map(c=>e.jsx(Vt,{agent:c,projectId:l,onSelect:f},c.id))})]})}const Ut=[{icon:xe,label:"Active Agents",valueKey:"activeCount",className:"agent-metric-card--active"},{icon:Dt,label:"Assigned Tasks",valueKey:"assignedTaskCount",className:"agent-metric-card--tasks"},{icon:Se,label:"Success Rate",valueKey:"successRate",className:"agent-metric-card--success"},{icon:ot,label:"Total Runs",valueKey:"completedRuns",className:"agent-metric-card--runs"}];function Bt({stats:a}){return a?e.jsx("div",{className:"agent-metrics-bar",children:Ut.map(l=>{const f=l.valueKey==="successRate"?`${Math.round(a.successRate*100)}%`:a[l.valueKey];return e.jsxs("div",{className:`agent-metric-card ${l.className}`,children:[e.jsx(l.icon,{size:18}),e.jsxs("div",{className:"agent-metric-info",children:[e.jsx("span",{className:"agent-metric-value",children:f}),e.jsx("span",{className:"agent-metric-label",children:l.label})]})]},l.label)})}):null}function Je(a){return typeof a=="number"&&Number.isFinite(a)?a:0}function ve(a){return a.toLocaleString()}function Gt({agents:a}){const{rows:l,totalInputTokens:f,totalOutputTokens:m,totalTokens:c}=s.useMemo(()=>{const r=a.map(u=>{const o=Je(u.totalInputTokens),g=Je(u.totalOutputTokens);return{id:u.id,name:u.name,inputTokens:o,outputTokens:g,totalTokens:o+g}}).sort((u,o)=>o.totalTokens-u.totalTokens||u.name.localeCompare(o.name)||u.id.localeCompare(o.id));return{rows:r,totalInputTokens:r.reduce((u,o)=>u+o.inputTokens,0),totalOutputTokens:r.reduce((u,o)=>u+o.outputTokens,0),totalTokens:r.reduce((u,o)=>u+o.totalTokens,0)}},[a]),d=c>0;return e.jsxs("section",{className:"agent-token-stats-panel","aria-label":"Agent token usage statistics",children:[e.jsx("header",{className:"agent-token-stats-panel__header",children:e.jsx("h3",{className:"agent-token-stats-panel__title",children:"Token Usage by Agent"})}),e.jsxs("div",{className:"agent-token-stats-panel__totals",role:"list","aria-label":"Token usage totals",children:[e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Input Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(f)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Output Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(m)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Combined Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(c)})]})]}),d?e.jsx("div",{className:"agent-token-stats-panel__table-wrapper",children:e.jsxs("table",{className:"agent-token-stats-panel__table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:"Agent"}),e.jsx("th",{scope:"col",children:"Input"}),e.jsx("th",{scope:"col",children:"Output"}),e.jsx("th",{scope:"col",children:"Total"})]})}),e.jsx("tbody",{children:l.map(r=>e.jsxs("tr",{children:[e.jsxs("th",{scope:"row",className:"agent-token-stats-panel__agent-cell",children:[e.jsx("span",{className:"agent-token-stats-panel__agent-name",children:r.name}),e.jsx("span",{className:"agent-token-stats-panel__agent-id",children:r.id})]}),e.jsx("td",{children:ve(r.inputTokens)}),e.jsx("td",{children:ve(r.outputTokens)}),e.jsx("td",{className:"agent-token-stats-panel__total-cell",children:ve(r.totalTokens)})]},r.id))})]})}):e.jsx("div",{className:"agent-token-stats-panel__empty",role:"status",children:"No token usage recorded yet. Token totals appear here once agents run."})]})}function Ie({title:a="No agents found",description:l="Create an agent to get started",ctaLabel:f="Create Agent",onCtaClick:m}){return e.jsxs("div",{className:"agent-empty",children:[e.jsx(De,{size:48,opacity:.3,className:"agent-empty-state__icon"}),e.jsx("p",{className:"agent-empty-state__title",children:a}),e.jsx("p",{className:"agent-empty-state__description text-secondary",children:l}),m?e.jsx("button",{type:"button",className:"btn btn--primary",onClick:m,children:f}):null]})}const at="fn-agent-tree-expanded";function Xe(a){try{const l=Re(at,a);if(l){const f=JSON.parse(l);return new Set(Array.isArray(f)?f:[])}}catch{}return new Set}function Qt(a,l){try{tt(at,JSON.stringify([...a]),l)}catch{}}function Jt(a,l){const f=new Map,m=new Map;for(const d of a)if(f.set(d.id,d),d.reportsTo){const r=m.get(d.reportsTo)??[];r.push(d),m.set(d.reportsTo,r)}function c(d,r){const u=m.get(d.id)??[],o=l.has(d.id)?u.map(g=>c(g,r+1)):[];return{agent:d,children:o,depth:r}}return a.filter(d=>!d.reportsTo||!f.has(d.reportsTo)).map(d=>c(d,0))}function Xt(a,l){const[f,m]=s.useState(()=>Xe(l));s.useEffect(()=>{m(Xe(l))},[l]);const c=s.useMemo(()=>Jt(a,f),[a,f]),d=s.useCallback(o=>{m(g=>{const b=new Set(g);return b.has(o)?b.delete(o):b.add(o),Qt(b,l),b})},[l]),r=s.useCallback(o=>f.has(o),[f]),u=s.useCallback(o=>a.filter(g=>g.reportsTo===o),[a]);return{rootNodes:c,toggleExpand:d,isExpanded:r,getChildren:u,isLoading:!1}}const Ze=3,_e=1e3;function Zt({isOpen:a,onClose:l,onGenerated:f,projectId:m}){const[c,d]=s.useState(""),[r,u]=s.useState({type:"input"}),[o,g]=s.useState(null),[b,N]=s.useState(!1),x=s.useRef(null),I=s.useRef(null);s.useEffect(()=>{a&&r.type==="input"&&I.current?.focus()},[a,r.type]),s.useEffect(()=>{if(!a&&x.current){const j=x.current;x.current=null,Ae(j,m).catch(()=>{})}},[a,m]),s.useEffect(()=>{if(!a)return;const j=T=>{T.key==="Escape"&&p()};return document.addEventListener("keydown",j),()=>document.removeEventListener("keydown",j)},[a]);const p=s.useCallback(()=>{if(x.current){const j=x.current;x.current=null,Ae(j,m).catch(()=>{})}d(""),u({type:"input"}),g(null),N(!1),l()},[l,m]),w=s.useCallback(async()=>{if(!(!c.trim()||c.trim().length<Ze)){g(null),u({type:"loading"});try{const{sessionId:j}=await ct(c.trim(),m);x.current=j;const{spec:T}=await dt(j,m);u({type:"preview",spec:T,sessionId:j})}catch(j){const T=j instanceof Error?j.message:"Failed to generate agent specification";T.includes("429")||T.toLowerCase().includes("rate limit")?g("Too many requests. Please wait a moment and try again."):g(T),u({type:"input"}),x.current=null}}},[c,m]),C=s.useCallback(async()=>{if(x.current){const j=x.current;x.current=null;try{await Ae(j,m)}catch{}}await w()},[w,m]),A=s.useCallback(()=>{r.type==="preview"&&(x.current=null,f(r.spec),d(""),u({type:"input"}),g(null),N(!1),l())},[r,f,l]);if(!a)return null;const E=c.trim().length>=Ze&&c.trim().length<=_e;return e.jsx("div",{className:"agent-dialog-overlay",onClick:j=>{j.target===j.currentTarget&&p()},children:e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Generate agent with AI",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsxs("span",{className:"agent-dialog-header-title",children:[e.jsx("span",{className:"agent-dialog-header-sparkle",children:"✨"}),"Generate Agent"]}),e.jsx("button",{className:"modal-close",onClick:p,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[o&&e.jsx("div",{className:"agent-dialog-error-banner",children:o}),r.type==="input"&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Describe your agent's role and the AI will generate a complete specification including system prompt, suggested configuration, and more."}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-role-description",children:"Role Description"}),e.jsx("textarea",{ref:I,id:"agent-role-description",className:"input agent-dialog-textarea",rows:4,placeholder:'e.g. "Senior frontend code reviewer who specializes in React accessibility"',value:c,onChange:j=>d(j.target.value),onKeyDown:j=>{j.key==="Enter"&&!j.shiftKey&&E&&(j.preventDefault(),w())},maxLength:_e,"aria-describedby":"role-description-hint"}),e.jsxs("div",{id:"role-description-hint",className:"agent-dialog-hint",children:[e.jsx("span",{children:"Describe what your agent should do"}),e.jsxs("span",{children:[c.length,"/",_e]})]})]})]}),r.type==="loading"&&e.jsxs("div",{className:"agent-dialog-loading-center",children:[e.jsx("div",{className:"agent-dialog-spinner spin"}),e.jsx("p",{className:"agent-dialog-loading-text",children:"Generating agent specification..."})]}),r.type==="preview"&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-summary agent-dialog-summary--spaced",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Title"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[r.spec.icon," ",r.spec.title]})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Role"}),e.jsx("span",{children:r.spec.role})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Description"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--body",children:r.spec.description})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--capitalize",children:r.spec.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Max Turns"}),e.jsx("span",{children:r.spec.maxTurns})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{children:["System Prompt",e.jsx("button",{type:"button",className:"agent-dialog-expand-btn",onClick:()=>N(!b),children:b?"Collapse":"Expand"})]}),e.jsxs("div",{className:`agent-generation-prompt-box${b?"":" agent-generation-prompt-box--collapsed"}`,children:[r.spec.systemPrompt,!b&&r.spec.systemPrompt.length>500&&e.jsx("div",{className:"agent-generation-prompt-fade"})]})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[e.jsx("button",{className:"btn",onClick:p,children:"Cancel"}),r.type==="input"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void w(),disabled:!E,children:"Generate"}),r.type==="preview"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:()=>void C(),children:"Regenerate"}),e.jsx("button",{className:"btn btn--primary",onClick:A,children:"Use This"})]})]})]})})}const Yt=`# Soul: Chief Executive Officer
|
|
17
|
+
*/const Ot=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],qt=Fe("sliders-horizontal",Ot),Ge=200;function Ht(a,l){const[f,m]=s.useState([]),[c,d]=s.useState(!1),r=s.useRef(null),u=s.useRef(0),o=s.useRef(a),g=s.useRef(l);return(o.current!==a||g.current!==l)&&(o.current=a,g.current=l,u.current++,r.current&&(r.current(),r.current=null),m([]),d(!1)),s.useEffect(()=>{if(!a){m([]),d(!1);return}const N=u.current;let x=`/api/tasks/${encodeURIComponent(a)}/logs/stream`;l&&(x+=`?projectId=${encodeURIComponent(l)}`);const I=rt(x,{events:{"agent:log":p=>{if(u.current===N)try{const w=JSON.parse(p.data),C={type:w.type??"text",text:w.text??w.content??"",timestamp:w.timestamp,content:w.content};m(A=>{const E=[C,...A];return E.length>Ge?E.slice(0,Ge):E})}catch{}}},onOpen:()=>{u.current===N&&d(!0)},onError:()=>{u.current===N&&d(!1)}});return r.current=I,()=>{I(),r.current=null,u.current===N&&d(!1)}},[a,l]),{entries:f,isConnected:c}}function Vt({agent:a,projectId:l,onSelect:f}){const{entries:m,isConnected:c}=Ht(a.taskId,l),d=a.lastHeartbeatAt?Math.floor((Date.now()-new Date(a.lastHeartbeatAt).getTime())/1e3):0,r=()=>{f&&f(a.id)},u=o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),r())};return e.jsxs("div",{className:"live-agent-card",onClick:r,onKeyDown:u,role:"button",tabIndex:0,"aria-label":`Select agent ${a.name}`,children:[e.jsxs("div",{className:"live-agent-card-header",children:[e.jsxs("div",{className:"live-agent-card-name",children:[e.jsx("span",{className:"live-agent-pulse"}),e.jsx("span",{children:a.name})]}),a.taskId&&e.jsx("span",{className:"live-agent-task badge",children:a.taskId})]}),e.jsx("div",{className:"live-agent-card-transcript",children:m.length===0?e.jsx("div",{className:"live-agent-card-empty",children:c?"Waiting for output...":"Connecting..."}):m.slice(0,20).map((o,g)=>e.jsx("div",{className:"live-agent-card-line",children:o.text},g))}),e.jsxs("div",{className:"live-agent-card-footer",children:[e.jsx("span",{className:"text-secondary",children:Wt(d)}),c&&e.jsx(xe,{size:12,className:"live-agent-streaming-dot"})]})]})}function Wt(a){return a<60?`${a}s`:a<3600?`${Math.floor(a/60)}m ${a%60}s`:`${Math.floor(a/3600)}h ${Math.floor(a%3600/60)}m`}function Kt({agents:a,projectId:l,onAgentSelect:f}){const m=Array.from(new Map(a.map(c=>[c.id,c])).values());return m.length===0?null:e.jsxs("div",{className:"active-agents-panel",children:[e.jsxs("div",{className:"active-agents-panel-header",children:[e.jsx(xe,{size:16}),e.jsxs("span",{children:["Active Agents (",m.length,")"]})]}),e.jsx("div",{className:"active-agents-grid",children:m.map(c=>e.jsx(Vt,{agent:c,projectId:l,onSelect:f},c.id))})]})}const Ut=[{icon:xe,label:"Active Agents",valueKey:"activeCount",className:"agent-metric-card--active"},{icon:Dt,label:"Assigned Tasks",valueKey:"assignedTaskCount",className:"agent-metric-card--tasks"},{icon:Se,label:"Success Rate",valueKey:"successRate",className:"agent-metric-card--success"},{icon:lt,label:"Total Runs",valueKey:"completedRuns",className:"agent-metric-card--runs"}];function Bt({stats:a}){return a?e.jsx("div",{className:"agent-metrics-bar",children:Ut.map(l=>{const f=l.valueKey==="successRate"?`${Math.round(a.successRate*100)}%`:a[l.valueKey];return e.jsxs("div",{className:`agent-metric-card ${l.className}`,children:[e.jsx(l.icon,{size:18}),e.jsxs("div",{className:"agent-metric-info",children:[e.jsx("span",{className:"agent-metric-value",children:f}),e.jsx("span",{className:"agent-metric-label",children:l.label})]})]},l.label)})}):null}function Qe(a){return typeof a=="number"&&Number.isFinite(a)?a:0}function ve(a){return a.toLocaleString()}function Gt({agents:a}){const{rows:l,totalInputTokens:f,totalOutputTokens:m,totalTokens:c}=s.useMemo(()=>{const r=a.map(u=>{const o=Qe(u.totalInputTokens),g=Qe(u.totalOutputTokens);return{id:u.id,name:u.name,inputTokens:o,outputTokens:g,totalTokens:o+g}}).sort((u,o)=>o.totalTokens-u.totalTokens||u.name.localeCompare(o.name)||u.id.localeCompare(o.id));return{rows:r,totalInputTokens:r.reduce((u,o)=>u+o.inputTokens,0),totalOutputTokens:r.reduce((u,o)=>u+o.outputTokens,0),totalTokens:r.reduce((u,o)=>u+o.totalTokens,0)}},[a]),d=c>0;return e.jsxs("section",{className:"agent-token-stats-panel","aria-label":"Agent token usage statistics",children:[e.jsx("header",{className:"agent-token-stats-panel__header",children:e.jsx("h3",{className:"agent-token-stats-panel__title",children:"Token Usage by Agent"})}),e.jsxs("div",{className:"agent-token-stats-panel__totals",role:"list","aria-label":"Token usage totals",children:[e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Input Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(f)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Output Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(m)})]}),e.jsxs("div",{className:"agent-token-stats-panel__total-card",role:"listitem",children:[e.jsx("span",{className:"agent-token-stats-panel__total-label",children:"Combined Tokens"}),e.jsx("span",{className:"agent-token-stats-panel__total-value",children:ve(c)})]})]}),d?e.jsx("div",{className:"agent-token-stats-panel__table-wrapper",children:e.jsxs("table",{className:"agent-token-stats-panel__table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:"Agent"}),e.jsx("th",{scope:"col",children:"Input"}),e.jsx("th",{scope:"col",children:"Output"}),e.jsx("th",{scope:"col",children:"Total"})]})}),e.jsx("tbody",{children:l.map(r=>e.jsxs("tr",{children:[e.jsxs("th",{scope:"row",className:"agent-token-stats-panel__agent-cell",children:[e.jsx("span",{className:"agent-token-stats-panel__agent-name",children:r.name}),e.jsx("span",{className:"agent-token-stats-panel__agent-id",children:r.id})]}),e.jsx("td",{children:ve(r.inputTokens)}),e.jsx("td",{children:ve(r.outputTokens)}),e.jsx("td",{className:"agent-token-stats-panel__total-cell",children:ve(r.totalTokens)})]},r.id))})]})}):e.jsx("div",{className:"agent-token-stats-panel__empty",role:"status",children:"No token usage recorded yet. Token totals appear here once agents run."})]})}function Ie({title:a="No agents found",description:l="Create an agent to get started",ctaLabel:f="Create Agent",onCtaClick:m}){return e.jsxs("div",{className:"agent-empty",children:[e.jsx(De,{size:48,opacity:.3,className:"agent-empty-state__icon"}),e.jsx("p",{className:"agent-empty-state__title",children:a}),e.jsx("p",{className:"agent-empty-state__description text-secondary",children:l}),m?e.jsx("button",{type:"button",className:"btn btn--primary",onClick:m,children:f}):null]})}const st="fn-agent-tree-expanded";function Je(a){try{const l=Re(st,a);if(l){const f=JSON.parse(l);return new Set(Array.isArray(f)?f:[])}}catch{}return new Set}function Qt(a,l){try{et(st,JSON.stringify([...a]),l)}catch{}}function Jt(a,l){const f=new Map,m=new Map;for(const d of a)if(f.set(d.id,d),d.reportsTo){const r=m.get(d.reportsTo)??[];r.push(d),m.set(d.reportsTo,r)}function c(d,r){const u=m.get(d.id)??[],o=l.has(d.id)?u.map(g=>c(g,r+1)):[];return{agent:d,children:o,depth:r}}return a.filter(d=>!d.reportsTo||!f.has(d.reportsTo)).map(d=>c(d,0))}function Xt(a,l){const[f,m]=s.useState(()=>Je(l));s.useEffect(()=>{m(Je(l))},[l]);const c=s.useMemo(()=>Jt(a,f),[a,f]),d=s.useCallback(o=>{m(g=>{const b=new Set(g);return b.has(o)?b.delete(o):b.add(o),Qt(b,l),b})},[l]),r=s.useCallback(o=>f.has(o),[f]),u=s.useCallback(o=>a.filter(g=>g.reportsTo===o),[a]);return{rootNodes:c,toggleExpand:d,isExpanded:r,getChildren:u,isLoading:!1}}const Xe=3,_e=1e3;function Zt({isOpen:a,onClose:l,onGenerated:f,projectId:m}){const[c,d]=s.useState(""),[r,u]=s.useState({type:"input"}),[o,g]=s.useState(null),[b,N]=s.useState(!1),x=s.useRef(null),I=s.useRef(null);s.useEffect(()=>{a&&r.type==="input"&&I.current?.focus()},[a,r.type]),s.useEffect(()=>{if(!a&&x.current){const j=x.current;x.current=null,Ae(j,m).catch(()=>{})}},[a,m]),s.useEffect(()=>{if(!a)return;const j=T=>{T.key==="Escape"&&p()};return document.addEventListener("keydown",j),()=>document.removeEventListener("keydown",j)},[a]);const p=s.useCallback(()=>{if(x.current){const j=x.current;x.current=null,Ae(j,m).catch(()=>{})}d(""),u({type:"input"}),g(null),N(!1),l()},[l,m]),w=s.useCallback(async()=>{if(!(!c.trim()||c.trim().length<Xe)){g(null),u({type:"loading"});try{const{sessionId:j}=await ot(c.trim(),m);x.current=j;const{spec:T}=await ct(j,m);u({type:"preview",spec:T,sessionId:j})}catch(j){const T=j instanceof Error?j.message:"Failed to generate agent specification";T.includes("429")||T.toLowerCase().includes("rate limit")?g("Too many requests. Please wait a moment and try again."):g(T),u({type:"input"}),x.current=null}}},[c,m]),C=s.useCallback(async()=>{if(x.current){const j=x.current;x.current=null;try{await Ae(j,m)}catch{}}await w()},[w,m]),A=s.useCallback(()=>{r.type==="preview"&&(x.current=null,f(r.spec),d(""),u({type:"input"}),g(null),N(!1),l())},[r,f,l]);if(!a)return null;const E=c.trim().length>=Xe&&c.trim().length<=_e;return e.jsx("div",{className:"agent-dialog-overlay",onClick:j=>{j.target===j.currentTarget&&p()},children:e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Generate agent with AI",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsxs("span",{className:"agent-dialog-header-title",children:[e.jsx("span",{className:"agent-dialog-header-sparkle",children:"✨"}),"Generate Agent"]}),e.jsx("button",{className:"modal-close",onClick:p,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[o&&e.jsx("div",{className:"agent-dialog-error-banner",children:o}),r.type==="input"&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Describe your agent's role and the AI will generate a complete specification including system prompt, suggested configuration, and more."}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-role-description",children:"Role Description"}),e.jsx("textarea",{ref:I,id:"agent-role-description",className:"input agent-dialog-textarea",rows:4,placeholder:'e.g. "Senior frontend code reviewer who specializes in React accessibility"',value:c,onChange:j=>d(j.target.value),onKeyDown:j=>{j.key==="Enter"&&!j.shiftKey&&E&&(j.preventDefault(),w())},maxLength:_e,"aria-describedby":"role-description-hint"}),e.jsxs("div",{id:"role-description-hint",className:"agent-dialog-hint",children:[e.jsx("span",{children:"Describe what your agent should do"}),e.jsxs("span",{children:[c.length,"/",_e]})]})]})]}),r.type==="loading"&&e.jsxs("div",{className:"agent-dialog-loading-center",children:[e.jsx("div",{className:"agent-dialog-spinner spin"}),e.jsx("p",{className:"agent-dialog-loading-text",children:"Generating agent specification..."})]}),r.type==="preview"&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-summary agent-dialog-summary--spaced",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Title"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[r.spec.icon," ",r.spec.title]})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Role"}),e.jsx("span",{children:r.spec.role})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Description"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--body",children:r.spec.description})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value agent-dialog-summary-row-value--capitalize",children:r.spec.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label agent-dialog-summary-row-label--fixed",children:"Max Turns"}),e.jsx("span",{children:r.spec.maxTurns})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{children:["System Prompt",e.jsx("button",{type:"button",className:"agent-dialog-expand-btn",onClick:()=>N(!b),children:b?"Collapse":"Expand"})]}),e.jsxs("div",{className:`agent-generation-prompt-box${b?"":" agent-generation-prompt-box--collapsed"}`,children:[r.spec.systemPrompt,!b&&r.spec.systemPrompt.length>500&&e.jsx("div",{className:"agent-generation-prompt-fade"})]})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[e.jsx("button",{className:"btn",onClick:p,children:"Cancel"}),r.type==="input"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void w(),disabled:!E,children:"Generate"}),r.type==="preview"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn",onClick:()=>void C(),children:"Regenerate"}),e.jsx("button",{className:"btn btn--primary",onClick:A,children:"Use This"})]})]})]})})}const Yt=`# Soul: Chief Executive Officer
|
|
18
18
|
|
|
19
19
|
I am a strategic leader who connects every decision to business outcomes.
|
|
20
20
|
|
|
@@ -512,11 +512,11 @@ Include relevant context files for the executor to read first.`},{id:"reviewer",
|
|
|
512
512
|
Verify error handling is explicit and informative, not silent failures.
|
|
513
513
|
Ensure new code follows existing patterns and conventions in the codebase.
|
|
514
514
|
Look for missing tests on new logic paths, especially edge cases.
|
|
515
|
-
Flag performance concerns only when they have measurable impact.`}];function wn({value:a,onChange:l,projectId:f,disabled:m=!1,id:c,label:d="Skills"}){const[r,u]=s.useState([]),[o,g]=s.useState(!0);s.useEffect(()=>{let p=!1;return g(!0),ut(f).then(w=>{p||u(w)}).catch(()=>{p||u([])}).finally(()=>{p||g(!1)}),()=>{p=!0}},[f]);const b=p=>{a.includes(p)||l([...a,p])},N=p=>{l(a.filter(w=>w!==p))},x=p=>r.find(C=>C.id===p)?.name??p,I=r.filter(p=>!a.includes(p.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[d&&e.jsx("label",{htmlFor:c?`${c}-select`:void 0,className:"skill-multiselect-label",children:d}),a.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:a.map(p=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${p}`,children:[e.jsx("span",{className:"skill-chip-name",children:x(p)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>N(p),disabled:m,"aria-label":`Remove ${x(p)}`,"data-testid":`remove-skill-${p}`,children:"×"})]},p))}),e.jsx("div",{className:"skill-multiselect-add",children:o?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:"Loading skills…"}):I.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:a.length===0?"No skills discovered":"All skills selected"}):e.jsxs("select",{id:c?`${c}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:p=>{p.target.value&&(b(p.target.value),p.target.value="")},disabled:m,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:"Add a skill…"}),I.map(p=>e.jsx("option",{value:p.id,children:p.name},p.id))]})})]})}const Ye=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],jn=new Set(["triage","executor","reviewer","merger","scheduler","engineer","custom"]);function kn({isOpen:a,onClose:l,onCreated:f,projectId:m}){const[c,d]=s.useState(0),[r,u]=s.useState("presets"),[o,g]=s.useState(""),[b,N]=s.useState(""),[x,I]=s.useState(""),[p,w]=s.useState("custom"),[C,A]=s.useState(""),[E,j]=s.useState(""),[T,W]=s.useState(""),[X,H]=s.useState(""),[L,re]=s.useState(""),[_,M]=s.useState({model:"",thinkingLevel:"off",maxTurns:1e3}),[k,K]=s.useState(null),[Z,ue]=s.useState([]),[z,me]=s.useState(!1),[U,Y]=s.useState(null),[P,B]=s.useState(!1),[$,ee]=s.useState([]),[le,F]=s.useState(!1),[G,R]=s.useState([]),[V,ne]=s.useState([]),[Q,se]=s.useState([]),[ae,he]=s.useState(!1);s.useEffect(()=>{a&&(F(!0),mt().then(n=>{ee(n.models),R(n.favoriteProviders),ne(n.favoriteModels)}).catch(()=>{}).finally(()=>F(!1)))},[a]),s.useEffect(()=>{a&&(he(!0),se([]),ht(void 0,m).then(n=>{se(n)}).catch(()=>{se([])}).finally(()=>he(!1)))},[a,m]);const J=_.model.includes("/")?_.model:"",ye=s.useCallback(n=>{const t=jn.has(n.role)?n.role:"custom";g(n.title),N(n.description),I(n.icon),w(t),W(n.systemPrompt),M(i=>({...i,thinkingLevel:n.thinkingLevel,maxTurns:n.maxTurns})),B(!1),d(1)},[]),we=s.useCallback(n=>{M(t=>({...t,model:n}))},[]),O=s.useCallback(async n=>{const t=G,h=t.includes(n)?t.filter(v=>v!==n):[n,...t];R(h);try{await ze({favoriteProviders:h,favoriteModels:V})}catch{R(t)}},[G,V]),D=s.useCallback(async n=>{const t=V,h=t.includes(n)?t.filter(v=>v!==n):[n,...t];ne(h);try{await ze({favoriteProviders:G,favoriteModels:h})}catch{ne(t)}},[G,V]),be=s.useCallback(n=>{K(n.id),g(n.name),I(n.icon),N(n.description??n.title),w(n.role),H(n.soul??""),W(n.instructionsText??""),d(1)},[]);if(!a)return null;const oe=()=>{d(0),u("presets"),g(""),N(""),I(""),w("custom"),A(""),j(""),W(""),H(""),re(""),M({model:"",thinkingLevel:"off",maxTurns:1e3}),K(null),ue([]),Y(null),B(!1),l()},je=async()=>{if(o.trim()){me(!0),Y(null);try{const n={};_.model.trim()&&(n.model=_.model.trim()),_.thinkingLevel!=="off"&&(n.thinkingLevel=_.thinkingLevel),_.maxTurns!==1e3&&(n.maxTurns=_.maxTurns),await ft({name:o.trim(),role:p,...b.trim()?{title:b.trim()}:{},...x.trim()?{icon:x.trim()}:{},...C.trim()?{reportsTo:C.trim()}:{},...E.trim()?{instructionsPath:E.trim()}:{},...T.trim()?{instructionsText:T.trim()}:{},...X.trim()?{soul:X.trim()}:{},...L.trim()?{memory:L.trim()}:{},...Object.keys(n).length>0?{runtimeConfig:n}:{},...Z.length>0?{metadata:{skills:Z}}:{}},m),oe(),f()}catch(n){Y(n instanceof Error?n.message:"Failed to create agent")}finally{me(!1)}}},ge=Ye.find(n=>n.value===p),te=C.trim(),ce=te?Q.find(n=>n.id===te):void 0;return e.jsxs("div",{className:"agent-dialog-overlay",onClick:n=>{n.target===n.currentTarget&&oe()},children:[e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Create new agent",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"New Agent"}),e.jsx("button",{className:"btn-icon",onClick:oe,"aria-label":"Close",children:"×"})]}),e.jsx("div",{className:"agent-dialog-steps",children:[0,1,2].map(n=>e.jsx("div",{className:`agent-dialog-step${n===c?" active":n<c?" completed":""}`,"aria-label":`Step ${n+1}`},n))}),e.jsxs("div",{className:"agent-dialog-body",children:[c===0&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-tabs",role:"tablist","aria-label":"Agent setup mode",children:[e.jsx("button",{id:"agent-dialog-tab-presets",type:"button",role:"tab","aria-controls":"agent-dialog-panel-presets","aria-selected":r==="presets",tabIndex:r==="presets"?0:-1,className:`agent-dialog-tab${r==="presets"?" active":""}`,onClick:()=>u("presets"),"data-testid":"agent-dialog-tab-presets",children:"Preset personas"}),e.jsx("button",{id:"agent-dialog-tab-custom",type:"button",role:"tab","aria-controls":"agent-dialog-panel-custom","aria-selected":r==="custom",tabIndex:r==="custom"?0:-1,className:`agent-dialog-tab${r==="custom"?" active":""}`,onClick:()=>u("custom"),"data-testid":"agent-dialog-tab-custom",children:"Custom agent"})]}),r==="presets"&&e.jsx("div",{id:"agent-dialog-panel-presets",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-presets",children:e.jsxs("div",{className:"agent-presets",children:[e.jsx("div",{className:"agent-presets-header",children:"Choose a preset persona to prefill role, identity, soul, and instructions"}),e.jsx("div",{className:"agent-presets-grid",children:yn.map(n=>e.jsxs("button",{type:"button",className:`agent-preset-card${k===n.id?" selected":""}`,"data-testid":`preset-${n.id}`,onClick:()=>be(n),title:n.title,children:[e.jsx("span",{className:"agent-preset-icon",children:n.icon}),e.jsx("span",{className:"agent-preset-name",children:n.name}),e.jsx("span",{className:"agent-preset-role",children:n.role}),n.description&&e.jsx("span",{className:"agent-preset-description",children:n.description})]},n.id))})]})}),r==="custom"&&e.jsxs("div",{id:"agent-dialog-panel-custom",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-custom",children:[e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Identity"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-name",children:["Name ",!k&&e.jsx("span",{className:"agent-dialog-required",children:"*"})]}),e.jsx("input",{id:"agent-name",type:"text",className:"input",placeholder:"e.g. Frontend Reviewer",value:o,onChange:n=>g(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-title",children:["Title ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:"e.g. Senior Code Reviewer",value:b,onChange:n=>N(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-icon",children:["Icon ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:"e.g. 🤖",value:x,onChange:n=>I(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Role"}),e.jsx("div",{className:"agent-role-grid",children:Ye.map(n=>e.jsxs("button",{type:"button",className:`agent-role-option${p===n.value?" selected":""}`,onClick:()=>w(n.value),children:[e.jsx("span",{className:"agent-role-option-icon",children:n.icon}),e.jsx("span",{className:"agent-role-option-label",children:n.label})]},n.value))})]})]}),e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Configuration"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-reports-to",children:["Reports To ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:C,onChange:n=>A(n.target.value),disabled:ae,children:[e.jsx("option",{value:"",children:"No manager"}),Q.map(n=>e.jsxs("option",{value:n.id,children:[n.name," (",n.id,")"]},n.id))]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-soul",children:["Soul ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-soul",className:"input",rows:2,placeholder:"Describe the agent's personality and communication style...",value:X,onChange:n=>H(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-memory",children:["Agent Memory ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-memory",className:"input",rows:2,placeholder:"Private to this agent — durable preferences, operating habits, and context it should carry across tasks...",value:L,onChange:n=>re(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-path",children:["Instructions Path ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-instructions-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/reviewer.md",value:E,onChange:n=>j(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-text",children:["Inline Instructions ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-instructions-text",className:"input",rows:4,placeholder:"Add custom behavior instructions...",value:T,onChange:n=>W(n.target.value)})]})]}),e.jsxs("div",{className:"agent-dialog-ai-generate",children:[e.jsxs("button",{type:"button",className:"btn btn--ai-generate",onClick:()=>B(!0),children:[e.jsx("span",{children:"✨"}),"Generate with AI"]}),e.jsx("p",{className:"agent-dialog-ai-hint",children:"Describe your agent's role and let AI generate a specification"})]})]})]}),c===1&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Model"}),le?e.jsx("div",{className:"agent-dialog-loading",children:"Loading models…"}):e.jsx(gt,{id:"agent-model",label:"Model",value:J,onChange:we,models:$,placeholder:"Select a model…",favoriteProviders:G,onToggleFavorite:O,favoriteModels:V,onToggleModelFavorite:D})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-thinking",children:"Thinking Level"}),e.jsxs("select",{id:"agent-thinking",className:"select",value:_.thinkingLevel,onChange:n=>M(t=>({...t,thinkingLevel:n.target.value})),children:[e.jsx("option",{value:"off",children:"Off"}),e.jsx("option",{value:"minimal",children:"Minimal"}),e.jsx("option",{value:"low",children:"Low"}),e.jsx("option",{value:"medium",children:"Medium"}),e.jsx("option",{value:"high",children:"High"})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-max-turns",children:"Max Turns"}),e.jsx("input",{id:"agent-max-turns",type:"number",className:"input",min:1,max:2e3,value:_.maxTurns,onChange:n=>M(t=>({...t,maxTurns:Math.max(1,parseInt(n.target.value,10)||1)}))})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx(wn,{id:"agent-skills",label:"Skills",value:Z,onChange:ue,projectId:m}),e.jsx("p",{className:"agent-dialog-optional agent-dialog-skills-hint",children:"Optional skills to assign to this agent"})]})]}),c===2&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Review your agent configuration before creating."}),e.jsxs("div",{className:"agent-dialog-summary",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Name"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[x&&e.jsx("span",{className:"agent-dialog-icon-prefix",children:x}),o]})]}),b&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Title"}),e.jsx("span",{children:b})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Role"}),e.jsxs("span",{children:[ge?.icon," ",ge?.label]})]}),te&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Reports To"}),e.jsx("span",{children:ce?`${ce.name} (${ce.id})`:te})]}),E.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Instructions File"}),e.jsx("span",{children:E.trim()})]}),T.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Inline Instructions"}),e.jsxs("span",{children:[T.trim().length," chars"]})]}),X.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Soul"}),e.jsxs("span",{children:[X.trim().length," chars"]})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Model"}),e.jsx("span",{children:J?e.jsxs(e.Fragment,{children:[e.jsx(pt,{provider:J.split("/")[0],size:"sm"})," ",(()=>{const n=J.indexOf("/"),t=J.slice(0,n),i=J.slice(n+1);return $.find(v=>v.provider===t&&v.id===i)?.name||J})()]}):e.jsx("em",{className:"agent-dialog-summary-row-value--muted",children:"default"})})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value--capitalize",children:_.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Max Turns"}),e.jsx("span",{children:_.maxTurns})]}),Z.length>0&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Skills"}),e.jsxs("span",{children:[Z.length," skill",Z.length!==1?"s":""," selected"]})]})]}),U&&e.jsx("p",{className:"agent-dialog-error",children:U})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c>0&&e.jsx("button",{className:"btn",onClick:()=>d(n=>n-1),disabled:z,children:"Back"}),e.jsx("button",{className:"btn",onClick:oe,disabled:z,children:"Cancel"}),c<2?e.jsx("button",{className:"btn btn--primary",onClick:()=>d(n=>n+1),disabled:c===0&&!o.trim()&&!k,children:"Next"}):e.jsx("button",{className:"btn btn--primary",onClick:()=>void je(),disabled:z||!o.trim(),children:z?"Creating...":"Create"})]})]}),e.jsx(Zt,{isOpen:P,onClose:()=>B(!1),onGenerated:ye,projectId:m})]})}function Nn(a){const l=a.match(/^---\s*\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?$/);if(!l)throw new Error("Missing YAML frontmatter delimiters (---)");const f=l[1].split(/\r?\n/),m=l[2]??"",c={name:""},d=[];let r=!1;for(const u of f){const g=u.trimEnd().trim();if(!g)continue;if(g.startsWith("skills:")){r=!0;continue}if(r&&g.startsWith("- ")){d.push(g.slice(2).trim());continue}r=!1;const[b,...N]=g.split(":"),I=N.join(":").trim().replace(/^['"]|['"]$/g,"");b==="name"&&(c.name=I),b==="title"&&(c.title=I),b==="icon"&&(c.icon=I),b==="role"&&(c.role=I),b==="reportsTo"&&(c.reportsTo=I)}if(!c.name)throw new Error("Missing required field: name");return d.length>0&&(c.skills=d),m.trim().length>0&&(c.instructionBody=m),c}function In({isOpen:a,onClose:l,onImported:f,projectId:m}){const[c,d]=s.useState("input"),[r,u]=s.useState("paste"),[o,g]=s.useState(""),[b,N]=s.useState([]),[x,I]=s.useState("Unknown"),[p,w]=s.useState([]),[C,A]=s.useState([]),[E,j]=s.useState([]),[T,W]=s.useState([]),[X,H]=s.useState(!1),[L,re]=s.useState(!1),[_,M]=s.useState(null),[k,K]=s.useState(null),[Z,ue]=s.useState(null),z=s.useRef(null),me=s.useRef(null),[U,Y]=s.useState([]),[P,B]=s.useState(""),[$,ee]=s.useState(null),[le,F]=s.useState(!1),[G,R]=s.useState(null),V=s.useRef(!1);s.useEffect(()=>{r==="browse"&&!V.current&&!le&&(V.current=!0,F(!0),R(null),Oe().then(n=>{n.error?R(n.error):n.companies.length>0?Y(n.companies):R("No companies available")}).catch(n=>{R(n instanceof Error?n.message:"Failed to load companies")}).finally(()=>{F(!1)}))},[r,le]);const ne=s.useCallback(()=>{V.current=!0,R(null),Y([]),ee(null),F(!0),Oe().then(n=>{n.error?R(n.error):n.companies.length>0?Y(n.companies):R("No companies available")}).catch(n=>{R(n instanceof Error?n.message:"Failed to load companies")}).finally(()=>{F(!1)})},[]),Q=s.useCallback(()=>{d("input"),u("paste"),g(""),N([]),I("Unknown"),w([]),A([]),j([]),W([]),H(!1),re(!1),M(null),K(null),ue(null),Y([]),B(""),ee(null),F(!1),R(null),V.current=!1},[]),se=s.useCallback(()=>{Q(),l()},[Q,l]),ae=s.useCallback(n=>{const t=n.target.files?.[0];if(!t)return;const i=new FileReader;i.onload=h=>{const v=h.target?.result;u("file"),N([]),g(v),M(null)},i.onerror=()=>{M("Failed to read file")},i.readAsText(t),n.target.value=""},[]),he=s.useCallback(async n=>{const t=Array.from(n.target.files??[]);if(t.length!==0)try{const i=t.filter(v=>(v.webkitRelativePath||v.name).toLowerCase().endsWith("agents.md")).sort((v,S)=>{const de=v.webkitRelativePath||v.name,pe=S.webkitRelativePath||S.name;return de.localeCompare(pe)});if(i.length===0){M("Selected directory has no AGENTS.md files");return}const h=[];for(const v of i){const S=await v.text();h.push(Nn(S))}u("directory"),N(h),g(""),M(null)}catch{M("Failed to parse AGENTS.md files from selected directory")}finally{n.target.value=""}},[]);function J(n){if(!m)return`/api${n}`;const t=n.includes("?")?"&":"?";return`/api${n}${t}projectId=${encodeURIComponent(m)}`}const ye=s.useCallback(async()=>{if(r==="directory"&&b.length===0){M("Please select a directory containing AGENTS.md files");return}if(r==="browse"&&!$){M("Please select a company from the catalog");return}if(r!=="directory"&&r!=="browse"&&!o.trim()){M("Please provide manifest content");return}H(!0),M(null);try{let n;r==="directory"?n={agents:b,dryRun:!0}:r==="browse"&&$?n={importSource:"companies.sh",companySlug:$.slug,dryRun:!0}:n={manifest:o,dryRun:!0};const t=await fetch(J("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok){const S=await t.json();throw new Error(S.error??`Parse failed (${t.status})`)}const i=await t.json(),h=i.agents&&i.agents.length>0?i.agents:i.created.map(S=>({name:S,role:"custom"})),v=Array.isArray(i.skills)?i.skills:[];I(i.companyName??"Unknown"),w(h),A(v),j(h.map(S=>S.name)),W(v.map(S=>S.name)),d("preview")}catch(n){M(n instanceof Error?n.message:"Failed to parse manifest")}finally{H(!1)}},[r,b,o,$,m]),we=s.useCallback(async()=>{re(!0),ue(null);try{let n;r==="directory"?n={agents:b,skipExisting:!0,selectedAgents:E,selectedSkills:T}:r==="browse"&&$?n={importSource:"companies.sh",companySlug:$.slug,skipExisting:!0,selectedAgents:E,selectedSkills:T}:n={manifest:o,skipExisting:!0,selectedAgents:E,selectedSkills:T};const t=await fetch(J("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok){const h=await t.json();throw new Error(h.error??`Import failed (${t.status})`)}const i=await t.json();K(i),d("result"),f()}catch(n){ue(n instanceof Error?n.message:"Failed to import agents")}finally{re(!1)}},[r,b,o,$,E,T,m,f]),O=E.length,D=T.length,be=`${O} Agent${O!==1?"s":""}`,oe=`${D} Skill${D!==1?"s":""}`,je=O>0&&D>0?`${be} + ${oe}`:D>0?oe:be,ge=O>0&&D>0?`Importing ${O} agent${O!==1?"s":""} and ${D} skill${D!==1?"s":""}...`:D>0?`Importing ${D} skill${D!==1?"s":""}...`:`Importing ${O} agent${O!==1?"s":""}...`,te=n=>{j(t=>t.includes(n)?t.filter(i=>i!==n):[...t,n])},ce=n=>{W(t=>t.includes(n)?t.filter(i=>i!==n):[...t,n])};return a?e.jsx("div",{className:"agent-dialog-overlay",onClick:n=>{n.target===n.currentTarget&&se()},children:e.jsxs("div",{className:"agent-dialog agent-import-dialog",role:"dialog","aria-modal":"true","aria-label":"Import agents",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"Import Agents"}),e.jsx("button",{className:"modal-close",onClick:se,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[c==="input"&&e.jsxs("div",{className:"agent-import-input",children:[e.jsx("p",{className:"agent-import-description",children:"Import agents from an Agent Companies package. Browse the companies.sh catalog to discover published agents, upload an AGENTS.md file, select a directory, or paste manifest content."}),e.jsxs("div",{className:"agent-import-file-upload",children:[e.jsx("input",{ref:z,type:"file",accept:".md,.txt",onChange:ae,className:"agent-import-file-input","aria-label":"Upload agent manifest file"}),e.jsx("input",{ref:me,type:"file",webkitdirectory:"",multiple:!0,onChange:he,className:"agent-import-file-input","aria-label":"Select directory"}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>z.current?.click(),children:[e.jsx(st,{size:16}),"Choose File"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>me.current?.click(),children:[e.jsx($t,{size:16}),"Select Directory"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>{u("browse"),N([]),g(""),ee(null),M(null)},children:[e.jsx(bt,{size:16}),"Browse Catalog"]}),e.jsx("span",{className:"agent-import-file-hint",children:".md and .txt files supported"})]}),r==="browse"&&e.jsxs("div",{className:"agent-import-browse",children:[e.jsxs("div",{className:"agent-import-browse-header",children:[e.jsxs("div",{className:"agent-import-browse-search",children:[e.jsx(vt,{size:16,className:"agent-import-browse-search-icon"}),e.jsx("input",{type:"text",className:"agent-import-browse-search-input",placeholder:"Search companies...",value:P,onChange:n=>B(n.target.value),"aria-label":"Search companies"})]}),$&&e.jsxs("div",{className:"agent-import-browse-selected",children:[e.jsx("span",{className:"agent-import-browse-selected-label",children:"Selected:"}),e.jsx("span",{className:"agent-import-browse-selected-name",children:$.name}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee(null),children:"Change"})]})]}),le&&e.jsxs("div",{className:"agent-import-browse-loading",children:[e.jsx(Te,{size:20,className:"spin"}),e.jsx("span",{children:"Loading companies..."})]}),G&&e.jsxs("div",{className:"agent-import-browse-error",children:[e.jsx(Me,{size:16}),e.jsx("span",{children:G}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:ne,children:[e.jsx($e,{size:14}),"Retry"]})]}),!le&&!G&&e.jsxs("div",{className:"agent-import-browse-list",children:[U.filter(n=>P===""||n.name.toLowerCase().includes(P.toLowerCase())||(n.tagline?.toLowerCase().includes(P.toLowerCase())??!1)).map(n=>e.jsxs("div",{className:`agent-import-browse-item ${$?.slug===n.slug?"agent-import-browse-item--selected":""}`,onClick:()=>ee(n),role:"button",tabIndex:0,onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&ee(n)},children:[e.jsxs("div",{className:"agent-import-browse-item-header",children:[e.jsx("span",{className:"agent-import-browse-item-name",children:n.name}),n.installs!==void 0&&e.jsxs("span",{className:"agent-import-browse-item-installs",children:[n.installs.toLocaleString()," installs"]})]}),n.tagline&&e.jsx("span",{className:"agent-import-browse-item-tagline",children:n.tagline}),n.repo&&e.jsx("span",{className:"agent-import-browse-item-repo",children:n.repo})]},n.slug)),U.filter(n=>P===""||n.name.toLowerCase().includes(P.toLowerCase())||(n.tagline?.toLowerCase().includes(P.toLowerCase())??!1)).length===0&&e.jsx("p",{className:"agent-import-browse-empty",children:P?"No companies match your search":"No companies available"})]})]}),r!=="browse"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-divider",children:e.jsx("span",{children:"or paste manifest content"})}),e.jsx("textarea",{className:"agent-import-textarea",placeholder:`---
|
|
515
|
+
Flag performance concerns only when they have measurable impact.`}];function wn({value:a,onChange:l,projectId:f,disabled:m=!1,id:c,label:d="Skills"}){const[r,u]=s.useState([]),[o,g]=s.useState(!0);s.useEffect(()=>{let p=!1;return g(!0),dt(f).then(w=>{p||u(w)}).catch(()=>{p||u([])}).finally(()=>{p||g(!1)}),()=>{p=!0}},[f]);const b=p=>{a.includes(p)||l([...a,p])},N=p=>{l(a.filter(w=>w!==p))},x=p=>r.find(C=>C.id===p)?.name??p,I=r.filter(p=>!a.includes(p.id));return e.jsxs("div",{className:"skill-multiselect","data-testid":"skill-multiselect",children:[d&&e.jsx("label",{htmlFor:c?`${c}-select`:void 0,className:"skill-multiselect-label",children:d}),a.length>0&&e.jsx("div",{className:"skill-multiselect-chips","data-testid":"skill-chips",children:a.map(p=>e.jsxs("span",{className:"skill-chip","data-testid":`skill-chip-${p}`,children:[e.jsx("span",{className:"skill-chip-name",children:x(p)}),e.jsx("button",{type:"button",className:"skill-chip-remove",onClick:()=>N(p),disabled:m,"aria-label":`Remove ${x(p)}`,"data-testid":`remove-skill-${p}`,children:"×"})]},p))}),e.jsx("div",{className:"skill-multiselect-add",children:o?e.jsx("span",{className:"skill-multiselect-loading","data-testid":"skills-loading",children:"Loading skills…"}):I.length===0?e.jsx("span",{className:"skill-multiselect-empty","data-testid":"skills-empty",children:a.length===0?"No skills discovered":"All skills selected"}):e.jsxs("select",{id:c?`${c}-select`:void 0,className:"select skill-multiselect-dropdown",value:"",onChange:p=>{p.target.value&&(b(p.target.value),p.target.value="")},disabled:m,"data-testid":"skill-dropdown",children:[e.jsx("option",{value:"",children:"Add a skill…"}),I.map(p=>e.jsx("option",{value:p.id,children:p.name},p.id))]})})]})}const Ze=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],jn=new Set(["triage","executor","reviewer","merger","scheduler","engineer","custom"]);function kn({isOpen:a,onClose:l,onCreated:f,projectId:m}){const[c,d]=s.useState(0),[r,u]=s.useState("presets"),[o,g]=s.useState(""),[b,N]=s.useState(""),[x,I]=s.useState(""),[p,w]=s.useState("custom"),[C,A]=s.useState(""),[E,j]=s.useState(""),[T,W]=s.useState(""),[X,H]=s.useState(""),[L,ie]=s.useState(""),[_,M]=s.useState({model:"",thinkingLevel:"off",maxTurns:1e3}),[k,K]=s.useState(null),[Z,ue]=s.useState([]),[z,me]=s.useState(!1),[U,Y]=s.useState(null),[P,B]=s.useState(!1),[$,ee]=s.useState([]),[re,F]=s.useState(!1),[G,R]=s.useState([]),[V,ne]=s.useState([]),[Q,se]=s.useState([]),[ae,he]=s.useState(!1);s.useEffect(()=>{a&&(F(!0),ut().then(n=>{ee(n.models),R(n.favoriteProviders),ne(n.favoriteModels)}).catch(()=>{}).finally(()=>F(!1)))},[a]),s.useEffect(()=>{a&&(he(!0),se([]),mt(void 0,m).then(n=>{se(n)}).catch(()=>{se([])}).finally(()=>he(!1)))},[a,m]);const J=_.model.includes("/")?_.model:"",ye=s.useCallback(n=>{const t=jn.has(n.role)?n.role:"custom";g(n.title),N(n.description),I(n.icon),w(t),W(n.systemPrompt),M(i=>({...i,thinkingLevel:n.thinkingLevel,maxTurns:n.maxTurns})),B(!1),d(1)},[]),we=s.useCallback(n=>{M(t=>({...t,model:n}))},[]),O=s.useCallback(async n=>{const t=G,h=t.includes(n)?t.filter(v=>v!==n):[n,...t];R(h);try{await ze({favoriteProviders:h,favoriteModels:V})}catch{R(t)}},[G,V]),D=s.useCallback(async n=>{const t=V,h=t.includes(n)?t.filter(v=>v!==n):[n,...t];ne(h);try{await ze({favoriteProviders:G,favoriteModels:h})}catch{ne(t)}},[G,V]),be=s.useCallback(n=>{K(n.id),g(n.name),I(n.icon),N(n.description??n.title),w(n.role),H(n.soul??""),W(n.instructionsText??""),d(1)},[]);if(!a)return null;const le=()=>{d(0),u("presets"),g(""),N(""),I(""),w("custom"),A(""),j(""),W(""),H(""),ie(""),M({model:"",thinkingLevel:"off",maxTurns:1e3}),K(null),ue([]),Y(null),B(!1),l()},je=async()=>{if(o.trim()){me(!0),Y(null);try{const n={};_.model.trim()&&(n.model=_.model.trim()),_.thinkingLevel!=="off"&&(n.thinkingLevel=_.thinkingLevel),_.maxTurns!==1e3&&(n.maxTurns=_.maxTurns),await pt({name:o.trim(),role:p,...b.trim()?{title:b.trim()}:{},...x.trim()?{icon:x.trim()}:{},...C.trim()?{reportsTo:C.trim()}:{},...E.trim()?{instructionsPath:E.trim()}:{},...T.trim()?{instructionsText:T.trim()}:{},...X.trim()?{soul:X.trim()}:{},...L.trim()?{memory:L.trim()}:{},...Object.keys(n).length>0?{runtimeConfig:n}:{},...Z.length>0?{metadata:{skills:Z}}:{}},m),le(),f()}catch(n){Y(n instanceof Error?n.message:"Failed to create agent")}finally{me(!1)}}},ge=Ze.find(n=>n.value===p),te=C.trim(),oe=te?Q.find(n=>n.id===te):void 0;return e.jsxs("div",{className:"agent-dialog-overlay",onClick:n=>{n.target===n.currentTarget&&le()},children:[e.jsxs("div",{className:"agent-dialog",role:"dialog","aria-modal":"true","aria-label":"Create new agent",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"New Agent"}),e.jsx("button",{className:"btn-icon",onClick:le,"aria-label":"Close",children:"×"})]}),e.jsx("div",{className:"agent-dialog-steps",children:[0,1,2].map(n=>e.jsx("div",{className:`agent-dialog-step${n===c?" active":n<c?" completed":""}`,"aria-label":`Step ${n+1}`},n))}),e.jsxs("div",{className:"agent-dialog-body",children:[c===0&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-tabs",role:"tablist","aria-label":"Agent setup mode",children:[e.jsx("button",{id:"agent-dialog-tab-presets",type:"button",role:"tab","aria-controls":"agent-dialog-panel-presets","aria-selected":r==="presets",tabIndex:r==="presets"?0:-1,className:`agent-dialog-tab${r==="presets"?" active":""}`,onClick:()=>u("presets"),"data-testid":"agent-dialog-tab-presets",children:"Preset personas"}),e.jsx("button",{id:"agent-dialog-tab-custom",type:"button",role:"tab","aria-controls":"agent-dialog-panel-custom","aria-selected":r==="custom",tabIndex:r==="custom"?0:-1,className:`agent-dialog-tab${r==="custom"?" active":""}`,onClick:()=>u("custom"),"data-testid":"agent-dialog-tab-custom",children:"Custom agent"})]}),r==="presets"&&e.jsx("div",{id:"agent-dialog-panel-presets",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-presets",children:e.jsxs("div",{className:"agent-presets",children:[e.jsx("div",{className:"agent-presets-header",children:"Choose a preset persona to prefill role, identity, soul, and instructions"}),e.jsx("div",{className:"agent-presets-grid",children:yn.map(n=>e.jsxs("button",{type:"button",className:`agent-preset-card${k===n.id?" selected":""}`,"data-testid":`preset-${n.id}`,onClick:()=>be(n),title:n.title,children:[e.jsx("span",{className:"agent-preset-icon",children:n.icon}),e.jsx("span",{className:"agent-preset-name",children:n.name}),e.jsx("span",{className:"agent-preset-role",children:n.role}),n.description&&e.jsx("span",{className:"agent-preset-description",children:n.description})]},n.id))})]})}),r==="custom"&&e.jsxs("div",{id:"agent-dialog-panel-custom",className:"agent-dialog-tab-panel",role:"tabpanel","aria-labelledby":"agent-dialog-tab-custom",children:[e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Identity"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-name",children:["Name ",!k&&e.jsx("span",{className:"agent-dialog-required",children:"*"})]}),e.jsx("input",{id:"agent-name",type:"text",className:"input",placeholder:"e.g. Frontend Reviewer",value:o,onChange:n=>g(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-title",children:["Title ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:"e.g. Senior Code Reviewer",value:b,onChange:n=>N(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-icon",children:["Icon ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:"e.g. 🤖",value:x,onChange:n=>I(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Role"}),e.jsx("div",{className:"agent-role-grid",children:Ze.map(n=>e.jsxs("button",{type:"button",className:`agent-role-option${p===n.value?" selected":""}`,onClick:()=>w(n.value),children:[e.jsx("span",{className:"agent-role-option-icon",children:n.icon}),e.jsx("span",{className:"agent-role-option-label",children:n.label})]},n.value))})]})]}),e.jsxs("div",{className:"agent-dialog-section",children:[e.jsx("div",{className:"agent-dialog-section-header",children:"Configuration"}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-reports-to",children:["Reports To ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:C,onChange:n=>A(n.target.value),disabled:ae,children:[e.jsx("option",{value:"",children:"No manager"}),Q.map(n=>e.jsxs("option",{value:n.id,children:[n.name," (",n.id,")"]},n.id))]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-soul",children:["Soul ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-soul",className:"input",rows:2,placeholder:"Describe the agent's personality and communication style...",value:X,onChange:n=>H(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-memory",children:["Agent Memory ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-memory",className:"input",rows:2,placeholder:"Private to this agent — durable preferences, operating habits, and context it should carry across tasks...",value:L,onChange:n=>ie(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-path",children:["Instructions Path ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("input",{id:"agent-instructions-path",type:"text",className:"input",placeholder:"e.g. .fusion/agents/reviewer.md",value:E,onChange:n=>j(n.target.value)})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsxs("label",{htmlFor:"agent-instructions-text",children:["Inline Instructions ",e.jsx("span",{className:"agent-dialog-optional",children:"(optional)"})]}),e.jsx("textarea",{id:"agent-instructions-text",className:"input",rows:4,placeholder:"Add custom behavior instructions...",value:T,onChange:n=>W(n.target.value)})]})]}),e.jsxs("div",{className:"agent-dialog-ai-generate",children:[e.jsxs("button",{type:"button",className:"btn btn--ai-generate",onClick:()=>B(!0),children:[e.jsx("span",{children:"✨"}),"Generate with AI"]}),e.jsx("p",{className:"agent-dialog-ai-hint",children:"Describe your agent's role and let AI generate a specification"})]})]})]}),c===1&&e.jsxs("div",{children:[e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{children:"Model"}),re?e.jsx("div",{className:"agent-dialog-loading",children:"Loading models…"}):e.jsx(ht,{id:"agent-model",label:"Model",value:J,onChange:we,models:$,placeholder:"Select a model…",favoriteProviders:G,onToggleFavorite:O,favoriteModels:V,onToggleModelFavorite:D})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-thinking",children:"Thinking Level"}),e.jsxs("select",{id:"agent-thinking",className:"select",value:_.thinkingLevel,onChange:n=>M(t=>({...t,thinkingLevel:n.target.value})),children:[e.jsx("option",{value:"off",children:"Off"}),e.jsx("option",{value:"minimal",children:"Minimal"}),e.jsx("option",{value:"low",children:"Low"}),e.jsx("option",{value:"medium",children:"Medium"}),e.jsx("option",{value:"high",children:"High"})]})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx("label",{htmlFor:"agent-max-turns",children:"Max Turns"}),e.jsx("input",{id:"agent-max-turns",type:"number",className:"input",min:1,max:2e3,value:_.maxTurns,onChange:n=>M(t=>({...t,maxTurns:Math.max(1,parseInt(n.target.value,10)||1)}))})]}),e.jsxs("div",{className:"agent-dialog-field",children:[e.jsx(wn,{id:"agent-skills",label:"Skills",value:Z,onChange:ue,projectId:m}),e.jsx("p",{className:"agent-dialog-optional agent-dialog-skills-hint",children:"Optional skills to assign to this agent"})]})]}),c===2&&e.jsxs("div",{children:[e.jsx("p",{className:"agent-dialog-info",children:"Review your agent configuration before creating."}),e.jsxs("div",{className:"agent-dialog-summary",children:[e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Name"}),e.jsxs("span",{className:"agent-dialog-summary-row-value",children:[x&&e.jsx("span",{className:"agent-dialog-icon-prefix",children:x}),o]})]}),b&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Title"}),e.jsx("span",{children:b})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Role"}),e.jsxs("span",{children:[ge?.icon," ",ge?.label]})]}),te&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Reports To"}),e.jsx("span",{children:oe?`${oe.name} (${oe.id})`:te})]}),E.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Instructions File"}),e.jsx("span",{children:E.trim()})]}),T.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Inline Instructions"}),e.jsxs("span",{children:[T.trim().length," chars"]})]}),X.trim()&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Soul"}),e.jsxs("span",{children:[X.trim().length," chars"]})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Model"}),e.jsx("span",{children:J?e.jsxs(e.Fragment,{children:[e.jsx(gt,{provider:J.split("/")[0],size:"sm"})," ",(()=>{const n=J.indexOf("/"),t=J.slice(0,n),i=J.slice(n+1);return $.find(v=>v.provider===t&&v.id===i)?.name||J})()]}):e.jsx("em",{className:"agent-dialog-summary-row-value--muted",children:"default"})})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Thinking"}),e.jsx("span",{className:"agent-dialog-summary-row-value--capitalize",children:_.thinkingLevel})]}),e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Max Turns"}),e.jsx("span",{children:_.maxTurns})]}),Z.length>0&&e.jsxs("div",{className:"agent-dialog-summary-row",children:[e.jsx("span",{className:"agent-dialog-summary-row-label",children:"Skills"}),e.jsxs("span",{children:[Z.length," skill",Z.length!==1?"s":""," selected"]})]})]}),U&&e.jsx("p",{className:"agent-dialog-error",children:U})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c>0&&e.jsx("button",{className:"btn",onClick:()=>d(n=>n-1),disabled:z,children:"Back"}),e.jsx("button",{className:"btn",onClick:le,disabled:z,children:"Cancel"}),c<2?e.jsx("button",{className:"btn btn--primary",onClick:()=>d(n=>n+1),disabled:c===0&&!o.trim()&&!k,children:"Next"}):e.jsx("button",{className:"btn btn--primary",onClick:()=>void je(),disabled:z||!o.trim(),children:z?"Creating...":"Create"})]})]}),e.jsx(Zt,{isOpen:P,onClose:()=>B(!1),onGenerated:ye,projectId:m})]})}function Nn(a){const l=a.match(/^---\s*\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?$/);if(!l)throw new Error("Missing YAML frontmatter delimiters (---)");const f=l[1].split(/\r?\n/),m=l[2]??"",c={name:""},d=[];let r=!1;for(const u of f){const g=u.trimEnd().trim();if(!g)continue;if(g.startsWith("skills:")){r=!0;continue}if(r&&g.startsWith("- ")){d.push(g.slice(2).trim());continue}r=!1;const[b,...N]=g.split(":"),I=N.join(":").trim().replace(/^['"]|['"]$/g,"");b==="name"&&(c.name=I),b==="title"&&(c.title=I),b==="icon"&&(c.icon=I),b==="role"&&(c.role=I),b==="reportsTo"&&(c.reportsTo=I)}if(!c.name)throw new Error("Missing required field: name");return d.length>0&&(c.skills=d),m.trim().length>0&&(c.instructionBody=m),c}function In({isOpen:a,onClose:l,onImported:f,projectId:m}){const[c,d]=s.useState("input"),[r,u]=s.useState("paste"),[o,g]=s.useState(""),[b,N]=s.useState([]),[x,I]=s.useState("Unknown"),[p,w]=s.useState([]),[C,A]=s.useState([]),[E,j]=s.useState([]),[T,W]=s.useState([]),[X,H]=s.useState(!1),[L,ie]=s.useState(!1),[_,M]=s.useState(null),[k,K]=s.useState(null),[Z,ue]=s.useState(null),z=s.useRef(null),me=s.useRef(null),[U,Y]=s.useState([]),[P,B]=s.useState(""),[$,ee]=s.useState(null),[re,F]=s.useState(!1),[G,R]=s.useState(null),V=s.useRef(!1);s.useEffect(()=>{r==="browse"&&!V.current&&!re&&(V.current=!0,F(!0),R(null),Oe().then(n=>{n.error?R(n.error):n.companies.length>0?Y(n.companies):R("No companies available")}).catch(n=>{R(n instanceof Error?n.message:"Failed to load companies")}).finally(()=>{F(!1)}))},[r,re]);const ne=s.useCallback(()=>{V.current=!0,R(null),Y([]),ee(null),F(!0),Oe().then(n=>{n.error?R(n.error):n.companies.length>0?Y(n.companies):R("No companies available")}).catch(n=>{R(n instanceof Error?n.message:"Failed to load companies")}).finally(()=>{F(!1)})},[]),Q=s.useCallback(()=>{d("input"),u("paste"),g(""),N([]),I("Unknown"),w([]),A([]),j([]),W([]),H(!1),ie(!1),M(null),K(null),ue(null),Y([]),B(""),ee(null),F(!1),R(null),V.current=!1},[]),se=s.useCallback(()=>{Q(),l()},[Q,l]),ae=s.useCallback(n=>{const t=n.target.files?.[0];if(!t)return;const i=new FileReader;i.onload=h=>{const v=h.target?.result;u("file"),N([]),g(v),M(null)},i.onerror=()=>{M("Failed to read file")},i.readAsText(t),n.target.value=""},[]),he=s.useCallback(async n=>{const t=Array.from(n.target.files??[]);if(t.length!==0)try{const i=t.filter(v=>(v.webkitRelativePath||v.name).toLowerCase().endsWith("agents.md")).sort((v,S)=>{const ce=v.webkitRelativePath||v.name,pe=S.webkitRelativePath||S.name;return ce.localeCompare(pe)});if(i.length===0){M("Selected directory has no AGENTS.md files");return}const h=[];for(const v of i){const S=await v.text();h.push(Nn(S))}u("directory"),N(h),g(""),M(null)}catch{M("Failed to parse AGENTS.md files from selected directory")}finally{n.target.value=""}},[]);function J(n){if(!m)return`/api${n}`;const t=n.includes("?")?"&":"?";return`/api${n}${t}projectId=${encodeURIComponent(m)}`}const ye=s.useCallback(async()=>{if(r==="directory"&&b.length===0){M("Please select a directory containing AGENTS.md files");return}if(r==="browse"&&!$){M("Please select a company from the catalog");return}if(r!=="directory"&&r!=="browse"&&!o.trim()){M("Please provide manifest content");return}H(!0),M(null);try{let n;r==="directory"?n={agents:b,dryRun:!0}:r==="browse"&&$?n={importSource:"companies.sh",companySlug:$.slug,dryRun:!0}:n={manifest:o,dryRun:!0};const t=await fetch(J("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok){const S=await t.json();throw new Error(S.error??`Parse failed (${t.status})`)}const i=await t.json(),h=i.agents&&i.agents.length>0?i.agents:i.created.map(S=>({name:S,role:"custom"})),v=Array.isArray(i.skills)?i.skills:[];I(i.companyName??"Unknown"),w(h),A(v),j(h.map(S=>S.name)),W(v.map(S=>S.name)),d("preview")}catch(n){M(n instanceof Error?n.message:"Failed to parse manifest")}finally{H(!1)}},[r,b,o,$,m]),we=s.useCallback(async()=>{ie(!0),ue(null);try{let n;r==="directory"?n={agents:b,skipExisting:!0,selectedAgents:E,selectedSkills:T}:r==="browse"&&$?n={importSource:"companies.sh",companySlug:$.slug,skipExisting:!0,selectedAgents:E,selectedSkills:T}:n={manifest:o,skipExisting:!0,selectedAgents:E,selectedSkills:T};const t=await fetch(J("/agents/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!t.ok){const h=await t.json();throw new Error(h.error??`Import failed (${t.status})`)}const i=await t.json();K(i),d("result"),f()}catch(n){ue(n instanceof Error?n.message:"Failed to import agents")}finally{ie(!1)}},[r,b,o,$,E,T,m,f]),O=E.length,D=T.length,be=`${O} Agent${O!==1?"s":""}`,le=`${D} Skill${D!==1?"s":""}`,je=O>0&&D>0?`${be} + ${le}`:D>0?le:be,ge=O>0&&D>0?`Importing ${O} agent${O!==1?"s":""} and ${D} skill${D!==1?"s":""}...`:D>0?`Importing ${D} skill${D!==1?"s":""}...`:`Importing ${O} agent${O!==1?"s":""}...`,te=n=>{j(t=>t.includes(n)?t.filter(i=>i!==n):[...t,n])},oe=n=>{W(t=>t.includes(n)?t.filter(i=>i!==n):[...t,n])};return a?e.jsx("div",{className:"agent-dialog-overlay",onClick:n=>{n.target===n.currentTarget&&se()},children:e.jsxs("div",{className:"agent-dialog agent-import-dialog",role:"dialog","aria-modal":"true","aria-label":"Import agents",children:[e.jsxs("div",{className:"agent-dialog-header",children:[e.jsx("span",{className:"agent-dialog-header-title",children:"Import Agents"}),e.jsx("button",{className:"modal-close",onClick:se,"aria-label":"Close",children:"×"})]}),e.jsxs("div",{className:"agent-dialog-body",children:[c==="input"&&e.jsxs("div",{className:"agent-import-input",children:[e.jsx("p",{className:"agent-import-description",children:"Import agents from an Agent Companies package. Browse the companies.sh catalog to discover published agents, upload an AGENTS.md file, select a directory, or paste manifest content."}),e.jsxs("div",{className:"agent-import-file-upload",children:[e.jsx("input",{ref:z,type:"file",accept:".md,.txt",onChange:ae,className:"agent-import-file-input","aria-label":"Upload agent manifest file"}),e.jsx("input",{ref:me,type:"file",webkitdirectory:"",multiple:!0,onChange:he,className:"agent-import-file-input","aria-label":"Select directory"}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>z.current?.click(),children:[e.jsx(nt,{size:16}),"Choose File"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>me.current?.click(),children:[e.jsx($t,{size:16}),"Select Directory"]}),e.jsxs("button",{type:"button",className:"btn agent-import-upload-btn",onClick:()=>{u("browse"),N([]),g(""),ee(null),M(null)},children:[e.jsx(ft,{size:16}),"Browse Catalog"]}),e.jsx("span",{className:"agent-import-file-hint",children:".md and .txt files supported"})]}),r==="browse"&&e.jsxs("div",{className:"agent-import-browse",children:[e.jsxs("div",{className:"agent-import-browse-header",children:[e.jsxs("div",{className:"agent-import-browse-search",children:[e.jsx(bt,{size:16,className:"agent-import-browse-search-icon"}),e.jsx("input",{type:"text",className:"agent-import-browse-search-input",placeholder:"Search companies...",value:P,onChange:n=>B(n.target.value),"aria-label":"Search companies"})]}),$&&e.jsxs("div",{className:"agent-import-browse-selected",children:[e.jsx("span",{className:"agent-import-browse-selected-label",children:"Selected:"}),e.jsx("span",{className:"agent-import-browse-selected-name",children:$.name}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ee(null),children:"Change"})]})]}),re&&e.jsxs("div",{className:"agent-import-browse-loading",children:[e.jsx(Te,{size:20,className:"spin"}),e.jsx("span",{children:"Loading companies..."})]}),G&&e.jsxs("div",{className:"agent-import-browse-error",children:[e.jsx(Me,{size:16}),e.jsx("span",{children:G}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:ne,children:[e.jsx($e,{size:14}),"Retry"]})]}),!re&&!G&&e.jsxs("div",{className:"agent-import-browse-list",children:[U.filter(n=>P===""||n.name.toLowerCase().includes(P.toLowerCase())||(n.tagline?.toLowerCase().includes(P.toLowerCase())??!1)).map(n=>e.jsxs("div",{className:`agent-import-browse-item ${$?.slug===n.slug?"agent-import-browse-item--selected":""}`,onClick:()=>ee(n),role:"button",tabIndex:0,onKeyDown:t=>{(t.key==="Enter"||t.key===" ")&&ee(n)},children:[e.jsxs("div",{className:"agent-import-browse-item-header",children:[e.jsx("span",{className:"agent-import-browse-item-name",children:n.name}),n.installs!==void 0&&e.jsxs("span",{className:"agent-import-browse-item-installs",children:[n.installs.toLocaleString()," installs"]})]}),n.tagline&&e.jsx("span",{className:"agent-import-browse-item-tagline",children:n.tagline}),n.repo&&e.jsx("span",{className:"agent-import-browse-item-repo",children:n.repo})]},n.slug)),U.filter(n=>P===""||n.name.toLowerCase().includes(P.toLowerCase())||(n.tagline?.toLowerCase().includes(P.toLowerCase())??!1)).length===0&&e.jsx("p",{className:"agent-import-browse-empty",children:P?"No companies match your search":"No companies available"})]})]}),r!=="browse"&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-divider",children:e.jsx("span",{children:"or paste manifest content"})}),e.jsx("textarea",{className:"agent-import-textarea",placeholder:`---
|
|
516
516
|
name: CEO
|
|
517
517
|
title: Chief Executive Officer
|
|
518
518
|
reportsTo: null
|
|
519
519
|
skills:
|
|
520
520
|
- review
|
|
521
521
|
---
|
|
522
|
-
Agent instructions go here...`,value:o,onChange:n=>{u("paste"),N([]),g(n.target.value),M(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),_&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Me,{size:14}),_]})]}),c==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:x})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(qe,{size:14}),e.jsxs("span",{children:[p.length," agent",p.length!==1?"s":""," found"]})]}),p.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>j(p.map(n=>n.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>j([]),children:"Clear agents"})]}),p.length>0?e.jsx("div",{className:"agent-import-agent-list",children:p.map((n,t)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${n.name}`,checked:E.includes(n.name),onChange:()=>te(n.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:n.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:n.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[n.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[n.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:n.role}),n.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",n.reportsTo]}),n.skills&&n.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",n.skills.join(", ")]})]}),n.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[n.instructionsText.slice(0,100),n.instructionsText.length>100?"...":""]})]})]},t))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),C.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(qe,{size:14}),e.jsxs("span",{children:[C.length," skill",C.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>W(C.map(n=>n.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>W([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:C.map((n,t)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${n.name}`,checked:T.includes(n.name),onChange:()=>ce(n.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:n.name}),n.description&&e.jsx("span",{className:"agent-import-skill-description",children:n.description})]})]},`${n.name}-${t}`))})]}),Z&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Me,{size:14}),Z]})]}),c==="result"&&k&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Se,{size:32})}),e.jsx("h3",{className:"agent-import-result-title",children:"Import Complete"}),e.jsxs("p",{className:"agent-import-result-company",children:["From ",e.jsx("strong",{children:k.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[k.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[k.created.length," created"]})}),k.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[k.skipped.length," skipped (already exist)"]})}),k.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[k.errors.length," error",k.errors.length!==1?"s":""]})})]}),k.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:k.created.map((n,t)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Se,{size:12}),e.jsx("span",{children:n.name})]},t))}),k.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:k.errors.map((n,t)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(He,{size:12}),e.jsxs("span",{children:[n.name,": ",n.error]})]},t))}),k.skills&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-result-divider"}),e.jsx("h4",{className:"agent-import-result-section-title",children:"Skills"}),e.jsxs("div",{className:"agent-import-result-stats",children:[k.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[k.skills.imported.length," skill",k.skills.imported.length!==1?"s":""," imported"]})}),k.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[k.skills.skipped.length," skill",k.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),k.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[k.skills.errors.length," skill",k.skills.errors.length!==1?"s":""," error",k.skills.errors.length!==1?"s":""]})}),k.skills.imported.length===0&&k.skills.skipped.length===0&&k.skills.errors.length===0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsx("span",{children:"No skills in package"})})]}),k.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:k.skills.imported.map((n,t)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Se,{size:12}),e.jsx("span",{children:n.name})]},t))}),k.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:k.skills.errors.map((n,t)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(He,{size:12}),e.jsxs("span",{children:[n.name,": ",n.error]})]},t))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>d("input"),disabled:L,children:"Back"}),e.jsx("button",{className:"btn",onClick:se,disabled:L,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void ye(),disabled:X||(r==="directory"?b.length===0:r==="browse"?!$:!o.trim()),children:X?e.jsxs(e.Fragment,{children:[e.jsx(Te,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void we(),disabled:L||O===0&&D===0,children:L?e.jsxs(e.Fragment,{children:[e.jsx(Te,{size:14,className:"spin"}),ge]}):`Import ${je}`})]})]})}):null}const Cn=s.lazy(()=>Rt(()=>import("./AgentDetailView-B4lRk--v.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8])).then(a=>({default:a.AgentDetailView}))),Ce=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],Pe=[.1,.25,.5,1,2,3,5,10];function Ee(a){switch(a){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function et(a,l){switch(l){case"running":return`${a}--running`;case"active":return`${a}--active`;case"paused":return`${a}--paused`;case"error":return`${a}--error`;case"terminated":return`${a}--terminated`;case"idle":default:return`${a}--idle`}}function it({node:a,onSelect:l,onToggle:f,isExpanded:m,getChildCount:c,getHealthStatus:d,getRoleIcon:r,getSkillBadges:u}){const{agent:o,children:g,depth:b}=a,N=c(o.id),x=m(o.id),I=d(o),p=Ee(o.state);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`agent-tree__node${o.reportsTo?" agent-is-child":""} agent-tree__indent--${Math.min(b,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${N===0?" agent-tree__toggle--leaf":""}`,onClick:()=>N>0&&f(o.id),title:N>0?x?"Collapse":"Expand":"No employees","aria-label":N>0?x?"Collapse":"Expand":"No employees",children:N>0?x?e.jsx(At,{size:16}):e.jsx(nt,{size:16}):e.jsx(De,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(o.id),role:"button",tabIndex:0,onKeyDown:w=>w.key==="Enter"&&l(o.id),children:[e.jsx("span",{className:"agent-tree__icon",children:r(o.role)}),e.jsx("span",{className:"agent-tree__name",children:o.name}),e.jsx("span",{className:`agent-tree__badge ${p}`,children:o.state}),e.jsx("span",{className:"agent-tree__health",style:{color:I.color},title:I.label,children:I.icon}),N>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",N,")"]}),(()=>{const w=u(o);return w.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:w.join(", "),children:[w[0],w.length>1&&` +${w.length-1}`]})})()]})]}),x&&g.length>0&&e.jsx("div",{className:"agent-tree__children",children:g.map(w=>e.jsx(it,{node:w,onSelect:l,onToggle:f,isExpanded:m,getChildCount:c,getHealthStatus:d,getRoleIcon:r,getSkillBadges:u},w.agent.id))})]})}function rt({node:a,onSelect:l,getHealthStatus:f,getRoleIcon:m,getSkillBadges:c}){const{agent:d,children:r}=a,u=f(d),o=Ee(d.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:"org-chart-node-card",onClick:()=>l(d.id),role:"button",tabIndex:0,onKeyDown:g=>g.key==="Enter"&&l(d.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:m(d.role)}),e.jsx("span",{className:"org-chart-node__name",children:d.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${o}`,children:d.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:u.color},title:u.label,children:[u.icon,!u.stateDerived&&e.jsx("span",{className:"text-secondary",children:u.label})]}),(()=>{const g=c(d);if(g.length===0)return null;const b=g.slice(0,2),N=g.length-2;return e.jsxs(e.Fragment,{children:[b.map(x=>e.jsx("span",{className:"org-chart-node__skill",children:x},x)),N>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",N]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${d.name} employees`,children:r.map(g=>e.jsx(rt,{node:g,onSelect:l,getHealthStatus:f,getRoleIcon:m,getSkillBadges:c},g.agent.id))})]})}function Sn({addToast:a,projectId:l}){const[f,m]=s.useState(!1),[c,d]=s.useState("all"),{agents:r,activeAgents:u,stats:o,isLoading:g,loadAgents:b}=xt(l,{filterState:c,showSystemAgents:f}),[N,x]=s.useState(!1),[I,p]=s.useState(!1),[w,C]=s.useState(null),[A,E]=s.useState(()=>{if(typeof window>"u")return"list";const t=Re("fn-agent-view",l);return t==="list"||t==="board"||t==="tree"||t==="org"?t:"list"}),[j,T]=s.useState([]),[W,X]=s.useState(!1),[H,L]=s.useState(!1),re=s.useRef(null),_=s.useRef(null),M=s.useId();s.useEffect(()=>{const t=Re("fn-agent-view",l);if(t==="list"||t==="board"||t==="tree"||t==="org"){E(t);return}E("list")},[l]),s.useEffect(()=>{tt("fn-agent-view",A,l)},[A,l]);const[k,K]=s.useState(null),Z=s.useRef(null),[ue,z]=s.useState(null),[me,U]=s.useState(null),[Y,P]=s.useState({}),[B,$]=s.useState(1),[ee,le]=s.useState(!1),[F,G]=s.useState(new Set),R=s.useRef(!0);s.useEffect(()=>(R.current=!0,()=>{R.current=!1}),[]),s.useEffect(()=>{yt(l).then(t=>{R.current&&$(t.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const V=s.useCallback(async t=>{const i=Number.isFinite(t)&&t>0?t:1;$(i),le(!0);try{await wt({heartbeatMultiplier:i},l),a(`Heartbeat speed set to ×${i.toFixed(1)}`,"success")}catch(h){a(`Failed to save heartbeat multiplier: ${ie(h)}`,"error")}finally{R.current&&le(!1)}},[l,a]),ne=Xt(r,l),Q=s.useMemo(()=>r.filter(t=>f||!Ve(t)),[r,f]),se=s.useMemo(()=>{if(f)return j;const t=i=>Ve(i.agent)?null:{...i,children:i.children.map(t).filter(h=>h!==null)};return j.map(t).filter(i=>i!==null)},[j,f]);s.useEffect(()=>{if(A!=="org")return;let t=!1;return X(!0),jt(l,{includeEphemeral:f}).then(i=>{t||T(i)}).catch(i=>{t||(a(`Failed to load org chart: ${ie(i)}`,"error"),T([]))}).finally(()=>{t||X(!1)}),()=>{t=!0}},[A,l,f,a]),s.useEffect(()=>{const t=setInterval(()=>{b()},3e4);return()=>{clearInterval(t)}},[b]),s.useEffect(()=>{if(!H)return;const t=h=>{const v=h.target;v&&(re.current?.contains(v)||_.current?.contains(v)||L(!1))},i=h=>{h.key==="Escape"&&(L(!1),_.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",i),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",i)}},[H]);const ae=async(t,i)=>{if(!F.has(t)){G(h=>new Set(h).add(t));try{if(await _t(t,i,l),a(`Agent state updated to ${i}`,"success"),i==="active")try{await Ge(t,l)}catch(h){a(`Agent activated, but failed to start run: ${ie(h)}`,"error")}b()}catch(h){a(`Failed to update state: ${ie(h)}`,"error")}finally{G(h=>{const v=new Set(h);return v.delete(t),v})}}},he=async(t,i)=>{if(confirm(`Delete agent "${i}"? This cannot be undone.`))try{await Pt(t,l),a(`Agent "${i}" deleted`,"success"),b()}catch(h){a(`Failed to delete agent: ${ie(h)}`,"error")}},J=async(t,i)=>{const h=r.find(v=>v.id===t);if(h){if(h.role===i){K(null);return}try{await Ne(t,{role:i},l),a(`Agent role updated to ${Ce.find(v=>v.value===i)?.label??i}`,"success"),K(null),b()}catch(v){a(`Failed to update role: ${ie(v)}`,"error")}}},ye=(t,i)=>{t.key==="Escape"&&K(null)},we=async(t,i)=>{me===t.id&&(U(null),P(h=>{const v={...h};return delete v[t.id],v})),z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:i}},l),a(`Heartbeat interval updated to ${Be(i)} for ${t.name}`,"success"),b()}catch(h){a(`Failed to update heartbeat interval: ${ie(h)}`,"error")}finally{z(null)}},O=async t=>{const i=Y[t.id]??"";if(i.trim()===""){a("Please enter a heartbeat interval in minutes","error");return}const h=Number(i);if(isNaN(h)){a("Heartbeat interval must be a valid number","error");return}if(h<=0){a("Heartbeat interval must be greater than 0","error");return}if(h>=1&&h<5){z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Mt}},l),a(`Heartbeat interval set to 5 minutes (minimum). ${h} minute${h!==1?"s":""} was below the 5-minute minimum.`,"success"),U(null),P(S=>{const de={...S};return delete de[t.id],de}),b()}catch(S){a(`Failed to update heartbeat interval: ${ie(S)}`,"error")}finally{z(null)}return}const v=Math.round(h*6e4);z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:v}},l),a(`Heartbeat interval updated to ${Be(v)} for ${t.name}`,"success"),U(null),P(S=>{const de={...S};return delete de[t.id],de}),b()}catch(S){a(`Failed to update heartbeat interval: ${ie(S)}`,"error")}finally{z(null)}},D=t=>{const i=We(t.runtimeConfig?.heartbeatIntervalMs),h=Math.round(i/6e4);U(t.id),P(v=>({...v,[t.id]:String(h)}))},be=s.useCallback(()=>{C(null)},[]),oe=s.useCallback(t=>{C(t)},[]),je=async(t,i)=>{try{await Ge(t,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),a(`Heartbeat run started for ${i}`,"success"),b()}catch(h){a(`Failed to start heartbeat run: ${ie(h)}`,"error")}},ge=t=>Ce.find(i=>i.value===t)?.label??t,te=t=>Ce.find(i=>i.value===t)?.icon??"◆",ce=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],n=t=>Tt(t);return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(De,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>E("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(kt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>E("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(xe,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="tree"?" active":""}`,onClick:()=>E("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":A==="tree",children:e.jsx(Nt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>E("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(zt,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:_,className:`btn-icon agent-controls-trigger${H?" agent-controls-trigger--active":""}`,onClick:()=>L(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":H,"aria-controls":M,children:e.jsx(qt,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void b(),title:"Refresh","aria-label":"Refresh",children:e.jsx($e,{size:16,className:g?"spin":void 0})}),e.jsxs("button",{className:"btn btn--primary",onClick:()=>{x(!0),L(!1)},children:[e.jsx(It,{size:16}),"New Agent"]})]})]})]}),H&&e.jsxs("div",{ref:re,id:M,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(Ct,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:c,onChange:t=>d(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:f,onChange:t=>m(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{p(!0),L(!1)},children:[e.jsx(st,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:B,onChange:t=>{const i=Number(t.target.value);V(Number.isFinite(i)&&i>0?i:1)},disabled:ee}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",B.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Pe.reduce((t,i)=>Math.abs(i-B)<Math.abs(t-B)?i:t,Pe[0])),onChange:t=>{const i=Number(t.target.value);V(Number.isFinite(i)&&i>0?i:1)},disabled:ee,"aria-label":"Heartbeat speed preset",children:Pe.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Gt,{agents:Q})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(Bt,{stats:o}),e.jsx(kn,{isOpen:N,onClose:()=>x(!1),onCreated:()=>{x(!1),b()},projectId:l}),e.jsx(In,{isOpen:I,onClose:()=>p(!1),onImported:()=>void b(),projectId:l}),A==="tree"?e.jsx("div",{className:"agent-tree__view",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):ne.rootNodes.map(t=>e.jsx(it,{node:t,onSelect:C,onToggle:ne.toggleExpand,isExpanded:ne.isExpanded,getChildCount:i=>ne.getChildren(i).length,getHealthStatus:n,getRoleIcon:te,getSkillBadges:ce},t.agent.id))}):A==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:W?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx($e,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):se.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):se.map(t=>e.jsx(rt,{node:t,onSelect:C,getHealthStatus:n,getRoleIcon:te,getSkillBadges:ce},t.agent.id))}):A==="board"?e.jsx("div",{className:"agent-board",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):Q.map(t=>{const i=n(t),h=Ee(t.state),v=et("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${v}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>C(t.id),role:"button",tabIndex:0,onKeyDown:S=>S.key==="Enter"&&C(t.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:te(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:ge(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${h}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:i.color},title:i.label,children:[i.icon,!i.stateDerived&&` ${i.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):Q.map(t=>{const i=n(t),h=Ee(t.state),v=et("agent-card",t.state),S=We(t.runtimeConfig?.heartbeatIntervalMs),de=St(S),pe=ue===t.id;return e.jsxs("div",{className:`agent-card ${v}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>C(t.id),role:"button",tabIndex:0,onKeyDown:y=>y.key==="Enter"&&C(t.id),children:[k===t.id?e.jsx("select",{ref:Z,className:"select agent-role-select",value:t.role,onChange:y=>void J(t.id,y.target.value),onKeyDown:y=>ye(y,t.id),onBlur:()=>K(null),autoFocus:!0,children:Ce.map(y=>e.jsxs("option",{value:y.value,children:[y.icon," ",y.label]},y.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:y=>{y.stopPropagation(),K(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.stopPropagation(),K(t.id))},children:te(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(nt,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${h}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:i.color},title:i.label,children:[i.icon,!i.stateDerived&&` ${i.label}`]}),e.jsx("span",{className:"badge text-secondary",children:ge(t.role)}),(()=>{const y=ce(t);if(y.length===0)return null;const q=y.slice(0,2),fe=y.length-2;return e.jsxs(e.Fragment,{children:[q.map(Le=>e.jsx("span",{className:"badge badge-skill",children:Le},Le)),fe>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",fe]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),me===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Y[t.id]??"",onChange:y=>P(q=>({...q,[t.id]:y.target.value})),onKeyDown:y=>{y.key==="Enter"?O(t):y.key==="Escape"&&(U(null),P(q=>{const fe={...q};return delete fe[t.id],fe}))},disabled:pe,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void O(t),disabled:pe,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{U(null),P(y=>{const q={...y};return delete q[t.id],q})},disabled:pe,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:S,onChange:y=>{const q=y.target.value;q==="__custom__"?D(t):we(t,Number(q))},disabled:pe,"aria-label":`Set heartbeat interval for ${t.name}`,children:[de.map(y=>e.jsx("option",{value:y.value,children:y.label},y.value)),Et.some(y=>y.value===S)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),pe&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const y=new Date(t.lastHeartbeatAt),q=new Date(y.getTime()+S),fe=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:y.toLocaleString(),children:["Last: ",y.toLocaleTimeString()]}),fe&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:q.toLocaleString(),children:["Next: ",q.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Activate",children:[e.jsx(ke,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void he(t.id,t.name),title:"Delete",children:[e.jsx(Ke,{size:14})," Delete"]})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void je(t.id,t.name),disabled:F.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(xe,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"paused"),disabled:F.has(t.id),title:"Pause",children:[e.jsx(Ue,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Resume",children:[e.jsx(ke,{size:14})," Resume"]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",disabled:!0,title:"Run in progress","aria-label":`Heartbeat run in progress for ${t.name}`,children:[e.jsx(xe,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"paused"),disabled:F.has(t.id),title:"Pause",children:[e.jsx(Ue,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Retry",children:[e.jsx(ke,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Start",children:[e.jsx(ke,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void he(t.id,t.name),title:"Delete",children:[e.jsx(Ke,{size:14})," Delete"]})]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>C(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"})]})]},t.id)})}),e.jsx(Kt,{agents:u,projectId:l,onAgentSelect:C})]}),w&&e.jsx(s.Suspense,{fallback:null,children:e.jsx(Cn,{agentId:w,projectId:l,onClose:be,addToast:a,onChildClick:oe})})]})}const _n=Object.freeze(Object.defineProperty({__proto__:null,AgentsView:Sn},Symbol.toStringTag,{value:"Module"}));export{_n as A,wn as S};
|
|
522
|
+
Agent instructions go here...`,value:o,onChange:n=>{u("paste"),N([]),g(n.target.value),M(null)},rows:8,"aria-label":"Manifest content"})]}),e.jsxs("p",{className:"agent-import-file-hint",children:["Current input: ",r]}),_&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Me,{size:14}),_]})]}),c==="preview"&&e.jsxs("div",{className:"agent-import-preview",children:[e.jsxs("div",{className:"agent-import-company",children:[e.jsx("span",{className:"agent-import-company-label",children:"Company"}),e.jsx("span",{className:"agent-import-company-name",children:x})]}),e.jsxs("div",{className:"agent-import-count",children:[e.jsx(qe,{size:14}),e.jsxs("span",{children:[p.length," agent",p.length!==1?"s":""," found"]})]}),p.length>0&&e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>j(p.map(n=>n.name)),children:"Select all agents"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>j([]),children:"Clear agents"})]}),p.length>0?e.jsx("div",{className:"agent-import-agent-list",children:p.map((n,t)=>e.jsxs("div",{className:"agent-import-agent-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select agent ${n.name}`,checked:E.includes(n.name),onChange:()=>te(n.name)})}),e.jsx("span",{className:"agent-import-agent-icon",children:n.icon||"🤖"}),e.jsxs("div",{className:"agent-import-agent-details",children:[e.jsx("span",{className:"agent-import-agent-name",children:n.name}),e.jsxs("span",{className:"agent-import-agent-meta",children:[n.title&&e.jsxs("span",{className:"agent-import-agent-title",children:[n.title," · "]}),e.jsx("span",{className:"agent-import-agent-role",children:n.role}),n.reportsTo&&e.jsxs("span",{className:"agent-import-agent-reports",children:[" · reports to ",n.reportsTo]}),n.skills&&n.skills.length>0&&e.jsxs("span",{className:"agent-import-agent-model",children:[" · skills: ",n.skills.join(", ")]})]}),n.instructionsText&&e.jsxs("span",{className:"agent-import-agent-instructions",children:[n.instructionsText.slice(0,100),n.instructionsText.length>100?"...":""]})]})]},t))}):e.jsx("p",{className:"agent-import-empty",children:"No agents found in the manifest."}),C.length>0&&e.jsxs("div",{className:"agent-import-skills-section",children:[e.jsxs("div",{className:"agent-import-count",children:[e.jsx(qe,{size:14}),e.jsxs("span",{children:[C.length," skill",C.length!==1?"s":""," found"]})]}),e.jsxs("div",{className:"agent-import-selection-controls",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>W(C.map(n=>n.name)),children:"Select all skills"}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>W([]),children:"Clear skills"})]}),e.jsx("div",{className:"agent-import-skill-list",children:C.map((n,t)=>e.jsxs("div",{className:"agent-import-skill-item",children:[e.jsx("label",{className:"checkbox-label",children:e.jsx("input",{type:"checkbox","aria-label":`Select skill ${n.name}`,checked:T.includes(n.name),onChange:()=>oe(n.name)})}),e.jsx("span",{className:"agent-import-skill-icon",children:"⚡"}),e.jsxs("div",{className:"agent-import-skill-details",children:[e.jsx("span",{className:"agent-import-skill-name",children:n.name}),n.description&&e.jsx("span",{className:"agent-import-skill-description",children:n.description})]})]},`${n.name}-${t}`))})]}),Z&&e.jsxs("p",{className:"agent-dialog-error",children:[e.jsx(Me,{size:14}),Z]})]}),c==="result"&&k&&e.jsxs("div",{className:"agent-import-result",children:[e.jsx("div",{className:"agent-import-result-icon",children:e.jsx(Se,{size:32})}),e.jsx("h3",{className:"agent-import-result-title",children:"Import Complete"}),e.jsxs("p",{className:"agent-import-result-company",children:["From ",e.jsx("strong",{children:k.companyName??"Unknown"})]}),e.jsxs("div",{className:"agent-import-result-stats",children:[k.created.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[k.created.length," created"]})}),k.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[k.skipped.length," skipped (already exist)"]})}),k.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[k.errors.length," error",k.errors.length!==1?"s":""]})})]}),k.created.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:k.created.map((n,t)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Se,{size:12}),e.jsx("span",{children:n.name})]},t))}),k.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:k.errors.map((n,t)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(He,{size:12}),e.jsxs("span",{children:[n.name,": ",n.error]})]},t))}),k.skills&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"agent-import-result-divider"}),e.jsx("h4",{className:"agent-import-result-section-title",children:"Skills"}),e.jsxs("div",{className:"agent-import-result-stats",children:[k.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--success",children:e.jsxs("span",{children:[k.skills.imported.length," skill",k.skills.imported.length!==1?"s":""," imported"]})}),k.skills.skipped.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsxs("span",{children:[k.skills.skipped.length," skill",k.skills.skipped.length!==1?"s":""," skipped (already exist)"]})}),k.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--error",children:e.jsxs("span",{children:[k.skills.errors.length," skill",k.skills.errors.length!==1?"s":""," error",k.skills.errors.length!==1?"s":""]})}),k.skills.imported.length===0&&k.skills.skipped.length===0&&k.skills.errors.length===0&&e.jsx("div",{className:"agent-import-result-stat agent-import-result-stat--skipped",children:e.jsx("span",{children:"No skills in package"})})]}),k.skills.imported.length>0&&e.jsx("div",{className:"agent-import-result-agents",children:k.skills.imported.map((n,t)=>e.jsxs("div",{className:"agent-import-result-agent",children:[e.jsx(Se,{size:12}),e.jsx("span",{children:n.name})]},t))}),k.skills.errors.length>0&&e.jsx("div",{className:"agent-import-result-errors",children:k.skills.errors.map((n,t)=>e.jsxs("div",{className:"agent-import-result-error",children:[e.jsx(He,{size:12}),e.jsxs("span",{children:[n.name,": ",n.error]})]},t))})]})]})]}),e.jsxs("div",{className:"agent-dialog-footer",children:[c==="preview"&&e.jsx("button",{className:"btn",onClick:()=>d("input"),disabled:L,children:"Back"}),e.jsx("button",{className:"btn",onClick:se,disabled:L,children:c==="result"?"Close":"Cancel"}),c==="input"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void ye(),disabled:X||(r==="directory"?b.length===0:r==="browse"?!$:!o.trim()),children:X?e.jsxs(e.Fragment,{children:[e.jsx(Te,{size:14,className:"spin"}),"Parsing..."]}):"Preview"}),c==="preview"&&e.jsx("button",{className:"btn btn--primary",onClick:()=>void we(),disabled:L||O===0&&D===0,children:L?e.jsxs(e.Fragment,{children:[e.jsx(Te,{size:14,className:"spin"}),ge]}):`Import ${je}`})]})]})}):null}const Cn=s.lazy(()=>Rt(()=>import("./AgentDetailView-DJwWfkpv.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8])).then(a=>({default:a.AgentDetailView}))),Ce=[{value:"triage",label:"Triage",icon:"⊕"},{value:"executor",label:"Executor",icon:"▶"},{value:"reviewer",label:"Reviewer",icon:"⊙"},{value:"merger",label:"Merger",icon:"⊞"},{value:"scheduler",label:"Scheduler",icon:"◷"},{value:"engineer",label:"Engineer",icon:"⎔"},{value:"custom",label:"Custom",icon:"✦"}],Pe=[.1,.25,.5,1,2,3,5,10];function Ee(a){switch(a){case"running":return"agent-badge--running";case"active":return"agent-badge--active";case"paused":return"agent-badge--paused";case"error":return"agent-badge--error";case"terminated":return"agent-badge--terminated";case"idle":default:return"agent-badge--idle"}}function Ye(a,l){switch(l){case"running":return`${a}--running`;case"active":return`${a}--active`;case"paused":return`${a}--paused`;case"error":return`${a}--error`;case"terminated":return`${a}--terminated`;case"idle":default:return`${a}--idle`}}function at({node:a,onSelect:l,onToggle:f,isExpanded:m,getChildCount:c,getHealthStatus:d,getRoleIcon:r,getSkillBadges:u}){const{agent:o,children:g,depth:b}=a,N=c(o.id),x=m(o.id),I=d(o),p=Ee(o.state);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`agent-tree__node${o.reportsTo?" agent-is-child":""} agent-tree__indent--${Math.min(b,4)}`,children:[e.jsx("button",{className:`agent-tree__toggle${N===0?" agent-tree__toggle--leaf":""}`,onClick:()=>N>0&&f(o.id),title:N>0?x?"Collapse":"Expand":"No employees","aria-label":N>0?x?"Collapse":"Expand":"No employees",children:N>0?x?e.jsx(Et,{size:16}):e.jsx(tt,{size:16}):e.jsx(De,{size:14})}),e.jsxs("div",{className:"agent-tree__content",onClick:()=>l(o.id),role:"button",tabIndex:0,onKeyDown:w=>w.key==="Enter"&&l(o.id),children:[e.jsx("span",{className:"agent-tree__icon",children:r(o.role)}),e.jsx("span",{className:"agent-tree__name",children:o.name}),e.jsx("span",{className:`agent-tree__badge ${p}`,children:o.state}),e.jsx("span",{className:"agent-tree__health",style:{color:I.color},title:I.label,children:I.icon}),N>0&&e.jsxs("span",{className:"agent-tree__count text-secondary",children:["(",N,")"]}),(()=>{const w=u(o);return w.length===0?null:e.jsxs("span",{className:"agent-tree__skill",title:w.join(", "),children:[w[0],w.length>1&&` +${w.length-1}`]})})()]})]}),x&&g.length>0&&e.jsx("div",{className:"agent-tree__children",children:g.map(w=>e.jsx(at,{node:w,onSelect:l,onToggle:f,isExpanded:m,getChildCount:c,getHealthStatus:d,getRoleIcon:r,getSkillBadges:u},w.agent.id))})]})}function it({node:a,onSelect:l,getHealthStatus:f,getRoleIcon:m,getSkillBadges:c}){const{agent:d,children:r}=a,u=f(d),o=Ee(d.state);return e.jsxs("div",{className:`org-chart-node${r.length>0?" org-chart-node--has-children":""}`,children:[e.jsxs("div",{className:"org-chart-node-card",onClick:()=>l(d.id),role:"button",tabIndex:0,onKeyDown:g=>g.key==="Enter"&&l(d.id),children:[e.jsxs("div",{className:"org-chart-node__header",children:[e.jsx("span",{className:"org-chart-node__icon",children:m(d.role)}),e.jsx("span",{className:"org-chart-node__name",children:d.name})]}),e.jsxs("div",{className:"org-chart-node__meta",children:[e.jsx("span",{className:`org-chart-node__badge ${o}`,children:d.state}),e.jsxs("span",{className:"org-chart-node__health",style:{color:u.color},title:u.label,children:[u.icon,!u.stateDerived&&e.jsx("span",{className:"text-secondary",children:u.label})]}),(()=>{const g=c(d);if(g.length===0)return null;const b=g.slice(0,2),N=g.length-2;return e.jsxs(e.Fragment,{children:[b.map(x=>e.jsx("span",{className:"org-chart-node__skill",children:x},x)),N>0&&e.jsxs("span",{className:"org-chart-node__skill",children:["+",N]})]})})()]})]}),r.length>0&&e.jsx("div",{className:"org-chart-children",role:"group","aria-label":`${d.name} employees`,children:r.map(g=>e.jsx(it,{node:g,onSelect:l,getHealthStatus:f,getRoleIcon:m,getSkillBadges:c},g.agent.id))})]})}function Sn({addToast:a,projectId:l}){const[f,m]=s.useState(!1),[c,d]=s.useState("all"),{agents:r,activeAgents:u,stats:o,isLoading:g,loadAgents:b}=vt(l,{filterState:c,showSystemAgents:f}),[N,x]=s.useState(!1),[I,p]=s.useState(!1),[w,C]=s.useState(null),[A,E]=s.useState(()=>{if(typeof window>"u")return"list";const t=Re("fn-agent-view",l);return t==="list"||t==="board"||t==="tree"||t==="org"?t:"list"}),[j,T]=s.useState([]),[W,X]=s.useState(!1),[H,L]=s.useState(!1),ie=s.useRef(null),_=s.useRef(null),M=s.useId();s.useEffect(()=>{const t=Re("fn-agent-view",l);if(t==="list"||t==="board"||t==="tree"||t==="org"){E(t);return}E("list")},[l]),s.useEffect(()=>{et("fn-agent-view",A,l)},[A,l]);const[k,K]=s.useState(null),Z=s.useRef(null),[ue,z]=s.useState(null),[me,U]=s.useState(null),[Y,P]=s.useState({}),[B,$]=s.useState(1),[ee,re]=s.useState(!1),[F,G]=s.useState(new Set),R=s.useRef(!0);s.useEffect(()=>(R.current=!0,()=>{R.current=!1}),[]),s.useEffect(()=>{xt(l).then(t=>{R.current&&$(t.heartbeatMultiplier??1)}).catch(()=>{})},[l]);const V=s.useCallback(async t=>{const i=Number.isFinite(t)&&t>0?t:1;$(i),re(!0);try{await yt({heartbeatMultiplier:i},l),a(`Heartbeat speed set to ×${i.toFixed(1)}`,"success")}catch(h){a(`Failed to save heartbeat multiplier: ${de(h)}`,"error")}finally{R.current&&re(!1)}},[l,a]),ne=Xt(r,l),Q=s.useMemo(()=>r.filter(t=>f||!Ve(t)),[r,f]),se=s.useMemo(()=>{if(f)return j;const t=i=>Ve(i.agent)?null:{...i,children:i.children.map(t).filter(h=>h!==null)};return j.map(t).filter(i=>i!==null)},[j,f]);s.useEffect(()=>{if(A!=="org")return;let t=!1;return X(!0),wt(l,{includeEphemeral:f}).then(i=>{t||T(i)}).catch(i=>{t||(a(`Failed to load org chart: ${de(i)}`,"error"),T([]))}).finally(()=>{t||X(!1)}),()=>{t=!0}},[A,l,f,a]),s.useEffect(()=>{const t=setInterval(()=>{b()},3e4);return()=>{clearInterval(t)}},[b]),s.useEffect(()=>{if(!H)return;const t=h=>{const v=h.target;v&&(ie.current?.contains(v)||_.current?.contains(v)||L(!1))},i=h=>{h.key==="Escape"&&(L(!1),_.current?.focus())};return document.addEventListener("mousedown",t),document.addEventListener("touchstart",t),document.addEventListener("keydown",i),()=>{document.removeEventListener("mousedown",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",i)}},[H]);const ae=async(t,i)=>{if(!F.has(t)){G(h=>new Set(h).add(t));try{await Mt(t,i,l),a(`Agent state updated to ${i}`,"success"),b()}catch(h){a(`Failed to update state: ${de(h)}`,"error")}finally{G(h=>{const v=new Set(h);return v.delete(t),v})}}},he=async(t,i)=>{if(confirm(`Delete agent "${i}"? This cannot be undone.`))try{await _t(t,l),a(`Agent "${i}" deleted`,"success"),b()}catch(h){a(`Failed to delete agent: ${de(h)}`,"error")}},J=async(t,i)=>{const h=r.find(v=>v.id===t);if(h){if(h.role===i){K(null);return}try{await Ne(t,{role:i},l),a(`Agent role updated to ${Ce.find(v=>v.value===i)?.label??i}`,"success"),K(null),b()}catch(v){a(`Failed to update role: ${de(v)}`,"error")}}},ye=(t,i)=>{t.key==="Escape"&&K(null)},we=async(t,i)=>{me===t.id&&(U(null),P(h=>{const v={...h};return delete v[t.id],v})),z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:i}},l),a(`Heartbeat interval updated to ${Be(i)} for ${t.name}`,"success"),b()}catch(h){a(`Failed to update heartbeat interval: ${de(h)}`,"error")}finally{z(null)}},O=async t=>{const i=Y[t.id]??"";if(i.trim()===""){a("Please enter a heartbeat interval in minutes","error");return}const h=Number(i);if(isNaN(h)){a("Heartbeat interval must be a valid number","error");return}if(h<=0){a("Heartbeat interval must be greater than 0","error");return}if(h>=1&&h<5){z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:Tt}},l),a(`Heartbeat interval set to 5 minutes (minimum). ${h} minute${h!==1?"s":""} was below the 5-minute minimum.`,"success"),U(null),P(S=>{const ce={...S};return delete ce[t.id],ce}),b()}catch(S){a(`Failed to update heartbeat interval: ${de(S)}`,"error")}finally{z(null)}return}const v=Math.round(h*6e4);z(t.id);try{await Ne(t.id,{runtimeConfig:{...t.runtimeConfig??{},heartbeatIntervalMs:v}},l),a(`Heartbeat interval updated to ${Be(v)} for ${t.name}`,"success"),U(null),P(S=>{const ce={...S};return delete ce[t.id],ce}),b()}catch(S){a(`Failed to update heartbeat interval: ${de(S)}`,"error")}finally{z(null)}},D=t=>{const i=We(t.runtimeConfig?.heartbeatIntervalMs),h=Math.round(i/6e4);U(t.id),P(v=>({...v,[t.id]:String(h)}))},be=s.useCallback(()=>{C(null)},[]),le=s.useCallback(t=>{C(t)},[]),je=async(t,i)=>{try{await Pt(t,l,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),a(`Heartbeat run started for ${i}`,"success"),b()}catch(h){a(`Failed to start heartbeat run: ${de(h)}`,"error")}},ge=t=>Ce.find(i=>i.value===t)?.label??t,te=t=>Ce.find(i=>i.value===t)?.icon??"◆",oe=t=>Array.isArray(t.metadata?.skills)?t.metadata.skills:[],n=t=>At(t);return e.jsxs("div",{className:"agents-view",children:[e.jsxs("div",{className:"agents-view-header",children:[e.jsxs("div",{className:"agents-view-title",children:[e.jsx(De,{size:24}),e.jsx("h2",{children:"Agents"})]}),e.jsxs("div",{className:"agents-view-controls",children:[e.jsxs("div",{className:"view-toggle",children:[e.jsx("button",{className:`view-toggle-btn${A==="list"?" active":""}`,onClick:()=>E("list"),title:"List view","aria-label":"List view","aria-pressed":A==="list",children:e.jsx(jt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="board"?" active":""}`,onClick:()=>E("board"),title:"Board view","aria-label":"Board view","aria-pressed":A==="board",children:e.jsx(xe,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="tree"?" active":""}`,onClick:()=>E("tree"),title:"Tree view","aria-label":"Tree view","aria-pressed":A==="tree",children:e.jsx(kt,{size:16})}),e.jsx("button",{className:`view-toggle-btn${A==="org"?" active":""}`,onClick:()=>E("org"),title:"Org Chart view","aria-label":"Org Chart view","aria-pressed":A==="org",children:e.jsx(zt,{size:16})})]}),e.jsxs("div",{className:"agents-view-primary-actions",children:[e.jsx("button",{ref:_,className:`btn-icon agent-controls-trigger${H?" agent-controls-trigger--active":""}`,onClick:()=>L(t=>!t),title:"Controls","aria-label":"Controls","aria-haspopup":"dialog","aria-expanded":H,"aria-controls":M,children:e.jsx(qt,{size:16})}),e.jsx("button",{className:"btn-icon",onClick:()=>void b(),title:"Refresh","aria-label":"Refresh",children:e.jsx($e,{size:16,className:g?"spin":void 0})}),e.jsxs("button",{className:"btn btn--primary",onClick:()=>{x(!0),L(!1)},children:[e.jsx(Nt,{size:16}),"New Agent"]})]})]})]}),H&&e.jsxs("div",{ref:ie,id:M,className:"agent-controls-panel agent-controls-panel--scrollable",role:"dialog","aria-label":"Agent controls","aria-modal":"false",children:[e.jsxs("div",{className:"agent-controls",children:[e.jsxs("div",{className:"agent-controls-filters",children:[e.jsxs("div",{className:"agent-state-filter",children:[e.jsx(It,{size:14}),e.jsxs("select",{className:"agent-state-filter-select",value:c,onChange:t=>d(t.target.value),"aria-label":"Filter agents by state",children:[e.jsx("option",{value:"all",children:"All States"}),e.jsx("option",{value:"idle",children:"Idle"}),e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"running",children:"Running"}),e.jsx("option",{value:"paused",children:"Paused"}),e.jsx("option",{value:"error",children:"Error"}),e.jsx("option",{value:"terminated",children:"Terminated"})]})]}),e.jsxs("label",{className:"checkbox-label agent-system-filter",children:[e.jsx("input",{type:"checkbox",checked:f,onChange:t=>m(t.target.checked),"aria-label":"Show system agents"}),"Show system agents"]})]}),e.jsx("div",{className:"agent-controls-actions",children:e.jsxs("button",{className:"btn",onClick:()=>{p(!0),L(!1)},children:[e.jsx(nt,{size:16}),"Import"]})})]}),e.jsx("div",{className:"agent-global-controls",children:e.jsxs("div",{className:"heartbeat-multiplier-group",children:[e.jsxs("div",{className:"heartbeat-multiplier-controls",children:[e.jsx("label",{htmlFor:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-label",children:"Heartbeat Speed"}),e.jsx("input",{id:"globalHeartbeatMultiplier",className:"heartbeat-multiplier-slider touch-target",type:"range",min:.1,max:10,step:.1,value:B,onChange:t=>{const i=Number(t.target.value);V(Number.isFinite(i)&&i>0?i:1)},disabled:ee}),e.jsxs("span",{className:"heartbeat-multiplier-value",children:["×",B.toFixed(1)]}),e.jsx("select",{className:"heartbeat-multiplier-preset",value:String(Pe.reduce((t,i)=>Math.abs(i-B)<Math.abs(t-B)?i:t,Pe[0])),onChange:t=>{const i=Number(t.target.value);V(Number.isFinite(i)&&i>0?i:1)},disabled:ee,"aria-label":"Heartbeat speed preset",children:Pe.map(t=>e.jsxs("option",{value:String(t),children:["×",t]},t))})]}),e.jsx("small",{className:"text-secondary",children:"Scales all agent heartbeat intervals. ×0.5 = twice as fast, ×2.0 = twice as slow. Default: ×1.0"})]})}),e.jsx(Gt,{agents:Q})]}),e.jsxs("div",{className:"agents-view-content",children:[e.jsx(Bt,{stats:o}),e.jsx(kn,{isOpen:N,onClose:()=>x(!1),onCreated:()=>{x(!1),b()},projectId:l}),e.jsx(In,{isOpen:I,onClose:()=>p(!1),onImported:()=>void b(),projectId:l}),A==="tree"?e.jsx("div",{className:"agent-tree__view",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):ne.rootNodes.map(t=>e.jsx(at,{node:t,onSelect:C,onToggle:ne.toggleExpand,isExpanded:ne.isExpanded,getChildCount:i=>ne.getChildren(i).length,getHealthStatus:n,getRoleIcon:te,getSkillBadges:oe},t.agent.id))}):A==="org"?e.jsx("div",{className:"agent-org-chart","data-testid":"agent-org-chart",children:W?e.jsxs("div",{className:"agent-org-chart__loading",role:"status","aria-live":"polite",children:[e.jsx($e,{size:18,className:"spin"}),e.jsx("span",{children:"Loading org chart..."})]}):se.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):se.map(t=>e.jsx(it,{node:t,onSelect:C,getHealthStatus:n,getRoleIcon:te,getSkillBadges:oe},t.agent.id))}):A==="board"?e.jsx("div",{className:"agent-board",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):Q.map(t=>{const i=n(t),h=Ee(t.state),v=Ye("agent-board-card",t.state);return e.jsx("div",{className:`agent-board-card ${v}`,children:e.jsxs("div",{className:"agent-board-clickable",onClick:()=>C(t.id),role:"button",tabIndex:0,onKeyDown:S=>S.key==="Enter"&&C(t.id),children:[e.jsxs("div",{className:"agent-board-header",children:[e.jsx("span",{className:"agent-board-icon",children:te(t.role)}),e.jsx("span",{className:"agent-board-badge badge text-secondary",children:ge(t.role)}),e.jsx("span",{className:`agent-board-badge badge ${h}`,children:t.state})]}),e.jsx("div",{className:"agent-board-name",children:t.name}),e.jsx("div",{className:"agent-board-id",children:t.id}),e.jsxs("div",{className:"agent-board-health",style:{color:i.color},title:i.label,children:[i.icon,!i.stateDerived&&` ${i.label}`]})]})},t.id)})}):e.jsx("div",{className:"agent-list",children:Q.length===0?e.jsx(Ie,{onCtaClick:()=>x(!0)}):Q.map(t=>{const i=n(t),h=Ee(t.state),v=Ye("agent-card",t.state),S=We(t.runtimeConfig?.heartbeatIntervalMs),ce=Ct(S),pe=ue===t.id;return e.jsxs("div",{className:`agent-card ${v}`,children:[e.jsxs("div",{className:"agent-card-header",children:[e.jsxs("div",{className:"agent-info agent-info--clickable",onClick:()=>C(t.id),role:"button",tabIndex:0,onKeyDown:y=>y.key==="Enter"&&C(t.id),children:[k===t.id?e.jsx("select",{ref:Z,className:"select agent-role-select",value:t.role,onChange:y=>void J(t.id,y.target.value),onKeyDown:y=>ye(y,t.id),onBlur:()=>K(null),autoFocus:!0,children:Ce.map(y=>e.jsxs("option",{value:y.value,children:[y.icon," ",y.label]},y.value))}):e.jsx("span",{className:"agent-icon agent-icon--clickable",onClick:y=>{y.stopPropagation(),K(t.id)},title:"Click to change role",role:"button",tabIndex:0,onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.stopPropagation(),K(t.id))},children:te(t.role)}),e.jsxs("div",{className:"agent-meta",children:[e.jsx("span",{className:"agent-name",children:t.name}),e.jsx("span",{className:"agent-id text-secondary",children:t.id})]}),e.jsx(tt,{size:20,className:"agent-card-chevron"})]}),e.jsxs("div",{className:"agent-badges",children:[e.jsx("span",{className:`badge ${h}`,children:t.state}),e.jsxs("span",{className:"badge",style:{color:i.color},title:i.label,children:[i.icon,!i.stateDerived&&` ${i.label}`]}),e.jsx("span",{className:"badge text-secondary",children:ge(t.role)}),(()=>{const y=oe(t);if(y.length===0)return null;const q=y.slice(0,2),fe=y.length-2;return e.jsxs(e.Fragment,{children:[q.map(Le=>e.jsx("span",{className:"badge badge-skill",children:Le},Le)),fe>0&&e.jsxs("span",{className:"badge badge-skill",children:["+",fe]})]})})()]})]}),e.jsxs("div",{className:"agent-card-body",children:[t.taskId&&e.jsxs("div",{className:"agent-task",children:[e.jsx("span",{className:"text-secondary",children:"Working on:"}),e.jsx("span",{className:"badge",children:t.taskId})]}),e.jsxs("div",{className:"agent-heartbeat-control",children:[e.jsx("span",{className:"text-secondary",children:"Heartbeat:"}),me===t.id?e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",inputMode:"numeric",pattern:"[0-9]*",className:"input agent-heartbeat-custom-input",value:Y[t.id]??"",onChange:y=>P(q=>({...q,[t.id]:y.target.value})),onKeyDown:y=>{y.key==="Enter"?O(t):y.key==="Escape"&&(U(null),P(q=>{const fe={...q};return delete fe[t.id],fe}))},disabled:pe,"aria-label":`Custom heartbeat interval in minutes for ${t.name}`}),e.jsx("span",{className:"text-secondary",children:"min"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>void O(t),disabled:pe,title:"Save custom interval",children:"Save"}),e.jsx("button",{className:"btn btn--sm",onClick:()=>{U(null),P(y=>{const q={...y};return delete q[t.id],q})},disabled:pe,title:"Cancel custom interval",children:"Cancel"})]}):e.jsx(e.Fragment,{children:e.jsxs("select",{className:"select agent-heartbeat-select",value:S,onChange:y=>{const q=y.target.value;q==="__custom__"?D(t):we(t,Number(q))},disabled:pe,"aria-label":`Set heartbeat interval for ${t.name}`,children:[ce.map(y=>e.jsx("option",{value:y.value,children:y.label},y.value)),St.some(y=>y.value===S)&&e.jsx("option",{value:"__custom__",children:"Custom..."})]})}),pe&&e.jsx("span",{className:"agent-heartbeat-saving text-secondary",children:"Saving…"}),t.lastHeartbeatAt&&(()=>{const y=new Date(t.lastHeartbeatAt),q=new Date(y.getTime()+S),fe=t.state==="active"||t.state==="running";return e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"agent-heartbeat-last text-secondary",title:y.toLocaleString(),children:["Last: ",y.toLocaleTimeString()]}),fe&&e.jsxs("span",{className:"agent-heartbeat-next text-secondary",title:q.toLocaleString(),children:["Next: ",q.toLocaleTimeString()]})]})})()]})]}),e.jsxs("div",{className:"agent-card-actions",children:[t.state==="idle"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Activate",children:[e.jsx(ke,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void he(t.id,t.name),title:"Delete",children:[e.jsx(Ke,{size:14})," Delete"]})]}),t.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void je(t.id,t.name),disabled:F.has(t.id),title:"Run Now","aria-label":`Run now for ${t.name}`,children:[e.jsx(xe,{size:14})," Run Now"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"paused"),disabled:F.has(t.id),title:"Pause",children:[e.jsx(Ue,{size:14})," Pause"]})]}),t.state==="paused"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Resume",children:[e.jsx(ke,{size:14})," Resume"]}),t.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",disabled:!0,title:"Run in progress","aria-label":`Heartbeat run in progress for ${t.name}`,children:[e.jsx(xe,{size:14})," Running"]}),e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"paused"),disabled:F.has(t.id),title:"Pause",children:[e.jsx(Ue,{size:14})," Pause"]})]}),t.state==="error"&&e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Retry",children:[e.jsx(ke,{size:14})," Retry"]}),t.state==="terminated"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--sm",onClick:()=>void ae(t.id,"active"),disabled:F.has(t.id),title:"Start",children:[e.jsx(ke,{size:14})," Start"]}),e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void he(t.id,t.name),title:"Delete",children:[e.jsx(Ke,{size:14})," Delete"]})]}),e.jsx("button",{className:"btn btn--sm agent-card-details-btn",onClick:()=>C(t.id),title:`View details for ${t.name}`,"aria-label":`View details for ${t.name}`,children:"View Details"})]})]},t.id)})}),e.jsx(Kt,{agents:u,projectId:l,onAgentSelect:C})]}),w&&e.jsx(s.Suspense,{fallback:null,children:e.jsx(Cn,{agentId:w,projectId:l,onClose:be,addToast:a,onChildClick:le})})]})}const _n=Object.freeze(Object.defineProperty({__proto__:null,AgentsView:Sn},Symbol.toStringTag,{value:"Module"}));export{_n as A,wn as S};
|