@runfusion/fusion 0.27.1 → 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 (65) hide show
  1. package/dist/bin.js +3418 -864
  2. package/dist/client/assets/AgentDetailView-DSpIqBOs.css +1 -0
  3. package/dist/client/assets/{AgentDetailView-shgiiUb4.js → AgentDetailView-V32TpEe1.js} +3 -3
  4. package/dist/client/assets/{AgentsView-CpwqOVDz.js → AgentsView-CxITZE-U.js} +3 -3
  5. package/dist/client/assets/ChatView-7WPHyB_7.js +1 -0
  6. package/dist/client/assets/DevServerView-Diw4hjw0.js +1 -0
  7. package/dist/client/assets/{DirectoryPicker-C0kmRv0u.js → DirectoryPicker-CWSApoLU.js} +1 -1
  8. package/dist/client/assets/{DocumentsView-B94U9ijs.js → DocumentsView-1kr0dhsV.js} +1 -1
  9. package/dist/client/assets/{EvalsView-O_4YWy--.js → EvalsView-cDfXYiK6.js} +1 -1
  10. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CkEiF85-.js → ExperimentalAgentOnboardingModal-lNSf6UtY.js} +1 -1
  11. package/dist/client/assets/{InsightsView-D-Qe0tRr.js → InsightsView-D2AjxOnu.js} +1 -1
  12. package/dist/client/assets/{MemoryView-CoRUmRvb.js → MemoryView-Dq4yjIPI.js} +1 -1
  13. package/dist/client/assets/{NodesView-DQzXjcLc.js → NodesView-Cpmkze7n.js} +4 -4
  14. package/dist/client/assets/{PiExtensionsManager-Dn1LmFbq.js → PiExtensionsManager-oi9FHT0y.js} +2 -2
  15. package/dist/client/assets/PluginManager-C4UoLv4U.css +1 -0
  16. package/dist/client/assets/PluginManager-o12KG4e8.js +1 -0
  17. package/dist/client/assets/ResearchView-C7uXon3o.css +1 -0
  18. package/dist/client/assets/ResearchView-C9bjVB7-.js +1 -0
  19. package/dist/client/assets/{SettingsModal-Bg1-3JO_.js → SettingsModal-CT01a5Rh.js} +1 -1
  20. package/dist/client/assets/SettingsModal-Cu93Jjho.js +31 -0
  21. package/dist/client/assets/{SetupWizardModal-DuzYPbuJ.js → SetupWizardModal-Agi3XNtZ.js} +1 -1
  22. package/dist/client/assets/{SkillsView-BIFoVNUf.js → SkillsView-DmZfbGLs.js} +1 -1
  23. package/dist/client/assets/{StashRecoveryView-C52KsV7f.js → StashRecoveryView-BwKJQaUW.js} +1 -1
  24. package/dist/client/assets/{TodoView-sS_mT0Y7.js → TodoView-uJRg4Cnl.js} +2 -2
  25. package/dist/client/assets/dashboard-view-C7Snlgow.js +21 -0
  26. package/dist/client/assets/dashboard-view-DqWnXEbq.css +1 -0
  27. package/dist/client/assets/{folder-open-B9cwJ-OX.js → folder-open-DU-Ec_iC.js} +1 -1
  28. package/dist/client/assets/index-CD0_dkME.css +1 -0
  29. package/dist/client/assets/index-DiewofJh.js +692 -0
  30. package/dist/client/assets/{star-BDn04UYV.js → star-Qi0GspVN.js} +1 -1
  31. package/dist/client/assets/{upload-zdPPycKQ.js → upload-Dx_l9Vbu.js} +1 -1
  32. package/dist/client/assets/{users-CPYZjK2g.js → users-3Qw_TMah.js} +1 -1
  33. package/dist/client/index.html +2 -2
  34. package/dist/client/version.json +1 -1
  35. package/dist/droid-cli/package.json +1 -1
  36. package/dist/extension.js +2628 -573
  37. package/dist/pi-claude-cli/package.json +1 -1
  38. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  39. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/registration.test.ts +2 -4
  40. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/runtime-availability.test.ts +5 -2
  41. package/dist/plugins/fusion-plugin-cli-printing-press/src/__tests__/workflow-integration.test.ts +7 -4
  42. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  43. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  44. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  45. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  46. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  47. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  48. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  49. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  50. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  51. package/package.json +1 -1
  52. package/skill/fusion/references/engine-tools.md +1 -0
  53. package/skill/fusion/references/extension-tools.md +3 -1
  54. package/dist/client/assets/AgentDetailView-B7QRcHJH.css +0 -1
  55. package/dist/client/assets/ChatView-DyRBOIKL.js +0 -1
  56. package/dist/client/assets/DevServerView-Cdelj9-m.js +0 -1
  57. package/dist/client/assets/PluginManager-DtRQXia5.css +0 -1
  58. package/dist/client/assets/PluginManager-Y0fs-6No.js +0 -1
  59. package/dist/client/assets/ResearchView-BEI4ZSGs.css +0 -1
  60. package/dist/client/assets/ResearchView-CjOxKhdS.js +0 -1
  61. package/dist/client/assets/SettingsModal-DL7tjJQa.js +0 -31
  62. package/dist/client/assets/dashboard-view-BoTzlP8b.css +0 -1
  63. package/dist/client/assets/dashboard-view-MB-86hAu.js +0 -21
  64. package/dist/client/assets/index-BOjPRqEk.js +0 -692
  65. package/dist/client/assets/index-BmSEq8Rb.css +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.27.1",
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.3",
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.5",
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.17",
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.12",
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.36",
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.36",
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.36",
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.5",
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.5",
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.5",
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.1",
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",
@@ -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
 
@@ -180,7 +180,9 @@ Create a new mission — a high-level objective that can span multiple milestone
180
180
 
181
181
  List all missions with their current status.
182
182
 
183
- No parameters.
183
+ | Parameter | Type | Required | Description |
184
+ |-----------|------|----------|-------------|
185
+ | `includeDrafts` | boolean | — | Include in-flight mission interview drafts (default: true) |
184
186
 
185
187
  ### fn_mission_show
186
188
 
@@ -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 zs,j as e}from"./vendor-react-K0fH_qHe.js";import{i as dt,b3 as es,t as fs,b4 as Us,b5 as ts,b6 as _s,w as $t,b7 as ze,b8 as Os,b9 as Hs,ba as Bs,bb as Ws,bc as Vs,bd as Gs,s as gs,be as Ks,bf as qs,bg as Rt,bh as Js,bi as Ys,bj as Xs,bk as Qs,k as ps,bl as Zs,p as en,bm as tn,bn as sn,u as nn,bo as an,ab as bs,ac as xs,bp as rn,bq as on,S as cn,W as At,P as Ye,I as it,ao as ln,br as ss,bs as ns,bt as as,B as Xe,a as rs,a8 as dn,a9 as un,bu as mn,bv as hn,aS as fn,bw as gn,T as pn,bx as is,by as bn,h as xn,j as os,m as vn}from"./index-BOjPRqEk.js";import"./vendor-xterm-DzcZoU0P.js";const Et="kb-chat-active-session";function cs(n){const r=typeof n=="string"?n.trim():"",c=r.indexOf("/");return!r||c<=0||c>=r.length-1?{}:{modelProvider:r.slice(0,c),modelId:r.slice(c+1)}}function yn(n){const r=n?.toolCalls;if(!Array.isArray(r))return;const c=r.map(i=>{if(!i||typeof i!="object")return null;const l=i,b=typeof l.toolName=="string"?l.toolName:"";if(!b)return null;const R=l.args;return{toolName:b,...R&&typeof R=="object"?{args:R}:{},isError:!!l.isError,result:l.result,status:"completed"}}).filter(i=>i!==null);return c.length>0?c:void 0}function wn(n){const r=n?.fallback;if(!r||typeof r!="object")return;const c=r,i=typeof c.primaryModel=="string"?c.primaryModel:"",l=typeof c.fallbackModel=="string"?c.fallbackModel:"",b=c.triggerPoint;if(!(!i||!l||b!=="session-creation"&&b!=="prompt-time"))return{primaryModel:i,fallbackModel:l,triggerPoint:b}}function Sn(n){const r=n?.failureInfo;if(!r||typeof r!="object")return;const c=r,i=typeof c.summary=="string"?c.summary.trim():"";if(!i)return;const l=(()=>{const b=c.reference;if(!b||typeof b!="object")return;const R=b,D=typeof R.kind=="string"?R.kind.trim():"",$=typeof R.id=="string"?R.id.trim():"";if(!(!D||!$))return{kind:D,id:$,...typeof R.label=="string"&&R.label.trim()?{label:R.label.trim()}:{}}})();return{summary:i,...typeof c.errorClass=="string"&&c.errorClass.trim()?{errorClass:c.errorClass.trim()}:{},...typeof c.code=="string"&&c.code.trim()?{code:c.code.trim()}:{},...typeof c.detail=="string"&&c.detail.trim()?{detail:c.detail.trim()}:{},...l?{reference:l}:{}}}function ls(n){return typeof n=="string"?{summary:n.trim()||"Failed to get response"}:{summary:typeof n.summary=="string"&&n.summary.trim()?n.summary.trim():"Failed to get response",...typeof n.errorClass=="string"&&n.errorClass.trim()?{errorClass:n.errorClass.trim()}:{},...typeof n.code=="string"&&n.code.trim()?{code:n.code.trim()}:{},...typeof n.detail=="string"&&n.detail.trim()?{detail:n.detail.trim()}:{},...n.reference?{reference:n.reference}:{}}}function Tt(n){return{id:n.id,sessionId:n.sessionId,role:n.role,content:n.content,thinkingOutput:n.thinkingOutput,toolCalls:yn(n.metadata),fallbackInfo:wn(n.metadata),failureInfo:Sn(n.metadata),attachments:n.attachments,createdAt:n.createdAt}}function Nn(n,r){const[c,i]=s.useState([]),[l,b]=s.useState(null),[R,D]=s.useState(!0),[$,S]=s.useState([]),[se,y]=s.useState(!1),[z,f]=s.useState(!1),[ae,A]=s.useState(""),[H,p]=s.useState(""),[j,I]=s.useState([]),[E,T]=s.useState(""),[J,Y]=s.useState(""),[U,v]=s.useState(!0),[h,m]=s.useState(new Map),o=s.useRef(null),u=s.useRef(!1),w=s.useRef(""),M=s.useRef(null),X=s.useRef(c),_=s.useRef(l),Q=s.useRef(z);X.current=c,_.current=l,Q.current=z,s.useEffect(()=>{w.current=E},[E]);const Ae=s.useRef(new Set),G=s.useRef(0),pe=s.useRef(n);pe.current!==n&&(pe.current=n,G.current++),s.useEffect(()=>{const g=G.current;dt(void 0,n).then(x=>{if(G.current!==g)return;const k=new Map;for(const P of x)k.set(P.id,P);m(k)}).catch(()=>{})},[n]);const be=s.useCallback(async()=>{D(!0);try{const x=[...(await es(n)).sessions].sort((k,P)=>new Date(P.updatedAt).getTime()-new Date(k.updatedAt).getTime());i(x)}catch{}finally{D(!1)}},[n]);s.useEffect(()=>{be()},[be]);const De=s.useRef(()=>{}),Z=s.useRef(!1);s.useEffect(()=>{Z.current=!1},[n]),s.useEffect(()=>{if(R||Z.current||_.current)return;const g=fs(Et,n);if(!g){Z.current=!0;return}const x=c.find(k=>k.id===g);if(x){Z.current=!0,De.current(g,x);return}Z.current=!0},[R,c,n]);const N=s.useCallback(async(g,x)=>{y(!0);try{const k=await Us(g,{limit:50,...x},n),P=k.messages.map(Tt);x?.offset&&x.offset>0?S(re=>[...P,...re]):S(P),v(k.messages.length>=50)}catch{}finally{y(!1)}},[n]),oe=s.useCallback(()=>{M.current?.(),M.current=null,w.current="",T(""),A(""),p(""),I([]),f(!1)},[]),ue=s.useCallback((g,x)=>{if(o.current||!g)return!0;u.current=!1,x&&(A(x.streamingText),p(x.streamingThinking),I(x.toolCalls)),f(!0);const{handlers:k}=ts({sessionId:g,tempUserMessageId:"",setStreamingText:A,setStreamingThinking:p,setStreamingToolCalls:I,cancelStreamingFlushesRef:M,addToast:r,onFallbackSession:(re,q)=>{const ne=cs(re.fallbackModel);i(L=>L.map(ee=>ee.id===q?{...ee,...ne}:ee)),b(L=>L&&L.id===q?{...L,...ne}:L)},onDone:()=>{A(""),p(""),I([]),f(!1),Q.current=!1,o.current=null,N(g)},onError:re=>{A(""),p(""),I([]),f(!1),Q.current=!1,o.current=null;const q=ls(re);r?.(q.summary,"error"),N(g)}}),P=_s(g,k,n,{...typeof x?.replayFromEventId=="number"?{lastEventId:x.replayFromEventId}:{}});return o.current=P,!0},[r,N,n]),xe=s.useCallback((g,x)=>{const k=_.current?.id??null;if(g&&k===g&&!x)return;o.current&&(o.current.close(),o.current=null);const P=x??c.find(re=>re.id===g);b(P||null),oe(),v(!0),g?N(g):S([]),P?.isGenerating&&ue(P.id,P.inFlightGeneration),g?$t(Et,g,n):ze(Et,n)},[ue,c,N,n,oe]);De.current=xe;const Qe=s.useCallback(async g=>{const x=await Os(g,n);o.current&&(o.current.close(),o.current=null);const k={id:x.session.id,title:x.session.title,agentId:x.session.agentId,status:x.session.status,modelProvider:x.session.modelProvider,modelId:x.session.modelId,createdAt:x.session.createdAt,updatedAt:x.session.updatedAt};return i(P=>P.some(re=>re.id===k.id)?P:[k,...P]),oe(),xe(k.id,k),S([]),k},[n,oe,xe]),ut=s.useCallback(async g=>{await Hs(g,{status:"archived"},n),i(x=>x.filter(k=>k.id!==g)),l?.id===g&&(b(null),S([]))},[l,n]),Ze=s.useCallback(async g=>{l?.id===g&&o.current&&(o.current.close(),o.current=null),await Bs(g,n),i(x=>x.filter(k=>k.id!==g)),l?.id===g&&(b(null),S([]))},[l,n]),ve=s.useCallback(async()=>{!l||!U||await N(l.id,{offset:$.length})},[l,U,N,$.length]),ye=s.useCallback(()=>{l&&(u.current=!0,M.current?.(),M.current=null,o.current?.close(),o.current=null,Ws(l.id,n).catch(()=>{}),f(!1),A(""),p(""),I([]))},[l,n]),_e=s.useCallback(()=>{w.current="",T("")},[]),we=s.useRef(()=>{}),Se=Vs(),Ne=s.useCallback((g,x)=>{if(!l)return;if(Q.current){w.current=g,T(g);return}u.current=!1,o.current&&(o.current.close(),o.current=null);const k=`temp-${Date.now()}`,P={id:k,sessionId:l.id,role:"user",content:g,createdAt:new Date().toISOString()};S(q=>[...q,P]),A(""),p(""),I([]),f(!0);const{handlers:re}=ts({sessionId:l.id,tempUserMessageId:k,setStreamingText:A,setStreamingThinking:p,setStreamingToolCalls:I,cancelStreamingFlushesRef:M,addToast:r,onFallbackSession:(q,ne)=>{const L=cs(q.fallbackModel);i(ee=>ee.map(F=>F.id===ne?{...F,...L}:F)),b(ee=>ee&&ee.id===ne?{...ee,...L}:ee)},onDone:({messageId:q,message:ne,accumulated:L})=>{const ee=ne?Tt(ne):{id:q||`msg-${Date.now()}`,sessionId:l.id,role:"assistant",content:L.text,thinkingOutput:L.thinking,toolCalls:L.toolCalls.length>0?L.toolCalls:void 0,fallbackInfo:L.fallbackInfo,createdAt:new Date().toISOString()};Ae.current.add(ee.id),S(B=>[...B,ee]),A(""),p(""),I([]),f(!1),Q.current=!1,o.current=null,setTimeout(()=>{Ae.current.delete(ee.id)},1e3),be();const F=w.current.trim();F&&(w.current="",T(""),we.current(F))},onError:(q,ne)=>{const L=ls(q),ee=typeof q=="string"&&Ks(q)&&(Se.isHiddenNow()||Se.wasRecentlyHidden(5e3));if(S(F=>{const B=F.filter(W=>W.id!==ne);return ee?B:[...B,{id:`error-${Date.now()}`,sessionId:l.id,role:"assistant",content:L.summary,failureInfo:L,createdAt:new Date().toISOString()}]}),A(""),p(""),I([]),f(!1),Q.current=!1,o.current=null,console.error("[useChat] Stream error:",q),ee?(console.info("[useChat] Suppressed tab-suspension stream error:",q),l?.id&&(l.isGenerating?ue(l.id,l.inFlightGeneration):N(l.id))):(r?.(L.summary,"error"),be()),!u.current){const F=w.current.trim();F&&(w.current="",T(""),we.current(F))}}});o.current=Gs(l.id,g,re,x,n)},[l,n,be,r,N,ue,Se]);we.current=Ne;const ke=J?c.filter(g=>g.title?.toLowerCase().includes(J.toLowerCase())||g.agentId.toLowerCase().includes(J.toLowerCase())):c;return s.useEffect(()=>{if(!_.current?.isGenerating||(o.current||ue(_.current.id,_.current.inFlightGeneration),!Q.current||o.current||!_.current))return;const g=setInterval(async()=>{if(!Q.current||o.current||!_.current){clearInterval(g);return}try{(await es(n)).sessions.find(P=>P.id===_.current?.id)?.isGenerating||(clearInterval(g),await N(_.current.id),A(""),p(""),I([]),f(!1))}catch{}},3e3);return()=>clearInterval(g)},[ue,N,n,l]),s.useEffect(()=>{const g=G.current,x=n?`?projectId=${encodeURIComponent(n)}`:"",k=()=>G.current!==g,P=F=>{if(k())return;const B=JSON.parse(F.data);i(W=>W.some(te=>te.id===B.id)?W:[B,...W])},re=F=>{if(k())return;const B=JSON.parse(F.data);i(W=>[...W.map(ce=>ce.id===B.id?B:ce)]),_.current?.id===B.id&&(b(B),B.isGenerating&&!o.current&&ue(B.id,B.inFlightGeneration))},q=F=>{if(k())return;const{id:B}=JSON.parse(F.data);i(W=>W.filter(te=>te.id!==B)),_.current?.id===B&&(b(null),S([]))},ne=F=>{if(k())return;const B=JSON.parse(F.data),W=Tt(B);if(!Ae.current.has(W.id)){if(_.current?.id===W.sessionId&&Q.current&&!o.current&&W.role==="assistant"){S(te=>te.some(ce=>ce.id===W.id)?te:[...te,W]),A(""),p(""),I([]),f(!1);return}_.current?.id===W.sessionId&&!Q.current&&S(te=>{if(te.some(ce=>ce.id===W.id))return te;if(W.role==="user"){const ce=te.findIndex(me=>me.role==="user"&&me.id.startsWith("temp-")&&me.content.trim()===W.content.trim());if(ce>=0){const me=[...te];return me[ce]=W,me}}return[...te,W]})}},L=F=>{if(k())return;const{id:B}=JSON.parse(F.data);S(W=>W.filter(te=>te.id!==B))};return gs(`/api/events${x}`,{events:{"chat:session:created":P,"chat:session:updated":re,"chat:session:deleted":q,"chat:message:added":ne,"chat:message:deleted":L}})},[ue,n]),s.useEffect(()=>()=>{o.current&&(o.current.close(),o.current=null)},[]),{sessions:c,activeSession:l,sessionsLoading:R,messages:$,messagesLoading:se,isStreaming:z,streamingText:ae,streamingThinking:H,streamingToolCalls:j,pendingMessage:E,selectSession:xe,createSession:Qe,archiveSession:ut,deleteSession:Ze,sendMessage:Ne,stopStreaming:ye,clearPendingMessage:_e,loadMoreMessages:ve,hasMoreMessages:U,searchQuery:J,setSearchQuery:Y,filteredSessions:ke,refreshSessions:be,agentsMap:h}}const Me="fusion:chat-active-room";function It(n){return[...n].sort((r,c)=>new Date(c.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Je(n,r){const c=n.findIndex(l=>l.id===r.id);if(c===-1)return It([r,...n]);const i=[...n];return i[c]=r,It(i)}function Re(n){try{return JSON.parse(n.data)}catch{return null}}function kn(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 Cn(n,r){const[c,i]=s.useState([]),[l,b]=s.useState(!0),[R,D]=s.useState(null),[$,S]=s.useState(null),[se,y]=s.useState([]),[z,f]=s.useState([]),[ae,A]=s.useState(!1),H=s.useRef(c),p=s.useRef($),j=s.useRef(0),I=s.useRef(n);H.current=c,p.current=$,I.current!==n&&(I.current=n,j.current+=1);const E=s.useCallback(async(h,m=!0)=>{if(!h){y([]),f([]),A(!1);return}m&&f([]),A(!0);try{const[o,u]=await Promise.all([qs(h.id,n),Rt(h.id,{limit:100},n)]);y(o.members),f(u.messages)}catch{y([]),f([])}finally{A(!1)}},[n]),T=s.useCallback(async()=>{b(!0);try{const h=await Js({},n),m=It(h.rooms);i(m),D(null);const o=fs(Me,n);if(o){const u=m.find(w=>w.id===o)??null;u?(S(u),E(u,!0)):ze(Me,n)}}catch(h){const m=h instanceof Error?h.message:"Failed to load chat rooms";D(m),r?.(m,"error")}finally{b(!1)}},[r,E,n]),J=s.useCallback(h=>{if(!h){S(null),ze(Me,n),E(null,!0);return}const m=H.current.find(o=>o.id===h)??null;S(m),m&&($t(Me,m.id,n),E(m,!0))},[E,n]),Y=s.useCallback(async h=>{const o=(await Ys({name:h.name,memberAgentIds:h.memberAgentIds},n)).room;return i(u=>Je(u,o)),S(o),$t(Me,o.id,n),await E(o,!0),o},[E,n]),U=s.useCallback(async h=>{await Xs(h,n),i(m=>m.filter(o=>o.id!==h)),p.current?.id===h&&(S(null),y([]),f([]),ze(Me,n))},[n]),v=s.useCallback(async(h,m)=>{const o=p.current,u=o?.id;if(!u)throw new Error("Select a room before sending a message");const w=kn(u,h);p.current?.id===u&&f(M=>[...M,w]);try{const M=await Qs(u,{content:h,...m?.attachments?{attachments:m.attachments}:{}},n);M.message?.createdAt&&o&&i(_=>Je(_,{...o,updatedAt:M.message.createdAt})),p.current?.id===u&&f(_=>_.map(Q=>Q.id===w.id?M.message:Q));const X=await Rt(u,{limit:100},n);if(p.current?.id!==u)return;f(X.messages)}catch(M){try{const X=await Rt(u,{limit:100},n);p.current?.id===u&&f(X.messages)}catch{p.current?.id===u&&f(X=>X.filter(_=>_.id!==w.id))}throw M}},[n]);return s.useEffect(()=>{T()},[T]),s.useEffect(()=>{const h=j.current,m=n?`/api/events?projectId=${encodeURIComponent(n)}`:"/api/events";return gs(m,{onReconnect:()=>{T()},events:{"chat:room:created":o=>{if(j.current!==h)return;const u=Re(o);u&&i(w=>Je(w,u))},"chat:room:updated":o=>{if(j.current!==h)return;const u=Re(o);u&&(i(w=>Je(w,u)),p.current?.id===u.id&&S(u))},"chat:room:deleted":o=>{if(j.current!==h)return;const u=Re(o);u?.id&&(i(w=>w.filter(M=>M.id!==u.id)),p.current?.id===u.id&&(S(null),y([]),f([]),ze(Me,n)))},"chat:room:member:added":o=>{if(j.current!==h)return;const u=Re(o);!u||p.current?.id!==u.roomId||y(w=>w.some(M=>M.agentId===u.agentId)?w:[...w,u])},"chat:room:member:removed":o=>{if(j.current!==h)return;const u=Re(o);!u||p.current?.id!==u.roomId||y(w=>w.filter(M=>M.agentId!==u.agentId))},"chat:room:message:added":o=>{if(j.current!==h)return;const u=Re(o);u&&(i(w=>{const M=w.find(X=>X.id===u.roomId);return M?Je(w,{...M,updatedAt:u.createdAt}):w}),p.current?.id===u.roomId&&f(w=>{if(w.some(M=>M.id===u.id))return w;if(u.role==="user"){const M=w.findIndex(X=>X.role==="user"&&X.id.startsWith("temp-")&&X.content.trim()===u.content.trim());if(M>=0){const X=[...w];return X[M]=u,X}}return[...w,u]}))},"chat:room:message:updated":o=>{if(j.current!==h)return;const u=Re(o);!u||p.current?.id!==u.roomId||f(w=>w.map(M=>M.id===u.id?u:M))},"chat:room:message:deleted":o=>{if(j.current!==h)return;const u=Re(o);u?.id&&f(w=>w.filter(M=>M.id!==u.id))}}})},[n,T]),s.useEffect(()=>{$&&(c.some(h=>h.id===$.id)||(S(null),y([]),f([]),ze(Me,n)))},[$,n,c]),{rooms:c,roomsLoading:l,roomsError:R,activeRoom:$,activeRoomMembers:se,messages:z,messagesLoading:ae,selectRoom:J,createRoom:Y,deleteRoom:U,sendRoomMessage:v,refreshRooms:T}}function jn(n,r=[]){const c=n.trim().replace(/^#/,"");if(!c)return{ok:!1,error:"Room name is required."};if(/[A-Z]/.test(c))return{ok:!1,error:"Use lowercase letters only."};const i=c.toLowerCase();return i.length>80?{ok:!1,error:"Room names can be at most 80 characters."}:/^[a-z0-9_-]+$/.test(i)?/^[-_]|[-_]$/.test(i)?{ok:!1,error:"Room names cannot start or end with a hyphen or underscore."}:r.some(l=>l.toLowerCase()===i)?{ok:!1,error:"A room with this name already exists."}:{ok:!0,name:i}:{ok:!1,error:"Use lowercase letters, numbers, hyphens, or underscores only."}}function Mn({isOpen:n,onClose:r,onCreate:c,projectId:i,existingRoomNames:l=[]}){const[b,R]=s.useState(""),[D,$]=s.useState([]),[S,se]=s.useState(""),[y,z]=s.useState([]),[f,ae]=s.useState(!1),[A,H]=s.useState(null),[p,j]=s.useState(!1),I=s.useRef(null),E=s.useRef(null);s.useEffect(()=>{n&&(E.current=document.activeElement instanceof HTMLElement?document.activeElement:null,ae(!0),H(null),dt(void 0,i).then(m=>$(m)).catch(()=>{$([]),H("Failed to load agents.")}).finally(()=>ae(!1)))},[n,i]),s.useEffect(()=>{if(!n){R(""),se(""),z([]),H(null),j(!1);return}const m=window.requestAnimationFrame(()=>I.current?.focus());return()=>window.cancelAnimationFrame(m)},[n]),s.useEffect(()=>{if(!n)return;const m=o=>{o.key==="Escape"&&r()};return document.addEventListener("keydown",m),()=>document.removeEventListener("keydown",m)},[n,r]),s.useEffect(()=>{n||E.current?.focus()},[n]);const T=s.useMemo(()=>jn(b,l),[b,l]),J=s.useMemo(()=>{const m=S.trim().toLowerCase();return m?D.filter(o=>o.name.toLowerCase().includes(m)):D},[D,S]),Y=s.useMemo(()=>D.filter(m=>y.includes(m.id)),[D,y]),U=T.ok&&y.length>0&&!p&&!f;if(!n)return null;const v=m=>{p||z(o=>o.includes(m)?o.filter(u=>u!==m):[...o,m])},h=async()=>{if(!T.ok){H(T.error);return}if(y.length===0){H("Select at least one member.");return}H(null),j(!0);try{await c({name:T.name,displayName:`#${T.name}`,memberAgentIds:y}),r()}catch(m){H(m instanceof Error?m.message:"Failed to create room.")}finally{j(!1)}};return zs.createPortal(e.jsx("div",{className:"modal-overlay open",onClick:m=>m.target===m.currentTarget&&r(),children:e.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":"Create room",onClick:m=>m.stopPropagation(),children:[e.jsxs("div",{className:"modal-header",children:[e.jsx("h3",{children:"Create room"}),e.jsx("button",{type:"button",className:"modal-close","aria-label":"Close",onClick:r,children:"×"})]}),e.jsxs("div",{className:"form-group create-room-modal-name-group",children:[e.jsx("label",{htmlFor:"create-room-name",children:"Room name"}),e.jsxs("div",{className:"create-room-modal-name-field",children:[e.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),e.jsx("input",{ref:I,id:"create-room-name",className:"input",value:b,disabled:p,onChange:m=>{const o=m.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();R(o)}})]}),!T.ok&&e.jsx("div",{className:"form-error",children:T.error})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{htmlFor:"create-room-member-search",children:"Members"}),e.jsx("input",{id:"create-room-member-search",className:"input",placeholder:"Search agents",value:S,disabled:p,onChange:m=>se(m.target.value)})]}),Y.length>0&&e.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:Y.map(m=>e.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>v(m.id),disabled:p,children:[m.name," ×"]},m.id))}),e.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:f?e.jsx("div",{className:"create-room-modal-empty",children:"Loading agents..."}):J.length===0?e.jsx("div",{className:"create-room-modal-empty",children:D.length===0?"No agents in this project yet.":"No agents match your search."}):J.map(m=>{const o=y.includes(m.id);return e.jsxs("button",{type:"button",className:`create-room-modal-member-row${o?" create-room-modal-member-row--selected":""}`,onClick:()=>v(m.id),disabled:p,children:[e.jsx(ps,{agent:m,size:20}),e.jsx("span",{children:m.name}),e.jsx("span",{className:"create-room-modal-member-role",children:m.role})]},m.id)})}),A&&e.jsx("div",{className:"form-group",children:e.jsx("div",{className:"form-error",children:A})}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:r,disabled:p,children:"Cancel"}),e.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void h(),disabled:!U,children:p?"Creating...":"Create room"})]})]})}),document.body)}function vs(n){const r=new Date(n),i=new Date().getTime()-r.getTime(),l=Math.floor(i/1e3),b=Math.floor(l/60),R=Math.floor(b/60),D=Math.floor(R/24);return l<60?"just now":b<60?`${b}m ago`:R<24?`${R}h ago`:D<7?`${D}d ago`:r.toLocaleDateString()}function ds(n,r){if(!n||!r)return null;const c=r.toLowerCase();if(c.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(c.includes("gpt")||c.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(c.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 i=r.replace(/-/g," ").replace(/^\w/,l=>l.toUpperCase()).replace(/\s+/g," ").trim();return i.length>30?i.slice(0,30)+"…":i}function lt(n,r){return n.length<=r?n:`${n.slice(0,r)}…`}function Rn(n){if(!n)return null;const r=Object.entries(n);return r.length===0?null:r.map(([c,i])=>{const l=typeof i=="string"?i:(()=>{try{return JSON.stringify(i)}catch{return String(i)}})();return`${c}=${lt(l,50)}`}).join(", ")}function An(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 En(n){if(!n)return null;if(n.kind==="mailbox"||n.kind==="mailbox-message"){const r=typeof window>"u"?"/":window.location.pathname||"/",c=new URLSearchParams(typeof window>"u"?"":window.location.search);return c.set("view","mailbox"),c.set("mailbox-message",n.id),`${r}?${c.toString()}#message-${encodeURIComponent(n.id)}`}return null}function Tn(n){if(!n)return null;const r=n.label??`${n.kind} ${n.id}`,c=En(n),i=`chat-failure-reference-${n.kind}-${n.id}`.replace(/[^a-zA-Z0-9_-]+/g,"-").toLowerCase();return e.jsxs("div",{className:"chat-message-failure-reference",children:[e.jsx("span",{className:"chat-message-failure-reference-label",children:"Reference"}),e.jsx("span",{className:"chat-message-failure-reference-value",children:r}),c?e.jsx("a",{className:"btn btn-sm chat-message-failure-reference-link",href:c,children:"Open mailbox message"}):e.jsxs("details",{className:"chat-message-failure-reference-details",children:[e.jsx("summary",{className:"btn btn-sm chat-message-failure-reference-link",children:"View failure details"}),e.jsxs("dl",{className:"chat-message-failure-reference-meta",id:i,children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Kind"}),e.jsx("dd",{children:n.kind})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"ID"}),e.jsx("dd",{children:n.id})]}),n.label&&e.jsxs("div",{children:[e.jsx("dt",{children:"Label"}),e.jsx("dd",{children:n.label})]})]})]})]})}function ys(n){if(!n||n.length===0)return null;const r=(y,z)=>{const f=y.status==="running",ae=y.status==="completed"&&y.isError,A=Rn(y.args),H=An(y.result),p=f?A:H?`result: ${H}`:A?`args: ${A}`:null,j=f?"running":ae?"error":"completed";return e.jsxs("details",{className:`chat-tool-call${f?" chat-tool-call--running":""}${ae?" chat-tool-call--error":""}`,open:f,children:[e.jsxs("summary",{children:[e.jsx("span",{className:"chat-tool-call-status-dot","aria-hidden":"true"}),e.jsx("span",{className:"chat-tool-call-name",title:y.toolName,children:y.toolName}),p&&e.jsx("span",{className:"chat-tool-call-preview",title:p,children:p}),e.jsx("span",{className:"chat-tool-call-status-text",children:j})]}),e.jsxs("div",{className:"chat-tool-call-content",children:[A&&e.jsxs("div",{className:"chat-tool-call-row",children:[e.jsx("span",{className:"chat-tool-call-label",children:"args"}),e.jsx("span",{className:"chat-tool-call-value",children:A})]}),H&&e.jsxs("div",{className:`chat-tool-call-row${ae?" chat-tool-call-row--error":""}`,children:[e.jsx("span",{className:"chat-tool-call-label",children:"result"}),e.jsx("span",{className:"chat-tool-call-value",children:H})]})]})]},`${y.toolName}-${z}`)},c="chat-tool-calls";if(n.length===1)return e.jsxs("div",{className:c,"data-testid":"chat-tool-calls",children:[e.jsxs("div",{className:"chat-tool-calls-header",children:[e.jsx(is,{size:12,"aria-hidden":"true"}),e.jsx("span",{children:"Tool calls"})]}),r(n[0],0)]});const i=n.filter(y=>y.status==="running").length,l=n.filter(y=>y.status==="completed"&&y.isError).length,b=i>0,R=Array.from(new Set(n.map(y=>y.toolName))),D=R.slice(0,5),$=Math.max(0,R.length-D.length),S=$>0?`${D.join(", ")}, +${$} more`:D.join(", "),se=b?`(${i} running)`:l>0?`(${l} ${l===1?"error":"errors"})`:null;return e.jsx("div",{className:c,"data-testid":"chat-tool-calls",children:e.jsxs("details",{className:"chat-tool-calls-group","data-testid":"chat-tool-calls-group",open:b,children:[e.jsxs("summary",{className:"chat-tool-calls-group-summary",children:[e.jsx(is,{size:12,"aria-hidden":"true"}),e.jsxs("span",{className:"chat-tool-calls-count",children:[n.length," tool calls"]}),e.jsx("span",{className:"chat-tool-calls-names",title:S,children:S}),se&&e.jsx("span",{className:"chat-tool-calls-group-status",children:se})]}),n.map((y,z)=>r(y,z))]})})}const ws={pre:({children:n,...r})=>e.jsx("pre",{...r,className:"chat-markdown-pre",children:n}),table:({children:n,...r})=>e.jsx("table",{...r,className:"chat-markdown-table",children:n})},Ue="__fn_agent__",Dn=280,ot=180,ct=500,us="fusion:chat-sidebar-width",ms="fusion:chat-scope",$n=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"];function hs(n){const r=/(^|[\s])\/([^\s]*)$/.exec(n);if(!r)return null;const c=r[1]??"",i=r[2]??"",l=r.index+c.length;return{filter:i,start:l,end:n.length}}function In(n,r){const c=n.slice(0,r),i=/(^|[\s\n])@([\w-]*)$/.exec(c);if(!i)return null;const l=i[2]??"",b=c.length-l.length-1;return{filter:l,start:b,end:r}}function Pn({projectId:n,onClose:r,onCreate:c}){const[i,l]=s.useState("agent"),[b,R]=s.useState([]),[D,$]=s.useState(!0),[S,se]=s.useState(""),[y,z]=s.useState([]),[f,ae]=s.useState(!0),[A,H]=s.useState(""),[p,j]=s.useState([]),[I,E]=s.useState([]);s.useEffect(()=>{let v=!1;return $(!0),dt(void 0,n).then(h=>{v||R(h)}).catch(()=>{v||R([])}).finally(()=>{v||$(!1)}),()=>{v=!0}},[n]),s.useEffect(()=>{ae(!0),xn().then(v=>{z(v.models),j(v.favoriteProviders),E(v.favoriteModels)}).catch(()=>{z([]),j([]),E([])}).finally(()=>{ae(!1)})},[]);const T=s.useCallback(async v=>{const h=p,o=h.includes(v)?h.filter(u=>u!==v):[v,...h];j(o);try{await os({favoriteProviders:o,favoriteModels:I})}catch{j(h)}},[p,I]),J=s.useCallback(async v=>{const h=I,o=h.includes(v)?h.filter(u=>u!==v):[v,...h];E(o);try{await os({favoriteProviders:p,favoriteModels:o})}catch{E(h)}},[I,p]),Y=v=>{if(v.preventDefault(),i==="agent"){if(!S)return;c({agentId:S});return}if(!A)return;const h=A.indexOf("/");if(h<=0)return;const m=A.slice(0,h),o=A.slice(h+1);c({agentId:Ue,modelProvider:m,modelId:o})},U=i==="agent"?!S:!A;return e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:r,role:"dialog","aria-modal":"true",children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:v=>v.stopPropagation(),children:[e.jsx("h3",{children:"New Chat"}),e.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{l("agent"),H("")},children:"Agent"}),e.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${i==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{l("model"),se("")},children:"Model"})]}),e.jsxs("form",{onSubmit:Y,children:[i==="agent"&&e.jsxs("label",{className:"chat-new-dialog-model-label",children:["Agent",D?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading agents..."}):b.length===0?e.jsx("div",{className:"chat-new-dialog-empty",children:"No agents available"}):e.jsx("div",{className:"chat-new-dialog-agent-list",children:b.map(v=>e.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${S===v.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>se(v.id),"data-testid":`agent-option-${v.id}`,children:[e.jsx(Xe,{size:16}),e.jsx("span",{className:"chat-new-dialog-agent-name",children:v.name}),e.jsx("span",{className:"chat-new-dialog-agent-role",children:v.role})]},v.id))})]}),i==="model"&&e.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:f?e.jsx("div",{className:"chat-new-dialog-loading",children:"Loading models..."}):e.jsx(vn,{models:y,value:A,onChange:H,label:"Model",placeholder:"Select a model",favoriteProviders:p,onToggleFavorite:T,favoriteModels:I,onToggleModelFavorite:J})}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{type:"button",className:"btn btn-sm",onClick:r,children:"Cancel"}),e.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:U,children:"Create"})]})]})]})})}const Dt=s.memo(function({message:r,forcePlain:c,agentName:i,hideAssistantIdentity:l,showAssistantModelTag:b,activeModelTag:R,activeModelProvider:D,activeSessionId:$,mentionAgentsByName:S,roomContext:se,copyAction:y}){const z=r.role==="assistant",f=z?r.failureInfo:void 0,ae=z&&(!l||!!f),A=s.useMemo(()=>{if(z)return null;const j=r.content,I=/@([\w-]+)/g,E=[];let T=0,J=I.exec(j);for(;J;){const[Y,U=""]=J,v=J.index;v>T&&E.push(j.slice(T,v));const h=U.replace(/_/g," ").toLowerCase(),m=S.get(h);if(m){const o=!!(se&&!se.memberIds.has(m.id)),u=o?`Not a member of ${se?.roomName}`:void 0;E.push(e.jsxs("span",{className:`chat-mention-chip${o?" chat-mention-chip--non-member":""}`,title:u,"aria-label":u,children:["@",m.name.replace(/\s+/g,"_")]},`${m.id}-${v}`))}else E.push(Y);T=v+Y.length,J=I.exec(j)}return T<j.length&&E.push(j.slice(T)),E.length===0?j:E},[z,r.content,S,se]),H=s.useMemo(()=>{const j=r.attachments;if(!j||j.length===0||!$)return null;const I=`/api/chat/sessions/${encodeURIComponent($)}/attachments/`;return e.jsx("div",{className:"chat-message-attachments",children:j.map(E=>{const T=E.mimeType.startsWith("image/"),J=E.id||E.filename,Y=`${I}${encodeURIComponent(E.filename)}`;return T?e.jsx("a",{className:"chat-message-attachment-link","data-testid":"chat-message-attachment",href:Y,target:"_blank",rel:"noopener noreferrer",children:e.jsx("img",{className:"chat-message-attachment",src:Y,alt:E.originalName})},J):e.jsxs("a",{className:"chat-message-attachment-file","data-testid":"chat-message-attachment",href:Y,target:"_blank",rel:"noopener noreferrer",children:[e.jsx(gn,{size:14}),e.jsx("span",{children:E.originalName})]},J)})})},[r.attachments,$]),p=s.useMemo(()=>z?f?e.jsxs("div",{className:"chat-message-content chat-message-content--failure",children:[e.jsxs("div",{className:"chat-message-failure-summary-row",children:[e.jsx("span",{className:"status-dot status-dot--error","aria-hidden":"true"}),e.jsx("span",{className:"chat-message-failure-label",children:"Response failed"})]}),e.jsx("div",{className:"chat-message-failure-summary",children:f.summary}),(f.errorClass||f.code)&&e.jsxs("div",{className:"chat-message-failure-badges",children:[f.errorClass&&e.jsx("span",{className:"chat-message-failure-badge",children:f.errorClass}),f.code&&e.jsx("span",{className:"chat-message-failure-badge",children:f.code})]}),(f.detail||f.reference)&&e.jsxs("details",{className:"chat-message-failure-details",children:[e.jsxs("summary",{children:[e.jsx(pn,{size:14,"aria-hidden":"true"}),e.jsx("span",{children:"Failure details"})]}),f.detail&&e.jsx("pre",{className:"chat-message-failure-detail",children:f.detail}),Tn(f.reference)]})]}):c?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:r.content}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(bs,{remarkPlugins:[xs],components:ws,children:r.content})}):null,[f,c,z,r.content]);return e.jsxs("div",{className:`chat-message chat-message--${r.role}${f?" chat-message--failure":""}`,"data-testid":`chat-message-${r.id}`,children:[ae&&e.jsxs("div",{className:"chat-message-avatar",children:[D?e.jsx(Ye,{provider:D,size:"sm"}):e.jsx(Xe,{size:14}),e.jsx("span",{children:i}),b&&R&&e.jsx("span",{className:"chat-model-tag",children:R})]}),z?p:e.jsx("div",{className:"chat-message-content",children:A}),!f&&y,ys(r.toolCalls),r.thinkingOutput&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:r.thinkingOutput})]}),H,e.jsx("div",{className:"chat-message-time",children:vs(r.createdAt)})]})});function _n({projectId:n,addToast:r,experimentalFeatures:c}){const{activeSession:i,sessionsLoading:l,messages:b,messagesLoading:R,isStreaming:D,streamingText:$,streamingThinking:S,streamingToolCalls:se,selectSession:y,createSession:z,archiveSession:f,deleteSession:ae,sendMessage:A,stopStreaming:H,pendingMessage:p,clearPendingMessage:j,searchQuery:I,setSearchQuery:E,filteredSessions:T}=Nn(n,r),[J,Y]=s.useState(!1),[U,v]=s.useState(""),[h,m]=s.useState(null),[o,u]=s.useState(null),[w,M]=s.useState(null),[X,_]=s.useState(!0),[Q,Ae]=s.useState(Dn),[G,pe]=s.useState("direct"),[be,De]=s.useState(!1),Z=c?.chatRooms===!0,N=Cn(n,r),[oe,ue]=s.useState(new Map),[xe,Qe]=s.useState([]),[ut,Ze]=s.useState(!0),[ve,ye]=s.useState(!1),[_e,we]=s.useState(""),[Se,Ne]=s.useState(0),[ke,g]=s.useState(""),[x,k]=s.useState(!1),[P,re]=s.useState(0),[q,ne]=s.useState(-1),[L,ee]=s.useState(!1),[F,B]=s.useState([]),[W,te]=s.useState(!1),[ce,me]=s.useState(!1),[$e,Pt]=s.useState({}),[et,Oe]=s.useState(!1),[,He]=s.useState(!1),[Ss,Ns]=s.useState({top:0,left:0}),V=Zs({projectId:n}),mt=s.useCallback(t=>{if(!t||!V.mentionActive)return;const a=t.getBoundingClientRect();Ns({top:a.top-260,left:a.left+8})},[V.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),ie=s.useRef(null),zt=s.useRef(null),Ut=s.useRef([]),Be=s.useRef(0),We=s.useRef(new Map),O=en()==="mobile";s.useEffect(()=>{try{const t=localStorage.getItem(us);if(!t)return;const a=Number.parseInt(t,10);if(Number.isNaN(a))return;const d=Math.max(ot,Math.min(ct,a));Ae(d)}catch{}},[]),s.useEffect(()=>{try{const t=localStorage.getItem(ms);if(t==="direct"){pe("direct");return}t==="rooms"&&Z&&pe("rooms")}catch{}},[Z]),s.useEffect(()=>{if(!Z&&G==="rooms"){pe("direct");return}try{localStorage.setItem(ms,G)}catch{}},[Z,G]);const ks=Z&&G==="rooms"&&!!N.activeRoom,{keyboardOverlap:tt,viewportHeight:_t,viewportOffsetTop:Ot,keyboardOpen:Ve}=tn({enabled:O&&(!!i||ks)}),Ht=tt>0||Ot>0,Bt=Ve&&Ht?{"--keyboard-overlap":`${tt}px`,"--vv-offset-top":`${Ot}px`,..._t!==null?{"--vv-height":`${_t}px`}:{}}:{},Wt=`chat-thread${Ve&&Ht?" chat-thread--keyboard-active":""}`,le=s.useMemo(()=>{const t=_e.trim().toLowerCase();return(t?xe.filter(d=>d.name.toLowerCase().includes(t)):xe).slice(0,10)},[xe,_e]),Ie=s.useMemo(()=>Array.from(oe.values()),[oe]),fe=s.useMemo(()=>!Z||G!=="rooms"||!N.activeRoom?null:{roomId:N.activeRoom.id,roomName:N.activeRoom.name,memberIds:new Set(N.activeRoomMembers.map(t=>t.agentId))},[Z,G,N.activeRoom,N.activeRoomMembers]),Te=s.useMemo(()=>{const t=Ie.filter(C=>sn(C.name,ke));if(!fe)return t;const a=t.filter(C=>fe.memberIds.has(C.id));if(ke.trim().length===0)return a;const d=t.filter(C=>!fe.memberIds.has(C.id));return[...a,...d]},[Ie,ke,fe]),gt=s.useMemo(()=>{const t=new Map;for(const a of Ie)t.set(a.name.toLowerCase(),a);return t},[Ie]);s.useEffect(()=>{Ne(0)},[le]),s.useEffect(()=>{re(0)},[ke,x]),s.useEffect(()=>()=>{he.current!==null&&window.clearTimeout(he.current)},[]);const Vt=s.useCallback(()=>{const t=Ee.current;if(!t)return;const d=t.scrollTop+t.clientHeight>=t.scrollHeight-50;me(!d),ht.current=!d},[]),Pe=s.useCallback(t=>{if(!t.isConnected)return;let a=0,d=0,C=-1;const K=6,de=()=>{if(t.isConnected){if(t.scrollTop=t.scrollHeight,t.scrollHeight===C?d+=1:(d=0,C=t.scrollHeight),a+=1,a>=K||d>=2){me(!1),ht.current=!1;return}window.requestAnimationFrame(de)}};de()},[]),Ge=s.useCallback(()=>{const t=Ee.current;t&&Pe(t)},[Pe]);s.useLayoutEffect(()=>{const t=i?.id??null;if(!t){ft.current=null;return}const a={sessionId:t,loaded:!R,hasMessages:b.length>0},d=ft.current,C=d?.sessionId!==t,K=d?.sessionId===t&&!d.loaded&&a.loaded,de=d?.sessionId===t&&!d.hasMessages&&a.hasMessages;if(!(d===null||C||K||de))return;const ge=Ee.current;ge&&(Pe(ge),ft.current=a)},[i?.id,b.length,R,Pe]),s.useEffect(()=>{ht.current||Ge()},[b,$,S,D,Ge]),s.useEffect(()=>{tt<=0||!Ee.current||Ge()},[tt,Ge]),nn(O&&Ve),s.useEffect(()=>{const t=()=>m(null);if(h)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[h]),s.useEffect(()=>{if(!O||!Ve)return;const t=a=>{a.target?.closest(".chat-messages")||a.preventDefault()};return document.addEventListener("touchmove",t,{passive:!1}),()=>{document.removeEventListener("touchmove",t)}},[O,Ve]),s.useEffect(()=>{if(!O||!i)return;const t=()=>{const a=ie.current;a&&document.activeElement===a&&(a.blur(),window.setTimeout(()=>{a.focus({preventScroll:!0})},0))};return document.addEventListener("visibilitychange",t),window.addEventListener("pageshow",t),()=>{document.removeEventListener("visibilitychange",t),window.removeEventListener("pageshow",t)}},[O,i]),s.useEffect(()=>{if(!O||!i)return;const t=()=>{const d=Ee.current;d&&Pe(d)},a=()=>{document.visibilityState==="visible"&&t()};return document.addEventListener("visibilitychange",a),window.addEventListener("pageshow",t),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("pageshow",t)}},[O,i,Pe]),s.useEffect(()=>{let t=!1;const a=n;return dt(void 0,n).then(d=>{if(t||a!==n)return;const C=new Map;for(const K of d)C.set(K.id,K);ue(C)}).catch(()=>{}),()=>{t=!0}},[n]),s.useEffect(()=>{let t=!1;return Ze(!0),an(n).then(a=>{t||Qe(a)}).catch(()=>{t||Qe([])}).finally(()=>{t||Ze(!1)}),()=>{t=!0}},[n]),s.useEffect(()=>{Ut.current=F},[F]),s.useEffect(()=>()=>{for(const t of Ut.current)t.previewUrl&&URL.revokeObjectURL(t.previewUrl);for(const t of We.current.values())window.clearTimeout(t);We.current.clear()},[]);const st=s.useCallback(t=>{if(!t||t.length===0)return;const a=[];for(const d of Array.from(t)){if(!$n.includes(d.type))continue;const C=d.type.startsWith("image/");a.push({file:d,previewUrl:C?URL.createObjectURL(d):""})}a.length>0&&B(d=>[...d,...a])},[]),Cs=s.useCallback(t=>{B(a=>{const d=a[t];return d?.previewUrl&&URL.revokeObjectURL(d.previewUrl),a.filter((C,K)=>K!==t)})},[]),js=s.useCallback(t=>{const a=t.clipboardData?.files;if(!a||a.length===0)return;const d=Array.from(a).filter(C=>C.type.startsWith("image/"));d.length!==0&&st(d)},[st]),Ms=s.useCallback(async t=>{try{await z(t),Y(!1),O&&_(!1)}catch{r("Failed to create chat session","error")}},[z,r,O]),Ke=s.useCallback(()=>{v(""),ye(!1),we(""),k(!1),g(""),ne(-1),B(t=>{for(const a of t)a.previewUrl&&URL.revokeObjectURL(a.previewUrl);return[]})},[]),pt=s.useCallback(()=>{const t=U.trim(),a=F.map(d=>d.file);if(!(!t&&a.length===0||!i)){if(t==="/clear"||t==="/new"){Ke(),H(),j(),z({agentId:i.agentId,modelProvider:i.modelProvider??void 0,modelId:i.modelId??void 0}).catch(()=>{r("Failed to clear conversation","error")});return}Ke(),A(t,a)}},[U,F,i,Ke,H,j,z,r,A]),bt=s.useCallback(async()=>{const t=U.trim();if(t){if(Z&&G==="rooms"){if(!N.activeRoom)return;try{await N.sendRoomMessage(t),Ke()}catch(a){const d=a instanceof Error&&a.message.trim()?a.message:"Failed to send room message";r(d,"error")}return}pt()}},[U,Z,G,N,Ke,r,pt]),xt=s.useCallback(t=>{v(a=>{const d=hs(a);if(!d)return a;const C=`/skill:${t.name} `,K=a.slice(0,d.start)+C+a.slice(d.end);return window.requestAnimationFrame(()=>{ie.current&&(ie.current.style.height="auto",ie.current.style.height=`${Math.min(ie.current.scrollHeight,120)}px`,ie.current.focus())}),K}),ye(!1),we(""),Ne(0)},[]),nt=s.useCallback(t=>{const a=ie.current;if(!a||q<0)return;const d=a.selectionStart??Be.current,C=a.selectionEnd??d,K=Math.max(d,C),de=Math.min(q,K),ge=`${`@${t.name.replace(/\s+/g,"_")}`} `,Mt=U.slice(0,de)+ge+U.slice(K),Fe=de+ge.length;v(Mt),k(!1),g(""),re(0),ne(-1),window.requestAnimationFrame(()=>{ie.current&&(ie.current.style.height="auto",ie.current.style.height=`${Math.min(ie.current.scrollHeight,120)}px`,ie.current.focus(),ie.current.setSelectionRange(Fe,Fe))})},[q,U]),Gt=s.useCallback(t=>{if(Be.current=t.currentTarget.selectionStart??Be.current,V.mentionActive&&V.files.length>0){if(V.handleKeyDown(t,U),t.key==="Enter"||t.key==="Tab"){const a=V.files[V.selectedIndex];if(a){const d=V.selectFile(a,U);v(d),V.dismissMention(),He(!1)}}return}if(x&&t.key==="ArrowDown"){t.preventDefault(),Te.length>0&&re(a=>(a+1)%Te.length);return}if(x&&t.key==="ArrowUp"){t.preventDefault(),Te.length>0&&re(a=>a===0?Te.length-1:a-1);return}if(x&&t.key==="Enter"){t.preventDefault();const a=Te[P]??Te[0];a&&nt(a);return}if(x&&t.key==="Escape"){t.preventDefault(),k(!1),g(""),ne(-1);return}if(ve&&t.key==="ArrowDown"){t.preventDefault(),le.length>0&&Ne(a=>(a+1)%le.length);return}if(ve&&t.key==="ArrowUp"){t.preventDefault(),le.length>0&&Ne(a=>a===0?le.length-1:a-1);return}if(ve&&(t.key==="Enter"||t.key==="Tab")&&le.length>0){t.preventDefault();const a=le[Se]??le[0];a&&xt(a);return}if(ve&&t.key==="Escape"){t.preventDefault(),ye(!1);return}t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),bt())},[x,Te,P,nt,ve,le,Se,xt,bt,V,U]),at=s.useCallback((t,a)=>{const d=In(t,a);if(d){k(!0),g(d.filter),ne(d.start);return}k(!1),g(""),ne(-1)},[]),Kt=s.useCallback(t=>{const a=t.target,d=a.value,C=a.selectionStart??d.length;Be.current=C,v(d);const K=hs(d);K?(ye(!0),we(K.filter)):(ye(!1),we("")),at(d,C),V.detectMention(d,C),He(V.mentionActive),V.mentionActive&&mt(a),a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`},[at]),rt=s.useCallback(t=>{const a=t.currentTarget,d=a.selectionStart??a.value.length;Be.current=d,at(a.value,d),V.detectMention(a.value,d),He(V.mentionActive),V.mentionActive&&mt(a)},[at,V,mt]),qt=s.useCallback(t=>{t.key!=="Escape"&&rt(t)},[rt]),Jt=s.useCallback(()=>{he.current!==null&&window.clearTimeout(he.current),he.current=window.setTimeout(()=>{ye(!1),k(!1),g(""),ne(-1),He(!1),V.dismissMention(),he.current=null},120)},[V]),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)},[]),Rs=s.useCallback(async t=>{m(null);try{await f(t),r("Conversation archived","success")}catch{r("Failed to archive conversation","error")}},[f,r]),As=s.useCallback(async t=>{u(null),m(null);try{await ae(t),r("Conversation deleted","success")}catch{r("Failed to delete conversation","error")}},[ae,r]),qe=s.useCallback(t=>{try{localStorage.setItem(us,String(t))}catch{}},[]),Es=s.useCallback(t=>{if(O)return;t.preventDefault(),t.stopPropagation();const a=t.currentTarget;typeof a.setPointerCapture=="function"&&a.setPointerCapture(t.pointerId);const d=t.clientX,C=Q;let K=C;document.body.style.userSelect="none";const de=ge=>{const Mt=ge.clientX-d,Fe=Math.max(ot,Math.min(ct,C+Mt));K=Fe,Ae(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(K)};document.addEventListener("pointermove",de),document.addEventListener("pointerup",Le)},[O,qe,Q]),Ts=s.useCallback(t=>{if(O||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;t.preventDefault();const a=t.shiftKey?50:10,d=t.key==="ArrowLeft"?-a:a,C=Math.max(ot,Math.min(ct,Q+d));Ae(C),qe(C)},[O,qe,Q]),Xt=s.useCallback(t=>{y(t),Oe(!1),O&&_(!1)},[y,O]),Ds=s.useCallback(()=>{y(""),_(!0),Oe(!1)},[y]),$s=()=>e.jsxs("div",{className:"chat-empty-state",children:[e.jsx(bn,{size:48,strokeWidth:1.5}),e.jsx("h2",{children:"Start a new conversation"}),e.jsxs("button",{className:"btn btn-primary",onClick:()=>Y(!0),children:[e.jsx(it,{size:16}),"New Chat"]})]}),Ce=ds(i?.modelProvider,i?.modelId),je=i?.modelProvider??null,vt=!!(i||D||b.length>0),yt=i?.agentId===Ue?Ce??"Fusion":i?.title||oe.get(i?.agentId??"")?.name||i?.agentId||"Chat",Qt=!!(Ce&&Ce!==yt),Is=O&&G==="direct"&&!!i,wt=oe.get(i?.agentId??"")?.name||(i?.agentId===Ue?Ce??"Fusion":i?.agentId?.slice(0,30)??"Fusion"),St=!1,Nt=i?.agentId===Ue,Ps=p.length>50?`${p.slice(0,50)}…`:p,Ls=s.useCallback(()=>{ee(t=>!t)},[]);s.useEffect(()=>{if(!et)return;const t=a=>{Ft.current?.contains(a.target)||Oe(!1)};return document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[et]),s.useEffect(()=>{(!O||G!=="direct"||X)&&Oe(!1)},[O,G,X]);const kt=s.useCallback((t,a)=>{const d=We.current.get(t);d&&window.clearTimeout(d),Pt(K=>({...K,[t]:a}));const C=window.setTimeout(()=>{Pt(K=>{const{[t]:de,...Le}=K;return Le}),We.current.delete(t)},2e3);We.current.set(t,C)},[]),Zt=s.useCallback(async(t,a)=>{try{if(!navigator.clipboard?.writeText)throw new Error("Clipboard API unavailable");await navigator.clipboard.writeText(a),kt(t,"success")}catch{kt(t,"error")}},[kt]),Fs=s.useCallback((t,a=!1)=>a?e.jsx("div",{className:"chat-message-content chat-message-content--plain",children:t}):e.jsx("div",{className:"chat-message-content chat-message-content--markdown",children:e.jsx(bs,{remarkPlugins:[xs],components:ws,children:t})}),[]),Ct=i?.agentId===Ue,jt=s.useCallback((t,a,d)=>e.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${$e[t]==="success"?" chat-message-copy-action--success":""}${$e[t]==="error"?" chat-message-copy-action--error":""}`,"data-testid":d??`chat-copy-response-${t}`,"aria-label":$e[t]==="success"?"Response copied":$e[t]==="error"?"Copy failed":"Copy response",onClick:()=>{Zt(t,a)},children:$e[t]==="success"?e.jsx(rn,{size:14}):e.jsx(on,{size:14})}),[$e,Zt]);return e.jsxs("div",{className:"chat-view",children:[e.jsxs("div",{className:`chat-sidebar${X?"":" chat-sidebar--hidden"}`,style:O?void 0:{width:`${Q}px`},children:[Z&&e.jsxs("div",{className:"chat-sidebar-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[e.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${G==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":G==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>pe("direct"),children:"Direct"}),e.jsx("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${G==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":G==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>pe("rooms"),children:"Rooms"})]}),!Z||G==="direct"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"chat-sidebar-search-container",children:e.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[e.jsx(cn,{size:14,className:"chat-sidebar-search-icon"}),e.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:"Search conversations...",value:I,onChange:t=>E(t.target.value),"data-testid":"chat-search-input"})]})}),e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:l?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"Loading..."}):T.length===0?e.jsx("div",{style:{padding:"12px",color:"var(--text-secondary)",fontSize:"13px"},children:"No conversations yet"}):T.map(t=>e.jsxs("div",{className:`chat-session-item${i?.id===t.id?" chat-session-item--active":""}`,onClick:()=>Xt(t.id),onContextMenu:a=>{a.preventDefault(),m({sessionId:t.id,x:a.clientX,y:a.clientY})},"data-testid":`chat-session-${t.id}`,children:[e.jsx("button",{className:"chat-session-delete-btn",onClick:a=>{a.stopPropagation(),u(t.id)},"data-testid":"chat-session-delete-btn","aria-label":"Delete conversation",children:e.jsx(At,{size:14})}),e.jsx("div",{className:"chat-session-title",children:t.title||"Untitled"}),e.jsx("div",{className:"chat-session-preview",children:t.lastMessagePreview||"No messages"}),e.jsxs("div",{className:"chat-session-meta",children:[e.jsxs("span",{className:"chat-session-meta-model",children:[t.modelProvider&&e.jsx(Ye,{provider:t.modelProvider,size:"sm"}),e.jsx("span",{children:oe.get(t.agentId)?.name||(t.agentId===Ue?ds(t.modelProvider,t.modelId)??"Fusion":t.agentId.slice(0,30))})]}),e.jsx("span",{children:t.updatedAt?vs(t.updatedAt):""})]})]},t.id))})]}):e.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[e.jsx("div",{className:"chat-sidebar-rooms-header",children:e.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>De(!0),children:[e.jsx(it,{size:14}),"Create room"]})}),N.rooms.length===0?e.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:"No rooms yet."}):e.jsx("div",{className:"chat-session-list chat-sidebar-list",children:N.rooms.map(t=>{const a=N.activeRoom?.id===t.id,d=a?N.activeRoomMembers.length:"—";return e.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${a?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${t.slug}`,onClick:()=>{N.selectRoom(t.id),O&&_(!1)},onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),N.selectRoom(t.id),O&&_(!1))},children:[e.jsxs("span",{className:"chat-room-item-details",children:[e.jsxs("span",{className:"chat-room-item-name",children:["#",t.name]}),e.jsxs("span",{className:"chat-room-item-meta",children:[d," ",d===1?"member":"members"]})]}),e.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${t.slug}`,"aria-label":`Delete room ${t.name}`,onClick:C=>{C.stopPropagation(),M(t.id)},children:e.jsx(At,{size:14})})]},t.id)})})]}),e.jsx("div",{className:"chat-sidebar-footer",children:e.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:()=>Y(!0),"data-testid":"chat-new-btn",children:[e.jsx(it,{size:14}),"New Chat"]})})]}),!O&&X&&e.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":ot,"aria-valuemax":ct,"aria-valuenow":Q,"aria-label":"Resize chat sidebar",tabIndex:0,onPointerDown:Es,onKeyDown:Ts}),h&&e.jsxs("div",{className:"chat-session-context-menu",style:{top:h.y,left:h.x},onClick:t=>t.stopPropagation(),children:[e.jsxs("button",{onClick:()=>Rs(h.sessionId),"data-testid":"chat-context-archive",children:[e.jsx(ln,{size:14}),"Archive"]}),e.jsxs("button",{onClick:()=>{m(null),u(h.sessionId)},"data-testid":"chat-context-delete",children:[e.jsx(At,{size:14}),"Delete"]})]}),o&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>u(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:"Delete Conversation?"}),e.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. All messages in this conversation will be permanently deleted."}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>u(null),children:"Cancel"}),e.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void As(o),children:"Delete"})]})]})}),Z&&w&&e.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>M(null),children:e.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:t=>t.stopPropagation(),children:[e.jsx("h3",{children:"Delete Room?"}),e.jsx("p",{className:"chat-view-delete-dialog-copy",children:"This action cannot be undone. This room and all its messages will be permanently deleted."}),e.jsxs("div",{className:"chat-new-dialog-actions",children:[e.jsx("button",{className:"btn btn-sm",onClick:()=>M(null),children:"Cancel"}),e.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"})]})]})}),Z&&G==="rooms"?e.jsxs("div",{className:Wt,style:Bt,children:[N.activeRoom?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chat-room-thread-header",children:[O&&e.jsx("button",{className:"btn-icon",onClick:()=>{N.selectRoom(null),_(!0)},"data-testid":"chat-back-btn",children:e.jsx(ss,{size:16})}),e.jsxs("div",{className:"chat-thread-header-title",children:["#",N.activeRoom.name]}),e.jsx("div",{className:"chat-room-thread-members",children:N.activeRoomMembers.map(t=>e.jsx(ps,{agent:oe.get(t.agentId)??{id:t.agentId,name:t.agentId.slice(0,30)}},t.agentId))})]}),e.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Vt,children:[N.messagesLoading?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):N.messages.length===0?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):N.messages.map(t=>{const a=t.senderAgentId?oe.get(t.senderAgentId)?.name??t.senderAgentId.slice(0,30):"You",d={id:t.id,sessionId:t.roomId,role:t.role,content:t.content,thinkingOutput:t.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:t.attachments,createdAt:t.createdAt};return e.jsx(Dt,{message:d,forcePlain:L,agentName:a,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:N.activeRoom?.id??null,mentionAgentsByName:gt,roomContext:fe},t.id)}),e.jsx("div",{ref:Lt})]})]}):e.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:"Select a room or create one"}),N.activeRoom&&e.jsx("div",{className:"chat-input-area",children:e.jsxs("div",{className:"chat-input-row",children:[e.jsxs("div",{className:"chat-input-wrapper",children:[e.jsx("textarea",{ref:ie,className:"chat-input-textarea",placeholder:"Type a message...",value:U,onChange:Kt,onKeyDown:Gt,onKeyUp:qt,onClick:rt,onBlur:Jt,onFocus:Yt,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==t.currentTarget&&(t.preventDefault(),t.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),e.jsx(ns,{agents:Ie,filter:ke,highlightedIndex:P,visible:x,onSelect:nt,position:"below",roomMemberIds:fe?.memberIds,roomName:fe?.roomName})]}),e.jsx("button",{type:"button",className:"chat-input-send",onClick:()=>{bt()},disabled:!U.trim(),"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(as,{size:16})})]})})]}):e.jsxs("div",{className:Wt,style:Bt,children:[(vt||!O)&&e.jsxs("div",{className:"chat-thread-header",children:[O&&vt&&e.jsx("button",{className:"btn-icon",onClick:Ds,"data-testid":"chat-back-btn",children:e.jsx(ss,{size:16})}),e.jsx("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:Is?e.jsxs("div",{className:"chat-mobile-session-menu",ref:Ft,children:[e.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":et,onClick:()=>Oe(t=>!t),children:[je?e.jsx(Ye,{provider:je,size:"md"}):e.jsx(Xe,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:yt}),Qt&&e.jsx("span",{className:"chat-model-tag",children:Ce}),e.jsx(rs,{size:16,"aria-hidden":"true"})]}),et&&e.jsx("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:T.map(t=>e.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${i?.id===t.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${t.id}`,onClick:()=>Xt(t.id),children:e.jsx("span",{className:"chat-mobile-session-option-title",children:t.title||"Untitled"})},t.id))})]}):e.jsxs(e.Fragment,{children:[je?e.jsx(Ye,{provider:je,size:"md"}):e.jsx(Xe,{size:16}),e.jsx("span",{className:"chat-thread-header-title",children:yt}),Qt&&e.jsx("span",{className:"chat-model-tag",children:Ce})]})}),vt&&e.jsx("button",{type:"button",className:`chat-thread-header-render-toggle${L?" chat-thread-header-render-toggle--plain":""}`,"data-testid":"chat-thread-render-toggle","aria-label":L?"Show all messages as rendered Markdown":"Show all messages as plain text",onClick:Ls,children:L?e.jsx(dn,{size:14}):e.jsx(un,{size:14})}),!O&&e.jsxs("button",{className:"btn btn-sm btn-primary chat-thread-header-new-chat",onClick:()=>Y(!0),"data-testid":"chat-thread-new-chat-btn",children:[e.jsx(it,{size:14}),"New Chat"]})]}),e.jsxs("div",{className:"chat-messages",ref:Ee,onScroll:Vt,children:[D?e.jsxs(e.Fragment,{children:[b.map(t=>e.jsx(Dt,{message:t,forcePlain:L,agentName:wt,hideAssistantIdentity:Nt,showAssistantModelTag:St,activeModelTag:Ce,activeModelProvider:je,activeSessionId:i?.id??null,mentionAgentsByName:gt,roomContext:null,copyAction:Ct&&t.role==="assistant"?jt(t.id,t.content):void 0},t.id)),e.jsxs("div",{className:"chat-message chat-message--assistant chat-message--streaming",children:[!Nt&&e.jsxs("div",{className:"chat-message-avatar",children:[je?e.jsx(Ye,{provider:je,size:"sm"}):e.jsx(Xe,{size:14}),e.jsx("span",{children:wt}),St]}),$?Fs($,L):e.jsx("div",{className:"chat-message-content chat-message-content--waiting",children:S?"Thinking…":"Connecting…"}),Ct&&$&&jt("__streaming__",$,"chat-copy-response-streaming"),ys(se),S&&e.jsxs("details",{className:"chat-message-thinking",children:[e.jsx("summary",{children:"Thinking"}),e.jsx("pre",{className:"chat-message-thinking-content",children:S})]}),e.jsxs("div",{className:"chat-typing-indicator",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})]}):R?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"Loading messages..."}):b.length===0&&!i?$s():b.length===0&&i?e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:"13px"},children:"No messages yet. Start the conversation!"}):e.jsx(e.Fragment,{children:b.map(t=>e.jsx(Dt,{message:t,forcePlain:L,agentName:wt,hideAssistantIdentity:Nt,showAssistantModelTag:St,activeModelTag:Ce,activeModelProvider:je,activeSessionId:i?.id??null,mentionAgentsByName:gt,roomContext:null,copyAction:Ct&&t.role==="assistant"?jt(t.id,t.content):void 0},t.id))}),e.jsx("div",{ref:Lt})]}),ce&&e.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:Ge,children:[e.jsx(rs,{size:14}),"Latest"]}),i&&e.jsxs("div",{className:"chat-input-area",children:[e.jsx("input",{ref:zt,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:t=>{st(t.target.files),t.target.value=""}}),ve&&e.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":"Skill suggestions",children:ut?e.jsx("div",{className:"chat-skill-menu-empty",children:"Loading skills…"}):le.length===0?e.jsx("div",{className:"chat-skill-menu-empty",children:_e?"No skills found":"No skills available"}):le.map((t,a)=>e.jsxs("button",{type:"button",role:"option","aria-selected":a===Se,className:`chat-skill-menu-item${a===Se?" chat-skill-menu-item--highlighted":""}`,onMouseDown:d=>d.preventDefault(),onMouseEnter:()=>Ne(a),onClick:()=>xt(t),children:[e.jsx("span",{className:"chat-skill-menu-item-name",children:t.name}),e.jsx("span",{className:"chat-skill-menu-item-description",title:t.relativePath,children:t.relativePath})]},t.id))}),F.length>0&&e.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:F.map((t,a)=>e.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${a}`,children:[t.previewUrl?e.jsx("img",{src:t.previewUrl,alt:t.file.name}):e.jsx("span",{className:"chat-attachment-preview-name",children:t.file.name}),e.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>Cs(a),"data-testid":`chat-attachment-remove-${a}`,"aria-label":`Remove ${t.file.name}`,children:"×"})]},t.previewUrl||`${t.file.name}-${a}`))}),e.jsxs("div",{className:"chat-input-row",children:[e.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":"Attach files",onClick:()=>zt.current?.click(),children:e.jsx(mn,{size:16})}),e.jsxs("div",{className:`chat-input-wrapper${W?" chat-input-wrapper--dragover":""}`,onDragOver:t=>{t.preventDefault(),te(!0)},onDragLeave:()=>te(!1),onDrop:t=>{t.preventDefault(),te(!1),st(t.dataTransfer.files)},children:[e.jsx("textarea",{ref:ie,className:"chat-input-textarea",placeholder:"Type a message...",value:U,onChange:Kt,onKeyDown:Gt,onKeyUp:qt,onClick:rt,onBlur:Jt,onFocus:Yt,onPaste:js,onTouchStart:t=>{typeof window>"u"||window.innerWidth>768||document.activeElement!==t.currentTarget&&(t.preventDefault(),t.currentTarget.focus({preventScroll:!0}))},rows:1,"data-testid":"chat-input"}),e.jsx(ns,{agents:Ie,filter:ke,highlightedIndex:P,visible:x,onSelect:nt,position:"below",roomMemberIds:fe?.memberIds,roomName:fe?.roomName}),e.jsx(hn,{visible:V.mentionActive&&!x,position:Ss,files:V.files,selectedIndex:V.selectedIndex,onSelect:t=>{const a=V.selectFile(t,U);v(a),V.dismissMention(),He(!1),ie.current?.focus()},loading:V.loading}),p&&e.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[e.jsx("span",{children:`Queued: ${Ps}`}),e.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":"Dismiss queued message","data-testid":"chat-pending-dismiss",onClick:j,children:"×"})]})]}),D?e.jsx("button",{className:"chat-input-stop",onClick:H,"aria-label":"Stop generation","data-testid":"chat-stop-btn",children:e.jsx(fn,{size:14})}):e.jsx("button",{type:"button",className:"chat-input-send",onPointerDown:t=>{t.pointerType&&t.pointerType!=="mouse"&&t.preventDefault()},onMouseDown:t=>{t.preventDefault()},onClick:()=>{pt()},disabled:!U.trim()&&F.length===0,"data-testid":"chat-send-btn",style:{touchAction:"manipulation"},children:e.jsx(as,{size:16})})]})]})]}),Z&&e.jsx(Mn,{isOpen:be,onClose:()=>De(!1),projectId:n,existingRoomNames:N.rooms.map(t=>t.name),onCreate:async t=>{await N.createRoom({name:t.name,memberAgentIds:t.memberAgentIds}),De(!1)}}),J&&e.jsx(Pn,{projectId:n,onClose:()=>Y(!1),onCreate:Ms})]})}export{_n 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-BOjPRqEk.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};
@@ -1 +0,0 @@
1
- .plugin-manager,.plugin-manager-detail{display:flex;flex-direction:column;gap:var(--space-lg);padding-inline:var(--space-xl);padding-block:var(--space-md)}.plugin-manager-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--space-sm);border-bottom:var(--btn-border-width) solid var(--border);gap:var(--space-sm)}.plugin-manager-header-title{font-size:var(--font-size-sm, .85rem);font-weight:600;color:var(--text);flex:1}.plugin-manager-actions{display:flex;gap:var(--space-sm);align-items:center}.plugin-install-form{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-lg);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-install-hint{margin:0;font-size:var(--font-size-sm, .85rem);color:var(--text-secondary, var(--text-muted));line-height:1.45}.plugin-install-hint code{padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-sm);background:color-mix(in srgb,var(--text-muted) 12%,transparent);font-size:.85em}.plugin-install-actions{display:flex;gap:var(--space-sm);justify-content:flex-end}.plugin-list{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.plugin-item:hover{border-color:var(--text-dim)}.plugin-info{display:flex;align-items:center;gap:var(--space-sm);min-width:0}.plugin-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plugin-version{font-size:var(--font-size-sm, .85rem)}.plugin-state-badge{display:inline-flex;align-items:center;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-pill);font-size:var(--font-size-3xs, .7rem);font-weight:600;text-transform:uppercase;letter-spacing:.04em;background:color-mix(in srgb,currentColor 12%,transparent)}.plugin-actions{display:flex;align-items:center;gap:var(--space-xs);flex-shrink:0}.plugin-manager-detail-header,.plugin-detail-title{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.plugin-detail-name{margin:0}.plugin-detail-content{display:flex;flex-direction:column;gap:var(--space-lg)}.plugin-detail-card{background:var(--surface);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-md)}.plugin-description{font-size:var(--font-size-md, .95rem);color:var(--text-secondary, var(--text-muted));line-height:1.5}.plugin-detail-meta-row{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--font-size-base, .9rem);color:var(--text-muted)}.plugin-homepage{flex-wrap:wrap;align-items:flex-start}.plugin-homepage a{display:inline-flex;align-items:center;gap:var(--space-xs);color:var(--color-info);font-size:var(--font-size-sm, .85rem);flex-wrap:wrap;overflow-wrap:anywhere}.plugin-detail-section-heading{margin:0;padding:0;border:0;font-size:var(--font-size-md, .95rem)}.plugin-settings-form{display:flex;flex-direction:column;gap:var(--space-lg);margin-top:var(--space-xs)}.plugin-settings-form .form-group{padding:0;margin:0}.plugin-settings-group{display:flex;flex-direction:column;gap:var(--space-md)}.plugin-settings-group-heading{margin:0;font-size:var(--font-size-xs, .8rem);font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted)}.plugin-settings-array{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-settings-array-item{display:flex;align-items:center;gap:var(--space-sm)}.plugin-settings-array-item input{flex:1}.plugin-security-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);flex-wrap:wrap}.plugin-security-results{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-security-header{display:flex;gap:var(--space-sm);align-items:center}.plugin-security-summary{margin:0}.plugin-security-badge{font-weight:700}.plugin-security-badge--warning,.plugin-security-badge--unavailable{color:var(--color-warning)}.plugin-security-badge--blocked,.plugin-security-badge--error{color:var(--color-error)}.plugin-security-findings{margin:0;padding-inline-start:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-xs)}.plugin-detail-actions{display:flex;gap:var(--space-sm);padding-top:var(--space-md);border-top:var(--btn-border-width) solid var(--border);justify-content:flex-end}.plugin-manager .empty-state,.plugin-manager .loading-state,.plugin-manager .settings-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-2xl);text-align:center;color:var(--text-muted)}.plugin-builtins-section{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-builtins-header{display:flex;flex-direction:column;gap:var(--space-xs)}.plugin-builtins-heading{margin:0;font-size:var(--font-size-md, .95rem)}.plugin-builtins-description{margin:0;font-size:var(--font-size-sm, .85rem);color:var(--text-muted)}.plugin-builtins-list{width:100%;display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.plugin-builtins-item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-builtins-meta{display:flex;align-items:center;gap:var(--space-sm);row-gap:var(--space-xs);flex-wrap:wrap;min-width:0}.plugin-builtins-name{color:var(--text);font-size:var(--font-size-base, .9rem);font-weight:500}.plugin-builtins-runtime-badge{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);background:var(--status-in-review-bg);color:var(--in-review);font-size:var(--font-size-2xs, .75rem);font-weight:600;text-transform:uppercase}.plugin-builtins-status{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);font-size:var(--font-size-2xs, .75rem);font-weight:600;text-transform:uppercase}.plugin-builtins-status--installed{background:var(--status-done-bg);color:var(--done)}.plugin-builtins-status--available{background:var(--status-todo-bg);color:var(--todo)}.plugin-builtins-setup-status{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);font-size:var(--font-size-2xs, .75rem);font-weight:600;text-transform:uppercase}.plugin-builtins-setup-status--warning{background:var(--status-in-review-bg);color:var(--color-warning)}.plugin-builtins-setup-status--ready{background:var(--status-done-bg);color:var(--color-success)}.plugin-builtins-setup-status--pending{background:var(--status-todo-bg);color:var(--color-warning)}.plugin-builtins-setup-status--deferred{background:var(--status-archived-bg);color:var(--text-muted)}.plugin-builtins-description-text{flex:1 1 100%;color:var(--text-muted);font-size:var(--font-size-sm, .85rem)}.plugin-builtins-metadata-only{color:var(--text-muted);font-size:var(--font-size-xs, .8rem);font-weight:600;text-transform:uppercase}.plugin-bundled-runtime-list{width:100%;display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-sm)}.plugin-bundled-runtime-item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border:var(--btn-border-width) solid var(--border);border-radius:var(--radius-md);background:var(--surface)}.plugin-bundled-runtime-meta{display:flex;align-items:center;gap:var(--space-sm);row-gap:var(--space-xs);flex-wrap:wrap;min-width:0}.plugin-bundled-runtime-name{color:var(--text);font-size:var(--font-size-base, .9rem);font-weight:500}.plugin-bundled-runtime-badge{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);background:var(--status-in-review-bg);color:var(--in-review);font-size:var(--font-size-2xs, .75rem);font-weight:600;text-transform:uppercase}.plugin-bundled-runtime-section{display:flex;flex-direction:column;gap:var(--space-sm)}.plugin-bundled-runtime-header{display:flex;flex-direction:column;gap:var(--space-xs)}.plugin-bundled-runtime-heading{margin:0;font-size:var(--font-size-md, .95rem)}.plugin-bundled-runtime-description{margin:0;font-size:var(--font-size-sm, .85rem);color:var(--text-muted)}.plugin-bundled-runtime-status{display:inline-flex;align-items:center;padding:var(--btn-border-width) var(--space-xs);border-radius:var(--radius-pill);font-size:var(--font-size-2xs, .75rem);font-weight:600;text-transform:uppercase}@media(min-width:769px){.plugin-builtins-status,.plugin-bundled-runtime-status{margin-left:auto}}.plugin-bundled-runtime-status--installed{background:var(--status-done-bg);color:var(--done)}.plugin-bundled-runtime-status--available{background:var(--status-todo-bg);color:var(--todo)}@media(max-width:768px){.plugin-manager,.plugin-manager-detail{padding-inline:var(--space-sm)}.plugin-manager-detail-header{gap:var(--space-sm)}.plugin-detail-title{gap:var(--space-xs)}.plugin-detail-card{padding:var(--space-md);gap:var(--space-sm)}.plugin-list{gap:var(--space-xs)}.plugin-item{padding:var(--space-md);flex-direction:column;align-items:stretch;gap:var(--space-sm)}.plugin-info{width:100%;flex-wrap:wrap;row-gap:var(--space-xs)}.plugin-name{flex:1 1 100%;white-space:normal}.plugin-actions{width:100%;justify-content:flex-end;flex-wrap:wrap;gap:var(--space-sm)}.plugin-actions .btn-icon,.plugin-actions .toggle-switch{min-width:36px;min-height:36px}.plugin-actions .toggle-switch{display:inline-flex;align-items:center;justify-content:center}.plugin-security-row{align-items:flex-start}.plugin-detail-actions{flex-wrap:wrap;justify-content:flex-start}.plugin-detail-actions button{flex:1 1 auto;min-height:36px}.plugin-builtins-item,.plugin-bundled-runtime-item{flex-direction:column;align-items:stretch}.plugin-builtins-item .btn,.plugin-bundled-runtime-item .btn{min-height:36px}}