@runfusion/fusion 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +8264 -1823
- package/dist/client/.vite/manifest.json +277 -266
- package/dist/client/assets/AgentDetailView-CanIeYHg.css +1 -0
- package/dist/client/assets/{AgentDetailView-FUKwQxBP.js → AgentDetailView-DxV8pFHX.js} +3 -3
- package/dist/client/assets/{AgentPermissionPolicyEditor-DMDUhF1n.js → AgentPermissionPolicyEditor--YS4iMUY.js} +2 -2
- package/dist/client/assets/AgentsView-BVILQjdS.css +1 -0
- package/dist/client/assets/{AgentsView-BrQLd-yI.js → AgentsView-CTzbcvhK.js} +3 -3
- package/dist/client/assets/ChatView-COygcnyk.js +6 -0
- package/dist/client/assets/CommandCenter-CTaopaC0.css +1 -0
- package/dist/client/assets/CommandCenter-DoKX2HWm.js +56 -0
- package/dist/client/assets/DevServerView-Cyevyvqx.js +1 -0
- package/dist/client/assets/{DirectoryPicker-DTKtd8L2.css → DirectoryPicker-0rspvcMz.css} +1 -1
- package/dist/client/assets/{DirectoryPicker-BFot4CVM.js → DirectoryPicker-DBdyXEhR.js} +1 -1
- package/dist/client/assets/DocumentsView-BzSMyrns.js +1 -0
- package/dist/client/assets/{EvalsView-DAXqDqn2.js → EvalsView-ikz00o9g.js} +1 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-CZ_jbgep.css +1 -0
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B4aZ1y0n.js → ExperimentalAgentOnboardingModal-D-rzCCET.js} +10 -10
- package/dist/client/assets/GoalsView-Bfu1Oy2-.js +2 -0
- package/dist/client/assets/GoalsView-rg9VSIza.css +1 -0
- package/dist/client/assets/{InsightsView-D5fzFy-F.js → InsightsView-Cgmf5nES.js} +1 -1
- package/dist/client/assets/InsightsView-LMv1M1dU.css +1 -0
- package/dist/client/assets/MemoryView-DkEuDKQs.js +2 -0
- package/dist/client/assets/{NodesView-BA3pKMZu.js → NodesView-B_KYfS4o.js} +3 -3
- package/dist/client/assets/{PiExtensionsManager-C4I11iKm.js → PiExtensionsManager-Dz69kkKs.js} +2 -2
- package/dist/client/assets/PluginManager-DSiHizRD.css +1 -0
- package/dist/client/assets/{PluginManager-BzTzTMXZ.js → PluginManager-LHCVcduP.js} +1 -1
- package/dist/client/assets/PullRequestView-3AdbS2a1.css +1 -0
- package/dist/client/assets/{PullRequestView-11xJ565q.js → PullRequestView-DBJutLLl.js} +2 -2
- package/dist/client/assets/{ResearchView-BHiXfjzE.js → ResearchView-gpn1XcVy.js} +1 -1
- package/dist/client/assets/{SecretsView-CC5OYoCn.js → SecretsView-B7YqIowt.js} +1 -1
- package/dist/client/assets/SecretsView-Djo1rahi.css +1 -0
- package/dist/client/assets/SessionTerminal-9l4bdKcn.js +2 -0
- package/dist/client/assets/SessionTerminal-BNgtmXb3.css +1 -0
- package/dist/client/assets/SettingsModal-BGEK9_9A.js +31 -0
- package/dist/client/assets/{SettingsModal-DpAxDq6M.css → SettingsModal-CKv0TJfM.css} +1 -1
- package/dist/client/assets/SettingsModal-CXogw-Er.css +1 -0
- package/dist/client/assets/{SettingsModal-BKEbtdqR.js → SettingsModal-DIIoHGUH.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-CBfItlP6.js → SetupWizardModal-BcVeMxeX.js} +1 -1
- package/dist/client/assets/{SkillsView-DbcW87-E.js → SkillsView-BxSJ4PHL.js} +1 -1
- package/dist/client/assets/{StashRecoveryView-CH9RPtzX.js → StashRecoveryView-BhFQ2FsP.js} +1 -1
- package/dist/client/assets/{TodoView-ToviJ0SV.js → TodoView-BZpewjy0.js} +2 -2
- package/dist/client/assets/WorkflowNodeEditor-Yn1FRF2v.css +1 -0
- package/dist/client/assets/WorkflowNodeEditor-tWsgCdVt.js +8 -0
- package/dist/client/assets/{addon-fit-B4jkcKk4.js → addon-fit-SnYDEvGm.js} +1 -1
- package/dist/client/assets/{addon-unicode11-Cdne2Sj4.js → addon-unicode11-s5GoZCpi.js} +1 -1
- package/dist/client/assets/{addon-web-links-CRNLzj7m.js → addon-web-links-jjt2f_oV.js} +1 -1
- package/dist/client/assets/{addon-webgl-CeCSULF1.js → addon-webgl-Icn-RnEx.js} +1 -1
- package/dist/client/assets/{app-sEkTyT-w.js → app-BmGA0Hiz.js} +3 -3
- package/dist/client/assets/{app-BffGU_HQ.js → app-CEVYlVuJ.js} +3 -3
- package/dist/client/assets/{app-C8AHhs5N.js → app-CbBFax2C.js} +3 -3
- package/dist/client/assets/{app-B2ZxMfJT.js → app-DORKrGAz.js} +3 -3
- package/dist/client/assets/{app-Ri9Te2Dv.js → app-DQibuQ9z.js} +3 -3
- package/dist/client/assets/app-k76GrQP0.js +13 -0
- package/dist/client/assets/{createLucideIcon-BYvOGRiO.js → createLucideIcon-DmVITl5d.js} +1 -1
- package/dist/client/assets/{dashboard-view-C3SsjXo1.js → dashboard-view-B4LXCv5H.js} +4 -4
- package/dist/client/assets/{dashboard-view-DlKsVySD.js → dashboard-view-BFoyhTYF.js} +1 -1
- package/dist/client/assets/{dashboard-view-DtgLZ_LM.js → dashboard-view-Cxzm_eqc.js} +1 -1
- package/dist/client/assets/dashboard-view-_8yfNwju.css +1 -0
- package/dist/client/assets/{folder-open-BlPyIWyf.js → folder-open-33WGVnbp.js} +1 -1
- package/dist/client/assets/index-Bglw05rM.js +791 -0
- package/dist/client/assets/index-FYgnflWD.css +1 -0
- package/dist/client/assets/shield-alert-CqeGWBUK.js +6 -0
- package/dist/client/assets/{upload-B-qmm1NH.js → upload-C11J2diI.js} +1 -1
- package/dist/client/assets/{users-D6C5TXf2.js → users-a-ELbyyZ.js} +1 -1
- package/dist/client/assets/{vendor-i18n-CV0mwX_-.js → vendor-i18n-DYlSUfot.js} +1 -1
- package/dist/client/assets/vendor-react-BTgM5bbZ.js +49 -0
- package/dist/client/assets/{vendor-reactflow-CRZcPCXF.js → vendor-reactflow-ZasuEfF9.js} +3 -3
- package/dist/client/assets/{vendor-xterm-tcedd2Jt.js → vendor-xterm-ea7-K05z.js} +1 -1
- package/dist/client/assets/{x-CqNX_9E2.js → x-PItWc-wQ.js} +1 -1
- package/dist/client/assets/{zoom-out-CSTHbJgD.js → zoom-out-CzlHv0Kj.js} +1 -1
- package/dist/client/icons/icon-192.png +0 -0
- package/dist/client/icons/icon-512.png +0 -0
- package/dist/client/index.html +6 -6
- package/dist/client/sw.js +1 -1
- package/dist/client/theme-data.css +288 -285
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/droid-cli/src/__tests__/execsync-guard.test.ts +17 -0
- package/dist/droid-cli/src/__tests__/process-manager.test.ts +1 -45
- package/dist/extension.js +4946 -820
- package/dist/pi-claude-cli/index.ts +47 -8
- package/dist/pi-claude-cli/package.json +4 -1
- package/dist/pi-claude-cli/src/__tests__/acp-dispatch.test.ts +80 -0
- package/dist/pi-claude-cli/src/__tests__/acp-driver.test.ts +423 -0
- package/dist/pi-claude-cli/src/__tests__/execsync-guard.test.ts +14 -0
- package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +1 -45
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +0 -1
- package/dist/pi-claude-cli/src/acp-driver.ts +585 -0
- package/dist/pi-claude-cli/src/event-bridge.ts +7 -0
- package/dist/pi-claude-cli/src/mcp-config.ts +29 -0
- package/dist/pi-claude-cli/src/process-manager.ts +6 -38
- package/dist/plugin-sdk/index.d.ts +5181 -5144
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +263 -19
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +37 -7
- package/dist/plugins/fusion-plugin-compound-engineering/manifest.json +4 -4
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/index.test.ts +5 -1
- package/package.json +1 -1
- package/skill/fusion/references/engine-tools.md +6 -4
- package/dist/client/assets/AgentDetailView-DiWELtb1.css +0 -1
- package/dist/client/assets/AgentsView-DfznJDek.css +0 -1
- package/dist/client/assets/ChatView-Wz_0goif.js +0 -6
- package/dist/client/assets/DevServerView-DRqQpHsc.js +0 -1
- package/dist/client/assets/DocumentsView-hamhUcvL.js +0 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-BNpveCEk.css +0 -1
- package/dist/client/assets/GoalsView-2QOp9DA0.js +0 -2
- package/dist/client/assets/GoalsView-DI66UsjT.css +0 -1
- package/dist/client/assets/InsightsView-C9-mqVvf.css +0 -1
- package/dist/client/assets/MemoryView-B082KoR-.js +0 -2
- package/dist/client/assets/PluginManager-UHVLvWWl.css +0 -1
- package/dist/client/assets/PullRequestView-WQIS0zUC.css +0 -1
- package/dist/client/assets/ReliabilityView-CpELpGqw.js +0 -1
- package/dist/client/assets/ReliabilityView-eoKBhBc4.css +0 -1
- package/dist/client/assets/SecretsView-D5bHZ-wM.css +0 -1
- package/dist/client/assets/SessionTerminal-BiigPP2l.css +0 -1
- package/dist/client/assets/SessionTerminal-G70Jwkzs.js +0 -2
- package/dist/client/assets/SettingsModal-C0M1CqOu.js +0 -31
- package/dist/client/assets/SettingsModal-nF_GaeeK.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-BTu0D9c5.js +0 -8
- package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +0 -1
- package/dist/client/assets/app-CUu1sm3x.js +0 -13
- package/dist/client/assets/dashboard-view-Du53JbmQ.css +0 -1
- package/dist/client/assets/index-DqhCiU35.css +0 -1
- package/dist/client/assets/index-bZCpHtGq.js +0 -793
- package/dist/client/assets/vendor-react-D37HfzIf.js +0 -49
|
@@ -13,8 +13,8 @@ These tools are **not** part of the user-invokable extension surface. They are i
|
|
|
13
13
|
|---|---|---|---|
|
|
14
14
|
| `fn_task_create` | triage, executor, heartbeat | Create a follow-up task from within an agent run | `description` (string), `dependencies?` (string[]), `priority?` (`low` \| `normal` \| `high` \| `urgent`), `workflow_id?` (string) |
|
|
15
15
|
| `fn_task_log` | executor, heartbeat | Write significant task log entries | `message` (string), `outcome?` (string) |
|
|
16
|
-
| `fn_task_document_write` | triage, executor, heartbeat | Save/update a named task document revision | `key` (string), `content` (string), `author?` (string) |
|
|
17
|
-
| `fn_task_document_read` | triage, executor, heartbeat | Read one task document or list all | `key?` (string) |
|
|
16
|
+
| `fn_task_document_write` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Save/update a named task document revision | `key` (string), `content` (string), `author?` (string); chat/planning also require `task_id` (string) |
|
|
17
|
+
| `fn_task_document_read` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Read one task document or list all | `key?` (string); chat/planning also require `task_id` (string) |
|
|
18
18
|
| `fn_goal_list` | triage, executor, heartbeat | List goals with concise citation-ready snippets and active-goal warning details | `status?` (`active` \| `archived` \| `all`) |
|
|
19
19
|
| `fn_goal_show` | triage, executor, heartbeat | Show one goal's full detail on demand, including the full description body | `id` (string) |
|
|
20
20
|
| `fn_workflow_list` | executor | List the project's custom workflows (read-only built-ins plus user definitions) | none |
|
|
@@ -30,6 +30,8 @@ These tools are **not** part of the user-invokable extension surface. They are i
|
|
|
30
30
|
| `fn_workflow_create` | executor, chat, planning | Create a custom workflow definition from a graph IR (validated server-side). v2 IR supports step-inversion constructs: `parse-steps`, `foreach` (mode/isolation/concurrency/maxReworkCycles), `step-execute`, `step-review`, `code` nodes, `rework` edges, plus `artifacts` and custom `fields` declarations | `name` (string), `description?` (string), `ir` (object), `layout?` (object) |
|
|
31
31
|
| `fn_workflow_update` | executor, chat, planning | Update a custom workflow definition's name/description/ir/layout (built-ins cannot be edited; same step-inversion IR constructs as create; editing `fields` orphans rather than destroys existing task values) | `workflow_id` (string), `name?` (string), `description?` (string), `ir?` (object), `layout?` (object), `rehome_to?` (string) |
|
|
32
32
|
| `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) |
|
|
33
|
+
<!-- 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. -->
|
|
34
|
+
| `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`) |
|
|
33
35
|
| `fn_task_promote` | executor | Promote a held task out of a manual-release hold column (defaults to the current task) | `task_id?` (string) |
|
|
34
36
|
| `fn_trait_list` | executor, chat, planning | List the registered column trait catalog (built-in and plugin traits) | none |
|
|
35
37
|
| `fn_memory_search` | triage, executor, heartbeat | Search project memory plus per-agent layered memory snippets | `query` (string), `limit?` (number) |
|
|
@@ -68,10 +70,10 @@ Note: step-session execution (`step-session-executor.ts`) reuses executor coordi
|
|
|
68
70
|
|
|
69
71
|
| Tool | Purpose | Parameters |
|
|
70
72
|
|---|---|---|
|
|
71
|
-
| `fn_task_update` | Update a spec step status (`pending`/`in-progress`/`done`/`skipped`), task dependencies, and/or workflow-defined custom field values | `step?` (number,
|
|
73
|
+
| `fn_task_update` | Update a spec step status (`pending`/`in-progress`/`done`/`skipped`), task dependencies, and/or workflow-defined custom field values | `step?` (number, 0-indexed; matches `### Step N:` in PROMPT.md, Step 0 = Preflight), `status?` (enum), `dependencies?` (string[]), `custom_fields?` (object keyed by field id; validated against the workflow field schema, `null` clears a field) |
|
|
72
74
|
| `fn_task_add_dep` | Add a dependency to current task (confirmation-gated) | `task_id` (string), `confirm?` (boolean) |
|
|
73
75
|
| `fn_task_done` | Mark task complete and optionally store summary | `summary?` (string) |
|
|
74
|
-
| `fn_review_step` | Spawn step plan/code reviewer | `step` (number), `type` (`plan` \| `code`), `step_name` (string), `baseline?` (string) |
|
|
76
|
+
| `fn_review_step` | Spawn step plan/code reviewer | `step` (number, 0-indexed; matches `### Step N:` in PROMPT.md), `type` (`plan` \| `code`), `step_name` (string), `baseline?` (string) |
|
|
75
77
|
| `fn_spawn_agent` | Spawn child agent in separate worktree | `name` (string), `role` (enum), `task` (string) |
|
|
76
78
|
|
|
77
79
|
## Merger-only runtime tools (`merger.ts`)
|
|
@@ -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;gap: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-shrink:0;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;gap:var(--space-sm);flex:1 1 auto;min-width:0}.agent-detail-controls{display:flex;align-items:center;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;-webkit-overflow-scrolling:touch;scrollbar-width:none}.agent-detail-tabs::-webkit-scrollbar{display:none}.agent-detail-tab{display:flex;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:calc(var(--space-sm) + var(--space-xs) + var(--space-xs) * .25);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)}.config-section{background:var(--bg-secondary);border-radius:var(--radius-md);padding:calc(var(--space-md) + var(--space-sm))}.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}.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-xs);row-gap:0;padding:var(--space-sm) var(--space-md);padding-top:max(var(--space-sm),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-sm)}.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}.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:calc(var(--space-md) + var(--space-xs) * .25);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-skills,.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){.info-grid,.stats-grid{grid-template-columns:1fr}.agent-detail-actions{flex-direction:column;width:100%}.agent-detail-actions .btn{width:100%;justify-content:center}.agent-detail-actions .btn-icon{align-self:flex-end}.agent-detail-footer .divider,.agent-detail-footer .text-muted,.agent-detail-footer .link{display:none}}@media(max-width:768px){.agent-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)}.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-active);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--color-primary)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--color-primary) 15%,transparent);color:var(--color-primary)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-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(--color-primary)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-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 +0,0 @@
|
|
|
1
|
-
.agent-token-stats-panel{margin-bottom:var(--space-lg);padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);box-shadow:var(--shadow-sm)}.agent-token-stats-panel__header{margin-bottom:var(--space-md)}.agent-token-stats-panel__title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600;color:var(--text)}.agent-token-stats-panel__totals{display:grid;grid-template-columns:repeat(auto-fit,minmax(calc(var(--space-2xl) * 4),1fr));gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-token-stats-panel__total-card{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.agent-token-stats-panel__total-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8)}.agent-token-stats-panel__total-value{color:var(--text);font-size:calc(var(--space-lg) + var(--space-xs));line-height:1.2;font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__table-wrapper{overflow-x:auto}.agent-token-stats-panel__table{width:100%;border-collapse:collapse}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-sm);border-bottom:1px solid var(--border);color:var(--text);text-align:right;font-size:calc(var(--space-sm) + var(--space-xs))}.agent-token-stats-panel__table thead th{text-transform:uppercase;letter-spacing:calc(var(--space-xs) / 8);color:var(--text-muted);font-weight:600}.agent-token-stats-panel__table th:first-child,.agent-token-stats-panel__table td:first-child{text-align:left}.agent-token-stats-panel__agent-cell{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5)}.agent-token-stats-panel__agent-name{color:var(--text)}.agent-token-stats-panel__agent-id{color:var(--text-muted);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-transform:none;letter-spacing:normal}.agent-token-stats-panel__total-cell{font-family:var(--font-mono);font-weight:700}.agent-token-stats-panel__empty{padding:var(--space-md);border:1px dashed var(--border);border-radius:var(--radius-sm);color:var(--text-muted);background:color-mix(in srgb,var(--surface) 85%,transparent);font-size:calc(var(--space-sm) + var(--space-xs))}@media(max-width:768px){.agent-token-stats-panel{padding:var(--space-sm)}.agent-token-stats-panel__totals{grid-template-columns:1fr}.agent-token-stats-panel__table th,.agent-token-stats-panel__table td{padding:var(--space-xs) var(--space-sm)}}.active-agents-panel{margin-top:var(--space-xl);margin-bottom:var(--space-lg)}.active-agents-panel-header{display:flex;align-items:center;gap:var(--space-sm);font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md)}.active-agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:var(--space-md)}.live-agent-card{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-md);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:background .15s,border-color .15s}.live-agent-card:hover{background:var(--bg-hover);border-color:var(--border-strong, var(--border))}.live-agent-card:focus-visible{outline:2px solid var(--accent, var(--color-primary));outline-offset:2px}.live-agent-card-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.live-agent-card-name{display:flex;align-items:center;gap:var(--space-sm);font-weight:600;font-size:13px}.live-agent-task{font-family:var(--font-mono)}.live-agent-card-transcript{font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-muted);max-height:120px;overflow-y:auto}.live-agent-card-empty{display:flex;flex-direction:column;gap:var(--space-xs)}.live-agent-card-status{font-style:normal;font-weight:500;color:var(--text-primary);opacity:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-status-sub{font-style:italic;opacity:.6;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-footer{display:flex;align-items:center;justify-content:space-between;font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);padding-top:var(--space-sm);border-top:1px solid var(--border)}.live-agent-streaming-dot{color:var(--color-success);animation:pulse 1.5s infinite}.live-agent-card-footer-actions{display:flex;align-items:center;gap:var(--space-sm)}.live-agent-card-footer-meta{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;min-width:0}.live-agent-card-next-heartbeat{color:var(--text-muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.live-agent-card-logs-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);font-size:11px;color:var(--text-muted);background:transparent;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.live-agent-card-logs-btn:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-strong, var(--border))}@media(max-width:768px){.active-agents-grid{grid-template-columns:1fr}.live-agent-card{min-width:0;overflow:hidden}}.agents-overview-bar{border-bottom:1px solid var(--border);background:var(--surface);padding:var(--space-md) var(--space-lg);display:flex;flex-direction:column;gap:var(--space-sm)}.agents-overview-bar__toggle{width:100%;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text);padding:var(--space-sm) var(--space-md);display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast)}.agents-overview-bar__toggle:hover{background:var(--card-hover)}.agents-overview-bar__toggle:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.agents-overview-bar__title-wrap{display:inline-flex;align-items:center;gap:var(--space-xs)}.agents-overview-bar__title{font-weight:600}.agents-overview-bar__meta{font-size:calc(var(--space-sm) + var(--space-xs))}.agents-overview-bar__content{display:flex;flex-direction:column;gap:var(--space-md)}.agents-overview-bar__metrics{margin-bottom:0}.agents-overview-bar__active-panel{margin-top:0;margin-bottom:0}@media(max-width:768px){.agents-overview-bar{padding:var(--space-sm) var(--space-md)}.agents-overview-bar__toggle{min-height:calc(var(--space-2xl) + var(--space-sm))}}.agent-dialog-overlay{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(var(--space-xs));display:flex;align-items:center;justify-content:center;z-index:100;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);width:100%;max-width:calc(var(--space-xl) * 21 + var(--space-md));max-height:calc(100vh - (var(--space-xl) + var(--space-lg)));max-height:calc(100dvh - (var(--space-xl) + var(--space-lg)));display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-lg)}.agent-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-bottom:1px solid var(--border)}.agent-dialog-header-title{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .75)}.agent-dialog-body{flex:1;overflow-y:auto;padding:calc(var(--space-lg) + var(--space-xs))}.agent-dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-sm);padding:var(--space-lg) calc(var(--space-lg) + var(--space-xs));border-top:1px solid var(--border)}.agent-dialog-steps{display:flex;gap:calc(var(--space-sm) - var(--space-xs) * .5);padding:var(--space-md) calc(var(--space-lg) + var(--space-xs));justify-content:center}.agent-dialog-step{width:calc(var(--space-2xl) + var(--space-sm));height:var(--space-xs);border-radius:calc(var(--space-xs) * .5);background:var(--border);transition:background var(--transition-fast)}.agent-dialog-step.active{background:var(--todo)}.agent-dialog-step.completed{background:var(--color-success)}.agent-dialog-field{margin-bottom:var(--space-lg)}.agent-dialog-field label{display:block;font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;margin-bottom:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-field .input,.agent-dialog-field .select{width:100%;box-sizing:border-box}.agent-dialog-field--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-dialog-section{margin-bottom:var(--space-lg)}.agent-dialog-section-header{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);margin-bottom:var(--space-md);padding-bottom:var(--space-xs);border-bottom:1px solid var(--border)}.agent-dialog-step-zero-actions{display:flex;justify-content:flex-end;margin-bottom:var(--space-sm)}.agent-dialog-interview-btn{font-weight:600}.agent-dialog-interview-btn:disabled{opacity:.7;cursor:not-allowed}.agent-dialog-tabs{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-sm);margin-bottom:var(--space-lg)}.agent-dialog-tab{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);padding:var(--space-sm) var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-dialog-tab:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-dialog-tab:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-dialog-tab.active{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-dialog-tab-panel{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-runtime-mode-toggle{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-sm)}.agent-runtime-mode-option{position:relative;margin:0}.agent-runtime-mode-option input{position:absolute;opacity:0;pointer-events:none}.agent-runtime-mode-option span{display:flex;align-items:center;justify-content:center;min-height:calc(var(--space-xl) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--card);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;padding:var(--space-sm) var(--space-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}.agent-runtime-mode-option span:hover{border-color:var(--todo);color:var(--text);background:var(--card-hover)}.agent-runtime-mode-option input:focus-visible+span{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-runtime-mode-option--active span{border-color:var(--todo);color:var(--text);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-role-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 3 + var(--space-sm)),1fr));gap:var(--space-sm)}.agent-role-option{display:flex;flex-direction:column;align-items:center;padding:var(--space-md) var(--space-sm);background:var(--card);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);font-family:var(--font-primary);color:var(--text)}.agent-role-option:hover{border-color:var(--text-muted);background:var(--card-hover)}.agent-role-option:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-role-option.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent);box-shadow:var(--focus-ring)}.agent-role-option-icon{font-size:calc(var(--space-lg) + var(--space-xs));line-height:1}.agent-role-option-label{font-size:calc(var(--space-sm) + var(--space-xs));margin-top:var(--space-xs)}.agent-dialog-icon-prefix{margin-right:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-dialog-ai-generate{margin-top:var(--space-sm);border-top:1px solid var(--border);padding-top:var(--space-md)}.btn--ai-generate{width:100%;display:flex;align-items:center;justify-content:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);background:var(--cta-bg, var(--todo));color:var(--cta-text, var(--text));font-weight:600;border:1px solid transparent}.btn--ai-generate:hover{opacity:.9;filter:brightness(1.1)}.agent-dialog-ai-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75);text-align:center;margin:calc(var(--space-sm) - var(--space-xs) * .5) 0 0}.agent-dialog-summary{display:flex;flex-direction:column;gap:var(--space-sm)}.agent-dialog-summary-row{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;border-bottom:1px solid color-mix(in srgb,var(--border) 50%,transparent)}.agent-dialog-summary-row:last-child{border-bottom:none}.agent-dialog-summary-row-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-dialog-summary-row-label--fixed{flex:0 0 calc(var(--space-xl) * 4 - var(--space-xs) * 1.5)}.agent-dialog-summary-row-value{font-weight:600}.agent-dialog-summary-row-value--body{font-weight:400}.agent-dialog-summary--spaced{margin-bottom:var(--space-md)}.agent-dialog-summary-row-value--muted{font-style:italic;color:var(--text-muted)}.agent-dialog-summary-row-value--capitalize{text-transform:capitalize}.agent-dialog-summary-row--editable{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.agent-dialog-summary-row--editable .agent-dialog-summary-row-label{margin-bottom:0}.agent-dialog-summary-row--title .input{font-size:calc(var(--space-md) + var(--space-xs) * .25);line-height:var(--space-lg)}.agent-presets{margin-bottom:var(--space-lg)}.agent-presets-header{font-size:calc(var(--space-md) + var(--space-xs) * .5);font-weight:600;color:var(--text-muted);margin-bottom:var(--space-md);display:flex;align-items:center;gap:var(--space-sm)}.agent-presets-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(var(--space-xl) * 5 + var(--space-lg) + var(--space-xs)),1fr));gap:var(--space-sm);margin-bottom:var(--space-lg);max-height:calc(var(--space-xl) * 16 + var(--space-lg));overflow-y:auto}.agent-preset-card{display:flex;flex-direction:column;align-items:center;padding:var(--space-md);border:1px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast),box-shadow var(--transition-fast),transform var(--transition-fast);background:var(--bg-secondary);font-family:var(--font-primary);color:var(--text)}.agent-preset-card:hover{border-color:var(--todo);background:var(--bg-tertiary)}.agent-preset-card:focus-visible{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring-strong)}.agent-preset-card.selected{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 12%,transparent)}.agent-preset-icon{font-size:var(--space-xl);margin-bottom:var(--space-xs)}.agent-preset-name{font-size:calc(var(--space-md) + var(--space-xs) * .25);font-weight:500;text-align:center;margin-bottom:var(--space-xs)}.agent-preset-role{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);text-transform:capitalize}.agent-preset-description{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:calc(var(--space-xs) * .5)}.agent-dialog-header-sparkle{margin-right:var(--space-sm)}.agent-dialog-error-banner{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) var(--space-md);background:color-mix(in srgb,var(--color-error) 10%,transparent);border-radius:var(--radius-md);margin-bottom:var(--space-md)}.agent-dialog-textarea{resize:vertical}.agent-dialog-hint{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);margin-top:var(--space-xs);display:flex;justify-content:space-between;gap:var(--space-sm)}.agent-dialog-loading-center{display:flex;flex-direction:column;align-items:center;padding:var(--space-2xl) var(--space-lg);gap:var(--space-md)}.agent-dialog-spinner{width:var(--space-2xl);height:var(--space-2xl);border:calc(var(--space-xs) * .75) solid var(--border);border-top-color:var(--todo);border-radius:50%}.agent-dialog-loading-text{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0}.agent-dialog-expand-btn{background:none;border:none;color:var(--todo);cursor:pointer;font-size:calc(var(--space-sm) + var(--space-xs));margin-left:var(--space-sm);padding:0}.agent-dialog-expand-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);border-radius:var(--radius-sm)}.agent-generation-prompt-box{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);font-size:calc(var(--space-sm) + var(--space-xs));font-family:var(--font-mono);line-height:1.5;white-space:pre-wrap;word-break:break-word;overflow:auto;position:relative}.agent-generation-prompt-box--collapsed{max-height:calc(var(--space-xl) * 6 + var(--space-sm) + var(--space-xs) * .5);overflow:hidden}.agent-generation-prompt-fade{position:absolute;bottom:0;left:0;right:0;height:calc(var(--space-lg) + var(--space-xl));background:linear-gradient(transparent,var(--bg-secondary));pointer-events:none}.agent-dialog-required{color:var(--color-error)}.agent-dialog-optional{color:var(--text-muted);font-weight:400}.agent-dialog-error{color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:var(--space-md)}.agent-dialog-info{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin-top:0;margin-bottom:var(--space-md)}.agent-dialog-loading{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);padding:var(--space-sm) 0}.agent-dialog-field-hint{margin-top:var(--space-xs);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}@media(max-width:768px){.agent-dialog-overlay{padding:0;align-items:stretch;justify-content:stretch}.agent-dialog{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border-radius:0;border-left:0;border-right:0}.agent-dialog-header{padding:calc(var(--space-md) + env(safe-area-inset-top)) var(--space-md) var(--space-md)}.agent-dialog-footer{padding:var(--space-md) var(--space-md) calc(var(--space-md) + env(safe-area-inset-bottom))}.agent-dialog-steps{padding:var(--space-sm) var(--space-md);overflow-x:auto;flex-wrap:nowrap;flex-shrink:0}.agent-dialog-header,.agent-dialog-footer{flex-shrink:0}.agent-dialog-body{padding:var(--space-md);flex:1 1 auto;min-height:0;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.agent-dialog-summary-row--editable .input{min-height:calc(var(--space-lg) + var(--space-xl))}.agent-dialog-footer{flex-wrap:wrap;gap:var(--space-xs)}.agent-dialog-footer>.btn{flex:1 1 auto;min-width:0}.agent-dialog-step-zero-actions{justify-content:stretch}.agent-dialog-interview-btn{width:100%}.agent-presets-grid{max-height:none;overflow-y:visible}}.agent-import-skills-section{margin-top:var(--space-lg)}.agent-import-skill-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-2xl) * 6);overflow-y:auto}.agent-import-skill-item{display:flex;align-items:flex-start;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border)}.agent-import-skill-icon{flex-shrink:0}.agent-import-skill-details{display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.agent-import-skill-name{font-weight:500;color:var(--text)}.agent-import-skill-description{color:var(--text-muted)}.agent-import-empty{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);text-align:center;padding:var(--space-lg)}.agent-import-result{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-sm)}.agent-import-result-icon{color:var(--color-success);margin-bottom:var(--space-xs)}.agent-import-result-title{margin:0;font-size:calc(var(--space-md) + var(--space-xs));font-weight:600}.agent-import-result-company{color:var(--text-muted);font-size:calc(var(--space-md) + var(--space-xs) * .25);margin:0 0 var(--space-md) 0}.agent-import-result-stats{display:flex;gap:var(--space-lg);margin-bottom:var(--space-md);padding:var(--space-md);background:var(--bg-secondary);border-radius:var(--radius-md)}.agent-import-result-stat{display:flex;align-items:center;gap:var(--space-sm);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);padding:var(--space-xs) var(--space-sm)}.agent-import-result-stat--success{color:var(--color-success)}.agent-import-result-stat--skipped{color:var(--color-warning)}.agent-import-result-stat--error{color:var(--color-error)}.agent-import-result-stat--success:before,.agent-import-result-stat--skipped:before,.agent-import-result-stat--error:before{content:"";width:var(--space-sm);height:var(--space-sm);border-radius:50%;flex-shrink:0}.agent-import-result-stat--success:before{background:var(--color-success)}.agent-import-result-stat--skipped:before{background:var(--color-warning)}.agent-import-result-stat--error:before{background:var(--color-error)}.agent-import-result-agents{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left}.agent-import-result-agent{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-md) + var(--space-xs) * .25);color:var(--color-success);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-success) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-errors{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left;margin-top:var(--space-sm)}.agent-import-result-error{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--color-error);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-sm)}.agent-import-result-warnings{display:flex;flex-direction:column;gap:var(--space-xs);width:100%;text-align:left;margin-top:var(--space-sm)}.agent-import-result-warning{display:flex;align-items:flex-start;gap:calc(var(--space-sm) - var(--space-xs) * .5);font-size:calc(var(--space-sm) + var(--space-xs));color:var(--color-warning, #b8860b);padding:var(--space-xs) var(--space-sm);background:color-mix(in srgb,var(--color-warning, #b8860b) 10%,transparent);border-radius:var(--radius-sm);line-height:1.4}.agent-import-result-warning svg{flex-shrink:0;margin-top:2px}.agent-import-result-divider{align-self:stretch;height:1px;background:var(--border);margin:var(--space-md) 0}.agent-import-result-section-title{font-size:calc(var(--space-sm) + var(--space-xs));font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--space-sm) 0}.agent-import-browse{margin-bottom:var(--space-md)}.agent-import-browse-header{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-browse-search{position:relative;display:flex;align-items:center}.agent-import-browse-search-icon{position:absolute;left:var(--space-sm);color:var(--text-muted);pointer-events:none}.agent-import-browse-search-input{width:100%;padding:var(--space-sm) var(--space-sm) var(--space-sm) calc(var(--space-sm) + var(--space-lg));border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-browse-search-input:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-browse-selected{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);background:color-mix(in srgb,var(--todo) 10%,transparent);border:1px solid color-mix(in srgb,var(--todo) 30%,transparent);border-radius:var(--radius-md)}.agent-import-browse-selected-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-browse-selected-name{flex:1;font-weight:500;color:var(--todo)}.agent-import-browse-loading{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl) 0;color:var(--text-muted)}.agent-import-browse-error{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-md);background:color-mix(in srgb,var(--color-error) 8%,transparent);border-radius:var(--radius-md);color:var(--color-error);font-size:calc(var(--space-md) + var(--space-xs) * .25)}.agent-import-browse-list{display:flex;flex-direction:column;gap:var(--space-xs);max-height:calc(var(--space-xl) * 12 + var(--space-md));overflow-y:auto;border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-browse-item{display:flex;flex-direction:column;gap:calc(var(--space-xs) * .5);padding:var(--space-sm);cursor:pointer;border-bottom:1px solid var(--border);transition:background-color var(--transition-fast)}.agent-import-browse-item:last-child{border-bottom:none}.agent-import-browse-item:hover{background:var(--surface-hover)}.agent-import-browse-item:focus-visible{outline:none;background:var(--surface-hover);box-shadow:var(--focus-ring)}.agent-import-browse-item--selected{background:color-mix(in srgb,var(--todo) 10%,transparent);border-color:var(--todo)}.agent-import-browse-item-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm)}.agent-import-browse-item-name{font-weight:500;color:var(--text)}.agent-import-browse-item-installs{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);white-space:nowrap}.agent-import-browse-item-tagline{font-size:calc(var(--space-sm) + var(--space-xs));color:var(--text-muted);line-height:1.4}.agent-import-browse-item-repo{font-size:calc(var(--space-sm) + var(--space-xs) * .75);color:var(--text-muted);font-family:var(--font-mono)}.agent-import-browse-empty{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-controls-actions{display:flex;gap:var(--space-sm)}.agent-global-controls{display:flex;align-items:center;padding:var(--space-md) var(--space-lg);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-lg)}.heartbeat-multiplier-label{font-weight:500;color:var(--text);white-space:nowrap}.agent-import-dialog{max-width:calc(var(--space-xl) * 23 + var(--space-sm))}.agent-import-description{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin:0 0 var(--space-md) 0;line-height:1.5}.agent-import-description code{background:var(--surface-hover);padding:calc(var(--space-xs) * .25) var(--space-xs);border-radius:calc(var(--radius-sm) - var(--space-xs) * .25);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-file-upload{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-file-input{display:none}.agent-import-upload-btn{display:inline-flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5)}.agent-import-file-hint{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-md);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs))}.agent-import-divider:before,.agent-import-divider:after{content:"";flex:1;height:1px;background:var(--border)}.agent-import-textarea{width:100%;min-height:calc(var(--space-xl) * 5);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);color:var(--text);font-family:var(--font-mono);font-size:calc(var(--space-sm) + var(--space-xs));line-height:1.5;resize:vertical}.agent-import-textarea:focus{outline:none;border-color:var(--todo);box-shadow:var(--focus-ring)}.agent-import-company{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md)}.agent-import-company-label{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs));text-transform:uppercase;letter-spacing:.04em}.agent-import-company-name{font-weight:600;font-size:calc(var(--space-md) + var(--space-xs) * .5)}.agent-import-count{display:flex;align-items:center;gap:calc(var(--space-sm) - var(--space-xs) * .5);color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * 1.25);margin-bottom:var(--space-md)}.agent-import-selection-controls{display:flex;gap:var(--space-sm);flex-wrap:wrap;margin-bottom:var(--space-md)}.agent-import-agent-list{display:flex;flex-direction:column;gap:calc(var(--space-sm) - var(--space-xs) * .5);max-height:calc(var(--space-xl) * 11 + var(--space-lg));overflow-y:auto}.agent-import-agent-item{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.agent-import-agent-icon{font-size:calc(var(--space-md) + var(--space-xs) * 1.5);line-height:1;flex-shrink:0}.agent-import-agent-details{display:flex;flex-direction:column;min-width:0}.agent-import-agent-name{font-weight:500;font-size:calc(var(--space-sm) + var(--space-xs) * 1.25)}.agent-import-agent-meta{color:var(--text-muted);font-size:calc(var(--space-sm) + var(--space-xs) * .75)}.agent-import-agent-title{color:var(--text-muted)}.agent-import-agent-role{text-transform:capitalize}.agent-import-agent-model{color:var(--text-muted)}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r as s,b as Kn,j as t,R as Gn}from"./vendor-react-D37HfzIf.js";import{c as Vn,a9 as Ws,a7 as qs,bf as Xs,bg as xs,aG as Ot,bh as Ys,ac as Js,bi as ms,t as Wn,bj as qn,bk as vt,bl as Qs,bm as Xn,bn as Lt,w as Yn,bo as Jn,bp as Qn,bq as Zn,br as ea,bs as ta,bt as sa,aW as na,bu as aa,bv as ra,s as oa,bw as ia,j as ca,k as bn,bx as vn,by as la,bz as da,bA as ua,bB as xn,bC as ma,bD as ha,bE as fa,p as ga,bF as pa,bG as ba,bH as va,bI as xa,ah as wn,ai as yn,bJ as wa,bK as ya,S as Ca,U as hs,P as wt,J as xt,aw as Sa,bL as Zs,a as _t,bM as en,bN as tn,bO as sn,B as yt,ae as ka,af as Na,b4 as Bt,bP as nn,bQ as ja,T as Ma,bR as Ra,bS as Aa,b1 as Ta,au as an,m as Ea,bT as rn}from"./index-bZCpHtGq.js";import{u as Ct}from"./vendor-i18n-CV0mwX_-.js";import{SessionTerminal as on}from"./SessionTerminal-G70Jwkzs.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.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 Ia=[["path",{d:"M5 3h14",key:"7usisc"}],["path",{d:"m18 13-6-6-6 6",key:"1kf1n9"}],["path",{d:"M12 7v14",key:"1akyts"}]],Pa=Vn("arrow-up-to-line",Ia),fs="kb-chat-active-session";function cn(n){const r=typeof n=="string"?n.trim():"",u=r.indexOf("/");return!r||u<=0||u>=r.length-1?{}:{modelProvider:r.slice(0,u),modelId:r.slice(u+1)}}function Da(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const u=r.map(o=>{if(!o||typeof o!="object")return null;const i=o,p=typeof i.toolName=="string"?i.toolName:"";if(!p)return null;const v=i.args;return{toolName:p,...v&&typeof v=="object"?{args:v}:{},isError:!!i.isError,result:i.result,status:"completed"}}).filter(o=>o!==null);return u.length>0?u:void 0}function $a(n){const r=n?.fallback;if(!r||typeof r!="object")return;const u=r,o=typeof u.primaryModel=="string"?u.primaryModel:"",i=typeof u.fallbackModel=="string"?u.fallbackModel:"",p=u.triggerPoint;if(!(!o||!i||p!=="session-creation"&&p!=="prompt-time"))return{primaryModel:o,fallbackModel:i,triggerPoint:p}}function Fa(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const u=r,o=typeof u.summary=="string"?u.summary.trim():"";if(!o)return;const i=(()=>{const p=u.reference;if(!p||typeof p!="object")return;const v=p,g=typeof v.kind=="string"?v.kind.trim():"",k=typeof v.id=="string"?v.id.trim():"";if(!(!g||!k))return{kind:g,id:k,...typeof v.label=="string"&&v.label.trim()?{label:v.label.trim()}:{}}})();return{summary:o,...typeof u.errorClass=="string"&&u.errorClass.trim()?{errorClass:u.errorClass.trim()}:{},...typeof u.code=="string"&&u.code.trim()?{code:u.code.trim()}:{},...typeof u.detail=="string"&&u.detail.trim()?{detail:u.detail.trim()}:{},...i?{reference:i}:{}}}function ln(n,r){const u="Failed to get response";return typeof n=="string"?{summary:n.trim()||u}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():u,...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function gs(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:Da(n.metadata),fallbackInfo:$a(n.metadata),failureInfo:Fa(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function La(n,r){const u=s.useCallback(l=>l?`${Ws.CHAT_SESSIONS_PREFIX}${l}`:null,[]),o=s.useCallback((l,f)=>l&&f?`${Ws.CHAT_MESSAGES_PREFIX}${l}:${f}`:null,[]),i=s.useCallback(l=>{const f=u(l);return f?qs(f,{maxAgeMs:Xs})??[]:[]},[u]),[p,v]=s.useState(()=>i(n)),[g,k]=s.useState(null),[z,H]=s.useState(()=>i(n).length===0),[W,w]=s.useState([]),[U,_]=s.useState(!1),[M,R]=s.useState(!1),[q,N]=s.useState(""),[te,j]=s.useState(""),[ee,S]=s.useState([]),[ne,V]=s.useState(""),[X,ke]=s.useState(""),[ae,m]=s.useState(!1),{agentsMap:b}=xs(n),y=s.useRef(null),d=s.useRef(null),ye=s.useRef(!1),J=s.useRef(""),D=s.useRef(null),Ce=s.useRef(p),$=s.useRef(g),je=s.useRef(W),Y=s.useRef(M);Ce.current=p,$.current=g,je.current=W,Y.current=M,s.useEffect(()=>{J.current=ne},[ne]);const Me=s.useRef(new Set),Fe=s.useRef(0),Le=s.useRef(n);Le.current!==n&&(Ot({view:"useChat",trigger:"project-context-change",projectId:n,replayAttempted:!1,detail:{previousProjectId:Le.current??null}}),Le.current=n,Fe.current++);const he=s.useCallback(async()=>{Ce.current.length===0&&H(!0);try{const f=[...(await Ys(n)).sessions].sort((A,G)=>new Date(G.updatedAt).getTime()-new Date(A.updatedAt).getTime());v(f);const x=u(n);x&&Js(x,f,{maxBytes:5e5})}catch{const l=i(n);if(Ce.current.length===0&&l.length===0){const f=u(n);f&&ms(f)}}finally{H(!1)}},[u,n]);s.useEffect(()=>{const l=i(n);v(l),H(l.length===0)},[n,i]),s.useEffect(()=>{he()},[he,n]);const be=s.useRef(()=>{}),ve=s.useRef(!1);s.useEffect(()=>{ve.current=!1,d.current=null},[n]),s.useEffect(()=>{if(z||ve.current||$.current)return;const l=Wn(fs,n);if(!l){ve.current=!0;return}const f=p.find(x=>x.id===l);if(f){ve.current=!0,be.current(l,f);return}ve.current=!0},[z,p,n]);const _e=s.useCallback((l,f)=>{const x=o(l,f);return x?qs(x,{maxAgeMs:Xs})??[]:[]},[o]),St=s.useCallback(l=>{const f=_e(n,l);return f.length>0?(w(f),_(!1),!0):(w([]),!1)},[n,_e]),re=s.useCallback(async(l,f)=>{const x=typeof f?.offset=="number"&&f.offset>0||typeof f?.before=="string",A=o(n,l),G=x?[]:_e(n,l),T=G.length>0;!x&&T?(w(G),_(!1)):_(!0);try{const O=await qn(l,{limit:50,order:"desc",...f},n),B=O.messages.slice().reverse().map(gs);x?$.current?.id===l&&(w(P=>[...B,...P]),m(O.messages.length>=50)):$.current?.id===l&&(w(B),m(O.messages.length>=50),A&&Js(A,B,{maxBytes:5e5}))}catch{!x&&je.current.length===0&&T&&(w(G),_(!1))}finally{_(!1)}},[o,n,_e]),We=s.useCallback(()=>{D.current?.(),D.current=null,J.current="",V(""),N(""),j(""),S([]),R(!1)},[]),Se=s.useCallback(()=>{vt($.current?.id),J.current="",V("")},[]),se=s.useCallback(()=>{const l=J.current.trim();l&&(vt($.current?.id),J.current="",V(""),qe.current(l))},[]),oe=s.useCallback((l,f,x)=>{if(y.current||!l)return!0;ye.current=!1,f&&(N(f.streamingText),j(f.streamingThinking),S(f.toolCalls)),R(!0);const{handlers:A}=Qs({sessionId:l,tempUserMessageId:"",setStreamingText:N,setStreamingThinking:j,setStreamingToolCalls:S,cancelStreamingFlushesRef:D,addToast:x?.silent?void 0:r,onFallbackSession:(T,O)=>{const B=cn(T.fallbackModel);v(P=>P.map(K=>K.id===O?{...K,...B}:K)),k(P=>P&&P.id===O?{...P,...B}:P)},onDone:()=>{N(""),j(""),S([]),R(!1),Y.current=!1,y.current=null,d.current=null,re(l),se()},onError:T=>{N(""),j(""),S([]),R(!1),Y.current=!1,y.current=null,d.current=null;const O=ln(T);x?.silent||r?.(O.summary,"error"),re(l),se()}});Ot({view:"useChat",trigger:"sse-open",projectId:n,replayAttempted:typeof f?.replayFromEventId=="number",replayFromEventId:f?.replayFromEventId??null,lastEventId:f?.replayFromEventId??null});const G=Xn(l,A,n,{...typeof f?.replayFromEventId=="number"?{lastEventId:f.replayFromEventId}:{}});return y.current=G,d.current={sessionId:l,replayFromEventId:typeof f?.replayFromEventId=="number"?f.replayFromEventId:null},!0},[r,re,n,se]),ze=s.useCallback((l,f)=>{const x=$.current?.id??null;if(l&&x===l&&!f)return;y.current&&(y.current.close(),y.current=null),d.current=null;const A=f??p.find(G=>G.id===l);k(A||null),l&&Lt(l,n).then(({session:G})=>{!G.isGenerating||!G.inFlightGeneration||k(T=>!T||T.id!==l?T:{...T,...G})}).catch(()=>{}),We(),m(!1),l?(St(l),re(l)):w([]),A?.isGenerating&&oe(A.id,A.inFlightGeneration),l?Yn(fs,l,n):Jn(fs,n)},[oe,St,p,re,n,We]);be.current=ze,s.useEffect(()=>{const l=g?.id;if(!l)return;const f=Qn(l);if(!f)return;J.current=f,V(f);let x=!1;return Lt(l,n).then(({session:A})=>{if(!(x||$.current?.id!==l||J.current.trim().length===0)){if(A.isGenerating){y.current||oe(l,A.inFlightGeneration);return}!Y.current&&!y.current&&se()}}).catch(()=>{}),()=>{x=!0}},[g?.id,oe,se,n]);const it=s.useCallback(async l=>{const f=$.current?.id,x=await Zn(l,n);y.current&&(y.current.close(),y.current=null),d.current=null;const A={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return v(G=>G.some(T=>T.id===A.id)?G:[A,...G]),vt(f),We(),ze(A.id,A),A},[n,We,ze]),Kt=s.useCallback(async l=>{vt(l),await ea(l,{status:"archived"},n),v(f=>f.filter(x=>x.id!==l)),g?.id===l&&(d.current=null,k(null),w([]))},[g,n]),He=s.useCallback(async l=>{vt(l),g?.id===l&&y.current&&(y.current.close(),y.current=null),g?.id===l&&(d.current=null),await ta(l,n);const f=o(n,l);f&&ms(f),v(x=>x.filter(A=>A.id!==l)),g?.id===l&&(k(null),w([]))},[g,o,n]),Ue=s.useCallback(async()=>{if(!g||!ae)return;const l=je.current[0]?.createdAt;l&&await re(g.id,{before:l})},[g,ae,re]),ct=s.useCallback(()=>{g&&(ye.current=!0,D.current?.(),D.current=null,y.current?.close(),y.current=null,d.current=null,sa(g.id,n).catch(()=>{}),R(!1),Y.current=!1,N(""),j(""),S([]),se())},[g,n,se]),qe=s.useRef(()=>{}),Xe=na(),Oe=s.useCallback(async l=>{try{await he();const f=await Lt(l,n);$.current?.id===l&&k(x=>!x||x.id!==l?x:{...x,...f.session}),f.session.isGenerating?(N(""),j(""),S([]),R(!0),Y.current=!0,oe(l,f.session.inFlightGeneration,{silent:!0})):(N(""),j(""),S([]),R(!1),Y.current=!1,await re(l))}catch{}},[oe,re,n,he]),Re=s.useCallback((l,f)=>{if(!g)return;if(Y.current){J.current=l,V(l),aa(g.id,l);return}ye.current=!1,y.current&&(y.current.close(),y.current=null),d.current=null;const x=`temp-${Date.now()}`,A={id:x,sessionId:g.id,role:"user",content:l,createdAt:new Date().toISOString()};w(T=>[...T,A]),N(""),j(""),S([]),R(!0);const{handlers:G}=Qs({sessionId:g.id,tempUserMessageId:x,setStreamingText:N,setStreamingThinking:j,setStreamingToolCalls:S,cancelStreamingFlushesRef:D,addToast:r,onFallbackSession:(T,O)=>{const B=cn(T.fallbackModel);v(P=>P.map(K=>K.id===O?{...K,...B}:K)),k(P=>P&&P.id===O?{...P,...B}:P)},onDone:({messageId:T,message:O,accumulated:B})=>{const P=O?{...gs(O),...B.text.length>0?{content:B.text}:{}}:{id:T||`msg-${Date.now()}`,sessionId:g.id,role:"assistant",content:B.text,thinkingOutput:B.thinking,toolCalls:B.toolCalls.length>0?B.toolCalls:void 0,fallbackInfo:B.fallbackInfo,createdAt:new Date().toISOString()};Me.current.add(P.id),w(K=>[...K,P]),N(""),j(""),S([]),R(!1),Y.current=!1,y.current=null,d.current=null,setTimeout(()=>{Me.current.delete(P.id)},1e3),he(),se()},onError:(T,O)=>{const B=ln(T),P=typeof T=="string"?T:B.summary,K=ia(P);w(Q=>{const F=Q.filter(Z=>Z.id!==O);return K?F:[...F,{id:`error-${Date.now()}`,sessionId:g.id,role:"assistant",content:B.summary,failureInfo:B,createdAt:new Date().toISOString()}]}),N(""),j(""),S([]),R(!1),Y.current=!1,y.current=null,d.current=null,console.error("[useChat] Stream error:",T),K?(console.info("[useChat] Suppressed tab-suspension stream error:",T),g?.id&&(N(""),j(""),S([]),R(!0),Y.current=!0,Oe(g.id))):(r?.(B.summary,"error"),he()),ye.current||se()}});y.current=ra(g.id,l,G,f,n)},[g,n,he,r,oe,Oe,se]);qe.current=Re;const Be=X?p.filter(l=>l.title?.toLowerCase().includes(X.toLowerCase())||l.agentId.toLowerCase().includes(X.toLowerCase())):p;return s.useEffect(()=>{if(!g?.id||g.isGenerating!==!0||y.current)return;const l=typeof g.inFlightGeneration?.replayFromEventId=="number"?g.inFlightGeneration.replayFromEventId:null,f=d.current;f?.sessionId===g.id&&f.replayFromEventId===l||oe(g.id,g.inFlightGeneration,{silent:!0})},[g?.id,g?.isGenerating,g?.inFlightGeneration,oe]),s.useEffect(()=>{if(!$.current?.isGenerating||(y.current||oe($.current.id,$.current.inFlightGeneration),!Y.current||y.current||!$.current))return;const l=setInterval(async()=>{if(!Y.current||y.current||!$.current){clearInterval(l);return}try{(await Ys(n)).sessions.find(A=>A.id===$.current?.id)?.isGenerating||(clearInterval(l),await re($.current.id),N(""),j(""),S([]),R(!1),Y.current=!1,se())}catch{}},3e3);return()=>clearInterval(l)},[oe,re,n,g,se]),s.useEffect(()=>Xe.onBecameVisible(()=>{const f=$.current;if(!f||y.current)return;const x=Fe.current;Lt(f.id,n).then(A=>{if(!(Fe.current!==x||y.current)){if(A.session.isGenerating){N(""),j(""),S([]),R(!0),Y.current=!0,oe(f.id,A.session.inFlightGeneration,{silent:!0});return}Y.current&&(N(""),j(""),S([]),R(!1),Y.current=!1,se(),re(f.id))}}).catch(()=>{})}),[oe,re,n,Xe,se]),s.useEffect(()=>{const l=Fe.current,f=n?`?projectId=${encodeURIComponent(n)}`:"",x=()=>Fe.current!==l,A=K=>{if(x())return;const Q=JSON.parse(K.data);v(F=>F.some(Z=>Z.id===Q.id)?F:[Q,...F])},G=K=>{if(x())return;const Q=JSON.parse(K.data);v(F=>[...F.map(le=>le.id===Q.id?Q:le)]),$.current?.id===Q.id&&(k(Q),Q.isGenerating&&!y.current&&oe(Q.id,Q.inFlightGeneration))},T=K=>{if(x())return;const{id:Q}=JSON.parse(K.data);v(Z=>Z.filter(le=>le.id!==Q));const F=o(n,Q);F&&ms(F),$.current?.id===Q&&(k(null),w([]))},O=K=>{if(x())return;const Q=JSON.parse(K.data),F=gs(Q);if(!Me.current.has(F.id)){if($.current?.id===F.sessionId&&Y.current&&!y.current&&F.role==="assistant"){w(Z=>Z.some(le=>le.id===F.id)?Z:[...Z,F]),N(""),j(""),S([]),R(!1),Y.current=!1,se();return}$.current?.id===F.sessionId&&!Y.current&&w(Z=>{if(Z.some(le=>le.id===F.id))return Z;if(F.role==="user"){const le=Z.findIndex(fe=>fe.role==="user"&&fe.id.startsWith("temp-")&&fe.content.trim()===F.content.trim());if(le>=0){const fe=[...Z];return fe[le]=F,fe}}return[...Z,F]})}},B=K=>{if(x())return;const{id:Q}=JSON.parse(K.data);w(F=>F.filter(Z=>Z.id!==Q))};return oa(`/api/events${f}`,{events:{"chat:session:created":A,"chat:session:updated":G,"chat:session:deleted":T,"chat:message:added":O,"chat:message:deleted":B}})},[oe,o,n,se]),s.useEffect(()=>()=>{y.current&&(y.current.close(),y.current=null),d.current=null},[]),{sessions:p,activeSession:g,sessionsLoading:z,messages:W,messagesLoading:U,isStreaming:M,streamingText:q,streamingThinking:te,streamingToolCalls:ee,pendingMessage:ne,selectSession:ze,createSession:it,archiveSession:Kt,deleteSession:He,sendMessage:Re,stopStreaming:ct,clearPendingMessage:Se,loadMoreMessages:Ue,hasMoreMessages:ae,searchQuery:X,setSearchQuery:ke,filteredSessions:Be,refreshSessions:he,agentsMap:b}}function _a(n,r=[],u){const o=n.trim().replace(/^#/,""),i=(v,g)=>u?u(v,g):g;if(!o)return{ok:!1,error:i("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(o))return{ok:!1,error:i("createRoom.lowercase","Use lowercase letters only.")};const p=o.toLowerCase();return p.length>80?{ok:!1,error:i("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(p)?/^[-_]|[-_]$/.test(p)?{ok:!1,error:i("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(v=>v.toLowerCase()===p)?{ok:!1,error:i("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:p}:{ok:!1,error:i("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function za({isOpen:n,onClose:r,onCreate:u,projectId:o,existingRoomNames:i=[]}){const{t:p}=Ct("app"),[v,g]=s.useState(""),[k,z]=s.useState([]),[H,W]=s.useState(""),[w,U]=s.useState([]),[_,M]=s.useState(!1),[R,q]=s.useState(null),[N,te]=s.useState(!1),j=s.useRef(null),ee=s.useRef(null);s.useEffect(()=>{n&&(ee.current=document.activeElement instanceof HTMLElement?document.activeElement:null,M(!0),q(null),ca(void 0,o).then(m=>z(m)).catch(()=>{z([]),q(p("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>M(!1)))},[n,o]),s.useEffect(()=>{if(!n){g(""),W(""),U([]),q(null),te(!1);return}const m=window.requestAnimationFrame(()=>j.current?.focus());return()=>window.cancelAnimationFrame(m)},[n]),s.useEffect(()=>{if(!n)return;const m=b=>{b.key==="Escape"&&r()};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[n,r]),s.useEffect(()=>{n||ee.current?.focus()},[n]);const S=s.useMemo(()=>_a(v,i,p),[v,i,p]),ne=s.useMemo(()=>{const m=H.trim().toLowerCase();return m?k.filter(b=>b.name.toLowerCase().includes(m)):k},[k,H]),V=s.useMemo(()=>k.filter(m=>w.includes(m.id)),[k,w]),X=S.ok&&w.length>0&&!N&&!_;if(!n)return null;const ke=m=>{N||U(b=>b.includes(m)?b.filter(y=>y!==m):[...b,m])},ae=async()=>{if(!S.ok){q(S.error);return}if(w.length===0){q(p("createRoom.selectMember","Select at least one member."));return}q(null),te(!0);try{await u({name:S.name,displayName:`#${S.name}`,memberAgentIds:w}),r()}catch(m){q(m instanceof Error?m.message:p("createRoom.failedCreate","Failed to create room."))}finally{te(!1)}};return Kn.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:m=>m.target===m.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":p("createRoom.title","Create room"),onClick:m=>m.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:p("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":p("actions.close","Close"),onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:p("createRoom.nameLabel","Room name")}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:j,id:"create-room-name",className:"input",value:v,disabled:N,onChange:m=>{const b=m.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();g(b)}})]}),!S.ok&&t.jsx("div",{className:"form-error",children:S.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:p("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:p("createRoom.searchAgents","Search agents"),value:H,disabled:N,onChange:m=>W(m.target.value)})]}),V.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:V.map(m=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>ke(m.id),disabled:N,children:[m.name," ×"]},m.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:_?t.jsx("div",{className:"create-room-modal-empty",children:p("createRoom.loadingAgents","Loading agents...")}):ne.length===0?t.jsx("div",{className:"create-room-modal-empty",children:k.length===0?p("createRoom.noAgents","No agents in this project yet."):p("createRoom.noMatch","No agents match your search.")}):ne.map(m=>{const b=w.includes(m.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${b?" create-room-modal-member-row--selected":""}`,onClick:()=>ke(m.id),disabled:N,children:[t.jsx(bn,{agent:m,size:20}),t.jsx("span",{children:m.name}),t.jsx("span",{className:"create-room-modal-member-role",children:m.role})]},m.id)})}),R&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:R})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:N,children:p("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void ae(),disabled:!X,children:N?p("createRoom.creating","Creating..."):p("createRoom.create","Create room")})]})]})}),document.body)}function Ha({cliSessionId:n,tier:r,projectId:u,renderTranscript:o,renderComposer:i,queuedCount:p=0,terminalProps:v}){const{t:g}=Ct("app"),k=r==="generic",[z,H]=s.useState(k?"terminal":"transcript");if(k)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(on,{sessionId:n,projectId:u,...v})});const W=z==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":z,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":g("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!W,className:`cli-chat-surface__tab${W?"":" is-active"}`,onClick:()=>H("transcript"),children:[t.jsx(vn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:g("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":W,className:`cli-chat-surface__tab${W?" is-active":""}`,onClick:()=>H("terminal"),children:[t.jsx(la,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:g("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:W?t.jsx(on,{sessionId:n,projectId:u,...v}):o()}),!W&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[p>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:g("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:p})}),i()]})]})}const ws=640,Ua=200,dn="__SKIP__";let ps=!1;function Oa(n,r=ws){return n>r?"auto":"hidden"}function Ba(n,r=ws){return Math.max(40,Math.min(n,r))}function Cn(n,r){const u=new Date(n),i=new Date().getTime()-u.getTime(),p=Math.floor(i/1e3),v=Math.floor(p/60),g=Math.floor(v/60),k=Math.floor(g/24);return p<60?r("chat.relativeTimeJustNow","just now"):v<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:v}):g<24?r("chat.relativeTimeHours","{{count}}h ago",{count:g}):k<7?r("chat.relativeTimeDays","{{count}}d ago",{count:k}):u.toLocaleDateString()}function un(n,r){if(!n||!r)return null;const u=r.toLowerCase();if(u.includes("claude")){let i=r.replace(/^claude[- ]/i,"Claude ").replace(/sonnet[- ](\d+)[- ](\d+)/i,"Sonnet $1.$2").replace(/sonnet[- ](\d+)/i,"Sonnet $1").replace(/haiku[- ](\d+)/i,"Haiku $1").replace(/opus[- ](\d+)/i,"Opus $1").replace(/sonnet/i,"Sonnet").replace(/haiku/i,"Haiku").replace(/opus/i,"Opus").replace(/-/g," ").trim();return i=i.replace(/\s+/g," "),i.length>30?i.slice(0,30)+"…":i}if(u.includes("gpt")||u.includes("openai")){const i=r.replace(/^gpt-4-turbo$/i,"GPT-4 Turbo").replace(/^gpt-4o-mini$/i,"GPT-4o Mini").replace(/^gpt-4o$/i,"GPT-4o").replace(/^gpt-4$/i,"GPT-4").replace(/^gpt-o1-preview$/i,"GPT-o1 Preview").replace(/^gpt-o1-mini$/i,"GPT-o1 Mini").replace(/^gpt-o1$/i,"GPT-o1").replace(/^gpt/i,"GPT").trim();return i.length>30?i.slice(0,30)+"…":i}if(u.includes("gemini")){const i=r.replace(/^gemini[- ]/i,"Gemini ").replace(/pro[- ](\d+)[- ](\d+)/i,"Pro $1.$2").replace(/pro[- ](\d+)/i,"Pro $1").replace(/-/g," ").replace(/\s+/g," ").trim();return i.length>30?i.slice(0,30)+"…":i}const o=r.replace(/-/g," ").replace(/^\w/,i=>i.toUpperCase()).replace(/\s+/g," ").trim();return o.length>30?o.slice(0,30)+"…":o}function Ut(n,r){return n.length<=r?n:`${n.slice(0,r)}…`}function Ka(n){if(!n)return null;const r=Object.entries(n);return r.length===0?null:r.map(([u,o])=>{const i=typeof o=="string"?o:(()=>{try{return JSON.stringify(o)}catch{return String(o)}})();return`${u}=${Ut(i,50)}`}).join(", ")}function Ga(n){if(n===void 0)return null;if(typeof n=="string")return Ut(n,200);try{return Ut(JSON.stringify(n),200)}catch{return Ut(String(n),200)}}function Va(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const r=typeof window>"u"?"/":window.location.pathname||"/",u=new URLSearchParams(typeof window>"u"?"":window.location.search);return u.set("view","mailbox"),u.set("mailbox-message",n.id),`${r}?${u.toString()}#message-${encodeURIComponent(n.id)}`}return null}function Wa(n,r){if(!n)return null;const u=n.label??`${n.kind} ${n.id}`,o=Va(n),i=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return t.jsxs("div",{className:"chat-message-failure-reference",children:[t.jsx("span",{className:"chat-message-failure-reference-label",children:r("chat.failureReferenceLabel","Reference")}),t.jsx("span",{className:"chat-message-failure-reference-value",children:u}),o?t.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:o,children:r("chat.openMailboxMessage","Open mailbox message")}):t.jsxs("details",{className:"chat-message-failure-reference-details",children:[t.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:r("chat.viewFailureDetails","View failure details")}),t.jsxs("dl",{className:"chat-message-failure-reference-meta",id:i,children:[t.jsxs("div",{children:[t.jsx("dt",{children:r("chat.failureReferenceKind","Kind")}),t.jsx("dd",{children:n.kind})]}),t.jsxs("div",{children:[t.jsx("dt",{children:r("chat.failureReferenceId","ID")}),t.jsx("dd",{children:n.id})]}),n.label&&t.jsxs("div",{children:[t.jsx("dt",{children:r("chat.failureReferenceMetaLabel","Label")}),t.jsx("dd",{children:n.label})]})]})]})]})}function Sn(n,r){if(!n||n.length===0)return null;const u=(w,U)=>{const _=w.status==="running",M=w.status==="completed"&&w.isError,R=Ka(w.args),q=Ga(w.result),N=_?R:q?`${r("chat.toolCallResultPrefix","result")}: ${q}`:R?`${r("chat.toolCallArgsPrefix","args")}: ${R}`:null,te=_?r("chat.toolCallStatusRunning","running"):M?r("chat.toolCallStatusError","error"):r("chat.toolCallStatusCompleted","completed");return t.jsxs("details",{className:`chat-tool-call${_?" chat-tool-call--running":""}${M?" chat-tool-call--error":""}`,open:_,children:[t.jsxs("summary",{children:[t.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-call-name",title:w.toolName,children:w.toolName}),N&&t.jsx("span",{className:"chat-tool-call-preview",title:N,children:N}),t.jsx("span",{className:"chat-tool-call-status-text",children:te})]}),t.jsxs("div",{className:"chat-tool-call-content",children:[R&&t.jsxs("div",{className:"chat-tool-call-row",children:[t.jsx("span",{className:"chat-tool-call-label",children:r("chat.toolCallArgsPrefix","args")}),t.jsx("span",{className:"chat-tool-call-value",children:R})]}),q&&t.jsxs("div",{className:`chat-tool-call-row${M?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:r("chat.toolCallResultPrefix","result")}),t.jsx("span",{className:"chat-tool-call-value",children:q})]})]})]},`${w.toolName}-${U}`)},o="chat-tool-calls";if(n.length===1)return t.jsxs("div",{className:o,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(rn,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:r("chat.toolCallsHeader","Tool calls")})]}),u(n[0],0)]});const i=n.filter(w=>w.status==="running").length,p=n.filter(w=>w.status==="completed"&&w.isError).length,v=i>0,g=Array.from(new Set(n.map(w=>w.toolName))),k=g.slice(0,5),z=Math.max(0,g.length-k.length),H=z>0?`${k.join(", ")}, +${z} more`:k.join(", "),W=v?`(${i} ${r("chat.toolCallStatusRunning","running")})`:p>0?`(${p} ${p===1?r("chat.toolCallStatusError","error"):r("chat.toolCallStatusErrors","errors")})`:null;return t.jsx("div",{className:o,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:v,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(rn,{size:12,"aria-hidden":"true"}),t.jsx("span",{className:"chat-tool-calls-count",children:r("chat.toolCallsCount","{{count}} tool calls",{count:n.length})}),t.jsx("span",{className:"chat-tool-calls-names",title:H,children:H}),W&&t.jsx("span",{className:"chat-tool-calls-group-status",children:W})]}),n.map((w,U)=>u(w,U))]})})}const kn={p:({children:n,...r})=>t.jsx("p",{...r,children:nn(n)}),li:({children:n,...r})=>t.jsx("li",{...r,children:nn(n)}),pre:({children:n,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:n}),code:({children:n,...r})=>{const u=typeof n=="string"?n:Gn.Children.toArray(n).join(""),o=Bt(u);return o.length===1&&typeof o[0]=="string"?t.jsx("code",{...r,children:n}):t.jsx("code",{...r,children:o})},table:({children:n,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:n})},ot="__fn_agent__",qa=280,zt=180,Ht=500,mn="fusion:chat-sidebar-width",bs="fusion:chat-scope",Xa="fusion:chat-draft:";function hn(n,r){return r?`${Xa}${n}:${r}`:null}function fn(n){if(!n)return"";try{return localStorage.getItem(n)??""}catch{return""}}const Ya=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function gn(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const u=r[1]??"",o=r[2]??"",i=r.index+u.length;return{filter:o,start:i,end:n.length}}function Ja(n,r){const u=n.slice(0,r),o=/(^|[\s\n])@([\w-]*)$/.exec(u);if(!o)return null;const i=o[2]??"",p=u.length-i.length-1;return{filter:i,start:p,end:r}}function Qa(n){const r=n?.runtimeConfig;if(!r||typeof r!="object")return null;const u=Reflect.get(r,"modelProvider"),o=Reflect.get(r,"modelId");return typeof u!="string"||u.trim().length===0||typeof o!="string"||o.trim().length===0?null:{provider:u,modelId:o}}function pn(n,r,u){if(n?.modelProvider&&n?.modelId)return{provider:n.modelProvider,modelId:n.modelId};const o=Qa(r??void 0);return o||(u.provider&&u.modelId?{provider:u.provider,modelId:u.modelId}:null)}function Za({projectId:n,defaultModel:r,onClose:u,onCreate:o}){const{t:i}=Ct("app"),[p,v]=s.useState("agent"),{agents:g,loading:k}=xs(n),[z,H]=s.useState(""),{models:W,favoriteProviders:w,favoriteModels:U,loading:_,refresh:M}=xn(),R=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[q,N]=s.useState(R),[te,j]=s.useState(w),[ee,S]=s.useState(U);s.useEffect(()=>{j(w)},[w]),s.useEffect(()=>{S(U)},[U]),s.useEffect(()=>{R&&N(m=>m||R)},[R]);const ne=s.useCallback(async m=>{const b=te,d=b.includes(m)?b.filter(ye=>ye!==m):[m,...b];j(d);try{await an({favoriteProviders:d,favoriteModels:ee}),await M()}catch{j(b)}},[te,ee,M]),V=s.useCallback(async m=>{const b=ee,d=b.includes(m)?b.filter(ye=>ye!==m):[m,...b];S(d);try{await an({favoriteProviders:te,favoriteModels:d}),await M()}catch{S(b)}},[ee,te,M]),X=q||R,ke=m=>{if(m.preventDefault(),p==="agent"){if(!z)return;o({agentId:z});return}if(!X)return;const b=X.indexOf("/");if(b<=0)return;const y=X.slice(0,b),d=X.slice(b+1);o({agentId:ot,modelProvider:y,modelId:d})},ae=p==="agent"?!z:!X;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:u,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:m=>m.stopPropagation(),children:[t.jsx("h3",{children:i("chat.newChatTitle","New Chat")}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${p==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{v("agent")},children:i("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${p==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{v("model"),H(""),N(m=>m||R)},children:i("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:ke,children:[p==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[i("chat.newChatModeAgent","Agent"),k?t.jsx("div",{className:"chat-new-dialog-loading",children:i("chat.loadingAgents","Loading agents...")}):g.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:i("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:g.map(m=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${z===m.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>H(m.id),"data-testid":`agent-option-${m.id}`,children:[t.jsx(yt,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:m.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:m.role})]},m.id))})]}),p==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:_?t.jsx("div",{className:"chat-new-dialog-loading",children:i("chat.loadingModels","Loading models...")}):t.jsx(Ea,{models:W,value:q,onChange:N,label:i("chat.newChatModeModel","Model"),placeholder:i("chat.selectModel","Select a model"),favoriteProviders:te,onToggleFavorite:ne,favoriteModels:ee,onToggleModelFavorite:V})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:u,children:i("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:ae,children:i("chat.create","Create")})]})]})]})})}const vs=s.memo(function({message:r,forcePlain:u,agentName:o,hideAssistantIdentity:i,showAssistantModelTag:p,activeModelTag:v,activeModelProvider:g,activeSessionId:k,mentionAgentsByName:z,roomContext:H,copyAction:W,onScrollToTop:w}){const{t:U}=Ct("app"),_=r.role==="assistant",M=_?r.failureInfo:void 0,R=_&&(!i||!!M),q=s.useMemo(()=>{if(_)return null;const j=r.content,ee=/@([\w-]+)/g,S=[];let ne=0,V=ee.exec(j);for(;V;){const[X,ke=""]=V,ae=V.index;ae>ne&&S.push(j.slice(ne,ae));const m=ke.replace(/_/g," ").toLowerCase(),b=z.get(m);if(b){const y=!!(H&&!H.memberIds.has(b.id)),d=y?U("chat.mentionNonMember","Not a member of {{roomName}}",{roomName:H?.roomName}):void 0;S.push(t.jsxs("span",{className:`chat-mention-chip${y?" chat-mention-chip--non-member":""}`,title:d,"aria-label":d,children:["@",b.name.replace(/\s+/g,"_")]},`${b.id}-${ae}`))}else S.push(X);ne=ae+X.length,V=ee.exec(j)}return ne<j.length&&S.push(j.slice(ne)),S.length===0?j:S},[_,r.content,z,H]),N=s.useMemo(()=>{const j=r.attachments;if(!j||j.length===0)return null;const ee=r.roomId?`/api/chat/rooms/${encodeURIComponent(r.roomId)}/attachments/`:k?`/api/chat/sessions/${encodeURIComponent(k)}/attachments/`:null;return ee?t.jsx("div",{className:"chat-message-attachments",children:j.map(S=>{const ne=S.mimeType.startsWith("image/"),V=S.id||S.filename,X=`${ee}${encodeURIComponent(S.filename)}`;return ne?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:X,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:X,alt:S.originalName})},V):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:X,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(ja,{size:14}),t.jsx("span",{children:S.originalName})]},V)})}):null},[r.attachments,r.roomId,k]),te=s.useMemo(()=>_?M?t.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[t.jsxs("div",{className:"chat-message-failure-summary-row",children:[t.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),t.jsx("span",{className:"chat-message-failure-label",children:U("chat.responseFailed","Response failed")})]}),t.jsx("div",{className:"chat-message-failure-summary",children:M.summary}),(M.errorClass||M.code)&&t.jsxs("div",{className:"chat-message-failure-badges",children:[M.errorClass&&t.jsx("span",{className:"chat-message-failure-badge",children:M.errorClass}),M.code&&t.jsx("span",{className:"chat-message-failure-badge",children:M.code})]}),(M.detail||M.reference)&&t.jsxs("details",{className:"chat-message-failure-details",children:[t.jsxs("summary",{children:[t.jsx(Ma,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:U("chat.failureDetails","Failure details")})]}),M.detail&&t.jsx("pre",{className:"chat-message-failure-detail",children:Bt(M.detail)}),Wa(M.reference,U)]})]}):u?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(wn,{remarkPlugins:[yn],components:kn,children:r.content})}):null,[M,u,_,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}${M?" chat-message--failure":""}`,"data-testid":`chat-message-${r.id}`,"data-message-id":r.id,children:[R&&t.jsxs("div",{className:"chat-message-avatar",children:[g?t.jsx(wt,{provider:g,size:"sm"}):t.jsx(yt,{size:14}),t.jsx("span",{children:o}),p&&v&&t.jsx("span",{className:"chat-model-tag",children:v})]}),_?te:t.jsx("div",{className:"chat-message-content",children:q}),_&&!M&&(W||w)&&t.jsxs("div",{className:"chat-message-actions",children:[W,w&&t.jsx("button",{type:"button",className:"btn-icon chat-message-scroll-to-top-action","aria-label":U("chat.scrollMessageToTop","Scroll message to top"),"data-testid":`chat-message-scroll-to-top-${r.id}`,onClick:()=>w(r.id),children:t.jsx(Pa,{size:14})})]}),Sn(r.toolCalls,U),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:U("chat.thinking","Thinking")}),t.jsx("pre",{className:"chat-message-thinking-content",children:Bt(r.thinkingOutput)})]}),N,t.jsx("div",{className:"chat-message-time",children:Cn(r.createdAt,U)})]})});function ir({projectId:n,addToast:r,experimentalFeatures:u}){const{t:o}=Ct("app");s.useEffect(()=>(Ot({view:"ChatView",trigger:ps?"route-active":"remount",projectId:n,replayAttempted:!1}),ps=!1,()=>{ps=!0,Ot({view:"ChatView",trigger:"route-inactive",projectId:n,replayAttempted:!1})}),[n]);const{activeSession:i,sessionsLoading:p,messages:v,messagesLoading:g,isStreaming:k,streamingText:z,streamingThinking:H,streamingToolCalls:W,selectSession:w,createSession:U,archiveSession:_,deleteSession:M,sendMessage:R,stopStreaming:q,pendingMessage:N,clearPendingMessage:te,loadMoreMessages:j,hasMoreMessages:ee,searchQuery:S,setSearchQuery:ne,filteredSessions:V,agentsMap:X}=La(n,r),[ke,ae]=s.useState(!1),m=u?.chatRooms===!0,[b,y]=s.useState(()=>{try{if(localStorage.getItem(bs)==="rooms"&&m)return"rooms"}catch{}return"direct"}),d=da(n,r),{isUnread:ye,markRead:J}=ua(n),[D,Ce]=s.useState(()=>{const e=hn(b,b==="rooms"?d.activeRoom?.id:i?.id);return fn(e)}),[$,je]=s.useState(null),[Y,Me]=s.useState(null),[Fe,Le]=s.useState(null),[he,be]=s.useState(!0),[ve,_e]=s.useState(qa),[St,re]=s.useState(!1),{agentsMap:We}=xs(n),Se=s.useMemo(()=>X.size>0?X:We,[We,X]),{defaultProvider:se,defaultModelId:oe}=xn(),ze=s.useMemo(()=>({provider:se,modelId:oe}),[oe,se]),{skills:it,loading:Kt}=ma(n),[He,Ue]=s.useState(!1),[ct,qe]=s.useState(""),[Xe,Oe]=s.useState(0),[Re,Be]=s.useState(""),[l,f]=s.useState(!1),[x,A]=s.useState(0),[G,T]=s.useState(-1),[O,B]=s.useState(!1),[P,K]=s.useState([]),[Q,F]=s.useState(!1),[Z,le]=s.useState(!1),[fe,ys]=s.useState({}),[kt,Je]=s.useState(!1),[Nt,lt]=s.useState(!1),{pushNav:Cs}=ha(),[,jt]=s.useState(!1),[Nn,jn]=s.useState({top:0,left:0}),L=fa({projectId:n}),Gt=s.useCallback(e=>{if(!e||!L.mentionActive)return;const a=e.getBoundingClientRect();jn({top:a.top-260,left:a.left+8})},[L.mentionActive]),Ss=s.useRef(null),ks=s.useRef(null),Ns=s.useRef(null),js=s.useRef(null),me=s.useRef(!1),Mt=s.useRef(null),Ms=s.useRef(null),Ke=s.useRef(null),Rt=s.useRef(0),Vt=s.useRef(null),dt=s.useRef(null),Ae=s.useRef(null),ge=s.useRef(null),Wt=s.useRef(null),At=s.useRef(!1),Te=s.useRef(null),Ee=s.useRef(null),ue=s.useRef(null),Rs=s.useRef(null),As=s.useRef([]),Qe=s.useRef(0),ut=s.useRef(new Map),qt=s.useRef(!1),Ze=s.useRef(!1),Ie=s.useRef(null),et=s.useRef(null),Tt=ga(),E=Tt==="mobile",mt=Tt==="tablet";s.useEffect(()=>{i?.id&&J("direct",i.id,i.lastMessageAt??i.updatedAt)},[i?.id,i?.lastMessageAt,i?.updatedAt,J]),s.useEffect(()=>{d.activeRoom?.id&&J("room",d.activeRoom.id,d.activeRoom.updatedAt)},[d.activeRoom?.id,d.activeRoom?.updatedAt,J]),s.useEffect(()=>{if(!i?.id||v.length===0)return;const e=v[v.length-1];J("direct",i.id,e?.createdAt??i.lastMessageAt??i.updatedAt)},[i?.id,i?.lastMessageAt,i?.updatedAt,J,v]),s.useEffect(()=>{if(!d.activeRoom?.id||d.messages.length===0)return;const e=d.messages[d.messages.length-1];J("room",d.activeRoom.id,e?.createdAt??d.activeRoom.updatedAt)},[J,d.activeRoom?.id,d.activeRoom?.updatedAt,d.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(mn);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const c=Math.max(zt,Math.min(Ht,a));_e(c)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(bs);if(e==="direct"){y("direct");return}e==="rooms"&&m&&y("rooms")}catch{}},[m]),s.useEffect(()=>{if(!m&&b==="rooms"){y("direct");return}try{localStorage.setItem(bs,b)}catch{}},[m,b]);const pe=hn(b,b==="rooms"?d.activeRoom?.id:i?.id),Xt=s.useRef(pe);s.useEffect(()=>{pe!==Xt.current&&(Xt.current=pe,Ce(fn(pe)))},[pe]),s.useEffect(()=>{if(!(!pe||Xt.current!==pe))try{if(D){localStorage.setItem(pe,D);return}localStorage.removeItem(pe)}catch{}},[pe,D]);const ie=m&&b==="rooms"&&!!d.activeRoom,{keyboardOverlap:Ts,keyboardOpen:tt}=pa({enabled:(E||mt)&&(!!i||ie),allowNonMobileViewport:mt}),ht=mt&&tt;s.useEffect(()=>{if(!mt){et.current=null;return}if(tt){be(e=>(et.current===null&&(et.current=e),e&&!1));return}if(et.current!==null){const e=et.current;et.current=null,be(e)}},[mt,tt]);const xe=s.useMemo(()=>{const e=ct.trim().toLowerCase();return(e?it.filter(c=>c.name.toLowerCase().includes(e)):it).slice(0,10)},[it,ct]),st=s.useMemo(()=>Array.from(Se.values()),[Se]),Pe=s.useMemo(()=>!m||b!=="rooms"||!d.activeRoom?null:{roomId:d.activeRoom.id,roomName:d.activeRoom.name,memberIds:new Set(d.activeRoomMembers.map(e=>e.agentId))},[m,b,d.activeRoom,d.activeRoomMembers]),Ye=s.useMemo(()=>{const e=st.filter(h=>ba(h.name,Re));if(!Pe)return e;const a=e.filter(h=>Pe.memberIds.has(h.id));if(Re.trim().length===0)return a;const c=e.filter(h=>!Pe.memberIds.has(h.id));return[...a,...c]},[st,Re,Pe]),Yt=s.useMemo(()=>{const e=new Map;for(const a of st)e.set(a.name.toLowerCase(),a);return e},[st]),Mn=s.useMemo(()=>xe.map(e=>e.id).join("\0"),[xe]);s.useEffect(()=>{Oe(0)},[Mn]),s.useEffect(()=>{A(0)},[Re,l]),s.useEffect(()=>()=>{Ae.current!==null&&window.clearTimeout(Ae.current)},[]),s.useEffect(()=>{const e=ks.current;if(!e||!ee||g)return;const a=new IntersectionObserver(c=>{c[0].isIntersecting&&j()},{threshold:.1});return a.observe(e),()=>a.disconnect()},[ee,g,j]);const nt=s.useCallback(()=>ie?d.activeRoom?.id??null:i?.id??null,[ie,d.activeRoom?.id,i?.id]),Es=s.useCallback((e,a)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(a)}"]`):e.querySelector(`.chat-message[data-message-id="${a.replace(/"/g,'\\"')}"]`),[]),Et=s.useCallback(()=>{const e=ge.current,a=nt();if(!e||!a)return;const c=e.scrollTop,h=e.querySelectorAll(".chat-message[data-message-id]"),C=Array.from(h).find(ce=>ce.offsetTop+ce.offsetHeight>=c)??h[0]??null,I=C?.getAttribute("data-message-id")??null,de=C?C.offsetTop-c:0;dt.current={threadId:a,scrollTop:c,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:I,anchorOffset:de,wasPinnedBefore:!me.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[nt]),Is=s.useCallback(()=>{const e=ge.current;if(!e)return;const c=e.scrollTop+e.clientHeight>=e.scrollHeight-50;le(!c),me.current=!c,Et()},[Et]),De=s.useCallback((e,a)=>{if(!e.isConnected||!a?.force&&me.current)return;let c=0,h=0,C=-1;const I=6,de=()=>{if(e.isConnected&&!(!a?.force&&me.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===C?h+=1:(h=0,C=e.scrollHeight),c+=1,c>=I||h>=2){le(!1),me.current=!1;return}window.requestAnimationFrame(de)}};de()},[]),ft=ie?d.messages:v;s.useLayoutEffect(()=>{const e=ge.current,a=nt(),c=dt.current;if(!e||!a||!c||c.threadId!==a||c.wasPinnedBefore)return;const h=(typeof performance<"u"?performance.now():Date.now())-c.capturedAtMs,C=e.scrollHeight>e.clientHeight,I=h>3e3,de=c.scrollTop<=0&&c.anchorOffset<=0&&C;if(!me.current||I||de){dt.current=null;return}let ce=c.scrollTop;if(c.anchorMessageId){const $e=Es(e,c.anchorMessageId);$e?ce=$e.offsetTop-c.anchorOffset:ce=c.scrollTop+(e.scrollHeight-c.scrollHeight)}else ce=c.scrollTop+(e.scrollHeight-c.scrollHeight);e.scrollTop=Math.max(0,ce),me.current=!0,le(!0),dt.current=null},[ft,nt,Es]);const Jt=s.useCallback(e=>{},[ft.length,ie]),Ne=s.useCallback(e=>{Jt(e);const a=ge.current;a&&(dt.current=null,me.current=!1,De(a))},[De,Jt]);s.useLayoutEffect(()=>{Ke.current!==null&&(window.clearTimeout(Ke.current),Ke.current=null);const e=ie?d.activeRoom?.id??null:i?.id??null;if(!e){Mt.current=null;return}const a={threadId:e,loaded:ie?!d.messagesLoading:!g,hasMessages:ie?d.messages.length>0:v.length>0},c=Mt.current,h=c?.threadId!==e,C=c?.threadId===e&&!c.loaded&&a.loaded,I=c?.threadId===e&&!c.hasMessages&&a.hasMessages;if(!(c===null||h||C||I))return;const ce=ge.current;if(ce)return Jt(h?"thread-change":C?"finished-loading":I?"first-messages":"mount"),De(ce,{force:!0}),ie||(Ke.current=window.setTimeout(()=>{if(Ke.current=null,me.current)return;const $e=ge.current;$e&&De($e)},250)),Mt.current=a,()=>{Ke.current!==null&&(window.clearTimeout(Ke.current),Ke.current=null)}},[ie,d.activeRoom?.id,d.messages.length,d.messagesLoading,i?.id,v.length,g,De]),s.useEffect(()=>{!k||me.current||Ne("streaming")},[k,z,H,Ne]),s.useEffect(()=>{const e=nt();if(!e){Rt.current=0,Vt.current=null;return}if(Vt.current!==e){Vt.current=e,Rt.current=ft.length;return}const a=Rt.current,c=ft.length,h=c>a,C=!me.current;Rt.current=c,h&&C&&Ne("new-message")},[ft,nt,Ne]),s.useEffect(()=>{Ts<=0||!ge.current||Ne("keyboard")},[Ts,Ne]),va(E&&tt),s.useLayoutEffect(()=>{if(!E||!i&&!ie||typeof window>"u")return;const e=Wt.current,a=window.visualViewport;if(!e||!a)return;const c=C=>{if(!(C instanceof HTMLElement))return!1;if(C.tagName==="TEXTAREA")return!0;if(C.tagName!=="INPUT")return!1;const I=C.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(I)},h=()=>{if(At.current){e.classList.remove("chat-thread--keyboard-active"),e.style.transform="",e.style.willChange="";return}const C=Math.max(0,window.innerHeight-a.offsetTop-a.height),I=a.offsetTop||0;e.style.setProperty("--vv-height",`${a.height}px`),e.style.setProperty("--vv-offset-top",`${I}px`),e.style.setProperty("--keyboard-overlap",`${C}px`);const de=(C>0||I>0)&&c(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",de),de&&I>0?(e.style.transform=`translateY(${I}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return h(),a.addEventListener("resize",h),a.addEventListener("scroll",h),document.addEventListener("focusin",h),document.addEventListener("focusout",h),window.addEventListener("pageshow",h),document.addEventListener("visibilitychange",h),()=>{a.removeEventListener("resize",h),a.removeEventListener("scroll",h),document.removeEventListener("focusin",h),document.removeEventListener("focusout",h),window.removeEventListener("pageshow",h),document.removeEventListener("visibilitychange",h),e.classList.remove("chat-thread--keyboard-active"),e.style.transform="",e.style.willChange=""}},[i,E,ie]),s.useEffect(()=>{const e=()=>je(null);if($)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[$]),s.useEffect(()=>{if(!E||!tt)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[E,tt]),s.useEffect(()=>{const e=Ms.current;if(Ms.current=b,b==="rooms"&&!d.activeRoom){Mt.current=null;return}if(!(b==="direct"&&(e===null||e==="rooms"))&&!(b==="rooms"&&(e===null||e==="direct")))return;const h=ge.current;h&&(De(h,{force:!0}),me.current=!1,le(!1))},[b,d.activeRoom,De]),s.useEffect(()=>{if(!i&&!ie||ie&&!E)return;const e=()=>{const c=!me.current;Et(),c&&E&&ge.current&&Ne("visibility-restore")},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[E,i,ie,Et,Ne]),s.useEffect(()=>{if(ie||typeof ResizeObserver>"u")return;const e=ge.current;if(!e)return;const a=new ResizeObserver(()=>{me.current||De(e)});return a.observe(e),()=>{a.disconnect()}},[ie,De,i?.id,b]),s.useEffect(()=>{As.current=P},[P]),s.useEffect(()=>()=>{for(const e of As.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of ut.current.values())window.clearTimeout(e);ut.current.clear()},[]);const It=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const c of Array.from(e)){if(!Ya.includes(c.type))continue;const h=c.type.startsWith("image/");a.push({file:c,previewUrl:h?URL.createObjectURL(c):""})}a.length>0&&K(c=>[...c,...a])},[]),Rn=s.useCallback(e=>{K(a=>{const c=a[e];return c?.previewUrl&&URL.revokeObjectURL(c.previewUrl),a.filter((h,C)=>C!==e)})},[]),An=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const c=Array.from(a).filter(h=>h.type.startsWith("image/"));c.length!==0&&It(c)},[It]),Tn=s.useCallback(async e=>{try{await U(e),ae(!1),E&&be(!1)}catch{r(o("chat.failedToCreateSession","Failed to create chat session"),"error")}},[U,r,E]),we=s.useCallback(e=>{const a=e??ue.current;if(!a)return;const c=Tt==="tablet"?Ua:ws;a.style.height="auto",a.style.height=`${Ba(a.scrollHeight,c)}px`,a.style.overflowY=Oa(a.scrollHeight,c)},[Tt]),Ps=s.useCallback(e=>{ue.current=e,e&&we(e)},[we]);s.useLayoutEffect(()=>{we()},[b,D,i?.id,d.activeRoom?.id,we]);const at=s.useCallback(()=>{if(Ce(""),pe)try{localStorage.removeItem(pe)}catch{}Ue(!1),qe(""),f(!1),Be(""),T(-1),K(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[pe]),Ds=s.useCallback(()=>{Ze.current=!0,Ie.current!=null&&clearTimeout(Ie.current),Ie.current=window.setTimeout(()=>{Ze.current=!1,Ie.current=null},700)},[]),En=s.useCallback(()=>Ze.current?(Ze.current=!1,Ie.current!=null&&(clearTimeout(Ie.current),Ie.current=null),!0):!1,[]);s.useEffect(()=>()=>{Ie.current!=null&&clearTimeout(Ie.current)},[]);const gt=s.useCallback(()=>{const e=D.trim(),a=P.map(c=>c.file);if(!(!e&&a.length===0||!i)){if(e==="/clear"||e==="/new"){at(),te(),q(),U({agentId:i.agentId,modelProvider:i.modelProvider??void 0,modelId:i.modelId??void 0}).catch(()=>{r(o("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}at(),R(e,a)}},[D,P,i,at,q,te,U,r,R]),Qt=s.useCallback(async()=>{const e=D.trim();if(e){if(m&&b==="rooms"){if(!d.activeRoom)return;if(e==="/clear"||e==="/new"){at();try{await d.clearRoom(d.activeRoom.id)}catch{r(o("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(qt.current)return;qt.current=!0;const a=D;at();try{await d.sendRoomMessage(e,{files:P.map(c=>c.file)})}catch(c){if(c instanceof xa){const C=c.message.trim()?c.message:o("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(o("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:C}),"error");return}Ce(a);const h=c instanceof Error&&c.message.trim()?c.message:o("chat.failedToSendRoomMessage","Failed to send room message");r(h,"error")}finally{qt.current=!1}return}gt()}},[D,P,m,b,d,d.clearRoom,at,r,gt]),Zt=s.useCallback(e=>{Ce(a=>{const c=gn(a);if(!c)return a;const h=`/skill:${e.name} `,C=a.slice(0,c.start)+h+a.slice(c.end);return window.requestAnimationFrame(()=>{ue.current&&(we(ue.current),ue.current.focus())}),C}),Ue(!1),qe(""),Oe(0)},[we]),Pt=s.useCallback(e=>{const a=ue.current;if(!a||G<0)return;const c=a.selectionStart??Qe.current,h=a.selectionEnd??c,C=Math.max(c,h),I=Math.min(G,C),ce=`${`@${e.name.replace(/\s+/g,"_")}`} `,$e=D.slice(0,I)+ce+D.slice(C),rt=I+ce.length;Ce($e),f(!1),Be(""),A(0),T(-1),window.requestAnimationFrame(()=>{ue.current&&(we(ue.current),ue.current.focus(),ue.current.setSelectionRange(rt,rt))})},[G,D,we]),pt=s.useCallback((e,a)=>{const h=ue.current?.selectionStart??Qe.current,C=D.lastIndexOf("#",h),I=C>=0?C+a.length:e.length;Ce(e),L.dismissMention(),jt(!1),window.requestAnimationFrame(()=>{ue.current&&(we(ue.current),ue.current.focus(),ue.current.setSelectionRange(I,I))})},[L,D,we]),$s=s.useCallback(e=>{if(Qe.current=e.currentTarget.selectionStart??Qe.current,L.mentionActive&&L.combinedItems.length>0){if(L.handleKeyDown(e,D),e.key==="Enter"||e.key==="Tab"){const a=L.combinedItems[L.selectedIndex];a?.kind==="task"?pt(L.selectTask(a.task,D),`#${a.task.id}`):a?.kind==="file"&&pt(L.selectFile(a.file,D),`#${a.file.path}`)}return}if(l&&e.key==="ArrowDown"){e.preventDefault(),Ye.length>0&&A(a=>(a+1)%Ye.length);return}if(l&&e.key==="ArrowUp"){e.preventDefault(),Ye.length>0&&A(a=>a===0?Ye.length-1:a-1);return}if(l&&e.key==="Enter"){e.preventDefault();const a=Ye[x]??Ye[0];a&&Pt(a);return}if(l&&e.key==="Escape"){e.preventDefault(),f(!1),Be(""),T(-1);return}if(He&&e.key==="ArrowDown"){e.preventDefault(),xe.length>0&&Oe(a=>(a+1)%xe.length);return}if(He&&e.key==="ArrowUp"){e.preventDefault(),xe.length>0&&Oe(a=>a===0?xe.length-1:a-1);return}if(He&&(e.key==="Enter"||e.key==="Tab")&&xe.length>0){e.preventDefault();const a=xe[Xe]??xe[0];a&&Zt(a);return}if(He&&e.key==="Escape"){e.preventDefault(),Ue(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Qt())},[l,Ye,x,Pt,He,xe,Xe,Zt,Qt,L,pt,D]),Dt=s.useCallback((e,a)=>{const c=Ja(e,a);if(c){f(!0),Be(c.filter),T(c.start);return}f(!1),Be(""),T(-1)},[]),Fs=s.useCallback(e=>{const a=e.target,c=a.value,h=a.selectionStart??c.length;we(a),Qe.current=h,Ce(c);const C=gn(c);C?(Ue(!0),qe(C.filter)):(Ue(!1),qe("")),Dt(c,h),L.detectMention(c,h),jt(L.mentionActive),L.mentionActive&&Gt(a)},[Dt,we]),$t=s.useCallback(e=>{const a=e.currentTarget,c=a.selectionStart??a.value.length;Qe.current=c,Dt(a.value,c),L.detectMention(a.value,c),jt(L.mentionActive),L.mentionActive&&Gt(a)},[Dt,L,Gt]),Ls=s.useCallback(e=>{e.key!=="Escape"&&$t(e)},[$t]),_s=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(At.current=!0,Te.current!==null&&window.clearTimeout(Te.current),Te.current=window.setTimeout(()=>{At.current=!1,Te.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Ee.current!==null&&window.clearTimeout(Ee.current),Ee.current=window.setTimeout(()=>{Ee.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Ae.current!==null&&window.clearTimeout(Ae.current),Ae.current=window.setTimeout(()=>{Ue(!1),f(!1),Be(""),T(-1),jt(!1),L.dismissMention(),Ae.current=null},120)},[L]),zs=s.useCallback(()=>{At.current=!1,Te.current!==null&&(window.clearTimeout(Te.current),Te.current=null),Ae.current!==null&&(window.clearTimeout(Ae.current),Ae.current=null),Ee.current!==null&&(window.clearTimeout(Ee.current),Ee.current=null)},[]);s.useEffect(()=>()=>{Te.current!==null&&window.clearTimeout(Te.current),Ee.current!==null&&window.clearTimeout(Ee.current)},[]);const In=s.useCallback(async e=>{je(null);try{await _(e),r(o("chat.conversationArchived","Conversation archived"),"success")}catch{r(o("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[_,r]),Pn=s.useCallback(async e=>{Me(null),je(null);try{await M(e),r(o("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(o("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[M,r]),bt=s.useCallback(e=>{try{localStorage.setItem(mn,String(e))}catch{}},[]),Dn=s.useCallback(e=>{if(E||ht)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const c=e.clientX,h=ve;let C=h;document.body.style.userSelect="none";const I=ce=>{const $e=ce.clientX-c,rt=Math.max(zt,Math.min(Ht,h+$e));C=rt,_e(rt),bt(rt)},de=ce=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(ce.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",I),document.removeEventListener("pointerup",de),bt(C)};document.addEventListener("pointermove",I),document.addEventListener("pointerup",de)},[E,bt,ve,ht]),$n=s.useCallback(e=>{if(E||ht||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,c=e.key==="ArrowLeft"?-a:a,h=Math.max(zt,Math.min(Ht,ve+c));_e(h),bt(h)},[E,bt,ve,ht]),Hs=s.useCallback(e=>{const a=V.find(c=>c.id===e);J("direct",e,a?.lastMessageAt??a?.updatedAt),w(e),Je(!1),E&&be(!1)},[V,E,J,w]),es=s.useCallback(()=>{w(""),be(!0),Je(!1)},[w]),ts=s.useCallback(()=>{d.selectRoom(null),be(!0),Je(!1)},[d]),Fn=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(vn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:o("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>ae(!0),children:[t.jsx(xt,{size:16}),o("chat.newChat","New Chat")]})]}),ss=pn(i,i?.agentId?Se.get(i.agentId)??null:null,ze),Ge=un(ss?.provider,ss?.modelId),Ve=ss?.provider??null,ns=!!(i||k||v.length>0),Ft=b==="rooms"?ie:!!i,Us=s.useRef(Ft);s.useEffect(()=>{const e=Us.current;Us.current=Ft,E&&(e||!Ft||Cs({type:"view",revert:b==="rooms"?ts:es}))},[b,es,ts,Ft,E,Cs]);const as=i?.agentId===ot?Ge??"Fusion":i?.title||Se.get(i?.agentId??"")?.name||i?.agentId||"Chat",Os=!!(Ge&&Ge!==as),Ln=E&&b==="direct"&&!!i,rs=Se.get(i?.agentId??"")?.name||(i?.agentId===ot?Ge??"Fusion":i?.agentId?.slice(0,30)??"Fusion"),os=!1,is=i?.agentId===ot,_n=N.length>50?`${N.slice(0,50)}…`:N,zn=s.useCallback(()=>{B(e=>!e)},[]);s.useEffect(()=>{if(!kt)return;const e=a=>{Ns.current?.contains(a.target)||Je(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[kt]),s.useEffect(()=>{if(!Nt)return;const e=c=>{js.current?.contains(c.target)||lt(!1)},a=c=>{c.key==="Escape"&<(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",a),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",a)}},[Nt]),s.useEffect(()=>{(!E||b!=="direct"||he)&&Je(!1)},[E,b,he]),s.useEffect(()=>{lt(!1)},[d.activeRoom?.id]);const cs=s.useCallback((e,a)=>{const c=ut.current.get(e);c&&window.clearTimeout(c),ys(C=>({...C,[e]:a}));const h=window.setTimeout(()=>{ys(C=>{const{[e]:I,...de}=C;return de}),ut.current.delete(e)},2e3);ut.current.set(e,h)},[]),Bs=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),cs(e,"success")}catch{cs(e,"error")}},[cs]),Hn=s.useCallback((e,a=!1)=>a?t.jsx("div",{className:"chat-message-content chat-message-content--plain",children:e}):t.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:t.jsx(wn,{remarkPlugins:[yn],components:kn,children:e})}),[]),ls=i?.agentId===ot,ds=s.useCallback((e,a,c)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${fe[e]==="success"?" chat-message-copy-action--success":""}${fe[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":c??`chat-copy-response-${e}`,"aria-label":fe[e]==="success"?o("chat.responseCopied","Response copied"):fe[e]==="error"?o("chat.copyFailed","Copy failed"):o("chat.copyResponse","Copy response"),onClick:()=>{Bs(e,a)},children:fe[e]==="success"?t.jsx(wa,{size:14}):t.jsx(ya,{size:14})}),[fe,Bs]),us=s.useCallback(e=>{const a=ge.current;if(!a)return;const c=`[data-testid="chat-message-${e}"]`,h=a.querySelector(c);if(!h)return;const C=h.getBoundingClientRect().top-a.getBoundingClientRect().top+a.scrollTop,I=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;a.scrollTo({top:C,behavior:I?"auto":"smooth"})},[]),Ks=i?.cliExecutorAdapterId??null,Un=!!Ks,On=Ks==="generic"?"generic":"hybrid",Bn=i?.cliSessionFile||i?.id||"",Gs=()=>t.jsxs("div",{className:"chat-messages",ref:ge,onScroll:Is,children:[t.jsx("div",{ref:ks,className:"chat-load-more-sentinel",children:ee&&g&&t.jsx("div",{className:"chat-loading-older",children:o("chat.loadingOlderMessages","Loading older messages…")})}),k?t.jsxs(t.Fragment,{children:[v.map(e=>t.jsx(vs,{message:e,forcePlain:O,agentName:rs,hideAssistantIdentity:is,showAssistantModelTag:os,activeModelTag:Ge,activeModelProvider:Ve,activeSessionId:i?.id??null,mentionAgentsByName:Yt,roomContext:null,copyAction:ls&&e.role==="assistant"?ds(e.id,e.content):void 0,onScrollToTop:us},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!is&&t.jsxs("div",{className:"chat-message-avatar",children:[Ve?t.jsx(wt,{provider:Ve,size:"sm"}):t.jsx(yt,{size:14}),t.jsx("span",{children:rs}),os]}),z?Hn(z,O):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:H?o("chat.thinkingStatus","Thinking…"):o("chat.connectingStatus","Connecting…")}),ls&&z&&ds("__streaming__",z,"chat-copy-response-streaming"),Sn(W,o),H&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:o("chat.thinking","Thinking")}),t.jsx("pre",{className:"chat-message-thinking-content",children:Bt(H)})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):g?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):v.length===0&&!i?Fn():v.length===0&&i?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:v.map(e=>t.jsx(vs,{message:e,forcePlain:O,agentName:rs,hideAssistantIdentity:is,showAssistantModelTag:os,activeModelTag:Ge,activeModelProvider:Ve,activeSessionId:i?.id??null,mentionAgentsByName:Yt,roomContext:null,copyAction:ls&&e.role==="assistant"?ds(e.id,e.content):void 0,onScrollToTop:us},e.id))}),t.jsx("div",{ref:Ss})]}),Vs=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Rs,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{It(e.target.files),e.target.value=""}}),He&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":o("chat.skillSuggestions","Skill suggestions"),children:Kt?t.jsx("div",{className:"chat-skill-menu-empty",children:o("chat.loadingSkills","Loading skills…")}):xe.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:ct?o("chat.noSkillsFound","No skills found"):o("chat.noSkillsAvailable","No skills available")}):xe.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===Xe,className:`chat-skill-menu-item${a===Xe?" chat-skill-menu-item--highlighted":""}`,onMouseDown:c=>c.preventDefault(),onMouseEnter:()=>Oe(a),onClick:()=>Zt(e),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.relativePath,children:e.relativePath})]},e.id))}),P.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:P.map((e,a)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Rn(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${a}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":o("chat.attachFiles","Attach files"),onClick:()=>Rs.current?.click(),children:t.jsx(Ra,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${Q?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),F(!0)},onDragLeave:()=>F(!1),onDrop:e=>{e.preventDefault(),F(!1),It(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:Ps,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:D,onChange:Fs,onKeyDown:$s,onKeyUp:Ls,onClick:$t,onBlur:_s,onFocus:zs,onPaste:An,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||en()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(tn,{agents:st,filter:Re,highlightedIndex:x,visible:l,onSelect:Pt,position:"below",roomMemberIds:Pe?.memberIds,roomName:Pe?.roomName}),t.jsx(Aa,{visible:L.mentionActive&&!l,position:Nn,tasks:L.tasks,files:L.files,selectedIndex:L.selectedIndex,onSelectTask:e=>{pt(L.selectTask(e,D),`#${e.id}`)},onSelectFile:e=>{pt(L.selectFile(e,D),`#${e.path}`)},loading:L.loading}),N&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:o("chat.queuedMessage","Queued: {{preview}}",{preview:_n})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":o("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":"chat-pending-dismiss",onClick:te,children:"×"})]})]}),k?t.jsx("button",{className:"chat-input-stop",onClick:q,"aria-label":o("chat.stopGeneration","Stop generation"),"data-testid":"chat-stop-btn",children:t.jsx(Ta,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{if(e.pointerType&&e.pointerType!=="mouse"){if(e.preventDefault(),Ze.current)return;Ds(),gt()}},onTouchStart:()=>{Ze.current||(Ds(),gt())},onMouseDown:e=>{e.preventDefault()},onClick:()=>{En()||gt()},disabled:!D.trim()&&P.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(sn,{size:16})})]})]});return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${he?"":" chat-sidebar--hidden"}`,style:E?void 0:{width:`${ve}px`},children:[m&&t.jsxs("div",{className:"chat-sidebar-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${b==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":b==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>y("direct"),children:o("chat.scopeDirect","Direct")}),t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${b==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":b==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>y("rooms"),children:o("chat.scopeRooms","Rooms")})]}),!m||b==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Ca,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:o("chat.searchConversations","Search conversations..."),value:S,onChange:e=>ne(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:p?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.loadingConversations","Loading...")}):V.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:o("chat.noConversationsYet","No conversations yet")}):V.map(e=>{const a=i?.id===e.id,c=!a&&ye("direct",e.id,e.lastMessageAt??e.updatedAt),h=pn(e,Se.get(e.agentId)??null,ze),C=un(h?.provider,h?.modelId)??"Fusion";return t.jsxs("div",{className:`chat-session-item${a?" chat-session-item--active":""}`,onClick:()=>Hs(e.id),onContextMenu:I=>{I.preventDefault(),je({sessionId:e.id,x:I.clientX,y:I.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:I=>{I.stopPropagation(),Me(e.id)},"data-testid":"chat-session-delete-btn","aria-label":o("chat.deleteConversation","Delete conversation"),children:t.jsx(hs,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[e.title||o("chat.untitledSession","Untitled"),c?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||o("chat.noMessages","No messages")}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[h?.provider?t.jsx(wt,{provider:h.provider,size:"sm"}):null,t.jsx("span",{children:Se.get(e.agentId)?.name||(e.agentId===ot?C:e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?Cn(e.updatedAt,o):""})]})]},e.id)})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!E&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>re(!0),children:[t.jsx(xt,{size:14}),o("chat.createRoom","Create room")]})}),d.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:o("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:d.rooms.map(e=>{const a=d.activeRoom?.id===e.id,c=!a&&ye("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{J("room",e.id,e.updatedAt),d.selectRoom(e.id),E&&be(!1)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),J("room",e.id,e.updatedAt),d.selectRoom(e.id),E&&be(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),c?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":o("chat.unreadMessages","Unread messages")}):null]}),a?t.jsx("span",{className:"chat-room-item-meta",children:o("chat.roomMemberCount","{{count}} member",{count:d.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":o("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:h=>{h.stopPropagation(),Le(e.id)},children:t.jsx(hs,{size:14})})]},e.id)})})]}),b==="rooms"?E?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>re(!0),children:[t.jsx(xt,{size:14}),o("chat.createRoom","Create room")]})}):null:t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>ae(!0),"data-testid":"chat-new-btn",children:[t.jsx(xt,{size:14}),o("chat.newChat","New Chat")]})})]}),!E&&he&&!ht&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":zt,"aria-valuemax":Ht,"aria-valuenow":ve,"aria-label":o("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:Dn,onKeyDown:$n}),$&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:$.y,left:$.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>In($.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(Sa,{size:14}),o("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{je(null),Me($.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(hs,{size:14}),o("chat.delete","Delete")]})]}),Y&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Me(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Me(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Pn(Y),children:o("chat.delete","Delete")})]})]})}),m&&Fe&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Le(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:o("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:o("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Le(null),children:o("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await d.deleteRoom(Fe),Le(null)}catch{r(o("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:o("chat.delete","Delete")})]})]})}),m&&b==="rooms"?t.jsxs("div",{ref:Wt,className:"chat-thread",children:[d.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[E&&t.jsx("button",{className:"btn-icon",onClick:ts,"data-testid":"chat-back-btn",children:t.jsx(Zs,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:js,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":Nt,onClick:()=>lt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",d.activeRoom.name]}),t.jsx(_t,{size:16,"aria-hidden":"true"})]}),Nt&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:d.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===d.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{J("room",e.id,e.updatedAt),d.selectRoom(e.id),lt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:d.activeRoomMembers.map(e=>t.jsx(bn,{agent:Se.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:ge,onScroll:Is,children:[d.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:o("chat.loadingMessages","Loading messages...")}):d.messages.filter(e=>e.content.trim()!==dn).length===0?t.jsx("div",{className:"chat-empty-state",children:o("chat.noMessagesYet","No messages yet. Start the conversation!")}):d.messages.filter(e=>e.content.trim()!==dn).map(e=>{const a=e.senderAgentId?Se.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):o("chat.you","You"),c={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(vs,{message:c,forcePlain:O,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:d.activeRoom?.id??null,mentionAgentsByName:Yt,roomContext:Pe,onScrollToTop:us},e.id)}),t.jsx("div",{ref:Ss})]}),d.activeRoom&&Z&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Ne("fab-click"),children:[t.jsx(_t,{size:14}),o("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:o("chat.selectRoomOrCreate","Select a room or create one")}),d.activeRoom&&t.jsx("div",{className:"chat-input-area",children:t.jsxs("div",{className:"chat-input-row",children:[t.jsxs("div",{className:"chat-input-wrapper",children:[t.jsx("textarea",{ref:Ps,className:"chat-input-textarea",placeholder:o("chat.typeMessage","Type a message..."),value:D,onChange:Fs,onKeyDown:$s,onKeyUp:Ls,onClick:$t,onBlur:_s,onFocus:zs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||en()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(tn,{agents:st,filter:Re,highlightedIndex:x,visible:l,onSelect:Pt,position:"below",roomMemberIds:Pe?.memberIds,roomName:Pe?.roomName})]}),t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{Qt()},disabled:!D.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(sn,{size:16})})]})})]}):t.jsxs("div",{ref:Wt,className:"chat-thread",children:[(ns||!E)&&t.jsxs("div",{className:"chat-thread-header",children:[E&&ns&&t.jsx("button",{className:"btn-icon",onClick:es,"data-testid":"chat-back-btn",children:t.jsx(Zs,{size:16})}),t.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Ln?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ns,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":kt,onClick:()=>Je(e=>!e),children:[Ve?t.jsx(wt,{provider:Ve,size:"md"}):t.jsx(yt,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:as}),Os&&t.jsx("span",{className:"chat-model-tag",children:Ge}),t.jsx(_t,{size:16,"aria-hidden":"true"})]}),kt&&t.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:V.map(e=>t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${i?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>Hs(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||o("chat.untitledSession","Untitled")})},e.id))})]}):t.jsxs(t.Fragment,{children:[Ve?t.jsx(wt,{provider:Ve,size:"md"}):t.jsx(yt,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:as}),Os&&t.jsx("span",{className:"chat-model-tag",children:Ge})]})}),ns&&t.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${O?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":O?o("chat.showRenderedMarkdown","Show all messages as rendered Markdown"):o("chat.showPlainText","Show all messages as plain text"),onClick:zn,children:O?t.jsx(ka,{size:14}):t.jsx(Na,{size:14})}),!E&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>ae(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(xt,{size:14}),o("chat.newChat","New Chat")]})]}),Un?t.jsx(Ha,{cliSessionId:Bn,tier:On,projectId:n,renderTranscript:Gs,renderComposer:()=>i?Vs():null}):t.jsxs(t.Fragment,{children:[Gs(),Z&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>Ne("fab-click"),children:[t.jsx(_t,{size:14}),o("chat.latest","Latest")]}),i&&Vs()]})]}),m&&t.jsx(za,{isOpen:St,onClose:()=>re(!1),projectId:n,existingRoomNames:d.rooms.map(e=>e.name),onCreate:async e=>{await d.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),b!=="rooms"&&y("rooms"),re(!1),E&&be(!1)}}),ke&&t.jsx(Za,{projectId:n,defaultModel:ze,onClose:()=>ae(!1),onCreate:Tn})]})}export{ir as ChatView,Ba as clampChatInputHeight,Oa as resolveChatInputOverflowY,pn as resolveSessionProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as t,j as r}from"./vendor-react-D37HfzIf.js";import{cc as Ae,cd as pe,ce as sr,cf as he,s as Te,cg as Ne,ch as ke,ci as Ce,cj as je,ck as nr,cl as ce,cm as ar,cn as ir,co as lr,cp as or,cq as cr,aG as Q,cr as de,L as se,S as dr,M as vr,cs as ur,bP as mr,a as fr,ct as ze,T as Fe,cu as pr,Q as hr,b1 as gr,b2 as br,af as wr,aB as xr,R as yr}from"./index-bZCpHtGq.js";import{u as ne}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";const ge=500,Sr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function Oe(e){return e.length<=ge?e:e.slice(-ge)}function ve(e,o){return Oe([...e,o])}function J(e){try{return JSON.parse(e)}catch{return null}}function ee(e){const o=e.text??"";return e.stream==="stderr"?`[stderr] ${o}`:o}function Nr(e){return e?.previewUrl??null}async function Ee(e){return ar(e)}async function Le(e,o){return ir(e,o)}async function kr(e){return lr(e)}async function Cr(e){return or(e)}async function Re(e){return cr(e)}function q(e){try{return e()}catch{return null}}function ue(){return typeof q(()=>pe)=="function"&&typeof q(()=>Ae)=="function"}function I(e){return{config:{id:e.id??"default",name:e.name??"Dev Server",command:e.command??"",cwd:e.cwd??"."},status:e.status,runtime:e.pid?{pid:e.pid,startedAt:e.startedAt??new Date().toISOString(),exitCode:e.exitCode??void 0,previewUrl:e.previewUrl}:void 0,previewUrl:e.previewUrl??e.detectedUrl??e.manualUrl??void 0,logHistory:(e.logs??[]).map(o=>({timestamp:new Date().toISOString(),stream:o.startsWith("[stderr]")?"stderr":"stdout",text:o.replace(/^\[stderr\]\s*/,"")}))}}function jr(e){const{t:o}=ne("app"),[s,f]=t.useState(null),[b,g]=t.useState([]),[x,d]=t.useState([]),[E,S]=t.useState([]),[z,N]=t.useState(!0),[y,u]=t.useState(null),i=t.useRef(0),[m,P]=t.useState(null),M=t.useCallback(n=>{if(f(n),n?.logHistory){const a=n.logHistory.slice(-ge).map(ee);d(a)}},[]),L=t.useCallback(async()=>{const n=i.current;try{if(ue())if(m){const a=await Ae(m,e);if(i.current!==n)return;M(a)}else{const a=await pe(e);if(i.current!==n)return;g(a),a.length>0&&(P(a[0].config.id),M(a[0]))}else{const a=await Ee(e);if(i.current!==n)return;const v=I(a);g([v]),M(v)}u(null)}catch(a){if(i.current!==n)return;u(W(a))}},[M,e,m]);t.useEffect(()=>{i.current+=1;const n=i.current;f(null),g([]),d([]),S([]),N(!0),u(null),P(null),(async()=>{try{const[v,c]=await Promise.allSettled([ue()?pe(e):Ee(e).then(C=>[I(C)]),typeof q(()=>ce)=="function"?ce(e):Re(e).then(C=>C.map(R=>({name:R.name,command:R.command,cwd:R.cwd,scriptName:R.scriptName,packagePath:R.packagePath})))]);if(i.current!==n)return;let h=null;if(v.status==="fulfilled"){const C=v.value;if(g(C),C.length>0){const R=C[0];ue()&&P(R.config.id),M(R)}}else h=W(v.reason);c.status==="fulfilled"&&S(c.value),h&&u(h)}catch(v){if(i.current!==n)return;u(W(v))}finally{i.current===n&&N(!1)}})()},[M,e]),t.useEffect(()=>{const n=m?sr(m,e):typeof q(()=>he)=="function"?he(e):null;if(!n)return;const a=i.current,v=Te(n,{events:{history:c=>{if(i.current!==a)return;const h=J(c.data);if(h?.lines){const C=h.lines.map(ee);d(Oe(C))}},log:c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:log":c=>{if(i.current!==a)return;const h=J(c.data);if(h){const C=typeof h.line=="string"?h.line:ee(h);d(R=>ve(R,C))}},"dev-server:output":c=>{if(i.current!==a)return;const h=J(c.data);h?.line&&d(C=>ve(C,h.line))},status:c=>{if(i.current!==a)return;const h=J(c.data),C=h?.status;C&&f(R=>R&&{...R,status:C,runtime:h.pid?{...R.runtime??{startedAt:new Date().toISOString()},pid:h.pid}:R.runtime})},"dev-server:status":c=>{if(i.current!==a)return;const h=J(c.data);if(h?.status){const C=I(h);f(C),g([C])}},stopped:()=>{i.current},failed:()=>{i.current}},onReconnect:()=>{i.current===a&&L()},onError:()=>{i.current===a&&u(c=>c??o("devserver.lostConnection","Lost log stream connection."))}});return()=>{v()}},[e,L,m]),t.useEffect(()=>{if(s?.status!=="running"&&s?.status!=="starting")return;const n=setInterval(()=>{L()},Sr);return()=>{clearInterval(n)}},[L,s?.status]);const _=t.useCallback(async(n,a)=>{i.current+=1;const v=i.current;try{let c;if(m&&typeof q(()=>Ne)=="function")c=await Ne(m,e);else{const h=await Le({command:n,cwd:a},e);c=I(h)}if(i.current!==v)return;f(c),u(null)}catch(c){if(i.current!==v)return;throw u(W(c)),c}},[e,m]),j=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>ke)=="function")a=await ke(m,e);else{const v=await kr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),B=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;if(m&&typeof q(()=>Ce)=="function")a=await Ce(m,e);else{const v=await Cr(e);a=I(v)}if(i.current!==n)return;f(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e,m]),A=t.useCallback(async n=>{i.current+=1;const a=i.current;try{let v;if(m&&typeof q(()=>je)=="function")v=await je(m,n,e);else{const c=await nr({url:n},e);v={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(i.current!==a)return;f(c=>c?{...c,previewUrl:v.url??void 0}:null),u(null)}catch(v){if(i.current!==a)return;throw u(W(v)),v}},[e,m]),V=t.useCallback(async()=>{i.current+=1;const n=i.current;try{let a;try{a=await ce(e)}catch{a=(await Re(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(i.current!==n)return;S(a),u(null)}catch(a){if(i.current!==n)return;throw u(W(a)),a}},[e]),l=t.useCallback(async(n,a)=>{if(typeof n!="string"&&!m)try{const h=n,C=await Le({command:h.command,cwd:h.cwd,scriptName:h.scriptName,packagePath:h.packagePath??h.cwd},e),R=I(C);f(R),g([R]),u(null);return}catch(h){throw u(W(h)),h}const v=typeof n=="string"?n:n.command,c=typeof n=="string"?a:n.cwd;await _(v,c)},[e,_,m]),D=t.useCallback(async()=>{await j()},[j]),U=t.useCallback(async()=>{await B()},[B]),F=t.useCallback(async n=>{await A(n)},[A]),O=t.useCallback(async()=>{await V()},[V]),$=t.useCallback(async()=>{await L()},[L]),k=Nr(s),w=s?{...s,pid:s.runtime?.pid}:null;return{session:s,sessions:b,logs:x,detectedCommands:E,previewUrl:k,isLoading:z,error:y,startServer:_,stopServer:j,restartServer:B,setPreviewUrl:A,detectCommands:V,refresh:L,candidates:E,serverState:w,loading:z,start:l,stop:D,restart:U,setManualUrl:F,detect:O,refreshStatus:$}}const De=500,_e=100;function $e(e){return e.length>De?e.slice(-De):e}function Be(e){return e==="stderr"?"stderr":"stdout"}function re(e){try{return JSON.parse(e.data)}catch{return null}}function te(e,o){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:o,text:typeof e.text=="string"?e.text:"",stream:Be(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Er(e,o){return{id:o,text:e,stream:"stdout",timestamp:""}}function me(e,o){if(o.length===0)return e;const s=[...e],f=new Set(e.map(b=>b.id));for(const b of o)f.has(b.id)||(f.add(b.id),s.push(b));return s.sort((b,g)=>b.id-g.id),$e(s)}function Lr(e,o){const[s,f]=t.useState([]),[b,g]=t.useState(!1),[x,d]=t.useState(!1),[E,S]=t.useState(!1),[z,N]=t.useState(null),y=t.useRef(null),u=t.useRef(!1),i=t.useRef(0),m=t.useRef(0),P=t.useRef(e),M=t.useRef(o),L=t.useRef(0),_=t.useRef(1);(P.current!==e||M.current!==o)&&(P.current=e,M.current=o,i.current++,Q({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),u.current=!0,L.current=0,_.current=1,f([]),g(!1),d(!1),S(!1),N(null),y.current&&(y.current(),y.current=null)),t.useEffect(()=>{if(!o){y.current&&(y.current(),y.current=null);return}const l=i.current,D=++m.current;u.current=!1,g(!0);const U=(k,w)=>{const n=$e(k);f(n),N(w),S(w!==null?w>n.length:!1);const a=n.length>0?n[n.length-1].id:0;L.current=a,_.current=a+1},F=k=>{if(u.current||i.current!==l||!k||typeof k!="object")return;const w=k.lines;if(!Array.isArray(w))return;if(w.length>0&&typeof w[0]=="string"){const a=w.filter(v=>typeof v=="string").map((v,c)=>Er(v,c+1));U(a,a.length);return}const n=w.filter(a=>!!a&&typeof a=="object").map((a,v)=>te(a,v+1));U(n,n.length)},O=k=>{if(u.current||i.current!==l)return;const w=typeof k.text=="string"?k.text:typeof k.line=="string"?k.line:null;if(!w)return;const n=_.current,a=typeof k.id=="number"&&Number.isFinite(k.id)?k.id:n,v={id:a,text:w,stream:Be(k.stream),timestamp:typeof k.timestamp=="string"?k.timestamp:""};L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1),f(c=>me(c,[v])),N(c=>c===null?c:Math.max(c+1,v.id))};async function $(){try{const w=await de({maxLines:_e},e);if(u.current||i.current!==l||m.current!==D)return;const n=w.lines.map((a,v)=>te(a,v+1));U(n,w.totalLines)}catch{if(u.current||i.current!==l||m.current!==D)return;U([],null)}finally{!u.current&&i.current===l&&m.current===D&&g(!1)}const k=he(e);y.current=Te(k,{events:{"dev-server:log":w=>{const n=re(w);n&&O(n)},log:w=>{const n=re(w);n&&O(n)},history:w=>{const n=re(w);F(n)},"dev-server:history":w=>{const n=re(w);F(n)}},onReconnect:()=>{Q({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:k,reason:"history-replay"}),!(u.current||i.current!==l)&&de({lastEventId:L.current,maxLines:50},e).then(w=>{if(u.current||i.current!==l)return;const n=w.lines.map((a,v)=>te(a,_.current+v));if(n.length>0){const a=n[n.length-1].id;L.current=Math.max(L.current,a),_.current=Math.max(_.current,a+1)}f(a=>me(a,n)),N(w.totalLines)}).catch(()=>{})}}),Q({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:k})}return $(),()=>{u.current=!0,y.current&&(y.current(),y.current=null)}},[o,e]);const B=t.useCallback(async()=>{if(!o||x)return;const l=i.current,D=s.length;d(!0);try{const U=await de({maxLines:_e,offset:D},e);if(u.current||i.current!==l)return;const F=U.lines.map((O,$)=>te(O,$+1));f(O=>me(F,O)),S(U.totalLines>D+F.length),N(U.totalLines)}catch{}finally{d(!1)}},[o,s.length,x,e]),A=t.useCallback(()=>{f([])},[]),V=y.current!==null&&!b&&!u.current;return{entries:s,loading:b,loadingMore:x,hasMore:E,total:z,loadMore:B,clear:A,logs:s,isStreaming:V,clearLogs:A}}const Rr="This preview appears to block iframe embedding. Open it in a new tab instead.",Dr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",_r="Preview is taking longer than expected and may block iframe embedding.";function Ur(e){return e==="blocked"?Rr:e==="error"?Dr:null}function Mr(e,o={}){const{loadTimeoutMs:s=1e4,detectionMethod:f=null}=o,b=t.useRef(null),g=t.useRef(null),[x,d]=t.useState("unknown"),[E,S]=t.useState(null),[z]=t.useState(f),N=t.useCallback(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null)},[]),y=t.useCallback(j=>{d(j),S(Ur(j))},[]),u=t.useCallback(()=>{d("blocked"),S(_r)},[]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null);let j=!1;return queueMicrotask(()=>{j||(d("loading"),S(null))}),()=>{j=!0,N()}},[N,e]),t.useEffect(()=>{if(x!=="loading"){N();return}const j=setTimeout(()=>{g.current=null,u()},s);return g.current=j,()=>{clearTimeout(j),g.current===j&&(g.current=null)}},[N,x,s,u]);const i=t.useCallback(()=>{const j=b.current;if(!j){y("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){y("blocked");return}}catch{}y("embedded")},[y]),m=t.useCallback(()=>{y("error")},[y]);t.useEffect(()=>{if(N(),!e){d("unknown"),S(null);return}d("unknown"),S(null)},[N]);const P=t.useCallback(()=>{N(),d("unknown"),S(null)},[N]),M=P,L=t.useMemo(()=>x==="embedded",[x]),_=t.useMemo(()=>x==="blocked"||x==="error",[x]);return{embedStatus:x,isEmbedded:L,isBlocked:_,blockReason:E,detectionMethod:z,iframeRef:b,resetEmbedStatus:P,setEmbedStatus:y,retry:M,embedContext:E,handleIframeLoad:i,handleIframeError:m}}const Pr=/\x1b\[[0-9;]*m/g;function be(e){return e.replace(Pr,"")}function Ar(e){if(!e)return"";const o=new Date(e);return Number.isNaN(o.getTime())?"":o.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Tr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function zr(e){if(e.stream==="stderr")return"error";const o=be(e.text).toLowerCase();return/\b(warn|warning)\b/.test(o)?"warn":/\b(error|fatal)\b/.test(o)?"error":"info"}function Fr(e,o){if(!o)return e;const s=new RegExp(`(${Tr(o)})`,"ig"),f=e.split(s),b=o.toLowerCase();return r.jsx(r.Fragment,{children:f.map((g,x)=>g.toLowerCase()===b?r.jsx("mark",{children:g},`${g}-${x}`):r.jsx("span",{children:g},`${g}-${x}`))})}function Or({entries:e,loading:o,loadingMore:s,hasMore:f,total:b,onLoadMore:g,isRunning:x}){const{t:d}=ne("app"),E=t.useRef(null),S=t.useRef(e.length),z=t.useRef(x),[N,y]=t.useState(!1),[u,i]=t.useState(!1),[m,P]=t.useState(""),[M,L]=t.useState("all"),_=t.useMemo(()=>M==="all"?e:e.filter(l=>zr(l)===M),[e,M]),j=t.useMemo(()=>{const l=m.trim().toLowerCase();return l?_.filter(D=>be(D.text).toLowerCase().includes(l)):_},[_,m]),B=j.length,A=t.useCallback(()=>{const l=E.current;l&&(l.scrollTop=l.scrollHeight,i(!1))},[]);t.useEffect(()=>{const l=z.current,D=S.current,U=e.length>D;x&&(!l||!u&&U)&&A(),z.current=x,S.current=e.length},[e.length,x,u,A]);const V=t.useCallback(()=>{const l=E.current;if(!l)return;const U=l.scrollTop+l.clientHeight>=l.scrollHeight-50;i(!U)},[]);return t.useEffect(()=>{o||e.length===0||!u&&x&&A()},[e,x,u,o,A]),o&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(se,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:d("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${N?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:d("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[b!==null?`${e.length}/${b}`:`${e.length}`," ",d("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:M,onChange:l=>L(l.target.value),"data-testid":"devserver-log-severity-filter","aria-label":d("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:d("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:d("devserver.info","Info")}),r.jsx("option",{value:"warn",children:d("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:d("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:d("devserver.searchLogs","Search logs")}),r.jsx(dr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:m,onChange:l=>P(l.target.value),placeholder:d("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":d("devserver.searchLogs","Search logs")})]}),m.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:d("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>y(l=>!l),"data-testid":"devserver-log-fullscreen-toggle","aria-label":N?d("devserver.exitFullscreen","Exit fullscreen logs"):d("devserver.enterFullscreen","Enter fullscreen logs"),children:N?r.jsx(vr,{size:14}):r.jsx(ur,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[f&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:g,disabled:s,"data-testid":"devserver-log-load-more-button",children:s?r.jsxs(r.Fragment,{children:[r.jsx(se,{size:14,className:"devserver-log-viewer__spinner"}),d("devserver.loadingOlderLogs","Loading older logs…")]}):d("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:E,className:"devserver-log-viewer__content",onScroll:V,"data-testid":"devserver-log-content",children:[!o&&j.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?d("devserver.noLogsYet","No logs yet. Start the dev server to see output."):_.length===0?d("devserver.noMatchesSeverity","No log lines match the selected severity."):d("devserver.noMatchesSearch","No log lines match your search.")}),j.map(l=>{const D=be(l.text),U=Ar(l.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[U&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:U}),l.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:d("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:mr(Fr(D,m.trim()))})]},l.id)})]}),u&&x&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:A,"data-testid":"devserver-log-jump-button",children:[r.jsx(fr,{size:14}),d("devserver.newLogs","New logs")]})]})]})}const $r="devserver-preview-iframe";function Br({url:e,embedStatus:o,onEmbedStatusChange:s,iframeRef:f,blockReason:b,onRetry:g,className:x=$r,embedContext:d}){const{t:E}=ne("app"),S=b??d??null,[z,N]=t.useState(0);t.useEffect(()=>{!e||o!=="unknown"||(N(m=>m+1),s("loading"))},[o,s,e]);const y=t.useCallback(()=>{const m=f.current;if(!m){s("embedded");return}try{if(m.contentWindow?.location?.href==="about:blank"&&m.src!=="about:blank"){s("blocked");return}}catch{}s("embedded")},[f,s]),u=t.useCallback(m=>{m.stopPropagation(),s("error")},[s]),i=t.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:f,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:x,title:"Dev server preview",onLoad:y,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),o==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:E("preview.loading","Loading preview...")})]}),o==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.blockedTitle","Preview cannot be embedded")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]}),o==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:E("preview.errorTitle","Unable to load preview")}),S&&r.jsx("p",{className:"devserver-preview-blocked-context",children:S})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:E("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:i,children:E("preview.openInNewTab","Open in new tab")}),g&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:g,children:E("actions.retry","Retry")})]})]})]}):null}function Hr(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}let fe=!1;function Ue(e){return e instanceof Error?e.message:String(e)}function He(e){return e==="."?"root":e}function Me(e){return e?e==="root"?".":e:null}function Pe(e,o,s){return!o||e.scriptName!==o?!1:s?He(e.cwd)===s:!0}function Vr(e){return e.cwd==="."?"root":e.cwd}function Wr(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Yr({addToast:e,projectId:o}){const{t:s}=ne("app");t.useEffect(()=>(Q({view:"DevServerView",trigger:fe?"route-active":"remount",projectId:o,replayAttempted:!1}),fe=!1,()=>{fe=!0,Q({view:"DevServerView",trigger:"route-inactive",projectId:o,replayAttempted:!1})}),[o]);const{session:f,detectedCommands:b,previewUrl:g,isLoading:x,error:d,startServer:E,stopServer:S,restartServer:z,setPreviewUrl:N,detectCommands:y,refresh:u}=jr(o),i=f?.status??"stopped",m=i==="running"||i==="starting",P=Hr(s),M=P[i]??P.stopped,{entries:L,loading:_,loadingMore:j,hasMore:B,total:A,loadMore:V}=Lr(o,!!o),l=g,D=f?.config?.cwd??null,[U,F]=t.useState(!0),[O,$]=t.useState(""),[k,w]=t.useState(""),[n,a]=t.useState(null),[v,c]=t.useState(null),[h,C]=t.useState("embedded"),R=h==="embedded"?l:null,{embedStatus:H,setEmbedStatus:Ve,resetEmbedStatus:Y,iframeRef:G,isEmbedded:We,isBlocked:ae,blockReason:ie,retry:we}=Mr(R),[xe,X]=t.useState(!1),ye=t.useRef(H);t.useEffect(()=>{const p=ye.current!==H;ae&&p&&X(!0),H==="embedded"&&X(!1),ye.current=H},[H,ae]),t.useEffect(()=>{X(!1)},[l]);const K=t.useMemo(()=>{if(!n)return null;const p=Me(D);return b.find(T=>!(T.scriptName!==n||p&&T.cwd!==p||f?.config?.command&&T.command!==f.config.command))??b.find(T=>Pe(T,n,D))??null},[b,f?.config?.command,n,D]);t.useEffect(()=>{typeof y=="function"&&y().catch(p=>{e(Ue(p),"error")})},[e,y]),t.useEffect(()=>{if(n){F(!1);return}F(!0)},[n]),t.useEffect(()=>{if(f?.status==="running"||f?.status==="starting"){f.config?.command?.trim().length>0&&$(f.config.command);return}if(K){$(K.command);return}b.length>0&&$(p=>p.trim().length>0?p:b[0]?.command??"")},[b,K,f?.config?.command,f?.status]),t.useEffect(()=>{w(l??"")},[l]);const le=t.useCallback(()=>{l&&window.open(l,"_blank","noopener,noreferrer")},[l]),Se=t.useCallback(()=>{X(!1),we()},[we]),qe=t.useCallback(()=>{try{const p=G.current;if(p?.contentWindow){p.contentWindow.location.reload(),X(!1),Y();return}}catch{}if(!(!l||!G.current))try{const p=new URL(l);p.searchParams.set("_t",Date.now().toString()),G.current.src=p.toString(),X(!1),Y()}catch{G.current.src=l,X(!1),Y()}},[l,G,Y]),Z=t.useCallback(async(p,T,oe)=>{c(p);try{await T(),e(oe,"success")}catch(tr){e(Ue(tr),"error")}finally{c(null)}},[e]),Xe=t.useCallback(p=>{a(p.scriptName),F(!1),$(p.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:p.scriptName}),"success")},[e]),Ie=t.useCallback(()=>{a(null),F(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),Ge=()=>{const p=O.trim();if(p.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const T=Me(D)??".",oe=K?.cwd??T;Z("start",()=>E(p,oe),s("devserver.toast.started","Dev server started."))},Je=()=>{Z("stop",S,s("devserver.toast.stopped","Dev server stopped."))},Qe=()=>{Z("restart",z,s("devserver.toast.restarted","Dev server restarted."))},Ye=()=>{const p=k.trim(),T=p.length>0?p:null;Z("preview",()=>N(T),T?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},Ke=t.useCallback(()=>{d&&u()},[d,u]),Ze=i==="starting"||i==="running"||v!==null,er=i==="stopped"||v!==null,rr=i==="stopped"||i==="starting"||v!==null;return r.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[r.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[r.jsxs("div",{className:"dev-server-header-title",children:[r.jsx(pr,{size:16}),r.jsx("h2",{children:s("devserver.title","Dev Server")}),r.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:Ze,"data-testid":"dev-server-start-button",children:[r.jsx(hr,{size:14}),r.jsx("span",{children:v==="start"?s("devserver.starting","Starting..."):s("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Je,disabled:er,"data-testid":"dev-server-stop-button",children:[r.jsx(gr,{size:14}),r.jsx("span",{children:v==="stop"?s("devserver.stopping","Stopping..."):s("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:Qe,disabled:rr,"data-testid":"dev-server-restart-button",children:[r.jsx(br,{size:14}),r.jsx("span",{children:v==="restart"?s("devserver.restarting","Restarting..."):s("devserver.restart","Restart")})]})]})]}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),x&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),x&&!f&&b.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(se,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),d&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:d}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ke,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),n&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:n}),r.jsx("span",{className:"dev-server-candidate-source",children:D??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>F(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ie,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),U&&b.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:s("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),U&&b.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:b.map(p=>{const T=Pe(p,n,D);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${T?"dev-server-candidate--selected":""}`,onClick:()=>Xe(p),"data-testid":`dev-server-candidate-${p.scriptName}-${He(p.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:p.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:Wr(p.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:Vr(p)})]},`${p.cwd}::${p.scriptName}::${p.command}`)})})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:s("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:O,onChange:p=>$(p.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:i==="running"||i==="starting"})]}),(i==="running"||i==="starting")&&f&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.runningCommand","Running command")}),r.jsx("code",{children:f.config?.command??O})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:s("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:k,onChange:p=>w(p.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ye,disabled:v==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),l&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:l})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:s("devserver.lines","{{count}} lines",{count:A??L.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(Or,{entries:L,loading:_,loadingMore:j,hasMore:B,total:A,onLoadMore:V,isRunning:m})})]})}),r.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(wr,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:l??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),l?` · ${l}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>C(p=>p==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:h==="embedded"?s("devserver.externalOnly","External only"):s("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.openInNewTab","Open in new tab"),onClick:le,disabled:!l,"data-testid":"devserver-preview-open-tab",children:r.jsx(xr,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:qe,disabled:!l,"data-testid":"devserver-preview-refresh",children:r.jsx(yr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":We?"true":"false",children:[!l&&!m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!l&&m&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),l&&h==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:s("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:le,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),l&&h==="embedded"&&xe&&ae&&r.jsxs("div",{className:H==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[H==="error"?r.jsx(Fe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:H==="error"?s("devserver.previewFailed","Preview failed"):s("devserver.previewBlocked","Preview blocked")}),ie&&r.jsx("p",{className:"devserver-preview-blocked-context",children:ie})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:s("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:le,"data-testid":"devserver-preview-fallback-open-tab",children:s("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Se,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),l&&h==="embedded"&&!xe&&r.jsx(Br,{url:l,embedStatus:H,onEmbedStatusChange:Ve,iframeRef:G,blockReason:ie,onRetry:Se})]})]})]})}export{Yr as DevServerView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{a7 as G,a8 as X,a9 as ue,aa as me,ab as V,ac as he,f as pe,ad as fe,F as L,ae as je,af as xe,S as we,X as ke,R as ge,ag as be,ah as Y,ai as J,a as Z,b as ve,aj as Ne}from"./index-bZCpHtGq.js";import{u as B}from"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";function Ce(a){const{projectId:l,searchQuery:f,includeProjectFiles:t=!0}=a??{},c=l?`${ue.DOCUMENTS_PREFIX}${l}`:null,[j,o]=s.useState(()=>{if(!c)return[];const w=G(c,{maxAgeMs:X});return Array.isArray(w)?w:[]}),[x,i]=s.useState([]),[u,m]=s.useState(()=>j.length===0),[C,F]=s.useState(null),p=s.useRef(null),g=s.useRef(j.length>0),h=s.useRef(null),y=s.useCallback(async()=>{p.current&&p.current.abort();const w=new AbortController;p.current=w;const T=!g.current;T&&m(!0),F(null);const D=me(f?{q:f}:void 0,l),E=t?V(l):Promise.resolve({files:[]}),[k,S]=await Promise.allSettled([D,E]);if(w.signal.aborted)return;let R=null;if(k.status==="fulfilled"){if(o(k.value),c){const P=k.value.length>500?k.value.slice(0,500):k.value;he(c,P,{maxBytes:5e5})}g.current=!0}else R=k.reason instanceof Error?k.reason.message:String(k.reason);if(S.status==="fulfilled"){const P=S.value.files,M=f?.trim().toLowerCase(),z=M?P.filter(v=>v.name.toLowerCase().includes(M)||v.path.toLowerCase().includes(M)):P;i(z)}F(R),T&&m(!1)},[c,t,l,f]);return s.useEffect(()=>{if(!c){g.current=!1,o([]),m(!0);return}const w=G(c,{maxAgeMs:X});Array.isArray(w)?(o(w),g.current=!0,m(!1)):(g.current=!1,o([]),m(!0))},[c]),s.useEffect(()=>(h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{y()},300),()=>{h.current&&clearTimeout(h.current)}),[y]),s.useEffect(()=>(y(),()=>{p.current&&p.current.abort()}),[]),{documents:j,projectFiles:x,loading:u,error:C,refresh:y}}function Se(a,l){const[f,t]=s.useState([]),[c,j]=s.useState(!0),[o,x]=s.useState(null),i=s.useRef(null),u=s.useRef(!1),m=l?.showHidden??!1,C=s.useCallback(async F=>{i.current&&i.current.abort();const p=new AbortController;i.current=p;const g=!u.current;g&&j(!0),x(null);try{const h=await V(a,{showHidden:F?.showHidden??m});if(p.signal.aborted)return;t(h.files),u.current=!0}catch(h){if(p.signal.aborted)return;x(h instanceof Error?h.message:String(h))}finally{!p.signal.aborted&&g&&j(!1)}},[a,m]);return s.useEffect(()=>(u.current=!1,C({showHidden:m}),()=>{i.current&&i.current.abort()}),[C,m]),{files:f,loading:c,error:o,refresh:C}}const Fe=768;function I(a){return a?new Date(a).toLocaleString():""}function ye(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(a>=10*1024?0:1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}function Te(a,l=200){return a.length<=l?a:`${a.substring(0,l)}…`}function Ee({document:a,renderMarkdown:l,onToggleMarkdown:f}){const{t}=B("app"),[c,j]=s.useState(!1),o=Te(a.content),x=a.content.length>200;return e.jsxs("div",{className:"document-card",children:[e.jsxs("div",{className:"document-card-header",children:[e.jsxs("div",{className:"document-card-key",children:[e.jsx(L,{size:14}),e.jsx("span",{className:"document-card-key-text",children:a.key}),e.jsxs("span",{className:"document-card-revision-badge",children:["v",a.revision]})]}),e.jsx("div",{className:"document-card-actions",children:e.jsx("button",{className:"btn btn-sm document-card-expand-btn",onClick:()=>j(i=>!i),title:c?t("documents.collapse","Collapse"):t("documents.expand","Expand"),"aria-label":c?t("documents.collapseContent","Collapse content"):t("documents.expandContent","Expand content"),children:c?e.jsx(Ne,{size:14}):e.jsx(Z,{size:14})})})]}),e.jsxs("div",{className:"document-card-meta",children:[e.jsx("span",{className:"document-card-author",children:a.author}),e.jsx("span",{className:"document-card-separator",children:"·"}),e.jsx("span",{className:"document-card-date",children:I(a.updatedAt)})]}),e.jsxs("div",{className:`document-card-content${c?" document-card-content--expanded":""}`,children:[c?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"document-card-content-header",children:e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:f,"aria-label":l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":l,title:l?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:l?t("documents.markdown","Markdown"):t("documents.plain","Plain")})}),l?e.jsx("div",{className:"document-card-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:a.content})})}):e.jsx("pre",{className:"document-card-content-text",children:a.content})]}):e.jsx("p",{className:"document-card-preview",children:o}),x&&!c&&e.jsx("p",{className:"document-card-preview-truncated",children:"…"})]})]})}function Pe({taskId:a,taskTitle:l,documents:f,onOpenTask:t,renderMarkdownStates:c,onToggleMarkdown:j}){const{t:o}=B("app"),[x,i]=s.useState(!1);return e.jsxs("div",{className:"documents-group",children:[e.jsxs("div",{className:"documents-group-header",children:[e.jsxs("button",{className:"documents-group-toggle-btn",onClick:()=>i(u=>!u),"aria-expanded":x,"aria-label":`${x?o("documents.collapse","Collapse"):o("documents.expand","Expand")} documents for task ${a}`,children:[e.jsx("span",{className:"documents-group-toggle","aria-hidden":"true",children:x?e.jsx(Z,{size:16}):e.jsx(ve,{size:16})}),e.jsx("span",{className:"documents-group-task-id",children:a}),e.jsx("span",{className:"documents-group-task-title",children:l||o("documents.untitled","Untitled")})]}),e.jsx("span",{className:"documents-group-count",children:o("documents.docCount","{{count}} doc{{plural}}",{count:f.length,plural:f.length!==1?"s":""})}),e.jsx("button",{className:"documents-group-task-link",onClick:()=>t(a),"aria-label":`Open task ${a}: ${l||o("documents.untitled","Untitled")}`,children:o("documents.openTask","Open task")})]}),x&&e.jsx("div",{className:"documents-group-content",children:f.map(u=>e.jsx(Ee,{document:u,renderMarkdown:c.get(u.id)??!1,onToggleMarkdown:()=>j(u.id)},u.id))})]})}function He({projectId:a,addToast:l,onOpenDetail:f}){const{t}=B("app"),[c,j]=s.useState("project"),[o,x]=s.useState(""),[i,u]=s.useState(null),[m,C]=s.useState(!1),[F,p]=s.useState(null),[g,h]=s.useState(!1),[y,w]=s.useState(null),[T,D]=s.useState(!1),E=s.useRef(0),k=s.useRef(!1),[S,R]=s.useState(!1),[P,M]=s.useState(new Map),z=c==="tasks"?o.trim():"",{documents:v,loading:A,error:ee,refresh:O}=Ce({projectId:a,searchQuery:z||void 0,includeProjectFiles:!1}),{files:N,loading:H,error:te,refresh:U}=Se(a,{showHidden:m});s.useEffect(()=>{const n=()=>{D(window.innerWidth<=Fe)};return n(),window.addEventListener("resize",n),()=>{window.removeEventListener("resize",n)}},[]),s.useEffect(()=>{k.current=!1,j("project"),u(null),C(!1),p(null),w(null),h(!1),R(!1),M(new Map)},[a]),s.useEffect(()=>{k.current||A||H||(N.length>0?j("project"):v.length>0&&j("tasks"),k.current=!0)},[v.length,A,N.length,H]);const $=s.useMemo(()=>{const n=new Map;for(const r of v){const d=n.get(r.taskId)||[];n.set(r.taskId,[...d,r])}return Array.from(n.entries()).map(([r,d])=>{const b=[...d].sort((ie,de)=>de.updatedAt.localeCompare(ie.updatedAt));return{taskId:r,taskTitle:b[0]?.taskTitle,documents:b,latestUpdated:b[0]?.updatedAt??""}}).sort((r,d)=>d.latestUpdated.localeCompare(r.latestUpdated))},[v]),q=s.useMemo(()=>{const n=o.trim().toLowerCase();return n?N.filter(r=>{const d=r.path.toLowerCase(),b=r.name.toLowerCase();return d.includes(n)||b.includes(n)}):N},[N,o]);s.useEffect(()=>{if(!i)return;N.some(r=>r.path===i.path)||(u(null),p(null),w(null),h(!1))},[N,i]);const se=s.useCallback(n=>{x(n.target.value)},[]),ne=s.useCallback(()=>{x("")},[]),_=s.useCallback(n=>{j(n)},[]),ae=s.useCallback(async n=>{try{const r=await pe(n,a);f(r)}catch{l(`Failed to open task ${n}`,"error")}},[a,f,l]),ce=s.useCallback(async n=>{u(n),h(!0),w(null),p(null);const r=E.current+1;E.current=r;try{const d=await fe("project",n.path,a);if(E.current!==r)return;p(d.content)}catch(d){if(E.current!==r)return;const b=d instanceof Error?d.message:`Failed to open ${n.path}`;w(b),l(b,"error")}finally{E.current===r&&h(!1)}},[a,l]),re=s.useCallback(()=>{u(null),p(null),w(null),h(!1)},[]),oe=s.useCallback(n=>{M(r=>{const d=new Map(r),b=d.get(n)??!1;return d.set(n,!b),d})},[]),Q=c==="project"?te:ee,le=s.useCallback(async()=>{if(c==="project"){await U();return}await O()},[c,U,O]),K=c==="project"?q.length:v.length,W=c==="project"?t("documents.searchProjectFiles","Search project markdown files…"):t("documents.searchTaskDocuments","Search task documents…");return e.jsxs("div",{className:"documents-view",children:[e.jsxs("div",{className:"documents-view-header",children:[e.jsxs("div",{className:"documents-view-title-row",children:[e.jsxs("h2",{className:"documents-view-title",children:[e.jsx(L,{size:20}),t("documents.title","Documents")]}),e.jsx("span",{className:"documents-view-count",children:t("documents.resultCount","{{count}} result{{plural}}",{count:K,plural:K!==1?"s":""})})]}),e.jsxs("div",{className:"documents-controls-row",children:[e.jsxs("div",{className:"documents-tab-bar",role:"tablist","aria-label":"Documents sections",children:[e.jsxs("button",{className:`btn documents-tab${c==="project"?" active":""}`,role:"tab","aria-selected":c==="project","aria-label":t("documents.showProjectFiles","Show project markdown files"),onClick:()=>_("project"),children:[t("documents.projectFilesTab","Project Files"),e.jsx("span",{className:"documents-tab-count",children:N.length})]}),e.jsxs("button",{className:`btn documents-tab${c==="tasks"?" active":""}`,role:"tab","aria-selected":c==="tasks","aria-label":t("documents.showTaskDocuments","Show task documents"),onClick:()=>_("tasks"),children:[t("documents.taskDocumentsTab","Task Documents"),e.jsx("span",{className:"documents-tab-count",children:$.length})]})]}),c==="project"&&e.jsxs("button",{className:"btn btn-sm documents-hidden-toggle",onClick:()=>C(n=>!n),"aria-pressed":m,"aria-label":m?t("documents.hideHidden","Hide hidden project files"):t("documents.showHidden","Show hidden project files"),title:m?t("documents.hideHiddenFiles","Hide hidden files"):t("documents.showHiddenFiles","Show hidden files"),children:[m?e.jsx(je,{size:14}):e.jsx(xe,{size:14}),m?t("documents.hideHiddenLabel","Hide Hidden"):t("documents.showHiddenLabel","Show Hidden")]}),e.jsxs("div",{className:"documents-search",children:[e.jsx(we,{size:16,className:"documents-search-icon"}),e.jsx("input",{type:"text",className:"documents-search-input",placeholder:W,value:o,onChange:se,"aria-label":W}),o&&e.jsx("button",{className:"documents-search-clear",onClick:ne,"aria-label":t("documents.clearSearch","Clear search"),children:e.jsx(ke,{size:16})})]})]})]}),e.jsx("div",{className:"documents-view-content",children:Q?e.jsxs("div",{className:"documents-view-error",children:[e.jsx("p",{children:t("documents.failedToLoad","Failed to load {{type}}: {{error}}",{type:c==="project"?t("documents.projectFiles","project files"):t("documents.taskDocuments","task documents"),error:Q})}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>void le(),"aria-label":t("documents.retryLoading","Retry loading documents"),children:[e.jsx(ge,{size:16}),t("documents.retry","Retry")]})]}):c==="project"?H&&N.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingProjectFiles","Loading project markdown files…")})}):q.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchProject",'No project markdown files match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noMarkdownFiles","No Markdown files found in this project.")})]})}):e.jsxs("div",{className:`documents-project-layout${T?" documents-project-layout--mobile":""}`,children:[(!T||!i)&&e.jsx("aside",{className:"documents-view-sidebar","aria-label":"Project markdown files",children:e.jsx("ul",{className:"markdown-file-list",children:q.map(n=>{const r=i?.path===n.path;return e.jsx("li",{className:"markdown-file-list-item",children:e.jsxs("button",{className:`markdown-file-item${r?" markdown-file-item--selected":""}`,onClick:()=>void ce(n),"aria-label":`Open ${n.path}`,"aria-current":r?"true":void 0,children:[e.jsx("span",{className:"markdown-file-item-name",children:n.name}),e.jsx("span",{className:"markdown-file-item-path",children:n.path}),e.jsxs("span",{className:"markdown-file-item-meta",children:[ye(n.size)," · ",I(n.mtime)]})]})},n.path)})})}),(!T||i)&&e.jsxs("section",{className:"documents-view-main","aria-label":"Project file content preview",children:[T&&i&&e.jsxs("button",{className:"btn btn-sm documents-mobile-back",onClick:re,"aria-label":t("documents.backToFilesList","Back to project files list"),children:[e.jsx(be,{size:14}),t("documents.backToFiles","Back to files")]}),i?e.jsxs("div",{className:"documents-content-viewer",children:[e.jsxs("div",{className:"documents-content-header",children:[e.jsx("p",{className:"documents-file-path-header",children:i.path}),e.jsx("button",{className:"btn btn-sm document-mode-toggle",onClick:()=>R(n=>!n),"aria-label":S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),"aria-pressed":S,title:S?t("documents.switchToPlainText","Switch to plain text"):t("documents.switchToMarkdown","Switch to markdown"),children:S?t("documents.markdown","Markdown"):t("documents.plain","Plain")})]}),g?e.jsx("p",{className:"documents-content-state",children:t("documents.loadingFileContent","Loading file content…")}):y?e.jsx("p",{className:"documents-content-state documents-content-state--error",children:y}):S?e.jsx("div",{className:"documents-content-markdown",children:e.jsx("div",{className:"markdown-body",children:e.jsx(Y,{remarkPlugins:[J],children:F??""})})}):e.jsx("pre",{className:"document-card-content-text documents-content-viewer-text",children:F??""})]}):e.jsx("div",{className:"documents-view-empty",children:e.jsx("p",{children:t("documents.selectFile","Select a Markdown file to view its content.")})})]})]}):A&&v.length===0?e.jsx("div",{className:"documents-view-loading",children:e.jsx("p",{children:t("documents.loadingTaskDocuments","Loading task documents…")})}):$.length===0?e.jsx("div",{className:"documents-view-empty",children:o.trim()?e.jsx("p",{children:t("documents.noMatchTask",'No task documents match "{{query}}".',{query:o.trim()})}):e.jsxs(e.Fragment,{children:[e.jsx(L,{size:48,className:"documents-view-empty-icon"}),e.jsx("p",{children:t("documents.noTaskDocuments","No task documents yet.")}),e.jsx("p",{className:"documents-view-empty-hint",children:t("documents.documentsCreatedIn","Documents are created in task detail tabs.")})]})}):e.jsx("div",{className:"documents-task-list-wrap",children:e.jsx("div",{className:"documents-view-list",children:$.map(({taskId:n,taskTitle:r,documents:d})=>e.jsx(Pe,{taskId:n,taskTitle:r,documents:d,onOpenTask:ae,renderMarkdownStates:P,onToggleMarkdown:oe},n))})})})]})}export{He as DocumentsView};
|