frontmcp 0.12.2 → 1.0.0-beta.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 (264) hide show
  1. package/README.md +1 -1
  2. package/package.json +6 -5
  3. package/src/commands/build/bundler.js +1 -1
  4. package/src/commands/build/bundler.js.map +1 -1
  5. package/src/commands/build/exec/cli-runtime/cli-bundler.d.ts +17 -0
  6. package/src/commands/build/exec/cli-runtime/cli-bundler.js +75 -0
  7. package/src/commands/build/exec/cli-runtime/cli-bundler.js.map +1 -0
  8. package/src/commands/build/exec/cli-runtime/credential-store.d.ts +22 -0
  9. package/src/commands/build/exec/cli-runtime/credential-store.js +140 -0
  10. package/src/commands/build/exec/cli-runtime/credential-store.js.map +1 -0
  11. package/src/commands/build/exec/cli-runtime/daemon-client.d.ts +16 -0
  12. package/src/commands/build/exec/cli-runtime/daemon-client.js +169 -0
  13. package/src/commands/build/exec/cli-runtime/daemon-client.js.map +1 -0
  14. package/src/commands/build/exec/cli-runtime/generate-cli-entry.d.ts +37 -0
  15. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js +1287 -0
  16. package/src/commands/build/exec/cli-runtime/generate-cli-entry.js.map +1 -0
  17. package/src/commands/build/exec/cli-runtime/index.d.ts +9 -0
  18. package/src/commands/build/exec/cli-runtime/index.js +32 -0
  19. package/src/commands/build/exec/cli-runtime/index.js.map +1 -0
  20. package/src/commands/build/exec/cli-runtime/oauth-helper.d.ts +9 -0
  21. package/src/commands/build/exec/cli-runtime/oauth-helper.js +224 -0
  22. package/src/commands/build/exec/cli-runtime/oauth-helper.js.map +1 -0
  23. package/src/commands/build/exec/cli-runtime/output-formatter.d.ts +46 -0
  24. package/src/commands/build/exec/cli-runtime/output-formatter.js +168 -0
  25. package/src/commands/build/exec/cli-runtime/output-formatter.js.map +1 -0
  26. package/src/commands/build/exec/cli-runtime/schema-extractor.d.ts +57 -0
  27. package/src/commands/build/exec/cli-runtime/schema-extractor.js +129 -0
  28. package/src/commands/build/exec/cli-runtime/schema-extractor.js.map +1 -0
  29. package/src/commands/build/exec/cli-runtime/schema-to-commander.d.ts +38 -0
  30. package/src/commands/build/exec/cli-runtime/schema-to-commander.js +172 -0
  31. package/src/commands/build/exec/cli-runtime/schema-to-commander.js.map +1 -0
  32. package/src/commands/build/exec/cli-runtime/session-manager.d.ts +16 -0
  33. package/src/commands/build/exec/cli-runtime/session-manager.js +122 -0
  34. package/src/commands/build/exec/cli-runtime/session-manager.js.map +1 -0
  35. package/src/commands/build/exec/config.d.ts +25 -0
  36. package/src/commands/build/exec/config.js +0 -1
  37. package/src/commands/build/exec/config.js.map +1 -1
  38. package/src/commands/build/exec/esbuild-bundler.d.ts +4 -1
  39. package/src/commands/build/exec/esbuild-bundler.js +28 -9
  40. package/src/commands/build/exec/esbuild-bundler.js.map +1 -1
  41. package/src/commands/build/exec/index.d.ts +7 -2
  42. package/src/commands/build/exec/index.js +159 -9
  43. package/src/commands/build/exec/index.js.map +1 -1
  44. package/src/commands/build/exec/manifest.d.ts +14 -0
  45. package/src/commands/build/exec/manifest.js.map +1 -1
  46. package/src/commands/build/exec/runner-script.d.ts +1 -1
  47. package/src/commands/build/exec/runner-script.js +48 -5
  48. package/src/commands/build/exec/runner-script.js.map +1 -1
  49. package/src/commands/build/exec/sea-builder.d.ts +18 -0
  50. package/src/commands/build/exec/sea-builder.js +81 -0
  51. package/src/commands/build/exec/sea-builder.js.map +1 -0
  52. package/src/commands/build/exec/setup.js +0 -2
  53. package/src/commands/build/exec/setup.js.map +1 -1
  54. package/src/commands/build/index.d.ts +1 -1
  55. package/src/commands/build/index.js +3 -3
  56. package/src/commands/build/index.js.map +1 -1
  57. package/src/commands/build/register.d.ts +2 -0
  58. package/src/commands/build/register.js +21 -0
  59. package/src/commands/build/register.js.map +1 -0
  60. package/src/commands/{dev.d.ts → dev/dev.d.ts} +1 -1
  61. package/src/commands/{dev.js → dev/dev.js} +3 -3
  62. package/src/commands/dev/dev.js.map +1 -0
  63. package/src/commands/{doctor.js → dev/doctor.js} +5 -4
  64. package/src/commands/dev/doctor.js.map +1 -0
  65. package/src/commands/{inspector.js → dev/inspector.js} +1 -1
  66. package/src/commands/dev/inspector.js.map +1 -0
  67. package/src/commands/dev/register.d.ts +2 -0
  68. package/src/commands/dev/register.js +49 -0
  69. package/src/commands/dev/register.js.map +1 -0
  70. package/src/commands/{test.d.ts → dev/test.d.ts} +1 -1
  71. package/src/commands/{test.js → dev/test.js} +5 -5
  72. package/src/commands/dev/test.js.map +1 -0
  73. package/src/commands/{configure.d.ts → package/configure.d.ts} +1 -1
  74. package/src/commands/{configure.js → package/configure.js} +3 -3
  75. package/src/commands/package/configure.js.map +1 -0
  76. package/src/commands/package/esm-update.d.ts +19 -0
  77. package/src/commands/package/esm-update.js +93 -0
  78. package/src/commands/package/esm-update.js.map +1 -0
  79. package/src/commands/{install/index.d.ts → package/install.d.ts} +1 -1
  80. package/src/commands/{install/index.js → package/install.js} +8 -5
  81. package/src/commands/package/install.js.map +1 -0
  82. package/src/commands/{install → package}/questionnaire.js +2 -2
  83. package/src/commands/{install → package}/questionnaire.js.map +1 -1
  84. package/src/commands/package/register.d.ts +2 -0
  85. package/src/commands/package/register.js +35 -0
  86. package/src/commands/package/register.js.map +1 -0
  87. package/src/commands/{install → package}/registry.js +8 -6
  88. package/src/commands/package/registry.js.map +1 -0
  89. package/src/commands/{install → package}/sources/git.js +8 -1
  90. package/src/commands/package/sources/git.js.map +1 -0
  91. package/src/commands/{install → package}/sources/local.js.map +1 -1
  92. package/src/commands/{install → package}/sources/npm.js.map +1 -1
  93. package/src/commands/{install → package}/types.d.ts +7 -1
  94. package/src/commands/{install → package}/types.js +4 -0
  95. package/src/commands/package/types.js.map +1 -0
  96. package/src/commands/{uninstall.d.ts → package/uninstall.d.ts} +1 -1
  97. package/src/commands/{uninstall.js → package/uninstall.js} +2 -2
  98. package/src/commands/package/uninstall.js.map +1 -0
  99. package/src/{pm/pm.format.d.ts → commands/pm/format.d.ts} +1 -1
  100. package/src/{pm/pm.format.js → commands/pm/format.js} +2 -2
  101. package/src/commands/pm/format.js.map +1 -0
  102. package/src/{pm/pm.health.js → commands/pm/health.js} +1 -1
  103. package/src/commands/pm/health.js.map +1 -0
  104. package/src/commands/pm/index.d.ts +9 -0
  105. package/src/{pm → commands/pm}/index.js +32 -32
  106. package/src/commands/pm/index.js.map +1 -0
  107. package/src/commands/{list.d.ts → pm/list.d.ts} +1 -1
  108. package/src/commands/{list.js → pm/list.js} +3 -3
  109. package/src/commands/pm/list.js.map +1 -0
  110. package/src/{pm/pm.logs.js → commands/pm/log-utils.js} +9 -9
  111. package/src/commands/pm/log-utils.js.map +1 -0
  112. package/src/commands/{logs.d.ts → pm/logs.d.ts} +1 -1
  113. package/src/commands/{logs.js → pm/logs.js} +6 -6
  114. package/src/commands/pm/logs.js.map +1 -0
  115. package/src/{pm/pm.manager.d.ts → commands/pm/manager.d.ts} +1 -1
  116. package/src/{pm/pm.manager.js → commands/pm/manager.js} +21 -21
  117. package/src/commands/pm/manager.js.map +1 -0
  118. package/src/{pm/pm.paths.d.ts → commands/pm/paths.d.ts} +1 -0
  119. package/src/{pm/pm.paths.js → commands/pm/paths.js} +2 -1
  120. package/src/commands/pm/paths.js.map +1 -0
  121. package/src/{pm/pm.pidfile.d.ts → commands/pm/pidfile.d.ts} +1 -1
  122. package/src/{pm/pm.pidfile.js → commands/pm/pidfile.js} +8 -8
  123. package/src/commands/pm/pidfile.js.map +1 -0
  124. package/src/commands/pm/register.d.ts +2 -0
  125. package/src/commands/pm/register.js +83 -0
  126. package/src/commands/pm/register.js.map +1 -0
  127. package/src/commands/{restart.d.ts → pm/restart.d.ts} +1 -1
  128. package/src/commands/{restart.js → pm/restart.js} +4 -4
  129. package/src/commands/pm/restart.js.map +1 -0
  130. package/src/{pm/pm.service.d.ts → commands/pm/service-gen.d.ts} +1 -1
  131. package/src/{pm/pm.service.js → commands/pm/service-gen.js} +5 -5
  132. package/src/commands/pm/service-gen.js.map +1 -0
  133. package/src/commands/{service.d.ts → pm/service.d.ts} +1 -1
  134. package/src/commands/{service.js → pm/service.js} +6 -6
  135. package/src/commands/pm/service.js.map +1 -0
  136. package/src/commands/{socket.d.ts → pm/socket.d.ts} +1 -1
  137. package/src/commands/{socket.js → pm/socket.js} +3 -3
  138. package/src/commands/pm/socket.js.map +1 -0
  139. package/src/{pm/pm.spawn.d.ts → commands/pm/spawn.d.ts} +1 -1
  140. package/src/{pm/pm.spawn.js → commands/pm/spawn.js} +15 -15
  141. package/src/commands/pm/spawn.js.map +1 -0
  142. package/src/commands/{start.d.ts → pm/start.d.ts} +1 -1
  143. package/src/commands/{start.js → pm/start.js} +6 -6
  144. package/src/commands/pm/start.js.map +1 -0
  145. package/src/commands/{status.d.ts → pm/status.d.ts} +1 -1
  146. package/src/commands/{status.js → pm/status.js} +5 -5
  147. package/src/commands/pm/status.js.map +1 -0
  148. package/src/commands/{stop.d.ts → pm/stop.d.ts} +1 -1
  149. package/src/commands/{stop.js → pm/stop.js} +3 -3
  150. package/src/commands/pm/stop.js.map +1 -0
  151. package/src/{pm/pm.types.js → commands/pm/types.js} +1 -1
  152. package/src/commands/pm/types.js.map +1 -0
  153. package/src/commands/{create.js → scaffold/create.js} +91 -20
  154. package/src/commands/scaffold/create.js.map +1 -0
  155. package/src/commands/scaffold/register.d.ts +2 -0
  156. package/src/commands/scaffold/register.js +28 -0
  157. package/src/commands/scaffold/register.js.map +1 -0
  158. package/src/{args.d.ts → core/args.d.ts} +7 -1
  159. package/src/{args.js → core/args.js} +8 -0
  160. package/src/core/args.js.map +1 -0
  161. package/src/core/bridge.d.ts +9 -0
  162. package/src/core/bridge.js +75 -0
  163. package/src/core/bridge.js.map +1 -0
  164. package/src/core/cli.d.ts +8 -0
  165. package/src/core/cli.js +23 -0
  166. package/src/core/cli.js.map +1 -0
  167. package/src/core/colors.js.map +1 -0
  168. package/src/core/help.d.ts +7 -0
  169. package/src/core/help.js +83 -0
  170. package/src/core/help.js.map +1 -0
  171. package/src/core/index.d.ts +7 -0
  172. package/src/core/index.js +22 -0
  173. package/src/core/index.js.map +1 -0
  174. package/src/core/program.d.ts +2 -0
  175. package/src/core/program.js +23 -0
  176. package/src/core/program.js.map +1 -0
  177. package/src/core/tsconfig.js.map +1 -0
  178. package/src/{version.js → core/version.js} +1 -1
  179. package/src/core/version.js.map +1 -0
  180. package/src/index.d.ts +1 -1
  181. package/src/index.js +2 -5
  182. package/src/index.js.map +1 -1
  183. package/src/{utils → shared}/env.js +2 -2
  184. package/src/shared/env.js.map +1 -0
  185. package/src/{utils → shared}/fs.js +2 -2
  186. package/src/shared/fs.js.map +1 -0
  187. package/src/shared/index.d.ts +3 -0
  188. package/src/shared/index.js +14 -0
  189. package/src/shared/index.js.map +1 -0
  190. package/src/shared/prompts.js.map +1 -0
  191. package/src/args.js.map +0 -1
  192. package/src/cli.d.ts +0 -5
  193. package/src/cli.js +0 -241
  194. package/src/cli.js.map +0 -1
  195. package/src/colors.js.map +0 -1
  196. package/src/commands/configure.js.map +0 -1
  197. package/src/commands/create.js.map +0 -1
  198. package/src/commands/dev.js.map +0 -1
  199. package/src/commands/doctor.js.map +0 -1
  200. package/src/commands/inspector.js.map +0 -1
  201. package/src/commands/install/index.js.map +0 -1
  202. package/src/commands/install/registry.js.map +0 -1
  203. package/src/commands/install/sources/git.js.map +0 -1
  204. package/src/commands/install/types.js.map +0 -1
  205. package/src/commands/list.js.map +0 -1
  206. package/src/commands/logs.js.map +0 -1
  207. package/src/commands/restart.js.map +0 -1
  208. package/src/commands/service.js.map +0 -1
  209. package/src/commands/socket.js.map +0 -1
  210. package/src/commands/start.js.map +0 -1
  211. package/src/commands/status.js.map +0 -1
  212. package/src/commands/stop.js.map +0 -1
  213. package/src/commands/template.d.ts +0 -13
  214. package/src/commands/template.js +0 -193
  215. package/src/commands/template.js.map +0 -1
  216. package/src/commands/test.js.map +0 -1
  217. package/src/commands/uninstall.js.map +0 -1
  218. package/src/pm/index.d.ts +0 -9
  219. package/src/pm/index.js.map +0 -1
  220. package/src/pm/pm.format.js.map +0 -1
  221. package/src/pm/pm.health.js.map +0 -1
  222. package/src/pm/pm.logs.js.map +0 -1
  223. package/src/pm/pm.manager.js.map +0 -1
  224. package/src/pm/pm.paths.js.map +0 -1
  225. package/src/pm/pm.pidfile.js.map +0 -1
  226. package/src/pm/pm.service.js.map +0 -1
  227. package/src/pm/pm.spawn.js.map +0 -1
  228. package/src/pm/pm.types.js.map +0 -1
  229. package/src/templates/3rd-party-integration/src/http-client.d.ts +0 -20
  230. package/src/templates/3rd-party-integration/src/http-client.js +0 -105
  231. package/src/templates/3rd-party-integration/src/http-client.js.map +0 -1
  232. package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +0 -63
  233. package/src/templates/3rd-party-integration/src/mcp-http-types.js +0 -52
  234. package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +0 -1
  235. package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +0 -45
  236. package/src/templates/3rd-party-integration/src/tools/example.list.js +0 -85
  237. package/src/templates/3rd-party-integration/src/tools/example.list.js.map +0 -1
  238. package/src/tsconfig.js.map +0 -1
  239. package/src/utils/env.js.map +0 -1
  240. package/src/utils/fs.js.map +0 -1
  241. package/src/utils/prompts.js.map +0 -1
  242. package/src/version.js.map +0 -1
  243. /package/src/commands/{doctor.d.ts → dev/doctor.d.ts} +0 -0
  244. /package/src/commands/{inspector.d.ts → dev/inspector.d.ts} +0 -0
  245. /package/src/commands/{install → package}/questionnaire.d.ts +0 -0
  246. /package/src/commands/{install → package}/registry.d.ts +0 -0
  247. /package/src/commands/{install → package}/sources/git.d.ts +0 -0
  248. /package/src/commands/{install → package}/sources/local.d.ts +0 -0
  249. /package/src/commands/{install → package}/sources/local.js +0 -0
  250. /package/src/commands/{install → package}/sources/npm.d.ts +0 -0
  251. /package/src/commands/{install → package}/sources/npm.js +0 -0
  252. /package/src/{pm/pm.health.d.ts → commands/pm/health.d.ts} +0 -0
  253. /package/src/{pm/pm.logs.d.ts → commands/pm/log-utils.d.ts} +0 -0
  254. /package/src/{pm/pm.types.d.ts → commands/pm/types.d.ts} +0 -0
  255. /package/src/commands/{create.d.ts → scaffold/create.d.ts} +0 -0
  256. /package/src/{colors.d.ts → core/colors.d.ts} +0 -0
  257. /package/src/{colors.js → core/colors.js} +0 -0
  258. /package/src/{tsconfig.d.ts → core/tsconfig.d.ts} +0 -0
  259. /package/src/{tsconfig.js → core/tsconfig.js} +0 -0
  260. /package/src/{version.d.ts → core/version.d.ts} +0 -0
  261. /package/src/{utils → shared}/env.d.ts +0 -0
  262. /package/src/{utils → shared}/fs.d.ts +0 -0
  263. /package/src/{utils → shared}/prompts.d.ts +0 -0
  264. /package/src/{utils → shared}/prompts.js +0 -0
@@ -25,6 +25,7 @@ exports.PM_DIRS = {
25
25
  services: path.join(FRONTMCP_HOME, 'services'),
26
26
  apps: path.join(FRONTMCP_HOME, 'apps'),
27
27
  data: path.join(FRONTMCP_HOME, 'data'),
28
+ esmCache: path.join(FRONTMCP_HOME, 'esm-cache'),
28
29
  };
29
30
  function pidFilePath(name) {
30
31
  return path.join(exports.PM_DIRS.pids, `${name}.pid`);
@@ -51,4 +52,4 @@ function ensurePmDirs() {
51
52
  }
52
53
  }
53
54
  }
54
- //# sourceMappingURL=pm.paths.js.map
55
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../src/commands/pm/paths.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmBH,kCAEC;AAED,kCAEC;AAED,4CAEC;AAED,wCAEC;AAED,wBAEC;AAED,oCAEC;AAED,oCAMC;;AA/CD,+CAAyB;AACzB,mDAA6B;AAC7B,+CAAyB;AAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAE9C,QAAA,OAAO,GAAG;IACrB,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;IACtC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IAC5C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;IAC9C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;CACvC,CAAC;AAEX,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAO,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAO,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,eAAO,CAAC,IAAI,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAO,CAAC,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,YAAY;IAC1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,eAAO,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/**\n * Path resolution for Process Manager directories and files.\n * All PM state lives under ~/.frontmcp/\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nconst FRONTMCP_HOME = path.join(os.homedir(), '.frontmcp');\n\nexport const PM_DIRS = {\n root: FRONTMCP_HOME,\n pids: path.join(FRONTMCP_HOME, 'pids'),\n logs: path.join(FRONTMCP_HOME, 'logs'),\n sockets: path.join(FRONTMCP_HOME, 'sockets'),\n services: path.join(FRONTMCP_HOME, 'services'),\n apps: path.join(FRONTMCP_HOME, 'apps'),\n data: path.join(FRONTMCP_HOME, 'data'),\n esmCache: path.join(FRONTMCP_HOME, 'esm-cache'),\n} as const;\n\nexport function pidFilePath(name: string): string {\n return path.join(PM_DIRS.pids, `${name}.pid`);\n}\n\nexport function logFilePath(name: string): string {\n return path.join(PM_DIRS.logs, `${name}.log`);\n}\n\nexport function errorLogFilePath(name: string): string {\n return path.join(PM_DIRS.logs, `${name}.error.log`);\n}\n\nexport function socketFilePath(name: string): string {\n return path.join(PM_DIRS.sockets, `${name}.sock`);\n}\n\nexport function appDir(name: string): string {\n return path.join(PM_DIRS.apps, name);\n}\n\nexport function registryPath(): string {\n return path.join(FRONTMCP_HOME, 'registry.json');\n}\n\nexport function ensurePmDirs(): void {\n for (const dir of Object.values(PM_DIRS)) {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * PID file CRUD + process liveness checks.
3
3
  */
4
- import { PidFileData } from './pm.types';
4
+ import { PidFileData } from './types';
5
5
  export declare function writePidFile(name: string, data: PidFileData): string;
6
6
  export declare function readPidFile(name: string): PidFileData | null;
7
7
  export declare function removePidFile(name: string): void;
@@ -10,15 +10,15 @@ exports.isProcessAlive = isProcessAlive;
10
10
  exports.listPidFiles = listPidFiles;
11
11
  const tslib_1 = require("tslib");
12
12
  const fs = tslib_1.__importStar(require("fs"));
13
- const pm_paths_1 = require("./pm.paths");
13
+ const paths_1 = require("./paths");
14
14
  function writePidFile(name, data) {
15
- (0, pm_paths_1.ensurePmDirs)();
16
- const filePath = (0, pm_paths_1.pidFilePath)(name);
15
+ (0, paths_1.ensurePmDirs)();
16
+ const filePath = (0, paths_1.pidFilePath)(name);
17
17
  fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
18
18
  return filePath;
19
19
  }
20
20
  function readPidFile(name) {
21
- const filePath = (0, pm_paths_1.pidFilePath)(name);
21
+ const filePath = (0, paths_1.pidFilePath)(name);
22
22
  try {
23
23
  if (!fs.existsSync(filePath))
24
24
  return null;
@@ -30,7 +30,7 @@ function readPidFile(name) {
30
30
  }
31
31
  }
32
32
  function removePidFile(name) {
33
- const filePath = (0, pm_paths_1.pidFilePath)(name);
33
+ const filePath = (0, paths_1.pidFilePath)(name);
34
34
  try {
35
35
  if (fs.existsSync(filePath)) {
36
36
  fs.unlinkSync(filePath);
@@ -50,8 +50,8 @@ function isProcessAlive(pid) {
50
50
  }
51
51
  }
52
52
  function listPidFiles() {
53
- (0, pm_paths_1.ensurePmDirs)();
54
- const pidsDir = pm_paths_1.PM_DIRS.pids;
53
+ (0, paths_1.ensurePmDirs)();
54
+ const pidsDir = paths_1.PM_DIRS.pids;
55
55
  try {
56
56
  const files = fs.readdirSync(pidsDir).filter((f) => f.endsWith('.pid'));
57
57
  const results = [];
@@ -67,4 +67,4 @@ function listPidFiles() {
67
67
  return [];
68
68
  }
69
69
  }
70
- //# sourceMappingURL=pm.pidfile.js.map
70
+ //# sourceMappingURL=pidfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pidfile.js","sourceRoot":"","sources":["../../../../src/commands/pm/pidfile.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,oCAKC;AAED,kCASC;AAED,sCASC;AAED,wCAOC;AAED,oCAeC;;AAzDD,+CAAyB;AACzB,mCAA6D;AAG7D,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAiB;IAC1D,IAAA,oBAAY,GAAE,CAAC;IACf,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,YAAY;IAC1B,IAAA,oBAAY,GAAE,CAAC;IACf,MAAM,OAAO,GAAG,eAAO,CAAC,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","sourcesContent":["/**\n * PID file CRUD + process liveness checks.\n */\n\nimport * as fs from 'fs';\nimport { pidFilePath, ensurePmDirs, PM_DIRS } from './paths';\nimport { PidFileData } from './types';\n\nexport function writePidFile(name: string, data: PidFileData): string {\n ensurePmDirs();\n const filePath = pidFilePath(name);\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n return filePath;\n}\n\nexport function readPidFile(name: string): PidFileData | null {\n const filePath = pidFilePath(name);\n try {\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as PidFileData;\n } catch {\n return null;\n }\n}\n\nexport function removePidFile(name: string): void {\n const filePath = pidFilePath(name);\n try {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n } catch {\n // ignore\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function listPidFiles(): PidFileData[] {\n ensurePmDirs();\n const pidsDir = PM_DIRS.pids;\n try {\n const files = fs.readdirSync(pidsDir).filter((f: string) => f.endsWith('.pid'));\n const results: PidFileData[] = [];\n for (const file of files) {\n const name = file.replace(/\\.pid$/, '');\n const data = readPidFile(name);\n if (data) results.push(data);\n }\n return results;\n } catch {\n return [];\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPmCommands(program: Command): void;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPmCommands = registerPmCommands;
4
+ const bridge_1 = require("../../core/bridge");
5
+ function registerPmCommands(program) {
6
+ program
7
+ .command('start')
8
+ .description('Start a named MCP server with supervisor')
9
+ .argument('<name>', 'Process name')
10
+ .option('-e, --entry <path>', 'Entry file for the server')
11
+ .option('-p, --port <N>', 'Port number for the server', parseInt)
12
+ .option('-s, --socket <path>', 'Unix socket path')
13
+ .option('--db <path>', 'SQLite database path')
14
+ .option('--max-restarts <N>', 'Maximum auto-restart attempts (default: 5)', parseInt)
15
+ .action(async (name, options) => {
16
+ const { runStart } = await import('./start.js');
17
+ await runStart((0, bridge_1.toParsedArgs)('start', [name], options));
18
+ });
19
+ program
20
+ .command('stop')
21
+ .description('Stop a managed server (graceful by default)')
22
+ .argument('<name>', 'Process name')
23
+ .option('-f, --force', 'Force kill (SIGKILL instead of SIGTERM)')
24
+ .action(async (name, options) => {
25
+ const { runStop } = await import('./stop.js');
26
+ await runStop((0, bridge_1.toParsedArgs)('stop', [name], options));
27
+ });
28
+ program
29
+ .command('restart')
30
+ .description('Restart a managed server')
31
+ .argument('<name>', 'Process name')
32
+ .action(async (name) => {
33
+ const { runRestart } = await import('./restart.js');
34
+ await runRestart((0, bridge_1.toParsedArgs)('restart', [name], {}));
35
+ });
36
+ program
37
+ .command('status')
38
+ .description('Show process status (detail if name given, table if omitted)')
39
+ .argument('[name]', 'Process name')
40
+ .action(async (name) => {
41
+ const { runStatus } = await import('./status.js');
42
+ await runStatus((0, bridge_1.toParsedArgs)('status', name ? [name] : [], {}));
43
+ });
44
+ program
45
+ .command('list')
46
+ .description('List all managed processes')
47
+ .action(async () => {
48
+ const { runList } = await import('./list.js');
49
+ await runList((0, bridge_1.toParsedArgs)('list', [], {}));
50
+ });
51
+ program
52
+ .command('logs')
53
+ .description('Tail log output for a managed server')
54
+ .argument('<name>', 'Process name')
55
+ .option('-F, --follow', 'Follow log output (like tail -f)')
56
+ .option('-n, --lines <N>', 'Number of lines to show (default: 50)', parseInt)
57
+ .action(async (name, options) => {
58
+ const { runLogs } = await import('./logs.js');
59
+ await runLogs((0, bridge_1.toParsedArgs)('logs', [name], options));
60
+ });
61
+ program
62
+ .command('service')
63
+ .description('Install/uninstall systemd/launchd service')
64
+ .argument('<action>', 'Action: install or uninstall')
65
+ .argument('[name]', 'Service name')
66
+ .action(async (action, name) => {
67
+ const { runService } = await import('./service.js');
68
+ const positionals = name ? [action, name] : [action];
69
+ await runService((0, bridge_1.toParsedArgs)('service', positionals, {}));
70
+ });
71
+ program
72
+ .command('socket')
73
+ .description('Start Unix socket daemon for local MCP server')
74
+ .argument('<entry>', 'Entry file path')
75
+ .option('-s, --socket <path>', 'Unix socket path (default: ~/.frontmcp/sockets/{app}.sock)')
76
+ .option('--db <path>', 'SQLite database path for persistence')
77
+ .option('-b, --background', 'Run as background daemon (detached process)')
78
+ .action(async (entry, options) => {
79
+ const { runSocket } = await import('./socket.js');
80
+ await runSocket((0, bridge_1.toParsedArgs)('socket', [entry], options));
81
+ });
82
+ }
83
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../src/commands/pm/register.ts"],"names":[],"mappings":";;AAGA,gDAoFC;AAtFD,8CAAiD;AAEjD,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;SACzD,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,EAAE,QAAQ,CAAC;SAChE,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;SAC7C,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,EAAE,QAAQ,CAAC;SACpF,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,IAAA,qBAAY,EAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;SAC1D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,IAAA,qBAAY,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,UAAU,CAAC,IAAA,qBAAY,EAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,IAAA,qBAAY,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,IAAA,qBAAY,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,EAAE,QAAQ,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,IAAA,qBAAY,EAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;SACpD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAwB,EAAE,EAAE;QACzD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,UAAU,CAAC,IAAA,qBAAY,EAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACtC,MAAM,CAAC,qBAAqB,EAAE,4DAA4D,CAAC;SAC3F,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC7D,MAAM,CAAC,kBAAkB,EAAE,6CAA6C,CAAC;SACzE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,IAAA,qBAAY,EAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import { Command } from 'commander';\nimport { toParsedArgs } from '../../core/bridge';\n\nexport function registerPmCommands(program: Command): void {\n program\n .command('start')\n .description('Start a named MCP server with supervisor')\n .argument('<name>', 'Process name')\n .option('-e, --entry <path>', 'Entry file for the server')\n .option('-p, --port <N>', 'Port number for the server', parseInt)\n .option('-s, --socket <path>', 'Unix socket path')\n .option('--db <path>', 'SQLite database path')\n .option('--max-restarts <N>', 'Maximum auto-restart attempts (default: 5)', parseInt)\n .action(async (name: string, options) => {\n const { runStart } = await import('./start.js');\n await runStart(toParsedArgs('start', [name], options));\n });\n\n program\n .command('stop')\n .description('Stop a managed server (graceful by default)')\n .argument('<name>', 'Process name')\n .option('-f, --force', 'Force kill (SIGKILL instead of SIGTERM)')\n .action(async (name: string, options) => {\n const { runStop } = await import('./stop.js');\n await runStop(toParsedArgs('stop', [name], options));\n });\n\n program\n .command('restart')\n .description('Restart a managed server')\n .argument('<name>', 'Process name')\n .action(async (name: string) => {\n const { runRestart } = await import('./restart.js');\n await runRestart(toParsedArgs('restart', [name], {}));\n });\n\n program\n .command('status')\n .description('Show process status (detail if name given, table if omitted)')\n .argument('[name]', 'Process name')\n .action(async (name: string | undefined) => {\n const { runStatus } = await import('./status.js');\n await runStatus(toParsedArgs('status', name ? [name] : [], {}));\n });\n\n program\n .command('list')\n .description('List all managed processes')\n .action(async () => {\n const { runList } = await import('./list.js');\n await runList(toParsedArgs('list', [], {}));\n });\n\n program\n .command('logs')\n .description('Tail log output for a managed server')\n .argument('<name>', 'Process name')\n .option('-F, --follow', 'Follow log output (like tail -f)')\n .option('-n, --lines <N>', 'Number of lines to show (default: 50)', parseInt)\n .action(async (name: string, options) => {\n const { runLogs } = await import('./logs.js');\n await runLogs(toParsedArgs('logs', [name], options));\n });\n\n program\n .command('service')\n .description('Install/uninstall systemd/launchd service')\n .argument('<action>', 'Action: install or uninstall')\n .argument('[name]', 'Service name')\n .action(async (action: string, name: string | undefined) => {\n const { runService } = await import('./service.js');\n const positionals = name ? [action, name] : [action];\n await runService(toParsedArgs('service', positionals, {}));\n });\n\n program\n .command('socket')\n .description('Start Unix socket daemon for local MCP server')\n .argument('<entry>', 'Entry file path')\n .option('-s, --socket <path>', 'Unix socket path (default: ~/.frontmcp/sockets/{app}.sock)')\n .option('--db <path>', 'SQLite database path for persistence')\n .option('-b, --background', 'Run as background daemon (detached process)')\n .action(async (entry: string, options) => {\n const { runSocket } = await import('./socket.js');\n await runSocket(toParsedArgs('socket', [entry], options));\n });\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runRestart(opts: ParsedArgs): Promise<void>;
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runRestart = runRestart;
4
- const colors_1 = require("../colors");
5
- const pm_1 = require("../pm");
4
+ const colors_1 = require("../../core/colors");
5
+ const _1 = require(".");
6
6
  async function runRestart(opts) {
7
7
  const name = opts._[1];
8
8
  if (!name) {
9
9
  throw new Error('Missing process name. Usage: frontmcp restart <name>');
10
10
  }
11
- const pm = new pm_1.ProcessManager();
11
+ const pm = new _1.ProcessManager();
12
12
  console.log(`${(0, colors_1.c)('cyan', '[pm]')} restarting "${name}"...`);
13
13
  const info = await pm.restart(name);
14
14
  console.log(`\n${(0, colors_1.c)('green', 'Restarted successfully:')}\n`);
15
- console.log((0, pm_1.formatProcessDetail)(info));
15
+ console.log((0, _1.formatProcessDetail)(info));
16
16
  }
17
17
  //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../../src/commands/pm/restart.ts"],"names":[],"mappings":";;AAIA,gCAYC;AAfD,8CAAsC;AACtC,wBAAwD;AAEjD,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,iBAAc,EAAE,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,OAAO,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { ProcessManager, formatProcessDetail } from '.';\n\nexport async function runRestart(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp restart <name>');\n }\n\n const pm = new ProcessManager();\n\n console.log(`${c('cyan', '[pm]')} restarting \"${name}\"...`);\n const info = await pm.restart(name);\n console.log(`\\n${c('green', 'Restarted successfully:')}\\n`);\n console.log(formatProcessDetail(info));\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * systemd unit + launchd plist generation (user-level, no sudo).
3
3
  */
4
- import { ServicePlatform } from './pm.types';
4
+ import { ServicePlatform } from './types';
5
5
  export declare function detectPlatform(): ServicePlatform;
6
6
  export declare function installService(name: string): string;
7
7
  export declare function uninstallService(name: string): string | null;
@@ -11,8 +11,8 @@ const tslib_1 = require("tslib");
11
11
  const fs = tslib_1.__importStar(require("fs"));
12
12
  const path = tslib_1.__importStar(require("path"));
13
13
  const os = tslib_1.__importStar(require("os"));
14
- const pm_pidfile_1 = require("./pm.pidfile");
15
- const pm_paths_1 = require("./pm.paths");
14
+ const pidfile_1 = require("./pidfile");
15
+ const paths_1 = require("./paths");
16
16
  function detectPlatform() {
17
17
  if (process.platform === 'win32') {
18
18
  throw new Error('Windows is not supported for service management. Use Windows Task Scheduler or NSSM instead.');
@@ -73,11 +73,11 @@ WantedBy=default.target
73
73
  `;
74
74
  }
75
75
  function installService(name) {
76
- const pidData = (0, pm_pidfile_1.readPidFile)(name);
76
+ const pidData = (0, pidfile_1.readPidFile)(name);
77
77
  if (!pidData) {
78
78
  throw new Error(`No PID file found for "${name}". Start the server first with: frontmcp start ${name} --entry <path>`);
79
79
  }
80
- (0, pm_paths_1.ensurePmDirs)();
80
+ (0, paths_1.ensurePmDirs)();
81
81
  const platform = detectPlatform();
82
82
  if (platform === 'launchd') {
83
83
  const plistPath = launchdPlistPath(name);
@@ -113,4 +113,4 @@ function getServicePath(name) {
113
113
  const platform = detectPlatform();
114
114
  return platform === 'launchd' ? launchdPlistPath(name) : systemdUnitPath(name);
115
115
  }
116
- //# sourceMappingURL=pm.service.js.map
116
+ //# sourceMappingURL=service-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-gen.js","sourceRoot":"","sources":["../../../../src/commands/pm/service-gen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * systemd unit + launchd plist generation (user-level, no sudo).\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { ServicePlatform } from './types';\nimport { readPidFile } from './pidfile';\nimport { ensurePmDirs } from './paths';\n\nexport function detectPlatform(): ServicePlatform {\n if (process.platform === 'win32') {\n throw new Error('Windows is not supported for service management. Use Windows Task Scheduler or NSSM instead.');\n }\n return process.platform === 'darwin' ? 'launchd' : 'systemd';\n}\n\nfunction launchdPlistPath(name: string): string {\n return path.join(os.homedir(), 'Library', 'LaunchAgents', `dev.agentfront.frontmcp.${name}.plist`);\n}\n\nfunction systemdUnitPath(name: string): string {\n return path.join(os.homedir(), '.config', 'systemd', 'user', `frontmcp-${name}.service`);\n}\n\nfunction generateLaunchdPlist(name: string, entry: string): string {\n const frontmcpBin = process.argv[1] || 'frontmcp';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>dev.agentfront.frontmcp.${name}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${process.execPath}</string>\n <string>${frontmcpBin}</string>\n <string>start</string>\n <string>${name}</string>\n <string>--entry</string>\n <string>${entry}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <false/>\n <key>StandardOutPath</key>\n <string>${path.join(os.homedir(), '.frontmcp', 'logs', `${name}.launchd.log`)}</string>\n <key>StandardErrorPath</key>\n <string>${path.join(os.homedir(), '.frontmcp', 'logs', `${name}.launchd.error.log`)}</string>\n</dict>\n</plist>`;\n}\n\nfunction generateSystemdUnit(name: string, entry: string): string {\n const frontmcpBin = process.argv[1] || 'frontmcp';\n\n return `[Unit]\nDescription=FrontMCP Server - ${name}\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=\"${process.execPath}\" \"${frontmcpBin}\" start ${name} --entry \"${entry}\"\nRestart=on-failure\nRestartSec=5\nStandardOutput=journal\nStandardError=journal\nSyslogIdentifier=frontmcp-${name}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport function installService(name: string): string {\n const pidData = readPidFile(name);\n if (!pidData) {\n throw new Error(\n `No PID file found for \"${name}\". Start the server first with: frontmcp start ${name} --entry <path>`,\n );\n }\n\n ensurePmDirs();\n const platform = detectPlatform();\n\n if (platform === 'launchd') {\n const plistPath = launchdPlistPath(name);\n const content = generateLaunchdPlist(name, pidData.entry);\n const dir = path.dirname(plistPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(plistPath, content, 'utf-8');\n return plistPath;\n } else {\n const unitPath = systemdUnitPath(name);\n const content = generateSystemdUnit(name, pidData.entry);\n const dir = path.dirname(unitPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(unitPath, content, 'utf-8');\n return unitPath;\n }\n}\n\nexport function uninstallService(name: string): string | null {\n const platform = detectPlatform();\n const filePath = platform === 'launchd' ? launchdPlistPath(name) : systemdUnitPath(name);\n\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n return filePath;\n }\n\n return null;\n}\n\nexport function getServicePath(name: string): string {\n const platform = detectPlatform();\n return platform === 'launchd' ? launchdPlistPath(name) : systemdUnitPath(name);\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runService(opts: ParsedArgs): Promise<void>;
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runService = runService;
4
- const colors_1 = require("../colors");
5
- const pm_1 = require("../pm");
4
+ const colors_1 = require("../../core/colors");
5
+ const _1 = require(".");
6
6
  async function runService(opts) {
7
7
  const action = opts._[1]; // 'install' or 'uninstall'
8
8
  const name = opts._[2];
9
9
  if (!action || !name) {
10
10
  throw new Error('Usage: frontmcp service <install|uninstall> <name>');
11
11
  }
12
- const platform = (0, pm_1.detectPlatform)();
12
+ const platform = (0, _1.detectPlatform)();
13
13
  switch (action) {
14
14
  case 'install': {
15
15
  console.log(`${(0, colors_1.c)('cyan', '[service]')} generating ${platform} service for "${name}"...`);
16
- const filePath = (0, pm_1.installService)(name);
16
+ const filePath = (0, _1.installService)(name);
17
17
  console.log(`${(0, colors_1.c)('green', '[service]')} service file created: ${filePath}`);
18
18
  if (platform === 'launchd') {
19
19
  console.log(`\n${(0, colors_1.c)('bold', 'To load the service:')}`);
@@ -32,13 +32,13 @@ async function runService(opts) {
32
32
  case 'uninstall': {
33
33
  console.log(`${(0, colors_1.c)('cyan', '[service]')} removing service for "${name}"...`);
34
34
  if (platform === 'launchd') {
35
- const servicePath = (0, pm_1.getServicePath)(name);
35
+ const servicePath = (0, _1.getServicePath)(name);
36
36
  console.log((0, colors_1.c)('yellow', `hint: run 'launchctl unload ${servicePath}' first if the service is loaded`));
37
37
  }
38
38
  else {
39
39
  console.log((0, colors_1.c)('yellow', `hint: run 'systemctl --user stop frontmcp-${name}' first if the service is running`));
40
40
  }
41
- const removed = (0, pm_1.uninstallService)(name);
41
+ const removed = (0, _1.uninstallService)(name);
42
42
  if (removed) {
43
43
  console.log(`${(0, colors_1.c)('green', '[service]')} service file removed: ${removed}`);
44
44
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/commands/pm/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { installService, uninstallService, detectPlatform, getServicePath } from '.';\n\nexport async function runService(opts: ParsedArgs): Promise<void> {\n const action = opts._[1]; // 'install' or 'uninstall'\n const name = opts._[2];\n\n if (!action || !name) {\n throw new Error('Usage: frontmcp service <install|uninstall> <name>');\n }\n\n const platform = detectPlatform();\n\n switch (action) {\n case 'install': {\n console.log(`${c('cyan', '[service]')} generating ${platform} service for \"${name}\"...`);\n const filePath = installService(name);\n console.log(`${c('green', '[service]')} service file created: ${filePath}`);\n\n if (platform === 'launchd') {\n console.log(`\\n${c('bold', 'To load the service:')}`);\n console.log(` launchctl load ${filePath}`);\n console.log(`\\n${c('bold', 'To start:')}`);\n console.log(` launchctl start dev.agentfront.frontmcp.${name}`);\n } else {\n console.log(`\\n${c('bold', 'To enable and start:')}`);\n console.log(` systemctl --user daemon-reload`);\n console.log(` systemctl --user enable frontmcp-${name}`);\n console.log(` systemctl --user start frontmcp-${name}`);\n }\n break;\n }\n\n case 'uninstall': {\n console.log(`${c('cyan', '[service]')} removing service for \"${name}\"...`);\n\n if (platform === 'launchd') {\n const servicePath = getServicePath(name);\n console.log(c('yellow', `hint: run 'launchctl unload ${servicePath}' first if the service is loaded`));\n } else {\n console.log(c('yellow', `hint: run 'systemctl --user stop frontmcp-${name}' first if the service is running`));\n }\n\n const removed = uninstallService(name);\n if (removed) {\n console.log(`${c('green', '[service]')} service file removed: ${removed}`);\n } else {\n console.log(`${c('yellow', '[service]')} no service file found for \"${name}\".`);\n }\n break;\n }\n\n default:\n throw new Error(`Unknown service action: \"${action}\". Use \"install\" or \"uninstall\".`);\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runSocket(opts: ParsedArgs): Promise<void>;
@@ -5,9 +5,9 @@ const tslib_1 = require("tslib");
5
5
  const path = tslib_1.__importStar(require("path"));
6
6
  const os = tslib_1.__importStar(require("os"));
7
7
  const child_process_1 = require("child_process");
8
- const colors_1 = require("../colors");
9
- const fs_1 = require("../utils/fs");
10
- const env_1 = require("../utils/env");
8
+ const colors_1 = require("../../core/colors");
9
+ const fs_1 = require("../../shared/fs");
10
+ const env_1 = require("../../shared/env");
11
11
  function ensureDir(dir) {
12
12
  const fs = require('fs');
13
13
  if (!fs.existsSync(dir)) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../src/commands/pm/socket.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport * as os from 'os';\nimport { spawn, ChildProcess } from 'child_process';\nimport { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { resolveEntry } from '../../shared/fs';\nimport { loadDevEnv } from '../../shared/env';\n\nfunction ensureDir(dir: string): void {\n const fs = require('fs');\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction resolveSocketPath(opts: ParsedArgs, entryPath: string): string {\n if (opts.socket) {\n return path.resolve(opts.socket);\n }\n\n // Default: ~/.frontmcp/sockets/{app-name}.sock\n const appName = path.basename(path.dirname(entryPath));\n const socketsDir = path.join(os.homedir(), '.frontmcp', 'sockets');\n ensureDir(socketsDir);\n return path.join(socketsDir, `${appName}.sock`);\n}\n\nfunction resolveDbPath(opts: ParsedArgs): string | undefined {\n if (!opts.db) return undefined;\n return path.resolve(opts.db);\n}\n\nfunction writePidFile(socketPath: string): string {\n const pidPath = socketPath + '.pid';\n const fs = require('fs');\n fs.writeFileSync(pidPath, String(process.pid), 'utf-8');\n return pidPath;\n}\n\nfunction cleanupPidFile(socketPath: string): void {\n const pidPath = socketPath + '.pid';\n try {\n const fs = require('fs');\n if (fs.existsSync(pidPath)) {\n fs.unlinkSync(pidPath);\n }\n } catch {\n // ignore\n }\n}\n\nexport async function runSocket(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry ?? opts._[1]);\n\n // Load environment variables\n loadDevEnv(cwd);\n\n const socketPath = resolveSocketPath(opts, entry);\n const dbPath = resolveDbPath(opts);\n\n console.log(`${c('cyan', '[socket]')} entry: ${path.relative(cwd, entry)}`);\n console.log(`${c('cyan', '[socket]')} socket: ${socketPath}`);\n if (dbPath) {\n console.log(`${c('cyan', '[socket]')} db: ${dbPath}`);\n }\n\n if (opts.background) {\n // Background mode: spawn detached process\n console.log(`${c('gray', '[socket]')} starting in background mode...`);\n\n const args = ['socket', entry, '--socket', socketPath];\n if (dbPath) {\n args.push('--db', dbPath);\n }\n\n // Re-invoke frontmcp without --background flag\n const scriptPath = process.argv[1];\n if (!scriptPath) {\n throw new Error('Cannot determine script path from process.argv[1] for background spawn');\n }\n const child: ChildProcess = spawn(process.execPath, [scriptPath, ...args], {\n detached: true,\n stdio: 'ignore',\n });\n\n child.unref();\n console.log(`${c('green', '[socket]')} daemon started (PID: ${child.pid})`);\n console.log(`${c('gray', 'hint:')} test with: curl --unix-socket ${socketPath} http://localhost/health`);\n return;\n }\n\n // Foreground mode: run directly via tsx\n console.log(`${c('gray', '[socket]')} starting in foreground mode...`);\n console.log(`${c('gray', 'hint:')} press Ctrl+C to stop`);\n console.log(`${c('gray', 'hint:')} test with: curl --unix-socket ${socketPath} http://localhost/health`);\n\n // Set environment variables for the child process\n const env: Record<string, string> = {\n ...(process.env as Record<string, string>),\n FRONTMCP_SOCKET_PATH: socketPath,\n };\n if (dbPath) {\n env['FRONTMCP_SQLITE_PATH'] = dbPath;\n }\n\n writePidFile(socketPath);\n\n const app = spawn('npx', ['-y', 'tsx', '--conditions', 'node', entry], {\n stdio: 'inherit',\n env,\n });\n\n const cleanup = () => {\n try {\n app.kill('SIGINT');\n } catch {\n // ignore\n }\n cleanupPidFile(socketPath);\n };\n\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n cleanup();\n process.exit(0);\n });\n\n await new Promise<void>((resolve, reject) => {\n app.on('close', () => {\n cleanupPidFile(socketPath);\n resolve();\n });\n app.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * and exponential backoff.
4
4
  */
5
5
  import { ChildProcess } from 'child_process';
6
- import { StartOptions } from './pm.types';
6
+ import { StartOptions } from './types';
7
7
  export declare class Supervisor {
8
8
  private child;
9
9
  private running;
@@ -6,11 +6,11 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.Supervisor = void 0;
8
8
  const child_process_1 = require("child_process");
9
- const pm_paths_1 = require("./pm.paths");
10
- const pm_logs_1 = require("./pm.logs");
11
- const pm_pidfile_1 = require("./pm.pidfile");
12
- const pm_health_1 = require("./pm.health");
13
- const version_1 = require("../version");
9
+ const paths_1 = require("./paths");
10
+ const log_utils_1 = require("./log-utils");
11
+ const pidfile_1 = require("./pidfile");
12
+ const health_1 = require("./health");
13
+ const version_1 = require("../../core/version");
14
14
  const DEFAULT_MAX_RESTARTS = 5;
15
15
  const INITIAL_BACKOFF_MS = 1000;
16
16
  const MAX_BACKOFF_MS = 30000;
@@ -29,7 +29,7 @@ class Supervisor {
29
29
  this.opts = opts;
30
30
  this.maxRestarts = opts.maxRestarts ?? DEFAULT_MAX_RESTARTS;
31
31
  if (opts.socket || opts.socketPath) {
32
- this.resolvedSocketPath = opts.socketPath || (0, pm_paths_1.socketFilePath)(opts.name);
32
+ this.resolvedSocketPath = opts.socketPath || (0, paths_1.socketFilePath)(opts.name);
33
33
  }
34
34
  }
35
35
  async start() {
@@ -67,7 +67,7 @@ class Supervisor {
67
67
  }
68
68
  });
69
69
  }
70
- (0, pm_pidfile_1.removePidFile)(this.opts.name);
70
+ (0, pidfile_1.removePidFile)(this.opts.name);
71
71
  this.child = null;
72
72
  }
73
73
  getChild() {
@@ -78,7 +78,7 @@ class Supervisor {
78
78
  }
79
79
  async spawnChild() {
80
80
  const { name, entry, port, dbPath, env: extraEnv } = this.opts;
81
- const logs = (0, pm_logs_1.createLogStreams)(name);
81
+ const logs = (0, log_utils_1.createLogStreams)(name);
82
82
  const env = {
83
83
  ...process.env,
84
84
  ...extraEnv,
@@ -108,7 +108,7 @@ class Supervisor {
108
108
  throw new Error(`Failed to spawn process for "${name}": child PID is undefined`);
109
109
  }
110
110
  // Write PID file
111
- (0, pm_pidfile_1.writePidFile)(name, {
111
+ (0, pidfile_1.writePidFile)(name, {
112
112
  pid: child.pid,
113
113
  name,
114
114
  entry,
@@ -137,7 +137,7 @@ class Supervisor {
137
137
  this.scheduleRestart();
138
138
  }
139
139
  else {
140
- (0, pm_pidfile_1.removePidFile)(name);
140
+ (0, pidfile_1.removePidFile)(name);
141
141
  }
142
142
  });
143
143
  child.on('error', (err) => {
@@ -155,7 +155,7 @@ class Supervisor {
155
155
  this.scheduleRestart();
156
156
  }
157
157
  else {
158
- (0, pm_pidfile_1.removePidFile)(name);
158
+ (0, pidfile_1.removePidFile)(name);
159
159
  }
160
160
  });
161
161
  }
@@ -164,7 +164,7 @@ class Supervisor {
164
164
  const timestamp = new Date().toISOString();
165
165
  console.error(`[${timestamp}] ${this.opts.name}: max restarts (${this.maxRestarts}) reached, giving up`);
166
166
  this.running = false;
167
- (0, pm_pidfile_1.removePidFile)(this.opts.name);
167
+ (0, pidfile_1.removePidFile)(this.opts.name);
168
168
  return;
169
169
  }
170
170
  const backoff = Math.min(INITIAL_BACKOFF_MS * Math.pow(BACKOFF_MULTIPLIER, this.restartCount), MAX_BACKOFF_MS);
@@ -176,7 +176,7 @@ class Supervisor {
176
176
  this.spawnChild().catch((err) => {
177
177
  console.error(`Failed to restart ${this.opts.name}: ${err.message}`);
178
178
  this.running = false;
179
- (0, pm_pidfile_1.removePidFile)(this.opts.name);
179
+ (0, pidfile_1.removePidFile)(this.opts.name);
180
180
  });
181
181
  }
182
182
  }, backoff);
@@ -186,7 +186,7 @@ class Supervisor {
186
186
  this.healthTimer = setInterval(async () => {
187
187
  if (!this.running || !this.child)
188
188
  return;
189
- const result = await (0, pm_health_1.checkHealth)({
189
+ const result = await (0, health_1.checkHealth)({
190
190
  port: this.opts.port,
191
191
  socketPath: this.resolvedSocketPath,
192
192
  });
@@ -204,4 +204,4 @@ class Supervisor {
204
204
  }
205
205
  }
206
206
  exports.Supervisor = Supervisor;
207
- //# sourceMappingURL=pm.spawn.js.map
207
+ //# sourceMappingURL=spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../../src/commands/pm/spawn.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Supervisor class: spawns a child MCP server process with auto-restart\n * and exponential backoff.\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { StartOptions } from './types';\nimport { socketFilePath } from './paths';\nimport { createLogStreams } from './log-utils';\nimport { writePidFile, removePidFile } from './pidfile';\nimport { checkHealth } from './health';\nimport { getSelfVersion } from '../../core/version';\n\nconst DEFAULT_MAX_RESTARTS = 5;\nconst INITIAL_BACKOFF_MS = 1000;\nconst MAX_BACKOFF_MS = 30000;\nconst BACKOFF_MULTIPLIER = 2;\nconst HEALTH_CHECK_INTERVAL_MS = 30000;\nconst GRACEFUL_SHUTDOWN_TIMEOUT_MS = 10000;\n\nexport class Supervisor {\n private child: ChildProcess | null = null;\n private running = false;\n private restartCount = 0;\n private readonly maxRestarts: number;\n private healthTimer: ReturnType<typeof setInterval> | null = null;\n private readonly opts: StartOptions;\n private resolvedSocketPath: string | undefined;\n\n constructor(opts: StartOptions) {\n this.opts = opts;\n this.maxRestarts = opts.maxRestarts ?? DEFAULT_MAX_RESTARTS;\n if (opts.socket || opts.socketPath) {\n this.resolvedSocketPath = opts.socketPath || socketFilePath(opts.name);\n }\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.restartCount = 0;\n await this.spawnChild();\n }\n\n async stop(force = false): Promise<void> {\n this.running = false;\n this.stopHealthChecks();\n\n if (!this.child) return;\n\n if (force) {\n this.child.kill('SIGKILL');\n } else {\n this.child.kill('SIGTERM');\n\n // Wait for graceful shutdown, then force kill\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (this.child) {\n this.child.kill('SIGKILL');\n }\n resolve();\n }, GRACEFUL_SHUTDOWN_TIMEOUT_MS);\n\n if (this.child) {\n this.child.on('exit', () => {\n clearTimeout(timer);\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n removePidFile(this.opts.name);\n this.child = null;\n }\n\n getChild(): ChildProcess | null {\n return this.child;\n }\n\n getRestartCount(): number {\n return this.restartCount;\n }\n\n private async spawnChild(): Promise<void> {\n const { name, entry, port, dbPath, env: extraEnv } = this.opts;\n\n const logs = createLogStreams(name);\n\n const env: Record<string, string> = {\n ...(process.env as Record<string, string>),\n ...extraEnv,\n };\n\n if (this.resolvedSocketPath) {\n env['FRONTMCP_SOCKET_PATH'] = this.resolvedSocketPath;\n }\n if (port) {\n env['PORT'] = String(port);\n }\n if (dbPath) {\n env['FRONTMCP_SQLITE_PATH'] = dbPath;\n }\n\n const child = spawn('npx', ['-y', 'tsx', '--conditions', 'node', entry], {\n stdio: ['ignore', 'pipe', 'pipe'],\n env,\n detached: false,\n });\n\n this.child = child;\n\n if (child.stdout) {\n child.stdout.pipe(logs.stdout);\n }\n if (child.stderr) {\n child.stderr.pipe(logs.stderr);\n }\n\n if (child.pid === undefined) {\n throw new Error(`Failed to spawn process for \"${name}\": child PID is undefined`);\n }\n\n // Write PID file\n writePidFile(name, {\n pid: child.pid,\n name,\n entry,\n port,\n socketPath: this.resolvedSocketPath,\n dbPath,\n startedAt: new Date().toISOString(),\n restartCount: this.restartCount,\n supervisorPid: process.pid,\n cliVersion: getSelfVersion(),\n });\n\n // Start health checks\n this.startHealthChecks();\n\n child.on('exit', (code, signal) => {\n const timestamp = new Date().toISOString();\n const msg = `[${timestamp}] Process exited: code=${code} signal=${signal}\\n`;\n\n try {\n logs.stderr.write(msg);\n } catch {\n // ignore\n }\n\n this.child = null;\n this.stopHealthChecks();\n\n if (this.running) {\n this.scheduleRestart();\n } else {\n removePidFile(name);\n }\n });\n\n child.on('error', (err) => {\n const timestamp = new Date().toISOString();\n const msg = `[${timestamp}] Process error: ${err.message}\\n`;\n\n try {\n logs.stderr.write(msg);\n } catch {\n // ignore\n }\n\n this.child = null;\n this.stopHealthChecks();\n\n if (this.running) {\n this.scheduleRestart();\n } else {\n removePidFile(name);\n }\n });\n }\n\n private scheduleRestart(): void {\n if (this.restartCount >= this.maxRestarts) {\n const timestamp = new Date().toISOString();\n console.error(`[${timestamp}] ${this.opts.name}: max restarts (${this.maxRestarts}) reached, giving up`);\n this.running = false;\n removePidFile(this.opts.name);\n return;\n }\n\n const backoff = Math.min(INITIAL_BACKOFF_MS * Math.pow(BACKOFF_MULTIPLIER, this.restartCount), MAX_BACKOFF_MS);\n this.restartCount++;\n\n const timestamp = new Date().toISOString();\n console.error(\n `[${timestamp}] ${this.opts.name}: restarting in ${backoff}ms (attempt ${this.restartCount}/${this.maxRestarts})`,\n );\n\n setTimeout(() => {\n if (this.running) {\n this.spawnChild().catch((err) => {\n console.error(`Failed to restart ${this.opts.name}: ${err.message}`);\n this.running = false;\n removePidFile(this.opts.name);\n });\n }\n }, backoff);\n }\n\n private startHealthChecks(): void {\n this.stopHealthChecks();\n\n this.healthTimer = setInterval(async () => {\n if (!this.running || !this.child) return;\n\n const result = await checkHealth({\n port: this.opts.port,\n socketPath: this.resolvedSocketPath,\n });\n\n if (!result.healthy && this.running && this.child) {\n const timestamp = new Date().toISOString();\n console.error(\n `[${timestamp}] ${this.opts.name}: health check failed (${result.error || `status ${result.statusCode}`})`,\n );\n }\n }, HEALTH_CHECK_INTERVAL_MS);\n }\n\n private stopHealthChecks(): void {\n if (this.healthTimer) {\n clearInterval(this.healthTimer);\n this.healthTimer = null;\n }\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runStart(opts: ParsedArgs): Promise<void>;
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runStart = runStart;
4
4
  const tslib_1 = require("tslib");
5
5
  const path = tslib_1.__importStar(require("path"));
6
- const colors_1 = require("../colors");
7
- const fs_1 = require("../utils/fs");
8
- const env_1 = require("../utils/env");
9
- const pm_1 = require("../pm");
6
+ const colors_1 = require("../../core/colors");
7
+ const fs_1 = require("../../shared/fs");
8
+ const env_1 = require("../../shared/env");
9
+ const _1 = require(".");
10
10
  async function runStart(opts) {
11
11
  const name = opts._[1];
12
12
  if (!name) {
@@ -16,7 +16,7 @@ async function runStart(opts) {
16
16
  const entry = await (0, fs_1.resolveEntry)(cwd, opts.entry);
17
17
  // Load environment variables
18
18
  (0, env_1.loadDevEnv)(cwd);
19
- const pm = new pm_1.ProcessManager();
19
+ const pm = new _1.ProcessManager();
20
20
  console.log(`${(0, colors_1.c)('cyan', '[pm]')} starting "${name}"...`);
21
21
  console.log(`${(0, colors_1.c)('cyan', '[pm]')} entry: ${path.relative(cwd, entry)}`);
22
22
  const info = await pm.start({
@@ -29,7 +29,7 @@ async function runStart(opts) {
29
29
  maxRestarts: opts.maxRestarts,
30
30
  });
31
31
  console.log(`\n${(0, colors_1.c)('green', 'Started successfully:')}\n`);
32
- console.log((0, pm_1.formatProcessDetail)(info));
32
+ console.log((0, _1.formatProcessDetail)(info));
33
33
  if (info.socketPath) {
34
34
  console.log(`\n${(0, colors_1.c)('gray', 'hint:')} test with: curl --unix-socket ${info.socketPath} http://localhost/health`);
35
35
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/commands/pm/start.ts"],"names":[],"mappings":";;AAOA,4BAgDC;;AAvDD,mDAA6B;AAE7B,8CAAsC;AACtC,wCAA+C;AAC/C,0CAA8C;AAC9C,wBAAwD;AAEjD,KAAK,UAAU,QAAQ,CAAC,IAAgB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAElD,6BAA6B;IAC7B,IAAA,gBAAU,EAAC,GAAG,CAAC,CAAC;IAEhB,MAAM,EAAE,GAAG,IAAI,iBAAc,EAAE,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAExE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC;QAC1B,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;QACrB,UAAU,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACrE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACnD,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,IAAA,sBAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;IAEvC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,kCAAkC,IAAI,CAAC,UAAU,0BAA0B,CAAC,CAAC;IAClH,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,qCAAqC,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;IAC9F,CAAC;IAED,oCAAoC;IACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,UAAC,EAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YACjC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import * as path from 'path';\nimport { ParsedArgs } from '../../core/args';\nimport { c } from '../../core/colors';\nimport { resolveEntry } from '../../shared/fs';\nimport { loadDevEnv } from '../../shared/env';\nimport { ProcessManager, formatProcessDetail } from '.';\n\nexport async function runStart(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp start <name> --entry <path>');\n }\n\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n\n // Load environment variables\n loadDevEnv(cwd);\n\n const pm = new ProcessManager();\n\n console.log(`${c('cyan', '[pm]')} starting \"${name}\"...`);\n console.log(`${c('cyan', '[pm]')} entry: ${path.relative(cwd, entry)}`);\n\n const info = await pm.start({\n name,\n entry,\n port: opts.port,\n socket: !!opts.socket,\n socketPath: typeof opts.socket === 'string' ? opts.socket : undefined,\n dbPath: opts.db ? path.resolve(opts.db) : undefined,\n maxRestarts: opts.maxRestarts,\n });\n\n console.log(`\\n${c('green', 'Started successfully:')}\\n`);\n console.log(formatProcessDetail(info));\n\n if (info.socketPath) {\n console.log(`\\n${c('gray', 'hint:')} test with: curl --unix-socket ${info.socketPath} http://localhost/health`);\n } else if (info.port) {\n console.log(`\\n${c('gray', 'hint:')} test with: curl http://localhost:${info.port}/health`);\n }\n\n // Keep the supervisor process alive\n await new Promise<void>((resolve) => {\n process.once('SIGINT', async () => {\n console.log(`\\n${c('yellow', '[pm]')} stopping \"${name}\"...`);\n await pm.stop(name);\n resolve();\n });\n process.once('SIGTERM', async () => {\n await pm.stop(name);\n resolve();\n });\n });\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { ParsedArgs } from '../args';
1
+ import { ParsedArgs } from '../../core/args';
2
2
  export declare function runStatus(opts: ParsedArgs): Promise<void>;