@agentuity/cli 2.0.11 → 3.0.0-alpha.1

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 (339) hide show
  1. package/dist/cmd/ai/prompt/index.d.ts.map +1 -1
  2. package/dist/cmd/ai/prompt/index.js +2 -7
  3. package/dist/cmd/ai/prompt/index.js.map +1 -1
  4. package/dist/cmd/build/adapters/generic.d.ts +29 -0
  5. package/dist/cmd/build/adapters/generic.d.ts.map +1 -0
  6. package/dist/cmd/build/adapters/generic.js +190 -0
  7. package/dist/cmd/build/adapters/generic.js.map +1 -0
  8. package/dist/cmd/build/adapters/index.d.ts +15 -0
  9. package/dist/cmd/build/adapters/index.d.ts.map +1 -0
  10. package/dist/cmd/build/adapters/index.js +24 -0
  11. package/dist/cmd/build/adapters/index.js.map +1 -0
  12. package/dist/cmd/build/adapters/nextjs.d.ts +11 -0
  13. package/dist/cmd/build/adapters/nextjs.d.ts.map +1 -0
  14. package/dist/cmd/build/adapters/nextjs.js +118 -0
  15. package/dist/cmd/build/adapters/nextjs.js.map +1 -0
  16. package/dist/cmd/build/adapters/static-server.d.ts +23 -0
  17. package/dist/cmd/build/adapters/static-server.d.ts.map +1 -0
  18. package/dist/cmd/build/adapters/static-server.js +137 -0
  19. package/dist/cmd/build/adapters/static-server.js.map +1 -0
  20. package/dist/cmd/build/adapters/types.d.ts +71 -0
  21. package/dist/cmd/build/adapters/types.d.ts.map +1 -0
  22. package/dist/cmd/build/adapters/types.js +8 -0
  23. package/dist/cmd/build/adapters/types.js.map +1 -0
  24. package/dist/cmd/build/detect/engine.d.ts +24 -0
  25. package/dist/cmd/build/detect/engine.d.ts.map +1 -0
  26. package/dist/cmd/build/detect/engine.js +91 -0
  27. package/dist/cmd/build/detect/engine.js.map +1 -0
  28. package/dist/cmd/build/detect/frameworks.d.ts +66 -0
  29. package/dist/cmd/build/detect/frameworks.d.ts.map +1 -0
  30. package/dist/cmd/build/detect/frameworks.js +278 -0
  31. package/dist/cmd/build/detect/frameworks.js.map +1 -0
  32. package/dist/cmd/build/detect/generic.d.ts +13 -0
  33. package/dist/cmd/build/detect/generic.d.ts.map +1 -0
  34. package/dist/cmd/build/detect/generic.js +62 -0
  35. package/dist/cmd/build/detect/generic.js.map +1 -0
  36. package/dist/cmd/build/detect/index.d.ts +27 -0
  37. package/dist/cmd/build/detect/index.d.ts.map +1 -0
  38. package/dist/cmd/build/detect/index.js +76 -0
  39. package/dist/cmd/build/detect/index.js.map +1 -0
  40. package/dist/cmd/build/detect/types.d.ts +91 -0
  41. package/dist/cmd/build/detect/types.d.ts.map +1 -0
  42. package/dist/cmd/build/detect/types.js +9 -0
  43. package/dist/cmd/build/detect/types.js.map +1 -0
  44. package/dist/cmd/build/detect/util.d.ts +41 -0
  45. package/dist/cmd/build/detect/util.d.ts.map +1 -0
  46. package/dist/cmd/build/detect/util.js +101 -0
  47. package/dist/cmd/build/detect/util.js.map +1 -0
  48. package/dist/cmd/build/index.d.ts.map +1 -1
  49. package/dist/cmd/build/index.js +49 -22
  50. package/dist/cmd/build/index.js.map +1 -1
  51. package/dist/cmd/build/package/index.d.ts +30 -0
  52. package/dist/cmd/build/package/index.d.ts.map +1 -0
  53. package/dist/cmd/build/package/index.js +39 -0
  54. package/dist/cmd/build/package/index.js.map +1 -0
  55. package/dist/cmd/build/package/launch.d.ts +56 -0
  56. package/dist/cmd/build/package/launch.d.ts.map +1 -0
  57. package/dist/cmd/build/package/launch.js +56 -0
  58. package/dist/cmd/build/package/launch.js.map +1 -0
  59. package/dist/cmd/build/typecheck.d.ts.map +1 -1
  60. package/dist/cmd/build/typecheck.js +8 -0
  61. package/dist/cmd/build/typecheck.js.map +1 -1
  62. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  63. package/dist/cmd/cloud/deploy.js +63 -13
  64. package/dist/cmd/cloud/deploy.js.map +1 -1
  65. package/dist/cmd/coder/create.js +7 -7
  66. package/dist/cmd/coder/create.js.map +1 -1
  67. package/dist/cmd/coder/update.js +8 -8
  68. package/dist/cmd/coder/update.js.map +1 -1
  69. package/dist/cmd/coder/workspace/create.js +9 -9
  70. package/dist/cmd/coder/workspace/create.js.map +1 -1
  71. package/dist/cmd/dev/index.d.ts +9 -0
  72. package/dist/cmd/dev/index.d.ts.map +1 -1
  73. package/dist/cmd/dev/index.js +127 -923
  74. package/dist/cmd/dev/index.js.map +1 -1
  75. package/dist/cmd/project/auth/shared.d.ts.map +1 -1
  76. package/dist/cmd/project/auth/shared.js +14 -38
  77. package/dist/cmd/project/auth/shared.js.map +1 -1
  78. package/dist/cmd/project/create.d.ts.map +1 -1
  79. package/dist/cmd/project/create.js +12 -19
  80. package/dist/cmd/project/create.js.map +1 -1
  81. package/dist/cmd/project/frameworks-ai-examples.d.ts +15 -0
  82. package/dist/cmd/project/frameworks-ai-examples.d.ts.map +1 -0
  83. package/dist/cmd/project/frameworks-ai-examples.js +160 -0
  84. package/dist/cmd/project/frameworks-ai-examples.js.map +1 -0
  85. package/dist/cmd/project/frameworks-landing-pages.d.ts +17 -0
  86. package/dist/cmd/project/frameworks-landing-pages.d.ts.map +1 -0
  87. package/dist/cmd/project/frameworks-landing-pages.js +242 -0
  88. package/dist/cmd/project/frameworks-landing-pages.js.map +1 -0
  89. package/dist/cmd/project/frameworks.d.ts +58 -0
  90. package/dist/cmd/project/frameworks.d.ts.map +1 -0
  91. package/dist/cmd/project/frameworks.js +152 -0
  92. package/dist/cmd/project/frameworks.js.map +1 -0
  93. package/dist/cmd/project/reconcile.d.ts.map +1 -1
  94. package/dist/cmd/project/reconcile.js +10 -23
  95. package/dist/cmd/project/reconcile.js.map +1 -1
  96. package/dist/cmd/project/remote-import.js +1 -1
  97. package/dist/cmd/project/scaffold.d.ts +58 -0
  98. package/dist/cmd/project/scaffold.d.ts.map +1 -0
  99. package/dist/cmd/project/scaffold.js +223 -0
  100. package/dist/cmd/project/scaffold.js.map +1 -0
  101. package/dist/cmd/project/template-flow.d.ts +8 -4
  102. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  103. package/dist/cmd/project/template-flow.js +93 -144
  104. package/dist/cmd/project/template-flow.js.map +1 -1
  105. package/dist/deploy-metadata.d.ts +49 -0
  106. package/dist/deploy-metadata.d.ts.map +1 -0
  107. package/dist/deploy-metadata.js +183 -0
  108. package/dist/deploy-metadata.js.map +1 -0
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/types.d.ts +24 -30
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/types.js.map +1 -1
  115. package/package.json +13 -8
  116. package/src/cmd/ai/prompt/index.ts +2 -7
  117. package/src/cmd/build/adapters/generic.ts +239 -0
  118. package/src/cmd/build/adapters/index.ts +30 -0
  119. package/src/cmd/build/adapters/nextjs.ts +146 -0
  120. package/src/cmd/build/adapters/static-server.ts +143 -0
  121. package/src/cmd/build/adapters/types.ts +93 -0
  122. package/src/cmd/build/detect/engine.ts +111 -0
  123. package/src/cmd/build/detect/frameworks.ts +335 -0
  124. package/src/cmd/build/detect/generic.ts +71 -0
  125. package/src/cmd/build/detect/index.ts +122 -0
  126. package/src/cmd/build/detect/types.ts +109 -0
  127. package/src/cmd/build/detect/util.ts +104 -0
  128. package/src/cmd/build/index.ts +64 -24
  129. package/src/cmd/build/package/index.ts +66 -0
  130. package/src/cmd/build/package/launch.ts +104 -0
  131. package/src/cmd/build/typecheck.ts +9 -0
  132. package/src/cmd/cloud/deploy.ts +86 -13
  133. package/src/cmd/coder/create.ts +8 -8
  134. package/src/cmd/coder/update.ts +7 -7
  135. package/src/cmd/coder/workspace/create.ts +10 -10
  136. package/src/cmd/dev/index.ts +155 -1059
  137. package/src/cmd/project/auth/shared.ts +14 -39
  138. package/src/cmd/project/create.ts +14 -19
  139. package/src/cmd/project/frameworks-ai-examples.ts +166 -0
  140. package/src/cmd/project/frameworks-landing-pages.ts +267 -0
  141. package/src/cmd/project/frameworks.ts +223 -0
  142. package/src/cmd/project/reconcile.ts +10 -22
  143. package/src/cmd/project/remote-import.ts +1 -1
  144. package/src/cmd/project/scaffold.ts +300 -0
  145. package/src/cmd/project/template-flow.ts +102 -156
  146. package/src/deploy-metadata.ts +253 -0
  147. package/src/index.ts +0 -2
  148. package/src/types.ts +0 -31
  149. package/dist/agents-docs.d.ts +0 -23
  150. package/dist/agents-docs.d.ts.map +0 -1
  151. package/dist/agents-docs.js +0 -56
  152. package/dist/agents-docs.js.map +0 -1
  153. package/dist/cmd/ai/prompt/agent.d.ts +0 -10
  154. package/dist/cmd/ai/prompt/agent.d.ts.map +0 -1
  155. package/dist/cmd/ai/prompt/agent.js +0 -28
  156. package/dist/cmd/ai/prompt/agent.js.map +0 -1
  157. package/dist/cmd/build/app-router-detector.d.ts +0 -39
  158. package/dist/cmd/build/app-router-detector.d.ts.map +0 -1
  159. package/dist/cmd/build/app-router-detector.js +0 -229
  160. package/dist/cmd/build/app-router-detector.js.map +0 -1
  161. package/dist/cmd/build/format-schema.d.ts +0 -6
  162. package/dist/cmd/build/format-schema.d.ts.map +0 -1
  163. package/dist/cmd/build/format-schema.js +0 -60
  164. package/dist/cmd/build/format-schema.js.map +0 -1
  165. package/dist/cmd/build/vite/agent-discovery.d.ts +0 -37
  166. package/dist/cmd/build/vite/agent-discovery.d.ts.map +0 -1
  167. package/dist/cmd/build/vite/agent-discovery.js +0 -263
  168. package/dist/cmd/build/vite/agent-discovery.js.map +0 -1
  169. package/dist/cmd/build/vite/beacon-plugin.d.ts +0 -19
  170. package/dist/cmd/build/vite/beacon-plugin.d.ts.map +0 -1
  171. package/dist/cmd/build/vite/beacon-plugin.js +0 -137
  172. package/dist/cmd/build/vite/beacon-plugin.js.map +0 -1
  173. package/dist/cmd/build/vite/browser-env-plugin.d.ts +0 -9
  174. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +0 -1
  175. package/dist/cmd/build/vite/browser-env-plugin.js +0 -28
  176. package/dist/cmd/build/vite/browser-env-plugin.js.map +0 -1
  177. package/dist/cmd/build/vite/bun-dev-server.d.ts +0 -67
  178. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +0 -1
  179. package/dist/cmd/build/vite/bun-dev-server.js +0 -340
  180. package/dist/cmd/build/vite/bun-dev-server.js.map +0 -1
  181. package/dist/cmd/build/vite/bundle-files.d.ts +0 -12
  182. package/dist/cmd/build/vite/bundle-files.d.ts.map +0 -1
  183. package/dist/cmd/build/vite/bundle-files.js +0 -107
  184. package/dist/cmd/build/vite/bundle-files.js.map +0 -1
  185. package/dist/cmd/build/vite/config-loader.d.ts +0 -29
  186. package/dist/cmd/build/vite/config-loader.d.ts.map +0 -1
  187. package/dist/cmd/build/vite/config-loader.js +0 -57
  188. package/dist/cmd/build/vite/config-loader.js.map +0 -1
  189. package/dist/cmd/build/vite/db-rewrite.d.ts +0 -50
  190. package/dist/cmd/build/vite/db-rewrite.d.ts.map +0 -1
  191. package/dist/cmd/build/vite/db-rewrite.js +0 -169
  192. package/dist/cmd/build/vite/db-rewrite.js.map +0 -1
  193. package/dist/cmd/build/vite/docs-generator.d.ts +0 -13
  194. package/dist/cmd/build/vite/docs-generator.d.ts.map +0 -1
  195. package/dist/cmd/build/vite/docs-generator.js +0 -97
  196. package/dist/cmd/build/vite/docs-generator.js.map +0 -1
  197. package/dist/cmd/build/vite/env-types-generator.d.ts +0 -26
  198. package/dist/cmd/build/vite/env-types-generator.d.ts.map +0 -1
  199. package/dist/cmd/build/vite/env-types-generator.js +0 -110
  200. package/dist/cmd/build/vite/env-types-generator.js.map +0 -1
  201. package/dist/cmd/build/vite/index.d.ts +0 -3
  202. package/dist/cmd/build/vite/index.d.ts.map +0 -1
  203. package/dist/cmd/build/vite/index.js +0 -4
  204. package/dist/cmd/build/vite/index.js.map +0 -1
  205. package/dist/cmd/build/vite/lifecycle-generator.d.ts +0 -19
  206. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +0 -1
  207. package/dist/cmd/build/vite/lifecycle-generator.js +0 -328
  208. package/dist/cmd/build/vite/lifecycle-generator.js.map +0 -1
  209. package/dist/cmd/build/vite/metadata-generator.d.ts +0 -36
  210. package/dist/cmd/build/vite/metadata-generator.d.ts.map +0 -1
  211. package/dist/cmd/build/vite/metadata-generator.js +0 -575
  212. package/dist/cmd/build/vite/metadata-generator.js.map +0 -1
  213. package/dist/cmd/build/vite/prompt-generator.d.ts +0 -23
  214. package/dist/cmd/build/vite/prompt-generator.d.ts.map +0 -1
  215. package/dist/cmd/build/vite/prompt-generator.js +0 -123
  216. package/dist/cmd/build/vite/prompt-generator.js.map +0 -1
  217. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
  218. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
  219. package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
  220. package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
  221. package/dist/cmd/build/vite/route-discovery.d.ts +0 -64
  222. package/dist/cmd/build/vite/route-discovery.d.ts.map +0 -1
  223. package/dist/cmd/build/vite/route-discovery.js +0 -187
  224. package/dist/cmd/build/vite/route-discovery.js.map +0 -1
  225. package/dist/cmd/build/vite/server-bundler.d.ts +0 -20
  226. package/dist/cmd/build/vite/server-bundler.d.ts.map +0 -1
  227. package/dist/cmd/build/vite/server-bundler.js +0 -388
  228. package/dist/cmd/build/vite/server-bundler.js.map +0 -1
  229. package/dist/cmd/build/vite/static-renderer.d.ts +0 -26
  230. package/dist/cmd/build/vite/static-renderer.d.ts.map +0 -1
  231. package/dist/cmd/build/vite/static-renderer.js +0 -188
  232. package/dist/cmd/build/vite/static-renderer.js.map +0 -1
  233. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +0 -15
  234. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +0 -1
  235. package/dist/cmd/build/vite/tailwind-source-plugin.js +0 -61
  236. package/dist/cmd/build/vite/tailwind-source-plugin.js.map +0 -1
  237. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +0 -24
  238. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +0 -1
  239. package/dist/cmd/build/vite/vite-asset-server-config.js +0 -285
  240. package/dist/cmd/build/vite/vite-asset-server-config.js.map +0 -1
  241. package/dist/cmd/build/vite/vite-asset-server.d.ts +0 -30
  242. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +0 -1
  243. package/dist/cmd/build/vite/vite-asset-server.js +0 -109
  244. package/dist/cmd/build/vite/vite-asset-server.js.map +0 -1
  245. package/dist/cmd/build/vite/vite-builder.d.ts +0 -59
  246. package/dist/cmd/build/vite/vite-builder.d.ts.map +0 -1
  247. package/dist/cmd/build/vite/vite-builder.js +0 -401
  248. package/dist/cmd/build/vite/vite-builder.js.map +0 -1
  249. package/dist/cmd/build/vite/workbench-generator.d.ts +0 -10
  250. package/dist/cmd/build/vite/workbench-generator.d.ts.map +0 -1
  251. package/dist/cmd/build/vite/workbench-generator.js +0 -135
  252. package/dist/cmd/build/vite/workbench-generator.js.map +0 -1
  253. package/dist/cmd/build/vite/ws-proxy.d.ts +0 -53
  254. package/dist/cmd/build/vite/ws-proxy.d.ts.map +0 -1
  255. package/dist/cmd/build/vite/ws-proxy.js +0 -95
  256. package/dist/cmd/build/vite/ws-proxy.js.map +0 -1
  257. package/dist/cmd/build/vite-bundler.d.ts +0 -29
  258. package/dist/cmd/build/vite-bundler.d.ts.map +0 -1
  259. package/dist/cmd/build/vite-bundler.js +0 -93
  260. package/dist/cmd/build/vite-bundler.js.map +0 -1
  261. package/dist/cmd/dev/agents.d.ts +0 -2
  262. package/dist/cmd/dev/agents.d.ts.map +0 -1
  263. package/dist/cmd/dev/agents.js +0 -123
  264. package/dist/cmd/dev/agents.js.map +0 -1
  265. package/dist/cmd/dev/api.d.ts +0 -20
  266. package/dist/cmd/dev/api.d.ts.map +0 -1
  267. package/dist/cmd/dev/api.js +0 -42
  268. package/dist/cmd/dev/api.js.map +0 -1
  269. package/dist/cmd/dev/dev-lock.d.ts +0 -62
  270. package/dist/cmd/dev/dev-lock.d.ts.map +0 -1
  271. package/dist/cmd/dev/dev-lock.js +0 -250
  272. package/dist/cmd/dev/dev-lock.js.map +0 -1
  273. package/dist/cmd/dev/download.d.ts +0 -11
  274. package/dist/cmd/dev/download.d.ts.map +0 -1
  275. package/dist/cmd/dev/download.js +0 -94
  276. package/dist/cmd/dev/download.js.map +0 -1
  277. package/dist/cmd/dev/file-watcher.d.ts +0 -24
  278. package/dist/cmd/dev/file-watcher.d.ts.map +0 -1
  279. package/dist/cmd/dev/file-watcher.js +0 -349
  280. package/dist/cmd/dev/file-watcher.js.map +0 -1
  281. package/dist/cmd/dev/process-manager.d.ts +0 -104
  282. package/dist/cmd/dev/process-manager.d.ts.map +0 -1
  283. package/dist/cmd/dev/process-manager.js +0 -204
  284. package/dist/cmd/dev/process-manager.js.map +0 -1
  285. package/dist/cmd/dev/sync.d.ts +0 -12
  286. package/dist/cmd/dev/sync.d.ts.map +0 -1
  287. package/dist/cmd/dev/sync.js +0 -227
  288. package/dist/cmd/dev/sync.js.map +0 -1
  289. package/dist/cmd/dev/templates.d.ts +0 -3
  290. package/dist/cmd/dev/templates.d.ts.map +0 -1
  291. package/dist/cmd/dev/templates.js +0 -58
  292. package/dist/cmd/dev/templates.js.map +0 -1
  293. package/dist/cmd/project/download.d.ts +0 -35
  294. package/dist/cmd/project/download.d.ts.map +0 -1
  295. package/dist/cmd/project/download.js +0 -403
  296. package/dist/cmd/project/download.js.map +0 -1
  297. package/dist/cmd/project/templates.d.ts +0 -9
  298. package/dist/cmd/project/templates.d.ts.map +0 -1
  299. package/dist/cmd/project/templates.js +0 -34
  300. package/dist/cmd/project/templates.js.map +0 -1
  301. package/src/agents-docs.ts +0 -86
  302. package/src/cmd/ai/prompt/agent.md +0 -305
  303. package/src/cmd/ai/prompt/agent.ts +0 -31
  304. package/src/cmd/build/app-router-detector.ts +0 -320
  305. package/src/cmd/build/format-schema.ts +0 -66
  306. package/src/cmd/build/vite/agent-discovery.ts +0 -380
  307. package/src/cmd/build/vite/beacon-plugin.ts +0 -164
  308. package/src/cmd/build/vite/browser-env-plugin.ts +0 -34
  309. package/src/cmd/build/vite/bun-dev-server.ts +0 -458
  310. package/src/cmd/build/vite/bundle-files.ts +0 -135
  311. package/src/cmd/build/vite/config-loader.ts +0 -76
  312. package/src/cmd/build/vite/db-rewrite.ts +0 -189
  313. package/src/cmd/build/vite/docs-generator.ts +0 -103
  314. package/src/cmd/build/vite/env-types-generator.ts +0 -145
  315. package/src/cmd/build/vite/index.ts +0 -3
  316. package/src/cmd/build/vite/lifecycle-generator.ts +0 -381
  317. package/src/cmd/build/vite/metadata-generator.ts +0 -713
  318. package/src/cmd/build/vite/prompt-generator.ts +0 -169
  319. package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
  320. package/src/cmd/build/vite/route-discovery.ts +0 -271
  321. package/src/cmd/build/vite/server-bundler.ts +0 -481
  322. package/src/cmd/build/vite/static-renderer.ts +0 -239
  323. package/src/cmd/build/vite/tailwind-source-plugin.ts +0 -73
  324. package/src/cmd/build/vite/vite-asset-server-config.ts +0 -349
  325. package/src/cmd/build/vite/vite-asset-server.ts +0 -154
  326. package/src/cmd/build/vite/vite-builder.ts +0 -503
  327. package/src/cmd/build/vite/workbench-generator.ts +0 -152
  328. package/src/cmd/build/vite/ws-proxy.ts +0 -126
  329. package/src/cmd/build/vite-bundler.ts +0 -137
  330. package/src/cmd/dev/agents.ts +0 -140
  331. package/src/cmd/dev/api.ts +0 -65
  332. package/src/cmd/dev/dev-lock.ts +0 -332
  333. package/src/cmd/dev/download.ts +0 -117
  334. package/src/cmd/dev/file-watcher.ts +0 -423
  335. package/src/cmd/dev/process-manager.ts +0 -261
  336. package/src/cmd/dev/sync.ts +0 -411
  337. package/src/cmd/dev/templates.ts +0 -66
  338. package/src/cmd/project/download.ts +0 -505
  339. package/src/cmd/project/templates.ts +0 -56
@@ -1,349 +0,0 @@
1
- /**
2
- * File Watcher for Dev Server Hot Reload
3
- *
4
- * Watches source files and triggers server restart on changes.
5
- * Handles both backend (API, agents, lib) and generates restart signals.
6
- */
7
- import { watch, statSync, readdirSync, lstatSync } from 'node:fs';
8
- import { resolve, relative } from 'node:path';
9
- import { createAgentTemplates } from './templates';
10
- /**
11
- * Create a file watcher manager for hot reload
12
- */
13
- export function createFileWatcher(options) {
14
- const { rootDir, logger, onRestart, additionalPaths = [] } = options;
15
- const watchers = [];
16
- let paused = false;
17
- let buildCooldownTimer = null;
18
- // Directories to ignore - these are NEVER traversed into
19
- // This prevents EMFILE errors from symlink cycles in node_modules
20
- const ignoreDirs = new Set([
21
- '.agentuity',
22
- '.agents',
23
- '.claude',
24
- '.code',
25
- '.opencode',
26
- 'node_modules',
27
- '.git',
28
- '.github',
29
- 'dist',
30
- 'build',
31
- '.next',
32
- '.turbo',
33
- '.npm',
34
- '.dist',
35
- '.vscode',
36
- '.idea',
37
- '.DS_Store',
38
- '.playwright',
39
- '.bun',
40
- 'src/generated',
41
- ]);
42
- // Paths to ignore for file change events (but may still be traversed)
43
- const ignorePaths = [
44
- '.agentuity',
45
- '.agents',
46
- '.claude',
47
- '.code',
48
- '.opencode',
49
- 'node_modules',
50
- '.git',
51
- '.github',
52
- 'dist',
53
- 'build',
54
- '.next',
55
- '.turbo',
56
- '.npm',
57
- '.dist',
58
- '.vscode',
59
- '.idea',
60
- '.bun',
61
- '.DS_Store',
62
- '.playwright',
63
- 'src/web', // Vite handles frontend with HMR - no backend restart needed
64
- 'src/generated', // Generated files shouldn't trigger rebuilds
65
- ];
66
- // File extensions to ignore - non-code files that shouldn't trigger reload
67
- const ignoreExtensions = new Set([
68
- '.md',
69
- '.mdx',
70
- '.txt',
71
- '.log',
72
- '.lock',
73
- '.yaml',
74
- '.yml',
75
- '.toml',
76
- '.csv',
77
- '.svg',
78
- '.png',
79
- '.jpg',
80
- '.jpeg',
81
- '.gif',
82
- '.webp',
83
- '.ico',
84
- '.woff',
85
- '.woff2',
86
- '.ttf',
87
- '.eot',
88
- '.mp4',
89
- '.mp3',
90
- '.wav',
91
- '.ogg',
92
- '.webm',
93
- '.pdf',
94
- '.zip',
95
- '.tar',
96
- '.gz',
97
- '.map',
98
- ]);
99
- /**
100
- * Check if a path should be ignored
101
- */
102
- function shouldIgnorePath(changedFile, watchDir) {
103
- if (!changedFile)
104
- return false;
105
- const absPath = resolve(watchDir, changedFile);
106
- // Check against ignore list - match both relative path and absolute path
107
- for (const ignorePath of ignorePaths) {
108
- // Check relative path from watchDir
109
- if (changedFile === ignorePath ||
110
- changedFile.startsWith(`${ignorePath}/`) ||
111
- changedFile.startsWith(`${ignorePath}\\`)) {
112
- logger.trace('File change ignored (%s): %s', ignorePath, changedFile);
113
- return true;
114
- }
115
- // Check if absolute path contains the ignore pattern
116
- const ignoreAbsPath = resolve(rootDir, ignorePath);
117
- if (absPath === ignoreAbsPath ||
118
- absPath.startsWith(`${ignoreAbsPath}/`) ||
119
- absPath.startsWith(`${ignoreAbsPath}\\`)) {
120
- logger.trace('File change ignored (%s): %s', ignorePath, changedFile);
121
- return true;
122
- }
123
- // Also check if changedFile path includes the ignore pattern anywhere
124
- // This handles cases like "some/path/.agentuity/file.js"
125
- const normalizedChanged = changedFile.replace(/\\/g, '/');
126
- const normalizedIgnore = ignorePath.replace(/\\/g, '/');
127
- if (normalizedChanged.includes(`/${normalizedIgnore}/`) ||
128
- normalizedChanged.includes(`/${normalizedIgnore}`)) {
129
- logger.trace('File change ignored (%s in path): %s', ignorePath, changedFile);
130
- return true;
131
- }
132
- }
133
- // Ignore temp files from editors
134
- if (changedFile.match(/\.(tmp|swp|swo|swx)$|~$/)) {
135
- logger.trace('File change ignored (temp file): %s', changedFile);
136
- return true;
137
- }
138
- // Ignore files with non-code extensions
139
- const extIndex = changedFile.lastIndexOf('.');
140
- if (extIndex !== -1) {
141
- const ext = changedFile.slice(extIndex).toLowerCase();
142
- if (ignoreExtensions.has(ext)) {
143
- logger.trace('File change ignored (%s): %s', ext, changedFile);
144
- return true;
145
- }
146
- }
147
- // Ignore hidden files (except .env)
148
- if (changedFile.startsWith('.') && !changedFile.startsWith('.env')) {
149
- logger.trace('File change ignored (hidden file): %s', changedFile);
150
- return true;
151
- }
152
- return false;
153
- }
154
- /**
155
- * Handle file change event
156
- */
157
- function handleFileChange(eventType, changedFile, watchDir) {
158
- if (paused) {
159
- logger.trace('File change ignored (watcher paused): %s', changedFile);
160
- return;
161
- }
162
- if (shouldIgnorePath(changedFile, watchDir)) {
163
- return;
164
- }
165
- // During build cooldown, ignore changes (they're likely build outputs)
166
- if (buildCooldownTimer) {
167
- logger.trace('File change ignored (build cooldown): %s', changedFile);
168
- return;
169
- }
170
- // Get absolute path for checking
171
- const absPath = changedFile ? resolve(watchDir, changedFile) : watchDir;
172
- // Check if this is a directory
173
- let isDirectory = false;
174
- try {
175
- const stats = statSync(absPath);
176
- isDirectory = stats.isDirectory();
177
- }
178
- catch {
179
- // File doesn't exist (was deleted) - not a directory
180
- isDirectory = false;
181
- }
182
- // Check if an empty directory was created in src/agent/
183
- // This helps with developer experience by auto-scaffolding template files
184
- if (changedFile && eventType === 'rename' && isDirectory) {
185
- try {
186
- // Normalize the path for comparison (use forward slashes)
187
- const normalizedPath = changedFile.replace(/\\/g, '/');
188
- // Check if it's empty
189
- const contents = readdirSync(absPath);
190
- if (contents.length === 0) {
191
- if (normalizedPath.startsWith('src/agent/') ||
192
- normalizedPath.includes('/src/agent/')) {
193
- logger.debug('Agent directory created: %s', changedFile);
194
- createAgentTemplates(absPath);
195
- }
196
- }
197
- }
198
- catch (error) {
199
- // File might have been deleted or doesn't exist yet - this is normal
200
- logger.trace('Unable to check directory for template creation (%s): %s', changedFile, error);
201
- }
202
- }
203
- // Ignore directory-only change events (mtime updates when files inside change)
204
- // We only care about actual file changes - the watcher will report those directly
205
- if (isDirectory && eventType === 'change') {
206
- logger.trace('File change ignored (directory mtime update): %s', changedFile);
207
- return;
208
- }
209
- logger.debug('File changed (%s): %s', eventType, changedFile || watchDir);
210
- onRestart();
211
- }
212
- /**
213
- * Recursively collect all directories to watch, skipping ignored directories.
214
- * This prevents EMFILE errors from symlink cycles in node_modules.
215
- */
216
- function collectWatchDirs(dir, visited = new Set()) {
217
- const dirs = [dir];
218
- try {
219
- // Use lstat to check for symlinks - get the real path to detect cycles
220
- const stat = lstatSync(dir);
221
- // Skip symlinks to prevent following circular symlinks
222
- if (stat.isSymbolicLink()) {
223
- logger.trace('Skipping symlink: %s', dir);
224
- return [];
225
- }
226
- // Track visited inodes to detect cycles
227
- const key = `${stat.dev}:${stat.ino}`;
228
- if (visited.has(key)) {
229
- logger.trace('Skipping already visited directory (cycle detected): %s', dir);
230
- return [];
231
- }
232
- visited.add(key);
233
- const entries = readdirSync(dir, { withFileTypes: true });
234
- for (const entry of entries) {
235
- if (!entry.isDirectory())
236
- continue;
237
- const name = entry.name;
238
- // Skip ignored directories entirely - this is the key fix
239
- if (ignoreDirs.has(name)) {
240
- logger.trace('Skipping ignored directory: %s', resolve(dir, name));
241
- continue;
242
- }
243
- // Skip hidden directories (except specific ones like .env folders)
244
- if (name.startsWith('.')) {
245
- logger.trace('Skipping hidden directory: %s', resolve(dir, name));
246
- continue;
247
- }
248
- const fullPath = resolve(dir, name);
249
- dirs.push(...collectWatchDirs(fullPath, visited));
250
- }
251
- }
252
- catch (error) {
253
- logger.trace('Error reading directory %s: %s', dir, error);
254
- }
255
- return dirs;
256
- }
257
- /**
258
- * Start watching files
259
- */
260
- function start() {
261
- logger.debug('Starting file watchers for hot reload...');
262
- // Collect all directories to watch, excluding node_modules and other ignored dirs
263
- const allDirs = collectWatchDirs(rootDir);
264
- // Add additional paths
265
- if (additionalPaths && additionalPaths.length > 0) {
266
- for (const additionalPath of additionalPaths) {
267
- const fullPath = resolve(rootDir, additionalPath);
268
- allDirs.push(...collectWatchDirs(fullPath));
269
- }
270
- }
271
- // De-duplicate directories
272
- const uniqueDirs = [...new Set(allDirs)];
273
- logger.debug('Collected %d directories to watch', uniqueDirs.length);
274
- // Watch each directory non-recursively
275
- for (const watchPath of uniqueDirs) {
276
- try {
277
- // Use non-recursive watch to avoid traversing into node_modules
278
- const watcher = watch(watchPath, { recursive: false }, (eventType, changedFile) => {
279
- // Construct relative path from rootDir for consistent handling
280
- const relPath = changedFile
281
- ? relative(rootDir, resolve(watchPath, changedFile))
282
- : relative(rootDir, watchPath);
283
- handleFileChange(eventType, relPath || changedFile, rootDir);
284
- });
285
- watchers.push(watcher);
286
- }
287
- catch (error) {
288
- logger.trace('Failed to start watcher for %s: %s', watchPath, error);
289
- }
290
- }
291
- logger.debug('File watchers started (%d directories)', watchers.length);
292
- }
293
- /**
294
- * Stop all watchers
295
- */
296
- function stop() {
297
- logger.debug('Stopping file watchers...');
298
- for (const watcher of watchers) {
299
- try {
300
- watcher.close();
301
- }
302
- catch (error) {
303
- logger.trace('Error closing watcher: %s', error);
304
- }
305
- }
306
- watchers.length = 0;
307
- if (buildCooldownTimer) {
308
- clearTimeout(buildCooldownTimer);
309
- buildCooldownTimer = null;
310
- }
311
- logger.debug('File watchers stopped');
312
- }
313
- /**
314
- * Temporarily pause watching (e.g., during build)
315
- */
316
- function pause() {
317
- paused = true;
318
- logger.trace('File watchers paused');
319
- // Set cooldown timer to ignore changes for a bit after build
320
- if (buildCooldownTimer) {
321
- clearTimeout(buildCooldownTimer);
322
- }
323
- buildCooldownTimer = setTimeout(() => {
324
- buildCooldownTimer = null;
325
- logger.trace('Build cooldown expired');
326
- }, 500); // 500ms cooldown
327
- }
328
- /**
329
- * Resume watching
330
- */
331
- function resume() {
332
- paused = false;
333
- // Clear any pending build cooldown timer so file changes are detected immediately.
334
- // Without this, events arriving during the remaining cooldown window after a fast
335
- // typecheck failure would be silently dropped.
336
- if (buildCooldownTimer) {
337
- clearTimeout(buildCooldownTimer);
338
- buildCooldownTimer = null;
339
- }
340
- logger.trace('File watchers resumed');
341
- }
342
- return {
343
- start,
344
- stop,
345
- pause,
346
- resume,
347
- };
348
- }
349
- //# sourceMappingURL=file-watcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../../src/cmd/dev/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAkB,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAgBnD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA2B;IAC5D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAErE,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,kBAAkB,GAA0B,IAAI,CAAC;IAErD,yDAAyD;IACzD,kEAAkE;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;QAC1B,YAAY;QACZ,SAAS;QACT,SAAS;QACT,OAAO;QACP,WAAW;QACX,cAAc;QACd,MAAM;QACN,SAAS;QACT,MAAM;QACN,OAAO;QACP,OAAO;QACP,QAAQ;QACR,MAAM;QACN,OAAO;QACP,SAAS;QACT,OAAO;QACP,WAAW;QACX,aAAa;QACb,MAAM;QACN,eAAe;KACf,CAAC,CAAC;IAEH,sEAAsE;IACtE,MAAM,WAAW,GAAG;QACnB,YAAY;QACZ,SAAS;QACT,SAAS;QACT,OAAO;QACP,WAAW;QACX,cAAc;QACd,MAAM;QACN,SAAS;QACT,MAAM;QACN,OAAO;QACP,OAAO;QACP,QAAQ;QACR,MAAM;QACN,OAAO;QACP,SAAS;QACT,OAAO;QACP,MAAM;QACN,WAAW;QACX,aAAa;QACb,SAAS,EAAE,6DAA6D;QACxE,eAAe,EAAE,6CAA6C;KAC9D,CAAC;IAEF,2EAA2E;IAC3E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;QAChC,KAAK;QACL,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;KACN,CAAC,CAAC;IAEH;;OAEG;IACH,SAAS,gBAAgB,CAAC,WAA0B,EAAE,QAAgB;QACrE,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/C,yEAAyE;QACzE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACtC,oCAAoC;YACpC,IACC,WAAW,KAAK,UAAU;gBAC1B,WAAW,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC;gBACxC,WAAW,CAAC,UAAU,CAAC,GAAG,UAAU,IAAI,CAAC,EACxC,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;YACb,CAAC;YAED,qDAAqD;YACrD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACnD,IACC,OAAO,KAAK,aAAa;gBACzB,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,GAAG,CAAC;gBACvC,OAAO,CAAC,UAAU,CAAC,GAAG,aAAa,IAAI,CAAC,EACvC,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;YACb,CAAC;YAED,sEAAsE;YACtE,yDAAyD;YACzD,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACxD,IACC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,GAAG,CAAC;gBACnD,iBAAiB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC,EACjD,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;gBAC9E,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAED,iCAAiC;QACjC,IAAI,WAAW,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,wCAAwC;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;QAED,oCAAoC;QACpC,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,gBAAgB,CAAC,SAAiB,EAAE,WAA0B,EAAE,QAAgB;QACxF,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,WAAW,CAAC,CAAC;YACtE,OAAO;QACR,CAAC;QAED,IAAI,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7C,OAAO;QACR,CAAC;QAED,uEAAuE;QACvE,IAAI,kBAAkB,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,WAAW,CAAC,CAAC;YACtE,OAAO;QACR,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAExE,+BAA+B;QAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,qDAAqD;YACrD,WAAW,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,wDAAwD;QACxD,0EAA0E;QAC1E,IAAI,WAAW,IAAI,SAAS,KAAK,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACJ,0DAA0D;gBAC1D,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAEvD,sBAAsB;gBACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,IACC,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC;wBACvC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,EACrC,CAAC;wBACF,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,WAAW,CAAC,CAAC;wBACzD,oBAAoB,CAAC,OAAO,CAAC,CAAC;oBAC/B,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,qEAAqE;gBACrE,MAAM,CAAC,KAAK,CACX,0DAA0D,EAC1D,WAAW,EACX,KAAK,CACL,CAAC;YACH,CAAC;QACF,CAAC;QAED,+EAA+E;QAC/E,kFAAkF;QAClF,IAAI,WAAW,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,WAAW,CAAC,CAAC;YAC9E,OAAO;QACR,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,SAAS,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC;QAC1E,SAAS,EAAE,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,UAAuB,IAAI,GAAG,EAAE;QACtE,MAAM,IAAI,GAAa,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,CAAC;YACJ,uEAAuE;YACvE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAE5B,uDAAuD;YACvD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACX,CAAC;YAED,wCAAwC;YACxC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,yDAAyD,EAAE,GAAG,CAAC,CAAC;gBAC7E,OAAO,EAAE,CAAC;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEjB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBAAE,SAAS;gBAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBAExB,0DAA0D;gBAC1D,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBACnE,SAAS;gBACV,CAAC;gBAED,mEAAmE;gBACnE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBAClE,SAAS;gBACV,CAAC;gBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACnD,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACH,SAAS,KAAK;QACb,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAEzD,kFAAkF;QAClF,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAEzC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAErE,uCAAuC;QACvC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC;gBACJ,gEAAgE;gBAChE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE;oBACjF,+DAA+D;oBAC/D,MAAM,OAAO,GAAG,WAAW;wBAC1B,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;wBACpD,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAChC,gBAAgB,CAAC,SAAS,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC9D,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;QACF,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,SAAS,IAAI;QACZ,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACJ,OAAO,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;QAED,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAEpB,IAAI,kBAAkB,EAAE,CAAC;YACxB,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACjC,kBAAkB,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,SAAS,KAAK;QACb,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAErC,6DAA6D;QAC7D,IAAI,kBAAkB,EAAE,CAAC;YACxB,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAED,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,kBAAkB,GAAG,IAAI,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS,MAAM;QACd,MAAM,GAAG,KAAK,CAAC;QAEf,mFAAmF;QACnF,kFAAkF;QAClF,+CAA+C;QAC/C,IAAI,kBAAkB,EAAE,CAAC;YACxB,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACjC,kBAAkB,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACN,KAAK;QACL,IAAI;QACJ,KAAK;QACL,MAAM;KACN,CAAC;AACH,CAAC"}
@@ -1,104 +0,0 @@
1
- /**
2
- * Process Manager for Dev Mode
3
- *
4
- * Tracks all spawned processes and ensures they're cleaned up on:
5
- * - Startup failure (any server fails to start)
6
- * - Runtime crash (uncaught exception)
7
- * - Graceful shutdown (SIGINT/SIGTERM)
8
- *
9
- * This prevents orphan processes and port conflicts between dev sessions.
10
- */
11
- import type { Logger } from '../../types';
12
- export interface ManagedProcess {
13
- /** Process identifier for logging */
14
- id: string;
15
- /** The process handle */
16
- process: {
17
- kill: (signal?: number | NodeJS.Signals) => void;
18
- exitCode: number | null;
19
- pid?: number;
20
- };
21
- /** Human-readable description */
22
- description: string;
23
- /** The port this process uses (if any) */
24
- port?: number;
25
- /** Whether this process is critical (startup fails if it dies) */
26
- critical?: boolean;
27
- }
28
- export interface ManagedServer {
29
- /** Server identifier */
30
- id: string;
31
- /** The server handle */
32
- server: {
33
- close: () => void | Promise<void>;
34
- };
35
- /** Human-readable description */
36
- description: string;
37
- /** The port this server uses */
38
- port?: number;
39
- }
40
- /**
41
- * Process Manager
42
- *
43
- * Tracks all processes and servers started during dev mode and provides
44
- * centralized cleanup on failure or shutdown.
45
- */
46
- export declare class ProcessManager {
47
- private processes;
48
- private servers;
49
- private logger;
50
- private cleaningUp;
51
- constructor(logger: Logger);
52
- /**
53
- * Register a spawned process for tracking.
54
- */
55
- registerProcess(proc: ManagedProcess): void;
56
- /**
57
- * Register a server for tracking.
58
- */
59
- registerServer(server: ManagedServer): void;
60
- /**
61
- * Unregister a process (e.g., after it exits normally).
62
- */
63
- unregisterProcess(id: string): void;
64
- /**
65
- * Unregister a server.
66
- */
67
- unregisterServer(id: string): void;
68
- /**
69
- * Get all registered ports (for cleanup verification).
70
- */
71
- getPorts(): number[];
72
- /**
73
- * Clean up all tracked processes and servers.
74
- *
75
- * @param reason - Why cleanup is happening (for logging)
76
- * @param timeout - Max time to wait for graceful shutdown (ms)
77
- */
78
- cleanup(reason: string, timeout?: number): Promise<void>;
79
- /**
80
- * Verify that all ports used by tracked processes are released.
81
- * Used after cleanup to ensure no orphan processes remain.
82
- */
83
- verifyPortsReleased(): Promise<{
84
- port: number;
85
- released: boolean;
86
- }[]>;
87
- /**
88
- * Check if a port is available.
89
- */
90
- private isPortAvailable;
91
- }
92
- /**
93
- * Get the global process manager (throws if not initialized).
94
- */
95
- export declare function getProcessManager(): ProcessManager;
96
- /**
97
- * Initialize the global process manager.
98
- */
99
- export declare function initProcessManager(logger: Logger): ProcessManager;
100
- /**
101
- * Cleanup helper that can be called from signal handlers or error handlers.
102
- */
103
- export declare function cleanupAll(reason: string): Promise<void>;
104
- //# sourceMappingURL=process-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../../src/cmd/dev/process-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,OAAO,EAAE;QACR,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;QACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,GAAG,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,MAAM,EAAE;QACP,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAClC,CAAC;IACF,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAU3C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAK3C;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQlC;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAWpB;;;;;OAKG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwE5D;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAgB3E;;OAEG;IACH,OAAO,CAAC,eAAe;CAUvB;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAGjE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D"}
@@ -1,204 +0,0 @@
1
- /**
2
- * Process Manager for Dev Mode
3
- *
4
- * Tracks all spawned processes and ensures they're cleaned up on:
5
- * - Startup failure (any server fails to start)
6
- * - Runtime crash (uncaught exception)
7
- * - Graceful shutdown (SIGINT/SIGTERM)
8
- *
9
- * This prevents orphan processes and port conflicts between dev sessions.
10
- */
11
- /**
12
- * Process Manager
13
- *
14
- * Tracks all processes and servers started during dev mode and provides
15
- * centralized cleanup on failure or shutdown.
16
- */
17
- export class ProcessManager {
18
- processes = [];
19
- servers = [];
20
- logger;
21
- cleaningUp = false;
22
- constructor(logger) {
23
- this.logger = logger;
24
- }
25
- /**
26
- * Register a spawned process for tracking.
27
- */
28
- registerProcess(proc) {
29
- this.processes.push(proc);
30
- this.logger.debug('Registered process: %s (pid=%s, port=%s)', proc.id, proc.process.pid ?? 'unknown', proc.port ?? 'n/a');
31
- }
32
- /**
33
- * Register a server for tracking.
34
- */
35
- registerServer(server) {
36
- this.servers.push(server);
37
- this.logger.debug('Registered server: %s (port=%s)', server.id, server.port ?? 'n/a');
38
- }
39
- /**
40
- * Unregister a process (e.g., after it exits normally).
41
- */
42
- unregisterProcess(id) {
43
- const idx = this.processes.findIndex((p) => p.id === id);
44
- if (idx !== -1) {
45
- this.processes.splice(idx, 1);
46
- this.logger.debug('Unregistered process: %s', id);
47
- }
48
- }
49
- /**
50
- * Unregister a server.
51
- */
52
- unregisterServer(id) {
53
- const idx = this.servers.findIndex((s) => s.id === id);
54
- if (idx !== -1) {
55
- this.servers.splice(idx, 1);
56
- this.logger.debug('Unregistered server: %s', id);
57
- }
58
- }
59
- /**
60
- * Get all registered ports (for cleanup verification).
61
- */
62
- getPorts() {
63
- const ports = [];
64
- for (const proc of this.processes) {
65
- if (proc.port)
66
- ports.push(proc.port);
67
- }
68
- for (const server of this.servers) {
69
- if (server.port)
70
- ports.push(server.port);
71
- }
72
- return ports;
73
- }
74
- /**
75
- * Clean up all tracked processes and servers.
76
- *
77
- * @param reason - Why cleanup is happening (for logging)
78
- * @param timeout - Max time to wait for graceful shutdown (ms)
79
- */
80
- async cleanup(reason, timeout = 3000) {
81
- if (this.cleaningUp) {
82
- this.logger.debug('Cleanup already in progress, skipping');
83
- return;
84
- }
85
- this.cleaningUp = true;
86
- this.logger.debug('Starting cleanup (reason: %s)', reason);
87
- // Kill processes in reverse order (LIFO)
88
- for (let i = this.processes.length - 1; i >= 0; i--) {
89
- const proc = this.processes[i];
90
- if (!proc)
91
- continue;
92
- try {
93
- if (proc.process.exitCode === null) {
94
- this.logger.debug('Killing process %s (pid=%s)', proc.id, proc.process.pid ?? 'unknown');
95
- proc.process.kill('SIGTERM');
96
- }
97
- }
98
- catch (err) {
99
- this.logger.debug('Error killing process %s: %s', proc.id, err);
100
- }
101
- }
102
- // Close servers
103
- for (let i = this.servers.length - 1; i >= 0; i--) {
104
- const server = this.servers[i];
105
- if (!server)
106
- continue;
107
- try {
108
- this.logger.debug('Closing server %s', server.id);
109
- const closePromise = server.server.close();
110
- if (closePromise instanceof Promise) {
111
- await Promise.race([
112
- closePromise,
113
- new Promise((resolve) => setTimeout(resolve, 1000)),
114
- ]);
115
- }
116
- }
117
- catch (err) {
118
- this.logger.debug('Error closing server %s: %s', server.id, err);
119
- }
120
- }
121
- // Wait for processes to exit, then force-kill if needed
122
- const startTime = Date.now();
123
- while (Date.now() - startTime < timeout) {
124
- const allExited = this.processes.every((p) => p.process.exitCode !== null);
125
- if (allExited)
126
- break;
127
- await new Promise((resolve) => setTimeout(resolve, 100));
128
- }
129
- // Force kill any remaining
130
- for (const proc of this.processes) {
131
- if (proc.process.exitCode === null) {
132
- try {
133
- this.logger.debug('Force killing process %s', proc.id);
134
- proc.process.kill('SIGKILL');
135
- }
136
- catch (err) {
137
- this.logger.debug('Error force killing process %s: %s', proc.id, err);
138
- }
139
- }
140
- }
141
- this.logger.debug('Cleanup complete');
142
- this.processes = [];
143
- this.servers = [];
144
- }
145
- /**
146
- * Verify that all ports used by tracked processes are released.
147
- * Used after cleanup to ensure no orphan processes remain.
148
- */
149
- async verifyPortsReleased() {
150
- const results = [];
151
- const ports = this.getPorts();
152
- for (const port of ports) {
153
- const released = await this.isPortAvailable(port);
154
- results.push({ port, released });
155
- if (!released) {
156
- this.logger.warn('Port %d is still in use after cleanup', port);
157
- }
158
- }
159
- return results;
160
- }
161
- /**
162
- * Check if a port is available.
163
- */
164
- isPortAvailable(port, host = '127.0.0.1') {
165
- return new Promise((resolve) => {
166
- const net = require('node:net');
167
- const server = net.createServer();
168
- server.once('error', () => resolve(false));
169
- server.listen(port, host, () => {
170
- server.close(() => resolve(true));
171
- });
172
- });
173
- }
174
- }
175
- /**
176
- * Global process manager instance for dev mode.
177
- * Set in dev/index.ts during startup.
178
- */
179
- let globalProcessManager = null;
180
- /**
181
- * Get the global process manager (throws if not initialized).
182
- */
183
- export function getProcessManager() {
184
- if (!globalProcessManager) {
185
- throw new Error('ProcessManager not initialized. Call initProcessManager first.');
186
- }
187
- return globalProcessManager;
188
- }
189
- /**
190
- * Initialize the global process manager.
191
- */
192
- export function initProcessManager(logger) {
193
- globalProcessManager = new ProcessManager(logger);
194
- return globalProcessManager;
195
- }
196
- /**
197
- * Cleanup helper that can be called from signal handlers or error handlers.
198
- */
199
- export async function cleanupAll(reason) {
200
- if (globalProcessManager) {
201
- await globalProcessManager.cleanup(reason);
202
- }
203
- }
204
- //# sourceMappingURL=process-manager.js.map