@runfusion/fusion 0.75.1-beta.2 → 0.76.0-beta.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 +2883 -1203
- package/dist/child-process-worker.js +2345 -1000
- package/dist/client/.vite/manifest.json +260 -260
- package/dist/client/assets/AgentDetailView-Czb9wfC3.css +1 -0
- package/dist/client/assets/AgentDetailView-nsriz_Mw.js +13 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-CC_rrbbG.js → AgentPermissionPolicyEditor-TKuT5ryJ.js} +1 -1
- package/dist/client/assets/AgentsView-BBLq03lO.js +24 -0
- package/dist/client/assets/{ChatView-mFKfoegS.js → ChatView-BEc5SVfU.js} +1 -1
- package/dist/client/assets/{CommandCenter-C2wvDq_N.js → CommandCenter-DBCxo_tI.js} +1 -1
- package/dist/client/assets/{DevServerView-0MWEJM7o.js → DevServerView-BaLUl9De.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-BjMPhCdh.js → DirectoryPicker-CKj8CfUJ.js} +1 -1
- package/dist/client/assets/{DocumentsView-ckH3rjmd.js → DocumentsView-Cu8vlXJT.js} +1 -1
- package/dist/client/assets/{EvalsView-NyA644VF.js → EvalsView-CbdRWRjR.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-D0ZfbBRN.js → ExperimentalAgentOnboardingModal-BVdW0xJ3.js} +1 -1
- package/dist/client/assets/{GoalsView-Ctt5P_yo.js → GoalsView-CCbeAvBm.js} +1 -1
- package/dist/client/assets/{InsightsView-NDp0bdNB.js → InsightsView-B46ZemSm.js} +1 -1
- package/dist/client/assets/{MemoryView-BKbA4Bm4.js → MemoryView-JM1fFU2D.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-V3AFWMHm.js → PiExtensionsManager-KHsw2af9.js} +1 -1
- package/dist/client/assets/{PluginManager-D88G_TZh.js → PluginManager-BeKLun0C.js} +1 -1
- package/dist/client/assets/{PullRequestView-DQQmFFYC.js → PullRequestView-CwQW2pe4.js} +1 -1
- package/dist/client/assets/{ReportModal-Clh1S8RF.js → ReportModal-BC9DhvX4.js} +1 -1
- package/dist/client/assets/{ResearchView-kxvq4zp5.js → ResearchView-CuB7IbEB.js} +1 -1
- package/dist/client/assets/{SecretsView-Dm0Vk8SA.js → SecretsView-DD8uA6G7.js} +1 -1
- package/dist/client/assets/{SessionTerminal-DJO4JTEX.js → SessionTerminal-B0S1e8qf.js} +1 -1
- package/dist/client/assets/SettingsModal-BHNEJWD4.js +21 -0
- package/dist/client/assets/{SettingsModal-BN5mL_ym.js → SettingsModal-BxrdR4-f.js} +1 -1
- package/dist/client/assets/{SettingsTextareaRow-CvKszqO-.js → SettingsTextareaRow-CpJOy-rv.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-D5hVZh1G.js → SetupWizardModal-DviAPDlf.js} +2 -2
- package/dist/client/assets/{SkillsView-DQVz21w2.js → SkillsView-DeoEN_K0.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CpKIi6Tb.js → WorkflowNodeEditor-CPk8plo1.js} +3 -3
- package/dist/client/assets/{agent-import-generation-DGUNF3nd.js → agent-import-generation-D74gC46R.js} +1 -1
- package/dist/client/assets/app-64JrFN7_.js +13 -0
- package/dist/client/assets/app-BxMYvSHk.js +13 -0
- package/dist/client/assets/app-CCgIvcFy.js +5 -0
- package/dist/client/assets/app-CVFYXkbM.js +13 -0
- package/dist/client/assets/app-Cl4NLAGd.js +13 -0
- package/dist/client/assets/app-_gHuSFBp.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CV83wubP.js → architectureDiagram-3BPJPVTR-DUNXxw_k.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-CNQsA3dD.js → blockDiagram-GPEHLZMM-CTxWMFSZ.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CXe7ii5H.js → c4Diagram-AAUBKEIU-DI15zO_G.js} +1 -1
- package/dist/client/assets/channel-DDHw4Vcu.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-BS6W9bWv.js → chunk-2J33WTMH-D1X3sNvd.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DbehRhdW.js → chunk-4BX2VUAB-DYz990rf.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DMI5SR42.js → chunk-55IACEB6-BQshFTjv.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-D1d-GBVj.js → chunk-727SXJPM-DiVH9Rd6.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BzO6K3Uf.js → chunk-AQP2D5EJ-Bx8LBEvE.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BVRLV3lK.js → chunk-FMBD7UC4-7rsNdXy-.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-DdWByQfn.js → chunk-ND2GUHAM-COOZ3ff5.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-1ia12cRV.js → chunk-QZHKN3VN-oL-CU1gN.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C5tnFtxH.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C5tnFtxH.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BPDT41HR.js → cose-bilkent-S5V4N54A-CHXhlVh-.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-Cktn26EH.js → dagre-BM42HDAG-BJVXidIK.js} +1 -1
- package/dist/client/assets/{dashboard-view-zd8GxC49.js → dashboard-view-B8OjndkD.js} +1 -1
- package/dist/client/assets/{dashboard-view-8o0EUcRX.js → dashboard-view-BOqEOmsR.js} +1 -1
- package/dist/client/assets/{dashboard-view-CkCerlVJ.js → dashboard-view-CCg2wkwd.js} +1 -1
- package/dist/client/assets/{dashboard-view-D_HC4lnr.js → dashboard-view-DOWuByTe.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-But4Lvf-.js → diagram-2AECGRRQ-CBS8IBP_.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-2bpQAGFc.js → diagram-5GNKFQAL-Dmyxol5P.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-Ckn9Qd1u.js → diagram-KO2AKTUF-DVF_5fDu.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-Bjn8h84N.js → diagram-LMA3HP47-DqbOTb-t.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BI6541hx.js → diagram-OG6HWLK6-BIhwB3ji.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-BqMiwHiM.js → erDiagram-TEJ5UH35-BcYtj6RH.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Q_SAB10M.js → flowDiagram-I6XJVG4X-CBYrhc7v.js} +1 -1
- package/dist/client/assets/{folder-open-CHiAJbTN.js → folder-open-DBW3UhL6.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CqWFSfPF.js → ganttDiagram-6RSMTGT7-BtFaOg92.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-B1o4uEjO.js → gitGraphDiagram-PVQCEYII-BE5E5ctQ.js} +1 -1
- package/dist/client/assets/{index-kwRywd9M.js → index-D6J9uyUx.js} +306 -306
- package/dist/client/assets/index-DDdZ20Cz.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BzaMa0c2.js → infoDiagram-5YYISTIA-BBpwj0Ir.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-I38yge00.js → ishikawaDiagram-YF4QCWOH-CwjmjYav.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-WVQSgx4P.js → journeyDiagram-JHISSGLW-ChnMZl1o.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-BWtPQ3AH.js → kanban-definition-UN3LZRKU-BA_bNZa3.js} +1 -1
- package/dist/client/assets/{mermaid.core-D1hnBtbi.js → mermaid.core-CNMqiN_t.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DqiSLkW7.js → mindmap-definition-RKZ34NQL-D-8_lEGp.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CcgwbdIN.js → pieDiagram-4H26LBE5-Cz_dYW8h.js} +1 -1
- package/dist/client/assets/{puzzle-BhXUaTQl.js → puzzle-Bbsv6mZh.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-MsqQQfDN.js → quadrantDiagram-W4KKPZXB-BtXzvuUT.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-CILGjMMA.js → requirementDiagram-4Y6WPE33-CK29bQbQ.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-c14fWbtR.js → sankeyDiagram-5OEKKPKP-DGxLW8W6.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BD5bxMom.js → sequenceDiagram-3UESZ5HK-CPOz7wfR.js} +1 -1
- package/dist/client/assets/{shield-alert-C9W2WywS.js → shield-alert-BnpS5qUu.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-CJdbDSyg.js → standing-instructions-template-jeWwq3Zh.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CZ5YqeOn.js → stateDiagram-AJRCARHV-CxpQ3AE6.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-mdMN-PNX.js → stateDiagram-v2-BHNVJYJU-BSImQHUw.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DHKay9uj.js → timeline-definition-PNZ67QCA-jt74--XQ.js} +1 -1
- package/dist/client/assets/{upload-DxEwowRU.js → upload-D2j8N8vC.js} +1 -1
- package/dist/client/assets/{users-mNFgW_Zd.js → users-BtzATmoI.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-X29K9hWM.js → vennDiagram-CIIHVFJN-3vOGHb8-.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-yEoTrfmN.js → wardley-L42UT6IY-DNuWuyr8.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-ny4k3kG0.js → wardleyDiagram-YWT4CUSO-D-kFe8Uz.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DC8ODtRJ.js → xychartDiagram-2RQKCTM6-DvDQ30sY.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +2702 -1117
- package/dist/migrations/0045_fn_8764_multi_role_workflow_agents.sql +20 -0
- package/dist/migrations/0046_fn_8764_workflow_principal_fence.sql +49 -0
- package/dist/migrations/0047_fn_8829_task_recommendations.sql +3 -0
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +43 -0
- package/dist/plugin-sdk/index.js +357 -25
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-quality/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-quality/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-roadmap/manifest.json +11 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-todos/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-todos/manifest.json +11 -1
- package/dist/plugins/fusion-plugin-todos/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +357 -25
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/extension-tools.md +16 -2
- package/skill/fusion/references/fusion-capabilities.md +1 -0
- package/dist/client/assets/AgentDetailView-C8-9_SOC.css +0 -1
- package/dist/client/assets/AgentDetailView-ltOG8f0-.js +0 -13
- package/dist/client/assets/AgentsView-DWUdi27N.js +0 -24
- package/dist/client/assets/SettingsModal-CTf5voEW.js +0 -21
- package/dist/client/assets/app-B4gkbXNS.js +0 -13
- package/dist/client/assets/app-BXLZYY_A.js +0 -13
- package/dist/client/assets/app-CNFmVt1q.js +0 -13
- package/dist/client/assets/app-DCERHstn.js +0 -13
- package/dist/client/assets/app-iKAA6v9i.js +0 -5
- package/dist/client/assets/app-p_Hq0vGS.js +0 -13
- package/dist/client/assets/channel-DoX862zl.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-mb2IeAGN.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-mb2IeAGN.js +0 -1
- package/dist/client/assets/index-Bdw5eNKV.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;height:100%;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-detail-inline-shell{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden}.agent-detail-inline{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:var(--surface);border:1px solid var(--border)}.agent-detail-inline-loading{width:100%;height:100%;min-height:0;display:flex;align-items:center;justify-content:center;overflow:hidden}.agent-detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:calc(var(--space-xl) * 2 + var(--space-md));color:var(--text-muted)}.agent-detail-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-sm) var(--space-md);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary);flex-shrink:0}.agent-detail-identity{display:flex;align-items:center;gap:var(--space-md);flex:1 1 auto;min-width:0}.agent-detail-inline-back{display:inline-flex;align-items:center;gap:var(--space-xs);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-sm) + var(--space-xs) * .5);flex-shrink:0}.agent-detail-icon{width:calc(var(--space-lg) * 2 + var(--space-xs));height:calc(var(--space-lg) * 2 + var(--space-xs));display:flex;align-items:center;justify-content:center;color:var(--text);flex-shrink:0}.agent-detail-info{min-width:0}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{display:flex;gap:var(--space-xs);margin-top:calc(var(--space-xs) * .5)}.agent-detail-header-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--space-sm);flex:0 1 auto;min-width:0}.agent-detail-controls{display:flex;align-items:center;flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25);flex-shrink:0}.btn--compact{padding:calc(var(--space-xs) + var(--space-xs) * .25) calc(var(--space-sm) + var(--space-xs) * .5);font-size:var(--space-md);gap:var(--space-xs)}.agent-detail-utility-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.agent-detail-bulk-menu{position:relative}.agent-detail-bulk-menu-popover{position:absolute;right:0;top:calc(100% + var(--space-xs));min-width:calc(var(--space-xl) * 9);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);z-index:2;padding:var(--space-xs);display:flex;flex-direction:column;gap:var(--space-xs)}.agent-detail-bulk-menu-item{width:100%;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);text-align:left;padding:var(--space-sm);display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);cursor:pointer}.agent-detail-bulk-menu-item:hover:not(:disabled),.agent-detail-bulk-menu-item:focus-visible{outline:none;background:var(--card-hover)}.agent-detail-bulk-menu-item:disabled{color:var(--text-muted);cursor:not-allowed}.agent-detail-bulk-menu-item-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted)}.agent-detail-import-btn{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.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:var(--space-xs);padding:0 calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border);background:var(--bg-secondary);flex-shrink:0;overflow-x:auto;touch-action:pan-x pan-y;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{display:flex;flex:0 0 auto;touch-action:pan-x pan-y;align-items:center;gap:var(--space-xs);padding:calc(var(--space-sm) + var(--space-xs) * .5) var(--space-md);background:none;border:none;border-bottom:calc(var(--space-xs) * .5) solid transparent;color:var(--text-muted);font-size:.875rem;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap}.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-tab:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);background:color-mix(in srgb,var(--todo) 12%,transparent);color:var(--text);border-radius:var(--radius-sm)}.agent-detail-content{flex:1;min-height:0;overflow-y:auto;padding:var(--space-xl)}.agent-detail-footer{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md) var(--space-xl);border-top:1px solid var(--border);background:var(--bg-secondary);font-size:var(--space-md);color:var(--text-muted);flex-shrink:0}.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:var(--space-xl)}.dashboard-summary-layout{padding-bottom:var(--space-md)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs))}.dashboard-summary-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.budget-warning-banner{display:flex;gap:var(--space-sm);align-items:flex-start;border:1px solid var(--color-warning);background:color-mix(in srgb,var(--color-warning) 12%,transparent);border-radius:var(--radius-md);padding:var(--space-md)}.dashboard-summary-hero__heading{display:flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-hero__heading h3{margin:0;font-size:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:600}.dashboard-summary-hero__meta{display:flex;flex-wrap:wrap;gap:var(--space-md);color:var(--text-muted)}.agent-detail-approval-badge{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--color-warning)}.dashboard-summary-skills{display:inline-flex;align-items:center;gap:var(--space-sm)}.dashboard-summary-skill-badges{display:inline-flex;flex-wrap:wrap;gap:var(--space-xs)}.dashboard-summary-skill-badge{max-width:calc(var(--space-xl) * 8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-summary-skill-badge-btn{cursor:pointer}.dashboard-summary-skill-badge-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.dashboard-summary-skill-badge--selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 20%,transparent)}.dashboard-summary-skill-detail{margin-top:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.dashboard-summary-skill-detail-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.dashboard-summary-skill-detail-title{font-weight:600;color:var(--text)}.dashboard-summary-skill-detail-loading,.dashboard-summary-skill-detail-empty{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--text-muted)}.dashboard-summary-skill-detail-error{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-xs);color:var(--color-error)}.dashboard-summary-skill-detail-content{margin:0;padding:var(--space-sm);border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--card);color:var(--text);white-space:pre-wrap;word-break:break-word;max-height:calc(var(--space-2xl) * 6);overflow:auto}.dashboard-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-xl) * 6 + var(--space-sm)),1fr));gap:var(--space-md)}.dashboard-summary-grid p{margin:0}.dashboard-summary-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted)}.dashboard-summary-health-row{display:inline-flex;align-items:center;gap:var(--space-xs)}.dashboard-summary-health-reason{margin-left:var(--space-xs);font-size:var(--space-md)}.runs-list{display:flex;flex-direction:column;gap:var(--space-sm)}.run-item{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--space-sm)}.dashboard-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:calc(var(--space-lg) + var(--space-xs))}.dashboard-section h3{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;margin:0 0 var(--space-lg) 0;color:var(--text-muted);text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .125)}.info-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 7 + var(--space-sm)),1fr));gap:var(--space-lg)}.info-item{display:flex;flex-direction:column;gap:var(--space-xs)}.info-label{font-size:var(--space-md);color:var(--text-muted)}.info-value{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500}.inline-badge{display:inline-block;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-sm);font-size:var(--space-md);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:calc(var(--space-lg) + var(--space-xs) * .5);font-weight:700;color:var(--todo)}.stat-label{font-size:calc(var(--space-sm) + var(--space-xs) * .5);color:var(--text-muted);margin-top:var(--space-xs)}.current-task{display:flex;align-items:center;gap:var(--space-md)}.task-badge{font-family:var(--font-mono);background:var(--surface);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.metadata-json{background:var(--surface);padding:var(--space-md);border-radius:var(--radius-sm);font-size:var(--space-md);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:var(--space-md);color:var(--text-muted)}.log-window-loader{display:flex;justify-content:center;padding-bottom:var(--space-sm)}.streaming-indicator{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:var(--space-md);color:var(--color-success)}.streaming-dot{width:var(--space-sm);height:var(--space-sm);background:var(--color-success);border-radius:50%;animation:pulse 1.5s infinite}.logs-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.logs-empty p{margin:var(--space-sm) 0 0 0}.agent-mail-tab{display:flex;flex-direction:column;gap:var(--space-md)}.agent-mail-tab-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-mail-tab-header h3{margin:0;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-mail-tab-error{display:flex;align-items:center;gap:var(--space-xs);color:var(--color-error)}.agent-detail-loading--inline{flex-direction:row;justify-content:flex-start;padding:var(--space-md) 0}.agent-mail-tab .agent-mail-tab-message{width:100%;border:0;background:transparent;text-align:left;color:inherit;cursor:pointer}.agent-mail-tab .agent-mail-tab-message:hover{background:var(--card-hover)}.agent-mail-tab .agent-mail-tab-message:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.agent-mail-tab .agent-mail-tab-message--selected{background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-mail-tab .agent-mail-tab-detail{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-mail-tab .agent-mail-tab-back{align-self:flex-start}.agent-mail-tab .agent-mail-tab-detail-meta{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-mail-tab .agent-mail-tab-detail-row{display:flex;flex-wrap:wrap;gap:var(--space-md)}.agent-mail-tab .agent-mail-tab-detail-label{color:var(--text-muted);min-width:calc(var(--space-2xl) * 2)}.agent-mail-tab .agent-mail-tab-reply-context{color:var(--text-muted)}.agent-mail-tab .agent-mail-tab-detail-body{white-space:pre-wrap;word-break:break-word}.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:calc(var(--space-2xl) + var(--space-lg));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:calc(var(--space-xs) + var(--space-sm) * .25);font-weight:600;color:var(--in-progress)}.live-dot{width:var(--space-sm);height:var(--space-sm);background:var(--in-progress);border-radius:50%;animation:pulse 1.5s infinite}.run-id{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--text-muted)}.run-status{display:flex;align-items:center;gap:calc(var(--space-xs) + var(--space-sm) * .25);font-size:calc(var(--space-md) + var(--space-xs) * .25);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:var(--space-md);color:var(--text-muted)}.run-logs-container{padding:var(--space-md);background:var(--bg-secondary);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.run-details-loading-state{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) 0}.run-output-sections{margin-bottom:var(--space-md)}.run-output-section{margin-bottom:var(--space-sm)}.run-output-label{margin-bottom:var(--space-xs);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;letter-spacing:calc(var(--space-xs) * .1);text-transform:uppercase}.run-output-label--error{color:var(--color-error)}.run-output-panel{margin:0;max-height:calc(var(--space-2xl) * 6.25);overflow:auto;border-radius:var(--radius-sm);padding:var(--space-sm) var(--space-md);background:var(--surface);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5}.run-output-panel--error{color:var(--color-error);border-color:color-mix(in srgb,var(--color-error) 35%,var(--border));background:color-mix(in srgb,var(--color-error) 10%,transparent)}.run-context-grid{display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs))}.run-context-item{line-height:1.5}.run-output-empty{padding:var(--space-sm) 0;font-style:italic;font-size:calc(var(--space-sm) + var(--space-xs))}.prompt-size-summary{display:flex;align-items:center;gap:var(--space-sm)}.prompt-size-sparkline{width:calc(var(--space-2xl) * 2);height:calc(var(--space-xl) + var(--space-md));border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.prompt-size-sparkline-grid{fill:none;stroke:var(--text-muted);stroke-width:1}.prompt-size-sparkline-line{fill:none;stroke:var(--accent);stroke-width:2}.prompt-size-values{font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.run-agent-logs-section{margin-top:var(--space-xs);padding-top:var(--space-sm);border-top:1px solid var(--border)}.agent-tasks-list{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-task-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25);padding:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);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:var(--space-md);font-weight:600;color:var(--todo)}.agent-task-title{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:500;color:var(--text);line-height:1.4}.agent-task-status{font-size:var(--space-md);color:var(--text-muted)}.agent-task-column{display:inline-flex;align-items:center;padding:calc(var(--space-xs) * .5) var(--space-sm);border-radius:var(--radius-pill);font-size:calc(var(--space-sm) + var(--space-xs) * .5);font-weight:700;text-transform:uppercase;letter-spacing:calc(var(--space-xs) * .1)}.agent-task-column.column-triage{color:var(--triage);background:color-mix(in srgb,var(--triage) 18%,transparent)}.agent-task-column.column-todo{color:var(--todo);background:color-mix(in srgb,var(--todo) 18%,transparent)}.agent-task-column.column-in-progress{color:var(--in-progress);background:color-mix(in srgb,var(--in-progress) 18%,transparent)}.agent-task-column.column-in-review{color:var(--in-review);background:color-mix(in srgb,var(--in-review) 18%,transparent)}.agent-task-column.column-done{color:var(--done);background:color-mix(in srgb,var(--done) 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:calc(var(--space-2xl) + var(--space-lg));color:var(--text-muted);text-align:center}.agent-tasks-empty p{margin:0}.config-tab{display:flex;flex-direction:column;gap:var(--space-xl);color:var(--text)}.config-section{background:var(--bg-secondary);border:1px solid var(--border-subtle);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm));color:var(--text)}.config-section .input,.config-section .select,.config-section textarea{background:var(--surface);color:var(--text);border-color:var(--border)}.config-section .input::placeholder,.config-section textarea::placeholder{color:var(--text-dim)}.config-section .input:hover:not(:disabled):not([readonly]),.config-section .select:hover:not(:disabled),.config-section textarea:hover:not(:disabled):not([readonly]){border-color:var(--text-muted)}.config-section .input:focus-visible,.config-section .select:focus-visible,.config-section textarea:focus-visible,.config-section input[type=checkbox]:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-section .input:disabled,.config-section .select:disabled,.config-section textarea:disabled,.config-section .btn:disabled,.config-runtime-tab:disabled,.agent-avatar-editor-action:disabled{opacity:var(--opacity-disabled, .6);color:var(--text-muted);cursor:not-allowed}.config-section .input[readonly],.config-section textarea[readonly]{background:var(--surface-muted);color:var(--text-muted)}.config-section input[type=checkbox]{accent-color:var(--todo)}.agent-avatar-editor-actions .agent-avatar-editor-action{background:var(--card);color:var(--text);border-color:var(--border)}.agent-avatar-editor-actions .agent-avatar-editor-action:hover:not(:disabled){background:var(--card-hover);border-color:var(--text-muted)}.agent-avatar-editor-actions .agent-avatar-editor-action:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-section h3{font-size:calc(var(--space-md) + var(--space-xs));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:calc(var(--space-xs) + var(--space-sm) * .25)}.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:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted);margin:0 0 calc(var(--space-md) + var(--space-sm)) 0}.config-actions-row{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.config-fields{display:flex;flex-direction:column;gap:var(--space-lg)}.config-field{display:flex;flex-direction:column;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.config-field label{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500}.config-role-tags{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin:0;padding:var(--space-sm);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.config-role-tags legend{padding-inline:var(--space-xs)}.agent-avatar-editor{display:flex;align-items:center;gap:var(--space-md)}.agent-avatar-editor-preview{background:var(--card)}.agent-avatar-editor-actions{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap}.config-runtime-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-md)}.config-runtime-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.config-runtime-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.config-runtime-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.config-runtime-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.config-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-style:italic}.config-error{font-size:calc(var(--space-sm) + var(--space-xs) * .75);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:calc(var(--space-md) + var(--space-sm));padding-top:var(--space-lg);border-top:1px solid var(--border)}.config-saved-indicator{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success)}.config-saved-indicator--error{color:var(--color-error)}.heartbeat-procedure-actions{margin-top:var(--space-sm)}.heartbeat-procedure-viewer{margin-top:var(--space-lg)}.heartbeat-procedure-status{display:inline-flex;align-items:center;gap:var(--space-xs);margin-left:auto}.heartbeat-procedure-status--warning{color:var(--color-warning)}.rating-summary-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm));display:flex;flex-direction:column;gap:var(--space-md)}.rating-score-display{display:flex;align-items:center;gap:var(--space-md)}.rating-average{font-size:var(--space-2xl);font-weight:700;line-height:1}.rating-stats{display:flex;align-items:center;gap:var(--space-md)}.rating-count{font-size:calc(var(--space-md) + var(--space-xs) * .5);color:var(--text-muted)}.rating-trend-badge{font-size:var(--space-md);padding:var(--space-xs) calc(var(--space-md) - var(--space-xs) * .5);border-radius:var(--radius-lg);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:calc(var(--space-md) + var(--space-xs) * .25);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:calc(var(--space-md) + var(--space-xs) * .25)}.category-score{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .25)}.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:calc(var(--space-md) + var(--space-xs) * .25);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:calc(var(--space-md) + var(--space-xs) * .25);font-weight:600}.rating-history .no-ratings{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);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:calc(var(--space-sm) + var(--space-xs) * .5);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:calc(var(--space-sm) + var(--space-xs) * .5);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:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.runs-loading-row{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl)}.runs-toolbar{padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--border)}.runs-toolbar--between{display:flex;justify-content:space-between;align-items:center}.runs-toolbar-meta{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted)}.run-card--clickable{cursor:pointer}.run-card--clickable:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.run-header-group{display:flex;align-items:center;gap:var(--space-sm)}.run-badge--compact{font-size:calc(var(--space-sm) + var(--space-xs) * .5);padding:calc(var(--space-xs) * .25) calc(var(--space-sm) * .75)}.run-output-summary{cursor:pointer;user-select:none}.run-live-indicator--with-margin{margin-left:var(--space-sm)}.detail-section-body--loading{display:flex;align-items:center;gap:var(--space-sm)}.agent-empty--padded{padding:var(--space-xl)}.logs-fallback-label{font-size:calc(var(--space-sm) + var(--space-xs))}.config-textarea-mono{font-family:var(--font-mono);font-size:calc(var(--space-md) + var(--space-xs) * .25);resize:vertical}.config-textarea-top-spacing{margin-top:var(--space-sm)}.config-hint--block-spacing{margin-bottom:var(--space-md)}.config-hint--block{display:block;margin-bottom:var(--space-sm)}.config-hint--top-spacing{margin-top:var(--space-sm)}.config-hint--inline-loader{display:inline-flex;gap:var(--space-xs);margin-top:var(--space-sm)}.config-inline-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-sm)}.config-hint--inline-tight{display:flex;align-items:center;gap:var(--space-xs)}.config-hint--warning{color:var(--color-warning)}.agent-heartbeat-auto-claim-card{background:color-mix(in srgb,var(--surface) 60%,transparent);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md)}.agent-heartbeat-preset-row{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-md);margin-bottom:var(--space-sm)}.agent-heartbeat-preset-label{display:block;color:var(--text);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;margin-bottom:calc(var(--space-xs) * .5)}.agent-heartbeat-preset-btn{min-height:calc(var(--space-xl) + var(--space-md));flex-shrink:0}@media(max-width:768px){.agent-heartbeat-preset-row{flex-direction:column;align-items:stretch}.agent-heartbeat-preset-btn{width:100%;min-height:calc(var(--space-xl) + var(--space-md))}.config-runtime-tabs{grid-template-columns:1fr}.config-runtime-tab{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-avatar-editor-actions{flex-direction:column;align-items:stretch}.agent-avatar-editor-actions .agent-avatar-editor-action{width:100%;justify-content:center}.skill-multiselect,.skill-multiselect-dropdown,.skill-multiselect-chips{width:100%}.skill-chip{max-width:100%}@media(max-width:767.98px){.agent-detail-modal{min-width:0!important;min-height:0!important;width:100vw!important;height:100dvh!important;max-width:100vw!important;max-height:100dvh;margin:0;border-radius:0;border:none;resize:none}}.agent-detail-header{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:var(--space-sm);row-gap:var(--space-sm);padding:var(--space-md);padding-top:max(var(--space-md),env(safe-area-inset-top,0))}.agent-detail-identity{grid-column:1;grid-row:1;flex:1 1 auto;min-width:0;gap:var(--space-md)}.agent-detail-icon{width:calc(var(--space-lg) * 2);height:calc(var(--space-lg) * 2);flex-shrink:0}.agent-detail-icon svg{width:calc(var(--space-sm) + var(--space-xs) * 2);height:calc(var(--space-sm) + var(--space-xs) * 2)}.agent-detail-info h2{font-size:calc(var(--space-md) + var(--space-xs) * .75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-detail-badges{flex-wrap:wrap;row-gap:var(--space-xs);column-gap:var(--space-sm);margin-top:var(--space-xs)}.agent-detail-header-actions{grid-column:2;grid-row:1;flex:0 0 auto;justify-content:flex-end;gap:calc(var(--space-xs) * .5)}.agent-detail-controls{flex:0 0 auto;gap:calc(var(--space-xs) * .5)}.agent-detail-controls .btn--compact{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:var(--space-md);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-controls .agent-detail-mobile-icon-control{min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs));padding-left:calc(var(--space-sm) - var(--space-xs) * .5);padding-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-detail-controls .agent-detail-mobile-icon-control .agent-detail-control-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.agent-detail-controls .btn--compact svg{width:calc(var(--space-md) + var(--space-xs) * .5);height:calc(var(--space-md) + var(--space-xs) * .5)}.agent-detail-utility-actions{flex-shrink:0;margin-left:0}.agent-detail-bulk-menu-popover{right:0}.agent-detail-utility-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-import-btn{min-width:calc(var(--space-xl) * 3 + var(--space-xs))}.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:calc(var(--space-xs) + var(--space-sm) * .25)}.agent-detail-actions .btn{padding:calc(var(--space-sm) - var(--space-xs) * .5) calc(var(--space-md) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-actions .btn svg{width:calc(var(--space-sm) + var(--space-xs) * 1.5);height:calc(var(--space-sm) + var(--space-xs) * 1.5)}.agent-detail-actions .btn-icon{min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs));min-width:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.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:var(--space-md) calc(var(--space-md) + var(--space-xs) * .5);font-size:.875rem;touch-action:pan-x pan-y;white-space:nowrap;min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.agent-detail-content{padding:var(--space-lg);-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.agent-detail-footer{flex-wrap:wrap;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);padding-bottom:max(var(--space-sm),env(safe-area-inset-bottom,0));font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-detail-id{max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-tab{gap:var(--space-lg)}.dashboard-summary-hero__heading{flex-wrap:wrap;row-gap:var(--space-sm);column-gap:var(--space-md)}.dashboard-summary-hero__meta{align-items:flex-start;row-gap:var(--space-lg);column-gap:var(--space-md)}.dashboard-summary-hero__health{overflow-wrap:anywhere}.dashboard-summary-skills{flex-direction:column;align-items:flex-start;row-gap:var(--space-sm)}.dashboard-summary-skill-detail-header{flex-direction:column;align-items:flex-start}.dashboard-section{padding:var(--space-lg)}.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:calc(var(--space-lg) + var(--space-xs) * .5)}.logs-empty{padding:var(--space-2xl) var(--space-lg)}.agent-mail-tab-header{flex-direction:column;align-items:flex-start}.agent-mail-tab .mailbox-agent-subtabs{width:100%}.agent-mail-tab .mailbox-agent-subtab{flex:1}.agent-mail-tab .agent-mail-tab-detail{width:100%;padding:var(--space-md)}.agent-mail-tab .agent-mail-tab-back{min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.run-card{padding:var(--space-md)}.run-header{flex-wrap:wrap;gap:calc(var(--space-xs) + var(--space-sm) * .25)}.run-details{flex-wrap:wrap}.run-logs-container{padding:var(--space-sm)}.run-output-panel{max-height:calc(var(--space-2xl) * 5)}.run-context-grid{flex-direction:column;gap:var(--space-xs)}.run-details .text-muted{min-width:0;overflow-wrap:anywhere}.config-tab{gap:var(--space-lg)}.config-section{padding:var(--space-lg)}.config-section .input,.config-section .select,.config-section textarea{font-size:calc(var(--space-md) + var(--space-xs));min-height:calc(var(--space-lg) + var(--space-md) + var(--space-xs))}.config-actions{flex-direction:column;align-items:stretch;gap:var(--space-sm)}.config-actions .btn{width:100%;justify-content:center}.heartbeat-procedure-status{margin-left:0}}@media(max-width:480px){.dashboard-summary-card{padding:var(--space-md)}.dashboard-summary-hero__heading{row-gap:var(--space-md)}.dashboard-summary-hero__meta{row-gap:var(--space-lg);column-gap:var(--space-sm)}.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}.config-actions,.agent-avatar-editor-actions{width:100%}.config-runtime-tabs,.skill-multiselect{gap:var(--space-xs)}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-avatar-editor{flex-direction:column;align-items:flex-start}.agent-avatar-editor-actions{width:100%}.agent-avatar-editor-actions .btn{min-height:calc(var(--space-lg) * 2 + var(--space-xs))}.agent-dialog-overlay{padding:0;align-items:stretch}.agent-dialog{width:100vw!important;height:100dvh;max-width:100%!important;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}}.agent-permission-inherit-banner{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);margin-bottom:var(--space-sm)}.agent-capability-grants{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-capability-grants h4{margin:0;color:var(--text-primary);font-size:var(--font-size-md)}.agent-capability-grants-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,var(--size-card-min, 16rem)),1fr));gap:var(--space-sm)}.agent-capability-grant-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-capability-grant-name{display:block;color:var(--text-primary);font-weight:600}@media(max-width:768px){.agent-capability-grants-grid{grid-template-columns:1fr}.agent-capability-grant-row,.agent-permission-inherit-banner{align-items:flex-start;flex-direction:column}}.agent-memory-file-editor{border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;display:flex;flex-direction:column;min-height:320px;max-height:55vh}.agent-memory-file-editor .cm-editor{height:100%;min-height:0}.agent-memory-file-editor .cm-scroller{overflow:auto}.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-muted);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-muted);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);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--accent)}.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(--accent) 15%,transparent);color:var(--accent)}.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-muted);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(--accent)}.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-muted);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:var(--space-xs)}.budget-progress-bar{width:100%;height:var(--space-sm);background:var(--surface);border-radius:var(--radius-sm);overflow:hidden;margin-top:var(--space-xs)}.budget-progress-bar__fill{height:100%;border-radius:var(--radius-sm);transition:width var(--transition-slow),background-color var(--transition-slow)}.budget-progress-bar__fill--green{background:var(--color-success)}.budget-progress-bar__fill--amber{background:var(--color-warning)}.budget-progress-bar__fill--red{background:var(--color-error)}.budget-progress-label{font-size:.75rem;color:var(--text-muted);margin-top:var(--space-xs);display:block}.budget-badge{display:inline-flex;align-items:center;gap:var(--space-xs);padding:calc(var(--space-xs) / 2) var(--space-sm);border-radius:var(--radius-pill);font-size:.75rem;font-weight:500}.budget-warning-banner{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--state-error-bg, color-mix(in srgb, var(--color-error) 15%, transparent));color:var(--state-error-text);border:1px solid var(--state-error-border);font-size:.875rem;margin-bottom:var(--space-md)}.btn-reset-budget{margin-top:var(--space-sm)}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{r as a,j as e}from"./vendor-react-SZ_qB27O.js";import{c as Ls,bI as ia,bJ as ra,bK as la,bL as oa,L as J,bM as Rt,R as Tt,bF as xs,Z as ca,bG as _t,bN as Ds,x as vt,C as Hs,g as zs,bO as da,bP as ua,bQ as ma,ab as Is,aX as ga,bR as ha,bS as _,bT as fa,bU as pa,bV as ba,bW as Os,bX as es,bY as xa,bZ as At,b_ as Ut,be as Mt,F as vs,b$ as Bs,am as $s,c0 as Vt,bC as Ft,c1 as js,c2 as rt,c3 as va,X as _s,aH as jt,c4 as ja,c5 as Us,c6 as Vs,c7 as ya,_ as Na,u as Sa,c8 as Ws,aR as Gs,c9 as ns,ca as ka,cb as ys,cc as Ca,cd as wa,ce as ts,cf as Js,cg as Ra,d as Ma,ch as Aa,h as qs,ci as Ks,b4 as Fa,an as be,cj as Ns,ck as Ss,cl as Pa,cm as Ta,cn as Ea,co as La,cp as Et,p as Lt,j as Dt,r as Ht,aA as Ys,cq as Da,cr as Ha,aK as za,cs as Wt,ct as Ia,cu as Oa,bA as Ba,cv as $a,cw as Gt,cx as _a,cy as Ua,bE as Va,aJ as Wa,cz as ss,y as Ga,cA as is,cB as Ja,cC as qa,cD as Ka,cE as Ya,cF as Xa,cG as Za,aB as Xs,cH as Qa,cI as en,cJ as tn,cK as sn,cL as an}from"./index-D6J9uyUx.js";import{B as nn,A as ks,a as rn}from"./AgentPermissionPolicyEditor-TKuT5ryJ.js";import{u as Se}from"./vendor-i18n-Duky4gdQ.js";import{f as Jt,S as ln,a as on}from"./standing-instructions-template-jeWwq3Zh.js";import{ExperimentalAgentOnboardingModal as cn}from"./ExperimentalAgentOnboardingModal-BVdW0xJ3.js";import"./vendor-codemirror-CcrtqoCy.js";import"./vendor-reactflow-BlIeoTu4.js";import"./vendor-xterm-BNq00GSj.js";/**
|
|
2
|
+
* @license lucide-react v1.7.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const dn=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M17 12h-2l-2 5-2-10-2 5H7",key:"15hlnc"}]],un=Ls("square-activity",dn);/**
|
|
7
|
+
* @license lucide-react v1.7.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const mn=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],gn=Ls("trending-down",mn);function Cs(t){return t<1e3?`${t}ms`:t<6e4?`${(t/1e3).toFixed(1)}s`:t<36e5?`${Math.floor(t/6e4)}m`:`${(t/36e5).toFixed(1)}h`}function hn(t){return`${Math.round(t*100)}%`}function ws(t,r){const l=Date.now(),o=new Date(t).getTime(),s=l-o;if(s<0){const h=Math.abs(s);return h<6e4?r("agents.time.inAMoment","in a moment"):h<36e5?r("agents.time.inMinutes","in {{count}}m",{count:Math.floor(h/6e4)}):h<864e5?r("agents.time.inHours","in {{count}}h",{count:Math.floor(h/36e5)}):r("agents.time.inDays","in {{count}}d",{count:Math.floor(h/864e5)})}return s<6e4?r("agents.time.justNow","just now"):s<36e5?r("agents.time.minutesAgo","{{count}}m ago",{count:Math.floor(s/6e4)}):s<864e5?r("agents.time.hoursAgo","{{count}}h ago",{count:Math.floor(s/36e5)}):r("agents.time.daysAgo","{{count}}d ago",{count:Math.floor(s/864e5)})}function fn(t,r){switch(t){case"periodic":return r("agents.reflections.triggerPeriodic","Periodic");case"post-task":return r("agents.reflections.triggerPostTask","Post-Task");case"manual":return r("agents.reflections.triggerManual","Manual");case"user-requested":return r("agents.reflections.triggerUserRequested","User Requested");default:return t}}function bt(t){return t instanceof Error&&t.message?t.message:String(t)}function pn(t,r){switch(t){case"improving":return r("agents.ratings.trendImproving","↑ Improving");case"declining":return r("agents.ratings.trendDeclining","↓ Declining");case"stable":return r("agents.ratings.trendStable","→ Stable");default:return r("agents.ratings.trendInsufficient","Insufficient data")}}function bn(t){switch(t){case"improving":return"trend-improving";case"declining":return"trend-declining";case"stable":return"trend-stable";default:return"trend-insufficient"}}function Rs(t,r=5){return e.jsx("span",{className:"rating-stars",children:Array.from({length:r},(l,o)=>e.jsx(Ds,{size:14,className:o<t?"star-filled":"star-empty",fill:o<t?"currentColor":"none"},o))})}function xn({agentId:t,projectId:r,addToast:l}){const{t:o}=Se("app"),[s,h]=a.useState([]),[N,i]=a.useState(null),[p,d]=a.useState(null),[y,M]=a.useState([]),[c,u]=a.useState(!0),[A,D]=a.useState(!0),[F,O]=a.useState(!1),[z,q]=a.useState(!1),[k,w]=a.useState(null),[v,ee]=a.useState(0),[T,L]=a.useState(""),[B,ne]=a.useState(""),W=a.useCallback(async()=>{try{const[m,P]=await Promise.all([ia(t,20,r),ra(t,void 0,r)]);h(m),i(P)}catch(m){l(o("agents.reflections.loadError","Failed to load reflections: {{error}}",{error:bt(m)}),"error")}finally{u(!1)}},[t,r,l]),H=a.useCallback(async()=>{try{const[m,P]=await Promise.all([la(t,r),oa(t,{limit:50},r)]);d(m),M(P)}catch(m){l(o("agents.ratings.loadError","Failed to load ratings: {{error}}",{error:bt(m)}),"error")}finally{D(!1)}},[t,r,l]);a.useEffect(()=>{W(),H()},[W,H]);const K=async()=>{O(!0);try{if(!await da(t,r)){l(o("agents.reflections.insufficientHistory","Not enough history to generate a reflection yet"),"error");return}l(o("agents.reflections.generateSuccess","Reflection generated successfully"),"success"),u(!0),await W()}catch(m){const P=bt(m),X=P.toLowerCase();X.includes("agent not found")||X.includes("not found")?l(o("agents.reflections.agentNotFound","This agent is no longer available. It may have been deleted."),"error"):X.includes("insufficient history")?l(o("agents.reflections.insufficientHistory","Not enough history to generate a reflection yet"),"error"):l(o("agents.reflections.generateError","Failed to generate reflection: {{error}}",{error:P}),"error")}finally{O(!1)}},j=async m=>{if(m.preventDefault(),v!==0){q(!0);try{await ua(t,{score:v,category:T||void 0,comment:B||void 0,raterType:"user"},r),ee(0),L(""),ne(""),l(o("agents.ratings.addSuccess","Rating added"),"success"),await H()}catch(P){l(o("agents.ratings.addError","Failed to add rating: {{error}}",{error:bt(P)}),"error")}finally{q(!1)}}},U=async m=>{try{await ma(t,m,r),l(o("agents.ratings.deleteSuccess","Rating deleted"),"success"),await H()}catch(P){l(o("agents.ratings.deleteError","Failed to delete rating: {{error}}",{error:bt(P)}),"error")}},b=m=>{w(P=>P===m?null:m)};if(c&&A)return e.jsx("div",{className:"reflections-tab",children:e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(J,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:o("agents.reflections.loadingEvaluation","Loading evaluation...")})]})});const S=N&&N.totalTasksCompleted===0&&N.totalTasksFailed===0&&N.recentReflectionCount===0;return e.jsxs("div",{className:"reflections-tab",children:[e.jsxs("div",{className:"reflections-header",children:[e.jsxs("h3",{children:[e.jsx(Rt,{size:16}),o("agents.reflections.sectionTitle","Performance, Reflections & Ratings")]}),e.jsx("button",{className:"btn btn-secondary",onClick:K,disabled:F,title:o("agents.reflections.reflectNowTitle","Generate a manual reflection"),children:F?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:14,className:"animate-spin"}),o("agents.reflections.reflecting","Reflecting...")]}):e.jsxs(e.Fragment,{children:[e.jsx(Tt,{size:14}),o("agents.reflections.reflectNow","Reflect Now")]})})]}),N&&!S&&e.jsxs("div",{className:"reflections-stats-grid",children:[e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(xs,{size:16,style:{color:"var(--color-success)"}}),N.totalTasksCompleted]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.tasksCompleted","Tasks Completed")})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(gn,{size:16,style:{color:"var(--color-error)"}}),N.totalTasksFailed]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.tasksFailed","Tasks Failed")})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(ca,{size:16,style:{color:"var(--in-progress)"}}),Cs(N.avgDurationMs)]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.avgDuration","Avg Duration")})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(Rt,{size:16,style:{color:N.successRate>=.8?"var(--color-success)":N.successRate>=.5?"var(--color-warning)":"var(--color-error)"}}),hn(N.successRate)]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.successRate","Success Rate")})]}),e.jsxs("div",{className:"reflections-stat-card",children:[e.jsxs("div",{className:"stat-value",children:[e.jsx(_t,{size:16,style:{color:"var(--color-info)"}}),N.recentReflectionCount]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.reflections","Reflections")})]})]}),S&&e.jsxs("div",{className:"reflections-no-data",children:[e.jsx(Rt,{size:24,opacity:.3}),e.jsx("p",{children:o("agents.performance.noData","No performance data yet")})]}),e.jsxs("div",{className:"reflections-ratings-section",children:[e.jsx("h4",{children:o("agents.ratings.title","User Ratings")}),A?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(J,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:o("agents.ratings.loading","Loading ratings...")})]}):e.jsxs(e.Fragment,{children:[p&&e.jsxs("div",{className:"rating-summary-card",children:[e.jsxs("div",{className:"rating-score-display",children:[e.jsx("span",{className:"rating-average",children:p.averageScore.toFixed(1)}),Rs(Math.round(p.averageScore))]}),e.jsxs("div",{className:"rating-stats",children:[e.jsx("span",{className:"rating-count",children:o("agents.ratings.count","{{count}} ratings",{count:p.totalRatings})}),e.jsx("span",{className:`rating-trend-badge ${bn(p.trend)}`,children:pn(p.trend,o)})]})]}),p&&Object.keys(p.categoryAverages).length>0&&e.jsxs("div",{className:"category-breakdown",children:[e.jsx("h4",{children:o("agents.ratings.categoryAverages","Category Averages")}),Object.entries(p.categoryAverages).map(([m,P])=>e.jsxs("div",{className:"category-item",children:[e.jsx("span",{className:"category-name",children:m}),e.jsx("span",{className:"category-score",children:P.toFixed(1)})]},m))]}),e.jsxs("form",{className:"add-rating-form",onSubmit:j,children:[e.jsx("h4",{children:o("agents.ratings.addRating","Add Rating")}),e.jsx("div",{className:"star-selector",children:[1,2,3,4,5].map(m=>e.jsx("button",{type:"button",className:"star-btn touch-target",onClick:()=>ee(m),title:o("agents.ratings.starCount","{{count}} star",{count:m,defaultValue_one:"{{count}} star",defaultValue_other:"{{count}} stars"}),children:e.jsx(Ds,{size:24,fill:m<=v?"currentColor":"none",className:m<=v?"star-filled":"star-empty"})},m))}),e.jsxs("select",{value:T,onChange:m=>L(m.target.value),className:"select add-rating-category-select",children:[e.jsx("option",{value:"",children:o("agents.ratings.categorySelect","Select category...")}),e.jsx("option",{value:"quality",children:o("agents.ratings.categoryQuality","Quality")}),e.jsx("option",{value:"speed",children:o("agents.ratings.categorySpeed","Speed")}),e.jsx("option",{value:"communication",children:o("agents.ratings.categoryCommunication","Communication")}),e.jsx("option",{value:"reliability",children:o("agents.ratings.categoryReliability","Reliability")}),e.jsx("option",{value:"other",children:o("agents.ratings.categoryOther","Other")})]}),e.jsx("textarea",{value:B,onChange:m=>ne(m.target.value),placeholder:o("agents.ratings.commentPlaceholder","Optional comment..."),className:"input add-rating-comment-input",rows:3}),e.jsx("button",{type:"submit",className:"btn btn-task-create",disabled:v===0||z,children:z?o("agents.ratings.submitting","Submitting..."):o("agents.ratings.submitRating","Submit Rating")})]}),e.jsxs("div",{className:"rating-history",children:[e.jsx("h4",{children:o("agents.ratings.historyTitle","Rating History")}),y.length===0?e.jsx("p",{className:"no-ratings",children:o("agents.ratings.noRatings","No ratings yet")}):y.map(m=>e.jsxs("div",{className:"rating-history-item",children:[e.jsxs("div",{className:"rating-item-header",children:[Rs(m.score),m.category&&e.jsx("span",{className:"rating-category-badge",children:m.category}),e.jsx("span",{className:"rating-time",children:ws(m.createdAt,o)}),e.jsx("button",{type:"button",className:"rating-delete-btn touch-target",onClick:()=>void U(m.id),title:o("agents.ratings.deleteRating","Delete rating"),children:e.jsx(vt,{size:14})})]}),m.comment&&e.jsx("p",{className:"rating-comment",children:m.comment})]},m.id))]})]})]}),e.jsxs("div",{className:"reflections-list",children:[e.jsx("h4",{children:o("agents.reflections.historyTitle","Reflection History")}),c?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(J,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:o("agents.reflections.loading","Loading reflections...")})]}):s.length===0?e.jsxs("div",{className:"reflection-empty",children:[e.jsx(_t,{size:32,opacity:.3}),e.jsx("p",{children:o("agents.reflections.noReflections","No reflections yet")}),e.jsx("p",{className:"text-secondary",children:o("agents.reflections.getStarted","Trigger a reflection to get started")})]}):e.jsx("div",{className:"reflection-cards",children:s.map(m=>{const P=k===m.id;return e.jsxs("div",{className:`reflection-card ${P?"reflection-card--expanded":""}`,onClick:()=>b(m.id),role:"button",tabIndex:0,onKeyDown:X=>X.key==="Enter"&&b(m.id),children:[e.jsxs("div",{className:"reflection-card-header",children:[e.jsx("span",{className:`reflection-trigger-badge reflection-trigger-${m.trigger}`,children:fn(m.trigger,o)}),e.jsx("span",{className:"reflection-timestamp",children:ws(m.timestamp,o)}),e.jsx("span",{className:"reflection-chevron",children:P?e.jsx(Hs,{size:16}):e.jsx(zs,{size:16})})]}),e.jsx("div",{className:"reflection-summary",children:m.summary}),P&&e.jsxs("div",{className:"reflection-details",children:[m.insights.length>0&&e.jsxs("div",{className:"reflection-insights",children:[e.jsxs("h5",{children:[e.jsx(_t,{size:14})," ",o("agents.reflections.insights","Insights")]}),e.jsx("ul",{children:m.insights.map((X,ue)=>e.jsx("li",{children:X},ue))})]}),m.suggestedImprovements.length>0&&e.jsxs("div",{className:"reflection-suggestions",children:[e.jsxs("h5",{children:[e.jsx(xs,{size:14})," ",o("agents.reflections.suggestedImprovements","Suggested Improvements")]}),e.jsx("ul",{children:m.suggestedImprovements.map((X,ue)=>e.jsx("li",{children:X},ue))})]}),m.metrics&&e.jsxs("div",{className:"reflection-metrics",children:[e.jsx("h5",{children:o("agents.reflections.metrics","Metrics")}),e.jsxs("div",{className:"metrics-grid",children:[m.metrics.tasksCompleted!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:o("agents.reflections.metricTasks","Tasks:")}),e.jsx("span",{className:"metric-value",children:m.metrics.tasksCompleted})]}),m.metrics.tasksFailed!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:o("agents.reflections.metricFailed","Failed:")}),e.jsx("span",{className:"metric-value",children:m.metrics.tasksFailed})]}),m.metrics.avgDurationMs!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:o("agents.reflections.metricAvgDuration","Avg Duration:")}),e.jsx("span",{className:"metric-value",children:Cs(m.metrics.avgDurationMs)})]}),m.metrics.errorCount!==void 0&&e.jsxs("div",{className:"metric",children:[e.jsx("span",{className:"metric-label",children:o("agents.reflections.metricErrors","Errors:")}),e.jsx("span",{className:"metric-value",children:m.metrics.errorCount})]})]})]})]})]},m.id)})})]})]})}function ce(...t){return t.filter(Boolean).join(" ")}const vn={triage:["tasks:create","agents:view","messages:read"],executor:["tasks:execute","agents:view","messages:read","messages:send"],reviewer:["tasks:review","agents:view","messages:read","messages:send"],merger:["tasks:merge","agents:view","messages:read"],scheduler:["tasks:assign","tasks:create","tasks:archive","agents:view","automations:manage","missions:manage","messages:read"],engineer:["tasks:execute","tasks:review","agents:view","messages:read","messages:send"],custom:[]};function lt(t,r){const l=Date.now(),o=new Date(t).getTime(),s=l-o,h=r??((i,p,d)=>d?p.replace(/\{\{(\w+)\}\}/g,(y,M)=>String(d[M]??"")):p);if(s<0){const i=Math.abs(s);if(i<6e4)return h("time.inAMoment","in a moment");if(i<36e5){const d=Math.floor(i/6e4);return h("time.inMinutes","in {{n}}m",{n:d})}if(i<864e5){const d=Math.floor(i/36e5);return h("time.inHours","in {{n}}h",{n:d})}const p=Math.floor(i/864e5);return h("time.inDays","in {{n}}d",{n:p})}if(s<6e4)return h("time.justNow","just now");if(s<36e5){const i=Math.floor(s/6e4);return h("time.minutesAgo","{{n}}m ago",{n:i})}if(s<864e5){const i=Math.floor(s/36e5);return h("time.hoursAgo","{{n}}h ago",{n:i})}const N=Math.floor(s/864e5);return h("time.daysAgo","{{n}}d ago",{n:N})}const jn="⚠️",yn=[{id:"dashboard",label:"Dashboard",icon:un},{id:"logs",label:"Logs",icon:jt},{id:"mail",label:"Mail",icon:ja},{id:"runs",label:"Runs",icon:Ft},{id:"tasks",label:"Tasks",icon:Us},{id:"employees",label:"Employees",icon:Vs},{id:"soul",label:"Soul",icon:ya},{id:"instructions",label:"Instructions",icon:nn},{id:"memory",label:"Agent Memory",icon:jt},{id:"reflections",label:"Evaluation",icon:Rt},{id:"config",label:"Settings",icon:Na}],rs={idle:{bg:"var(--state-idle-bg)",text:"var(--state-idle-text)",border:"var(--state-idle-border)"},active:{bg:"var(--state-active-bg)",text:"var(--state-active-text)",border:"var(--state-active-border)"},running:{bg:"var(--state-active-bg)",text:"var(--state-active-text)",border:"var(--state-active-border)"},paused:{bg:"var(--state-paused-bg)",text:"var(--state-paused-text)",border:"var(--state-paused-border)"},error:{bg:"var(--state-error-bg)",text:"var(--state-error-text)",border:"var(--state-error-border)"}},Pt={completed:{icon:be,color:"var(--color-success)"},failed:{icon:Fa,color:"var(--color-error)"},active:{icon:J,color:"var(--in-progress)"},terminated:{icon:rt,color:"var(--text-muted)"}},Nn=Ks(ss),Sn=700,Ms=is,As=is,kn=100,Cn=1e3;function as(t,r){const l=Math.max(is,t.length);return t.length+1<=l?[...t,r]:[...t.slice(t.length+1-l),r]}function Zs({entries:t,resetKey:r,testId:l}){const{t:o}=Se("app"),[s,h]=a.useState(Ms);a.useEffect(()=>{h(Ms)},[r]);const N=Math.max(0,t.length-s),i=a.useMemo(()=>t.length>s?t.slice(t.length-s):t,[t,s]),p=a.useCallback(()=>{h(d=>d+As)},[]);return e.jsxs(e.Fragment,{children:[N>0&&e.jsx("div",{className:"log-window-loader",children:e.jsx("button",{type:"button",className:"btn btn-secondary btn-sm","data-testid":`${l}-load-older`,onClick:p,children:o("agents.loadOlderLogs","Load {{count}} older ({{remaining}} remaining)",{count:Math.min(As,N),remaining:N})})}),e.jsx(Ja,{entries:i,loading:!1})]})}function wn(t,r){return t.some(l=>l.path===r)?r:t.find(l=>l.layer==="long-term")?.path??t[0]?.path??""}function Xn({agentId:t,projectId:r,onClose:l,addToast:o,onChildClick:s,inline:h=!1,showInlineBackButton:N=!1,initialTab:i,initialRunId:p,preferActiveRun:d=!1,onMutationSuccess:y,floatingWindowKey:M="agent-detail"}){const{t:c}=Se("app"),[u,A]=a.useState(null),[D,F]=a.useState(1),{confirm:O}=Is(),[z,q]=a.useState([]),[k,w]=a.useState(!0),[v,ee]=a.useState(i??"dashboard"),[T,L]=a.useState(!1),[B,ne]=a.useState(!1),[W,H]=a.useState(!1),[K,j]=a.useState(!1),[U,b]=a.useState(!1),[S,m]=a.useState(!1),[P,X]=a.useState(0),[ue,ke]=a.useState(0),[Je,Te]=a.useState(0),[E,te]=a.useState(null),[Ae,Ce]=a.useState(null),[st,Ee]=a.useState(!1),[x,R]=a.useState(null),le=a.useRef(null),V=a.useRef(!1),qe=a.useRef(l),fe=a.useRef(o),Fe=a.useRef(null),de=a.useRef(!1),Le=a.useRef(null),Be=a.useRef([]);Be.current=z;const Ke=a.useRef(null),se=a.useRef(0),yt=a.useRef(t),De=a.useRef(r);qe.current=l,fe.current=o,Fe.current=u,a.useEffect(()=>{let f=!1;return ga(r).then(I=>{f||F(I.heartbeatMultiplier??1)}).catch(()=>{f||F(1)}),()=>{f=!0}},[r]);const je=a.useCallback(async()=>{Fe.current===null&&w(!0);try{const I=await ha(t,r);A(I)}catch(I){fe.current(`Failed to load agent: ${_(I)}`,"error"),qe.current()}finally{w(!1)}},[t,r]),at=a.useCallback(async f=>{const I=se.current,G=t,$=r,ie=()=>se.current!==I||t!==G||r!==$;try{if(u?.taskId){const Pe=u.taskId;te(null),Le.current=null;const Qe=Ke.current===`task:${Pe}`,nt=Qe?Be.current:[],ht=nt.length-fa(nt),et=Math.min(Cn,Math.max(kn,ht)),me=await pa(Pe,$,{limit:et});if(ie())return;q(Ue=>ba(Qe?Ue:[],me.entries,[],Pe).entries),Ke.current=`task:${Pe}`;return}const oe=await Os(G,1,$);if(ie())return;const pe=oe[0]??null;if(te(pe),!pe){Le.current=null,Ke.current=null,q([]);return}if(!f?.force&&Le.current===pe.id)return;const Re=await es(G,pe.id,$);if(ie())return;q(Re),Ke.current=`run:${pe.id}`,Le.current=pe.id}catch(oe){if(ie())return;console.error("Failed to load agent logs:",oe)}},[u?.taskId,t,r]),ot=a.useRef(at);ot.current=at;const ct=a.useCallback(async()=>{Ee(!0),R(null);try{const f=await xa(t,r);Ce(f)}catch(f){R(_(f)),Ce(null)}finally{Ee(!1)}},[t,r]),zt=a.useCallback(f=>{de.current=f},[]),dt=a.useCallback(async(f=!1)=>{await y?.({agentId:t,deleted:f})},[t,y]),$e=a.useCallback(async()=>{await je(),await dt(!1)},[je,dt]);a.useEffect(()=>{je()},[je]),a.useEffect(()=>{const f=setInterval(()=>{je()},3e4);return()=>{clearInterval(f)}},[je]),a.useEffect(()=>{u&&v==="logs"&&at()},[u,v,at]),a.useEffect(()=>{v!=="logs"&&(Le.current=null)},[v]),a.useEffect(()=>{u&&v==="mail"&&ct()},[u,v,ct]),a.useEffect(()=>{if(!K)return;const f=G=>{le.current?.contains(G.target)||j(!1)},I=G=>{G.key==="Escape"&&j(!1)};return document.addEventListener("mousedown",f),document.addEventListener("keydown",I),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",I)}},[K]),a.useEffect(()=>{if(!K)return;let f=!1;return m(!0),At(void 0,r).then(I=>{if(f)return;const G=I.filter($=>!Ut($));X(G.filter($=>$.state==="active"||$.state==="running").length),ke(G.filter($=>$.state==="paused").length)}).catch(()=>{f||(X(0),ke(0))}).finally(()=>{f||m(!1)}),()=>{f=!0}},[K,r]),a.useEffect(()=>{if(v!=="logs"||u?.taskId||!E||E.status!=="active")return;const f=se.current,I=t,G=E.id,$=r?`?projectId=${encodeURIComponent(r)}`:"",ie=Mt(`/api/agents/${encodeURIComponent(I)}/runs/${encodeURIComponent(G)}/logs/stream${$}`,{events:{"agent:log":oe=>{if(se.current===f)try{const pe=JSON.parse(oe.data);q(Re=>as(Re,pe))}catch{}}},onOpen:()=>{se.current===f&&L(!0)},onReconnect:()=>{se.current===f&&(L(!0),ot.current({force:!0}))},onError:()=>{se.current===f&&L(!1)}});return()=>{ie(),se.current===f&&L(!1)}},[v,u?.taskId,t,r,E]),a.useEffect(()=>{(yt.current!==t||De.current!==r)&&(yt.current=t,De.current=r,se.current++,q([]),L(!1),te(null),Ce(null),R(null),Le.current=null,Ke.current=null,de.current=!1)},[t,r]),a.useEffect(()=>{const f=r?`?projectId=${encodeURIComponent(r)}`:"",I=se.current,G=$=>{if(se.current===I)try{const ie=JSON.parse($.data);if(!ie||typeof ie!="object"||ie.agentId!==t)return;je()}catch{}};return Mt(`/api/events${f}`,{events:{"agent:updated":$=>{if(se.current===I)try{const ie=JSON.parse($.data);if(!ie||typeof ie!="object"||ie.id!==t||de.current)return;je()}catch{}},"approval:requested":G,"approval:updated":G,"approval:decided":G},onReconnect:()=>{se.current===I&&(de.current||je())}})},[t,r,je]),a.useEffect(()=>{if(v!=="logs"||!u?.taskId){L(!1);return}const f=se.current,I=u.taskId,G=r?`?projectId=${encodeURIComponent(r)}`:"",$=Mt(`/api/tasks/${encodeURIComponent(I)}/logs/stream${G}`,{events:{"agent:log":ie=>{if(se.current===f)try{const oe=JSON.parse(ie.data);q(pe=>as(pe,oe))}catch{}}},onOpen:()=>{se.current===f&&L(!0)},onReconnect:()=>{se.current===f&&(L(!0),ot.current({force:!0}))},onError:()=>{se.current===f&&L(!1)}});return()=>{$(),se.current===f&&L(!1)}},[u?.taskId,v,r]);const He=async f=>{if(B||!Fe.current)return;const I=Fe.current.state;if(I!==f){ne(!0),A(G=>G&&{...G,state:f});try{await ys(t,f,r),o(c("agents.stateUpdated","Agent state updated to {{newState}}",{newState:f}),"success"),await $e()}catch(G){A($=>$&&{...$,state:I}),o(c("agents.stateUpdateFailed","Failed to update state: {{error}}",{error:_(G)}),"error")}finally{ne(!1)}}},ut=async f=>{if(!U){j(!1),b(!0);try{const G=(await At(void 0,r)).filter(me=>!Ut(me)),$=G.filter(me=>f==="paused"?me.state==="active"||me.state==="running":me.state==="paused"),ie=G.length-$.length;if($.length===0){o(c("agents.bulkNoEligible","No agents eligible to {{action}}",{action:f==="paused"?c("agents.pause","pause"):c("agents.resume","resume")}),"error");return}if(!await O({title:f==="paused"?c("agents.pauseAllTitle","Pause All Agents"):c("agents.resumeAllTitle","Resume All Agents"),message:c("agents.bulkConfirmMessage","{{action}} {{count}} agent(s) in this project?",{action:f==="paused"?c("agents.pauseAction","Pause"):c("agents.resumeAction","Resume"),count:$.length}),danger:f==="paused"}))return;const pe=await Promise.allSettled($.map(me=>ys(me.id,f,r))),Re=pe.map((me,Ue)=>({result:me,agent:$[Ue]})).filter(me=>me.result.status==="rejected"),Pe=pe.length-Re.length,Qe=Re.length,nt=f==="paused"?c("agents.pausedPast","Paused"):c("agents.resumedPast","Resumed"),ht=Pe===1?c("agents.agentSingular","agent"):c("agents.agentPlural","agents"),et=c(Pe===1?"agents.bulkResult_one":"agents.bulkResult_other","{{action}} {{successCount}} {{agentWord}}; skipped {{skippedCount}}",{action:nt,successCount:Pe,agentWord:ht,skippedCount:ie});if(Qe>0){const me=Re.slice(0,3).map(({agent:Ue,result:Ot})=>`${Ue.name||Ue.id}: ${_(Ot.reason)}`).join("; ");o(c("agents.bulkResultWithFailures","{{summary}}; failed {{failureCount}}{{detail}}",{summary:et,failureCount:Qe,detail:me?` (${me})`:""}),"error")}else o(et,"success");await $e()}catch(I){o(c("agents.bulkActionFailed","Failed to {{action}} agents: {{error}}",{action:f==="paused"?c("agents.pause","pause"):c("agents.resume","resume"),error:_(I)}),"error")}finally{b(!1)}}},mt=async()=>{if(!W){H(!0);try{await Ca(t,r,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),o(c("agents.heartbeatStarted","Heartbeat run started for {{name}}",{name:u?.name??t}),"success"),Te(f=>f+1)}catch(f){o(c("agents.heartbeatStartFailed","Failed to start heartbeat run: {{error}}",{error:_(f)}),"error")}finally{H(!1)}}},Ye=async()=>{if(!(!u||!await O({title:c("agents.deleteTitle","Delete Agent"),message:c("agents.deleteConfirm",'Delete agent "{{name}}"? This cannot be undone.',{name:u.name}),danger:!0})))try{await wa(t,r),o(c("agents.deleted",'Agent "{{name}}" deleted',{name:u.name}),"success"),await dt(!0),l()}catch(I){o(c("agents.deleteFailed","Failed to delete agent: {{error}}",{error:_(I)}),"error")}},It=()=>u?ka(u,D):{label:"Unknown",icon:e.jsx(ns,{size:14}),color:"var(--text-muted)",stateDerived:!1},gt=async()=>{if(u){const f=await Ga(u.id);o(f?c("agents.idCopied","Agent ID copied to clipboard"):c("agents.idCopyFailed","Failed to copy agent ID"),f?"success":"error")}};if(k)return h?e.jsx("div",{className:"agent-detail-inline-loading",role:"region","aria-label":c("agents.detailLoadingLabel","Agent detail loading"),children:e.jsxs("div",{className:"agent-detail-loading",children:[e.jsx(J,{className:"animate-spin",size:24}),e.jsx("span",{children:c("agents.loading","Loading agent...")})]})}):e.jsx(vs,{windowKey:M,title:c("agents.loading","Loading agent..."),ariaLabel:c("agents.detailLoadingLabel","Agent detail loading"),onClose:l,modal:!0,hideHeader:!0,dragHandleSelector:".agent-detail-header",className:"floating-window--agent-detail",defaultSize:{width:608,height:640},minSize:{width:400,height:320},persistGeometryKey:`floating-window:${M}`,suspendGeometryPersistenceOnMobile:!0,suspendGeometryPersistenceOnShortViewport:!0,backdropMouseHandlers:{onMouseDown:f=>{f.target===f.currentTarget&&(V.current=!0)},onMouseUp:f=>{V.current&&f.target===f.currentTarget&&l(),V.current=!1}},children:e.jsx("div",{className:"agent-detail-modal",children:e.jsxs("div",{className:"agent-detail-loading",children:[e.jsx(J,{className:"animate-spin",size:24}),e.jsx("span",{children:c("agents.loading","Loading agent...")})]})})});if(!u)return null;const _e=rs[u.state],xe=It(),ve=`${M}-modal-title`,Xe=h?"agent-detail-inline":"agent-detail-modal",we=S||P===0,Ze=S||ue===0,ze=e.jsxs("div",{className:Xe,children:[e.jsxs("div",{className:"agent-detail-header",children:[e.jsxs("div",{className:"agent-detail-identity",children:[h&&N?e.jsxs("button",{type:"button",className:"btn agent-detail-inline-back",onClick:l,"aria-label":c("agents.backToAgents","Back to agents"),children:[e.jsx(Bs,{size:16}),c("agents.agentsLabel","Agents")]}):null,e.jsx("div",{className:"agent-detail-icon",children:e.jsx($s,{agent:u,size:36})}),e.jsxs("div",{className:"agent-detail-info",children:[e.jsx("h2",{id:ve,children:u.name}),e.jsxs("div",{className:"agent-detail-badges",children:[e.jsx("span",{className:"badge",style:{background:_e.bg,color:_e.text,border:`1px solid ${_e.border}`},children:u.state}),e.jsxs("span",{className:"badge",style:{color:xe.color},title:xe.reason??xe.label,children:[xe.icon,!xe.stateDerived&&xe.label]})]})]})]}),e.jsxs("div",{className:"agent-detail-header-actions",children:[e.jsxs("div",{className:"agent-detail-controls",children:[u.state==="idle"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void He("active"),disabled:B,children:[e.jsx(Vt,{size:14}),c("agents.start","Start")]}),e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void mt(),"aria-label":c("agents.runNowFor","Run now for {{name}}",{name:u.name}),disabled:W||B,children:[e.jsx(Ft,{size:14}),c("agents.runNow","Run Now")]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:Ye,children:[e.jsx(vt,{size:14}),c("agents.delete","Delete")]})]}),u.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("paused"),disabled:B,"aria-label":c("agents.pause","Pause"),children:[e.jsx(js,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.pause","Pause")})]}),e.jsxs("button",{className:"btn btn--danger btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("paused"),disabled:B,"aria-label":c("agents.stop","Stop"),children:[e.jsx(rt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.stop","Stop")})]}),e.jsxs("button",{className:"btn btn-task-create btn--compact agent-detail-mobile-icon-control",onClick:()=>void mt(),"aria-label":c("agents.runNowFor","Run now for {{name}}",{name:u.name}),disabled:W||B,children:[e.jsx(Ft,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.runNow","Run Now")})]})]}),u.state==="paused"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("active"),disabled:B,"aria-label":c("agents.resume","Resume"),children:[e.jsx(Vt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.resume","Resume")})]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:Ye,children:[e.jsx(vt,{size:14}),c("agents.delete","Delete")]})]}),u.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("paused"),disabled:B,"aria-label":c("agents.pause","Pause"),children:[e.jsx(js,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.pause","Pause")})]}),e.jsxs("button",{className:"btn btn--danger btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("paused"),disabled:B,"aria-label":c("agents.stop","Stop"),children:[e.jsx(rt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.stop","Stop")})]})]}),u.state==="error"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void He("active"),disabled:B,children:[e.jsx(Vt,{size:14}),c("agents.retry","Retry")]}),e.jsxs("button",{className:"btn btn--danger btn--compact agent-detail-mobile-icon-control",onClick:()=>void He("paused"),disabled:B,"aria-label":c("agents.stop","Stop"),children:[e.jsx(rt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.stop","Stop")})]}),e.jsxs("button",{className:"btn btn--danger btn--compact agent-detail-mobile-icon-control",onClick:Ye,"aria-label":c("agents.delete","Delete"),children:[e.jsx(vt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.delete","Delete")})]})]})]}),e.jsxs("div",{className:"agent-detail-utility-actions",children:[e.jsxs("div",{className:"agent-detail-bulk-menu",ref:le,children:[e.jsx("button",{type:"button",className:"btn-icon",onClick:()=>j(f=>!f),"aria-haspopup":"menu","aria-expanded":K,"aria-label":c("agents.bulkActions","Bulk agent actions"),title:c("agents.bulkActions","Bulk agent actions"),disabled:B||U,children:e.jsx(va,{size:16})}),K&&e.jsxs("div",{className:"agent-detail-bulk-menu-popover",role:"menu",children:[e.jsxs("button",{type:"button",role:"menuitem",className:"agent-detail-bulk-menu-item",onClick:()=>void ut("paused"),disabled:we||U,children:[c("agents.pauseAll","Pause All Agents"),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:S?c("agents.loadingEligible","Loading eligible agents..."):we?c("agents.noActiveEligible","No active agents eligible"):c(P===1?"agents.pauseCountHint_one":"agents.pauseCountHint_other",P===1?"Pause {{count}} active/running agent":"Pause {{count}} active/running agents",{count:P})})]}),e.jsxs("button",{type:"button",role:"menuitem",className:"agent-detail-bulk-menu-item",onClick:()=>void ut("active"),disabled:Ze||U,children:[c("agents.resumeAll","Resume All Agents"),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:S?c("agents.loadingEligible","Loading eligible agents..."):Ze?c("agents.noPausedEligible","No paused agents eligible"):c(ue===1?"agents.resumeCountHint_one":"agents.resumeCountHint_other",ue===1?"Resume {{count}} paused agent":"Resume {{count}} paused agents",{count:ue})})]})]})]}),e.jsx("button",{className:"btn-icon",onClick:()=>void je(),title:c("common.refresh","Refresh"),"aria-label":c("common.refresh","Refresh"),children:e.jsx(Tt,{size:16})}),!h&&e.jsx("button",{className:"btn-icon",onClick:l,"aria-label":c("common.close","Close"),title:c("common.close","Close"),children:e.jsx(_s,{size:20})})]})]})]}),e.jsx("div",{className:"agent-detail-tabs",children:yn.map(f=>{const I={dashboard:c("agents.tabDashboard","Dashboard"),logs:c("agents.tabLogs","Logs"),mail:c("agents.tabMail","Mail"),runs:c("agents.tabRuns","Runs"),tasks:c("agents.tabTasks","Tasks"),employees:c("agents.tabEmployees","Employees"),soul:c("agents.tabSoul","Soul"),instructions:c("agents.tabInstructions","Instructions"),memory:c("agents.tabMemory","Agent Memory"),reflections:c("agents.tabReflections","Evaluation"),config:c("agents.tabConfig","Settings")};return e.jsxs("button",{className:ce("agent-detail-tab",v===f.id&&"active"),onClick:()=>ee(f.id),children:[e.jsx(f.icon,{size:16}),I[f.id]]},f.id)})}),e.jsxs("div",{className:"agent-detail-content",children:[v==="dashboard"&&e.jsx(Rn,{agent:u,health:xe,onChildClick:s,projectId:r}),v==="logs"&&e.jsx(Mn,{logs:z,isStreaming:T,hasTask:!!u.taskId||z.length>0||E!==null,fallbackLabel:!u.taskId&&E?c("agents.latestRunLabel","Latest run · {{id}}",{id:E.id.slice(0,8)}):null,windowResetKey:u.taskId??E?.id??"none"}),v==="mail"&&e.jsx(Fn,{agent:u,mailbox:Ae,isLoading:st,error:x,projectId:r,addToast:o,onRefresh:()=>void ct()}),v==="runs"&&e.jsx(Pn,{addToast:o,agentId:u.id,projectId:r,agentState:u.state,agentName:u.name,initialRunId:p,preferActiveRun:d,runNowRefreshToken:Je,isEphemeral:Ut(u)}),v==="tasks"&&e.jsx(Ln,{agentId:u.id,projectId:r,addToast:o}),v==="employees"&&e.jsx($n,{agentId:u.id,projectId:r,onChildClick:s}),v==="soul"&&e.jsx(Hn,{agent:u,projectId:r,addToast:o,onSaved:$e}),v==="instructions"&&e.jsx(In,{agent:u,projectId:r,addToast:o,onSaved:$e}),v==="memory"&&e.jsx(zn,{agent:u,projectId:r,addToast:o,onSaved:$e}),v==="reflections"&&e.jsx(xn,{agentId:u.id,projectId:r,addToast:o}),v==="config"&&e.jsx(Bn,{agent:u,projectId:r,addToast:o,onSaved:$e,onHasChangesChange:zt,onDelete:Ye,onAgentDraftApplied:f=>{A(I=>I&&{...I,...f})}},u.id)]}),!h&&e.jsxs("div",{className:"agent-detail-footer",children:[e.jsx("button",{className:"btn-icon",onClick:gt,title:c("agents.copyId","Copy Agent ID"),children:e.jsx(Sa,{})}),e.jsx("span",{className:"agent-detail-id",onClick:gt,children:u.id}),u.taskId&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"divider",children:"|"}),e.jsx("span",{className:"text-muted",children:c("agents.workingOn","Working on:")}),e.jsxs("a",{href:`/tasks/${u.taskId}`,className:"link",children:[e.jsx(Ws,{taskId:u.taskId,taskColumn:u.taskColumn}),e.jsx(Gs,{size:12})]})]})]})]});return h?e.jsx("div",{className:"agent-detail-inline-shell",role:"region","aria-label":"Agent detail",children:ze}):e.jsx(vs,{windowKey:M,title:u.name,ariaLabelledBy:ve,onClose:l,modal:!0,hideHeader:!0,dragHandleSelector:".agent-detail-header",className:"floating-window--agent-detail",defaultSize:{width:608,height:640},minSize:{width:400,height:320},persistGeometryKey:`floating-window:${M}`,suspendGeometryPersistenceOnMobile:!0,suspendGeometryPersistenceOnShortViewport:!0,backdropMouseHandlers:{onMouseDown:f=>{f.target===f.currentTarget&&(V.current=!0)},onMouseUp:f=>{V.current&&f.target===f.currentTarget&&l(),V.current=!1}},children:ze})}function Rn({agent:t,health:r,onChildClick:l,projectId:o}){const{t:s}=Se("app"),h=rs[t.state],[N,i]=a.useState([]),[p,d]=a.useState(!0),[y,M]=a.useState(null),[c,u]=a.useState([]),[A,D]=a.useState(null),[F,O]=a.useState(null),[z,q]=a.useState(!1),[k,w]=a.useState(null),v=typeof t.runtimeConfig?.runtimeHint=="string"?t.runtimeConfig.runtimeHint:"",ee=(()=>{const b=t.runtimeConfig??{};if(v){const S=c.find(m=>m.runtimeId===v);return S?S.name:v}if(b.modelProvider&&b.modelId)return`${b.modelProvider}/${b.modelId}`;if(typeof b.model=="string"&&b.model.includes("/")){const S=b.model.indexOf("/");return b.model.slice(S+1)}return null})();a.useEffect(()=>{ts(t.id,o).then(M).catch(()=>M(null))},[t.id,o]),a.useEffect(()=>{Js(o).then(u).catch(()=>u([]))},[o]),a.useEffect(()=>{let b=!1;return d(!0),Ra(t.id,o).then(S=>{if(b)return;const m=S.length>0&&S[0]?.id===t.id?[...S].reverse():S;i(m)}).catch(()=>{b||i([])}).finally(()=>{b||d(!1)}),()=>{b=!0}},[t.id,o]);const T=a.useMemo(()=>{const b=t.completedRuns||[],S=new Date;S.setHours(0,0,0,0);const m=b.filter(X=>new Date(X.startedAt)>=S),P=b.filter(X=>X.status==="completed");return{totalRuns:b.length,todayRuns:m.length,successfulRuns:P.length,successRate:b.length>0?Math.round(P.length/b.length*100):0}},[t]),L=(t.completedRuns||[]).slice(0,5),B=Array.isArray(t.metadata?.skills)?t.metadata.skills:[],ne=A?Jt(A):null,W=a.useCallback(async b=>{q(!0),w(null),O(null);try{const S=await Ma(b,o);O(S)}catch(S){w(_(S))}finally{q(!1)}},[o]),H=a.useCallback(b=>{if(A===b){D(null),O(null),w(null),q(!1);return}D(b),W(b)},[W,A]),K=t.state==="active"||t.state==="running",j=Aa(t.runtimeConfig?.heartbeatIntervalMs),U=K&&t.lastHeartbeatAt?new Date(new Date(t.lastHeartbeatAt).getTime()+j).toISOString():null;return e.jsxs("div",{className:"dashboard-tab dashboard-summary-layout",children:[y?.isOverBudget&&e.jsxs("div",{className:"budget-warning-banner",role:"alert",children:[e.jsx("span",{children:jn}),e.jsxs("span",{children:[e.jsx("strong",{children:s("agents.budgetExhaustedTitle","Budget Exhausted:")})," ",s("agents.budgetExhaustedBody","This agent has exceeded its token budget and may operate with limited functionality.")]})]}),e.jsxs("section",{className:"dashboard-summary-card dashboard-summary-hero",children:[e.jsxs("div",{className:"dashboard-summary-hero__heading",children:[e.jsx(ns,{}),e.jsx("h3",{children:s("agents.overview","Overview")}),e.jsx("strong",{children:t.name}),e.jsx("span",{className:"inline-badge",style:{background:h.bg,color:h.text},children:t.state})]}),e.jsxs("div",{className:"dashboard-summary-hero__meta",children:[e.jsxs("span",{className:"dashboard-summary-hero__health",title:r.reason??r.label,children:[r.icon," ",r.label]}),(t.pendingApprovalCount??0)>0?e.jsxs("span",{className:"badge agent-detail-approval-badge",title:s("agents.pendingApprovals","Pending approvals"),children:[e.jsx("span",{className:"status-dot status-dot--pending"}),s("agents.pendingApprovalsCount","{{count}} pending approvals",{count:t.pendingApprovalCount})]}):null,e.jsx("span",{children:s("agents.roleLabel","Roles: {{role}}",{role:(t.roles??[t.role]).join(", ")})}),e.jsxs("span",{children:[e.jsx("span",{className:"dashboard-summary-label",children:v?s("agents.runtime","Runtime"):s("agents.model","Model")}),e.jsxs("span",{children:[" ",ee??s("agents.auto","Auto")]})]}),B.length>0?e.jsxs("span",{className:"dashboard-summary-skills",children:[e.jsx("span",{className:"dashboard-summary-label",children:s("agents.skills","Skills")}),e.jsx("span",{className:"dashboard-summary-skill-badges",role:"list","aria-label":s("agents.assignedSkills","Assigned skills"),children:B.map(b=>{const S=A===b;return e.jsx("button",{type:"button",className:ce("badge","badge-skill","dashboard-summary-skill-badge","dashboard-summary-skill-badge-btn",S&&"dashboard-summary-skill-badge--selected"),title:b,onClick:()=>H(b),"aria-expanded":S,"aria-label":s("agents.viewSkillDetails","View details for {{skill}}",{skill:Jt(b)}),children:Jt(b)},b)})})]}):e.jsx("span",{children:s("agents.skillsNone","Skills: —")})]}),A?e.jsxs("div",{className:"dashboard-summary-skill-detail","data-testid":"agent-skill-detail",children:[e.jsxs("div",{className:"dashboard-summary-skill-detail-header",children:[e.jsx("span",{className:"dashboard-summary-skill-detail-title",children:ne}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>H(A),children:[e.jsx(_s,{size:14}),s("common.close","Close")]})]}),z?e.jsxs("div",{className:"dashboard-summary-skill-detail-loading",role:"status","aria-live":"polite",children:[e.jsx(J,{size:14,className:"animate-spin"}),s("agents.loadingSkillContent","Loading skill content...")]}):k?e.jsxs("div",{className:"dashboard-summary-skill-detail-error",role:"alert",children:[e.jsx(qs,{size:14}),e.jsx("span",{children:k}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void W(A),children:s("common.retry","Retry")})]}):F?e.jsx("pre",{className:"dashboard-summary-skill-detail-content",children:F.skillMd||s("agents.noSkillMd","(No SKILL.md found)")}):e.jsx("div",{className:"dashboard-summary-skill-detail-empty",children:s("agents.noSkillContent","No skill content available")})]}):null]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:s("agents.heartbeatAndHealth","Heartbeat & Health")}),e.jsxs("div",{className:"dashboard-summary-grid",children:[e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:s("agents.lastHeartbeat","Last heartbeat")}),e.jsx("p",{children:t.lastHeartbeatAt?lt(t.lastHeartbeatAt,s):s("agents.never","Never")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:s("agents.nextExpected","Next expected")}),e.jsx("p",{children:U?lt(U,s):s("agents.notScheduled","Not scheduled")})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:s("agents.interval","Interval")}),e.jsx("p",{children:Ks(j)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"dashboard-summary-label",children:s("agents.status","Status")}),e.jsxs("p",{className:"dashboard-summary-health-row",children:[e.jsx("span",{className:ce("status-dot",t.state==="running"&&"status-dot--running")}),r.label,r.reason&&e.jsxs("span",{className:"text-secondary dashboard-summary-health-reason",title:r.reason,children:["(",r.reason,")"]})]})]})]})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:s("agents.currentWork","Current Work")}),t.taskId?e.jsxs("div",{className:"current-task",children:[e.jsx("a",{href:`/tasks/${t.taskId}`,className:"task-badge",children:e.jsx(Ws,{taskId:t.taskId,taskColumn:t.taskColumn})}),e.jsxs("a",{href:`/tasks/${t.taskId}`,className:"btn btn-sm",children:[s("agents.viewTask","View Task")," ",e.jsx(Gs,{size:14})]})]}):e.jsx("p",{className:"text-muted",children:s("agents.noActiveAssignment","No active assignment")})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:s("agents.recentRuns","Recent Runs")}),e.jsx("p",{className:"dashboard-summary-label",children:s("agents.runsSuccessRate","{{successful}}/{{total}} successful ({{rate}}%)",{successful:T.successfulRuns,total:T.totalRuns,rate:T.successRate})}),L.length===0?e.jsx("p",{className:"text-muted",children:s("agents.noRunsYet","No runs yet")}):e.jsx("div",{className:"runs-list",children:L.map(b=>{const S=Pt[b.status]||Pt.terminated,m=S.icon;return e.jsxs("div",{className:"run-item",children:[e.jsx(m,{size:14,style:{color:S.color}}),e.jsx("span",{children:lt(b.startedAt,s)}),e.jsxs("span",{className:"text-muted",children:[Math.max(0,Math.round((new Date(b.endedAt||b.startedAt).getTime()-new Date(b.startedAt).getTime())/1e3)),"s"]})]},b.id)})})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:s("agents.throughput","Throughput")}),e.jsxs("div",{className:"stats-grid",children:[e.jsxs("div",{className:"stat-card",children:[e.jsx("div",{className:"stat-value",children:T.totalRuns}),e.jsx("div",{className:"stat-label",children:s("agents.totalRuns","Total Runs")})]}),e.jsxs("div",{className:"stat-card",children:[e.jsx("div",{className:"stat-value",children:T.todayRuns}),e.jsx("div",{className:"stat-label",children:s("agents.runsToday","Runs Today")})]}),e.jsxs("div",{className:"stat-card",children:[e.jsxs("div",{className:"stat-value",children:[T.successRate,"%"]}),e.jsx("div",{className:"stat-label",children:s("agents.successRate","Success Rate")})]})]})]}),e.jsxs("section",{className:"dashboard-summary-card",children:[e.jsx("h3",{children:s("agents.chainOfCommand","Chain of Command")}),p?e.jsxs("div",{className:"chain-of-command-loading",role:"status","aria-live":"polite",children:[e.jsx(J,{size:14,className:"animate-spin"}),e.jsx("span",{children:s("agents.loadingReportingChain","Loading reporting chain...")})]}):N.length<=1?e.jsx("p",{className:"text-muted",children:s("agents.noReportingChain","No reporting chain")}):e.jsx("div",{className:"chain-of-command-path","aria-label":s("agents.chainOfCommand","Chain of command"),children:N.map((b,S)=>{const m=S===N.length-1,P=!m;return e.jsxs("div",{className:"chain-of-command-item",children:[e.jsx("button",{type:"button",className:`chain-of-command-node${m?" chain-of-command-node--current":""}`,onClick:()=>P&&l?.(b.id),disabled:!P||!l,title:m?s("agents.currentAgent","Current agent"):s("agents.viewAgent","View {{name}}",{name:b.name}),children:b.name}),!m&&e.jsx("span",{className:"chain-of-command-separator","aria-hidden":"true",children:"→"})]},b.id)})})]})]})}function Mn({logs:t,isStreaming:r,hasTask:l,fallbackLabel:o,windowResetKey:s}){const{t:h}=Se("app");return l?e.jsxs("div",{className:"logs-tab",children:[e.jsxs("div",{className:"logs-header",children:[e.jsx("span",{className:"logs-count",children:h("agents.logEntries","{{count}} entries",{count:t.length})}),o&&e.jsx("span",{className:"text-muted logs-fallback-label",children:o}),r&&e.jsxs("span",{className:"streaming-indicator",children:[e.jsx("span",{className:"streaming-dot"}),h("agents.live","Live")]})]}),t.length===0?e.jsxs("div",{className:"logs-empty",children:[e.jsx(jt,{size:48,opacity:.3}),e.jsx("p",{children:h("agents.noLogEntriesYet","No log entries yet")}),e.jsx("p",{className:"text-muted",children:r?h("agents.waitingForActivity","Waiting for activity..."):h("agents.logsWillAppearActive","Logs will appear here when the agent is active")})]}):e.jsx(Zs,{entries:t,resetKey:s,testId:"agent-logs"})]}):e.jsx("div",{className:"logs-tab",children:e.jsxs("div",{className:"logs-empty",children:[e.jsx(jt,{size:48,opacity:.3}),e.jsx("p",{children:h("agents.noActivityYet","No activity yet")}),e.jsx("p",{className:"text-muted",children:h("agents.logsWillAppear","Agent logs will appear here from the current task or most recent run")})]})})}function An(t,r){const l=new Date(t),s=new Date().getTime()-l.getTime(),h=Math.floor(s/6e4),N=Math.floor(s/36e5),i=Math.floor(s/864e5),p=r??((d,y,M)=>M?y.replace(/\{\{(\w+)\}\}/g,(c,u)=>String(M[u]??"")):y);return h<1?p("time.justNow","just now"):h<60?p("time.minutesAgo","{{n}}m ago",{n:h}):N<24?p("time.hoursAgo","{{n}}h ago",{n:N}):i<7?p("time.daysAgo","{{n}}d ago",{n:i}):l.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function wt(t,r,l,o){const s=o??((h,N,i)=>i?N.replace(/\{\{(\w+)\}\}/g,(p,d)=>String(i[d]??"")):N);if(r==="user")return t==="dashboard"?s("mailbox.you","You"):s("mailbox.userLabel","User: {{id}}",{id:t});if(r==="agent"){const h=l?.get(t)?.trim();return!h||h===t?s("mailbox.agentById","Agent: {{id}}",{id:t}):s("mailbox.agentByName","Agent: {{name}}",{name:h})}return s("mailbox.system","System")}function Fn({agent:t,mailbox:r,isLoading:l,error:o,projectId:s,addToast:h,onRefresh:N}){const{t:i}=Se("app"),[p,d]=a.useState("inbox"),[y,M]=a.useState([]);a.useEffect(()=>{let k=!1;return At(void 0,s).then(w=>{k||M(w)}).catch(()=>{k||M([])}),()=>{k=!0}},[s]);const c=a.useMemo(()=>{const k=new Map;for(const v of y){if(!v.id)continue;const ee=typeof v.name=="string"?v.name.trim():"";ee.length>0&&k.set(v.id,ee)}const w=typeof t.name=="string"?t.name.trim():"";return w.length>0&&k.set(t.id,w),k},[y,t.id,t.name]),[u,A]=a.useState(null),D=p==="inbox"?r?.inbox??[]:r?.outbox??[],F=u?D.find(k=>k.id===u)??null:null;a.useEffect(()=>{A(null)},[p,t.id]);const O=async k=>{if(A(k.id),!(p!=="inbox"||k.read))try{await sn(k.id,s),N()}catch(w){const v=`Failed to mark message as read: ${_(w)}`;h?h(v,"error"):console.warn(v)}},z=()=>{A(null),N()},q=k=>e.jsxs("button",{type:"button",className:ce("mailbox-item","agent-mail-tab-message",p==="inbox"&&!k.read&&"unread",u===k.id&&"agent-mail-tab-message--selected"),onClick:()=>void O(k),"aria-pressed":u===k.id,children:[e.jsx("div",{className:"mailbox-item-avatar",children:(p==="inbox"?k.fromType:k.toType)==="agent"?e.jsx(ns,{size:16}):e.jsx(qa,{size:16})}),e.jsxs("div",{className:"mailbox-item-content",children:[e.jsxs("div",{className:"mailbox-item-header",children:[p==="inbox"?e.jsx("span",{className:"mailbox-item-from",children:wt(k.fromId,k.fromType,c,i)}):e.jsx("span",{className:"mailbox-item-to",children:i("agents.mailTo","To: {{recipient}}",{recipient:wt(k.toId,k.toType,c,i)})}),e.jsx("span",{className:"mailbox-item-time",children:An(k.createdAt,i)})]}),e.jsxs("div",{className:"mailbox-item-preview",children:[k.content.slice(0,80),k.content.length>80?"…":""]})]}),p==="inbox"&&!k.read?e.jsx("div",{className:"mailbox-item-unread-dot","aria-label":i("agents.unreadMessage","Unread message")}):null]},k.id);return e.jsxs("div",{className:"agent-mail-tab",children:[e.jsxs("div",{className:"agent-mail-tab-header",children:[e.jsx("h3",{children:i("agents.agentMail","{{name}} Mail",{name:t.name})}),e.jsxs("button",{className:"btn btn-sm",onClick:z,disabled:l,children:[e.jsx(Tt,{size:14}),i("common.refresh","Refresh")]})]}),e.jsxs("div",{className:"mailbox-agent-subtabs","data-testid":"agent-detail-mail-subtabs",children:[e.jsxs("button",{className:ce("btn","btn-sm","btn-secondary","mailbox-agent-subtab",p==="inbox"&&"active"),onClick:()=>d("inbox"),children:[e.jsx(Ns,{size:12}),e.jsx("span",{children:i("agents.inbox","Inbox")}),(r?.unreadCount??0)>0?e.jsx("span",{className:"mailbox-tab-badge",children:r?.unreadCount}):null]}),e.jsxs("button",{className:ce("btn","btn-sm","btn-secondary","mailbox-agent-subtab",p==="outbox"&&"active"),onClick:()=>d("outbox"),children:[e.jsx(Ss,{size:12}),e.jsx("span",{children:i("agents.outbox","Outbox")})]})]}),l&&!r?e.jsxs("div",{className:"agent-detail-loading agent-detail-loading--inline",role:"status","aria-live":"polite",children:[e.jsx(J,{className:"animate-spin",size:16}),e.jsx("span",{children:i("agents.loadingMailbox","Loading mailbox...")})]}):null,!l&&o?e.jsxs("div",{className:"agent-mail-tab-error",role:"alert",children:[e.jsx(qs,{size:16}),e.jsx("span",{children:i("agents.mailboxLoadFailed","Failed to load mailbox: {{error}}",{error:o})})]}):null,!l&&!o?F?e.jsxs("div",{className:"agent-mail-tab-detail","data-testid":"agent-detail-mail-message",children:[e.jsxs("button",{type:"button",className:"btn btn-sm agent-mail-tab-back","data-testid":"agent-detail-mail-back",onClick:()=>A(null),children:[e.jsx(Bs,{size:14}),p==="inbox"?i("agents.backToInbox","Back to Inbox"):i("agents.backToOutbox","Back to Outbox")]}),e.jsxs("div",{className:"agent-mail-tab-detail-meta",children:[e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:i("agents.mailFrom","From")}),e.jsx("span",{children:wt(F.fromId,F.fromType,c,i)})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:i("agents.mailToLabel","To")}),e.jsx("span",{children:wt(F.toId,F.toType,c,i)})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:i("agents.mailType","Type")}),e.jsx("span",{children:F.type})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:i("agents.mailSent","Sent")}),e.jsx("span",{children:new Date(F.createdAt).toLocaleString()})]}),F.metadata?.replyTo?.messageId?e.jsx("div",{className:"agent-mail-tab-reply-context",children:i("agents.replyingTo","↪ Replying to message {{id}}",{id:F.metadata.replyTo.messageId})}):null]}),e.jsx("div",{className:"agent-mail-tab-detail-body",children:F.content})]}):e.jsx("div",{className:"mailbox-list","data-testid":"agent-detail-mail-list",children:D.length===0?e.jsxs("div",{className:"mailbox-empty","data-testid":"agent-detail-mail-empty",children:[p==="inbox"?e.jsx(Ns,{size:32}):e.jsx(Ss,{size:32}),e.jsx("p",{children:p==="inbox"?i("agents.noInboxMessages","No received messages for this agent"):i("agents.noOutboxMessages","No sent messages for this agent")})]}):D.map(q)}):null]})}function Pn({addToast:t,agentId:r,projectId:l,agentState:o,agentName:s,initialRunId:h,preferActiveRun:N,runNowRefreshToken:i,isEphemeral:p}){const{t:d}=Se("app"),[y,M]=a.useState([]),{confirm:c}=Is(),[u,A]=a.useState(!0),[D,F]=a.useState(null),[O,z]=a.useState([]),[q,k]=a.useState(!1),[w,v]=a.useState(null),[ee,T]=a.useState(!1),[L,B]=a.useState(null),[ne,W]=a.useState([]),H=a.useRef(!1),K=a.useRef(!1),j=a.useRef(null);j.current=D;const U=a.useRef(async()=>{});U.current=async()=>{const x=j.current;if(x)try{const R=await es(r,x,l);if(j.current!==x)return;z(R)}catch{}};const b=a.useCallback(async()=>{try{const x=await Os(r,50,l);M(x)}catch(x){t(`Failed to load runs: ${_(x)}`,"error")}finally{A(!1)}},[r,l,t]);a.useEffect(()=>{b()},[b]),a.useEffect(()=>{if(p){B(null),W([]);return}const x=l?`?projectId=${encodeURIComponent(l)}`:"";fetch(`/api/agents/${encodeURIComponent(r)}/token-usage${x}`).then(async R=>{if(!R.ok){if(R.status===400){B(null);return}throw new Error(`Request failed: ${R.status}`)}const le=await R.json();B(le)}).catch(R=>{t(`Failed to load cache hit ratio: ${_(R)}`,"error")}),Pa(r,7,l).then(R=>W(R)).catch(R=>{const le=_(R).toLowerCase();if(le.includes("ephemeral")||le.includes("400")){W([]);return}t(`Failed to load prompt sizes: ${_(R)}`,"error")})},[r,l,t,p]),a.useEffect(()=>{if(!K.current){K.current=!0;return}A(!0),b()},[b,i]);const S=y.some(x=>x.status==="active"),m=D?y.find(x=>x.id===D)?.status:void 0;a.useEffect(()=>{if(!S)return;const x=setInterval(()=>{b()},5e3);return()=>clearInterval(x)},[S,b]),a.useEffect(()=>{if(!D||m!=="active")return;const x=l?`?projectId=${encodeURIComponent(l)}`:"";return Mt(`/api/agents/${encodeURIComponent(r)}/runs/${encodeURIComponent(D)}/logs/stream${x}`,{events:{"agent:log":R=>{try{const le=JSON.parse(R.data);z(V=>as(V,le))}catch{}}},onReconnect:()=>{U.current()}})},[D,m,r,l]);const P=a.useCallback(async x=>{if(D===x){F(null),z([]),v(null);return}F(x),k(!0),T(!0),z([]),v(null);try{const[R,le]=await Promise.all([es(r,x,l),Ta(r,x,l)]);z(R),v(le)}catch(R){t(d("agents.runDetailsFailed","Failed to load run details: {{error}}",{error:_(R)}),"error"),z([]),v(null)}finally{k(!1),T(!1)}},[D,r,l,t]);a.useEffect(()=>{H.current=!1},[r,h,N]),a.useEffect(()=>{if(y.length===0||u||H.current)return;const x=h?y.find(R=>R.id===h):N?y.find(R=>R.status==="active"):null;H.current=!0,x&&P(x.id)},[h,N,y,u,P]);const X=async()=>{if(await c({title:d("agents.stopRunTitle","Stop Active Run"),message:d("agents.stopRunConfirm","Stop the active run? The agent's work will be interrupted."),danger:!0}))try{await Ka(r,l),t(d("agents.runStopped","Run stopped"),"success"),A(!0),b()}catch(R){t(d("agents.stopRunFailed","Failed to stop run: {{error}}",{error:_(R)}),"error")}};if(u&&y.length===0)return e.jsx("div",{className:"runs-tab",children:e.jsxs("div",{className:"runs-loading-row",children:[e.jsx(J,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:d("agents.loadingRuns","Loading runs...")})]})});if(y.length===0)return e.jsx("div",{className:"runs-tab",children:e.jsxs("div",{className:"runs-empty",children:[e.jsx(Ft,{size:48,opacity:.3}),e.jsx("p",{children:d("agents.noRunsYet","No runs yet")}),e.jsx("p",{className:"text-muted",children:d("agents.heartbeatRunsWillAppear","Heartbeat runs will appear here")})]})});const ue=[...y].sort((x,R)=>new Date(R.startedAt).getTime()-new Date(x.startedAt).getTime()),ke=ue.filter(x=>x.status==="active"),Je=ue.filter(x=>x.status!=="active"),Te=x=>x?e.jsxs("div",{className:"run-usage",children:[e.jsx("span",{children:d("agents.inputTokens","Input: {{value}}",{value:x.inputTokens.toLocaleString()})}),e.jsx("span",{children:d("agents.outputTokens","Output: {{value}}",{value:x.outputTokens.toLocaleString()})}),x.cachedTokens>0&&e.jsx("span",{children:d("agents.cacheReadTokens","Cache read: {{value}}",{value:x.cachedTokens.toLocaleString()})}),(x.cacheWriteTokens??0)>0&&e.jsx("span",{children:d("agents.cacheWriteTokens","Cache write: {{value}}",{value:(x.cacheWriteTokens??0).toLocaleString()})})]}):null,E=(x,R,le)=>{const V=Pt[x.status]||Pt.completed,qe=V.icon,fe=x.endedAt?Tn(new Date(x.startedAt),new Date(x.endedAt)):d("agents.inProgress","In progress"),Fe=D===x.id;return e.jsxs("div",{children:[e.jsxs("div",{className:ce("run-card",le&&"run-card--active",Fe&&"run-card--selected","run-card--clickable"),onClick:()=>void P(x.id),role:"button",tabIndex:0,"aria-expanded":Fe,"aria-label":d("agents.runAriaLabel","{{active}}run {{id}}, {{status}}",{active:le?d("agents.activePrefix","Active "):"",id:x.id.slice(0,8),status:x.status}),onKeyDown:de=>{(de.key==="Enter"||de.key===" ")&&(de.preventDefault(),P(x.id))},children:[e.jsxs("div",{className:"run-header",children:[e.jsxs("div",{className:"run-header-group",children:[Fe?e.jsx(Hs,{size:14}):e.jsx(zs,{size:14}),le?e.jsxs("span",{className:"run-live-indicator",children:[e.jsx("span",{className:"live-dot"}),d("agents.liveRun","Live Run")]}):e.jsxs("span",{className:"run-id",children:["#",R+1," ",x.id.slice(0,8)]})]}),e.jsxs("div",{className:"run-header-group",children:[x.invocationSource&&e.jsx("span",{className:"badge run-badge--compact",children:x.invocationSource}),le&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:de=>{de.preventDefault(),de.stopPropagation(),X()},"aria-label":d("agents.stopActiveRun","Stop active run"),children:[e.jsx(rt,{size:12})," ",d("agents.stop","Stop")]}),e.jsxs("span",{className:ce("run-status",x.status),children:[e.jsx(qe,{size:14,style:{color:V.color}}),x.status]}),x.heartbeatProcedureSource==="custom"&&e.jsx("span",{className:"badge run-badge--compact",children:d("agents.heartbeatCustom","Heartbeat: custom")})]})]}),e.jsxs("div",{className:"run-details",children:[e.jsx("span",{children:d("agents.runStarted","Started {{time}}",{time:lt(x.startedAt,d)})}),e.jsx("span",{children:"•"}),e.jsx("span",{children:fe}),x.triggerDetail&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsx("span",{className:"text-muted",children:x.triggerDetail})]})]})]}),Fe&&e.jsxs("div",{className:"run-logs-container",children:[ee?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(J,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:d("agents.loadingDetails","Loading details...")})]}):w&&e.jsxs("div",{className:"run-output-sections",children:[e.jsx("div",{className:"run-output-section",children:e.jsxs("details",{children:[e.jsx("summary",{className:"run-output-label run-output-summary",children:d("agents.systemPrompt","System Prompt")}),w.systemPrompt?e.jsx("pre",{className:"run-output-panel",children:w.systemPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:d("agents.systemPromptNotCaptured","System prompt not captured for this run")})]})}),e.jsx("div",{className:"run-output-section",children:e.jsxs("details",{children:[e.jsx("summary",{className:"run-output-label run-output-summary",children:d("agents.executionPrompt","Execution Prompt")}),w.executionPrompt?e.jsx("pre",{className:"run-output-panel",children:w.executionPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:d("agents.executionPromptNotCaptured","Execution prompt not captured for this run")})]})}),w.usageJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.tokenUsage","Token Usage")}),Te(w.usageJson)]}),w.stdoutExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.output","Output")}),e.jsx("pre",{className:"run-output-panel",children:w.stdoutExcerpt.length>2e3?`${w.stdoutExcerpt.slice(0,2e3)}
|
|
12
|
+
|
|
13
|
+
... (truncated, ${w.stdoutExcerpt.length} chars total)`:w.stdoutExcerpt})]}),w.stderrExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label run-output-label--error",children:d("agents.errors","Errors")}),e.jsx(Ya,{errorText:w.stderrExcerpt,summaryPrefix:"Run error",issueContext:{surface:"AgentDetailView runs",agentId:r,agentName:s,agentState:o,runId:w.id,taskId:void 0,timestamp:w.startedAt}})]}),w.resultJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.result","Result")}),e.jsx("pre",{className:"run-output-panel",children:JSON.stringify(w.resultJson,null,2)})]}),w.contextSnapshot&&Object.keys(w.contextSnapshot).length>0&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.context","Context")}),e.jsx("div",{className:"run-context-grid",children:Object.entries(w.contextSnapshot).map(([de,Le])=>e.jsxs("span",{className:"run-context-item",children:[e.jsxs("span",{className:"text-muted",children:[de,":"]})," ",e.jsx("span",{children:String(Le)})]},de))})]}),!w.stdoutExcerpt&&!w.stderrExcerpt&&!w.resultJson&&e.jsx("div",{className:"text-muted run-output-empty",children:d("agents.noOutputCaptured","No output captured")})]}),e.jsxs("div",{className:"run-agent-logs-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.agentLogs","Agent Logs")}),q?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(J,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:d("agents.loadingLogs","Loading logs...")})]}):O.length===0?e.jsx("div",{className:"text-muted run-output-empty",children:d("agents.noLogsForRun","No logs available for this run")}):e.jsx(Zs,{entries:O,resetKey:D??"none",testId:"agent-run-logs"})]})]})]},x.id)},te=(x,R)=>e.jsxs("div",{className:"run-context-item",children:[e.jsxs("span",{className:"text-muted",children:[x,":"]})," ",e.jsx("span",{children:d("agents.cacheWindowSummary","{{percent}}% ({{cached}} / {{written}} / {{input}} / {{tasks}})",{percent:(R.hitRatio*100).toFixed(1),cached:R.totalCachedTokens.toLocaleString(),written:R.totalCacheWriteTokens.toLocaleString(),input:R.totalInputTokens.toLocaleString(),tasks:R.nTasks.toLocaleString()})})]},x),Ae=ne[0],Ce=[...ne].reverse(),st=Math.max(1,...Ce.map(x=>x.execChars)),Ee=Ce.map((x,R)=>{const le=Ce.length<=1?0:R/(Ce.length-1)*100,V=100-Math.round(x.execChars/st*100);return`${le},${V}`}).join(" ");return e.jsxs("div",{className:"runs-tab",children:[ne.length>0&&Ae&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.promptSize","Prompt Size")}),e.jsxs("div",{className:"prompt-size-summary",children:[e.jsxs("svg",{className:"prompt-size-sparkline",viewBox:"0 0 100 100",role:"img","aria-label":d("agents.promptSizeChart","Execution prompt size over last 7 runs"),children:[e.jsx("polyline",{className:"prompt-size-sparkline-grid",points:"0,100 100,100"}),e.jsx("polyline",{className:"prompt-size-sparkline-line",points:Ee})]}),e.jsxs("span",{className:"prompt-size-values",children:[Ae.systemChars.toLocaleString()," / ",Ae.execChars.toLocaleString()," / ",Ae.totalChars.toLocaleString()]})]})]}),L&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:d("agents.cacheHitRatio","Cache hit ratio")}),e.jsxs("div",{className:"run-context-grid",children:[te(d("agents.last24h","Last 24h"),L.last24h),te(d("agents.last7d","Last 7d"),L.last7d),te(d("agents.allTime","All time"),L.allTime)]})]}),e.jsxs("div",{className:"runs-toolbar runs-toolbar--between",children:[e.jsxs("span",{className:"runs-toolbar-meta",children:[d("agents.runsCount",{count:y.length,defaultValue_one:"{{count}} run",defaultValue_other:"{{count}} runs"}),S&&e.jsxs("span",{className:"run-live-indicator run-live-indicator--with-margin",children:[e.jsx("span",{className:"live-dot"}),d("agents.live","Live")]})]}),e.jsx("div",{className:"run-header-group",children:S&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void X(),"aria-label":d("agents.stopActiveRunFor","Stop active run for {{name}}",{name:s??r}),children:[e.jsx(rt,{size:14})," ",d("agents.stopRun","Stop Run")]})})]}),ke.map((x,R)=>E(x,R,!0)),Je.map((x,R)=>E(x,ke.length+R,!1))]})}function Tn(t,r){const l=Math.floor((r.getTime()-t.getTime())/1e3);return l<60?`${l}s`:l<3600?`${Math.floor(l/60)}m ${l%60}s`:`${Math.floor(l/3600)}h ${Math.floor(l%3600/60)}m`}function En(t){const r=t.title?.trim()||t.description?.trim()||t.id;return r.length>80?`${r.slice(0,77)}...`:r}function Ln({agentId:t,projectId:r,addToast:l}){const{t:o}=Se("app"),[s,h]=a.useState([]),[N,i]=a.useState(!0);return a.useEffect(()=>{let p=!1;return i(!0),Ea(t,r).then(d=>{p||h(d)}).catch(d=>{p||(h([]),l(o("agents.loadTasksFailed","Failed to load assigned tasks: {{error}}",{error:_(d)}),"error"))}).finally(()=>{p||i(!1)}),()=>{p=!0}},[t,r,l]),N?e.jsxs("div",{className:"agent-tasks-empty",children:[e.jsx(J,{size:16,className:"animate-spin"}),e.jsx("p",{children:o("agents.loadingTasks","Loading assigned tasks...")})]}):s.length===0?e.jsxs("div",{className:"agent-tasks-empty",children:[e.jsx(Us,{size:18}),e.jsx("p",{children:o("agents.noTasksAssigned","No tasks assigned to this agent")})]}):e.jsx("div",{className:"agent-tasks-list",children:s.map(p=>e.jsxs("a",{className:"agent-task-item",href:`/tasks/${p.id}`,children:[e.jsxs("div",{className:"agent-task-row",children:[e.jsx("span",{className:"agent-task-id",children:p.id}),e.jsx("span",{className:`agent-task-column column-${p.column}`,children:{triage:o("board.triage","Planning"),todo:o("board.todo","Todo"),"in-progress":o("board.inProgress","In Progress"),"in-review":o("board.inReview","In Review"),done:o("board.done","Done"),archived:o("board.archived","Archived")}[p.column]??p.column})]}),e.jsx("div",{className:"agent-task-title",title:p.title||p.description||p.id,children:En(p)}),e.jsxs("div",{className:"agent-task-status",children:[p.status??"idle"," · ",o("agents.taskUpdated","Updated {{time}}",{time:lt(p.updatedAt,o)})]})]},p.id))})}const xt=[{key:"maxRetries",label:"Max Retries",type:"number",placeholder:"3",hint:"Maximum number of automatic retries on task failure (0–10, default 3)",min:0,max:10},{key:"timeoutMs",label:"Task Timeout (ms)",type:"number",placeholder:"600000",hint:"Maximum time in ms before a task is considered timed out (minimum 60000ms, default 600000ms)",min:6e4,max:864e5},{key:"logLevel",label:"Log Level",type:"select",hint:"Verbosity of agent log output",options:[{value:"debug",label:"Debug"},{value:"info",label:"Info"},{value:"warn",label:"Warning"},{value:"error",label:"Error"}]}];function Dn(t){const r={};for(const l of xt){const o=t[l.key]?.trim();if(o){if(l.type==="number"){const s=Number(o);if(Number.isNaN(s)||!Number.isFinite(s)){r[l.key]=`"${l.label}" must be a valid number`;continue}l.min!==void 0&&s<l.min&&(r[l.key]=`"${l.label}" must be at least ${l.min.toLocaleString()}`),l.max!==void 0&&s>l.max&&(r[l.key]=`"${l.label}" must be at most ${l.max.toLocaleString()}`)}if(l.type==="select"){const s=l.options?.map(h=>h.value)??[];s.length>0&&!s.includes(o)&&(r[l.key]=`"${l.label}" must be one of: ${s.join(", ")}`)}}}return r}function Hn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[h,N]=a.useState(t.soul??""),[i,p]=a.useState(!1),[d,y]=a.useState(!1),[M,c]=a.useState(!1),u=a.useRef(null);a.useEffect(()=>{N(t.soul??""),y(!1),c(!1)},[t.id,t.soul]),a.useEffect(()=>()=>{u.current&&clearTimeout(u.current)},[]);const A=h!==(t.soul??""),D=async()=>{if(h.length>1e4){l(s("agents.soulTooLong","Soul must be at most 10,000 characters"),"error");return}p(!0);try{await Xa(t.id,h,r),l(s("agents.soulSaved","Soul saved"),"success"),y(!0),u.current&&clearTimeout(u.current),u.current=setTimeout(()=>y(!1),3e3),await o()}catch(F){l(s("agents.soulSaveFailed","Failed to save soul: {{error}}",{error:_(F)}),"error")}finally{p(!1)}};return e.jsx("div",{className:"config-tab",children:e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:s("agents.soulTitle","Soul")}),e.jsx("p",{className:"config-description",children:s("agents.soulDescription","Define this agent's personality and identity.")}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-soul",children:s("agents.agentSoulLabel","Agent Soul")}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[e.jsxs("button",{className:`btn btn-sm ${M?"":"btn-primary"}`,onClick:()=>c(!1),disabled:!M,"aria-label":s("common.editMode","Edit mode"),children:[e.jsx(Et,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${M?"btn-primary":""}`,onClick:()=>c(!0),disabled:M,"aria-label":s("common.previewMode","Preview mode"),children:[e.jsx(Lt,{size:14}),s("common.preview","Preview")]})]})}),M?h.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Dt,{remarkPlugins:[Ht],children:h})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:s("agents.soulEmptyPreview","No soul defined yet. Switch to Edit mode to define the agent's personality.")}):e.jsx("textarea",{id:"agent-soul",className:"input config-textarea-mono",rows:12,placeholder:s("agents.soulPlaceholder","Describe this agent's personality, tone, and behavioral traits..."),value:h,onChange:F=>{N(F.target.value),y(!1)}}),!M&&e.jsx("span",{className:"config-hint",children:s("agents.soulHint","Defines the agent's character and identity. Max 10,000 characters.")})]})}),!M&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!A||i,onClick:()=>void D(),children:i?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveSoul","Save Soul")]})}),!A&&d&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.soulSaved","Soul saved")]})]})]})})}function zn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[h,N]=a.useState(t.memory??""),[i,p]=a.useState(!1),[d,y]=a.useState(!1),[M,c]=a.useState(!1),[u,A]=a.useState([]),[D,F]=a.useState(!1),[O,z]=a.useState(""),[q,k]=a.useState(""),[w,v]=a.useState(!1),[ee,T]=a.useState(!1),[L,B]=a.useState(!1),[ne,W]=a.useState(!1),[H,K]=a.useState(""),j=a.useRef(null),U=a.useRef(null),b=t.state==="running",S=h!==(t.memory??""),m=a.useMemo(()=>u.find(E=>E.path===O),[u,O]),P=m?{"long-term":s("agents.memoryLayerLongTermDesc","Curated durable decisions, conventions, constraints, and pitfalls for this specific agent."),daily:s("agents.memoryLayerDailyDesc","Raw daily observations and open loops recorded by this agent."),dreams:s("agents.memoryLayerDreamsDesc","Synthesized patterns and emerging themes distilled from this agent's daily memory.")}[m.layer]??m.layer:s("agents.selectMemoryFile","Select a memory file to view or edit."),X=a.useCallback(async E=>{T(!0);try{const te=await Da(t.id,E,r);z(te.path),k(te.content),v(!1),W(!1)}catch(te){l(s("agents.memoryFileLoadFailed","Failed to load agent memory file: {{error}}",{error:_(te)}),"error")}finally{T(!1)}},[t.id,r,l]),ue=a.useCallback(async(E="")=>{F(!0);try{const{files:te}=await Ha(t.id,r);if(A(te),te.length===0){z(""),k(""),v(!1);return}const Ae=wn(te,E);await X(Ae)}catch(te){l(s("agents.memoryFilesLoadFailed","Failed to load memory files: {{error}}",{error:_(te)}),"error"),A([]),z(""),k(""),v(!1)}finally{F(!1)}},[t.id,r,l,X]);a.useEffect(()=>{N(t.memory??""),y(!1),c(!1),K(""),W(!1),ue()},[t.id,t.memory,ue]),a.useEffect(()=>()=>{j.current&&clearTimeout(j.current),U.current&&clearTimeout(U.current)},[]);const ke=async()=>{if(h.length>5e4){l(s("agents.memoryTooLong","Memory must be at most 50,000 characters"),"error");return}p(!0);try{await Qa(t.id,h,r),l(s("agents.memorySaved","Memory saved"),"success"),y(!0),j.current&&clearTimeout(j.current),j.current=setTimeout(()=>y(!1),3e3),await o()}catch(E){l(s("agents.memorySaveFailed","Failed to save memory: {{error}}",{error:_(E)}),"error")}finally{p(!1)}},Je=async E=>{if(!(!E||E===O)){if(w){K(s("agents.saveBeforeSwitch","Save the current file before switching to another file."));return}K(""),await X(E)}},Te=async()=>{if(O){B(!0);try{await en(t.id,O,q,r),v(!1),W(!0),U.current&&clearTimeout(U.current),U.current=setTimeout(()=>W(!1),3e3),K(""),await ue(O),l(s("agents.memoryFileSaved","Agent memory file saved"),"success"),await o()}catch(E){l(s("agents.memoryFileSaveFailed","Failed to save agent memory file: {{error}}",{error:_(E)}),"error")}finally{B(!1)}}};return e.jsx("div",{className:"config-tab",children:e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:s("agents.memoryTitle","Agent Memory")}),e.jsx("p",{className:"config-description",children:s("agents.memoryDescription","Store context that belongs to this agent only. Workspace memory, daily notes, dreams, and qmd search live in project settings under Project Memory.")}),b&&e.jsx("p",{className:"config-hint config-hint--block-spacing",children:s("agents.memoryReadOnly","Read-only while this agent is running.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-memory",children:s("agents.inlineMemoryLabel","Inline Memory")}),e.jsx("span",{className:"config-hint config-hint--block",children:s("agents.inlineMemoryHint","Short-form memory stored directly on the agent record and injected into prompts.")}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[!b&&e.jsxs("button",{className:`btn btn-sm ${M?"":"btn-primary"}`,onClick:()=>c(!1),disabled:!M,"aria-label":s("agents.inlineMemoryEditMode","Inline memory edit mode"),children:[e.jsx(Et,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${M?"btn-primary":""}`,onClick:()=>c(!0),disabled:M,"aria-label":s("agents.inlineMemoryPreviewMode","Inline memory preview mode"),children:[e.jsx(Lt,{size:14}),s("common.preview","Preview")]})]})}),M?h.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Dt,{remarkPlugins:[Ht],children:h})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:s("agents.memoryEmptyPreview","No agent memory defined yet. Switch to Edit mode to add memory content.")}):e.jsx("textarea",{id:"agent-memory","aria-label":s("agents.memoryTitle","Agent Memory"),className:"input config-textarea-mono",rows:10,placeholder:s("agents.memoryPlaceholder","Durable preferences, operating habits, and context this agent should carry across tasks..."),value:h,readOnly:b,onChange:E=>{N(E.target.value),y(!1)}}),!M&&e.jsx("span",{className:"config-hint",children:s("agents.inlineMemoryFieldHint","This is the inline memory field on the agent JSON record. Max 50,000 characters.")}),!M&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!S||i||b,onClick:()=>void ke(),children:i?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveMemory","Save Memory")]})}),!S&&d&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.memorySaved","Memory saved")]})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-memory-file-select",children:s("agents.memoryFilesLabel","Memory Files")}),e.jsxs("span",{className:"config-hint config-hint--block",children:[s("agents.memoryFilesHint","Full OpenClaw memory files at")," ",e.jsxs("code",{children:["agent/",t.name||t.id,"/memory/"]})," ",s("agents.memoryFilesHintSuffix","(MEMORY.md, DREAMS.md, and daily notes).")]}),e.jsx("select",{id:"agent-memory-file-select",className:"select",value:O,disabled:D||ee||L||u.length===0,onChange:E=>{Je(E.target.value)},children:u.length===0?e.jsx("option",{value:"",children:s("agents.noMemoryFiles","No memory files found")}):u.map(E=>{const te={"long-term":s("agents.memoryLayerLongTerm","Long-term"),daily:s("agents.memoryLayerDaily","Daily"),dreams:s("agents.memoryLayerDreams","Dreams")}[E.layer]??E.layer;return e.jsxs("option",{value:E.path,children:[te," • ",E.label]},E.path)})}),D&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(J,{size:14,className:"animate-spin"}),s("agents.loadingMemoryFiles","Loading memory files…")]}),m&&e.jsxs("div",{className:"config-hint config-hint--top-spacing",children:[e.jsx("strong",{children:{"long-term":s("agents.memoryLayerLongTerm","Long-term"),daily:s("agents.memoryLayerDaily","Daily"),dreams:s("agents.memoryLayerDreams","Dreams")}[m.layer]??m.layer})," · ",P,e.jsx("br",{}),s("agents.memoryFileMeta","{{size}} bytes · updated {{date}}",{size:m.size.toLocaleString(),date:lt(m.updatedAt,s)})]}),e.jsx("div",{className:"agent-memory-file-editor config-textarea-top-spacing",children:e.jsx(za,{content:q,onChange:E=>{k(E),v(!0),W(!1),K("")},readOnly:b||!O||ee,filePath:O||"MEMORY.md",forceToolbarActionsVisible:!0})}),ee&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(J,{size:14,className:"animate-spin"}),s("agents.loadingFileContent","Loading file content…")]}),H&&e.jsx("span",{className:"config-hint config-hint--top-spacing config-hint--block",children:H}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!w||L||!O||b,onClick:()=>void Te(),children:L?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("agents.savingFile","Saving file…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveMemoryFile","Save Memory File")]})}),!w&&ne&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.memoryFileSaved","Memory file saved")]})]})]})]})]})})}function In({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[h,N]=a.useState(t.instructionsText??""),[i,p]=a.useState(t.instructionsPath??""),[d,y]=a.useState(!1),[M,c]=a.useState(""),[u,A]=a.useState(!1),[D,F]=a.useState(!1),[O,z]=a.useState(!1),[q,k]=a.useState(!1),[w,v]=a.useState(!1),[ee,T]=a.useState(!1),L=a.useRef(null),B=a.useRef(null);a.useEffect(()=>{const j=i.trim();if(!j){c(""),F(!1);return}A(!0),Ys("project",j).then(U=>{c(U.content),F(!1)}).catch(U=>{const b=_(U);b.includes("ENOENT")||b.includes("Not found")||b.includes("not found")?(c(""),F(!1)):(l(`Failed to load instructions file: ${b}`,"error"),c(""))}).finally(()=>{A(!1)})},[i,l]),a.useEffect(()=>{N(t.instructionsText??""),p(t.instructionsPath??""),v(!1),T(!1),y(!1)},[t.id,t.instructionsText,t.instructionsPath]),a.useEffect(()=>()=>{L.current&&clearTimeout(L.current),B.current&&clearTimeout(B.current)},[]);const ne=(()=>{const j=h??"",U=t.instructionsText??"",b=i?.trim()??"",S=t.instructionsPath?.trim()??"";return j!==U||b!==S})(),W=async()=>{z(!0);try{await Za(t.id,{instructionsText:h||void 0,instructionsPath:i.trim()||void 0},r),l(s("agents.instructionsSaved","Instructions saved"),"success"),v(!0),L.current&&clearTimeout(L.current),L.current=setTimeout(()=>v(!1),3e3),await o()}catch(j){l(s("agents.instructionsSaveFailed","Failed to save instructions: {{error}}",{error:_(j)}),"error")}finally{z(!1)}},H=async()=>{const j=i.trim();if(!j){l(s("agents.noInstructionsPath","No instructions file path set"),"error");return}k(!0);try{await Xs("project",j,M),l(s("agents.instructionsFileSaved","Instructions file saved"),"success"),F(!1),T(!0),B.current&&clearTimeout(B.current),B.current=setTimeout(()=>T(!1),3e3),await o()}catch(U){l(s("agents.instructionsFileSaveFailed","Failed to save instructions file: {{error}}",{error:_(U)}),"error")}finally{k(!1)}},K=!!i.trim();return e.jsxs("div",{className:"config-tab",children:[e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:s("agents.instructionsTitle","Custom Instructions")}),e.jsx("p",{className:"config-description",children:s("agents.instructionsDescription","Append custom instructions to this agent's system prompt at execution time. Use this to customize behavior, coding style, or project conventions without modifying built-in prompts.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"instructions-text",children:s("agents.inlineInstructions","Inline Instructions")}),e.jsx("div",{className:"agent-content-toolbar",children:e.jsxs("div",{className:"agent-content-mode-toggle",children:[!h.trim()&&!d&&e.jsx("button",{type:"button",className:"btn btn-sm","data-testid":"instructions-insert-template",onClick:()=>{N(ln),v(!1)},children:s("agents.insertInstructionsTemplate","Insert template")}),e.jsxs("button",{className:`btn btn-sm ${d?"":"btn-primary"}`,onClick:()=>y(!1),disabled:!d,"aria-label":s("common.editMode","Edit mode"),"data-testid":"instructions-edit-toggle",children:[e.jsx(Et,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${d?"btn-primary":""}`,onClick:()=>y(!0),disabled:d,"aria-label":s("common.previewMode","Preview mode"),"data-testid":"instructions-preview-toggle",children:[e.jsx(Lt,{size:14}),s("common.preview","Preview")]})]})}),d?h.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Dt,{remarkPlugins:[Ht],children:h})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:s("agents.instructionsEmptyPreview","No inline instructions defined yet. Switch to Edit mode to add instructions.")}):e.jsx("textarea",{id:"instructions-text",className:"input",rows:10,placeholder:s("agents.instructionsPlaceholder","Enter custom instructions to append to this agent's system prompt..."),value:h,onChange:j=>{N(j.target.value),v(!1)}}),!d&&e.jsx("span",{className:"config-hint",children:s("agents.instructionsHint","Markdown formatting supported. Max 50,000 characters.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"instructions-path",children:s("agents.instructionsPathLabel","Instructions File Path")}),e.jsx("input",{id:"instructions-path",type:"text",className:"input",placeholder:s("agents.instructionsPathPlaceholder","e.g., .fusion/agents/my-agent-instructions.md"),value:i,onChange:j=>{p(j.target.value),v(!1)}}),e.jsx("span",{className:"config-hint",children:s("agents.instructionsPathHint","Path to a .md file (relative to project root). Contents are read and appended at execution time.")})]})]}),!d&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!ne||O,onClick:()=>void W(),children:O?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveInstructions","Save Instructions")]})}),!ne&&w&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.instructionsSaved","Instructions saved")]})]})]}),K&&e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:s("agents.instructionsFileEditorTitle","Instructions File Editor")}),e.jsx("p",{className:"config-description",children:s("agents.instructionsFileEditorDesc","Edit the instructions file directly. Changes are saved separately from the path configuration.")}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsxs("div",{className:"config-inline-header",children:[e.jsx("label",{htmlFor:"instructions-file-content",children:s("agents.fileContentLabel","File Content")}),u&&e.jsxs("span",{className:"config-hint config-hint--inline-tight",children:[e.jsx(J,{size:12,className:"animate-spin"}),s("common.loading","Loading...")]}),D&&!u&&e.jsx("span",{className:"config-hint config-hint--warning",children:s("common.unsavedChanges","Unsaved changes")})]}),e.jsx("textarea",{id:"instructions-file-content",className:"input config-textarea-mono",rows:20,placeholder:s("agents.fileContentPlaceholder","File content will appear here when loaded..."),value:M,readOnly:u,onChange:j=>{c(j.target.value),F(!0),T(!1)}}),e.jsx("span",{className:"config-hint",children:s("agents.fileContentHint","Edit the markdown file content directly. Save separately using the button below.")})]})}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!D||q,onClick:()=>void H(),children:q?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveFile","Save File")]})}),!D&&ee&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.fileSaved","File saved")]})]})]})]})}function Fs(t){const r=t??{},l={};return r.heartbeatIntervalMs!==void 0&&r.heartbeatIntervalMs!==null&&(l.heartbeatIntervalMs=String(Number(r.heartbeatIntervalMs)/1e3)),r.heartbeatTimeoutMs!==void 0&&r.heartbeatTimeoutMs!==null&&(l.heartbeatTimeoutMs=String(Number(r.heartbeatTimeoutMs)/1e3)),r.maxConcurrentRuns!==void 0&&r.maxConcurrentRuns!==null&&(l.maxConcurrentRuns=String(r.maxConcurrentRuns)),(r.messageResponseMode==="immediate"||r.messageResponseMode==="on-heartbeat")&&(l.messageResponseMode=r.messageResponseMode),r.autoClaimCandidatesInPrompt!==void 0&&r.autoClaimCandidatesInPrompt!==null&&(l.autoClaimCandidatesInPrompt=String(r.autoClaimCandidatesInPrompt)),l}function qt(t){return t?.autoClaimRelevantTasks!==!1}function Kt(t){return t?.engineerBacklogAutoClaim===!0}function Ps(t){const r=t?.assignmentPolicy;return r==="explicit-only"||r==="none"?r:"auto"}function Yt(t){return t?.runMissedHeartbeatOnStartup===!0}function Xt(t){return t?.allowParallelExecution!==!1}function Zt(t){return t?.skipHeartbeatWhenIdle===!0}function Qt(t){const r=t?.heartbeatScopeDiscipline;return r==="strict"||r==="lite"||r==="off"?r:""}function Ts(t){const r=t?.heartbeatPromptTemplate;return r==="default"||r==="compact"?r:""}function Es(t){const r=(t??{}).budgetConfig,l={};return r&&(r.tokenBudget!==void 0&&r.tokenBudget!==null&&(l.tokenBudget=String(r.tokenBudget)),r.usageThreshold!==void 0&&r.usageThreshold!==null&&(l.usageThreshold=String(Number(r.usageThreshold)*100)),r.budgetPeriod!==void 0&&r.budgetPeriod!==null&&(l.budgetPeriod=String(r.budgetPeriod)),r.resetDay!==void 0&&r.resetDay!==null&&(l.resetDay=String(r.resetDay))),l}function On({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[h,N]=a.useState(!1),[i,p]=a.useState(!1),[d,y]=a.useState(!1),[M,c]=a.useState(!1),[u,A]=a.useState(!1),[D,F]=a.useState(""),[O,z]=a.useState(!1),[q,k]=a.useState(null),[w,v]=a.useState(!1),ee=a.useRef(null),T=t.heartbeatProcedurePath?.trim(),L=`.fusion/agents/${t.name.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t.id.toLowerCase().replace(/[^a-z0-9]+/g,"-")||"agent"}-${t.id.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"agent"}/HEARTBEAT.md`,B=`.fusion/agents/${t.id}/HEARTBEAT.md`,ne=t.id.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"agent",W=!!(T&&(T===L||T===B||new RegExp(`^\\.fusion/agents/[^/]+-${ne}/HEARTBEAT\\.md$`).test(T))),H=!!T,K=a.useCallback(async S=>{y(!0),k(null);try{const m=await Ys("project",S,r);F(m.content),z(!1)}catch(m){const P=_(m);k(P),l(s("agents.heartbeatFileLoadFailed","Failed to load heartbeat procedure file: {{error}}",{error:P}),"error")}finally{y(!1)}},[l,r]);a.useEffect(()=>{p(!1),A(!1),F(""),z(!1),k(null),y(!1),c(!1),v(!1)},[t.id,T]),a.useEffect(()=>()=>{ee.current&&clearTimeout(ee.current)},[]);const j=async()=>{T&&(p(!0),await K(T))},U=async()=>{if(T){c(!0);try{await Xs("project",T,D,r),z(!1),v(!0),l(s("agents.heartbeatFileSaved","Heartbeat procedure file saved"),"success"),ee.current&&clearTimeout(ee.current),ee.current=setTimeout(()=>v(!1),3e3),await o()}catch(S){l(s("agents.heartbeatFileSaveFailed","Failed to save heartbeat procedure file: {{error}}",{error:_(S)}),"error")}finally{c(!1)}}},b=async()=>{N(!0);try{const S=await an(t.id,r);l(S.procedureFileSeeded?s("agents.heartbeatProcedureFileReady","Heartbeat procedure file ready at {{path}}",{path:S.heartbeatProcedurePath}):s("agents.heartbeatProcedurePathSet","Heartbeat procedure path set to {{path}}",{path:S.heartbeatProcedurePath}),"success"),await o()}catch(S){l(s("agents.heartbeatUpgradeFailed","Failed to upgrade heartbeat procedure: {{error}}",{error:_(S)}),"error")}finally{N(!1)}};return e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:s("agents.heartbeatProcedureTitle","Heartbeat Procedure")}),e.jsxs("p",{className:"config-description",children:[s("agents.heartbeatProcedureDesc","The per-tick procedure this agent runs every wake. Defaults to a per-agent markdown file (for example")," ",e.jsx("code",{children:".fusion/agents/ceo-agent2736/HEARTBEAT.md"}),s("agents.heartbeatProcedureDescSuffix",") that you can edit. Legacy id-only default paths remain valid. Resets on every tick — no need to restart the agent after editing.")]}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsxs("span",{className:"config-hint",children:[s("agents.currentPath","Current path:")," ",e.jsx("code",{children:T||s("agents.noneUsingBuiltIn","(none — using built-in default)")})]}),H&&e.jsx("div",{className:"heartbeat-procedure-actions",children:e.jsx("button",{className:"btn btn-sm",onClick:()=>void j(),disabled:d,children:d?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("agents.loadingFile","Loading file…")]}):e.jsxs(e.Fragment,{children:[e.jsx(jt,{size:16}),s("agents.viewHeartbeatMarkdown","View Heartbeat Markdown")]})})})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("button",{className:"btn",disabled:h||W,onClick:()=>void b(),"aria-label":s("agents.upgradeToDefaultAriaLabel","Upgrade agent to default heartbeat procedure file"),children:h?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("agents.upgrading","Upgrading…")]}):W?e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.alreadyOnDefault","Already on default")]}):s("agents.upgradeToDefault","Upgrade to Default Heartbeat Procedure")}),e.jsxs("span",{className:"config-hint",children:[s("agents.upgradeHint","Sets")," ",e.jsx("code",{children:"heartbeatProcedurePath"})," ",s("agents.upgradeHintTo","to")," ",e.jsx("code",{children:L})," ",s("agents.upgradeHintSuffix","and seeds the file from the built-in template if it doesn't exist. Each agent gets its own per-agent file, so edits stay scoped to this agent. Operator edits to the file are preserved.")]})]})]}),i&&H&&T&&e.jsxs("div",{className:"config-fields heartbeat-procedure-viewer",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"heartbeat-procedure-file-content",children:s("agents.heartbeatProcedureFileLabel","Heartbeat Procedure File")}),e.jsxs("div",{className:"agent-content-toolbar",children:[e.jsxs("div",{className:"agent-content-mode-toggle",children:[e.jsxs("button",{className:`btn btn-sm ${u?"":"btn-primary"}`,onClick:()=>A(!1),disabled:!u,"aria-label":s("agents.heartbeatFileEditMode","Heartbeat file edit mode"),children:[e.jsx(Et,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${u?"btn-primary":""}`,onClick:()=>A(!0),disabled:u,"aria-label":s("agents.heartbeatFilePreviewMode","Heartbeat file preview mode"),children:[e.jsx(Lt,{size:14}),s("common.preview","Preview")]})]}),d&&e.jsxs("span",{className:"config-hint heartbeat-procedure-status",children:[e.jsx(J,{size:12,className:"animate-spin"}),s("common.loading","Loading...")]}),O&&!d&&e.jsx("span",{className:"config-hint heartbeat-procedure-status heartbeat-procedure-status--warning",children:s("common.unsavedChanges","Unsaved changes")})]}),u?D.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Dt,{remarkPlugins:[Ht],children:D})}):e.jsx("div",{className:"agent-content-preview agent-content-placeholder",children:s("agents.heartbeatFileEmptyPreview","No heartbeat procedure markdown content yet.")}):e.jsx("textarea",{id:"heartbeat-procedure-file-content",className:"input",rows:16,value:D,readOnly:d,placeholder:s("agents.heartbeatFilePlaceholder","Heartbeat procedure markdown file content will appear here..."),onChange:S=>{F(S.target.value),z(!0),v(!1)}}),q&&e.jsx("span",{className:"config-error",children:s("agents.fileLoadError","Failed to load file: {{error}}",{error:q})}),e.jsxs("span",{className:"config-hint",children:[s("agents.heartbeatFileEditorHint","This editor writes directly to")," ",e.jsx("code",{children:T}),"."]})]}),!u&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!O||M||d,onClick:()=>void U(),children:M?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),s("agents.saveHeartbeatFile","Save Heartbeat File")]})}),!O&&w&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(be,{size:14}),s("agents.fileSaved","File saved")]})]})]})]})}function Bn({agent:t,projectId:r,addToast:l,onSaved:o,onHasChangesChange:s,onDelete:h,onAgentDraftApplied:N}){const{t:i}=Se("app"),[p,d]=a.useState(t.name),[y,M]=a.useState(t.role),[c,u]=a.useState(()=>(t.roles??[t.role]).filter(n=>n!==t.role)),[A,D]=a.useState(t.title??""),[F,O]=a.useState(t.icon??""),[z,q]=a.useState(t.reportsTo??""),[k,w]=a.useState([]),[v,ee]=a.useState(!1),[T,L]=a.useState(!1),[B,ne]=a.useState(!1),W=a.useRef(null),[H,K]=a.useState(()=>{const n={};for(const g of xt){const C=t.metadata[g.key];C!=null&&(n[g.key]=String(C))}return n.thinkingLevel=typeof t.runtimeConfig?.thinkingLevel=="string"?t.runtimeConfig.thinkingLevel:"off",n}),[j,U]=a.useState(()=>Fs(t.runtimeConfig)),[b,S]=a.useState(()=>Wt(t)),[m,P]=a.useState(()=>qt(t.runtimeConfig)),[X,ue]=a.useState(()=>Kt(t.runtimeConfig)),[ke,Je]=a.useState(()=>Ps(t.runtimeConfig)),[Te,E]=a.useState(()=>Yt(t.runtimeConfig)),[te,Ae]=a.useState(()=>Xt(t.runtimeConfig)),[Ce,st]=a.useState(()=>Zt(t.runtimeConfig)),[Ee,x]=a.useState(()=>Qt(t.runtimeConfig)),[R,le]=a.useState(()=>Ts(t.runtimeConfig)),[V,qe]=a.useState(()=>Es(t.runtimeConfig)),[fe,Fe]=a.useState(t.bundleConfig?.mode??""),[de,Le]=a.useState(t.bundleConfig?.entryFile??"AGENTS.md"),[Be,Ke]=a.useState(t.bundleConfig?.externalPath??""),[se,yt]=a.useState(t.bundleConfig?.files??[]),[De,je]=a.useState(Array.isArray(t.metadata?.skills)?t.metadata.skills:[]),{favoriteProviders:at,favoriteModels:ot,toggleFavoriteProvider:ct,toggleFavoriteModel:zt}=Ia(),[dt,$e]=a.useState([]),[He,ut]=a.useState(!1),[mt,Ye]=a.useState([]),[It,gt]=a.useState(!1),_e=(()=>{const n=t.runtimeConfig??{};return n.modelProvider&&n.modelId?`${n.modelProvider}/${n.modelId}`:typeof n.model=="string"&&n.model.includes("/")?n.model:""})(),xe=typeof t.runtimeConfig?.runtimeHint=="string"?t.runtimeConfig.runtimeHint:"",[ve,Xe]=a.useState(xe?"runtime":"model"),[we,Ze]=a.useState(_e),[ze,f]=a.useState(xe),[I,G]=a.useState(t.permissionPolicy),[$,ie]=a.useState(t.permissions??{}),[oe,pe]=a.useState(void 0),Re=z.trim(),Pe=a.useMemo(()=>k.filter(n=>n.id!==t.id),[k,t.id]),Qe=!!Re&&!Pe.some(n=>n.id===Re),nt=a.useMemo(()=>({name:p,role:y,title:A||void 0,instructionsText:t.instructionsText,soul:t.soul,memory:t.memory,reportsTo:z||void 0,skills:De,model:we||void 0,runtimeHint:ve==="runtime"&&ze||void 0,thinkingLevel:H.thinkingLevel??void 0,maxTurns:H.maxTurns?Number(H.maxTurns):void 0,heartbeatIntervalMs:j.heartbeatIntervalMs?Number(j.heartbeatIntervalMs)*1e3:void 0,heartbeatTimeoutMs:j.heartbeatTimeoutMs?Number(j.heartbeatTimeoutMs)*1e3:void 0,maxConcurrentRuns:j.maxConcurrentRuns?Number(j.maxConcurrentRuns):void 0,messageResponseMode:j.messageResponseMode}),[t.instructionsText,t.memory,t.soul,H.maxTurns,H.thinkingLevel,j.heartbeatIntervalMs,j.heartbeatTimeoutMs,j.maxConcurrentRuns,j.messageResponseMode,we,p,z,y,ve,ze,De,A]),ht=a.useCallback(n=>{d(n.name),M(n.role),D(n.title??""),O(n.icon??""),q(n.reportsTo??""),n.skills&&je(n.skills),n.thinkingLevel&&K(C=>({...C,thinkingLevel:n.thinkingLevel})),n.maxTurns!==void 0&&K(C=>({...C,maxTurns:String(n.maxTurns)})),n.runtimeHint!==void 0?(Xe("runtime"),f(n.runtimeHint??""),n.runtimeHint&&Ze("")):n.model!==void 0&&(Xe("model"),Ze(n.model??""),f(""));const g=Object.fromEntries(Object.entries({name:n.name,role:n.role,title:n.title,icon:n.icon,reportsTo:n.reportsTo,instructionsText:n.instructionsText,soul:n.soul,memory:n.memory}).filter(([,C])=>C!==void 0));N?.(g),ne(!1),l(i("agents.interviewDraftApplied","Interview draft applied. Review and save when ready."),"success")},[l,N]);a.useEffect(()=>{G(t.permissionPolicy)},[t.permissionPolicy]),a.useEffect(()=>{ie(t.permissions??{})},[t.permissions]),a.useEffect(()=>{Oa(r).then(n=>pe(n.project?.defaultAgentPermissionPolicy)).catch(()=>pe(void 0))},[r]);const et=async n=>{G(n);try{await Gt(t.id,{permissionPolicy:n},r),await o(),l(i("agents.permissionPolicyUpdated","Permission policy updated"),"success")}catch(g){l(i("agents.permissionPolicyFailed","Failed to update permission policy: {{error}}",{error:_(g)}),"error")}},me=a.useMemo(()=>new Set(vn[y]??[]),[y]),Ue=a.useMemo(()=>new Set(ks.filter(n=>$[n]===!0)),[$]),Ot=async(n,g)=>{const C={...$};g?C[n]=!0:delete C[n],ie(C);try{await Gt(t.id,{permissions:C},r),await o(),l(i("agents.capabilityPermissionsUpdated","Capability grants updated"),"success")}catch(Q){ie(t.permissions??{}),l(i("agents.capabilityPermissionsFailed","Failed to update capability grants: {{error}}",{error:_(Q)}),"error")}};a.useEffect(()=>{let n=!1;return ee(!0),At(void 0,r).then(g=>{n||w(g)}).catch(()=>{n||w([])}).finally(()=>{n||ee(!1)}),()=>{n=!0}},[r]),a.useEffect(()=>{ut(!0),Ba().then(n=>{$e(n.models)}).catch(()=>{}).finally(()=>ut(!1))},[]),a.useEffect(()=>{gt(!0),Js(r).then(Ye).catch(()=>Ye([])).finally(()=>gt(!1))},[r]);const[Ve,Bt]=a.useState(null),[ls,os]=a.useState(!1);a.useEffect(()=>{ts(t.id,r).then(Bt).catch(()=>Bt(null))},[t.id,r]);const Qs=async()=>{os(!0);try{await tn(t.id,r),l(i("agents.budgetResetSuccess","Budget usage reset successfully"),"success");const n=await ts(t.id,r);Bt(n)}catch(n){l(i("agents.budgetResetFailed","Failed to reset budget: {{error}}",{error:_(n)}),"error")}finally{os(!1)}},[We,cs]=a.useState(!1),[Y,tt]=a.useState({}),[ea,it]=a.useState(!1),[$t,Nt]=a.useState(null),ds=t.state==="idle"||t.state==="paused",ft=a.useRef(null),us=a.useRef(null),ms=a.useRef(null),St=a.useRef(0);a.useEffect(()=>()=>{ft.current&&clearTimeout(ft.current)},[]);const Me=(()=>{if(p!==t.name||y!==t.role||A!==(t.title??"")||F!==(t.icon??"")||z!==(t.reportsTo??"")||fe!==(t.bundleConfig?.mode??"")||de!==(t.bundleConfig?.entryFile??"AGENTS.md")||Be!==(t.bundleConfig?.externalPath??"")||JSON.stringify(se)!==JSON.stringify(t.bundleConfig?.files??[]))return!0;for(const ae of xt){const ye=H[ae.key]?.trim()??"",Ne=t.metadata[ae.key]!==void 0&&t.metadata[ae.key]!==null?String(t.metadata[ae.key]):"";if(ye!==Ne)return!0}const n=t.runtimeConfig??{};if(b!==Wt(t)||m!==qt(t.runtimeConfig)||X!==Kt(t.runtimeConfig)||ke!==Ps(t.runtimeConfig)||Te!==Yt(t.runtimeConfig)||te!==Xt(t.runtimeConfig)||Ce!==Zt(t.runtimeConfig)||Ee!==Qt(t.runtimeConfig)||R!==Ts(t.runtimeConfig))return!0;for(const ae of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns","messageResponseMode","autoClaimCandidatesInPrompt"]){const ye=j[ae]?.trim()??"";let Ne=n[ae]!==void 0&&n[ae]!==null?String(n[ae]):"";if((ae==="heartbeatIntervalMs"||ae==="heartbeatTimeoutMs")&&Ne&&(Ne=String(Number(Ne)/1e3)),ye!==Ne)return!0}const g=n.budgetConfig;for(const ae of["tokenBudget","budgetPeriod","resetDay"]){const ye=V[ae]?.trim()??"",Ne=g?.[ae]!==void 0&&g?.[ae]!==null?String(g[ae]):"";if(ye!==Ne)return!0}const C=V.usageThreshold?.trim()??"",Q=g?.usageThreshold!==void 0&&g?.usageThreshold!==null?String(Number(g.usageThreshold)*100):"";if(C!==Q)return!0;const he=Array.isArray(t.metadata?.skills)?t.metadata.skills:[];return JSON.stringify(De)!==JSON.stringify(he)||ve!==(xe?"runtime":"model")||we!==_e||ze!==xe||(H.thinkingLevel||"off")!==(typeof n.thinkingLevel=="string"?n.thinkingLevel:"off")})(),gs=a.useRef(null);a.useEffect(()=>{s&&gs.current!==Me&&(gs.current=Me,s(Me))},[Me,s]),a.useEffect(()=>()=>{s?.(!1)},[s]),a.useEffect(()=>{const n={id:t.id,updatedAt:t.updatedAt},g=us.current;(!g||g.id!==n.id||g.updatedAt!==n.updatedAt)&&(Me||(us.current=n,U(Fs(t.runtimeConfig)),S(Wt(t)),P(qt(t.runtimeConfig)),ue(Kt(t.runtimeConfig)),E(Yt(t.runtimeConfig)),Ae(Xt(t.runtimeConfig)),st(Zt(t.runtimeConfig)),x(Qt(t.runtimeConfig)),qe(Es(t.runtimeConfig)),K(Q=>({...Q,thinkingLevel:typeof t.runtimeConfig?.thinkingLevel=="string"?t.runtimeConfig.thinkingLevel:"off"})),Ze(_e),f(xe),Xe(xe?"runtime":"model")))},[t,Me,_e,xe]);const hs=(n,g)=>{K(C=>({...C,[n]:g})),it(!1),Y[n]&&tt(C=>{const Q={...C};return delete Q[n],Q})},kt=(n,g)=>{U(C=>({...C,[n]:g})),it(!1),Y[n]&&tt(C=>{const Q={...C};return delete Q[n],Q})},ta=n=>{S(n),it(!1)},Ct=(n,g)=>{qe(C=>({...C,[n]:g})),it(!1),Y[n]&&tt(C=>{const Q={...C};return delete Q[n],Q})},Ie=a.useMemo(()=>{const n=Dn(H);for(const[Z,Ge]of Object.entries({heartbeatIntervalMs:{label:"Heartbeat Interval",min:1},heartbeatTimeoutMs:{label:"Heartbeat Timeout",min:5},maxConcurrentRuns:{label:"Max Concurrent Runs",min:1}})){const ge=j[Z]?.trim();if(!ge)continue;const Oe=Number(ge);Number.isNaN(Oe)||!Number.isFinite(Oe)?n[Z]=`"${Ge.label}" must be a valid number`:Oe<Ge.min&&(n[Z]=`"${Ge.label}" must be at least ${Ge.min.toLocaleString()}`)}const g=j.autoClaimCandidatesInPrompt?.trim();if(g){const Z=Number(g);(!Number.isInteger(Z)||Z<0||Z>10)&&(n.autoClaimCandidatesInPrompt='"Auto-claim candidates in prompt" must be an integer between 0 and 10')}const C=j.messageResponseMode?.trim();C&&!["immediate","on-heartbeat"].includes(C)&&(n.messageResponseMode='"Message Response Mode" must be either immediate or on-heartbeat');const Q=V.tokenBudget?.trim();if(Q){const Z=Number(Q);Number.isNaN(Z)||!Number.isFinite(Z)?n.tokenBudget='"Token Budget" must be a valid number':Z<=0&&(n.tokenBudget='"Token Budget" must be greater than 0')}const he=V.usageThreshold?.trim();if(he){const Z=Number(he);Number.isNaN(Z)||!Number.isFinite(Z)?n.usageThreshold='"Usage Threshold" must be a valid number':(Z<1||Z>100)&&(n.usageThreshold='"Usage Threshold" must be between 1 and 100')}const ae=V.budgetPeriod?.trim();ae&&!["daily","weekly","monthly","lifetime"].includes(ae)&&(n.budgetPeriod='"Budget Period" must be one of: daily, weekly, monthly, lifetime');const ye=V.resetDay?.trim(),Ne=ae||"lifetime";if(ye){const Z=Number(ye);Number.isNaN(Z)||!Number.isFinite(Z)?n.resetDay='"Reset Day" must be a valid number':Ne==="weekly"?(Z<0||Z>6||!Number.isInteger(Z))&&(n.resetDay='"Reset Day" must be between 0 (Sunday) and 6 (Saturday) for weekly period'):Ne==="monthly"&&(Z<1||Z>31||!Number.isInteger(Z))&&(n.resetDay='"Reset Day" must be between 1 and 31 for monthly period')}return n},[H,j,V]),fs=a.useCallback(()=>{if(Object.keys(Ie).length>0)return null;const n={...t.metadata};for(const ge of xt){const Oe=H[ge.key]?.trim();Oe?ge.type==="number"?n[ge.key]=Number(Oe):n[ge.key]=Oe:delete n[ge.key]}De.length>0?n.skills=De:delete n.skills;const g={...t.runtimeConfig};Object.assign(g,$a(t,b)),g.autoClaimRelevantTasks=m,g.engineerBacklogAutoClaim=X,ke==="auto"?delete g.assignmentPolicy:g.assignmentPolicy=ke,g.runMissedHeartbeatOnStartup=Te,g.allowParallelExecution=te,g.skipHeartbeatWhenIdle=Ce;for(const ge of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns","autoClaimCandidatesInPrompt"]){const Oe=j[ge]?.trim();if(!Oe)delete g[ge];else{const bs=Number(Oe);g[ge]=ge==="maxConcurrentRuns"||ge==="autoClaimCandidatesInPrompt"?bs:bs*1e3}}const C=j.messageResponseMode?.trim();C?g.messageResponseMode=C:delete g.messageResponseMode,Ee?g.heartbeatScopeDiscipline=Ee:delete g.heartbeatScopeDiscipline,R?g.heartbeatPromptTemplate=R:delete g.heartbeatPromptTemplate;const Q=H.thinkingLevel||"off";if(g.thinkingLevel=Q,ve==="runtime")ze.trim()?g.runtimeHint=ze.trim():delete g.runtimeHint,delete g.modelProvider,delete g.modelId,delete g.model;else if(delete g.runtimeHint,we.trim()){const ge=we.indexOf("/");ge!==-1&&(g.modelProvider=we.slice(0,ge),g.modelId=we.slice(ge+1),g.model=we.trim())}else delete g.modelProvider,delete g.modelId,delete g.model;const he={},ae=V.tokenBudget?.trim(),ye=V.usageThreshold?.trim(),Ne=V.budgetPeriod?.trim(),Z=V.resetDay?.trim();ae&&(he.tokenBudget=Number(ae)),ye&&(he.usageThreshold=Number(ye)/100),Ne&&(he.budgetPeriod=Ne),Z&&(he.resetDay=Number(Z)),Object.keys(he).length>0?g.budgetConfig=he:delete g.budgetConfig;let Ge;return fe&&(Ge={mode:fe,entryFile:de||"AGENTS.md",files:se.length>0?se:["AGENTS.md"]},fe==="external"&&Be.trim()&&(Ge.externalPath=Be.trim())),{name:p.trim()||void 0,roles:[y,...c],title:A.trim()||void 0,icon:F.trim()||void 0,reportsTo:z.trim()||void 0,metadata:n,runtimeConfig:g,bundleConfig:Ge}},[c,t.metadata,t.runtimeConfig,te,ke,m,V,de,Be,se,fe,X,H,b,R,Ee,j,F,we,p,z,y,Te,ve,ze,De,Ce,A,Ie]),pt=a.useCallback(async(n,g)=>{const C=fs();if(!C)return tt(Ie),n&&l(i("agents.fixValidationErrors","Please fix validation errors before saving"),"error"),g==="auto"&&Nt(i("agents.fixValidationToSave","Fix validation errors to save changes")),!1;const Q=JSON.stringify(C);if(Q===ms.current)return!1;const he=++St.current;tt({}),Nt(null),cs(!0);try{return await Gt(t.id,C,r),he!==St.current?!1:(ms.current=Q,g==="manual"&&l(i("agents.settingsSaved","Settings saved"),"success"),Nt(null),it(!0),ft.current&&clearTimeout(ft.current),ft.current=setTimeout(()=>it(!1),3e3),await o(),!0)}catch(ae){if(he===St.current){const ye=_(ae);Nt(ye),l(i("agents.settingsSaveFailed","Failed to save settings: {{error}}",{error:ye}),"error")}return!1}finally{he===St.current&&cs(!1)}},[l,t.id,fs,o,r,Ie]),sa=async()=>{await pt(!0,"manual")},re=a.useCallback(()=>{if(!(!Me||We)){if(Object.keys(Ie).length>0){tt(Ie);return}pt(!1,"auto")}},[Me,We,pt,Ie]);a.useEffect(()=>{if(!Me||We)return;if(Object.keys(Ie).length>0){tt(Ie);return}const n=setTimeout(()=>{pt(!1,"auto")},Sn);return()=>clearTimeout(n)},[Me,We,pt,Ie]);const aa=a.useCallback(async n=>{L(!0);try{await _a(t.id,n,r),await o(),l(i("agents.avatarUploaded","Avatar uploaded"),"success")}catch(g){l(_(g),"error")}finally{L(!1),W.current&&(W.current.value="")}},[l,t.id,o,r]),na=a.useCallback(async()=>{L(!0);try{await Ua(t.id,r),await o(),l(i("agents.avatarRemoved","Avatar removed"),"success")}catch(n){l(_(n),"error")}finally{L(!1)}},[l,t.id,o,r]),ps=We?i("agents.savingChanges","Saving changes…"):$t?i("agents.saveFailed","Save failed: {{error}}",{error:$t}):!Me&&ea?i("agents.allChangesSaved","All changes saved"):null;return e.jsxs("div",{className:"config-tab",children:[e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.configTitle","Agent Configuration")}),e.jsx("p",{className:"config-description",children:i("agents.configDescription","Configure agent settings and behavior.")}),e.jsx("div",{className:"config-actions-row",children:e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ne(!0),children:i("agents.aiInterview","AI Interview")})}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-name",children:i("agents.nameLabel","Name")}),e.jsx("input",{id:"agent-name",type:"text",className:"input",value:p,onChange:n=>d(n.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-role",children:i("agents.roleLabel2","Primary role")}),e.jsxs("select",{id:"agent-role",className:"select",value:y,onChange:n=>{const g=n.target.value;M(g),u(C=>C.filter(Q=>Q!==g)),re()},children:[e.jsx("option",{value:"triage",children:i("agents.roleTriage","Triage")}),e.jsx("option",{value:"executor",children:i("agents.roleExecutor","Executor")}),e.jsx("option",{value:"reviewer",children:i("agents.roleReviewer","Reviewer")}),e.jsx("option",{value:"merger",children:i("agents.roleMerger","Merger")}),e.jsx("option",{value:"scheduler",children:i("agents.roleScheduler","Scheduler")}),e.jsx("option",{value:"engineer",children:i("agents.roleEngineer","Engineer")}),e.jsx("option",{value:"custom",children:i("agents.roleCustom","Custom")})]}),e.jsxs("fieldset",{className:"config-role-tags","aria-label":i("agents.additionalRoles","Additional workflow roles"),children:[e.jsx("legend",{children:i("agents.additionalRoles","Additional workflow roles")}),["triage","executor","reviewer","merger","scheduler","engineer","custom"].filter(n=>n!==y).map(n=>e.jsxs("label",{className:"checkbox-label",children:[e.jsx("input",{type:"checkbox",checked:c.includes(n),onChange:()=>{u(g=>g.includes(n)?g.filter(C=>C!==n):[...g,n]),re()}}),n]},n))]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-title",children:i("agents.titleLabel","Title")}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:i("agents.titlePlaceholder","e.g. Senior Code Reviewer"),value:A,onChange:n=>D(n.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:i("agents.avatarLabel","Avatar")}),e.jsxs("div",{className:"agent-avatar-editor",children:[e.jsx($s,{agent:t,size:64,className:"agent-avatar-editor-preview"}),e.jsxs("div",{className:"agent-avatar-editor-actions",children:[e.jsx("input",{ref:W,id:"agent-avatar-upload",type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",className:"visually-hidden",disabled:T,onChange:n=>{const g=n.target.files?.[0];g&&aa(g)}}),e.jsx("button",{type:"button",className:"btn btn-sm agent-avatar-editor-action",disabled:T,onClick:()=>W.current?.click(),children:i("agents.uploadAvatar","Upload Avatar")}),t.imageUrl?e.jsx("button",{type:"button",className:"btn btn-sm agent-avatar-editor-action",onClick:()=>void na(),disabled:T,children:i("agents.removeAvatar","Remove Avatar")}):null]})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-icon",children:i("agents.iconLabel","Icon")}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:i("agents.iconPlaceholder","e.g. 🤖"),value:F,onChange:n=>O(n.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-reports-to",children:i("agents.reportsToLabel","Reports To")}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:z,onChange:n=>{q(n.target.value),re()},disabled:v,children:[e.jsx("option",{value:"",children:i("agents.noManager","No manager")}),Qe&&e.jsx("option",{value:Re,children:i("agents.unknownManager","Unknown manager ({{id}})",{id:Re})}),Pe.map(n=>e.jsxs("option",{value:n.id,children:[n.name," (",n.id,")"]},n.id))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.skillsTitle","Skills")}),e.jsx("p",{className:"config-description",children:i("agents.skillsDescription","Assign skills to this agent for specialized behavior.")}),e.jsx("div",{className:"config-fields",children:e.jsx("div",{className:"config-field",children:e.jsx(on,{id:"agent-skills",label:"Skills",value:De,onChange:n=>{je(n),re()},projectId:r})})})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.modelTitle","Model")}),e.jsx("p",{className:"config-description",children:i("agents.modelDescription","Choose either a built-in model or a plugin runtime for this agent. These options are mutually exclusive.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:i("agents.runtimeSource","Runtime Source")}),e.jsxs("div",{className:"config-runtime-tabs",role:"tablist","aria-label":i("agents.runtimeSource","Runtime source"),children:[e.jsx("button",{type:"button",className:`config-runtime-tab${ve==="model"?" active":""}`,role:"tab","aria-selected":ve==="model",tabIndex:ve==="model"?0:-1,onClick:()=>{Xe("model"),f(""),re()},children:i("agents.builtInModel","Built-in Model")}),e.jsx("button",{type:"button",className:`config-runtime-tab${ve==="runtime"?" active":""}`,role:"tab","aria-selected":ve==="runtime",tabIndex:ve==="runtime"?0:-1,onClick:()=>{Xe("runtime"),re()},children:i("agents.pluginRuntime","Plugin Runtime")})]})]}),ve==="model"?e.jsx("div",{className:"config-field",children:e.jsx(Va,{models:dt,value:we,onChange:n=>{Ze(n),re()},placeholder:i("agents.useGlobalDefault","Use global default"),label:i("agents.agentModelLabel","Agent Model"),disabled:He,favoriteProviders:at,onToggleFavorite:ct,favoriteModels:ot,onToggleModelFavorite:zt,thinkingLevel:H.thinkingLevel??"",onThinkingLevelChange:n=>{K(g=>({...g,thinkingLevel:n})),re()}})}):e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-runtime-hint",children:i("agents.runtimeLabel","Runtime")}),It?e.jsx("span",{className:"config-hint",children:e.jsx(Wa,{label:i("agents.loadingRuntimes","Loading runtimes…")})}):e.jsxs("select",{id:"agent-runtime-hint",className:"select",value:ze,onChange:n=>{f(n.target.value),re()},children:[e.jsx("option",{value:"",children:mt.length>0?i("agents.selectRuntime","Select a plugin runtime…"):i("agents.noRuntimes","No plugin runtimes available")}),mt.map(n=>e.jsx("option",{value:n.runtimeId,children:n.description?`${n.name} — ${n.description}`:n.name},`${n.pluginId}:${n.runtimeId}`))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.permissionsTitle","Permissions")}),e.jsx("p",{className:"config-description",children:i("agents.permissionsDescription","Per-agent settings override project defaults. Each category controls a separate approval gate.")}),e.jsxs("div",{className:"agent-capability-grants","data-testid":"agent-capability-grants",children:[e.jsx("h4",{children:i("agents.capabilityGrantsTitle","Capability grants")}),e.jsx("p",{className:"config-hint",children:i("agents.capabilityGrantsDescription","Explicit grants add to this agent's role defaults and apply to both permanent and ephemeral agents.")}),e.jsx("div",{className:"agent-capability-grants-grid",children:ks.map(n=>{const g=me.has(n),C=Ue.has(n),Q=`agent-capability-${t.id}-${n.replace(/[^a-z0-9]+/gi,"-")}`;return e.jsxs("label",{className:"agent-capability-grant-row",htmlFor:Q,children:[e.jsxs("span",{children:[e.jsx("span",{className:"agent-capability-grant-name",children:n}),e.jsx("span",{className:"config-hint",children:g?i("agents.roleDefaultGrant","Role default grant"):C?i("agents.explicitGrant","Explicit grant"):i("agents.notGranted","Not granted")})]}),e.jsx("input",{id:Q,type:"checkbox",checked:C,"aria-label":i("agents.toggleCapabilityGrant","Toggle explicit grant for {{permission}}",{permission:n}),onChange:he=>{Ot(n,he.target.checked)}})]},n)})})]}),I===void 0?e.jsxs("div",{className:"agent-permission-inherit-banner",children:[e.jsx("span",{children:i("agents.inheritingProjectDefault","Inheriting project default — no per-agent override set")}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void et({presetId:"custom",rules:{git_write:oe?.rules?.git_write??"allow",file_write_delete:oe?.rules?.file_write_delete??"allow",command_execution:oe?.rules?.command_execution??"allow",network_api:oe?.rules?.network_api??"allow",task_agent_mutation:oe?.rules?.task_agent_mutation??"allow",review_gate_bypass:oe?.rules?.review_gate_bypass??"require-approval",file_scope:oe?.rules?.file_scope??"allow"}}),children:i("agents.customizeForAgent","Customize for this agent")})]}):null,e.jsx(rn,{mode:"agent-override",value:I,projectDefault:oe?.rules,projectDefaultToolRules:oe?.toolRules,onChange:n=>{et(n)}})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.heartbeatSettingsTitle","Heartbeat Settings")}),e.jsx("p",{className:"config-description",children:i("agents.heartbeatSettingsDesc","Configure how this agent's heartbeat is monitored. Leave a field empty to use system defaults.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field agent-heartbeat-auto-claim-card",children:[e.jsxs("div",{className:"agent-heartbeat-preset-row",children:[e.jsxs("div",{children:[e.jsx("label",{className:"agent-heartbeat-preset-label",children:i("agents.coordinationOnlyAgent","Coordination-only agent")}),e.jsx("span",{className:"config-hint",children:i("agents.coordinationOnlyHint","Disables auto-claim and removes the candidate section from heartbeat prompts. Recommended for routing/CEO-style agents.")})]}),e.jsx("button",{type:"button",className:"btn btn-sm agent-heartbeat-preset-btn",onClick:()=>{P(!1),U(n=>({...n,autoClaimCandidatesInPrompt:"0"})),re()},children:i("agents.applyPreset","Apply preset")})]}),e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-autoClaimRelevantTasks",children:[e.jsx("input",{id:"hb-autoClaimRelevantTasks",type:"checkbox",checked:m,onChange:n=>{P(n.target.checked),re()}}),i("agents.autoClaimRelevantTasks","Auto-Claim Relevant Tasks")]}),e.jsx("span",{className:"config-hint",children:i("agents.autoClaimHint","When enabled (default), no-task heartbeats scan open unowned work and auto-claim tasks aligned with this agent's role and soul.")}),e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-engineerBacklogAutoClaim",children:[e.jsx("input",{id:"hb-engineerBacklogAutoClaim",type:"checkbox",checked:X,onChange:n=>{ue(n.target.checked),re()}}),i("agents.engineerBacklogAutoClaim","Engineer Backlog Auto-Claim")]}),e.jsx("span",{className:"config-hint",children:i("agents.engineerBacklogAutoClaimHint","Per-agent override of the project default. Allows this engineer-role agent to auto-claim unowned backlog tasks; explicit assignment and delegation are unchanged.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-assignmentPolicy",children:i("agents.assignmentPolicy","Assignment Policy")}),e.jsxs("select",{id:"hb-assignmentPolicy",value:ke,onChange:n=>{Je(n.target.value),re()},children:[e.jsx("option",{value:"auto",children:i("agents.assignmentPolicyAuto","Auto (default) — eligible for automatic assignment")}),e.jsx("option",{value:"explicit-only",children:i("agents.assignmentPolicyExplicitOnly","Explicit only — never auto-assigned; accepts direct assignment/delegation")}),e.jsx("option",{value:"none",children:i("agents.assignmentPolicyNone","None — can never receive implementation tasks")})]}),e.jsx("span",{className:"config-hint",children:i("agents.assignmentPolicyHint",'Controls whether task routing may bind work to this agent. Use "None" for liaison/observer agents that must never execute product tasks — no override can bypass it.')})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-enabled",children:[e.jsx("input",{id:"hb-enabled",type:"checkbox",checked:b,onChange:n=>{ta(n.target.checked),re()}}),i("agents.heartbeatEnabled","Heartbeat Enabled")]}),e.jsx("span",{className:"config-hint",children:i("agents.heartbeatEnabledHint","When enabled, this agent receives scheduled heartbeat runs based on its interval.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-runMissedHeartbeatOnStartup",children:[e.jsx("input",{id:"hb-runMissedHeartbeatOnStartup",type:"checkbox",checked:Te,onChange:n=>{E(n.target.checked),re()}}),i("agents.runMissedHeartbeat","Run Missed Heartbeat On Startup")]}),e.jsx("span",{className:"config-hint",children:i("agents.runMissedHeartbeatHint","When enabled, if the server was down across this agent's scheduled heartbeat tick, fire a single catch-up heartbeat at startup. Default: off.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-allowParallelExecution",children:[e.jsx("input",{id:"hb-allowParallelExecution",type:"checkbox",checked:te,onChange:n=>{Ae(n.target.checked),re()}}),i("agents.allowParallelExecution","Allow Parallel Execution")]}),e.jsx("span",{className:"config-hint",children:i("agents.allowParallelExecutionHint","When disabled, the heartbeat and task execution paths serialize for this agent (heartbeat will not start while the agent's task is executing, and vice versa). Permanent agents only.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-skipHeartbeatWhenIdle",children:[e.jsx("input",{id:"hb-skipHeartbeatWhenIdle",type:"checkbox",checked:Ce,onChange:n=>{st(n.target.checked),re()}}),i("agents.skipHeartbeatWhenIdle","Skip heartbeat when idle")]}),e.jsx("span",{className:"config-hint",children:i("agents.skipHeartbeatWhenIdleHint","When enabled, scheduled (timer) heartbeats are skipped while this agent has no assigned task. The agent still wakes immediately when a task is assigned or you trigger a run manually. Default: off.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatScopeDiscipline",children:i("agents.heartbeatScopeDiscipline","Heartbeat Scope Discipline")}),e.jsxs("select",{id:"hb-heartbeatScopeDiscipline",className:"select",value:Ee,onChange:n=>{const g=n.target.value;x(g==="strict"||g==="lite"||g==="off"?g:""),re()},children:[e.jsx("option",{value:"",children:i("agents.inheritProjectDefault","Inherit project default")}),e.jsx("option",{value:"strict",children:i("agents.strict","Strict")}),e.jsx("option",{value:"lite",children:i("agents.lite","Lite")}),e.jsx("option",{value:"off",children:i("agents.off","Off")})]}),e.jsx("span",{className:"config-hint",children:i("agents.scopeDisciplineHint","Strict — coordination-focused; higher per-tick tokens. Lite — pre-2026-05-11 behavior. Off — minimal procedure.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatPromptTemplate",children:i("agents.heartbeatPromptTemplate","Heartbeat Prompt Template")}),e.jsxs("select",{id:"hb-heartbeatPromptTemplate",className:"select",value:R,onChange:n=>{const g=n.target.value;le(g==="default"||g==="compact"?g:""),re()},children:[e.jsx("option",{value:"",children:i("agents.inheritProjectDefault","Inherit project default")}),e.jsx("option",{value:"default",children:i("agents.templateDefault","Default")}),e.jsx("option",{value:"compact",children:i("agents.templateCompact","Compact")})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatIntervalMs",children:i("agents.heartbeatIntervalLabel","Heartbeat Interval (s)")}),e.jsx("input",{id:"hb-heartbeatIntervalMs",type:"text",inputMode:"numeric",className:ce("input",!!Y.heartbeatIntervalMs&&"input--error"),placeholder:String(ss/1e3),value:j.heartbeatIntervalMs??"",onChange:n=>kt("heartbeatIntervalMs",n.target.value)}),Y.heartbeatIntervalMs?e.jsx("span",{className:"config-error",children:Y.heartbeatIntervalMs}):e.jsx("span",{className:"config-hint",children:i("agents.heartbeatIntervalHint","How often heartbeats are checked. Leave empty for system default ({{seconds}}s / {{label}}).",{seconds:ss/1e3,label:Nn})})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatTimeoutMs",children:i("agents.heartbeatTimeoutLabel","Heartbeat Timeout (s)")}),e.jsx("input",{id:"hb-heartbeatTimeoutMs",type:"text",inputMode:"numeric",className:ce("input",!!Y.heartbeatTimeoutMs&&"input--error"),placeholder:"60",value:j.heartbeatTimeoutMs??"",onChange:n=>kt("heartbeatTimeoutMs",n.target.value)}),Y.heartbeatTimeoutMs?e.jsx("span",{className:"config-error",children:Y.heartbeatTimeoutMs}):e.jsx("span",{className:"config-hint",children:i("agents.heartbeatTimeoutHint","Time without heartbeat before agent is considered unresponsive. Leave empty for system default (60s)")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-maxConcurrentRuns",children:i("agents.maxConcurrentRunsLabel","Max Concurrent Runs")}),e.jsx("input",{id:"hb-maxConcurrentRuns",type:"text",inputMode:"numeric",className:ce("input",!!Y.maxConcurrentRuns&&"input--error"),placeholder:"1",value:j.maxConcurrentRuns??"",onChange:n=>kt("maxConcurrentRuns",n.target.value)}),Y.maxConcurrentRuns?e.jsx("span",{className:"config-error",children:Y.maxConcurrentRuns}):e.jsx("span",{className:"config-hint",children:i("agents.maxConcurrentRunsHint","Maximum simultaneous heartbeat runs for this agent. Leave empty for system default (1).")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-messageResponseMode",children:i("agents.messageResponseModeLabel","Message Response Mode")}),e.jsxs("select",{id:"hb-messageResponseMode",className:ce("select",!!Y.messageResponseMode&&"input--error"),value:j.messageResponseMode??"",onChange:n=>kt("messageResponseMode",n.target.value),children:[e.jsx("option",{value:"",children:i("agents.systemDefaultOnHeartbeat","System Default (On Heartbeat)")}),e.jsx("option",{value:"on-heartbeat",children:i("agents.onHeartbeat","On Heartbeat")}),e.jsx("option",{value:"immediate",children:i("agents.immediate","Immediate")})]}),Y.messageResponseMode?e.jsx("span",{className:"config-error",children:Y.messageResponseMode}):e.jsx("span",{className:"config-hint",children:i("agents.messageResponseModeHint","How this agent responds to incoming messages. 'Immediate' wakes the agent as soon as a message arrives. 'On Heartbeat' defers processing to the next scheduled heartbeat.")})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.budgetSettingsTitle","Budget Settings")}),e.jsx("p",{className:"config-description",children:i("agents.budgetSettingsDesc","Configure token budget limits for this agent. Leave all fields empty to disable budget tracking.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-tokenBudget",children:i("agents.tokenBudgetLabel","Token Budget")}),e.jsx("input",{id:"budget-tokenBudget",type:"text",inputMode:"numeric",className:ce("input",!!Y.tokenBudget&&"input--error"),placeholder:i("agents.noLimit","No limit"),value:V.tokenBudget??"",onChange:n=>Ct("tokenBudget",n.target.value)}),Y.tokenBudget?e.jsx("span",{className:"config-error",children:Y.tokenBudget}):e.jsx("span",{className:"config-hint",children:i("agents.tokenBudgetHint","Total token cap (input + output) for this agent. Leave empty for no limit.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-usageThreshold",children:i("agents.usageThresholdLabel","Usage Threshold (%)")}),e.jsx("input",{id:"budget-usageThreshold",type:"text",inputMode:"numeric",className:ce("input",!!Y.usageThreshold&&"input--error"),placeholder:"80",value:V.usageThreshold??"",onChange:n=>Ct("usageThreshold",n.target.value)}),Y.usageThreshold?e.jsx("span",{className:"config-error",children:Y.usageThreshold}):e.jsx("span",{className:"config-hint",children:i("agents.usageThresholdHint","Warning threshold as a percentage. Agent warns when usage reaches this level. Default: 80%.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-budgetPeriod",children:i("agents.budgetPeriodLabel","Budget Period")}),e.jsxs("select",{id:"budget-budgetPeriod",className:ce("select",!!Y.budgetPeriod&&"input--error"),value:V.budgetPeriod??"",onChange:n=>Ct("budgetPeriod",n.target.value),children:[e.jsx("option",{value:"",children:i("agents.noReset","No reset (lifetime)")}),e.jsx("option",{value:"daily",children:i("agents.daily","Daily")}),e.jsx("option",{value:"weekly",children:i("agents.weekly","Weekly")}),e.jsx("option",{value:"monthly",children:i("agents.monthly","Monthly")})]}),Y.budgetPeriod?e.jsx("span",{className:"config-error",children:Y.budgetPeriod}):e.jsx("span",{className:"config-hint",children:i("agents.budgetPeriodHint","How often the budget counter resets. Leave empty for lifetime budget.")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"budget-resetDay",children:i("agents.resetDayLabel","Reset Day")}),e.jsx("input",{id:"budget-resetDay",type:"text",inputMode:"numeric",className:ce("input",!!Y.resetDay&&"input--error"),placeholder:i("agents.auto","Auto"),value:V.resetDay??"",onChange:n=>Ct("resetDay",n.target.value)}),Y.resetDay?e.jsx("span",{className:"config-error",children:Y.resetDay}):e.jsx("span",{className:"config-hint",children:V.budgetPeriod==="weekly"?i("agents.resetDayWeekly","Day of week (0=Sunday to 6=Saturday) for reset."):V.budgetPeriod==="monthly"?i("agents.resetDayMonthly","Day of month (1-31) for reset."):i("agents.resetDayHint","Day for reset (weekly: 0-6, monthly: 1-31). Leave empty for automatic.")})]}),Ve?.budgetLimit!=null&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:i("agents.currentUsage","Current Usage")}),e.jsxs("div",{className:"budget-progress-container",children:[e.jsx("div",{className:"budget-progress-bar",children:e.jsx("div",{className:ce("budget-progress-bar__fill",(Ve.usagePercent??0)>=100?"budget-progress-bar__fill--red":(Ve.usagePercent??0)>=80?"budget-progress-bar__fill--amber":"budget-progress-bar__fill--green"),style:{width:`${Math.min(Ve.usagePercent??0,100)}%`}})}),e.jsx("span",{className:"budget-progress-label",children:i("agents.budgetUsageDisplay","{{used}} / {{limit}} tokens ({{percent}}% used)",{used:(Ve.currentUsage??0).toLocaleString(),limit:(Ve.budgetLimit??0).toLocaleString(),percent:Math.round(Ve.usagePercent??0)})})]})]}),Ve?.budgetLimit!=null&&e.jsx("div",{className:"config-field",children:e.jsx("button",{className:"btn btn-reset-budget",onClick:()=>void Qs(),disabled:ls,children:ls?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:14,className:"animate-spin"}),i("agents.resetting","Resetting…")]}):e.jsxs(e.Fragment,{children:[e.jsx(Tt,{size:14}),i("agents.resetBudgetUsage","Reset Budget Usage")]})})})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.bundleTitle","Instruction Bundle")}),e.jsx("p",{className:"config-description",children:i("agents.bundleDescription","Configure the agent's instruction bundle. Leave empty to use inline instructions only.")}),e.jsxs("div",{className:"config-fields",children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-mode",children:i("agents.bundleModeLabel","Bundle Mode")}),e.jsxs("select",{id:"bundle-mode",className:"select",value:fe,onChange:n=>Fe(n.target.value),children:[e.jsx("option",{value:"",children:i("agents.bundleNone","None (use inline instructions)")}),e.jsx("option",{value:"managed",children:i("agents.bundleManaged","Managed (system-managed directory)")}),e.jsx("option",{value:"external",children:i("agents.bundleExternal","External (user-specified path)")})]}),e.jsxs("span",{className:"config-hint",children:[fe==="managed"&&i("agents.bundleManagedHint","Files will be stored in a system-managed directory within .fusion/agents/"),fe==="external"&&i("agents.bundleExternalHint","Specify an external directory path for the instruction files"),!fe&&i("agents.bundleSelectMode","Select a mode to enable instruction bundling")]})]}),fe&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-entry-file",children:i("agents.bundleEntryFileLabel","Entry File")}),e.jsx("input",{id:"bundle-entry-file",type:"text",className:"input",placeholder:"AGENTS.md",value:de,onChange:n=>Le(n.target.value)}),e.jsx("span",{className:"config-hint",children:i("agents.bundleEntryFileHint","Primary instructions file name (default: AGENTS.md)")})]}),fe==="external"&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-external-path",children:i("agents.bundleExternalPathLabel","External Path")}),e.jsx("input",{id:"bundle-external-path",type:"text",className:"input",placeholder:i("agents.bundleExternalPathPlaceholder","e.g. .fusion/agents/my-agent"),value:Be,onChange:n=>Ke(n.target.value)}),e.jsx("span",{className:"config-hint",children:i("agents.bundleExternalPathHint","Absolute or relative path to the external directory")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-files",children:i("agents.bundleFilesLabel","Files (comma-separated)")}),e.jsx("input",{id:"bundle-files",type:"text",className:"input",placeholder:"AGENTS.md, PROMPTS.md",value:se.join(", "),onChange:n=>yt(n.target.value.split(",").map(g=>g.trim()).filter(Boolean))}),e.jsx("span",{className:"config-hint",children:i("agents.bundleFilesHint","List of file names in the bundle directory")})]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:i("agents.advancedSettingsTitle","Advanced Settings")}),e.jsx("p",{className:"config-description",children:i("agents.advancedSettingsDesc","Advanced configuration options for this agent. Leave a field empty to use system defaults.")}),e.jsx("div",{className:"config-fields",children:xt.map(n=>{const g=!!Y[n.key];return e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:`adv-${n.key}`,children:n.label}),n.type==="select"?e.jsxs("select",{id:`adv-${n.key}`,className:ce("select",g&&"input--error"),value:H[n.key]??"",onChange:C=>hs(n.key,C.target.value),children:[e.jsx("option",{value:"",children:i("agents.systemDefault","System Default")}),n.options?.map(C=>e.jsx("option",{value:C.value,children:C.label},C.value))]}):e.jsx("input",{id:`adv-${n.key}`,type:"text",inputMode:n.type==="number"?"numeric":void 0,className:ce("input",g&&"input--error"),placeholder:n.placeholder,value:H[n.key]??"",onChange:C=>hs(n.key,C.target.value)}),g&&e.jsx("span",{className:"config-error",children:Y[n.key]}),!g&&n.hint&&e.jsx("span",{className:"config-hint",children:n.hint})]},n.key)})}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!Me||We,onClick:()=>void sa(),children:We?e.jsxs(e.Fragment,{children:[e.jsx(J,{size:16,className:"animate-spin"}),i("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{size:16}),i("agents.saveSettings","Save Settings")]})}),ps&&e.jsxs("span",{className:ce("config-saved-indicator",$t&&"config-saved-indicator--error"),children:[We?e.jsx(J,{size:14,className:"animate-spin"}):e.jsx(be,{size:14}),ps]})]})]}),e.jsx(On,{agent:t,projectId:r,addToast:l,onSaved:o}),e.jsxs("div",{className:"config-section config-section--danger",children:[e.jsx("h3",{children:i("agents.dangerZone","Danger Zone")}),e.jsx("p",{className:"config-description",children:i("agents.dangerZoneDesc","Permanently delete this agent from the project.")}),e.jsx("div",{className:"config-fields",children:e.jsxs("div",{className:"config-field",children:[e.jsxs("button",{className:"btn btn--danger",disabled:!ds||!h,onClick:()=>void h?.(),children:[e.jsx(vt,{size:16}),i("agents.deleteAgent","Delete Agent")]}),e.jsx("span",{className:"config-danger-note",children:ds?i("agents.deletionPermanent","Deletion is permanent and cannot be undone."):i("agents.deletionNotAvailable","Agent deletion is only available when state is idle or paused (current state: {{state}}).",{state:t.state})})]})})]}),e.jsx(cn,{isOpen:B,onClose:()=>ne(!1),onUseDraft:ht,projectId:r,existingAgents:k,mode:"edit",existingAgentConfig:nt})]})}function $n({agentId:t,projectId:r,onChildClick:l}){const{t:o}=Se("app"),[s,h]=a.useState([]),[N,i]=a.useState(!0);return a.useEffect(()=>{i(!0),La(t,r).then(h).finally(()=>i(!1))},[t,r]),N?e.jsxs("div",{className:"detail-section",children:[e.jsx("div",{className:"detail-section-header",children:e.jsx("h3",{children:o("agents.employeesTitle","Employees")})}),e.jsxs("div",{className:"detail-section-body detail-section-body--loading",children:[e.jsx(J,{size:16,className:"spin"}),e.jsx("span",{className:"text-muted",children:o("agents.loadingEmployees","Loading employees...")})]})]}):e.jsxs("div",{className:"detail-section",children:[e.jsxs("div",{className:"detail-section-header",children:[e.jsx("h3",{children:o("agents.employeesTitle","Employees")}),e.jsxs("span",{className:"text-muted",children:["(",s.length,")"]})]}),e.jsx("div",{className:"detail-section-body",children:s.length===0?e.jsxs("div",{className:"agent-empty agent-empty--padded",children:[e.jsx(Vs,{size:32,opacity:.3}),e.jsx("p",{children:o("agents.noEmployees","No employees")}),e.jsx("p",{className:"text-muted",children:o("agents.noEmployeesDesc","This agent has no employees")})]}):e.jsx("div",{className:"agent-tree__children",children:s.map(p=>{const d=rs[p.state];return e.jsxs("div",{className:"agent-tree__node agent-is-child",onClick:()=>l?.(p.id),role:"button",tabIndex:0,onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.key===" "&&y.preventDefault(),l?.(p.id))},style:{cursor:l?"pointer":"default"},children:[e.jsx("span",{className:"agent-tree__icon",children:p.icon??"🤖"}),e.jsx("span",{className:"agent-tree__name",children:p.name}),e.jsx("span",{className:"agent-tree__badge",style:{background:d?.bg??"var(--state-idle-bg)",color:d?.text??"var(--state-idle-text)",border:`1px solid ${d?.border??"var(--state-idle-border)"}`},children:p.state})]},p.id)})})})]})}export{Xn as AgentDetailView,lt as relativeTime};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as B}from"./index-
|
|
1
|
+
import{c as B}from"./index-D6J9uyUx.js";import{r as h,j as e}from"./vendor-react-SZ_qB27O.js";import{u as F}from"./vendor-i18n-Duky4gdQ.js";/**
|
|
2
2
|
* @license lucide-react v1.7.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|