tide-commander 1.217.0 → 1.218.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/assets/{AudioPlayer-wYzUPbI7.js → AudioPlayer-BU35uTDo.js} +1 -1
  3. package/dist/assets/{BossLogsModal-CmZNDIpu.js → BossLogsModal-D49SwElp.js} +1 -1
  4. package/dist/assets/{BossSpawnModal-DtVfSG5G.js → BossSpawnModal-Bgk7exUu.js} +1 -1
  5. package/dist/assets/{ControlsModal-C0tQf4xy.js → ControlsModal-DgTDBUCe.js} +1 -1
  6. package/dist/assets/{DockerLogsModal-DL_eRO-m.js → DockerLogsModal-C183oCfD.js} +1 -1
  7. package/dist/assets/{EmbeddedEditor-DAr7_QUH.js → EmbeddedEditor-ClzdWo_U.js} +1 -1
  8. package/dist/assets/{FcStdViewer-MDGJiz2T.js → FcStdViewer-59S072wF.js} +1 -1
  9. package/dist/assets/{GcodeViewer-BHVydtrp.js → GcodeViewer-DReIiHNj.js} +1 -1
  10. package/dist/assets/{GlbViewer-Bwr_Tayz.js → GlbViewer-D2pSoe0t.js} +1 -1
  11. package/dist/assets/{GmailOAuthSetup-D_uF2cyB.js → GmailOAuthSetup-DKlrbd-z.js} +1 -1
  12. package/dist/assets/{GoogleOAuthSetup-BCmzQl5e.js → GoogleOAuthSetup-BrZMful8.js} +1 -1
  13. package/dist/assets/{IframeModal-CQmCu_P4.js → IframeModal-eHhpdAUr.js} +1 -1
  14. package/dist/assets/{IntegrationsPanel-BmRLC7dz.js → IntegrationsPanel-Ch_7Mixq.js} +2 -2
  15. package/dist/assets/{LogViewerModal-CrnaI78u.js → LogViewerModal-CHQHQhmq.js} +1 -1
  16. package/dist/assets/{MonitoringModal-C6J4g3Jf.js → MonitoringModal-CfNXUJeT.js} +1 -1
  17. package/dist/assets/{PM2LogsModal-Ds3dRnuE.js → PM2LogsModal-CnjSHdiK.js} +1 -1
  18. package/dist/assets/{PluginsPanel-BWG2NKdJ.js → PluginsPanel-DiN979jU.js} +1 -1
  19. package/dist/assets/{RestoreArchivedAreaModal-BNccBE4Z.js → RestoreArchivedAreaModal-BpEjAVuV.js} +1 -1
  20. package/dist/assets/{Scene2DCanvas-CPvMvm9m.js → Scene2DCanvas-BOZhpvt1.js} +1 -1
  21. package/dist/assets/{SceneManager-lb8uiOCO.js → SceneManager-DWKXzRqi.js} +1 -1
  22. package/dist/assets/{SkillsPanel-BTO2Ow7t.js → SkillsPanel-Dc_S8gzp.js} +1 -1
  23. package/dist/assets/{SlackMultiInstanceSetup-Da_GWe5W.js → SlackMultiInstanceSetup-CWXANgYs.js} +1 -1
  24. package/dist/assets/{SpawnModal-JbFRYxZa.js → SpawnModal-CbYA9pn9.js} +1 -1
  25. package/dist/assets/{StatisticsModal-ChSnL5yu.js → StatisticsModal-DKkoc51h.js} +1 -1
  26. package/dist/assets/{StlViewer-BFr-I14v.js → StlViewer-DqpLp63P.js} +1 -1
  27. package/dist/assets/{SubordinateAssignmentModal-DchdwFLE.js → SubordinateAssignmentModal-BYQOXqH2.js} +1 -1
  28. package/dist/assets/{ThreeAreaSelector-D18G4udc.js → ThreeAreaSelector-DbvsMWLv.js} +1 -1
  29. package/dist/assets/{ThreeViewShortcuts-vNiMNFPJ.js → ThreeViewShortcuts-D3xDKZDg.js} +1 -1
  30. package/dist/assets/{TriggerManagerPanel-DjpLl7cf.js → TriggerManagerPanel-BIEiiB0F.js} +1 -1
  31. package/dist/assets/{VideoPlayer-Drj9r9Dx.js → VideoPlayer-CZ2icmjn.js} +1 -1
  32. package/dist/assets/{WorkflowEditorPanel-DLwkYQ8M.js → WorkflowEditorPanel-B2L4VASD.js} +1 -1
  33. package/dist/assets/{abnfDiagram-VRR7QNED-BVuUyMTx.js → abnfDiagram-VRR7QNED-ryySwhVB.js} +1 -1
  34. package/dist/assets/{arc-_phD079o.js → arc-TgqX_heu.js} +1 -1
  35. package/dist/assets/{architectureDiagram-ZJ3FMSHR-B7fAK4WF.js → architectureDiagram-ZJ3FMSHR-CBvaslRl.js} +1 -1
  36. package/dist/assets/{area-logos-RCA-q_Vf.js → area-logos-D4VAmxJY.js} +1 -1
  37. package/dist/assets/{blockDiagram-677ZJIJ3-C-OlY0-3.js → blockDiagram-677ZJIJ3-CjqntcUt.js} +1 -1
  38. package/dist/assets/{c4Diagram-LMCZKHZV-DrwXTZgK.js → c4Diagram-LMCZKHZV-JOcgicYy.js} +1 -1
  39. package/dist/assets/channel-4Acwen4U.js +1 -0
  40. package/dist/assets/{chunk-2Q5K7J3B-DCcJNg3d.js → chunk-2Q5K7J3B-Bpe3_0eg.js} +1 -1
  41. package/dist/assets/{chunk-32BRIVSS-CZZkOSIs.js → chunk-32BRIVSS-Bzixr9TC.js} +1 -1
  42. package/dist/assets/{chunk-5VM5RSS4-BCFrP-q5.js → chunk-5VM5RSS4-k5-E-nAB.js} +1 -1
  43. package/dist/assets/{chunk-EX3LRPZG-Bjnq5732.js → chunk-EX3LRPZG-BRhp3Q-r.js} +1 -1
  44. package/dist/assets/{chunk-JWPE2WC7-CPjRN_WZ.js → chunk-JWPE2WC7-BNXpKFbW.js} +1 -1
  45. package/dist/assets/{chunk-MOJQB5TN-B6jVWpSe.js → chunk-MOJQB5TN-M1rwnbfN.js} +1 -1
  46. package/dist/assets/{chunk-RYQCIY6F-0QrHhHTV.js → chunk-RYQCIY6F-DICAsMV6.js} +1 -1
  47. package/dist/assets/{chunk-V7JOEXUC-DwLSEIop.js → chunk-V7JOEXUC-Cl3na5KS.js} +1 -1
  48. package/dist/assets/{chunk-VR4S4FIN-R-sa6MjG.js → chunk-VR4S4FIN-C1i0aRRM.js} +1 -1
  49. package/dist/assets/{chunk-XXDRQBXY-FuYmcHPd.js → chunk-XXDRQBXY-B9ncDDik.js} +1 -1
  50. package/dist/assets/classDiagram-OUVF2IWQ-ChFbWxiV.js +1 -0
  51. package/dist/assets/classDiagram-v2-EOCWNBFH-ChFbWxiV.js +1 -0
  52. package/dist/assets/{cose-bilkent-JH36ORCC-CvD5NdQ_.js → cose-bilkent-JH36ORCC-BgJ0QFpw.js} +1 -1
  53. package/dist/assets/{cynefin-VYW2F7L2-C8_VnooS.js → cynefin-VYW2F7L2-BSrO1EZm.js} +1 -1
  54. package/dist/assets/{cynefinDiagram-TSTJHNR4-SD_F8ul6.js → cynefinDiagram-TSTJHNR4-DxG0EKrw.js} +1 -1
  55. package/dist/assets/{dagre-VKFMJZFB-Cpeo3cpw.js → dagre-VKFMJZFB-BFcAu0KK.js} +1 -1
  56. package/dist/assets/{diagram-FQU43EPY-DsBnlRvM.js → diagram-FQU43EPY-MjLThK-e.js} +1 -1
  57. package/dist/assets/{diagram-G47NLZAW-BHMRe5db.js → diagram-G47NLZAW-30PERw4M.js} +1 -1
  58. package/dist/assets/{diagram-NH7WQ7WH-D8Rm6qlg.js → diagram-NH7WQ7WH-_o5yBpv1.js} +1 -1
  59. package/dist/assets/{diagram-OA4YK3LP-C4Svb0Zw.js → diagram-OA4YK3LP-DWzw17M1.js} +1 -1
  60. package/dist/assets/{diagram-WEI45ONY-BbFXrI2b.js → diagram-WEI45ONY-DUiBSsAu.js} +1 -1
  61. package/dist/assets/{ebnfDiagram-CCIWWBDH-CCBonTYH.js → ebnfDiagram-CCIWWBDH-BvfeLGVP.js} +1 -1
  62. package/dist/assets/{erDiagram-Q63AITRT-CGGw9uIx.js → erDiagram-Q63AITRT-CcGVeI78.js} +1 -1
  63. package/dist/assets/{flowDiagram-23GEKE2U-DWxHXzyo.js → flowDiagram-23GEKE2U-BaxQK1yy.js} +1 -1
  64. package/dist/assets/{ganttDiagram-NO4QXBWP-D74TSIvX.js → ganttDiagram-NO4QXBWP-BoagKKM_.js} +1 -1
  65. package/dist/assets/{gitGraphDiagram-IHSO6WYX-Cwv5rBxw.js → gitGraphDiagram-IHSO6WYX-CK3MKH5Y.js} +1 -1
  66. package/dist/assets/{index-B9rURqfo.js → index-BppBZhor.js} +1 -1
  67. package/dist/assets/{index-DW1gJ5Cs.js → index-BujRjFVV.js} +1 -1
  68. package/dist/assets/{index-BMXP1Yd8.js → index-CqgOl9zs.js} +3 -3
  69. package/dist/assets/{index-6lLWOBQK.js → index-DL7aFkI7.js} +1 -1
  70. package/dist/assets/{index-s33Ke8oj.js → index-DN6BcPrZ.js} +2 -2
  71. package/dist/assets/{index-DrIXfMcD.js → index-DmNqcx5v.js} +1 -1
  72. package/dist/assets/{index-BZztJf0b.js → index-SXH56b-h.js} +1 -1
  73. package/dist/assets/{index-DOcVAWbZ.js → index-fgJgEGu1.js} +1 -1
  74. package/dist/assets/{index-D-5PhYjN.js → index-qu-MNx34.js} +1 -1
  75. package/dist/assets/{infoDiagram-FWYZ7A6U-VSfMHDx9.js → infoDiagram-FWYZ7A6U-CFZJVVEZ.js} +1 -1
  76. package/dist/assets/{ishikawaDiagram-FXEZZL3T-CgWr16Qr.js → ishikawaDiagram-FXEZZL3T-B4jxlj5i.js} +1 -1
  77. package/dist/assets/{journeyDiagram-5HDEW3XC-Bv4ioJyG.js → journeyDiagram-5HDEW3XC-Di36Ke2R.js} +1 -1
  78. package/dist/assets/{kanban-definition-HUTT4EX6-DsUoZOQz.js → kanban-definition-HUTT4EX6-CfXuNtGm.js} +1 -1
  79. package/dist/assets/{linear-_3oDVafz.js → linear-kPN9OpYx.js} +1 -1
  80. package/dist/assets/{main-BKRg0DBA.js → main-9sJvXBYL.js} +160 -160
  81. package/dist/assets/{mermaid.core-spKo10MG.js → mermaid.core-BsJb1sx5.js} +4 -4
  82. package/dist/assets/{mindmap-definition-LN4V7U3C-C6uCJ4IN.js → mindmap-definition-LN4V7U3C-CmKQGyB-.js} +1 -1
  83. package/dist/assets/{pegDiagram-2B236MQR-BTIBB-Uw.js → pegDiagram-2B236MQR-CyT-8HHi.js} +1 -1
  84. package/dist/assets/{pieDiagram-ENE6RG2P-D7oP-ve7.js → pieDiagram-ENE6RG2P-ieekGcPa.js} +1 -1
  85. package/dist/assets/{quadrantDiagram-ABIIQ3AL-BfmcdARc.js → quadrantDiagram-ABIIQ3AL-CbWWbNLu.js} +1 -1
  86. package/dist/assets/{railroadDiagram-RFXS5EU6-CplgjUu4.js → railroadDiagram-RFXS5EU6-nRTVDuI2.js} +1 -1
  87. package/dist/assets/{requirementDiagram-TGXJPOKE-BiRTuy5B.js → requirementDiagram-TGXJPOKE-Da3qeFmb.js} +1 -1
  88. package/dist/assets/{sankeyDiagram-HTMAVEWB-C81HtBjy.js → sankeyDiagram-HTMAVEWB-CJctgFYp.js} +1 -1
  89. package/dist/assets/{sequenceDiagram-DBY2YBRQ-DFhPtqpN.js → sequenceDiagram-DBY2YBRQ-Bgo3ZLPq.js} +1 -1
  90. package/dist/assets/{sizeCapture-X5ZJPWSS-BkT4qJkY.js → sizeCapture-X5ZJPWSS-BYkiTkB_.js} +1 -1
  91. package/dist/assets/{stateDiagram-2N3HPSRC-CKvn1pfo.js → stateDiagram-2N3HPSRC-BbE4biWs.js} +1 -1
  92. package/dist/assets/stateDiagram-v2-6OUMAXLB-Bgw_r9Hj.js +1 -0
  93. package/dist/assets/{swimlanes-5IMT3BWC-D5WhCwkM.js → swimlanes-5IMT3BWC-Dia74-W4.js} +2 -2
  94. package/dist/assets/swimlanesDiagram-G3AALYLV-Bz9zuVSZ.js +8 -0
  95. package/dist/assets/{timeline-definition-FHXFAJF6-B-UTX_B8.js → timeline-definition-FHXFAJF6-BnpoOi8A.js} +1 -1
  96. package/dist/assets/{vennDiagram-L72KCM5P-DelObiCK.js → vennDiagram-L72KCM5P-B1qV_n6b.js} +1 -1
  97. package/dist/assets/{wardleyDiagram-EHGQE667-DCWJdXij.js → wardleyDiagram-EHGQE667-Ct40RXD2.js} +1 -1
  98. package/dist/assets/{web-C2DocoQz.js → web-C8vsfWIm.js} +1 -1
  99. package/dist/assets/{web-BOFBvPGv.js → web-D_9GMKcH.js} +1 -1
  100. package/dist/assets/{web-qtcj3i0F.js → web-DmbfztKE.js} +1 -1
  101. package/dist/assets/{xychartDiagram-FW5EYKEG-CzbE79ZQ.js → xychartDiagram-FW5EYKEG-BCIYfB3k.js} +1 -1
  102. package/dist/build-info.json +1 -1
  103. package/dist/index.html +1 -1
  104. package/dist/src/packages/server/app.js +8 -0
  105. package/dist/src/packages/server/index.js +8 -0
  106. package/dist/src/packages/server/integrations/slack/slack-polling-client.js +42 -3
  107. package/dist/src/packages/server/pi/backend.js +1 -0
  108. package/dist/src/packages/server/services/plugin-shell-command-service.js +22 -4
  109. package/dist/src/packages/server/services/pm2-service.js +21 -4
  110. package/dist/src/packages/server/utils/java-home.js +83 -0
  111. package/dist/src/packages/server/websocket/handler.js +16 -3
  112. package/dist/src/packages/shared/agent-types.js +5 -0
  113. package/package.json +2 -2
  114. package/scripts/dev-server.mjs +69 -0
  115. package/dist/assets/channel-BWg1ErwG.js +0 -1
  116. package/dist/assets/classDiagram-OUVF2IWQ-Cdy8Clus.js +0 -1
  117. package/dist/assets/classDiagram-v2-EOCWNBFH-Cdy8Clus.js +0 -1
  118. package/dist/assets/stateDiagram-v2-6OUMAXLB-blzdlH4v.js +0 -1
  119. package/dist/assets/swimlanesDiagram-G3AALYLV-BiOWb3s9.js +0 -8
@@ -0,0 +1,83 @@
1
+ /**
2
+ * JAVA_HOME repair.
3
+ *
4
+ * A dangling JAVA_HOME (the JDK it points to was removed on upgrade) makes
5
+ * every Maven/Gradle build crash on boot with "JAVA_HOME is not defined
6
+ * correctly". Under PM2 that turned into a restart storm (~90/s) that filled
7
+ * pm2.log with tens of GB. Tide inherits its env into every building and
8
+ * agent shell, so we sanitise it once at boot and again when spawning PM2.
9
+ */
10
+ import { existsSync, readdirSync, readlinkSync } from 'node:fs';
11
+ import { execFileSync } from 'node:child_process';
12
+ import path from 'node:path';
13
+ function hasJavaBinary(home) {
14
+ if (!home)
15
+ return false;
16
+ return existsSync(path.join(home, 'bin', 'java')) || existsSync(path.join(home, 'bin', 'java.exe'));
17
+ }
18
+ /** Candidate JDK roots, most specific first. Only existing, runnable ones are returned. */
19
+ function discoverJavaHomes() {
20
+ const found = [];
21
+ const push = (candidate) => {
22
+ if (candidate && hasJavaBinary(candidate) && !found.includes(candidate))
23
+ found.push(candidate);
24
+ };
25
+ // Linux alternatives (Fedora/RHEL: java_sdk; Debian: java resolves to .../bin/java)
26
+ for (const link of ['/etc/alternatives/java_sdk', '/etc/alternatives/java_home']) {
27
+ try {
28
+ push(readlinkSync(link));
29
+ }
30
+ catch { /* not present */ }
31
+ }
32
+ try {
33
+ const javaBin = readlinkSync('/etc/alternatives/java');
34
+ push(path.resolve(path.dirname(javaBin), '..'));
35
+ }
36
+ catch { /* not present */ }
37
+ // macOS
38
+ if (process.platform === 'darwin') {
39
+ try {
40
+ push(execFileSync('/usr/libexec/java_home', { encoding: 'utf8', timeout: 3000 }).trim());
41
+ }
42
+ catch { /* no JDK registered */ }
43
+ }
44
+ // Common install roots
45
+ for (const root of ['/usr/lib/jvm', '/usr/local/lib/jvm', '/opt/java', '/Library/Java/JavaVirtualMachines']) {
46
+ let entries = [];
47
+ try {
48
+ entries = readdirSync(root);
49
+ }
50
+ catch {
51
+ continue;
52
+ }
53
+ for (const entry of entries.sort().reverse()) {
54
+ push(path.join(root, entry));
55
+ push(path.join(root, entry, 'Contents', 'Home'));
56
+ }
57
+ }
58
+ return found;
59
+ }
60
+ /**
61
+ * Return a JAVA_HOME that actually contains bin/java: the configured one when
62
+ * valid, otherwise the best discovered JDK, otherwise null.
63
+ */
64
+ export function resolveJavaHome(configured = process.env.JAVA_HOME) {
65
+ if (hasJavaBinary(configured))
66
+ return configured;
67
+ return discoverJavaHomes()[0] ?? null;
68
+ }
69
+ /**
70
+ * Repair process.env.JAVA_HOME in place when it points at a JDK that no longer
71
+ * exists. Returns a description of what changed (for logging) or null.
72
+ */
73
+ export function repairProcessJavaHome() {
74
+ const configured = process.env.JAVA_HOME;
75
+ if (!configured || hasJavaBinary(configured))
76
+ return null;
77
+ const replacement = resolveJavaHome(undefined);
78
+ if (replacement)
79
+ process.env.JAVA_HOME = replacement;
80
+ else
81
+ delete process.env.JAVA_HOME;
82
+ return { from: configured, to: replacement };
83
+ }
@@ -329,7 +329,11 @@ export function init(server) {
329
329
  if (notifyOnly) {
330
330
  ws.__tcNotifyOnly = true;
331
331
  }
332
- log.log(`${notifyOnly ? 'Notification-only client' : 'Client'} connected (total: ${clients.size})`);
332
+ const clientInfo = ws.__tcClient;
333
+ const clientLabel = clientInfo
334
+ ? `from ${clientInfo.ip || '?'} origin=${clientInfo.origin || 'no-origin'} ua="${clientInfo.userAgent.slice(0, 60)}"`
335
+ : 'from unknown';
336
+ log.log(`${notifyOnly ? 'Notification-only client' : 'Client'} connected (total: ${clients.size}) ${clientLabel}`);
333
337
  if (!notifyOnly) {
334
338
  // Send initial state immediately – status sync runs in background
335
339
  // server_time goes FIRST: clients use it to align their clock with the
@@ -420,11 +424,20 @@ export function init(server) {
420
424
  log.error('Invalid message:', err, dataStr.substring(0, 100));
421
425
  }
422
426
  });
423
- ws.on('close', () => {
427
+ // Close code + reason + lifetime name the WHY: 1000/1001 with a reason is
428
+ // the client (unload, zombie kill, superseded), 1005/1006 without one is
429
+ // the transport dying underneath (network, proxy, sleeping device).
430
+ const connectedAtMs = Date.now();
431
+ ws.on('error', (err) => {
432
+ log.warn(`Client socket error ${clientLabel}: ${err instanceof Error ? err.message : String(err)}`);
433
+ });
434
+ ws.on('close', (code, reasonBuf) => {
424
435
  clients.delete(ws);
425
436
  setWsClientsCount(clients.size);
426
437
  gitWatchService.removeSocket(ws);
427
- log.log(`Client disconnected (remaining: ${clients.size})`);
438
+ const reason = reasonBuf?.toString() || '';
439
+ const lifeSec = Math.round((Date.now() - connectedAtMs) / 1000);
440
+ log.log(`Client disconnected (remaining: ${clients.size}) code=${code}${reason ? ` reason="${reason}"` : ''} after ${lifeSec}s ${clientLabel}`);
428
441
  });
429
442
  // Background sync – refreshes agent status after initial data is sent.
430
443
  // Any status flip it performs goes through agentService.updateAgent, whose
@@ -112,6 +112,11 @@ export const CODEX_REASONING_EFFORTS = {
112
112
  xhigh: { label: 'X-High', description: 'Extra-high reasoning, slowest', icon: '🧠' },
113
113
  };
114
114
  export const CODEX_MODELS = {
115
+ 'gpt-6-astra': {
116
+ label: 'GPT-6 Astra',
117
+ description: 'GPT-6 Astra — OpenAI frontier model (Sep 2026)',
118
+ icon: '✨',
119
+ },
115
120
  'gpt-5.6-luna': {
116
121
  label: 'GPT-5.6 Luna',
117
122
  description: 'GPT-5.6 Luna model',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tide-commander",
3
- "version": "1.217.0",
3
+ "version": "1.218.0",
4
4
  "description": "Visual multi-agent orchestrator and manager for Claude Code with 3D/2D interface",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  "scripts": {
21
21
  "dev": "concurrently \"bun run dev:client\" \"bun run dev:server\"",
22
22
  "dev:client": "vite",
23
- "dev:server": "tsx watch src/packages/server/index.ts",
23
+ "dev:server": "node scripts/dev-server.mjs",
24
24
  "docs:dev": "npm --prefix src/packages/landing run dev",
25
25
  "docs:build": "npm --prefix src/packages/landing run build",
26
26
  "docs:preview": "npm --prefix src/packages/landing run preview",
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ // Dev server launcher for `npm run dev:server`.
3
+ //
4
+ // `tsx watch` restarts the API on a change to ANY module the process has
5
+ // imported. External plugins (plugins/state.json `sourcePath`, loaded by the
6
+ // plugin manager through a dynamic import()) count, so editing a plugin's
7
+ // server.mjs in a sibling checkout restarted the whole commander: live exec
8
+ // registries, agent streams and WebSocket clients all dropped. This wrapper
9
+ // excludes every installed plugin root from the watcher. Plugins re-import
10
+ // with an mtime cache-bust on POST /api/plugins/:id/disable + /enable.
11
+ //
12
+ // Only relative --exclude patterns work: tsx hands them to chokidar, which
13
+ // matches against absolute paths, so `**/*.mjs` silently matches nothing.
14
+ import { spawn } from 'node:child_process';
15
+ import fs from 'node:fs';
16
+ import os from 'node:os';
17
+ import path from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+
20
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
21
+ const dataDir = path.join(
22
+ process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share'),
23
+ 'tide-commander',
24
+ );
25
+
26
+ function installedPluginRoots() {
27
+ try {
28
+ const raw = fs.readFileSync(path.join(dataDir, 'plugins', 'state.json'), 'utf8');
29
+ const state = JSON.parse(raw);
30
+ const roots = [];
31
+ for (const entry of state.installed ?? []) {
32
+ if (typeof entry?.sourcePath !== 'string') continue;
33
+ let root = entry.sourcePath;
34
+ try { root = fs.realpathSync(root); } catch { /* keep as configured */ }
35
+ // A plugin living inside the repo is normal source; leave it watched.
36
+ const rel = path.relative(repoRoot, root);
37
+ if (!rel || (!rel.startsWith('..') && !path.isAbsolute(rel))) continue;
38
+ roots.push(rel);
39
+ }
40
+ return roots;
41
+ } catch {
42
+ return [];
43
+ }
44
+ }
45
+
46
+ const excludes = installedPluginRoots();
47
+ const args = ['watch', '--clear-screen=false'];
48
+ for (const rel of excludes) args.push('--exclude', path.join(rel, '**'));
49
+ args.push('src/packages/server/index.ts');
50
+
51
+ if (excludes.length > 0) {
52
+ console.log(`[dev-server] excluding ${excludes.length} external plugin root(s) from tsx watch: ${excludes.join(', ')}`);
53
+ }
54
+
55
+ if (process.env.DEV_SERVER_PRINT_ARGS) {
56
+ console.log(JSON.stringify(args));
57
+ process.exit(0);
58
+ }
59
+
60
+ const tsxBin = path.join(repoRoot, 'node_modules', '.bin', process.platform === 'win32' ? 'tsx.cmd' : 'tsx');
61
+ const child = spawn(tsxBin, args, { cwd: repoRoot, stdio: 'inherit', shell: process.platform === 'win32' });
62
+
63
+ for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
64
+ process.on(signal, () => { child.kill(signal); });
65
+ }
66
+ child.on('exit', (code, signal) => {
67
+ if (signal) process.kill(process.pid, signal);
68
+ process.exit(code ?? 0);
69
+ });
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-spKo10MG.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-DwLSEIop.js";import{_ as i}from"./mermaid.core-spKo10MG.js";import"./chunk-5VM5RSS4-BCFrP-q5.js";import"./chunk-XXDRQBXY-FuYmcHPd.js";import"./chunk-VR4S4FIN-R-sa6MjG.js";import"./chunk-32BRIVSS-CZZkOSIs.js";import"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.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-DwLSEIop.js";import{_ as i}from"./mermaid.core-spKo10MG.js";import"./chunk-5VM5RSS4-BCFrP-q5.js";import"./chunk-XXDRQBXY-FuYmcHPd.js";import"./chunk-VR4S4FIN-R-sa6MjG.js";import"./chunk-32BRIVSS-CZZkOSIs.js";import"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.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 r,b as e,a,S as s}from"./chunk-EX3LRPZG-Bjnq5732.js";import{_ as i}from"./mermaid.core-spKo10MG.js";import"./chunk-XXDRQBXY-FuYmcHPd.js";import"./chunk-VR4S4FIN-R-sa6MjG.js";import"./chunk-32BRIVSS-CZZkOSIs.js";import"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";var b={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{b as diagram};
@@ -1,8 +0,0 @@
1
- import{c as r,s as e}from"./flowDiagram-23GEKE2U-DWxHXzyo.js";import{_ as a}from"./mermaid.core-spKo10MG.js";import"./chunk-5VM5RSS4-BCFrP-q5.js";import"./chunk-XXDRQBXY-FuYmcHPd.js";import"./chunk-VR4S4FIN-R-sa6MjG.js";import"./chunk-32BRIVSS-CZZkOSIs.js";import"./channel-BWg1ErwG.js";import"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";var o=a(t=>`${e(t)}
2
- .swimlane.cluster rect {
3
- stroke: ${t.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,"getStyles"),m=o,_=r({defaultLayout:"swimlane",styles:m});export{_ as diagram};