tide-commander 1.210.1 → 1.211.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/assets/{AudioPlayer-leYagv1A.js → AudioPlayer-BkW6rbHa.js} +1 -1
  3. package/dist/assets/{BossLogsModal-C1EfTFIR.js → BossLogsModal-CWJfLRLA.js} +1 -1
  4. package/dist/assets/{BossSpawnModal-BZuspPgL.js → BossSpawnModal-DMxCXROC.js} +1 -1
  5. package/dist/assets/{ControlsModal-fHnL3tWx.js → ControlsModal-BaSSGPXP.js} +1 -1
  6. package/dist/assets/{DockerLogsModal-NnNI6K7M.js → DockerLogsModal-C_Nb5L_a.js} +1 -1
  7. package/dist/assets/{EmbeddedEditor-CKc2TTDt.js → EmbeddedEditor-CG0ULJUZ.js} +1 -1
  8. package/dist/assets/{FcStdViewer-5B0MyUUS.js → FcStdViewer-BgEgrxaw.js} +1 -1
  9. package/dist/assets/{GcodeViewer-tVOGEEgR.js → GcodeViewer-CTlX7eA7.js} +1 -1
  10. package/dist/assets/{GlbViewer-DQzFCVd8.js → GlbViewer-CKaX8cFI.js} +1 -1
  11. package/dist/assets/{GmailOAuthSetup-Dqcvkek0.js → GmailOAuthSetup-1AhXjBRc.js} +1 -1
  12. package/dist/assets/{GoogleOAuthSetup-CEXOpguK.js → GoogleOAuthSetup-DqPgZjOY.js} +1 -1
  13. package/dist/assets/{IframeModal-CrVGJmV2.js → IframeModal-ClN_kGcP.js} +1 -1
  14. package/dist/assets/{IntegrationsPanel-CIIgwU0p.js → IntegrationsPanel-ckrmRwYi.js} +2 -2
  15. package/dist/assets/{LogViewerModal-C3j2iA3B.js → LogViewerModal-D_eGItAQ.js} +1 -1
  16. package/dist/assets/{MonitoringModal-DM-MAQ_r.js → MonitoringModal-BrsQN8tD.js} +1 -1
  17. package/dist/assets/{PM2LogsModal-Cn_DQ0aO.js → PM2LogsModal-CKfdmFqw.js} +1 -1
  18. package/dist/assets/{PluginsPanel-BgcbEkcv.js → PluginsPanel-Bfqcnrsb.js} +1 -1
  19. package/dist/assets/{RestoreArchivedAreaModal-Bv8cLD0x.js → RestoreArchivedAreaModal-oZSTlXhf.js} +1 -1
  20. package/dist/assets/{Scene2DCanvas-COG_IMtp.js → Scene2DCanvas-B2oTAqlK.js} +1 -1
  21. package/dist/assets/{SceneManager-BEW1Q4V1.js → SceneManager-pnDsJdS-.js} +1 -1
  22. package/dist/assets/{SkillsPanel-BESK4qnF.js → SkillsPanel-AQimvs-1.js} +1 -1
  23. package/dist/assets/{SlackMultiInstanceSetup-BfM5lWrP.js → SlackMultiInstanceSetup-U4d0XsWJ.js} +1 -1
  24. package/dist/assets/{SpawnModal-U1YcK5PL.js → SpawnModal-DgKO0K6L.js} +1 -1
  25. package/dist/assets/{StatisticsModal-CSnNNR0j.js → StatisticsModal-DDC8OYen.js} +1 -1
  26. package/dist/assets/{StlViewer-DganXaUb.js → StlViewer-DJZ7Qgp0.js} +1 -1
  27. package/dist/assets/{SubordinateAssignmentModal-D32tbAVv.js → SubordinateAssignmentModal-DCM6PpB_.js} +1 -1
  28. package/dist/assets/{ThreeAreaSelector-CSr7-9G1.js → ThreeAreaSelector-CjEcL3Kh.js} +1 -1
  29. package/dist/assets/{ThreeViewShortcuts--6iUjk9U.js → ThreeViewShortcuts-UakjRD8w.js} +1 -1
  30. package/dist/assets/{TriggerManagerPanel-CMOUPTiv.js → TriggerManagerPanel-C42VLQu6.js} +1 -1
  31. package/dist/assets/{VideoPlayer-U9WMtkSI.js → VideoPlayer-UW43AiLH.js} +1 -1
  32. package/dist/assets/{WorkflowEditorPanel-BYTQskfR.js → WorkflowEditorPanel-DUvf5X0c.js} +1 -1
  33. package/dist/assets/{abnfDiagram-VRR7QNED-CDcoe2zl.js → abnfDiagram-VRR7QNED-KDmvD_Gi.js} +1 -1
  34. package/dist/assets/{arc-pKCFJJGX.js → arc-D8Dnwz7O.js} +1 -1
  35. package/dist/assets/{architectureDiagram-ZJ3FMSHR-BhIfrm-e.js → architectureDiagram-ZJ3FMSHR-DzHUfCXK.js} +1 -1
  36. package/dist/assets/{area-logos-B8nICxNk.js → area-logos-JqUib9Ux.js} +1 -1
  37. package/dist/assets/{blockDiagram-677ZJIJ3-B_ti1TGq.js → blockDiagram-677ZJIJ3-CwOc3I3e.js} +1 -1
  38. package/dist/assets/{c4Diagram-LMCZKHZV-Cbv9Qsf8.js → c4Diagram-LMCZKHZV-ByDTz6Pi.js} +1 -1
  39. package/dist/assets/channel-C9DXs2xS.js +1 -0
  40. package/dist/assets/{chunk-2Q5K7J3B-BRp2A6GR.js → chunk-2Q5K7J3B-CJ-5lUjr.js} +1 -1
  41. package/dist/assets/{chunk-32BRIVSS-BtN3Rgvc.js → chunk-32BRIVSS-ClxbX6JR.js} +1 -1
  42. package/dist/assets/{chunk-5VM5RSS4-DMJiVG7K.js → chunk-5VM5RSS4-D-B4g6BP.js} +1 -1
  43. package/dist/assets/{chunk-EX3LRPZG-BjKsIs3q.js → chunk-EX3LRPZG-DE_ym6tm.js} +1 -1
  44. package/dist/assets/{chunk-JWPE2WC7-y_NtQLuP.js → chunk-JWPE2WC7-DbFNU_Ef.js} +1 -1
  45. package/dist/assets/{chunk-MOJQB5TN-CDdrDUR_.js → chunk-MOJQB5TN-BonkkykU.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-B51amzX6.js → chunk-RYQCIY6F-CqaRznBG.js} +1 -1
  47. package/dist/assets/{chunk-V7JOEXUC-Z9feby_D.js → chunk-V7JOEXUC-DI5OpSJo.js} +1 -1
  48. package/dist/assets/{chunk-VR4S4FIN-DHUoBAGO.js → chunk-VR4S4FIN-DzHJs5bu.js} +1 -1
  49. package/dist/assets/{chunk-XXDRQBXY-BzaBz02w.js → chunk-XXDRQBXY-x9Zsg6mD.js} +1 -1
  50. package/dist/assets/classDiagram-OUVF2IWQ-apBPMHmB.js +1 -0
  51. package/dist/assets/classDiagram-v2-EOCWNBFH-apBPMHmB.js +1 -0
  52. package/dist/assets/{cose-bilkent-JH36ORCC-E32Fb-v1.js → cose-bilkent-JH36ORCC-B4Gh0RgK.js} +1 -1
  53. package/dist/assets/{cynefin-VYW2F7L2-CPlT32Qa.js → cynefin-VYW2F7L2-1rocbocI.js} +1 -1
  54. package/dist/assets/{cynefinDiagram-TSTJHNR4-BU9lEx_O.js → cynefinDiagram-TSTJHNR4-BCbOrdTH.js} +1 -1
  55. package/dist/assets/{dagre-VKFMJZFB-Dz2RF3CR.js → dagre-VKFMJZFB-CquTDGCQ.js} +1 -1
  56. package/dist/assets/{diagram-FQU43EPY-DfjRnakV.js → diagram-FQU43EPY-CtRps2DK.js} +1 -1
  57. package/dist/assets/{diagram-G47NLZAW-0qG_7dB2.js → diagram-G47NLZAW-C8uHzoun.js} +1 -1
  58. package/dist/assets/{diagram-NH7WQ7WH-Dg8aOZRL.js → diagram-NH7WQ7WH-BzGxTXmO.js} +1 -1
  59. package/dist/assets/{diagram-OA4YK3LP-Cp_rPdnf.js → diagram-OA4YK3LP-BoUlY6He.js} +1 -1
  60. package/dist/assets/{diagram-WEI45ONY-DpcAWWIQ.js → diagram-WEI45ONY-EewNkn4I.js} +1 -1
  61. package/dist/assets/{ebnfDiagram-CCIWWBDH-BrkjvnyK.js → ebnfDiagram-CCIWWBDH-DAp0_rYI.js} +1 -1
  62. package/dist/assets/{erDiagram-Q63AITRT-BcUZhCTj.js → erDiagram-Q63AITRT-CIDiaIv_.js} +1 -1
  63. package/dist/assets/{flowDiagram-23GEKE2U-BosZ8CSp.js → flowDiagram-23GEKE2U-ZQudeco2.js} +1 -1
  64. package/dist/assets/{ganttDiagram-NO4QXBWP-DLsjtf_Q.js → ganttDiagram-NO4QXBWP-DDa9u7Kj.js} +1 -1
  65. package/dist/assets/{gitGraphDiagram-IHSO6WYX-CAyR75nl.js → gitGraphDiagram-IHSO6WYX-D0LPqp_M.js} +1 -1
  66. package/dist/assets/{index-Ca5ZOizH.js → index-BMILmzZt.js} +3 -3
  67. package/dist/assets/{index-BaH49vGp.js → index-BuW-OFAQ.js} +1 -1
  68. package/dist/assets/{index-DcAeSRJC.js → index-CM0wRsAP.js} +1 -1
  69. package/dist/assets/{index-Cx1u1YG0.js → index-CbjaD3wY.js} +2 -2
  70. package/dist/assets/{index-gV8R47IC.js → index-CgtrBMsu.js} +1 -1
  71. package/dist/assets/index-CmZ79Am7.js +2 -0
  72. package/dist/assets/{index-CG3lpHEx.js → index-D0O_xUmt.js} +1 -1
  73. package/dist/assets/{index-BniCAe5S.js → index-DjZWtEFJ.js} +1 -1
  74. package/dist/assets/{index-Ppkjkw2t.js → index-tU947Zt1.js} +1 -1
  75. package/dist/assets/{infoDiagram-FWYZ7A6U-ByMuyx0o.js → infoDiagram-FWYZ7A6U-CD4Ws76i.js} +1 -1
  76. package/dist/assets/{ishikawaDiagram-FXEZZL3T-BQ3Gaoxc.js → ishikawaDiagram-FXEZZL3T-DSEmTd2f.js} +1 -1
  77. package/dist/assets/{journeyDiagram-5HDEW3XC-A6AKuh9D.js → journeyDiagram-5HDEW3XC-3_c5LjHs.js} +1 -1
  78. package/dist/assets/{kanban-definition-HUTT4EX6-Cwnrh-rI.js → kanban-definition-HUTT4EX6-24lijuGn.js} +1 -1
  79. package/dist/assets/{linear-BE-7neUx.js → linear-B_K6Qcv3.js} +1 -1
  80. package/dist/assets/{main-BmGgLw1j.css → main-6EJsyrfW.css} +1 -1
  81. package/dist/assets/main-D0r07JA_.js +344 -0
  82. package/dist/assets/{mermaid.core-7w_Z8H9Y.js → mermaid.core-B6sgvfs-.js} +4 -4
  83. package/dist/assets/{mindmap-definition-LN4V7U3C-Bw64fH-w.js → mindmap-definition-LN4V7U3C-BsAOrAHj.js} +1 -1
  84. package/dist/assets/{pegDiagram-2B236MQR-DBY3iavN.js → pegDiagram-2B236MQR-DdfupKz5.js} +1 -1
  85. package/dist/assets/{pieDiagram-ENE6RG2P-CRfDQPFH.js → pieDiagram-ENE6RG2P-D1YBZYdK.js} +1 -1
  86. package/dist/assets/{quadrantDiagram-ABIIQ3AL-BxX5Drn_.js → quadrantDiagram-ABIIQ3AL-Bw-hoDGQ.js} +1 -1
  87. package/dist/assets/{railroadDiagram-RFXS5EU6-tsjDIpJC.js → railroadDiagram-RFXS5EU6-CkmO-Wgv.js} +1 -1
  88. package/dist/assets/{requirementDiagram-TGXJPOKE-DFHKVByx.js → requirementDiagram-TGXJPOKE-CSI19yqY.js} +1 -1
  89. package/dist/assets/{sankeyDiagram-HTMAVEWB-D_wY52pX.js → sankeyDiagram-HTMAVEWB-BvLYUk8J.js} +1 -1
  90. package/dist/assets/{sequenceDiagram-DBY2YBRQ-C6laKdG-.js → sequenceDiagram-DBY2YBRQ-DSQLX4Eb.js} +1 -1
  91. package/dist/assets/{sizeCapture-X5ZJPWSS-Cke3-jui.js → sizeCapture-X5ZJPWSS-DfyzoJ-u.js} +1 -1
  92. package/dist/assets/{stateDiagram-2N3HPSRC-ynQl6xXR.js → stateDiagram-2N3HPSRC-G3bxzIPH.js} +1 -1
  93. package/dist/assets/stateDiagram-v2-6OUMAXLB-DCUADcVF.js +1 -0
  94. package/dist/assets/{swimlanes-5IMT3BWC-B24Y11Cw.js → swimlanes-5IMT3BWC-CDZGonhF.js} +2 -2
  95. package/dist/assets/swimlanesDiagram-G3AALYLV-Ddwy1JnL.js +8 -0
  96. package/dist/assets/{timeline-definition-FHXFAJF6-CzkdfR6y.js → timeline-definition-FHXFAJF6-C5QDZq49.js} +1 -1
  97. package/dist/assets/{vennDiagram-L72KCM5P-DMTHn9D0.js → vennDiagram-L72KCM5P-0a1v0gi5.js} +1 -1
  98. package/dist/assets/{wardleyDiagram-EHGQE667-CGt9XAmX.js → wardleyDiagram-EHGQE667-DArhtjvR.js} +1 -1
  99. package/dist/assets/{web-DtJoDWpx.js → web-BU7b4YVF.js} +1 -1
  100. package/dist/assets/{web-CcC0atJx.js → web-BgCc_AGi.js} +1 -1
  101. package/dist/assets/{web-2NPGfENr.js → web-BiQ9JdSl.js} +1 -1
  102. package/dist/assets/{xychartDiagram-FW5EYKEG-CHLpyyCQ.js → xychartDiagram-FW5EYKEG-BIZcXzGL.js} +1 -1
  103. package/dist/build-info.json +1 -1
  104. package/dist/index.html +2 -2
  105. package/dist/src/packages/server/data/builtin-skills/conversation-history.js +3 -2
  106. package/dist/src/packages/server/data/event-queries.js +16 -6
  107. package/dist/src/packages/server/data/migrations/009_whatsapp_participant_jid.sql +9 -0
  108. package/dist/src/packages/server/data/migrations/010_whatsapp_participant_alt_jid.sql +9 -0
  109. package/dist/src/packages/server/integrations/whatsapp/whatsapp-client.js +6 -2
  110. package/dist/src/packages/server/integrations/whatsapp/whatsapp-routes.js +103 -2
  111. package/dist/src/packages/server/integrations/whatsapp/whatsapp-skill.js +11 -0
  112. package/dist/src/packages/server/integrations/whatsapp/whatsapp-trigger-handler.js +48 -5
  113. package/dist/src/packages/server/routes/event-routes.js +2 -0
  114. package/dist/src/packages/server/routes/files.js +169 -0
  115. package/package.json +1 -1
  116. package/dist/assets/channel-BOdJfbuJ.js +0 -1
  117. package/dist/assets/classDiagram-OUVF2IWQ-B--UuAdF.js +0 -1
  118. package/dist/assets/classDiagram-v2-EOCWNBFH-B--UuAdF.js +0 -1
  119. package/dist/assets/index-BV_JJwGy.js +0 -2
  120. package/dist/assets/main-BTDfXjpr.js +0 -344
  121. package/dist/assets/stateDiagram-v2-6OUMAXLB-DkhE1Quf.js +0 -1
  122. package/dist/assets/swimlanesDiagram-G3AALYLV-sYQoreK1.js +0 -8
@@ -18,6 +18,8 @@ Send WhatsApp messages and inspect Baileys sessions through the local Tide Comma
18
18
  - At least one Baileys session is paired and \`CONNECTED\` (use the QR pairing flow from the Tide Commander UI).
19
19
  - A \`defaultSessionId\` is set in config, OR pass an explicit \`sessionId\` on every send.
20
20
 
21
+ **Mandatory mention rule:** if the user asks to tag or mention someone in a WhatsApp group, never send only visible \`@Name\` text. Resolve that participant's JID and include it in the \`mentions\` array of \`/send-message\`; otherwise WhatsApp will not create a real mention or notification. Prefer the exact \`whatsapp.from\` / \`participantJid\` from that person's inbound group message. If needed, resolve a saved name through \`GET /api/whatsapp/sessions/<sessionId>/contacts\` (rows expose \`id\`, optional \`lid\`, \`name\`, and \`pushname\`).
22
+
21
23
  ---
22
24
 
23
25
  ## Quick Recipes (most common cases)
@@ -81,6 +83,15 @@ Body fields:
81
83
  - **Full JID**, e.g. \`5215532967210@s.whatsapp.net\` for an individual or \`120363xxxxxxxxx@g.us\` for a group.
82
84
  - \`message\` (required) — UTF-8 text. Standard WhatsApp formatting works (\`*bold*\`, \`_italic_\`, \`~strike~\`, \`\\\`\\\`\\\`code\\\`\\\`\\\`\`).
83
85
  - \`sessionId\` (optional) — pick a specific paired session. If omitted, the configured \`defaultSessionId\` is used. If neither is present, the call fails with 400.
86
+ - \`mentions\` (optional) — array of participant JIDs that creates **real WhatsApp mentions**, especially in groups. Writing \`@Name\` in \`message\` without this array is only plain text and does not notify the person. Use the canonical participant JID observed in an inbound group event (\`whatsapp.from\` / \`participantJid\`), for example \`5215512345678@s.whatsapp.net\` or \`153996203434060@lid\`. Include a visible \`@...\` token in the message too.
87
+
88
+ Real group mention example:
89
+
90
+ \`\`\`bash
91
+ curl -s -X POST -H "X-Auth-Token: abcd" http://localhost:5174/api/whatsapp/send-message \\
92
+ -H "Content-Type: application/json" \\
93
+ -d '{"to":"120363xxxxxxxxx@g.us","message":"Hola @5215512345678, ¿nos ayudas?","mentions":["5215512345678@s.whatsapp.net"]}'
94
+ \`\`\`
84
95
 
85
96
  Response: \`{"success":true,"sessionId":"main","result":{"messageId":"3EB0...","success":true}}\`.
86
97
 
@@ -24,6 +24,16 @@ const log = createLogger('WhatsAppTrigger');
24
24
  // registers its callback here, so subscribers stay attached even when the bridge
25
25
  // restarts (e.g. on config change).
26
26
  const triggerSubscribers = new Set();
27
+ export function buildWhatsAppRawEvent(payload) {
28
+ return {
29
+ ...payload,
30
+ ...(payload.participantJid
31
+ ? { author: payload.participantJid, participant: payload.participantJid }
32
+ : {}),
33
+ ...(payload.participantAltJid ? { authorAlt: payload.participantAltJid } : {}),
34
+ ...(payload.mentionedIds ? { mentionedIds: payload.mentionedIds } : {}),
35
+ };
36
+ }
27
37
  function notifyTriggerSubscribers(payload) {
28
38
  for (const cb of triggerSubscribers) {
29
39
  try {
@@ -123,6 +133,10 @@ export function createWhatsAppTriggerHandler(ctx) {
123
133
  }
124
134
  function persist(payload) {
125
135
  try {
136
+ // Keep the bridge's original field names in raw_event for downstream
137
+ // consumers (including omni), while the normalized/DB field remains
138
+ // `participantJid`. Older readers already look for author/participant.
139
+ const rawEvent = buildWhatsAppRawEvent(payload);
126
140
  ctx.eventDb.logWhatsAppMessage({
127
141
  sessionId: payload.sessionId,
128
142
  messageId: payload.messageId,
@@ -131,6 +145,8 @@ export function createWhatsAppTriggerHandler(ctx) {
131
145
  groupName: payload.groupName,
132
146
  fromJid: payload.from,
133
147
  fromName: payload.fromName,
148
+ participantJid: payload.participantJid,
149
+ participantAltJid: payload.participantAltJid,
134
150
  direction: payload.direction,
135
151
  body: payload.body,
136
152
  messageType: payload.mediaType ?? 'text',
@@ -139,7 +155,7 @@ export function createWhatsAppTriggerHandler(ctx) {
139
155
  mediaFilename: payload.mediaFilename,
140
156
  mediaPath: payload.mediaPath,
141
157
  audioTranscription: payload.audioTranscription,
142
- rawEvent: payload,
158
+ rawEvent,
143
159
  timestamp: payload.timestamp,
144
160
  receivedAt: Date.now(),
145
161
  });
@@ -336,7 +352,7 @@ export function createWhatsAppTriggerHandler(ctx) {
336
352
  * Be defensive — Baileys versions and the upstream wrapper vary in field naming.
337
353
  * Returns `null` for payloads we cannot make sense of (caller drops them).
338
354
  */
339
- function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
355
+ export function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
340
356
  if (!data || typeof data !== 'object')
341
357
  return null;
342
358
  const d = data;
@@ -345,6 +361,7 @@ function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
345
361
  // - a wrapped envelope with normalized fields at top level (from/body/etc)
346
362
  // Try the wrapped form first, fall back to Baileys structure.
347
363
  const key = (d.key && typeof d.key === 'object' ? d.key : undefined);
364
+ const chat = (d.chat && typeof d.chat === 'object' ? d.chat : undefined);
348
365
  const message = (d.message && typeof d.message === 'object'
349
366
  ? d.message
350
367
  : undefined);
@@ -357,12 +374,26 @@ function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
357
374
  const remoteJid = pickString(d.remoteJid) ??
358
375
  pickString(d.chatId) ??
359
376
  (key ? pickString(key.remoteJid) : undefined) ??
377
+ (chat ? pickString(chat.id) : undefined) ??
360
378
  pickString(d.from);
361
- const participant = pickString(d.participant) ??
379
+ // whatsapp-api's webhookHandler sends the real group sender as `author`;
380
+ // raw Baileys payloads use `participant`/`key.participant`. Accept all forms.
381
+ const participant = pickString(d.author) ??
382
+ pickString(d.participant) ??
362
383
  (key ? pickString(key.participant) : undefined);
363
384
  if (!remoteJid && !participant)
364
385
  return null;
365
- const isGroup = (remoteJid?.endsWith('@g.us') ?? false) || pickBoolean(d.isGroup) === true;
386
+ const isGroup = (remoteJid?.endsWith('@g.us') ?? false)
387
+ || pickBoolean(d.isGroup) === true
388
+ || (chat ? pickBoolean(chat.isGroup) === true : false);
389
+ const participantJid = isGroup ? participant : undefined;
390
+ // In LID addressing mode Baileys exposes the opaque author in `participant`
391
+ // and its phone-based counterpart in `participantAlt`. The bridge flattens
392
+ // that second value as `authorAlt`.
393
+ const participantAltJid = isGroup
394
+ ? (pickString(d.authorAlt) ?? pickString(d.participantAlt))
395
+ : undefined;
396
+ const mentionedIds = pickStringArray(d.mentionedIds);
366
397
  // For groups, prefer the actual sender (participant). For DMs, the remote jid
367
398
  // IS the sender. If we're outbound, the "from" still refers to the chat for
368
399
  // UI consumers — keep it consistent.
@@ -400,7 +431,10 @@ function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
400
431
  const fromName = sanitizeFromName(rawName, from);
401
432
  // Group name — only meaningful when isGroup is true
402
433
  const groupName = isGroup
403
- ? (pickString(d.groupName) ?? pickString(d.subject) ?? pickString(d.chatName))
434
+ ? (pickString(d.groupName)
435
+ ?? pickString(d.subject)
436
+ ?? pickString(d.chatName)
437
+ ?? (chat ? pickString(chat.name) : undefined))
404
438
  : undefined;
405
439
  // Body / media extraction
406
440
  const { body, mediaType, mediaUrl: rawMediaUrl, mediaMimetype, mediaSize, mediaFilename } = extractContent(d, message);
@@ -420,6 +454,9 @@ function normalizeBaileysMessage(sessionId, eventName, data, ts, baseUrl) {
420
454
  sessionId,
421
455
  from,
422
456
  fromName,
457
+ participantJid,
458
+ participantAltJid,
459
+ mentionedIds,
423
460
  body: body ?? '',
424
461
  timestamp,
425
462
  isGroup,
@@ -636,6 +673,12 @@ function classifyFlatType(type) {
636
673
  function pickString(value) {
637
674
  return typeof value === 'string' && value.length > 0 ? value : undefined;
638
675
  }
676
+ function pickStringArray(value) {
677
+ if (!Array.isArray(value))
678
+ return undefined;
679
+ const strings = value.filter((entry) => typeof entry === 'string' && entry.length > 0);
680
+ return strings.length > 0 ? [...new Set(strings)] : undefined;
681
+ }
639
682
  function pickBoolean(value) {
640
683
  return typeof value === 'boolean' ? value : undefined;
641
684
  }
@@ -47,6 +47,8 @@ router.get('/whatsapp', (req, res) => {
47
47
  const result = queryWhatsAppMessages({
48
48
  sessionId: qs(req.query.sessionId),
49
49
  chatId: qs(req.query.chatId),
50
+ participantJid: qs(req.query.participantJid),
51
+ participantAltJid: qs(req.query.participantAltJid),
50
52
  direction: qs(req.query.direction),
51
53
  messageType: qs(req.query.messageType),
52
54
  workflowInstanceId: qs(req.query.workflowInstanceId),
@@ -684,6 +684,175 @@ router.get('/read', async (req, res) => {
684
684
  res.status(500).json({ error: err.message });
685
685
  }
686
686
  });
687
+ const HTML_PREVIEW_DOCUMENT_EXTENSIONS = new Set(['.html', '.htm']);
688
+ const HTML_PREVIEW_STYLESHEET_EXTENSIONS = new Set(['.css']);
689
+ const HTML_PREVIEW_SCRIPT_EXTENSIONS = new Set(['.js', '.mjs', '.cjs', '.jsx', '.ts', '.tsx']);
690
+ function isExternalPreviewReference(reference) {
691
+ const trimmed = reference.trim();
692
+ return !trimmed
693
+ || trimmed.startsWith('#')
694
+ || trimmed.startsWith('//')
695
+ || /^(?:[a-z][a-z\d+.-]*:)/i.test(trimmed);
696
+ }
697
+ function resolvePreviewReference(reference, sourcePath, previewRoot) {
698
+ if (isExternalPreviewReference(reference))
699
+ return null;
700
+ const withoutFragment = reference.split('#', 1)[0].split('?', 1)[0];
701
+ let decoded;
702
+ try {
703
+ decoded = decodeURIComponent(withoutFragment);
704
+ }
705
+ catch {
706
+ decoded = withoutFragment;
707
+ }
708
+ return decoded.startsWith('/')
709
+ ? path.resolve(previewRoot, `.${decoded}`)
710
+ : path.resolve(path.dirname(sourcePath), decoded);
711
+ }
712
+ function htmlPreviewUrl(targetPath, previewRoot, authToken, forceDocument = false) {
713
+ const extension = path.extname(targetPath).toLowerCase();
714
+ const endpoint = forceDocument || HTML_PREVIEW_DOCUMENT_EXTENSIONS.has(extension)
715
+ ? '/api/files/html-preview'
716
+ : '/api/files/html-preview-resource';
717
+ const params = new URLSearchParams({ path: targetPath, root: previewRoot });
718
+ if (authToken)
719
+ params.set('token', authToken);
720
+ return `${endpoint}?${params.toString()}`;
721
+ }
722
+ function rewritePreviewReference(reference, sourcePath, previewRoot, authToken) {
723
+ const resolved = resolvePreviewReference(reference, sourcePath, previewRoot);
724
+ return resolved ? htmlPreviewUrl(resolved, previewRoot, authToken) : reference;
725
+ }
726
+ /** Rewrite CSS dependencies so url(), fonts, images and nested @imports stay authenticated. */
727
+ export function rewriteHtmlPreviewCss(css, sourcePath, previewRoot, authToken = '') {
728
+ const rewrite = (reference) => rewritePreviewReference(reference, sourcePath, previewRoot, authToken);
729
+ return css
730
+ .replace(/url\(\s*(['"]?)([^)'"\s][^)'"\s]*|[^)'"\s])\1\s*\)/gi, (_match, quote, reference) => (`url(${quote}${rewrite(reference)}${quote})`))
731
+ .replace(/(@import\s+)(['"])([^'"]+)\2/gi, (_match, prefix, quote, reference) => (`${prefix}${quote}${rewrite(reference)}${quote}`));
732
+ }
733
+ /** Rewrite static/dynamic ES module specifiers in locally-served scripts. */
734
+ export function rewriteHtmlPreviewScript(script, sourcePath, previewRoot, authToken = '') {
735
+ return script.replace(/(\b(?:import|export)\s+(?:[^'";]*?\s+from\s*)?|\bimport\s*\(\s*)(['"])([^'"]+)\2/g, (match, prefix, quote, reference) => {
736
+ // Browser import maps/package loaders own bare specifiers such as
737
+ // "react"; only filesystem-style module paths belong to the preview.
738
+ if (!reference.startsWith('.') && !reference.startsWith('/'))
739
+ return match;
740
+ const resolved = resolvePreviewReference(reference, sourcePath, previewRoot);
741
+ if (!resolved)
742
+ return match;
743
+ return `${prefix}${quote}${htmlPreviewUrl(resolved, previewRoot, authToken)}${quote}`;
744
+ });
745
+ }
746
+ /** Build a sandbox-ready HTML document whose local assets use authenticated preview URLs. */
747
+ export function rewriteHtmlPreviewDocument(html, sourcePath, previewRoot, authToken = '') {
748
+ let output = html.replace(/\b(src|href|poster)\s*=\s*(['"])([^'"]+)\2/gi, (_match, attribute, quote, reference) => (`${attribute}=${quote}${rewritePreviewReference(reference, sourcePath, previewRoot, authToken)}${quote}`));
749
+ output = output.replace(/\bsrcset\s*=\s*(['"])([^'"]+)\1/gi, (_match, quote, value) => {
750
+ // A data URL legitimately contains commas; splitting it as a candidate
751
+ // list would corrupt the embedded image.
752
+ if (value.trim().startsWith('data:'))
753
+ return `srcset=${quote}${value}${quote}`;
754
+ const rewritten = value.split(',').map((candidate) => {
755
+ const trimmed = candidate.trim();
756
+ const separator = trimmed.search(/\s/);
757
+ const reference = separator < 0 ? trimmed : trimmed.slice(0, separator);
758
+ const descriptor = separator < 0 ? '' : trimmed.slice(separator);
759
+ return `${rewritePreviewReference(reference, sourcePath, previewRoot, authToken)}${descriptor}`;
760
+ }).join(', ');
761
+ return `srcset=${quote}${rewritten}${quote}`;
762
+ });
763
+ output = output.replace(/\bstyle\s*=\s*(['"])([\s\S]*?)\1/gi, (_match, quote, css) => (`style=${quote}${rewriteHtmlPreviewCss(css, sourcePath, previewRoot, authToken)}${quote}`));
764
+ output = output.replace(/<style(\s[^>]*)?>([\s\S]*?)<\/style>/gi, (_match, attributes = '', css) => (`<style${attributes}>${rewriteHtmlPreviewCss(css, sourcePath, previewRoot, authToken)}</style>`));
765
+ output = output.replace(/<script([^>]*\btype\s*=\s*['"]module['"][^>]*)>([\s\S]*?)<\/script>/gi, (_match, attributes, script) => (`<script${attributes}>${rewriteHtmlPreviewScript(script, sourcePath, previewRoot, authToken)}</script>`));
766
+ const bridge = `<script>(function(){window.addEventListener('keydown',function(event){if(event.key==='Escape'){parent.postMessage({type:'tide-html-preview-escape'},'*');}},true);})();</script>`;
767
+ return /<\/body\s*>/i.test(output)
768
+ ? output.replace(/<\/body\s*>/i, `${bridge}</body>`)
769
+ : `${output}${bridge}`;
770
+ }
771
+ function resolveHtmlPreviewRequest(req) {
772
+ const resolution = findFileWithFallbacks(req.query.path, req.query.root);
773
+ if (!resolution.ok)
774
+ return { ok: false, status: resolution.status, error: resolution.error };
775
+ const filePath = resolution.path;
776
+ const rootQuery = req.query.root;
777
+ const rootResolution = rootQuery
778
+ ? resolveAndValidateFilePath(rootQuery)
779
+ : { ok: true, path: path.dirname(filePath) };
780
+ const previewRoot = rootResolution.ok && fs.existsSync(rootResolution.path) && fs.statSync(rootResolution.path).isDirectory()
781
+ ? rootResolution.path
782
+ : path.dirname(filePath);
783
+ return {
784
+ ok: true,
785
+ filePath,
786
+ previewRoot,
787
+ token: typeof req.query.token === 'string' ? req.query.token : '',
788
+ };
789
+ }
790
+ // GET /api/files/html-preview - Render an HTML document with local dependencies rewritten.
791
+ router.get('/html-preview', (req, res) => {
792
+ try {
793
+ const preview = resolveHtmlPreviewRequest(req);
794
+ if (!preview.ok) {
795
+ res.status(preview.status).send(preview.error);
796
+ return;
797
+ }
798
+ const stats = fs.statSync(preview.filePath);
799
+ if (!stats.isFile() || !HTML_PREVIEW_DOCUMENT_EXTENSIONS.has(path.extname(preview.filePath).toLowerCase())) {
800
+ res.status(400).send('HTML preview requires an .html or .htm file');
801
+ return;
802
+ }
803
+ if (stats.size > 10 * 1024 * 1024) {
804
+ res.status(400).send('HTML file too large (max 10MB)');
805
+ return;
806
+ }
807
+ const document = rewriteHtmlPreviewDocument(fs.readFileSync(preview.filePath, 'utf-8'), preview.filePath, preview.previewRoot, preview.token);
808
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
809
+ res.setHeader('Cache-Control', 'no-store');
810
+ res.setHeader('Content-Security-Policy', "default-src * data: blob: 'unsafe-inline' 'unsafe-eval'; connect-src * data: blob:; frame-src * data: blob:;");
811
+ res.send(document);
812
+ }
813
+ catch (err) {
814
+ log.error(' Failed to render HTML preview:', err);
815
+ res.status(500).send(err.message || 'Failed to render HTML preview');
816
+ }
817
+ });
818
+ // GET /api/files/html-preview-resource - Serve/rewrite one dependency of the preview.
819
+ router.get('/html-preview-resource', (req, res) => {
820
+ try {
821
+ const preview = resolveHtmlPreviewRequest(req);
822
+ if (!preview.ok) {
823
+ res.status(preview.status).send(preview.error);
824
+ return;
825
+ }
826
+ const stats = fs.statSync(preview.filePath);
827
+ if (!stats.isFile()) {
828
+ res.status(400).send('Preview resource is not a file');
829
+ return;
830
+ }
831
+ const extension = path.extname(preview.filePath).toLowerCase();
832
+ if (HTML_PREVIEW_DOCUMENT_EXTENSIONS.has(extension)) {
833
+ res.redirect(302, htmlPreviewUrl(preview.filePath, preview.previewRoot, preview.token, true));
834
+ return;
835
+ }
836
+ if (HTML_PREVIEW_STYLESHEET_EXTENSIONS.has(extension)) {
837
+ res.type('text/css').setHeader('Cache-Control', 'no-store');
838
+ res.send(rewriteHtmlPreviewCss(fs.readFileSync(preview.filePath, 'utf-8'), preview.filePath, preview.previewRoot, preview.token));
839
+ return;
840
+ }
841
+ if (HTML_PREVIEW_SCRIPT_EXTENSIONS.has(extension)) {
842
+ res.type('application/javascript').setHeader('Cache-Control', 'no-store');
843
+ res.send(rewriteHtmlPreviewScript(fs.readFileSync(preview.filePath, 'utf-8'), preview.filePath, preview.previewRoot, preview.token));
844
+ return;
845
+ }
846
+ const params = new URLSearchParams({ path: preview.filePath });
847
+ if (preview.token)
848
+ params.set('token', preview.token);
849
+ res.redirect(302, `/api/files/binary?${params.toString()}`);
850
+ }
851
+ catch (err) {
852
+ log.error(' Failed to serve HTML preview resource:', err);
853
+ res.status(500).send(err.message || 'Failed to serve HTML preview resource');
854
+ }
855
+ });
687
856
  // GET /api/files/resolve - Find a file by name/partial path within a project directory
688
857
  router.get('/resolve', async (req, res) => {
689
858
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tide-commander",
3
- "version": "1.210.1",
3
+ "version": "1.211.0",
4
4
  "description": "Visual multi-agent orchestrator and manager for Claude Code with 3D/2D interface",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-7w_Z8H9Y.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-V7JOEXUC-Z9feby_D.js";import{_ as i}from"./mermaid.core-7w_Z8H9Y.js";import"./chunk-5VM5RSS4-DMJiVG7K.js";import"./chunk-XXDRQBXY-BzaBz02w.js";import"./chunk-VR4S4FIN-DHUoBAGO.js";import"./chunk-32BRIVSS-BtN3Rgvc.js";import"./main-BTDfXjpr.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-V7JOEXUC-Z9feby_D.js";import{_ as i}from"./mermaid.core-7w_Z8H9Y.js";import"./chunk-5VM5RSS4-DMJiVG7K.js";import"./chunk-XXDRQBXY-BzaBz02w.js";import"./chunk-VR4S4FIN-DHUoBAGO.js";import"./chunk-32BRIVSS-BtN3Rgvc.js";import"./main-BTDfXjpr.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
@@ -1,2 +0,0 @@
1
- import{r as s,aV as $a,aW as la,Q as ha,aX as ga,j as t,aY as xa,u as ba,aZ as Pa,a_ as La,aq as za,a$ as Ra,b0 as Da,aJ as _a,m as Vt,S as k,z as qt,b1 as ea,b2 as ra,b3 as Pt,b4 as oe,b5 as Oa,s as m,L as wa,a1 as va,f as ja,b6 as Ba,b7 as oa,b8 as ca,I as o,b9 as Fa,ba as ta,aM as Ca,bb as Wa,t as ka,ak as Na,bc as ya,bd as Ha,be as Ua,bf as Ga,ap as Xa,bg as Va,bh as qa,bi as Ya,aP as Ka,aQ as Za,aR as Ja,bj as Qa,bk as en,bl as aa,_ as tn,V as an,bm as nn,bn as sn,bo as ln,bp as rn,bq as on,br as cn,bs as dn,bt as un,bu as pn,bv as Yt,bw as da,bx as mn,by as fn,bz as hn,E as gn,bA as xn,bB as bn,bC as _n,bD as wn,bE as vn,bF as jn,bG as Cn,bH as Ve,bI as kn,bJ as Nn,bK as yn,bL as An,bM as Sn,bN as dt,bO as En,bP as In,bQ as Mn,bR as Tn,n as $n,D as Pn,p as Kt,C as Ln,bS as zn}from"./main-BTDfXjpr.js";import{g as Rn}from"./area-logos-B8nICxNk.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";function Dn(u){const l=s.useRef(u);l.current=u,s.useEffect(()=>{if(!$a())return;let g=null,w=!1;return la.addListener("backButton",()=>{l.current()==="exit"&&la.exitApp()}).then(A=>{w?A.remove():g=A}),()=>{w=!0,g&&(g.remove(),g=null)}},[])}async function On(u){const l=ha(),g=await fetch(`${ga()}/api/agents/${u}/terminal`,{method:"POST",headers:{Authorization:`Bearer ${l}`}});if(!g.ok){const w=await g.json().catch(()=>({}));throw new Error((w==null?void 0:w.error)||`Failed to start terminal (${g.status})`)}return g.json()}async function Bn(u){const l=ha();await fetch(`${ga()}/api/agents/${u}/terminal`,{method:"DELETE",headers:{Authorization:`Bearer ${l}`}})}const ut=new Map;function Fn({agentId:u}){const[l,g]=s.useState(null),[w,A]=s.useState(null);return s.useEffect(()=>{let L=!1;const M=ut.get(u);return M&&(clearTimeout(M),ut.delete(u)),g(null),A(null),On(u).then(S=>{L||g(S.url)}).catch(S=>{L||A(S instanceof Error?S.message:"Failed to start terminal")}),()=>{L=!0;const S=ut.get(u);S&&clearTimeout(S),ut.set(u,setTimeout(()=>{ut.delete(u),Bn(u)},2500))}},[u]),w?t.jsx("div",{className:"flat-classic-terminal flat-classic-terminal--message",children:t.jsx("span",{children:w})}):l?t.jsx("div",{className:"flat-classic-terminal",children:t.jsx(xa,{terminalUrl:l,visible:!0})}):t.jsx("div",{className:"flat-classic-terminal flat-classic-terminal--message",children:t.jsx("span",{children:"Attaching to interactive session…"})})}const Wn=s.memo(function({className:l=""}){const{t:g}=ba(["common"]),[w,A]=Pa(),L=s.useRef(null),[M,S]=s.useState(null);s.useLayoutEffect(()=>{const j=L.current;if(!j)return;const b=j.querySelector(".view-mode-toggle__btn--active");b&&S({left:b.offsetLeft,width:b.offsetWidth})},[w]);const xe=s.useCallback(j=>{if(j!==w){if(typeof window<"u"&&window.dispatchEvent(new CustomEvent("tide:viewmode-switch-pressed",{detail:{mode:j}})),j==="3d"){requestAnimationFrame(()=>A(j));return}A(j)}},[w,A]);return t.jsxs("div",{className:`view-mode-toggle ${l}`,ref:L,children:[M&&t.jsx("div",{className:"view-mode-toggle__indicator",style:{left:M.left,width:M.width}}),La.map(j=>t.jsxs("button",{className:`view-mode-toggle__btn ${w===j?"view-mode-toggle__btn--active":""}`,onClick:()=>xe(j),title:g(`common:viewMode.descriptions.${j}`),children:[t.jsxs("span",{className:"view-mode-toggle__icon",children:[j==="2d"&&t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),t.jsx("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),t.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"21"})]}),j==="3d"&&t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),t.jsx("path",{d:"M2 17l10 5 10-5"}),t.jsx("path",{d:"M2 12l10 5 10-5"})]}),j==="flat"&&t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t.jsx("rect",{x:"3",y:"3",width:"8",height:"8",rx:"1"}),t.jsx("rect",{x:"13",y:"3",width:"8",height:"8",rx:"1"}),t.jsx("rect",{x:"3",y:"13",width:"8",height:"8",rx:"1"}),t.jsx("rect",{x:"13",y:"13",width:"8",height:"8",rx:"1"})]}),j==="dashboard"&&t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t.jsx("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),t.jsx("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),t.jsx("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),t.jsx("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]})]}),t.jsx("span",{className:"view-mode-toggle__label",children:g(`common:viewMode.labels.${j}`)})]},j))]})}),Lt=3,zt=280,ua=320,Zt=240,pa=64,Hn=["simple","chat","advanced"],ma={simple:"Simple",chat:"Chat",advanced:"Advanced"},fa={simple:"○",chat:"◐",advanced:"◉"},Un={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},Jt="flat-clear-context",Aa="tide:flat-embedded-panels";function Sa(){try{const u=localStorage.getItem(Aa),l=u?JSON.parse(u):{};return l&&typeof l=="object"?l:{}}catch{return{}}}function Qt(u,l){try{const g=Sa();l?g[u]=l:delete g[u],localStorage.setItem(Aa,JSON.stringify(g))}catch{}}function Gn(u){const l=u.split("/").filter(Boolean);return l.length===0?u:l.slice(-2).join("/")}function Xn(u){if(u.provider==="codex"){const L=u.codexModel||"gpt-5.6-luna",M=$n[L];return{model:(M==null?void 0:M.label)||L}}if(u.provider==="opencode")return{model:u.opencodeModel||"opencode"};if(u.provider==="grok"){const L=u.grokModel||Pn,M=u.effort,S=M?Kt[M]:void 0;return{model:L,effort:S==null?void 0:S.label}}if(u.provider==="pi"){const L=u.piModel||"pi default",M=u.effort,S=M?Kt[M]:void 0;return{model:L,effort:S==null?void 0:S.label}}const l=u.model||u.detectedModel||"default",g=Ln[l],w=u.effort,A=w?Kt[w]:void 0;return{model:(g==null?void 0:g.label)||l,effort:A==null?void 0:A.label}}function Vn(u,l){if(l.type==="rectangle"&&l.width&&l.height){const g=l.width/2,w=l.height/2;return u.x>=l.center.x-g&&u.x<=l.center.x+g&&u.z>=l.center.z-w&&u.z<=l.center.z+w}if(l.type==="circle"&&l.radius){const g=u.x-l.center.x,w=u.z-l.center.z;return g*g+w*w<=l.radius*l.radius}return!1}const qn=an.memo(function({agentId:l,terminalViewMode:g,onTerminalViewModeChange:w,inspectorOpen:A,onToggleInspector:L,onShowTaskBoard:M,onImageClick:S,onFileClick:xe,onBashClick:j,onViewMarkdown:b,onRequestClearSubordinates:be,keyboard:pt,canNavigateBack:Oe,canNavigateForward:qe,onNavigateBack:_e,onNavigateForward:we,agentInfoOpen:Ye,onToggleAgentInfo:mt,onHeaderContextMenu:Ke,onBuildingContextMenu:ce}){var Et,It,Mt;const c=wa(l),$=ja(),de=nn(),ue=s.useRef(null),ie=s.useRef(null),H=(c==null?void 0:c.provider)??"claude",Me=H==="claude"||H==="codex"||H==="opencode"||H==="grok"||H==="pi",Be=H==="pi"?`${H}:${(c==null?void 0:c.piModelProvider)??""}:${(c==null?void 0:c.piModel)??""}`:H==="opencode"?`${H}:${(c==null?void 0:c.opencodeModel)??""}`:H,Te=sn(l,!!c&&Me,6e4,Be);ln(!0,l);const Ze=l,ft=c,ve=!!de.interactiveMode&&((c==null?void 0:c.provider)??"claude")==="claude"&&!!(c!=null&&c.sessionId),[K,pe]=s.useState(!1),[Z,J]=s.useState(null),je=s.useMemo(()=>{const e=Hn.map(a=>{const n=!K&&g===a;return{id:`view-mode-${a}`,label:ma[a],icon:t.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon",children:fa[a]}),shortcut:n?"✓":void 0,onClick:()=>{pe(!1),w(a),J(null)}}});return ve&&e.push({id:"view-mode-classic-tui",label:"Classic TUI",icon:t.jsx(o,{name:"terminal",size:13}),shortcut:K?"✓":void 0,onClick:()=>{pe(a=>!a),J(null)}}),e},[ve,K,g,w]),[ht,Je]=s.useState(!1),z=s.useCallback(()=>Je(!1),[]);_a("flat-chat-actions",ht,z),s.useEffect(()=>{const e=()=>Je(a=>!a);return window.addEventListener("tide:toggle-chat-actions",e),()=>window.removeEventListener("tide:toggle-chat-actions",e)},[]),s.useEffect(()=>{pe(!1),Je(!1)},[l]),s.useEffect(()=>{!ve&&K&&pe(!1)},[ve,K]),s.useEffect(()=>{const e=ie.current;if(!e)return;const a=i=>{i.button===3?(i.preventDefault(),i.stopPropagation(),_e()):i.button===4&&(i.preventDefault(),i.stopPropagation(),we())},n=i=>{(i.button===3||i.button===4)&&i.preventDefault()};return e.addEventListener("mouseup",a),e.addEventListener("mousedown",n),()=>{e.removeEventListener("mouseup",a),e.removeEventListener("mousedown",n)}},[_e,we]),s.useEffect(()=>{const e=ie.current;if(!e)return;let a=0,n=0,i=0;const d=250,h=600,x=80,T=1.5,E=C=>{let v=C instanceof HTMLElement?C:null;for(;v&&v!==e;){const p=window.getComputedStyle(v).overflowX;if((p==="auto"||p==="scroll")&&v.scrollWidth>v.clientWidth)return!0;v=v.parentElement}return!1},r=C=>{const v=Date.now();if(v<i){C.preventDefault();return}if(Math.abs(C.deltaX)<=Math.abs(C.deltaY)*T){a=0;return}if(E(C.target)){a=0;return}v-n>d&&(a=0),n=v,a+=C.deltaX,a<=-x?(a=0,i=v+h,C.preventDefault(),_e()):a>=x&&(a=0,i=v+h,C.preventDefault(),we())};return e.addEventListener("wheel",r,{passive:!1}),()=>e.removeEventListener("wheel",r)},[_e,we]);const le=va(),me=s.useMemo(()=>{if(!c)return null;const e=new Set,a=[];for(const n of le.values())n.archived||n.directories.length===0||n.assignedAgentIds.includes(l)&&(e.add(n.id),a.push(n));for(const n of le.values())n.archived||n.directories.length===0||e.has(n.id)||Vn({x:c.position.x,z:c.position.z},n)&&(e.add(n.id),a.push(n));return a.length===0?null:a.flatMap(n=>n.directories.filter(i=>i&&i.trim().length>0).map(i=>({areaId:n.id,areaName:n.name,dir:i})))},[c,l,le]),{branches:$e,fetchRemote:Q,fetchingDirs:Pe}=rn(me),[re,Ce]=s.useState({}),[Rt,gt]=s.useState(null),ke=s.useMemo(()=>{var d,h;const e=m.getAreaForAgent(l);if(!e)return[];const a=[],n=(d=e.directories.find(x=>x&&x.trim().length>0))==null?void 0:d.trim(),i=n?n.split("/").filter(Boolean).pop()||n:e.name;a.push({id:on(e.id),name:i,hasUrl:!!re[e.id],isDefault:!0});for(const x of $.values())x.type==="terminal"&&m.isPositionInArea(x.position,e)&&a.push({id:x.id,name:x.name,hasUrl:!!((h=x.terminalStatus)!=null&&h.url)});return a},[l,$,le,re]),fe=s.useMemo(()=>{var n;const e=m.getAreaForAgent(l);if(!e)return[];const a=[];for(const i of $.values())i.type==="server"&&((n=i.pm2)!=null&&n.enabled)&&m.isPositionInArea(i.position,e)&&a.push({id:i.id,name:i.name});return a},[l,$]),Fe=s.useMemo(()=>{const e=m.getAreaForAgent(l);if(!e)return[];const a=[];for(const n of $.values())n.type==="database"&&n.database&&m.isPositionInArea(n.position,e)&&a.push({id:n.id,name:n.name});return a},[l,$]),xt=cn(),ee=s.useMemo(()=>{const e=m.getAreaForAgent(l);if(!e)return[];const a=[];for(const n of $.values())if(n.type==="tests"&&m.isPositionInArea(n.position,e)){const i=!!n.folderPath&&xt.some(d=>dn(d,n.folderPath));a.push({id:n.id,name:n.name,working:i})}return a},[l,$,xt]),We=s.useMemo(()=>{const e=m.getAreaForAgent(l);if(!e)return[];const a=[];for(const n of $.values())n.type==="http"&&m.isPositionInArea(n.position,e)&&a.push({id:n.id,name:n.name});return a},[l,$]),Le=s.useMemo(()=>{var n;const e=m.getAreaForAgent(l);if(!e)return[];const a=[];for(const i of $.values())i.type==="slash-command"&&((n=i.slashCommand)!=null&&n.command)&&m.isPositionInArea(i.position,e)&&a.push({id:i.id,name:i.name,icon:i.icon,command:i.slashCommand.command});return a},[l,$]),[,Dt]=s.useReducer(e=>e+1,0),te=((Et=ue.current)==null?void 0:Et.search.searchMode)??!1,bt=s.useCallback(()=>{var e;(e=ue.current)==null||e.search.toggleSearch(),Dt()},[]),Qe=un(),Ne=Qe.isPending(Jt),[f,ye]=s.useState(null),R=f?$.get(f.buildingId):null,[_t,ae]=s.useState(""),[et,Ot]=s.useState(()=>pn()),y=s.useMemo(()=>{var e;return((e=m.getAreaForAgent(l))==null?void 0:e.id)??null},[l,$]),D=s.useCallback((e,a)=>{ae(""),ye(n=>{const i=(n==null?void 0:n.buildingId)===a?null:{type:e,buildingId:a};return y&&Qt(y,i),i})},[y]),U=s.useCallback(()=>{ae(""),ye(null),y&&Qt(y,null)},[y]);s.useEffect(()=>{if((f==null?void 0:f.type)!=="pm2-logs")return;const e=f.buildingId;return m.startLogStreaming(e,200),()=>m.stopLogStreaming(e)},[f]),s.useEffect(()=>{if(gt(null),(f==null?void 0:f.type)!=="terminal"||!Yt(f.buildingId))return;const e=da(f.buildingId);let a=!1;return mn(e).then(n=>{a||Ce(i=>i[e]===n.url?i:{...i,[e]:n.url})}).catch(n=>{a||gt(n instanceof Error?n.message:"Failed to start terminal")}),()=>{a=!0}},[f]);const{height:wt,onResizeStart:Bt}=fn(),{sidePanelWidth:Ft,handleSidePanelResizeStart:Wt}=hn(),[Ae,He]=s.useState(()=>ea(k.GIT_PANEL_OPEN,!1)),[X,Ue]=s.useState(()=>ea(k.BUILDINGS_PANEL_OPEN,!1)),[G,vt]=s.useState(!1),V=s.useCallback(()=>{vt(e=>!e)},[]),Se=s.useCallback(()=>vt(!1),[]),jt=s.useCallback(()=>{He(e=>{const a=!e;return oe(k.GIT_PANEL_OPEN,a),a})},[]),Ct=s.useCallback(()=>{Ue(e=>{const a=!e;return oe(k.BUILDINGS_PANEL_OPEN,a),a})},[]),tt=s.useCallback(()=>{He(!1),oe(k.GIT_PANEL_OPEN,!1)},[]),kt=s.useCallback(()=>{Ue(!1),oe(k.BUILDINGS_PANEL_OPEN,!1)},[]),Ht=gn(),Ee=s.useMemo(()=>({terminal:ke,"pm2-logs":fe,database:Fe,tests:ee,http:We}),[ke,fe,Fe,ee,We]);s.useEffect(()=>{if(!f)return;Ee[f.type].some(a=>a.id===f.buildingId)||(ae(""),ye(null))},[f,Ee]);const Nt=s.useRef(void 0);s.useEffect(()=>{var a;if(Nt.current===y)return;Nt.current=y;const e=y?Sa()[y]:void 0;ae(""),e&&((a=Ee[e.type])!=null&&a.some(n=>n.id===e.buildingId))?ye(e):ye(null)},[y,Ee]),s.useEffect(()=>{const e=a=>{var d;const n=a.detail;if(!(n!=null&&n.buildingId)||!(n!=null&&n.type)||!((d=Ee[n.type])!=null&&d.some(h=>h.id===n.buildingId)))return;n.handled=!0,ae("");const i={type:n.type,buildingId:n.buildingId};ye(i),y&&Qt(y,i)};return window.addEventListener("tide:dock-building-flat",e),()=>window.removeEventListener("tide:dock-building-flat",e)},[Ee,y]);const[B,ne]=s.useState(!1),Ge=s.useRef(null);if(s.useEffect(()=>{if(!B)return;const e=a=>{Ge.current&&!Ge.current.contains(a.target)&&ne(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[B]),!c)return t.jsx("div",{className:"flat-chat flat-chat--empty",children:t.jsxs("div",{className:"flat-chat__placeholder",children:[t.jsx("span",{className:"flat-chat__placeholder-icon",children:"💬"}),t.jsx("span",{className:"flat-chat__placeholder-text",children:"Select an agent to start chatting"})]})});const at=!!c.contextStats,{totalTokens:yt,contextWindow:ze,usedPercent:he}=Ca(c),nt=Math.round(he*10)/10,Xe=he>=80?"#ff4a4a":he>=60?"#ff9e4a":he>=40?"#ffd700":"#4aff9e",st=(yt/1e3).toFixed(1),it=(ze/1e3).toFixed(1),q=xn(ze),lt=bn(Te.snapshot),Ie=lt?Math.max(0,Math.min(100,lt.utilization)):null,rt=((It=Te.snapshot)==null?void 0:It.provider)==="opencode"&&Te.snapshot.plan==="free",At=rt?"#4aff9e":Ie===null?"var(--text-muted)":zn(Ie),ot=rt?"Free":Ie===null?Te.loading?"…":"—":`${Math.round(Ie)}%`,Y=c.cwd,St=Y?Gn(Y):null,P=((Mt=c.subordinateIds)==null?void 0:Mt.length)||0,Re=P>0;return t.jsxs("div",{ref:ie,className:`flat-terminal-wrapper ${Ae||X||G?"flat-terminal-wrapper--with-side-panel":""}`,style:{"--guake-side-panel-width":`min(${Ft}px, 70%)`},children:[t.jsxs("div",{className:"flat-terminal-wrapper__header",children:[t.jsxs("div",{className:`flat-terminal-wrapper__header-main ${Ye?"flat-terminal-wrapper__header-main--active":""}`,onClick:mt,onContextMenu:e=>{e.preventDefault(),e.stopPropagation(),Ke({x:e.clientX,y:e.clientY})},title:Ye?"Hide agent info":"Show agent info",children:[t.jsxs("span",{className:`flat-terminal-wrapper__header-avatar${c.status==="working"?" is-working":""}`,children:[t.jsx(ka,{agent:c,size:28}),c.status==="working"&&t.jsx(ta,{animated:!0,size:12,className:"flat-terminal-wrapper__header-activity"})]}),t.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[t.jsxs("span",{className:"flat-terminal-wrapper__header-identity",children:[t.jsx("span",{className:"flat-terminal-wrapper__header-name",children:c.name}),t.jsx(_n,{name:c.name,id:c.id})]}),t.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:ya(c.status)},title:c.status==="error"&&c.lastError?c.lastError:void 0,children:c.status})]}),c.taskLabel&&t.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:c.taskLabel,children:["📋 ",c.taskLabel]}),t.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[t.jsx(Na,{agent:c,alt:`${c.name} provider`,className:"flat-terminal-wrapper__header-provider-icon"}),(()=>{const{model:e,effort:a}=Xn(c);return t.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:a?`Model: ${e} · Effort: ${a}`:`Model: ${e}`,children:[t.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:e}),a&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"flat-terminal-wrapper__header-model-sep","aria-hidden":"true",children:"·"}),t.jsx("span",{className:"flat-terminal-wrapper__header-model-effort",children:a})]})]})})()]})]}),t.jsxs("div",{className:"flat-terminal-wrapper__header-meta",children:[t.jsx("div",{className:"flat-terminal-wrapper__view-mode",children:t.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn flat-terminal-wrapper__view-mode-trigger${Z?" flat-terminal-wrapper__view-mode-trigger--open":""}`,onClick:e=>{const a=e.currentTarget.getBoundingClientRect();J({x:a.left,y:a.bottom+4})},title:K?"Classic TUI — attach to the live interactive claude session in a terminal":Un[g],"aria-haspopup":"menu","aria-expanded":!!Z,"aria-label":"Message view mode",children:[t.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:K?t.jsx(o,{name:"terminal",size:13}):fa[g]}),t.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:K?"Classic TUI":ma[g]}),t.jsx(o,{name:"caret-down",size:9})]})}),t.jsxs("div",{className:"flat-terminal-wrapper__actions",role:"group","aria-label":"Terminal actions",children:[t.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:_e,disabled:!Oe,title:"Back to previous agent","aria-label":"Back to previous agent",children:t.jsx(o,{name:"arrow-left",size:14})}),t.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:we,disabled:!qe,title:"Forward to next agent","aria-label":"Forward to next agent",children:t.jsx(o,{name:"arrow-right",size:14})}),t.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${te?"flat-terminal-wrapper__action-btn--active":""}`,onClick:bt,title:te?"Close search":"Search messages","aria-pressed":te,children:t.jsx(o,{name:te?"cross":"search",size:14})}),t.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${Ne?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>Qe.handleClick(Jt,()=>{var e;m.clearContext(l),(e=ue.current)==null||e.historyLoader.clearHistory()}),title:Ne?"Click again to confirm clear context":"Clear context",children:t.jsx(o,{name:Ne?"question":"clear",size:14})}),t.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${Ae?"flat-terminal-wrapper__action-btn--active":""}`,onClick:jt,title:Ae?"Hide git panel":"Show git changes","aria-pressed":Ae,children:t.jsx(o,{name:"git-branch",size:14})}),t.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${X?"flat-terminal-wrapper__action-btn--active":""}`,onClick:Ct,title:X?"Hide buildings panel":"Show area buildings","aria-pressed":X,children:t.jsx(o,{name:"buildings",size:14})}),t.jsxs("div",{className:"flat-terminal-wrapper__more",ref:Ge,children:[t.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${B?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>ne(e=>!e),title:"More actions","aria-expanded":B,children:"⋮"}),B&&t.jsxs("div",{className:"flat-terminal-wrapper__more-menu",role:"menu",children:[t.jsxs("button",{type:"button",role:"menuitem",className:`flat-terminal-wrapper__more-item ${G?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{V(),ne(!1)},title:G?"Hide Debug Panel":"Show Debug Panel",children:[t.jsx(o,{name:"bug",size:14}),t.jsx("span",{children:G?"Hide Debug Panel":"Show Debug Panel"})]}),t.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),t.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item",onClick:()=>{m.collapseContext(l),ne(!1)},disabled:c.status!=="idle",title:c.status!=="idle"?"Agent must be idle to collapse context":"Collapse context",children:[t.jsx(o,{name:"package",size:14}),t.jsx("span",{children:"Collapse context"})]}),Re&&t.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{be(l,P),ne(!1)},children:[t.jsx(o,{name:"crown",size:14}),t.jsxs("span",{children:["Clear ",P," subordinate",P===1?"":"s"]})]}),t.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),t.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{m.killAgent(l),ne(!1)},children:[t.jsx(o,{name:"cross",size:14}),t.jsx("span",{children:"Remove agent"})]})]})]})]}),t.jsxs("button",{type:"button",className:`flat-terminal-wrapper__inspector-toggle ${A?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:L,title:A?"Hide inspector panel":"Show inspector panel","aria-label":A?"Hide inspector panel":"Show inspector panel","aria-pressed":A,children:[t.jsx("span",{className:"flat-terminal-wrapper__inspector-icon","aria-hidden":"true",children:t.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[t.jsx("rect",{x:"1.5",y:"2.5",width:"13",height:"11",rx:"1.5"}),t.jsx("line",{x1:"10",y1:"2.5",x2:"10",y2:"13.5"})]})}),t.jsx("span",{className:"flat-terminal-wrapper__inspector-label",children:"Inspector"})]}),t.jsx("button",{type:"button",className:"flat-terminal-wrapper__close",onClick:()=>m.deselectAll(),title:"Close chat","aria-label":"Close chat",children:t.jsx(o,{name:"cross",size:14})})]})]}),ht&&t.jsxs("div",{className:"flat-chat-actions-sheet-root",role:"presentation",children:[t.jsx("div",{className:"flat-chat-actions-sheet__backdrop",onClick:z}),t.jsxs("div",{className:"flat-chat-actions-sheet",role:"menu","aria-label":"Chat actions",children:[t.jsx("div",{className:"flat-chat-actions-sheet__grabber","aria-hidden":"true"}),t.jsxs("div",{className:"flat-chat-actions-sheet__title-row",children:[t.jsx("span",{className:"flat-chat-actions-sheet__title",children:c.name}),t.jsx("button",{type:"button",className:"flat-chat-actions-sheet__done",onClick:z,children:"Done"})]}),t.jsxs("div",{className:"flat-chat-actions-sheet__grid",children:[t.jsxs("button",{type:"button",role:"menuitem",className:`flat-chat-actions-sheet__item ${te?"is-active":""}`,onClick:()=>{bt(),z()},children:[t.jsx(o,{name:te?"cross":"search",size:20}),t.jsx("span",{children:te?"Close search":"Search"})]}),t.jsxs("button",{type:"button",role:"menuitem",className:`flat-chat-actions-sheet__item ${Ae?"is-active":""}`,onClick:()=>{jt(),z()},children:[t.jsx(o,{name:"git-branch",size:20}),t.jsx("span",{children:"Git changes"})]}),t.jsxs("button",{type:"button",role:"menuitem",className:`flat-chat-actions-sheet__item ${X?"is-active":""}`,onClick:()=>{Ct(),z()},children:[t.jsx(o,{name:"buildings",size:20}),t.jsx("span",{children:"Buildings"})]}),t.jsxs("button",{type:"button",role:"menuitem",className:`flat-chat-actions-sheet__item ${G?"is-active":""}`,onClick:()=>{V(),z()},children:[t.jsx(o,{name:"bug",size:20}),t.jsx("span",{children:"Debug"})]})]}),t.jsxs("div",{className:"flat-chat-actions-sheet__list",children:[t.jsxs("button",{type:"button",role:"menuitem",className:`flat-chat-actions-sheet__row flat-chat-actions-sheet__row--danger ${Ne?"is-armed":""}`,onClick:()=>Qe.handleClick(Jt,()=>{var e;m.clearContext(l),(e=ue.current)==null||e.historyLoader.clearHistory(),z()}),children:[t.jsx(o,{name:Ne?"question":"clear",size:18}),t.jsx("span",{children:Ne?"Tap again to confirm clear":"Clear context"})]}),t.jsxs("button",{type:"button",role:"menuitem",className:"flat-chat-actions-sheet__row",disabled:c.status!=="idle",onClick:()=>{m.collapseContext(l),z()},children:[t.jsx(o,{name:"package",size:18}),t.jsx("span",{children:"Collapse context"})]}),Re&&t.jsxs("button",{type:"button",role:"menuitem",className:"flat-chat-actions-sheet__row flat-chat-actions-sheet__row--danger",onClick:()=>{be(l,P),z()},children:[t.jsx(o,{name:"crown",size:18}),t.jsxs("span",{children:["Clear ",P," subordinate",P===1?"":"s"]})]}),t.jsxs("button",{type:"button",role:"menuitem",className:"flat-chat-actions-sheet__row flat-chat-actions-sheet__row--danger",onClick:()=>{m.killAgent(l),z()},children:[t.jsx(o,{name:"cross",size:18}),t.jsx("span",{children:"Remove agent"})]})]})]})]}),t.jsx(wn,{agent:c,onClick:M}),K&&ve?t.jsx(Fn,{agentId:l}):Ze&&ft?t.jsx(vn,{ref:ue,agentId:Ze,agent:ft,viewMode:g,isOpen:!0,onImageClick:S,onFileClick:xe,onBashClick:j,onViewMarkdown:b,keyboard:pt,hasModalOpen:!1},Ze):null,f&&(R||Yt(f.buildingId))&&(()=>{var T,E;const e=f.type,a=Yt(f.buildingId),n=(R==null?void 0:R.name)??`Terminal — ${((T=ke.find(r=>r.id===f.buildingId))==null?void 0:T.name)??"area"}`,i=a?re[da(f.buildingId)]:(E=R==null?void 0:R.terminalStatus)==null?void 0:E.url,d={terminal:"terminal","pm2-logs":"scroll",database:"hard-drives",tests:"flask",http:"globe"},h=e==="terminal"&&!i,x=!h&&!a;return t.jsxs(t.Fragment,{children:[t.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Bt,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded panel"}),t.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`${n} panel`,style:{height:wt},children:[t.jsxs("div",{className:"flat-bottom-panel__header",children:[t.jsxs("span",{className:"flat-bottom-panel__title",children:[t.jsx(o,{name:d[e],size:12}),t.jsx("span",{children:n}),h&&t.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),t.jsxs("span",{className:"flat-bottom-panel__header-actions",children:[e==="pm2-logs"&&R&&t.jsxs(t.Fragment,{children:[t.jsx("input",{type:"text",className:"guake-bottom-terminal-filter",value:_t,onChange:r=>ae(r.target.value),placeholder:"Filter logs","aria-label":`Filter logs for ${R.name}`,spellCheck:!1}),t.jsx("select",{className:"guake-bottom-terminal-retention",value:et===null?"unlimited":String(et),onChange:r=>{const C=r.target.value==="unlimited"?null:Number(r.target.value);Ot(C),Cn(C)},"aria-label":`Max log retention for ${R.name}`,children:jn.map(r=>t.jsx("option",{value:r===null?"unlimited":String(r),children:r===null?"Unlimited":`${r.toLocaleString()} lines`},r===null?"unlimited":r))}),t.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>m.clearStreamingLogs(f.buildingId),title:"Clear logs",children:t.jsx(o,{name:"trash",size:12})}),t.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>m.sendBuildingCommand(f.buildingId,"restart"),title:"Restart",children:t.jsx(o,{name:"restart",size:12})})]}),x&&t.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>{U(),Ve(f.buildingId)},title:"Maximize — open as modal","aria-label":"Open as modal",children:t.jsx(o,{name:"fullscreen",size:12})}),t.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:U,title:"Close panel","aria-label":"Close panel",children:t.jsx(o,{name:"cross",size:12})})]})]}),t.jsx("div",{className:"flat-bottom-panel__body",children:e==="terminal"?i?t.jsx(xa,{terminalUrl:i,visible:!0}):t.jsx("div",{className:"flat-bottom-panel__placeholder",children:Rt??"Starting terminal..."}):e==="pm2-logs"?t.jsx(kn,{buildingId:f.buildingId,filterText:_t,maxRetention:et}):R?e==="database"?t.jsx(Nn,{building:R}):e==="tests"?t.jsx("div",{className:"tests-panel-host",children:t.jsx(yn,{building:R,autoFocusSearch:!1})}):t.jsx("div",{className:"http-requests-panel-host",children:t.jsx(An,{building:R,autoFocusSearch:!1})}):null})]})]})})(),t.jsxs("div",{className:"flat-terminal-wrapper__statusbar",role:"contentinfo",children:[c.isDetached&&t.jsxs("span",{className:"flat-terminal-wrapper__detached",title:"Reattaching session...",children:[t.jsx(o,{name:"refresh",size:12}),t.jsx("span",{children:"Reattaching"})]}),Y&&St&&t.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${Y}`,"aria-label":`Open ${Y} in file explorer`,role:"button",tabIndex:0,onClick:()=>m.openFileExplorer(Y),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),m.openFileExplorer(Y))},children:[t.jsx("span",{className:"flat-terminal-wrapper__cwd-icon",children:t.jsx(o,{name:"folder",size:12})}),t.jsx("span",{className:"flat-terminal-wrapper__cwd-text",children:St})]}),me&&me.map(({areaId:e,areaName:a,dir:n})=>{const i=$e.get(n),d=Pe.has(n),h=n.split("/").filter(Boolean).pop()||n;return t.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${a}: ${n}${i?` (${i.branch}${i.ahead?` ↑${i.ahead}`:""}${i.behind?` ↓${i.behind}`:""})`:""}`,onClick:()=>m.openFileExplorerForAreaFolder(e,n),children:[t.jsx(o,{name:"folder-open",size:12}),t.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:h}),i&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:"flat-terminal-wrapper__area-dir-branch",children:[t.jsx(o,{name:"git-branch",size:10})," ",i.branch]}),i.ahead>0&&t.jsxs("span",{className:"flat-terminal-wrapper__branch-ahead",title:`${i.ahead} ahead`,children:[t.jsx(o,{name:"arrow-up",size:9}),i.ahead]}),i.behind>0&&t.jsxs("span",{className:"flat-terminal-wrapper__branch-behind",title:`${i.behind} behind`,children:[t.jsx(o,{name:"arrow-down",size:9}),i.behind]}),t.jsx("span",{className:`flat-terminal-wrapper__area-fetch ${d?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:x=>{x.stopPropagation(),Q(n)},children:t.jsx(o,{name:d?"hourglass":"download",size:12})})]})]},`${e}:${n}`)}),t.jsx(Sn,{agentId:l,usageScope:Be,disabled:!Me,contextSummary:at?`Context: ${st}k / ${it}k tokens (${nt}% used)`:void 0,children:t.jsxs("span",{className:"flat-terminal-wrapper__context",tabIndex:0,role:"button",onClick:()=>m.setContextModalAgentId(l),onKeyDown:e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),m.setContextModalAgentId(l))},title:Me?void 0:at?`Context usage: ${st}k / ${it}k tokens (${nt}% used). Click to view stats.`:"Click to fetch context stats",children:[t.jsxs("span",{className:"flat-terminal-wrapper__usage-bars",children:[t.jsxs("span",{className:"flat-terminal-wrapper__usage-gauge",title:`Session context: ${st}k / ${it}k tokens (${nt}% used)`,children:[t.jsxs("span",{className:"flat-terminal-wrapper__usage-label",children:["Ctx ",t.jsx("span",{className:"flat-terminal-wrapper__usage-window",children:q})]}),t.jsx("span",{className:"flat-terminal-wrapper__context-bar",children:t.jsx("span",{className:"flat-terminal-wrapper__context-bar-fill",style:{width:`${he}%`,backgroundColor:Xe}})}),t.jsxs("span",{className:"flat-terminal-wrapper__usage-value",style:{color:Xe},children:[Math.round(he),"%"]})]}),t.jsxs("span",{className:"flat-terminal-wrapper__usage-gauge",title:lt?`Weekly usage: ${Math.round(Ie)}% used`:rt?"OpenCode free-model capacity is dynamic; no weekly quota is published":Te.error||"Weekly usage is unavailable for this provider/account",children:[t.jsx("span",{className:"flat-terminal-wrapper__usage-label",children:"Week"}),t.jsx("span",{className:"flat-terminal-wrapper__context-bar",children:t.jsx("span",{className:"flat-terminal-wrapper__context-bar-fill",style:{width:`${Ie??0}%`,backgroundColor:At}})}),t.jsx("span",{className:"flat-terminal-wrapper__usage-value",style:{color:At},children:ot})]})]}),!at&&t.jsx("span",{className:"flat-terminal-wrapper__context-warning",title:"No context stats yet",children:t.jsx(o,{name:"warn",size:12})})]})}),t.jsx("div",{className:"flat-terminal-wrapper__statusbar-spacer","aria-hidden":"true"}),ke.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:ke.map(e=>{const a=(f==null?void 0:f.buildingId)===e.id;return e.isDefault?t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn flat-terminal-wrapper__building-btn--default ${a?"flat-terminal-wrapper__building-btn--active":""}`,title:`${a?"Hide":"Show"} area terminal: ${e.name}`,onClick:()=>{a?U():D("terminal",e.id)},children:t.jsx(o,{name:"terminal",size:14})},e.id):t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${a?"flat-terminal-wrapper__building-btn--active":""} ${e.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${a?"Hide":"Show"} terminal: ${e.name}${e.hasUrl?"":" (starting...)"}`,onClick:()=>{if(a){U();return}if(e.hasUrl&&dt(e.id)==="modal"){Ve(e.id);return}e.hasUrl||m.sendBuildingCommand(e.id,"start"),D("terminal",e.id)},onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ce(e.id,{x:n.clientX,y:n.clientY})},children:t.jsx(o,{name:"terminal",size:14})},e.id)})}),fe.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:fe.map(e=>{const a=(f==null?void 0:f.buildingId)===e.id;return t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${a?"flat-terminal-wrapper__building-btn--active":""}`,title:`${a?"Hide":"Show"} logs: ${e.name}`,onClick:()=>{a?U():dt(e.id)==="modal"?Ve(e.id):D("pm2-logs",e.id)},onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ce(e.id,{x:n.clientX,y:n.clientY})},children:t.jsx(o,{name:"scroll",size:14})},e.id)})}),Fe.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:Fe.map(e=>{const a=(f==null?void 0:f.buildingId)===e.id;return t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${a?"flat-terminal-wrapper__building-btn--active":""}`,title:`${a?"Hide":"Show"} database: ${e.name}`,onClick:()=>{a?U():dt(e.id)==="modal"?Ve(e.id):D("database",e.id)},onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ce(e.id,{x:n.clientX,y:n.clientY})},children:t.jsx(o,{name:"hard-drives",size:14})},e.id)})}),ee.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area tests",children:ee.map(e=>{const a=(f==null?void 0:f.buildingId)===e.id;return t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${a?"flat-terminal-wrapper__building-btn--active":""} ${e.working?"flat-terminal-wrapper__building-btn--tests-working":""}`,title:e.working?`Running tests: ${e.name}`:`${a?"Hide":"Show"} tests: ${e.name}`,onClick:()=>{a?U():dt(e.id)==="modal"?Ve(e.id):D("tests",e.id)},onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ce(e.id,{x:n.clientX,y:n.clientY})},children:t.jsx(o,{name:"flask",size:14})},e.id)})}),Le.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area slash commands",children:Le.map(e=>t.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn flat-terminal-wrapper__building-btn--slash-command",title:`Run ${e.name}: ${e.command}`,"aria-label":`Run ${e.name}`,"data-building-id":e.id,onClick:()=>{window.dispatchEvent(new CustomEvent("tide:open-slash-command-building",{detail:{buildingId:e.id}}))},onContextMenu:a=>{a.preventDefault(),a.stopPropagation(),ce(e.id,{x:a.clientX,y:a.clientY})},children:e.icon?t.jsx("span",{className:"flat-terminal-wrapper__building-emoji","aria-hidden":"true",children:e.icon}):t.jsx(o,{name:"bolt",size:14})},e.id))}),We.length>0&&t.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area HTTP requests",children:We.map(e=>{const a=(f==null?void 0:f.buildingId)===e.id;return t.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${a?"flat-terminal-wrapper__building-btn--active":""}`,title:`${a?"Hide":"Show"} HTTP requests: ${e.name}`,onClick:()=>{a?U():dt(e.id)==="modal"?Ve(e.id):D("http",e.id)},onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ce(e.id,{x:n.clientX,y:n.clientY})},children:t.jsx(o,{name:"globe",size:14})},e.id)})}),t.jsx("div",{className:"flat-terminal-wrapper__theme",children:t.jsx(En,{iconOnly:!0})})]}),Ae&&t.jsx(In,{agentId:l,agents:Ht,onClose:tt,branchInfoMap:$e,fetchRemote:Q,fetchingDirs:Pe,onResizeStart:e=>Wt(e,"right")}),X&&t.jsx(Mn,{agentId:l,onClose:kt}),G&&t.jsx(Tn,{agentId:l,onClose:Se}),t.jsx(aa,{isOpen:Z!==null,position:Z??{x:0,y:0},worldPosition:{x:0,z:0},actions:je,onClose:()=>J(null)})]})}),Yn={groups:[],gridCols:1,gridRows:1,positions:new Map};function es({onAgentClick:u,onBuildingClick:l,onBuildingDoubleClick:g,onBuildingPopup:w,onAreaContextMenu:A,onOpenSpawnModal:L,onOpenBossSpawnModal:M,onOpenAreaModal:S}){const{t:xe}=ba(["common"]),j=za(),b=s.useMemo(()=>j.size>0?j.values().next().value??null:null,[j]),be=Ra(b===null),pt=Da(),[Oe,qe]=s.useState(null),[_e,we]=s.useState(null),[Ye,mt]=s.useState(null);_a("flatview-image-modal",Oe!==null,()=>qe(null));const[Ke,ce]=s.useState(null),[c,$]=s.useState(null),[de,ue]=s.useState(null),[ie,H]=s.useState(null),[Me,Be]=s.useState(!1),Te=s.useCallback(()=>{Be(e=>!e)},[]),Ze=s.useCallback(()=>{Be(!1)},[]),[ft,ve]=s.useState(()=>{const e=Vt(k.VIEW_MODE);return e==="simple"||e==="chat"||e==="advanced"?e:"simple"}),K=s.useCallback(e=>{ve(e),qt(k.VIEW_MODE,e)},[]);s.useEffect(()=>{const e=a=>{if(a.key!==k.VIEW_MODE)return;const n=a.newValue;(n==="simple"||n==="chat"||n==="advanced")&&ve(n)};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[]);const[pe,Z]=s.useState(()=>ea(k.FLAT_INSPECTOR_OPEN,!1)),[J,je]=s.useState(!1),ht=s.useCallback(()=>je(e=>!e),[]),Je=s.useCallback(()=>je(!1),[]);s.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-agents-drawer-state",{detail:{open:J}}))},[J]),s.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-inspector-state",{detail:{open:pe}}))},[pe]),s.useEffect(()=>{const e=()=>je(h=>!h),a=()=>{Z(h=>{const x=!h;return oe(k.FLAT_INSPECTOR_OPEN,x),x})},n=()=>{je(!1),Z(!1),oe(k.FLAT_INSPECTOR_OPEN,!1)},i=()=>je(!1),d=()=>{Z(!1),oe(k.FLAT_INSPECTOR_OPEN,!1)};return window.addEventListener("tide-toggle-flat-agents-drawer",e),window.addEventListener("tide-toggle-flat-inspector",a),window.addEventListener("tide-close-flat-side-views",n),window.addEventListener("tide-close-flat-agents-drawer-only",i),window.addEventListener("tide-close-flat-inspector-only",d),()=>{window.removeEventListener("tide-toggle-flat-agents-drawer",e),window.removeEventListener("tide-toggle-flat-inspector",a),window.removeEventListener("tide-close-flat-side-views",n),window.removeEventListener("tide-close-flat-agents-drawer-only",i),window.removeEventListener("tide-close-flat-inspector-only",d)}},[]);const z=s.useRef(null),le=s.useRef(null),[me,$e]=s.useState(()=>{const e=ra(k.FLAT_MIDDLE_WIDTH,0);return e>=zt?e:null}),[Q,Pe]=s.useState(()=>{const e=ra(k.FLAT_INSPECTOR_WIDTH,0);return e>=Zt?e:null}),re=s.useCallback(e=>{if(typeof window>"u")return e;const a=Q!==null?Lt+Q:0,n=window.innerWidth-pa-Lt-ua-a;return Math.max(zt,Math.min(Math.max(n,zt),e))},[Q]),Ce=s.useCallback(e=>{var d;if(typeof window>"u")return e;const a=(d=z.current)==null?void 0:d.querySelector(".flat-middle"),n=(a==null?void 0:a.getBoundingClientRect().width)??zt,i=window.innerWidth-pa-n-Lt-ua-Lt;return Math.max(Zt,Math.min(Math.max(i,Zt),e))},[]);s.useEffect(()=>{if(me===null&&Q===null)return;const e=()=>{$e(a=>{if(a===null)return a;const n=re(a);return n===a?a:n}),Pe(a=>{if(a===null)return a;const n=Ce(a);return n===a?a:n})};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[me,Q,re,Ce]);const Rt=s.useCallback(e=>{var n;if(e.button!==0)return;const a=(n=z.current)==null?void 0:n.querySelector(".flat-middle");a&&(e.currentTarget.setPointerCapture(e.pointerId),le.current={kind:"middle",startX:e.clientX,startWidth:a.getBoundingClientRect().width,pointerId:e.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),gt=s.useCallback(e=>{var n;if(e.button!==0)return;const a=(n=z.current)==null?void 0:n.querySelector(".flat-inspector");a&&(e.currentTarget.setPointerCapture(e.pointerId),le.current={kind:"inspector",startX:e.clientX,startWidth:a.getBoundingClientRect().width,pointerId:e.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),ke=s.useCallback(e=>{const a=le.current;if(!a||e.pointerId!==a.pointerId)return;const n=e.clientX-a.startX;a.kind==="middle"?$e(re(a.startWidth+n)):Pe(Ce(a.startWidth-n))},[re,Ce]),fe=s.useCallback(e=>{const a=le.current;if(!a||e.pointerId!==a.pointerId)return;try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}if(le.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(e.clientX-a.startX)>2))return;const i=e.clientX-a.startX;if(a.kind==="middle"){const d=re(a.startWidth+i);$e(d),Pt(k.FLAT_MIDDLE_WIDTH,d)}else{const d=Ce(a.startWidth-i);Pe(d),Pt(k.FLAT_INSPECTOR_WIDTH,d)}},[re,Ce]),Fe=s.useCallback(()=>{$e(null),Pt(k.FLAT_MIDDLE_WIDTH,0)},[]),xt=s.useCallback(()=>{Pe(null),Pt(k.FLAT_INSPECTOR_WIDTH,0)},[]),[ee,We]=s.useState(()=>Vt(k.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),Le=s.useCallback(e=>{We(e),qt(k.FLAT_INSPECTOR_VIEW,e)},[]),Dt=s.useCallback(()=>{Z(e=>{const a=!e;return oe(k.FLAT_INSPECTOR_OPEN,a),a})},[]),te=s.useCallback(()=>{Z(!1),oe(k.FLAT_INSPECTOR_OPEN,!1)},[]),bt=s.useCallback(()=>{Le("tracking"),Z(!0),oe(k.FLAT_INSPECTOR_OPEN,!0)},[Le]),Qe=Oa(),Ne=s.useCallback((e,a)=>{qe({url:e,name:a})},[]),f=s.useCallback((e,a)=>{we({command:e,output:a,isLive:!1})},[]),ye=s.useCallback((e,a)=>{var d;const n=j.size>0?Array.from(j)[0]:null,i=n?(d=m.getState().agents.get(n))==null?void 0:d.cwd:void 0;m.setFileViewerPath(e,a,i)},[j]),R=s.useCallback(e=>{mt(e)},[]),_t=s.useCallback((e,a)=>{ce({agentId:e,count:a})},[]),ae=s.useCallback(e=>{g?g(e):l(e)},[l,g]),et=s.useCallback(e=>{b&&$({agentId:b,position:e})},[b]),Ot=s.useCallback((e,a)=>{ue({buildingId:e,position:a})},[]);s.useEffect(()=>{Be(!1)},[b]);const y=s.useRef([]),D=s.useRef(-1),U=s.useRef(!1),wt=s.useRef(Vt(k.LAST_OPENED_AGENT,"")||null),[Bt,Ft]=s.useState(!1),[Wt,Ae]=s.useState(!1),He=s.useRef(!1),X=s.useRef(null),Ue=s.useRef(!1),G=s.useMemo(()=>new Set(pt),[pt]),vt=s.useMemo(()=>{const e=new Map(be.map(n=>[n.id,n])),a=new Map;for(const n of be)if((n.isBoss||n.class==="boss")&&n.subordinateIds&&n.subordinateIds.length>0){const i=n.subordinateIds.map(d=>e.get(d)).filter(d=>d!==void 0);i.length>0&&a.set(n.id,i)}return a},[be]),V=s.useCallback(()=>{const e=y.current,a=D.current;Ft(a>0),Ae(a>=0&&a<e.length-1)},[]),Se=s.useCallback(e=>{const a=y.current;if(a.length===0)return;let n=D.current+e;for(;n>=0&&n<a.length;){const i=a[n];if(G.has(i)){U.current=!0,D.current=n,V(),m.selectAgent(i);return}n+=e}},[G,V]),jt=s.useCallback(()=>Se(-1),[Se]),Ct=s.useCallback(()=>Se(1),[Se]);Dn(s.useCallback(()=>{const e=y.current,a=D.current;return e.length>0&&a>0?(Se(-1),"handled"):"exit"},[Se]));const tt=s.useCallback((e,a)=>{if(typeof window>"u")return;const n=window.history.state,d={...typeof n=="object"&&n!==null?n:{},__flatAgentNav:{agentId:e}};a==="replace"?window.history.replaceState(d,"",window.location.href):window.history.pushState(d,"",window.location.href)},[]);s.useEffect(()=>{if(!b){He.current=!1,X.current=null;return}if(!He.current){tt(b,"replace"),He.current=!0,X.current=b;return}if(Ue.current){Ue.current=!1,X.current=b;return}X.current!==b&&(tt(b,"push"),X.current=b)},[b,tt]),s.useEffect(()=>{const e=a=>{var h,x;const n=(x=(h=a.state)==null?void 0:h.__flatAgentNav)==null?void 0:x.agentId;if(!n||typeof n!="string"||!G.has(n)||n===b)return;Ue.current=!0,U.current=!0;const i=y.current,d=i.lastIndexOf(n);d>=0?D.current=d:(i.push(n),D.current=i.length-1),V(),m.selectAgent(n)};return window.addEventListener("popstate",e),()=>window.removeEventListener("popstate",e)},[G,b,V]),s.useEffect(()=>{if(!b){y.current=[],D.current=-1,V();return}if(wt.current=b,qt(k.LAST_OPENED_AGENT,b),U.current){U.current=!1,V();return}const e=y.current,a=D.current;if(a>=0&&e[a]===b){V();return}const n=a<e.length-1?e.slice(0,a+1):e.slice();n.push(b),n.length>100&&n.shift(),y.current=n,D.current=n.length-1,V()},[b,V]);const kt=s.useCallback(e=>{u(e),je(!1)},[u]),Ht=b??"",Ee=s.useCallback(()=>{},[]),Nt=s.useCallback(e=>{kt(e)},[kt]),B=pe,[ne,Ge]=s.useState(B),[at,yt]=s.useState(B),ze=wa(Me||Ye!==null||ne&&ee==="agent"?b:null);s.useEffect(()=>{if(B){Ge(!0);return}yt(!1);const e=setTimeout(()=>Ge(!1),240);return()=>clearTimeout(e)},[B]),s.useEffect(()=>{if(!ne||!B)return;let e=0;const a=requestAnimationFrame(()=>{e=requestAnimationFrame(()=>yt(!0))});return()=>{cancelAnimationFrame(a),cancelAnimationFrame(e)}},[ne,B]);const he=s.useRef(null);s.useEffect(()=>{if(b)return;const e=a=>{if(a.key!==" "&&a.key!=="Backspace")return;const n=a.target;if(n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable)return;const i=wt.current;!i||!G.has(i)||(a.preventDefault(),m.selectAgent(i))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[b,G]);const[nt,Xe]=s.useState(new Set),st=s.useCallback(e=>{Xe(a=>{const n=new Set(a);return n.has(e)?n.delete(e):n.add(e),n})},[]),it=s.useCallback(e=>{Xe(new Set(e))},[]),[q,lt]=s.useState(()=>typeof window<"u"&&window.matchMedia("(max-width: 768px)").matches);s.useEffect(()=>{if(typeof window>"u")return;const e=window.matchMedia("(max-width: 768px)"),a=n=>lt(n.matches);return e.addEventListener("change",a),()=>e.removeEventListener("change",a)},[]);const[Ie,rt]=s.useState(null),At=s.useCallback(e=>{rt(a=>a===e?null:e)},[]),ot=va(),Y=ja(),[St]=Ba(),P=s.useMemo(()=>{if(b)return Yn;const e=new Map,a=[];for(const p of be){const _=m.getAreaForAgent(p.id);if(!oa((_==null?void 0:_.id)??null))continue;if(!_||_.archived){a.push(p);continue}const I=e.get(_.id);I?I.push(p):e.set(_.id,[p])}const n=new Map,i=[];for(const p of Y.values()){let _=!1;for(const I of ot.values())if(!I.archived&&ca(I.id)&&m.isPositionInArea(p.position,I)){const se=n.get(I.id);se?se.push(p):n.set(I.id,[p]),_=!0;break}!_&&oa(null)&&i.push(p)}const d=[];for(const[,p]of ot){if(p.archived||!ca(p.id))continue;const _=e.get(p.id),I=n.get(p.id)??[];(_&&_.length>0||I.length>0)&&d.push({area:p,agents:_??[],buildings:I})}(a.length>0||i.length>0)&&d.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:a,buildings:i});const h=d.filter(p=>p.area.id!=="__unassigned__"),x=d.filter(p=>p.area.id==="__unassigned__");let T=1,E=1;const r=new Map;if(h.length>1){let p=1/0,_=-1/0,I=1/0,se=-1/0;for(const F of h)p=Math.min(p,F.area.center.x),_=Math.max(_,F.area.center.x),I=Math.min(I,F.area.center.z),se=Math.max(se,F.area.center.z);const ge=_-p||1,Tt=se-I||1;if(h.length<=4){T=h.length,E=1;const F=[...h].sort((W,Ut)=>W.area.center.x-Ut.area.center.x);for(let W=0;W<F.length;W++)r.set(F[W].area.id,{row:1,col:W+1})}else{const F=[...h].sort((N,O)=>N.area.center.x-O.area.center.x),W=[];for(let N=1;N<F.length;N++)W.push(F[N].area.center.x-F[N-1].area.center.x);const Ut=W.reduce((N,O)=>N+O,0)/W.length||1;let na=1;for(const N of W)N>Ut*1.3&&na++;T=Math.max(2,Math.min(na,h.length));const Gt=[...h].sort((N,O)=>N.area.center.z-O.area.center.z),$t=[];for(let N=1;N<Gt.length;N++)$t.push(Gt[N].area.center.z-Gt[N-1].area.center.z);const Ea=$t.reduce((N,O)=>N+O,0)/$t.length||1;let sa=1;for(const N of $t)N>Ea*1.3&&sa++;E=Math.max(2,Math.min(sa,h.length)),T=Math.max(T,Math.ceil(h.length/E)),E=Math.max(E,Math.ceil(h.length/T));const Ia=ge/T,Ma=Tt/E,Xt=new Set;for(const N of h){let O=Math.min(T-1,Math.max(0,Math.floor((N.area.center.x-p)/Ia))),De=Math.min(E-1,Math.max(0,Math.floor((N.area.center.z-I)/Ma))),ct=`${De},${O}`,ia=0;const Ta=E*T;for(;Xt.has(ct)&&ia<Ta;)O++,O>=T&&(O=0,De=(De+1)%E),ct=`${De},${O}`,ia++;Xt.has(ct)&&(De=E,O=0,ct=`${De},${O}`,E++),Xt.add(ct),r.set(N.area.id,{row:De+1,col:O+1})}}}const C=p=>{p.sort((_,I)=>{var ge,Tt,F,W;const se=(((ge=_.position)==null?void 0:ge.z)??0)-(((Tt=I.position)==null?void 0:Tt.z)??0);return se!==0?se:(((F=_.position)==null?void 0:F.x)??0)-(((W=I.position)==null?void 0:W.x)??0)})};for(const p of h)C(p.agents);for(const p of x)C(p.agents);const v=[...h,...x].sort((p,_)=>p.area.name.localeCompare(_.area.name,void 0,{sensitivity:"base",numeric:!0})||p.area.id.localeCompare(_.area.id));return r.clear(),v.forEach((p,_)=>{r.set(p.area.id,{row:Math.floor(_/T)+1,col:_%T+1})}),E=Math.max(1,Math.ceil(v.length/T)),{groups:v,gridCols:T,gridRows:E,positions:r}},[be,ot,Y,St,b]),Re=s.useMemo(()=>{let e=0,a=0;for(const n of P.groups)e+=n.agents.length,a+=n.agents.filter(i=>i.status==="working").length;return{areaCount:P.groups.length,agentCount:e,workingCount:a}},[P]),Et=s.useMemo(()=>{if(!c)return[];const e=m.getState().agents.get(c.agentId);return e?[{id:"edit-agent",label:"Edit Agent",icon:t.jsx(o,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:open-agent-edit",{detail:{agentId:e.id}}))}},{id:"open-chat",label:"Open Chat",icon:t.jsx(o,{name:"chat",size:14}),onClick:()=>u(e.id)},{id:"clone-agent",label:"Clone Agent",icon:t.jsx(o,{name:"clipboard",size:14}),onClick:()=>m.cloneAgent(e.id)},{id:"fork-agent",label:"Fork Agent (with history)",icon:t.jsx(o,{name:"git-branch",size:14}),onClick:()=>m.forkAgent(e.id)},{id:"delete-agent",label:"Delete Agent",icon:t.jsx(o,{name:"trash",size:14}),danger:!0,onClick:()=>{H({agentId:e.id,name:e.name})}}]:[]},[c,u]),It=s.useMemo(()=>{var h;if(!de)return[];const e=Y.get(de.buildingId);if(!e)return[];const a=[],n=e.type==="server"||e.type==="docker"||e.type==="terminal",i=e.status==="running",d=e.type==="boss";if(a.push({id:"open",label:e.type==="database"?"Open Database":e.type==="folder"?"Open Folder":e.type==="tests"?"Open Tests":e.type==="http"?"Open Requests":e.type==="slash-command"?"Run Command":e.type==="boss"?"View Boss Logs":e.type==="terminal"?"Open Terminal":e.type==="server"&&((h=e.pm2)!=null&&h.enabled)?"View PM2 Logs":"Open",icon:t.jsx(o,{name:e.type==="database"?"database":e.type==="folder"?"folder":e.type==="tests"?"flask":e.type==="http"?"globe":e.type==="slash-command"?"envelope":e.type==="terminal"?"terminal":"eye",size:14}),onClick:()=>ae(e.id)}),n&&(i||a.push({id:"start",label:"Start",icon:t.jsx(o,{name:"play",size:14}),onClick:()=>m.sendBuildingCommand(e.id,"start")}),i&&(a.push({id:"restart",label:"Restart",icon:t.jsx(o,{name:"refresh",size:14}),onClick:()=>m.sendBuildingCommand(e.id,"restart")}),a.push({id:"stop",label:"Stop",icon:t.jsx(o,{name:"stop",size:14}),onClick:()=>m.sendBuildingCommand(e.id,"stop")}))),d&&e.subordinateBuildingIds&&e.subordinateBuildingIds.length>0&&(a.push({id:"start-all",label:"Start All Subordinates",icon:t.jsx(o,{name:"launch",size:14}),onClick:()=>{for(const x of e.subordinateBuildingIds)m.sendBuildingCommand(x,"start")}}),a.push({id:"stop-all",label:"Stop All Subordinates",icon:t.jsx(o,{name:"pause",size:14}),onClick:()=>{for(const x of e.subordinateBuildingIds)m.sendBuildingCommand(x,"stop")}}),a.push({id:"restart-all",label:"Restart All Subordinates",icon:t.jsx(o,{name:"restart",size:14}),onClick:()=>{for(const x of e.subordinateBuildingIds)m.sendBuildingCommand(x,"restart")}})),n&&a.push({id:"health-check",label:"Health Check",icon:t.jsx(o,{name:"health",size:14}),onClick:()=>m.sendBuildingCommand(e.id,"healthCheck")}),a.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),a.push({id:"edit",label:"Edit Building",icon:t.jsx(o,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:building-edit",{detail:{buildingId:e.id}}))}}),a.push({id:"clone",label:"Clone Building",icon:t.jsx(o,{name:"copy",size:14}),onClick:()=>{m.createBuilding({name:`${e.name} (Copy)`,type:e.type,style:e.style,color:e.color,scale:e.scale,icon:e.icon,slashCommand:e.slashCommand,position:{x:e.position.x+2,z:e.position.z+2},cwd:e.cwd,folderPath:e.folderPath,commands:e.commands,pm2:e.pm2,docker:e.docker,database:e.database,terminal:e.terminal,urls:e.urls,subordinateBuildingIds:e.subordinateBuildingIds})}}),e.urls&&e.urls.length>0)for(const x of e.urls)a.push({id:`url-${x.label}`,label:x.label,icon:t.jsx(o,{name:"link",size:14}),onClick:()=>window.open(x.url,"_blank","noopener,noreferrer")});return a.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),a.push({id:"delete",label:"Delete Building",icon:t.jsx(o,{name:"trash",size:14}),danger:!0,onClick:()=>m.deleteBuilding(e.id)}),a},[de,Y,ae]),Mt=s.useCallback(e=>{Xe(new Set([e])),requestAnimationFrame(()=>{const a=he.current;if(!a)return;const n=a.querySelector(`[data-area-id="${e}"]`);if(!n)return;const i=a.getBoundingClientRect(),h=n.getBoundingClientRect().top-i.top+a.scrollTop-8;a.scrollTo({top:Math.max(0,h),behavior:"smooth"})})},[]);return t.jsxs("div",{ref:z,className:`flat-view ${B?"flat-view--with-inspector":""} ${b?"flat-view--has-chat":""} ${J?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(me===null&&Q===null)return;const e={};return me!==null&&(e["--flat-middle-width"]=`${me}px`),Q!==null&&(e["--flat-inspector-width"]=`${Q}px`),e})(),children:[J&&t.jsx("div",{className:"flat-mobile-sidebar-backdrop",onClick:Je,"aria-hidden":"true"}),t.jsxs("div",{className:"flat-middle",children:[t.jsx("div",{className:"flat-middle__header",children:t.jsxs("div",{className:"flat-middle__actions",children:[t.jsx("button",{className:"flat-cta-btn flat-cta-btn--agent",onClick:L,title:"Create new agent",children:"+ Agent"}),t.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:M,title:"Create new boss agent",children:"+ Boss"}),t.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:S,title:"Create new area",children:"+ Area"})]})}),t.jsx("div",{className:"flat-middle__content",children:t.jsx(Fa,{activeAgentId:Ht,onClose:Ee,onSelectAgent:Nt,expandedAreas:nt,onToggleArea:st,onSetExpandedAreas:it,agentListRef:he})})]}),t.jsx("div",{className:"flat-splitter flat-splitter--middle",role:"separator","aria-orientation":"vertical","aria-label":"Resize agents panel",title:"Drag to resize · Double-click to reset",onPointerDown:Rt,onPointerMove:ke,onPointerUp:fe,onPointerCancel:fe,onDoubleClick:Fe}),t.jsxs("div",{className:"flat-right",children:[t.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":J?"Close agents sidebar":"Open agents sidebar","aria-expanded":J,onClick:ht,children:[t.jsx(o,{name:"list",size:18}),t.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),b?t.jsx(qn,{agentId:b,terminalViewMode:ft,onTerminalViewModeChange:K,inspectorOpen:pe,onToggleInspector:Dt,onShowTaskBoard:bt,onImageClick:Ne,onFileClick:ye,onBashClick:f,onViewMarkdown:R,onRequestClearSubordinates:_t,keyboard:Qe,canNavigateBack:Bt,canNavigateForward:Wt,onNavigateBack:jt,onNavigateForward:Ct,agentInfoOpen:Me,onToggleAgentInfo:Te,onHeaderContextMenu:et,onBuildingContextMenu:Ot}):t.jsx("div",{className:"flat-chat flat-chat--empty",children:t.jsxs("div",{className:"flat-map",children:[t.jsxs("div",{className:"flat-map__header",children:[t.jsx("span",{className:"flat-map__title",children:"🗺️ Areas"}),t.jsx("span",{className:"flat-map__hint",children:"Click an area to focus it, or an agent to chat"}),t.jsxs("span",{className:"flat-map__stats",children:[t.jsxs("span",{children:[Re.areaCount," areas"]}),t.jsxs("span",{children:[Re.agentCount," agents"]}),Re.workingCount>0&&t.jsxs("span",{className:"flat-map__stats-working",children:[t.jsx("span",{className:"flat-map__stats-dot","aria-hidden":"true"}),Re.workingCount," working"]})]}),t.jsx(Wn,{className:"flat-map__view-mode"})]}),t.jsx("div",{className:"flat-map__grid",style:{gridTemplateColumns:q?"repeat(2, minmax(0, 1fr))":`repeat(${P.gridCols}, 1fr)`},children:P.groups.length===0?t.jsx("div",{className:"flat-map__empty",children:t.jsx("span",{children:"No areas or agents yet"})}):(q?[...P.groups].sort((a,n)=>{const i=P.positions.get(a.area.id),d=P.positions.get(n.area.id);return!i&&!d?0:i?d?i.row-d.row||i.col-d.col:-1:1}):P.groups).map(a=>{var E;const n=a.area.id,i=P.positions.get(n),d=a.agents.filter(r=>r.status==="working").length,h=d>0,x=q&&Ie!==n,T=q&&!x;return t.jsxs("div",{className:`flat-map-area-card${h?" flat-map-area-card--working":""}${x?" flat-map-area-card--collapsed":""}${T?" flat-map-area-card--expanded":""}`,style:{"--area-color":a.area.color,gridRow:q||i==null?void 0:i.row,gridColumn:q||i==null?void 0:i.col},onContextMenu:r=>{A&&(r.preventDefault(),r.stopPropagation(),A(n,{x:r.clientX,y:r.clientY}))},children:[t.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>q?At(n):Mt(n),title:q?x?`Expand ${a.area.name}`:`Collapse ${a.area.name}`:`Focus ${a.area.name} in left panel`,"aria-expanded":q?!x:void 0,children:[t.jsx("span",{className:"flat-map-area-card__color",style:{background:a.area.color}}),((E=a.area.logo)==null?void 0:E.filename)&&t.jsx("img",{className:"flat-map-area-card__logo",src:Rn(a.area.logo.filename),alt:"","aria-hidden":"true",onError:r=>{r.currentTarget.style.display="none"}}),t.jsx("span",{className:"flat-map-area-card__name",children:a.area.name}),t.jsxs("span",{className:"flat-map-area-card__count",title:`${a.agents.length} agent${a.agents.length===1?"":"s"}`,"aria-label":`${a.agents.length} agent${a.agents.length===1?"":"s"}`,children:[t.jsx(o,{name:"users",size:10}),a.agents.length]}),h&&t.jsxs("span",{className:"flat-map-area-card__working",title:`${d} working agent${d===1?"":"s"}`,"aria-label":`${d} working agent${d===1?"":"s"}`,children:[t.jsx(ta,{animated:!0,size:12,className:"flat-map-area-card__working-glyph"}),t.jsx("span",{className:"flat-map-area-card__working-count",children:d})]}),q&&t.jsx(o,{name:x?"caret-down":"caret-up",size:11,className:"flat-map-area-card__caret"})]}),t.jsx("div",{className:"flat-map-area-card__agents",children:a.agents.map(r=>{const C=r.isBoss||r.class==="boss",v=C?vt.get(r.id):void 0,p=Ca(r),_=p.usedPercent>=80?"#ff4a4a":p.usedPercent>=60?"#ff9e4a":p.usedPercent>=40?"#ffd700":"#4aff9e",I=`Context: ${(p.totalTokens/1e3).toFixed(1)}k / ${(p.contextWindow/1e3).toFixed(1)}k (${p.usedPercent}% used, ${p.freePercent}% free)`,se=r.latestTodos&&r.latestTodos.length>0||v&&v.length>0;return t.jsx(Wa,{todos:r.latestTodos,subordinates:v,position:"top",children:t.jsxs("button",{type:"button",className:`flat-map-agent-chip ${r.status}`,onClick:()=>u(r.id),onContextMenu:ge=>{ge.preventDefault(),ge.stopPropagation(),$({agentId:r.id,position:{x:ge.clientX,y:ge.clientY}})},title:se?void 0:`${C?"Boss · ":""}Open chat with ${r.name}
2
- ${I}`,children:[t.jsx(ka,{agent:r,size:16}),C&&t.jsx("span",{className:"flat-map-agent-chip__crown","aria-hidden":"true",children:t.jsx(o,{name:"crown",size:11,color:"#ffd700",weight:"fill"})}),t.jsx("span",{className:"flat-map-agent-chip__name",children:r.name}),t.jsx(Na,{agent:r,alt:`${r.name} provider`,className:"flat-map-agent-chip__provider-icon"}),r.status==="working"?t.jsx(ta,{animated:!0,size:11,className:"flat-map-agent-chip__activity"}):t.jsx("span",{className:"flat-map-agent-chip__dot",style:{backgroundColor:ya(r.status)}}),r.latestTodos&&r.latestTodos.length>0&&t.jsx(Ha,{todos:r.latestTodos,maxDots:6}),C&&v&&v.length>0&&t.jsx(Ua,{subordinates:v,maxDots:6}),t.jsx("span",{className:"flat-map-agent-chip__context-bar","aria-hidden":"true",children:t.jsx("span",{className:"flat-map-agent-chip__context-bar-fill",style:{width:`${p.usedPercent}%`,backgroundColor:_}})})]})},r.id)})}),a.area.directories.length>0&&t.jsx("div",{className:"flat-map-area-card__folders",role:"group","aria-label":`${a.area.name} folders`,children:a.area.directories.map(r=>{const C=r.split("/").filter(Boolean).pop()||r;return t.jsxs("button",{type:"button",className:"flat-map-folder-chip",onClick:v=>{v.stopPropagation(),m.openFileExplorerForAreaFolder(n,r)},title:`Open in file explorer: ${r}`,children:[t.jsx(o,{name:"folder-open",size:12}),t.jsx("span",{className:"flat-map-folder-chip__name",children:C})]},r)})}),a.buildings.length>0&&t.jsx("div",{className:"flat-map-area-card__buildings",children:a.buildings.map(r=>{var v;const C=(v=Ga[r.type])==null?void 0:v.color;return t.jsxs("button",{type:"button",className:`flat-map-building-chip flat-map-building-chip--${r.status}`,style:C?{"--building-type-color":C}:void 0,onClick:p=>{if(r.type==="slash-command")ae(r.id);else if(w){const _=p.currentTarget.getBoundingClientRect();w(r.id,{x:_.right,y:_.top+_.height/2})}else ae(r.id)},onContextMenu:p=>{p.preventDefault(),p.stopPropagation(),ue({buildingId:r.id,position:{x:p.clientX,y:p.clientY}})},title:`${r.name} · ${r.type} · ${r.status}`,children:[t.jsx(o,{name:Xa(r.type),size:12,color:C}),t.jsx("span",{className:"flat-map-building-chip__name",children:r.name}),t.jsx("span",{className:"flat-map-building-chip__dot",style:{backgroundColor:Va(r.status)}})]},r.id)})})]},n)})})]})})]}),B&&t.jsx("div",{className:"flat-splitter flat-splitter--inspector",role:"separator","aria-orientation":"vertical","aria-label":"Resize inspector panel",title:"Drag to resize · Double-click to reset",onPointerDown:gt,onPointerMove:ke,onPointerUp:fe,onPointerCancel:fe,onDoubleClick:xt}),ne&&t.jsxs("aside",{className:`flat-inspector ${at?"flat-inspector--open":"flat-inspector--closing"}`,"aria-label":"Inspector panel",children:[t.jsxs("div",{className:"flat-inspector__header",children:[t.jsxs("div",{className:"flat-inspector__tabs",role:"tablist","aria-label":"Inspector view",children:[t.jsx("button",{type:"button",role:"tab","aria-selected":ee==="agent",className:`flat-inspector__tab ${ee==="agent"?"flat-inspector__tab--active":""}`,onClick:()=>Le("agent"),children:"Agent"}),t.jsx("button",{type:"button",role:"tab","aria-selected":ee==="tracking",className:`flat-inspector__tab ${ee==="tracking"?"flat-inspector__tab--active":""}`,onClick:()=>Le("tracking"),children:"Tracking"})]}),t.jsx("button",{type:"button",className:"flat-inspector__close",onClick:te,title:"Close inspector","aria-label":"Close inspector",children:"✕"})]}),t.jsx("div",{className:"flat-inspector__body",children:ee==="tracking"?t.jsx(qa,{activeAgentId:b??"",onSelectAgent:e=>{u(e),window.innerWidth<=768&&te()}}):b?ze?t.jsx(Ya,{agent:ze,onFocusAgent:e=>{u(e),window.innerWidth<=768&&te()},onKillAgent:e=>m.killAgent(e)}):t.jsx("div",{className:"flat-inspector__empty",children:t.jsx("span",{children:"Agent not found"})}):t.jsx("div",{className:"flat-inspector__empty",children:t.jsx("span",{children:"Select an agent to inspect"})})})]}),Oe&&t.jsx(Ka,{url:Oe.url,name:Oe.name,onClose:()=>qe(null)}),_e&&t.jsx(Za,{state:_e,onClose:()=>we(null)}),t.jsx(Ja,{agent:ze??null,content:Ye,onClose:()=>mt(null)}),Ke&&t.jsx(Qa,{action:"clear-subordinates",selectedAgentId:Ke.agentId,subordinateCount:Ke.count,onClose:()=>ce(null),onClearHistory:()=>{}}),t.jsx(en,{agent:ze??null,isOpen:Me&&!!b,onClose:Ze}),t.jsx(aa,{isOpen:c!==null,position:(c==null?void 0:c.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:Et,onClose:()=>$(null)}),t.jsx(aa,{isOpen:de!==null,position:(de==null?void 0:de.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:It,onClose:()=>ue(null)}),t.jsx(tn,{isOpen:ie!==null,title:xe("common:confirm.removeAgentTitle"),message:xe("common:confirm.removeAgentMessage",{name:(ie==null?void 0:ie.name)??""}),confirmLabel:xe("common:buttons.remove"),cancelLabel:xe("common:buttons.cancel"),variant:"danger",onConfirm:()=>{ie&&m.removeAgentFromServer(ie.agentId)},onClose:()=>H(null)})]})}export{es as FlatView};