@rithamnatani/agentmux 1.5.39
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 +440 -0
- package/dist/clientFilter.d.ts +5 -0
- package/dist/clientFilter.d.ts.map +1 -0
- package/dist/clientFilter.js +31 -0
- package/dist/clientFilter.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +112 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +115 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +118 -0
- package/dist/constants.js.map +1 -0
- package/dist/execution.d.ts +23 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +2 -0
- package/dist/execution.js.map +1 -0
- package/dist/httpServer.d.ts +12 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +323 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +19 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +172 -0
- package/dist/logger.js.map +1 -0
- package/dist/modelCatalog.d.ts +15 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.generated.json +80 -0
- package/dist/modelCatalog.js +81 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/router/config.d.ts +13 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +198 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/defaultConfig.d.ts +13 -0
- package/dist/router/defaultConfig.d.ts.map +1 -0
- package/dist/router/defaultConfig.js +82 -0
- package/dist/router/defaultConfig.js.map +1 -0
- package/dist/router/executor.d.ts +35 -0
- package/dist/router/executor.d.ts.map +1 -0
- package/dist/router/executor.js +189 -0
- package/dist/router/executor.js.map +1 -0
- package/dist/router/modelMetadata.d.ts +5 -0
- package/dist/router/modelMetadata.d.ts.map +1 -0
- package/dist/router/modelMetadata.js +81 -0
- package/dist/router/modelMetadata.js.map +1 -0
- package/dist/router/quota.d.ts +4 -0
- package/dist/router/quota.d.ts.map +1 -0
- package/dist/router/quota.js +5 -0
- package/dist/router/quota.js.map +1 -0
- package/dist/router/router.d.ts +3 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +141 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/types.d.ts +86 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +2 -0
- package/dist/router/types.js.map +1 -0
- package/dist/routerConfig.d.ts +14 -0
- package/dist/routerConfig.d.ts.map +1 -0
- package/dist/routerConfig.js +194 -0
- package/dist/routerConfig.js.map +1 -0
- package/dist/serverApp.d.ts +43 -0
- package/dist/serverApp.d.ts.map +1 -0
- package/dist/serverApp.js +618 -0
- package/dist/serverApp.js.map +1 -0
- package/dist/service/bootstrap.d.ts +3 -0
- package/dist/service/bootstrap.d.ts.map +1 -0
- package/dist/service/bootstrap.js +32 -0
- package/dist/service/bootstrap.js.map +1 -0
- package/dist/service/manager.d.ts +6 -0
- package/dist/service/manager.d.ts.map +1 -0
- package/dist/service/manager.js +318 -0
- package/dist/service/manager.js.map +1 -0
- package/dist/service/paths.d.ts +10 -0
- package/dist/service/paths.d.ts.map +1 -0
- package/dist/service/paths.js +57 -0
- package/dist/service/paths.js.map +1 -0
- package/dist/service/renderers.d.ts +7 -0
- package/dist/service/renderers.d.ts.map +1 -0
- package/dist/service/renderers.js +110 -0
- package/dist/service/renderers.js.map +1 -0
- package/dist/service/runtime.d.ts +14 -0
- package/dist/service/runtime.d.ts.map +1 -0
- package/dist/service/runtime.js +129 -0
- package/dist/service/runtime.js.map +1 -0
- package/dist/service/types.d.ts +33 -0
- package/dist/service/types.d.ts.map +1 -0
- package/dist/service/types.js +2 -0
- package/dist/service/types.js.map +1 -0
- package/dist/taskClientPolicy.d.ts +16 -0
- package/dist/taskClientPolicy.d.ts.map +1 -0
- package/dist/taskClientPolicy.js +44 -0
- package/dist/taskClientPolicy.js.map +1 -0
- package/dist/taskStore.d.ts +12 -0
- package/dist/taskStore.d.ts.map +1 -0
- package/dist/taskStore.js +30 -0
- package/dist/taskStore.js.map +1 -0
- package/dist/tierConfig.d.ts +16 -0
- package/dist/tierConfig.d.ts.map +1 -0
- package/dist/tierConfig.js +70 -0
- package/dist/tierConfig.js.map +1 -0
- package/dist/tools/ask-claude.tool.d.ts +3 -0
- package/dist/tools/ask-claude.tool.d.ts.map +1 -0
- package/dist/tools/ask-claude.tool.js +30 -0
- package/dist/tools/ask-claude.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +29 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/ask-cursor.tool.d.ts +3 -0
- package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
- package/dist/tools/ask-cursor.tool.js +30 -0
- package/dist/tools/ask-cursor.tool.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +40 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/ask-opencode.tool.d.ts +3 -0
- package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
- package/dist/tools/ask-opencode.tool.js +29 -0
- package/dist/tools/ask-opencode.tool.js.map +1 -0
- package/dist/tools/ask-router.tool.d.ts +20 -0
- package/dist/tools/ask-router.tool.d.ts.map +1 -0
- package/dist/tools/ask-router.tool.js +550 -0
- package/dist/tools/ask-router.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +58 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/get-run.tool.d.ts +3 -0
- package/dist/tools/get-run.tool.d.ts.map +1 -0
- package/dist/tools/get-run.tool.js +53 -0
- package/dist/tools/get-run.tool.js.map +1 -0
- package/dist/tools/important-read-now.tool.d.ts +3 -0
- package/dist/tools/important-read-now.tool.d.ts.map +1 -0
- package/dist/tools/important-read-now.tool.js +31 -0
- package/dist/tools/important-read-now.tool.js.map +1 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +59 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
- package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
- package/dist/tools/opencode-copilot-usage.tool.js +85 -0
- package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
- package/dist/tools/recommend-route.tool.d.ts +3 -0
- package/dist/tools/recommend-route.tool.d.ts.map +1 -0
- package/dist/tools/recommend-route.tool.js +88 -0
- package/dist/tools/recommend-route.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +105 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +12 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +121 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/tiered-request.tool.d.ts +3 -0
- package/dist/tools/tiered-request.tool.d.ts.map +1 -0
- package/dist/tools/tiered-request.tool.js +147 -0
- package/dist/tools/tiered-request.tool.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +147 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/claudeExecutor.d.ts +3 -0
- package/dist/utils/claudeExecutor.d.ts.map +1 -0
- package/dist/utils/claudeExecutor.js +21 -0
- package/dist/utils/claudeExecutor.js.map +1 -0
- package/dist/utils/cliDetector.d.ts +20 -0
- package/dist/utils/cliDetector.d.ts.map +1 -0
- package/dist/utils/cliDetector.js +95 -0
- package/dist/utils/cliDetector.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +3 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +19 -0
- package/dist/utils/codexExecutor.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +29 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +487 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/cursorCli.d.ts +3 -0
- package/dist/utils/cursorCli.d.ts.map +1 -0
- package/dist/utils/cursorCli.js +20 -0
- package/dist/utils/cursorCli.js.map +1 -0
- package/dist/utils/cursorExecutor.d.ts +3 -0
- package/dist/utils/cursorExecutor.d.ts.map +1 -0
- package/dist/utils/cursorExecutor.js +22 -0
- package/dist/utils/cursorExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +4 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +131 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/githubCli.d.ts +22 -0
- package/dist/utils/githubCli.d.ts.map +1 -0
- package/dist/utils/githubCli.js +131 -0
- package/dist/utils/githubCli.js.map +1 -0
- package/dist/utils/opencodeCatalog.d.ts +33 -0
- package/dist/utils/opencodeCatalog.d.ts.map +1 -0
- package/dist/utils/opencodeCatalog.js +171 -0
- package/dist/utils/opencodeCatalog.js.map +1 -0
- package/dist/utils/opencodeExecutor.d.ts +3 -0
- package/dist/utils/opencodeExecutor.d.ts.map +1 -0
- package/dist/utils/opencodeExecutor.js +16 -0
- package/dist/utils/opencodeExecutor.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/dist/utils/worktrunkIsolation.d.ts +26 -0
- package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
- package/dist/utils/worktrunkIsolation.js +80 -0
- package/dist/utils/worktrunkIsolation.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
|
+
export function loadServiceEnvironment(envFilePath, targetEnv = process.env) {
|
|
5
|
+
const raw = readFileSync(envFilePath, 'utf8');
|
|
6
|
+
const parsed = JSON.parse(raw);
|
|
7
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
8
|
+
if (typeof value !== 'string') {
|
|
9
|
+
throw new Error(`Service environment value for ${key} must be a string.`);
|
|
10
|
+
}
|
|
11
|
+
targetEnv[key] = value;
|
|
12
|
+
}
|
|
13
|
+
return targetEnv;
|
|
14
|
+
}
|
|
15
|
+
export async function runServiceBootstrap(argv = process.argv.slice(2)) {
|
|
16
|
+
const [envFilePath, entrypointPath, ...entrypointArgs] = argv;
|
|
17
|
+
if (!envFilePath || !entrypointPath) {
|
|
18
|
+
throw new Error('Usage: bootstrap <env-file> <entrypoint> [args...]');
|
|
19
|
+
}
|
|
20
|
+
loadServiceEnvironment(envFilePath);
|
|
21
|
+
process.argv = [process.execPath, entrypointPath, ...entrypointArgs];
|
|
22
|
+
await import(pathToFileURL(entrypointPath).href);
|
|
23
|
+
}
|
|
24
|
+
const isMainModule = process.argv[1]
|
|
25
|
+
&& path.resolve(fileURLToPath(import.meta.url)) === path.resolve(process.argv[1]);
|
|
26
|
+
if (isMainModule) {
|
|
27
|
+
void runServiceBootstrap().catch((error) => {
|
|
28
|
+
process.stderr.write(`${String(error)}\n`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/service/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,YAA+B,OAAO,CAAC,GAAG;IAE1C,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IAE1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,oBAAoB,CAAC,CAAC;QAC5E,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC;IAE9D,IAAI,CAAC,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC;IACrE,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;OAC/B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpF,IAAI,YAAY,EAAE,CAAC;IACjB,KAAK,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MultiCliConfig } from '../config.js';
|
|
2
|
+
import type { Logger } from '../logger.js';
|
|
3
|
+
import type { ServiceManifest } from './types.js';
|
|
4
|
+
export declare function isMatchingClaudeConfigOutput(output: string, manifest: ServiceManifest): boolean;
|
|
5
|
+
export declare function handleServiceCommand(args: string[], config: MultiCliConfig, logger: Logger): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/service/manager.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAc3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2FlD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,GACxB,OAAO,CAIT;AAmMD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAyHf"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { closeSync, chmodSync, existsSync, mkdirSync, openSync, readSync, readFileSync, rmSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { detectAvailableClis } from '../utils/cliDetector.js';
|
|
4
|
+
import { executeCommand } from '../utils/commandExecutor.js';
|
|
5
|
+
import { createServiceManifest, buildServiceEnvFileContents, generateServiceToken } from './runtime.js';
|
|
6
|
+
import { renderLaunchAgent, renderPosixLauncher, renderSystemdUnit, renderWindowsLauncher, renderWindowsTaskXml, } from './renderers.js';
|
|
7
|
+
import { SERVICE_LABEL, SYSTEMD_UNIT_NAME, WINDOWS_TASK_NAME, } from './paths.js';
|
|
8
|
+
function ensureParentDir(filePath) {
|
|
9
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
function writeTextFile(filePath, contents, mode) {
|
|
12
|
+
ensureParentDir(filePath);
|
|
13
|
+
writeFileSync(filePath, contents, { encoding: 'utf8', mode: mode ?? 0o666 });
|
|
14
|
+
if (mode !== undefined && process.platform !== 'win32') {
|
|
15
|
+
chmodSync(filePath, mode);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function loadManifest(config) {
|
|
19
|
+
const manifestPath = config.serviceManifestPath;
|
|
20
|
+
if (!existsSync(manifestPath)) {
|
|
21
|
+
throw new Error(`AgentMux service is not installed. Missing manifest at ${manifestPath}`);
|
|
22
|
+
}
|
|
23
|
+
return JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
24
|
+
}
|
|
25
|
+
async function runBestEffort(command, args, logger) {
|
|
26
|
+
try {
|
|
27
|
+
await executeCommand(command, args, { logger });
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.debug('service_command_ignored_failure', {
|
|
31
|
+
command,
|
|
32
|
+
args,
|
|
33
|
+
error,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function waitForHealth(manifest, logger) {
|
|
38
|
+
const deadline = Date.now() + 15_000;
|
|
39
|
+
while (Date.now() < deadline) {
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(manifest.transport.healthUrl);
|
|
42
|
+
if (response.ok) {
|
|
43
|
+
logger.info('service_health_check_passed', {
|
|
44
|
+
healthUrl: manifest.transport.healthUrl,
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.debug('service_health_check_retrying', { error });
|
|
51
|
+
}
|
|
52
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Timed out waiting for service health at ${manifest.transport.healthUrl}`);
|
|
55
|
+
}
|
|
56
|
+
async function configureClaude(manifest, logger) {
|
|
57
|
+
await runBestEffort('claude', ['mcp', 'remove', '--scope', 'user', 'AgentMux'], logger);
|
|
58
|
+
await executeCommand('claude', [
|
|
59
|
+
'mcp',
|
|
60
|
+
'add',
|
|
61
|
+
'--scope',
|
|
62
|
+
'user',
|
|
63
|
+
'--transport',
|
|
64
|
+
'http',
|
|
65
|
+
'AgentMux',
|
|
66
|
+
manifest.transport.url,
|
|
67
|
+
'--header',
|
|
68
|
+
`Authorization: Bearer ${manifest.transport.token}`,
|
|
69
|
+
], { logger });
|
|
70
|
+
}
|
|
71
|
+
export function isMatchingClaudeConfigOutput(output, manifest) {
|
|
72
|
+
return output.includes('Type: http')
|
|
73
|
+
&& output.includes(`URL: ${manifest.transport.url}`)
|
|
74
|
+
&& output.includes(`Authorization: Bearer ${manifest.transport.token}`);
|
|
75
|
+
}
|
|
76
|
+
async function inspectClaudeConfig(manifest, logger) {
|
|
77
|
+
try {
|
|
78
|
+
const output = await executeCommand('claude', ['mcp', 'get', 'AgentMux'], { logger });
|
|
79
|
+
return {
|
|
80
|
+
present: true,
|
|
81
|
+
matchesManagedService: isMatchingClaudeConfigOutput(output, manifest),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger.debug('claude_config_inspection_failed', { error });
|
|
86
|
+
return {
|
|
87
|
+
present: false,
|
|
88
|
+
matchesManagedService: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function registerService(manifest, logger) {
|
|
93
|
+
switch (manifest.serviceKind) {
|
|
94
|
+
case 'launchd': {
|
|
95
|
+
const domain = `gui/${process.getuid?.() ?? 0}`;
|
|
96
|
+
await runBestEffort('launchctl', ['bootout', domain, manifest.paths.serviceDefinition], logger);
|
|
97
|
+
await executeCommand('launchctl', ['bootstrap', domain, manifest.paths.serviceDefinition], { logger });
|
|
98
|
+
await executeCommand('launchctl', ['kickstart', '-k', `${domain}/${SERVICE_LABEL}`], { logger });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
case 'systemd-user':
|
|
102
|
+
await executeCommand('systemctl', ['--user', 'daemon-reload'], { logger });
|
|
103
|
+
await executeCommand('systemctl', ['--user', 'enable', '--now', SYSTEMD_UNIT_NAME], { logger });
|
|
104
|
+
return;
|
|
105
|
+
case 'windows-task':
|
|
106
|
+
await executeCommand('schtasks', ['/Create', '/TN', WINDOWS_TASK_NAME, '/XML', manifest.paths.serviceDefinition, '/F'], { logger });
|
|
107
|
+
await runBestEffort('schtasks', ['/Run', '/TN', WINDOWS_TASK_NAME], logger);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function unregisterService(manifest, logger) {
|
|
112
|
+
switch (manifest.serviceKind) {
|
|
113
|
+
case 'launchd': {
|
|
114
|
+
const domain = `gui/${process.getuid?.() ?? 0}`;
|
|
115
|
+
await runBestEffort('launchctl', ['bootout', domain, manifest.paths.serviceDefinition], logger);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
case 'systemd-user':
|
|
119
|
+
await runBestEffort('systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT_NAME], logger);
|
|
120
|
+
await runBestEffort('systemctl', ['--user', 'daemon-reload'], logger);
|
|
121
|
+
return;
|
|
122
|
+
case 'windows-task':
|
|
123
|
+
await runBestEffort('schtasks', ['/Delete', '/TN', WINDOWS_TASK_NAME, '/F'], logger);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function getServiceStatus(manifest, logger) {
|
|
128
|
+
try {
|
|
129
|
+
switch (manifest.serviceKind) {
|
|
130
|
+
case 'launchd':
|
|
131
|
+
return await executeCommand('launchctl', ['print', `gui/${process.getuid?.() ?? 0}/${SERVICE_LABEL}`], { logger });
|
|
132
|
+
case 'systemd-user':
|
|
133
|
+
return await executeCommand('systemctl', ['--user', 'status', SYSTEMD_UNIT_NAME], { logger });
|
|
134
|
+
case 'windows-task':
|
|
135
|
+
return await executeCommand('schtasks', ['/Query', '/TN', WINDOWS_TASK_NAME, '/V', '/FO', 'LIST'], { logger });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return `inactive: ${String(error)}`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function renderLauncher(manifest) {
|
|
143
|
+
return manifest.platform === 'win32'
|
|
144
|
+
? renderWindowsLauncher(manifest)
|
|
145
|
+
: renderPosixLauncher(manifest);
|
|
146
|
+
}
|
|
147
|
+
function renderServiceDefinition(manifest) {
|
|
148
|
+
switch (manifest.serviceKind) {
|
|
149
|
+
case 'launchd':
|
|
150
|
+
return renderLaunchAgent(manifest);
|
|
151
|
+
case 'systemd-user':
|
|
152
|
+
return renderSystemdUnit(manifest);
|
|
153
|
+
case 'windows-task':
|
|
154
|
+
return renderWindowsTaskXml(manifest);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function installService(config, logger, options) {
|
|
158
|
+
const existingToken = options.preserveToken && existsSync(config.serviceManifestPath)
|
|
159
|
+
? loadManifest(config).transport.token
|
|
160
|
+
: undefined;
|
|
161
|
+
const token = config.httpAuthToken ?? existingToken ?? generateServiceToken();
|
|
162
|
+
const manifest = createServiceManifest({
|
|
163
|
+
...config,
|
|
164
|
+
transport: 'http',
|
|
165
|
+
httpHost: '127.0.0.1',
|
|
166
|
+
httpAuthToken: token,
|
|
167
|
+
}, token);
|
|
168
|
+
mkdirSync(manifest.paths.root, { recursive: true });
|
|
169
|
+
writeTextFile(manifest.paths.envFile, buildServiceEnvFileContents(manifest), 0o600);
|
|
170
|
+
writeTextFile(manifest.paths.launcher, renderLauncher(manifest), manifest.platform === 'win32' ? undefined : 0o700);
|
|
171
|
+
writeTextFile(manifest.paths.serviceDefinition, renderServiceDefinition(manifest), 0o600);
|
|
172
|
+
writeTextFile(manifest.paths.manifest, `${JSON.stringify(manifest, null, 2)}\n`, 0o600);
|
|
173
|
+
await registerService(manifest, logger);
|
|
174
|
+
await waitForHealth(manifest, logger);
|
|
175
|
+
if (options.configureClaude) {
|
|
176
|
+
await configureClaude(manifest, logger);
|
|
177
|
+
}
|
|
178
|
+
return manifest;
|
|
179
|
+
}
|
|
180
|
+
function tailFile(filePath, lineCount = 200) {
|
|
181
|
+
if (!existsSync(filePath)) {
|
|
182
|
+
return `Log file not found: ${filePath}`;
|
|
183
|
+
}
|
|
184
|
+
const fileDescriptor = openSync(filePath, 'r');
|
|
185
|
+
try {
|
|
186
|
+
const { size } = statSync(filePath);
|
|
187
|
+
if (size === 0) {
|
|
188
|
+
return '';
|
|
189
|
+
}
|
|
190
|
+
const chunkSize = 4096;
|
|
191
|
+
let position = size;
|
|
192
|
+
let contents = '';
|
|
193
|
+
let newlineCount = 0;
|
|
194
|
+
while (position > 0 && newlineCount <= lineCount) {
|
|
195
|
+
const bytesToRead = Math.min(chunkSize, position);
|
|
196
|
+
position -= bytesToRead;
|
|
197
|
+
const chunkBuffer = Buffer.alloc(bytesToRead);
|
|
198
|
+
readSync(fileDescriptor, chunkBuffer, 0, bytesToRead, position);
|
|
199
|
+
contents = chunkBuffer.toString('utf8') + contents;
|
|
200
|
+
newlineCount = contents.split('\n').length - 1;
|
|
201
|
+
}
|
|
202
|
+
return contents.split('\n').slice(-lineCount).join('\n');
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
closeSync(fileDescriptor);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export async function handleServiceCommand(args, config, logger) {
|
|
209
|
+
const [subcommand = 'status', ...rest] = args;
|
|
210
|
+
const configureClaudeFlag = rest.includes('--configure-claude');
|
|
211
|
+
const serviceLogger = logger.child({ component: 'service' });
|
|
212
|
+
switch (subcommand) {
|
|
213
|
+
case 'install': {
|
|
214
|
+
const availability = await detectAvailableClis(config.cliDetectTimeoutMs, serviceLogger.child({ component: 'cliDetector' }));
|
|
215
|
+
if (!Object.values(availability).some(Boolean)) {
|
|
216
|
+
throw new Error('Cannot install the AgentMux service because no supported backend CLIs were detected on PATH.');
|
|
217
|
+
}
|
|
218
|
+
const manifest = await installService(config, serviceLogger, {
|
|
219
|
+
configureClaude: configureClaudeFlag,
|
|
220
|
+
});
|
|
221
|
+
process.stdout.write([
|
|
222
|
+
`Installed AgentMux service (${manifest.serviceKind}).`,
|
|
223
|
+
`Service URL: ${manifest.transport.url}`,
|
|
224
|
+
`Health URL: ${manifest.transport.healthUrl}`,
|
|
225
|
+
`Launcher: ${manifest.paths.launcher}`,
|
|
226
|
+
configureClaudeFlag
|
|
227
|
+
? 'Claude Code configuration updated.'
|
|
228
|
+
: 'Run `agentmux service refresh --configure-claude` or configure Claude manually if needed.',
|
|
229
|
+
].join('\n') + '\n');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
case 'refresh': {
|
|
233
|
+
const manifest = await installService(config, serviceLogger, {
|
|
234
|
+
configureClaude: configureClaudeFlag,
|
|
235
|
+
preserveToken: true,
|
|
236
|
+
});
|
|
237
|
+
process.stdout.write(`Refreshed AgentMux service at ${manifest.transport.url}\n`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
case 'uninstall': {
|
|
241
|
+
const manifest = loadManifest(config);
|
|
242
|
+
const claudeConfig = await inspectClaudeConfig(manifest, serviceLogger);
|
|
243
|
+
await unregisterService(manifest, serviceLogger);
|
|
244
|
+
if (claudeConfig.matchesManagedService) {
|
|
245
|
+
await runBestEffort('claude', ['mcp', 'remove', '--scope', 'user', 'AgentMux'], serviceLogger);
|
|
246
|
+
}
|
|
247
|
+
try {
|
|
248
|
+
unlinkSync(manifest.paths.serviceDefinition);
|
|
249
|
+
}
|
|
250
|
+
catch { }
|
|
251
|
+
rmSync(manifest.paths.root, { recursive: true, force: true });
|
|
252
|
+
process.stdout.write('Uninstalled AgentMux service.\n');
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
case 'start': {
|
|
256
|
+
const manifest = loadManifest(config);
|
|
257
|
+
await registerService(manifest, serviceLogger);
|
|
258
|
+
await waitForHealth(manifest, serviceLogger);
|
|
259
|
+
process.stdout.write(`Started AgentMux service at ${manifest.transport.url}\n`);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
case 'stop': {
|
|
263
|
+
const manifest = loadManifest(config);
|
|
264
|
+
await unregisterService(manifest, serviceLogger);
|
|
265
|
+
process.stdout.write('Stopped AgentMux service.\n');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
case 'restart': {
|
|
269
|
+
const manifest = loadManifest(config);
|
|
270
|
+
await unregisterService(manifest, serviceLogger);
|
|
271
|
+
await registerService(manifest, serviceLogger);
|
|
272
|
+
await waitForHealth(manifest, serviceLogger);
|
|
273
|
+
process.stdout.write(`Restarted AgentMux service at ${manifest.transport.url}\n`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
case 'status': {
|
|
277
|
+
const manifest = loadManifest(config);
|
|
278
|
+
const status = await getServiceStatus(manifest, serviceLogger);
|
|
279
|
+
process.stdout.write(`${status}\n`);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
case 'doctor': {
|
|
283
|
+
const manifest = loadManifest(config);
|
|
284
|
+
const status = await getServiceStatus(manifest, serviceLogger);
|
|
285
|
+
const claudeConfig = await inspectClaudeConfig(manifest, serviceLogger);
|
|
286
|
+
let health;
|
|
287
|
+
try {
|
|
288
|
+
const response = await fetch(manifest.transport.healthUrl);
|
|
289
|
+
health = response.ok ? 'ok' : `http ${response.status}`;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
health = `error: ${String(error)}`;
|
|
293
|
+
}
|
|
294
|
+
const availability = await detectAvailableClis(config.cliDetectTimeoutMs, serviceLogger.child({ component: 'cliDetector' }));
|
|
295
|
+
process.stdout.write([
|
|
296
|
+
'AgentMux Doctor',
|
|
297
|
+
`service kind: ${manifest.serviceKind}`,
|
|
298
|
+
`service url: ${manifest.transport.url}`,
|
|
299
|
+
`health: ${health}`,
|
|
300
|
+
`status: ${status.split('\n')[0] ?? status}`,
|
|
301
|
+
`launcher: ${manifest.paths.launcher}`,
|
|
302
|
+
`manifest: ${manifest.paths.manifest}`,
|
|
303
|
+
`claude config present: ${claudeConfig.present ? 'yes' : 'no'}`,
|
|
304
|
+
`claude config matches managed service: ${claudeConfig.matchesManagedService ? 'yes' : 'no'}`,
|
|
305
|
+
`backend clis: ${JSON.stringify(availability)}`,
|
|
306
|
+
].join('\n') + '\n');
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
case 'logs': {
|
|
310
|
+
const manifest = loadManifest(config);
|
|
311
|
+
process.stdout.write(`${tailFile(manifest.paths.logFile)}\n`);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
default:
|
|
315
|
+
throw new Error(`Unknown service subcommand: ${subcommand}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/service/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MultiCliConfig } from '../config.js';
|
|
2
|
+
import type { ServiceKind, ServicePaths } from './types.js';
|
|
3
|
+
export declare const SERVICE_LABEL = "com.rithamnatani.agentmux";
|
|
4
|
+
export declare const SYSTEMD_UNIT_NAME = "agentmux.service";
|
|
5
|
+
export declare const WINDOWS_TASK_NAME = "AgentMux";
|
|
6
|
+
export declare function getMulticliDir(): string;
|
|
7
|
+
export declare function getRunsDir(): string;
|
|
8
|
+
export declare function getServiceKind(platform?: NodeJS.Platform): ServiceKind;
|
|
9
|
+
export declare function getServicePaths(config: MultiCliConfig, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): ServicePaths;
|
|
10
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/service/paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,aAAa,8BAA8B,CAAC;AACzD,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AACpD,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,WAAW,CASb;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CA6Cd"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
export const SERVICE_LABEL = 'com.rithamnatani.agentmux';
|
|
4
|
+
export const SYSTEMD_UNIT_NAME = 'agentmux.service';
|
|
5
|
+
export const WINDOWS_TASK_NAME = 'AgentMux';
|
|
6
|
+
export function getMulticliDir() {
|
|
7
|
+
return path.join(os.homedir(), '.agentmux');
|
|
8
|
+
}
|
|
9
|
+
export function getRunsDir() {
|
|
10
|
+
return path.join(getMulticliDir(), 'runs');
|
|
11
|
+
}
|
|
12
|
+
export function getServiceKind(platform = process.platform) {
|
|
13
|
+
switch (platform) {
|
|
14
|
+
case 'darwin':
|
|
15
|
+
return 'launchd';
|
|
16
|
+
case 'win32':
|
|
17
|
+
return 'windows-task';
|
|
18
|
+
default:
|
|
19
|
+
return 'systemd-user';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function getServicePaths(config, platform = process.platform, env = process.env) {
|
|
23
|
+
const root = config.serviceRootDir;
|
|
24
|
+
switch (platform) {
|
|
25
|
+
case 'darwin':
|
|
26
|
+
return {
|
|
27
|
+
root,
|
|
28
|
+
manifest: config.serviceManifestPath,
|
|
29
|
+
envFile: config.serviceEnvPath,
|
|
30
|
+
launcher: path.join(root, 'AgentMux.sh'),
|
|
31
|
+
serviceDefinition: path.join(os.homedir(), 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`),
|
|
32
|
+
logFile: config.serviceLogPath,
|
|
33
|
+
stderrLogFile: `${config.serviceLogPath}.stderr`,
|
|
34
|
+
};
|
|
35
|
+
case 'win32':
|
|
36
|
+
return {
|
|
37
|
+
root,
|
|
38
|
+
manifest: config.serviceManifestPath,
|
|
39
|
+
envFile: config.serviceEnvPath,
|
|
40
|
+
launcher: path.join(root, 'launcher.ps1'),
|
|
41
|
+
serviceDefinition: path.join(root, 'task.xml'),
|
|
42
|
+
logFile: config.serviceLogPath,
|
|
43
|
+
stderrLogFile: `${config.serviceLogPath}.stderr`,
|
|
44
|
+
};
|
|
45
|
+
default:
|
|
46
|
+
return {
|
|
47
|
+
root,
|
|
48
|
+
manifest: config.serviceManifestPath,
|
|
49
|
+
envFile: config.serviceEnvPath,
|
|
50
|
+
launcher: path.join(root, 'launcher.sh'),
|
|
51
|
+
serviceDefinition: path.join(env.XDG_CONFIG_HOME ?? path.join(os.homedir(), '.config'), 'systemd', 'user', SYSTEMD_UNIT_NAME),
|
|
52
|
+
logFile: config.serviceLogPath,
|
|
53
|
+
stderrLogFile: `${config.serviceLogPath}.stderr`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/service/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,WAA4B,OAAO,CAAC,QAAQ;IAE5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,cAAc,CAAC;QACxB;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAsB,EACtB,WAA4B,OAAO,CAAC,QAAQ,EAC5C,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;IAEnC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,MAAM,CAAC,mBAAmB;gBACpC,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;gBACxC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAC1B,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,cAAc,EACd,GAAG,aAAa,QAAQ,CACzB;gBACD,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,aAAa,EAAE,GAAG,MAAM,CAAC,cAAc,SAAS;aACjD,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,MAAM,CAAC,mBAAmB;gBACpC,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;gBACzC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;gBAC9C,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,aAAa,EAAE,GAAG,MAAM,CAAC,cAAc,SAAS;aACjD,CAAC;QACJ;YACE,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,MAAM,CAAC,mBAAmB;gBACpC,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;gBACxC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAC1B,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EACzD,SAAS,EACT,MAAM,EACN,iBAAiB,CAClB;gBACD,OAAO,EAAE,MAAM,CAAC,cAAc;gBAC9B,aAAa,EAAE,GAAG,MAAM,CAAC,cAAc,SAAS;aACjD,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ServiceManifest } from './types.js';
|
|
2
|
+
export declare function renderPosixLauncher(manifest: ServiceManifest): string;
|
|
3
|
+
export declare function renderWindowsLauncher(manifest: ServiceManifest): string;
|
|
4
|
+
export declare function renderLaunchAgent(manifest: ServiceManifest): string;
|
|
5
|
+
export declare function renderSystemdUnit(manifest: ServiceManifest): string;
|
|
6
|
+
export declare function renderWindowsTaskXml(manifest: ServiceManifest): string;
|
|
7
|
+
//# sourceMappingURL=renderers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../src/service/renderers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmBlD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAMrE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAMvE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAwBnE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAiBnE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CA2CtE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
function escapeXml(value) {
|
|
3
|
+
return value
|
|
4
|
+
.replaceAll('&', '&')
|
|
5
|
+
.replaceAll('<', '<')
|
|
6
|
+
.replaceAll('>', '>')
|
|
7
|
+
.replaceAll('"', '"')
|
|
8
|
+
.replaceAll("'", ''');
|
|
9
|
+
}
|
|
10
|
+
function quotePosix(value) {
|
|
11
|
+
return `'${value.replaceAll("'", `'\\''`)}'`;
|
|
12
|
+
}
|
|
13
|
+
function quotePowerShell(value) {
|
|
14
|
+
return `'${value.replaceAll("'", "''")}'`;
|
|
15
|
+
}
|
|
16
|
+
export function renderPosixLauncher(manifest) {
|
|
17
|
+
return `#!/bin/sh
|
|
18
|
+
set -eu
|
|
19
|
+
|
|
20
|
+
exec ${quotePosix(manifest.runtime.nodePath)} ${quotePosix(manifest.runtime.bootstrapPath)} ${quotePosix(manifest.paths.envFile)} ${quotePosix(manifest.runtime.entrypointPath)} serve-http
|
|
21
|
+
`;
|
|
22
|
+
}
|
|
23
|
+
export function renderWindowsLauncher(manifest) {
|
|
24
|
+
return `$ErrorActionPreference = 'Stop'
|
|
25
|
+
|
|
26
|
+
& ${quotePowerShell(manifest.runtime.nodePath)} ${quotePowerShell(manifest.runtime.bootstrapPath)} ${quotePowerShell(manifest.paths.envFile)} ${quotePowerShell(manifest.runtime.entrypointPath)} 'serve-http'
|
|
27
|
+
exit $LASTEXITCODE
|
|
28
|
+
`;
|
|
29
|
+
}
|
|
30
|
+
export function renderLaunchAgent(manifest) {
|
|
31
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
32
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
33
|
+
<plist version="1.0">
|
|
34
|
+
<dict>
|
|
35
|
+
<key>Label</key>
|
|
36
|
+
<string>${escapeXml(manifest.label)}</string>
|
|
37
|
+
<key>ProgramArguments</key>
|
|
38
|
+
<array>
|
|
39
|
+
<string>${escapeXml(manifest.paths.launcher)}</string>
|
|
40
|
+
</array>
|
|
41
|
+
<key>RunAtLoad</key>
|
|
42
|
+
<true/>
|
|
43
|
+
<key>KeepAlive</key>
|
|
44
|
+
<true/>
|
|
45
|
+
<key>WorkingDirectory</key>
|
|
46
|
+
<string>${escapeXml(manifest.paths.root)}</string>
|
|
47
|
+
<key>StandardOutPath</key>
|
|
48
|
+
<string>${escapeXml(manifest.paths.logFile)}</string>
|
|
49
|
+
<key>StandardErrorPath</key>
|
|
50
|
+
<string>${escapeXml(manifest.paths.stderrLogFile)}</string>
|
|
51
|
+
</dict>
|
|
52
|
+
</plist>
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
export function renderSystemdUnit(manifest) {
|
|
56
|
+
return `[Unit]
|
|
57
|
+
Description=AgentMux local HTTP service
|
|
58
|
+
After=network.target
|
|
59
|
+
|
|
60
|
+
[Service]
|
|
61
|
+
Type=simple
|
|
62
|
+
WorkingDirectory=${JSON.stringify(manifest.paths.root)}
|
|
63
|
+
ExecStart=${JSON.stringify(manifest.paths.launcher)}
|
|
64
|
+
Restart=on-failure
|
|
65
|
+
RestartSec=1
|
|
66
|
+
StandardOutput=append:${JSON.stringify(manifest.paths.logFile)}
|
|
67
|
+
StandardError=append:${JSON.stringify(manifest.paths.stderrLogFile)}
|
|
68
|
+
|
|
69
|
+
[Install]
|
|
70
|
+
WantedBy=default.target
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
export function renderWindowsTaskXml(manifest) {
|
|
74
|
+
const command = path.join(process.env.SystemRoot ?? 'C:\\Windows', 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe');
|
|
75
|
+
const argumentsText = `-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File ${quotePowerShell(manifest.paths.launcher)}`;
|
|
76
|
+
return `<?xml version="1.0" encoding="UTF-16"?>
|
|
77
|
+
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
78
|
+
<Triggers>
|
|
79
|
+
<LogonTrigger>
|
|
80
|
+
<Enabled>true</Enabled>
|
|
81
|
+
</LogonTrigger>
|
|
82
|
+
</Triggers>
|
|
83
|
+
<Principals>
|
|
84
|
+
<Principal id="Author">
|
|
85
|
+
<LogonType>InteractiveToken</LogonType>
|
|
86
|
+
<RunLevel>LeastPrivilege</RunLevel>
|
|
87
|
+
</Principal>
|
|
88
|
+
</Principals>
|
|
89
|
+
<Settings>
|
|
90
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
|
91
|
+
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
|
92
|
+
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
|
93
|
+
<AllowHardTerminate>true</AllowHardTerminate>
|
|
94
|
+
<StartWhenAvailable>true</StartWhenAvailable>
|
|
95
|
+
<RestartOnFailure>
|
|
96
|
+
<Interval>PT1M</Interval>
|
|
97
|
+
<Count>3</Count>
|
|
98
|
+
</RestartOnFailure>
|
|
99
|
+
</Settings>
|
|
100
|
+
<Actions Context="Author">
|
|
101
|
+
<Exec>
|
|
102
|
+
<Command>${escapeXml(command)}</Command>
|
|
103
|
+
<Arguments>${escapeXml(argumentsText)}</Arguments>
|
|
104
|
+
<WorkingDirectory>${escapeXml(manifest.paths.root)}</WorkingDirectory>
|
|
105
|
+
</Exec>
|
|
106
|
+
</Actions>
|
|
107
|
+
</Task>
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=renderers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/service/renderers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,OAAO;;;OAGF,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;CAC9K,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,OAAO;;IAEL,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;;CAE/L,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,OAAO;;;;;YAKG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;;;cAGvB,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;;;;;;;YAOpC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;;YAE9B,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;;YAEjC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;;;CAGlD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,OAAO;;;;;;mBAMU,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;;;wBAG3B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;uBACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;;;;CAIlE,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAyB;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,EACvC,UAAU,EACV,mBAAmB,EACnB,MAAM,EACN,gBAAgB,CACjB,CAAC;IACF,MAAM,aAAa,GAAG,gEAAgE,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEjI,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BQ,SAAS,CAAC,OAAO,CAAC;mBAChB,SAAS,CAAC,aAAa,CAAC;0BACjB,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;;;;CAIvD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MultiCliConfig } from '../config.js';
|
|
2
|
+
import type { ServiceManifest } from './types.js';
|
|
3
|
+
export declare function resolveEntrypointPath(): string;
|
|
4
|
+
export declare function resolveBootstrapPath(): string;
|
|
5
|
+
export declare function resolveServiceRuntime(): {
|
|
6
|
+
nodePath: string;
|
|
7
|
+
bootstrapPath: string;
|
|
8
|
+
entrypointPath: string;
|
|
9
|
+
packageVersion: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function generateServiceToken(): string;
|
|
12
|
+
export declare function buildServiceEnvFileContents(manifest: ServiceManifest, currentEnv?: NodeJS.ProcessEnv): string;
|
|
13
|
+
export declare function createServiceManifest(config: MultiCliConfig, token: string, platform?: NodeJS.Platform): ServiceManifest;
|
|
14
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/service/runtime.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAyBhE,wBAAgB,qBAAqB,IAAI,MAAM,CAa9C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAc7C;AAED,wBAAgB,qBAAqB,IAAI;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CA6BA;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,eAAe,EACzB,UAAU,GAAE,MAAM,CAAC,UAAwB,GAC1C,MAAM,CAgCR;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,eAAe,CAuBjB"}
|