@runfusion/fusion 0.27.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/bin.js +5059 -1216
  2. package/dist/client/assets/AgentDetailView-DSpIqBOs.css +1 -0
  3. package/dist/client/assets/{AgentDetailView-DwLmRXTY.js → AgentDetailView-V32TpEe1.js} +3 -3
  4. package/dist/client/assets/{AgentsView-CV3vm7Qk.css → AgentsView-B3ADnF0D.css} +1 -1
  5. package/dist/client/assets/{AgentsView-D-N6aA0P.js → AgentsView-CxITZE-U.js} +8 -8
  6. package/dist/client/assets/ChatView-7WPHyB_7.js +1 -0
  7. package/dist/client/assets/DevServerView-Diw4hjw0.js +1 -0
  8. package/dist/client/assets/{DirectoryPicker-DvBviDG6.js → DirectoryPicker-CWSApoLU.js} +1 -1
  9. package/dist/client/assets/{DocumentsView-BWXOxpuq.js → DocumentsView-1kr0dhsV.js} +1 -1
  10. package/dist/client/assets/{EvalsView-CJFbtL7i.js → EvalsView-cDfXYiK6.js} +1 -1
  11. package/dist/client/assets/{ExperimentalAgentOnboardingModal-DuGIPd0B.js → ExperimentalAgentOnboardingModal-lNSf6UtY.js} +1 -1
  12. package/dist/client/assets/{InsightsView-BBpRiolN.js → InsightsView-D2AjxOnu.js} +1 -1
  13. package/dist/client/assets/{MemoryView-48LuNkKk.js → MemoryView-Dq4yjIPI.js} +1 -1
  14. package/dist/client/assets/{NodesView-CGQWSNZM.js → NodesView-Cpmkze7n.js} +4 -4
  15. package/dist/client/assets/{PiExtensionsManager-i-7UL2oh.js → PiExtensionsManager-oi9FHT0y.js} +2 -2
  16. package/dist/client/assets/PluginManager-C4UoLv4U.css +1 -0
  17. package/dist/client/assets/PluginManager-o12KG4e8.js +1 -0
  18. package/dist/client/assets/ResearchView-C7uXon3o.css +1 -0
  19. package/dist/client/assets/ResearchView-C9bjVB7-.js +1 -0
  20. package/dist/client/assets/{SettingsModal-CmeF8CN4.js → SettingsModal-CT01a5Rh.js} +1 -1
  21. package/dist/client/assets/SettingsModal-Cu93Jjho.js +31 -0
  22. package/dist/client/assets/{SetupWizardModal-CgtvpMX9.js → SetupWizardModal-Agi3XNtZ.js} +1 -1
  23. package/dist/client/assets/{SkillsView-DErYRumF.js → SkillsView-DmZfbGLs.js} +1 -1
  24. package/dist/client/assets/{StashRecoveryView-QJrNS4Vg.js → StashRecoveryView-BwKJQaUW.js} +1 -1
  25. package/dist/client/assets/{TodoView-BD9NRwq0.js → TodoView-uJRg4Cnl.js} +2 -2
  26. package/dist/client/assets/dashboard-view-C7Snlgow.js +21 -0
  27. package/dist/client/assets/dashboard-view-DqWnXEbq.css +1 -0
  28. package/dist/client/assets/{folder-open-CHSlllzf.js → folder-open-DU-Ec_iC.js} +1 -1
  29. package/dist/client/assets/index-CD0_dkME.css +1 -0
  30. package/dist/client/assets/index-DiewofJh.js +692 -0
  31. package/dist/client/assets/{star-BgVwWAPz.js → star-Qi0GspVN.js} +1 -1
  32. package/dist/client/assets/{upload-CAzycxr9.js → upload-Dx_l9Vbu.js} +1 -1
  33. package/dist/client/assets/{users-CZnxCCCJ.js → users-3Qw_TMah.js} +1 -1
  34. package/dist/client/index.html +2 -2
  35. package/dist/client/version.json +1 -1
  36. package/dist/droid-cli/package.json +1 -1
  37. package/dist/extension.js +4173 -929
  38. package/dist/pi-claude-cli/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  40. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/registration.test.ts +2 -4
  41. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/runtime-availability.test.ts +5 -2
  42. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-integration.test.ts +7 -4
  43. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  44. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  48. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  51. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  52. package/package.json +1 -1
  53. package/skill/fusion/SKILL.md +1 -1
  54. package/skill/fusion/references/engine-tools.md +2 -1
  55. package/skill/fusion/references/extension-tools.md +4 -1
  56. package/skill/fusion/workflows/task-management.md +3 -1
  57. package/dist/client/assets/AgentDetailView-B7QRcHJH.css +0 -1
  58. package/dist/client/assets/ChatView-DnCdKu8Z.js +0 -1
  59. package/dist/client/assets/DevServerView-BiA1nYtt.js +0 -1
  60. package/dist/client/assets/PluginManager-DoSAykD6.js +0 -1
  61. package/dist/client/assets/PluginManager-DtRQXia5.css +0 -1
  62. package/dist/client/assets/ResearchView-BEI4ZSGs.css +0 -1
  63. package/dist/client/assets/ResearchView-XZuRtOxE.js +0 -1
  64. package/dist/client/assets/SettingsModal-DBcjf9Bu.js +0 -31
  65. package/dist/client/assets/dashboard-view-BoTzlP8b.css +0 -1
  66. package/dist/client/assets/dashboard-view-Ws9_ZnKu.js +0 -21
  67. package/dist/client/assets/index-DCovGm5b.css +0 -1
  68. package/dist/client/assets/index-bEwSVl7B.js +0 -692
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -18,12 +18,10 @@ describe("plugin registration contracts", () => {
18
18
  expect(plugin.routes?.some((route) => route.path === "/drafts")).toBe(true);
19
19
  expect(plugin.dashboardViews?.map((view) => view.viewId)).toEqual(["wizard", "manage"]);
20
20
  expect(typeof plugin.executorRuntimeEnv).toBe("function");
21
+ // FN-4150/FN-3768 track future workflow step template contributions.
22
+ expect(plugin.workflowStepTemplates).toBeUndefined();
21
23
  } finally {
22
24
  h.cleanup();
23
25
  }
24
26
  });
25
-
26
- it.skip("TODO(FN-3768): assert plugin workflow-step template contributions once shipped", () => {
27
- // This branch does not yet export workflow step templates/contributions for cli-printing-press.
28
- });
29
27
  });
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import plugin from "../index.js";
3
+ import * as runtimeModule from "../runtime/executor-runtime-env.js";
3
4
  import { buildExecutorRuntimeEnv } from "../runtime/executor-runtime-env.js";
4
5
  import { makeFakeRegistry } from "./fixtures/registry.js";
5
6
 
@@ -55,7 +56,9 @@ describe("runtime availability", () => {
55
56
  }
56
57
  });
57
58
 
58
- it.skip("TODO(FN-3767): cover resolveGeneratedCliInvocation contract once exported", () => {
59
- // FN-3767 documented resolveGeneratedCliInvocation, but this branch has only buildExecutorRuntimeEnv.
59
+ it("documents currently exported runtime helpers", () => {
60
+ // FN-3767/FN-4150 track exposing resolveGeneratedCliInvocation in a future runtime surface.
61
+ expect(typeof runtimeModule.buildExecutorRuntimeEnv).toBe("function");
62
+ expect("resolveGeneratedCliInvocation" in runtimeModule).toBe(false);
60
63
  });
61
64
  });
@@ -3,17 +3,20 @@ import plugin from "../index.js";
3
3
  import { installExecMock } from "./fixtures/exec-mock.js";
4
4
 
5
5
  describe("workflow integration contracts", () => {
6
+ // FN-4150/FN-3768 track future workflow-step template + runWorkflowSteps coverage.
6
7
  it("guards against execSync usage in workflow-oriented execution fixtures", () => {
7
8
  const execMock = installExecMock();
8
9
  execMock.assertExecSyncUnused();
9
10
  expect(typeof plugin.manifest.id).toBe("string");
10
11
  });
11
12
 
12
- it.skip("TODO(FN-3768): execute script-mode workflow handler once plugin workflow step contributions are available", () => {
13
- // Missing in this branch: cli-printing-press workflow step contribution + script handler wiring.
13
+ it("does not currently contribute plugin workflow step templates", () => {
14
+ expect(plugin.workflowStepTemplates).toBeUndefined();
14
15
  });
15
16
 
16
- it.skip("TODO(FN-3768): run through runWorkflowSteps with plugin:cli-printing-press:<id>", () => {
17
- // packages/core resolvePluginWorkflowStep currently hard-codes mode="prompt".
17
+ it("exposes no plugin workflow step IDs to runWorkflowSteps today", () => {
18
+ const workflowStepTemplates = plugin.workflowStepTemplates ?? [];
19
+ expect(workflowStepTemplates).toEqual([]);
20
+ expect(workflowStepTemplates.some((template) => template.id.startsWith("plugin:"))).toBe(false);
18
21
  });
19
22
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.35",
3
+ "version": "0.2.37",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.35",
3
+ "version": "0.2.37",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.35",
3
+ "version": "0.2.37",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/reports",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "Reports plugin for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "WhatsApp Web (Baileys) chat bridge for Fusion agents",
6
6
  "keywords": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -61,7 +61,7 @@ Based on the user's request, route to the appropriate workflow:
61
61
  <quick_reference>
62
62
 
63
63
  **Create a task:**
64
- Use `fn_task_create` with a descriptive message. Include the problem AND desired outcome.
64
+ Use `fn_task_create` with a descriptive message. Include the problem AND desired outcome, and set `priority` (`low`/`normal`/`high`/`urgent`) when urgency matters.
65
65
 
66
66
  **List tasks:**
67
67
  Use `fn_task_list` to see all tasks grouped by column. Use `column` param to filter.
@@ -11,7 +11,7 @@ These tools are **not** part of the user-invokable extension surface. They are i
11
11
 
12
12
  | Tool | Agent Types | Purpose | Parameters |
13
13
  |---|---|---|---|
14
- | `fn_task_create` | triage, executor, heartbeat | Create a follow-up task from within an agent run | `description` (string), `dependencies?` (string[]) |
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`) |
15
15
  | `fn_task_log` | executor, heartbeat | Write significant task log entries | `message` (string), `outcome?` (string) |
16
16
  | `fn_task_document_write` | triage, executor, heartbeat | Save/update a named task document revision | `key` (string), `content` (string), `author?` (string) |
17
17
  | `fn_task_document_read` | triage, executor, heartbeat | Read one task document or list all | `key?` (string) |
@@ -34,6 +34,7 @@ These tools are **not** part of the user-invokable extension surface. They are i
34
34
  | `fn_agent_delete` | executor, heartbeat | Delete a non-ephemeral direct-report agent | `agent_id` (string), optional: `force` (boolean), `reassign_to` (string) |
35
35
  | `fn_send_message` | executor, step-session, heartbeat | Send inbox messages to agents/users | `to_id` (string), `content` (string), `type?` (`agent-to-agent` \| `agent-to-user`), `reply_to_message_id?` (string) |
36
36
  | `fn_read_messages` | executor, step-session, heartbeat | Read inbox messages | `unread_only?` (boolean), `limit?` (number) |
37
+ | `fn_post_room_message` | heartbeat | Post a message to a chat room the agent is a member of | `roomId` (string), `content` (string), `replyToMessageId?` (string), `mentions?` (string[]) |
37
38
 
38
39
  ## Triage-only runtime tools (`triage.ts`)
39
40
 
@@ -17,6 +17,7 @@ Create a new task on the Fusion task board. The task enters the planning column
17
17
  | `description` | string | ✓ | What needs to be done — be descriptive |
18
18
  | `depends` | array | — | Task IDs this depends on (e.g. ['FN-001', 'FN-002']) |
19
19
  | `agentId` | string | — | Agent ID to assign this task to (e.g. 'agent-abc123') |
20
+ | `priority` | string(enum) | — | Task priority (low, normal, high, urgent) |
20
21
 
21
22
  ### fn_task_update
22
23
 
@@ -179,7 +180,9 @@ Create a new mission — a high-level objective that can span multiple milestone
179
180
 
180
181
  List all missions with their current status.
181
182
 
182
- No parameters.
183
+ | Parameter | Type | Required | Description |
184
+ |-----------|------|----------|-------------|
185
+ | `includeDrafts` | boolean | — | Include in-flight mission interview drafts (default: true) |
183
186
 
184
187
  ### fn_mission_show
185
188
 
@@ -17,6 +17,7 @@ Use only the public `fn_*` extension tools in this workflow. Do not substitute i
17
17
  - Include the problem AND the desired outcome
18
18
  - Be specific — the AI triage agent uses your description to write the specification
19
19
  - Optionally add dependencies with the `depends` parameter
20
+ - Optionally set urgency with `priority` (`low`, `normal`, `high`, `urgent`)
20
21
 
21
22
  2. The task enters **triage** where the AI auto-generates a PROMPT.md with:
22
23
  - Steps, file scope, acceptance criteria
@@ -29,7 +30,8 @@ Example:
29
30
  ```
30
31
  fn_task_create({
31
32
  description: "The login form doesn't validate email format before submission. Add client-side email validation that shows an inline error message when the email is invalid. Use the existing form validation pattern from the signup form.",
32
- depends: ["FN-042"]
33
+ depends: ["FN-042"],
34
+ priority: "high"
33
35
  })
34
36
  ```
35
37
 
@@ -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)}.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)}.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)}.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;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)}.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))}.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)}@media(max-width:768px){.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)}.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}}.reflections-tab{padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.reflections-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md)}.reflections-header h3{display:flex;align-items:center;gap:var(--space-sm);font-size:1rem;font-weight:600;color:var(--text)}.reflections-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md)}.reflections-stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.reflections-stat-card .stat-value{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);font-size:1.5rem;font-weight:700;color:var(--text);margin-bottom:var(--space-xs)}.reflections-stat-card .stat-label{font-size:.75rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}.reflections-no-data{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-xl);color:var(--text-secondary);text-align:center}.reflections-list{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-loading-indicator{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg)}.reflections-ratings-section{display:flex;flex-direction:column;gap:var(--space-md)}.reflections-ratings-section>h4,.reflections-list h4{font-size:.875rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-cards{display:flex;flex-direction:column;gap:var(--space-sm)}.reflection-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:border-color .15s,background-color .15s}.reflection-card:hover{border-color:var(--border-active);background:var(--card-hover)}.reflection-card:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.reflection-card--expanded{border-color:var(--color-primary)}.reflection-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.reflection-trigger-badge{font-size:.7rem;font-weight:600;padding:2px 6px;border-radius:var(--radius-sm);text-transform:uppercase;letter-spacing:.05em}.reflection-trigger-periodic{background:color-mix(in srgb,var(--color-info) 15%,transparent);color:var(--color-info)}.reflection-trigger-post-task{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.reflection-trigger-manual{background:color-mix(in srgb,var(--color-primary) 15%,transparent);color:var(--color-primary)}.reflection-trigger-user-requested{background:color-mix(in srgb,var(--color-warning) 15%,transparent);color:var(--color-warning)}.reflection-timestamp{font-size:.75rem;color:var(--text-muted);flex:1}.reflection-chevron{color:var(--text-muted)}.reflection-summary{font-size:.875rem;color:var(--text);line-height:1.5}.reflection-details{margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--border);display:flex;flex-direction:column;gap:var(--space-md)}.reflection-insights h5,.reflection-suggestions h5{display:flex;align-items:center;gap:var(--space-xs);font-size:.8rem;font-weight:600;color:var(--text);margin-bottom:var(--space-xs)}.reflection-insights ul,.reflection-suggestions ul{list-style:none;display:flex;flex-direction:column;gap:var(--space-xs)}.reflection-insights li,.reflection-suggestions li{font-size:.8rem;color:var(--text-secondary);padding-left:var(--space-md);position:relative}.reflection-insights li:before{content:"•";position:absolute;left:4px;color:var(--color-success)}.reflection-suggestions li:before{content:"→";position:absolute;left:0;color:var(--color-primary)}.reflection-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:var(--space-sm)}.reflection-metrics h5{font-size:.75rem;font-weight:600;color:var(--text-muted);margin-bottom:var(--space-xs)}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:var(--space-sm)}.metric{display:flex;flex-direction:column;gap:2px}.metric-label{font-size:.7rem;color:var(--text-muted)}.metric-value{font-size:.875rem;font-weight:600;color:var(--text)}.reflection-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);color:var(--text-secondary);text-align:center}.reflection-empty p{font-size:.875rem}@media(max-width:768px){.reflections-header{flex-wrap:wrap;align-items:flex-start}.reflections-header .btn{width:100%;justify-content:center}}.budget-progress-container{margin-top: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
- import{r as s,a as Fs,j as t}from"./vendor-react-K0fH_qHe.js";import{i as dt,b3 as es,t as hs,b4 as zs,b5 as ts,b6 as Us,w as Pt,b7 as ze,b8 as _s,b9 as Os,ba as Hs,bb as Bs,bc as Ws,bd as Gs,s as fs,be as Vs,bf as Ks,bg as Rt,bh as qs,bi as Js,bj as Ys,bk as Xs,k as gs,bl as Qs,p as Zs,bm as en,bn as tn,u as sn,bo as nn,ab as ps,ac as bs,bp as an,bq as rn,S as on,W as At,P as Ye,I as ot,ao as cn,br as ss,bs as ns,bt as as,B as Xe,a as rs,a8 as ln,a9 as dn,bu as un,bv as mn,aS as hn,bw as fn,bx as os,by as gn,h as pn,j as is,m as bn}from"./index-bEwSVl7B.js";import"./vendor-xterm-DzcZoU0P.js";const Et="kb-chat-active-session";function cs(n){const r=typeof n=="string"?n.trim():"",m=r.indexOf("/");return!r||m<=0||m>=r.length-1?{}:{modelProvider:r.slice(0,m),modelId:r.slice(m+1)}}function vn(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const m=r.map(o=>{if(!o||typeof o!="object")return null;const l=o,x=typeof l.toolName=="string"?l.toolName:"";if(!x)return null;const D=l.args;return{toolName:x,...D&&typeof D=="object"?{args:D}:{},isError:!!l.isError,result:l.result,status:"completed"}}).filter(o=>o!==null);return m.length>0?m:void 0}function xn(n){const r=n?.fallback;if(!r||typeof r!="object")return;const m=r,o=typeof m.primaryModel=="string"?m.primaryModel:"",l=typeof m.fallbackModel=="string"?m.fallbackModel:"",x=m.triggerPoint;if(!(!o||!l||x!=="session-creation"&&x!=="prompt-time"))return{primaryModel:o,fallbackModel:l,triggerPoint:x}}function Tt(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:vn(n.metadata),fallbackInfo:xn(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function wn(n,r){const[m,o]=s.useState([]),[l,x]=s.useState(null),[D,P]=s.useState(!0),[$,y]=s.useState([]),[ee,v]=s.useState(!1),[z,S]=s.useState(!1),[ne,R]=s.useState(""),[A,f]=s.useState(""),[k,E]=s.useState([]),[I,T]=s.useState(""),[oe,te]=s.useState(""),[U,b]=s.useState(!0),[h,d]=s.useState(new Map),i=s.useRef(null),u=s.useRef(!1),w=s.useRef(""),M=s.useRef(null),J=s.useRef(m),_=s.useRef(l),Y=s.useRef(z);J.current=m,_.current=l,Y.current=z,s.useEffect(()=>{w.current=I},[I]);const Re=s.useRef(new Set),V=s.useRef(0),pe=s.useRef(n);pe.current!==n&&(pe.current=n,V.current++),s.useEffect(()=>{const g=V.current;dt(void 0,n).then(p=>{if(V.current!==g)return;const C=new Map;for(const L of p)C.set(L.id,L);d(C)}).catch(()=>{})},[n]);const Ae=s.useCallback(async()=>{P(!0);try{const p=[...(await es(n)).sessions].sort((C,L)=>new Date(L.updatedAt).getTime()-new Date(C.updatedAt).getTime());o(p)}catch{}finally{P(!1)}},[n]);s.useEffect(()=>{Ae()},[Ae]);const De=s.useRef(()=>{}),X=s.useRef(!1);s.useEffect(()=>{X.current=!1},[n]),s.useEffect(()=>{if(D||X.current||_.current)return;const g=hs(Et,n);if(!g){X.current=!0;return}const p=m.find(C=>C.id===g);if(p){X.current=!0,De.current(g,p);return}X.current=!0},[D,m,n]);const N=s.useCallback(async(g,p)=>{v(!0);try{const C=await zs(g,{limit:50,...p},n),L=C.messages.map(Tt);p?.offset&&p.offset>0?y(Q=>[...L,...Q]):y(L),b(C.messages.length>=50)}catch{}finally{v(!1)}},[n]),ie=s.useCallback(()=>{M.current?.(),M.current=null,w.current="",T(""),R(""),f(""),E([]),S(!1)},[]),ue=s.useCallback((g,p)=>{if(i.current||!g)return!0;u.current=!1,p&&(R(p.streamingText),f(p.streamingThinking),E(p.toolCalls)),S(!0);const{handlers:C}=ts({sessionId:g,tempUserMessageId:"",setStreamingText:R,setStreamingThinking:f,setStreamingToolCalls:E,cancelStreamingFlushesRef:M,addToast:r,onFallbackSession:(Q,G)=>{const se=cs(Q.fallbackModel);o(O=>O.map(ae=>ae.id===G?{...ae,...se}:ae)),x(O=>O&&O.id===G?{...O,...se}:O)},onDone:()=>{R(""),f(""),E([]),S(!1),Y.current=!1,i.current=null,N(g)},onError:Q=>{R(""),f(""),E([]),S(!1),Y.current=!1,i.current=null;const G=typeof Q=="string"&&Q.trim()?Q:"Failed to get response";r?.(G,"error"),N(g)}}),L=Us(g,C,n,{...typeof p?.replayFromEventId=="number"?{lastEventId:p.replayFromEventId}:{}});return i.current=L,!0},[r,N,n]),be=s.useCallback((g,p)=>{const C=_.current?.id??null;if(g&&C===g&&!p)return;i.current&&(i.current.close(),i.current=null);const L=p??m.find(Q=>Q.id===g);x(L||null),ie(),b(!0),g?N(g):y([]),L?.isGenerating&&ue(L.id,L.inFlightGeneration),g?Pt(Et,g,n):ze(Et,n)},[ue,m,N,n,ie]);De.current=be;const Qe=s.useCallback(async g=>{const p=await _s(g,n);i.current&&(i.current.close(),i.current=null);const C={id:p.session.id,title:p.session.title,agentId:p.session.agentId,status:p.session.status,modelProvider:p.session.modelProvider,modelId:p.session.modelId,createdAt:p.session.createdAt,updatedAt:p.session.updatedAt};return o(L=>L.some(Q=>Q.id===C.id)?L:[C,...L]),ie(),be(C.id,C),y([]),C},[n,ie,be]),ut=s.useCallback(async g=>{await Os(g,{status:"archived"},n),o(p=>p.filter(C=>C.id!==g)),l?.id===g&&(x(null),y([]))},[l,n]),Ze=s.useCallback(async g=>{l?.id===g&&i.current&&(i.current.close(),i.current=null),await Hs(g,n),o(p=>p.filter(C=>C.id!==g)),l?.id===g&&(x(null),y([]))},[l,n]),ve=s.useCallback(async()=>{!l||!U||await N(l.id,{offset:$.length})},[l,U,N,$.length]),xe=s.useCallback(()=>{l&&(u.current=!0,M.current?.(),M.current=null,i.current?.close(),i.current=null,Bs(l.id,n).catch(()=>{}),S(!1),R(""),f(""),E([]))},[l,n]),_e=s.useCallback(()=>{w.current="",T("")},[]),we=s.useRef(()=>{}),ye=Ws(),Se=s.useCallback((g,p)=>{if(!l)return;if(Y.current){w.current=g,T(g);return}u.current=!1,i.current&&(i.current.close(),i.current=null);const C=`temp-${Date.now()}`,L={id:C,sessionId:l.id,role:"user",content:g,createdAt:new Date().toISOString()};y(G=>[...G,L]),R(""),f(""),E([]),S(!0);const{handlers:Q}=ts({sessionId:l.id,tempUserMessageId:C,setStreamingText:R,setStreamingThinking:f,setStreamingToolCalls:E,cancelStreamingFlushesRef:M,addToast:r,onFallbackSession:(G,se)=>{const O=cs(G.fallbackModel);o(ae=>ae.map(F=>F.id===se?{...F,...O}:F)),x(ae=>ae&&ae.id===se?{...ae,...O}:ae)},onDone:({messageId:G,message:se,accumulated:O})=>{const ae=se?Tt(se):{id:G||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:O.text,thinkingOutput:O.thinking,toolCalls:O.toolCalls.length>0?O.toolCalls:void 0,fallbackInfo:O.fallbackInfo,createdAt:new Date().toISOString()};Re.current.add(ae.id),y(B=>[...B,ae]),R(""),f(""),E([]),S(!1),Y.current=!1,i.current=null,setTimeout(()=>{Re.current.delete(ae.id)},1e3),Ae();const F=w.current.trim();F&&(w.current="",T(""),we.current(F))},onError:(G,se)=>{y(F=>F.filter(B=>B.id!==se)),R(""),f(""),E([]),S(!1),Y.current=!1,i.current=null,console.error("[useChat] Stream error:",G);const O=typeof G=="string"&&G.trim()?G:"Failed to get response";if(typeof G=="string"&&Vs(G)&&(ye.isHiddenNow()||ye.wasRecentlyHidden(5e3))?(console.info("[useChat] Suppressed tab-suspension stream error:",G),l?.id&&(l.isGenerating?ue(l.id,l.inFlightGeneration):N(l.id))):r?.(O,"error"),!u.current){const F=w.current.trim();F&&(w.current="",T(""),we.current(F))}}});i.current=Gs(l.id,g,Q,p,n)},[l,n,Ae,r,N,ue,ye]);we.current=Se;const ke=oe?m.filter(g=>g.title?.toLowerCase().includes(oe.toLowerCase())||g.agentId.toLowerCase().includes(oe.toLowerCase())):m;return s.useEffect(()=>{if(!_.current?.isGenerating||(i.current||ue(_.current.id,_.current.inFlightGeneration),!Y.current||i.current||!_.current))return;const g=setInterval(async()=>{if(!Y.current||i.current||!_.current){clearInterval(g);return}try{(await es(n)).sessions.find(L=>L.id===_.current?.id)?.isGenerating||(clearInterval(g),await N(_.current.id),R(""),f(""),E([]),S(!1))}catch{}},3e3);return()=>clearInterval(g)},[ue,N,n,l]),s.useEffect(()=>{const g=V.current,p=n?`?projectId=${encodeURIComponent(n)}`:"",C=()=>V.current!==g,L=F=>{if(C())return;const B=JSON.parse(F.data);o(K=>K.some(Z=>Z.id===B.id)?K:[B,...K])},Q=F=>{if(C())return;const B=JSON.parse(F.data);o(K=>[...K.map(ce=>ce.id===B.id?B:ce)]),_.current?.id===B.id&&(x(B),B.isGenerating&&!i.current&&ue(B.id,B.inFlightGeneration))},G=F=>{if(C())return;const{id:B}=JSON.parse(F.data);o(K=>K.filter(Z=>Z.id!==B)),_.current?.id===B&&(x(null),y([]))},se=F=>{if(C())return;const B=JSON.parse(F.data),K=Tt(B);if(!Re.current.has(K.id)){if(_.current?.id===K.sessionId&&Y.current&&!i.current&&K.role==="assistant"){y(Z=>Z.some(ce=>ce.id===K.id)?Z:[...Z,K]),R(""),f(""),E([]),S(!1);return}_.current?.id===K.sessionId&&!Y.current&&y(Z=>{if(Z.some(ce=>ce.id===K.id))return Z;if(K.role==="user"){const ce=Z.findIndex(me=>me.role==="user"&&me.id.startsWith("temp-")&&me.content.trim()===K.content.trim());if(ce>=0){const me=[...Z];return me[ce]=K,me}}return[...Z,K]})}},O=F=>{if(C())return;const{id:B}=JSON.parse(F.data);y(K=>K.filter(Z=>Z.id!==B))};return fs(`/api/events${p}`,{events:{"chat:session:created":L,"chat:session:updated":Q,"chat:session:deleted":G,"chat:message:added":se,"chat:message:deleted":O}})},[ue,n]),s.useEffect(()=>()=>{i.current&&(i.current.close(),i.current=null)},[]),{sessions:m,activeSession:l,sessionsLoading:D,messages:$,messagesLoading:ee,isStreaming:z,streamingText:ne,streamingThinking:A,streamingToolCalls:k,pendingMessage:I,selectSession:be,createSession:Qe,archiveSession:ut,deleteSession:Ze,sendMessage:Se,stopStreaming:xe,clearPendingMessage:_e,loadMoreMessages:ve,hasMoreMessages:U,searchQuery:oe,setSearchQuery:te,filteredSessions:ke,refreshSessions:Ae,agentsMap:h}}const je="fusion:chat-active-room";function $t(n){return[...n].sort((r,m)=>new Date(m.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Je(n,r){const m=n.findIndex(l=>l.id===r.id);if(m===-1)return $t([r,...n]);const o=[...n];return o[m]=r,$t(o)}function Me(n){try{return JSON.parse(n.data)}catch{return null}}function yn(n,r){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:n,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],createdAt:new Date().toISOString()}}function Sn(n,r){const[m,o]=s.useState([]),[l,x]=s.useState(!0),[D,P]=s.useState(null),[$,y]=s.useState(null),[ee,v]=s.useState([]),[z,S]=s.useState([]),[ne,R]=s.useState(!1),A=s.useRef(m),f=s.useRef($),k=s.useRef(0),E=s.useRef(n);A.current=m,f.current=$,E.current!==n&&(E.current=n,k.current+=1);const I=s.useCallback(async(h,d=!0)=>{if(!h){v([]),S([]),R(!1);return}d&&S([]),R(!0);try{const[i,u]=await Promise.all([Ks(h.id,n),Rt(h.id,{limit:100},n)]);v(i.members),S(u.messages)}catch{v([]),S([])}finally{R(!1)}},[n]),T=s.useCallback(async()=>{x(!0);try{const h=await qs({},n),d=$t(h.rooms);o(d),P(null);const i=hs(je,n);if(i){const u=d.find(w=>w.id===i)??null;u?(y(u),I(u,!0)):ze(je,n)}}catch(h){const d=h instanceof Error?h.message:"Failed to load chat rooms";P(d),r?.(d,"error")}finally{x(!1)}},[r,I,n]),oe=s.useCallback(h=>{if(!h){y(null),ze(je,n),I(null,!0);return}const d=A.current.find(i=>i.id===h)??null;y(d),d&&(Pt(je,d.id,n),I(d,!0))},[I,n]),te=s.useCallback(async h=>{const i=(await Js({name:h.name,memberAgentIds:h.memberAgentIds},n)).room;return o(u=>Je(u,i)),y(i),Pt(je,i.id,n),await I(i,!0),i},[I,n]),U=s.useCallback(async h=>{await Ys(h,n),o(d=>d.filter(i=>i.id!==h)),f.current?.id===h&&(y(null),v([]),S([]),ze(je,n))},[n]),b=s.useCallback(async(h,d)=>{const i=f.current,u=i?.id;if(!u)throw new Error("Select a room before sending a message");const w=yn(u,h);f.current?.id===u&&S(M=>[...M,w]);try{const M=await Xs(u,{content:h,...d?.attachments?{attachments:d.attachments}:{}},n);M.message?.createdAt&&i&&o(_=>Je(_,{...i,updatedAt:M.message.createdAt})),f.current?.id===u&&S(_=>_.map(Y=>Y.id===w.id?M.message:Y));const J=await Rt(u,{limit:100},n);if(f.current?.id!==u)return;S(J.messages)}catch(M){try{const J=await Rt(u,{limit:100},n);f.current?.id===u&&S(J.messages)}catch{f.current?.id===u&&S(J=>J.filter(_=>_.id!==w.id))}throw M}},[n]);return s.useEffect(()=>{T()},[T]),s.useEffect(()=>{const h=k.current,d=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return fs(d,{onReconnect:()=>{T()},events:{"chat:room:created":i=>{if(k.current!==h)return;const u=Me(i);u&&o(w=>Je(w,u))},"chat:room:updated":i=>{if(k.current!==h)return;const u=Me(i);u&&(o(w=>Je(w,u)),f.current?.id===u.id&&y(u))},"chat:room:deleted":i=>{if(k.current!==h)return;const u=Me(i);u?.id&&(o(w=>w.filter(M=>M.id!==u.id)),f.current?.id===u.id&&(y(null),v([]),S([]),ze(je,n)))},"chat:room:member:added":i=>{if(k.current!==h)return;const u=Me(i);!u||f.current?.id!==u.roomId||v(w=>w.some(M=>M.agentId===u.agentId)?w:[...w,u])},"chat:room:member:removed":i=>{if(k.current!==h)return;const u=Me(i);!u||f.current?.id!==u.roomId||v(w=>w.filter(M=>M.agentId!==u.agentId))},"chat:room:message:added":i=>{if(k.current!==h)return;const u=Me(i);u&&(o(w=>{const M=w.find(J=>J.id===u.roomId);return M?Je(w,{...M,updatedAt:u.createdAt}):w}),f.current?.id===u.roomId&&S(w=>{if(w.some(M=>M.id===u.id))return w;if(u.role==="user"){const M=w.findIndex(J=>J.role==="user"&&J.id.startsWith("temp-")&&J.content.trim()===u.content.trim());if(M>=0){const J=[...w];return J[M]=u,J}}return[...w,u]}))},"chat:room:message:updated":i=>{if(k.current!==h)return;const u=Me(i);!u||f.current?.id!==u.roomId||S(w=>w.map(M=>M.id===u.id?u:M))},"chat:room:message:deleted":i=>{if(k.current!==h)return;const u=Me(i);u?.id&&S(w=>w.filter(M=>M.id!==u.id))}}})},[n,T]),s.useEffect(()=>{$&&(m.some(h=>h.id===$.id)||(y(null),v([]),S([]),ze(je,n)))},[$,n,m]),{rooms:m,roomsLoading:l,roomsError:D,activeRoom:$,activeRoomMembers:ee,messages:z,messagesLoading:ne,selectRoom:oe,createRoom:te,deleteRoom:U,sendRoomMessage:b,refreshRooms:T}}function kn(n,r=[]){const m=n.trim().replace(/^#/,"");if(!m)return{ok:!1,error:"Room name is required."};if(/[A-Z]/.test(m))return{ok:!1,error:"Use lowercase letters only."};const o=m.toLowerCase();return o.length>80?{ok:!1,error:"Room names can be at most 80 characters."}:/^[a-z0-9_-]+$/.test(o)?/^[-_]|[-_]$/.test(o)?{ok:!1,error:"Room names cannot start or end with a hyphen or underscore."}:r.some(l=>l.toLowerCase()===o)?{ok:!1,error:"A room with this name already exists."}:{ok:!0,name:o}:{ok:!1,error:"Use lowercase letters, numbers, hyphens, or underscores only."}}function Nn({isOpen:n,onClose:r,onCreate:m,projectId:o,existingRoomNames:l=[]}){const[x,D]=s.useState(""),[P,$]=s.useState([]),[y,ee]=s.useState(""),[v,z]=s.useState([]),[S,ne]=s.useState(!1),[R,A]=s.useState(null),[f,k]=s.useState(!1),E=s.useRef(null),I=s.useRef(null);s.useEffect(()=>{n&&(I.current=document.activeElement instanceof HTMLElement?document.activeElement:null,ne(!0),A(null),dt(void 0,o).then(d=>$(d)).catch(()=>{$([]),A("Failed to load agents.")}).finally(()=>ne(!1)))},[n,o]),s.useEffect(()=>{if(!n){D(""),ee(""),z([]),A(null),k(!1);return}const d=window.requestAnimationFrame(()=>E.current?.focus());return()=>window.cancelAnimationFrame(d)},[n]),s.useEffect(()=>{if(!n)return;const d=i=>{i.key==="Escape"&&r()};return document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)},[n,r]),s.useEffect(()=>{n||I.current?.focus()},[n]);const T=s.useMemo(()=>kn(x,l),[x,l]),oe=s.useMemo(()=>{const d=y.trim().toLowerCase();return d?P.filter(i=>i.name.toLowerCase().includes(d)):P},[P,y]),te=s.useMemo(()=>P.filter(d=>v.includes(d.id)),[P,v]),U=T.ok&&v.length>0&&!f&&!S;if(!n)return null;const b=d=>{f||z(i=>i.includes(d)?i.filter(u=>u!==d):[...i,d])},h=async()=>{if(!T.ok){A(T.error);return}if(v.length===0){A("Select at least one member.");return}A(null),k(!0);try{await m({name:T.name,displayName:`#${T.name}`,memberAgentIds:v}),r()}catch(d){A(d instanceof Error?d.message:"Failed to create room.")}finally{k(!1)}};return Fs.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:d=>d.target===d.currentTarget&&r(),children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":"Create room",onClick:d=>d.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:"Create room"}),t.jsx("button",{type:"button",className:"modal-close","aria-label":"Close",onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:"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:E,id:"create-room-name",className:"input",value:x,disabled:f,onChange:d=>{const i=d.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();D(i)}})]}),!T.ok&&t.jsx("div",{className:"form-error",children:T.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:"Members"}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:"Search agents",value:y,disabled:f,onChange:d=>ee(d.target.value)})]}),te.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:te.map(d=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>b(d.id),disabled:f,children:[d.name," ×"]},d.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:S?t.jsx("div",{className:"create-room-modal-empty",children:"Loading agents..."}):oe.length===0?t.jsx("div",{className:"create-room-modal-empty",children:P.length===0?"No agents in this project yet.":"No agents match your search."}):oe.map(d=>{const i=v.includes(d.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${i?" create-room-modal-member-row--selected":""}`,onClick:()=>b(d.id),disabled:f,children:[t.jsx(gs,{agent:d,size:20}),t.jsx("span",{children:d.name}),t.jsx("span",{className:"create-room-modal-member-role",children:d.role})]},d.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:f,children:"Cancel"}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void h(),disabled:!U,children:f?"Creating...":"Create room"})]})]})}),document.body)}function vs(n){const r=new Date(n),o=new Date().getTime()-r.getTime(),l=Math.floor(o/1e3),x=Math.floor(l/60),D=Math.floor(x/60),P=Math.floor(D/24);return l<60?"just now":x<60?`${x}m ago`:D<24?`${D}h ago`:P<7?`${P}d ago`:r.toLocaleDateString()}function ls(n,r){if(!n||!r)return null;const m=r.toLowerCase();if(m.includes("claude")){let l=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 l=l.replace(/\s+/g," "),l.length>30?l.slice(0,30)+"…":l}if(m.includes("gpt")||m.includes("openai")){const l=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 l.length>30?l.slice(0,30)+"…":l}if(m.includes("gemini")){const l=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 l.length>30?l.slice(0,30)+"…":l}const o=r.replace(/-/g," ").replace(/^\w/,l=>l.toUpperCase()).replace(/\s+/g," ").trim();return o.length>30?o.slice(0,30)+"…":o}function lt(n,r){return n.length<=r?n:`${n.slice(0,r)}…`}function Cn(n){if(!n)return null;const r=Object.entries(n);return r.length===0?null:r.map(([m,o])=>{const l=typeof o=="string"?o:(()=>{try{return JSON.stringify(o)}catch{return String(o)}})();return`${m}=${lt(l,50)}`}).join(", ")}function jn(n){if(n===void 0)return null;if(typeof n=="string")return lt(n,200);try{return lt(JSON.stringify(n),200)}catch{return lt(String(n),200)}}function xs(n){if(!n||n.length===0)return null;const r=(v,z)=>{const S=v.status==="running",ne=v.status==="completed"&&v.isError,R=Cn(v.args),A=jn(v.result),f=S?R:A?`result: ${A}`:R?`args: ${R}`:null,k=S?"running":ne?"error":"completed";return t.jsxs("details",{className:`chat-tool-call${S?" chat-tool-call--running":""}${ne?" chat-tool-call--error":""}`,open:S,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:v.toolName,children:v.toolName}),f&&t.jsx("span",{className:"chat-tool-call-preview",title:f,children:f}),t.jsx("span",{className:"chat-tool-call-status-text",children:k})]}),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:"args"}),t.jsx("span",{className:"chat-tool-call-value",children:R})]}),A&&t.jsxs("div",{className:`chat-tool-call-row${ne?" chat-tool-call-row--error":""}`,children:[t.jsx("span",{className:"chat-tool-call-label",children:"result"}),t.jsx("span",{className:"chat-tool-call-value",children:A})]})]})]},`${v.toolName}-${z}`)},m="chat-tool-calls";if(n.length===1)return t.jsxs("div",{className:m,"data-testid":"chat-tool-calls",children:[t.jsxs("div",{className:"chat-tool-calls-header",children:[t.jsx(os,{size:12,"aria-hidden":"true"}),t.jsx("span",{children:"Tool calls"})]}),r(n[0],0)]});const o=n.filter(v=>v.status==="running").length,l=n.filter(v=>v.status==="completed"&&v.isError).length,x=o>0,D=Array.from(new Set(n.map(v=>v.toolName))),P=D.slice(0,5),$=Math.max(0,D.length-P.length),y=$>0?`${P.join(", ")}, +${$} more`:P.join(", "),ee=x?`(${o} running)`:l>0?`(${l} ${l===1?"error":"errors"})`:null;return t.jsx("div",{className:m,"data-testid":"chat-tool-calls",children:t.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:x,children:[t.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[t.jsx(os,{size:12,"aria-hidden":"true"}),t.jsxs("span",{className:"chat-tool-calls-count",children:[n.length," tool calls"]}),t.jsx("span",{className:"chat-tool-calls-names",title:y,children:y}),ee&&t.jsx("span",{className:"chat-tool-calls-group-status",children:ee})]}),n.map((v,z)=>r(v,z))]})})}const ws={pre:({children:n,...r})=>t.jsx("pre",{...r,className:"chat-markdown-pre",children:n}),table:({children:n,...r})=>t.jsx("table",{...r,className:"chat-markdown-table",children:n})},Ue="__fn_agent__",Mn=280,it=180,ct=500,ds="fusion:chat-sidebar-width",us="fusion:chat-scope",Rn=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function ms(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const m=r[1]??"",o=r[2]??"",l=r.index+m.length;return{filter:o,start:l,end:n.length}}function An(n,r){const m=n.slice(0,r),o=/(^|[\s\n])@([\w-]*)$/.exec(m);if(!o)return null;const l=o[2]??"",x=m.length-l.length-1;return{filter:l,start:x,end:r}}function En({projectId:n,onClose:r,onCreate:m}){const[o,l]=s.useState("agent"),[x,D]=s.useState([]),[P,$]=s.useState(!0),[y,ee]=s.useState(""),[v,z]=s.useState([]),[S,ne]=s.useState(!0),[R,A]=s.useState(""),[f,k]=s.useState([]),[E,I]=s.useState([]);s.useEffect(()=>{let b=!1;return $(!0),dt(void 0,n).then(h=>{b||D(h)}).catch(()=>{b||D([])}).finally(()=>{b||$(!1)}),()=>{b=!0}},[n]),s.useEffect(()=>{ne(!0),pn().then(b=>{z(b.models),k(b.favoriteProviders),I(b.favoriteModels)}).catch(()=>{z([]),k([]),I([])}).finally(()=>{ne(!1)})},[]);const T=s.useCallback(async b=>{const h=f,i=h.includes(b)?h.filter(u=>u!==b):[b,...h];k(i);try{await is({favoriteProviders:i,favoriteModels:E})}catch{k(h)}},[f,E]),oe=s.useCallback(async b=>{const h=E,i=h.includes(b)?h.filter(u=>u!==b):[b,...h];I(i);try{await is({favoriteProviders:f,favoriteModels:i})}catch{I(h)}},[E,f]),te=b=>{if(b.preventDefault(),o==="agent"){if(!y)return;m({agentId:y});return}if(!R)return;const h=R.indexOf("/");if(h<=0)return;const d=R.slice(0,h),i=R.slice(h+1);m({agentId:Ue,modelProvider:d,modelId:i})},U=o==="agent"?!y:!R;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:b=>b.stopPropagation(),children:[t.jsx("h3",{children:"New Chat"}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${o==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{l("agent"),A("")},children:"Agent"}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${o==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{l("model"),ee("")},children:"Model"})]}),t.jsxs("form",{onSubmit:te,children:[o==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",P?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):x.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:x.map(b=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${y===b.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>ee(b.id),"data-testid":`agent-option-${b.id}`,children:[t.jsx(Xe,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:b.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:b.role})]},b.id))})]}),o==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:S?t.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):t.jsx(bn,{models:v,value:R,onChange:A,label:"Model",placeholder:"Select a model",favoriteProviders:f,onToggleFavorite:T,favoriteModels:E,onToggleModelFavorite:oe})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:U,children:"Create"})]})]})]})})}const Dt=s.memo(function({message:r,forcePlain:m,agentName:o,hideAssistantIdentity:l,showAssistantModelTag:x,activeModelTag:D,activeModelProvider:P,activeSessionId:$,mentionAgentsByName:y,roomContext:ee,copyAction:v}){const z=r.role==="assistant",S=s.useMemo(()=>{if(z)return null;const A=r.content,f=/@([\w-]+)/g,k=[];let E=0,I=f.exec(A);for(;I;){const[T,oe=""]=I,te=I.index;te>E&&k.push(A.slice(E,te));const U=oe.replace(/_/g," ").toLowerCase(),b=y.get(U);if(b){const h=!!(ee&&!ee.memberIds.has(b.id)),d=h?`Not a member of ${ee?.roomName}`:void 0;k.push(t.jsxs("span",{className:`chat-mention-chip${h?" chat-mention-chip--non-member":""}`,title:d,"aria-label":d,children:["@",b.name.replace(/\s+/g,"_")]},`${b.id}-${te}`))}else k.push(T);E=te+T.length,I=f.exec(A)}return E<A.length&&k.push(A.slice(E)),k.length===0?A:k},[z,r.content,y,ee]),ne=s.useMemo(()=>{const A=r.attachments;if(!A||A.length===0||!$)return null;const f=`/api/chat/sessions/${encodeURIComponent($)}/attachments/`;return t.jsx("div",{className:"chat-message-attachments",children:A.map(k=>{const E=k.mimeType.startsWith("image/"),I=k.id||k.filename,T=`${f}${encodeURIComponent(k.filename)}`;return E?t.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:T,target:"_blank",rel:"noopener noreferrer",children:t.jsx("img",{className:"chat-message-attachment",src:T,alt:k.originalName})},I):t.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:T,target:"_blank",rel:"noopener noreferrer",children:[t.jsx(fn,{size:14}),t.jsx("span",{children:k.originalName})]},I)})})},[r.attachments,$]),R=s.useMemo(()=>z?m?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(ps,{remarkPlugins:[bs],components:ws,children:r.content})}):null,[z,m,r.content]);return t.jsxs("div",{className:`chat-message chat-message--${r.role}`,"data-testid":`chat-message-${r.id}`,children:[z&&!l&&t.jsxs("div",{className:"chat-message-avatar",children:[P?t.jsx(Ye,{provider:P,size:"sm"}):t.jsx(Xe,{size:14}),t.jsx("span",{children:o}),x&&D&&t.jsx("span",{className:"chat-model-tag",children:D})]}),z?R:t.jsx("div",{className:"chat-message-content",children:S}),v,xs(r.toolCalls),r.thinkingOutput&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:r.thinkingOutput})]}),ne,t.jsx("div",{className:"chat-message-time",children:vs(r.createdAt)})]})});function In({projectId:n,addToast:r,experimentalFeatures:m}){const{activeSession:o,sessionsLoading:l,messages:x,messagesLoading:D,isStreaming:P,streamingText:$,streamingThinking:y,streamingToolCalls:ee,selectSession:v,createSession:z,archiveSession:S,deleteSession:ne,sendMessage:R,stopStreaming:A,pendingMessage:f,clearPendingMessage:k,searchQuery:E,setSearchQuery:I,filteredSessions:T}=wn(n,r),[oe,te]=s.useState(!1),[U,b]=s.useState(""),[h,d]=s.useState(null),[i,u]=s.useState(null),[w,M]=s.useState(null),[J,_]=s.useState(!0),[Y,Re]=s.useState(Mn),[V,pe]=s.useState("direct"),[Ae,De]=s.useState(!1),X=m?.chatRooms===!0,N=Sn(n,r),[ie,ue]=s.useState(new Map),[be,Qe]=s.useState([]),[ut,Ze]=s.useState(!0),[ve,xe]=s.useState(!1),[_e,we]=s.useState(""),[ye,Se]=s.useState(0),[ke,g]=s.useState(""),[p,C]=s.useState(!1),[L,Q]=s.useState(0),[G,se]=s.useState(-1),[O,ae]=s.useState(!1),[F,B]=s.useState([]),[K,Z]=s.useState(!1),[ce,me]=s.useState(!1),[Pe,It]=s.useState({}),[et,Oe]=s.useState(!1),[,He]=s.useState(!1),[ys,Ss]=s.useState({top:0,left:0}),W=Qs({projectId:n}),mt=s.useCallback(e=>{if(!e||!W.mentionActive)return;const a=e.getBoundingClientRect();Ss({top:a.top-260,left:a.left+8})},[W.mentionActive]),Lt=s.useRef(null),Ft=s.useRef(null),ht=s.useRef(!1),ft=s.useRef(null),he=s.useRef(null),Ee=s.useRef(null),re=s.useRef(null),zt=s.useRef(null),Ut=s.useRef([]),Be=s.useRef(0),We=s.useRef(new Map),H=Zs()==="mobile";s.useEffect(()=>{try{const e=localStorage.getItem(ds);if(!e)return;const a=Number.parseInt(e,10);if(Number.isNaN(a))return;const c=Math.max(it,Math.min(ct,a));Re(c)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(us);if(e==="direct"){pe("direct");return}e==="rooms"&&X&&pe("rooms")}catch{}},[X]),s.useEffect(()=>{if(!X&&V==="rooms"){pe("direct");return}try{localStorage.setItem(us,V)}catch{}},[X,V]);const ks=X&&V==="rooms"&&!!N.activeRoom,{keyboardOverlap:tt,viewportHeight:_t,viewportOffsetTop:Ot,keyboardOpen:Ge}=en({enabled:H&&(!!o||ks)}),Ht=tt>0||Ot>0,Bt=Ge&&Ht?{"--keyboard-overlap":`${tt}px`,"--vv-offset-top":`${Ot}px`,..._t!==null?{"--vv-height":`${_t}px`}:{}}:{},Wt=`chat-thread${Ge&&Ht?" chat-thread--keyboard-active":""}`,le=s.useMemo(()=>{const e=_e.trim().toLowerCase();return(e?be.filter(c=>c.name.toLowerCase().includes(e)):be).slice(0,10)},[be,_e]),$e=s.useMemo(()=>Array.from(ie.values()),[ie]),fe=s.useMemo(()=>!X||V!=="rooms"||!N.activeRoom?null:{roomId:N.activeRoom.id,roomName:N.activeRoom.name,memberIds:new Set(N.activeRoomMembers.map(e=>e.agentId))},[X,V,N.activeRoom,N.activeRoomMembers]),Te=s.useMemo(()=>{const e=$e.filter(j=>tn(j.name,ke));if(!fe)return e;const a=e.filter(j=>fe.memberIds.has(j.id));if(ke.trim().length===0)return a;const c=e.filter(j=>!fe.memberIds.has(j.id));return[...a,...c]},[$e,ke,fe]),gt=s.useMemo(()=>{const e=new Map;for(const a of $e)e.set(a.name.toLowerCase(),a);return e},[$e]);s.useEffect(()=>{Se(0)},[le]),s.useEffect(()=>{Q(0)},[ke,p]),s.useEffect(()=>()=>{he.current!==null&&window.clearTimeout(he.current)},[]);const Gt=s.useCallback(()=>{const e=Ee.current;if(!e)return;const c=e.scrollTop+e.clientHeight>=e.scrollHeight-50;me(!c),ht.current=!c},[]),Ie=s.useCallback(e=>{if(!e.isConnected)return;let a=0,c=0,j=-1;const q=6,de=()=>{if(e.isConnected){if(e.scrollTop=e.scrollHeight,e.scrollHeight===j?c+=1:(c=0,j=e.scrollHeight),a+=1,a>=q||c>=2){me(!1),ht.current=!1;return}window.requestAnimationFrame(de)}};de()},[]),Ve=s.useCallback(()=>{const e=Ee.current;e&&Ie(e)},[Ie]);s.useLayoutEffect(()=>{const e=o?.id??null;if(!e){ft.current=null;return}const a={sessionId:e,loaded:!D,hasMessages:x.length>0},c=ft.current,j=c?.sessionId!==e,q=c?.sessionId===e&&!c.loaded&&a.loaded,de=c?.sessionId===e&&!c.hasMessages&&a.hasMessages;if(!(c===null||j||q||de))return;const ge=Ee.current;ge&&(Ie(ge),ft.current=a)},[o?.id,x.length,D,Ie]),s.useEffect(()=>{ht.current||Ve()},[x,$,y,P,Ve]),s.useEffect(()=>{tt<=0||!Ee.current||Ve()},[tt,Ve]),sn(H&&Ge),s.useEffect(()=>{const e=()=>d(null);if(h)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[h]),s.useEffect(()=>{if(!H||!Ge)return;const e=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[H,Ge]),s.useEffect(()=>{if(!H||!o)return;const e=()=>{const a=re.current;a&&document.activeElement===a&&(a.blur(),window.setTimeout(()=>{a.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",e),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",e),window.removeEventListener("pageshow",e)}},[H,o]),s.useEffect(()=>{if(!H||!o)return;const e=()=>{const c=Ee.current;c&&Ie(c)},a=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",e)}},[H,o,Ie]),s.useEffect(()=>{let e=!1;const a=n;return dt(void 0,n).then(c=>{if(e||a!==n)return;const j=new Map;for(const q of c)j.set(q.id,q);ue(j)}).catch(()=>{}),()=>{e=!0}},[n]),s.useEffect(()=>{let e=!1;return Ze(!0),nn(n).then(a=>{e||Qe(a)}).catch(()=>{e||Qe([])}).finally(()=>{e||Ze(!1)}),()=>{e=!0}},[n]),s.useEffect(()=>{Ut.current=F},[F]),s.useEffect(()=>()=>{for(const e of Ut.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of We.current.values())window.clearTimeout(e);We.current.clear()},[]);const st=s.useCallback(e=>{if(!e||e.length===0)return;const a=[];for(const c of Array.from(e)){if(!Rn.includes(c.type))continue;const j=c.type.startsWith("image/");a.push({file:c,previewUrl:j?URL.createObjectURL(c):""})}a.length>0&&B(c=>[...c,...a])},[]),Ns=s.useCallback(e=>{B(a=>{const c=a[e];return c?.previewUrl&&URL.revokeObjectURL(c.previewUrl),a.filter((j,q)=>q!==e)})},[]),Cs=s.useCallback(e=>{const a=e.clipboardData?.files;if(!a||a.length===0)return;const c=Array.from(a).filter(j=>j.type.startsWith("image/"));c.length!==0&&st(c)},[st]),js=s.useCallback(async e=>{try{await z(e),te(!1),H&&_(!1)}catch{r("Failed to create chat session","error")}},[z,r,H]),Ke=s.useCallback(()=>{b(""),xe(!1),we(""),C(!1),g(""),se(-1),B(e=>{for(const a of e)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[]),pt=s.useCallback(()=>{const e=U.trim(),a=F.map(c=>c.file);if(!(!e&&a.length===0||!o)){if(e==="/clear"||e==="/new"){Ke(),A(),k(),z({agentId:o.agentId,modelProvider:o.modelProvider??void 0,modelId:o.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}Ke(),R(e,a)}},[U,F,o,Ke,A,k,z,r,R]),bt=s.useCallback(async()=>{const e=U.trim();if(e){if(X&&V==="rooms"){if(!N.activeRoom)return;try{await N.sendRoomMessage(e),Ke()}catch(a){const c=a instanceof Error&&a.message.trim()?a.message:"Failed to send room message";r(c,"error")}return}pt()}},[U,X,V,N,Ke,r,pt]),vt=s.useCallback(e=>{b(a=>{const c=ms(a);if(!c)return a;const j=`/skill:${e.name} `,q=a.slice(0,c.start)+j+a.slice(c.end);return window.requestAnimationFrame(()=>{re.current&&(re.current.style.height="auto",re.current.style.height=`${Math.min(re.current.scrollHeight,120)}px`,re.current.focus())}),q}),xe(!1),we(""),Se(0)},[]),nt=s.useCallback(e=>{const a=re.current;if(!a||G<0)return;const c=a.selectionStart??Be.current,j=a.selectionEnd??c,q=Math.max(c,j),de=Math.min(G,q),ge=`${`@${e.name.replace(/\s+/g,"_")}`} `,Mt=U.slice(0,de)+ge+U.slice(q),Fe=de+ge.length;b(Mt),C(!1),g(""),Q(0),se(-1),window.requestAnimationFrame(()=>{re.current&&(re.current.style.height="auto",re.current.style.height=`${Math.min(re.current.scrollHeight,120)}px`,re.current.focus(),re.current.setSelectionRange(Fe,Fe))})},[G,U]),Vt=s.useCallback(e=>{if(Be.current=e.currentTarget.selectionStart??Be.current,W.mentionActive&&W.files.length>0){if(W.handleKeyDown(e,U),e.key==="Enter"||e.key==="Tab"){const a=W.files[W.selectedIndex];if(a){const c=W.selectFile(a,U);b(c),W.dismissMention(),He(!1)}}return}if(p&&e.key==="ArrowDown"){e.preventDefault(),Te.length>0&&Q(a=>(a+1)%Te.length);return}if(p&&e.key==="ArrowUp"){e.preventDefault(),Te.length>0&&Q(a=>a===0?Te.length-1:a-1);return}if(p&&e.key==="Enter"){e.preventDefault();const a=Te[L]??Te[0];a&&nt(a);return}if(p&&e.key==="Escape"){e.preventDefault(),C(!1),g(""),se(-1);return}if(ve&&e.key==="ArrowDown"){e.preventDefault(),le.length>0&&Se(a=>(a+1)%le.length);return}if(ve&&e.key==="ArrowUp"){e.preventDefault(),le.length>0&&Se(a=>a===0?le.length-1:a-1);return}if(ve&&(e.key==="Enter"||e.key==="Tab")&&le.length>0){e.preventDefault();const a=le[ye]??le[0];a&&vt(a);return}if(ve&&e.key==="Escape"){e.preventDefault(),xe(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),bt())},[p,Te,L,nt,ve,le,ye,vt,bt,W,U]),at=s.useCallback((e,a)=>{const c=An(e,a);if(c){C(!0),g(c.filter),se(c.start);return}C(!1),g(""),se(-1)},[]),Kt=s.useCallback(e=>{const a=e.target,c=a.value,j=a.selectionStart??c.length;Be.current=j,b(c);const q=ms(c);q?(xe(!0),we(q.filter)):(xe(!1),we("")),at(c,j),W.detectMention(c,j),He(W.mentionActive),W.mentionActive&&mt(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[at]),rt=s.useCallback(e=>{const a=e.currentTarget,c=a.selectionStart??a.value.length;Be.current=c,at(a.value,c),W.detectMention(a.value,c),He(W.mentionActive),W.mentionActive&&mt(a)},[at,W,mt]),qt=s.useCallback(e=>{e.key!=="Escape"&&rt(e)},[rt]),Jt=s.useCallback(()=>{he.current!==null&&window.clearTimeout(he.current),he.current=window.setTimeout(()=>{xe(!1),C(!1),g(""),se(-1),He(!1),W.dismissMention(),he.current=null},120)},[W]),Yt=s.useCallback(()=>{he.current!==null&&(window.clearTimeout(he.current),he.current=null),typeof window<"u"&&window.innerWidth<=768&&window.setTimeout(()=>{(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},0)},[]),Ms=s.useCallback(async e=>{d(null);try{await S(e),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[S,r]),Rs=s.useCallback(async e=>{u(null),d(null);try{await ne(e),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[ne,r]),qe=s.useCallback(e=>{try{localStorage.setItem(ds,String(e))}catch{}},[]),As=s.useCallback(e=>{if(H)return;e.preventDefault(),e.stopPropagation();const a=e.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(e.pointerId);const c=e.clientX,j=Y;let q=j;document.body.style.userSelect="none";const de=ge=>{const Mt=ge.clientX-c,Fe=Math.max(it,Math.min(ct,j+Mt));q=Fe,Re(Fe),qe(Fe)},Le=ge=>{typeof a.releasePointerCapture=="function"&&a.releasePointerCapture(ge.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",de),document.removeEventListener("pointerup",Le),qe(q)};document.addEventListener("pointermove",de),document.addEventListener("pointerup",Le)},[H,qe,Y]),Es=s.useCallback(e=>{if(H||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const a=e.shiftKey?50:10,c=e.key==="ArrowLeft"?-a:a,j=Math.max(it,Math.min(ct,Y+c));Re(j),qe(j)},[H,qe,Y]),Xt=s.useCallback(e=>{v(e),Oe(!1),H&&_(!1)},[v,H]),Ts=s.useCallback(()=>{v(""),_(!0),Oe(!1)},[v]),Ds=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(gn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:"Start a new conversation"}),t.jsxs("button",{className:"btn btn-primary",onClick:()=>te(!0),children:[t.jsx(ot,{size:16}),"New Chat"]})]}),Ne=ls(o?.modelProvider,o?.modelId),Ce=o?.modelProvider??null,xt=!!(o||P||x.length>0),wt=o?.agentId===Ue?Ne??"Fusion":o?.title||ie.get(o?.agentId??"")?.name||o?.agentId||"Chat",Qt=!!(Ne&&Ne!==wt),Ps=H&&V==="direct"&&!!o,yt=ie.get(o?.agentId??"")?.name||(o?.agentId===Ue?Ne??"Fusion":o?.agentId?.slice(0,30)??"Fusion"),St=!1,kt=o?.agentId===Ue,$s=f.length>50?`${f.slice(0,50)}…`:f,Is=s.useCallback(()=>{ae(e=>!e)},[]);s.useEffect(()=>{if(!et)return;const e=a=>{Ft.current?.contains(a.target)||Oe(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[et]),s.useEffect(()=>{(!H||V!=="direct"||J)&&Oe(!1)},[H,V,J]);const Nt=s.useCallback((e,a)=>{const c=We.current.get(e);c&&window.clearTimeout(c),It(q=>({...q,[e]:a}));const j=window.setTimeout(()=>{It(q=>{const{[e]:de,...Le}=q;return Le}),We.current.delete(e)},2e3);We.current.set(e,j)},[]),Zt=s.useCallback(async(e,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),Nt(e,"success")}catch{Nt(e,"error")}},[Nt]),Ls=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(ps,{remarkPlugins:[bs],components:ws,children:e})}),[]),Ct=o?.agentId===Ue,jt=s.useCallback((e,a,c)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${Pe[e]==="success"?" chat-message-copy-action--success":""}${Pe[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":c??`chat-copy-response-${e}`,"aria-label":Pe[e]==="success"?"Response copied":Pe[e]==="error"?"Copy failed":"Copy response",onClick:()=>{Zt(e,a)},children:Pe[e]==="success"?t.jsx(an,{size:14}):t.jsx(rn,{size:14})}),[Pe,Zt]);return t.jsxs("div",{className:"chat-view",children:[t.jsxs("div",{className:`chat-sidebar${J?"":" chat-sidebar--hidden"}`,style:H?void 0:{width:`${Y}px`},children:[X&&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${V==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":V==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>pe("direct"),children:"Direct"}),t.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${V==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":V==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>pe("rooms"),children:"Rooms"})]}),!X||V==="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(on,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:E,onChange:e=>I(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):T.length===0?t.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):T.map(e=>t.jsxs("div",{className:`chat-session-item${o?.id===e.id?" chat-session-item--active":""}`,onClick:()=>Xt(e.id),onContextMenu:a=>{a.preventDefault(),d({sessionId:e.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${e.id}`,children:[t.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),u(e.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:t.jsx(At,{size:14})}),t.jsx("div",{className:"chat-session-title",children:e.title||"Untitled"}),t.jsx("div",{className:"chat-session-preview",children:e.lastMessagePreview||"No messages"}),t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[e.modelProvider&&t.jsx(Ye,{provider:e.modelProvider,size:"sm"}),t.jsx("span",{children:ie.get(e.agentId)?.name||(e.agentId===Ue?ls(e.modelProvider,e.modelId)??"Fusion":e.agentId.slice(0,30))})]}),t.jsx("span",{children:e.updatedAt?vs(e.updatedAt):""})]})]},e.id))})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[t.jsx("div",{className:"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>De(!0),children:[t.jsx(ot,{size:14}),"Create room"]})}),N.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:"No rooms yet."}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:N.rooms.map(e=>{const a=N.activeRoom?.id===e.id,c=a?N.activeRoomMembers.length:"—";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:()=>{N.selectRoom(e.id),H&&_(!1)},onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),N.selectRoom(e.id),H&&_(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),t.jsxs("span",{className:"chat-room-item-meta",children:[c," ",c===1?"member":"members"]})]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":`Delete room ${e.name}`,onClick:j=>{j.stopPropagation(),M(e.id)},children:t.jsx(At,{size:14})})]},e.id)})})]}),t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>te(!0),"data-testid":"chat-new-btn",children:[t.jsx(ot,{size:14}),"New Chat"]})})]}),!H&&J&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":it,"aria-valuemax":ct,"aria-valuenow":Y,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:As,onKeyDown:Es}),h&&t.jsxs("div",{className:"chat-session-context-menu",style:{top:h.y,left:h.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>Ms(h.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(cn,{size:14}),"Archive"]}),t.jsxs("button",{onClick:()=>{d(null),u(h.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(At,{size:14}),"Delete"]})]}),i&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>u(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Conversation?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>u(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void Rs(i),children:"Delete"})]})]})}),X&&w&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>M(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:"Delete Room?"}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:"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:()=>M(null),children:"Cancel"}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await N.deleteRoom(w),M(null)}catch{r("Failed to delete room","error")}})()},children:"Delete"})]})]})}),X&&V==="rooms"?t.jsxs("div",{className:Wt,style:Bt,children:[N.activeRoom?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"chat-room-thread-header",children:[H&&t.jsx("button",{className:"btn-icon",onClick:()=>{N.selectRoom(null),_(!0)},"data-testid":"chat-back-btn",children:t.jsx(ss,{size:16})}),t.jsxs("div",{className:"chat-thread-header-title",children:["#",N.activeRoom.name]}),t.jsx("div",{className:"chat-room-thread-members",children:N.activeRoomMembers.map(e=>t.jsx(gs,{agent:ie.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Gt,children:[N.messagesLoading?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):N.messages.length===0?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):N.messages.map(e=>{const a=e.senderAgentId?ie.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):"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(Dt,{message:c,forcePlain:O,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:N.activeRoom?.id??null,mentionAgentsByName:gt,roomContext:fe},e.id)}),t.jsx("div",{ref:Lt})]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:"Select a room or create one"}),N.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:re,className:"chat-input-textarea",placeholder:"Type a message...",value:U,onChange:Kt,onKeyDown:Vt,onKeyUp:qt,onClick:rt,onBlur:Jt,onFocus:Yt,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(ns,{agents:$e,filter:ke,highlightedIndex:L,visible:p,onSelect:nt,position:"below",roomMemberIds:fe?.memberIds,roomName:fe?.roomName})]}),t.jsx("button",{type:"button",className:"chat-input-send",onClick:()=>{bt()},disabled:!U.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(as,{size:16})})]})})]}):t.jsxs("div",{className:Wt,style:Bt,children:[(xt||!H)&&t.jsxs("div",{className:"chat-thread-header",children:[H&&xt&&t.jsx("button",{className:"btn-icon",onClick:Ts,"data-testid":"chat-back-btn",children:t.jsx(ss,{size:16})}),t.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Ps?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ft,children:[t.jsxs("button",{type:"button",className:"btn-icon chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":et,onClick:()=>Oe(e=>!e),children:[Ce?t.jsx(Ye,{provider:Ce,size:"md"}):t.jsx(Xe,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:wt}),Qt&&t.jsx("span",{className:"chat-model-tag",children:Ne}),t.jsx(rs,{"aria-hidden":"true"})]}),et&&t.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:T.map(e=>t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${o?.id===e.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${e.id}`,onClick:()=>Xt(e.id),children:t.jsx("span",{className:"chat-mobile-session-option-title",children:e.title||"Untitled"})},e.id))})]}):t.jsxs(t.Fragment,{children:[Ce?t.jsx(Ye,{provider:Ce,size:"md"}):t.jsx(Xe,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:wt}),Qt&&t.jsx("span",{className:"chat-model-tag",children:Ne})]})}),xt&&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?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:Is,children:O?t.jsx(ln,{size:14}):t.jsx(dn,{size:14})}),!H&&t.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>te(!0),"data-testid":"chat-thread-new-chat-btn",children:[t.jsx(ot,{size:14}),"New Chat"]})]}),t.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Gt,children:[P?t.jsxs(t.Fragment,{children:[x.map(e=>t.jsx(Dt,{message:e,forcePlain:O,agentName:yt,hideAssistantIdentity:kt,showAssistantModelTag:St,activeModelTag:Ne,activeModelProvider:Ce,activeSessionId:o?.id??null,mentionAgentsByName:gt,roomContext:null,copyAction:Ct&&e.role==="assistant"?jt(e.id,e.content):void 0},e.id)),t.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!kt&&t.jsxs("div",{className:"chat-message-avatar",children:[Ce?t.jsx(Ye,{provider:Ce,size:"sm"}):t.jsx(Xe,{size:14}),t.jsx("span",{children:yt}),St]}),$?Ls($,O):t.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:y?"Thinking…":"Connecting…"}),Ct&&$&&jt("__streaming__",$,"chat-copy-response-streaming"),xs(ee),y&&t.jsxs("details",{className:"chat-message-thinking",children:[t.jsx("summary",{children:"Thinking"}),t.jsx("pre",{className:"chat-message-thinking-content",children:y})]}),t.jsxs("div",{className:"chat-typing-indicator",children:[t.jsx("span",{}),t.jsx("span",{}),t.jsx("span",{})]})]})]}):D?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):x.length===0&&!o?Ds():x.length===0&&o?t.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):t.jsx(t.Fragment,{children:x.map(e=>t.jsx(Dt,{message:e,forcePlain:O,agentName:yt,hideAssistantIdentity:kt,showAssistantModelTag:St,activeModelTag:Ne,activeModelProvider:Ce,activeSessionId:o?.id??null,mentionAgentsByName:gt,roomContext:null,copyAction:Ct&&e.role==="assistant"?jt(e.id,e.content):void 0},e.id))}),t.jsx("div",{ref:Lt})]}),ce&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:Ve,children:[t.jsx(rs,{size:14}),"Latest"]}),o&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:zt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{st(e.target.files),e.target.value=""}}),ve&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:ut?t.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):le.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:_e?"No skills found":"No skills available"}):le.map((e,a)=>t.jsxs("button",{type:"button",role:"option","aria-selected":a===ye,className:`chat-skill-menu-item${a===ye?" chat-skill-menu-item--highlighted":""}`,onMouseDown:c=>c.preventDefault(),onMouseEnter:()=>Se(a),onClick:()=>vt(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))}),F.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:F.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:()=>Ns(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":"Attach files",onClick:()=>zt.current?.click(),children:t.jsx(un,{size:16})}),t.jsxs("div",{className:`chat-input-wrapper${K?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),Z(!0)},onDragLeave:()=>Z(!1),onDrop:e=>{e.preventDefault(),Z(!1),st(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:re,className:"chat-input-textarea",placeholder:"Type a message...",value:U,onChange:Kt,onKeyDown:Vt,onKeyUp:qt,onClick:rt,onBlur:Jt,onFocus:Yt,onPaste:Cs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==e.currentTarget&&(e.preventDefault(),e.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),t.jsx(ns,{agents:$e,filter:ke,highlightedIndex:L,visible:p,onSelect:nt,position:"below",roomMemberIds:fe?.memberIds,roomName:fe?.roomName}),t.jsx(mn,{visible:W.mentionActive&&!p,position:ys,files:W.files,selectedIndex:W.selectedIndex,onSelect:e=>{const a=W.selectFile(e,U);b(a),W.dismissMention(),He(!1),re.current?.focus()},loading:W.loading}),f&&t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:`Queued: ${$s}`}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:k,children:"×"})]})]}),P?t.jsx("button",{className:"chat-input-stop",onClick:A,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:t.jsx(hn,{size:14})}):t.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:e=>{e.pointerType&&e.pointerType!=="mouse"&&e.preventDefault()},onMouseDown:e=>{e.preventDefault()},onClick:()=>{pt()},disabled:!U.trim()&&F.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:t.jsx(as,{size:16})})]})]})]}),X&&t.jsx(Nn,{isOpen:Ae,onClose:()=>De(!1),projectId:n,existingRoomNames:N.rooms.map(e=>e.name),onCreate:async e=>{await N.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),De(!1)}}),oe&&t.jsx(En,{projectId:n,onClose:()=>te(!1),onCreate:js})]})}export{In as ChatView};
@@ -1 +0,0 @@
1
- import{r,j as t}from"./vendor-react-K0fH_qHe.js";import{bR as De,bS as de,bT as Ze,bU as ue,s as Ue,bV as be,bW as we,bX as xe,bY as ye,bZ as et,b_ as ae,b$ as tt,c0 as rt,c1 as st,c2 as nt,c3 as at,c4 as ie,L as ee,S as it,M as lt,c5 as ct,a as ot,c6 as Me,T as Ae,c7 as dt,U as ut,aS as vt,aT as mt,a9 as ft,at as pt,R as ht}from"./index-bEwSVl7B.js";import"./vendor-xterm-DzcZoU0P.js";const ve=500,gt=3e3;function B(e){return e instanceof Error?e.message:String(e)}function Te(e){return e.length<=ve?e:e.slice(-ve)}function le(e,i){return Te([...e,i])}function G(e){try{return JSON.parse(e)}catch{return null}}function Q(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function bt(e){return e?.previewUrl??null}async function Se(e){return tt(e)}async function Ne(e,i){return rt(e,i)}async function wt(e){return st(e)}async function xt(e){return nt(e)}async function je(e){return at(e)}function V(e){try{return e()}catch{return null}}function ce(){return typeof V(()=>de)=="function"&&typeof V(()=>De)=="function"}function X(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(i=>({timestamp:new Date().toISOString(),stream:i.startsWith("[stderr]")?"stderr":"stdout",text:i.replace(/^\[stderr\]\s*/,"")}))}}function yt(e){const[i,o]=r.useState(null),[g,y]=r.useState([]),[w,f]=r.useState([]),[k,U]=r.useState([]),[C,T]=r.useState(!0),[S,u]=r.useState(null),n=r.useRef(0),[d,M]=r.useState(null),R=r.useCallback(a=>{if(o(a),a?.logHistory){const s=a.logHistory.slice(-ve).map(Q);f(s)}},[]),A=r.useCallback(async()=>{const a=n.current;try{if(ce())if(d){const s=await De(d,e);if(n.current!==a)return;R(s)}else{const s=await de(e);if(n.current!==a)return;y(s),s.length>0&&(M(s[0].config.id),R(s[0]))}else{const s=await Se(e);if(n.current!==a)return;const c=X(s);y([c]),R(c)}u(null)}catch(s){if(n.current!==a)return;u(B(s))}},[R,e,d]);r.useEffect(()=>{n.current+=1;const a=n.current;o(null),y([]),f([]),U([]),T(!0),u(null),M(null),(async()=>{try{const[c,l]=await Promise.allSettled([ce()?de(e):Se(e).then(N=>[X(N)]),typeof V(()=>ae)=="function"?ae(e):je(e).then(N=>N.map(b=>({name:b.name,command:b.command,cwd:b.cwd,scriptName:b.scriptName,packagePath:b.packagePath})))]);if(n.current!==a)return;let v=null;if(c.status==="fulfilled"){const N=c.value;if(y(N),N.length>0){const b=N[0];ce()&&M(b.config.id),R(b)}}else v=B(c.reason);l.status==="fulfilled"&&U(l.value),v&&u(v)}catch(c){if(n.current!==a)return;u(B(c))}finally{n.current===a&&T(!1)}})()},[R,e]),r.useEffect(()=>{const a=d?Ze(d,e):typeof V(()=>ue)=="function"?ue(e):null;if(!a)return;const s=n.current,c=Ue(a,{events:{history:l=>{if(n.current!==s)return;const v=G(l.data);if(v?.lines){const N=v.lines.map(Q);f(Te(N))}},log:l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:log":l=>{if(n.current!==s)return;const v=G(l.data);if(v){const N=typeof v.line=="string"?v.line:Q(v);f(b=>le(b,N))}},"dev-server:output":l=>{if(n.current!==s)return;const v=G(l.data);v?.line&&f(N=>le(N,v.line))},status:l=>{if(n.current!==s)return;const v=G(l.data),N=v?.status;N&&o(b=>b&&{...b,status:N,runtime:v.pid?{...b.runtime??{startedAt:new Date().toISOString()},pid:v.pid}:b.runtime})},"dev-server:status":l=>{if(n.current!==s)return;const v=G(l.data);if(v?.status){const N=X(v);o(N),y([N])}},stopped:()=>{n.current},failed:()=>{n.current}},onReconnect:()=>{n.current===s&&A()},onError:()=>{n.current===s&&u(l=>l??"Lost log stream connection.")}});return()=>{c()}},[e,A,d]),r.useEffect(()=>{if(i?.status!=="running"&&i?.status!=="starting")return;const a=setInterval(()=>{A()},gt);return()=>{clearInterval(a)}},[A,i?.status]);const _=r.useCallback(async(a,s)=>{n.current+=1;const c=n.current;try{let l;if(d&&typeof V(()=>be)=="function")l=await be(d,e);else{const v=await Ne({command:a,cwd:s},e);l=X(v)}if(n.current!==c)return;o(l),u(null)}catch(l){if(n.current!==c)return;throw u(B(l)),l}},[e,d]),D=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>we)=="function")s=await we(d,e);else{const c=await wt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),j=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;if(d&&typeof V(()=>xe)=="function")s=await xe(d,e);else{const c=await xt(e);s=X(c)}if(n.current!==a)return;o(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e,d]),P=r.useCallback(async a=>{n.current+=1;const s=n.current;try{let c;if(d&&typeof V(()=>ye)=="function")c=await ye(d,a,e);else{const l=await et({url:a},e);c={url:l.manualUrl??l.previewUrl??l.detectedUrl??null,source:l.manualUrl?"manual":"auto"}}if(n.current!==s)return;o(l=>l?{...l,previewUrl:c.url??void 0}:null),u(null)}catch(c){if(n.current!==s)return;throw u(B(c)),c}},[e,d]),h=r.useCallback(async()=>{n.current+=1;const a=n.current;try{let s;try{s=await ae(e)}catch{s=(await je(e)).map(l=>({name:l.name,command:l.command,cwd:l.cwd,scriptName:l.scriptName,packagePath:l.packagePath}))}if(n.current!==a)return;U(s),u(null)}catch(s){if(n.current!==a)return;throw u(B(s)),s}},[e]),p=r.useCallback(async(a,s)=>{if(typeof a!="string"&&!d)try{const v=a,N=await Ne({command:v.command,cwd:v.cwd,scriptName:v.scriptName,packagePath:v.packagePath??v.cwd},e),b=X(N);o(b),y([b]),u(null);return}catch(v){throw u(B(v)),v}const c=typeof a=="string"?a:a.command,l=typeof a=="string"?s:a.cwd;await _(c,l)},[e,_,d]),E=r.useCallback(async()=>{await D()},[D]),L=r.useCallback(async()=>{await j()},[j]),z=r.useCallback(async a=>{await P(a)},[P]),F=r.useCallback(async()=>{await h()},[h]),O=r.useCallback(async()=>{await A()},[A]),H=bt(i),x=i?{...i,pid:i.runtime?.pid}:null;return{session:i,sessions:g,logs:w,detectedCommands:k,previewUrl:H,isLoading:C,error:S,startServer:_,stopServer:D,restartServer:j,setPreviewUrl:P,detectCommands:h,refresh:A,candidates:k,serverState:x,loading:C,start:p,stop:E,restart:L,setManualUrl:z,detect:F,refreshStatus:O}}const ke=500,Ce=100;function Pe(e){return e.length>ke?e.slice(-ke):e}function ze(e){return e==="stderr"?"stderr":"stdout"}function K(e){try{return JSON.parse(e.data)}catch{return null}}function Z(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:ze(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function St(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function oe(e,i){if(i.length===0)return e;const o=[...e],g=new Set(e.map(y=>y.id));for(const y of i)g.has(y.id)||(g.add(y.id),o.push(y));return o.sort((y,w)=>y.id-w.id),Pe(o)}function Nt(e,i){const[o,g]=r.useState([]),[y,w]=r.useState(!1),[f,k]=r.useState(!1),[U,C]=r.useState(!1),[T,S]=r.useState(null),u=r.useRef(null),n=r.useRef(!1),d=r.useRef(0),M=r.useRef(0),R=r.useRef(e),A=r.useRef(i),_=r.useRef(0),D=r.useRef(1);(R.current!==e||A.current!==i)&&(R.current=e,A.current=i,d.current++,n.current=!0,_.current=0,D.current=1,g([]),w(!1),k(!1),C(!1),S(null),u.current&&(u.current(),u.current=null)),r.useEffect(()=>{if(!i){u.current&&(u.current(),u.current=null);return}const E=d.current,L=++M.current;n.current=!1,w(!0);const z=(x,a)=>{const s=Pe(x);g(s),S(a),C(a!==null?a>s.length:!1);const c=s.length>0?s[s.length-1].id:0;_.current=c,D.current=c+1},F=x=>{if(n.current||d.current!==E||!x||typeof x!="object")return;const a=x.lines;if(!Array.isArray(a))return;if(a.length>0&&typeof a[0]=="string"){const c=a.filter(l=>typeof l=="string").map((l,v)=>St(l,v+1));z(c,c.length);return}const s=a.filter(c=>!!c&&typeof c=="object").map((c,l)=>Z(c,l+1));z(s,s.length)},O=x=>{if(n.current||d.current!==E)return;const a=typeof x.text=="string"?x.text:typeof x.line=="string"?x.line:null;if(!a)return;const s=D.current,c=typeof x.id=="number"&&Number.isFinite(x.id)?x.id:s,l={id:c,text:a,stream:ze(x.stream),timestamp:typeof x.timestamp=="string"?x.timestamp:""};_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1),g(v=>oe(v,[l])),S(v=>v===null?v:Math.max(v+1,l.id))};async function H(){try{const a=await ie({maxLines:Ce},e);if(n.current||d.current!==E||M.current!==L)return;const s=a.lines.map((c,l)=>Z(c,l+1));z(s,a.totalLines)}catch{if(n.current||d.current!==E||M.current!==L)return;z([],null)}finally{!n.current&&d.current===E&&M.current===L&&w(!1)}const x=ue(e);u.current=Ue(x,{events:{"dev-server:log":a=>{const s=K(a);s&&O(s)},log:a=>{const s=K(a);s&&O(s)},history:a=>{const s=K(a);F(s)},"dev-server:history":a=>{const s=K(a);F(s)}},onReconnect:()=>{n.current||d.current!==E||ie({lastEventId:_.current,maxLines:50},e).then(a=>{if(n.current||d.current!==E)return;const s=a.lines.map((c,l)=>Z(c,D.current+l));if(s.length>0){const c=s[s.length-1].id;_.current=Math.max(_.current,c),D.current=Math.max(D.current,c+1)}g(c=>oe(c,s)),S(a.totalLines)}).catch(()=>{})}})}return H(),()=>{n.current=!0,u.current&&(u.current(),u.current=null)}},[i,e]);const P=r.useCallback(async()=>{if(!i||f)return;const E=d.current,L=o.length;k(!0);try{const z=await ie({maxLines:Ce,offset:L},e);if(n.current||d.current!==E)return;const F=z.lines.map((O,H)=>Z(O,H+1));g(O=>oe(F,O)),C(z.totalLines>L+F.length),S(z.totalLines)}catch{}finally{k(!1)}},[i,o.length,f,e]),h=r.useCallback(()=>{g([])},[]),p=u.current!==null&&!y&&!n.current;return{entries:o,loading:y,loadingMore:f,hasMore:U,total:T,loadMore:P,clear:h,logs:o,isStreaming:p,clearLogs:h}}const jt="This preview appears to block iframe embedding. Open it in a new tab instead.",kt="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Ct="Preview is taking longer than expected and may block iframe embedding.";function Et(e){return e==="blocked"?jt:e==="error"?kt:null}function Lt(e,i={}){const{loadTimeoutMs:o=1e4,detectionMethod:g=null}=i,y=r.useRef(null),w=r.useRef(null),[f,k]=r.useState("unknown"),[U,C]=r.useState(null),[T]=r.useState(g),S=r.useCallback(()=>{w.current!==null&&(window.clearTimeout(w.current),w.current=null)},[]),u=r.useCallback(j=>{k(j),C(Et(j))},[]),n=r.useCallback(()=>{k("blocked"),C(Ct)},[]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null);let j=!1;return queueMicrotask(()=>{j||(k("loading"),C(null))}),()=>{j=!0,S()}},[S,e]),r.useEffect(()=>{if(f!=="loading"){S();return}const j=setTimeout(()=>{w.current=null,n()},o);return w.current=j,()=>{clearTimeout(j),w.current===j&&(w.current=null)}},[S,f,o,n]);const d=r.useCallback(()=>{const j=y.current;if(!j){u("embedded");return}try{if(j.contentWindow?.location?.href==="about:blank"&&j.src!=="about:blank"){u("blocked");return}}catch{}u("embedded")},[u]),M=r.useCallback(()=>{u("error")},[u]);r.useEffect(()=>{if(S(),!e){k("unknown"),C(null);return}k("unknown"),C(null)},[S]);const R=r.useCallback(()=>{S(),k("unknown"),C(null)},[S]),A=R,_=r.useMemo(()=>f==="embedded",[f]),D=r.useMemo(()=>f==="blocked"||f==="error",[f]);return{embedStatus:f,isEmbedded:_,isBlocked:D,blockReason:U,detectionMethod:T,iframeRef:y,resetEmbedStatus:R,setEmbedStatus:u,retry:A,embedContext:U,handleIframeLoad:d,handleIframeError:M}}const Rt=/\x1b\[[0-9;]*m/g;function me(e){return e.replace(Rt,"")}function _t(e){if(!e)return"";const i=new Date(e);return Number.isNaN(i.getTime())?"":i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function Dt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ut(e){if(e.stream==="stderr")return"error";const i=me(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function Mt(e,i){if(!i)return e;const o=new RegExp(`(${Dt(i)})`,"ig"),g=e.split(o),y=i.toLowerCase();return t.jsx(t.Fragment,{children:g.map((w,f)=>w.toLowerCase()===y?t.jsx("mark",{children:w},`${w}-${f}`):t.jsx("span",{children:w},`${w}-${f}`))})}function At({entries:e,loading:i,loadingMore:o,hasMore:g,total:y,onLoadMore:w,isRunning:f}){const k=r.useRef(null),U=r.useRef(e.length),C=r.useRef(f),[T,S]=r.useState(!1),[u,n]=r.useState(!1),[d,M]=r.useState(""),[R,A]=r.useState("all"),_=r.useMemo(()=>R==="all"?e:e.filter(p=>Ut(p)===R),[e,R]),D=r.useMemo(()=>{const p=d.trim().toLowerCase();return p?_.filter(E=>me(E.text).toLowerCase().includes(p)):_},[_,d]),j=D.length,P=r.useCallback(()=>{const p=k.current;p&&(p.scrollTop=p.scrollHeight,n(!1))},[]);r.useEffect(()=>{const p=C.current,E=U.current,L=e.length>E;f&&(!p||!u&&L)&&P(),C.current=f,U.current=e.length},[e.length,f,u,P]);const h=r.useCallback(()=>{const p=k.current;if(!p)return;const L=p.scrollTop+p.clientHeight>=p.scrollHeight-50;n(!L)},[]);return r.useEffect(()=>{i||e.length===0||!u&&f&&P()},[e,f,u,i,P]),i&&e.length===0?t.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:t.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[t.jsx(ee,{size:16,className:"devserver-log-viewer__spinner"}),t.jsx("span",{children:"Loading logs…"})]})}):t.jsxs("section",{className:`devserver-log-viewer${T?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[t.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[t.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[t.jsx("span",{className:"devserver-log-viewer__title",children:"Logs"}),t.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[y!==null?`${e.length}/${y}`:`${e.length}`," lines"]})]}),t.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[t.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[t.jsx("span",{className:"visually-hidden",children:"Filter logs by severity"}),t.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:R,onChange:p=>A(p.target.value),"data-testid":"devserver-log-severity-filter","aria-label":"Filter logs by severity",children:[t.jsx("option",{value:"all",children:"All severities"}),t.jsx("option",{value:"info",children:"Info"}),t.jsx("option",{value:"warn",children:"Warn"}),t.jsx("option",{value:"error",children:"Error"})]})]}),t.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[t.jsx("span",{className:"visually-hidden",children:"Search logs"}),t.jsx(it,{size:14}),t.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:d,onChange:p=>M(p.target.value),placeholder:"Search logs","data-testid":"devserver-log-search-input","aria-label":"Search logs"})]}),d.trim().length>0&&t.jsxs("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:[j," match",j===1?"":"es"]}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>S(p=>!p),"data-testid":"devserver-log-fullscreen-toggle","aria-label":T?"Exit fullscreen logs":"Enter fullscreen logs",children:T?t.jsx(lt,{size:14}):t.jsx(ct,{size:14})})]})]}),t.jsxs("div",{className:"devserver-log-viewer__body",children:[g&&t.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:t.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:w,disabled:o,"data-testid":"devserver-log-load-more-button",children:o?t.jsxs(t.Fragment,{children:[t.jsx(ee,{size:14,className:"devserver-log-viewer__spinner"}),"Loading older logs…"]}):"Load older logs"})}),t.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:h,"data-testid":"devserver-log-content",children:[!i&&D.length===0&&t.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?"No logs yet. Start the dev server to see output.":_.length===0?"No log lines match the selected severity.":"No log lines match your search."}),D.map(p=>{const E=me(p.text),L=_t(p.timestamp);return t.jsxs("div",{className:"devserver-log-line",children:[L&&t.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:L}),p.stream==="stderr"&&t.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:"ERR"}),t.jsx("span",{className:"devserver-log-text",children:Mt(E,d.trim())})]},p.id)})]}),u&&f&&t.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:P,"data-testid":"devserver-log-jump-button",children:[t.jsx(ot,{size:14}),"New logs"]})]})]})}const Tt="devserver-preview-iframe";function Pt({url:e,embedStatus:i,onEmbedStatusChange:o,iframeRef:g,blockReason:y,onRetry:w,className:f=Tt,embedContext:k}){const U=y??k??null,[C,T]=r.useState(0);r.useEffect(()=>{!e||i!=="unknown"||(T(d=>d+1),o("loading"))},[i,o,e]);const S=r.useCallback(()=>{const d=g.current;if(!d){o("embedded");return}try{if(d.contentWindow?.location?.href==="about:blank"&&d.src!=="about:blank"){o("blocked");return}}catch{}o("embedded")},[g,o]),u=r.useCallback(d=>{d.stopPropagation(),o("error")},[o]),n=r.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?t.jsxs("div",{className:"devserver-preview-iframe-shell",children:[t.jsx("iframe",{src:e,ref:g,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:f,title:"Dev server preview",onLoad:S,onError:u,onErrorCapture:u,"data-testid":"devserver-preview-iframe"},`${e}-${C}`),i==="loading"&&t.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading preview..."})]}),i==="blocked"&&t.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Preview cannot be embedded"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]}),i==="error"&&t.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:"Unable to load preview"}),U&&t.jsx("p",{className:"devserver-preview-blocked-context",children:U})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"You can view the preview in a separate browser tab."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:n,children:"Open in new tab"}),w&&t.jsx("button",{type:"button",className:"btn btn-sm",onClick:w,children:"Retry"})]})]})]}):null}const Ee={stopped:{className:"dev-server-status-badge--stopped",label:"Stopped"},starting:{className:"dev-server-status-badge--starting",label:"Starting..."},running:{className:"dev-server-status-badge--running",label:"Running"},stopping:{className:"dev-server-status-badge--starting",label:"Stopping..."},failed:{className:"dev-server-status-badge--failed",label:"Failed"}};function Le(e){return e instanceof Error?e.message:String(e)}function $e(e){return e==="."?"root":e}function Re(e){return e?e==="root"?".":e:null}function _e(e,i,o){return!i||e.scriptName!==i?!1:o?$e(e.cwd)===o:!0}function zt(e){return e.cwd==="."?"root":e.cwd}function $t(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ht({addToast:e,projectId:i}){const{session:o,detectedCommands:g,previewUrl:y,isLoading:w,error:f,startServer:k,stopServer:U,restartServer:C,setPreviewUrl:T,detectCommands:S,refresh:u}=yt(i),n=o?.status??"stopped",d=n==="running"||n==="starting",M=Ee[n]??Ee.stopped,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,loadMore:P}=Nt(i,!!i),h=y,p=o?.config?.cwd??null,[E,L]=r.useState(!0),[z,F]=r.useState(""),[O,H]=r.useState(""),[x,a]=r.useState(null),[s,c]=r.useState(null),[l,v]=r.useState("embedded"),N=l==="embedded"?h:null,{embedStatus:b,setEmbedStatus:Fe,resetEmbedStatus:I,iframeRef:q,isEmbedded:Oe,isBlocked:te,blockReason:re,retry:fe}=Lt(N),[pe,W]=r.useState(!1),he=r.useRef(b);r.useEffect(()=>{const m=he.current!==b;te&&m&&W(!0),b==="embedded"&&W(!1),he.current=b},[b,te]),r.useEffect(()=>{W(!1)},[h]);const J=r.useMemo(()=>{if(!x)return null;const m=Re(p);return g.find($=>!($.scriptName!==x||m&&$.cwd!==m||o?.config?.command&&$.command!==o.config.command))??g.find($=>_e($,x,p))??null},[g,o?.config?.command,x,p]);r.useEffect(()=>{typeof S=="function"&&S().catch(m=>{e(Le(m),"error")})},[e,S]),r.useEffect(()=>{if(x){L(!1);return}L(!0)},[x]),r.useEffect(()=>{if(o?.status==="running"||o?.status==="starting"){o.config?.command?.trim().length>0&&F(o.config.command);return}if(J){F(J.command);return}g.length>0&&F(m=>m.trim().length>0?m:g[0]?.command??"")},[g,J,o?.config?.command,o?.status]),r.useEffect(()=>{H(h??"")},[h]);const se=r.useCallback(()=>{h&&window.open(h,"_blank","noopener,noreferrer")},[h]),ge=r.useCallback(()=>{W(!1),fe()},[fe]),Be=r.useCallback(()=>{try{const m=q.current;if(m?.contentWindow){m.contentWindow.location.reload(),W(!1),I();return}}catch{}if(!(!h||!q.current))try{const m=new URL(h);m.searchParams.set("_t",Date.now().toString()),q.current.src=m.toString(),W(!1),I()}catch{q.current.src=h,W(!1),I()}},[h,q,I]),Y=r.useCallback(async(m,$,ne)=>{c(m);try{await $(),e(ne,"success")}catch(Ke){e(Le(Ke),"error")}finally{c(null)}},[e]),He=r.useCallback(m=>{a(m.scriptName),L(!1),F(m.command),e(`Selected ${m.scriptName} script.`,"success")},[e]),Ve=r.useCallback(()=>{a(null),L(!0),e("Cleared selected dev server script.","success")},[e]),We=()=>{const m=z.trim();if(m.length===0){e("Enter a command before starting the dev server.","warning");return}const $=Re(p)??".",ne=J?.cwd??$;Y("start",()=>k(m,ne),"Dev server started.")},Xe=()=>{Y("stop",U,"Dev server stopped.")},qe=()=>{Y("restart",C,"Dev server restarted.")},Ge=()=>{const m=O.trim(),$=m.length>0?m:null;Y("preview",()=>T($),$?"Preview URL updated.":"Preview URL override cleared.")},Ie=r.useCallback(()=>{f&&u()},[f,u]),Je=n==="starting"||n==="running"||s!==null,Ye=n==="stopped"||s!==null,Qe=n==="stopped"||n==="starting"||s!==null;return t.jsxs("div",{className:"dev-server-view","data-testid":"dev-server-view",children:[t.jsxs("section",{className:"dev-server-header","aria-label":"Dev server controls header",children:[t.jsxs("div",{className:"dev-server-header-title",children:[t.jsx(dt,{size:16}),t.jsx("h2",{children:"Dev Server"}),t.jsx("span",{className:`dev-server-status-badge ${M.className}`,"data-testid":"dev-server-status-badge",children:M.label})]}),t.jsxs("div",{className:"dev-server-header-actions",children:[t.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:We,disabled:Je,"data-testid":"dev-server-start-button",children:[t.jsx(ut,{size:14}),t.jsx("span",{children:s==="start"?"Starting...":"Start"})]}),t.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Xe,disabled:Ye,"data-testid":"dev-server-stop-button",children:[t.jsx(vt,{size:14}),t.jsx("span",{children:s==="stop"?"Stopping...":"Stop"})]}),t.jsxs("button",{type:"button",className:"btn btn-sm",onClick:qe,disabled:Qe,"data-testid":"dev-server-restart-button",children:[t.jsx(mt,{size:14}),t.jsx("span",{children:s==="restart"?"Restarting...":"Restart"})]})]})]}),t.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":"Dev server configuration",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Configuration"}),w&&t.jsx("span",{className:"dev-server-muted",children:"Loading..."})]}),w&&!o&&g.length===0&&t.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[t.jsx(ee,{size:16,className:"dev-server-spin"}),t.jsx("span",{children:"Loading dev server configuration..."})]}),f&&t.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[t.jsx("p",{children:f}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:Ie,children:"Retry"})]}),t.jsxs("div",{className:"dev-server-section",children:[t.jsx("h3",{children:"Script Selection"}),x&&t.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[t.jsx("span",{className:"dev-server-candidate-name",children:x}),t.jsx("span",{className:"dev-server-candidate-source",children:p??"root"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>L(!0),"data-testid":"dev-server-change-selection",children:"Change"}),t.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:Ve,"data-testid":"dev-server-clear-selection",children:"Clear"})]}),E&&g.length===0&&t.jsxs("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:["No dev server scripts detected. Check that your project has a ",t.jsx("code",{children:"package.json"})," with a ",t.jsx("code",{children:"dev"}),", ",t.jsx("code",{children:"start"}),", or similar script."]}),E&&g.length>0&&t.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:g.map(m=>{const $=_e(m,x,p);return t.jsxs("button",{type:"button",className:`dev-server-candidate ${$?"dev-server-candidate--selected":""}`,onClick:()=>He(m),"data-testid":`dev-server-candidate-${m.scriptName}-${$e(m.cwd)}`,children:[t.jsx("span",{className:"dev-server-candidate-name",children:m.scriptName}),t.jsx("span",{className:"dev-server-candidate-command",children:$t(m.command)}),t.jsx("span",{className:"dev-server-candidate-source",children:zt(m)})]},`${m.cwd}::${m.scriptName}::${m.command}`)})})]}),t.jsxs("div",{className:"dev-server-field-group",children:[t.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:"Command"}),t.jsx("input",{id:"dev-server-command",className:"input",value:z,onChange:m=>F(m.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:n==="running"||n==="starting"})]}),(n==="running"||n==="starting")&&o&&t.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[t.jsx("span",{className:"dev-server-label",children:"Running command"}),t.jsx("code",{children:o.config?.command??z})]}),t.jsxs("div",{className:"dev-server-preview-override",children:[t.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:"Preview URL Override"}),t.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:O,onChange:m=>H(m.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:Ge,disabled:s==="preview","data-testid":"dev-server-set-preview",children:"Save"})]}),h&&t.jsxs("p",{className:"dev-server-preview-hint",children:["Auto-detected: ",h]})]}),t.jsx("div",{className:"dev-server-content",children:t.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":"Dev server logs",children:[t.jsxs("div",{className:"dev-server-section-header",children:[t.jsx("h3",{children:"Logs"}),t.jsxs("span",{className:"dev-server-muted",children:[j??R.length," lines"]})]}),t.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:t.jsx(At,{entries:R,loading:A,loadingMore:_,hasMore:D,total:j,onLoadMore:P,isRunning:d})})]})}),t.jsxs("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":"Dev server preview",children:[t.jsxs("div",{className:"devserver-preview-header",children:[t.jsxs("div",{className:"devserver-preview-title",children:[t.jsx(ft,{size:14}),t.jsx("span",{children:"Preview"})]}),t.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:h??"No preview URL","data-testid":"devserver-preview-url-badge",children:["Auto",h?` · ${h}`:" · Not available"]}),t.jsxs("div",{className:"devserver-preview-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>v(m=>m==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:l==="embedded"?"External only":"Embedded"}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Open in new tab",onClick:se,disabled:!h,"data-testid":"devserver-preview-open-tab",children:t.jsx(pt,{})}),t.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:"Refresh preview",onClick:Be,disabled:!h,"data-testid":"devserver-preview-refresh",children:t.jsx(ht,{})})]})]}),t.jsxs("div",{className:"devserver-preview-container","data-embed-status":b,"data-embedded":Oe?"true":"false",children:[!h&&!d&&t.jsx("p",{className:"devserver-preview-empty",children:"Start a dev server to see a live preview here."}),!h&&d&&t.jsx("p",{className:"devserver-preview-empty",children:"No preview URL detected. Start the dev server or set a manual URL to preview your app."}),h&&l==="external"&&t.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[t.jsx("p",{children:"Embedded preview is disabled. Open your app in a separate browser tab."}),t.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:se,"data-testid":"devserver-preview-external-open-tab",children:"Open in new tab"})]}),h&&l==="embedded"&&pe&&te&&t.jsxs("div",{className:b==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[b==="error"?t.jsx(Ae,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):t.jsx(Me,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),t.jsxs("div",{children:[t.jsx("p",{className:"devserver-preview-blocked-title",children:b==="error"?"Preview failed":"Preview blocked"}),re&&t.jsx("p",{className:"devserver-preview-blocked-context",children:re})]}),t.jsx("p",{className:"devserver-preview-blocked-description",children:"Open the preview in a new tab, or retry embedded mode after checking your server settings."}),t.jsxs("div",{className:"devserver-preview-blocked-actions",children:[t.jsx("button",{type:"button",className:"btn btn-primary",onClick:se,"data-testid":"devserver-preview-fallback-open-tab",children:"Open preview in new tab"}),t.jsx("button",{type:"button",className:"btn btn-sm",onClick:ge,"data-testid":"devserver-preview-fallback-retry",children:"Retry embedded preview"})]})]}),h&&l==="embedded"&&!pe&&t.jsx(Pt,{url:h,embedStatus:b,onEmbedStatusChange:Fe,iframeRef:q,blockReason:re,onRetry:ge})]})]})]})}export{Ht as DevServerView};