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
@@ -1 +0,0 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/commands/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 '../args';\nimport { c } from '../colors';\nimport { resolveEntry } from '../utils/fs';\nimport { loadDevEnv } from '../utils/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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":";;AAOA,4BAgDC;;AAvDD,mDAA6B;AAE7B,sCAA8B;AAC9B,oCAA2C;AAC3C,sCAA0C;AAC1C,8BAA4D;AAErD,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,mBAAc,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,wBAAmB,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 '../args';\nimport { c } from '../colors';\nimport { resolveEntry } from '../utils/fs';\nimport { loadDevEnv } from '../utils/env';\nimport { ProcessManager, formatProcessDetail } from '../pm';\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 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":";;AAIA,8BAiBC;AApBD,sCAA8B;AAC9B,8BAAgF;AAEzE,KAAK,UAAU,SAAS,CAAC,IAAgB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,mBAAc,EAAE,CAAC;IAEhC,IAAI,IAAI,EAAE,CAAC;QACT,mCAAmC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,QAAQ,EAAE,+BAA+B,IAAI,IAAI,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAA,wBAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,IAAA,uBAAkB,EAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC","sourcesContent":["import { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { ProcessManager, formatProcessDetail, formatProcessTable } from '../pm';\n\nexport async function runStatus(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n const pm = new ProcessManager();\n\n if (name) {\n // Show detail for a single process\n const info = pm.getProcessInfo(name);\n if (!info) {\n console.log(c('yellow', `No process found with name \"${name}\".`));\n return;\n }\n console.log(formatProcessDetail(info));\n } else {\n // Show summary of all processes\n const all = pm.listAll();\n console.log(formatProcessTable(all));\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/stop.ts"],"names":[],"mappings":";;AAIA,0BAWC;AAdD,sCAA8B;AAC9B,8BAAuC;AAEhC,KAAK,UAAU,OAAO,CAAC,IAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,mBAAc,EAAE,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;AAC1D,CAAC","sourcesContent":["import { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { ProcessManager } from '../pm';\n\nexport async function runStop(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing process name. Usage: frontmcp stop <name>');\n }\n\n const pm = new ProcessManager();\n\n console.log(`${c('cyan', '[pm]')} stopping \"${name}\"...`);\n await pm.stop(name, { force: opts.force });\n console.log(`${c('green', '[pm]')} \"${name}\" stopped.`);\n}\n"]}
@@ -1,13 +0,0 @@
1
- /**
2
- * frontmcp template <templateName>
3
- *
4
- * Example:
5
- * npx frontmcp template 3rd-party-integration
6
- *
7
- * This will look for templates in:
8
- * src/templates/<templateName> (built to dist/templates/<templateName>)
9
- * and copy them into:
10
- * integrations/<owner>/<service>
11
- * with __OWNER__, __SERVICE__, __AUTH_TYPE__ replaced.
12
- */
13
- export declare function runTemplate(templateName?: string): Promise<void>;
@@ -1,193 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runTemplate = runTemplate;
4
- const tslib_1 = require("tslib");
5
- const path = tslib_1.__importStar(require("path"));
6
- const colors_1 = require("../colors");
7
- const utils_1 = require("@frontmcp/utils");
8
- const fs_1 = require("../utils/fs");
9
- const prompts_1 = require("../utils/prompts");
10
- /**
11
- * frontmcp template <templateName>
12
- *
13
- * Example:
14
- * npx frontmcp template 3rd-party-integration
15
- *
16
- * This will look for templates in:
17
- * src/templates/<templateName> (built to dist/templates/<templateName>)
18
- * and copy them into:
19
- * integrations/<owner>/<service>
20
- * with __OWNER__, __SERVICE__, __AUTH_TYPE__ replaced.
21
- */
22
- async function runTemplate(templateName) {
23
- const name = (templateName || '').trim();
24
- if (!name) {
25
- console.log((0, colors_1.c)('red', 'Template name is required (e.g. 3rd-party-integration).'));
26
- return;
27
- }
28
- const p = await (0, prompts_1.clack)();
29
- const templatesRoot = path.resolve(__dirname, '..', 'templates');
30
- // 1) Collect available templates up-front
31
- const available = await listAvailableTemplates(templatesRoot);
32
- if (!available.length) {
33
- console.log((0, colors_1.c)('red', `No templates found under ${path.relative(process.cwd(), templatesRoot)}.`));
34
- return;
35
- }
36
- // 2) Sanitize the name and choose the actual template folder
37
- const sanitized = sanitizeTemplateName(name);
38
- let selected = null;
39
- if (available.includes(name)) {
40
- selected = name;
41
- }
42
- else if (available.includes(sanitized)) {
43
- selected = sanitized;
44
- if (sanitized !== name) {
45
- console.log((0, colors_1.c)('yellow', `[template] Template "${name}" not found, using sanitized "${sanitized}"`));
46
- }
47
- }
48
- if (!selected) {
49
- console.log((0, colors_1.c)('red', `Template "${name}" not found under ${path.relative(process.cwd(), templatesRoot)}.`));
50
- console.log((0, colors_1.c)('gray', '\nAvailable templates:'));
51
- for (const t of available) {
52
- console.log(' -', t);
53
- }
54
- return;
55
- }
56
- const templateRoot = path.resolve(templatesRoot, selected);
57
- console.log((0, colors_1.c)('cyan', '[template]') + ` Using template "${selected}" from src/templates/${selected}`);
58
- // Ask for owner
59
- const ownerResult = await p.text({
60
- message: 'Third-party owner',
61
- placeholder: 'google, github, slack',
62
- validate: (val) => {
63
- if (!val.trim())
64
- return 'Owner is required.';
65
- return undefined;
66
- },
67
- });
68
- if (p.isCancel(ownerResult)) {
69
- p.cancel('Cancelled.');
70
- process.exit(0);
71
- }
72
- const owner = sanitizeSlug(ownerResult);
73
- // Ask for service
74
- const serviceResult = await p.text({
75
- message: 'Third-party service',
76
- placeholder: 'gmail, slack-bot',
77
- validate: (val) => {
78
- if (!val.trim())
79
- return 'Service is required.';
80
- return undefined;
81
- },
82
- });
83
- if (p.isCancel(serviceResult)) {
84
- p.cancel('Cancelled.');
85
- process.exit(0);
86
- }
87
- const service = sanitizeSlug(serviceResult);
88
- // Auth type — select instead of free-text
89
- const authResult = await p.select({
90
- message: 'Default auth type',
91
- options: [
92
- { label: 'OAuth 2.0', value: 'oauth2' },
93
- { label: 'Bearer token', value: 'bearer' },
94
- { label: 'API key', value: 'apiKey' },
95
- ],
96
- initialValue: 'oauth2',
97
- });
98
- if (p.isCancel(authResult)) {
99
- p.cancel('Cancelled.');
100
- process.exit(0);
101
- }
102
- const authType = authResult;
103
- const ctx = { owner, service, authType };
104
- const cwd = process.cwd();
105
- const destRoot = path.resolve(cwd, 'integrations', owner, service);
106
- await (0, utils_1.ensureDir)(destRoot);
107
- console.log((0, colors_1.c)('gray', `[template] Scaffolding into ${path.relative(cwd, destRoot)}`));
108
- await copyTemplateTree(templateRoot, destRoot, ctx);
109
- console.log('');
110
- console.log((0, colors_1.c)('green', '✔ Template hydrated into: ') + path.relative(cwd, destRoot));
111
- console.log((0, colors_1.c)('gray', 'You can now edit or delete the generated example files and create your own tools.'));
112
- }
113
- /* -------------------------------------------------------------------------- */
114
- /* Helpers */
115
- /* -------------------------------------------------------------------------- */
116
- function sanitizeSlug(val) {
117
- return (val
118
- .trim()
119
- .toLowerCase()
120
- .replace(/[^a-z0-9-]/g, '-')
121
- .replace(/-+/g, '-')
122
- .replace(/^-|-$/g, '') || 'service');
123
- }
124
- // More permissive for template folder names (allow . _ -)
125
- function sanitizeTemplateName(val) {
126
- return (val
127
- .trim()
128
- .replace(/[^a-zA-Z0-9._-]/g, '-') // replace weird chars
129
- .replace(/-+/g, '-') // collapse multiple dashes
130
- .replace(/^-|-$/g, '') || 'template');
131
- }
132
- async function dirExists(p) {
133
- try {
134
- const st = await fs_1.fsp.stat(p);
135
- return st.isDirectory();
136
- }
137
- catch {
138
- return false;
139
- }
140
- }
141
- async function listAvailableTemplates(templatesRoot) {
142
- try {
143
- const entries = await fs_1.fsp.readdir(templatesRoot, { withFileTypes: true });
144
- return entries.filter((e) => e.isDirectory()).map((e) => e.name);
145
- }
146
- catch {
147
- return [];
148
- }
149
- }
150
- /**
151
- * Replace placeholders in both filenames and file contents.
152
- *
153
- * Supported placeholders:
154
- * __OWNER__
155
- * __SERVICE__
156
- * __AUTH_TYPE__
157
- */
158
- function applyPlaceholders(input, ctx) {
159
- return input
160
- .replaceAll('__OWNER__', ctx.owner)
161
- .replaceAll('__SERVICE__', ctx.service)
162
- .replaceAll('__AUTH_TYPE__', ctx.authType);
163
- }
164
- async function copyTemplateTree(templateRoot, destRoot, ctx) {
165
- const walk = async (srcDir) => {
166
- const entries = await fs_1.fsp.readdir(srcDir, { withFileTypes: true });
167
- for (const entry of entries) {
168
- const srcPath = path.join(srcDir, entry.name);
169
- const relFromRoot = path.relative(templateRoot, srcPath);
170
- // Apply placeholders in path segments too
171
- const relWithPlaceholders = applyPlaceholders(relFromRoot, ctx);
172
- const destPath = path.join(destRoot, relWithPlaceholders);
173
- if (entry.isDirectory()) {
174
- await (0, utils_1.ensureDir)(destPath);
175
- await walk(srcPath);
176
- }
177
- else if (entry.isFile()) {
178
- // Read template file, apply placeholders, write if not existing
179
- const content = await fs_1.fsp.readFile(srcPath, 'utf8');
180
- const processed = applyPlaceholders(content, ctx);
181
- if (await (0, utils_1.fileExists)(destPath)) {
182
- console.log((0, colors_1.c)('gray', `skip: ${path.relative(process.cwd(), destPath)} already exists`));
183
- continue;
184
- }
185
- await (0, utils_1.ensureDir)(path.dirname(destPath));
186
- await fs_1.fsp.writeFile(destPath, processed, 'utf8');
187
- console.log((0, colors_1.c)('green', `✓ created ${path.relative(process.cwd(), destPath)}`));
188
- }
189
- }
190
- };
191
- await walk(templateRoot);
192
- }
193
- //# sourceMappingURL=template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/commands/template.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport { c } from '../colors';\nimport { ensureDir, fileExists } from '@frontmcp/utils';\nimport { fsp } from '../utils/fs';\nimport { clack } from '../utils/prompts';\n\ntype AuthType = 'oauth2' | 'bearer' | 'apiKey';\n\ninterface TemplateContext {\n owner: string;\n service: string;\n authType: AuthType;\n}\n\n/**\n * frontmcp template <templateName>\n *\n * Example:\n * npx frontmcp template 3rd-party-integration\n *\n * This will look for templates in:\n * src/templates/<templateName> (built to dist/templates/<templateName>)\n * and copy them into:\n * integrations/<owner>/<service>\n * with __OWNER__, __SERVICE__, __AUTH_TYPE__ replaced.\n */\nexport async function runTemplate(templateName?: string): Promise<void> {\n const name = (templateName || '').trim();\n if (!name) {\n console.log(c('red', 'Template name is required (e.g. 3rd-party-integration).'));\n return;\n }\n\n const p = await clack();\n const templatesRoot = path.resolve(__dirname, '..', 'templates');\n\n // 1) Collect available templates up-front\n const available = await listAvailableTemplates(templatesRoot);\n if (!available.length) {\n console.log(c('red', `No templates found under ${path.relative(process.cwd(), templatesRoot)}.`));\n return;\n }\n\n // 2) Sanitize the name and choose the actual template folder\n const sanitized = sanitizeTemplateName(name);\n let selected: string | null = null;\n\n if (available.includes(name)) {\n selected = name;\n } else if (available.includes(sanitized)) {\n selected = sanitized;\n if (sanitized !== name) {\n console.log(c('yellow', `[template] Template \"${name}\" not found, using sanitized \"${sanitized}\"`));\n }\n }\n\n if (!selected) {\n console.log(c('red', `Template \"${name}\" not found under ${path.relative(process.cwd(), templatesRoot)}.`));\n console.log(c('gray', '\\nAvailable templates:'));\n for (const t of available) {\n console.log(' -', t);\n }\n return;\n }\n\n const templateRoot = path.resolve(templatesRoot, selected);\n\n console.log(c('cyan', '[template]') + ` Using template \"${selected}\" from src/templates/${selected}`);\n\n // Ask for owner\n const ownerResult = await p.text({\n message: 'Third-party owner',\n placeholder: 'google, github, slack',\n validate: (val) => {\n if (!val.trim()) return 'Owner is required.';\n return undefined;\n },\n });\n if (p.isCancel(ownerResult)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n const owner = sanitizeSlug(ownerResult);\n\n // Ask for service\n const serviceResult = await p.text({\n message: 'Third-party service',\n placeholder: 'gmail, slack-bot',\n validate: (val) => {\n if (!val.trim()) return 'Service is required.';\n return undefined;\n },\n });\n if (p.isCancel(serviceResult)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n const service = sanitizeSlug(serviceResult);\n\n // Auth type — select instead of free-text\n const authResult = await p.select({\n message: 'Default auth type',\n options: [\n { label: 'OAuth 2.0', value: 'oauth2' as AuthType },\n { label: 'Bearer token', value: 'bearer' as AuthType },\n { label: 'API key', value: 'apiKey' as AuthType },\n ],\n initialValue: 'oauth2' as AuthType,\n });\n if (p.isCancel(authResult)) {\n p.cancel('Cancelled.');\n process.exit(0);\n }\n const authType = authResult;\n\n const ctx: TemplateContext = { owner, service, authType };\n\n const cwd = process.cwd();\n const destRoot = path.resolve(cwd, 'integrations', owner, service);\n await ensureDir(destRoot);\n\n console.log(c('gray', `[template] Scaffolding into ${path.relative(cwd, destRoot)}`));\n\n await copyTemplateTree(templateRoot, destRoot, ctx);\n\n console.log('');\n console.log(c('green', '✔ Template hydrated into: ') + path.relative(cwd, destRoot));\n console.log(c('gray', 'You can now edit or delete the generated example files and create your own tools.'));\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction sanitizeSlug(val: string): string {\n return (\n val\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'service'\n );\n}\n\n// More permissive for template folder names (allow . _ -)\nfunction sanitizeTemplateName(val: string): string {\n return (\n val\n .trim()\n .replace(/[^a-zA-Z0-9._-]/g, '-') // replace weird chars\n .replace(/-+/g, '-') // collapse multiple dashes\n .replace(/^-|-$/g, '') || 'template'\n );\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const st = await fsp.stat(p);\n return st.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function listAvailableTemplates(templatesRoot: string): Promise<string[]> {\n try {\n const entries = await fsp.readdir(templatesRoot, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Replace placeholders in both filenames and file contents.\n *\n * Supported placeholders:\n * __OWNER__\n * __SERVICE__\n * __AUTH_TYPE__\n */\nfunction applyPlaceholders(input: string, ctx: TemplateContext): string {\n return input\n .replaceAll('__OWNER__', ctx.owner)\n .replaceAll('__SERVICE__', ctx.service)\n .replaceAll('__AUTH_TYPE__', ctx.authType);\n}\n\nasync function copyTemplateTree(templateRoot: string, destRoot: string, ctx: TemplateContext): Promise<void> {\n const walk = async (srcDir: string) => {\n const entries = await fsp.readdir(srcDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(srcDir, entry.name);\n const relFromRoot = path.relative(templateRoot, srcPath);\n\n // Apply placeholders in path segments too\n const relWithPlaceholders = applyPlaceholders(relFromRoot, ctx);\n const destPath = path.join(destRoot, relWithPlaceholders);\n\n if (entry.isDirectory()) {\n await ensureDir(destPath);\n await walk(srcPath);\n } else if (entry.isFile()) {\n // Read template file, apply placeholders, write if not existing\n const content = await fsp.readFile(srcPath, 'utf8');\n const processed = applyPlaceholders(content, ctx);\n\n if (await fileExists(destPath)) {\n console.log(c('gray', `skip: ${path.relative(process.cwd(), destPath)} already exists`));\n continue;\n }\n\n await ensureDir(path.dirname(destPath));\n await fsp.writeFile(destPath, processed, 'utf8');\n console.log(c('green', `✓ created ${path.relative(process.cwd(), destPath)}`));\n }\n }\n };\n\n await walk(templateRoot);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/commands/test.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 '../args';\nimport { c } from '../colors';\nimport { fileExists } from '@frontmcp/utils';\nimport { fsp } from '../utils/fs';\n\n/**\n * Generate Jest configuration programmatically for E2E tests.\n * This eliminates the need for projects to have their own jest.e2e.config.ts.\n */\nfunction generateJestConfig(cwd: string, opts: ParsedArgs): object {\n const testTimeout = opts.timeout ?? 60000;\n\n return {\n // Use Node.js environment for E2E tests\n testEnvironment: 'node',\n\n // Root directory for tests\n rootDir: cwd,\n\n // Test file patterns for E2E tests\n testMatch: ['<rootDir>/e2e/**/*.e2e.ts', '<rootDir>/e2e/**/*.e2e.test.ts', '<rootDir>/**/*.e2e.ts'],\n\n // Transform TypeScript files using @swc/jest for speed\n transform: {\n '^.+\\\\.[tj]s$': [\n '@swc/jest',\n {\n jsc: {\n target: 'es2022',\n parser: {\n syntax: 'typescript',\n decorators: true,\n dynamicImport: true,\n },\n transform: {\n decoratorMetadata: true,\n legacyDecorator: true,\n },\n keepClassNames: true,\n externalHelpers: true,\n loose: true,\n },\n module: {\n type: 'es6',\n },\n sourceMaps: true,\n swcrc: false,\n },\n ],\n },\n\n // File extensions to consider\n moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],\n\n // Test timeout\n testTimeout,\n\n // Setup files that run after Jest is initialized\n setupFilesAfterEnv: ['@frontmcp/testing/setup'],\n\n // Transform packages that use ESM\n transformIgnorePatterns: ['node_modules/(?!(jose)/)'],\n\n // Ignore patterns\n testPathIgnorePatterns: ['/node_modules/', '/dist/'],\n\n // Coverage settings\n collectCoverage: opts.coverage ?? false,\n\n // Coverage configuration when enabled\n ...(opts.coverage\n ? {\n coverageDirectory: '<rootDir>/coverage',\n coverageReporters: ['text', 'lcov', 'json'],\n collectCoverageFrom: ['<rootDir>/src/**/*.ts', '!<rootDir>/src/**/*.test.ts', '!<rootDir>/src/**/*.spec.ts'],\n }\n : {}),\n\n // Verbose output\n verbose: opts.verbose ?? true,\n };\n}\n\n/**\n * Run E2E tests using Jest with auto-injected configuration.\n *\n * Usage:\n * frontmcp test # Run E2E tests in current directory\n * frontmcp test --runInBand # Run tests sequentially (recommended for E2E)\n * frontmcp test --watch # Run tests in watch mode\n * frontmcp test --verbose # Show verbose output\n * frontmcp test --timeout 60000 # Set test timeout (default: 60000ms)\n */\nexport async function runTest(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n\n // Check for e2e directory\n const e2eDir = path.join(cwd, 'e2e');\n const hasE2EDir = await fileExists(e2eDir);\n\n if (!hasE2EDir) {\n console.error(c('red', 'No e2e directory found.'));\n console.error('');\n console.error('Expected structure:');\n console.error(' ./e2e/');\n console.error(' ├── your-test.e2e.ts');\n console.error(' └── another-test.e2e.test.ts');\n console.error('');\n console.error('Create an e2e directory with test files, then run:');\n console.error(' frontmcp test');\n process.exit(1);\n }\n\n // Generate Jest config and write to temp file\n const config = generateJestConfig(cwd, opts);\n const tempDir = os.tmpdir();\n const configPath = path.join(tempDir, `frontmcp-jest-config-${Date.now()}.json`);\n await fsp.writeFile(configPath, JSON.stringify(config, null, 2));\n\n // Build Jest arguments\n const jestArgs: string[] = ['jest', '--config', configPath];\n\n // Add --runInBand for sequential execution (recommended for E2E tests)\n if (opts.runInBand) {\n jestArgs.push('--runInBand');\n }\n\n // Add watch mode\n if (opts.watch) {\n jestArgs.push('--watch');\n }\n\n // Add verbose flag\n if (opts.verbose) {\n jestArgs.push('--verbose');\n }\n\n // Add coverage flag\n if (opts.coverage) {\n jestArgs.push('--coverage');\n }\n\n // Add any additional positional args (e.g., test file patterns)\n const testPatterns = opts._.slice(1); // Skip 'test' command itself\n if (testPatterns.length > 0) {\n jestArgs.push(...testPatterns);\n }\n\n console.log(`${c('cyan', '[test]')} running E2E tests in ${path.relative(process.cwd(), cwd) || '.'}`);\n console.log(`${c('gray', '[test]')} using auto-injected Jest configuration`);\n\n if (opts.runInBand) {\n console.log(`${c('gray', '[test]')} running tests sequentially (--runInBand)`);\n }\n\n if (opts.watch) {\n console.log(`${c('gray', '[test]')} watch mode enabled`);\n }\n\n if (opts.coverage) {\n console.log(`${c('gray', '[test]')} coverage collection enabled`);\n }\n\n console.log(`${c('gray', 'hint:')} press Ctrl+C to stop\\n`);\n\n // Run Jest directly via node_modules/.bin or npx without shell\n // Using shell: false with explicit args array avoids escaping issues\n const jest = spawn('npx', jestArgs, {\n stdio: 'inherit',\n shell: false,\n cwd,\n });\n\n // Handle cleanup\n const cleanup = async (proc?: ChildProcess) => {\n try {\n if (proc) {\n proc.kill('SIGINT');\n }\n } catch {\n // ignore\n }\n // Clean up temp config file\n try {\n await fsp.unlink(configPath);\n } catch {\n // ignore\n }\n };\n\n process.on('SIGINT', () => {\n cleanup(jest).finally(() => {\n process.exit(0);\n });\n });\n\n // Wait for Jest to complete\n try {\n await new Promise<void>((resolve, reject) => {\n jest.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Jest exited with code ${code}`));\n }\n });\n jest.on('error', (err) => {\n reject(err);\n });\n });\n } finally {\n // Clean up temp config file\n try {\n await fsp.unlink(configPath);\n } catch {\n // ignore\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/uninstall.ts"],"names":[],"mappings":";;AAMA,oCAkCC;;AAxCD,+CAAyB;AAEzB,sCAA8B;AAC9B,8BAAuC;AACvC,iDAAqE;AAE9D,KAAK,UAAU,YAAY,CAAC,IAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,qBAAqB,CAAC,CAAC;IACrD,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,GAAG,IAAI,mBAAc,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC,2BAA2B,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,iDAAiD;QACjD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC,YAAY,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,uBAAuB;IACvB,IAAA,wBAAa,EAAC,IAAI,CAAC,CAAC;IAEpB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import * as fs from 'fs';\nimport { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { ProcessManager } from '../pm';\nimport { getRegisteredApp, unregisterApp } from './install/registry';\n\nexport async function runUninstall(opts: ParsedArgs): Promise<void> {\n const name = opts._[1];\n if (!name) {\n throw new Error('Missing app name. Usage: frontmcp uninstall <name>');\n }\n\n const app = getRegisteredApp(name);\n if (!app) {\n throw new Error(`App \"${name}\" is not installed.`);\n }\n\n // Stop the process if running\n const pm = new ProcessManager();\n try {\n await pm.stop(name);\n console.log(`${c('cyan', '[uninstall]')} stopped running process.`);\n } catch (err: unknown) {\n // Only ignore \"not found\" / \"not running\" errors\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('No process found') && !msg.includes('is not running')) {\n throw err;\n }\n }\n\n // Remove app directory\n if (fs.existsSync(app.installDir)) {\n fs.rmSync(app.installDir, { recursive: true, force: true });\n console.log(`${c('cyan', '[uninstall]')} removed ${app.installDir}`);\n }\n\n // Remove from registry\n unregisterApp(name);\n\n console.log(`${c('green', `Uninstalled \"${name}\".`)}`);\n}\n"]}
package/src/pm/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export { ProcessManager } from './pm.manager';
2
- export { Supervisor } from './pm.spawn';
3
- export { checkHealth } from './pm.health';
4
- export { installService, uninstallService, detectPlatform, getServicePath } from './pm.service';
5
- export { formatProcessTable, formatProcessDetail, formatUptime } from './pm.format';
6
- export { tailLog, followLog, createLogStreams } from './pm.logs';
7
- export { writePidFile, readPidFile, removePidFile, isProcessAlive, listPidFiles } from './pm.pidfile';
8
- export { PM_DIRS, pidFilePath, logFilePath, socketFilePath, appDir, ensurePmDirs } from './pm.paths';
9
- export type { PidFileData, StartOptions, StopOptions, ProcessInfo, LogsOptions, ServicePlatform } from './pm.types';
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pm/index.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AACvB,uCAAwC;AAA/B,sGAAA,UAAU,OAAA;AACnB,yCAA0C;AAAjC,wGAAA,WAAW,OAAA;AACpB,2CAAgG;AAAvF,4GAAA,cAAc,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,4GAAA,cAAc,OAAA;AACzE,yCAAoF;AAA3E,+GAAA,kBAAkB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,yGAAA,YAAY,OAAA;AAC9D,qCAAiE;AAAxD,kGAAA,OAAO,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC7C,2CAAsG;AAA7F,0GAAA,YAAY,OAAA;AAAE,yGAAA,WAAW,OAAA;AAAE,2GAAA,aAAa,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,0GAAA,YAAY,OAAA;AAC/E,uCAAqG;AAA5F,mGAAA,OAAO,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,kGAAA,MAAM,OAAA;AAAE,wGAAA,YAAY,OAAA","sourcesContent":["export { ProcessManager } from './pm.manager';\nexport { Supervisor } from './pm.spawn';\nexport { checkHealth } from './pm.health';\nexport { installService, uninstallService, detectPlatform, getServicePath } from './pm.service';\nexport { formatProcessTable, formatProcessDetail, formatUptime } from './pm.format';\nexport { tailLog, followLog, createLogStreams } from './pm.logs';\nexport { writePidFile, readPidFile, removePidFile, isProcessAlive, listPidFiles } from './pm.pidfile';\nexport { PM_DIRS, pidFilePath, logFilePath, socketFilePath, appDir, ensurePmDirs } from './pm.paths';\nexport type { PidFileData, StartOptions, StopOptions, ProcessInfo, LogsOptions, ServicePlatform } from './pm.types';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.format.js","sourceRoot":"","sources":["../../../src/pm/pm.format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Table formatting for process status / list output.\n */\n\nimport { ProcessInfo } from './pm.types';\nimport { c } from '../colors';\n\nexport function formatProcessTable(processes: ProcessInfo[]): string {\n if (processes.length === 0) {\n return c('gray', 'No managed processes found.');\n }\n\n const headers = ['Name', 'PID', 'Status', 'Port', 'Uptime', 'Restarts'];\n const rows: string[][] = processes.map((p) => [\n p.name,\n String(p.pid),\n formatStatus(p.status),\n p.port ? String(p.port) : p.socketPath ? 'socket' : '-',\n p.status === 'running' ? p.uptime : '-',\n String(p.restartCount),\n ]);\n\n return formatTable(headers, rows);\n}\n\nfunction formatStatus(status: string): string {\n switch (status) {\n case 'running':\n return c('green', 'running');\n case 'stopped':\n return c('yellow', 'stopped');\n case 'dead':\n return c('red', 'dead');\n default:\n return c('gray', status);\n }\n}\n\nexport function formatUptime(startedAt: string): string {\n const start = new Date(startedAt).getTime();\n const now = Date.now();\n const diff = now - start;\n\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return `${seconds}s`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ${seconds % 60}s`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ${minutes % 60}m`;\n\n const days = Math.floor(hours / 24);\n return `${days}d ${hours % 24}h`;\n}\n\nfunction formatTable(headers: string[], rows: string[][]): string {\n // Calculate column widths\n const widths = headers.map((h, i) => {\n const maxRow = rows.reduce((max, row) => {\n const len = stripAnsi(row[i]).length;\n return len > max ? len : max;\n }, 0);\n return Math.max(stripAnsi(h).length, maxRow);\n });\n\n const separator = widths.map((w) => '─'.repeat(w + 2)).join('┼');\n const headerLine = headers.map((h, i) => ` ${c('bold', padRight(h, widths[i]))} `).join('│');\n\n const bodyLines = rows.map((row) => row.map((cell, i) => ` ${padRight(cell, widths[i])} `).join('│'));\n\n return [headerLine, separator, ...bodyLines].join('\\n');\n}\n\nfunction padRight(str: string, width: number): string {\n const visibleLen = stripAnsi(str).length;\n const padding = Math.max(0, width - visibleLen);\n return str + ' '.repeat(padding);\n}\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_REGEX = new RegExp('\\\\x1b\\\\[[0-9;]*m', 'g');\n\nfunction stripAnsi(str: string): string {\n return str.replace(ANSI_REGEX, '');\n}\n\nexport function formatProcessDetail(p: ProcessInfo): string {\n const lines = [\n `${c('bold', 'Name:')} ${p.name}`,\n `${c('bold', 'PID:')} ${p.pid}`,\n `${c('bold', 'Supervisor:')} ${p.supervisorPid}`,\n `${c('bold', 'Status:')} ${formatStatus(p.status)}`,\n `${c('bold', 'Entry:')} ${p.entry}`,\n ];\n\n if (p.port) lines.push(`${c('bold', 'Port:')} ${p.port}`);\n if (p.socketPath) lines.push(`${c('bold', 'Socket:')} ${p.socketPath}`);\n if (p.dbPath) lines.push(`${c('bold', 'Database:')} ${p.dbPath}`);\n\n lines.push(`${c('bold', 'Started:')} ${p.startedAt}`);\n lines.push(`${c('bold', 'Uptime:')} ${p.status === 'running' ? p.uptime : '-'}`);\n lines.push(`${c('bold', 'Restarts:')} ${p.restartCount}`);\n lines.push(`${c('bold', 'CLI Version:')} ${p.cliVersion}`);\n\n return lines.join('\\n');\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.health.js","sourceRoot":"","sources":["../../../src/pm/pm.health.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAWH,kCA0DC;;AAnED,mDAA6B;AAS7B,SAAgB,WAAW,CAAC,IAI3B;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAwB;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,SAAS;YACf,OAAO;SACR,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC;YACnC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAChC,KAAK,EAAE,iCAAiC;aACzC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACxC,OAAO,CAAC;gBACN,OAAO,EAAE,GAAG,CAAC,UAAU,KAAK,GAAG;gBAC/B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,YAAY;aACb,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,qBAAqB;QACrC,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAChC,KAAK,EAAE,GAAG,CAAC,OAAO;aACnB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAChC,KAAK,EAAE,wBAAwB;aAChC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * HTTP health checks against running MCP servers.\n * Supports both TCP (port) and Unix socket connections.\n */\n\nimport * as http from 'http';\n\nexport interface HealthCheckResult {\n healthy: boolean;\n statusCode?: number;\n responseTime: number;\n error?: string;\n}\n\nexport function checkHealth(opts: {\n port?: number;\n socketPath?: string;\n timeout?: number;\n}): Promise<HealthCheckResult> {\n const timeout = opts.timeout ?? 5000;\n const start = Date.now();\n\n return new Promise((resolve) => {\n const requestOpts: http.RequestOptions = {\n method: 'GET',\n path: '/health',\n timeout,\n };\n\n if (opts.socketPath) {\n requestOpts.socketPath = opts.socketPath;\n } else if (opts.port) {\n requestOpts.hostname = '127.0.0.1';\n requestOpts.port = opts.port;\n } else {\n resolve({\n healthy: false,\n responseTime: Date.now() - start,\n error: 'No port or socket path provided',\n });\n return;\n }\n\n const req = http.request(requestOpts, (res) => {\n const responseTime = Date.now() - start;\n resolve({\n healthy: res.statusCode === 200,\n statusCode: res.statusCode,\n responseTime,\n });\n res.resume(); // drain the response\n });\n\n req.on('error', (err) => {\n resolve({\n healthy: false,\n responseTime: Date.now() - start,\n error: err.message,\n });\n });\n\n req.on('timeout', () => {\n req.destroy();\n resolve({\n healthy: false,\n responseTime: Date.now() - start,\n error: 'Health check timed out',\n });\n });\n\n req.end();\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.logs.js","sourceRoot":"","sources":["../../../src/pm/pm.logs.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,4CAeC;AA4BD,0BAOC;AAED,8BAuCC;AAED,oCAQC;;AA5GD,+CAAyB;AACzB,mDAA6B;AAC7B,yCAAkF;AAElF,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC/C,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,SAAgB,gBAAgB,CAAC,IAAY;IAI3C,IAAA,uBAAY,GAAE,CAAC;IACf,MAAM,OAAO,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC;IAEvC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO;QACrC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,GAAG,YAAY;YAAE,OAAO;QAErC,+BAA+B;QAC/B,KAAK,IAAI,CAAC,GAAG,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,iBAAiB,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY,EAAE,KAAa;IACjD,MAAM,QAAQ,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,MAA8B;IACpE,MAAM,QAAQ,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;IACnC,IAAA,uBAAY,GAAE,CAAC;IAEf,sCAAsC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAE1C,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC1B,gCAAgC;gBAChC,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;gBAClD,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpD,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;gBAErB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,kBAAO,CAAC,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,OAAO,EAAE;SACN,WAAW,CAAC,OAAO,CAAC;SACpB,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC","sourcesContent":["/**\n * Log stream creation, rotation, tail, and follow utilities.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { logFilePath, errorLogFilePath, ensurePmDirs, PM_DIRS } from './pm.paths';\n\nconst MAX_LOG_SIZE = 10 * 1024 * 1024; // 10 MB\nconst MAX_ROTATED_FILES = 5;\n\nexport function createLogStreams(name: string): {\n stdout: fs.WriteStream;\n stderr: fs.WriteStream;\n} {\n ensurePmDirs();\n const outPath = logFilePath(name);\n const errPath = errorLogFilePath(name);\n\n rotateIfNeeded(outPath);\n rotateIfNeeded(errPath);\n\n return {\n stdout: fs.createWriteStream(outPath, { flags: 'a' }),\n stderr: fs.createWriteStream(errPath, { flags: 'a' }),\n };\n}\n\nfunction rotateIfNeeded(filePath: string): void {\n try {\n if (!fs.existsSync(filePath)) return;\n const stat = fs.statSync(filePath);\n if (stat.size < MAX_LOG_SIZE) return;\n\n // Shift existing rotated files\n for (let i = MAX_ROTATED_FILES; i >= 1; i--) {\n const from = `${filePath}.${i}`;\n const to = `${filePath}.${i + 1}`;\n if (fs.existsSync(from)) {\n if (i === MAX_ROTATED_FILES) {\n fs.unlinkSync(from);\n } else {\n fs.renameSync(from, to);\n }\n }\n }\n\n // Rotate current file\n fs.renameSync(filePath, `${filePath}.1`);\n } catch {\n // ignore rotation errors\n }\n}\n\nexport function tailLog(name: string, lines: number): string[] {\n const filePath = logFilePath(name);\n if (!fs.existsSync(filePath)) return [];\n\n const content = fs.readFileSync(filePath, 'utf-8');\n const allLines = content.split('\\n');\n return allLines.slice(-lines).filter((l) => l.length > 0);\n}\n\nexport function followLog(name: string, onLine: (line: string) => void): () => void {\n const filePath = logFilePath(name);\n ensurePmDirs();\n\n // Create the file if it doesn't exist\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, '', 'utf-8');\n }\n\n let position = fs.statSync(filePath).size;\n\n fs.watchFile(filePath, { interval: 300 }, () => {\n try {\n const stat = fs.statSync(filePath);\n if (stat.size <= position) {\n // File was truncated or rotated\n position = 0;\n }\n if (stat.size > position) {\n const fd = fs.openSync(filePath, 'r');\n const buffer = Buffer.alloc(stat.size - position);\n fs.readSync(fd, buffer, 0, buffer.length, position);\n fs.closeSync(fd);\n position = stat.size;\n\n const chunk = buffer.toString('utf-8');\n const lines = chunk.split('\\n');\n for (const line of lines) {\n if (line.length > 0) onLine(line);\n }\n }\n } catch {\n // ignore read errors\n }\n });\n\n return () => {\n fs.unwatchFile(filePath);\n };\n}\n\nexport function listLogFiles(name: string): string[] {\n const logsDir = PM_DIRS.logs;\n if (!fs.existsSync(logsDir)) return [];\n\n return fs\n .readdirSync(logsDir)\n .filter((f: string) => f.startsWith(name))\n .map((f: string) => path.join(logsDir, f));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.manager.js","sourceRoot":"","sources":["../../../src/pm/pm.manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ProcessManager class — orchestrates all PM modules.\n */\n\nimport { readPidFile, isProcessAlive, listPidFiles, removePidFile } from './pm.pidfile';\nimport { formatUptime } from './pm.format';\nimport { Supervisor } from './pm.spawn';\nimport { StartOptions, StopOptions, ProcessInfo } from './pm.types';\n\n// Track running supervisors in this process\nconst supervisors = new Map<string, Supervisor>();\n\nexport class ProcessManager {\n async start(opts: StartOptions): Promise<ProcessInfo> {\n // Check if already running\n const existing = readPidFile(opts.name);\n if (existing && isProcessAlive(existing.pid)) {\n throw new Error(\n `Process \"${opts.name}\" is already running (PID: ${existing.pid}). Stop it first with: frontmcp stop ${opts.name}`,\n );\n }\n\n // Clean up stale PID file\n if (existing) {\n removePidFile(opts.name);\n }\n\n const supervisor = new Supervisor(opts);\n await supervisor.start();\n supervisors.set(opts.name, supervisor);\n\n // Wait briefly for child to spawn\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n const info = this.getProcessInfo(opts.name);\n if (!info) {\n throw new Error(`Failed to start process \"${opts.name}\"`);\n }\n return info;\n }\n\n async stop(name: string, opts: StopOptions = {}): Promise<void> {\n const supervisor = supervisors.get(name);\n if (supervisor) {\n await supervisor.stop(opts.force);\n supervisors.delete(name);\n return;\n }\n\n // No local supervisor — try to kill by PID file\n const pidData = readPidFile(name);\n if (!pidData) {\n throw new Error(`No process found with name \"${name}\"`);\n }\n\n if (!isProcessAlive(pidData.pid)) {\n removePidFile(name);\n throw new Error(`Process \"${name}\" is not running (stale PID file removed)`);\n }\n\n // Try graceful shutdown via supervisor PID first, then process PID\n const targetPid = pidData.supervisorPid || pidData.pid;\n\n if (opts.force) {\n try {\n process.kill(targetPid, 'SIGKILL');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err;\n }\n } else {\n try {\n process.kill(targetPid, 'SIGTERM');\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err;\n }\n\n // Wait for process to exit\n const timeout = opts.timeout ?? 10000;\n const start = Date.now();\n while (Date.now() - start < timeout) {\n if (!isProcessAlive(pidData.pid)) break;\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n\n // Force kill if still alive\n if (isProcessAlive(pidData.pid)) {\n try {\n process.kill(pidData.pid, 'SIGKILL');\n } catch {\n // ignore\n }\n }\n }\n\n removePidFile(name);\n }\n\n async restart(name: string): Promise<ProcessInfo> {\n const pidData = readPidFile(name);\n if (!pidData) {\n throw new Error(`No process found with name \"${name}\". Cannot restart.`);\n }\n\n // Stop existing\n try {\n await this.stop(name);\n } catch {\n // May already be stopped\n }\n\n // Restart with same config\n return this.start({\n name: pidData.name,\n entry: pidData.entry,\n port: pidData.port,\n socketPath: pidData.socketPath,\n dbPath: pidData.dbPath,\n socket: !!pidData.socketPath,\n });\n }\n\n getProcessInfo(name: string): ProcessInfo | null {\n const pidData = readPidFile(name);\n if (!pidData) return null;\n\n const alive = isProcessAlive(pidData.pid);\n\n return {\n name: pidData.name,\n pid: pidData.pid,\n supervisorPid: pidData.supervisorPid,\n status: alive ? 'running' : 'dead',\n entry: pidData.entry,\n port: pidData.port,\n socketPath: pidData.socketPath,\n dbPath: pidData.dbPath,\n startedAt: pidData.startedAt,\n restartCount: pidData.restartCount,\n uptime: alive ? formatUptime(pidData.startedAt) : '-',\n cliVersion: pidData.cliVersion,\n };\n }\n\n listAll(): ProcessInfo[] {\n const pidFiles = listPidFiles();\n return pidFiles.map((data) => {\n const alive = isProcessAlive(data.pid);\n return {\n name: data.name,\n pid: data.pid,\n supervisorPid: data.supervisorPid,\n status: alive ? 'running' : ('dead' as const),\n entry: data.entry,\n port: data.port,\n socketPath: data.socketPath,\n dbPath: data.dbPath,\n startedAt: data.startedAt,\n restartCount: data.restartCount,\n uptime: alive ? formatUptime(data.startedAt) : '-',\n cliVersion: data.cliVersion,\n };\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.paths.js","sourceRoot":"","sources":["../../../src/pm/pm.paths.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBH,kCAEC;AAED,kCAEC;AAED,4CAEC;AAED,wCAEC;AAED,wBAEC;AAED,oCAEC;AAED,oCAMC;;AA9CD,+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;CAC9B,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} 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 +0,0 @@
1
- {"version":3,"file":"pm.pidfile.js","sourceRoot":"","sources":["../../../src/pm/pm.pidfile.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,oCAKC;AAED,kCASC;AAED,sCASC;AAED,wCAOC;AAED,oCAeC;;AAzDD,+CAAyB;AACzB,yCAAgE;AAGhE,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAiB;IAC1D,IAAA,uBAAY,GAAE,CAAC;IACf,MAAM,QAAQ,GAAG,IAAA,sBAAW,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,sBAAW,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,sBAAW,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,uBAAY,GAAE,CAAC;IACf,MAAM,OAAO,GAAG,kBAAO,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 './pm.paths';\nimport { PidFileData } from './pm.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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pm.service.js","sourceRoot":"","sources":["../../../src/pm/pm.service.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 './pm.types';\nimport { readPidFile } from './pm.pidfile';\nimport { ensurePmDirs } from './pm.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 +0,0 @@
1
- {"version":3,"file":"pm.spawn.js","sourceRoot":"","sources":["../../../src/pm/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 './pm.types';\nimport { socketFilePath } from './pm.paths';\nimport { createLogStreams } from './pm.logs';\nimport { writePidFile, removePidFile } from './pm.pidfile';\nimport { checkHealth } from './pm.health';\nimport { getSelfVersion } from '../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 +0,0 @@
1
- {"version":3,"file":"pm.types.js","sourceRoot":"","sources":["../../../src/pm/pm.types.ts"],"names":[],"mappings":";AAAA;;GAEG","sourcesContent":["/**\n * Process Manager types for FrontMCP CLI.\n */\n\nexport interface PidFileData {\n pid: number;\n name: string;\n entry: string;\n port?: number;\n socketPath?: string;\n dbPath?: string;\n startedAt: string; // ISO 8601\n restartCount: number;\n supervisorPid: number;\n cliVersion: string;\n}\n\nexport interface StartOptions {\n name: string;\n entry: string;\n port?: number;\n socket?: boolean;\n socketPath?: string;\n dbPath?: string;\n maxRestarts?: number;\n env?: Record<string, string>;\n}\n\nexport interface ProcessInfo {\n name: string;\n pid: number;\n supervisorPid: number;\n status: 'running' | 'stopped' | 'dead';\n entry: string;\n port?: number;\n socketPath?: string;\n dbPath?: string;\n startedAt: string;\n restartCount: number;\n uptime: string;\n cliVersion: string;\n}\n\nexport interface StopOptions {\n force?: boolean;\n timeout?: number;\n}\n\nexport interface LogsOptions {\n follow?: boolean;\n lines?: number;\n}\n\nexport type ServicePlatform = 'launchd' | 'systemd';\n"]}
@@ -1,20 +0,0 @@
1
- import { ExecuteContext } from "./mcp-http-types";
2
- export interface HttpRequestOptions {
3
- method: string;
4
- path: string;
5
- query?: Record<string, string | number | boolean | undefined>;
6
- headers?: Record<string, string>;
7
- bodyJson?: unknown;
8
- }
9
- export interface HttpResponseRaw {
10
- status: number;
11
- headers: Record<string, string>;
12
- json?: any;
13
- text?: string;
14
- }
15
- export declare class HttpClient {
16
- private ctx;
17
- constructor(ctx: ExecuteContext);
18
- private resolveAuthHeader;
19
- request(options: HttpRequestOptions): Promise<HttpResponseRaw>;
20
- }