@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.
Files changed (235) hide show
  1. package/README.md +440 -0
  2. package/dist/clientFilter.d.ts +5 -0
  3. package/dist/clientFilter.d.ts.map +1 -0
  4. package/dist/clientFilter.js +31 -0
  5. package/dist/clientFilter.js.map +1 -0
  6. package/dist/config.d.ts +28 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +112 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +115 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +118 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/execution.d.ts +23 -0
  15. package/dist/execution.d.ts.map +1 -0
  16. package/dist/execution.js +2 -0
  17. package/dist/execution.js.map +1 -0
  18. package/dist/httpServer.d.ts +12 -0
  19. package/dist/httpServer.d.ts.map +1 -0
  20. package/dist/httpServer.js +323 -0
  21. package/dist/httpServer.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +98 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +19 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +172 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/modelCatalog.d.ts +15 -0
  31. package/dist/modelCatalog.d.ts.map +1 -0
  32. package/dist/modelCatalog.generated.json +80 -0
  33. package/dist/modelCatalog.js +81 -0
  34. package/dist/modelCatalog.js.map +1 -0
  35. package/dist/router/config.d.ts +13 -0
  36. package/dist/router/config.d.ts.map +1 -0
  37. package/dist/router/config.js +198 -0
  38. package/dist/router/config.js.map +1 -0
  39. package/dist/router/defaultConfig.d.ts +13 -0
  40. package/dist/router/defaultConfig.d.ts.map +1 -0
  41. package/dist/router/defaultConfig.js +82 -0
  42. package/dist/router/defaultConfig.js.map +1 -0
  43. package/dist/router/executor.d.ts +35 -0
  44. package/dist/router/executor.d.ts.map +1 -0
  45. package/dist/router/executor.js +189 -0
  46. package/dist/router/executor.js.map +1 -0
  47. package/dist/router/modelMetadata.d.ts +5 -0
  48. package/dist/router/modelMetadata.d.ts.map +1 -0
  49. package/dist/router/modelMetadata.js +81 -0
  50. package/dist/router/modelMetadata.js.map +1 -0
  51. package/dist/router/quota.d.ts +4 -0
  52. package/dist/router/quota.d.ts.map +1 -0
  53. package/dist/router/quota.js +5 -0
  54. package/dist/router/quota.js.map +1 -0
  55. package/dist/router/router.d.ts +3 -0
  56. package/dist/router/router.d.ts.map +1 -0
  57. package/dist/router/router.js +141 -0
  58. package/dist/router/router.js.map +1 -0
  59. package/dist/router/types.d.ts +86 -0
  60. package/dist/router/types.d.ts.map +1 -0
  61. package/dist/router/types.js +2 -0
  62. package/dist/router/types.js.map +1 -0
  63. package/dist/routerConfig.d.ts +14 -0
  64. package/dist/routerConfig.d.ts.map +1 -0
  65. package/dist/routerConfig.js +194 -0
  66. package/dist/routerConfig.js.map +1 -0
  67. package/dist/serverApp.d.ts +43 -0
  68. package/dist/serverApp.d.ts.map +1 -0
  69. package/dist/serverApp.js +618 -0
  70. package/dist/serverApp.js.map +1 -0
  71. package/dist/service/bootstrap.d.ts +3 -0
  72. package/dist/service/bootstrap.d.ts.map +1 -0
  73. package/dist/service/bootstrap.js +32 -0
  74. package/dist/service/bootstrap.js.map +1 -0
  75. package/dist/service/manager.d.ts +6 -0
  76. package/dist/service/manager.d.ts.map +1 -0
  77. package/dist/service/manager.js +318 -0
  78. package/dist/service/manager.js.map +1 -0
  79. package/dist/service/paths.d.ts +10 -0
  80. package/dist/service/paths.d.ts.map +1 -0
  81. package/dist/service/paths.js +57 -0
  82. package/dist/service/paths.js.map +1 -0
  83. package/dist/service/renderers.d.ts +7 -0
  84. package/dist/service/renderers.d.ts.map +1 -0
  85. package/dist/service/renderers.js +110 -0
  86. package/dist/service/renderers.js.map +1 -0
  87. package/dist/service/runtime.d.ts +14 -0
  88. package/dist/service/runtime.d.ts.map +1 -0
  89. package/dist/service/runtime.js +129 -0
  90. package/dist/service/runtime.js.map +1 -0
  91. package/dist/service/types.d.ts +33 -0
  92. package/dist/service/types.d.ts.map +1 -0
  93. package/dist/service/types.js +2 -0
  94. package/dist/service/types.js.map +1 -0
  95. package/dist/taskClientPolicy.d.ts +16 -0
  96. package/dist/taskClientPolicy.d.ts.map +1 -0
  97. package/dist/taskClientPolicy.js +44 -0
  98. package/dist/taskClientPolicy.js.map +1 -0
  99. package/dist/taskStore.d.ts +12 -0
  100. package/dist/taskStore.d.ts.map +1 -0
  101. package/dist/taskStore.js +30 -0
  102. package/dist/taskStore.js.map +1 -0
  103. package/dist/tierConfig.d.ts +16 -0
  104. package/dist/tierConfig.d.ts.map +1 -0
  105. package/dist/tierConfig.js +70 -0
  106. package/dist/tierConfig.js.map +1 -0
  107. package/dist/tools/ask-claude.tool.d.ts +3 -0
  108. package/dist/tools/ask-claude.tool.d.ts.map +1 -0
  109. package/dist/tools/ask-claude.tool.js +30 -0
  110. package/dist/tools/ask-claude.tool.js.map +1 -0
  111. package/dist/tools/ask-codex.tool.d.ts +3 -0
  112. package/dist/tools/ask-codex.tool.d.ts.map +1 -0
  113. package/dist/tools/ask-codex.tool.js +29 -0
  114. package/dist/tools/ask-codex.tool.js.map +1 -0
  115. package/dist/tools/ask-cursor.tool.d.ts +3 -0
  116. package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
  117. package/dist/tools/ask-cursor.tool.js +30 -0
  118. package/dist/tools/ask-cursor.tool.js.map +1 -0
  119. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  120. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  121. package/dist/tools/ask-gemini.tool.js +40 -0
  122. package/dist/tools/ask-gemini.tool.js.map +1 -0
  123. package/dist/tools/ask-opencode.tool.d.ts +3 -0
  124. package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
  125. package/dist/tools/ask-opencode.tool.js +29 -0
  126. package/dist/tools/ask-opencode.tool.js.map +1 -0
  127. package/dist/tools/ask-router.tool.d.ts +20 -0
  128. package/dist/tools/ask-router.tool.d.ts.map +1 -0
  129. package/dist/tools/ask-router.tool.js +550 -0
  130. package/dist/tools/ask-router.tool.js.map +1 -0
  131. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  132. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  133. package/dist/tools/fetch-chunk.tool.js +58 -0
  134. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  135. package/dist/tools/get-run.tool.d.ts +3 -0
  136. package/dist/tools/get-run.tool.d.ts.map +1 -0
  137. package/dist/tools/get-run.tool.js +53 -0
  138. package/dist/tools/get-run.tool.js.map +1 -0
  139. package/dist/tools/important-read-now.tool.d.ts +3 -0
  140. package/dist/tools/important-read-now.tool.d.ts.map +1 -0
  141. package/dist/tools/important-read-now.tool.js +31 -0
  142. package/dist/tools/important-read-now.tool.js.map +1 -0
  143. package/dist/tools/index.d.ts +12 -0
  144. package/dist/tools/index.d.ts.map +1 -0
  145. package/dist/tools/index.js +59 -0
  146. package/dist/tools/index.js.map +1 -0
  147. package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
  148. package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
  149. package/dist/tools/opencode-copilot-usage.tool.js +85 -0
  150. package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
  151. package/dist/tools/recommend-route.tool.d.ts +3 -0
  152. package/dist/tools/recommend-route.tool.d.ts.map +1 -0
  153. package/dist/tools/recommend-route.tool.js +88 -0
  154. package/dist/tools/recommend-route.tool.js.map +1 -0
  155. package/dist/tools/registry.d.ts +31 -0
  156. package/dist/tools/registry.d.ts.map +1 -0
  157. package/dist/tools/registry.js +105 -0
  158. package/dist/tools/registry.js.map +1 -0
  159. package/dist/tools/simple-tools.d.ts +12 -0
  160. package/dist/tools/simple-tools.d.ts.map +1 -0
  161. package/dist/tools/simple-tools.js +121 -0
  162. package/dist/tools/simple-tools.js.map +1 -0
  163. package/dist/tools/test-tool.example.d.ts +13 -0
  164. package/dist/tools/test-tool.example.d.ts.map +1 -0
  165. package/dist/tools/test-tool.example.js +32 -0
  166. package/dist/tools/test-tool.example.js.map +1 -0
  167. package/dist/tools/tiered-request.tool.d.ts +3 -0
  168. package/dist/tools/tiered-request.tool.d.ts.map +1 -0
  169. package/dist/tools/tiered-request.tool.js +147 -0
  170. package/dist/tools/tiered-request.tool.js.map +1 -0
  171. package/dist/utils/changeModeChunker.d.ts +11 -0
  172. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  173. package/dist/utils/changeModeChunker.js +89 -0
  174. package/dist/utils/changeModeChunker.js.map +1 -0
  175. package/dist/utils/changeModeParser.d.ts +15 -0
  176. package/dist/utils/changeModeParser.d.ts.map +1 -0
  177. package/dist/utils/changeModeParser.js +67 -0
  178. package/dist/utils/changeModeParser.js.map +1 -0
  179. package/dist/utils/changeModeTranslator.d.ts +8 -0
  180. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  181. package/dist/utils/changeModeTranslator.js +70 -0
  182. package/dist/utils/changeModeTranslator.js.map +1 -0
  183. package/dist/utils/chunkCache.d.ts +22 -0
  184. package/dist/utils/chunkCache.d.ts.map +1 -0
  185. package/dist/utils/chunkCache.js +147 -0
  186. package/dist/utils/chunkCache.js.map +1 -0
  187. package/dist/utils/claudeExecutor.d.ts +3 -0
  188. package/dist/utils/claudeExecutor.d.ts.map +1 -0
  189. package/dist/utils/claudeExecutor.js +21 -0
  190. package/dist/utils/claudeExecutor.js.map +1 -0
  191. package/dist/utils/cliDetector.d.ts +20 -0
  192. package/dist/utils/cliDetector.d.ts.map +1 -0
  193. package/dist/utils/cliDetector.js +95 -0
  194. package/dist/utils/cliDetector.js.map +1 -0
  195. package/dist/utils/codexExecutor.d.ts +3 -0
  196. package/dist/utils/codexExecutor.d.ts.map +1 -0
  197. package/dist/utils/codexExecutor.js +19 -0
  198. package/dist/utils/codexExecutor.js.map +1 -0
  199. package/dist/utils/commandExecutor.d.ts +29 -0
  200. package/dist/utils/commandExecutor.d.ts.map +1 -0
  201. package/dist/utils/commandExecutor.js +487 -0
  202. package/dist/utils/commandExecutor.js.map +1 -0
  203. package/dist/utils/cursorCli.d.ts +3 -0
  204. package/dist/utils/cursorCli.d.ts.map +1 -0
  205. package/dist/utils/cursorCli.js +20 -0
  206. package/dist/utils/cursorCli.js.map +1 -0
  207. package/dist/utils/cursorExecutor.d.ts +3 -0
  208. package/dist/utils/cursorExecutor.d.ts.map +1 -0
  209. package/dist/utils/cursorExecutor.js +22 -0
  210. package/dist/utils/cursorExecutor.js.map +1 -0
  211. package/dist/utils/geminiExecutor.d.ts +4 -0
  212. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  213. package/dist/utils/geminiExecutor.js +131 -0
  214. package/dist/utils/geminiExecutor.js.map +1 -0
  215. package/dist/utils/githubCli.d.ts +22 -0
  216. package/dist/utils/githubCli.d.ts.map +1 -0
  217. package/dist/utils/githubCli.js +131 -0
  218. package/dist/utils/githubCli.js.map +1 -0
  219. package/dist/utils/opencodeCatalog.d.ts +33 -0
  220. package/dist/utils/opencodeCatalog.d.ts.map +1 -0
  221. package/dist/utils/opencodeCatalog.js +171 -0
  222. package/dist/utils/opencodeCatalog.js.map +1 -0
  223. package/dist/utils/opencodeExecutor.d.ts +3 -0
  224. package/dist/utils/opencodeExecutor.d.ts.map +1 -0
  225. package/dist/utils/opencodeExecutor.js +16 -0
  226. package/dist/utils/opencodeExecutor.js.map +1 -0
  227. package/dist/utils/timeoutManager.d.ts +2 -0
  228. package/dist/utils/timeoutManager.d.ts.map +1 -0
  229. package/dist/utils/timeoutManager.js +2 -0
  230. package/dist/utils/timeoutManager.js.map +1 -0
  231. package/dist/utils/worktrunkIsolation.d.ts +26 -0
  232. package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
  233. package/dist/utils/worktrunkIsolation.js +80 -0
  234. package/dist/utils/worktrunkIsolation.js.map +1 -0
  235. 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('&', '&amp;')
5
+ .replaceAll('<', '&lt;')
6
+ .replaceAll('>', '&gt;')
7
+ .replaceAll('"', '&quot;')
8
+ .replaceAll("'", '&apos;');
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"}