swayrouter 1.0.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 (643) hide show
  1. package/.env.example +43 -0
  2. package/CHANGELOG.md +132 -0
  3. package/LICENSE +30 -0
  4. package/README.id.md +633 -0
  5. package/README.md +628 -0
  6. package/cli/cli.js +388 -0
  7. package/cli/package.json +4 -0
  8. package/cli/src/cli/commands/xaiVideo.js +280 -0
  9. package/cli/src/cli/tray/SwayAvatar.svg +20 -0
  10. package/cli/src/cli/tray/autostart.js +351 -0
  11. package/cli/src/cli/tray/icon.ico +0 -0
  12. package/cli/src/cli/tray/icon.png +0 -0
  13. package/cli/src/cli/tray/tray.js +258 -0
  14. package/cli/src/cli/tray/tray.ps1 +129 -0
  15. package/cli/src/cli/tray/trayHost.js +157 -0
  16. package/cli/src/cli/tray/trayWin.js +83 -0
  17. package/cli/src/cli/utils/display.js +123 -0
  18. package/cli/src/cli/utils/input.js +138 -0
  19. package/cli/src/runtime/discover.js +153 -0
  20. package/cli/src/runtime/lifecycle.js +333 -0
  21. package/cli/src/runtime/runMenu.js +250 -0
  22. package/cli/src/runtime/uiAdapters.js +12 -0
  23. package/cli/src/runtime/update.js +130 -0
  24. package/dashboard/dist/assets/CliTools-Ch3gKuNw.js +24 -0
  25. package/dashboard/dist/assets/Combo-BBCldjWi.js +1 -0
  26. package/dashboard/dist/assets/ConsoleLog-wywAYcPT.js +6 -0
  27. package/dashboard/dist/assets/Dashboard-DxzyF41b.js +1 -0
  28. package/dashboard/dist/assets/Header-C_9Su9BF.js +1 -0
  29. package/dashboard/dist/assets/Keys-D0ufgcsc.js +1 -0
  30. package/dashboard/dist/assets/Login-BeKpipS_.js +1 -0
  31. package/dashboard/dist/assets/ManageApiKey-CVXsmW2B.js +1 -0
  32. package/dashboard/dist/assets/OAuthCallback-D_UZYcF6.js +1 -0
  33. package/dashboard/dist/assets/Provider-BU7JfTqm.js +4 -0
  34. package/dashboard/dist/assets/ProviderModelAccordion-BAifkfVR.js +1 -0
  35. package/dashboard/dist/assets/Proxy-CU15VJ--.js +1 -0
  36. package/dashboard/dist/assets/QuotaMonitor-HzGK7bcc.js +1 -0
  37. package/dashboard/dist/assets/Settings-Dt4y2dC0.js +1 -0
  38. package/dashboard/dist/assets/Setup-DSDUwU7N.js +1 -0
  39. package/dashboard/dist/assets/StatusBadge-1nAOyHU2.js +1 -0
  40. package/dashboard/dist/assets/SwayChat-Bup7up6D.js +10 -0
  41. package/dashboard/dist/assets/Usage-eWnrPQ_v.js +4 -0
  42. package/dashboard/dist/assets/accordion-DOOPDDgt.js +1 -0
  43. package/dashboard/dist/assets/admin-extras-api-CCdu5TFM.js +1 -0
  44. package/dashboard/dist/assets/api-keys-api-ifAC2Ok3.js +1 -0
  45. package/dashboard/dist/assets/card-CC0Omjcv.js +1 -0
  46. package/dashboard/dist/assets/chatStudio-C0zPz_Z_.js +2 -0
  47. package/dashboard/dist/assets/checkbox-7SZBrmbN.js +1 -0
  48. package/dashboard/dist/assets/connections-api-_N54UD3S.js +1 -0
  49. package/dashboard/dist/assets/copy-button-qBvM6H9z.js +1 -0
  50. package/dashboard/dist/assets/currency-api-SV9CBf5e.js +1 -0
  51. package/dashboard/dist/assets/flip-button-BGgkjtl0.js +1 -0
  52. package/dashboard/dist/assets/frame-cUiti6Lq.js +1 -0
  53. package/dashboard/dist/assets/icons-vendor-CUx7SB5V.js +541 -0
  54. package/dashboard/dist/assets/index-B6j-9zHy.js +10 -0
  55. package/dashboard/dist/assets/index-C-_l0yYz.css +1 -0
  56. package/dashboard/dist/assets/live-mode-CHShLY4E.js +1 -0
  57. package/dashboard/dist/assets/markdown-vendor-BY8e1gQ8.js +29 -0
  58. package/dashboard/dist/assets/motion-vendor-g5fpGzmJ.js +9 -0
  59. package/dashboard/dist/assets/oauth-callback-CqYQzyd7.js +1 -0
  60. package/dashboard/dist/assets/query-vendor-DVevaSVS.js +1 -0
  61. package/dashboard/dist/assets/react-vendor-xnYrwzsL.js +61 -0
  62. package/dashboard/dist/assets/ripple-button-l8aMiVVG.js +1 -0
  63. package/dashboard/dist/assets/segmented-CqmEnQjZ.js +1 -0
  64. package/dashboard/dist/assets/select-D8pUtMXp.js +1 -0
  65. package/dashboard/dist/assets/skeleton-7uJDiIXe.js +1 -0
  66. package/dashboard/dist/assets/table-D0M60Tu1.js +1 -0
  67. package/dashboard/dist/assets/tabs-C6YkuulG.js +1 -0
  68. package/dashboard/dist/assets/tunnel-api-DDPsBaDV.js +1 -0
  69. package/dashboard/dist/assets/ui-vendor-BuM9f2NY.js +17 -0
  70. package/dashboard/dist/image2/SwayAvatar.svg +20 -0
  71. package/dashboard/dist/index.html +32 -0
  72. package/dashboard/dist/logo/avatar.svg +1 -0
  73. package/dashboard/dist/logo/sway.svg +20 -0
  74. package/dashboard/dist/logo/swaychat.svg +20 -0
  75. package/dashboard/dist/providers/SwayCustom.svg +19 -0
  76. package/dashboard/dist/providers/alicode.svg +12 -0
  77. package/dashboard/dist/providers/anthropic.svg +11 -0
  78. package/dashboard/dist/providers/antigravity.svg +3 -0
  79. package/dashboard/dist/providers/azure.svg +5 -0
  80. package/dashboard/dist/providers/baidu.svg +3 -0
  81. package/dashboard/dist/providers/blackbox.svg +5 -0
  82. package/dashboard/dist/providers/byteplus.svg +3 -0
  83. package/dashboard/dist/providers/cerebras.svg +4 -0
  84. package/dashboard/dist/providers/chutes.svg +4 -0
  85. package/dashboard/dist/providers/claude.svg +3 -0
  86. package/dashboard/dist/providers/cline.svg +11 -0
  87. package/dashboard/dist/providers/cloudflare-ai.svg +4 -0
  88. package/dashboard/dist/providers/codebuddy.svg +11 -0
  89. package/dashboard/dist/providers/codex.svg +10 -0
  90. package/dashboard/dist/providers/commandcode.svg +3 -0
  91. package/dashboard/dist/providers/cursor.svg +3 -0
  92. package/dashboard/dist/providers/deepseek.svg +10 -0
  93. package/dashboard/dist/providers/featherless.svg +3 -0
  94. package/dashboard/dist/providers/fireworks.svg +3 -0
  95. package/dashboard/dist/providers/gemini.svg +3 -0
  96. package/dashboard/dist/providers/geminicli.svg +11 -0
  97. package/dashboard/dist/providers/github.svg +3 -0
  98. package/dashboard/dist/providers/grok.svg +3 -0
  99. package/dashboard/dist/providers/groq.svg +3 -0
  100. package/dashboard/dist/providers/hermesagent.svg +1 -0
  101. package/dashboard/dist/providers/kilocode.svg +15 -0
  102. package/dashboard/dist/providers/kimchi.svg +3 -0
  103. package/dashboard/dist/providers/kimi.svg +4 -0
  104. package/dashboard/dist/providers/kiro.svg +10 -0
  105. package/dashboard/dist/providers/meta.svg +3 -0
  106. package/dashboard/dist/providers/mimo.svg +10 -0
  107. package/dashboard/dist/providers/minimax.svg +3 -0
  108. package/dashboard/dist/providers/mistral.svg +3 -0
  109. package/dashboard/dist/providers/morph.svg +3 -0
  110. package/dashboard/dist/providers/nebius.svg +4 -0
  111. package/dashboard/dist/providers/nvidia.svg +3 -0
  112. package/dashboard/dist/providers/ollama.svg +3 -0
  113. package/dashboard/dist/providers/omp.svg +5 -0
  114. package/dashboard/dist/providers/openai.svg +3 -0
  115. package/dashboard/dist/providers/opencode.svg +3 -0
  116. package/dashboard/dist/providers/openrouter.svg +3 -0
  117. package/dashboard/dist/providers/perplexity.svg +3 -0
  118. package/dashboard/dist/providers/poolside.svg +36 -0
  119. package/dashboard/dist/providers/qoder.svg +11 -0
  120. package/dashboard/dist/providers/sumopod.svg +3 -0
  121. package/dashboard/dist/providers/tencent.svg +5 -0
  122. package/dashboard/dist/providers/together.svg +12 -0
  123. package/dashboard/dist/providers/trae.svg +3 -0
  124. package/dashboard/dist/providers/venice.svg +4 -0
  125. package/dashboard/dist/providers/vercel.svg +3 -0
  126. package/dashboard/dist/providers/vertex.svg +17 -0
  127. package/dashboard/dist/providers/windsurf.svg +10 -0
  128. package/dashboard/dist/providers/zai.svg +3 -0
  129. package/dashboard/tsconfig.json +13 -0
  130. package/package.json +87 -0
  131. package/src/config/appConstants.js +153 -0
  132. package/src/config/defaultThinkingSignature.js +7 -0
  133. package/src/config/errorConfig.js +117 -0
  134. package/src/config/grokCli.js +9 -0
  135. package/src/config/kiroConstants.js +235 -0
  136. package/src/config/mediaConfig.js +20 -0
  137. package/src/config/ollamaModels.js +18 -0
  138. package/src/config/providerModels.js +109 -0
  139. package/src/config/providers.js +17 -0
  140. package/src/config/runtimeConfig.js +84 -0
  141. package/src/dashboardGuard.js +254 -0
  142. package/src/executors/antigravity.js +389 -0
  143. package/src/executors/azure.js +49 -0
  144. package/src/executors/base.js +225 -0
  145. package/src/executors/codebuddy-cn.js +23 -0
  146. package/src/executors/codebuddy-intl.js +60 -0
  147. package/src/executors/codex.js +436 -0
  148. package/src/executors/commandcode.js +83 -0
  149. package/src/executors/cursor.js +1075 -0
  150. package/src/executors/default.js +294 -0
  151. package/src/executors/gemini-cli.js +88 -0
  152. package/src/executors/github.js +393 -0
  153. package/src/executors/grok-cli.js +510 -0
  154. package/src/executors/grok-web.js +342 -0
  155. package/src/executors/index.js +86 -0
  156. package/src/executors/kimchi.js +116 -0
  157. package/src/executors/kiro.js +1155 -0
  158. package/src/executors/ollama-local.js +14 -0
  159. package/src/executors/opencode-go.js +47 -0
  160. package/src/executors/opencode.js +31 -0
  161. package/src/executors/qoder.js +433 -0
  162. package/src/executors/trae.js +318 -0
  163. package/src/executors/vertex.js +151 -0
  164. package/src/executors/windsurf.js +555 -0
  165. package/src/executors/xiaomi-tokenplan.js +16 -0
  166. package/src/handlers/chatCore/nonStreamingHandler.js +370 -0
  167. package/src/handlers/chatCore/requestDetail.js +130 -0
  168. package/src/handlers/chatCore/sseToJsonHandler.js +318 -0
  169. package/src/handlers/chatCore/streamingHandler.js +250 -0
  170. package/src/handlers/chatCore.js +652 -0
  171. package/src/lib/auth/dashboardSession.js +83 -0
  172. package/src/lib/auth/loginLimiter.js +99 -0
  173. package/src/lib/cache/ttlCache.js +153 -0
  174. package/src/lib/consoleLogBuffer.js +127 -0
  175. package/src/lib/dataDir.js +45 -0
  176. package/src/lib/db/adapters/betterSqliteAdapter.js +36 -0
  177. package/src/lib/db/adapters/bunSqliteAdapter.js +47 -0
  178. package/src/lib/db/adapters/nodeSqliteAdapter.js +65 -0
  179. package/src/lib/db/adapters/runtimeHelpers.js +23 -0
  180. package/src/lib/db/adapters/sqljsAdapter.js +103 -0
  181. package/src/lib/db/backup.js +75 -0
  182. package/src/lib/db/driver.js +110 -0
  183. package/src/lib/db/helpers/jsonCol.js +18 -0
  184. package/src/lib/db/helpers/kvStore.js +48 -0
  185. package/src/lib/db/helpers/metaStore.js +32 -0
  186. package/src/lib/db/index.js +473 -0
  187. package/src/lib/db/migrate.js +267 -0
  188. package/src/lib/db/migrations/001-initial.js +12 -0
  189. package/src/lib/db/migrations/002-prune-headroom-pxpipe-settings.js +32 -0
  190. package/src/lib/db/migrations/004-request-details-trace-id.js +12 -0
  191. package/src/lib/db/migrations/005-request-details-payload-capture.js +11 -0
  192. package/src/lib/db/migrations/007-headroom-readd-settings.js +35 -0
  193. package/src/lib/db/migrations/008-account-model-locks.js +22 -0
  194. package/src/lib/db/migrations/009-warp-pool-lifecycle.js +5 -0
  195. package/src/lib/db/migrations/010-api-key-file-permissions.js +7 -0
  196. package/src/lib/db/migrations/011-remove-upstream-user-agent-profile.js +41 -0
  197. package/src/lib/db/migrations/012-remove-headroom-settings.js +33 -0
  198. package/src/lib/db/migrations/013-default-fill-first-routing.js +20 -0
  199. package/src/lib/db/migrations/014-normalize-fill-first-routing.js +37 -0
  200. package/src/lib/db/migrations/015-remove-ip-ban-tables.js +8 -0
  201. package/src/lib/db/migrations/016-prune-legacy-codebuddy-intl-models.js +25 -0
  202. package/src/lib/db/migrations/index.js +20 -0
  203. package/src/lib/db/nineRouterMigration.js +785 -0
  204. package/src/lib/db/paths.js +23 -0
  205. package/src/lib/db/repos/accountModelLocksRepo.js +74 -0
  206. package/src/lib/db/repos/aliasRepo.js +108 -0
  207. package/src/lib/db/repos/apiKeysRepo.js +204 -0
  208. package/src/lib/db/repos/combosRepo.js +85 -0
  209. package/src/lib/db/repos/connectionsRepo.js +522 -0
  210. package/src/lib/db/repos/disabledModelsRepo.js +63 -0
  211. package/src/lib/db/repos/nodesRepo.js +127 -0
  212. package/src/lib/db/repos/pricingRepo.js +108 -0
  213. package/src/lib/db/repos/proxyPoolsRepo.js +104 -0
  214. package/src/lib/db/repos/requestDetailsRepo.js +345 -0
  215. package/src/lib/db/repos/settingsRepo.js +135 -0
  216. package/src/lib/db/repos/usageRepo.js +1335 -0
  217. package/src/lib/db/schema.js +179 -0
  218. package/src/lib/db/version.js +32 -0
  219. package/src/lib/db/writeBehind.js +174 -0
  220. package/src/lib/disabledModelsDb.js +3 -0
  221. package/src/lib/env.ts +175 -0
  222. package/src/lib/errors/publicError.js +18 -0
  223. package/src/lib/grokBuildConfig.js +243 -0
  224. package/src/lib/guardRequest.js +51 -0
  225. package/src/lib/localDb.js +21 -0
  226. package/src/lib/mcp/stdioSseBridge.js +174 -0
  227. package/src/lib/network/connectionProxy.js +200 -0
  228. package/src/lib/network/proxyTest.js +158 -0
  229. package/src/lib/network/proxyUrl.js +76 -0
  230. package/src/lib/network/relay.js +71 -0
  231. package/src/lib/oauth/constants/oauth.js +152 -0
  232. package/src/lib/oauth/constants/xai.js +43 -0
  233. package/src/lib/oauth/kiroExternalIdp.js +167 -0
  234. package/src/lib/oauth/providerHelpers.js +90 -0
  235. package/src/lib/oauth/providers/_shared.js +12 -0
  236. package/src/lib/oauth/providers/antigravity.js +126 -0
  237. package/src/lib/oauth/providers/claude.js +60 -0
  238. package/src/lib/oauth/providers/cline.js +62 -0
  239. package/src/lib/oauth/providers/clinepass.js +62 -0
  240. package/src/lib/oauth/providers/codebuddy-cn.js +75 -0
  241. package/src/lib/oauth/providers/codebuddy-intl.js +73 -0
  242. package/src/lib/oauth/providers/codex.js +72 -0
  243. package/src/lib/oauth/providers/cursor.js +18 -0
  244. package/src/lib/oauth/providers/gemini-cli.js +84 -0
  245. package/src/lib/oauth/providers/github.js +96 -0
  246. package/src/lib/oauth/providers/grok-cli.js +123 -0
  247. package/src/lib/oauth/providers/index.js +233 -0
  248. package/src/lib/oauth/providers/kilocode.js +60 -0
  249. package/src/lib/oauth/providers/kimchi.js +79 -0
  250. package/src/lib/oauth/providers/kimi.js +79 -0
  251. package/src/lib/oauth/providers/kiro.js +147 -0
  252. package/src/lib/oauth/providers/qoder.js +90 -0
  253. package/src/lib/oauth/providers/trae.js +244 -0
  254. package/src/lib/oauth/providers/windsurf.js +123 -0
  255. package/src/lib/oauth/providers/xai.js +95 -0
  256. package/src/lib/oauth/providers.js +16 -0
  257. package/src/lib/oauth/services/cursor.js +132 -0
  258. package/src/lib/oauth/services/kiro.js +351 -0
  259. package/src/lib/oauth/services/oauth.js +135 -0
  260. package/src/lib/oauth/services/qoder.js +151 -0
  261. package/src/lib/oauth/services/xai.js +204 -0
  262. package/src/lib/oauth/utils/ideDetect.js +55 -0
  263. package/src/lib/oauth/utils/pkce.js +25 -0
  264. package/src/lib/oauth/utils/server.js +732 -0
  265. package/src/lib/oauth/utils/ui.js +43 -0
  266. package/src/lib/providerNormalization.js +40 -0
  267. package/src/lib/qoder/constants.js +1 -0
  268. package/src/lib/requestDetailsDb.js +3 -0
  269. package/src/lib/resourceProfile.ts +124 -0
  270. package/src/lib/runtimeSecrets.ts +130 -0
  271. package/src/lib/security/payloadCapture.js +87 -0
  272. package/src/lib/tunnel/cloudflare/cloudflared.js +436 -0
  273. package/src/lib/tunnel/cloudflare/config.js +8 -0
  274. package/src/lib/tunnel/cloudflare/healthCheck.js +37 -0
  275. package/src/lib/tunnel/cloudflare/manager.js +149 -0
  276. package/src/lib/tunnel/cloudflare/pid.js +31 -0
  277. package/src/lib/tunnel/cloudflare/publicUrl.js +41 -0
  278. package/src/lib/tunnel/cloudflare/requirements.js +12 -0
  279. package/src/lib/tunnel/index.js +26 -0
  280. package/src/lib/tunnel/shared/dnsResolver.js +16 -0
  281. package/src/lib/tunnel/shared/internetCheck.js +30 -0
  282. package/src/lib/tunnel/shared/state.js +45 -0
  283. package/src/lib/tunnel/shared/watchdogConfig.js +6 -0
  284. package/src/lib/update/installer.js +52 -0
  285. package/src/lib/update/version.js +116 -0
  286. package/src/lib/usageDb.js +6 -0
  287. package/src/lib/usageRefresh.js +88 -0
  288. package/src/lifecycle/appLifecycle.ts +99 -0
  289. package/src/models.js +36 -0
  290. package/src/next/headers.js +12 -0
  291. package/src/next/server.js +74 -0
  292. package/src/observability/metrics.js +439 -0
  293. package/src/observability/tracing.js +107 -0
  294. package/src/open-sse-index.js +70 -0
  295. package/src/providers/capabilities.js +299 -0
  296. package/src/providers/display.ts +142 -0
  297. package/src/providers/index.js +27 -0
  298. package/src/providers/models/helpers.js +19 -0
  299. package/src/providers/models/namePatterns.js +27 -0
  300. package/src/providers/models/schema.js +32 -0
  301. package/src/providers/pricing.js +248 -0
  302. package/src/providers/registry/agentrouter.js +52 -0
  303. package/src/providers/registry/alicode-intl.js +32 -0
  304. package/src/providers/registry/alicode.js +33 -0
  305. package/src/providers/registry/alims-intl.js +30 -0
  306. package/src/providers/registry/anthropic.js +29 -0
  307. package/src/providers/registry/antigravity.js +139 -0
  308. package/src/providers/registry/azure.js +23 -0
  309. package/src/providers/registry/baidu.js +35 -0
  310. package/src/providers/registry/blackbox.js +41 -0
  311. package/src/providers/registry/byteplus.js +36 -0
  312. package/src/providers/registry/cerebras.js +33 -0
  313. package/src/providers/registry/chutes.js +26 -0
  314. package/src/providers/registry/claude.js +80 -0
  315. package/src/providers/registry/cline.js +53 -0
  316. package/src/providers/registry/clinepass.js +62 -0
  317. package/src/providers/registry/cloudflare-ai.js +84 -0
  318. package/src/providers/registry/codebuddy-cn.js +95 -0
  319. package/src/providers/registry/codebuddy-intl.js +91 -0
  320. package/src/providers/registry/codex.js +145 -0
  321. package/src/providers/registry/commandcode.js +45 -0
  322. package/src/providers/registry/cursor.js +61 -0
  323. package/src/providers/registry/deepseek.js +55 -0
  324. package/src/providers/registry/featherless.js +36 -0
  325. package/src/providers/registry/fireworks.js +34 -0
  326. package/src/providers/registry/gemini-cli.js +59 -0
  327. package/src/providers/registry/gemini.js +76 -0
  328. package/src/providers/registry/github.js +131 -0
  329. package/src/providers/registry/glm-cn.js +35 -0
  330. package/src/providers/registry/glm.js +58 -0
  331. package/src/providers/registry/grok-cli.js +87 -0
  332. package/src/providers/registry/grok-web.js +41 -0
  333. package/src/providers/registry/groq.js +38 -0
  334. package/src/providers/registry/index.js +77 -0
  335. package/src/providers/registry/kilo-gateway.js +34 -0
  336. package/src/providers/registry/kilocode.js +48 -0
  337. package/src/providers/registry/kimchi.js +49 -0
  338. package/src/providers/registry/kimi.js +82 -0
  339. package/src/providers/registry/kiro.js +132 -0
  340. package/src/providers/registry/meta.js +34 -0
  341. package/src/providers/registry/minimax-cn.js +90 -0
  342. package/src/providers/registry/minimax.js +90 -0
  343. package/src/providers/registry/mistral.js +36 -0
  344. package/src/providers/registry/morph.js +31 -0
  345. package/src/providers/registry/nebius.js +26 -0
  346. package/src/providers/registry/nvidia.js +55 -0
  347. package/src/providers/registry/ollama-local.js +18 -0
  348. package/src/providers/registry/ollama.js +38 -0
  349. package/src/providers/registry/openai.js +114 -0
  350. package/src/providers/registry/opencode-go.js +41 -0
  351. package/src/providers/registry/opencode.js +26 -0
  352. package/src/providers/registry/openrouter.js +36 -0
  353. package/src/providers/registry/perplexity.js +56 -0
  354. package/src/providers/registry/poolside.js +30 -0
  355. package/src/providers/registry/qoder.js +58 -0
  356. package/src/providers/registry/sumopod.js +84 -0
  357. package/src/providers/registry/tencent.js +29 -0
  358. package/src/providers/registry/together.js +38 -0
  359. package/src/providers/registry/trae.js +71 -0
  360. package/src/providers/registry/venice.js +69 -0
  361. package/src/providers/registry/vercel-ai-gateway.js +37 -0
  362. package/src/providers/registry/vertex-partner.js +31 -0
  363. package/src/providers/registry/vertex.js +33 -0
  364. package/src/providers/registry/windsurf.js +129 -0
  365. package/src/providers/registry/xai.js +46 -0
  366. package/src/providers/registry/xiaomi-mimo.js +66 -0
  367. package/src/providers/registry/xiaomi-tokenplan.js +58 -0
  368. package/src/providers/registryEntry.js +3 -0
  369. package/src/providers/schema.js +33 -0
  370. package/src/providers/shared.js +114 -0
  371. package/src/providers/thinkingLevels.js +49 -0
  372. package/src/routes/api/auth/login/route.js +82 -0
  373. package/src/routes/api/auth/logout/route.js +9 -0
  374. package/src/routes/api/auth/reset-password/route.js +12 -0
  375. package/src/routes/api/auth/status/route.js +33 -0
  376. package/src/routes/api/auth/verify-password/route.js +39 -0
  377. package/src/routes/api/chat/tools/curl/route.js +100 -0
  378. package/src/routes/api/chat/tools/router/route.js +215 -0
  379. package/src/routes/api/chat/tools/search/route.js +362 -0
  380. package/src/routes/api/chat/tools/shell/route.js +228 -0
  381. package/src/routes/api/cli-tools/all-statuses/route.js +37 -0
  382. package/src/routes/api/cli-tools/claude-settings/route.js +261 -0
  383. package/src/routes/api/cli-tools/codex-settings/route.js +220 -0
  384. package/src/routes/api/cli-tools/cowork-mcp-registry/route.js +80 -0
  385. package/src/routes/api/cli-tools/cowork-mcp-tools/route.js +96 -0
  386. package/src/routes/api/cli-tools/cowork-settings/route.js +380 -0
  387. package/src/routes/api/cli-tools/grok-build-settings/route.js +152 -0
  388. package/src/routes/api/cli-tools/hermes-settings/route.js +169 -0
  389. package/src/routes/api/cli-tools/kilo-settings/route.js +131 -0
  390. package/src/routes/api/cli-tools/model-mappings/route.js +43 -0
  391. package/src/routes/api/cli-tools/omp-settings/route.js +266 -0
  392. package/src/routes/api/cli-tools/opencode-settings/route.js +243 -0
  393. package/src/routes/api/combos/[id]/route.js +73 -0
  394. package/src/routes/api/combos/route.js +43 -0
  395. package/src/routes/api/health/live/route.js +7 -0
  396. package/src/routes/api/health/ready/route.js +19 -0
  397. package/src/routes/api/health/route.js +17 -0
  398. package/src/routes/api/inflight/stream/route.js +24 -0
  399. package/src/routes/api/init/route.js +3 -0
  400. package/src/routes/api/keys/[id]/route.js +71 -0
  401. package/src/routes/api/keys/route.js +41 -0
  402. package/src/routes/api/logs/route.js +19 -0
  403. package/src/routes/api/mcp/[plugin]/message/route.js +23 -0
  404. package/src/routes/api/mcp/[plugin]/sse/route.js +35 -0
  405. package/src/routes/api/models/availability/route.js +104 -0
  406. package/src/routes/api/models/custom/route.js +58 -0
  407. package/src/routes/api/models/disabled/route.js +47 -0
  408. package/src/routes/api/models/route.js +64 -0
  409. package/src/routes/api/models/test/ping.js +236 -0
  410. package/src/routes/api/models/test/route.js +14 -0
  411. package/src/routes/api/oauth/[provider]/[action]/route.js +491 -0
  412. package/src/routes/api/oauth/codex/bulk-import/route.js +105 -0
  413. package/src/routes/api/oauth/codex/import-token/route.js +82 -0
  414. package/src/routes/api/oauth/cursor/auto-import/route.js +250 -0
  415. package/src/routes/api/oauth/cursor/import/route.js +86 -0
  416. package/src/routes/api/oauth/kiro/api-key/route.js +60 -0
  417. package/src/routes/api/oauth/kiro/auto-import/route.js +120 -0
  418. package/src/routes/api/oauth/kiro/import/route.js +72 -0
  419. package/src/routes/api/oauth/kiro/import-cli-proxy/route.js +42 -0
  420. package/src/routes/api/oauth/kiro/social-authorize/route.js +40 -0
  421. package/src/routes/api/oauth/kiro/social-exchange/route.js +62 -0
  422. package/src/routes/api/pricing/route.js +96 -0
  423. package/src/routes/api/provider-nodes/[id]/route.js +106 -0
  424. package/src/routes/api/provider-nodes/route.js +110 -0
  425. package/src/routes/api/provider-nodes/validate/route.js +197 -0
  426. package/src/routes/api/providers/[id]/models/route.js +716 -0
  427. package/src/routes/api/providers/[id]/route.js +195 -0
  428. package/src/routes/api/providers/[id]/test/route.js +27 -0
  429. package/src/routes/api/providers/[id]/test/testUtils.js +912 -0
  430. package/src/routes/api/providers/[id]/test-models/route.js +211 -0
  431. package/src/routes/api/providers/catalog/route.js +58 -0
  432. package/src/routes/api/providers/client/route.js +133 -0
  433. package/src/routes/api/providers/counts/route.js +43 -0
  434. package/src/routes/api/providers/kilo/free-models/route.js +58 -0
  435. package/src/routes/api/providers/route.js +361 -0
  436. package/src/routes/api/providers/suggested-models/filters.js +24 -0
  437. package/src/routes/api/providers/suggested-models/route.js +34 -0
  438. package/src/routes/api/providers/test-batch/route.js +145 -0
  439. package/src/routes/api/providers/validate/route.js +633 -0
  440. package/src/routes/api/proxy-pools/[id]/route.js +129 -0
  441. package/src/routes/api/proxy-pools/[id]/test/route.js +64 -0
  442. package/src/routes/api/proxy-pools/cloudflare-deploy/route.js +183 -0
  443. package/src/routes/api/proxy-pools/route.js +85 -0
  444. package/src/routes/api/proxy-pools/vercel-deploy/route.js +181 -0
  445. package/src/routes/api/settings/currency/route.js +29 -0
  446. package/src/routes/api/settings/database/path/route.js +8 -0
  447. package/src/routes/api/settings/database/route.js +89 -0
  448. package/src/routes/api/settings/migrate-9router/route.js +81 -0
  449. package/src/routes/api/settings/require-login/route.js +14 -0
  450. package/src/routes/api/settings/route.js +186 -0
  451. package/src/routes/api/shutdown/route.js +25 -0
  452. package/src/routes/api/tags/route.js +17 -0
  453. package/src/routes/api/translator/console-logs/route.js +28 -0
  454. package/src/routes/api/translator/console-logs/stream/route.js +95 -0
  455. package/src/routes/api/tunnel/disable/route.js +18 -0
  456. package/src/routes/api/tunnel/enable/route.js +32 -0
  457. package/src/routes/api/tunnel/status/route.js +23 -0
  458. package/src/routes/api/update/route.js +42 -0
  459. package/src/routes/api/usage/[connectionId]/codex-reset-credits/route.js +169 -0
  460. package/src/routes/api/usage/[connectionId]/route.js +222 -0
  461. package/src/routes/api/usage/chart/route.js +27 -0
  462. package/src/routes/api/usage/history/route.js +94 -0
  463. package/src/routes/api/usage/logs/route.js +14 -0
  464. package/src/routes/api/usage/providers/route.js +36 -0
  465. package/src/routes/api/usage/request-details/route.js +61 -0
  466. package/src/routes/api/usage/request-logs/route.js +15 -0
  467. package/src/routes/api/usage/stats/route.js +23 -0
  468. package/src/routes/api/usage/stream/route.js +78 -0
  469. package/src/routes/api/v1/api/chat/route.js +36 -0
  470. package/src/routes/api/v1/chat/completions/route.js +28 -0
  471. package/src/routes/api/v1/images/edits/route.js +70 -0
  472. package/src/routes/api/v1/images/generations/route.js +50 -0
  473. package/src/routes/api/v1/images/imageValidation.js +45 -0
  474. package/src/routes/api/v1/messages/count_tokens/route.js +87 -0
  475. package/src/routes/api/v1/messages/route.js +26 -0
  476. package/src/routes/api/v1/models/route.js +440 -0
  477. package/src/routes/api/v1/responses/compact/route.js +34 -0
  478. package/src/routes/api/v1/responses/route.js +26 -0
  479. package/src/routes/api/v1/route.js +1 -0
  480. package/src/routes/api/version/route.js +11 -0
  481. package/src/routes/table.js +1141 -0
  482. package/src/rtk/applyFilter.js +13 -0
  483. package/src/rtk/autodetect.js +104 -0
  484. package/src/rtk/caveman.js +6 -0
  485. package/src/rtk/cavemanPrompts.js +107 -0
  486. package/src/rtk/constants.js +51 -0
  487. package/src/rtk/filters/buildOutput.js +120 -0
  488. package/src/rtk/filters/dedupLog.js +43 -0
  489. package/src/rtk/filters/find.js +47 -0
  490. package/src/rtk/filters/gitDiff.js +90 -0
  491. package/src/rtk/filters/gitLog.js +88 -0
  492. package/src/rtk/filters/gitStatus.js +101 -0
  493. package/src/rtk/filters/grep.js +45 -0
  494. package/src/rtk/filters/ls.js +73 -0
  495. package/src/rtk/filters/readNumbered.js +22 -0
  496. package/src/rtk/filters/searchList.js +49 -0
  497. package/src/rtk/filters/smartTruncate.js +13 -0
  498. package/src/rtk/filters/tree.js +28 -0
  499. package/src/rtk/index.js +143 -0
  500. package/src/rtk/ponytail.js +6 -0
  501. package/src/rtk/ponytailPrompt.js +49 -0
  502. package/src/rtk/systemInject.js +89 -0
  503. package/src/server.ts +474 -0
  504. package/src/services/accountFallback.js +241 -0
  505. package/src/services/accountPool.js +389 -0
  506. package/src/services/capacityAdapter.js +140 -0
  507. package/src/services/cliModelMapping.js +84 -0
  508. package/src/services/clinepassModels.js +60 -0
  509. package/src/services/codebuddyModels.js +250 -0
  510. package/src/services/combo.js +482 -0
  511. package/src/services/copilotModels.js +126 -0
  512. package/src/services/currencyRate.js +56 -0
  513. package/src/services/cursorModels.js +197 -0
  514. package/src/services/grokCliModels.js +130 -0
  515. package/src/services/kimchiModels.js +175 -0
  516. package/src/services/kiroModels.js +246 -0
  517. package/src/services/model.js +83 -0
  518. package/src/services/oauthCredentialManager.js +153 -0
  519. package/src/services/projectId.js +240 -0
  520. package/src/services/provider.js +145 -0
  521. package/src/services/qoderModels.js +274 -0
  522. package/src/services/tokenRefresh/dedup.js +70 -0
  523. package/src/services/tokenRefresh/providers.js +626 -0
  524. package/src/services/tokenRefresh.js +274 -0
  525. package/src/services/usage/claude.js +134 -0
  526. package/src/services/usage/codebuddy-cn.js +212 -0
  527. package/src/services/usage/codex.js +193 -0
  528. package/src/services/usage/deepseek.js +103 -0
  529. package/src/services/usage/github.js +94 -0
  530. package/src/services/usage/google.js +218 -0
  531. package/src/services/usage/grok-cli.js +368 -0
  532. package/src/services/usage/grokCliQuotaFrame.js +170 -0
  533. package/src/services/usage/kimi.js +185 -0
  534. package/src/services/usage/kiro.js +172 -0
  535. package/src/services/usage/minimax.js +215 -0
  536. package/src/services/usage/misc.js +264 -0
  537. package/src/services/usage/shared.js +59 -0
  538. package/src/services/usage.js +56 -0
  539. package/src/shared/clineAuth.js +37 -0
  540. package/src/shared/constants/config.js +80 -0
  541. package/src/shared/constants/coworkPlugins.js +69 -0
  542. package/src/shared/constants/models.js +41 -0
  543. package/src/shared/constants/providers.js +128 -0
  544. package/src/shared/constants/providersDisplay.js +1 -0
  545. package/src/shared/qoder/constants.js +50 -0
  546. package/src/shared/qoder/cosy.js +134 -0
  547. package/src/shared/qoder/encoding.js +36 -0
  548. package/src/shared/services/initializeApp.js +226 -0
  549. package/src/shared/services/quotaAutoPing.js +310 -0
  550. package/src/shared/utils/apiKey.js +65 -0
  551. package/src/shared/utils/clineAuth.js +1 -0
  552. package/src/shared/utils/index.js +3 -0
  553. package/src/shared/utils/machineId.js +60 -0
  554. package/src/shared/utils/ssrfGuard.js +280 -0
  555. package/src/sse/handlers/chat.js +426 -0
  556. package/src/sse/oauthLease.js +32 -0
  557. package/src/sse/recovery.js +235 -0
  558. package/src/sse/services/auth.js +489 -0
  559. package/src/sse/services/backgroundTokenRefresh.js +173 -0
  560. package/src/sse/services/model.js +129 -0
  561. package/src/sse/services/requestCancellation.js +4 -0
  562. package/src/sse/services/tokenRefresh.js +264 -0
  563. package/src/sse/utils/logger.js +142 -0
  564. package/src/staticServe.ts +95 -0
  565. package/src/transformer/streamToJsonConverter.js +87 -0
  566. package/src/translator/canonical.js +81 -0
  567. package/src/translator/concerns/chunk.js +9 -0
  568. package/src/translator/concerns/compatFallback.js +147 -0
  569. package/src/translator/concerns/finishReason.js +59 -0
  570. package/src/translator/concerns/image.js +105 -0
  571. package/src/translator/concerns/json.js +4 -0
  572. package/src/translator/concerns/kiroConversation.js +428 -0
  573. package/src/translator/concerns/message.js +5 -0
  574. package/src/translator/concerns/modality.js +134 -0
  575. package/src/translator/concerns/paramSupport.js +97 -0
  576. package/src/translator/concerns/prefetch.js +86 -0
  577. package/src/translator/concerns/reasoning.js +18 -0
  578. package/src/translator/concerns/thinking.js +40 -0
  579. package/src/translator/concerns/thinkingUnified.js +319 -0
  580. package/src/translator/concerns/toolCall.js +134 -0
  581. package/src/translator/concerns/usage.js +61 -0
  582. package/src/translator/detection.js +42 -0
  583. package/src/translator/formats/claude.js +323 -0
  584. package/src/translator/formats/gemini.js +366 -0
  585. package/src/translator/formats/maxTokens.js +19 -0
  586. package/src/translator/formats/openai.js +116 -0
  587. package/src/translator/formats/responsesApi.js +117 -0
  588. package/src/translator/formats.js +28 -0
  589. package/src/translator/index.js +237 -0
  590. package/src/translator/request/antigravity-to-openai.js +217 -0
  591. package/src/translator/request/claude-to-kiro.js +288 -0
  592. package/src/translator/request/claude-to-openai.js +199 -0
  593. package/src/translator/request/gemini-to-openai.js +142 -0
  594. package/src/translator/request/openai-responses.js +373 -0
  595. package/src/translator/request/openai-to-claude.js +260 -0
  596. package/src/translator/request/openai-to-commandcode.js +161 -0
  597. package/src/translator/request/openai-to-cursor.js +175 -0
  598. package/src/translator/request/openai-to-gemini.js +422 -0
  599. package/src/translator/request/openai-to-kiro.js +360 -0
  600. package/src/translator/request/openai-to-ollama.js +152 -0
  601. package/src/translator/request/openai-to-vertex.js +36 -0
  602. package/src/translator/response/claude-to-openai.js +185 -0
  603. package/src/translator/response/commandcode-to-openai.js +164 -0
  604. package/src/translator/response/cursor-to-openai.js +18 -0
  605. package/src/translator/response/gemini-to-openai.js +127 -0
  606. package/src/translator/response/kiro-to-claude.js +230 -0
  607. package/src/translator/response/kiro-to-openai.js +136 -0
  608. package/src/translator/response/ollama-to-openai.js +106 -0
  609. package/src/translator/response/openai-responses.js +534 -0
  610. package/src/translator/response/openai-to-antigravity.js +107 -0
  611. package/src/translator/response/openai-to-claude.js +231 -0
  612. package/src/translator/schema/blocks.js +40 -0
  613. package/src/translator/schema/defaults.js +3 -0
  614. package/src/translator/schema/finishReasons.js +22 -0
  615. package/src/translator/schema/index.js +7 -0
  616. package/src/translator/schema/roles.js +12 -0
  617. package/src/transport/requestBoundary.ts +223 -0
  618. package/src/transport/routerAdmission.ts +380 -0
  619. package/src/types/provider.ts +59 -0
  620. package/src/utils/bypassHandler.js +272 -0
  621. package/src/utils/claudeCloaking.js +10 -0
  622. package/src/utils/claudeSignature.js +35 -0
  623. package/src/utils/clientDetector.js +183 -0
  624. package/src/utils/cursorChecksum.js +104 -0
  625. package/src/utils/cursorProtobuf.js +801 -0
  626. package/src/utils/debugLog.js +12 -0
  627. package/src/utils/error.js +120 -0
  628. package/src/utils/inflight.js +127 -0
  629. package/src/utils/kiroSessionReplay.js +139 -0
  630. package/src/utils/ollamaTransform.js +83 -0
  631. package/src/utils/proxyFetch.js +308 -0
  632. package/src/utils/reasoningContentInjector.js +71 -0
  633. package/src/utils/requestLogger.js +272 -0
  634. package/src/utils/responsesStreamHelpers.js +46 -0
  635. package/src/utils/sessionManager.js +205 -0
  636. package/src/utils/sse.js +13 -0
  637. package/src/utils/sseConstants.js +21 -0
  638. package/src/utils/stream.js +511 -0
  639. package/src/utils/streamHandler.js +256 -0
  640. package/src/utils/streamHelpers.js +113 -0
  641. package/src/utils/toolDeduper.js +44 -0
  642. package/src/utils/usageTracking.js +329 -0
  643. package/tsconfig.json +45 -0
@@ -0,0 +1,20 @@
1
+ <svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="500" height="500" rx="100" fill="white"/>
3
+ <path d="M408.793 346.03C408.537 346.924 408.269 347.808 407.987 348.683C405.096 357.964 401.216 366.18 396.347 373.331C391.478 380.482 385.773 386.568 379.231 391.589C372.688 396.61 365.917 400.717 358.918 403.912C351.92 407.107 344.769 409.466 337.466 410.987C330.315 412.509 323.545 413.27 317.155 413.27H117.916C108.831 413.27 100.701 409.184 95.2592 402.752C96.9321 403.193 98.6888 403.43 100.5 403.43H207.099C218.421 403.43 227.599 394.252 227.599 382.93C227.599 371.608 218.421 362.43 207.099 362.43H100.5C99.2368 362.43 97.9996 362.545 96.7992 362.764C102.179 357.312 109.652 353.932 117.916 353.932H317.155C327.276 353.932 335.36 351.297 341.411 346.03H408.793ZM155.923 211.551C162.145 217.008 170.396 219.738 180.678 219.738H317.611C324.001 219.891 330.771 220.803 337.922 222.477C345.073 223.998 352.148 226.432 359.147 229.779C366.298 233.127 373.068 237.387 379.458 242.56C385.849 247.581 391.478 253.667 396.347 260.818C401.368 267.968 405.323 276.185 408.214 285.466C408.371 285.97 408.524 286.479 408.672 286.99H340.166C337.784 285.073 335.059 283.499 331.989 282.271C327.576 280.445 322.632 279.532 317.155 279.532H180.678C171.093 279.532 160.747 277.858 149.64 274.511C138.533 271.011 128.187 265.458 118.602 257.851C109.169 250.243 101.257 240.278 94.8666 227.954C92.3285 222.94 90.3066 217.472 88.8011 211.551H155.923ZM352.985 86.0001C361.389 86.0001 368.977 89.4958 374.375 95.1115H269.419C258.098 95.1115 248.919 104.29 248.919 115.611C248.919 126.933 258.098 136.111 269.419 136.111H374.487C369.082 141.795 361.447 145.338 352.985 145.338H180.678C171.27 145.338 163.563 147.73 157.554 152.511H89.2142C90.6697 147.222 92.5531 142.321 94.8666 137.807C101.257 125.483 109.169 115.517 118.602 107.909C128.187 100.15 138.533 94.5964 149.64 91.2491C160.747 87.7498 171.093 86.0001 180.678 86.0001H352.985Z" fill="#0077FF"/>
4
+ <path d="M100.5 374.729H207.099C211.628 374.729 215.299 378.401 215.3 382.93C215.3 387.458 211.628 391.13 207.099 391.13H100.5C95.9711 391.13 92.2996 387.458 92.2996 382.93C92.2996 378.401 95.9712 374.73 100.5 374.729Z" fill="#0077FF" stroke="#0077FF" stroke-width="8.19996"/>
5
+ <path d="M269.419 107.411H366.179C370.707 107.411 374.379 111.082 374.379 115.611C374.379 120.14 370.707 123.811 366.179 123.811H269.419C264.89 123.811 261.219 120.14 261.219 115.611C261.219 111.082 264.89 107.411 269.419 107.411Z" fill="#0077FF" stroke="#0077FF" stroke-width="8.19996"/>
6
+ <path d="M354.699 296.01H394.058C405.833 296.01 415.378 305.556 415.378 317.33C415.378 329.105 405.833 338.651 394.058 338.651H354.699C342.924 338.651 333.378 329.105 333.378 317.33C333.378 305.556 342.924 296.01 354.699 296.01Z" stroke="#0077FF" stroke-width="8.19996"/>
7
+ <path d="M105.42 161.531H144.779C156.554 161.531 166.1 171.076 166.1 182.851C166.1 194.625 156.554 204.171 144.779 204.171H105.42C93.6453 204.171 84.0996 194.625 84.0996 182.851C84.0996 171.076 93.6453 161.531 105.42 161.531Z" stroke="#0077FF" stroke-width="8.19996"/>
8
+ <mask id="path-7-outside-1_1_80" maskUnits="userSpaceOnUse" x="349.959" y="300.83" width="49" height="30" fill="black">
9
+ <rect fill="white" x="349.959" y="300.83" width="49" height="30"/>
10
+ <path d="M351.716 318.817V315.798L366.056 309.173V312.894L355.867 317.266L355.982 317.067V317.549L355.867 317.35L366.056 321.721V325.442L351.716 318.817ZM379.535 303.355L372.616 329.059H369.293L376.212 303.355H379.535ZM397.104 318.817L382.763 325.442V321.721L392.953 317.35L392.837 317.549V317.067L392.953 317.266L382.763 312.894V309.173L397.104 315.798V318.817Z"/>
11
+ </mask>
12
+ <path d="M351.716 318.817V315.798L366.056 309.173V312.894L355.867 317.266L355.982 317.067V317.549L355.867 317.35L366.056 321.721V325.442L351.716 318.817ZM379.535 303.355L372.616 329.059H369.293L376.212 303.355H379.535ZM397.104 318.817L382.763 325.442V321.721L392.953 317.35L392.837 317.549V317.067L392.953 317.266L382.763 312.894V309.173L397.104 315.798V318.817Z" fill="#0077FF"/>
13
+ <path d="M351.716 318.817H350.076V319.866L351.028 320.306L351.716 318.817ZM351.716 315.798L351.028 314.309L350.076 314.749V315.798H351.716ZM366.056 309.173H367.696V306.609L365.368 307.684L366.056 309.173ZM366.056 312.894L366.703 314.401L367.696 313.975V312.894H366.056ZM355.867 317.266L354.448 316.444L351.971 320.722L356.513 318.773L355.867 317.266ZM355.982 317.067H357.622V310.961L354.563 316.245L355.982 317.067ZM355.982 317.549L354.563 318.37L357.622 323.655V317.549H355.982ZM355.867 317.35L356.513 315.842L351.971 313.894L354.448 318.171L355.867 317.35ZM366.056 321.721H367.696V320.64L366.703 320.214L366.056 321.721ZM366.056 325.442L365.368 326.931L367.696 328.007V325.442H366.056ZM351.716 318.817H353.356V315.798H351.716H350.076V318.817H351.716ZM351.716 315.798L352.403 317.287L366.744 310.662L366.056 309.173L365.368 307.684L351.028 314.309L351.716 315.798ZM366.056 309.173H364.416V312.894H366.056H367.696V309.173H366.056ZM366.056 312.894L365.41 311.387L355.22 315.759L355.867 317.266L356.513 318.773L366.703 314.401L366.056 312.894ZM355.867 317.266L357.286 318.087L357.401 317.888L355.982 317.067L354.563 316.245L354.448 316.444L355.867 317.266ZM355.982 317.067H354.342V317.549H355.982H357.622V317.067H355.982ZM355.982 317.549L357.401 316.727L357.286 316.528L355.867 317.35L354.448 318.171L354.563 318.37L355.982 317.549ZM355.867 317.35L355.22 318.857L365.41 323.228L366.056 321.721L366.703 320.214L356.513 315.842L355.867 317.35ZM366.056 321.721H364.416V325.442H366.056H367.696V321.721H366.056ZM366.056 325.442L366.744 323.954L352.403 317.328L351.716 318.817L351.028 320.306L365.368 326.931L366.056 325.442ZM379.535 303.355L381.118 303.781L381.674 301.715H379.535V303.355ZM372.616 329.059V330.699H373.873L374.2 329.485L372.616 329.059ZM369.293 329.059L367.709 328.633L367.153 330.699H369.293V329.059ZM376.212 303.355V301.715H374.955L374.628 302.929L376.212 303.355ZM379.535 303.355L377.951 302.929L371.032 328.633L372.616 329.059L374.2 329.485L381.118 303.781L379.535 303.355ZM372.616 329.059V327.419H369.293V329.059V330.699H372.616V329.059ZM369.293 329.059L370.876 329.485L377.795 303.781L376.212 303.355L374.628 302.929L367.709 328.633L369.293 329.059ZM376.212 303.355V304.995H379.535V303.355V301.715H376.212V303.355ZM397.104 318.817L397.792 320.306L398.744 319.866V318.817H397.104ZM382.763 325.442H381.123V328.007L383.451 326.931L382.763 325.442ZM382.763 321.721L382.117 320.214L381.123 320.64V321.721H382.763ZM392.953 317.35L394.372 318.171L396.849 313.894L392.306 315.842L392.953 317.35ZM392.837 317.549H391.197V323.655L394.257 318.37L392.837 317.549ZM392.837 317.067L394.257 316.245L391.197 310.961V317.067H392.837ZM392.953 317.266L392.306 318.773L396.849 320.722L394.372 316.444L392.953 317.266ZM382.763 312.894H381.123V313.975L382.117 314.401L382.763 312.894ZM382.763 309.173L383.451 307.684L381.123 306.609V309.173H382.763ZM397.104 315.798H398.744V314.749L397.792 314.309L397.104 315.798ZM397.104 318.817L396.416 317.328L382.076 323.954L382.763 325.442L383.451 326.931L397.792 320.306L397.104 318.817ZM382.763 325.442H384.403V321.721H382.763H381.123V325.442H382.763ZM382.763 321.721L383.41 323.228L393.599 318.857L392.953 317.35L392.306 315.842L382.117 320.214L382.763 321.721ZM392.953 317.35L391.533 316.528L391.418 316.727L392.837 317.549L394.257 318.37L394.372 318.171L392.953 317.35ZM392.837 317.549H394.477V317.067H392.837H391.197V317.549H392.837ZM392.837 317.067L391.418 317.888L391.533 318.087L392.953 317.266L394.372 316.444L394.257 316.245L392.837 317.067ZM392.953 317.266L393.599 315.759L383.41 311.387L382.763 312.894L382.117 314.401L392.306 318.773L392.953 317.266ZM382.763 312.894H384.403V309.173H382.763H381.123V312.894H382.763ZM382.763 309.173L382.076 310.662L396.416 317.287L397.104 315.798L397.792 314.309L383.451 307.684L382.763 309.173ZM397.104 315.798H395.464V318.817H397.104H398.744V315.798H397.104Z" fill="#0077FF" mask="url(#path-7-outside-1_1_80)"/>
14
+ <mask id="path-9-outside-2_1_80" maskUnits="userSpaceOnUse" x="99.0399" y="166.351" width="49" height="30" fill="black">
15
+ <rect fill="white" x="99.0399" y="166.351" width="49" height="30"/>
16
+ <path d="M100.797 184.338V181.319L115.138 174.694V178.415L104.948 182.786L105.063 182.587V183.069L104.948 182.87L115.138 187.242V190.963L100.797 184.338ZM128.616 168.876L121.697 194.58H118.374L125.293 168.876H128.616ZM146.185 184.338L131.845 190.963V187.242L142.034 182.87L141.919 183.069V182.587L142.034 182.786L131.845 178.415V174.694L146.185 181.319V184.338Z"/>
17
+ </mask>
18
+ <path d="M100.797 184.338V181.319L115.138 174.694V178.415L104.948 182.786L105.063 182.587V183.069L104.948 182.87L115.138 187.242V190.963L100.797 184.338ZM128.616 168.876L121.697 194.58H118.374L125.293 168.876H128.616ZM146.185 184.338L131.845 190.963V187.242L142.034 182.87L141.919 183.069V182.587L142.034 182.786L131.845 178.415V174.694L146.185 181.319V184.338Z" fill="#0077FF"/>
19
+ <path d="M100.797 184.338H99.1569V185.387L100.109 185.827L100.797 184.338ZM100.797 181.319L100.109 179.83L99.1569 180.27V181.319H100.797ZM115.138 174.694H116.778V172.129L114.45 173.205L115.138 174.694ZM115.138 178.415L115.784 179.922L116.778 179.496V178.415H115.138ZM104.948 182.786L103.529 181.965L101.052 186.242L105.595 184.294L104.948 182.786ZM105.063 182.587H106.703V176.481L103.644 181.766L105.063 182.587ZM105.063 183.069L103.644 183.891L106.703 189.175V183.069H105.063ZM104.948 182.87L105.595 181.363L101.052 179.414L103.529 183.692L104.948 182.87ZM115.138 187.242H116.778V186.161L115.784 185.734L115.138 187.242ZM115.138 190.963L114.45 192.452L116.778 193.527V190.963H115.138ZM100.797 184.338H102.437V181.319H100.797H99.1569V184.338H100.797ZM100.797 181.319L101.485 182.808L115.825 176.182L115.138 174.694L114.45 173.205L100.109 179.83L100.797 181.319ZM115.138 174.694H113.498V178.415H115.138H116.778V174.694H115.138ZM115.138 178.415L114.491 176.908L104.302 181.279L104.948 182.786L105.595 184.294L115.784 179.922L115.138 178.415ZM104.948 182.786L106.367 183.608L106.483 183.409L105.063 182.587L103.644 181.766L103.529 181.965L104.948 182.786ZM105.063 182.587H103.423V183.069H105.063H106.703V182.587H105.063ZM105.063 183.069L106.483 182.248L106.367 182.049L104.948 182.87L103.529 183.692L103.644 183.891L105.063 183.069ZM104.948 182.87L104.302 184.377L114.491 188.749L115.138 187.242L115.784 185.734L105.595 181.363L104.948 182.87ZM115.138 187.242H113.498V190.963H115.138H116.778V187.242H115.138ZM115.138 190.963L115.825 189.474L101.485 182.849L100.797 184.338L100.109 185.827L114.45 192.452L115.138 190.963ZM128.616 168.876L130.2 169.302L130.756 167.236H128.616V168.876ZM121.697 194.58V196.22H122.954L123.281 195.006L121.697 194.58ZM118.374 194.58L116.79 194.153L116.234 196.22H118.374V194.58ZM125.293 168.876V167.236H124.036L123.709 168.449L125.293 168.876ZM128.616 168.876L127.032 168.449L120.114 194.153L121.697 194.58L123.281 195.006L130.2 169.302L128.616 168.876ZM121.697 194.58V192.94H118.374V194.58V196.22H121.697V194.58ZM118.374 194.58L119.958 195.006L126.876 169.302L125.293 168.876L123.709 168.449L116.79 194.153L118.374 194.58ZM125.293 168.876V170.516H128.616V168.876V167.236H125.293V168.876ZM146.185 184.338L146.873 185.827L147.825 185.387V184.338H146.185ZM131.845 190.963H130.205V193.527L132.532 192.452L131.845 190.963ZM131.845 187.242L131.198 185.734L130.205 186.161V187.242H131.845ZM142.034 182.87L143.453 183.692L145.93 179.414L141.387 181.363L142.034 182.87ZM141.919 183.069H140.279V189.175L143.338 183.891L141.919 183.069ZM141.919 182.587L143.338 181.766L140.279 176.481V182.587H141.919ZM142.034 182.786L141.387 184.294L145.93 186.242L143.453 181.965L142.034 182.786ZM131.845 178.415H130.205V179.496L131.198 179.922L131.845 178.415ZM131.845 174.694L132.532 173.205L130.205 172.129V174.694H131.845ZM146.185 181.319H147.825V180.27L146.873 179.83L146.185 181.319ZM146.185 184.338L145.497 182.849L131.157 189.474L131.845 190.963L132.532 192.452L146.873 185.827L146.185 184.338ZM131.845 190.963H133.485V187.242H131.845H130.205V190.963H131.845ZM131.845 187.242L132.491 188.749L142.681 184.377L142.034 182.87L141.387 181.363L131.198 185.734L131.845 187.242ZM142.034 182.87L140.615 182.049L140.499 182.248L141.919 183.069L143.338 183.891L143.453 183.692L142.034 182.87ZM141.919 183.069H143.559V182.587H141.919H140.279V183.069H141.919ZM141.919 182.587L140.499 183.409L140.615 183.608L142.034 182.786L143.453 181.965L143.338 181.766L141.919 182.587ZM142.034 182.786L142.681 181.279L132.491 176.908L131.845 178.415L131.198 179.922L141.387 184.294L142.034 182.786ZM131.845 178.415H133.485V174.694H131.845H130.205V178.415H131.845ZM131.845 174.694L131.157 176.182L145.497 182.808L146.185 181.319L146.873 179.83L132.532 173.205L131.845 174.694ZM146.185 181.319H144.545V184.338H146.185H147.825V181.319H146.185Z" fill="#0077FF" mask="url(#path-9-outside-2_1_80)"/>
20
+ </svg>
@@ -0,0 +1,351 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const os = require("os");
4
+ const { execFileSync, execSync } = require("child_process");
5
+
6
+ const APP_NAME = "swayrouter";
7
+ const APP_LABEL = "com.swayrouter.autostart";
8
+ const WINDOWS_RUN_KEY = "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run";
9
+ const WINDOWS_RUN_VALUE = "SwayRouter";
10
+ const WINDOWS_START_DELAY_MS = 5000;
11
+
12
+ function roamingAppData() {
13
+ return process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming");
14
+ }
15
+
16
+ function windowsAutoStartPaths() {
17
+ const runtimeDir = path.join(roamingAppData(), ".swayrouter", "runtime");
18
+ return {
19
+ runtimeDir,
20
+ vbsPath: path.join(runtimeDir, `${APP_NAME}-autostart.vbs`),
21
+ logPath: path.join(runtimeDir, "autostart.log"),
22
+ legacyVbsPath: path.join(
23
+ roamingAppData(),
24
+ "Microsoft",
25
+ "Windows",
26
+ "Start Menu",
27
+ "Programs",
28
+ "Startup",
29
+ `${APP_NAME}.vbs`,
30
+ ),
31
+ };
32
+ }
33
+
34
+ function windowsSystemExecutable(name) {
35
+ return path.join(process.env.SystemRoot || "C:\\Windows", "System32", name);
36
+ }
37
+
38
+ function escapeVbsString(value) {
39
+ return String(value).replace(/"/g, '""');
40
+ }
41
+
42
+ function buildWindowsVbs({ executablePath, routerScript, logPath }) {
43
+ const command = `"${executablePath}" "${routerScript}" --tray --skip-update`;
44
+ return `Option Explicit
45
+ Dim WshShell, ProcessEnv, Fso, LogFile, LogPath
46
+ Set WshShell = CreateObject("WScript.Shell")
47
+ Set ProcessEnv = WshShell.Environment("PROCESS")
48
+ Set Fso = CreateObject("Scripting.FileSystemObject")
49
+ LogPath = "${escapeVbsString(logPath)}"
50
+ WScript.Sleep ${WINDOWS_START_DELAY_MS}
51
+ ProcessEnv("SWAYROUTER_AUTOSTART_LOG") = LogPath
52
+ On Error Resume Next
53
+ Set LogFile = Fso.OpenTextFile(LogPath, 8, True)
54
+ LogFile.WriteLine Now & " Launching Sway Router"
55
+ LogFile.Close
56
+ Err.Clear
57
+ WshShell.Run "${escapeVbsString(command)}", 0, False
58
+ If Err.Number <> 0 Then
59
+ Set LogFile = Fso.OpenTextFile(LogPath, 8, True)
60
+ LogFile.WriteLine Now & " Launch failed: " & Err.Description
61
+ LogFile.Close
62
+ End If
63
+ `;
64
+ }
65
+
66
+ function parseWindowsRunValue(output) {
67
+ for (const line of String(output || "").split(/\r?\n/)) {
68
+ const match = line.match(/^\s*SwayRouter\s+REG_\w+\s+(.+?)\s*$/i);
69
+ if (match) return match[1];
70
+ }
71
+ return null;
72
+ }
73
+
74
+ function readWindowsRunValue() {
75
+ try {
76
+ const output = execFileSync("reg.exe", ["query", WINDOWS_RUN_KEY, "/v", WINDOWS_RUN_VALUE], {
77
+ encoding: "utf8",
78
+ stdio: ["ignore", "pipe", "ignore"],
79
+ windowsHide: true,
80
+ timeout: 3000,
81
+ });
82
+ return parseWindowsRunValue(output);
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ function isWindowsRunRegistrationValid(runValue, vbsPath) {
89
+ if (!runValue || !vbsPath) return false;
90
+ const normalizedValue = String(runValue).replaceAll("/", "\\").toLowerCase();
91
+ const normalizedPath = path.resolve(vbsPath).replaceAll("/", "\\").toLowerCase();
92
+ return normalizedValue.includes(normalizedPath);
93
+ }
94
+
95
+ function getCliJsPath(cliPath) {
96
+ if (cliPath) {
97
+ const resolved = path.resolve(cliPath);
98
+ if (fs.existsSync(resolved)) return resolved;
99
+ }
100
+ if (process.argv[1]) {
101
+ const resolved = path.resolve(process.argv[1]);
102
+ if (path.basename(resolved) === "cli.js" && fs.existsSync(resolved)) {
103
+ return resolved;
104
+ }
105
+ }
106
+ const computed = path.resolve(__dirname, "..", "..", "..", "cli.js");
107
+ if (fs.existsSync(computed)) return computed;
108
+ return null;
109
+ }
110
+
111
+ function enableAutoStart(cliPath) {
112
+ const platform = process.platform;
113
+
114
+ if (!["darwin", "win32", "linux"].includes(platform)) return false;
115
+ if (platform === "linux" && !process.env.DISPLAY) return false;
116
+
117
+ try {
118
+ if (platform === "darwin") return enableMacOS(cliPath);
119
+ if (platform === "win32") return enableWindows(cliPath);
120
+ if (platform === "linux") return enableLinux(cliPath);
121
+ } catch (err) {
122
+
123
+ }
124
+ return false;
125
+ }
126
+
127
+ function disableAutoStart() {
128
+ const platform = process.platform;
129
+ try {
130
+ if (platform === "darwin") return disableMacOS();
131
+ if (platform === "win32") return disableWindows();
132
+ if (platform === "linux") return disableLinux();
133
+ } catch (err) {}
134
+ return false;
135
+ }
136
+
137
+ function isAutoStartEnabled() {
138
+ const platform = process.platform;
139
+
140
+ try {
141
+ if (platform === "darwin") {
142
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", `${APP_LABEL}.plist`);
143
+ if (!fs.existsSync(plistPath)) return false;
144
+ try {
145
+ execSync(`launchctl list ${APP_LABEL}`, {
146
+ stdio: ["ignore", "ignore", "ignore"],
147
+ timeout: 3000
148
+ });
149
+ return true;
150
+ } catch (e) {
151
+ return false;
152
+ }
153
+ } else if (platform === "win32") {
154
+ const { vbsPath } = windowsAutoStartPaths();
155
+ return fs.existsSync(vbsPath) && isWindowsRunRegistrationValid(readWindowsRunValue(), vbsPath);
156
+ } else if (platform === "linux") {
157
+ const desktopPath = path.join(os.homedir(), ".config", "autostart", `${APP_NAME}.desktop`);
158
+ return fs.existsSync(desktopPath);
159
+ }
160
+ } catch (e) {}
161
+ return false;
162
+ }
163
+
164
+ function migrateLegacyAutoStart(cliPath) {
165
+ if (process.platform !== "win32") return isAutoStartEnabled();
166
+ if (isAutoStartEnabled()) return true;
167
+ const { legacyVbsPath } = windowsAutoStartPaths();
168
+ if (!fs.existsSync(legacyVbsPath)) return false;
169
+ return enableWindows(cliPath);
170
+ }
171
+
172
+ function isAgentSelfMacOS() {
173
+ try {
174
+ const output = execSync(`launchctl list ${APP_LABEL}`, {
175
+ encoding: "utf8",
176
+ stdio: ["ignore", "pipe", "ignore"],
177
+ timeout: 3000
178
+ });
179
+ const match = output.match(/"PID"\s*=\s*(\d+)/);
180
+ return !!(match && parseInt(match[1], 10) === process.pid);
181
+ } catch (e) {
182
+ return false;
183
+ }
184
+ }
185
+
186
+ function enableMacOS(cliPath) {
187
+ const launchAgentsDir = path.join(os.homedir(), "Library", "LaunchAgents");
188
+ const plistPath = path.join(launchAgentsDir, `${APP_LABEL}.plist`);
189
+
190
+ if (!fs.existsSync(launchAgentsDir)) {
191
+ fs.mkdirSync(launchAgentsDir, { recursive: true });
192
+ }
193
+
194
+ const nodePath = process.execPath;
195
+ const routerScript = getCliJsPath(cliPath);
196
+
197
+ if (!routerScript) return false;
198
+
199
+ const launchPath = `${path.dirname(nodePath)}:/usr/local/bin:/usr/bin:/bin`;
200
+
201
+ const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
202
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
203
+ <plist version="1.0">
204
+ <dict>
205
+ <key>Label</key>
206
+ <string>${APP_LABEL}</string>
207
+ <key>ProgramArguments</key>
208
+ <array>
209
+ <string>${nodePath}</string>
210
+ <string>${routerScript}</string>
211
+ <string>--tray</string>
212
+ <string>--skip-update</string>
213
+ </array>
214
+ <key>EnvironmentVariables</key>
215
+ <dict>
216
+ <key>PATH</key>
217
+ <string>${launchPath}</string>
218
+ </dict>
219
+ <key>RunAtLoad</key>
220
+ <true/>
221
+ <key>KeepAlive</key>
222
+ <false/>
223
+ <key>StandardOutPath</key>
224
+ <string>/tmp/swayrouter.log</string>
225
+ <key>StandardErrorPath</key>
226
+ <string>/tmp/swayrouter.error.log</string>
227
+ </dict>
228
+ </plist>`;
229
+
230
+ fs.writeFileSync(plistPath, plistContent);
231
+
232
+ if (isAgentSelfMacOS()) {
233
+ return true;
234
+ }
235
+
236
+ try {
237
+ execSync(`launchctl unload "${plistPath}"`, { stdio: "ignore" });
238
+ } catch (e) {}
239
+ try {
240
+ execSync(`launchctl load -w "${plistPath}"`, { stdio: "ignore" });
241
+ } catch (e) {
242
+
243
+ }
244
+ return true;
245
+ }
246
+
247
+ function disableMacOS() {
248
+ const plistPath = path.join(os.homedir(), "Library", "LaunchAgents", `${APP_LABEL}.plist`);
249
+
250
+ if (!isAgentSelfMacOS()) {
251
+ try {
252
+ execSync(`launchctl unload "${plistPath}"`, { stdio: "ignore" });
253
+ } catch (e) {}
254
+ }
255
+
256
+ if (fs.existsSync(plistPath)) {
257
+ fs.unlinkSync(plistPath);
258
+ }
259
+ return true;
260
+ }
261
+
262
+ function enableWindows(cliPath) {
263
+ const { runtimeDir, vbsPath, logPath, legacyVbsPath } = windowsAutoStartPaths();
264
+ const executablePath = process.execPath;
265
+ const routerScript = getCliJsPath(cliPath);
266
+ if (!routerScript) return false;
267
+
268
+ fs.mkdirSync(runtimeDir, { recursive: true });
269
+ fs.writeFileSync(vbsPath, buildWindowsVbs({ executablePath, routerScript, logPath }));
270
+
271
+ const runCommand = `"${windowsSystemExecutable("wscript.exe")}" "${vbsPath}"`;
272
+ execFileSync("reg.exe", [
273
+ "add",
274
+ WINDOWS_RUN_KEY,
275
+ "/v",
276
+ WINDOWS_RUN_VALUE,
277
+ "/t",
278
+ "REG_SZ",
279
+ "/d",
280
+ runCommand,
281
+ "/f",
282
+ ], {
283
+ stdio: "ignore",
284
+ windowsHide: true,
285
+ timeout: 3000,
286
+ });
287
+
288
+ try { fs.rmSync(legacyVbsPath, { force: true }); } catch {}
289
+ return isAutoStartEnabled();
290
+ }
291
+
292
+ function disableWindows() {
293
+ const { vbsPath, legacyVbsPath } = windowsAutoStartPaths();
294
+ try {
295
+ execFileSync("reg.exe", ["delete", WINDOWS_RUN_KEY, "/v", WINDOWS_RUN_VALUE, "/f"], {
296
+ stdio: "ignore",
297
+ windowsHide: true,
298
+ timeout: 3000,
299
+ });
300
+ } catch {}
301
+ try { fs.rmSync(vbsPath, { force: true }); } catch {}
302
+ try { fs.rmSync(legacyVbsPath, { force: true }); } catch {}
303
+ return true;
304
+ }
305
+
306
+ function enableLinux(cliPath) {
307
+ const autostartDir = path.join(os.homedir(), ".config", "autostart");
308
+ const desktopPath = path.join(autostartDir, `${APP_NAME}.desktop`);
309
+
310
+ if (!fs.existsSync(autostartDir)) {
311
+ try { fs.mkdirSync(autostartDir, { recursive: true }); }
312
+ catch (e) { return false; }
313
+ }
314
+
315
+ const nodePath = process.execPath;
316
+ const routerScript = getCliJsPath(cliPath);
317
+ if (!routerScript) return false;
318
+
319
+ const desktopContent = `[Desktop Entry]
320
+ Type=Application
321
+ Name=Sway Router
322
+ Comment=Sway Router API Proxy
323
+ Exec=${nodePath} ${routerScript} --tray --skip-update
324
+ Hidden=false
325
+ NoDisplay=false
326
+ X-GNOME-Autostart-enabled=true
327
+ `;
328
+ fs.writeFileSync(desktopPath, desktopContent);
329
+ return true;
330
+ }
331
+
332
+ function disableLinux() {
333
+ const desktopPath = path.join(os.homedir(), ".config", "autostart", `${APP_NAME}.desktop`);
334
+ if (fs.existsSync(desktopPath)) {
335
+ fs.unlinkSync(desktopPath);
336
+ }
337
+ return true;
338
+ }
339
+
340
+ module.exports = {
341
+ enableAutoStart,
342
+ disableAutoStart,
343
+ isAutoStartEnabled,
344
+ migrateLegacyAutoStart,
345
+ __test__: {
346
+ buildWindowsVbs,
347
+ isWindowsRunRegistrationValid,
348
+ parseWindowsRunValue,
349
+ windowsAutoStartPaths,
350
+ },
351
+ };
Binary file
Binary file
@@ -0,0 +1,258 @@
1
+ const { exec } = require("child_process");
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+
5
+ let trayInstance = null;
6
+ let isWinTray = false;
7
+
8
+ function getIconBase64() {
9
+ const isWin = process.platform === "win32";
10
+ const iconFile = isWin ? "icon.ico" : "icon.png";
11
+ try {
12
+ const iconPath = path.join(__dirname, iconFile);
13
+ if (fs.existsSync(iconPath)) {
14
+ return fs.readFileSync(iconPath).toString("base64");
15
+ }
16
+ } catch (e) {}
17
+
18
+ return "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHpJREFUOE9jYBgFgwEwMjIy/Gdg+P8fyP4PxP8ZGBgEcBnGyMjIsICBgSEAhyH/gfgBUNN8XJoZsdkCVL8Ah+b/QPwbqvkBMvk/AwMDAzYX/GdgYAhAN+A/SICRWAMYGfFEJSMjzriEiwDR/xmIa2RkZCSqnZERb3QCAAo3KxzxbKe1AAAAAElFTkSuQmCC";
19
+ }
20
+
21
+ function isTraySupported() {
22
+ const platform = process.platform;
23
+ if (!["darwin", "win32", "linux"].includes(platform)) {
24
+ return false;
25
+ }
26
+ if (platform === "linux" && !process.env.DISPLAY) {
27
+ return false;
28
+ }
29
+ return true;
30
+ }
31
+
32
+ function initTray(options) {
33
+ if (!isTraySupported()) {
34
+ return null;
35
+ }
36
+
37
+ if (process.platform === "win32") {
38
+ return initWindowsTray(options);
39
+ }
40
+ return initUnixTray(options);
41
+ }
42
+
43
+ function buildMenuItems(port, autostartEnabled) {
44
+ return [
45
+ { title: `Sway Router (Port ${port})`, tooltip: "Server is running", enabled: false },
46
+ { title: "Open Dashboard", tooltip: "Open in browser", enabled: true },
47
+ buildAutostartMenuItem(autostartEnabled),
48
+ { title: "Quit", tooltip: "Stop server and exit", enabled: true }
49
+ ];
50
+ }
51
+
52
+ function buildAutostartMenuItem(enabled) {
53
+ return {
54
+ title: "Auto-start",
55
+ tooltip: enabled
56
+ ? "Auto-start is enabled. Click to disable it."
57
+ : "Auto-start is disabled. Click to enable it.",
58
+ checked: enabled === true,
59
+ enabled: true,
60
+ };
61
+ }
62
+
63
+ const MENU_INDEX = { STATUS: 0, DASHBOARD: 1, AUTOSTART: 2, QUIT: 3 };
64
+
65
+ function getAutostartEnabled() {
66
+ try {
67
+ const { isAutoStartEnabled, migrateLegacyAutoStart } = require("./autostart");
68
+ return isAutoStartEnabled() || migrateLegacyAutoStart();
69
+ } catch (e) {
70
+ return false;
71
+ }
72
+ }
73
+
74
+ function handleClick(index, options, onAutostartToggle) {
75
+ const { onQuit, onOpenDashboard, port } = options;
76
+ if (index === MENU_INDEX.DASHBOARD) {
77
+ if (onOpenDashboard) onOpenDashboard();
78
+ else openBrowser(`http://localhost:${port}/dashboard`);
79
+ } else if (index === MENU_INDEX.AUTOSTART) {
80
+ const enabled = getAutostartEnabled();
81
+ try {
82
+ const { enableAutoStart, disableAutoStart } = require("./autostart");
83
+ if (enabled) disableAutoStart();
84
+ else enableAutoStart();
85
+ } catch (e) {}
86
+ onAutostartToggle(getAutostartEnabled());
87
+ } else if (index === MENU_INDEX.QUIT) {
88
+ console.log("\nShutting down...");
89
+ if (onQuit) onQuit();
90
+ killTray();
91
+ setTimeout(() => process.exit(0), 500);
92
+ }
93
+ }
94
+
95
+ function initWindowsTray(options) {
96
+ const { port } = options;
97
+ try {
98
+ const { initWinTray } = require("./trayWin");
99
+ const iconPath = path.join(__dirname, "icon.ico");
100
+ const autostartEnabled = getAutostartEnabled();
101
+ const items = buildMenuItems(port, autostartEnabled);
102
+
103
+ trayInstance = initWinTray({
104
+ iconPath,
105
+ tooltip: `Sway Router - Port ${port}`,
106
+ items,
107
+ onClick: (index) => {
108
+ handleClick(index, options, (newEnabled) => {
109
+ const item = buildAutostartMenuItem(newEnabled);
110
+ trayInstance.updateItem(MENU_INDEX.AUTOSTART, item.title, item.enabled, item.checked);
111
+ });
112
+ }
113
+ });
114
+
115
+ isWinTray = true;
116
+ return trayInstance;
117
+ } catch (err) {
118
+ return null;
119
+ }
120
+ }
121
+
122
+ function resolveSystray() {
123
+
124
+ try { return { mod: require("systray2").default, isV2: true }; } catch (e) {}
125
+
126
+ try { return { mod: require("systray").default, isV2: false }; } catch (e) {}
127
+ return null;
128
+ }
129
+
130
+ function chmodTrayBin(pkgName) {
131
+
132
+ try {
133
+ const binName = process.platform === "darwin" ? "tray_darwin_release" : "tray_linux_release";
134
+ const candidates = [
135
+ path.join(__dirname, "..", "..", "..", "node_modules", pkgName, "traybin", binName)
136
+ ];
137
+ for (const p of candidates) {
138
+ if (fs.existsSync(p)) fs.chmodSync(p, 0o755);
139
+ }
140
+ } catch (e) {}
141
+ }
142
+
143
+ function initUnixTray(options) {
144
+ const { port } = options;
145
+ try {
146
+ const resolved = resolveSystray();
147
+ if (!resolved) return null;
148
+ const { mod: SysTray, isV2 } = resolved;
149
+
150
+ chmodTrayBin(isV2 ? "systray2" : "systray");
151
+
152
+ const autostartEnabled = getAutostartEnabled();
153
+ const items = buildMenuItems(port, autostartEnabled);
154
+
155
+ const menu = {
156
+ icon: getIconBase64(),
157
+
158
+ isTemplateIcon: false,
159
+ title: "",
160
+ tooltip: `Sway Router - Port ${port}`,
161
+ items
162
+ };
163
+
164
+ trayInstance = new SysTray({ menu, debug: false, copyDir: true });
165
+ isWinTray = false;
166
+
167
+ trayInstance.onClick((action) => {
168
+ handleClick(action.seq_id, options, (newEnabled) => {
169
+ const item = buildAutostartMenuItem(newEnabled);
170
+ trayInstance.sendAction({
171
+ type: "update-item",
172
+ item,
173
+ seq_id: MENU_INDEX.AUTOSTART
174
+ });
175
+ });
176
+ });
177
+
178
+ if (isV2) {
179
+
180
+ trayInstance.ready().catch((err) => {
181
+ process.stderr.write(`[swayrouter] tray failed to start: ${err && err.message ? err.message : err}\n`);
182
+ });
183
+ } else {
184
+ trayInstance.onReady(() => {});
185
+ trayInstance.onError(() => {});
186
+ }
187
+
188
+ return trayInstance;
189
+ } catch (err) {
190
+ process.stderr.write(`[swayrouter] tray init error: ${err.message}\n`);
191
+ return null;
192
+ }
193
+ }
194
+
195
+ function killTray() {
196
+ const instance = trayInstance;
197
+ const wasWin = isWinTray;
198
+ trayInstance = null;
199
+ if (!instance) return Promise.resolve();
200
+
201
+ if (wasWin) {
202
+ try { instance.kill(); } catch (e) {}
203
+ return Promise.resolve();
204
+ }
205
+
206
+ let proc = null;
207
+ try {
208
+ proc = instance._process || (typeof instance.process === "function" ? instance.process() : null);
209
+ } catch (e) {}
210
+
211
+ const gracefulQuit = () => { try { instance.kill(true); } catch (e) {} };
212
+ const closeIpc = () => { try { instance.kill(false); } catch (e) {} };
213
+
214
+ if (!proc || !proc.pid) {
215
+ gracefulQuit();
216
+ closeIpc();
217
+ return Promise.resolve();
218
+ }
219
+
220
+ return new Promise((resolve) => {
221
+ let done = false;
222
+ const finish = () => { if (done) return; done = true; closeIpc(); resolve(); };
223
+
224
+ proc.once("exit", finish);
225
+ gracefulQuit();
226
+
227
+ setTimeout(() => { try { process.kill(proc.pid, 0); proc.kill("SIGTERM"); } catch (e) {} }, 800);
228
+ setTimeout(() => { try { process.kill(proc.pid, 0); proc.kill("SIGKILL"); } catch (e) {} }, 1600);
229
+
230
+ const deadline = Date.now() + 3000;
231
+ const poll = setInterval(() => {
232
+ try { process.kill(proc.pid, 0); } catch { clearInterval(poll); finish(); return; }
233
+ if (Date.now() > deadline) { clearInterval(poll); finish(); }
234
+ }, 50);
235
+ });
236
+ }
237
+
238
+ function openBrowser(url) {
239
+ const platform = process.platform;
240
+ let cmd;
241
+
242
+ if (platform === "darwin") {
243
+ cmd = `open "${url}"`;
244
+ } else if (platform === "win32") {
245
+ cmd = `start "" "${url}"`;
246
+ } else {
247
+ cmd = `xdg-open "${url}"`;
248
+ }
249
+
250
+ exec(cmd);
251
+ }
252
+
253
+ module.exports = {
254
+ initTray,
255
+ killTray,
256
+ buildMenuItems,
257
+ buildAutostartMenuItem,
258
+ };