@runfusion/fusion 0.73.0-beta.2 → 0.73.0-beta.3

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 (109) hide show
  1. package/agent-browser.mjs +8 -0
  2. package/dist/bin.js +6700 -11124
  3. package/dist/child-process-worker.js +3661 -8222
  4. package/dist/client/.vite/manifest.json +260 -250
  5. package/dist/client/assets/{AgentDetailView-CUoHZPZr.js → AgentDetailView-lJqxsPOR.js} +3 -3
  6. package/dist/client/assets/{AgentPermissionPolicyEditor-DKoHJIlF.js → AgentPermissionPolicyEditor-De4wK_UT.js} +1 -1
  7. package/dist/client/assets/{AgentsView-CaBo-FHV.js → AgentsView-CwizRdcA.js} +4 -4
  8. package/dist/client/assets/ChatView-BeQXaz7_.js +8 -0
  9. package/dist/client/assets/{CommandCenter-wgiEIVuC.js → CommandCenter-BJZCaPLj.js} +9 -9
  10. package/dist/client/assets/DevServerView-DQgwQXKx.js +1 -0
  11. package/dist/client/assets/{DirectoryPicker-B7YwgF53.js → DirectoryPicker-B2UVwp6F.js} +1 -1
  12. package/dist/client/assets/DocumentsView-DOeYrhvg.js +1 -0
  13. package/dist/client/assets/{EvalsView-BjyqxMS_.js → EvalsView-LwepJ9Ud.js} +1 -1
  14. package/dist/client/assets/{ExperimentalAgentOnboardingModal-_PMSa_gN.js → ExperimentalAgentOnboardingModal-DVNSzflw.js} +1 -1
  15. package/dist/client/assets/{GoalsView-BzLA8GX9.js → GoalsView-__LpXw4S.js} +1 -1
  16. package/dist/client/assets/{InsightsView-Cb_tUr1V.js → InsightsView-Dv388uaO.js} +2 -2
  17. package/dist/client/assets/{MemoryView-CRxOPCQq.js → MemoryView-ChCbEfZT.js} +2 -2
  18. package/dist/client/assets/{PiExtensionsManager-XQ5rWJT3.js → PiExtensionsManager-DehAjrqN.js} +2 -2
  19. package/dist/client/assets/{PluginManager-CXPSlWxs.js → PluginManager-DBhJ1i27.js} +1 -1
  20. package/dist/client/assets/{PullRequestView-CX6fScVe.js → PullRequestView-BvmajsBq.js} +2 -2
  21. package/dist/client/assets/{ReportModal-BSCk5ER1.css → ReportModal-BuhhqtXJ.css} +1 -1
  22. package/dist/client/assets/ReportModal-DM9B_h_w.js +21 -0
  23. package/dist/client/assets/{ResearchView-DgKzxRUL.js → ResearchView-BzXSgUhp.js} +2 -2
  24. package/dist/client/assets/{SecretsView-C83SIrjR.js → SecretsView-COBqEdJj.js} +1 -1
  25. package/dist/client/assets/SessionTerminal-BUw_FTlh.js +2 -0
  26. package/dist/client/assets/SettingsModal-BDgH9XID.js +21 -0
  27. package/dist/client/assets/SettingsModal-BXDnzDkJ.css +1 -0
  28. package/dist/client/assets/SettingsModal-CsLaIrqt.js +1 -0
  29. package/dist/client/assets/{SettingsTextareaRow-BKGsmZ7C.js → SettingsTextareaRow-Bv3aZ9aU.js} +1 -1
  30. package/dist/client/assets/{SetupWizardModal-DIb4q-VT.js → SetupWizardModal-C-yMHTlW.js} +2 -2
  31. package/dist/client/assets/{SkillsView-D1Zxh1iX.js → SkillsView-kSHgkBar.js} +1 -1
  32. package/dist/client/assets/{TodoView-CGIcE6Yr.js → TodoView-DYoicJNY.js} +2 -2
  33. package/dist/client/assets/{WorkflowNodeEditor-BXUC0lim.js → WorkflowNodeEditor-DLno6bSJ.js} +1 -1
  34. package/dist/client/assets/agent-import-generation-D6P8OUuV.js +1 -0
  35. package/dist/client/assets/app-DegRNirF.js +13 -0
  36. package/dist/client/assets/{architectureDiagram-3BPJPVTR-Dv83GkUE.js → architectureDiagram-3BPJPVTR-DLqKCckA.js} +1 -1
  37. package/dist/client/assets/{blockDiagram-GPEHLZMM-B_j-RJOz.js → blockDiagram-GPEHLZMM-DRz6F8wZ.js} +1 -1
  38. package/dist/client/assets/{c4Diagram-AAUBKEIU-Cy3f-SD1.js → c4Diagram-AAUBKEIU-CJ9glQAp.js} +1 -1
  39. package/dist/client/assets/channel-Dj4nOgJO.js +1 -0
  40. package/dist/client/assets/{chunk-2J33WTMH-CPolddUJ.js → chunk-2J33WTMH-CjIBb3ln.js} +1 -1
  41. package/dist/client/assets/{chunk-4BX2VUAB-BAGPgwkc.js → chunk-4BX2VUAB-DrcoEr1E.js} +1 -1
  42. package/dist/client/assets/{chunk-55IACEB6-dzYFOH0q.js → chunk-55IACEB6-DU-WcuA9.js} +1 -1
  43. package/dist/client/assets/{chunk-727SXJPM-ul9hGhiR.js → chunk-727SXJPM-C5Lklr3l.js} +1 -1
  44. package/dist/client/assets/{chunk-AQP2D5EJ-C75yqe4-.js → chunk-AQP2D5EJ-DlyTTghY.js} +1 -1
  45. package/dist/client/assets/{chunk-FMBD7UC4-BwiLAyup.js → chunk-FMBD7UC4-D3C65m5Y.js} +1 -1
  46. package/dist/client/assets/{chunk-ND2GUHAM-CVv1sLhy.js → chunk-ND2GUHAM-BZY-4WZF.js} +1 -1
  47. package/dist/client/assets/{chunk-QZHKN3VN-D1c-k3xL.js → chunk-QZHKN3VN-CKUtTYy5.js} +1 -1
  48. package/dist/client/assets/classDiagram-4FO5ZUOK-DnkFo5Qy.js +1 -0
  49. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DnkFo5Qy.js +1 -0
  50. package/dist/client/assets/{cose-bilkent-S5V4N54A-DosMsFd6.js → cose-bilkent-S5V4N54A-DbpsF4N5.js} +1 -1
  51. package/dist/client/assets/{dagre-BM42HDAG-9os-QBXe.js → dagre-BM42HDAG-BwIo4me1.js} +1 -1
  52. package/dist/client/assets/{dashboard-view-iwAS1HTp.js → dashboard-view-BMQm7Lt_.js} +1 -1
  53. package/dist/client/assets/{dashboard-view-Bn7iL770.js → dashboard-view-BvAsW6UZ.js} +1 -1
  54. package/dist/client/assets/{dashboard-view-CNVTxyWE.js → dashboard-view-C94UCci5.js} +1 -1
  55. package/dist/client/assets/{diagram-2AECGRRQ-ChjuJgA6.js → diagram-2AECGRRQ-C-d8XY1c.js} +1 -1
  56. package/dist/client/assets/{diagram-5GNKFQAL-Cq10aB4z.js → diagram-5GNKFQAL-ByRrlL9w.js} +1 -1
  57. package/dist/client/assets/{diagram-KO2AKTUF-CKjyrzjg.js → diagram-KO2AKTUF-BK7jb_J-.js} +1 -1
  58. package/dist/client/assets/{diagram-LMA3HP47-DxCc1BsH.js → diagram-LMA3HP47-u2o4bYk6.js} +1 -1
  59. package/dist/client/assets/{diagram-OG6HWLK6-DJWEkDsR.js → diagram-OG6HWLK6-Dakk1V3D.js} +1 -1
  60. package/dist/client/assets/{erDiagram-TEJ5UH35-gVkDYC92.js → erDiagram-TEJ5UH35-Yp33v-Cf.js} +1 -1
  61. package/dist/client/assets/{flowDiagram-I6XJVG4X-1lw1mQRQ.js → flowDiagram-I6XJVG4X-C4-dR2TA.js} +1 -1
  62. package/dist/client/assets/{folder-open-Nmr7nRmN.js → folder-open-C9qq38qV.js} +1 -1
  63. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Yzq4WZRo.js → ganttDiagram-6RSMTGT7-C0CTCkFN.js} +1 -1
  64. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-cFR9Gv8n.js → gitGraphDiagram-PVQCEYII-DK0Dd5mm.js} +1 -1
  65. package/dist/client/assets/index-6FBJPKkr.css +1 -0
  66. package/dist/client/assets/index-BqLVwYoA.js +2661 -0
  67. package/dist/client/assets/{infoDiagram-5YYISTIA-BbRiTnD3.js → infoDiagram-5YYISTIA-u5MwFb7j.js} +1 -1
  68. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DD4i2Znk.js → ishikawaDiagram-YF4QCWOH-C7R6TziI.js} +1 -1
  69. package/dist/client/assets/{journeyDiagram-JHISSGLW-qHPO2M-C.js → journeyDiagram-JHISSGLW-Dom8W5Ab.js} +1 -1
  70. package/dist/client/assets/{kanban-definition-UN3LZRKU-EuFfgxUv.js → kanban-definition-UN3LZRKU-_47C02t3.js} +1 -1
  71. package/dist/client/assets/{mermaid.core-Cru9Vzsy.js → mermaid.core-Cd3LKosp.js} +4 -4
  72. package/dist/client/assets/{mindmap-definition-RKZ34NQL-mCvtfapj.js → mindmap-definition-RKZ34NQL-D-qVOEin.js} +1 -1
  73. package/dist/client/assets/{pieDiagram-4H26LBE5-BSc_a5Dz.js → pieDiagram-4H26LBE5-B0TXvVbM.js} +1 -1
  74. package/dist/client/assets/{puzzle-Cz66CEWW.js → puzzle-BBYTjDQK.js} +1 -1
  75. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-Um2SLb_d.js → quadrantDiagram-W4KKPZXB-KcFvcZPm.js} +1 -1
  76. package/dist/client/assets/{requirementDiagram-4Y6WPE33-B94evN7g.js → requirementDiagram-4Y6WPE33-DEObokVc.js} +1 -1
  77. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BH7NLX-K.js → sankeyDiagram-5OEKKPKP-BGYnEp22.js} +1 -1
  78. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-DusrBGQp.js → sequenceDiagram-3UESZ5HK-BcYgyJRU.js} +1 -1
  79. package/dist/client/assets/{shield-alert-CcQuaRHN.js → shield-alert-CZg8yaFA.js} +1 -1
  80. package/dist/client/assets/{standing-instructions-template-CVnY93Xy.js → standing-instructions-template-BsTtbEqp.js} +1 -1
  81. package/dist/client/assets/{stateDiagram-AJRCARHV-GRjL9YlX.js → stateDiagram-AJRCARHV-CfZQIqmX.js} +1 -1
  82. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-BBsv6ppQ.js → stateDiagram-v2-BHNVJYJU-nBEPRSH7.js} +1 -1
  83. package/dist/client/assets/{timeline-definition-PNZ67QCA-DC6UeqjY.js → timeline-definition-PNZ67QCA-DySyabS_.js} +1 -1
  84. package/dist/client/assets/{upload-CjJp7lEX.js → upload-DMd3zMLx.js} +1 -1
  85. package/dist/client/assets/{users-DgimRYHz.js → users-9Pyvnn8K.js} +1 -1
  86. package/dist/client/assets/{vennDiagram-CIIHVFJN-C272zK9h.js → vennDiagram-CIIHVFJN-DPomfxp_.js} +1 -1
  87. package/dist/client/assets/{wardley-L42UT6IY-KkRF-2j9.js → wardley-L42UT6IY-BPfzngS8.js} +1 -1
  88. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B4brtKRt.js → wardleyDiagram-YWT4CUSO-Yp4nidAP.js} +1 -1
  89. package/dist/client/assets/{xychartDiagram-2RQKCTM6--PFSKt1s.js → xychartDiagram-2RQKCTM6-REgng603.js} +1 -1
  90. package/dist/client/index.html +2 -2
  91. package/dist/client/version.json +1 -1
  92. package/dist/extension.js +3765 -8333
  93. package/dist/migrations/0026_bigint_counters.sql +85 -14
  94. package/package.json +6 -3
  95. package/skill/fusion/references/engine-tools.md +6 -2
  96. package/dist/client/assets/ChatView-Bv0J5p5U.js +0 -8
  97. package/dist/client/assets/DevServerView-Ue9XG_4H.js +0 -1
  98. package/dist/client/assets/DocumentsView-C1Ptwcv5.js +0 -1
  99. package/dist/client/assets/ReportModal-JhZZXZlj.js +0 -21
  100. package/dist/client/assets/SessionTerminal-BrK3psiC.js +0 -2
  101. package/dist/client/assets/SettingsModal-Bby9vLGx.js +0 -21
  102. package/dist/client/assets/SettingsModal-DVLqY1-7.js +0 -1
  103. package/dist/client/assets/SettingsModal-DXArgTTx.css +0 -1
  104. package/dist/client/assets/app-DUszvars.js +0 -13
  105. package/dist/client/assets/channel-BuhC8kaT.js +0 -1
  106. package/dist/client/assets/classDiagram-4FO5ZUOK-vpRR5WOg.js +0 -1
  107. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-vpRR5WOg.js +0 -1
  108. package/dist/client/assets/index-Cg9ahVtV.js +0 -2661
  109. package/dist/client/assets/index-uhXHk1ek.css +0 -1
@@ -20,27 +20,98 @@ Affected columns:
20
20
  project.chat_token_usage.cached_tokens
21
21
  project.chat_token_usage.cache_write_tokens
22
22
  project.chat_token_usage.total_tokens
23
+
24
+ FNXC:PostgresBigintCounters 2026-07-20-23:55:
25
+ Upgrade paths from early baselines may have project.tasks without the token_usage_*
26
+ columns yet (they land in later migrations). ALTER COLUMN fails hard if the column
27
+ is missing, so only widen columns that already exist. Fresh baselines already declare
28
+ bigint in SCHEMA_BASELINE DDL.
29
+
30
+ FNXC:PostgresBigintCounters 2026-07-22-03:15:
31
+ Per-column guards (not a single representative-column check) so a partial schema —
32
+ e.g. only token_usage_input_tokens present — never references a missing sibling and
33
+ aborts the schema-applier transaction.
23
34
  */
24
35
  DO $$
25
36
  BEGIN
26
37
  IF to_regclass('project.tasks') IS NOT NULL THEN
27
- ALTER TABLE project.tasks
28
- ALTER COLUMN token_usage_input_tokens TYPE bigint,
29
- ALTER COLUMN token_usage_output_tokens TYPE bigint,
30
- ALTER COLUMN token_usage_cached_tokens TYPE bigint,
31
- ALTER COLUMN token_usage_cache_write_tokens TYPE bigint,
32
- ALTER COLUMN token_usage_total_tokens TYPE bigint,
33
- ALTER COLUMN cumulative_active_ms TYPE bigint,
34
- ALTER COLUMN checkout_lease_epoch TYPE bigint;
38
+ IF EXISTS (
39
+ SELECT 1 FROM information_schema.columns
40
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'token_usage_input_tokens'
41
+ ) THEN
42
+ ALTER TABLE project.tasks ALTER COLUMN token_usage_input_tokens TYPE bigint;
43
+ END IF;
44
+ IF EXISTS (
45
+ SELECT 1 FROM information_schema.columns
46
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'token_usage_output_tokens'
47
+ ) THEN
48
+ ALTER TABLE project.tasks ALTER COLUMN token_usage_output_tokens TYPE bigint;
49
+ END IF;
50
+ IF EXISTS (
51
+ SELECT 1 FROM information_schema.columns
52
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'token_usage_cached_tokens'
53
+ ) THEN
54
+ ALTER TABLE project.tasks ALTER COLUMN token_usage_cached_tokens TYPE bigint;
55
+ END IF;
56
+ IF EXISTS (
57
+ SELECT 1 FROM information_schema.columns
58
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'token_usage_cache_write_tokens'
59
+ ) THEN
60
+ ALTER TABLE project.tasks ALTER COLUMN token_usage_cache_write_tokens TYPE bigint;
61
+ END IF;
62
+ IF EXISTS (
63
+ SELECT 1 FROM information_schema.columns
64
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'token_usage_total_tokens'
65
+ ) THEN
66
+ ALTER TABLE project.tasks ALTER COLUMN token_usage_total_tokens TYPE bigint;
67
+ END IF;
68
+
69
+ IF EXISTS (
70
+ SELECT 1 FROM information_schema.columns
71
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'cumulative_active_ms'
72
+ ) THEN
73
+ ALTER TABLE project.tasks ALTER COLUMN cumulative_active_ms TYPE bigint;
74
+ END IF;
75
+
76
+ IF EXISTS (
77
+ SELECT 1 FROM information_schema.columns
78
+ WHERE table_schema = 'project' AND table_name = 'tasks' AND column_name = 'checkout_lease_epoch'
79
+ ) THEN
80
+ ALTER TABLE project.tasks ALTER COLUMN checkout_lease_epoch TYPE bigint;
81
+ END IF;
35
82
  END IF;
36
83
 
37
84
  IF to_regclass('project.chat_token_usage') IS NOT NULL THEN
38
- ALTER TABLE project.chat_token_usage
39
- ALTER COLUMN input_tokens TYPE bigint,
40
- ALTER COLUMN output_tokens TYPE bigint,
41
- ALTER COLUMN cached_tokens TYPE bigint,
42
- ALTER COLUMN cache_write_tokens TYPE bigint,
43
- ALTER COLUMN total_tokens TYPE bigint;
85
+ IF EXISTS (
86
+ SELECT 1 FROM information_schema.columns
87
+ WHERE table_schema = 'project' AND table_name = 'chat_token_usage' AND column_name = 'input_tokens'
88
+ ) THEN
89
+ ALTER TABLE project.chat_token_usage ALTER COLUMN input_tokens TYPE bigint;
90
+ END IF;
91
+ IF EXISTS (
92
+ SELECT 1 FROM information_schema.columns
93
+ WHERE table_schema = 'project' AND table_name = 'chat_token_usage' AND column_name = 'output_tokens'
94
+ ) THEN
95
+ ALTER TABLE project.chat_token_usage ALTER COLUMN output_tokens TYPE bigint;
96
+ END IF;
97
+ IF EXISTS (
98
+ SELECT 1 FROM information_schema.columns
99
+ WHERE table_schema = 'project' AND table_name = 'chat_token_usage' AND column_name = 'cached_tokens'
100
+ ) THEN
101
+ ALTER TABLE project.chat_token_usage ALTER COLUMN cached_tokens TYPE bigint;
102
+ END IF;
103
+ IF EXISTS (
104
+ SELECT 1 FROM information_schema.columns
105
+ WHERE table_schema = 'project' AND table_name = 'chat_token_usage' AND column_name = 'cache_write_tokens'
106
+ ) THEN
107
+ ALTER TABLE project.chat_token_usage ALTER COLUMN cache_write_tokens TYPE bigint;
108
+ END IF;
109
+ IF EXISTS (
110
+ SELECT 1 FROM information_schema.columns
111
+ WHERE table_schema = 'project' AND table_name = 'chat_token_usage' AND column_name = 'total_tokens'
112
+ ) THEN
113
+ ALTER TABLE project.chat_token_usage ALTER COLUMN total_tokens TYPE bigint;
114
+ END IF;
44
115
  END IF;
45
116
  END
46
117
  $$;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.73.0-beta.2",
3
+ "version": "0.73.0-beta.3",
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",
@@ -12,6 +12,7 @@
12
12
  "pi-package"
13
13
  ],
14
14
  "bin": {
15
+ "agent-browser": "./agent-browser.mjs",
15
16
  "fn": "./bin.mjs",
16
17
  "fusion": "./bin.mjs"
17
18
  },
@@ -28,6 +29,7 @@
28
29
  "access": "public"
29
30
  },
30
31
  "files": [
32
+ "agent-browser.mjs",
31
33
  "bin.mjs",
32
34
  "dist/**/*.js",
33
35
  "dist/**/*.d.ts",
@@ -46,8 +48,9 @@
46
48
  ],
47
49
  "dependencies": {
48
50
  "@agentclientprotocol/sdk": "0.24.0",
49
- "@earendil-works/pi-ai": "0.80.10",
50
- "@earendil-works/pi-coding-agent": "0.80.10",
51
+ "agent-browser": "0.26.0",
52
+ "@earendil-works/pi-ai": "0.81.1",
53
+ "@earendil-works/pi-coding-agent": "0.81.1",
51
54
  "claude-code-cli-acp": "0.1.1",
52
55
  "dockerode": "^4.0.12",
53
56
  "electron": "^33.4.11",
@@ -13,8 +13,12 @@ This reference documents tools injected by the engine at runtime for specific ag
13
13
  |---|---|---|---|
14
14
  | `fn_task_create` | triage, executor, heartbeat | Create a follow-up task from within an agent run | `description` (string), `dependencies?` (string[]), `priority?` (`low` \| `normal` \| `high` \| `urgent`), `workflow_id?` (string) |
15
15
  | `fn_task_log` | executor, heartbeat | Write significant task log entries | `message` (string), `outcome?` (string) |
16
- | `fn_task_document_write` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Save/update a named task document revision | `key` (string), `content` (string), `author?` (string); chat/planning also require `task_id` (string) |
17
- | `fn_task_document_read` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Read one task document or list all | `key?` (string); chat/planning also require `task_id` (string) |
16
+ | `fn_task_document_write` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Save/update a named **live-task** document revision, optionally with CAS; archived parents remain read-only | `key` (string), `content` (string), `author?` (string), `expected_revision?` (non-negative integer), `expected_content_hash?` (`sha256:<64 lowercase hex>`); chat/planning also require `task_id` (string) |
17
+ | `fn_task_document_read` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Read one named live or retained archived document; list mode remains live-only | `key?` (string); chat/planning also require `task_id` (string) |
18
+
19
+ For cross-task publication, read first and pass both returned values when practical: `{ "task_id": "FX-002", "key": "evidence", "content": "rebased evidence", "expected_revision": 3, "expected_content_hash": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" }`. Revision zero is create-if-absent. A stale write is an error result with `TASK_DOCUMENT_PRECONDITION_FAILED` and current revision/hash; re-read and explicitly rebase rather than retrying unchanged. Omitted expectations preserve unconditional compatibility.
20
+
21
+ Archived publication is deliberately absent from every runtime tool schema: there is no append, `allowArchived`, force, or replacement path in `fn_task_document_write`. Operators use the daemon-bearer-authenticated `POST /api/tasks/:id/documents/:key/archived-publications` API; `--no-auth` fails closed. Agent tools may read a retained archived document only when an explicit key is supplied, while keyless list mode continues to hide archived registries.
18
22
  | `fn_task_prompt_write` | plan/spec review (Plan Review reviewer) | Replace the task's authoritative PROMPT.md with revised plan/spec content during Plan Review/spec repair; routed through TaskStore so PROMPT.md validation and task.json sync stay the single persistence path. Provide the complete final PROMPT.md content; do not implement product code from plan review | `content` (string) |
19
23
  | `fn_goal_list` | triage, executor, heartbeat | List goals with concise citation-ready snippets and active-goal warning details | `status?` (`active` \| `archived` \| `all`) |
20
24
  | `fn_goal_show` | triage, executor, heartbeat | Show one goal's full detail on demand, including the full description body | `id` (string) |
@@ -1,8 +0,0 @@
1
- import{r as s,j as t,b as gi}from"./vendor-react-SZ_qB27O.js";import{c as pi,ap as Rt,an as ht,ao as os,bw as la,dl as vi,dm as bi,dn as Qn,at as X,dp as xi,bv as Nt,dq as Mt,bp as rs,dr as wi,ds as yi,dt as ki,du as Ci,dv as Mi,dw as Si,bb as Ri,cK as cs,dx as xe,aV as Ni,bK as Fa,bu as mn,dy as ji,ak as hn,dz as Ai,dA as Ti,dB as Ei,bn as Di,aG as Ii,a$ as dn,Q as Li,cT as Pi,dC as Fi,dD as $i,f as _i,aT as Bi,dE as zi,dF as $a,dG as _a,dH as Oi,dI as Hi,H as Ui,dJ as Ki,dK as Vi,dL as Wi,dM as da,w as Xi,p as qi,q as Gi,dN as Yn,C as sn,dO as an,dP as ua,u as ma,P as dt,V as Qi,bs as ha,d9 as fa,d8 as Yi,X as Ji,aF as Zi,dQ as eo,v as ga,bJ as to,dR as Jn,dS as pa,dT as Zn,dU as va,dV as ba,dW as no,dX as so,bH as xa}from"./index-Cg9ahVtV.js";import{u as $e}from"./vendor-i18n-GF3RlKbq.js";import{SessionTerminal as wa}from"./SessionTerminal-BrK3psiC.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";import"./shield-alert-CcQuaRHN.js";/**
2
- * @license lucide-react v1.7.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const ao=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],Ba=pi("hash",ao);function on(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}function io(){try{typeof import.meta<"u"}catch{}try{if(typeof localStorage<"u")return localStorage.getItem("kb-debug-room-open")==="1"}catch{}return!1}function es(a,r){const d=io(),f=r?.warm===!0,l=on(),u=new Map;let y=!1,k=!1;return{mark(j){y||k||!d||u.has(j)||u.set(j,on())},complete:j=>{if(!d||y||k){y=!0;return}y=!0,u.set("complete",on());const I=Array.from(u.entries()).sort((E,p)=>E[1]-p[1]);let i=l;const R={};for(const[E,p]of I)R[E]=Math.max(0,p-i),i=p;const w=Math.max(0,on()-l);try{console.debug("[room-open]",{roomId:a,warm:f,totalMs:w,phases:R,...j??{}})}catch{}},cancel(){k=!0,y=!0}}}const Fe="fusion:chat-active-room";class za extends Error{roomId;constructor(r,d){super(r),this.name="RoomMessageDeliveredButReplyFailedError",this.roomId=d}}function ls(a){return[...a].sort((r,d)=>new Date(d.updatedAt).getTime()-new Date(r.updatedAt).getTime())}function Ve(a,r){const d=a.findIndex(l=>l.id===r.id);if(d===-1)return ls([r,...a]);const f=[...a];return f[d]=r,ls(f)}function Ie(a){try{return JSON.parse(a.data)}catch{return null}}function ts(a){return a.slice().reverse()}function oo(a,r,d){return{id:`temp-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,roomId:a,role:"user",content:r,thinkingOutput:null,metadata:null,senderAgentId:null,mentions:[],...d?.length?{attachments:d}:{},createdAt:new Date().toISOString()}}function ya(a,r,d){if(a.some(l=>l.id===r.id))return a;const f=d?a.findIndex(l=>l.id===d):-1;if(f>=0){const l=[...a];return l[f]=r,l}if(r.role==="user"){const l=a.findIndex(u=>u.role==="user"&&u.id.startsWith("temp-")&&u.content.trim()===r.content.trim());if(l>=0){const u=[...a];return u[l]=r,u}}return[...a,r]}function ro(a,r){const{t:d}=$e("app"),f=`${Rt.CHAT_ROOMS}:${a??"global"}`,l=`${Rt.ACTIVE_CHAT_ROOM_ID}:${a??"global"}`,u=s.useCallback(g=>`${Rt.CHAT_ROOM_MESSAGES_PREFIX}${a??"global"}:${g}`,[a]),y=s.useCallback(g=>`${Rt.CHAT_ROOM_MEMBERS_PREFIX}${a??"global"}:${g}`,[a]),[k,b]=s.useState(()=>{const g=ht(f,{maxAgeMs:os});return Array.isArray(g)?g:[]}),[j,I]=s.useState(()=>k.length===0),[i,R]=s.useState(null),[w,E]=s.useState(()=>{const g=ht(l,{maxAgeMs:la});return g?k.find(v=>v.id===g)??null:null}),[p,c]=s.useState([]),[z,N]=s.useState([]),[W,$]=s.useState(!1),U=s.useRef(k),P=s.useRef(w),ee=s.useRef(0),Y=s.useRef(a);U.current=k,P.current=w,Y.current!==a&&(Y.current=a,ee.current+=1);const q=s.useCallback(async g=>{if(!g){c([]),N([]),$(!1);return}const v=es(g.id,{warm:!1});v.mark("select");const M=ht(u(g.id),{maxAgeMs:vi}),h=ht(y(g.id),{maxAgeMs:os}),A=Array.isArray(M)&&M.length>0,F=Array.isArray(h)&&h.length>0;A||F?(v.mark("cache-hit"),A&&(N(M),v.mark("hydrate")),F&&c(h),$(!1)):(N([]),$(!0));try{const[Q,we]=await Promise.all([bi(g.id,a),Qn(g.id,{limit:100,order:"desc"},a)]);v.mark("members-fetch"),v.mark("messages-fetch"),X(y(g.id),Q.members,{maxBytes:5e5});const se=ts(we.messages);X(u(g.id),se,{maxBytes:5e5}),P.current?.id===g.id&&(c(Q.members),N(se),v.mark("hydrate"))}catch{!A&&!F&&(c([]),N([]))}finally{$(!1),v.complete({warm:A,membersCached:F})}},[y,u,a]),L=s.useCallback(async()=>{U.current.length===0&&I(!0);try{const g=await xi({},a),v=ls(g.rooms);b(v),X(f,v,{maxBytes:5e5}),R(null);const M=ht(l,{maxAgeMs:la})??Nt(Fe,a);if(M){const h=v.find(A=>A.id===M)??null;h?(E(h),q(h)):(Mt(Fe,a),X(l,"",{maxBytes:5e5}))}}catch(g){const v=g instanceof Error?g.message:d("chatRooms.error.failedToLoad","Failed to load chat rooms");R(v),r?.(v,"error")}finally{I(!1)}},[l,r,q,a,f]),_=s.useCallback(g=>{if(!g){P.current=null,E(null),Mt(Fe,a),X(l,"",{maxBytes:5e5}),q(null);return}const v=U.current.find(M=>M.id===g)??null;P.current=v,E(v),v&&(rs(Fe,v.id,a),X(l,v.id,{maxBytes:5e5}),q(v))},[l,q,a]),G=s.useCallback(async g=>{const M=(await wi({name:g.name,memberAgentIds:g.memberAgentIds},a)).room;return b(h=>Ve(h,M)),P.current=M,E(M),rs(Fe,M.id,a),X(l,M.id,{maxBytes:5e5}),await q(M),M},[l,q,a]),K=s.useCallback(async(g,v)=>{const h=(await yi(g,v,a)).room;return b(A=>Ve(A,h)),P.current?.id===h.id&&(P.current=h,E(h)),h},[a]),T=s.useCallback(async g=>{await ki(g,a),b(v=>v.filter(M=>M.id!==g)),X(u(g),[],{maxBytes:5e5}),X(y(g),[],{maxBytes:5e5}),P.current?.id===g&&(P.current=null,E(null),c([]),N([]),Mt(Fe,a),X(l,"",{maxBytes:5e5}))},[l,y,u,a]),H=s.useCallback(async(g,v)=>{const M=P.current,h=M?.id;if(!h)throw new Error(d("chatRooms.error.selectRoomFirst","Select a room before sending a message"));const A=es(h,{warm:!1}),F=v?.files?.map(se=>({id:`upload-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,filename:se.name,originalName:se.name,mimeType:se.type||"application/octet-stream",size:se.size,createdAt:new Date().toISOString()})),Q=oo(h,g,F?.length?F:v?.attachments);P.current?.id===h&&N(se=>{const ae=[...se,Q];return X(u(h),ae,{maxBytes:5e5}),ae});let we=!1;try{const se=[];if(v?.files?.length)for(const re of v.files)try{const D=await Ci(h,re,a);se.push(D.attachment)}catch{throw new Error(d("chatRooms.error.failedToUpload","Failed to upload attachment: {{filename}}",{filename:re.name}))}const ae=[...v?.attachments??[],...se],ye=await Mi(h,{content:g,...ae.length?{attachments:ae}:{}},a);we=!0,ye.message?.createdAt&&M&&b(re=>Ve(re,{...M,updatedAt:ye.message.createdAt})),P.current?.id===h&&N(re=>{const D=ya(re,ye.message,Q.id);return X(u(h),D,{maxBytes:5e5}),D});const he=await Qn(h,{limit:100,order:"desc"},a),ke=ts(he.messages);if(X(u(h),ke,{maxBytes:5e5}),P.current?.id!==h)return;N(ke),A.mark("hydrate")}catch(se){let ae=null;try{const he=await Qn(h,{limit:100,order:"desc"},a);ae=ts(he.messages),X(u(h),ae,{maxBytes:5e5}),P.current?.id===h&&(N(ae),A.mark("hydrate"))}catch{!we&&P.current?.id===h&&N(he=>{const ke=he.filter(re=>re.id!==Q.id);return X(u(h),ke,{maxBytes:5e5}),ke})}const ye=ae?.some(he=>he.role==="user"&&he.content.trim()===Q.content.trim());if(we||ye){const he=se instanceof Error&&se.message.trim()?se.message:d("chatRooms.error.deliveredButRefreshFailed","Message delivered, but failed to refresh room replies");throw new za(he,h)}throw se}finally{A.complete({source:"send-room-message"})}},[u,a]),C=s.useCallback(async g=>{!g||!U.current.some(v=>v.id===g)||(await Si(g,a),X(u(g),[],{maxBytes:5e5}),P.current?.id===g&&N([]))},[u,a]);return s.useEffect(()=>{L()},[L]),s.useEffect(()=>{const g=ee.current,v=a?`/api/events?projectId=${encodeURIComponent(a)}`:"/api/events";return Ri(v,{onReconnect:()=>{cs({view:"useChatRooms",trigger:"sse-reconnect",projectId:a,replayAttempted:!1});const M=P.current?.id;if(M){const h=es(M,{warm:!0});h.mark("sse-reconnect-refresh"),L().finally(()=>h.complete({source:"sse-reconnect"}));return}L()},events:{"chat:room:created":M=>{if(ee.current!==g)return;const h=Ie(M);h&&b(A=>Ve(A,h))},"chat:room:updated":M=>{if(ee.current!==g)return;const h=Ie(M);h&&(b(A=>Ve(A,h)),P.current?.id===h.id&&(P.current=h,E(h)))},"chat:room:deleted":M=>{if(ee.current!==g)return;const h=Ie(M);h?.id&&(b(A=>A.filter(F=>F.id!==h.id)),X(u(h.id),[],{maxBytes:5e5}),X(y(h.id),[],{maxBytes:5e5}),P.current?.id===h.id&&(P.current=null,E(null),c([]),N([]),Mt(Fe,a),X(l,"",{maxBytes:5e5})))},"chat:room:member:added":M=>{if(ee.current!==g)return;const h=Ie(M);!h||P.current?.id!==h.roomId||c(A=>{if(A.some(Q=>Q.agentId===h.agentId))return A;const F=[...A,h];return X(y(h.roomId),F,{maxBytes:5e5}),F})},"chat:room:member:removed":M=>{if(ee.current!==g)return;const h=Ie(M);!h||P.current?.id!==h.roomId||c(A=>{const F=A.filter(Q=>Q.agentId!==h.agentId);return X(y(h.roomId),F,{maxBytes:5e5}),F})},"chat:room:message:added":M=>{if(ee.current!==g)return;const h=Ie(M);h&&(b(A=>{const F=A.find(Q=>Q.id===h.roomId);return F?Ve(A,{...F,updatedAt:h.createdAt}):A}),P.current?.id===h.roomId&&N(A=>{const F=ya(A,h);return F===A?A:(X(u(h.roomId),F,{maxBytes:5e5}),F)}))},"chat:room:message:updated":M=>{if(ee.current!==g)return;const h=Ie(M);!h||P.current?.id!==h.roomId||N(A=>{const F=A.map(Q=>Q.id===h.id?h:Q);return X(u(h.roomId),F,{maxBytes:5e5}),F})},"chat:room:message:deleted":M=>{if(ee.current!==g)return;const h=Ie(M);h?.id&&N(A=>{const F=A.filter(we=>we.id!==h.id),Q=P.current?.id;return Q&&X(u(Q),F,{maxBytes:5e5}),F})},"chat:room:messages:cleared":M=>{if(ee.current!==g)return;const h=Ie(M);h?.roomId&&(X(u(h.roomId),[],{maxBytes:5e5}),P.current?.id===h.roomId&&N([]),b(A=>{const F=A.find(Q=>Q.id===h.roomId);return F?Ve(A,{...F,updatedAt:new Date().toISOString()}):A}))}}})},[l,y,u,a,L]),s.useEffect(()=>{w&&(k.some(g=>g.id===w.id)||(P.current=null,E(null),c([]),N([]),Mt(Fe,a),X(l,"",{maxBytes:5e5})))},[w,l,a,k]),{rooms:k,roomsLoading:j,roomsError:i,activeRoom:w,activeRoomMembers:p,messages:z,messagesLoading:W,selectRoom:_,createRoom:G,updateRoomSettings:K,deleteRoom:T,sendRoomMessage:H,clearRoom:C,refreshRooms:L}}const St={direct:"fusion:chat-unread:direct",room:"fusion:chat-unread:rooms"},ka=200;function ds(a){if(!a)return null;const r=new Date(a).getTime();return Number.isFinite(r)?r:null}function Oa(a){const r=Object.entries(a);if(r.length<=ka)return a;const d=r.map(([f,l])=>({id:f,timestamp:l,value:ds(l)??0})).sort((f,l)=>l.value-f.value).slice(0,ka);return Object.fromEntries(d.map(({id:f,timestamp:l})=>[f,l]))}function rn(a){if(!a)return{};try{const r=JSON.parse(a);if(!r||typeof r!="object")return{};const d={};for(const[f,l]of Object.entries(r))typeof f=="string"&&typeof l=="string"&&(d[f]=l);return Oa(d)}catch{return{}}}function co(a){const[r,d]=s.useState(()=>{try{return rn(Nt(St.direct,a))}catch{return{}}}),[f,l]=s.useState(()=>{try{return rn(Nt(St.room,a))}catch{return{}}});s.useEffect(()=>{try{d(rn(Nt(St.direct,a)))}catch{d({})}try{l(rn(Nt(St.room,a)))}catch{l({})}},[a]);const u=s.useMemo(()=>({direct:r,room:f}),[r,f]),y=s.useCallback((i,R)=>{const w=Oa(R);try{rs(St[i],JSON.stringify(w),a)}catch{}return w},[a]),k=s.useCallback((i,R)=>{if(i==="direct"){d(w=>y(i,R(w)));return}l(w=>y(i,R(w)))},[y]),b=s.useCallback((i,R,w)=>{const E=ds(w);if(E===null)return!1;const p=u[i][R],c=ds(p);return c===null?!0:E>c},[u]),j=s.useCallback((i,R,w)=>{if(!R)return;const E=w??new Date().toISOString();k(i,p=>({...p,[R]:E}))},[k]),I=s.useCallback((i,R)=>{R.length!==0&&k(i,w=>{const E={...w};for(const p of R)p.id&&(E[p.id]=p.lastActivityAt??new Date().toISOString());return E})},[k]);return{isUnread:b,markRead:j,markAllRead:I}}const lo=["",...ji];function Ca({level:a,onChange:r,defaultThinkingLevel:d="off",showTargetSection:f=!0,models:l=[],favoriteProviders:u=[],favoriteModels:y=[],agents:k=[],agentId:b,modelProvider:j,modelId:I,onChangeModel:i,disabled:R=!1}){const{t:w}=$e("app"),[E,p]=s.useState(!1),[c,z]=s.useState(()=>b&&b!==xe?"agent":"model"),N=s.useRef(null),W=a??"",$=j&&I?`${j}/${I}`:"",U=b&&b!==xe?b:"",P=W!==""||f&&(!!$||!!U),ee="chat-thinking-level-listbox";s.useEffect(()=>{if(!E)return;const C=g=>{const v=g.target;if(!(v instanceof Node))return;const M=N.current?.contains(v),h=v instanceof Element&&!!v.closest(".model-combobox-dropdown--portal");!M&&!h&&p(!1)};return document.addEventListener("pointerdown",C),()=>document.removeEventListener("pointerdown",C)},[E]),s.useEffect(()=>{p(!1),z(U?"agent":"model")},[W,U,$]);const Y=s.useMemo(()=>k.find(C=>C.id===U),[k,U]),q=C=>C===""?w("modelSelection.thinkingDefault","Default ({{level}})",{level:d??"off"}):w(`models.options.${C}`,C==="xhigh"?"Very High":C.charAt(0).toUpperCase()+C.slice(1)),L=C=>{p(!1),r(C)},_=C=>{const g=C.indexOf("/");g<=0||(p(!1),i?.({modelProvider:C.slice(0,g),modelId:C.slice(g+1)}))},G=C=>{C&&(p(!1),i?.({agentId:C}))},K=C=>{C.key==="Escape"&&p(!1)},T=(C,g)=>{if(C.key==="Escape"){C.preventDefault(),p(!1);return}(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),L(g))},H=(C,g)=>{if(C.key==="Escape"){C.preventDefault(),p(!1);return}(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),G(g))};return t.jsxs("div",{className:"chat-thinking-level-root",ref:N,children:[t.jsx("button",{type:"button",className:`btn-icon chat-thinking-btn${P?" chat-thinking-btn--active":""}`,"data-testid":"chat-thinking-btn","aria-haspopup":"dialog","aria-expanded":E,"aria-controls":ee,"aria-label":w("chat.thinkingLevelButton","Thinking level"),title:w("chat.thinkingLevelButton","Thinking level"),disabled:R,onClick:()=>p(C=>!C),onKeyDown:K,children:t.jsx(Ni,{size:16})}),E?t.jsxs("div",{className:"chat-thinking-popover",role:"presentation","data-testid":"chat-thinking-popover",children:[f?t.jsxs("section",{className:"chat-thinking-target-section","aria-label":w("chat.modelAgentSection","Model / Agent"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:w("chat.modelAgentSection","Model / Agent")}),t.jsxs("div",{className:"chat-thinking-mode-toggle","data-testid":"chat-thinking-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${c==="model"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-model",onClick:()=>z("model"),children:w("chat.newChatModeModel","Model")}),t.jsx("button",{type:"button",className:`chat-thinking-mode-btn${c==="agent"?" chat-thinking-mode-btn--active":""}`,"data-testid":"chat-thinking-mode-agent",onClick:()=>z("agent"),children:w("chat.newChatModeAgent","Agent")})]}),c==="model"?t.jsxs("div",{className:"chat-thinking-model-picker","data-testid":"chat-thinking-model-picker",children:[t.jsx(Fa,{models:l,value:$,onChange:_,label:w("chat.newChatModeModel","Model"),placeholder:w("chat.selectModel","Select a model"),disabled:!i||l.length===0,favoriteProviders:u,favoriteModels:y,menuWidth:"readable"}),l.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-model-empty",children:w("chat.noModelsAvailable","No models available")}):null]}):t.jsx("div",{className:"chat-thinking-agent-list","data-testid":"chat-thinking-agent-list",children:k.length===0?t.jsx("div",{className:"chat-thinking-empty","data-testid":"chat-thinking-agent-empty",children:w("chat.noAgentsAvailable","No agents available")}):k.map(C=>{const g=U===C.id;return t.jsxs("button",{type:"button",className:`chat-thinking-agent-item${g?" chat-thinking-agent-item--selected":""}`,"data-testid":`chat-thinking-agent-${C.id}`,"aria-pressed":g,disabled:!i,onClick:()=>G(C.id),onKeyDown:v=>H(v,C.id),children:[t.jsx(mn,{size:16}),t.jsx("span",{className:"chat-thinking-agent-name",children:C.name||C.id}),C.role?t.jsx("span",{className:"chat-thinking-agent-role",children:C.role}):null]},C.id)})}),Y?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-agent",children:w("chat.currentAgentTarget","Current agent: {{name}}",{name:Y.name||Y.id})}):$?t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-model",children:w("chat.currentModelTarget","Current model: {{model}}",{model:$})}):t.jsx("div",{className:"chat-thinking-current-target","data-testid":"chat-thinking-current-default",children:w("chat.currentDefaultTarget","Using the default chat target")})]}):null,t.jsxs("section",{className:"chat-thinking-level-section","aria-label":w("chat.thinkingLevelButton","Thinking level"),children:[t.jsx("div",{className:"chat-thinking-section-title",children:w("chat.thinkingLevelSection","Thinking level")}),t.jsx("div",{id:ee,className:"chat-thinking-popover-list",role:"listbox","aria-label":w("chat.thinkingLevelButton","Thinking level"),children:lo.map(C=>{const g=W===C;return t.jsx("button",{type:"button",role:"option","aria-selected":g,className:`chat-thinking-popover-option${g?" active":""}`,"data-testid":`chat-thinking-option-${C||"default"}`,onClick:()=>L(C),onKeyDown:v=>T(v,C),children:q(C)},C||"default")})})]})]}):null]})}function Ma(a){return a.trim().toLowerCase().replace(/[\s-]+/g,"_").replace(/_+/g,"_")}function Ha(a,r){const d=r.trim();if(!d)return!0;const f=Ma(d);return Ma(a).includes(f)||a.toLowerCase().includes(d.toLowerCase())}function Sa({agents:a,filter:r,highlightedIndex:d,visible:f,onSelect:l,position:u="below",roomMemberIds:y,roomName:k}){const{t:b}=$e("app"),j=s.useMemo(()=>a.filter(p=>Ha(p.name,r)),[a,r]),I=!!y,i=I&&r.trim().length>0,R=s.useMemo(()=>I?j.filter(p=>y?.has(p.id)):j,[j,y,I]),w=s.useMemo(()=>I?j.filter(p=>!y?.has(p.id)):[],[j,y,I]),E=i?[...R,...w]:R;return f?t.jsx("div",{className:`agent-mention-popup agent-mention-popup--${u}`,"data-testid":"agent-mention-popup",role:"listbox","aria-label":b("agentMention.suggestionsLabel","Agent mention suggestions"),children:E.length===0?t.jsx("div",{className:"agent-mention-empty",children:b("agentMention.noAgentsFound","No agents found")}):t.jsxs(t.Fragment,{children:[I&&t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-members-header",children:k?b("agentMention.membersOf","Members of #{{roomName}}",{roomName:k}):b("agentMention.roomMembers","Room members")}),R.map((p,c)=>t.jsxs("button",{type:"button",className:`agent-mention-item${c===d?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${p.id}`,onMouseDown:z=>z.preventDefault(),onClick:()=>l(p),role:"option","aria-selected":c===d,children:[t.jsx(hn,{agent:p,size:20}),I&&t.jsx("span",{className:"status-dot agent-mention-member-dot","aria-label":b("agentMention.roomMemberBadge","Room member")}),t.jsx("span",{className:"agent-mention-name",children:p.name}),t.jsx("span",{className:"agent-mention-role",children:p.role})]},p.id)),I&&!i&&w.length>0&&t.jsx("div",{className:"agent-mention-hint","data-testid":"agent-mention-other-hint",children:b("agentMention.typeToSearch","Type to search other agents")}),I&&i&&w.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"agent-mention-section-header","data-testid":"agent-mention-others-header",children:b("agentMention.otherAgents","Other agents")}),w.map((p,c)=>{const z=R.length+c;return t.jsxs("button",{type:"button",className:`agent-mention-item${z===d?" agent-mention-item--highlighted":""}`,"data-testid":`agent-mention-item-${p.id}`,onMouseDown:N=>N.preventDefault(),onClick:()=>l(p),role:"option","aria-selected":z===d,children:[t.jsx(hn,{agent:p,size:20}),t.jsx("span",{className:"agent-mention-name",children:p.name}),t.jsx("span",{className:"agent-mention-role",children:p.role})]},p.id)})]})]})}):null}function uo(a,r){return a+r}function mo({visible:a,position:r,tasks:d,files:f,selectedIndex:l,onSelectTask:u,onSelectFile:y,loading:k}){const{t:b}=$e("app");if(!a)return null;const j=d.length>0,I=f.length>0;return t.jsxs("div",{className:"file-mention-popup",style:{top:r.top,left:r.left},"data-testid":"file-mention-popup",onMouseDown:i=>{i.preventDefault()},children:[k&&t.jsx("div",{className:"file-mention-popup-loading","data-testid":"file-mention-loading",children:t.jsx("span",{className:"spinner"})}),!k&&!j&&!I&&t.jsx("div",{className:"file-mention-popup-empty","data-testid":"file-mention-empty",children:b("fileMention.empty","No tasks or files found")}),!k&&(j||I)&&t.jsxs("div",{className:"file-mention-popup-groups",children:[j&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:b("fileMention.taskHeader","Tasks")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":b("fileMention.taskMatches","Task matches"),children:d.map((i,R)=>{const w=R;return t.jsxs("li",{className:`file-mention-popup-item${w===l?" file-mention-popup-item--selected":""}`,onClick:()=>u(i),role:"option","aria-selected":w===l,"data-testid":`task-mention-item-${w}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Ba,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsxs("div",{className:"file-mention-popup-task-row",children:[t.jsx("span",{className:"file-mention-popup-task-id",children:i.id}),t.jsx("span",{className:`file-mention-popup-column-badge file-mention-popup-column-badge--${i.column}`,children:i.column})]}),t.jsx("span",{className:"file-mention-popup-item-path",children:i.title})]})]},i.id)})})]}),I&&t.jsxs("div",{className:"file-mention-popup-group",children:[t.jsx("div",{className:"file-mention-popup-group-header",children:b("fileMention.fileHeader","Files")}),t.jsx("ul",{className:"file-mention-popup-list",role:"listbox","aria-label":b("fileMention.fileMatches","File matches"),children:f.map((i,R)=>{const w=uo(d.length,R),E=Ai(i.path);return t.jsxs("li",{className:`file-mention-popup-item${w===l?" file-mention-popup-item--selected":""}`,onClick:()=>y(i),role:"option","aria-selected":w===l,"data-testid":`file-mention-item-${w}`,children:[t.jsx("span",{className:"file-mention-popup-icon",children:t.jsx(Ti,{})}),t.jsxs("div",{className:"file-mention-popup-info",children:[t.jsx("span",{className:"file-mention-popup-item-name",children:i.name}),E&&t.jsx("span",{className:"file-mention-popup-item-path",children:E})]})]},i.path)})})]})]})]})}function ho(a,r=[],d){const f=a.trim().replace(/^#/,""),l=(y,k)=>d?d(y,k):k;if(!f)return{ok:!1,error:l("createRoom.nameRequired","Room name is required.")};if(/[A-Z]/.test(f))return{ok:!1,error:l("createRoom.lowercase","Use lowercase letters only.")};const u=f.toLowerCase();return u.length>80?{ok:!1,error:l("createRoom.maxLength","Room names can be at most 80 characters.")}:/^[a-z0-9_-]+$/.test(u)?/^[-_]|[-_]$/.test(u)?{ok:!1,error:l("createRoom.noEdgeChars","Room names cannot start or end with a hyphen or underscore.")}:r.some(y=>y.toLowerCase()===u)?{ok:!1,error:l("createRoom.duplicate","A room with this name already exists.")}:{ok:!0,name:u}:{ok:!1,error:l("createRoom.validChars","Use lowercase letters, numbers, hyphens, or underscores only.")}}function fo({isOpen:a,onClose:r,onCreate:d,projectId:f,existingRoomNames:l=[]}){const{t:u}=$e("app"),[y,k]=s.useState(""),[b,j]=s.useState([]),[I,i]=s.useState(""),[R,w]=s.useState([]),[E,p]=s.useState(!1),[c,z]=s.useState(null),[N,W]=s.useState(!1),$=s.useRef(null),U=s.useRef(null),[P,ee]=s.useState(void 0);s.useLayoutEffect(()=>{a&&ee(Ei())},[a]),s.useEffect(()=>{a&&(U.current=document.activeElement instanceof HTMLElement?document.activeElement:null,p(!0),z(null),Di(void 0,f).then(T=>j(T)).catch(()=>{j([]),z(u("createRoom.failedLoadAgents","Failed to load agents."))}).finally(()=>p(!1)))},[a,f]),s.useEffect(()=>{if(!a){k(""),i(""),w([]),z(null),W(!1);return}const T=window.requestAnimationFrame(()=>$.current?.focus());return()=>window.cancelAnimationFrame(T)},[a]),s.useEffect(()=>{if(!a)return;const T=H=>{H.key==="Escape"&&r()};return document.addEventListener("keydown",T),()=>document.removeEventListener("keydown",T)},[a,r]),s.useEffect(()=>{a||U.current?.focus()},[a]);const Y=s.useMemo(()=>ho(y,l,u),[y,l,u]),q=s.useMemo(()=>{const T=I.trim().toLowerCase();return T?b.filter(H=>H.name.toLowerCase().includes(T)):b},[b,I]),L=s.useMemo(()=>b.filter(T=>R.includes(T.id)),[b,R]),_=Y.ok&&R.length>0&&!N&&!E;if(!a)return null;const G=T=>{N||w(H=>H.includes(T)?H.filter(C=>C!==T):[...H,T])},K=async()=>{if(!Y.ok){z(Y.error);return}if(R.length===0){z(u("createRoom.selectMember","Select at least one member."));return}z(null),W(!0);try{await d({name:Y.name,displayName:`#${Y.name}`,memberAgentIds:R}),r()}catch(T){z(T instanceof Error?T.message:u("createRoom.failedCreate","Failed to create room."))}finally{W(!1)}};return gi.createPortal(t.jsx("div",{className:"modal-overlay open",onClick:T=>T.target===T.currentTarget&&r(),style:P?{zIndex:P}:void 0,children:t.jsxs("div",{className:"modal modal-lg create-room-modal",role:"dialog","aria-modal":"true","aria-label":u("createRoom.title","Create room"),onClick:T=>T.stopPropagation(),children:[t.jsxs("div",{className:"modal-header",children:[t.jsx("h3",{children:u("createRoom.title","Create room")}),t.jsx("button",{type:"button",className:"modal-close","aria-label":u("actions.close","Close"),onClick:r,children:"×"})]}),t.jsxs("div",{className:"form-group create-room-modal-name-group",children:[t.jsx("label",{htmlFor:"create-room-name",children:u("createRoom.nameLabel","Room name")}),t.jsxs("div",{className:"create-room-modal-name-field",children:[t.jsx("span",{"aria-hidden":"true",className:"create-room-modal-name-hash",children:"#"}),t.jsx("input",{ref:$,id:"create-room-name",className:"input",value:y,disabled:N,onChange:T=>{const H=T.target.value.replace(/^#/,"").replace(/\s+/g,"-").toLowerCase();k(H)}})]}),!Y.ok&&t.jsx("div",{className:"form-error",children:Y.error})]}),t.jsxs("div",{className:"form-group",children:[t.jsx("label",{htmlFor:"create-room-member-search",children:u("createRoom.members","Members")}),t.jsx("input",{id:"create-room-member-search",className:"input",placeholder:u("createRoom.searchAgents","Search agents"),value:I,disabled:N,onChange:T=>i(T.target.value)})]}),L.length>0&&t.jsx("div",{className:"create-room-modal-selected","data-testid":"create-room-selected-chips",children:L.map(T=>t.jsxs("button",{type:"button",className:"btn btn-sm create-room-modal-chip",onClick:()=>G(T.id),disabled:N,children:[T.name," ×"]},T.id))}),t.jsx("div",{className:"create-room-modal-member-list","data-testid":"create-room-member-list",children:E?t.jsx("div",{className:"create-room-modal-empty",children:t.jsx(Ii,{label:u("createRoom.loadingAgents","Loading agents...")})}):q.length===0?t.jsx("div",{className:"create-room-modal-empty",children:b.length===0?u("createRoom.noAgents","No agents in this project yet."):u("createRoom.noMatch","No agents match your search.")}):q.map(T=>{const H=R.includes(T.id);return t.jsxs("button",{type:"button",className:`create-room-modal-member-row${H?" create-room-modal-member-row--selected":""}`,onClick:()=>G(T.id),disabled:N,children:[t.jsx(hn,{agent:T,size:20}),t.jsx("span",{children:T.name}),t.jsx("span",{className:"create-room-modal-member-role",children:T.role})]},T.id)})}),c&&t.jsx("div",{className:"form-group",children:t.jsx("div",{className:"form-error",children:c})}),t.jsxs("div",{className:"modal-actions",children:[t.jsx("button",{type:"button",className:"btn",onClick:r,disabled:N,children:u("actions.cancel","Cancel")}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>void K(),disabled:!_,children:N?u("createRoom.creating","Creating..."):u("createRoom.create","Create room")})]})]})}),document.body)}function go({cliSessionId:a,tier:r,projectId:d,renderTranscript:f,renderComposer:l,queuedCount:u=0,terminalProps:y}){const{t:k}=$e("app"),b=r==="generic",[j,I]=s.useState(b?"terminal":"transcript");if(b)return t.jsx("div",{className:"cli-chat-surface cli-chat-surface--generic","data-tier":"generic",children:t.jsx(wa,{sessionId:a,projectId:d,...y})});const i=j==="terminal";return t.jsxs("div",{className:"cli-chat-surface","data-tier":r,"data-view":j,children:[t.jsxs("div",{className:"cli-chat-surface__toolbar",role:"tablist","aria-label":k("cliChat.viewToggleLabel","Chat view"),children:[t.jsxs("button",{type:"button",role:"tab","aria-selected":!i,className:`cli-chat-surface__tab${i?"":" is-active"}`,onClick:()=>I("transcript"),children:[t.jsx(dn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:k("cliChat.transcriptTab","Transcript")})]}),t.jsxs("button",{type:"button",role:"tab","aria-selected":i,className:`cli-chat-surface__tab${i?" is-active":""}`,onClick:()=>I("terminal"),children:[t.jsx(Li,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:k("cliChat.terminalTab","Terminal")})]})]}),t.jsx("div",{className:"cli-chat-surface__body",children:i?t.jsx(wa,{sessionId:a,projectId:d,...y}):f()}),!i&&t.jsxs("div",{className:"cli-chat-surface__composer",children:[u>0&&t.jsx("div",{className:"cli-chat-surface__queued",role:"status","aria-live":"polite",children:k("cliChat.queued","{{count}} message queued — will send when the agent is ready",{count:u})}),l()]})]})}const po=200,vo=8,bo=8;function Ra(){return new DOMException("The operation was aborted.","AbortError")}function Na(a,r){return r.aborted?Promise.reject(Ra()):new Promise((d,f)=>{const l=()=>f(Ra());r.addEventListener("abort",l,{once:!0}),a.then(u=>{r.removeEventListener("abort",l),d(u)},u=>{r.removeEventListener("abort",l),f(u)})})}function ja(a,r,d){const f=a.slice(0,r),l=a.slice(r+1),u=l.match(/[\s]|$/),y=u?u.index??l.length:l.length,k=l.slice(y);return`${f}${d}${k}`}function xo(a={}){const{projectId:r,workspace:d="project"}=a,[f,l]=s.useState(!1),[u,y]=s.useState(""),[k,b]=s.useState(-1),[j,I]=s.useState([]),[i,R]=s.useState([]),[w,E]=s.useState(!1),[p,c]=s.useState(0),z=s.useRef(null),N=s.useRef(null),W=[...j.map(L=>({kind:"task",task:L})),...i.map(L=>({kind:"file",file:L}))];s.useEffect(()=>()=>{z.current&&clearTimeout(z.current),N.current?.abort()},[]);const $=s.useCallback((L,_)=>{if(_<0||_>L.length){l(!1);return}const G=K=>/[a-zA-Z0-9/_.-]/.test(K);for(let K=_-1;K>=0;K--){if(L[K]==="#"){if(K===0){const H=L.slice(K+1,_);b(K),y(H),c(0),l(!0);return}const T=L[K-1];if(/[\s,.;:!?'"()[\]{}]/.test(T)){const H=L.slice(K+1,_);b(K),y(H),c(0),l(!0);return}l(!1);return}if(!G(L[K])){l(!1);return}}l(!1)},[]),U=s.useCallback(()=>{N.current?.abort(),l(!1),y(""),b(-1),I([]),R([]),c(0),E(!1)},[]),P=s.useCallback(async L=>{if(!L.trim()){I([]),R([]),E(!1);return}N.current?.abort();const _=new AbortController;N.current=_;try{E(!0);const[G,K]=await Promise.allSettled([Na(Pi(20,0,r,L),_.signal),Na(Fi(L,d,r),_.signal)]);if(_.signal.aborted)return;const T=G.status==="fulfilled"?G.value.slice(0,vo).map(C=>({id:C.id,title:C.title??"",column:C.column})):[],H=K.status==="fulfilled"?K.value.files.slice(0,bo):[];I(T),R(H),c(0)}catch(G){G.name!=="AbortError"&&(I([]),R([]))}finally{_.signal.aborted||E(!1)}},[d,r]);s.useEffect(()=>{if(f)return z.current&&clearTimeout(z.current),z.current=setTimeout(()=>{P(u)},po),()=>{z.current&&clearTimeout(z.current)}},[u,f,P]);const ee=s.useCallback((L,_)=>!f||k<0?_:ja(_,k,`#${L.id}`),[f,k]),Y=s.useCallback((L,_)=>!f||k<0?_:ja(_,k,`#${L.path}`),[f,k]),q=s.useCallback((L,_)=>{if(!f||W.length===0)return!1;switch(L.key){case"ArrowDown":return L.preventDefault(),c(G=>Math.min(G+1,W.length-1)),!0;case"ArrowUp":return L.preventDefault(),c(G=>Math.max(G-1,0)),!0;case"Enter":case"Tab":return W[p]?(L.preventDefault(),!0):!1;case"Escape":return L.preventDefault(),U(),!0;default:return!1}},[f,W,p,U]);return{mentionActive:f,tasks:j,files:i,combinedItems:W,loading:w,mentionQuery:u,selectedIndex:p,setSelectedIndex:c,detectMention:$,selectTask:ee,selectFile:Y,dismissMention:U,handleKeyDown:q}}const ns=new Map,un=new Map;function ms(a){return a??"global"}function us(a){return`${Rt.DISCOVERED_SKILLS_PREFIX}${ms(a)}`}function ut(a){return ht(us(a),{maxAgeMs:os})}function wo(a,r){for(const d of un.get(a)??[])d(r)}async function yo(a){const r=ms(a),d=ns.get(r);if(d)return d;const f=_i(a).finally(()=>{ns.delete(r)});return ns.set(r,f),f}function ko(a){const[r,d]=s.useState(()=>ut(a)??[]),[f,l]=s.useState(()=>ut(a)===null),u=s.useRef(ut(a)!==null),y=ms(a);s.useEffect(()=>{const j=ut(a)??[];d(j),l(ut(a)===null),u.current=ut(a)!==null},[a]),s.useEffect(()=>{const j=un.get(y)??new Set;return j.add(d),un.set(y,j),()=>{j.delete(d),j.size===0&&un.delete(y)}},[y]);const k=s.useCallback(async()=>{try{const j=await yo(a);u.current=!0,X(us(a),j,{maxBytes:5e5}),wo(y,j)}catch{u.current||$i(us(a))}finally{l(!1)}},[a,y]);s.useEffect(()=>{k()},[k]);const b=s.useCallback(async()=>{l(!0),await k()},[k]);return{skills:r,loading:f,refresh:b}}function Co(a,r){const d=a.reduce((f,l)=>f+(l.content?.length??0),0)+(r?.length??0);return Math.ceil(d/4)}function Aa(a){if(!Number.isFinite(a)||a<=0)return"0";if(a<1e3)return String(Math.round(a));const r=a/1e3;return r<10?`~${Number(r.toFixed(1))}k`:`${Math.round(r)}k`}const hs=640,Mo=200,So=200,mt=8;function Ko(a){const r=a.trim();return r?`${r}
7
-
8
- `:""}function Ro(a,r,d,f,l,u,y){const k=Math.max(mt,u-f-mt),b=Math.max(mt,y-l-mt),j=d?a-f:a;return{x:Math.min(Math.max(mt,j),k),y:Math.min(Math.max(mt,r),b)}}const Ta="__SKIP__";let ss=!1;function No(a,r=hs){return a>r?"auto":"hidden"}function jo(a,r=hs){return Math.max(40,Math.min(a,r))}function Ao(a,r){const d=new Date(a),l=new Date().getTime()-d.getTime(),u=Math.floor(l/1e3),y=Math.floor(u/60),k=Math.floor(y/60),b=Math.floor(k/24);return u<60?r("chat.relativeTimeJustNow","just now"):y<60?r("chat.relativeTimeMinutes","{{count}}m ago",{count:y}):k<24?r("chat.relativeTimeHours","{{count}}h ago",{count:k}):b<7?r("chat.relativeTimeDays","{{count}}d ago",{count:b}):d.toLocaleDateString()}const To=280,cn=180,ln=500,Ea="fusion:chat-sidebar-width",as="fusion:chat-scope",Eo="fusion:chat-draft:";function Da(a,r){return a.slice(r+1).find(d=>d.role==="user")?.content}function Ia(a,r){return r?`${Eo}${a}:${r}`:null}function La(a){if(!a)return"";try{return localStorage.getItem(a)??""}catch{return""}}const Do=["image/png","image/jpeg","image/gif","image/webp","text/plain","application/json","text/yaml","text/markdown","text/csv","application/xml","text/x-log"],is=no;function Io(a,r){const d=a.slice(0,r),f=/(^|[\s\n])@([\w-]*)$/.exec(d);if(!f)return null;const l=f[2]??"",u=d.length-l.length-1;return{filter:l,start:u,end:r}}function Lo(a){const r=a?.runtimeConfig;if(!r||typeof r!="object")return null;const d=Reflect.get(r,"modelProvider"),f=Reflect.get(r,"modelId");return typeof d!="string"||d.trim().length===0||typeof f!="string"||f.trim().length===0?null:{provider:d,modelId:f}}function Pa(a,r,d){if(a?.modelProvider&&a?.modelId)return{provider:a.modelProvider,modelId:a.modelId};const f=Lo(r??void 0);return f||(d.provider&&d.modelId?{provider:d.provider,modelId:d.modelId}:null)}function Po({projectId:a,defaultModel:r,defaultKind:d,defaultAgentId:f,defaultThinkingLevel:l,defaultSelectedThinkingLevel:u,onClose:y,onCreate:k}){const{t:b}=$e("app"),[j,I]=s.useState(d??"agent"),{agents:i,loading:R}=$a(a),[w,E]=s.useState(f??""),{models:p,favoriteProviders:c,favoriteModels:z,loading:N,refresh:W}=_a(),$=r.provider&&r.modelId?`${r.provider}/${r.modelId}`:"",[U,P]=s.useState($),[ee,Y]=s.useState(u??""),[q,L]=s.useState(c),[_,G]=s.useState(z);s.useEffect(()=>{L(c)},[c]),s.useEffect(()=>{G(z)},[z]),s.useEffect(()=>{d&&I(d)},[d]),s.useEffect(()=>{f&&E(v=>v||f)},[f]),s.useEffect(()=>{$&&P(v=>v||$)},[$]),s.useEffect(()=>{u&&Y(v=>v||u)},[u]);const K=s.useCallback(async v=>{const M=q,A=M.includes(v)?M.filter(F=>F!==v):[v,...M];L(A);try{await xa({favoriteProviders:A,favoriteModels:_}),await W()}catch{L(M)}},[q,_,W]),T=s.useCallback(async v=>{const M=_,A=M.includes(v)?M.filter(F=>F!==v):[v,...M];G(A);try{await xa({favoriteProviders:q,favoriteModels:A}),await W()}catch{G(M)}},[_,q,W]),H=U||$,C=v=>{if(v.preventDefault(),j==="agent"){if(!w)return;k({agentId:w});return}if(!H)return;const M=H.indexOf("/");if(M<=0)return;const h=H.slice(0,M),A=H.slice(M+1);k({agentId:xe,modelProvider:h,modelId:A,thinkingLevel:ee||void 0})},g=j==="agent"?!w:!H;return t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:y,role:"dialog","aria-modal":"true",children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:v=>v.stopPropagation(),children:[t.jsx("h3",{children:b("chat.newChatTitle","New Chat")}),t.jsxs("div",{className:"chat-new-dialog-mode-toggle","data-testid":"chat-new-dialog-mode-toggle",children:[t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${j==="agent"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-agent",onClick:()=>{I("agent")},children:b("chat.newChatModeAgent","Agent")}),t.jsx("button",{type:"button",className:`chat-new-dialog-mode-btn${j==="model"?" chat-new-dialog-mode-btn--active":""}`,"data-testid":"chat-new-dialog-mode-model",onClick:()=>{I("model"),E(""),P(v=>v||$)},children:b("chat.newChatModeModel","Model")})]}),t.jsxs("form",{onSubmit:C,children:[j==="agent"&&t.jsxs("label",{className:"chat-new-dialog-model-label",children:[b("chat.newChatModeAgent","Agent"),R?t.jsx("div",{className:"chat-new-dialog-loading",children:b("chat.loadingAgents","Loading agents...")}):i.length===0?t.jsx("div",{className:"chat-new-dialog-empty",children:b("chat.noAgentsAvailable","No agents available")}):t.jsx("div",{className:"chat-new-dialog-agent-list",children:i.map(v=>t.jsxs("button",{type:"button",className:`chat-new-dialog-agent-item${w===v.id?" chat-new-dialog-agent-item--selected":""}`,onClick:()=>E(v.id),"data-testid":`agent-option-${v.id}`,children:[t.jsx(mn,{size:16}),t.jsx("span",{className:"chat-new-dialog-agent-name",children:v.name}),t.jsx("span",{className:"chat-new-dialog-agent-role",children:v.role})]},v.id))})]}),j==="model"&&t.jsx("div",{className:"chat-new-dialog-model-dropdown","data-testid":"chat-new-dialog-model-section",children:N?t.jsx("div",{className:"chat-new-dialog-loading",children:b("chat.loadingModels","Loading models...")}):t.jsx(Fa,{models:p,value:U,onChange:P,label:b("chat.newChatModeModel","Model"),placeholder:b("chat.selectModel","Select a model"),favoriteProviders:q,onToggleFavorite:K,favoriteModels:_,onToggleModelFavorite:T,showThinkingLevel:!0,thinkingLevel:ee,onThinkingLevelChange:Y,defaultThinkingLevel:l??"off"})}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{type:"button",className:"btn btn-sm",onClick:y,children:b("chat.cancel","Cancel")}),t.jsx("button",{type:"submit",className:"btn btn-sm btn-primary",disabled:g,children:b("chat.create","Create")})]})]})]})})}function Vo({projectId:a,addToast:r,floating:d=!1,compactLayout:f=!1,onPopOut:l,onMaximize:u,onMinimize:y,onClose:k,chatCommandContext:b,initialComposerDraft:j,initialComposerDraftNonce:I}){const{t:i}=$e("app");s.useEffect(()=>(cs({view:"ChatView",trigger:ss?"route-active":"remount",projectId:a,replayAttempted:!1}),ss=!1,()=>{ss=!0,cs({view:"ChatView",trigger:"route-inactive",projectId:a,replayAttempted:!1})}),[a]);const[R,w]=s.useState(null);s.useEffect(()=>{let e=!1;return w(null),Bi(a).then(n=>{e||w(n)}).catch(()=>{e||w(null)}),()=>{e=!0}},[a]);const E=R?.defaultThinkingLevel??"off",p=s.useMemo(()=>R?.chatDefaultKind==="agent"&&R.chatDefaultAgentId?{kind:"agent",agentId:R.chatDefaultAgentId}:R?.chatDefaultKind==="model"&&R.chatDefaultModelProvider&&R.chatDefaultModelId?{kind:"model",modelProvider:R.chatDefaultModelProvider,modelId:R.chatDefaultModelId,thinkingLevel:R.chatDefaultThinkingLevel}:null,[R]),{activeSession:c,sessionsLoading:z,messages:N,messagesLoading:W,isStreaming:$,streamingText:U,streamingThinking:P,streamingToolCalls:ee,selectSession:Y,createSession:q,archiveSession:L,renameSession:_,pinSession:G,pinnedCount:K,setSessionModel:T,setSessionThinkingLevel:H,deleteSession:C,sendMessage:g,editMessageAndResend:v,stopStreaming:M,pendingMessages:h,clearPendingMessage:A,loadMoreMessages:F,hasMoreMessages:Q,searchQuery:we,setSearchQuery:se,filteredSessions:ae,agentsMap:ye}=zi(a,r),[he,ke]=s.useState(!1),re=!0,[D,We]=s.useState(()=>{try{if(localStorage.getItem(as)==="rooms"&&re)return"rooms"}catch{}return"direct"}),x=ro(a,r),{isUnread:fs,markRead:ue}=co(a),[J,Ce]=s.useState(()=>{const e=Ia(D,D==="rooms"?x.activeRoom?.id:c?.id);return La(e)}),[te,Me]=s.useState(null),fn=s.useRef(null),gs=(e,n,o,m)=>{typeof window>"u"||Me({sessionId:e,anchorX:n,anchorY:o,anchorRight:m?.anchorRight??!1,x:n,y:o})};s.useLayoutEffect(()=>{if(!te||!fn.current||typeof window>"u")return;const e=fn.current,n=e.getBoundingClientRect(),o=n.width||e.offsetWidth||So,m=n.height||e.offsetHeight,S=Ro(te.anchorX,te.anchorY,te.anchorRight,o,m,window.innerWidth,window.innerHeight);(S.x!==te.x||S.y!==te.y)&&Me({...te,...S})},[te]);const[jt,At]=s.useState(null),[gn,pn]=s.useState(""),[ps,Tt]=s.useState(null),[vs,Et]=s.useState(null),[ft,_e]=s.useState(!0),[Xe,vn]=s.useState(To),[Ua,Dt]=s.useState(!1),{agentsMap:bs}=$a(a),pe=s.useMemo(()=>ye.size>0?ye:bs,[bs,ye]),{models:bn,favoriteProviders:Ka,favoriteModels:Va,defaultProvider:xs,defaultModelId:ws}=_a(),It=s.useMemo(()=>({provider:xs,modelId:ws}),[ws,xs]),Wa=s.useMemo(()=>p?.kind==="model"?{provider:p.modelProvider,modelId:p.modelId}:It,[p,It]),{skills:xn,loading:Xa}=ko(a),[qe,Be]=s.useState(!1),[gt,pt]=s.useState(""),[Ge,ze]=s.useState(0),[Qe,Ye]=s.useState(""),[Se,Je]=s.useState(!1),[Lt,Pt]=s.useState(0),[wn,Ze]=s.useState(-1),[fe,yn]=s.useState([]),[ys,et]=s.useState(!1),[ks,Ft]=s.useState(!1),[tt,Cs]=s.useState({}),[$t,Re]=s.useState(!1),[_t,vt]=s.useState(!1),{pushNav:Ms}=Oi(),[,Bt]=s.useState(!1),[qa,Ga]=s.useState({top:0,left:0}),V=xo({projectId:a}),kn=s.useCallback(e=>{if(!e||!V.mentionActive)return;const n=e.getBoundingClientRect();Ga({top:n.top-260,left:n.left+8})},[V.mentionActive]),Ss=s.useRef(null),Rs=s.useRef(null),Ns=s.useRef(null),js=s.useRef(null),de=s.useRef(!1),zt=s.useRef(null),As=s.useRef(null),Le=s.useRef(null),Ot=s.useRef(0),Cn=s.useRef(null),bt=s.useRef(null),Ne=s.useRef(null),ce=s.useRef(null),Mn=s.useRef(null),nt=s.useRef(null),[Sn,Qa]=s.useState(()=>new Set),Ht=s.useRef(!1),je=s.useRef(null),Ae=s.useRef(null),ie=s.useRef(null),Ts=s.useRef(void 0),Rn=s.useRef(!1),Ut=s.useRef(null),Es=s.useRef([]),st=s.useRef(0),xt=s.useRef(new Map),Nn=s.useRef(!1),Kt=Hi(),Oe=Kt==="mobile",jn=Kt==="tablet",Ds=s.useRef(null),[Ya,Is]=s.useState(!1);s.useLayoutEffect(()=>{if(!d){Is(!1);return}const e=Ds.current;if(!e||typeof ResizeObserver>"u")return;const n=()=>{Is(e.getBoundingClientRect().width<=768)};n();const o=new ResizeObserver(n);return o.observe(e),()=>o.disconnect()},[d]);const O=Oe||Ya||f;s.useEffect(()=>{c?.id&&ue("direct",c.id,c.lastMessageAt??c.updatedAt)},[c?.id,c?.lastMessageAt,c?.updatedAt,ue]),s.useEffect(()=>{x.activeRoom?.id&&ue("room",x.activeRoom.id,x.activeRoom.updatedAt)},[x.activeRoom?.id,x.activeRoom?.updatedAt,ue]),s.useEffect(()=>{if(!c?.id||N.length===0)return;const e=N[N.length-1];ue("direct",c.id,e?.createdAt??c.lastMessageAt??c.updatedAt)},[c?.id,c?.lastMessageAt,c?.updatedAt,ue,N]),s.useEffect(()=>{if(!x.activeRoom?.id||x.messages.length===0)return;const e=x.messages[x.messages.length-1];ue("room",x.activeRoom.id,e?.createdAt??x.activeRoom.updatedAt)},[ue,x.activeRoom?.id,x.activeRoom?.updatedAt,x.messages]),s.useEffect(()=>{try{const e=localStorage.getItem(Ea);if(!e)return;const n=Number.parseInt(e,10);if(Number.isNaN(n))return;const o=Math.max(cn,Math.min(ln,n));vn(o)}catch{}},[]),s.useEffect(()=>{try{const e=localStorage.getItem(as);if(e==="direct"){We("direct");return}e==="rooms"&&re&&We("rooms")}catch{}},[re]),s.useEffect(()=>{try{localStorage.setItem(as,D)}catch{}},[re,D]);const me=Ia(D,D==="rooms"?x.activeRoom?.id:c?.id),An=s.useRef(me),Tn=s.useRef(!1);s.useEffect(()=>{if(me!==An.current){if(An.current=me,Tn.current){Tn.current=!1;return}Ce(La(me))}},[me]),s.useEffect(()=>{if(!(!me||An.current!==me))try{if(J){localStorage.setItem(me,J);return}localStorage.removeItem(me)}catch{}},[me,J]);const oe=D==="rooms"&&!!x.activeRoom,{keyboardOverlap:Ls,keyboardOpen:Vt}=Ui({enabled:(O||jn)&&(!!c||oe),allowNonMobileViewport:jn}),wt=jn&&Vt,Wt=s.useMemo(()=>{const e=gt.trim().toLowerCase();return(e?xn.filter(o=>o.name.toLowerCase().includes(e)):xn).slice(0,10)},[xn,gt]),En=s.useMemo(()=>b?Ki(gt,ba):[],[b,gt]),ve=s.useMemo(()=>{const e=En.map(o=>({kind:"command",command:o,disabled:!b?.agentRunning})),n=Wt.map(o=>({kind:"skill",skill:o}));return[...e,...n]},[En,Wt,b]),at=s.useMemo(()=>Array.from(pe.values()),[pe]),Te=s.useMemo(()=>D!=="rooms"||!x.activeRoom?null:{roomId:x.activeRoom.id,roomName:x.activeRoom.name,memberIds:new Set(x.activeRoomMembers.map(e=>e.agentId))},[re,D,x.activeRoom,x.activeRoomMembers]),He=s.useMemo(()=>{const e=at.filter(m=>Ha(m.name,Qe));if(!Te)return e;const n=e.filter(m=>Te.memberIds.has(m.id));if(Qe.trim().length===0)return n;const o=e.filter(m=>!Te.memberIds.has(m.id));return[...n,...o]},[at,Qe,Te]),Dn=s.useMemo(()=>{const e=new Map;for(const n of at)e.set(n.name.toLowerCase(),n);return e},[at]),Ja=s.useMemo(()=>Wt.map(e=>e.id).join("\0"),[Wt]);s.useEffect(()=>{ze(0)},[Ja]),s.useEffect(()=>{Pt(0)},[Qe,Se]),s.useEffect(()=>()=>{Ne.current!==null&&window.clearTimeout(Ne.current)},[]),s.useEffect(()=>{const e=Rs.current;if(!e||!Q||W)return;const n=new IntersectionObserver(o=>{o[0].isIntersecting&&F()},{threshold:.1});return n.observe(e),()=>n.disconnect()},[Q,W,F]);const it=s.useCallback(()=>oe?x.activeRoom?.id??null:c?.id??null,[oe,x.activeRoom?.id,c?.id]),Ps=s.useCallback((e,n)=>typeof CSS<"u"&&typeof CSS.escape=="function"?e.querySelector(`.chat-message[data-message-id="${CSS.escape(n)}"]`):e.querySelector(`.chat-message[data-message-id="${n.replace(/"/g,'\\"')}"]`),[]),Fs=s.useCallback(()=>{const e=ce.current;if(!e)return;const n=e.getBoundingClientRect().top,o=new Set;e.querySelectorAll(".chat-message--assistant:not(.chat-message--failure)[data-message-id]").forEach(m=>{const S=m.getAttribute("data-message-id");S&&m.getBoundingClientRect().top<n&&o.add(S)}),Qa(m=>m.size===o.size&&Array.from(m).every(S=>o.has(S))?m:o)},[]),Xt=s.useCallback(()=>{!ce.current||nt.current!==null||(nt.current=window.requestAnimationFrame(()=>{nt.current=null,Fs()}))},[Fs]),qt=s.useCallback(()=>{const e=ce.current,n=it();if(!e||!n)return;const o=e.scrollTop,m=e.querySelectorAll(".chat-message[data-message-id]"),S=Array.from(m).find(Z=>Z.offsetTop+Z.offsetHeight>=o)??m[0]??null,B=S?.getAttribute("data-message-id")??null,ne=S?S.offsetTop-o:0;bt.current={threadId:n,scrollTop:o,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight,anchorMessageId:B,anchorOffset:ne,wasPinnedBefore:!de.current,capturedAtMs:typeof performance<"u"?performance.now():Date.now()}},[it]),$s=s.useCallback(()=>{const e=ce.current;if(!e)return;const o=e.scrollTop+e.clientHeight>=e.scrollHeight-50;Ft(!o),de.current=!o,qt(),Xt()},[qt,Xt]),Ee=s.useCallback((e,n)=>{if(!e.isConnected||!n?.force&&de.current)return;let o=0,m=0,S=-1;const B=6,ne=()=>{if(e.isConnected&&!(!n?.force&&de.current)){if(e.scrollTop=e.scrollHeight,e.scrollHeight===S?m+=1:(m=0,S=e.scrollHeight),o+=1,o>=B||m>=2){Ft(!1),de.current=!1;return}window.requestAnimationFrame(ne)}};ne()},[]),ot=oe?x.messages:N;s.useLayoutEffect(()=>(Xt(),()=>{nt.current!==null&&(window.cancelAnimationFrame(nt.current),nt.current=null)}),[ot,Xt]),s.useLayoutEffect(()=>{const e=ce.current,n=it(),o=bt.current;if(!e||!n||!o||o.threadId!==n||o.wasPinnedBefore)return;const m=(typeof performance<"u"?performance.now():Date.now())-o.capturedAtMs,S=e.scrollHeight>e.clientHeight,B=m>3e3,ne=o.scrollTop<=0&&o.anchorOffset<=0&&S;if(!de.current||B||ne){bt.current=null;return}let Z=o.scrollTop;if(o.anchorMessageId){const ge=Ps(e,o.anchorMessageId);ge?Z=ge.offsetTop-o.anchorOffset:Z=o.scrollTop+(e.scrollHeight-o.scrollHeight)}else Z=o.scrollTop+(e.scrollHeight-o.scrollHeight);e.scrollTop=Math.max(0,Z),de.current=!0,Ft(!0),bt.current=null},[ot,it,Ps]);const In=s.useCallback(e=>{},[ot.length,oe]),be=s.useCallback(e=>{In(e);const n=ce.current;n&&(bt.current=null,de.current=!1,Ee(n))},[Ee,In]);s.useLayoutEffect(()=>{Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null);const e=oe?x.activeRoom?.id??null:c?.id??null;if(!e){zt.current=null;return}const n={threadId:e,loaded:oe?!x.messagesLoading:!W,hasMessages:oe?x.messages.length>0:N.length>0},o=zt.current,m=o?.threadId!==e,S=o?.threadId===e&&!o.loaded&&n.loaded,B=o?.threadId===e&&!o.hasMessages&&n.hasMessages;if(!(o===null||m||S||B))return;const Z=ce.current;if(Z)return In(m?"thread-change":S?"finished-loading":B?"first-messages":"mount"),Ee(Z,{force:!0}),oe||(Le.current=window.setTimeout(()=>{if(Le.current=null,de.current)return;const ge=ce.current;ge&&Ee(ge)},250)),zt.current=n,()=>{Le.current!==null&&(window.clearTimeout(Le.current),Le.current=null)}},[oe,x.activeRoom?.id,x.messages.length,x.messagesLoading,c?.id,N.length,W,Ee]),s.useEffect(()=>{!$||de.current||be("streaming")},[$,U,P,be]),s.useEffect(()=>{const e=it();if(!e){Ot.current=0,Cn.current=null;return}if(Cn.current!==e){Cn.current=e,Ot.current=ot.length;return}const n=Ot.current,o=ot.length,m=o>n,S=!de.current;Ot.current=o,m&&S&&be("new-message")},[ot,it,be]),s.useEffect(()=>{Ls<=0||!ce.current||be("keyboard")},[Ls,be]),Vi(Oe&&Vt),s.useLayoutEffect(()=>{if(!Oe||!c&&!oe||typeof window>"u")return;const e=Mn.current,n=window.visualViewport;if(!e||!n)return;const o=S=>{if(!(S instanceof HTMLElement))return!1;if(S.tagName==="TEXTAREA")return!0;if(S.tagName!=="INPUT")return!1;const B=S.type.toLowerCase();return["","text","search","email","url","tel","password","number"].includes(B)},m=()=>{if(Ht.current){e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange="";return}const S=Math.max(0,window.innerHeight-n.offsetTop-n.height),B=n.offsetTop||0;e.style.setProperty("--vv-height",`${n.height}px`),e.style.setProperty("--vv-offset-top",`${B}px`),e.style.setProperty("--keyboard-overlap",`${S}px`);const ne=(S>0||B>0)&&o(document.activeElement);e.classList.toggle("chat-thread--keyboard-active",ne),e.style.setProperty("--chat-keyboard-accessory-clearance",ne&&Zn()?"calc(var(--space-2xl) + var(--space-md))":"0px"),ne&&B>0?(e.style.transform=`translateY(${B}px)`,e.style.willChange="transform"):(e.style.transform="",e.style.willChange="")};return m(),n.addEventListener("resize",m),n.addEventListener("scroll",m),document.addEventListener("focusin",m),document.addEventListener("focusout",m),window.addEventListener("pageshow",m),document.addEventListener("visibilitychange",m),()=>{n.removeEventListener("resize",m),n.removeEventListener("scroll",m),document.removeEventListener("focusin",m),document.removeEventListener("focusout",m),window.removeEventListener("pageshow",m),document.removeEventListener("visibilitychange",m),e.classList.remove("chat-thread--keyboard-active"),e.style.setProperty("--chat-keyboard-accessory-clearance","0px"),e.style.transform="",e.style.willChange=""}},[c,Oe,oe]),s.useEffect(()=>{const e=()=>Me(null);if(te)return document.addEventListener("click",e),()=>document.removeEventListener("click",e)},[te]),s.useEffect(()=>{if(!Oe||!Vt)return;const e=n=>{n.target?.closest(".chat-messages")||n.preventDefault()};return document.addEventListener("touchmove",e,{passive:!1}),()=>{document.removeEventListener("touchmove",e)}},[Oe,Vt]),s.useEffect(()=>{const e=As.current;if(As.current=D,D==="rooms"&&!x.activeRoom){zt.current=null;return}if(!(D==="direct"&&(e===null||e==="rooms"))&&!(D==="rooms"&&(e===null||e==="direct")))return;const m=ce.current;m&&(Ee(m,{force:!0}),de.current=!1,Ft(!1))},[D,x.activeRoom,Ee]),s.useEffect(()=>{if(!c&&!oe||oe&&!O)return;const e=()=>{const o=!de.current;qt(),o&&O&&ce.current&&be("visibility-restore")},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),window.addEventListener("pageshow",e),()=>{document.removeEventListener("visibilitychange",n),window.removeEventListener("pageshow",e)}},[O,Oe,c,oe,qt,be]),s.useEffect(()=>{if(oe||typeof ResizeObserver>"u")return;const e=ce.current;if(!e)return;const n=new ResizeObserver(()=>{de.current||Ee(e)});return n.observe(e),()=>{n.disconnect()}},[oe,Ee,c?.id,D]),s.useEffect(()=>{Es.current=fe},[fe]),s.useEffect(()=>()=>{for(const e of Es.current)e.previewUrl&&URL.revokeObjectURL(e.previewUrl);for(const e of xt.current.values())window.clearTimeout(e);xt.current.clear()},[]);const rt=s.useCallback(e=>{if(!e||e.length===0)return;const n=[];for(const o of Array.from(e)){if(!Do.includes(o.type))continue;const m=o.type.startsWith("image/");n.push({file:o,previewUrl:m?URL.createObjectURL(o):""})}n.length>0&&yn(o=>[...o,...n])},[]),_s=s.useCallback(e=>{yn(n=>{const o=n[e];return o?.previewUrl&&URL.revokeObjectURL(o.previewUrl),n.filter((m,S)=>S!==e)})},[]),Bs=s.useCallback(e=>{const n=e.clipboardData?.files;if(!n||n.length===0)return;const o=Array.from(n).filter(m=>m.type.startsWith("image/"));o.length!==0&&rt(o)},[rt]),ct=s.useCallback(async e=>{try{return await q(e),ke(!1),O&&_e(!1),!0}catch{return r(i("chat.failedToCreateSession","Failed to create chat session"),"error"),!1}},[q,r,O,i]),Gt=s.useCallback(()=>{if(R?.chatNewSessionMode==="always-default"&&p){if(p.kind==="agent"){ct({agentId:p.agentId});return}ct({agentId:xe,modelProvider:p.modelProvider,modelId:p.modelId,thinkingLevel:p.thinkingLevel});return}ke(!0)},[p,R?.chatNewSessionMode,ct]),le=s.useCallback(e=>{const n=e??ie.current;if(!n)return;const o=Kt==="tablet"?Mo:hs;n.style.height="auto",n.style.height=`${jo(n.scrollHeight,o)}px`,n.style.overflowY=No(n.scrollHeight,o)},[Kt]),zs=s.useCallback(e=>{ie.current=e,e&&le(e)},[le]);s.useLayoutEffect(()=>{le(),Rn.current&&(Rn.current=!1,ie.current?.focus())},[D,J,c?.id,x.activeRoom?.id,le]),s.useEffect(()=>{if(I===void 0||I===Ts.current||!j?.trim())return;Ts.current=I;const e=n=>{n&&(Tn.current=!0),We("direct"),Rn.current=!0,Ce(j)};if(!$&&R?.chatNewSessionMode==="always-default"&&p){const n=p.kind==="agent"?{agentId:p.agentId}:{agentId:xe,modelProvider:p.modelProvider,modelId:p.modelId,thinkingLevel:p.thinkingLevel};ct(n).then(o=>e(o||D!=="direct"));return}e(D!=="direct")},[p,D,R?.chatNewSessionMode,ct,j,I,$,le]);const Ue=s.useCallback(()=>{if(Ce(""),me)try{localStorage.removeItem(me)}catch{}Be(!1),pt(""),Je(!1),Ye(""),Ze(-1),yn(e=>{for(const n of e)n.previewUrl&&URL.revokeObjectURL(n.previewUrl);return[]})},[me]),Ln=s.useCallback(()=>{const e=J.trim(),n=fe.map(o=>o.file);if(!(!e&&n.length===0||!c)){if(b){const o=Wi(e,ba);if(o){if(!b.agentRunning){r(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}if(n.length>0){r(i("chat.commandNoAttachments","Attachments aren't supported with commands — remove them before sending"),"warning");return}Ue(),o.command.run({taskId:b.taskId,projectId:b.projectId,remainder:o.remainder}).then(()=>{r(i("chat.commandSteerSuccess","Sent to the running agent"),"success")}).catch(m=>{const S=m instanceof Error&&m.message.trim()?m.message:i("chat.commandSteerFailed","Failed to send to the running agent");r(S,"error")});return}}if(e==="/clear"||e==="/new"){Ue(),A(),M(),q({agentId:c.agentId,modelProvider:c.modelProvider??void 0,modelId:c.modelId??void 0,thinkingLevel:c.thinkingLevel??void 0}).catch(()=>{r(i("chat.failedToClearConversation","Failed to clear conversation"),"error")});return}Ue(),g(e,n)}},[J,fe,c,Ue,M,A,q,r,g,b,i]),Pn=s.useCallback(async()=>{const e=J.trim(),n=fe.map(o=>o.file);if(!(!e&&n.length===0)){if(D==="rooms"){if(!x.activeRoom)return;if(e==="/clear"||e==="/new"){Ue();try{await x.clearRoom(x.activeRoom.id)}catch{r(i("chat.failedToClearRoomConversation","Failed to clear room conversation"),"error")}return}if(Nn.current)return;Nn.current=!0;const o=J;Ue();try{await x.sendRoomMessage(e,{files:n})}catch(m){if(m instanceof za){const B=m.message.trim()?m.message:i("chat.messageSentButReplyFailed","Message sent, but assistant reply failed");r(i("chat.messageSentButReplyFailedDetail","Message sent, but assistant reply failed: {{detail}}",{detail:B}),"error");return}Ce(o);const S=m instanceof Error&&m.message.trim()?m.message:i("chat.failedToSendRoomMessage","Failed to send room message");r(S,"error")}finally{Nn.current=!1}return}Ln()}},[J,fe,re,D,x,x.clearRoom,Ue,r,Ln]),Qt=s.useCallback(async e=>{if(D==="rooms"){if(!x.activeRoom)return;try{await x.sendRoomMessage(e)}catch(n){const o=n instanceof Error&&n.message.trim()?n.message:i("chat.failedToSendRoomMessage","Failed to send room message");r(o,"error")}return}c&&g(e)},[c,r,re,D,x,g,i]),Fn=s.useCallback(e=>{Ce(n=>{const o=is(n);if(!o)return n;const m=`/skill:${e.name} `,S=n.slice(0,o.start)+m+n.slice(o.end);return window.requestAnimationFrame(()=>{ie.current&&(le(ie.current),ie.current.focus())}),S}),Be(!1),pt(""),ze(0)},[le]),$n=s.useCallback((e,n)=>{if(n){r(i("chat.commandNoRunningAgent","No running agent to steer"),"warning");return}Ce(o=>{const m=is(o);if(!m)return o;const S=`${e.trigger} `,B=o.slice(0,m.start)+S+o.slice(m.end);return window.requestAnimationFrame(()=>{ie.current&&(le(ie.current),ie.current.focus())}),B}),Be(!1),pt(""),ze(0)},[le,r,i]),Yt=s.useCallback(e=>{const n=ie.current;if(!n||wn<0)return;const o=n.selectionStart??st.current,m=n.selectionEnd??o,S=Math.max(o,m),B=Math.min(wn,S),Z=`${`@${e.name.replace(/\s+/g,"_")}`} `,ge=J.slice(0,B)+Z+J.slice(S),lt=B+Z.length;Ce(ge),Je(!1),Ye(""),Pt(0),Ze(-1),window.requestAnimationFrame(()=>{ie.current&&(le(ie.current),ie.current.focus(),ie.current.setSelectionRange(lt,lt))})},[wn,J,le]),yt=s.useCallback((e,n)=>{const m=ie.current?.selectionStart??st.current,S=J.lastIndexOf("#",m),B=S>=0?S+n.length:e.length;Ce(e),V.dismissMention(),Bt(!1),window.requestAnimationFrame(()=>{ie.current&&(le(ie.current),ie.current.focus(),ie.current.setSelectionRange(B,B))})},[V,J,le]),Os=s.useCallback(e=>{if(st.current=e.currentTarget.selectionStart??st.current,V.mentionActive&&V.combinedItems.length>0){if(V.handleKeyDown(e,J),e.key==="Enter"||e.key==="Tab"){const n=V.combinedItems[V.selectedIndex];n?.kind==="task"?yt(V.selectTask(n.task,J),`#${n.task.id}`):n?.kind==="file"&&yt(V.selectFile(n.file,J),`#${n.file.path}`)}return}if(Se&&e.key==="ArrowDown"){e.preventDefault(),He.length>0&&Pt(n=>(n+1)%He.length);return}if(Se&&e.key==="ArrowUp"){e.preventDefault(),He.length>0&&Pt(n=>n===0?He.length-1:n-1);return}if(Se&&e.key==="Enter"){e.preventDefault();const n=He[Lt]??He[0];n&&Yt(n);return}if(Se&&e.key==="Escape"){e.preventDefault(),Je(!1),Ye(""),Ze(-1);return}if(qe&&e.key==="ArrowDown"){e.preventDefault(),ve.length>0&&ze(n=>(n+1)%ve.length);return}if(qe&&e.key==="ArrowUp"){e.preventDefault(),ve.length>0&&ze(n=>n===0?ve.length-1:n-1);return}if(qe&&(e.key==="Enter"||e.key==="Tab")&&ve.length>0){e.preventDefault();const n=ve[Ge]??ve[0];n?.kind==="skill"?Fn(n.skill):n?.kind==="command"&&$n(n.command,n.disabled);return}if(qe&&e.key==="Escape"){e.preventDefault(),Be(!1);return}e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),Pn())},[Se,He,Lt,Yt,qe,ve,Ge,Fn,$n,Pn,V,yt,J]),Jt=s.useCallback((e,n)=>{const o=Io(e,n);if(o){Je(!0),Ye(o.filter),Ze(o.start);return}Je(!1),Ye(""),Ze(-1)},[]),Hs=s.useCallback(e=>{const n=e.target,o=n.value,m=n.selectionStart??o.length;le(n),st.current=m,Ce(o);const S=is(o);S?(Be(!0),pt(S.filter)):(Be(!1),pt("")),Jt(o,m),V.detectMention(o,m),Bt(V.mentionActive),V.mentionActive&&kn(n)},[Jt,le]),Zt=s.useCallback(e=>{const n=e.currentTarget,o=n.selectionStart??n.value.length;st.current=o,Jt(n.value,o),V.detectMention(n.value,o),Bt(V.mentionActive),V.mentionActive&&kn(n)},[Jt,V,kn]),Us=s.useCallback(e=>{e.key!=="Escape"&&Zt(e)},[Zt]),Ks=s.useCallback(()=>{typeof window<"u"&&window.innerWidth<=768&&(Ht.current=!0,je.current!==null&&window.clearTimeout(je.current),je.current=window.setTimeout(()=>{Ht.current=!1,je.current=null},450),(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0),Ae.current!==null&&window.clearTimeout(Ae.current),Ae.current=window.setTimeout(()=>{Ae.current=null,document.activeElement?.tagName!=="TEXTAREA"&&(window.scrollY!==0||window.scrollX!==0)&&window.scrollTo(0,0)},350)),Ne.current!==null&&window.clearTimeout(Ne.current),Ne.current=window.setTimeout(()=>{Be(!1),Je(!1),Ye(""),Ze(-1),Bt(!1),V.dismissMention(),Ne.current=null},120)},[V]),Vs=s.useCallback(()=>{Ht.current=!1,je.current!==null&&(window.clearTimeout(je.current),je.current=null),Ne.current!==null&&(window.clearTimeout(Ne.current),Ne.current=null),Ae.current!==null&&(window.clearTimeout(Ae.current),Ae.current=null)},[]);s.useEffect(()=>()=>{je.current!==null&&window.clearTimeout(je.current),Ae.current!==null&&window.clearTimeout(Ae.current)},[]);const Za=s.useCallback(async e=>{Me(null);try{await L(e),r(i("chat.conversationArchived","Conversation archived"),"success")}catch{r(i("chat.failedToArchiveConversation","Failed to archive conversation"),"error")}},[L,r]),Ws=s.useCallback(e=>{const n=ae.find(o=>o.id===e)??(c?.id===e?c:null);Me(null),Re(!1),pn(n?.title??""),At({sessionId:e,title:n?.title??""})},[c,ae]),Xs=s.useCallback(async()=>{if(jt)try{await _(jt.sessionId,gn),At(null),pn(""),r(i("chat.conversationRenamed","Conversation renamed"),"success")}catch{}},[r,jt,_,gn,i]),qs=s.useCallback(async(e,n)=>{Me(null),Re(!1);try{await G(e,n),r(n?i("chat.conversationPinned","Conversation pinned"):i("chat.conversationUnpinned","Conversation unpinned"),"success")}catch{}},[r,G,i]),ei=s.useCallback(async e=>{Tt(null),Me(null);try{await C(e),r(i("chat.conversationDeleted","Conversation deleted"),"success")}catch{r(i("chat.failedToDeleteConversation","Failed to delete conversation"),"error")}},[C,r]),kt=s.useCallback(e=>{try{localStorage.setItem(Ea,String(e))}catch{}},[]),ti=s.useCallback(e=>{if(O||wt)return;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;typeof n.setPointerCapture=="function"&&n.setPointerCapture(e.pointerId);const o=e.clientX,m=Xe;let S=m;document.body.style.userSelect="none";const B=Z=>{const ge=Z.clientX-o,lt=Math.max(cn,Math.min(ln,m+ge));S=lt,vn(lt),kt(lt)},ne=Z=>{typeof n.releasePointerCapture=="function"&&n.releasePointerCapture(Z.pointerId),document.body.style.userSelect="",document.removeEventListener("pointermove",B),document.removeEventListener("pointerup",ne),kt(S)};document.addEventListener("pointermove",B),document.addEventListener("pointerup",ne)},[O,kt,Xe,wt]),ni=s.useCallback(e=>{if(O||wt||e.key!=="ArrowLeft"&&e.key!=="ArrowRight")return;e.preventDefault();const n=e.shiftKey?50:10,o=e.key==="ArrowLeft"?-n:n,m=Math.max(cn,Math.min(ln,Xe+o));vn(m),kt(m)},[O,kt,Xe,wt]),Gs=s.useCallback(e=>{const n=ae.find(o=>o.id===e);ue("direct",e,n?.lastMessageAt??n?.updatedAt),Y(e),Re(!1),O&&_e(!1)},[ae,O,ue,Y]),_n=s.useCallback(()=>{Y(""),_e(!0),Re(!1)},[Y]),Bn=s.useCallback(()=>{x.selectRoom(null),_e(!0),Re(!1)},[x]),si=()=>t.jsxs("div",{className:"chat-empty-state",children:[t.jsx(dn,{size:48,strokeWidth:1.5}),t.jsx("h2",{children:i("chat.startNewConversation","Start a new conversation")}),t.jsxs("button",{className:"btn btn-primary",onClick:Gt,children:[t.jsx(dt,{size:16}),i("chat.newChat","New Chat")]})]}),De=Pa(c,c?.agentId?pe.get(c.agentId)??null:null,It),zn=s.useMemo(()=>{if(!De?.provider||!De.modelId)return null;const e=bn.find(n=>n.provider===De.provider&&n.id===De.modelId);return e?.contextWindow?e.contextWindow:null},[De?.modelId,De?.provider,bn]),ai=s.useMemo(()=>Co(N,$?U:void 0),[$,N,U]),Pe=da(De?.provider,De?.modelId),Ke=De?.provider??null,On=!!(c||$||N.length>0),en=O&&!ft&&(D==="rooms"?oe:On),tn=O?en:D==="rooms"?oe:!!c,Qs=s.useRef(tn);s.useEffect(()=>{const e=Qs.current;Qs.current=tn,O&&(e||!tn||Ms({type:"view",revert:D==="rooms"?Bn:_n}))},[D,_n,Bn,tn,O,Ms]);const Ys=c?.agentId===xe?Pe??"Fusion":c?.title||pe.get(c?.agentId??"")?.name||c?.agentId||"Chat",ii=c?.title||i("chat.untitledSession","Untitled"),oi=!!(Pe&&Pe!==Ys),ri=!O&&On&&zn!==null,Js=Aa(ai),nn=zn!==null?Aa(zn):null,Hn=nn?i("chat.contextWindowAria","Estimated {{used}} of {{total}} context tokens",{used:Js,total:nn}):null,ci=en&&D==="direct"&&!!c,Zs=en&&D==="direct",ea=en&&D==="rooms",Un=pe.get(c?.agentId??"")?.name||(c?.agentId===xe?Pe??"Fusion":c?.agentId?.slice(0,30)??"Fusion"),Kn=!1,Vn=c?.agentId===xe,li=e=>e.length>50?`${e.slice(0,50)}…`:e;s.useEffect(()=>{if(!$t)return;const e=n=>{Ns.current?.contains(n.target)||Re(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[$t]),s.useEffect(()=>{if(!_t)return;const e=o=>{js.current?.contains(o.target)||vt(!1)},n=o=>{o.key==="Escape"&&vt(!1)};return document.addEventListener("mousedown",e),document.addEventListener("keydown",n),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("keydown",n)}},[_t]),s.useEffect(()=>{(!O||D!=="direct"||ft)&&Re(!1)},[O,D,ft]),s.useEffect(()=>{vt(!1)},[x.activeRoom?.id]);const ta=s.useCallback((e,n)=>{const o=xt.current.get(e);o&&window.clearTimeout(o),Cs(S=>({...S,[e]:n}));const m=window.setTimeout(()=>{Cs(S=>{const{[e]:B,...ne}=S;return ne}),xt.current.delete(e)},2e3);xt.current.set(e,m)},[]),na=s.useCallback(async(e,n)=>{const o=await Xi(n);ta(e,o?"success":"error")},[ta]),Wn=c?.agentId===xe,Xn=s.useCallback((e,n,o)=>t.jsx("button",{type:"button",className:`btn-icon chat-message-copy-action${tt[e]==="success"?" chat-message-copy-action--success":""}${tt[e]==="error"?" chat-message-copy-action--error":""}`,"data-testid":o??`chat-copy-response-${e}`,"aria-label":tt[e]==="success"?i("chat.responseCopied","Response copied"):tt[e]==="error"?i("chat.copyFailed","Copy failed"):i("chat.copyResponse","Copy response"),onClick:()=>{na(e,n)},children:tt[e]==="success"?t.jsx(qi,{size:14}):t.jsx(Gi,{size:14})}),[tt,na]),qn=s.useCallback(e=>{const n=ce.current;if(!n)return;const o=`[data-testid="chat-message-${e}"]`,m=n.querySelector(o);if(!m)return;const S=m.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop,B=typeof window<"u"&&window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;n.scrollTo({top:S,behavior:B?"auto":"smooth"})},[]),sa=c?.cliExecutorAdapterId??null,Gn=!!sa,di=sa==="generic"?"generic":"hybrid",ui=c?.cliSessionFile||c?.id||"",aa=!Gn&&!$,ia=()=>t.jsxs("div",{className:"chat-messages",ref:ce,onScroll:$s,children:[t.jsx("div",{ref:Rs,className:"chat-load-more-sentinel",children:Q&&W&&t.jsx("div",{className:"chat-loading-older",children:i("chat.loadingOlderMessages","Loading older messages…")})}),$?t.jsxs(t.Fragment,{children:[N.map((e,n)=>t.jsx(Jn,{message:e,forcePlain:!1,agentName:Un,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:Ke,activeSessionId:c?.id??null,mentionAgentsByName:Dn,roomContext:null,copyAction:Wn&&e.role==="assistant"?Xn(e.id,e.content):void 0,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Da(N,n),onQuestionSubmit:Qt,canEdit:aa,onEditMessage:v},e.id)),t.jsx(so,{streamingText:U,streamingThinking:P,streamingToolCalls:ee,forcePlain:!1,agentName:Un,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:Ke,copyAction:Wn&&U?Xn("__streaming__",U,"chat-copy-response-streaming"):void 0,onQuestionSubmit:Qt})]}):W?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):N.length===0&&!c?si():N.length===0&&c?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):t.jsx(t.Fragment,{children:N.map((e,n)=>t.jsx(Jn,{message:e,forcePlain:!1,agentName:Un,hideAssistantIdentity:Vn,showAssistantModelTag:Kn,activeModelTag:Pe,activeModelProvider:Ke,activeSessionId:c?.id??null,mentionAgentsByName:Dn,roomContext:null,copyAction:Wn&&e.role==="assistant"?Xn(e.id,e.content):void 0,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:e.role==="assistant"&&n===N.length-1&&!$,submittedQuestionAnswer:Da(N,n),onQuestionSubmit:Qt,canEdit:aa,onEditMessage:v},e.id))}),t.jsx("div",{ref:Ss})]}),oa=()=>t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Ut,type:"file","data-testid":"chat-file-input",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{rt(e.target.files),e.target.value=""}}),qe&&t.jsx("div",{className:"chat-skill-menu","data-testid":"chat-skill-menu",role:"listbox","aria-label":i("chat.skillSuggestions","Skill suggestions"),children:Xa&&En.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:i("chat.loadingSkills","Loading skills…")}):ve.length===0?t.jsx("div",{className:"chat-skill-menu-empty",children:gt?i("chat.noSkillsFound","No skills found"):i("chat.noSkillsAvailable","No skills available")}):ve.map((e,n)=>e.kind==="command"?t.jsxs("button",{type:"button",role:"option","aria-selected":n===Ge,"aria-disabled":e.disabled,className:`chat-skill-menu-item chat-command-menu-item${n===Ge?" chat-skill-menu-item--highlighted":""}${e.disabled?" chat-command-menu-item--disabled":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>ze(n),onClick:()=>$n(e.command,e.disabled),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.command.trigger}),t.jsx("span",{className:"chat-skill-menu-item-description",children:e.disabled?i("chat.commandNoRunningAgentHint","No running agent to steer"):e.command.description})]},`command-${e.command.trigger}`):t.jsxs("button",{type:"button",role:"option","aria-selected":n===Ge,className:`chat-skill-menu-item${n===Ge?" chat-skill-menu-item--highlighted":""}`,onMouseDown:o=>o.preventDefault(),onMouseEnter:()=>ze(n),onClick:()=>Fn(e.skill),children:[t.jsx("span",{className:"chat-skill-menu-item-name",children:e.skill.name}),t.jsx("span",{className:"chat-skill-menu-item-description",title:e.skill.relativePath,children:e.skill.relativePath})]},e.skill.id))}),fe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:fe.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>_s(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),h.length>0&&t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-pending-stack","data-testid":"chat-pending-stack",children:h.map((e,n)=>t.jsxs("div",{className:"chat-pending-message","data-testid":"chat-pending-indicator",children:[t.jsx("span",{children:i("chat.queuedMessage","Queued: {{preview}}",{preview:li(e)})}),t.jsx("button",{type:"button",className:"chat-pending-message-dismiss","aria-label":i("chat.dismissQueuedMessage","Dismiss queued message"),"data-testid":`chat-pending-dismiss-${n}`,onClick:()=>A(n),children:"×"})]},`${n}-${e}`))}),t.jsx("div",{className:"chat-pending-divider","aria-hidden":"true"})]}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Ut.current?.click(),children:t.jsx(pa,{size:16})}),!Gn&&t.jsx(Ca,{level:c?.thinkingLevel,defaultThinkingLevel:E,models:bn,favoriteProviders:Ka,favoriteModels:Va,agents:Array.from(pe.values()),agentId:c?.agentId,modelProvider:c?.modelProvider,modelId:c?.modelId,onChange:e=>{c&&H(c.id,e)},onChangeModel:e=>{c&&T(c.id,e)},disabled:!c}),t.jsxs("div",{className:`chat-input-wrapper${ys?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),et(!0)},onDragLeave:()=>et(!1),onDrop:e=>{e.preventDefault(),et(!1),rt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:zs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:J,onChange:Hs,onKeyDown:Os,onKeyUp:Us,onClick:Zt,onBlur:Ks,onFocus:Vs,onPaste:Bs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Sa,{agents:at,filter:Qe,highlightedIndex:Lt,visible:Se,onSelect:Yt,position:"below",roomMemberIds:Te?.memberIds,roomName:Te?.roomName}),t.jsx(mo,{visible:V.mentionActive&&!Se,position:qa,tasks:V.tasks,files:V.files,selectedIndex:V.selectedIndex,onSelectTask:e=>{yt(V.selectTask(e,J),`#${e.id}`)},onSelectFile:e=>{yt(V.selectFile(e,J),`#${e.path}`)},loading:V.loading})]}),t.jsx(va,{isStreaming:$,canSend:!!(J.trim()||fe.length>0),onSend:Ln,onStop:M})]})]}),mi=O?void 0:{width:`${Xe}px`},ra=ae.filter(e=>e.pinnedAt!=null),ca=ae.filter(e=>e.pinnedAt==null),Ct=te?ae.find(e=>e.id===te.sessionId)??(c?.id===te.sessionId?c:void 0):void 0,hi=ci?t.jsxs("div",{className:"chat-mobile-session-menu",ref:Ns,children:[t.jsxs("button",{type:"button",className:"btn chat-mobile-session-trigger","data-testid":"chat-mobile-session-trigger","aria-haspopup":"menu","aria-expanded":$t,onClick:()=>Re(e=>!e),children:[Ke?t.jsx(Yn,{provider:Ke,size:"md"}):t.jsx(mn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:ii}),t.jsx(sn,{size:16,"aria-hidden":"true"})]}),$t&&t.jsxs("div",{className:"chat-mobile-session-dropdown",role:"menu","data-testid":"chat-mobile-session-dropdown",children:[[{id:"pinned",label:i("chat.pinned","Pinned"),testId:"chat-mobile-pinned-divider",sessions:ra},{id:"recent",label:i("chat.recent","Recent"),testId:"chat-mobile-recent-divider",sessions:ca}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-mobile-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>t.jsxs("div",{className:`chat-mobile-session-option-row${c?.id===n.id?" chat-mobile-session-option-row--active":""}`,role:"none",children:[t.jsx("button",{type:"button",role:"menuitem",className:`chat-mobile-session-option${c?.id===n.id?" chat-mobile-session-option--active":""}`,"data-testid":`chat-mobile-session-option-${n.id}`,onClick:()=>Gs(n.id),children:t.jsxs("span",{className:"chat-mobile-session-option-title",children:[n.title||i("chat.untitledSession","Untitled"),n.pinnedAt?t.jsx(an,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":i("chat.pinned","Pinned")}):null]})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-pin","data-testid":`chat-mobile-session-pin-${n.id}`,"aria-label":n.pinnedAt?i("chat.unpinConversationAria","Unpin conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}):i("chat.pinConversationAria","Pin conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}),title:!n.pinnedAt&&K>=3?i("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:!n.pinnedAt&&K>=3,onClick:()=>qs(n.id,!n.pinnedAt),children:n.pinnedAt?t.jsx(ua,{size:14}):t.jsx(an,{size:14})}),t.jsx("button",{type:"button",className:"btn-icon chat-mobile-session-rename","data-testid":`chat-mobile-session-rename-${n.id}`,"aria-label":i("chat.renameConversationAria","Rename conversation {{title}}",{title:n.title||i("chat.untitledSession","Untitled")}),onClick:()=>Ws(n.id),children:t.jsx(ma,{size:14})})]},n.id))]},e.id)),t.jsxs("button",{type:"button",role:"menuitem",className:"chat-mobile-session-new","data-testid":"chat-mobile-session-new",onClick:()=>{Re(!1),Gt()},children:[t.jsx(dt,{size:16,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.newChat","New Chat")})]})]})]}):null,fi=t.jsxs("div",{className:"chat-sidebar-scope-toggle chat-view-header-scope-toggle",role:"tablist","data-testid":"chat-sidebar-scope-toggle",children:[t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${D==="direct"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":D==="direct","data-testid":"chat-sidebar-scope-direct",onClick:()=>We("direct"),children:[t.jsx(dn,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeDirect","Direct")})]}),t.jsxs("button",{type:"button",role:"tab",className:`chat-sidebar-scope-btn${D==="rooms"?" chat-sidebar-scope-btn--active":""}`,"aria-selected":D==="rooms","data-testid":"chat-sidebar-scope-rooms",onClick:()=>We("rooms"),children:[t.jsx(Ba,{size:14,"aria-hidden":"true"}),t.jsx("span",{children:i("chat.scopeRooms","Rooms")})]})]});return t.jsxs("div",{ref:Ds,className:`chat-view${d?" chat-view--floating":""}${O?" chat-view--narrow":""}${Zs?" chat-view--mobile-direct-thread":""}`,children:[t.jsx(Qi,{icon:dn,title:i("chat.title","Chat"),actions:t.jsxs(t.Fragment,{children:[Zs?t.jsxs(t.Fragment,{children:[t.jsx("button",{className:"btn-icon chat-back-btn",onClick:_n,"data-testid":"chat-back-btn","aria-label":i("chat.backToConversations","Back to conversations"),children:t.jsx(ha,{size:16})}),hi]}):fi,O?null:t.jsxs("button",{className:"btn btn-sm btn-primary chat-view-header-new-chat",onClick:Gt,"data-testid":"chat-new-btn",children:[t.jsx(dt,{size:14}),i("chat.newChat","New Chat")]}),!d&&l?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:l,"aria-label":i("chat.popOut","Pop out chat"),title:i("chat.popOut","Pop out chat"),"data-testid":"chat-pop-out",children:t.jsx(fa,{size:16})}):null,d&&u?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:u,"aria-label":i("chat.maximizeToChatView","Open in Chat view"),title:i("chat.maximizeToChatView","Open in Chat view"),"data-testid":"chat-modal-maximize",children:t.jsx(fa,{size:16})}):null,d&&y?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:y,"aria-label":i("chat.minimizeToQuickChat","Minimize to quick chat"),title:i("chat.minimizeToQuickChat","Minimize to quick chat"),"data-testid":"chat-modal-minimize",children:t.jsx(Yi,{size:16})}):null,d&&k?t.jsx("button",{type:"button",className:"btn-icon chat-view-header-icon",onClick:k,"aria-label":i("chat.closeChat","Close chat"),title:i("chat.closeChat","Close chat"),"data-testid":"chat-modal-close",children:t.jsx(Ji,{size:16})}):null]})}),t.jsxs("div",{className:"chat-view__body",children:[t.jsxs("div",{className:`chat-sidebar${ft?"":" chat-sidebar--hidden"}`,style:mi,children:[D==="direct"?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"chat-sidebar-search-container",children:t.jsxs("div",{className:"chat-sidebar-search-wrapper",children:[t.jsx(Zi,{size:14,className:"chat-sidebar-search-icon"}),t.jsx("input",{type:"text",className:"chat-sidebar-search",placeholder:i("chat.searchConversations","Search conversations..."),value:we,onChange:e=>se(e.target.value),"data-testid":"chat-search-input"})]})}),t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:z?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.loadingConversations","Loading...")}):ae.length===0?t.jsx("div",{className:"chat-empty-state chat-empty-state--padded",children:i("chat.noConversationsYet","No conversations yet")}):t.jsx(t.Fragment,{children:[{id:"pinned",label:i("chat.pinned","Pinned"),testId:"chat-pinned-divider",sessions:ra},{id:"recent",label:i("chat.recent","Recent"),testId:"chat-recent-divider",sessions:ca}].filter(e=>e.sessions.length>0).map(e=>t.jsxs("section",{className:"chat-session-section","data-testid":`chat-session-section-${e.id}`,children:[t.jsx("div",{className:"chat-pinned-divider","data-testid":e.testId,children:e.label}),e.sessions.map(n=>{const o=c?.id===n.id,m=!o&&fs("direct",n.id,n.lastMessageAt??n.updatedAt),S=Pa(n,pe.get(n.agentId)??null,It),B=da(S?.provider,S?.modelId)??"Fusion",ne=n.title||i("chat.untitledSession","Untitled");return t.jsxs("div",{className:`chat-session-item${o?" chat-session-item--active":""}`,onClick:()=>Gs(n.id),onContextMenu:Z=>{Z.preventDefault(),gs(n.id,Z.clientX,Z.clientY)},"data-testid":`chat-session-${n.id}`,children:[t.jsx("button",{type:"button",className:"btn-icon chat-session-menu-btn","data-testid":"chat-session-menu-btn","aria-label":i("chat.conversationActionsAria","Conversation actions for {{title}}",{title:ne}),"aria-haspopup":"menu","aria-expanded":te?.sessionId===n.id,onClick:Z=>{if(Z.stopPropagation(),te?.sessionId===n.id){Me(null);return}const ge=Z.currentTarget.getBoundingClientRect();gs(n.id,ge.right,ge.bottom,{anchorRight:!0})},children:t.jsx(eo,{size:14})}),t.jsxs("div",{className:"chat-session-title",children:[ne,n.pinnedAt?t.jsx(an,{className:"chat-session-pinned-indicator",size:14,"data-testid":`chat-session-pinned-indicator-${n.id}`,"aria-label":i("chat.pinned","Pinned")}):null,m?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${n.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),t.jsx("div",{className:"chat-session-preview",children:n.lastMessagePreview||i("chat.noMessages","No messages")}),n.matchedMessagePreview?t.jsx("div",{className:"chat-session-preview chat-session-preview--matched","data-testid":`chat-session-matched-preview-${n.id}`,children:i("chat.matchedInMessage",'Matched: "{{preview}}"',{preview:n.matchedMessagePreview})}):null,t.jsxs("div",{className:"chat-session-meta",children:[t.jsxs("span",{className:"chat-session-meta-model",children:[S?.provider?t.jsx(Yn,{provider:S.provider,size:"sm"}):null,t.jsx("span",{children:pe.get(n.agentId)?.name||(n.agentId===xe?B:n.agentId.slice(0,30))})]}),t.jsx("span",{children:n.updatedAt?Ao(n.updatedAt,i):""})]})]},n.id)})]},e.id))})})]}):t.jsxs("div",{className:"chat-sidebar-rooms","data-testid":"chat-sidebar-rooms",children:[!O&&t.jsx("div",{className:"chat-sidebar-rooms-header","data-testid":"chat-sidebar-rooms-header",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary","data-testid":"chat-create-room-btn",onClick:()=>Dt(!0),children:[t.jsx(dt,{size:14}),i("chat.createRoom","Create room")]})}),x.rooms.length===0?t.jsx("div",{className:"chat-sidebar-rooms-empty","data-testid":"chat-sidebar-rooms-empty",children:i("chat.noRoomsYet","No rooms yet.")}):t.jsx("div",{className:"chat-session-list chat-sidebar-list",children:x.rooms.map(e=>{const n=x.activeRoom?.id===e.id,o=!n&&fs("room",e.id,e.updatedAt);return t.jsxs("div",{role:"button",tabIndex:0,className:`chat-room-item${n?" chat-room-item--active":""}`,"data-testid":`chat-room-item-${e.slug}`,onClick:()=>{ue("room",e.id,e.updatedAt),x.selectRoom(e.id),O&&_e(!1)},onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),ue("room",e.id,e.updatedAt),x.selectRoom(e.id),O&&_e(!1))},children:[t.jsxs("span",{className:"chat-room-item-details",children:[t.jsxs("span",{className:"chat-room-item-name-row",children:[t.jsxs("span",{className:"chat-room-item-name",children:["#",e.name]}),o?t.jsx("span",{className:"chat-unread-dot","data-testid":`chat-unread-dot-${e.id}`,"aria-label":i("chat.unreadMessages","Unread messages")}):null]}),n?t.jsx("span",{className:"chat-room-item-meta",children:i("chat.roomMemberCount","{{count}} member",{count:x.activeRoomMembers.length,defaultValue_one:"{{count}} member",defaultValue_other:"{{count}} members"})}):null]}),t.jsx("button",{type:"button",className:"btn-icon chat-room-item-delete","data-testid":`chat-room-delete-${e.slug}`,"aria-label":i("chat.deleteRoom","Delete room {{name}}",{name:e.name}),onClick:m=>{m.stopPropagation(),Et(e.id)},children:t.jsx(ga,{size:14})})]},e.id)})})]}),D==="rooms"?O?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{type:"button",className:"btn btn-sm btn-primary chat-sidebar-footer-btn","data-testid":"chat-create-room-btn",onClick:()=>Dt(!0),children:[t.jsx(dt,{size:14}),i("chat.createRoom","Create room")]})}):null:O?t.jsx("div",{className:"chat-sidebar-footer",children:t.jsxs("button",{className:"btn btn-sm btn-primary chat-sidebar-footer-btn",onClick:Gt,"data-testid":"chat-new-btn",children:[t.jsx(dt,{size:14}),i("chat.newChat","New Chat")]})}):null]}),!O&&ft&&!wt&&t.jsx("div",{className:"chat-sidebar-resize-handle",role:"separator","aria-orientation":"vertical","aria-valuemin":cn,"aria-valuemax":ln,"aria-valuenow":Xe,"aria-label":i("chat.resizeSidebar","Resize chat sidebar"),tabIndex:0,onPointerDown:ti,onKeyDown:ni}),te&&t.jsxs("div",{className:"chat-session-context-menu",ref:fn,role:"menu",style:{top:te.y,left:te.x},onClick:e=>e.stopPropagation(),children:[t.jsxs("button",{onClick:()=>qs(te.sessionId,!Ct?.pinnedAt),"data-testid":"chat-context-pin",title:K>=3&&!Ct?.pinnedAt?i("chat.pinLimit","You can pin up to 3 conversations"):void 0,disabled:K>=3&&!Ct?.pinnedAt,children:[Ct?.pinnedAt?t.jsx(ua,{size:14}):t.jsx(an,{size:14}),Ct?.pinnedAt?i("chat.unpin","Unpin"):i("chat.pin","Pin")]}),t.jsxs("button",{onClick:()=>Ws(te.sessionId),"data-testid":"chat-context-rename",children:[t.jsx(ma,{size:14}),i("chat.rename","Rename")]}),t.jsxs("button",{onClick:()=>Za(te.sessionId),"data-testid":"chat-context-archive",children:[t.jsx(to,{size:14}),i("chat.archive","Archive")]}),t.jsxs("button",{onClick:()=>{Me(null),Tt(te.sessionId)},"data-testid":"chat-context-delete",children:[t.jsx(ga,{size:14}),i("chat.delete","Delete")]})]}),jt&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>At(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"chat-rename-dialog-title",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{id:"chat-rename-dialog-title",children:i("chat.renameConversationTitle","Rename Conversation")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.renameConversationBody","Choose a new name for this conversation. Leave it blank to show Untitled.")}),t.jsx("label",{className:"chat-rename-label",htmlFor:"chat-rename-input",children:i("chat.conversationName","Conversation name")}),t.jsx("input",{id:"chat-rename-input",className:"input chat-rename-input",type:"text",value:gn,placeholder:i("chat.renamePlaceholder","Untitled"),"data-testid":"chat-rename-input",onChange:e=>pn(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),Xs())},autoFocus:!0}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>At(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-primary",onClick:()=>void Xs(),"data-testid":"chat-rename-save",children:i("chat.save","Save")})]})]})}),ps&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Tt(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteConversationTitle","Delete Conversation?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteConversationBody","This action cannot be undone. All messages in this conversation will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Tt(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>void ei(ps),children:i("chat.delete","Delete")})]})]})}),vs&&t.jsx("div",{className:"chat-new-dialog-backdrop chat-view-dialog-backdrop",onClick:()=>Et(null),children:t.jsxs("div",{className:"chat-new-dialog chat-view-dialog",onClick:e=>e.stopPropagation(),children:[t.jsx("h3",{children:i("chat.deleteRoomTitle","Delete Room?")}),t.jsx("p",{className:"chat-view-delete-dialog-copy",children:i("chat.deleteRoomBody","This action cannot be undone. This room and all its messages will be permanently deleted.")}),t.jsxs("div",{className:"chat-new-dialog-actions",children:[t.jsx("button",{className:"btn btn-sm",onClick:()=>Et(null),children:i("chat.cancel","Cancel")}),t.jsx("button",{className:"btn btn-sm btn-danger",onClick:()=>{(async()=>{try{await x.deleteRoom(vs),Et(null)}catch{r(i("chat.failedToDeleteRoom","Failed to delete room"),"error")}})()},children:i("chat.delete","Delete")})]})]})}),D==="rooms"?t.jsxs("div",{ref:Mn,className:"chat-thread",children:[x.activeRoom?t.jsxs(t.Fragment,{children:[(!O||ea)&&t.jsxs("div",{className:"chat-room-thread-header",children:[ea&&t.jsx("button",{className:"btn-icon",onClick:Bn,"data-testid":"chat-back-btn",children:t.jsx(ha,{size:16})}),t.jsxs("div",{className:"chat-room-switcher-menu",ref:js,children:[t.jsxs("button",{type:"button",className:"chat-room-switcher-trigger","data-testid":"chat-room-switcher-trigger","aria-haspopup":"menu","aria-expanded":_t,onClick:()=>vt(e=>!e),children:[t.jsxs("span",{className:"chat-thread-header-title",children:["#",x.activeRoom.name]}),t.jsx(sn,{size:16,"aria-hidden":"true"})]}),_t&&t.jsx("div",{role:"menu",className:"chat-room-switcher-dropdown","data-testid":"chat-room-switcher-dropdown",children:x.rooms.map(e=>t.jsxs("button",{type:"button",role:"menuitem",className:`chat-room-switcher-option${e.id===x.activeRoom?.id?" chat-room-switcher-option--active":""}`,"data-testid":`chat-room-switcher-option-${e.id}`,onClick:()=>{ue("room",e.id,e.updatedAt),x.selectRoom(e.id),vt(!1)},children:["#",e.name]},e.id))})]}),t.jsx("div",{className:"chat-room-thread-members",children:x.activeRoomMembers.map(e=>t.jsx(hn,{agent:pe.get(e.agentId)??{id:e.agentId,name:e.agentId.slice(0,30)}},e.agentId))})]}),t.jsxs("div",{className:"chat-messages",ref:ce,onScroll:$s,children:[x.messagesLoading?t.jsx("div",{className:"chat-empty-state",children:i("chat.loadingMessages","Loading messages...")}):x.messages.filter(e=>e.content.trim()!==Ta).length===0?t.jsx("div",{className:"chat-empty-state",children:i("chat.noMessagesYet","No messages yet. Start the conversation!")}):x.messages.filter(e=>e.content.trim()!==Ta).map(e=>{const n=e.senderAgentId?pe.get(e.senderAgentId)?.name??e.senderAgentId.slice(0,30):i("chat.you","You"),o={id:e.id,sessionId:e.roomId,role:e.role,content:e.content,thinkingOutput:e.thinkingOutput??void 0,toolCalls:void 0,fallbackInfo:void 0,attachments:e.attachments,createdAt:e.createdAt};return t.jsx(Jn,{message:o,forcePlain:!1,agentName:n,hideAssistantIdentity:!1,showAssistantModelTag:!1,activeModelTag:null,activeModelProvider:null,activeSessionId:x.activeRoom?.id??null,mentionAgentsByName:Dn,roomContext:Te,onScrollToTop:qn,isTopClipped:Sn.has(e.id),isAwaitingQuestionAnswer:!1,onQuestionSubmit:Qt},e.id)}),t.jsx("div",{ref:Ss})]}),x.activeRoom&&ks&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>be("fab-click"),children:[t.jsx(sn,{size:14}),i("chat.latest","Latest")]})]}):t.jsx("div",{className:"chat-room-empty-pane","data-testid":"chat-rooms-empty-pane",children:i("chat.selectRoomOrCreate","Select a room or create one")}),x.activeRoom&&t.jsxs("div",{className:"chat-input-area",children:[t.jsx("input",{ref:Ut,type:"file",accept:"image/*,.txt,.json,.yaml,.yml,.log,.csv,.xml,.md",multiple:!0,style:{display:"none"},onChange:e=>{rt(e.target.files),e.target.value=""}}),fe.length>0&&t.jsx("div",{className:"chat-attachment-previews","data-testid":"chat-attachment-previews",children:fe.map((e,n)=>t.jsxs("div",{className:"chat-attachment-preview","data-testid":`chat-attachment-preview-${n}`,children:[e.previewUrl?t.jsx("img",{src:e.previewUrl,alt:e.file.name}):t.jsx("span",{className:"chat-attachment-preview-name",children:e.file.name}),t.jsx("button",{type:"button",className:"chat-attachment-remove",onClick:()=>_s(n),"data-testid":`chat-attachment-remove-${n}`,"aria-label":`Remove ${e.file.name}`,children:"×"})]},e.previewUrl||`${e.file.name}-${n}`))}),t.jsxs("div",{className:"chat-input-row",children:[t.jsx("button",{type:"button",className:"btn-icon chat-attach-btn","data-testid":"chat-attach-btn","aria-label":i("chat.attachFiles","Attach files"),onClick:()=>Ut.current?.click(),children:t.jsx(pa,{size:16})}),t.jsx(Ca,{level:x.activeRoom.thinkingLevel,defaultThinkingLevel:E,showTargetSection:!1,onChange:e=>{x.updateRoomSettings(x.activeRoom.id,{thinkingLevel:e||null}).catch(()=>{r(i("chat.failedToUpdateRoomThinkingLevel","Failed to update room thinking effort"),"error")})}}),t.jsxs("div",{className:`chat-input-wrapper${ys?" chat-input-wrapper--dragover":""}`,onDragOver:e=>{e.preventDefault(),et(!0)},onDragLeave:()=>et(!1),onDrop:e=>{e.preventDefault(),et(!1),rt(e.dataTransfer.files)},children:[t.jsx("textarea",{ref:zs,className:"chat-input-textarea",placeholder:i("chat.typeMessage","Type a message..."),value:J,onChange:Hs,onKeyDown:Os,onKeyUp:Us,onClick:Zt,onBlur:Ks,onFocus:Vs,onPaste:Bs,onTouchStart:e=>{typeof window>"u"||window.innerWidth>768||Zn()&&(document.activeElement,e.currentTarget)},rows:1,"data-testid":"chat-input"}),t.jsx(Sa,{agents:at,filter:Qe,highlightedIndex:Lt,visible:Se,onSelect:Yt,position:"below",roomMemberIds:Te?.memberIds,roomName:Te?.roomName})]}),t.jsx(va,{isStreaming:!1,canSend:!!(J.trim()||fe.length>0),onSend:Pn})]})]})]}):t.jsxs("div",{ref:Mn,className:"chat-thread",children:[!O&&(On||!O)&&t.jsx("div",{className:"chat-thread-header",children:t.jsxs("div",{className:"chat-thread-header-identity","data-testid":"chat-thread-header-identity",children:[Ke?t.jsx(Yn,{provider:Ke,size:"md"}):t.jsx(mn,{size:16}),t.jsx("span",{className:"chat-thread-header-title",children:Ys}),oi&&t.jsx("span",{className:"chat-model-tag",children:Pe}),ri&&nn&&Hn?t.jsxs("span",{className:"chat-thread-header-context","data-testid":"chat-thread-context-window",title:Hn,"aria-label":Hn,children:[Js," / ",nn]}):null]})}),Gn?t.jsx(go,{cliSessionId:ui,tier:di,projectId:a,renderTranscript:ia,renderComposer:()=>c?oa():null}):t.jsxs(t.Fragment,{children:[ia(),ks&&t.jsxs("button",{type:"button",className:"btn btn-sm chat-jump-to-latest","data-testid":"chat-jump-to-latest",onClick:()=>be("fab-click"),children:[t.jsx(sn,{size:14}),i("chat.latest","Latest")]}),c&&oa()]})]}),t.jsx(fo,{isOpen:Ua,onClose:()=>Dt(!1),projectId:a,existingRoomNames:x.rooms.map(e=>e.name),onCreate:async e=>{await x.createRoom({name:e.name,memberAgentIds:e.memberAgentIds}),D!=="rooms"&&We("rooms"),Dt(!1),O&&_e(!1)}})]}),he&&t.jsx(Po,{projectId:a,defaultModel:Wa,defaultKind:p?.kind,defaultAgentId:p?.kind==="agent"?p.agentId:void 0,defaultThinkingLevel:E,defaultSelectedThinkingLevel:p?.kind==="model"?p.thinkingLevel:void 0,onClose:()=>ke(!1),onCreate:ct})]})}export{Vo as ChatView,Ko as buildIssueChatPrefill,jo as clampChatInputHeight,Ro as resolveChatContextMenuPosition,No as resolveChatInputOverflowY,Pa as resolveSessionProvider};
@@ -1 +0,0 @@
1
- import{r as t,j as r}from"./vendor-react-SZ_qB27O.js";import{cU as Ge,cV as je,cW as Nr,cX as Ce,bb as Je,cY as Oe,cZ as ze,c_ as Fe,c$ as $e,d0 as Sr,d1 as be,d2 as kr,d3 as jr,d4 as Cr,d5 as Er,d6 as Lr,cK as se,d7 as xe,L as ve,aF as Rr,d8 as Dr,d9 as _r,da as Mr,C as Pr,aX as Qe,db as Tr,V as Ur,dc as Ar,c1 as Or,c3 as zr,dd as Fr,o as Be,X as $r,aO as Br,R as Hr}from"./index-Cg9ahVtV.js";import{u as ue}from"./vendor-i18n-GF3RlKbq.js";import{S as Ze}from"./shield-alert-CcQuaRHN.js";import"./vendor-codemirror-jBKmHyH0.js";import"./vendor-reactflow-9C3XTE7_.js";import"./vendor-xterm-BNq00GSj.js";const Ee=500,Vr=3e3;function W(e){return e instanceof Error?e.message:String(e)}function er(e){return e.length<=Ee?e:e.slice(-Ee)}function ye(e,i){return er([...e,i])}function Z(e){try{return JSON.parse(e)}catch{return null}}function oe(e){const i=e.text??"";return e.stream==="stderr"?`[stderr] ${i}`:i}function Wr(e){return e?.previewUrl??null}async function He(e){return kr(e)}async function Ve(e,i){return jr(e,i)}async function Ir(e){return Cr(e)}async function Xr(e){return Er(e)}async function We(e){return Lr(e)}function q(e){try{return e()}catch{return null}}function Ne(){return typeof q(()=>je)=="function"&&typeof q(()=>Ge)=="function"}function J(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 qr(e){const{t:i}=ue("app"),[f,s]=t.useState(null),[g,d]=t.useState([]),[x,m]=t.useState([]),[k,C]=t.useState([]),[z,E]=t.useState(!0),[j,p]=t.useState(null),o=t.useRef(0),[v,_]=t.useState(null),O=t.useCallback(a=>{if(s(a),a?.logHistory){const n=a.logHistory.slice(-Ee).map(oe);m(n)}},[]),L=t.useCallback(async()=>{const a=o.current;try{if(Ne())if(v){const n=await Ge(v,e);if(o.current!==a)return;O(n)}else{const n=await je(e);if(o.current!==a)return;d(n),n.length>0&&(_(n[0].config.id),O(n[0]))}else{const n=await He(e);if(o.current!==a)return;const h=J(n);d([h]),O(h)}p(null)}catch(n){if(o.current!==a)return;p(W(n))}},[O,e,v]);t.useEffect(()=>{o.current+=1;const a=o.current;s(null),d([]),m([]),C([]),E(!0),p(null),_(null),(async()=>{try{const[h,c]=await Promise.allSettled([Ne()?je(e):He(e).then(y=>[J(y)]),typeof q(()=>be)=="function"?be(e):We(e).then(y=>y.map(D=>({name:D.name,command:D.command,cwd:D.cwd,scriptName:D.scriptName,packagePath:D.packagePath})))]);if(o.current!==a)return;let w=null;if(h.status==="fulfilled"){const y=h.value;if(d(y),y.length>0){const D=y[0];Ne()&&_(D.config.id),O(D)}}else w=W(h.reason);c.status==="fulfilled"&&C(c.value),w&&p(w)}catch(h){if(o.current!==a)return;p(W(h))}finally{o.current===a&&E(!1)}})()},[O,e]),t.useEffect(()=>{const a=v?Nr(v,e):typeof q(()=>Ce)=="function"?Ce(e):null;if(!a)return;const n=o.current,h=Je(a,{events:{history:c=>{if(o.current!==n)return;const w=Z(c.data);if(w?.lines){const y=w.lines.map(oe);m(er(y))}},log:c=>{if(o.current!==n)return;const w=Z(c.data);if(w){const y=typeof w.line=="string"?w.line:oe(w);m(D=>ye(D,y))}},"dev-server:log":c=>{if(o.current!==n)return;const w=Z(c.data);if(w){const y=typeof w.line=="string"?w.line:oe(w);m(D=>ye(D,y))}},"dev-server:output":c=>{if(o.current!==n)return;const w=Z(c.data);w?.line&&m(y=>ye(y,w.line))},status:c=>{if(o.current!==n)return;const w=Z(c.data),y=w?.status;y&&s(D=>D&&{...D,status:y,runtime:w.pid?{...D.runtime??{startedAt:new Date().toISOString()},pid:w.pid}:D.runtime})},"dev-server:status":c=>{if(o.current!==n)return;const w=Z(c.data);if(w?.status){const y=J(w);s(y),d([y])}},stopped:()=>{o.current},failed:()=>{o.current}},onReconnect:()=>{o.current===n&&L()},onError:()=>{o.current===n&&p(c=>c??i("devserver.lostConnection","Lost log stream connection."))}});return()=>{h()}},[e,L,v]),t.useEffect(()=>{if(f?.status!=="running"&&f?.status!=="starting")return;const a=setInterval(()=>{L()},Vr);return()=>{clearInterval(a)}},[L,f?.status]);const T=t.useCallback(async(a,n)=>{o.current+=1;const h=o.current;try{let c;const w=typeof n=="string"&&n.length>0,y=f?.config?.cwd??".";if(!(w&&n!==y)&&v&&typeof q(()=>Oe)=="function")c=await Oe(v,e);else{const V=await Ve({command:a,cwd:n},e);c=J(V)}if(o.current!==h)return;s(c),p(null)}catch(c){if(o.current!==h)return;throw p(W(c)),c}},[e,f?.config?.cwd,v]),R=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(v&&typeof q(()=>ze)=="function")n=await ze(v,e);else{const h=await Ir(e);n=J(h)}if(o.current!==a)return;s(n),p(null)}catch(n){if(o.current!==a)return;throw p(W(n)),n}},[e,v]),$=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;if(v&&typeof q(()=>Fe)=="function")n=await Fe(v,e);else{const h=await Xr(e);n=J(h)}if(o.current!==a)return;s(n),p(null)}catch(n){if(o.current!==a)return;throw p(W(n)),n}},[e,v]),B=t.useCallback(async a=>{o.current+=1;const n=o.current;try{let h;if(v&&typeof q(()=>$e)=="function")h=await $e(v,a,e);else{const c=await Sr({url:a},e);h={url:c.manualUrl??c.previewUrl??c.detectedUrl??null,source:c.manualUrl?"manual":"auto"}}if(o.current!==n)return;s(c=>c?{...c,previewUrl:h.url??void 0}:null),p(null)}catch(h){if(o.current!==n)return;throw p(W(h)),h}},[e,v]),F=t.useCallback(async()=>{o.current+=1;const a=o.current;try{let n;try{n=await be(e)}catch{n=(await We(e)).map(c=>({name:c.name,command:c.command,cwd:c.cwd,scriptName:c.scriptName,packagePath:c.packagePath}))}if(o.current!==a)return;C(n),p(null)}catch(n){if(o.current!==a)return;throw p(W(n)),n}},[e]),M=t.useCallback(async(a,n)=>{if(typeof a!="string"&&!v)try{const w=a,y=await Ve({command:w.command,cwd:w.cwd,scriptName:w.scriptName,packagePath:w.packagePath??w.cwd},e),D=J(y);s(D),d([D]),p(null);return}catch(w){throw p(W(w)),w}const h=typeof a=="string"?a:a.command,c=typeof a=="string"?n:a.cwd;await T(h,c)},[e,T,v]),b=t.useCallback(async()=>{await R()},[R]),u=t.useCallback(async()=>{await $()},[$]),U=t.useCallback(async a=>{await B(a)},[B]),A=t.useCallback(async()=>{await F()},[F]),I=t.useCallback(async()=>{await L()},[L]),S=Wr(f),N=f?{...f,pid:f.runtime?.pid}:null;return{session:f,sessions:g,logs:x,detectedCommands:k,previewUrl:S,isLoading:z,error:j,startServer:T,stopServer:R,restartServer:$,setPreviewUrl:B,detectCommands:F,refresh:L,candidates:k,serverState:N,loading:z,start:M,stop:b,restart:u,setManualUrl:U,detect:A,refreshStatus:I}}const Ie=500,Xe=100;function rr(e){return e.length>Ie?e.slice(-Ie):e}function tr(e){return e==="stderr"?"stderr":"stdout"}function ce(e){try{return JSON.parse(e.data)}catch{return null}}function de(e,i){return{id:typeof e.id=="number"&&Number.isFinite(e.id)?e.id:i,text:typeof e.text=="string"?e.text:"",stream:tr(e.stream),timestamp:typeof e.timestamp=="string"?e.timestamp:""}}function Kr(e,i){return{id:i,text:e,stream:"stdout",timestamp:""}}function Se(e,i){if(i.length===0)return e;const f=[...e],s=new Set(e.map(g=>g.id));for(const g of i)s.has(g.id)||(s.add(g.id),f.push(g));return f.sort((g,d)=>g.id-d.id),rr(f)}function Yr(e,i){const[f,s]=t.useState([]),[g,d]=t.useState(!1),[x,m]=t.useState(!1),[k,C]=t.useState(!1),[z,E]=t.useState(null),j=t.useRef(null),p=t.useRef(!1),o=t.useRef(0),v=t.useRef(0),_=t.useRef(e),O=t.useRef(i),L=t.useRef(0),T=t.useRef(1);(_.current!==e||O.current!==i)&&(_.current=e,O.current=i,o.current++,se({view:"useDevServerLogs",trigger:"project-context-change",projectId:e,replayAttempted:!1,reason:"context-version-bumped"}),p.current=!0,L.current=0,T.current=1,s([]),d(!1),m(!1),C(!1),E(null),j.current&&(j.current(),j.current=null)),t.useEffect(()=>{if(!i){j.current&&(j.current(),j.current=null);return}const M=o.current,b=++v.current;p.current=!1,d(!0);const u=(S,N)=>{const a=rr(S);s(a),E(N),C(N!==null?N>a.length:!1);const n=a.length>0?a[a.length-1].id:0;L.current=n,T.current=n+1},U=S=>{if(p.current||o.current!==M||!S||typeof S!="object")return;const N=S.lines;if(!Array.isArray(N))return;if(N.length>0&&typeof N[0]=="string"){const n=N.filter(h=>typeof h=="string").map((h,c)=>Kr(h,c+1));u(n,n.length);return}const a=N.filter(n=>!!n&&typeof n=="object").map((n,h)=>de(n,h+1));u(a,a.length)},A=S=>{if(p.current||o.current!==M)return;const N=typeof S.text=="string"?S.text:typeof S.line=="string"?S.line:null;if(!N)return;const a=T.current,n=typeof S.id=="number"&&Number.isFinite(S.id)?S.id:a,h={id:n,text:N,stream:tr(S.stream),timestamp:typeof S.timestamp=="string"?S.timestamp:""};L.current=Math.max(L.current,n),T.current=Math.max(T.current,n+1),s(c=>Se(c,[h])),E(c=>c===null?c:Math.max(c+1,h.id))};async function I(){try{const N=await xe({maxLines:Xe},e);if(p.current||o.current!==M||v.current!==b)return;const a=N.lines.map((n,h)=>de(n,h+1));u(a,N.totalLines)}catch{if(p.current||o.current!==M||v.current!==b)return;u([],null)}finally{!p.current&&o.current===M&&v.current===b&&d(!1)}const S=Ce(e);j.current=Je(S,{events:{"dev-server:log":N=>{const a=ce(N);a&&A(a)},log:N=>{const a=ce(N);a&&A(a)},history:N=>{const a=ce(N);U(a)},"dev-server:history":N=>{const a=ce(N);U(a)}},onReconnect:()=>{se({view:"useDevServerLogs",trigger:"sse-reconnect",projectId:e,replayAttempted:!0,replayFromEventId:L.current??null,sseChannel:S,reason:"history-replay"}),!(p.current||o.current!==M)&&xe({lastEventId:L.current,maxLines:50},e).then(N=>{if(p.current||o.current!==M)return;const a=N.lines.map((n,h)=>de(n,T.current+h));if(a.length>0){const n=a[a.length-1].id;L.current=Math.max(L.current,n),T.current=Math.max(T.current,n+1)}s(n=>Se(n,a)),E(N.totalLines)}).catch(()=>{})}}),se({view:"useDevServerLogs",trigger:"sse-open",projectId:e,replayAttempted:!1,sseChannel:S})}return I(),()=>{p.current=!0,j.current&&(j.current(),j.current=null)}},[i,e]);const $=t.useCallback(async()=>{if(!i||x)return;const M=o.current,b=f.length;m(!0);try{const u=await xe({maxLines:Xe,offset:b},e);if(p.current||o.current!==M)return;const U=u.lines.map((A,I)=>de(A,I+1));s(A=>Se(U,A)),C(u.totalLines>b+U.length),E(u.totalLines)}catch{}finally{m(!1)}},[i,f.length,x,e]),B=t.useCallback(()=>{s([])},[]),F=j.current!==null&&!g&&!p.current;return{entries:f,loading:g,loadingMore:x,hasMore:k,total:z,loadMore:$,clear:B,logs:f,isStreaming:F,clearLogs:B}}const Gr="This preview appears to block iframe embedding. Open it in a new tab instead.",Jr="The preview URL could not be loaded. Verify the server is running and the URL is correct.",Qr="Preview is taking longer than expected and may block iframe embedding.";function Zr(e){return e==="blocked"?Gr:e==="error"?Jr:null}function et(e,i={}){const{loadTimeoutMs:f=1e4,detectionMethod:s=null}=i,g=t.useRef(null),d=t.useRef(null),[x,m]=t.useState("unknown"),[k,C]=t.useState(null),[z]=t.useState(s),E=t.useCallback(()=>{d.current!==null&&(window.clearTimeout(d.current),d.current=null)},[]),j=t.useCallback(R=>{m(R),C(Zr(R))},[]),p=t.useCallback(()=>{m("blocked"),C(Qr)},[]);t.useEffect(()=>{if(E(),!e){m("unknown"),C(null);return}m("unknown"),C(null);let R=!1;return queueMicrotask(()=>{R||(m("loading"),C(null))}),()=>{R=!0,E()}},[E,e]),t.useEffect(()=>{if(x!=="loading"){E();return}const R=setTimeout(()=>{d.current=null,p()},f);return d.current=R,()=>{clearTimeout(R),d.current===R&&(d.current=null)}},[E,x,f,p]);const o=t.useCallback(()=>{const R=g.current;if(!R){j("embedded");return}try{if(R.contentWindow?.location?.href==="about:blank"&&R.src!=="about:blank"){j("blocked");return}}catch{}j("embedded")},[j]),v=t.useCallback(()=>{j("error")},[j]);t.useEffect(()=>{if(E(),!e){m("unknown"),C(null);return}m("unknown"),C(null)},[E]);const _=t.useCallback(()=>{E(),m("unknown"),C(null)},[E]),O=_,L=t.useMemo(()=>x==="embedded",[x]),T=t.useMemo(()=>x==="blocked"||x==="error",[x]);return{embedStatus:x,isEmbedded:L,isBlocked:T,blockReason:k,detectionMethod:z,iframeRef:g,resetEmbedStatus:_,setEmbedStatus:j,retry:O,embedContext:k,handleIframeLoad:o,handleIframeError:v}}const rt=/\x1b\[[0-9;]*m/g,tt=50;function st(e){return e.scrollHeight-(e.scrollTop+e.clientHeight)<=tt}function Le(e){return e.replace(rt,"")}function nt(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 at(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function it(e){if(e.stream==="stderr")return"error";const i=Le(e.text).toLowerCase();return/\b(warn|warning)\b/.test(i)?"warn":/\b(error|fatal)\b/.test(i)?"error":"info"}function lt(e,i){if(!i)return e;const f=new RegExp(`(${at(i)})`,"ig"),s=e.split(f),g=i.toLowerCase();return r.jsx(r.Fragment,{children:s.map((d,x)=>d.toLowerCase()===g?r.jsx("mark",{children:d},`${d}-${x}`):r.jsx("span",{children:d},`${d}-${x}`))})}function ot({entries:e,loading:i,loadingMore:f,hasMore:s,total:g,onLoadMore:d,isRunning:x}){const{t:m}=ue("app"),k=t.useRef(null),C=t.useRef(e.length),z=t.useRef(x),[E,j]=t.useState(!1),[p,o]=t.useState(!1),v=t.useRef(!1),[_,O]=t.useState(""),[L,T]=t.useState("all"),R=t.useMemo(()=>L==="all"?e:e.filter(u=>it(u)===L),[e,L]),$=t.useMemo(()=>{const u=_.trim().toLowerCase();return u?R.filter(U=>Le(U.text).toLowerCase().includes(u)):R},[R,_]),B=$.length,F=t.useCallback(u=>{v.current=u,o(u)},[]),M=t.useCallback(()=>{const u=k.current;u&&(u.scrollTop=u.scrollHeight,F(!1))},[F]);t.useEffect(()=>{const u=z.current,U=C.current,A=e.length>U;x&&(!u||!p&&A)&&M(),z.current=x,C.current=e.length},[e.length,x,p,M]);const b=t.useCallback(()=>{const u=k.current;u&&F(!st(u))},[F]);return t.useEffect(()=>{i||e.length===0||!p&&x&&M()},[e,x,p,i,M]),t.useEffect(()=>{const u=k.current;if(!u||!x||typeof MutationObserver>"u")return;const U=new MutationObserver(()=>{v.current||M()});return U.observe(u,{childList:!0,characterData:!0,subtree:!0}),()=>U.disconnect()},[x,M]),i&&e.length===0?r.jsx("section",{className:"devserver-log-viewer","data-testid":"devserver-log-viewer",children:r.jsxs("div",{className:"devserver-log-viewer__loading","data-testid":"devserver-log-loading",children:[r.jsx(ve,{size:16,className:"devserver-log-viewer__spinner"}),r.jsx("span",{children:m("devserver.loadingLogs","Loading logs…")})]})}):r.jsxs("section",{className:`devserver-log-viewer${E?" devserver-log-viewer--fullscreen":""}`,"data-testid":"devserver-log-viewer",children:[r.jsxs("header",{className:"devserver-log-viewer__toolbar",children:[r.jsxs("div",{className:"devserver-log-viewer__toolbar-meta",children:[r.jsx("span",{className:"devserver-log-viewer__title",children:m("devserver.logs","Logs")}),r.jsxs("span",{className:"devserver-log-viewer__count","data-testid":"devserver-log-count",children:[g!==null?`${e.length}/${g}`:`${e.length}`," ",m("devserver.lines","lines")]})]}),r.jsxs("div",{className:"devserver-log-viewer__toolbar-actions",children:[r.jsxs("label",{className:"devserver-log-viewer__severity",htmlFor:"devserver-log-severity-filter",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.filterBySeverity","Filter logs by severity")}),r.jsxs("select",{id:"devserver-log-severity-filter",className:"select devserver-log-viewer__severity-select",value:L,onChange:u=>T(u.target.value),"data-testid":"devserver-log-severity-filter","aria-label":m("devserver.filterBySeverity","Filter logs by severity"),children:[r.jsx("option",{value:"all",children:m("devserver.allSeverities","All severities")}),r.jsx("option",{value:"info",children:m("devserver.info","Info")}),r.jsx("option",{value:"warn",children:m("devserver.warn","Warn")}),r.jsx("option",{value:"error",children:m("devserver.error","Error")})]})]}),r.jsxs("label",{className:"devserver-log-viewer__search",htmlFor:"devserver-log-search",children:[r.jsx("span",{className:"visually-hidden",children:m("devserver.searchLogs","Search logs")}),r.jsx(Rr,{size:14}),r.jsx("input",{id:"devserver-log-search",className:"input devserver-log-viewer__search-input",type:"text",value:_,onChange:u=>O(u.target.value),placeholder:m("devserver.searchLogs","Search logs"),"data-testid":"devserver-log-search-input","aria-label":m("devserver.searchLogs","Search logs")})]}),_.trim().length>0&&r.jsx("span",{className:"devserver-log-viewer__matches","data-testid":"devserver-log-match-count",children:m("devserver.matchCount",{count:B,defaultValue_one:"{{count}} match",defaultValue_other:"{{count}} matches"})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:()=>j(u=>!u),"data-testid":"devserver-log-fullscreen-toggle","aria-label":E?m("devserver.exitFullscreen","Exit fullscreen logs"):m("devserver.enterFullscreen","Enter fullscreen logs"),children:E?r.jsx(Dr,{size:14}):r.jsx(_r,{size:14})})]})]}),r.jsxs("div",{className:"devserver-log-viewer__body",children:[s&&r.jsx("div",{className:"devserver-log-viewer__load-more","data-testid":"devserver-log-load-more",children:r.jsx("button",{type:"button",className:"btn btn-sm touch-target",onClick:d,disabled:f,"data-testid":"devserver-log-load-more-button",children:f?r.jsxs(r.Fragment,{children:[r.jsx(ve,{size:14,className:"devserver-log-viewer__spinner"}),m("devserver.loadingOlderLogs","Loading older logs…")]}):m("devserver.loadOlderLogs","Load older logs")})}),r.jsxs("div",{ref:k,className:"devserver-log-viewer__content",onScroll:b,"data-testid":"devserver-log-content",children:[!i&&$.length===0&&r.jsx("p",{className:"devserver-log-viewer__empty","data-testid":"devserver-log-empty",children:e.length===0?m("devserver.noLogsYet","No logs yet. Start the dev server to see output."):R.length===0?m("devserver.noMatchesSeverity","No log lines match the selected severity."):m("devserver.noMatchesSearch","No log lines match your search.")}),$.map(u=>{const U=Le(u.text),A=nt(u.timestamp);return r.jsxs("div",{className:"devserver-log-line",children:[A&&r.jsx("span",{className:"devserver-log-timestamp","data-testid":"devserver-log-timestamp",children:A}),u.stream==="stderr"&&r.jsx("span",{className:"devserver-log-stream-badge","data-testid":"devserver-log-stderr-badge",children:m("devserver.errBadge","ERR")}),r.jsx("span",{className:"devserver-log-text",children:Mr(lt(U,_.trim()))})]},u.id)})]}),p&&x&&r.jsxs("button",{type:"button",className:"btn btn-sm devserver-log-viewer__new-logs-button",onClick:M,"data-testid":"devserver-log-jump-button",children:[r.jsx(Pr,{size:14}),m("devserver.newLogs","New logs")]})]})]})}const ct="devserver-preview-iframe";function dt({url:e,embedStatus:i,onEmbedStatusChange:f,iframeRef:s,blockReason:g,onRetry:d,className:x=ct,embedContext:m}){const{t:k}=ue("app"),C=g??m??null,[z,E]=t.useState(0);t.useEffect(()=>{!e||i!=="unknown"||(E(v=>v+1),f("loading"))},[i,f,e]);const j=t.useCallback(()=>{const v=s.current;if(!v){f("embedded");return}try{if(v.contentWindow?.location?.href==="about:blank"&&v.src!=="about:blank"){f("blocked");return}}catch{}f("embedded")},[s,f]),p=t.useCallback(v=>{v.stopPropagation(),f("error")},[f]),o=t.useCallback(()=>{e&&window.open(e,"_blank","noopener,noreferrer")},[e]);return e?r.jsxs("div",{className:"devserver-preview-iframe-shell",children:[r.jsx("iframe",{src:e,ref:s,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox",className:x,title:"Dev server preview",onLoad:j,onError:p,onErrorCapture:p,"data-testid":"devserver-preview-iframe"},`${e}-${z}`),i==="loading"&&r.jsxs("div",{className:"devserver-preview-overlay","data-testid":"devserver-preview-loading",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:k("preview.loading","Loading preview...")})]}),i==="blocked"&&r.jsxs("div",{className:"devserver-preview-blocked-panel",role:"alert","data-testid":"devserver-preview-blocked-panel",children:[r.jsx(Ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.blockedTitle","Preview cannot be embedded")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:o,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]}),i==="error"&&r.jsxs("div",{className:"devserver-preview-error-panel",role:"alert","data-testid":"devserver-preview-error-panel",children:[r.jsx(Qe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:k("preview.errorTitle","Unable to load preview")}),C&&r.jsx("p",{className:"devserver-preview-blocked-context",children:C})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:k("preview.blockedDescription","You can view the preview in a separate browser tab.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:o,children:k("preview.openInNewTab","Open in new tab")}),d&&r.jsx("button",{type:"button",className:"btn btn-sm",onClick:d,children:k("actions.retry","Retry")})]})]})]}):null}function vt(e){return{stopped:{className:"dev-server-status-badge--stopped",label:e("devserver.status.stopped","Stopped")},starting:{className:"dev-server-status-badge--starting",label:e("devserver.status.starting","Starting...")},running:{className:"dev-server-status-badge--running",label:e("devserver.status.running","Running")},stopping:{className:"dev-server-status-badge--starting",label:e("devserver.status.stopping","Stopping...")},failed:{className:"dev-server-status-badge--failed",label:e("devserver.status.failed","Failed")}}}const ut=480;function mt(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(max-width: 768px)").matches}function sr(e){if(e.closest(".right-dock-expand-modal__body"))return null;const i=e.parentElement;return i?.classList.contains("right-dock__body")?i:null}function pt(e){return e.clientWidth>0?e.clientWidth:e.getBoundingClientRect().width}function ft(e){if(!e||mt())return!1;const i=sr(e);return i?pt(i)<=ut:!1}function ht(e){const[i,f]=t.useState(!1);return t.useEffect(()=>{const s=e.current;if(!s){f(!1);return}const g=sr(s),d=()=>f(ft(s));if(d(),!g||typeof ResizeObserver>"u")return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d);const x=new ResizeObserver(d);return x.observe(g),window.addEventListener("resize",d),()=>{x.disconnect(),window.removeEventListener("resize",d)}},[e]),i}let ke=!1;function qe(e){return e instanceof Error?e.message:String(e)}function nr(e){return e==="."?"root":e}function Ke(e){return e?e==="root"?".":e:null}function Ye(e,i,f){return!i||e.scriptName!==i?!1:f?nr(e.cwd)===f:!0}function gt(e){return e.cwd==="."?"root":e.cwd}function wt(e){return e.length<=60?e:`${e.slice(0,60)}…`}function Ct({addToast:e,projectId:i,tasks:f}){const{t:s}=ue("app");t.useEffect(()=>(se({view:"DevServerView",trigger:ke?"route-active":"remount",projectId:i,replayAttempted:!1}),ke=!1,()=>{ke=!0,se({view:"DevServerView",trigger:"route-inactive",projectId:i,replayAttempted:!1})}),[i]);const{session:g,detectedCommands:d,previewUrl:x,isLoading:m,error:k,startServer:C,stopServer:z,restartServer:E,setPreviewUrl:j,detectCommands:p,refresh:o}=qr(i),v=g?.status??"stopped",_=v==="running"||v==="starting",O=vt(s),L=O[v]??O.stopped,{entries:T,loading:R,loadingMore:$,hasMore:B,total:F,loadMore:M}=Yr(i,!!i),b=x,u=g?.config?.cwd??null,U=t.useRef(null),A=ht(U),[I,S]=t.useState(!0),[N,a]=t.useState(""),[n,h]=t.useState(""),[c,w]=t.useState(null),[y,D]=t.useState(null),[V,Re]=t.useState(null),K=t.useMemo(()=>(f??[]).filter(l=>l.column==="in-progress"&&typeof l.worktree=="string"&&l.worktree.length>0),[f]),X=t.useMemo(()=>K.find(l=>l.id===y)??null,[K,y]);t.useEffect(()=>{y&&!K.some(l=>l.id===y)&&D(null)},[K,y]);const[ee,ar]=t.useState("embedded"),[re,me]=t.useState(!1),De=t.useRef(null),pe=t.useRef(null),ir=ee==="embedded"?b:null,{embedStatus:H,setEmbedStatus:lr,resetEmbedStatus:ne,iframeRef:Q,isEmbedded:or,isBlocked:fe,blockReason:he,retry:_e}=et(ir),[Me,Y]=t.useState(!1),Pe=t.useRef(H);t.useEffect(()=>{const l=Pe.current!==H;fe&&l&&Y(!0),H==="embedded"&&Y(!1),Pe.current=H},[H,fe]),t.useEffect(()=>{Y(!1)},[b]);const ae=t.useMemo(()=>{if(!c)return null;const l=Ke(u);return d.find(P=>!(P.scriptName!==c||l&&P.cwd!==l||g?.config?.command&&P.command!==g.config.command))??d.find(P=>Ye(P,c,u))??null},[d,g?.config?.command,c,u]);t.useEffect(()=>{typeof p=="function"&&p().catch(l=>{e(qe(l),"error")})},[e,p]),t.useEffect(()=>{if(c){S(!1);return}S(!0)},[c]),t.useEffect(()=>{if(g?.status==="running"||g?.status==="starting"){g.config?.command?.trim().length>0&&a(g.config.command);return}if(ae){a(ae.command);return}d.length>0&&a(l=>l.trim().length>0?l:d[0]?.command??"")},[d,ae,g?.config?.command,g?.status]),t.useEffect(()=>{h(b??"")},[b]);const ie=t.useCallback(()=>{me(!1),window.requestAnimationFrame(()=>De.current?.focus())},[]),cr=Tr(ie);t.useEffect(()=>{if(!re)return;pe.current?.focus();const l=P=>{if(P.key==="Escape"){ie();return}if(P.key!=="Tab")return;const te=Array.from(pe.current?.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')??[]).filter(Ae=>!Ae.hasAttribute("disabled")&&Ae.getAttribute("aria-hidden")!=="true"),G=te[0],we=te.at(-1);!G||!we||(P.shiftKey&&document.activeElement===G?(P.preventDefault(),we.focus()):!P.shiftKey&&document.activeElement===we&&(P.preventDefault(),G.focus()))};return document.addEventListener("keydown",l),()=>document.removeEventListener("keydown",l)},[ie,re]),t.useEffect(()=>{!A&&re&&me(!1)},[A,re]);const ge=t.useCallback(()=>{b&&window.open(b,"_blank","noopener,noreferrer")},[b]),Te=t.useCallback(()=>{Y(!1),_e()},[_e]),dr=t.useCallback(()=>{try{const l=Q.current;if(l?.contentWindow){l.contentWindow.location.reload(),Y(!1),ne();return}}catch{}if(!(!b||!Q.current))try{const l=new URL(b);l.searchParams.set("_t",Date.now().toString()),Q.current.src=l.toString(),Y(!1),ne()}catch{Q.current.src=b,Y(!1),ne()}},[b,Q,ne]),le=t.useCallback(async(l,P,te)=>{Re(l);try{await P(),e(te,"success")}catch(G){e(qe(G),"error")}finally{Re(null)}},[e]),vr=t.useCallback(l=>{w(l.scriptName),S(!1),a(l.command),e(s("devserver.toast.selectedScript","Selected {{name}} script.",{name:l.scriptName}),"success")},[e]),ur=t.useCallback(()=>{w(null),S(!0),e(s("devserver.toast.clearedScript","Cleared selected dev server script."),"success")},[e]),mr=t.useCallback(l=>{_&&l&&l!==y&&e(s("devserver.restartToApplyTask","Restart the dev server to apply the selected task's worktree."),"info"),D(l)},[e,_,y,s]),pr=()=>{const l=N.trim();if(l.length===0){e(s("devserver.toast.enterCommand","Enter a command before starting the dev server."),"warning");return}const P=Ke(u)??".",G=X?.worktree??null??ae?.cwd??P;le("start",()=>C(l,G),s("devserver.toast.started","Dev server started."))},fr=()=>{le("stop",z,s("devserver.toast.stopped","Dev server stopped."))},hr=()=>{le("restart",E,s("devserver.toast.restarted","Dev server restarted."))},gr=()=>{const l=n.trim(),P=l.length>0?l:null;le("preview",()=>j(P),P?s("devserver.toast.previewUpdated","Preview URL updated."):s("devserver.toast.previewCleared","Preview URL override cleared."))},wr=t.useCallback(()=>{k&&o()},[k,o]),br=v==="starting"||v==="running"||V!==null,xr=v==="stopped"||V!==null,yr=v==="stopped"||v==="starting"||V!==null,Ue=()=>r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"devserver-preview-header",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsxs("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:b??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:[s("devserver.auto","Auto"),b?` · ${b}`:s("devserver.notAvailable"," · Not available")]}),r.jsxs("div",{className:"devserver-preview-actions",children:[r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>ar(l=>l==="embedded"?"external":"embedded"),"data-testid":"devserver-preview-mode-toggle",children:ee==="embedded"?s("devserver.externalOnly","External only"):s("devserver.embedded","Embedded")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.openInNewTab","Open in new tab"),onClick:ge,disabled:!b,"data-testid":"devserver-preview-open-tab",children:r.jsx(Br,{})}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",title:s("devserver.refreshPreview","Refresh preview"),onClick:dr,disabled:!b,"data-testid":"devserver-preview-refresh",children:r.jsx(Hr,{})})]})]}),r.jsxs("div",{className:"devserver-preview-container","data-embed-status":H,"data-embedded":or?"true":"false",children:[!b&&!_&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.startDevServer","Start a dev server to see a live preview here.")}),!b&&_&&r.jsx("p",{className:"devserver-preview-empty",children:s("devserver.noPreviewDetected","No preview URL detected. Start the dev server or set a manual URL to preview your app.")}),b&&ee==="external"&&r.jsxs("div",{className:"devserver-preview-external-only","data-testid":"devserver-preview-external-only",children:[r.jsx("p",{children:s("devserver.embeddedPreviewDisabled","Embedded preview is disabled. Open your app in a separate browser tab.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm touch-target",onClick:ge,"data-testid":"devserver-preview-external-open-tab",children:s("devserver.openInNewTab","Open in new tab")})]}),b&&ee==="embedded"&&Me&&fe&&r.jsxs("div",{className:H==="error"?"devserver-preview-error-panel":"devserver-preview-blocked-panel","data-testid":"devserver-preview-fallback",role:"alert",children:[H==="error"?r.jsx(Qe,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}):r.jsx(Ze,{className:"devserver-preview-blocked-icon","aria-hidden":"true"}),r.jsxs("div",{children:[r.jsx("p",{className:"devserver-preview-blocked-title",children:H==="error"?s("devserver.previewFailed","Preview failed"):s("devserver.previewBlocked","Preview blocked")}),he&&r.jsx("p",{className:"devserver-preview-blocked-context",children:he})]}),r.jsx("p",{className:"devserver-preview-blocked-description",children:s("devserver.openPreviewOrRetry","Open the preview in a new tab, or retry embedded mode after checking your server settings.")}),r.jsxs("div",{className:"devserver-preview-blocked-actions",children:[r.jsx("button",{type:"button",className:"btn btn-primary",onClick:ge,"data-testid":"devserver-preview-fallback-open-tab",children:s("devserver.openPreviewInNewTab","Open preview in new tab")}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:Te,"data-testid":"devserver-preview-fallback-retry",children:s("devserver.retryEmbeddedPreview","Retry embedded preview")})]})]}),b&&ee==="embedded"&&!Me&&r.jsx(dt,{url:b,embedStatus:H,onEmbedStatusChange:lr,iframeRef:Q,blockReason:he,onRetry:Te})]})]});return r.jsxs("div",{ref:U,className:"dev-server-view","data-testid":"dev-server-view","data-narrow-right-dock-preview":A?"true":"false",children:[r.jsx(Ur,{icon:Ar,title:s("devserver.title","Dev Server"),actions:r.jsxs(r.Fragment,{children:[r.jsx("span",{className:"dev-server-header-title",children:r.jsx("span",{className:`dev-server-status-badge ${L.className}`,"data-testid":"dev-server-status-badge",children:L.label})}),r.jsxs("div",{className:"dev-server-header-actions",children:[r.jsxs("button",{type:"button",className:"btn btn-primary btn-sm",onClick:pr,disabled:br,"data-testid":"dev-server-start-button",children:[r.jsx(Or,{size:14}),r.jsx("span",{children:V==="start"?s("devserver.starting","Starting..."):s("devserver.start","Start")})]}),r.jsxs("button",{type:"button",className:"btn btn-danger btn-sm",onClick:fr,disabled:xr,"data-testid":"dev-server-stop-button",children:[r.jsx(zr,{size:14}),r.jsx("span",{children:V==="stop"?s("devserver.stopping","Stopping..."):s("devserver.stop","Stop")})]}),r.jsxs("button",{type:"button",className:"btn btn-sm",onClick:hr,disabled:yr,"data-testid":"dev-server-restart-button",children:[r.jsx(Fr,{size:14}),r.jsx("span",{children:V==="restart"?s("devserver.restarting","Restarting..."):s("devserver.restart","Restart")})]})]})]})}),r.jsxs("section",{className:"dev-server-panel dev-server-config","aria-label":s("devserver.configurationLabel","Dev server configuration"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.configuration","Configuration")}),m&&r.jsx("span",{className:"dev-server-muted",children:s("devserver.loading","Loading...")})]}),m&&!g&&d.length===0&&r.jsxs("div",{className:"dev-server-loading-state","data-testid":"dev-server-loading-state",children:[r.jsx(ve,{size:16,className:"dev-server-spin"}),r.jsx("span",{children:s("devserver.loadingConfig","Loading dev server configuration...")})]}),k&&r.jsxs("div",{className:"dev-server-error-box",role:"alert","data-testid":"dev-server-error-box",children:[r.jsx("p",{children:k}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:wr,children:s("devserver.retry","Retry")})]}),r.jsxs("div",{className:"dev-server-section",children:[r.jsx("h3",{children:s("devserver.scriptSelection","Script Selection")}),c&&r.jsxs("div",{className:"dev-server-selected","data-testid":"dev-server-selected-summary",children:[r.jsx("span",{className:"dev-server-candidate-name",children:c}),r.jsx("span",{className:"dev-server-candidate-source",children:u??"root"}),r.jsx("button",{type:"button",className:"btn btn-sm",onClick:()=>S(!0),"data-testid":"dev-server-change-selection",children:s("devserver.change","Change")}),r.jsx("button",{type:"button",className:"btn btn-danger btn-sm",onClick:ur,"data-testid":"dev-server-clear-selection",children:s("devserver.clear","Clear")})]}),I&&d.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-empty-candidates",children:s("devserver.noScriptsDetected","No dev server scripts detected. Check that your project has a package.json with a dev, start, or similar script.")}),I&&d.length>0&&r.jsx("div",{className:"dev-server-candidates","data-testid":"dev-server-candidates",children:d.map(l=>{const P=Ye(l,c,u);return r.jsxs("button",{type:"button",className:`dev-server-candidate ${P?"dev-server-candidate--selected":""}`,onClick:()=>vr(l),"data-testid":`dev-server-candidate-${l.scriptName}-${nr(l.cwd)}`,children:[r.jsx("span",{className:"dev-server-candidate-name",children:l.scriptName}),r.jsx("span",{className:"dev-server-candidate-command",children:wt(l.command)}),r.jsx("span",{className:"dev-server-candidate-source",children:gt(l)})]},`${l.cwd}::${l.scriptName}::${l.command}`)})})]}),r.jsxs("div",{className:"dev-server-section dev-server-executing-task-section",children:[r.jsx("h3",{children:s("devserver.executingTask","Executing Task")}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-task-picker",className:"dev-server-label",children:s("devserver.executingTask","Executing Task")}),r.jsxs("select",{id:"dev-server-task-picker",className:"input dev-server-task-picker",value:y??"",onChange:l=>mr(l.target.value.length>0?l.target.value:null),disabled:K.length===0,"aria-label":s("devserver.executingTask","Executing Task"),"data-testid":"dev-server-task-picker",children:[r.jsx("option",{value:"",children:s("devserver.projectRootNoTask","Project root (no task)")}),K.map(l=>r.jsx("option",{value:l.id,children:l.title?`${l.id} — ${l.title}`:l.id},l.id))]}),K.length===0&&r.jsx("p",{className:"dev-server-empty-state","data-testid":"dev-server-no-executing-tasks",children:s("devserver.noExecutingTasks","No executing tasks with a worktree available. Start a task to target its worktree.")}),X&&r.jsxs("div",{className:"dev-server-task-descriptor","data-testid":"dev-server-task-descriptor",children:[r.jsx("div",{className:"dev-server-task-descriptor-header",children:r.jsx("span",{className:"dev-server-candidate-name",children:X.title?`${X.id} — ${X.title}`:X.id})}),r.jsx("p",{className:"dev-server-task-description",children:X.description}),r.jsxs("div",{className:"dev-server-task-worktree",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.targetWorktree","Target worktree")}),r.jsx("code",{children:X.worktree})]})]})]})]}),r.jsxs("div",{className:"dev-server-field-group",children:[r.jsx("label",{htmlFor:"dev-server-command",className:"dev-server-label",children:s("devserver.command","Command")}),r.jsx("input",{id:"dev-server-command",className:"input",value:N,onChange:l=>a(l.target.value),placeholder:"pnpm dev","data-testid":"dev-server-command-input",readOnly:v==="running"||v==="starting"})]}),(v==="running"||v==="starting")&&g&&r.jsxs("div",{className:"dev-server-current-command","data-testid":"dev-server-current-command",children:[r.jsx("span",{className:"dev-server-label",children:s("devserver.runningCommand","Running command")}),r.jsx("code",{children:g.config?.command??N})]}),r.jsxs("div",{className:"dev-server-preview-override",children:[r.jsx("label",{htmlFor:"dev-server-preview-input",className:"dev-server-label",children:s("devserver.previewUrlOverride","Preview URL Override")}),r.jsx("input",{id:"dev-server-preview-input",className:"input",type:"url",value:n,onChange:l=>h(l.target.value),placeholder:"http://localhost:3000","data-testid":"dev-server-preview-input"}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",onClick:gr,disabled:V==="preview","data-testid":"dev-server-set-preview",children:s("devserver.save","Save")})]}),b&&r.jsx("p",{className:"dev-server-preview-hint",children:s("devserver.autoDetected","Auto-detected: {{url}}",{url:b})})]}),r.jsx("div",{className:"dev-server-content",children:r.jsxs("section",{className:"dev-server-panel dev-server-logs-panel","data-testid":"dev-server-logs-panel","aria-label":s("devserver.logsLabel","Dev server logs"),children:[r.jsxs("div",{className:"dev-server-section-header",children:[r.jsx("h3",{children:s("devserver.logs","Logs")}),r.jsx("span",{className:"dev-server-muted",children:s("devserver.lines","{{count}} lines",{count:F??T.length})})]}),r.jsx("div",{className:"dev-server-logs-viewer","data-testid":"dev-server-log-viewer",children:r.jsx(ot,{entries:T,loading:R,loadingMore:$,hasMore:B,total:F,onLoadMore:M,isRunning:_})})]})}),A?r.jsxs("section",{className:"dev-server-panel devserver-preview-modal-launcher","data-testid":"devserver-preview-modal-launcher","aria-label":s("devserver.previewLabel","Dev server preview"),children:[r.jsxs("div",{className:"devserver-preview-modal-launcher__copy",children:[r.jsxs("div",{className:"devserver-preview-title",children:[r.jsx(Be,{size:14}),r.jsx("span",{children:s("devserver.preview","Preview")})]}),r.jsx("span",{className:"devserver-preview-url-badge devserver-preview-url-badge--auto",title:b??s("devserver.noPreviewUrl","No preview URL"),"data-testid":"devserver-preview-url-badge",children:b||s("devserver.notAvailable","Not available")})]}),r.jsx("p",{className:"devserver-preview-modal-launcher__description",children:b?s("devserver.previewModalLauncherDescription","Open the live preview in a modal so logs and configuration stay usable in this narrow dock."):s("devserver.previewModalLauncherUnavailable","Start the dev server or set a preview URL to open the preview modal.")}),r.jsx("button",{type:"button",className:"btn btn-primary btn-sm",ref:De,onClick:()=>me(!0),"data-testid":"devserver-preview-modal-open",children:s("devserver.openPreview","Open preview")})]}):r.jsx("section",{className:"dev-server-panel devserver-preview-panel","data-testid":"devserver-preview-panel","aria-label":s("devserver.previewLabel","Dev server preview"),children:Ue()}),A&&re&&r.jsx("div",{className:"modal-overlay open devserver-preview-modal-overlay",...cr,children:r.jsxs("div",{className:"modal devserver-preview-modal",role:"dialog","aria-modal":"true","aria-labelledby":"devserver-preview-modal-title",tabIndex:-1,ref:pe,"data-testid":"devserver-preview-modal",children:[r.jsxs("div",{className:"devserver-preview-modal__titlebar",children:[r.jsx("h2",{id:"devserver-preview-modal-title",children:s("devserver.preview","Preview")}),r.jsx("button",{type:"button",className:"btn btn-sm btn-icon",onClick:ie,"aria-label":s("devserver.closePreviewModal","Close preview modal"),"data-testid":"devserver-preview-modal-close",children:r.jsx($r,{})})]}),r.jsx("div",{className:"devserver-preview-modal__body",children:Ue()})]})})]})}export{Ct as DevServerView};