tide-commander 1.210.0 → 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.
- package/CHANGELOG.md +15 -0
- package/dist/assets/{AudioPlayer-CElliTTR.js → AudioPlayer-BkW6rbHa.js} +1 -1
- package/dist/assets/{BossLogsModal-DO0Vs1lM.js → BossLogsModal-CWJfLRLA.js} +1 -1
- package/dist/assets/{BossSpawnModal-BuDifEmB.js → BossSpawnModal-DMxCXROC.js} +1 -1
- package/dist/assets/{ControlsModal-DPcrW0oK.js → ControlsModal-BaSSGPXP.js} +1 -1
- package/dist/assets/{DockerLogsModal-DaGU7BRb.js → DockerLogsModal-C_Nb5L_a.js} +1 -1
- package/dist/assets/{EmbeddedEditor-BFwoN_46.js → EmbeddedEditor-CG0ULJUZ.js} +1 -1
- package/dist/assets/{FcStdViewer-D0qXXGZb.js → FcStdViewer-BgEgrxaw.js} +1 -1
- package/dist/assets/{GcodeViewer-DqMtMidS.js → GcodeViewer-CTlX7eA7.js} +1 -1
- package/dist/assets/{GlbViewer-B3jqR181.js → GlbViewer-CKaX8cFI.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-G3QuK-qX.js → GmailOAuthSetup-1AhXjBRc.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-dCjYnCta.js → GoogleOAuthSetup-DqPgZjOY.js} +1 -1
- package/dist/assets/{IframeModal-DYJCvfYE.js → IframeModal-ClN_kGcP.js} +1 -1
- package/dist/assets/{IntegrationsPanel-M73zpDQj.js → IntegrationsPanel-ckrmRwYi.js} +2 -2
- package/dist/assets/{LogViewerModal-IwhEcaYj.js → LogViewerModal-D_eGItAQ.js} +1 -1
- package/dist/assets/{MonitoringModal-k5DVlUx4.js → MonitoringModal-BrsQN8tD.js} +1 -1
- package/dist/assets/{PM2LogsModal-CK08IAnZ.js → PM2LogsModal-CKfdmFqw.js} +1 -1
- package/dist/assets/{PluginsPanel-DAmAgJvL.js → PluginsPanel-Bfqcnrsb.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-BCn-HylF.js → RestoreArchivedAreaModal-oZSTlXhf.js} +1 -1
- package/dist/assets/{Scene2DCanvas-DZ3LFW07.js → Scene2DCanvas-B2oTAqlK.js} +1 -1
- package/dist/assets/{SceneManager-aCcayL_T.js → SceneManager-pnDsJdS-.js} +1 -1
- package/dist/assets/{SkillsPanel-mr09RF0o.js → SkillsPanel-AQimvs-1.js} +1 -1
- package/dist/assets/{SlackMultiInstanceSetup-JSGJZGh6.js → SlackMultiInstanceSetup-U4d0XsWJ.js} +1 -1
- package/dist/assets/SpawnModal-DgKO0K6L.js +1 -0
- package/dist/assets/{StatisticsModal-DyUUvnxL.js → StatisticsModal-DDC8OYen.js} +1 -1
- package/dist/assets/{StlViewer-B0mqqtbi.js → StlViewer-DJZ7Qgp0.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-C7XdTSBc.js → SubordinateAssignmentModal-DCM6PpB_.js} +1 -1
- package/dist/assets/{ThreeAreaSelector-Cxtggsnt.js → ThreeAreaSelector-CjEcL3Kh.js} +1 -1
- package/dist/assets/{ThreeViewShortcuts-BqvxjuDQ.js → ThreeViewShortcuts-UakjRD8w.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-BnTWDT1K.js → TriggerManagerPanel-C42VLQu6.js} +1 -1
- package/dist/assets/{VideoPlayer-jknjvQg9.js → VideoPlayer-UW43AiLH.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-CvWwQ2Rk.js → WorkflowEditorPanel-DUvf5X0c.js} +1 -1
- package/dist/assets/{abnfDiagram-VRR7QNED-CUyx8tcg.js → abnfDiagram-VRR7QNED-KDmvD_Gi.js} +1 -1
- package/dist/assets/{arc-x9pqF0PL.js → arc-D8Dnwz7O.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-BL9aDWOo.js → architectureDiagram-ZJ3FMSHR-DzHUfCXK.js} +1 -1
- package/dist/assets/{area-logos-Dr_ZUFxK.js → area-logos-JqUib9Ux.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CaM55zZQ.js → blockDiagram-677ZJIJ3-CwOc3I3e.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-CCXnyLaP.js → c4Diagram-LMCZKHZV-ByDTz6Pi.js} +1 -1
- package/dist/assets/channel-C9DXs2xS.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-CUBfQrLS.js → chunk-2Q5K7J3B-CJ-5lUjr.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-CBsYvxtB.js → chunk-32BRIVSS-ClxbX6JR.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-D9K_iBqe.js → chunk-5VM5RSS4-D-B4g6BP.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BArv7wZg.js → chunk-EX3LRPZG-DE_ym6tm.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-nqIaplf_.js → chunk-JWPE2WC7-DbFNU_Ef.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-D9-EvsXA.js → chunk-MOJQB5TN-BonkkykU.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DhEtjvXf.js → chunk-RYQCIY6F-CqaRznBG.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-CloPxFmQ.js → chunk-V7JOEXUC-DI5OpSJo.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-B_gj6T5J.js → chunk-VR4S4FIN-DzHJs5bu.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CYQuP2YZ.js → chunk-XXDRQBXY-x9Zsg6mD.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-apBPMHmB.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-apBPMHmB.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CnNLLImF.js → cose-bilkent-JH36ORCC-B4Gh0RgK.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-CIlHlZVD.js → cynefin-VYW2F7L2-1rocbocI.js} +1 -1
- package/dist/assets/{cynefinDiagram-TSTJHNR4-DhQrqCi2.js → cynefinDiagram-TSTJHNR4-BCbOrdTH.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-XKh2Tzhw.js → dagre-VKFMJZFB-CquTDGCQ.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-C7LI8otY.js → diagram-FQU43EPY-CtRps2DK.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-BMBTikTC.js → diagram-G47NLZAW-C8uHzoun.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-BW_TXoVZ.js → diagram-NH7WQ7WH-BzGxTXmO.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-PDlY_6C8.js → diagram-OA4YK3LP-BoUlY6He.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-svn0tX11.js → diagram-WEI45ONY-EewNkn4I.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-BUIULs-0.js → ebnfDiagram-CCIWWBDH-DAp0_rYI.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-BiLmEbtK.js → erDiagram-Q63AITRT-CIDiaIv_.js} +1 -1
- package/dist/assets/{flowDiagram-23GEKE2U-Mc6PRVJ8.js → flowDiagram-23GEKE2U-ZQudeco2.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-BRUNbUed.js → ganttDiagram-NO4QXBWP-DDa9u7Kj.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-ezzuOWgX.js → gitGraphDiagram-IHSO6WYX-D0LPqp_M.js} +1 -1
- package/dist/assets/{index-D_NWG6YH.js → index-BMILmzZt.js} +3 -3
- package/dist/assets/{index-CdgtzuJp.js → index-BuW-OFAQ.js} +1 -1
- package/dist/assets/{index-BfLoArjP.js → index-CM0wRsAP.js} +1 -1
- package/dist/assets/{index-DfYkUGiD.js → index-CbjaD3wY.js} +2 -2
- package/dist/assets/{index-D8VUtdAF.js → index-CgtrBMsu.js} +1 -1
- package/dist/assets/index-CmZ79Am7.js +2 -0
- package/dist/assets/{index-BhcdiVTj.js → index-D0O_xUmt.js} +1 -1
- package/dist/assets/{index-Y6_p8QBS.js → index-DjZWtEFJ.js} +1 -1
- package/dist/assets/{index-SspfO_Hv.js → index-tU947Zt1.js} +1 -1
- package/dist/assets/{infoDiagram-FWYZ7A6U-BlWhqgLQ.js → infoDiagram-FWYZ7A6U-CD4Ws76i.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-C52xQkXn.js → ishikawaDiagram-FXEZZL3T-DSEmTd2f.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-DyobJuKu.js → journeyDiagram-5HDEW3XC-3_c5LjHs.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-D3TWdW5B.js → kanban-definition-HUTT4EX6-24lijuGn.js} +1 -1
- package/dist/assets/{linear-kXdtPjWH.js → linear-B_K6Qcv3.js} +1 -1
- package/dist/assets/{main-BmGgLw1j.css → main-6EJsyrfW.css} +1 -1
- package/dist/assets/main-D0r07JA_.js +344 -0
- package/dist/assets/{mermaid.core-jkxx9VU-.js → mermaid.core-B6sgvfs-.js} +4 -4
- package/dist/assets/{mindmap-definition-LN4V7U3C-CbFsW2ye.js → mindmap-definition-LN4V7U3C-BsAOrAHj.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-D2nH_y6d.js → pegDiagram-2B236MQR-DdfupKz5.js} +1 -1
- package/dist/assets/{pieDiagram-ENE6RG2P-CaK3PEMJ.js → pieDiagram-ENE6RG2P-D1YBZYdK.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-UgYM7N6C.js → quadrantDiagram-ABIIQ3AL-Bw-hoDGQ.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-CC2ZEDL4.js → railroadDiagram-RFXS5EU6-CkmO-Wgv.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-nlqWI7vA.js → requirementDiagram-TGXJPOKE-CSI19yqY.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-9uWggzcO.js → sankeyDiagram-HTMAVEWB-BvLYUk8J.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-0p9VY0Wu.js → sequenceDiagram-DBY2YBRQ-DSQLX4Eb.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-B2sHn0MG.js → sizeCapture-X5ZJPWSS-DfyzoJ-u.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-DpATBmQQ.js → stateDiagram-2N3HPSRC-G3bxzIPH.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-DCUADcVF.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-BPpym6MS.js → swimlanes-5IMT3BWC-CDZGonhF.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-Ddwy1JnL.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-SrMCxAjV.js → timeline-definition-FHXFAJF6-C5QDZq49.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-_9HfkXQN.js → vennDiagram-L72KCM5P-0a1v0gi5.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-EnATDQOK.js → wardleyDiagram-EHGQE667-DArhtjvR.js} +1 -1
- package/dist/assets/{web-BkIE9AAN.js → web-BU7b4YVF.js} +1 -1
- package/dist/assets/{web-CB0hTO4y.js → web-BgCc_AGi.js} +1 -1
- package/dist/assets/{web-6vks_1wd.js → web-BiQ9JdSl.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-DlMpFz7X.js → xychartDiagram-FW5EYKEG-BIZcXzGL.js} +1 -1
- package/dist/build-info.json +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/data/builtin-skills/conversation-history.js +3 -2
- package/dist/src/packages/server/data/event-queries.js +16 -6
- package/dist/src/packages/server/data/migrations/009_whatsapp_participant_jid.sql +9 -0
- package/dist/src/packages/server/data/migrations/010_whatsapp_participant_alt_jid.sql +9 -0
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-client.js +6 -2
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-routes.js +103 -2
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-skill.js +11 -0
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-trigger-handler.js +48 -5
- package/dist/src/packages/server/routes/event-routes.js +2 -0
- package/dist/src/packages/server/routes/files.js +169 -0
- package/package.json +1 -1
- package/dist/assets/SpawnModal-Rduhhunw.js +0 -1
- package/dist/assets/channel-W4AeOLhF.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-39XSHTF2.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-39XSHTF2.js +0 -1
- package/dist/assets/index-C9Axek5A.js +0 -2
- package/dist/assets/main-Bt4E0_YW.js +0 -344
- package/dist/assets/stateDiagram-v2-6OUMAXLB-CQH1oSae.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-BhNebkPx.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
|
|
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
|
-
|
|
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)
|
|
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)
|
|
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 +0,0 @@
|
|
|
1
|
-
import{u as ts,i as ls,k as os,l as cs,B as rs,r as l,m as Te,S as ue,D as is,C as L,n as G,o as se,p as ae,q as he,A as Re,d as we,c as ds,s as k,g as ps,j as e,I as ne,M as ms,t as Fe,H as f,F as us,P as xe,O as hs,G as te,v as ws,w as xs,x as fs,y as js,z as gs}from"./main-Bt4E0_YW.js";import{D as vs}from"./common-types-CXYNLIh4.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";function Oe(p,v){const M=v.filter(S=>!p.has(S));return M.length===0?`${v[Math.floor(Math.random()*v.length)]}-${Date.now()%1e3}`:M[Math.floor(Math.random()*M.length)]}function Ms({isOpen:p,onClose:v,onSpawnStart:M,onSpawnEnd:S,spawnPosition:Ue,spawnAreaId:N,initialSession:t}){const{t:a}=ts(["terminal","common"]),q=ls(),m=os(),fe=cs(),le=fe.length>0?fe:rs,[u,b]=l.useState(""),[y,$]=l.useState(()=>Te(ue.LAST_CWD)),[r,E]=l.useState("scout"),[je,P]=l.useState(!1),[ze,W]=l.useState(!1),[ge,oe]=l.useState(!1),[ve,Ne]=l.useState(""),[A,ce]=l.useState([]),[D,T]=l.useState(null),[Ge,be]=l.useState(!1),[R,Ce]=l.useState(""),[w,qe]=l.useState(""),[B,We]=l.useState(!1),[K,Be]=l.useState("bypass"),[c,I]=l.useState("claude"),[j,C]=l.useState({fullAuto:!0,sandbox:"workspace-write",approvalMode:"on-request",search:!1}),[re,ie]=l.useState(new Set),[F,de]=l.useState("claude-opus-4-8[1m]"),[H,pe]=l.useState("xHigh"),[J,ke]=l.useState("gpt-5.6-luna"),[X,Me]=l.useState("minimax/MiniMax-M1-80k"),[O,Se]=l.useState(is),[Y,ye]=l.useState(""),[Ee,Ke]=l.useState(""),[_,He]=l.useState(""),Q=l.useRef(null),Ae=l.useRef(!1),U=l.useCallback(()=>{window.__spawnModalAreaContext=null},[]),x=l.useMemo(()=>q.filter(s=>s.enabled),[q]);l.useEffect(()=>{if(p&&!Ae.current){if(x.length>0){const o=x.filter(i=>vs.includes(i.slug)).map(i=>i.id);o.length>0&&ie(new Set(o))}const n=Te(ue.DEFAULT_AGENT_CLASS);if(n==="random"){const i=[...Object.keys(js),...m.map(h=>h.id)];E(i[Math.floor(Math.random()*i.length)])}else E(n||"scout");if(t&&($(t.cwd),T(t.sessionId),I(t.provider),t.model&&(t.provider==="claude"&&t.model in L?de(t.model):t.provider==="codex"&&t.model in G?ke(t.model):t.provider==="opencode"?Me(t.model):t.provider==="grok"?Se(t.model):t.provider==="pi"&&ye(t.model)),t.effort)){const o=t.effort==="xhigh"?"xHigh":t.effort;t.provider==="codex"?t.effort in se&&C(i=>({...i,reasoningEffort:t.effort})):o in ae&&pe(o)}}Ae.current=p},[p,x,m,t]);const De=l.useMemo(()=>{if(!_.trim())return x;const s=_.toLowerCase();return x.filter(n=>n.name.toLowerCase().includes(s)||n.description.toLowerCase().includes(s)||n.slug.toLowerCase().includes(s))},[x,_]),Je=l.useCallback(s=>{ie(n=>{const o=new Set(n);return o.has(s)?o.delete(s):o.add(s),o})},[]);l.useMemo(()=>x.filter(s=>s.assignedAgentClasses.includes(r)),[x,r]);const Xe=l.useMemo(()=>{var n;const s=m.find(o=>o.id===r);return(n=s==null?void 0:s.defaultSkillIds)!=null&&n.length?q.filter(o=>s.defaultSkillIds.includes(o.id)):[]},[m,r,q]),Ie=l.useMemo(()=>{if(!R.trim())return A;const s=R.toLowerCase();return A.filter(n=>n.sessionId.toLowerCase().includes(s)||n.projectPath.toLowerCase().includes(s)||n.firstMessage&&n.firstMessage.toLowerCase().includes(s))},[A,R]),V=l.useMemo(()=>{if(!w.trim())return m;const s=w.toLowerCase();return m.filter(n=>n.name.toLowerCase().includes(s)||n.description.toLowerCase().includes(s)||n.id.toLowerCase().includes(s))},[m,w]),Z=l.useMemo(()=>{if(!w.trim())return he;const s=w.toLowerCase();return he.filter(n=>{const o=Re[n.id];return n.name.toLowerCase().includes(s)||n.id.toLowerCase().includes(s)||o.description.toLowerCase().includes(s)})},[w]);l.useEffect(()=>{if(!p||!w.trim())return;const s=[...V.map(n=>n.id),...Z.map(n=>n.id)];s.length===1&&s[0]!==r&&E(s[0])},[p,w,V,Z,r]);const d=l.useMemo(()=>m.find(s=>s.id===r),[m,r]),Ye=l.useMemo(()=>{if(d!=null&&d.model)return d.model},[d]),Qe=l.useMemo(()=>{if(d!=null&&d.customModelPath)return we(`/api/custom-models/${d.id}`)},[d]),Ve=d==null?void 0:d.modelScale,Ze=l.useMemo(()=>d?"scout":r,[r,d]),ee=l.useCallback(async s=>{be(!0);try{const n=s?we(`/api/agents/claude-sessions?cwd=${encodeURIComponent(s)}`):we("/api/agents/claude-sessions"),i=await(await ds(n)).json();ce(i.sessions||[])}catch(n){console.error("Failed to fetch sessions:",n),ce([])}finally{be(!1)}},[]);l.useEffect(()=>{p&&!t?ee(y||void 0):p||(ce([]),T(null),Ce(""))},[p,ee,t]),l.useEffect(()=>{if(!p||t)return;const s=setTimeout(()=>{ee(y||void 0),T(null)},300);return()=>clearTimeout(s)},[y,p,ee,t]),l.useEffect(()=>{if(!p||!N)return;const s=k.getState().areas.get(N);if(s!=null&&s.directories&&s.directories.length>0){$(s.directories[0]);return}const n=Array.from(k.getState().agents.values()).filter(g=>{var z;return((z=k.getAreaForAgent(g.id))==null?void 0:z.id)===N&&g.cwd});if(n.length===0)return;const o=new Map;for(const g of n)o.set(g.cwd,(o.get(g.cwd)||0)+1);let i="",h=0;for(const[g,z]of o)z>h&&(i=g,h=z);i&&$(i)},[p,N]),l.useEffect(()=>{if(p){const s=new Set(Array.from(k.getState().agents.values()).map(h=>h.name)),n=Oe(s,le),o=m.find(h=>h.id===r),i=o?`${o.name} ${n}`:n;b(i),Q.current&&(Q.current.focus(),Q.current.select())}},[p,le]),l.useEffect(()=>{if(!p)return;const s=m.find(n=>n.id===r);if(s){const n=m.find(o=>u.startsWith(o.name+" "));if(n){const o=u.substring(n.name.length+1);b(`${s.name} ${o}`)}else b(`${s.name} ${u}`)}else{const n=m.find(o=>u.startsWith(o.name+" "));if(n){const o=u.substring(n.name.length+1);b(o)}}},[r]),l.useEffect(()=>{r==="boss"&&de("claude-opus-4-8[1m]")},[r]);const es=()=>{var i;console.log("[SpawnModal] handleSpawn called"),W(!1);const s=(t==null?void 0:t.cwd)||D&&((i=A.find(h=>h.sessionId===D))==null?void 0:i.projectPath)||y;if(console.log("[SpawnModal] Effective CWD:",s),console.log("[SpawnModal] Agent name:",u),console.log("[SpawnModal] Agent class:",r),console.log("[SpawnModal] Permission mode:",K),console.log("[SpawnModal] Provider:",c),console.log("[SpawnModal] Use Chrome:",B),console.log("[SpawnModal] Session ID:",D||"none"),!s.trim()){console.error("[SpawnModal] Empty CWD, showing error"),W(!0);return}if(!u.trim()){console.log("[SpawnModal] Empty name, regenerating");const h=new Set(Array.from(k.getState().agents.values()).map(g=>g.name));b(Oe(h,le));return}gs(ue.LAST_CWD,s),P(!0),M();const n=Array.from(re),o=Ee.trim()||void 0;console.log("[SpawnModal] Calling store.spawnAgent with:",{name:u.trim(),class:r,cwd:s.trim(),sessionId:D||void 0,useChrome:c==="claude"?B:!1,permissionMode:K,provider:c,codexConfig:c==="codex"?j:void 0,codexModel:c==="codex"?J:void 0,opencodeModel:c==="opencode"?X:void 0,grokModel:c==="grok"?O:void 0,piModel:c==="pi"&&Y||void 0,initialSkillIds:n,model:c==="claude"?F:void 0,customInstructions:o?`${o.length} chars`:void 0,spawnAreaId:N||void 0}),window.__spawnModalAreaContext=N?{areaId:N}:null,k.spawnAgent(u.trim(),r,s.trim(),Ue||void 0,D||void 0,c==="claude"?B:!1,K,n,c,c==="codex"?j:void 0,c==="codex"?J:void 0,c==="claude"?F:void 0,o,c==="claude"||c==="grok"||c==="pi"?H:void 0,c==="opencode"?X:void 0,c==="grok"?O:void 0,c==="pi"&&Y||void 0)},_e=()=>{console.log("[SpawnModal] Agent creation successful"),P(!1),b(""),ie(new Set),U(),S(),v()},Le=()=>{console.error("[SpawnModal] Agent creation failed"),P(!1),W(!0),U(),S()},$e=s=>{console.log("[SpawnModal] Directory not found:",s),P(!1),Ne(s),oe(!0),S()},Pe=()=>{oe(!1),P(!0),M(),k.createDirectoryAndSpawn(ve,u.trim(),r)},me=()=>{oe(!1),Ne(""),U()};l.useEffect(()=>(window.__spawnModalSuccess=_e,window.__spawnModalError=Le,window.__spawnModalDirNotFound=$e,()=>{U(),delete window.__spawnModalSuccess,delete window.__spawnModalError,delete window.__spawnModalDirNotFound}),[u,r,_e,Le,$e,U]);const{handleMouseDown:ss,handleClick:as}=ps(v),ns=s=>{s.key==="Escape"&&v()};return!p&&!ge?null:ge?e.jsx("div",{className:"modal-overlay visible",onClick:me,onKeyDown:s=>{s.key==="Escape"&&me(),s.key==="Enter"&&Pe()},children:e.jsxs("div",{className:"modal confirm-modal",onClick:s=>s.stopPropagation(),children:[e.jsx("div",{className:"modal-header",children:a("terminal:spawn.directoryNotFound")}),e.jsxs("div",{className:"modal-body confirm-modal-body",children:[e.jsx("p",{children:a("terminal:spawn.directoryNotExist")}),e.jsx("code",{className:"confirm-modal-path",children:ve}),e.jsx("p",{children:a("terminal:spawn.wouldYouCreate")})]}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{className:"btn btn-secondary",onClick:me,children:a("common:buttons.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:Pe,autoFocus:!0,children:a("terminal:spawn.createDirectory")})]})]})}):e.jsx("div",{className:`modal-overlay ${p?"visible":""}`,onMouseDown:ss,onClick:as,onKeyDown:ns,children:e.jsxs("div",{className:"modal spawn-modal",children:[e.jsx("div",{className:"modal-header",children:t?"Restore conversation to new agent":a("terminal:spawn.deployTitle")}),e.jsxs("div",{className:"modal-body spawn-modal-body",children:[t&&e.jsxs("div",{className:"spawn-restore-banner",children:[e.jsx(ne,{name:"history",size:16}),e.jsxs("div",{children:[e.jsx("strong",{children:"Conversation ready to restore"}),e.jsxs("span",{children:[t.provider,t.model?` · ${t.model}`:""," · ",t.sessionId.slice(0,8),"…"]})]}),e.jsx("span",{className:"spawn-restore-banner-hint",children:"Choose the new agent's characteristics below"})]}),e.jsxs("div",{className:"spawn-section",children:[e.jsxs("div",{className:"spawn-section-header",children:[e.jsx("h4",{className:"spawn-section-title",children:a("terminal:spawn.agentClass")}),e.jsx("span",{className:"spawn-section-hint",children:(d==null?void 0:d.name)||r})]}),e.jsxs("div",{className:"spawn-top-section",children:[e.jsxs("div",{className:"spawn-preview-compact",children:[e.jsx(ms,{agentClass:Ze,modelFile:Ye,customModelUrl:Qe,modelScale:Ve,width:110,height:130}),e.jsx("div",{className:"spawn-preview-label",children:(d==null?void 0:d.name)||r})]}),e.jsxs("div",{className:"spawn-class-section",children:[m.length+he.length>6&&e.jsx("input",{type:"text",className:"spawn-input class-search-input",placeholder:a("terminal:spawn.filterClasses"),value:w,onChange:s=>qe(s.target.value)}),e.jsxs("div",{className:"class-selector-inline",children:[V.map(s=>e.jsxs("button",{className:`class-chip ${r===s.id?"selected":""}`,onClick:()=>E(s.id),title:s.description,children:[e.jsx(Fe,{classId:s.id,size:18,className:"class-chip-icon"}),e.jsx("span",{className:"class-chip-name",children:s.name})]},s.id)),Z.map(s=>{const n=Re[s.id];return e.jsxs("button",{className:`class-chip ${r===s.id?"selected":""}`,onClick:()=>E(s.id),title:n.description,children:[e.jsx(Fe,{classId:s.id,size:18,className:"class-chip-icon"}),e.jsx("span",{className:"class-chip-name",children:s.name})]},s.id)}),w&&V.length===0&&Z.length===0&&e.jsx("div",{className:"class-search-empty",children:a("terminal:spawn.noClassesMatch",{query:w})})]})]})]}),e.jsxs("div",{className:"spawn-form-row",children:[e.jsxs("div",{className:"spawn-field",children:[e.jsx("label",{className:"spawn-label",children:a("common:labels.name")}),e.jsx("input",{ref:Q,type:"text",className:"spawn-input",placeholder:a("terminal:spawn.agentNamePlaceholder"),value:u,onChange:s=>b(s.target.value)})]}),e.jsxs("div",{className:"spawn-field spawn-field-wide",children:[e.jsxs("label",{className:"spawn-label",children:[a("terminal:spawn.workingDir"),e.jsx(f,{text:a("terminal:spawn.helpWorkingDir"),title:a("terminal:spawn.workingDir"),position:"top",size:"sm"})]}),e.jsx(us,{value:y,onChange:s=>{$(s),W(!1)},placeholder:a("terminal:spawn.workingDirPlaceholder"),className:`spawn-input ${ze?"error":""}`,directoriesOnly:!0})]})]})]}),e.jsxs("div",{className:"spawn-section",children:[e.jsx("div",{className:"spawn-section-header",children:e.jsx("h4",{className:"spawn-section-title",children:a("terminal:spawn.selectRuntime")})}),e.jsxs("div",{className:"spawn-form-row",children:[e.jsxs("div",{className:"spawn-field",children:[e.jsxs("label",{className:"spawn-label",children:[a("common:labels.runtime"),e.jsx(f,{text:a("terminal:spawn.helpRuntime"),title:a("terminal:spawn.runtimeTitle"),position:"top",size:"sm"})]}),e.jsxs("div",{className:"spawn-select-row",children:[e.jsxs("button",{className:`spawn-select-btn ${c==="claude"?"selected":""}`,onClick:()=>I("claude"),disabled:!!t,title:t?"Runtime is fixed by the restored conversation":a("terminal:spawn.useClaudeCli"),children:[e.jsx("img",{src:"/assets/claude.ico",alt:"Claude",className:"spawn-provider-icon"}),e.jsx("span",{children:"Claude"})]}),e.jsxs("button",{className:`spawn-select-btn ${c==="codex"?"selected":""}`,onClick:()=>I("codex"),disabled:!!t,title:t?"Runtime is fixed by the restored conversation":a("terminal:spawn.useCodexCli"),children:[e.jsx("img",{src:"/assets/codex.ico",alt:"Codex",className:"spawn-provider-icon"}),e.jsx("span",{children:"Codex"})]}),e.jsxs("button",{className:`spawn-select-btn spawn-select-btn--opencode ${c==="opencode"?"selected":""}`,onClick:()=>I("opencode"),disabled:!!t,title:t?"Runtime is fixed by the restored conversation":"Use OpenCode CLI (multi-provider)",children:[e.jsx("img",{src:"/assets/opencode.svg",alt:"OpenCode",className:"spawn-provider-icon"}),e.jsx("span",{children:"OpenCode"})]}),e.jsxs("button",{className:`spawn-select-btn spawn-select-btn--grok ${c==="grok"?"selected":""}`,onClick:()=>I("grok"),disabled:!!t,title:t?"Runtime is fixed by the restored conversation":"Use Grok CLI (headless)",children:[e.jsx("img",{src:"/assets/grok.png",alt:"Grok",className:"spawn-provider-icon"}),e.jsx("span",{children:"Grok"})]}),e.jsxs("button",{className:`spawn-select-btn spawn-select-btn--pi ${c==="pi"?"selected":""}`,onClick:()=>I("pi"),disabled:!!t,title:t?"Runtime is fixed by the restored conversation":"Use Pi coding agent CLI (multi-provider)",children:[e.jsx("img",{src:"/assets/pi.svg",alt:"Pi",className:"spawn-provider-icon"}),e.jsx("span",{children:"Pi"})]})]})]}),e.jsxs("div",{className:"spawn-field",children:[e.jsxs("label",{className:"spawn-label",children:[a("common:labels.permissions"),e.jsx(f,{text:a("terminal:spawn.helpPermission"),title:a("terminal:spawn.permissionMode"),position:"top",size:"sm"})]}),e.jsx("div",{className:"spawn-select-row",children:Object.keys(xe).map(s=>e.jsxs("button",{className:`spawn-select-btn ${K===s?"selected":""}`,onClick:()=>Be(s),title:xe[s].description,children:[e.jsx("span",{children:e.jsx(ne,{name:s==="bypass"?"bolt":"lock",size:12})}),e.jsx("span",{children:xe[s].label})]},s))})]})]}),e.jsx("div",{className:"spawn-form-row",children:e.jsxs("div",{className:"spawn-field",children:[e.jsxs("label",{className:"spawn-label",children:[a("common:labels.model"),e.jsx(f,{text:a("terminal:spawn.helpModel"),title:a("terminal:spawn.modelTitle"),position:"top",size:"sm"})]}),c==="claude"?e.jsx("div",{className:"spawn-select-row spawn-select-row--wrap",children:Object.keys(L).filter(s=>!L[s].deprecated||F===s).map(s=>e.jsxs("button",{className:`spawn-select-btn ${F===s?"selected":""}`,onClick:()=>de(s),title:L[s].description,children:[e.jsx("span",{children:L[s].icon}),e.jsx("span",{children:L[s].label})]},s))}):c==="codex"?e.jsx("div",{className:"spawn-select-row spawn-select-row--codex-models",children:Object.keys(G).map(s=>e.jsxs("button",{className:`spawn-select-btn ${J===s?"selected":""}`,onClick:()=>ke(s),title:G[s].description,children:[e.jsx("span",{children:G[s].icon}),e.jsx("span",{children:G[s].label})]},s))}):c==="opencode"?e.jsx(hs,{value:X,onChange:Me,inputId:"spawn-opencode-model"}):c==="grok"?e.jsx("div",{className:"spawn-select-row spawn-select-row--wrap",children:Object.keys(te).map(s=>e.jsxs("button",{className:`spawn-select-btn ${O===s?"selected":""}`,onClick:()=>Se(s),title:te[s].description,children:[e.jsx("span",{children:te[s].icon}),e.jsx("span",{children:te[s].label})]},s))}):c==="pi"?e.jsx(ws,{value:Y,onChange:ye,inputId:"spawn-pi-model"}):e.jsx("div",{className:"spawn-inline-hint",children:a("terminal:spawn.chooseCodexModel")}),e.jsx(xs,{provider:c,claudeModel:F,codexModel:J,opencodeModel:X,grokModel:O,piModel:Y})]})}),e.jsxs("div",{className:"spawn-form-row",children:[(c==="claude"||c==="grok"||c==="pi")&&e.jsxs("div",{className:"spawn-field",children:[e.jsx("label",{className:"spawn-label",children:"Effort"}),e.jsxs("div",{className:"spawn-select-row spawn-select-row--effort",children:[e.jsx("button",{className:`spawn-select-btn spawn-select-btn--compact ${H===void 0?"selected":""}`,onClick:()=>pe(void 0),title:"Use default effort level",children:e.jsx("span",{children:"Default"})}),Object.keys(ae).filter(s=>c!=="grok"||fs(O,s)||H===s).map(s=>e.jsx("button",{className:`spawn-select-btn spawn-select-btn--compact ${H===s?"selected":""}`,onClick:()=>pe(s),title:ae[s].description,children:e.jsx("span",{children:ae[s].label})},s))]})]}),e.jsxs("div",{className:"spawn-field",children:[e.jsx("label",{className:"spawn-label",children:a("terminal:spawn.browser")}),e.jsxs("label",{className:"spawn-checkbox",children:[e.jsx("input",{type:"checkbox",checked:B,onChange:s=>We(s.target.checked),disabled:c!=="claude"}),e.jsxs("span",{children:[e.jsx(ne,{name:"globe",size:12})," ",a("terminal:spawn.chromeBrowser")]}),e.jsx(f,{text:a(c==="claude"?"terminal:spawn.helpChrome":"terminal:spawn.helpChromeDisabled"),title:a("terminal:spawn.chromeBrowser"),position:"top",size:"sm"})]})]})]}),c==="codex"&&e.jsxs("div",{className:"codex-config-section",children:[e.jsx("div",{className:"codex-config-title",children:a("terminal:spawn.codex.configuration")}),e.jsxs("div",{className:"codex-config-options",children:[e.jsxs("div",{className:"codex-option-group",children:[e.jsxs("label",{className:"spawn-checkbox",children:[e.jsx("input",{type:"checkbox",checked:j.fullAuto!==!1,onChange:s=>C(n=>({...n,fullAuto:s.target.checked}))}),e.jsx("span",{children:a("terminal:spawn.codex.fullAuto")}),e.jsx(f,{text:a("terminal:spawn.helpFullAuto"),title:a("terminal:spawn.fullAutoTitle"),position:"top",size:"sm"})]}),e.jsxs("label",{className:"spawn-checkbox",children:[e.jsx("input",{type:"checkbox",checked:!!j.search,onChange:s=>C(n=>({...n,search:s.target.checked}))}),e.jsx("span",{children:a("terminal:spawn.codex.search")}),e.jsx(f,{text:a("terminal:spawn.helpSearch"),title:a("terminal:spawn.searchTitle"),position:"top",size:"sm"})]})]}),j.fullAuto===!1&&e.jsxs("div",{className:"codex-option-group",children:[e.jsx("div",{className:"codex-option-header",children:a("terminal:spawn.codex.restrictions")}),e.jsxs("select",{className:"spawn-input codex-select",value:j.sandbox||"workspace-write",onChange:s=>C(n=>({...n,sandbox:s.target.value})),children:[e.jsxs("option",{value:"read-only",children:["📖 ",a("terminal:spawn.codex.sandboxReadOnly")]}),e.jsxs("option",{value:"workspace-write",children:["✏️ ",a("terminal:spawn.codex.sandboxWorkspaceWrite")]}),e.jsxs("option",{value:"danger-full-access",children:["⚡ ",a("terminal:spawn.codex.sandboxDangerFullAccess")]})]}),e.jsxs("select",{className:"spawn-input codex-select",value:j.approvalMode||"on-request",onChange:s=>C(n=>({...n,approvalMode:s.target.value})),children:[e.jsxs("option",{value:"untrusted",children:["🔒 ",a("terminal:spawn.codex.approvalsUntrusted")]}),e.jsxs("option",{value:"on-failure",children:["⚠️ ",a("terminal:spawn.codex.approvalsOnFailure")]}),e.jsxs("option",{value:"on-request",children:["🤔 ",a("terminal:spawn.codex.approvalsOnRequest")]}),e.jsxs("option",{value:"never",children:["✅ ",a("terminal:spawn.codex.approvalsNever")]})]})]}),e.jsxs("div",{className:"codex-option-group",children:[e.jsx("div",{className:"codex-option-header",children:a("terminal:spawn.codex.profile")}),e.jsx("input",{type:"text",className:"spawn-input codex-profile-input",placeholder:a("terminal:spawn.codex.profilePlaceholder"),value:j.profile||"",onChange:s=>C(n=>({...n,profile:s.target.value||void 0}))})]}),e.jsxs("div",{className:"codex-option-group",children:[e.jsx("div",{className:"codex-option-header",children:a("terminal:spawn.codex.reasoningEffort")}),e.jsxs("select",{className:"spawn-input codex-select",value:j.reasoningEffort||"",onChange:s=>C(n=>({...n,reasoningEffort:s.target.value||void 0})),children:[e.jsx("option",{value:"",children:a("terminal:spawn.codex.reasoningEffortDefault")}),Object.keys(se).map(s=>e.jsxs("option",{value:s,children:[se[s].icon," ",se[s].label]},s))]})]})]})]})]}),x.length>0&&e.jsxs("div",{className:"spawn-section spawn-skills-section",children:[e.jsxs("div",{className:"spawn-section-header",children:[e.jsxs("h4",{className:"spawn-section-title",children:[a("terminal:spawn.skills"),e.jsx(f,{text:a("terminal:spawn.helpSkills"),title:a("terminal:spawn.skillsTitle"),position:"top",size:"sm"})]}),e.jsxs("span",{className:"spawn-section-hint",children:[re.size," selected · ",a("common:labels.optional")]})]}),x.length>6&&e.jsx("input",{type:"text",className:"spawn-input skill-search-input",placeholder:a("terminal:spawn.filterSkills"),value:_,onChange:s=>He(s.target.value)}),e.jsxs("div",{className:"spawn-skills-inline",children:[De.map(s=>{const n=re.has(s.id);return Xe.some(i=>i.id===s.id)?null:e.jsxs("button",{className:`spawn-skill-chip ${n?"selected":""}`,onClick:()=>Je(s.id),title:s.description,children:[n&&e.jsx("span",{className:"spawn-skill-check",children:e.jsx(ne,{name:"check",size:10})}),e.jsx("span",{children:s.name}),s.builtin&&e.jsx("span",{className:"spawn-skill-builtin",children:"TC"})]},s.id)}),_&&De.length===0&&e.jsx("div",{className:"skill-search-empty",children:a("terminal:spawn.noSkillsMatch",{query:_})})]})]}),e.jsxs("details",{className:"spawn-advanced",children:[e.jsx("summary",{children:t?a("terminal:spawn.customInstructions"):`${a("terminal:spawn.customInstructions")} & ${a("terminal:spawn.linkSession")}`}),e.jsxs("div",{className:"spawn-advanced-body",children:[e.jsxs("div",{className:"spawn-custom-instructions-section",children:[e.jsxs("label",{className:"spawn-label",children:[a("terminal:spawn.customInstructions")," ",e.jsxs("span",{className:"spawn-label-hint",children:["(",a("common:labels.optional"),")"]}),e.jsx(f,{text:a("terminal:spawn.helpCustomInstructions"),title:a("terminal:spawn.customInstructions"),position:"top",size:"sm"})]}),e.jsx("textarea",{className:"spawn-input spawn-textarea",placeholder:a("terminal:spawn.customInstructionsPlaceholder"),value:Ee,onChange:s=>Ke(s.target.value),rows:3})]}),!t&&e.jsxs("div",{className:"spawn-sessions-section",children:[e.jsxs("label",{className:"spawn-label",children:[a("terminal:spawn.linkSession")," ",e.jsxs("span",{className:"spawn-label-hint",children:["(",a("common:labels.optional"),")"]}),e.jsx(f,{text:a("terminal:spawn.helpLinkSession"),title:a("terminal:spawn.linkSessionTitle"),position:"top",size:"sm"})]}),A.length>0&&e.jsx("input",{type:"text",className:"spawn-input session-search-input",placeholder:a("terminal:spawn.searchSessions"),value:R,onChange:s=>Ce(s.target.value)}),e.jsx("div",{className:"sessions-list",children:Ge?e.jsx("div",{className:"sessions-loading",children:a("terminal:spawn.loadingSessions")}):A.length===0?e.jsx("div",{className:"sessions-empty",children:a("terminal:spawn.noSessions")}):Ie.length===0?e.jsx("div",{className:"sessions-empty",children:a("terminal:spawn.noSessionsMatch",{query:R})}):Ie.map(s=>{const n=D===s.sessionId,o=Date.now()-new Date(s.lastModified).getTime(),i=o<6e4?a("common:time.justNow"):o<36e5?a("common:time.minutesAgo",{count:Math.floor(o/6e4)}):o<864e5?a("common:time.hoursAgo",{count:Math.floor(o/36e5)}):a("common:time.daysAgo",{count:Math.floor(o/864e5)});return e.jsxs("div",{className:`session-item ${n?"selected":""}`,onClick:()=>{n?T(null):(T(s.sessionId),$(s.projectPath))},children:[e.jsxs("div",{className:"session-item-header",children:[e.jsx("span",{className:"session-item-path",children:s.projectPath}),e.jsx("span",{className:"session-item-age",children:i})]}),e.jsx("div",{className:"session-item-preview",children:s.firstMessage||a("terminal:spawn.messagesCount",{count:s.messageCount})})]},s.sessionId)})})]})]})]})]}),e.jsxs("div",{className:"modal-footer",children:[e.jsx("button",{className:"btn btn-secondary",onClick:v,children:a("common:buttons.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:es,disabled:je,children:je?t?"Restoring…":a("common:buttons.deploying"):t?"Restore conversation":a("common:buttons2.deploy")})]})]})})}export{Ms as SpawnModal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-jkxx9VU-.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-CloPxFmQ.js";import{_ as i}from"./mermaid.core-jkxx9VU-.js";import"./chunk-5VM5RSS4-D9K_iBqe.js";import"./chunk-XXDRQBXY-CYQuP2YZ.js";import"./chunk-VR4S4FIN-B_gj6T5J.js";import"./chunk-32BRIVSS-CBsYvxtB.js";import"./main-Bt4E0_YW.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-CloPxFmQ.js";import{_ as i}from"./mermaid.core-jkxx9VU-.js";import"./chunk-5VM5RSS4-D9K_iBqe.js";import"./chunk-XXDRQBXY-CYQuP2YZ.js";import"./chunk-VR4S4FIN-B_gj6T5J.js";import"./chunk-32BRIVSS-CBsYvxtB.js";import"./main-Bt4E0_YW.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-Bt4E0_YW.js";import{g as Rn}from"./area-logos-Dr_ZUFxK.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};
|