9router-imagefix 0.5.112 → 0.5.113

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 (182) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +7 -7
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  29. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  30. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  31. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  32. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  33. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  35. package/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  36. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  37. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +4 -4
  38. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  39. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  40. package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
  41. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
  42. package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
  43. package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  44. package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
  45. package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
  46. package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
  47. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  48. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  49. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/callback.html +1 -1
  51. package/app/.next-cli-build/server/app/callback.rsc +4 -4
  52. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  53. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  54. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
  55. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  56. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  57. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +6 -6
  58. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  59. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  60. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  61. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  62. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +6 -6
  63. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  64. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  65. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  66. package/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  67. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +6 -6
  68. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  69. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  70. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  71. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  72. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +6 -6
  73. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  74. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  75. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  76. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  77. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +6 -6
  78. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  79. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  80. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  81. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  82. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +6 -6
  83. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  84. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  85. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  86. package/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  87. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +6 -6
  88. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  89. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  90. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  91. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  92. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +6 -6
  93. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  94. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  95. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  96. package/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  97. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +6 -6
  98. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  99. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  100. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  101. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  102. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +6 -6
  103. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  104. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  105. package/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  106. package/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
  107. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +6 -6
  108. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
  109. package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  110. package/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  111. package/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  112. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +7 -7
  113. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  114. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  115. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  116. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  117. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  118. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  119. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  120. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
  121. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  122. package/app/.next-cli-build/server/app/dashboard/skills.rsc +6 -6
  123. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +6 -6
  124. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  125. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  126. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  127. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  128. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  129. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  130. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  131. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  132. package/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  133. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +6 -6
  134. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  135. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  136. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  137. package/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  138. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +6 -6
  139. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  140. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  141. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  142. package/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  143. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +6 -6
  144. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  145. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  146. package/app/.next-cli-build/server/app/index.html +1 -1
  147. package/app/.next-cli-build/server/app/index.rsc +4 -4
  148. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  149. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  150. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  151. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  152. package/app/.next-cli-build/server/app/landing.html +1 -1
  153. package/app/.next-cli-build/server/app/landing.rsc +4 -4
  154. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
  155. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  156. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
  157. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  158. package/app/.next-cli-build/server/app/login.html +1 -1
  159. package/app/.next-cli-build/server/app/login.rsc +5 -5
  160. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  161. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  162. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +5 -5
  163. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  164. package/app/.next-cli-build/server/app-paths-manifest.json +7 -7
  165. package/app/.next-cli-build/server/chunks/4037.js +1 -1
  166. package/app/.next-cli-build/server/chunks/827.js +1 -1
  167. package/app/.next-cli-build/server/chunks/869.js +1 -1
  168. package/app/.next-cli-build/server/chunks/8847.js +1 -1
  169. package/app/.next-cli-build/server/chunks/8908.js +1 -1
  170. package/app/.next-cli-build/server/chunks/929.js +1 -1
  171. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  172. package/app/.next-cli-build/server/pages/404.html +1 -1
  173. package/app/.next-cli-build/server/pages/500.html +1 -1
  174. package/app/.next-cli-build/static/chunks/{1321-254906094a67861e.js → 1321-001c6b0c5547503f.js} +1 -1
  175. package/app/cli/.build-home/AppData/Roaming/9router/db/data.sqlite-shm +0 -0
  176. package/app/cli/.build-home/AppData/Roaming/9router/db/data.sqlite-wal +0 -0
  177. package/app/package.json +1 -1
  178. package/cli.js +7 -32
  179. package/package.json +1 -1
  180. package/src/cli/utils/interfaceMenu.js +73 -0
  181. /package/app/.next-cli-build/static/{X2TbUaHtTCXPAbb1Jzltg → fMIuttQ13oA2DWAGzd9Gy}/_buildManifest.js +0 -0
  182. /package/app/.next-cli-build/static/{X2TbUaHtTCXPAbb1Jzltg → fMIuttQ13oA2DWAGzd9Gy}/_ssgManifest.js +0 -0
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router-app",
3
- "version": "0.5.112",
3
+ "version": "0.5.113",
4
4
  "description": "9Router web dashboard",
5
5
  "private": true,
6
6
  "scripts": {
package/cli.js CHANGED
@@ -571,6 +571,11 @@ if (skipKill) {
571
571
  .then(() => startServer(updatePromise));
572
572
  }
573
573
 
574
+ // Logika menu tinggal di modul terpisah supaya bisa diuji tanpa menjalankan
575
+ // CLI: cli.js ini mengeksekusi dirinya di module scope (startServer, bahkan
576
+ // process.exit kalau standalone build tidak ada).
577
+ const { buildInterfaceMenuItems, resolveMenuAction } = require("./src/cli/utils/interfaceMenu");
578
+
574
579
  // Show interface selection menu
575
580
  async function showInterfaceMenu(latestVersion) {
576
581
  const { selectMenu } = require("./src/cli/utils/input");
@@ -592,40 +597,10 @@ async function showInterfaceMenu(latestVersion) {
592
597
 
593
598
  const subtitle = `🚀 Server: \x1b[32m${serverUrl}\x1b[0m`;
594
599
 
595
- const menuItems = [];
596
-
597
- if (latestVersion) {
598
- menuItems.push({ label: `Update to v${latestVersion} (current: v${pkg.version})`, icon: "⬆" });
599
- }
600
-
601
- menuItems.push(
602
- { label: "Web UI (Open in Browser)", icon: "🌐" },
603
- { label: "Terminal UI (Interactive CLI)", icon: "💻" },
604
- { label: "Hide to Tray (Background)", icon: "🔔" },
605
- { label: "Exit", icon: "🚪" }
606
- );
607
-
600
+ const menuItems = buildInterfaceMenuItems(latestVersion, pkg.version);
608
601
  const selected = await selectMenu(`Choose Interface (v${pkg.version})`, menuItems, 0, subtitle);
609
602
 
610
- // `selectMenu` mengembalikan -1 untuk dua hal yang SAMA SEKALI BUKAN "exit":
611
- // - ESC ditekan (input.js: resolve(-1))
612
- // - stdin bukan TTY, mis. CLI dijalankan dari skrip / terminal tanpa TTY
613
- //
614
- // Dulu keduanya jatuh ke `return "exit"` di bawah, dan pemanggilnya
615
- // menjalankan cleanup() yang MEMBUNUH server. Akibatnya menekan ESC sekali
616
- // saja sudah cukup untuk mematikan gateway — inilah "tiba-tiba berhenti".
617
- // Sekarang: batalkan saja, jangan sentuh server.
618
- if (selected === -1) return "back";
619
-
620
- const offset = latestVersion ? 1 : 0;
621
-
622
- if (latestVersion && selected === 0) return "update";
623
- if (selected === offset) return "web";
624
- if (selected === offset + 1) return "terminal";
625
- if (selected === offset + 2) return "hide";
626
- // Indeks tak dikenal: jangan pernah menafsirkannya sebagai perintah mematikan
627
- // server. Lebih baik tampilkan menu lagi.
628
- return "back";
603
+ return resolveMenuAction(selected, latestVersion, pkg.version);
629
604
  }
630
605
 
631
606
  const MAX_RESTARTS = 2;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "9router-imagefix",
3
- "version": "0.5.112",
3
+ "version": "0.5.113",
4
4
  "description": "9Router CLI - Start and manage 9Router server (with image fix)",
5
5
  "bin": {
6
6
  "9router-imagefix": "./cli.js"
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Logika menu "Choose Interface" — dipisah dari cli.js supaya bisa diuji.
3
+ *
4
+ * cli.js menjalankan dirinya di module scope (startServer, bahkan
5
+ * process.exit kalau standalone build tidak ada), jadi mengimpornya dari test
6
+ * akan menjalankan CLI sungguhan. Fungsi-fungsi di sini murni: tidak menyentuh
7
+ * proses, jaringan, atau berkas.
8
+ */
9
+
10
+ /**
11
+ * Susun daftar item menu.
12
+ *
13
+ * Setiap item membawa `action`-nya sendiri, dan aksi dibaca dari array ini —
14
+ * bukan dari konstanta offset yang dihitung manual.
15
+ *
16
+ * Bug yang dihilangkan (v0.5.113): dulu pembacaannya memakai `offset + N`
17
+ * hardcoded dan TIDAK ADA cabang yang menangani indeks "Exit". Memilih Exit
18
+ * mengembalikan "back" — menu muncul lagi, server tetap hidup, dan opsi itu
19
+ * tampak tidak berfungsi. Bug yang sama mengintai setiap kali item ditambah
20
+ * atau diurutkan ulang, karena nomornya harus diperbarui manual di dua tempat.
21
+ *
22
+ * @param {string|null} latestVersion
23
+ * @param {string} currentVersion
24
+ * @returns {Array<{label:string, icon:string, action:string}>}
25
+ */
26
+ function buildInterfaceMenuItems(latestVersion, currentVersion) {
27
+ const items = [];
28
+
29
+ if (latestVersion) {
30
+ items.push({
31
+ label: `Update to v${latestVersion} (current: v${currentVersion})`,
32
+ icon: "⬆",
33
+ action: "update",
34
+ });
35
+ }
36
+
37
+ items.push(
38
+ { label: "Web UI (Open in Browser)", icon: "🌐", action: "web" },
39
+ { label: "Terminal UI (Interactive CLI)", icon: "💻", action: "terminal" },
40
+ { label: "Hide to Tray (Background)", icon: "🔔", action: "hide" },
41
+ { label: "Exit", icon: "🚪", action: "exit" }
42
+ );
43
+
44
+ return items;
45
+ }
46
+
47
+ /**
48
+ * Terjemahkan indeks pilihan menu menjadi aksi.
49
+ *
50
+ * @param {number} selected indeks dari selectMenu; -1 = ESC / bukan TTY
51
+ * @param {string|null} latestVersion
52
+ * @param {string} currentVersion
53
+ * @returns {"update"|"web"|"terminal"|"hide"|"exit"|"back"}
54
+ */
55
+ function resolveMenuAction(selected, latestVersion, currentVersion) {
56
+ // `selectMenu` mengembalikan -1 untuk dua hal yang SAMA SEKALI BUKAN "exit":
57
+ // - ESC ditekan (input.js: resolve(-1))
58
+ // - stdin bukan TTY, mis. CLI dijalankan dari skrip / terminal tanpa TTY
59
+ //
60
+ // Dulu keduanya jatuh ke `return "exit"`, dan pemanggilnya menjalankan
61
+ // cleanup() yang MEMBUNUH server. Akibatnya menekan ESC sekali saja sudah
62
+ // cukup untuk mematikan gateway — inilah keluhan "tiba-tiba berhenti".
63
+ // Sekarang: batalkan saja, jangan sentuh server.
64
+ if (selected === -1) return "back";
65
+
66
+ const items = buildInterfaceMenuItems(latestVersion, currentVersion);
67
+ const item = items[selected];
68
+ // Indeks tak dikenal: jangan pernah menafsirkannya sebagai perintah mematikan
69
+ // server. Lebih baik tampilkan menu lagi.
70
+ return item?.action || "back";
71
+ }
72
+
73
+ module.exports = { buildInterfaceMenuItems, resolveMenuAction };