atoo-studio 0.0.1 → 0.0.2

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 (408) hide show
  1. package/LICENSE +21 -0
  2. package/README.github.md +322 -0
  3. package/README.md +112 -0
  4. package/README.npm.md +112 -0
  5. package/bin/atoo-studio.js +90 -0
  6. package/dist/src/agents/claude-code-terminal/adapter.d.ts +42 -0
  7. package/dist/src/agents/claude-code-terminal/adapter.js +166 -0
  8. package/dist/src/agents/claude-code-terminal/index.d.ts +13 -0
  9. package/dist/src/agents/claude-code-terminal/index.js +45 -0
  10. package/dist/src/agents/claude-code-terminal/spawner.d.ts +9 -0
  11. package/dist/src/agents/claude-code-terminal/spawner.js +37 -0
  12. package/dist/src/agents/claude-code-terminal-chatro/adapter.d.ts +51 -0
  13. package/dist/src/agents/claude-code-terminal-chatro/adapter.js +301 -0
  14. package/dist/src/agents/claude-code-terminal-chatro/index.d.ts +13 -0
  15. package/dist/src/agents/claude-code-terminal-chatro/index.js +45 -0
  16. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.d.ts +67 -0
  17. package/dist/src/agents/claude-code-terminal-chatro/jsonl-watcher.js +431 -0
  18. package/dist/src/agents/claude-code-terminal-chatro/spawner.d.ts +9 -0
  19. package/dist/src/agents/claude-code-terminal-chatro/spawner.js +37 -0
  20. package/dist/src/agents/codex-terminal/adapter.d.ts +40 -0
  21. package/dist/src/agents/codex-terminal/adapter.js +160 -0
  22. package/dist/src/agents/codex-terminal/index.d.ts +13 -0
  23. package/dist/src/agents/codex-terminal/index.js +47 -0
  24. package/dist/src/agents/codex-terminal/spawner.d.ts +9 -0
  25. package/dist/src/agents/codex-terminal/spawner.js +56 -0
  26. package/dist/src/agents/codex-terminal-chatro/adapter.d.ts +58 -0
  27. package/dist/src/agents/codex-terminal-chatro/adapter.js +266 -0
  28. package/dist/src/agents/codex-terminal-chatro/index.d.ts +13 -0
  29. package/dist/src/agents/codex-terminal-chatro/index.js +50 -0
  30. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.d.ts +36 -0
  31. package/dist/src/agents/codex-terminal-chatro/jsonl-watcher.js +205 -0
  32. package/dist/src/agents/codex-terminal-chatro/spawner.d.ts +9 -0
  33. package/dist/src/agents/codex-terminal-chatro/spawner.js +57 -0
  34. package/dist/src/agents/lib/chain-builder.d.ts +21 -0
  35. package/dist/src/agents/lib/chain-builder.js +139 -0
  36. package/dist/src/agents/lib/claude/fs-sessions.d.ts +31 -0
  37. package/dist/src/agents/lib/claude/fs-sessions.js +329 -0
  38. package/dist/src/agents/lib/claude/jsonl-writer.d.ts +32 -0
  39. package/dist/src/agents/lib/claude/jsonl-writer.js +342 -0
  40. package/dist/src/agents/lib/claude/workspace-trust.d.ts +1 -0
  41. package/dist/src/agents/lib/claude/workspace-trust.js +29 -0
  42. package/dist/src/agents/lib/codex/fs-sessions.d.ts +34 -0
  43. package/dist/src/agents/lib/codex/fs-sessions.js +255 -0
  44. package/dist/src/agents/lib/codex/jsonl-mapper.d.ts +11 -0
  45. package/dist/src/agents/lib/codex/jsonl-mapper.js +154 -0
  46. package/dist/src/agents/lib/codex/jsonl-writer.d.ts +8 -0
  47. package/dist/src/agents/lib/codex/jsonl-writer.js +440 -0
  48. package/dist/src/agents/lib/fs-tracking.d.ts +36 -0
  49. package/dist/src/agents/lib/fs-tracking.js +109 -0
  50. package/dist/src/agents/lib/pty-activity-tracker.d.ts +37 -0
  51. package/dist/src/agents/lib/pty-activity-tracker.js +105 -0
  52. package/dist/src/agents/lib/session-id-utils.d.ts +46 -0
  53. package/dist/src/agents/lib/session-id-utils.js +147 -0
  54. package/dist/src/agents/lib/session-precreate.d.ts +17 -0
  55. package/dist/src/agents/lib/session-precreate.js +177 -0
  56. package/dist/src/agents/registry.d.ts +72 -0
  57. package/dist/src/agents/registry.js +337 -0
  58. package/dist/src/agents/types.d.ts +135 -0
  59. package/dist/src/agents/types.js +1 -0
  60. package/dist/src/auth/crypto-key.d.ts +6 -0
  61. package/dist/src/auth/crypto-key.js +45 -0
  62. package/dist/src/auth/middleware.d.ts +18 -0
  63. package/dist/src/auth/middleware.js +54 -0
  64. package/dist/src/auth/password.d.ts +2 -0
  65. package/dist/src/auth/password.js +12 -0
  66. package/dist/src/auth/session.d.ts +10 -0
  67. package/dist/src/auth/session.js +33 -0
  68. package/dist/src/auth/totp.d.ts +12 -0
  69. package/dist/src/auth/totp.js +61 -0
  70. package/dist/src/auth/webauthn.d.ts +6 -0
  71. package/dist/src/auth/webauthn.js +117 -0
  72. package/dist/src/config.d.ts +10 -0
  73. package/dist/src/config.js +16 -0
  74. package/dist/src/database/connection-manager.d.ts +25 -0
  75. package/dist/src/database/connection-manager.js +211 -0
  76. package/dist/src/database/discovery/container.d.ts +6 -0
  77. package/dist/src/database/discovery/container.js +226 -0
  78. package/dist/src/database/discovery/env-parser.d.ts +9 -0
  79. package/dist/src/database/discovery/env-parser.js +525 -0
  80. package/dist/src/database/discovery/local-files.d.ts +6 -0
  81. package/dist/src/database/discovery/local-files.js +58 -0
  82. package/dist/src/database/discovery/port-scan.d.ts +7 -0
  83. package/dist/src/database/discovery/port-scan.js +61 -0
  84. package/dist/src/database/drivers/cassandra.d.ts +12 -0
  85. package/dist/src/database/drivers/cassandra.js +91 -0
  86. package/dist/src/database/drivers/clickhouse.d.ts +11 -0
  87. package/dist/src/database/drivers/clickhouse.js +127 -0
  88. package/dist/src/database/drivers/elasticsearch.d.ts +12 -0
  89. package/dist/src/database/drivers/elasticsearch.js +169 -0
  90. package/dist/src/database/drivers/influxdb.d.ts +14 -0
  91. package/dist/src/database/drivers/influxdb.js +194 -0
  92. package/dist/src/database/drivers/memcached.d.ts +11 -0
  93. package/dist/src/database/drivers/memcached.js +117 -0
  94. package/dist/src/database/drivers/mongodb.d.ts +12 -0
  95. package/dist/src/database/drivers/mongodb.js +128 -0
  96. package/dist/src/database/drivers/mysql.d.ts +11 -0
  97. package/dist/src/database/drivers/mysql.js +112 -0
  98. package/dist/src/database/drivers/neo4j.d.ts +11 -0
  99. package/dist/src/database/drivers/neo4j.js +158 -0
  100. package/dist/src/database/drivers/postgresql.d.ts +11 -0
  101. package/dist/src/database/drivers/postgresql.js +133 -0
  102. package/dist/src/database/drivers/redis.d.ts +11 -0
  103. package/dist/src/database/drivers/redis.js +91 -0
  104. package/dist/src/database/drivers/sqlite.d.ts +10 -0
  105. package/dist/src/database/drivers/sqlite.js +100 -0
  106. package/dist/src/database/query-stream.d.ts +5 -0
  107. package/dist/src/database/query-stream.js +75 -0
  108. package/dist/src/database/types.d.ts +71 -0
  109. package/dist/src/database/types.js +1 -0
  110. package/dist/src/events/index.d.ts +3 -0
  111. package/dist/src/events/index.js +3 -0
  112. package/dist/src/events/types.d.ts +214 -0
  113. package/dist/src/events/types.js +22 -0
  114. package/dist/src/events/wire.d.ts +114 -0
  115. package/dist/src/events/wire.js +296 -0
  116. package/dist/src/fs-monitor-types.d.ts +24 -0
  117. package/dist/src/fs-monitor-types.js +1 -0
  118. package/dist/src/fs-monitor.d.ts +80 -0
  119. package/dist/src/fs-monitor.js +637 -0
  120. package/dist/src/handlers/auth.d.ts +1 -0
  121. package/dist/src/handlers/auth.js +170 -0
  122. package/dist/src/handlers/changes.d.ts +1 -0
  123. package/dist/src/handlers/changes.js +203 -0
  124. package/dist/src/handlers/containers.d.ts +12 -0
  125. package/dist/src/handlers/containers.js +379 -0
  126. package/dist/src/handlers/databases.d.ts +3 -0
  127. package/dist/src/handlers/databases.js +327 -0
  128. package/dist/src/handlers/environments.d.ts +3 -0
  129. package/dist/src/handlers/environments.js +286 -0
  130. package/dist/src/handlers/github.d.ts +1 -0
  131. package/dist/src/handlers/github.js +153 -0
  132. package/dist/src/handlers/projects.d.ts +1 -0
  133. package/dist/src/handlers/projects.js +895 -0
  134. package/dist/src/handlers/ssh.d.ts +1 -0
  135. package/dist/src/handlers/ssh.js +162 -0
  136. package/dist/src/handlers/users.d.ts +1 -0
  137. package/dist/src/handlers/users.js +195 -0
  138. package/dist/src/index.d.ts +1 -0
  139. package/dist/src/index.js +228 -0
  140. package/dist/src/mcp/config.d.ts +32 -0
  141. package/dist/src/mcp/config.js +227 -0
  142. package/dist/src/mcp/server.d.ts +1 -0
  143. package/dist/src/mcp/server.js +574 -0
  144. package/dist/src/serial/cuse-device.d.ts +19 -0
  145. package/dist/src/serial/cuse-device.js +260 -0
  146. package/dist/src/serial/manager.d.ts +63 -0
  147. package/dist/src/serial/manager.js +206 -0
  148. package/dist/src/serial/pty-pair.d.ts +16 -0
  149. package/dist/src/serial/pty-pair.js +68 -0
  150. package/dist/src/services/fs-browser.d.ts +14 -0
  151. package/dist/src/services/fs-browser.js +98 -0
  152. package/dist/src/services/git-ops.d.ts +78 -0
  153. package/dist/src/services/git-ops.js +288 -0
  154. package/dist/src/services/github-ops.d.ts +104 -0
  155. package/dist/src/services/github-ops.js +192 -0
  156. package/dist/src/services/obfuscation.d.ts +2 -0
  157. package/dist/src/services/obfuscation.js +16 -0
  158. package/dist/src/services/preview/headless-backend.d.ts +62 -0
  159. package/dist/src/services/preview/headless-backend.js +698 -0
  160. package/dist/src/services/preview/injected-scripts.d.ts +9 -0
  161. package/dist/src/services/preview/injected-scripts.js +232 -0
  162. package/dist/src/services/preview/preview-backend.d.ts +92 -0
  163. package/dist/src/services/preview/preview-backend.js +15 -0
  164. package/dist/src/services/preview/universal-setter.d.ts +7 -0
  165. package/dist/src/services/preview/universal-setter.js +46 -0
  166. package/dist/src/services/preview-manager.d.ts +50 -0
  167. package/dist/src/services/preview-manager.js +216 -0
  168. package/dist/src/services/project-watcher.d.ts +6 -0
  169. package/dist/src/services/project-watcher.js +307 -0
  170. package/dist/src/services/remote-fs-browser.d.ts +11 -0
  171. package/dist/src/services/remote-fs-browser.js +50 -0
  172. package/dist/src/services/remote-git-ops.d.ts +71 -0
  173. package/dist/src/services/remote-git-ops.js +215 -0
  174. package/dist/src/services/session-search.d.ts +56 -0
  175. package/dist/src/services/session-search.js +303 -0
  176. package/dist/src/services/ssh-manager.d.ts +44 -0
  177. package/dist/src/services/ssh-manager.js +359 -0
  178. package/dist/src/session-writer.d.ts +9 -0
  179. package/dist/src/session-writer.js +66 -0
  180. package/dist/src/spawner.d.ts +56 -0
  181. package/dist/src/spawner.js +135 -0
  182. package/dist/src/state/db.d.ts +214 -0
  183. package/dist/src/state/db.js +897 -0
  184. package/dist/src/state/store.d.ts +37 -0
  185. package/dist/src/state/store.js +108 -0
  186. package/dist/src/state/types.d.ts +13 -0
  187. package/dist/src/state/types.js +1 -0
  188. package/dist/src/web/devtools-proxy.d.ts +7 -0
  189. package/dist/src/web/devtools-proxy.js +176 -0
  190. package/dist/src/web/port-proxy.d.ts +15 -0
  191. package/dist/src/web/port-proxy.js +124 -0
  192. package/dist/src/web/preview-ws.d.ts +5 -0
  193. package/dist/src/web/preview-ws.js +207 -0
  194. package/dist/src/web/server.d.ts +6 -0
  195. package/dist/src/web/server.js +1694 -0
  196. package/dist/src/ws/agent-ws.d.ts +5 -0
  197. package/dist/src/ws/agent-ws.js +93 -0
  198. package/frontend/dist/assets/_basePickBy-B-LibQ4-.js +1 -0
  199. package/frontend/dist/assets/_baseUniq-CprifHap.js +1 -0
  200. package/frontend/dist/assets/_createAssigner-ByDUqGii.js +1 -0
  201. package/frontend/dist/assets/abap-DuT-3z4x.js +1 -0
  202. package/frontend/dist/assets/addon-fit-CxQet2ja.js +1 -0
  203. package/frontend/dist/assets/addon-web-links-D_jRkPIl.js +1 -0
  204. package/frontend/dist/assets/apex-B-em86xX.js +1 -0
  205. package/frontend/dist/assets/api-SUPuHhSY.js +2 -0
  206. package/frontend/dist/assets/arc-Z0_eVteO.js +1 -0
  207. package/frontend/dist/assets/architecture-PBZL5I3N-hvVXGhqd.js +1 -0
  208. package/frontend/dist/assets/architectureDiagram-2XIMDMQ5-DiHPxX4j.js +36 -0
  209. package/frontend/dist/assets/array-CwG8vNfn.js +1 -0
  210. package/frontend/dist/assets/auth-store-R7eW5SVu.js +1 -0
  211. package/frontend/dist/assets/azcli-Bg9wQloi.js +1 -0
  212. package/frontend/dist/assets/bat-BM46z99L.js +1 -0
  213. package/frontend/dist/assets/bicep-DcBsJUfh.js +2 -0
  214. package/frontend/dist/assets/blockDiagram-WCTKOSBZ-C40u_hLo.js +132 -0
  215. package/frontend/dist/assets/c4Diagram-IC4MRINW-Ct7LjWFQ.js +10 -0
  216. package/frontend/dist/assets/cameligo-zw7JTtim.js +1 -0
  217. package/frontend/dist/assets/channel-ClCsE6HN.js +1 -0
  218. package/frontend/dist/assets/chunk-4BX2VUAB-zZ6P90VO.js +1 -0
  219. package/frontend/dist/assets/chunk-55IACEB6-DXllTDQl.js +1 -0
  220. package/frontend/dist/assets/chunk-7E7YKBS2-7zRaOLjj.js +1 -0
  221. package/frontend/dist/assets/chunk-7R4GIKGN-Csst1274.js +80 -0
  222. package/frontend/dist/assets/chunk-C72U2L5F-_JbQPbLN.js +1 -0
  223. package/frontend/dist/assets/chunk-CFjPhJqf.js +1 -0
  224. package/frontend/dist/assets/chunk-EGIJ26TM-B--aFyPw.js +1 -0
  225. package/frontend/dist/assets/chunk-FMBD7UC4-DVR34RNb.js +15 -0
  226. package/frontend/dist/assets/chunk-GEFDOKGD-CnmN6cC8.js +2 -0
  227. package/frontend/dist/assets/chunk-JSJVCQXG-CWxHBzeJ.js +1 -0
  228. package/frontend/dist/assets/chunk-KX2RTZJC-DkRk56s7.js +1 -0
  229. package/frontend/dist/assets/chunk-KYZI473N-DCCsG2dK.js +53 -0
  230. package/frontend/dist/assets/chunk-L3YUKLVL-C-DkZTMr.js +1 -0
  231. package/frontend/dist/assets/chunk-MX3YWQON-OUdzv5sZ.js +1 -0
  232. package/frontend/dist/assets/chunk-NQ4KR5QH-Bpu9FsM7.js +220 -0
  233. package/frontend/dist/assets/chunk-O4XLMI2P-BMLK6_ib.js +7 -0
  234. package/frontend/dist/assets/chunk-OZEHJAEY-CNNiJtG0.js +1 -0
  235. package/frontend/dist/assets/chunk-PQ6SQG4A-evVHD3KM.js +1 -0
  236. package/frontend/dist/assets/chunk-PU5JKC2W-DPFTYuvl.js +70 -0
  237. package/frontend/dist/assets/chunk-QZHKN3VN-JRdddPvu.js +1 -0
  238. package/frontend/dist/assets/chunk-R5LLSJPH-CHQzVVOV.js +1 -0
  239. package/frontend/dist/assets/chunk-WL4C6EOR-BNFU6IIi.js +189 -0
  240. package/frontend/dist/assets/chunk-XIRO2GV7-98T93G85.js +1 -0
  241. package/frontend/dist/assets/chunk-XZSTWKYB-BcW3cyNp.js +94 -0
  242. package/frontend/dist/assets/chunk-YBOYWFTD-BgKO1qAJ.js +1 -0
  243. package/frontend/dist/assets/classDiagram-VBA2DB6C-DikXzgcD.js +1 -0
  244. package/frontend/dist/assets/classDiagram-v2-RAHNMMFH-D7E3tQUK.js +1 -0
  245. package/frontend/dist/assets/clojure-FspFoNNQ.js +1 -0
  246. package/frontend/dist/assets/clone-mOXuZa7C.js +1 -0
  247. package/frontend/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  248. package/frontend/dist/assets/coffee-13n8Bk2W.js +1 -0
  249. package/frontend/dist/assets/cose-bilkent-S5V4N54A-zUOWQqLe.js +1 -0
  250. package/frontend/dist/assets/cpp-BVm2xGEs.js +1 -0
  251. package/frontend/dist/assets/csharp-D2kAWmUm.js +1 -0
  252. package/frontend/dist/assets/csp-Ezvgpf0e.js +1 -0
  253. package/frontend/dist/assets/css-CYxRwcFy.js +3 -0
  254. package/frontend/dist/assets/css.worker-Cd5h-ZOL.js +89 -0
  255. package/frontend/dist/assets/cssMode-CrXej49V.js +1 -0
  256. package/frontend/dist/assets/cypher-jg3SGErc.js +1 -0
  257. package/frontend/dist/assets/cytoscape.esm-kyyvzxNV.js +321 -0
  258. package/frontend/dist/assets/dagre-DH4bgZO7.js +1 -0
  259. package/frontend/dist/assets/dagre-KLK3FWXG-DNSqDkwT.js +4 -0
  260. package/frontend/dist/assets/dart-179jqhK4.js +1 -0
  261. package/frontend/dist/assets/defaultLocale-Dda4OpKy.js +1 -0
  262. package/frontend/dist/assets/diagram-E7M64L7V-RqPNT5Vs.js +24 -0
  263. package/frontend/dist/assets/diagram-IFDJBPK2-B-5NRyaE.js +43 -0
  264. package/frontend/dist/assets/diagram-P4PSJMXO-BrP69Hk0.js +24 -0
  265. package/frontend/dist/assets/dist-CU_Nb1G5.js +1 -0
  266. package/frontend/dist/assets/dockerfile-CIAtSGxS.js +1 -0
  267. package/frontend/dist/assets/ecl-CGVKfDxD.js +1 -0
  268. package/frontend/dist/assets/editor-Br_kD0ds.css +1 -0
  269. package/frontend/dist/assets/editor.api2-YXkDn0Gm.js +872 -0
  270. package/frontend/dist/assets/editor.main-fBaXZjJ0.js +6 -0
  271. package/frontend/dist/assets/elixir-BZ-6w0y3.js +1 -0
  272. package/frontend/dist/assets/erDiagram-INFDFZHY-BYiB9NYg.js +70 -0
  273. package/frontend/dist/assets/flow9-CVuOjTMv.js +1 -0
  274. package/frontend/dist/assets/flowDiagram-PKNHOUZH-Cwq47rsR.js +162 -0
  275. package/frontend/dist/assets/freemarker2-DM-pztJU.js +3 -0
  276. package/frontend/dist/assets/fsharp-q0pGJYr6.js +1 -0
  277. package/frontend/dist/assets/ganttDiagram-A5KZAMGK-Dnx3szD9.js +292 -0
  278. package/frontend/dist/assets/gitGraph-HDMCJU4V-COlTQ7bA.js +1 -0
  279. package/frontend/dist/assets/gitGraphDiagram-K3NZZRJ6-BaUxboNc.js +65 -0
  280. package/frontend/dist/assets/go-dzSPfdEO.js +1 -0
  281. package/frontend/dist/assets/graphlib-kEFlkt3U.js +1 -0
  282. package/frontend/dist/assets/graphql-CG4OUoEV.js +1 -0
  283. package/frontend/dist/assets/handlebars-BbK53Vec.js +1 -0
  284. package/frontend/dist/assets/hcl-Cy14JPk3.js +1 -0
  285. package/frontend/dist/assets/html-DYtTQNOG.js +1 -0
  286. package/frontend/dist/assets/html.worker-BjVEKLoU.js +502 -0
  287. package/frontend/dist/assets/htmlMode-C6GTouth.js +1 -0
  288. package/frontend/dist/assets/index-DMLxes_u.js +157 -0
  289. package/frontend/dist/assets/index-DmzeqkB1.css +1 -0
  290. package/frontend/dist/assets/info-3K5VOQVL-DBtHyA4C.js +1 -0
  291. package/frontend/dist/assets/infoDiagram-LFFYTUFH-yBXLgMPI.js +2 -0
  292. package/frontend/dist/assets/ini-Pbg8HGVD.js +1 -0
  293. package/frontend/dist/assets/init-D6KNwrax.js +1 -0
  294. package/frontend/dist/assets/ishikawaDiagram-PHBUUO56-Bld4two_.js +70 -0
  295. package/frontend/dist/assets/java-BmVu6Qrl.js +1 -0
  296. package/frontend/dist/assets/javascript-PbfQEdcJ.js +1 -0
  297. package/frontend/dist/assets/journeyDiagram-4ABVD52K-4HyMd4R2.js +139 -0
  298. package/frontend/dist/assets/json.worker-DqU5Wxnl.js +58 -0
  299. package/frontend/dist/assets/jsonMode-CASsGppE.js +7 -0
  300. package/frontend/dist/assets/julia-3cGnieBq.js +1 -0
  301. package/frontend/dist/assets/kanban-definition-K7BYSVSG-DpgsZmpG.js +89 -0
  302. package/frontend/dist/assets/katex-CEw3x5bf.js +261 -0
  303. package/frontend/dist/assets/kotlin-BuWkVcfV.js +1 -0
  304. package/frontend/dist/assets/less-CJ_VPy2C.js +2 -0
  305. package/frontend/dist/assets/lexon-BygAuZPu.js +1 -0
  306. package/frontend/dist/assets/line-CA_wh_TY.js +1 -0
  307. package/frontend/dist/assets/linear-BAcLW45z.js +1 -0
  308. package/frontend/dist/assets/liquid-kz84dle6.js +1 -0
  309. package/frontend/dist/assets/lspLanguageFeatures-C7hAHFn1.js +4 -0
  310. package/frontend/dist/assets/lua-C8Xs3dCx.js +1 -0
  311. package/frontend/dist/assets/m3-DTJeKBk4.js +1 -0
  312. package/frontend/dist/assets/markdown-QCgx8JqZ.js +1 -0
  313. package/frontend/dist/assets/math-D0YcMJAn.js +1 -0
  314. package/frontend/dist/assets/mdx-yRw0ap-E.js +1 -0
  315. package/frontend/dist/assets/mermaid-parser.core-DAeTodBQ.js +4 -0
  316. package/frontend/dist/assets/mindmap-definition-YRQLILUH-CoNlFyVl.js +68 -0
  317. package/frontend/dist/assets/mips-DopWaYgE.js +1 -0
  318. package/frontend/dist/assets/monaco.contribution-DeY0Qei-.js +2 -0
  319. package/frontend/dist/assets/msdax-BDis4ARV.js +1 -0
  320. package/frontend/dist/assets/mysql-BV6MLsOI.js +1 -0
  321. package/frontend/dist/assets/objective-c-B1UuzKs6.js +1 -0
  322. package/frontend/dist/assets/ordinal-jM7S0YHN.js +1 -0
  323. package/frontend/dist/assets/packet-RMMSAZCW-FF6-Tmai.js +1 -0
  324. package/frontend/dist/assets/pascal-BkvESCrc.js +1 -0
  325. package/frontend/dist/assets/pascaligo-lTy0kZYr.js +1 -0
  326. package/frontend/dist/assets/path-DNPd7Py7.js +1 -0
  327. package/frontend/dist/assets/perl-CrtUPXLV.js +1 -0
  328. package/frontend/dist/assets/pgsql-B9IbNWx2.js +1 -0
  329. package/frontend/dist/assets/php-CXvQBY2p.js +1 -0
  330. package/frontend/dist/assets/pie-UPGHQEXC-CFvXY2o-.js +1 -0
  331. package/frontend/dist/assets/pieDiagram-SKSYHLDU-CM_hbCcn.js +30 -0
  332. package/frontend/dist/assets/pla-DxBxuqWu.js +1 -0
  333. package/frontend/dist/assets/postiats-OkEuT5YF.js +1 -0
  334. package/frontend/dist/assets/powerquery-CMx5Tq4K.js +1 -0
  335. package/frontend/dist/assets/powershell-CstRxrEc.js +1 -0
  336. package/frontend/dist/assets/preload-helper-D4M6sveU.js +1 -0
  337. package/frontend/dist/assets/protobuf-Bx0Z-uRj.js +2 -0
  338. package/frontend/dist/assets/pug--W8vanWl.js +1 -0
  339. package/frontend/dist/assets/python-DA0rnlw3.js +1 -0
  340. package/frontend/dist/assets/qsharp-CRtr0YbN.js +1 -0
  341. package/frontend/dist/assets/quadrantDiagram-337W2JSQ-B3n3IUhC.js +7 -0
  342. package/frontend/dist/assets/r-C6E1d6iv.js +1 -0
  343. package/frontend/dist/assets/radar-KQ55EAFF-MPZu7SdX.js +1 -0
  344. package/frontend/dist/assets/razor-yd73uata.js +1 -0
  345. package/frontend/dist/assets/redis-Dx13voP3.js +1 -0
  346. package/frontend/dist/assets/redshift-D66HwlyV.js +1 -0
  347. package/frontend/dist/assets/requirementDiagram-Z7DCOOCP-CorP7L7F.js +73 -0
  348. package/frontend/dist/assets/restructuredtext-DQT2NKJ2.js +1 -0
  349. package/frontend/dist/assets/rough.esm-DxAX5Vpo.js +1 -0
  350. package/frontend/dist/assets/ruby-iFXI8hwH.js +1 -0
  351. package/frontend/dist/assets/rust-CSKiei34.js +1 -0
  352. package/frontend/dist/assets/sankeyDiagram-WA2Y5GQK-RDx6Bd-B.js +10 -0
  353. package/frontend/dist/assets/sb-Bo3ttdP2.js +1 -0
  354. package/frontend/dist/assets/scala-BC1D-Nxp.js +1 -0
  355. package/frontend/dist/assets/scheme-Z4OAo4Lv.js +1 -0
  356. package/frontend/dist/assets/scss-BvrdPs6B.js +3 -0
  357. package/frontend/dist/assets/sequenceDiagram-2WXFIKYE-JMqJSFq6.js +145 -0
  358. package/frontend/dist/assets/shell-Bh_aCyF-.js +1 -0
  359. package/frontend/dist/assets/solidity-CWHj6tSe.js +1 -0
  360. package/frontend/dist/assets/sophia-raoNtKtm.js +1 -0
  361. package/frontend/dist/assets/sparql-XzmoGnue.js +1 -0
  362. package/frontend/dist/assets/sql-BD0i9Gvg.js +1 -0
  363. package/frontend/dist/assets/src-Bn-kKzs7.js +1 -0
  364. package/frontend/dist/assets/st-DtVKyms6.js +1 -0
  365. package/frontend/dist/assets/stateDiagram-RAJIS63D-CgFfENdy.js +1 -0
  366. package/frontend/dist/assets/stateDiagram-v2-FVOUBMTO-C4Hh2P-U.js +1 -0
  367. package/frontend/dist/assets/swift--UZs77wT.js +1 -0
  368. package/frontend/dist/assets/systemverilog-CDnBSWUd.js +1 -0
  369. package/frontend/dist/assets/tcl-DdCEuTHZ.js +1 -0
  370. package/frontend/dist/assets/timeline-definition-YZTLITO2-BnatPBR5.js +61 -0
  371. package/frontend/dist/assets/treemap-KZPCXAKY-qb1Pl9la.js +1 -0
  372. package/frontend/dist/assets/ts.worker-DyPAEIuH.js +67719 -0
  373. package/frontend/dist/assets/tsMode-iuvyEpyO.js +11 -0
  374. package/frontend/dist/assets/twig-SSL-Altf.js +1 -0
  375. package/frontend/dist/assets/typescript-17918Hud.js +1 -0
  376. package/frontend/dist/assets/typespec-BT7S0ETg.js +1 -0
  377. package/frontend/dist/assets/vb-CrIgucua.js +1 -0
  378. package/frontend/dist/assets/vennDiagram-LZ73GAT5-DygS4Zzd.js +34 -0
  379. package/frontend/dist/assets/wgsl-BeKc3oEp.js +298 -0
  380. package/frontend/dist/assets/workers-DTfwKVoM.js +1 -0
  381. package/frontend/dist/assets/xml-CBMr_Wbw.js +1 -0
  382. package/frontend/dist/assets/xterm-BrP-ENHg.css +1 -0
  383. package/frontend/dist/assets/xterm-CBX2m0YM.js +36 -0
  384. package/frontend/dist/assets/xychartDiagram-JWTSCODW-D6wY1Jwd.js +7 -0
  385. package/frontend/dist/assets/yaml-CTjCH7Bv.js +1 -0
  386. package/frontend/dist/fonts/inter-300.ttf +0 -0
  387. package/frontend/dist/fonts/inter-400.ttf +0 -0
  388. package/frontend/dist/fonts/inter-500.ttf +0 -0
  389. package/frontend/dist/fonts/inter-600.ttf +0 -0
  390. package/frontend/dist/fonts/inter-700.ttf +0 -0
  391. package/frontend/dist/index.html +49 -0
  392. package/frontend/dist/logo_192x192.png +0 -0
  393. package/frontend/dist/logo_32x32.png +0 -0
  394. package/frontend/dist/logo_512x512.png +0 -0
  395. package/frontend/dist/logo_64x64.png +0 -0
  396. package/frontend/dist/logobg_192x192.png +0 -0
  397. package/frontend/dist/logobg_512x512.png +0 -0
  398. package/frontend/dist/logobg_64x64.png +0 -0
  399. package/frontend/dist/manifest.json +25 -0
  400. package/frontend/dist/sw.js +22 -0
  401. package/package.json +74 -7
  402. package/preload/Makefile +12 -0
  403. package/preload/atoo-studio-preload.c +647 -0
  404. package/preload/atoo-studio-preload.so +0 -0
  405. package/setup-cuse.sh +260 -0
  406. package/setup.sh +81 -0
  407. package/src/serial/native/binding.gyp +10 -0
  408. package/src/serial/native/pty_pair.c +222 -0
@@ -0,0 +1,37 @@
1
+ import type { Session, SessionEvent } from './types.js';
2
+ import type WebSocket from 'ws';
3
+ export type AgentStatus = 'open' | 'active' | 'attention';
4
+ declare class Store {
5
+ sessions: Map<string, Session>;
6
+ agentStatuses: Map<string, AgentStatus>;
7
+ contextUsages: Map<string, {
8
+ model: string;
9
+ usedTokens: number;
10
+ totalTokens: number;
11
+ percent: number;
12
+ freePercent: number;
13
+ }>;
14
+ contextInProgressSessions: Set<string>;
15
+ statusClients: Set<WebSocket>;
16
+ private eventListeners;
17
+ /**
18
+ * Subscribe to ingress events for a session. Returns an unsubscribe function.
19
+ */
20
+ addEventListener(sessionId: string, cb: (event: any) => void): () => void;
21
+ /** Notify event listeners for a session. */
22
+ notifyEventListeners(sessionId: string, event: any): void;
23
+ addEvent(sessionId: string, event: SessionEvent): boolean;
24
+ setAgentStatus(sessionId: string, status: AgentStatus): void;
25
+ removeAgentStatus(sessionId: string): void;
26
+ getAgentStatus(sessionId: string): AgentStatus;
27
+ setContextInProgress(sessionId: string, inProgress: boolean): void;
28
+ setContextUsage(sessionId: string, usage: {
29
+ model: string;
30
+ usedTokens: number;
31
+ totalTokens: number;
32
+ percent: number;
33
+ freePercent: number;
34
+ }): void;
35
+ }
36
+ export declare const store: Store;
37
+ export {};
@@ -0,0 +1,108 @@
1
+ class Store {
2
+ sessions = new Map();
3
+ agentStatuses = new Map(); // sessionId → status
4
+ contextUsages = new Map(); // sessionId → token usage
5
+ contextInProgressSessions = new Set(); // sessions currently running /context flow
6
+ // WebSocket connections
7
+ statusClients = new Set(); // global status listeners
8
+ // Event listeners for agent layer
9
+ eventListeners = new Map();
10
+ /**
11
+ * Subscribe to ingress events for a session. Returns an unsubscribe function.
12
+ */
13
+ addEventListener(sessionId, cb) {
14
+ if (!this.eventListeners.has(sessionId)) {
15
+ this.eventListeners.set(sessionId, new Set());
16
+ }
17
+ this.eventListeners.get(sessionId).add(cb);
18
+ return () => {
19
+ this.eventListeners.get(sessionId)?.delete(cb);
20
+ if (this.eventListeners.get(sessionId)?.size === 0) {
21
+ this.eventListeners.delete(sessionId);
22
+ }
23
+ };
24
+ }
25
+ /** Notify event listeners for a session. */
26
+ notifyEventListeners(sessionId, event) {
27
+ const listeners = this.eventListeners.get(sessionId);
28
+ if (!listeners)
29
+ return;
30
+ for (const cb of listeners) {
31
+ try {
32
+ cb(event);
33
+ }
34
+ catch (err) {
35
+ console.error(`[store] Event listener error for ${sessionId}:`, err);
36
+ }
37
+ }
38
+ }
39
+ addEvent(sessionId, event) {
40
+ const session = this.sessions.get(sessionId);
41
+ if (!session)
42
+ return false;
43
+ // Deduplicate by UUID
44
+ if (event.uuid && session.events.some((e) => e.uuid === event.uuid)) {
45
+ return false;
46
+ }
47
+ session.events.push(event);
48
+ // Notify event listeners (agent layer)
49
+ this.notifyEventListeners(sessionId, event);
50
+ return true;
51
+ }
52
+ setAgentStatus(sessionId, status) {
53
+ const prev = this.agentStatuses.get(sessionId);
54
+ if (prev === status)
55
+ return;
56
+ this.agentStatuses.set(sessionId, status);
57
+ const msg = { type: 'agent_status', status, session_id: sessionId };
58
+ // Broadcast to global status listeners (sidebar)
59
+ const data = JSON.stringify(msg);
60
+ for (const ws of this.statusClients) {
61
+ if (ws.readyState === 1)
62
+ ws.send(data);
63
+ }
64
+ }
65
+ removeAgentStatus(sessionId) {
66
+ this.agentStatuses.delete(sessionId);
67
+ this.contextInProgressSessions.delete(sessionId);
68
+ this.contextUsages.delete(sessionId);
69
+ // Broadcast 'exited' so frontends remove the session from active state
70
+ const msg = { type: 'agent_status', status: 'exited', session_id: sessionId };
71
+ const data = JSON.stringify(msg);
72
+ for (const ws of this.statusClients) {
73
+ if (ws.readyState === 1)
74
+ ws.send(data);
75
+ }
76
+ }
77
+ getAgentStatus(sessionId) {
78
+ return this.agentStatuses.get(sessionId) || 'open';
79
+ }
80
+ setContextInProgress(sessionId, inProgress) {
81
+ if (inProgress) {
82
+ this.contextInProgressSessions.add(sessionId);
83
+ }
84
+ else {
85
+ this.contextInProgressSessions.delete(sessionId);
86
+ }
87
+ const listeners = this.eventListeners.get(sessionId);
88
+ console.log(`[store] setContextInProgress(${sessionId}, ${inProgress}) — eventListeners=${listeners?.size ?? 0}, statusClients=${this.statusClients.size}`);
89
+ const msg = { type: 'context_in_progress', session_id: sessionId, inProgress };
90
+ // Notify agent event listeners so the adapter can re-emit with agent session ID
91
+ this.notifyEventListeners(sessionId, msg);
92
+ const data = JSON.stringify(msg);
93
+ for (const ws of this.statusClients) {
94
+ if (ws.readyState === 1)
95
+ ws.send(data);
96
+ }
97
+ }
98
+ setContextUsage(sessionId, usage) {
99
+ this.contextUsages.set(sessionId, usage);
100
+ const msg = { type: 'context_usage', session_id: sessionId, ...usage };
101
+ const data = JSON.stringify(msg);
102
+ for (const ws of this.statusClients) {
103
+ if (ws.readyState === 1)
104
+ ws.send(data);
105
+ }
106
+ }
107
+ }
108
+ export const store = new Store();
@@ -0,0 +1,13 @@
1
+ import type { SessionEvent } from '../events/types.js';
2
+ export type { SessionEvent } from '../events/types.js';
3
+ export interface Session {
4
+ id: string;
5
+ title: string;
6
+ environmentId: string;
7
+ status: 'active' | 'archived';
8
+ events: SessionEvent[];
9
+ createdAt: Date;
10
+ source: string;
11
+ permissionMode?: string;
12
+ fsUuid?: string;
13
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import express from 'express';
2
+ import http from 'http';
3
+ import { WebSocketServer } from 'ws';
4
+ import { Duplex } from 'stream';
5
+ export declare function devtoolsProxyMiddleware(): express.Router;
6
+ export declare function isDevtoolsWsUpgrade(url: string): boolean;
7
+ export declare function handleDevtoolsWsUpgrade(wss: WebSocketServer, req: http.IncomingMessage, socket: Duplex, head: Buffer): void;
@@ -0,0 +1,176 @@
1
+ import express from 'express';
2
+ import http from 'http';
3
+ import { WebSocket } from 'ws';
4
+ import { previewManager } from '../services/preview-manager.js';
5
+ /** Make an HTTP GET request to Chrome's CDP endpoint */
6
+ function httpGet(instance, urlPath) {
7
+ return new Promise((resolve, reject) => {
8
+ const opts = { host: 'localhost', port: instance.cdpPort, path: urlPath };
9
+ const req = http.get(opts, (resp) => {
10
+ const chunks = [];
11
+ resp.on('data', (c) => chunks.push(c));
12
+ resp.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
13
+ });
14
+ req.on('error', reject);
15
+ req.setTimeout(5000, () => { req.destroy(); reject(new Error('timeout')); });
16
+ });
17
+ }
18
+ /** Build WS URL to Chrome CDP */
19
+ function buildCdpWsUrl(instance, cdpPath) {
20
+ return `ws://localhost:${instance.cdpPort}/${cdpPath}`;
21
+ }
22
+ // HTTP proxy middleware for Chrome DevTools frontend
23
+ export function devtoolsProxyMiddleware() {
24
+ const router = express.Router();
25
+ // Get DevTools URL for a preview instance (returns the correct page target URL)
26
+ router.get('/apps/:projectId/:tabId/devtools-url', async (req, res) => {
27
+ const { projectId, tabId } = req.params;
28
+ const instance = previewManager.get(projectId, tabId);
29
+ if (!instance) {
30
+ return res.status(404).json({ error: 'Preview instance not found' });
31
+ }
32
+ if (!instance.cdpPort) {
33
+ return res.status(400).json({ error: 'DevTools not available for this instance' });
34
+ }
35
+ try {
36
+ const targetsJson = await httpGet(instance, '/json');
37
+ const targets = JSON.parse(targetsJson);
38
+ const pageTarget = targets.find((t) => t.type === 'page');
39
+ if (!pageTarget) {
40
+ return res.status(404).json({ error: 'No page target found' });
41
+ }
42
+ const versionJson = await httpGet(instance, '/json/version');
43
+ const version = JSON.parse(versionJson);
44
+ const host = req.get('host');
45
+ const wsPath = `ws/devtools/${encodeURIComponent(projectId)}/${encodeURIComponent(tabId)}/devtools/page/${pageTarget.id}`;
46
+ const devtoolsFrontend = `/apps/${encodeURIComponent(projectId)}/${encodeURIComponent(tabId)}/devtools/inspector.html?${req.protocol === 'https' ? 'wss' : 'ws'}=${host}/${wsPath}`;
47
+ console.log(`[devtools-proxy] Target: ${pageTarget.id} (${pageTarget.url})`);
48
+ console.log(`[devtools-proxy] Frontend URL: ${devtoolsFrontend}`);
49
+ res.json({
50
+ url: devtoolsFrontend,
51
+ targetId: pageTarget.id,
52
+ targetUrl: pageTarget.url,
53
+ wsProxy: wsPath,
54
+ browserWs: version.webSocketDebuggerUrl,
55
+ });
56
+ }
57
+ catch (err) {
58
+ res.status(502).json({ error: `Failed to get targets: ${err.message}` });
59
+ }
60
+ });
61
+ // Proxy DevTools frontend files: /apps/:projectId/:tabId/devtools/*
62
+ router.get('/apps/:projectId/:tabId/devtools/{*rest}', async (req, res) => {
63
+ const projectId = req.params.projectId, tabId = req.params.tabId;
64
+ const instance = previewManager.get(projectId, tabId);
65
+ if (!instance) {
66
+ return res.status(404).json({ error: 'Preview instance not found' });
67
+ }
68
+ if (!instance.cdpPort) {
69
+ return res.status(400).json({ error: 'DevTools not available for this instance' });
70
+ }
71
+ const restParam = req.params.rest;
72
+ const devtoolsPath = Array.isArray(restParam) ? restParam.join('/') : (restParam || '');
73
+ const queryString = req.url.includes('?') ? '?' + req.url.split('?')[1] : '';
74
+ const targetPath = `/devtools/${devtoolsPath}${queryString}`;
75
+ try {
76
+ const opts = { host: 'localhost', port: instance.cdpPort, path: targetPath };
77
+ const proxyReq = http.get(opts, (proxyRes) => {
78
+ res.status(proxyRes.statusCode || 200);
79
+ for (const [key, val] of Object.entries(proxyRes.headers)) {
80
+ if (key !== 'transfer-encoding' && val) {
81
+ res.set(key, val);
82
+ }
83
+ }
84
+ proxyRes.pipe(res);
85
+ });
86
+ proxyReq.on('error', (err) => {
87
+ res.status(502).json({ error: `DevTools proxy error: ${err.message}` });
88
+ });
89
+ }
90
+ catch (err) {
91
+ res.status(502).json({ error: err.message });
92
+ }
93
+ });
94
+ return router;
95
+ }
96
+ // WebSocket proxy for DevTools
97
+ export function isDevtoolsWsUpgrade(url) {
98
+ return url.startsWith('/ws/devtools/');
99
+ }
100
+ export function handleDevtoolsWsUpgrade(wss, req, socket, head) {
101
+ const url = req.url || '';
102
+ const match = url.match(/^\/ws\/devtools\/([^/?]+)\/([^/?]+)\/(.*)/);
103
+ if (!match) {
104
+ socket.destroy();
105
+ return;
106
+ }
107
+ const projectId = decodeURIComponent(match[1]);
108
+ const tabId = decodeURIComponent(match[2]);
109
+ const cdpPath = match[3];
110
+ const instance = previewManager.get(projectId, tabId);
111
+ if (!instance || !instance.cdpPort) {
112
+ socket.write('HTTP/1.1 404 Not Found\r\n\r\n');
113
+ socket.destroy();
114
+ return;
115
+ }
116
+ const targetWsUrl = buildCdpWsUrl(instance, cdpPath);
117
+ console.log(`[devtools-proxy] WS upgrade: ${cdpPath} → ${targetWsUrl}`);
118
+ wss.handleUpgrade(req, socket, head, (clientWs) => {
119
+ const targetWs = new WebSocket(targetWsUrl);
120
+ const bufferedMessages = [];
121
+ let targetReady = false;
122
+ // Keepalive: ping both sides every 30s to prevent idle timeout
123
+ const pingInterval = setInterval(() => {
124
+ if (clientWs.readyState === 1)
125
+ clientWs.ping();
126
+ if (targetWs.readyState === 1)
127
+ targetWs.ping();
128
+ }, 30_000);
129
+ clientWs.on('message', (data, isBinary) => {
130
+ if (targetReady) {
131
+ if (targetWs.readyState === 1) {
132
+ targetWs.send(data, { binary: isBinary });
133
+ }
134
+ }
135
+ else {
136
+ bufferedMessages.push(isBinary ? Buffer.from(data) : data.toString());
137
+ }
138
+ });
139
+ targetWs.on('open', () => {
140
+ console.log(`[devtools-proxy] WS connected to Chrome CDP (${cdpPath})`);
141
+ targetReady = true;
142
+ for (const msg of bufferedMessages) {
143
+ if (targetWs.readyState === 1) {
144
+ targetWs.send(msg);
145
+ }
146
+ }
147
+ bufferedMessages.length = 0;
148
+ targetWs.on('message', (data, isBinary) => {
149
+ if (clientWs.readyState === 1) {
150
+ clientWs.send(data, { binary: isBinary });
151
+ }
152
+ });
153
+ });
154
+ targetWs.on('error', (err) => {
155
+ console.error(`[devtools-proxy] Target WS error:`, err.message);
156
+ clientWs.close(1011, 'Target connection error');
157
+ });
158
+ targetWs.on('close', (code, reason) => {
159
+ clearInterval(pingInterval);
160
+ console.log(`[devtools-proxy] Target WS closed: ${code} ${reason}`);
161
+ if (clientWs.readyState <= 1)
162
+ clientWs.close(code || 1000, reason?.toString() || '');
163
+ });
164
+ clientWs.on('close', (code, reason) => {
165
+ clearInterval(pingInterval);
166
+ console.log(`[devtools-proxy] Client WS closed: ${code}`);
167
+ if (targetWs.readyState <= 1)
168
+ targetWs.close();
169
+ });
170
+ clientWs.on('error', (err) => {
171
+ console.error(`[devtools-proxy] Client WS error:`, err.message);
172
+ if (targetWs.readyState <= 1)
173
+ targetWs.close();
174
+ });
175
+ });
176
+ }
@@ -0,0 +1,15 @@
1
+ import http from 'http';
2
+ import httpProxy from 'http-proxy';
3
+ import type { Request, Response, NextFunction } from 'express';
4
+ import type { Duplex } from 'stream';
5
+ interface ProxyTarget {
6
+ port: number;
7
+ path: string;
8
+ connectionId?: string;
9
+ }
10
+ export declare function extractPortProxyTarget(req: http.IncomingMessage): ProxyTarget | null;
11
+ export declare function createPortProxy(): httpProxy;
12
+ export declare function portProxyMiddleware(proxy: httpProxy): (req: Request, res: Response, next: NextFunction) => Promise<void>;
13
+ export declare function isPortProxyUpgrade(req: http.IncomingMessage): boolean;
14
+ export declare function handlePortProxyUpgrade(proxy: httpProxy, req: http.IncomingMessage, socket: Duplex, head: Buffer): Promise<void>;
15
+ export {};
@@ -0,0 +1,124 @@
1
+ import httpProxy from 'http-proxy';
2
+ import { WEB_PORT } from '../config.js';
3
+ import { sshManager } from '../services/ssh-manager.js';
4
+ const SUBDOMAIN_RE = /^(\d+)\.port\.on\./;
5
+ const PATH_PREFIX_RE = /^\/at\/port\/(\d+)(\/.*)?$/;
6
+ const REMOTE_PATH_PREFIX_RE = /^\/at\/remote\/([^/]+)\/port\/(\d+)(\/.*)?$/;
7
+ const REMOTE_SUBDOMAIN_RE = /^(\d+)\.remote\.([^.]+)\.on\./;
8
+ export function extractPortProxyTarget(req) {
9
+ const host = req.headers.host || '';
10
+ const hostWithoutPort = host.replace(/:\d+$/, '');
11
+ // Subdomain format: {portnr}.port.on.{domain}
12
+ const subdomainMatch = hostWithoutPort.match(SUBDOMAIN_RE);
13
+ if (subdomainMatch) {
14
+ const port = parseInt(subdomainMatch[1], 10);
15
+ if (port > 0 && port <= 65535 && port !== WEB_PORT) {
16
+ return { port, path: req.url || '/' };
17
+ }
18
+ }
19
+ // Path format: /at/port/{portnr}[/rest]
20
+ const url = req.url || '/';
21
+ const pathMatch = url.match(PATH_PREFIX_RE);
22
+ if (pathMatch) {
23
+ const port = parseInt(pathMatch[1], 10);
24
+ if (port > 0 && port <= 65535 && port !== WEB_PORT) {
25
+ return { port, path: pathMatch[2] || '/' };
26
+ }
27
+ }
28
+ // Remote path format: /at/remote/{connId}/port/{portnr}[/rest]
29
+ const remotePathMatch = url.match(REMOTE_PATH_PREFIX_RE);
30
+ if (remotePathMatch) {
31
+ const connectionId = remotePathMatch[1];
32
+ const port = parseInt(remotePathMatch[2], 10);
33
+ if (port > 0 && port <= 65535) {
34
+ return { port, path: remotePathMatch[3] || '/', connectionId };
35
+ }
36
+ }
37
+ // Remote subdomain format: {port}.remote.{connId}.on.{domain}
38
+ const remoteSubMatch = hostWithoutPort.match(REMOTE_SUBDOMAIN_RE);
39
+ if (remoteSubMatch) {
40
+ const port = parseInt(remoteSubMatch[1], 10);
41
+ const connectionId = remoteSubMatch[2];
42
+ if (port > 0 && port <= 65535) {
43
+ return { port, path: req.url || '/', connectionId };
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ export function createPortProxy() {
49
+ const proxy = httpProxy.createProxyServer({
50
+ ws: true,
51
+ xfwd: true,
52
+ changeOrigin: true,
53
+ });
54
+ proxy.on('error', (err, req, res) => {
55
+ const target = extractPortProxyTarget(req);
56
+ const port = target?.port || 'unknown';
57
+ console.error(`[port-proxy] Error proxying to localhost:${port}:`, err.message);
58
+ if (res && 'writeHead' in res && !res.headersSent) {
59
+ res.writeHead(502, { 'Content-Type': 'text/plain' });
60
+ res.end(`Port proxy error: could not connect to localhost:${port}`);
61
+ }
62
+ });
63
+ return proxy;
64
+ }
65
+ export function portProxyMiddleware(proxy) {
66
+ return async (req, res, next) => {
67
+ const target = extractPortProxyTarget(req);
68
+ if (!target) {
69
+ next();
70
+ return;
71
+ }
72
+ req.url = target.path;
73
+ if (target.connectionId) {
74
+ // Remote proxy via SSH tunnel
75
+ try {
76
+ const localPort = await sshManager.getOrCreateForwardTunnel(target.connectionId, target.port);
77
+ console.log(`[port-proxy] HTTP ${req.method} -> SSH:${target.connectionId}:${target.port} (via local:${localPort})${target.path}`);
78
+ proxy.web(req, res, { target: `http://127.0.0.1:${localPort}` });
79
+ }
80
+ catch (err) {
81
+ console.error(`[port-proxy] SSH tunnel error:`, err.message);
82
+ res.status(502).send(`SSH tunnel error: ${err.message}`);
83
+ }
84
+ }
85
+ else {
86
+ console.log(`[port-proxy] HTTP ${req.method} -> localhost:${target.port}${target.path}`);
87
+ proxy.web(req, res, { target: `http://127.0.0.1:${target.port}` });
88
+ }
89
+ };
90
+ }
91
+ export function isPortProxyUpgrade(req) {
92
+ return extractPortProxyTarget(req) !== null;
93
+ }
94
+ export async function handlePortProxyUpgrade(proxy, req, socket, head) {
95
+ const target = extractPortProxyTarget(req);
96
+ if (!target) {
97
+ socket.destroy();
98
+ return;
99
+ }
100
+ req.url = target.path;
101
+ let localPort = target.port;
102
+ if (target.connectionId) {
103
+ try {
104
+ localPort = await sshManager.getOrCreateForwardTunnel(target.connectionId, target.port);
105
+ console.log(`[port-proxy] WS upgrade -> SSH:${target.connectionId}:${target.port} (via local:${localPort})${target.path}`);
106
+ }
107
+ catch (err) {
108
+ console.error(`[port-proxy] SSH tunnel error for WS upgrade:`, err.message);
109
+ socket.destroy();
110
+ return;
111
+ }
112
+ }
113
+ else {
114
+ console.log(`[port-proxy] WS upgrade -> localhost:${target.port}${target.path}`);
115
+ }
116
+ proxy.ws(req, socket, head, {
117
+ target: `http://127.0.0.1:${localPort}`,
118
+ }, (err) => {
119
+ if (err) {
120
+ console.error(`[port-proxy] WS upgrade error to localhost:${localPort}:`, err.message);
121
+ socket.destroy();
122
+ }
123
+ });
124
+ }
@@ -0,0 +1,5 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import http from 'http';
3
+ import { Duplex } from 'stream';
4
+ export declare function isPreviewWsUpgrade(url: string): boolean;
5
+ export declare function handlePreviewWsUpgrade(wss: WebSocketServer, req: http.IncomingMessage, socket: Duplex, head: Buffer): void;