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.
- package/README.md +1 -1
- package/package.json +6 -5
- package/src/commands/build/bundler.js +1 -1
- package/src/commands/build/bundler.js.map +1 -1
- package/src/commands/build/exec/cli-runtime/cli-bundler.d.ts +17 -0
- package/src/commands/build/exec/cli-runtime/cli-bundler.js +75 -0
- package/src/commands/build/exec/cli-runtime/cli-bundler.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/credential-store.d.ts +22 -0
- package/src/commands/build/exec/cli-runtime/credential-store.js +140 -0
- package/src/commands/build/exec/cli-runtime/credential-store.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.d.ts +16 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.js +169 -0
- package/src/commands/build/exec/cli-runtime/daemon-client.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.d.ts +37 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.js +1287 -0
- package/src/commands/build/exec/cli-runtime/generate-cli-entry.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/index.d.ts +9 -0
- package/src/commands/build/exec/cli-runtime/index.js +32 -0
- package/src/commands/build/exec/cli-runtime/index.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.d.ts +9 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.js +224 -0
- package/src/commands/build/exec/cli-runtime/oauth-helper.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.d.ts +46 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.js +168 -0
- package/src/commands/build/exec/cli-runtime/output-formatter.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.d.ts +57 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.js +129 -0
- package/src/commands/build/exec/cli-runtime/schema-extractor.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.d.ts +38 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.js +172 -0
- package/src/commands/build/exec/cli-runtime/schema-to-commander.js.map +1 -0
- package/src/commands/build/exec/cli-runtime/session-manager.d.ts +16 -0
- package/src/commands/build/exec/cli-runtime/session-manager.js +122 -0
- package/src/commands/build/exec/cli-runtime/session-manager.js.map +1 -0
- package/src/commands/build/exec/config.d.ts +25 -0
- package/src/commands/build/exec/config.js +0 -1
- package/src/commands/build/exec/config.js.map +1 -1
- package/src/commands/build/exec/esbuild-bundler.d.ts +4 -1
- package/src/commands/build/exec/esbuild-bundler.js +28 -9
- package/src/commands/build/exec/esbuild-bundler.js.map +1 -1
- package/src/commands/build/exec/index.d.ts +7 -2
- package/src/commands/build/exec/index.js +159 -9
- package/src/commands/build/exec/index.js.map +1 -1
- package/src/commands/build/exec/manifest.d.ts +14 -0
- package/src/commands/build/exec/manifest.js.map +1 -1
- package/src/commands/build/exec/runner-script.d.ts +1 -1
- package/src/commands/build/exec/runner-script.js +48 -5
- package/src/commands/build/exec/runner-script.js.map +1 -1
- package/src/commands/build/exec/sea-builder.d.ts +18 -0
- package/src/commands/build/exec/sea-builder.js +81 -0
- package/src/commands/build/exec/sea-builder.js.map +1 -0
- package/src/commands/build/exec/setup.js +0 -2
- package/src/commands/build/exec/setup.js.map +1 -1
- package/src/commands/build/index.d.ts +1 -1
- package/src/commands/build/index.js +3 -3
- package/src/commands/build/index.js.map +1 -1
- package/src/commands/build/register.d.ts +2 -0
- package/src/commands/build/register.js +21 -0
- package/src/commands/build/register.js.map +1 -0
- package/src/commands/{dev.d.ts → dev/dev.d.ts} +1 -1
- package/src/commands/{dev.js → dev/dev.js} +3 -3
- package/src/commands/dev/dev.js.map +1 -0
- package/src/commands/{doctor.js → dev/doctor.js} +5 -4
- package/src/commands/dev/doctor.js.map +1 -0
- package/src/commands/{inspector.js → dev/inspector.js} +1 -1
- package/src/commands/dev/inspector.js.map +1 -0
- package/src/commands/dev/register.d.ts +2 -0
- package/src/commands/dev/register.js +49 -0
- package/src/commands/dev/register.js.map +1 -0
- package/src/commands/{test.d.ts → dev/test.d.ts} +1 -1
- package/src/commands/{test.js → dev/test.js} +5 -5
- package/src/commands/dev/test.js.map +1 -0
- package/src/commands/{configure.d.ts → package/configure.d.ts} +1 -1
- package/src/commands/{configure.js → package/configure.js} +3 -3
- package/src/commands/package/configure.js.map +1 -0
- package/src/commands/package/esm-update.d.ts +19 -0
- package/src/commands/package/esm-update.js +93 -0
- package/src/commands/package/esm-update.js.map +1 -0
- package/src/commands/{install/index.d.ts → package/install.d.ts} +1 -1
- package/src/commands/{install/index.js → package/install.js} +8 -5
- package/src/commands/package/install.js.map +1 -0
- package/src/commands/{install → package}/questionnaire.js +2 -2
- package/src/commands/{install → package}/questionnaire.js.map +1 -1
- package/src/commands/package/register.d.ts +2 -0
- package/src/commands/package/register.js +35 -0
- package/src/commands/package/register.js.map +1 -0
- package/src/commands/{install → package}/registry.js +8 -6
- package/src/commands/package/registry.js.map +1 -0
- package/src/commands/{install → package}/sources/git.js +8 -1
- package/src/commands/package/sources/git.js.map +1 -0
- package/src/commands/{install → package}/sources/local.js.map +1 -1
- package/src/commands/{install → package}/sources/npm.js.map +1 -1
- package/src/commands/{install → package}/types.d.ts +7 -1
- package/src/commands/{install → package}/types.js +4 -0
- package/src/commands/package/types.js.map +1 -0
- package/src/commands/{uninstall.d.ts → package/uninstall.d.ts} +1 -1
- package/src/commands/{uninstall.js → package/uninstall.js} +2 -2
- package/src/commands/package/uninstall.js.map +1 -0
- package/src/{pm/pm.format.d.ts → commands/pm/format.d.ts} +1 -1
- package/src/{pm/pm.format.js → commands/pm/format.js} +2 -2
- package/src/commands/pm/format.js.map +1 -0
- package/src/{pm/pm.health.js → commands/pm/health.js} +1 -1
- package/src/commands/pm/health.js.map +1 -0
- package/src/commands/pm/index.d.ts +9 -0
- package/src/{pm → commands/pm}/index.js +32 -32
- package/src/commands/pm/index.js.map +1 -0
- package/src/commands/{list.d.ts → pm/list.d.ts} +1 -1
- package/src/commands/{list.js → pm/list.js} +3 -3
- package/src/commands/pm/list.js.map +1 -0
- package/src/{pm/pm.logs.js → commands/pm/log-utils.js} +9 -9
- package/src/commands/pm/log-utils.js.map +1 -0
- package/src/commands/{logs.d.ts → pm/logs.d.ts} +1 -1
- package/src/commands/{logs.js → pm/logs.js} +6 -6
- package/src/commands/pm/logs.js.map +1 -0
- package/src/{pm/pm.manager.d.ts → commands/pm/manager.d.ts} +1 -1
- package/src/{pm/pm.manager.js → commands/pm/manager.js} +21 -21
- package/src/commands/pm/manager.js.map +1 -0
- package/src/{pm/pm.paths.d.ts → commands/pm/paths.d.ts} +1 -0
- package/src/{pm/pm.paths.js → commands/pm/paths.js} +2 -1
- package/src/commands/pm/paths.js.map +1 -0
- package/src/{pm/pm.pidfile.d.ts → commands/pm/pidfile.d.ts} +1 -1
- package/src/{pm/pm.pidfile.js → commands/pm/pidfile.js} +8 -8
- package/src/commands/pm/pidfile.js.map +1 -0
- package/src/commands/pm/register.d.ts +2 -0
- package/src/commands/pm/register.js +83 -0
- package/src/commands/pm/register.js.map +1 -0
- package/src/commands/{restart.d.ts → pm/restart.d.ts} +1 -1
- package/src/commands/{restart.js → pm/restart.js} +4 -4
- package/src/commands/pm/restart.js.map +1 -0
- package/src/{pm/pm.service.d.ts → commands/pm/service-gen.d.ts} +1 -1
- package/src/{pm/pm.service.js → commands/pm/service-gen.js} +5 -5
- package/src/commands/pm/service-gen.js.map +1 -0
- package/src/commands/{service.d.ts → pm/service.d.ts} +1 -1
- package/src/commands/{service.js → pm/service.js} +6 -6
- package/src/commands/pm/service.js.map +1 -0
- package/src/commands/{socket.d.ts → pm/socket.d.ts} +1 -1
- package/src/commands/{socket.js → pm/socket.js} +3 -3
- package/src/commands/pm/socket.js.map +1 -0
- package/src/{pm/pm.spawn.d.ts → commands/pm/spawn.d.ts} +1 -1
- package/src/{pm/pm.spawn.js → commands/pm/spawn.js} +15 -15
- package/src/commands/pm/spawn.js.map +1 -0
- package/src/commands/{start.d.ts → pm/start.d.ts} +1 -1
- package/src/commands/{start.js → pm/start.js} +6 -6
- package/src/commands/pm/start.js.map +1 -0
- package/src/commands/{status.d.ts → pm/status.d.ts} +1 -1
- package/src/commands/{status.js → pm/status.js} +5 -5
- package/src/commands/pm/status.js.map +1 -0
- package/src/commands/{stop.d.ts → pm/stop.d.ts} +1 -1
- package/src/commands/{stop.js → pm/stop.js} +3 -3
- package/src/commands/pm/stop.js.map +1 -0
- package/src/{pm/pm.types.js → commands/pm/types.js} +1 -1
- package/src/commands/pm/types.js.map +1 -0
- package/src/commands/{create.js → scaffold/create.js} +91 -20
- package/src/commands/scaffold/create.js.map +1 -0
- package/src/commands/scaffold/register.d.ts +2 -0
- package/src/commands/scaffold/register.js +28 -0
- package/src/commands/scaffold/register.js.map +1 -0
- package/src/{args.d.ts → core/args.d.ts} +7 -1
- package/src/{args.js → core/args.js} +8 -0
- package/src/core/args.js.map +1 -0
- package/src/core/bridge.d.ts +9 -0
- package/src/core/bridge.js +75 -0
- package/src/core/bridge.js.map +1 -0
- package/src/core/cli.d.ts +8 -0
- package/src/core/cli.js +23 -0
- package/src/core/cli.js.map +1 -0
- package/src/core/colors.js.map +1 -0
- package/src/core/help.d.ts +7 -0
- package/src/core/help.js +83 -0
- package/src/core/help.js.map +1 -0
- package/src/core/index.d.ts +7 -0
- package/src/core/index.js +22 -0
- package/src/core/index.js.map +1 -0
- package/src/core/program.d.ts +2 -0
- package/src/core/program.js +23 -0
- package/src/core/program.js.map +1 -0
- package/src/core/tsconfig.js.map +1 -0
- package/src/{version.js → core/version.js} +1 -1
- package/src/core/version.js.map +1 -0
- package/src/index.d.ts +1 -1
- package/src/index.js +2 -5
- package/src/index.js.map +1 -1
- package/src/{utils → shared}/env.js +2 -2
- package/src/shared/env.js.map +1 -0
- package/src/{utils → shared}/fs.js +2 -2
- package/src/shared/fs.js.map +1 -0
- package/src/shared/index.d.ts +3 -0
- package/src/shared/index.js +14 -0
- package/src/shared/index.js.map +1 -0
- package/src/shared/prompts.js.map +1 -0
- package/src/args.js.map +0 -1
- package/src/cli.d.ts +0 -5
- package/src/cli.js +0 -241
- package/src/cli.js.map +0 -1
- package/src/colors.js.map +0 -1
- package/src/commands/configure.js.map +0 -1
- package/src/commands/create.js.map +0 -1
- package/src/commands/dev.js.map +0 -1
- package/src/commands/doctor.js.map +0 -1
- package/src/commands/inspector.js.map +0 -1
- package/src/commands/install/index.js.map +0 -1
- package/src/commands/install/registry.js.map +0 -1
- package/src/commands/install/sources/git.js.map +0 -1
- package/src/commands/install/types.js.map +0 -1
- package/src/commands/list.js.map +0 -1
- package/src/commands/logs.js.map +0 -1
- package/src/commands/restart.js.map +0 -1
- package/src/commands/service.js.map +0 -1
- package/src/commands/socket.js.map +0 -1
- package/src/commands/start.js.map +0 -1
- package/src/commands/status.js.map +0 -1
- package/src/commands/stop.js.map +0 -1
- package/src/commands/template.d.ts +0 -13
- package/src/commands/template.js +0 -193
- package/src/commands/template.js.map +0 -1
- package/src/commands/test.js.map +0 -1
- package/src/commands/uninstall.js.map +0 -1
- package/src/pm/index.d.ts +0 -9
- package/src/pm/index.js.map +0 -1
- package/src/pm/pm.format.js.map +0 -1
- package/src/pm/pm.health.js.map +0 -1
- package/src/pm/pm.logs.js.map +0 -1
- package/src/pm/pm.manager.js.map +0 -1
- package/src/pm/pm.paths.js.map +0 -1
- package/src/pm/pm.pidfile.js.map +0 -1
- package/src/pm/pm.service.js.map +0 -1
- package/src/pm/pm.spawn.js.map +0 -1
- package/src/pm/pm.types.js.map +0 -1
- package/src/templates/3rd-party-integration/src/http-client.d.ts +0 -20
- package/src/templates/3rd-party-integration/src/http-client.js +0 -105
- package/src/templates/3rd-party-integration/src/http-client.js.map +0 -1
- package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +0 -63
- package/src/templates/3rd-party-integration/src/mcp-http-types.js +0 -52
- package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +0 -1
- package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +0 -45
- package/src/templates/3rd-party-integration/src/tools/example.list.js +0 -85
- package/src/templates/3rd-party-integration/src/tools/example.list.js.map +0 -1
- package/src/tsconfig.js.map +0 -1
- package/src/utils/env.js.map +0 -1
- package/src/utils/fs.js.map +0 -1
- package/src/utils/prompts.js.map +0 -1
- package/src/version.js.map +0 -1
- /package/src/commands/{doctor.d.ts → dev/doctor.d.ts} +0 -0
- /package/src/commands/{inspector.d.ts → dev/inspector.d.ts} +0 -0
- /package/src/commands/{install → package}/questionnaire.d.ts +0 -0
- /package/src/commands/{install → package}/registry.d.ts +0 -0
- /package/src/commands/{install → package}/sources/git.d.ts +0 -0
- /package/src/commands/{install → package}/sources/local.d.ts +0 -0
- /package/src/commands/{install → package}/sources/local.js +0 -0
- /package/src/commands/{install → package}/sources/npm.d.ts +0 -0
- /package/src/commands/{install → package}/sources/npm.js +0 -0
- /package/src/{pm/pm.health.d.ts → commands/pm/health.d.ts} +0 -0
- /package/src/{pm/pm.logs.d.ts → commands/pm/log-utils.d.ts} +0 -0
- /package/src/{pm/pm.types.d.ts → commands/pm/types.d.ts} +0 -0
- /package/src/commands/{create.d.ts → scaffold/create.d.ts} +0 -0
- /package/src/{colors.d.ts → core/colors.d.ts} +0 -0
- /package/src/{colors.js → core/colors.js} +0 -0
- /package/src/{tsconfig.d.ts → core/tsconfig.d.ts} +0 -0
- /package/src/{tsconfig.js → core/tsconfig.js} +0 -0
- /package/src/{version.d.ts → core/version.d.ts} +0 -0
- /package/src/{utils → shared}/env.d.ts +0 -0
- /package/src/{utils → shared}/fs.d.ts +0 -0
- /package/src/{utils → shared}/prompts.d.ts +0 -0
- /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=
|
|
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 './
|
|
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
|
|
13
|
+
const paths_1 = require("./paths");
|
|
14
14
|
function writePidFile(name, data) {
|
|
15
|
-
(0,
|
|
16
|
-
const filePath = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
54
|
-
const pidsDir =
|
|
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=
|
|
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,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":"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","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 '
|
|
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("
|
|
5
|
-
const
|
|
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
|
|
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,
|
|
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 './
|
|
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
|
|
15
|
-
const
|
|
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,
|
|
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,
|
|
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=
|
|
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 '
|
|
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("
|
|
5
|
-
const
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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 '
|
|
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("
|
|
9
|
-
const fs_1 = require("
|
|
10
|
-
const env_1 = require("
|
|
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"]}
|
|
@@ -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
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const version_1 = require("
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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=
|
|
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 '
|
|
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("
|
|
7
|
-
const fs_1 = require("
|
|
8
|
-
const env_1 = require("
|
|
9
|
-
const
|
|
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
|
|
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,
|
|
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 '
|
|
1
|
+
import { ParsedArgs } from '../../core/args';
|
|
2
2
|
export declare function runStatus(opts: ParsedArgs): Promise<void>;
|