@runfusion/fusion 0.74.0-beta.2 → 0.74.0-beta.4
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 +5416 -3166
- package/dist/child-process-worker.js +3540 -1656
- package/dist/client/.vite/manifest.json +272 -272
- package/dist/client/assets/AgentDetailView-BGXTnuBR.js +13 -0
- package/dist/client/assets/AgentDetailView-CH11Ydji.css +1 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-BycC7HhP.js → AgentPermissionPolicyEditor-DswM202p.js} +1 -1
- package/dist/client/assets/AgentsView-CEpZDrmC.js +24 -0
- package/dist/client/assets/{ChatView-DAsZY1We.js → ChatView-BXXX0q6G.js} +3 -3
- package/dist/client/assets/CommandCenter-CqjN1-9X.js +97 -0
- package/dist/client/assets/DevServerView-BUO7JRi6.js +1 -0
- package/dist/client/assets/{DirectoryPicker-DsCk3Nsw.js → DirectoryPicker-CiP4h5C7.js} +1 -1
- package/dist/client/assets/{DocumentsView-8EI6KNBY.js → DocumentsView-DwLD0h2S.js} +1 -1
- package/dist/client/assets/EvalsView-C9juKffD.js +1 -0
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-ce6DROKD.js → ExperimentalAgentOnboardingModal-DYvw9TEh.js} +1 -1
- package/dist/client/assets/{GoalsView-BVlTtw-u.js → GoalsView-BD1AkfVN.js} +1 -1
- package/dist/client/assets/{InsightsView-BKQeROkb.js → InsightsView-Q0mu759R.js} +1 -1
- package/dist/client/assets/{MemoryView-DCzTnxsV.js → MemoryView-DCTqPpCG.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-C94HwDz5.js → PiExtensionsManager-CSe_uGfa.js} +1 -1
- package/dist/client/assets/{PluginManager-C3DegklW.js → PluginManager-DPm8YQC0.js} +1 -1
- package/dist/client/assets/{PullRequestView-CrE89UL7.js → PullRequestView-BpJgNDLH.js} +2 -2
- package/dist/client/assets/{ReportModal-BD1ZUDdV.js → ReportModal-iGmTZqiF.js} +1 -1
- package/dist/client/assets/ResearchView-BfgKB-6z.js +2 -0
- package/dist/client/assets/{SecretsView-6qK8Idb7.js → SecretsView-CqvQLK7z.js} +1 -1
- package/dist/client/assets/SessionTerminal-A9di8GAo.js +2 -0
- package/dist/client/assets/SettingsModal-BsCUsAXe.js +21 -0
- package/dist/client/assets/{SettingsModal-BkOSlfyr.js → SettingsModal-D-iyPGZE.js} +1 -1
- package/dist/client/assets/SettingsModal-DmfMotcd.css +1 -0
- package/dist/client/assets/{SettingsTextareaRow-Btyx5kaR.js → SettingsTextareaRow-DwgHxMMY.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-Blhx-dRt.js → SetupWizardModal-CrSnLN44.js} +2 -2
- package/dist/client/assets/{SkillsView-DGE5kYc3.js → SkillsView-C_STy7KI.js} +1 -1
- package/dist/client/assets/{TodoView-YSGI7ATd.js → TodoView-BJJNGNLq.js} +1 -1
- package/dist/client/assets/{WorkflowNodeEditor-CZiEThu2.js → WorkflowNodeEditor-Jp5i_Vxu.js} +3 -3
- package/dist/client/assets/{WorkflowNodeEditor-nCx4nqoL.css → WorkflowNodeEditor-sZ96V3Kd.css} +1 -1
- package/dist/client/assets/{agent-import-generation-DQeNZMAm.js → agent-import-generation-DbVrl8ou.js} +1 -1
- package/dist/client/assets/{app-Dn1u7zJ9.js → app-BYs5Cx-j.js} +2 -2
- package/dist/client/assets/{app-DaikOPcV.js → app-CTV8PCYh.js} +3 -3
- package/dist/client/assets/{app-DJIiVHdA.js → app-CwdZxrJI.js} +2 -2
- package/dist/client/assets/{app-hQw_x2KJ.js → app-DE-MPJxA.js} +2 -2
- package/dist/client/assets/{app-DxTbBEMH.js → app-e8c4wb5t.js} +2 -2
- package/dist/client/assets/{app-DMZ_RusZ.js → app-yKugq_Ld.js} +2 -2
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DhaJNKa4.js → architectureDiagram-3BPJPVTR-Ctz8GX1N.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-pKpg7gJU.js → blockDiagram-GPEHLZMM-WI_YPphw.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-DVPXKJnr.js → c4Diagram-AAUBKEIU-BLwS5Zfh.js} +1 -1
- package/dist/client/assets/channel-CMMrQrQu.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CHt90T5z.js → chunk-2J33WTMH-DeXlX12-.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DsWFYy0a.js → chunk-4BX2VUAB-zvCEraJR.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-D8XiXEo8.js → chunk-55IACEB6-BgZq96DR.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-DlUYBn_Y.js → chunk-727SXJPM-CayoVGXL.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BSdPOr9q.js → chunk-AQP2D5EJ-BmaktpVP.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-B9IAeBld.js → chunk-FMBD7UC4-qYWgZPF8.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-CmxnYQrR.js → chunk-ND2GUHAM-DIovauCc.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-Dxp6Po_j.js → chunk-QZHKN3VN-DXWnr9LE.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CqxyehbN.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CqxyehbN.js +1 -0
- package/dist/client/assets/common-13IRj_PO.js +1 -0
- package/dist/client/assets/common-BBynATth.js +1 -0
- package/dist/client/assets/common-BG-vw0tL.js +1 -0
- package/dist/client/assets/common-DSo46rnH.js +1 -0
- package/dist/client/assets/common-DbOCE-0i.js +1 -0
- package/dist/client/assets/common-DnXF4Jmj.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BNl3bhpS.js → cose-bilkent-S5V4N54A-Dee9mTjK.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DFs7WCcz.js → dagre-BM42HDAG-CU-v2zoi.js} +1 -1
- package/dist/client/assets/{dashboard-view-DnoTcnIo.js → dashboard-view-BM790i02.js} +1 -1
- package/dist/client/assets/{dashboard-view-ZGxLEL9r.js → dashboard-view-CG4rzThC.js} +1 -1
- package/dist/client/assets/{dashboard-view-vc8kgLMs.js → dashboard-view-COary9sK.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-C2PVozvu.js → diagram-2AECGRRQ-DIqdnJ5B.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DFJ5b9H8.js → diagram-5GNKFQAL-ChpdUlpb.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-D335CW-c.js → diagram-KO2AKTUF-BxmzOp-c.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-DSfhroAW.js → diagram-LMA3HP47-DLEx-0rl.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-8iGveM-Z.js → diagram-OG6HWLK6-DEpkJ3cG.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-Xc56MEEi.js → erDiagram-TEJ5UH35-C3Rjr78a.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DjCU9WbD.js → flowDiagram-I6XJVG4X-aPbBbeiH.js} +1 -1
- package/dist/client/assets/{folder-open-BRrB44UX.js → folder-open-BnNbfyzc.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CXQE1bea.js → ganttDiagram-6RSMTGT7-BEzAwvJ4.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII--mrSABLC.js → gitGraphDiagram-PVQCEYII-Y4hB2swQ.js} +1 -1
- package/dist/client/assets/index-8wtfjIkg.js +2675 -0
- package/dist/client/assets/index-Bp3UBLOz.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-CTS_nljP.js → infoDiagram-5YYISTIA-pd3J7fRT.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CpV5x3gk.js → ishikawaDiagram-YF4QCWOH-B968vfOH.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-BK2QCMnt.js → journeyDiagram-JHISSGLW-V4crhYKX.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-B4srpspY.js → kanban-definition-UN3LZRKU-Cl8LxR6k.js} +1 -1
- package/dist/client/assets/{mermaid.core-B8DVAt21.js → mermaid.core-rb_bKdHH.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-CsmmiPpA.js → mindmap-definition-RKZ34NQL-Cnu-LPHz.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BahLDqf4.js → pieDiagram-4H26LBE5-C6hPYepr.js} +1 -1
- package/dist/client/assets/{puzzle-BFPQsuIa.js → puzzle-C8AvcmuM.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Bo3u0wTU.js → quadrantDiagram-W4KKPZXB-CUImgAi-.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DYkYsz7d.js → requirementDiagram-4Y6WPE33-DzDLxIYz.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BCbh0BSY.js → sankeyDiagram-5OEKKPKP-DSr_oIy8.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C2AP9GlE.js → sequenceDiagram-3UESZ5HK-DO2E98Hv.js} +1 -1
- package/dist/client/assets/{shield-alert-tlZOi02c.js → shield-alert-Byjz1VmT.js} +1 -1
- package/dist/client/assets/{standing-instructions-template-C0Rzv9Mr.js → standing-instructions-template-Cf9fZ8bv.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CARkH0ug.js → stateDiagram-AJRCARHV-BYPlDS4u.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-C2He043y.js → stateDiagram-v2-BHNVJYJU-Ce_6vh1Q.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-MvbYneEM.js → timeline-definition-PNZ67QCA-CG1FeaKV.js} +1 -1
- package/dist/client/assets/{upload-DWK0F17Z.js → upload-yPsE_DRN.js} +1 -1
- package/dist/client/assets/{users-1AkDfM14.js → users-C_YmWx9d.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DOjzzLqc.js → vennDiagram-CIIHVFJN-JLUXqFyb.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-Di70vhu2.js → wardley-L42UT6IY-D_UBzrZ2.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-nK6ARhDv.js → wardleyDiagram-YWT4CUSO-BzwMrdpL.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-C7_y76B7.js → xychartDiagram-2RQKCTM6-C5TjbAcZ.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +633 -13
- package/dist/client/version.json +1 -1
- package/dist/extension.js +3999 -2008
- package/package.json +1 -1
- package/skill/fusion/references/engine-tools.md +1 -1
- package/dist/client/assets/AgentDetailView-CoeSgMXS.css +0 -1
- package/dist/client/assets/AgentDetailView-DH4Cn5iG.js +0 -13
- package/dist/client/assets/AgentsView-Dkij8Sm8.js +0 -24
- package/dist/client/assets/CommandCenter-jTzBo-pg.js +0 -97
- package/dist/client/assets/DevServerView-CxlacYJp.js +0 -1
- package/dist/client/assets/EvalsView-kYnaIk11.js +0 -1
- package/dist/client/assets/ResearchView-eMiRw1EM.js +0 -2
- package/dist/client/assets/SessionTerminal-DtFLyUaK.js +0 -2
- package/dist/client/assets/SettingsModal-BTfZlghk.css +0 -1
- package/dist/client/assets/SettingsModal-DSq-_qwo.js +0 -21
- package/dist/client/assets/channel-xFBfK0sX.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BFBVD968.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BFBVD968.js +0 -1
- package/dist/client/assets/common-BDp2y6CF.js +0 -1
- package/dist/client/assets/common-BnEo5fLN.js +0 -1
- package/dist/client/assets/common-Bzr_Y8h4.js +0 -1
- package/dist/client/assets/common-CvwyFzfv.js +0 -1
- package/dist/client/assets/common-CztCXRkz.js +0 -1
- package/dist/client/assets/common-DPe2mbb7.js +0 -1
- package/dist/client/assets/index-C2xsZoNG.js +0 -2671
- package/dist/client/assets/index-Dv-95s50.css +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "0.74.0-beta.
|
|
3
|
+
"version": "0.74.0-beta.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
|
|
6
6
|
"homepage": "https://github.com/Runfusion/Fusion#readme",
|
|
@@ -38,7 +38,7 @@ Archived publication is deliberately absent from every runtime tool schema: ther
|
|
|
38
38
|
| `fn_workflow_delete` | executor, chat, planning | Delete a custom workflow definition (built-ins cannot be deleted); selecting tasks are re-homed to the default workflow's entry column | `workflow_id` (string) |
|
|
39
39
|
<!-- FNXC:SkillSync 2026-06-17-23:05: Engine session-scoped `fn_*` tools registered in `packages/engine` must be mirrored in this reference because `packages/cli/src/__tests__/skill-sync.test.ts` treats the backticked tool names here as the documentation source of truth and fails the CLI + gate suites on drift. -->
|
|
40
40
|
| `fn_ask_question` | chat | Ask the user a structured question that renders as an interactive chat card; after calling it, end the turn and wait for the user's next message | `questions` (array of objects with `question`, optional `header`, optional `description`, optional `type`, optional `options`, optional `multiSelect`) |
|
|
41
|
-
| `fn_task_promote` | executor | Promote a held task out of a manual-release hold column (defaults to the current task) | `task_id?` (string) |
|
|
41
|
+
| `fn_task_promote` | executor | Promote a held task out of a manual-release hold column (defaults to the current task); `force` starts execution even when planning/plan review is still outstanding, waiving only that gate and cancelling the pending replan | `task_id?` (string), `force?` (boolean) |
|
|
42
42
|
| `fn_task_file_scope_add` | executor | Add one or more repo-relative files/globs to this task's declared `## File Scope` when you must edit beyond the initial scope, so edits are not stranded by the scope-aware squash merge (merge-time cross-task overlap blocking remains the backstop) | `files` (string[]) |
|
|
43
43
|
| `fn_trait_list` | executor, chat, planning | List the registered column trait catalog (built-in and plugin traits) | none |
|
|
44
44
|
| `fn_memory_search` | triage, executor, heartbeat | Search project memory plus per-agent layered memory snippets | `query` (string), `limit?` (number) |
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.agent-detail-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100;padding:var(--space-lg)}.agent-detail-modal{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;min-width:calc(var(--space-xl) * 20);max-width:calc(100vw - var(--space-2xl) - var(--space-xs) * 2);min-height:calc(var(--space-xl) * 13 + var(--space-sm));max-height:calc(100dvh - var(--space-2xl) - var(--space-xs) * 2);display:flex;flex-direction:column;overflow:hidden;resize:both;box-shadow:var(--shadow-lg)}.agent-detail-modal:not([style*=width]){width:min(calc(var(--space-xl) * 37 + var(--space-md)),calc(100vw - var(--space-2xl) - var(--space-xs) * 2))}.agent-detail-modal:not([style*=height]){height:min(85vh,calc(100dvh - var(--space-2xl) - var(--space-xs) * 2))}.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)}.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}.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%}.agent-detail-overlay{padding:0;align-items:stretch}.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)}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{r as a,j as e}from"./vendor-react-SZ_qB27O.js";import{c as Ss,bO as Qs,bP as Xs,bQ as ea,bR as ta,L as G,bS as kt,R as At,bM as ds,Z as sa,bu as zt,bT as ks,x as ct,C as Cs,g as ws,bU as aa,bV as na,bW as ia,aa as Rs,bX as ra,aV as la,bY as oa,bp as U,bZ as ca,b_ as Ms,b$ as As,c0 as da,bo as wt,c1 as It,bc as Ct,bt as Fs,al as Ps,c2 as Bt,bJ as Rt,c3 as us,c4 as Xe,c5 as ua,X as Ts,aG as dt,c6 as ma,bs as Es,c7 as Ls,c8 as ga,Y as ha,u as fa,c9 as Ds,aQ as Hs,bv as Zt,ca as pa,cb as ms,cc as ba,cd as xa,ce as Yt,cf as zs,cg as va,d as ja,ch as ya,h as Is,ci as Bs,b2 as Na,am as fe,cj as Os,ck as gs,cl as hs,cm as Sa,cn as ka,co as Ca,cp as wa,cq as Ft,p as Pt,j as Tt,r as Et,az as $s,cr as Ra,cs as Ma,aJ as Aa,ct as Ot,cu as Fa,cv as Pa,bH as Ta,cw as Ea,cx as $t,cy as La,cz as Da,bL as Ha,aI as za,cA as Kt,y as Ia,cB as Ba,cC as Oa,cD as $a,cE as _a,cF as Ua,aA as _s,cG as Va,cH as Wa,cI as Ja,cJ as Ga,cK as qa}from"./index-C2xsZoNG.js";import{B as Ya,A as fs,a as Ka}from"./AgentPermissionPolicyEditor-BycC7HhP.js";import{u as Se}from"./vendor-i18n-GF3RlKbq.js";import{f as _t,S as Za,a as Qa}from"./standing-instructions-template-C0Rzv9Mr.js";import{ExperimentalAgentOnboardingModal as Xa}from"./ExperimentalAgentOnboardingModal-ce6DROKD.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.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 en=[["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"}]],tn=Ss("square-activity",en);/**
|
|
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 sn=[["path",{d:"M16 17h6v-6",key:"t6n2it"}],["path",{d:"m22 17-8.5-8.5-5 5L2 7",key:"x473p"}]],an=Ss("trending-down",sn);function ps(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 nn(t){return`${Math.round(t*100)}%`}function bs(t,r){const l=Date.now(),o=new Date(t).getTime(),s=l-o;if(s<0){const p=Math.abs(s);return p<6e4?r("agents.time.inAMoment","in a moment"):p<36e5?r("agents.time.inMinutes","in {{count}}m",{count:Math.floor(p/6e4)}):p<864e5?r("agents.time.inHours","in {{count}}h",{count:Math.floor(p/36e5)}):r("agents.time.inDays","in {{count}}d",{count:Math.floor(p/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 rn(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 lt(t){return t instanceof Error&&t.message?t.message:String(t)}function ln(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 on(t){switch(t){case"improving":return"trend-improving";case"declining":return"trend-declining";case"stable":return"trend-stable";default:return"trend-insufficient"}}function xs(t,r=5){return e.jsx("span",{className:"rating-stars",children:Array.from({length:r},(l,o)=>e.jsx(ks,{size:14,className:o<t?"star-filled":"star-empty",fill:o<t?"currentColor":"none"},o))})}function cn({agentId:t,projectId:r,addToast:l}){const{t:o}=Se("app"),[s,p]=a.useState([]),[S,n]=a.useState(null),[f,u]=a.useState(null),[j,c]=a.useState([]),[m,w]=a.useState(!0),[T,H]=a.useState(!0),[R,B]=a.useState(!1),[O,se]=a.useState(!1),[N,v]=a.useState(null),[M,K]=a.useState(0),[P,E]=a.useState(""),[Z,$]=a.useState(""),V=a.useCallback(async()=>{try{const[d,D]=await Promise.all([Qs(t,20,r),Xs(t,void 0,r)]);p(d),n(D)}catch(d){l(o("agents.reflections.loadError","Failed to load reflections: {{error}}",{error:lt(d)}),"error")}finally{w(!1)}},[t,r,l]),k=a.useCallback(async()=>{try{const[d,D]=await Promise.all([ea(t,r),ta(t,{limit:50},r)]);u(d),c(D)}catch(d){l(o("agents.ratings.loadError","Failed to load ratings: {{error}}",{error:lt(d)}),"error")}finally{H(!1)}},[t,r,l]);a.useEffect(()=>{V(),k()},[V,k]);const X=async()=>{B(!0);try{if(!await aa(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"),w(!0),await V()}catch(d){const D=lt(d),J=D.toLowerCase();J.includes("agent not found")||J.includes("not found")?l(o("agents.reflections.agentNotFound","This agent is no longer available. It may have been deleted."),"error"):J.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:D}),"error")}finally{B(!1)}},F=async d=>{if(d.preventDefault(),M!==0){se(!0);try{await na(t,{score:M,category:P||void 0,comment:Z||void 0,raterType:"user"},r),K(0),E(""),$(""),l(o("agents.ratings.addSuccess","Rating added"),"success"),await k()}catch(D){l(o("agents.ratings.addError","Failed to add rating: {{error}}",{error:lt(D)}),"error")}finally{se(!1)}}},W=async d=>{try{await ia(t,d,r),l(o("agents.ratings.deleteSuccess","Rating deleted"),"success"),await k()}catch(D){l(o("agents.ratings.deleteError","Failed to delete rating: {{error}}",{error:lt(D)}),"error")}},b=d=>{v(D=>D===d?null:d)};if(m&&T)return e.jsx("div",{className:"reflections-tab",children:e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:o("agents.reflections.loadingEvaluation","Loading evaluation...")})]})});const y=S&&S.totalTasksCompleted===0&&S.totalTasksFailed===0&&S.recentReflectionCount===0;return e.jsxs("div",{className:"reflections-tab",children:[e.jsxs("div",{className:"reflections-header",children:[e.jsxs("h3",{children:[e.jsx(kt,{size:16}),o("agents.reflections.sectionTitle","Performance, Reflections & Ratings")]}),e.jsx("button",{className:"btn btn-secondary",onClick:X,disabled:R,title:o("agents.reflections.reflectNowTitle","Generate a manual reflection"),children:R?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:14,className:"animate-spin"}),o("agents.reflections.reflecting","Reflecting...")]}):e.jsxs(e.Fragment,{children:[e.jsx(At,{size:14}),o("agents.reflections.reflectNow","Reflect Now")]})})]}),S&&!y&&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(ds,{size:16,style:{color:"var(--color-success)"}}),S.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(an,{size:16,style:{color:"var(--color-error)"}}),S.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(sa,{size:16,style:{color:"var(--in-progress)"}}),ps(S.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(kt,{size:16,style:{color:S.successRate>=.8?"var(--color-success)":S.successRate>=.5?"var(--color-warning)":"var(--color-error)"}}),nn(S.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(zt,{size:16,style:{color:"var(--color-info)"}}),S.recentReflectionCount]}),e.jsx("div",{className:"stat-label",children:o("agents.performance.reflections","Reflections")})]})]}),y&&e.jsxs("div",{className:"reflections-no-data",children:[e.jsx(kt,{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")}),T?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:o("agents.ratings.loading","Loading ratings...")})]}):e.jsxs(e.Fragment,{children:[f&&e.jsxs("div",{className:"rating-summary-card",children:[e.jsxs("div",{className:"rating-score-display",children:[e.jsx("span",{className:"rating-average",children:f.averageScore.toFixed(1)}),xs(Math.round(f.averageScore))]}),e.jsxs("div",{className:"rating-stats",children:[e.jsx("span",{className:"rating-count",children:o("agents.ratings.count","{{count}} ratings",{count:f.totalRatings})}),e.jsx("span",{className:`rating-trend-badge ${on(f.trend)}`,children:ln(f.trend,o)})]})]}),f&&Object.keys(f.categoryAverages).length>0&&e.jsxs("div",{className:"category-breakdown",children:[e.jsx("h4",{children:o("agents.ratings.categoryAverages","Category Averages")}),Object.entries(f.categoryAverages).map(([d,D])=>e.jsxs("div",{className:"category-item",children:[e.jsx("span",{className:"category-name",children:d}),e.jsx("span",{className:"category-score",children:D.toFixed(1)})]},d))]}),e.jsxs("form",{className:"add-rating-form",onSubmit:F,children:[e.jsx("h4",{children:o("agents.ratings.addRating","Add Rating")}),e.jsx("div",{className:"star-selector",children:[1,2,3,4,5].map(d=>e.jsx("button",{type:"button",className:"star-btn touch-target",onClick:()=>K(d),title:o("agents.ratings.starCount","{{count}} star",{count:d,defaultValue_one:"{{count}} star",defaultValue_other:"{{count}} stars"}),children:e.jsx(ks,{size:24,fill:d<=M?"currentColor":"none",className:d<=M?"star-filled":"star-empty"})},d))}),e.jsxs("select",{value:P,onChange:d=>E(d.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:Z,onChange:d=>$(d.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:M===0||O,children:O?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")}),j.length===0?e.jsx("p",{className:"no-ratings",children:o("agents.ratings.noRatings","No ratings yet")}):j.map(d=>e.jsxs("div",{className:"rating-history-item",children:[e.jsxs("div",{className:"rating-item-header",children:[xs(d.score),d.category&&e.jsx("span",{className:"rating-category-badge",children:d.category}),e.jsx("span",{className:"rating-time",children:bs(d.createdAt,o)}),e.jsx("button",{type:"button",className:"rating-delete-btn touch-target",onClick:()=>void W(d.id),title:o("agents.ratings.deleteRating","Delete rating"),children:e.jsx(ct,{size:14})})]}),d.comment&&e.jsx("p",{className:"rating-comment",children:d.comment})]},d.id))]})]})]}),e.jsxs("div",{className:"reflections-list",children:[e.jsx("h4",{children:o("agents.reflections.historyTitle","Reflection History")}),m?e.jsxs("div",{className:"reflections-loading-indicator",children:[e.jsx(G,{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(zt,{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(d=>{const D=N===d.id;return e.jsxs("div",{className:`reflection-card ${D?"reflection-card--expanded":""}`,onClick:()=>b(d.id),role:"button",tabIndex:0,onKeyDown:J=>J.key==="Enter"&&b(d.id),children:[e.jsxs("div",{className:"reflection-card-header",children:[e.jsx("span",{className:`reflection-trigger-badge reflection-trigger-${d.trigger}`,children:rn(d.trigger,o)}),e.jsx("span",{className:"reflection-timestamp",children:bs(d.timestamp,o)}),e.jsx("span",{className:"reflection-chevron",children:D?e.jsx(Cs,{size:16}):e.jsx(ws,{size:16})})]}),e.jsx("div",{className:"reflection-summary",children:d.summary}),D&&e.jsxs("div",{className:"reflection-details",children:[d.insights.length>0&&e.jsxs("div",{className:"reflection-insights",children:[e.jsxs("h5",{children:[e.jsx(zt,{size:14})," ",o("agents.reflections.insights","Insights")]}),e.jsx("ul",{children:d.insights.map((J,xe)=>e.jsx("li",{children:J},xe))})]}),d.suggestedImprovements.length>0&&e.jsxs("div",{className:"reflection-suggestions",children:[e.jsxs("h5",{children:[e.jsx(ds,{size:14})," ",o("agents.reflections.suggestedImprovements","Suggested Improvements")]}),e.jsx("ul",{children:d.suggestedImprovements.map((J,xe)=>e.jsx("li",{children:J},xe))})]}),d.metrics&&e.jsxs("div",{className:"reflection-metrics",children:[e.jsx("h5",{children:o("agents.reflections.metrics","Metrics")}),e.jsxs("div",{className:"metrics-grid",children:[d.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:d.metrics.tasksCompleted})]}),d.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:d.metrics.tasksFailed})]}),d.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:ps(d.metrics.avgDurationMs)})]}),d.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:d.metrics.errorCount})]})]})]})]})]},d.id)})})]})]})}function oe(...t){return t.filter(Boolean).join(" ")}const dn={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 et(t,r){const l=Date.now(),o=new Date(t).getTime(),s=l-o,p=r??((n,f,u)=>u?f.replace(/\{\{(\w+)\}\}/g,(j,c)=>String(u[c]??"")):f);if(s<0){const n=Math.abs(s);if(n<6e4)return p("time.inAMoment","in a moment");if(n<36e5){const u=Math.floor(n/6e4);return p("time.inMinutes","in {{n}}m",{n:u})}if(n<864e5){const u=Math.floor(n/36e5);return p("time.inHours","in {{n}}h",{n:u})}const f=Math.floor(n/864e5);return p("time.inDays","in {{n}}d",{n:f})}if(s<6e4)return p("time.justNow","just now");if(s<36e5){const n=Math.floor(s/6e4);return p("time.minutesAgo","{{n}}m ago",{n})}if(s<864e5){const n=Math.floor(s/36e5);return p("time.hoursAgo","{{n}}h ago",{n})}const S=Math.floor(s/864e5);return p("time.daysAgo","{{n}}d ago",{n:S})}const un="⚠️",mn=[{id:"dashboard",label:"Dashboard",icon:tn},{id:"logs",label:"Logs",icon:dt},{id:"mail",label:"Mail",icon:ma},{id:"runs",label:"Runs",icon:Rt},{id:"tasks",label:"Tasks",icon:Es},{id:"employees",label:"Employees",icon:Ls},{id:"soul",label:"Soul",icon:ga},{id:"instructions",label:"Instructions",icon:Ya},{id:"memory",label:"Agent Memory",icon:dt},{id:"reflections",label:"Evaluation",icon:kt},{id:"config",label:"Settings",icon:ha}],Qt={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)"}},Mt={completed:{icon:fe,color:"var(--color-success)"},failed:{icon:Na,color:"var(--color-error)"},active:{icon:G,color:"var(--in-progress)"},terminated:{icon:Xe,color:"var(--text-muted)"}},gn=Bs(Kt),hn=700;function fn(t,r){return t.some(l=>l.path===r)?r:t.find(l=>l.layer==="long-term")?.path??t[0]?.path??""}function On({agentId:t,projectId:r,onClose:l,addToast:o,onChildClick:s,inline:p=!1,showInlineBackButton:S=!1,initialTab:n,initialRunId:f,preferActiveRun:u=!1,onMutationSuccess:j}){const{t:c}=Se("app"),[m,w]=a.useState(null),[T,H]=a.useState(1),{confirm:R}=Rs(),[B,O]=a.useState([]),[se,N]=a.useState(!0),[v,M]=a.useState(n??"dashboard"),[K,P]=a.useState(!1),[E,Z]=a.useState(!1),[$,V]=a.useState(!1),[k,X]=a.useState(!1),[F,W]=a.useState(!1),[b,y]=a.useState(!1),[d,D]=a.useState(0),[J,xe]=a.useState(0),[Me,Le]=a.useState(0),[ce,z]=a.useState(null),[ae,Ae]=a.useState(null),[De,x]=a.useState(!1),[A,ie]=a.useState(null),q=a.useRef(null),Je=a.useRef(null),ue=a.useRef(!1);ra(q,!p,"fusion:agent-detail-modal-size");const He=a.useRef(l),me=a.useRef(o),Be=a.useRef(null),ze=a.useRef(!1),Oe=a.useRef(null),ne=a.useRef(0),ut=a.useRef(t),Fe=a.useRef(r);He.current=l,me.current=o,Be.current=m,a.useEffect(()=>{let h=!1;return la(r).then(L=>{h||H(L.heartbeatMultiplier??1)}).catch(()=>{h||H(1)}),()=>{h=!0}},[r]);const ye=a.useCallback(async()=>{Be.current===null&&N(!0);try{const L=await oa(t,r);w(L)}catch(L){me.current(`Failed to load agent: ${U(L)}`,"error"),He.current()}finally{N(!1)}},[t,r]),mt=a.useCallback(async()=>{const h=ne.current,L=t,I=r,_=()=>ne.current!==h||t!==L||r!==I;try{if(m?.taskId){z(null),Oe.current=null;const Re=await ca(m.taskId,I,{limit:100});if(_())return;O(Re.entries);return}const le=await Ms(L,1,I);if(_())return;const be=le[0]??null;if(z(be),!be){Oe.current=null,O([]);return}if(Oe.current===be.id)return;const Ce=await As(L,be.id,I);if(_())return;O(Ce),Oe.current=be.id}catch(le){if(_())return;console.error("Failed to load agent logs:",le)}},[m?.taskId,t,r]),tt=a.useCallback(async()=>{x(!0),ie(null);try{const h=await da(t,r);Ae(h)}catch(h){ie(U(h)),Ae(null)}finally{x(!1)}},[t,r]),Lt=a.useCallback(h=>{ze.current=h},[]),st=a.useCallback(async(h=!1)=>{await j?.({agentId:t,deleted:h})},[t,j]),$e=a.useCallback(async()=>{await ye(),await st(!1)},[ye,st]);a.useEffect(()=>{ye()},[ye]),a.useEffect(()=>{const h=setInterval(()=>{ye()},3e4);return()=>{clearInterval(h)}},[ye]),a.useEffect(()=>{m&&v==="logs"&&mt()},[m,v,mt]),a.useEffect(()=>{v!=="logs"&&(Oe.current=null)},[v]),a.useEffect(()=>{m&&v==="mail"&&tt()},[m,v,tt]),a.useEffect(()=>{if(!k)return;const h=I=>{Je.current?.contains(I.target)||X(!1)},L=I=>{I.key==="Escape"&&X(!1)};return document.addEventListener("mousedown",h),document.addEventListener("keydown",L),()=>{document.removeEventListener("mousedown",h),document.removeEventListener("keydown",L)}},[k]),a.useEffect(()=>{if(!k)return;let h=!1;return y(!0),wt(void 0,r).then(L=>{if(h)return;const I=L.filter(_=>!It(_));D(I.filter(_=>_.state==="active"||_.state==="running").length),xe(I.filter(_=>_.state==="paused").length)}).catch(()=>{h||(D(0),xe(0))}).finally(()=>{h||y(!1)}),()=>{h=!0}},[k,r]),a.useEffect(()=>{if(v!=="logs"||m?.taskId||!ce||ce.status!=="active")return;const h=ne.current,L=t,I=ce.id,_=r?`?projectId=${encodeURIComponent(r)}`:"",le=Ct(`/api/agents/${encodeURIComponent(L)}/runs/${encodeURIComponent(I)}/logs/stream${_}`,{events:{"agent:log":be=>{if(ne.current===h)try{const Ce=JSON.parse(be.data);O(Re=>[...Re,Ce])}catch{}}},onOpen:()=>{ne.current===h&&P(!0)},onError:()=>{ne.current===h&&P(!1)}});return()=>{le(),ne.current===h&&P(!1)}},[v,m?.taskId,t,r,ce]),a.useEffect(()=>{(ut.current!==t||Fe.current!==r)&&(ut.current=t,Fe.current=r,ne.current++,O([]),P(!1),z(null),Ae(null),ie(null),Oe.current=null,ze.current=!1)},[t,r]),a.useEffect(()=>{const h=r?`?projectId=${encodeURIComponent(r)}`:"",L=ne.current,I=_=>{if(ne.current===L)try{const le=JSON.parse(_.data);if(!le||typeof le!="object"||le.agentId!==t)return;ye()}catch{}};return Ct(`/api/events${h}`,{events:{"agent:updated":_=>{if(ne.current===L)try{const le=JSON.parse(_.data);if(!le||typeof le!="object"||le.id!==t||ze.current)return;ye()}catch{}},"approval:requested":I,"approval:updated":I,"approval:decided":I}})},[t,r,ye]),a.useEffect(()=>{if(v!=="logs"||!m?.taskId){P(!1);return}const h=ne.current,L=m.taskId,I=r?`?projectId=${encodeURIComponent(r)}`:"",_=Ct(`/api/tasks/${encodeURIComponent(L)}/logs/stream${I}`,{events:{"agent:log":le=>{if(ne.current===h)try{const be=JSON.parse(le.data);O(Ce=>[...Ce,be])}catch{}}},onOpen:()=>{ne.current===h&&P(!0)},onError:()=>{ne.current===h&&P(!1)}});return()=>{_(),ne.current===h&&P(!1)}},[m?.taskId,v,r]);const Pe=async h=>{if(E||!Be.current)return;const L=Be.current.state;if(L!==h){Z(!0),w(I=>I&&{...I,state:h});try{await ms(t,h,r),o(c("agents.stateUpdated","Agent state updated to {{newState}}",{newState:h}),"success"),await $e()}catch(I){w(_=>_&&{..._,state:L}),o(c("agents.stateUpdateFailed","Failed to update state: {{error}}",{error:U(I)}),"error")}finally{Z(!1)}}},gt=async h=>{if(!F){X(!1),W(!0);try{const I=(await wt(void 0,r)).filter(he=>!It(he)),_=I.filter(he=>h==="paused"?he.state==="active"||he.state==="running":he.state==="paused"),le=I.length-_.length;if(_.length===0){o(c("agents.bulkNoEligible","No agents eligible to {{action}}",{action:h==="paused"?c("agents.pause","pause"):c("agents.resume","resume")}),"error");return}if(!await R({title:h==="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:h==="paused"?c("agents.pauseAction","Pause"):c("agents.resumeAction","Resume"),count:_.length}),danger:h==="paused"}))return;const Ce=await Promise.allSettled(_.map(he=>ms(he.id,h,r))),Re=Ce.map((he,Ze)=>({result:he,agent:_[Ze]})).filter(he=>he.result.status==="rejected"),Ne=Ce.length-Re.length,nt=Re.length,Ke=h==="paused"?c("agents.pausedPast","Paused"):c("agents.resumedPast","Resumed"),pt=Ne===1?c("agents.agentSingular","agent"):c("agents.agentPlural","agents"),bt=c(Ne===1?"agents.bulkResult_one":"agents.bulkResult_other","{{action}} {{successCount}} {{agentWord}}; skipped {{skippedCount}}",{action:Ke,successCount:Ne,agentWord:pt,skippedCount:le});if(nt>0){const he=Re.slice(0,3).map(({agent:Ze,result:xt})=>`${Ze.name||Ze.id}: ${U(xt.reason)}`).join("; ");o(c("agents.bulkResultWithFailures","{{summary}}; failed {{failureCount}}{{detail}}",{summary:bt,failureCount:nt,detail:he?` (${he})`:""}),"error")}else o(bt,"success");await $e()}catch(L){o(c("agents.bulkActionFailed","Failed to {{action}} agents: {{error}}",{action:h==="paused"?c("agents.pause","pause"):c("agents.resume","resume"),error:U(L)}),"error")}finally{W(!1)}}},at=async()=>{if(!$){V(!0);try{await ba(t,r,{source:"on_demand",triggerDetail:"Triggered from dashboard"}),o(c("agents.heartbeatStarted","Heartbeat run started for {{name}}",{name:m?.name??t}),"success"),Le(h=>h+1)}catch(h){o(c("agents.heartbeatStartFailed","Failed to start heartbeat run: {{error}}",{error:U(h)}),"error")}finally{V(!1)}}},Ge=async()=>{if(!(!m||!await R({title:c("agents.deleteTitle","Delete Agent"),message:c("agents.deleteConfirm",'Delete agent "{{name}}"? This cannot be undone.',{name:m.name}),danger:!0})))try{await xa(t,r),o(c("agents.deleted",'Agent "{{name}}" deleted',{name:m.name}),"success"),await st(!0),l()}catch(L){o(c("agents.deleteFailed","Failed to delete agent: {{error}}",{error:U(L)}),"error")}},ht=()=>m?pa(m,T):{label:"Unknown",icon:e.jsx(Zt,{size:14}),color:"var(--text-muted)",stateDerived:!1},ft=async()=>{if(m){const h=await Ia(m.id);o(h?c("agents.idCopied","Agent ID copied to clipboard"):c("agents.idCopyFailed","Failed to copy agent ID"),h?"success":"error")}};if(se)return p?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(G,{className:"animate-spin",size:24}),e.jsx("span",{children:c("agents.loading","Loading agent...")})]})}):e.jsx("div",{className:"agent-detail-overlay",onMouseDown:h=>{h.target===h.currentTarget&&(ue.current=!0)},onMouseUp:h=>{ue.current&&h.target===h.currentTarget&&l(),ue.current=!1},role:"dialog","aria-modal":"true",children:e.jsx("div",{className:"agent-detail-modal",ref:q,children:e.jsxs("div",{className:"agent-detail-loading",children:[e.jsx(G,{className:"animate-spin",size:24}),e.jsx("span",{children:c("agents.loading","Loading agent...")})]})})});if(!m)return null;const Ye=Qt[m.state],ke=ht(),Ie=p?"agent-detail-inline":"agent-detail-modal",pe=b||d===0,_e=b||J===0;return e.jsx("div",{className:p?"agent-detail-inline-shell":"agent-detail-overlay",onClick:h=>!p&&h.target===h.currentTarget&&l(),role:p?"region":"dialog","aria-label":p?"Agent detail":void 0,"aria-modal":p?void 0:"true",children:e.jsxs("div",{className:Ie,ref:q,children:[e.jsxs("div",{className:"agent-detail-header",children:[e.jsxs("div",{className:"agent-detail-identity",children:[p&&S?e.jsxs("button",{type:"button",className:"btn agent-detail-inline-back",onClick:l,"aria-label":c("agents.backToAgents","Back to agents"),children:[e.jsx(Fs,{size:16}),c("agents.agentsLabel","Agents")]}):null,e.jsx("div",{className:"agent-detail-icon",children:e.jsx(Ps,{agent:m,size:36})}),e.jsxs("div",{className:"agent-detail-info",children:[e.jsx("h2",{children:m.name}),e.jsxs("div",{className:"agent-detail-badges",children:[e.jsx("span",{className:"badge",style:{background:Ye.bg,color:Ye.text,border:`1px solid ${Ye.border}`},children:m.state}),e.jsxs("span",{className:"badge",style:{color:ke.color},title:ke.reason??ke.label,children:[ke.icon,!ke.stateDerived&&ke.label]})]})]})]}),e.jsxs("div",{className:"agent-detail-header-actions",children:[e.jsxs("div",{className:"agent-detail-controls",children:[m.state==="idle"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void Pe("active"),disabled:E,children:[e.jsx(Bt,{size:14}),c("agents.start","Start")]}),e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void at(),"aria-label":c("agents.runNowFor","Run now for {{name}}",{name:m.name}),disabled:$||E,children:[e.jsx(Rt,{size:14}),c("agents.runNow","Run Now")]}),e.jsxs("button",{className:"btn btn--danger btn--compact",onClick:Ge,children:[e.jsx(ct,{size:14}),c("agents.delete","Delete")]})]}),m.state==="active"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void Pe("paused"),disabled:E,"aria-label":c("agents.pause","Pause"),children:[e.jsx(us,{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 Pe("paused"),disabled:E,"aria-label":c("agents.stop","Stop"),children:[e.jsx(Xe,{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 at(),"aria-label":c("agents.runNowFor","Run now for {{name}}",{name:m.name}),disabled:$||E,children:[e.jsx(Rt,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.runNow","Run Now")})]})]}),m.state==="paused"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact agent-detail-mobile-icon-control",onClick:()=>void Pe("active"),disabled:E,"aria-label":c("agents.resume","Resume"),children:[e.jsx(Bt,{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:Ge,children:[e.jsx(ct,{size:14}),c("agents.delete","Delete")]})]}),m.state==="running"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn--compact agent-detail-mobile-icon-control",onClick:()=>void Pe("paused"),disabled:E,"aria-label":c("agents.pause","Pause"),children:[e.jsx(us,{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 Pe("paused"),disabled:E,"aria-label":c("agents.stop","Stop"),children:[e.jsx(Xe,{size:14}),e.jsx("span",{className:"agent-detail-control-label",children:c("agents.stop","Stop")})]})]}),m.state==="error"&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"btn btn-task-create btn--compact",onClick:()=>void Pe("active"),disabled:E,children:[e.jsx(Bt,{size:14}),c("agents.retry","Retry")]}),e.jsxs("button",{className:"btn btn--danger btn--compact agent-detail-mobile-icon-control",onClick:()=>void Pe("paused"),disabled:E,"aria-label":c("agents.stop","Stop"),children:[e.jsx(Xe,{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:Ge,"aria-label":c("agents.delete","Delete"),children:[e.jsx(ct,{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:Je,children:[e.jsx("button",{type:"button",className:"btn-icon",onClick:()=>X(h=>!h),"aria-haspopup":"menu","aria-expanded":k,"aria-label":c("agents.bulkActions","Bulk agent actions"),title:c("agents.bulkActions","Bulk agent actions"),disabled:E||F,children:e.jsx(ua,{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 gt("paused"),disabled:pe||F,children:[c("agents.pauseAll","Pause All Agents"),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:b?c("agents.loadingEligible","Loading eligible agents..."):pe?c("agents.noActiveEligible","No active agents eligible"):c(d===1?"agents.pauseCountHint_one":"agents.pauseCountHint_other",d===1?"Pause {{count}} active/running agent":"Pause {{count}} active/running agents",{count:d})})]}),e.jsxs("button",{type:"button",role:"menuitem",className:"agent-detail-bulk-menu-item",onClick:()=>void gt("active"),disabled:_e||F,children:[c("agents.resumeAll","Resume All Agents"),e.jsx("span",{className:"agent-detail-bulk-menu-item-hint",children:b?c("agents.loadingEligible","Loading eligible agents..."):_e?c("agents.noPausedEligible","No paused agents eligible"):c(J===1?"agents.resumeCountHint_one":"agents.resumeCountHint_other",J===1?"Resume {{count}} paused agent":"Resume {{count}} paused agents",{count:J})})]})]})]}),e.jsx("button",{className:"btn-icon",onClick:()=>void ye(),title:c("common.refresh","Refresh"),"aria-label":c("common.refresh","Refresh"),children:e.jsx(At,{size:16})}),!p&&e.jsx("button",{className:"btn-icon",onClick:l,"aria-label":c("common.close","Close"),title:c("common.close","Close"),children:e.jsx(Ts,{size:20})})]})]})]}),e.jsx("div",{className:"agent-detail-tabs",children:mn.map(h=>{const L={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:oe("agent-detail-tab",v===h.id&&"active"),onClick:()=>M(h.id),children:[e.jsx(h.icon,{size:16}),L[h.id]]},h.id)})}),e.jsxs("div",{className:"agent-detail-content",children:[v==="dashboard"&&e.jsx(pn,{agent:m,health:ke,onChildClick:s,projectId:r}),v==="logs"&&e.jsx(bn,{logs:B,isStreaming:K,hasTask:!!m.taskId||B.length>0||ce!==null,fallbackLabel:!m.taskId&&ce?c("agents.latestRunLabel","Latest run · {{id}}",{id:ce.id.slice(0,8)}):null}),v==="mail"&&e.jsx(vn,{agent:m,mailbox:ae,isLoading:De,error:A,projectId:r,addToast:o,onRefresh:()=>void tt()}),v==="runs"&&e.jsx(jn,{addToast:o,agentId:m.id,projectId:r,agentState:m.state,agentName:m.name,initialRunId:f,preferActiveRun:u,runNowRefreshToken:Me,isEphemeral:It(m)}),v==="tasks"&&e.jsx(Sn,{agentId:m.id,projectId:r,addToast:o}),v==="employees"&&e.jsx(Fn,{agentId:m.id,projectId:r,onChildClick:s}),v==="soul"&&e.jsx(Cn,{agent:m,projectId:r,addToast:o,onSaved:$e}),v==="instructions"&&e.jsx(Rn,{agent:m,projectId:r,addToast:o,onSaved:$e}),v==="memory"&&e.jsx(wn,{agent:m,projectId:r,addToast:o,onSaved:$e}),v==="reflections"&&e.jsx(cn,{agentId:m.id,projectId:r,addToast:o}),v==="config"&&e.jsx(An,{agent:m,projectId:r,addToast:o,onSaved:$e,onHasChangesChange:Lt,onDelete:Ge,onAgentDraftApplied:h=>{w(L=>L&&{...L,...h})}},m.id)]}),!p&&e.jsxs("div",{className:"agent-detail-footer",children:[e.jsx("button",{className:"btn-icon",onClick:ft,title:c("agents.copyId","Copy Agent ID"),children:e.jsx(fa,{})}),e.jsx("span",{className:"agent-detail-id",onClick:ft,children:m.id}),m.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/${m.taskId}`,className:"link",children:[e.jsx(Ds,{taskId:m.taskId,taskColumn:m.taskColumn}),e.jsx(Hs,{size:12})]})]})]})]})})}function pn({agent:t,health:r,onChildClick:l,projectId:o}){const{t:s}=Se("app"),p=Qt[t.state],[S,n]=a.useState([]),[f,u]=a.useState(!0),[j,c]=a.useState(null),[m,w]=a.useState([]),[T,H]=a.useState(null),[R,B]=a.useState(null),[O,se]=a.useState(!1),[N,v]=a.useState(null),M=typeof t.runtimeConfig?.runtimeHint=="string"?t.runtimeConfig.runtimeHint:"",K=(()=>{const b=t.runtimeConfig??{};if(M){const y=m.find(d=>d.runtimeId===M);return y?y.name:M}if(b.modelProvider&&b.modelId)return`${b.modelProvider}/${b.modelId}`;if(typeof b.model=="string"&&b.model.includes("/")){const y=b.model.indexOf("/");return b.model.slice(y+1)}return null})();a.useEffect(()=>{Yt(t.id,o).then(c).catch(()=>c(null))},[t.id,o]),a.useEffect(()=>{zs(o).then(w).catch(()=>w([]))},[o]),a.useEffect(()=>{let b=!1;return u(!0),va(t.id,o).then(y=>{if(b)return;const d=y.length>0&&y[0]?.id===t.id?[...y].reverse():y;n(d)}).catch(()=>{b||n([])}).finally(()=>{b||u(!1)}),()=>{b=!0}},[t.id,o]);const P=a.useMemo(()=>{const b=t.completedRuns||[],y=new Date;y.setHours(0,0,0,0);const d=b.filter(J=>new Date(J.startedAt)>=y),D=b.filter(J=>J.status==="completed");return{totalRuns:b.length,todayRuns:d.length,successfulRuns:D.length,successRate:b.length>0?Math.round(D.length/b.length*100):0}},[t]),E=(t.completedRuns||[]).slice(0,5),Z=Array.isArray(t.metadata?.skills)?t.metadata.skills:[],$=T?_t(T):null,V=a.useCallback(async b=>{se(!0),v(null),B(null);try{const y=await ja(b,o);B(y)}catch(y){v(U(y))}finally{se(!1)}},[o]),k=a.useCallback(b=>{if(T===b){H(null),B(null),v(null),se(!1);return}H(b),V(b)},[V,T]),X=t.state==="active"||t.state==="running",F=ya(t.runtimeConfig?.heartbeatIntervalMs),W=X&&t.lastHeartbeatAt?new Date(new Date(t.lastHeartbeatAt).getTime()+F).toISOString():null;return e.jsxs("div",{className:"dashboard-tab dashboard-summary-layout",children:[j?.isOverBudget&&e.jsxs("div",{className:"budget-warning-banner",role:"alert",children:[e.jsx("span",{children:un}),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(Zt,{}),e.jsx("h3",{children:s("agents.overview","Overview")}),e.jsx("strong",{children:t.name}),e.jsx("span",{className:"inline-badge",style:{background:p.bg,color:p.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","Role: {{role}}",{role:t.role})}),e.jsxs("span",{children:[e.jsx("span",{className:"dashboard-summary-label",children:M?s("agents.runtime","Runtime"):s("agents.model","Model")}),e.jsxs("span",{children:[" ",K??s("agents.auto","Auto")]})]}),Z.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:Z.map(b=>{const y=T===b;return e.jsx("button",{type:"button",className:oe("badge","badge-skill","dashboard-summary-skill-badge","dashboard-summary-skill-badge-btn",y&&"dashboard-summary-skill-badge--selected"),title:b,onClick:()=>k(b),"aria-expanded":y,"aria-label":s("agents.viewSkillDetails","View details for {{skill}}",{skill:_t(b)}),children:_t(b)},b)})})]}):e.jsx("span",{children:s("agents.skillsNone","Skills: —")})]}),T?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:$}),e.jsxs("button",{type:"button",className:"btn btn-sm",onClick:()=>k(T),children:[e.jsx(Ts,{size:14}),s("common.close","Close")]})]}),O?e.jsxs("div",{className:"dashboard-summary-skill-detail-loading",role:"status","aria-live":"polite",children:[e.jsx(G,{size:14,className:"animate-spin"}),s("agents.loadingSkillContent","Loading skill content...")]}):N?e.jsxs("div",{className:"dashboard-summary-skill-detail-error",role:"alert",children:[e.jsx(Is,{size:14}),e.jsx("span",{children:N}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void V(T),children:s("common.retry","Retry")})]}):R?e.jsx("pre",{className:"dashboard-summary-skill-detail-content",children:R.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?et(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:W?et(W,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:Bs(F)})]}),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:oe("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(Ds,{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(Hs,{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:P.successfulRuns,total:P.totalRuns,rate:P.successRate})}),E.length===0?e.jsx("p",{className:"text-muted",children:s("agents.noRunsYet","No runs yet")}):e.jsx("div",{className:"runs-list",children:E.map(b=>{const y=Mt[b.status]||Mt.terminated,d=y.icon;return e.jsxs("div",{className:"run-item",children:[e.jsx(d,{size:14,style:{color:y.color}}),e.jsx("span",{children:et(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:P.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:P.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:[P.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")}),f?e.jsxs("div",{className:"chain-of-command-loading",role:"status","aria-live":"polite",children:[e.jsx(G,{size:14,className:"animate-spin"}),e.jsx("span",{children:s("agents.loadingReportingChain","Loading reporting chain...")})]}):S.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:S.map((b,y)=>{const d=y===S.length-1,D=!d;return e.jsxs("div",{className:"chain-of-command-item",children:[e.jsx("button",{type:"button",className:`chain-of-command-node${d?" chain-of-command-node--current":""}`,onClick:()=>D&&l?.(b.id),disabled:!D||!l,title:d?s("agents.currentAgent","Current agent"):s("agents.viewAgent","View {{name}}",{name:b.name}),children:b.name}),!d&&e.jsx("span",{className:"chain-of-command-separator","aria-hidden":"true",children:"→"})]},b.id)})})]})]})}function bn({logs:t,isStreaming:r,hasTask:l,fallbackLabel:o}){const{t:s}=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:s("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"}),s("agents.live","Live")]})]}),t.length===0?e.jsxs("div",{className:"logs-empty",children:[e.jsx(dt,{size:48,opacity:.3}),e.jsx("p",{children:s("agents.noLogEntriesYet","No log entries yet")}),e.jsx("p",{className:"text-muted",children:r?s("agents.waitingForActivity","Waiting for activity..."):s("agents.logsWillAppearActive","Logs will appear here when the agent is active")})]}):e.jsx(Os,{entries:t,loading:!1})]}):e.jsx("div",{className:"logs-tab",children:e.jsxs("div",{className:"logs-empty",children:[e.jsx(dt,{size:48,opacity:.3}),e.jsx("p",{children:s("agents.noActivityYet","No activity yet")}),e.jsx("p",{className:"text-muted",children:s("agents.logsWillAppear","Agent logs will appear here from the current task or most recent run")})]})})}function xn(t,r){const l=new Date(t),s=new Date().getTime()-l.getTime(),p=Math.floor(s/6e4),S=Math.floor(s/36e5),n=Math.floor(s/864e5),f=r??((u,j,c)=>c?j.replace(/\{\{(\w+)\}\}/g,(m,w)=>String(c[w]??"")):j);return p<1?f("time.justNow","just now"):p<60?f("time.minutesAgo","{{n}}m ago",{n:p}):S<24?f("time.hoursAgo","{{n}}h ago",{n:S}):n<7?f("time.daysAgo","{{n}}d ago",{n}):l.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function St(t,r,l,o){const s=o??((p,S,n)=>n?S.replace(/\{\{(\w+)\}\}/g,(f,u)=>String(n[u]??"")):S);if(r==="user")return t==="dashboard"?s("mailbox.you","You"):s("mailbox.userLabel","User: {{id}}",{id:t});if(r==="agent"){const p=l?.get(t)?.trim();return!p||p===t?s("mailbox.agentById","Agent: {{id}}",{id:t}):s("mailbox.agentByName","Agent: {{name}}",{name:p})}return s("mailbox.system","System")}function vn({agent:t,mailbox:r,isLoading:l,error:o,projectId:s,addToast:p,onRefresh:S}){const{t:n}=Se("app"),[f,u]=a.useState("inbox"),[j,c]=a.useState([]);a.useEffect(()=>{let N=!1;return wt(void 0,s).then(v=>{N||c(v)}).catch(()=>{N||c([])}),()=>{N=!0}},[s]);const m=a.useMemo(()=>{const N=new Map;for(const M of j){if(!M.id)continue;const K=typeof M.name=="string"?M.name.trim():"";K.length>0&&N.set(M.id,K)}const v=typeof t.name=="string"?t.name.trim():"";return v.length>0&&N.set(t.id,v),N},[j,t.id,t.name]),[w,T]=a.useState(null),H=f==="inbox"?r?.inbox??[]:r?.outbox??[],R=w?H.find(N=>N.id===w)??null:null;a.useEffect(()=>{T(null)},[f,t.id]);const B=async N=>{if(T(N.id),!(f!=="inbox"||N.read))try{await Ga(N.id,s),S()}catch(v){const M=`Failed to mark message as read: ${U(v)}`;p?p(M,"error"):console.warn(M)}},O=()=>{T(null),S()},se=N=>e.jsxs("button",{type:"button",className:oe("mailbox-item","agent-mail-tab-message",f==="inbox"&&!N.read&&"unread",w===N.id&&"agent-mail-tab-message--selected"),onClick:()=>void B(N),"aria-pressed":w===N.id,children:[e.jsx("div",{className:"mailbox-item-avatar",children:(f==="inbox"?N.fromType:N.toType)==="agent"?e.jsx(Zt,{size:16}):e.jsx(Ba,{size:16})}),e.jsxs("div",{className:"mailbox-item-content",children:[e.jsxs("div",{className:"mailbox-item-header",children:[f==="inbox"?e.jsx("span",{className:"mailbox-item-from",children:St(N.fromId,N.fromType,m,n)}):e.jsx("span",{className:"mailbox-item-to",children:n("agents.mailTo","To: {{recipient}}",{recipient:St(N.toId,N.toType,m,n)})}),e.jsx("span",{className:"mailbox-item-time",children:xn(N.createdAt,n)})]}),e.jsxs("div",{className:"mailbox-item-preview",children:[N.content.slice(0,80),N.content.length>80?"…":""]})]}),f==="inbox"&&!N.read?e.jsx("div",{className:"mailbox-item-unread-dot","aria-label":n("agents.unreadMessage","Unread message")}):null]},N.id);return e.jsxs("div",{className:"agent-mail-tab",children:[e.jsxs("div",{className:"agent-mail-tab-header",children:[e.jsx("h3",{children:n("agents.agentMail","{{name}} Mail",{name:t.name})}),e.jsxs("button",{className:"btn btn-sm",onClick:O,disabled:l,children:[e.jsx(At,{size:14}),n("common.refresh","Refresh")]})]}),e.jsxs("div",{className:"mailbox-agent-subtabs","data-testid":"agent-detail-mail-subtabs",children:[e.jsxs("button",{className:oe("btn","btn-sm","btn-secondary","mailbox-agent-subtab",f==="inbox"&&"active"),onClick:()=>u("inbox"),children:[e.jsx(gs,{size:12}),e.jsx("span",{children:n("agents.inbox","Inbox")}),(r?.unreadCount??0)>0?e.jsx("span",{className:"mailbox-tab-badge",children:r?.unreadCount}):null]}),e.jsxs("button",{className:oe("btn","btn-sm","btn-secondary","mailbox-agent-subtab",f==="outbox"&&"active"),onClick:()=>u("outbox"),children:[e.jsx(hs,{size:12}),e.jsx("span",{children:n("agents.outbox","Outbox")})]})]}),l&&!r?e.jsxs("div",{className:"agent-detail-loading agent-detail-loading--inline",role:"status","aria-live":"polite",children:[e.jsx(G,{className:"animate-spin",size:16}),e.jsx("span",{children:n("agents.loadingMailbox","Loading mailbox...")})]}):null,!l&&o?e.jsxs("div",{className:"agent-mail-tab-error",role:"alert",children:[e.jsx(Is,{size:16}),e.jsx("span",{children:n("agents.mailboxLoadFailed","Failed to load mailbox: {{error}}",{error:o})})]}):null,!l&&!o?R?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:()=>T(null),children:[e.jsx(Fs,{size:14}),f==="inbox"?n("agents.backToInbox","Back to Inbox"):n("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:n("agents.mailFrom","From")}),e.jsx("span",{children:St(R.fromId,R.fromType,m,n)})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:n("agents.mailToLabel","To")}),e.jsx("span",{children:St(R.toId,R.toType,m,n)})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:n("agents.mailType","Type")}),e.jsx("span",{children:R.type})]}),e.jsxs("div",{className:"agent-mail-tab-detail-row",children:[e.jsx("span",{className:"agent-mail-tab-detail-label",children:n("agents.mailSent","Sent")}),e.jsx("span",{children:new Date(R.createdAt).toLocaleString()})]}),R.metadata?.replyTo?.messageId?e.jsx("div",{className:"agent-mail-tab-reply-context",children:n("agents.replyingTo","↪ Replying to message {{id}}",{id:R.metadata.replyTo.messageId})}):null]}),e.jsx("div",{className:"agent-mail-tab-detail-body",children:R.content})]}):e.jsx("div",{className:"mailbox-list","data-testid":"agent-detail-mail-list",children:H.length===0?e.jsxs("div",{className:"mailbox-empty","data-testid":"agent-detail-mail-empty",children:[f==="inbox"?e.jsx(gs,{size:32}):e.jsx(hs,{size:32}),e.jsx("p",{children:f==="inbox"?n("agents.noInboxMessages","No received messages for this agent"):n("agents.noOutboxMessages","No sent messages for this agent")})]}):H.map(se)}):null]})}function jn({addToast:t,agentId:r,projectId:l,agentState:o,agentName:s,initialRunId:p,preferActiveRun:S,runNowRefreshToken:n,isEphemeral:f}){const{t:u}=Se("app"),[j,c]=a.useState([]),{confirm:m}=Rs(),[w,T]=a.useState(!0),[H,R]=a.useState(null),[B,O]=a.useState([]),[se,N]=a.useState(!1),[v,M]=a.useState(null),[K,P]=a.useState(!1),[E,Z]=a.useState(null),[$,V]=a.useState([]),k=a.useRef(!1),X=a.useRef(!1),F=a.useCallback(async()=>{try{const x=await Ms(r,50,l);c(x)}catch(x){t(`Failed to load runs: ${U(x)}`,"error")}finally{T(!1)}},[r,l,t]);a.useEffect(()=>{F()},[F]),a.useEffect(()=>{if(f){Z(null),V([]);return}const x=l?`?projectId=${encodeURIComponent(l)}`:"";fetch(`/api/agents/${encodeURIComponent(r)}/token-usage${x}`).then(async A=>{if(!A.ok){if(A.status===400){Z(null);return}throw new Error(`Request failed: ${A.status}`)}const ie=await A.json();Z(ie)}).catch(A=>{t(`Failed to load cache hit ratio: ${U(A)}`,"error")}),Sa(r,7,l).then(A=>V(A)).catch(A=>{const ie=U(A).toLowerCase();if(ie.includes("ephemeral")||ie.includes("400")){V([]);return}t(`Failed to load prompt sizes: ${U(A)}`,"error")})},[r,l,t,f]),a.useEffect(()=>{if(!X.current){X.current=!0;return}T(!0),F()},[F,n]);const W=j.some(x=>x.status==="active"),b=H?j.find(x=>x.id===H)?.status:void 0;a.useEffect(()=>{if(!W)return;const x=setInterval(()=>{F()},5e3);return()=>clearInterval(x)},[W,F]),a.useEffect(()=>{if(!H||b!=="active")return;const x=l?`?projectId=${encodeURIComponent(l)}`:"";return Ct(`/api/agents/${encodeURIComponent(r)}/runs/${encodeURIComponent(H)}/logs/stream${x}`,{events:{"agent:log":A=>{try{const ie=JSON.parse(A.data);O(q=>[...q,ie])}catch{}}}})},[H,b,r,l]);const y=a.useCallback(async x=>{if(H===x){R(null),O([]),M(null);return}R(x),N(!0),P(!0),O([]),M(null);try{const[A,ie]=await Promise.all([As(r,x,l),ka(r,x,l)]);O(A),M(ie)}catch(A){t(u("agents.runDetailsFailed","Failed to load run details: {{error}}",{error:U(A)}),"error"),O([]),M(null)}finally{N(!1),P(!1)}},[H,r,l,t]);a.useEffect(()=>{k.current=!1},[r,p,S]),a.useEffect(()=>{if(j.length===0||w||k.current)return;const x=p?j.find(A=>A.id===p):S?j.find(A=>A.status==="active"):null;k.current=!0,x&&y(x.id)},[p,S,j,w,y]);const d=async()=>{if(await m({title:u("agents.stopRunTitle","Stop Active Run"),message:u("agents.stopRunConfirm","Stop the active run? The agent's work will be interrupted."),danger:!0}))try{await Oa(r,l),t(u("agents.runStopped","Run stopped"),"success"),T(!0),F()}catch(A){t(u("agents.stopRunFailed","Failed to stop run: {{error}}",{error:U(A)}),"error")}};if(w&&j.length===0)return e.jsx("div",{className:"runs-tab",children:e.jsxs("div",{className:"runs-loading-row",children:[e.jsx(G,{size:16,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:u("agents.loadingRuns","Loading runs...")})]})});if(j.length===0)return e.jsx("div",{className:"runs-tab",children:e.jsxs("div",{className:"runs-empty",children:[e.jsx(Rt,{size:48,opacity:.3}),e.jsx("p",{children:u("agents.noRunsYet","No runs yet")}),e.jsx("p",{className:"text-muted",children:u("agents.heartbeatRunsWillAppear","Heartbeat runs will appear here")})]})});const D=[...j].sort((x,A)=>new Date(A.startedAt).getTime()-new Date(x.startedAt).getTime()),J=D.filter(x=>x.status==="active"),xe=D.filter(x=>x.status!=="active"),Me=x=>x?e.jsxs("div",{className:"run-usage",children:[e.jsx("span",{children:u("agents.inputTokens","Input: {{value}}",{value:x.inputTokens.toLocaleString()})}),e.jsx("span",{children:u("agents.outputTokens","Output: {{value}}",{value:x.outputTokens.toLocaleString()})}),x.cachedTokens>0&&e.jsx("span",{children:u("agents.cacheReadTokens","Cache read: {{value}}",{value:x.cachedTokens.toLocaleString()})}),(x.cacheWriteTokens??0)>0&&e.jsx("span",{children:u("agents.cacheWriteTokens","Cache write: {{value}}",{value:(x.cacheWriteTokens??0).toLocaleString()})})]}):null,Le=(x,A,ie)=>{const q=Mt[x.status]||Mt.completed,Je=q.icon,ue=x.endedAt?yn(new Date(x.startedAt),new Date(x.endedAt)):u("agents.inProgress","In progress"),He=H===x.id;return e.jsxs("div",{children:[e.jsxs("div",{className:oe("run-card",ie&&"run-card--active",He&&"run-card--selected","run-card--clickable"),onClick:()=>void y(x.id),role:"button",tabIndex:0,"aria-expanded":He,"aria-label":u("agents.runAriaLabel","{{active}}run {{id}}, {{status}}",{active:ie?u("agents.activePrefix","Active "):"",id:x.id.slice(0,8),status:x.status}),onKeyDown:me=>{(me.key==="Enter"||me.key===" ")&&(me.preventDefault(),y(x.id))},children:[e.jsxs("div",{className:"run-header",children:[e.jsxs("div",{className:"run-header-group",children:[He?e.jsx(Cs,{size:14}):e.jsx(ws,{size:14}),ie?e.jsxs("span",{className:"run-live-indicator",children:[e.jsx("span",{className:"live-dot"}),u("agents.liveRun","Live Run")]}):e.jsxs("span",{className:"run-id",children:["#",A+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}),ie&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:me=>{me.preventDefault(),me.stopPropagation(),d()},"aria-label":u("agents.stopActiveRun","Stop active run"),children:[e.jsx(Xe,{size:12})," ",u("agents.stop","Stop")]}),e.jsxs("span",{className:oe("run-status",x.status),children:[e.jsx(Je,{size:14,style:{color:q.color}}),x.status]}),x.heartbeatProcedureSource==="custom"&&e.jsx("span",{className:"badge run-badge--compact",children:u("agents.heartbeatCustom","Heartbeat: custom")})]})]}),e.jsxs("div",{className:"run-details",children:[e.jsx("span",{children:u("agents.runStarted","Started {{time}}",{time:et(x.startedAt,u)})}),e.jsx("span",{children:"•"}),e.jsx("span",{children:ue}),x.triggerDetail&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsx("span",{className:"text-muted",children:x.triggerDetail})]})]})]}),He&&e.jsxs("div",{className:"run-logs-container",children:[K?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(G,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:u("agents.loadingDetails","Loading details...")})]}):v&&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:u("agents.systemPrompt","System Prompt")}),v.systemPrompt?e.jsx("pre",{className:"run-output-panel",children:v.systemPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:u("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:u("agents.executionPrompt","Execution Prompt")}),v.executionPrompt?e.jsx("pre",{className:"run-output-panel",children:v.executionPrompt}):e.jsx("div",{className:"text-muted run-output-empty",children:u("agents.executionPromptNotCaptured","Execution prompt not captured for this run")})]})}),v.usageJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.tokenUsage","Token Usage")}),Me(v.usageJson)]}),v.stdoutExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.output","Output")}),e.jsx("pre",{className:"run-output-panel",children:v.stdoutExcerpt.length>2e3?`${v.stdoutExcerpt.slice(0,2e3)}
|
|
12
|
-
|
|
13
|
-
... (truncated, ${v.stdoutExcerpt.length} chars total)`:v.stdoutExcerpt})]}),v.stderrExcerpt&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label run-output-label--error",children:u("agents.errors","Errors")}),e.jsx($a,{errorText:v.stderrExcerpt,summaryPrefix:"Run error",issueContext:{surface:"AgentDetailView runs",agentId:r,agentName:s,agentState:o,runId:v.id,taskId:void 0,timestamp:v.startedAt}})]}),v.resultJson&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.result","Result")}),e.jsx("pre",{className:"run-output-panel",children:JSON.stringify(v.resultJson,null,2)})]}),v.contextSnapshot&&Object.keys(v.contextSnapshot).length>0&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.context","Context")}),e.jsx("div",{className:"run-context-grid",children:Object.entries(v.contextSnapshot).map(([me,Be])=>e.jsxs("span",{className:"run-context-item",children:[e.jsxs("span",{className:"text-muted",children:[me,":"]})," ",e.jsx("span",{children:String(Be)})]},me))})]}),!v.stdoutExcerpt&&!v.stderrExcerpt&&!v.resultJson&&e.jsx("div",{className:"text-muted run-output-empty",children:u("agents.noOutputCaptured","No output captured")})]}),e.jsxs("div",{className:"run-agent-logs-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.agentLogs","Agent Logs")}),se?e.jsxs("div",{className:"run-details-loading-state",children:[e.jsx(G,{size:14,className:"animate-spin"}),e.jsx("span",{className:"text-muted",children:u("agents.loadingLogs","Loading logs...")})]}):B.length===0?e.jsx("div",{className:"text-muted run-output-empty",children:u("agents.noLogsForRun","No logs available for this run")}):e.jsx(Os,{entries:B,loading:!1})]})]})]},x.id)},ce=(x,A)=>e.jsxs("div",{className:"run-context-item",children:[e.jsxs("span",{className:"text-muted",children:[x,":"]})," ",e.jsx("span",{children:u("agents.cacheWindowSummary","{{percent}}% ({{cached}} / {{written}} / {{input}} / {{tasks}})",{percent:(A.hitRatio*100).toFixed(1),cached:A.totalCachedTokens.toLocaleString(),written:A.totalCacheWriteTokens.toLocaleString(),input:A.totalInputTokens.toLocaleString(),tasks:A.nTasks.toLocaleString()})})]},x),z=$[0],ae=[...$].reverse(),Ae=Math.max(1,...ae.map(x=>x.execChars)),De=ae.map((x,A)=>{const ie=ae.length<=1?0:A/(ae.length-1)*100,q=100-Math.round(x.execChars/Ae*100);return`${ie},${q}`}).join(" ");return e.jsxs("div",{className:"runs-tab",children:[$.length>0&&z&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("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":u("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:De})]}),e.jsxs("span",{className:"prompt-size-values",children:[z.systemChars.toLocaleString()," / ",z.execChars.toLocaleString()," / ",z.totalChars.toLocaleString()]})]})]}),E&&e.jsxs("div",{className:"run-output-section",children:[e.jsx("div",{className:"run-output-label",children:u("agents.cacheHitRatio","Cache hit ratio")}),e.jsxs("div",{className:"run-context-grid",children:[ce(u("agents.last24h","Last 24h"),E.last24h),ce(u("agents.last7d","Last 7d"),E.last7d),ce(u("agents.allTime","All time"),E.allTime)]})]}),e.jsxs("div",{className:"runs-toolbar runs-toolbar--between",children:[e.jsxs("span",{className:"runs-toolbar-meta",children:[u("agents.runsCount",{count:j.length,defaultValue_one:"{{count}} run",defaultValue_other:"{{count}} runs"}),W&&e.jsxs("span",{className:"run-live-indicator run-live-indicator--with-margin",children:[e.jsx("span",{className:"live-dot"}),u("agents.live","Live")]})]}),e.jsx("div",{className:"run-header-group",children:W&&e.jsxs("button",{className:"btn btn--sm btn--danger",onClick:()=>void d(),"aria-label":u("agents.stopActiveRunFor","Stop active run for {{name}}",{name:s??r}),children:[e.jsx(Xe,{size:14})," ",u("agents.stopRun","Stop Run")]})})]}),J.map((x,A)=>Le(x,A,!0)),xe.map((x,A)=>Le(x,J.length+A,!1))]})}function yn(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 Nn(t){const r=t.title?.trim()||t.description?.trim()||t.id;return r.length>80?`${r.slice(0,77)}...`:r}function Sn({agentId:t,projectId:r,addToast:l}){const{t:o}=Se("app"),[s,p]=a.useState([]),[S,n]=a.useState(!0);return a.useEffect(()=>{let f=!1;return n(!0),Ca(t,r).then(u=>{f||p(u)}).catch(u=>{f||(p([]),l(o("agents.loadTasksFailed","Failed to load assigned tasks: {{error}}",{error:U(u)}),"error"))}).finally(()=>{f||n(!1)}),()=>{f=!0}},[t,r,l]),S?e.jsxs("div",{className:"agent-tasks-empty",children:[e.jsx(G,{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(Es,{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(f=>e.jsxs("a",{className:"agent-task-item",href:`/tasks/${f.id}`,children:[e.jsxs("div",{className:"agent-task-row",children:[e.jsx("span",{className:"agent-task-id",children:f.id}),e.jsx("span",{className:`agent-task-column column-${f.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")}[f.column]??f.column})]}),e.jsx("div",{className:"agent-task-title",title:f.title||f.description||f.id,children:Nn(f)}),e.jsxs("div",{className:"agent-task-status",children:[f.status??"idle"," · ",o("agents.taskUpdated","Updated {{time}}",{time:et(f.updatedAt,o)})]})]},f.id))})}const ot=[{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 kn(t){const r={};for(const l of ot){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(p=>p.value)??[];s.length>0&&!s.includes(o)&&(r[l.key]=`"${l.label}" must be one of: ${s.join(", ")}`)}}}return r}function Cn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[p,S]=a.useState(t.soul??""),[n,f]=a.useState(!1),[u,j]=a.useState(!1),[c,m]=a.useState(!1),w=a.useRef(null);a.useEffect(()=>{S(t.soul??""),j(!1),m(!1)},[t.id,t.soul]),a.useEffect(()=>()=>{w.current&&clearTimeout(w.current)},[]);const T=p!==(t.soul??""),H=async()=>{if(p.length>1e4){l(s("agents.soulTooLong","Soul must be at most 10,000 characters"),"error");return}f(!0);try{await _a(t.id,p,r),l(s("agents.soulSaved","Soul saved"),"success"),j(!0),w.current&&clearTimeout(w.current),w.current=setTimeout(()=>j(!1),3e3),await o()}catch(R){l(s("agents.soulSaveFailed","Failed to save soul: {{error}}",{error:U(R)}),"error")}finally{f(!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 ${c?"":"btn-primary"}`,onClick:()=>m(!1),disabled:!c,"aria-label":s("common.editMode","Edit mode"),children:[e.jsx(Ft,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${c?"btn-primary":""}`,onClick:()=>m(!0),disabled:c,"aria-label":s("common.previewMode","Preview mode"),children:[e.jsx(Pt,{size:14}),s("common.preview","Preview")]})]})}),c?p.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Tt,{remarkPlugins:[Et],children:p})}):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:p,onChange:R=>{S(R.target.value),j(!1)}}),!c&&e.jsx("span",{className:"config-hint",children:s("agents.soulHint","Defines the agent's character and identity. Max 10,000 characters.")})]})}),!c&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!T||n,onClick:()=>void H(),children:n?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveSoul","Save Soul")]})}),!T&&u&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{size:14}),s("agents.soulSaved","Soul saved")]})]})]})})}function wn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[p,S]=a.useState(t.memory??""),[n,f]=a.useState(!1),[u,j]=a.useState(!1),[c,m]=a.useState(!1),[w,T]=a.useState([]),[H,R]=a.useState(!1),[B,O]=a.useState(""),[se,N]=a.useState(""),[v,M]=a.useState(!1),[K,P]=a.useState(!1),[E,Z]=a.useState(!1),[$,V]=a.useState(!1),[k,X]=a.useState(""),F=a.useRef(null),W=a.useRef(null),b=t.state==="running",y=p!==(t.memory??""),d=a.useMemo(()=>w.find(z=>z.path===B),[w,B]),D=d?{"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.")}[d.layer]??d.layer:s("agents.selectMemoryFile","Select a memory file to view or edit."),J=a.useCallback(async z=>{P(!0);try{const ae=await Ra(t.id,z,r);O(ae.path),N(ae.content),M(!1),V(!1)}catch(ae){l(s("agents.memoryFileLoadFailed","Failed to load agent memory file: {{error}}",{error:U(ae)}),"error")}finally{P(!1)}},[t.id,r,l]),xe=a.useCallback(async(z="")=>{R(!0);try{const{files:ae}=await Ma(t.id,r);if(T(ae),ae.length===0){O(""),N(""),M(!1);return}const Ae=fn(ae,z);await J(Ae)}catch(ae){l(s("agents.memoryFilesLoadFailed","Failed to load memory files: {{error}}",{error:U(ae)}),"error"),T([]),O(""),N(""),M(!1)}finally{R(!1)}},[t.id,r,l,J]);a.useEffect(()=>{S(t.memory??""),j(!1),m(!1),X(""),V(!1),xe()},[t.id,t.memory,xe]),a.useEffect(()=>()=>{F.current&&clearTimeout(F.current),W.current&&clearTimeout(W.current)},[]);const Me=async()=>{if(p.length>5e4){l(s("agents.memoryTooLong","Memory must be at most 50,000 characters"),"error");return}f(!0);try{await Va(t.id,p,r),l(s("agents.memorySaved","Memory saved"),"success"),j(!0),F.current&&clearTimeout(F.current),F.current=setTimeout(()=>j(!1),3e3),await o()}catch(z){l(s("agents.memorySaveFailed","Failed to save memory: {{error}}",{error:U(z)}),"error")}finally{f(!1)}},Le=async z=>{if(!(!z||z===B)){if(v){X(s("agents.saveBeforeSwitch","Save the current file before switching to another file."));return}X(""),await J(z)}},ce=async()=>{if(B){Z(!0);try{await Wa(t.id,B,se,r),M(!1),V(!0),W.current&&clearTimeout(W.current),W.current=setTimeout(()=>V(!1),3e3),X(""),await xe(B),l(s("agents.memoryFileSaved","Agent memory file saved"),"success"),await o()}catch(z){l(s("agents.memoryFileSaveFailed","Failed to save agent memory file: {{error}}",{error:U(z)}),"error")}finally{Z(!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 ${c?"":"btn-primary"}`,onClick:()=>m(!1),disabled:!c,"aria-label":s("agents.inlineMemoryEditMode","Inline memory edit mode"),children:[e.jsx(Ft,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${c?"btn-primary":""}`,onClick:()=>m(!0),disabled:c,"aria-label":s("agents.inlineMemoryPreviewMode","Inline memory preview mode"),children:[e.jsx(Pt,{size:14}),s("common.preview","Preview")]})]})}),c?p.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Tt,{remarkPlugins:[Et],children:p})}):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:p,readOnly:b,onChange:z=>{S(z.target.value),j(!1)}}),!c&&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.")}),!c&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!y||n||b,onClick:()=>void Me(),children:n?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveMemory","Save Memory")]})}),!y&&u&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{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:B,disabled:H||K||E||w.length===0,onChange:z=>{Le(z.target.value)},children:w.length===0?e.jsx("option",{value:"",children:s("agents.noMemoryFiles","No memory files found")}):w.map(z=>{const ae={"long-term":s("agents.memoryLayerLongTerm","Long-term"),daily:s("agents.memoryLayerDaily","Daily"),dreams:s("agents.memoryLayerDreams","Dreams")}[z.layer]??z.layer;return e.jsxs("option",{value:z.path,children:[ae," • ",z.label]},z.path)})}),H&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(G,{size:14,className:"animate-spin"}),s("agents.loadingMemoryFiles","Loading memory files…")]}),d&&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")}[d.layer]??d.layer})," · ",D,e.jsx("br",{}),s("agents.memoryFileMeta","{{size}} bytes · updated {{date}}",{size:d.size.toLocaleString(),date:et(d.updatedAt,s)})]}),e.jsx("div",{className:"agent-memory-file-editor config-textarea-top-spacing",children:e.jsx(Aa,{content:se,onChange:z=>{N(z),M(!0),V(!1),X("")},readOnly:b||!B||K,filePath:B||"MEMORY.md",forceToolbarActionsVisible:!0})}),K&&e.jsxs("span",{className:"config-hint config-hint--inline-loader",children:[e.jsx(G,{size:14,className:"animate-spin"}),s("agents.loadingFileContent","Loading file content…")]}),k&&e.jsx("span",{className:"config-hint config-hint--top-spacing config-hint--block",children:k}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!v||E||!B||b,onClick:()=>void ce(),children:E?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("agents.savingFile","Saving file…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveMemoryFile","Save Memory File")]})}),!v&&$&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{size:14}),s("agents.memoryFileSaved","Memory file saved")]})]})]})]})]})})}function Rn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[p,S]=a.useState(t.instructionsText??""),[n,f]=a.useState(t.instructionsPath??""),[u,j]=a.useState(!1),[c,m]=a.useState(""),[w,T]=a.useState(!1),[H,R]=a.useState(!1),[B,O]=a.useState(!1),[se,N]=a.useState(!1),[v,M]=a.useState(!1),[K,P]=a.useState(!1),E=a.useRef(null),Z=a.useRef(null);a.useEffect(()=>{const F=n.trim();if(!F){m(""),R(!1);return}T(!0),$s("project",F).then(W=>{m(W.content),R(!1)}).catch(W=>{const b=U(W);b.includes("ENOENT")||b.includes("Not found")||b.includes("not found")?(m(""),R(!1)):(l(`Failed to load instructions file: ${b}`,"error"),m(""))}).finally(()=>{T(!1)})},[n,l]),a.useEffect(()=>{S(t.instructionsText??""),f(t.instructionsPath??""),M(!1),P(!1),j(!1)},[t.id,t.instructionsText,t.instructionsPath]),a.useEffect(()=>()=>{E.current&&clearTimeout(E.current),Z.current&&clearTimeout(Z.current)},[]);const $=(()=>{const F=p??"",W=t.instructionsText??"",b=n?.trim()??"",y=t.instructionsPath?.trim()??"";return F!==W||b!==y})(),V=async()=>{O(!0);try{await Ua(t.id,{instructionsText:p||void 0,instructionsPath:n.trim()||void 0},r),l(s("agents.instructionsSaved","Instructions saved"),"success"),M(!0),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>M(!1),3e3),await o()}catch(F){l(s("agents.instructionsSaveFailed","Failed to save instructions: {{error}}",{error:U(F)}),"error")}finally{O(!1)}},k=async()=>{const F=n.trim();if(!F){l(s("agents.noInstructionsPath","No instructions file path set"),"error");return}N(!0);try{await _s("project",F,c),l(s("agents.instructionsFileSaved","Instructions file saved"),"success"),R(!1),P(!0),Z.current&&clearTimeout(Z.current),Z.current=setTimeout(()=>P(!1),3e3),await o()}catch(W){l(s("agents.instructionsFileSaveFailed","Failed to save instructions file: {{error}}",{error:U(W)}),"error")}finally{N(!1)}},X=!!n.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:[!p.trim()&&!u&&e.jsx("button",{type:"button",className:"btn btn-sm","data-testid":"instructions-insert-template",onClick:()=>{S(Za),M(!1)},children:s("agents.insertInstructionsTemplate","Insert template")}),e.jsxs("button",{className:`btn btn-sm ${u?"":"btn-primary"}`,onClick:()=>j(!1),disabled:!u,"aria-label":s("common.editMode","Edit mode"),"data-testid":"instructions-edit-toggle",children:[e.jsx(Ft,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${u?"btn-primary":""}`,onClick:()=>j(!0),disabled:u,"aria-label":s("common.previewMode","Preview mode"),"data-testid":"instructions-preview-toggle",children:[e.jsx(Pt,{size:14}),s("common.preview","Preview")]})]})}),u?p.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Tt,{remarkPlugins:[Et],children:p})}):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:p,onChange:F=>{S(F.target.value),M(!1)}}),!u&&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:n,onChange:F=>{f(F.target.value),M(!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.")})]})]}),!u&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!$||B,onClick:()=>void V(),children:B?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveInstructions","Save Instructions")]})}),!$&&v&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{size:14}),s("agents.instructionsSaved","Instructions saved")]})]})]}),X&&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")}),w&&e.jsxs("span",{className:"config-hint config-hint--inline-tight",children:[e.jsx(G,{size:12,className:"animate-spin"}),s("common.loading","Loading...")]}),H&&!w&&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:c,readOnly:w,onChange:F=>{m(F.target.value),R(!0),P(!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:!H||se,onClick:()=>void k(),children:se?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveFile","Save File")]})}),!H&&K&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{size:14}),s("agents.fileSaved","File saved")]})]})]})]})}function vs(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 Ut(t){return t?.autoClaimRelevantTasks!==!1}function Vt(t){return t?.engineerBacklogAutoClaim===!0}function js(t){const r=t?.assignmentPolicy;return r==="explicit-only"||r==="none"?r:"auto"}function Wt(t){return t?.runMissedHeartbeatOnStartup===!0}function Jt(t){return t?.allowParallelExecution!==!1}function Gt(t){return t?.skipHeartbeatWhenIdle===!0}function qt(t){const r=t?.heartbeatScopeDiscipline;return r==="strict"||r==="lite"||r==="off"?r:""}function ys(t){const r=t?.heartbeatPromptTemplate;return r==="default"||r==="compact"?r:""}function Ns(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 Mn({agent:t,projectId:r,addToast:l,onSaved:o}){const{t:s}=Se("app"),[p,S]=a.useState(!1),[n,f]=a.useState(!1),[u,j]=a.useState(!1),[c,m]=a.useState(!1),[w,T]=a.useState(!1),[H,R]=a.useState(""),[B,O]=a.useState(!1),[se,N]=a.useState(null),[v,M]=a.useState(!1),K=a.useRef(null),P=t.heartbeatProcedurePath?.trim(),E=`.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`,Z=`.fusion/agents/${t.id}/HEARTBEAT.md`,$=t.id.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"agent",V=!!(P&&(P===E||P===Z||new RegExp(`^\\.fusion/agents/[^/]+-${$}/HEARTBEAT\\.md$`).test(P))),k=!!P,X=a.useCallback(async y=>{j(!0),N(null);try{const d=await $s("project",y,r);R(d.content),O(!1)}catch(d){const D=U(d);N(D),l(s("agents.heartbeatFileLoadFailed","Failed to load heartbeat procedure file: {{error}}",{error:D}),"error")}finally{j(!1)}},[l,r]);a.useEffect(()=>{f(!1),T(!1),R(""),O(!1),N(null),j(!1),m(!1),M(!1)},[t.id,P]),a.useEffect(()=>()=>{K.current&&clearTimeout(K.current)},[]);const F=async()=>{P&&(f(!0),await X(P))},W=async()=>{if(P){m(!0);try{await _s("project",P,H,r),O(!1),M(!0),l(s("agents.heartbeatFileSaved","Heartbeat procedure file saved"),"success"),K.current&&clearTimeout(K.current),K.current=setTimeout(()=>M(!1),3e3),await o()}catch(y){l(s("agents.heartbeatFileSaveFailed","Failed to save heartbeat procedure file: {{error}}",{error:U(y)}),"error")}finally{m(!1)}}},b=async()=>{S(!0);try{const y=await qa(t.id,r);l(y.procedureFileSeeded?s("agents.heartbeatProcedureFileReady","Heartbeat procedure file ready at {{path}}",{path:y.heartbeatProcedurePath}):s("agents.heartbeatProcedurePathSet","Heartbeat procedure path set to {{path}}",{path:y.heartbeatProcedurePath}),"success"),await o()}catch(y){l(s("agents.heartbeatUpgradeFailed","Failed to upgrade heartbeat procedure: {{error}}",{error:U(y)}),"error")}finally{S(!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:P||s("agents.noneUsingBuiltIn","(none — using built-in default)")})]}),k&&e.jsx("div",{className:"heartbeat-procedure-actions",children:e.jsx("button",{className:"btn btn-sm",onClick:()=>void F(),disabled:u,children:u?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("agents.loadingFile","Loading file…")]}):e.jsxs(e.Fragment,{children:[e.jsx(dt,{size:16}),s("agents.viewHeartbeatMarkdown","View Heartbeat Markdown")]})})})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("button",{className:"btn",disabled:p||V,onClick:()=>void b(),"aria-label":s("agents.upgradeToDefaultAriaLabel","Upgrade agent to default heartbeat procedure file"),children:p?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("agents.upgrading","Upgrading…")]}):V?e.jsxs(e.Fragment,{children:[e.jsx(fe,{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:E})," ",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.")]})]})]}),n&&k&&P&&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 ${w?"":"btn-primary"}`,onClick:()=>T(!1),disabled:!w,"aria-label":s("agents.heartbeatFileEditMode","Heartbeat file edit mode"),children:[e.jsx(Ft,{size:14}),s("common.edit","Edit")]}),e.jsxs("button",{className:`btn btn-sm ${w?"btn-primary":""}`,onClick:()=>T(!0),disabled:w,"aria-label":s("agents.heartbeatFilePreviewMode","Heartbeat file preview mode"),children:[e.jsx(Pt,{size:14}),s("common.preview","Preview")]})]}),u&&e.jsxs("span",{className:"config-hint heartbeat-procedure-status",children:[e.jsx(G,{size:12,className:"animate-spin"}),s("common.loading","Loading...")]}),B&&!u&&e.jsx("span",{className:"config-hint heartbeat-procedure-status heartbeat-procedure-status--warning",children:s("common.unsavedChanges","Unsaved changes")})]}),w?H.trim()?e.jsx("div",{className:"agent-content-preview markdown-body",children:e.jsx(Tt,{remarkPlugins:[Et],children:H})}):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:H,readOnly:u,placeholder:s("agents.heartbeatFilePlaceholder","Heartbeat procedure markdown file content will appear here..."),onChange:y=>{R(y.target.value),O(!0),M(!1)}}),se&&e.jsx("span",{className:"config-error",children:s("agents.fileLoadError","Failed to load file: {{error}}",{error:se})}),e.jsxs("span",{className:"config-hint",children:[s("agents.heartbeatFileEditorHint","This editor writes directly to")," ",e.jsx("code",{children:P}),"."]})]}),!w&&e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!B||c||u,onClick:()=>void W(),children:c?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),s("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),s("agents.saveHeartbeatFile","Save Heartbeat File")]})}),!B&&v&&e.jsxs("span",{className:"config-saved-indicator",children:[e.jsx(fe,{size:14}),s("agents.fileSaved","File saved")]})]})]})]})}function An({agent:t,projectId:r,addToast:l,onSaved:o,onHasChangesChange:s,onDelete:p,onAgentDraftApplied:S}){const{t:n}=Se("app"),[f,u]=a.useState(t.name),[j,c]=a.useState(t.role),[m,w]=a.useState(t.title??""),[T,H]=a.useState(t.icon??""),[R,B]=a.useState(t.reportsTo??""),[O,se]=a.useState([]),[N,v]=a.useState(!1),[M,K]=a.useState(!1),[P,E]=a.useState(!1),Z=a.useRef(null),[$,V]=a.useState(()=>{const i={};for(const g of ot){const C=t.metadata[g.key];C!=null&&(i[g.key]=String(C))}return i.thinkingLevel=typeof t.runtimeConfig?.thinkingLevel=="string"?t.runtimeConfig.thinkingLevel:"off",i}),[k,X]=a.useState(()=>vs(t.runtimeConfig)),[F,W]=a.useState(()=>Ot(t)),[b,y]=a.useState(()=>Ut(t.runtimeConfig)),[d,D]=a.useState(()=>Vt(t.runtimeConfig)),[J,xe]=a.useState(()=>js(t.runtimeConfig)),[Me,Le]=a.useState(()=>Wt(t.runtimeConfig)),[ce,z]=a.useState(()=>Jt(t.runtimeConfig)),[ae,Ae]=a.useState(()=>Gt(t.runtimeConfig)),[De,x]=a.useState(()=>qt(t.runtimeConfig)),[A,ie]=a.useState(()=>ys(t.runtimeConfig)),[q,Je]=a.useState(()=>Ns(t.runtimeConfig)),[ue,He]=a.useState(t.bundleConfig?.mode??""),[me,Be]=a.useState(t.bundleConfig?.entryFile??"AGENTS.md"),[ze,Oe]=a.useState(t.bundleConfig?.externalPath??""),[ne,ut]=a.useState(t.bundleConfig?.files??[]),[Fe,ye]=a.useState(Array.isArray(t.metadata?.skills)?t.metadata.skills:[]),{favoriteProviders:mt,favoriteModels:tt,toggleFavoriteProvider:Lt,toggleFavoriteModel:st}=Fa(),[$e,Pe]=a.useState([]),[gt,at]=a.useState(!1),[Ge,ht]=a.useState([]),[ft,Ye]=a.useState(!1),ke=(()=>{const i=t.runtimeConfig??{};return i.modelProvider&&i.modelId?`${i.modelProvider}/${i.modelId}`:typeof i.model=="string"&&i.model.includes("/")?i.model:""})(),Ie=typeof t.runtimeConfig?.runtimeHint=="string"?t.runtimeConfig.runtimeHint:"",[pe,_e]=a.useState(Ie?"runtime":"model"),[h,L]=a.useState(ke),[I,_]=a.useState(Ie),[le,be]=a.useState(t.permissionPolicy),[Ce,Re]=a.useState(t.permissions??{}),[Ne,nt]=a.useState(void 0),Ke=R.trim(),pt=a.useMemo(()=>O.filter(i=>i.id!==t.id),[O,t.id]),bt=!!Ke&&!pt.some(i=>i.id===Ke),he=a.useMemo(()=>({name:f,role:j,title:m||void 0,instructionsText:t.instructionsText,soul:t.soul,memory:t.memory,reportsTo:R||void 0,skills:Fe,model:h||void 0,runtimeHint:pe==="runtime"&&I||void 0,thinkingLevel:$.thinkingLevel??void 0,maxTurns:$.maxTurns?Number($.maxTurns):void 0,heartbeatIntervalMs:k.heartbeatIntervalMs?Number(k.heartbeatIntervalMs)*1e3:void 0,heartbeatTimeoutMs:k.heartbeatTimeoutMs?Number(k.heartbeatTimeoutMs)*1e3:void 0,maxConcurrentRuns:k.maxConcurrentRuns?Number(k.maxConcurrentRuns):void 0,messageResponseMode:k.messageResponseMode}),[t.instructionsText,t.memory,t.soul,$.maxTurns,$.thinkingLevel,k.heartbeatIntervalMs,k.heartbeatTimeoutMs,k.maxConcurrentRuns,k.messageResponseMode,h,f,R,j,pe,I,Fe,m]),Ze=a.useCallback(i=>{u(i.name),c(i.role),w(i.title??""),H(i.icon??""),B(i.reportsTo??""),i.skills&&ye(i.skills),i.thinkingLevel&&V(C=>({...C,thinkingLevel:i.thinkingLevel})),i.maxTurns!==void 0&&V(C=>({...C,maxTurns:String(i.maxTurns)})),i.runtimeHint!==void 0?(_e("runtime"),_(i.runtimeHint??""),i.runtimeHint&&L("")):i.model!==void 0&&(_e("model"),L(i.model??""),_(""));const g=Object.fromEntries(Object.entries({name:i.name,role:i.role,title:i.title,icon:i.icon,reportsTo:i.reportsTo,instructionsText:i.instructionsText,soul:i.soul,memory:i.memory}).filter(([,C])=>C!==void 0));S?.(g),E(!1),l(n("agents.interviewDraftApplied","Interview draft applied. Review and save when ready."),"success")},[l,S]);a.useEffect(()=>{be(t.permissionPolicy)},[t.permissionPolicy]),a.useEffect(()=>{Re(t.permissions??{})},[t.permissions]),a.useEffect(()=>{Pa(r).then(i=>nt(i.project?.defaultAgentPermissionPolicy)).catch(()=>nt(void 0))},[r]);const xt=async i=>{be(i);try{await $t(t.id,{permissionPolicy:i},r),await o(),l(n("agents.permissionPolicyUpdated","Permission policy updated"),"success")}catch(g){l(n("agents.permissionPolicyFailed","Failed to update permission policy: {{error}}",{error:U(g)}),"error")}},Us=a.useMemo(()=>new Set(dn[j]??[]),[j]),Vs=a.useMemo(()=>new Set(fs.filter(i=>Ce[i]===!0)),[Ce]),Ws=async(i,g)=>{const C={...Ce};g?C[i]=!0:delete C[i],Re(C);try{await $t(t.id,{permissions:C},r),await o(),l(n("agents.capabilityPermissionsUpdated","Capability grants updated"),"success")}catch(ee){Re(t.permissions??{}),l(n("agents.capabilityPermissionsFailed","Failed to update capability grants: {{error}}",{error:U(ee)}),"error")}};a.useEffect(()=>{let i=!1;return v(!0),wt(void 0,r).then(g=>{i||se(g)}).catch(()=>{i||se([])}).finally(()=>{i||v(!1)}),()=>{i=!0}},[r]),a.useEffect(()=>{at(!0),Ta().then(i=>{Pe(i.models)}).catch(()=>{}).finally(()=>at(!1))},[]),a.useEffect(()=>{Ye(!0),zs(r).then(ht).catch(()=>ht([])).finally(()=>Ye(!1))},[r]);const[Ue,Dt]=a.useState(null),[Xt,es]=a.useState(!1);a.useEffect(()=>{Yt(t.id,r).then(Dt).catch(()=>Dt(null))},[t.id,r]);const Js=async()=>{es(!0);try{await Ja(t.id,r),l(n("agents.budgetResetSuccess","Budget usage reset successfully"),"success");const i=await Yt(t.id,r);Dt(i)}catch(i){l(n("agents.budgetResetFailed","Failed to reset budget: {{error}}",{error:U(i)}),"error")}finally{es(!1)}},[Ve,ts]=a.useState(!1),[Y,qe]=a.useState({}),[Gs,Qe]=a.useState(!1),[Ht,vt]=a.useState(null),ss=t.state==="idle"||t.state==="paused",it=a.useRef(null),as=a.useRef(null),ns=a.useRef(null),jt=a.useRef(0);a.useEffect(()=>()=>{it.current&&clearTimeout(it.current)},[]);const we=(()=>{if(f!==t.name||j!==t.role||m!==(t.title??"")||T!==(t.icon??"")||R!==(t.reportsTo??"")||ue!==(t.bundleConfig?.mode??"")||me!==(t.bundleConfig?.entryFile??"AGENTS.md")||ze!==(t.bundleConfig?.externalPath??"")||JSON.stringify(ne)!==JSON.stringify(t.bundleConfig?.files??[]))return!0;for(const te of ot){const ve=$[te.key]?.trim()??"",je=t.metadata[te.key]!==void 0&&t.metadata[te.key]!==null?String(t.metadata[te.key]):"";if(ve!==je)return!0}const i=t.runtimeConfig??{};if(F!==Ot(t)||b!==Ut(t.runtimeConfig)||d!==Vt(t.runtimeConfig)||J!==js(t.runtimeConfig)||Me!==Wt(t.runtimeConfig)||ce!==Jt(t.runtimeConfig)||ae!==Gt(t.runtimeConfig)||De!==qt(t.runtimeConfig)||A!==ys(t.runtimeConfig))return!0;for(const te of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns","messageResponseMode","autoClaimCandidatesInPrompt"]){const ve=k[te]?.trim()??"";let je=i[te]!==void 0&&i[te]!==null?String(i[te]):"";if((te==="heartbeatIntervalMs"||te==="heartbeatTimeoutMs")&&je&&(je=String(Number(je)/1e3)),ve!==je)return!0}const g=i.budgetConfig;for(const te of["tokenBudget","budgetPeriod","resetDay"]){const ve=q[te]?.trim()??"",je=g?.[te]!==void 0&&g?.[te]!==null?String(g[te]):"";if(ve!==je)return!0}const C=q.usageThreshold?.trim()??"",ee=g?.usageThreshold!==void 0&&g?.usageThreshold!==null?String(Number(g.usageThreshold)*100):"";if(C!==ee)return!0;const ge=Array.isArray(t.metadata?.skills)?t.metadata.skills:[];return JSON.stringify(Fe)!==JSON.stringify(ge)||pe!==(Ie?"runtime":"model")||h!==ke||I!==Ie||($.thinkingLevel||"off")!==(typeof i.thinkingLevel=="string"?i.thinkingLevel:"off")})(),is=a.useRef(null);a.useEffect(()=>{s&&is.current!==we&&(is.current=we,s(we))},[we,s]),a.useEffect(()=>()=>{s?.(!1)},[s]),a.useEffect(()=>{const i={id:t.id,updatedAt:t.updatedAt},g=as.current;(!g||g.id!==i.id||g.updatedAt!==i.updatedAt)&&(we||(as.current=i,X(vs(t.runtimeConfig)),W(Ot(t)),y(Ut(t.runtimeConfig)),D(Vt(t.runtimeConfig)),Le(Wt(t.runtimeConfig)),z(Jt(t.runtimeConfig)),Ae(Gt(t.runtimeConfig)),x(qt(t.runtimeConfig)),Je(Ns(t.runtimeConfig)),V(ee=>({...ee,thinkingLevel:typeof t.runtimeConfig?.thinkingLevel=="string"?t.runtimeConfig.thinkingLevel:"off"})),L(ke),_(Ie),_e(Ie?"runtime":"model")))},[t,we,ke,Ie]);const rs=(i,g)=>{V(C=>({...C,[i]:g})),Qe(!1),Y[i]&&qe(C=>{const ee={...C};return delete ee[i],ee})},yt=(i,g)=>{X(C=>({...C,[i]:g})),Qe(!1),Y[i]&&qe(C=>{const ee={...C};return delete ee[i],ee})},qs=i=>{W(i),Qe(!1)},Nt=(i,g)=>{Je(C=>({...C,[i]:g})),Qe(!1),Y[i]&&qe(C=>{const ee={...C};return delete ee[i],ee})},Te=a.useMemo(()=>{const i=kn($);for(const[Q,We]of Object.entries({heartbeatIntervalMs:{label:"Heartbeat Interval",min:1},heartbeatTimeoutMs:{label:"Heartbeat Timeout",min:5},maxConcurrentRuns:{label:"Max Concurrent Runs",min:1}})){const de=k[Q]?.trim();if(!de)continue;const Ee=Number(de);Number.isNaN(Ee)||!Number.isFinite(Ee)?i[Q]=`"${We.label}" must be a valid number`:Ee<We.min&&(i[Q]=`"${We.label}" must be at least ${We.min.toLocaleString()}`)}const g=k.autoClaimCandidatesInPrompt?.trim();if(g){const Q=Number(g);(!Number.isInteger(Q)||Q<0||Q>10)&&(i.autoClaimCandidatesInPrompt='"Auto-claim candidates in prompt" must be an integer between 0 and 10')}const C=k.messageResponseMode?.trim();C&&!["immediate","on-heartbeat"].includes(C)&&(i.messageResponseMode='"Message Response Mode" must be either immediate or on-heartbeat');const ee=q.tokenBudget?.trim();if(ee){const Q=Number(ee);Number.isNaN(Q)||!Number.isFinite(Q)?i.tokenBudget='"Token Budget" must be a valid number':Q<=0&&(i.tokenBudget='"Token Budget" must be greater than 0')}const ge=q.usageThreshold?.trim();if(ge){const Q=Number(ge);Number.isNaN(Q)||!Number.isFinite(Q)?i.usageThreshold='"Usage Threshold" must be a valid number':(Q<1||Q>100)&&(i.usageThreshold='"Usage Threshold" must be between 1 and 100')}const te=q.budgetPeriod?.trim();te&&!["daily","weekly","monthly","lifetime"].includes(te)&&(i.budgetPeriod='"Budget Period" must be one of: daily, weekly, monthly, lifetime');const ve=q.resetDay?.trim(),je=te||"lifetime";if(ve){const Q=Number(ve);Number.isNaN(Q)||!Number.isFinite(Q)?i.resetDay='"Reset Day" must be a valid number':je==="weekly"?(Q<0||Q>6||!Number.isInteger(Q))&&(i.resetDay='"Reset Day" must be between 0 (Sunday) and 6 (Saturday) for weekly period'):je==="monthly"&&(Q<1||Q>31||!Number.isInteger(Q))&&(i.resetDay='"Reset Day" must be between 1 and 31 for monthly period')}return i},[$,k,q]),ls=a.useCallback(()=>{if(Object.keys(Te).length>0)return null;const i={...t.metadata};for(const de of ot){const Ee=$[de.key]?.trim();Ee?de.type==="number"?i[de.key]=Number(Ee):i[de.key]=Ee:delete i[de.key]}Fe.length>0?i.skills=Fe:delete i.skills;const g={...t.runtimeConfig};Object.assign(g,Ea(t,F)),g.autoClaimRelevantTasks=b,g.engineerBacklogAutoClaim=d,J==="auto"?delete g.assignmentPolicy:g.assignmentPolicy=J,g.runMissedHeartbeatOnStartup=Me,g.allowParallelExecution=ce,g.skipHeartbeatWhenIdle=ae;for(const de of["heartbeatIntervalMs","heartbeatTimeoutMs","maxConcurrentRuns","autoClaimCandidatesInPrompt"]){const Ee=k[de]?.trim();if(!Ee)delete g[de];else{const cs=Number(Ee);g[de]=de==="maxConcurrentRuns"||de==="autoClaimCandidatesInPrompt"?cs:cs*1e3}}const C=k.messageResponseMode?.trim();C?g.messageResponseMode=C:delete g.messageResponseMode,De?g.heartbeatScopeDiscipline=De:delete g.heartbeatScopeDiscipline,A?g.heartbeatPromptTemplate=A:delete g.heartbeatPromptTemplate;const ee=$.thinkingLevel||"off";if(g.thinkingLevel=ee,pe==="runtime")I.trim()?g.runtimeHint=I.trim():delete g.runtimeHint,delete g.modelProvider,delete g.modelId,delete g.model;else if(delete g.runtimeHint,h.trim()){const de=h.indexOf("/");de!==-1&&(g.modelProvider=h.slice(0,de),g.modelId=h.slice(de+1),g.model=h.trim())}else delete g.modelProvider,delete g.modelId,delete g.model;const ge={},te=q.tokenBudget?.trim(),ve=q.usageThreshold?.trim(),je=q.budgetPeriod?.trim(),Q=q.resetDay?.trim();te&&(ge.tokenBudget=Number(te)),ve&&(ge.usageThreshold=Number(ve)/100),je&&(ge.budgetPeriod=je),Q&&(ge.resetDay=Number(Q)),Object.keys(ge).length>0?g.budgetConfig=ge:delete g.budgetConfig;let We;return ue&&(We={mode:ue,entryFile:me||"AGENTS.md",files:ne.length>0?ne:["AGENTS.md"]},ue==="external"&&ze.trim()&&(We.externalPath=ze.trim())),{name:f.trim()||void 0,role:j,title:m.trim()||void 0,icon:T.trim()||void 0,reportsTo:R.trim()||void 0,metadata:i,runtimeConfig:g,bundleConfig:We}},[t.metadata,t.runtimeConfig,ce,J,b,q,me,ze,ne,ue,d,$,F,A,De,k,T,h,f,R,j,Me,pe,I,Fe,ae,m,Te]),rt=a.useCallback(async(i,g)=>{const C=ls();if(!C)return qe(Te),i&&l(n("agents.fixValidationErrors","Please fix validation errors before saving"),"error"),g==="auto"&&vt(n("agents.fixValidationToSave","Fix validation errors to save changes")),!1;const ee=JSON.stringify(C);if(ee===ns.current)return!1;const ge=++jt.current;qe({}),vt(null),ts(!0);try{return await $t(t.id,C,r),ge!==jt.current?!1:(ns.current=ee,g==="manual"&&l(n("agents.settingsSaved","Settings saved"),"success"),vt(null),Qe(!0),it.current&&clearTimeout(it.current),it.current=setTimeout(()=>Qe(!1),3e3),await o(),!0)}catch(te){if(ge===jt.current){const ve=U(te);vt(ve),l(n("agents.settingsSaveFailed","Failed to save settings: {{error}}",{error:ve}),"error")}return!1}finally{ge===jt.current&&ts(!1)}},[l,t.id,ls,o,r,Te]),Ys=async()=>{await rt(!0,"manual")},re=a.useCallback(()=>{if(!(!we||Ve)){if(Object.keys(Te).length>0){qe(Te);return}rt(!1,"auto")}},[we,Ve,rt,Te]);a.useEffect(()=>{if(!we||Ve)return;if(Object.keys(Te).length>0){qe(Te);return}const i=setTimeout(()=>{rt(!1,"auto")},hn);return()=>clearTimeout(i)},[we,Ve,rt,Te]);const Ks=a.useCallback(async i=>{K(!0);try{await La(t.id,i,r),await o(),l(n("agents.avatarUploaded","Avatar uploaded"),"success")}catch(g){l(U(g),"error")}finally{K(!1),Z.current&&(Z.current.value="")}},[l,t.id,o,r]),Zs=a.useCallback(async()=>{K(!0);try{await Da(t.id,r),await o(),l(n("agents.avatarRemoved","Avatar removed"),"success")}catch(i){l(U(i),"error")}finally{K(!1)}},[l,t.id,o,r]),os=Ve?n("agents.savingChanges","Saving changes…"):Ht?n("agents.saveFailed","Save failed: {{error}}",{error:Ht}):!we&&Gs?n("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:n("agents.configTitle","Agent Configuration")}),e.jsx("p",{className:"config-description",children:n("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:()=>E(!0),children:n("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:n("agents.nameLabel","Name")}),e.jsx("input",{id:"agent-name",type:"text",className:"input",value:f,onChange:i=>u(i.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-role",children:n("agents.roleLabel2","Role")}),e.jsxs("select",{id:"agent-role",className:"select",value:j,onChange:i=>{c(i.target.value),re()},children:[e.jsx("option",{value:"triage",children:n("agents.roleTriage","Triage")}),e.jsx("option",{value:"executor",children:n("agents.roleExecutor","Executor")}),e.jsx("option",{value:"reviewer",children:n("agents.roleReviewer","Reviewer")}),e.jsx("option",{value:"merger",children:n("agents.roleMerger","Merger")}),e.jsx("option",{value:"scheduler",children:n("agents.roleScheduler","Scheduler")}),e.jsx("option",{value:"custom",children:n("agents.roleCustom","Custom")})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-title",children:n("agents.titleLabel","Title")}),e.jsx("input",{id:"agent-title",type:"text",className:"input",placeholder:n("agents.titlePlaceholder","e.g. Senior Code Reviewer"),value:m,onChange:i=>w(i.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:n("agents.avatarLabel","Avatar")}),e.jsxs("div",{className:"agent-avatar-editor",children:[e.jsx(Ps,{agent:t,size:64,className:"agent-avatar-editor-preview"}),e.jsxs("div",{className:"agent-avatar-editor-actions",children:[e.jsx("input",{ref:Z,id:"agent-avatar-upload",type:"file",accept:"image/png,image/jpeg,image/gif,image/webp",className:"visually-hidden",disabled:M,onChange:i=>{const g=i.target.files?.[0];g&&Ks(g)}}),e.jsx("button",{type:"button",className:"btn btn-sm agent-avatar-editor-action",disabled:M,onClick:()=>Z.current?.click(),children:n("agents.uploadAvatar","Upload Avatar")}),t.imageUrl?e.jsx("button",{type:"button",className:"btn btn-sm agent-avatar-editor-action",onClick:()=>void Zs(),disabled:M,children:n("agents.removeAvatar","Remove Avatar")}):null]})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-icon",children:n("agents.iconLabel","Icon")}),e.jsx("input",{id:"agent-icon",type:"text",className:"input",placeholder:n("agents.iconPlaceholder","e.g. 🤖"),value:T,onChange:i=>H(i.target.value),onBlur:()=>{re()}})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-reports-to",children:n("agents.reportsToLabel","Reports To")}),e.jsxs("select",{id:"agent-reports-to",className:"select",value:R,onChange:i=>{B(i.target.value),re()},disabled:N,children:[e.jsx("option",{value:"",children:n("agents.noManager","No manager")}),bt&&e.jsx("option",{value:Ke,children:n("agents.unknownManager","Unknown manager ({{id}})",{id:Ke})}),pt.map(i=>e.jsxs("option",{value:i.id,children:[i.name," (",i.id,")"]},i.id))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.skillsTitle","Skills")}),e.jsx("p",{className:"config-description",children:n("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(Qa,{id:"agent-skills",label:"Skills",value:Fe,onChange:i=>{ye(i),re()},projectId:r})})})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.modelTitle","Model")}),e.jsx("p",{className:"config-description",children:n("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:n("agents.runtimeSource","Runtime Source")}),e.jsxs("div",{className:"config-runtime-tabs",role:"tablist","aria-label":n("agents.runtimeSource","Runtime source"),children:[e.jsx("button",{type:"button",className:`config-runtime-tab${pe==="model"?" active":""}`,role:"tab","aria-selected":pe==="model",tabIndex:pe==="model"?0:-1,onClick:()=>{_e("model"),_(""),re()},children:n("agents.builtInModel","Built-in Model")}),e.jsx("button",{type:"button",className:`config-runtime-tab${pe==="runtime"?" active":""}`,role:"tab","aria-selected":pe==="runtime",tabIndex:pe==="runtime"?0:-1,onClick:()=>{_e("runtime"),re()},children:n("agents.pluginRuntime","Plugin Runtime")})]})]}),pe==="model"?e.jsx("div",{className:"config-field",children:e.jsx(Ha,{models:$e,value:h,onChange:i=>{L(i),re()},placeholder:n("agents.useGlobalDefault","Use global default"),label:n("agents.agentModelLabel","Agent Model"),disabled:gt,favoriteProviders:mt,onToggleFavorite:Lt,favoriteModels:tt,onToggleModelFavorite:st,thinkingLevel:$.thinkingLevel??"",onThinkingLevelChange:i=>{V(g=>({...g,thinkingLevel:i})),re()}})}):e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"agent-runtime-hint",children:n("agents.runtimeLabel","Runtime")}),ft?e.jsx("span",{className:"config-hint",children:e.jsx(za,{label:n("agents.loadingRuntimes","Loading runtimes…")})}):e.jsxs("select",{id:"agent-runtime-hint",className:"select",value:I,onChange:i=>{_(i.target.value),re()},children:[e.jsx("option",{value:"",children:Ge.length>0?n("agents.selectRuntime","Select a plugin runtime…"):n("agents.noRuntimes","No plugin runtimes available")}),Ge.map(i=>e.jsx("option",{value:i.runtimeId,children:i.description?`${i.name} — ${i.description}`:i.name},`${i.pluginId}:${i.runtimeId}`))]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.permissionsTitle","Permissions")}),e.jsx("p",{className:"config-description",children:n("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:n("agents.capabilityGrantsTitle","Capability grants")}),e.jsx("p",{className:"config-hint",children:n("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:fs.map(i=>{const g=Us.has(i),C=Vs.has(i),ee=`agent-capability-${t.id}-${i.replace(/[^a-z0-9]+/gi,"-")}`;return e.jsxs("label",{className:"agent-capability-grant-row",htmlFor:ee,children:[e.jsxs("span",{children:[e.jsx("span",{className:"agent-capability-grant-name",children:i}),e.jsx("span",{className:"config-hint",children:g?n("agents.roleDefaultGrant","Role default grant"):C?n("agents.explicitGrant","Explicit grant"):n("agents.notGranted","Not granted")})]}),e.jsx("input",{id:ee,type:"checkbox",checked:C,"aria-label":n("agents.toggleCapabilityGrant","Toggle explicit grant for {{permission}}",{permission:i}),onChange:ge=>{Ws(i,ge.target.checked)}})]},i)})})]}),le===void 0?e.jsxs("div",{className:"agent-permission-inherit-banner",children:[e.jsx("span",{children:n("agents.inheritingProjectDefault","Inheriting project default — no per-agent override set")}),e.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>void xt({presetId:"custom",rules:{git_write:Ne?.rules?.git_write??"allow",file_write_delete:Ne?.rules?.file_write_delete??"allow",command_execution:Ne?.rules?.command_execution??"allow",network_api:Ne?.rules?.network_api??"allow",task_agent_mutation:Ne?.rules?.task_agent_mutation??"allow",review_gate_bypass:Ne?.rules?.review_gate_bypass??"require-approval",file_scope:Ne?.rules?.file_scope??"allow"}}),children:n("agents.customizeForAgent","Customize for this agent")})]}):null,e.jsx(Ka,{mode:"agent-override",value:le,projectDefault:Ne?.rules,projectDefaultToolRules:Ne?.toolRules,onChange:i=>{xt(i)}})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.heartbeatSettingsTitle","Heartbeat Settings")}),e.jsx("p",{className:"config-description",children:n("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:n("agents.coordinationOnlyAgent","Coordination-only agent")}),e.jsx("span",{className:"config-hint",children:n("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:()=>{y(!1),X(i=>({...i,autoClaimCandidatesInPrompt:"0"})),re()},children:n("agents.applyPreset","Apply preset")})]}),e.jsxs("label",{className:"checkbox-label",htmlFor:"hb-autoClaimRelevantTasks",children:[e.jsx("input",{id:"hb-autoClaimRelevantTasks",type:"checkbox",checked:b,onChange:i=>{y(i.target.checked),re()}}),n("agents.autoClaimRelevantTasks","Auto-Claim Relevant Tasks")]}),e.jsx("span",{className:"config-hint",children:n("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:d,onChange:i=>{D(i.target.checked),re()}}),n("agents.engineerBacklogAutoClaim","Engineer Backlog Auto-Claim")]}),e.jsx("span",{className:"config-hint",children:n("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:n("agents.assignmentPolicy","Assignment Policy")}),e.jsxs("select",{id:"hb-assignmentPolicy",value:J,onChange:i=>{xe(i.target.value),re()},children:[e.jsx("option",{value:"auto",children:n("agents.assignmentPolicyAuto","Auto (default) — eligible for automatic assignment")}),e.jsx("option",{value:"explicit-only",children:n("agents.assignmentPolicyExplicitOnly","Explicit only — never auto-assigned; accepts direct assignment/delegation")}),e.jsx("option",{value:"none",children:n("agents.assignmentPolicyNone","None — can never receive implementation tasks")})]}),e.jsx("span",{className:"config-hint",children:n("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:F,onChange:i=>{qs(i.target.checked),re()}}),n("agents.heartbeatEnabled","Heartbeat Enabled")]}),e.jsx("span",{className:"config-hint",children:n("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:Me,onChange:i=>{Le(i.target.checked),re()}}),n("agents.runMissedHeartbeat","Run Missed Heartbeat On Startup")]}),e.jsx("span",{className:"config-hint",children:n("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:ce,onChange:i=>{z(i.target.checked),re()}}),n("agents.allowParallelExecution","Allow Parallel Execution")]}),e.jsx("span",{className:"config-hint",children:n("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:ae,onChange:i=>{Ae(i.target.checked),re()}}),n("agents.skipHeartbeatWhenIdle","Skip heartbeat when idle")]}),e.jsx("span",{className:"config-hint",children:n("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:n("agents.heartbeatScopeDiscipline","Heartbeat Scope Discipline")}),e.jsxs("select",{id:"hb-heartbeatScopeDiscipline",className:"select",value:De,onChange:i=>{const g=i.target.value;x(g==="strict"||g==="lite"||g==="off"?g:""),re()},children:[e.jsx("option",{value:"",children:n("agents.inheritProjectDefault","Inherit project default")}),e.jsx("option",{value:"strict",children:n("agents.strict","Strict")}),e.jsx("option",{value:"lite",children:n("agents.lite","Lite")}),e.jsx("option",{value:"off",children:n("agents.off","Off")})]}),e.jsx("span",{className:"config-hint",children:n("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:n("agents.heartbeatPromptTemplate","Heartbeat Prompt Template")}),e.jsxs("select",{id:"hb-heartbeatPromptTemplate",className:"select",value:A,onChange:i=>{const g=i.target.value;ie(g==="default"||g==="compact"?g:""),re()},children:[e.jsx("option",{value:"",children:n("agents.inheritProjectDefault","Inherit project default")}),e.jsx("option",{value:"default",children:n("agents.templateDefault","Default")}),e.jsx("option",{value:"compact",children:n("agents.templateCompact","Compact")})]})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatIntervalMs",children:n("agents.heartbeatIntervalLabel","Heartbeat Interval (s)")}),e.jsx("input",{id:"hb-heartbeatIntervalMs",type:"text",inputMode:"numeric",className:oe("input",!!Y.heartbeatIntervalMs&&"input--error"),placeholder:String(Kt/1e3),value:k.heartbeatIntervalMs??"",onChange:i=>yt("heartbeatIntervalMs",i.target.value)}),Y.heartbeatIntervalMs?e.jsx("span",{className:"config-error",children:Y.heartbeatIntervalMs}):e.jsx("span",{className:"config-hint",children:n("agents.heartbeatIntervalHint","How often heartbeats are checked. Leave empty for system default ({{seconds}}s / {{label}}).",{seconds:Kt/1e3,label:gn})})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"hb-heartbeatTimeoutMs",children:n("agents.heartbeatTimeoutLabel","Heartbeat Timeout (s)")}),e.jsx("input",{id:"hb-heartbeatTimeoutMs",type:"text",inputMode:"numeric",className:oe("input",!!Y.heartbeatTimeoutMs&&"input--error"),placeholder:"60",value:k.heartbeatTimeoutMs??"",onChange:i=>yt("heartbeatTimeoutMs",i.target.value)}),Y.heartbeatTimeoutMs?e.jsx("span",{className:"config-error",children:Y.heartbeatTimeoutMs}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.maxConcurrentRunsLabel","Max Concurrent Runs")}),e.jsx("input",{id:"hb-maxConcurrentRuns",type:"text",inputMode:"numeric",className:oe("input",!!Y.maxConcurrentRuns&&"input--error"),placeholder:"1",value:k.maxConcurrentRuns??"",onChange:i=>yt("maxConcurrentRuns",i.target.value)}),Y.maxConcurrentRuns?e.jsx("span",{className:"config-error",children:Y.maxConcurrentRuns}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.messageResponseModeLabel","Message Response Mode")}),e.jsxs("select",{id:"hb-messageResponseMode",className:oe("select",!!Y.messageResponseMode&&"input--error"),value:k.messageResponseMode??"",onChange:i=>yt("messageResponseMode",i.target.value),children:[e.jsx("option",{value:"",children:n("agents.systemDefaultOnHeartbeat","System Default (On Heartbeat)")}),e.jsx("option",{value:"on-heartbeat",children:n("agents.onHeartbeat","On Heartbeat")}),e.jsx("option",{value:"immediate",children:n("agents.immediate","Immediate")})]}),Y.messageResponseMode?e.jsx("span",{className:"config-error",children:Y.messageResponseMode}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.budgetSettingsTitle","Budget Settings")}),e.jsx("p",{className:"config-description",children:n("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:n("agents.tokenBudgetLabel","Token Budget")}),e.jsx("input",{id:"budget-tokenBudget",type:"text",inputMode:"numeric",className:oe("input",!!Y.tokenBudget&&"input--error"),placeholder:n("agents.noLimit","No limit"),value:q.tokenBudget??"",onChange:i=>Nt("tokenBudget",i.target.value)}),Y.tokenBudget?e.jsx("span",{className:"config-error",children:Y.tokenBudget}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.usageThresholdLabel","Usage Threshold (%)")}),e.jsx("input",{id:"budget-usageThreshold",type:"text",inputMode:"numeric",className:oe("input",!!Y.usageThreshold&&"input--error"),placeholder:"80",value:q.usageThreshold??"",onChange:i=>Nt("usageThreshold",i.target.value)}),Y.usageThreshold?e.jsx("span",{className:"config-error",children:Y.usageThreshold}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.budgetPeriodLabel","Budget Period")}),e.jsxs("select",{id:"budget-budgetPeriod",className:oe("select",!!Y.budgetPeriod&&"input--error"),value:q.budgetPeriod??"",onChange:i=>Nt("budgetPeriod",i.target.value),children:[e.jsx("option",{value:"",children:n("agents.noReset","No reset (lifetime)")}),e.jsx("option",{value:"daily",children:n("agents.daily","Daily")}),e.jsx("option",{value:"weekly",children:n("agents.weekly","Weekly")}),e.jsx("option",{value:"monthly",children:n("agents.monthly","Monthly")})]}),Y.budgetPeriod?e.jsx("span",{className:"config-error",children:Y.budgetPeriod}):e.jsx("span",{className:"config-hint",children:n("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:n("agents.resetDayLabel","Reset Day")}),e.jsx("input",{id:"budget-resetDay",type:"text",inputMode:"numeric",className:oe("input",!!Y.resetDay&&"input--error"),placeholder:n("agents.auto","Auto"),value:q.resetDay??"",onChange:i=>Nt("resetDay",i.target.value)}),Y.resetDay?e.jsx("span",{className:"config-error",children:Y.resetDay}):e.jsx("span",{className:"config-hint",children:q.budgetPeriod==="weekly"?n("agents.resetDayWeekly","Day of week (0=Sunday to 6=Saturday) for reset."):q.budgetPeriod==="monthly"?n("agents.resetDayMonthly","Day of month (1-31) for reset."):n("agents.resetDayHint","Day for reset (weekly: 0-6, monthly: 1-31). Leave empty for automatic.")})]}),Ue?.budgetLimit!=null&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{children:n("agents.currentUsage","Current Usage")}),e.jsxs("div",{className:"budget-progress-container",children:[e.jsx("div",{className:"budget-progress-bar",children:e.jsx("div",{className:oe("budget-progress-bar__fill",(Ue.usagePercent??0)>=100?"budget-progress-bar__fill--red":(Ue.usagePercent??0)>=80?"budget-progress-bar__fill--amber":"budget-progress-bar__fill--green"),style:{width:`${Math.min(Ue.usagePercent??0,100)}%`}})}),e.jsx("span",{className:"budget-progress-label",children:n("agents.budgetUsageDisplay","{{used}} / {{limit}} tokens ({{percent}}% used)",{used:(Ue.currentUsage??0).toLocaleString(),limit:(Ue.budgetLimit??0).toLocaleString(),percent:Math.round(Ue.usagePercent??0)})})]})]}),Ue?.budgetLimit!=null&&e.jsx("div",{className:"config-field",children:e.jsx("button",{className:"btn btn-reset-budget",onClick:()=>void Js(),disabled:Xt,children:Xt?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:14,className:"animate-spin"}),n("agents.resetting","Resetting…")]}):e.jsxs(e.Fragment,{children:[e.jsx(At,{size:14}),n("agents.resetBudgetUsage","Reset Budget Usage")]})})})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.bundleTitle","Instruction Bundle")}),e.jsx("p",{className:"config-description",children:n("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:n("agents.bundleModeLabel","Bundle Mode")}),e.jsxs("select",{id:"bundle-mode",className:"select",value:ue,onChange:i=>He(i.target.value),children:[e.jsx("option",{value:"",children:n("agents.bundleNone","None (use inline instructions)")}),e.jsx("option",{value:"managed",children:n("agents.bundleManaged","Managed (system-managed directory)")}),e.jsx("option",{value:"external",children:n("agents.bundleExternal","External (user-specified path)")})]}),e.jsxs("span",{className:"config-hint",children:[ue==="managed"&&n("agents.bundleManagedHint","Files will be stored in a system-managed directory within .fusion/agents/"),ue==="external"&&n("agents.bundleExternalHint","Specify an external directory path for the instruction files"),!ue&&n("agents.bundleSelectMode","Select a mode to enable instruction bundling")]})]}),ue&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-entry-file",children:n("agents.bundleEntryFileLabel","Entry File")}),e.jsx("input",{id:"bundle-entry-file",type:"text",className:"input",placeholder:"AGENTS.md",value:me,onChange:i=>Be(i.target.value)}),e.jsx("span",{className:"config-hint",children:n("agents.bundleEntryFileHint","Primary instructions file name (default: AGENTS.md)")})]}),ue==="external"&&e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-external-path",children:n("agents.bundleExternalPathLabel","External Path")}),e.jsx("input",{id:"bundle-external-path",type:"text",className:"input",placeholder:n("agents.bundleExternalPathPlaceholder","e.g. .fusion/agents/my-agent"),value:ze,onChange:i=>Oe(i.target.value)}),e.jsx("span",{className:"config-hint",children:n("agents.bundleExternalPathHint","Absolute or relative path to the external directory")})]}),e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:"bundle-files",children:n("agents.bundleFilesLabel","Files (comma-separated)")}),e.jsx("input",{id:"bundle-files",type:"text",className:"input",placeholder:"AGENTS.md, PROMPTS.md",value:ne.join(", "),onChange:i=>ut(i.target.value.split(",").map(g=>g.trim()).filter(Boolean))}),e.jsx("span",{className:"config-hint",children:n("agents.bundleFilesHint","List of file names in the bundle directory")})]})]})]})]}),e.jsxs("div",{className:"config-section",children:[e.jsx("h3",{children:n("agents.advancedSettingsTitle","Advanced Settings")}),e.jsx("p",{className:"config-description",children:n("agents.advancedSettingsDesc","Advanced configuration options for this agent. Leave a field empty to use system defaults.")}),e.jsx("div",{className:"config-fields",children:ot.map(i=>{const g=!!Y[i.key];return e.jsxs("div",{className:"config-field",children:[e.jsx("label",{htmlFor:`adv-${i.key}`,children:i.label}),i.type==="select"?e.jsxs("select",{id:`adv-${i.key}`,className:oe("select",g&&"input--error"),value:$[i.key]??"",onChange:C=>rs(i.key,C.target.value),children:[e.jsx("option",{value:"",children:n("agents.systemDefault","System Default")}),i.options?.map(C=>e.jsx("option",{value:C.value,children:C.label},C.value))]}):e.jsx("input",{id:`adv-${i.key}`,type:"text",inputMode:i.type==="number"?"numeric":void 0,className:oe("input",g&&"input--error"),placeholder:i.placeholder,value:$[i.key]??"",onChange:C=>rs(i.key,C.target.value)}),g&&e.jsx("span",{className:"config-error",children:Y[i.key]}),!g&&i.hint&&e.jsx("span",{className:"config-hint",children:i.hint})]},i.key)})}),e.jsxs("div",{className:"config-actions",children:[e.jsx("button",{className:"btn btn-task-create",disabled:!we||Ve,onClick:()=>void Ys(),children:Ve?e.jsxs(e.Fragment,{children:[e.jsx(G,{size:16,className:"animate-spin"}),n("common.saving","Saving…")]}):e.jsxs(e.Fragment,{children:[e.jsx(fe,{size:16}),n("agents.saveSettings","Save Settings")]})}),os&&e.jsxs("span",{className:oe("config-saved-indicator",Ht&&"config-saved-indicator--error"),children:[Ve?e.jsx(G,{size:14,className:"animate-spin"}):e.jsx(fe,{size:14}),os]})]})]}),e.jsx(Mn,{agent:t,projectId:r,addToast:l,onSaved:o}),e.jsxs("div",{className:"config-section config-section--danger",children:[e.jsx("h3",{children:n("agents.dangerZone","Danger Zone")}),e.jsx("p",{className:"config-description",children:n("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:!ss||!p,onClick:()=>void p?.(),children:[e.jsx(ct,{size:16}),n("agents.deleteAgent","Delete Agent")]}),e.jsx("span",{className:"config-danger-note",children:ss?n("agents.deletionPermanent","Deletion is permanent and cannot be undone."):n("agents.deletionNotAvailable","Agent deletion is only available when state is idle or paused (current state: {{state}}).",{state:t.state})})]})})]}),e.jsx(Xa,{isOpen:P,onClose:()=>E(!1),onUseDraft:Ze,projectId:r,existingAgents:O,mode:"edit",existingAgentConfig:he})]})}function Fn({agentId:t,projectId:r,onChildClick:l}){const{t:o}=Se("app"),[s,p]=a.useState([]),[S,n]=a.useState(!0);return a.useEffect(()=>{n(!0),wa(t,r).then(p).finally(()=>n(!1))},[t,r]),S?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(G,{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(Ls,{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(f=>{const u=Qt[f.state];return e.jsxs("div",{className:"agent-tree__node agent-is-child",onClick:()=>l?.(f.id),role:"button",tabIndex:0,onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.key===" "&&j.preventDefault(),l?.(f.id))},style:{cursor:l?"pointer":"default"},children:[e.jsx("span",{className:"agent-tree__icon",children:f.icon??"🤖"}),e.jsx("span",{className:"agent-tree__name",children:f.name}),e.jsx("span",{className:"agent-tree__badge",style:{background:u?.bg??"var(--state-idle-bg)",color:u?.text??"var(--state-idle-text)",border:`1px solid ${u?.border??"var(--state-idle-border)"}`},children:f.state})]},f.id)})})})]})}export{On as AgentDetailView,et as relativeTime};
|