@0xmaxma/claude-gateway 1.7.9 → 1.8.0

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 (258) hide show
  1. package/README.md +178 -44
  2. package/dist/agent/builtin-commands.js +2 -2
  3. package/dist/agent/builtin-commands.js.map +1 -1
  4. package/dist/agent/dreaming/accept.d.ts.map +1 -1
  5. package/dist/agent/dreaming/accept.js +4 -1
  6. package/dist/agent/dreaming/accept.js.map +1 -1
  7. package/dist/agent/dreaming/config.d.ts.map +1 -1
  8. package/dist/agent/dreaming/config.js +2 -0
  9. package/dist/agent/dreaming/config.js.map +1 -1
  10. package/dist/agent/dreaming/reviewer.d.ts.map +1 -1
  11. package/dist/agent/dreaming/reviewer.js +9 -2
  12. package/dist/agent/dreaming/reviewer.js.map +1 -1
  13. package/dist/agent/dreaming/staleness.d.ts +7 -1
  14. package/dist/agent/dreaming/staleness.d.ts.map +1 -1
  15. package/dist/agent/dreaming/staleness.js +17 -2
  16. package/dist/agent/dreaming/staleness.js.map +1 -1
  17. package/dist/agent/dreaming/types.d.ts +17 -1
  18. package/dist/agent/dreaming/types.d.ts.map +1 -1
  19. package/dist/agent/knowledge/archive-db.d.ts +43 -0
  20. package/dist/agent/knowledge/archive-db.d.ts.map +1 -1
  21. package/dist/agent/knowledge/archive-db.js +130 -0
  22. package/dist/agent/knowledge/archive-db.js.map +1 -1
  23. package/dist/agent/knowledge/config.d.ts +3 -1
  24. package/dist/agent/knowledge/config.d.ts.map +1 -1
  25. package/dist/agent/knowledge/config.js +32 -10
  26. package/dist/agent/knowledge/config.js.map +1 -1
  27. package/dist/agent/knowledge/index.d.ts +11 -4
  28. package/dist/agent/knowledge/index.d.ts.map +1 -1
  29. package/dist/agent/knowledge/index.js +22 -1
  30. package/dist/agent/knowledge/index.js.map +1 -1
  31. package/dist/agent/knowledge/indexer.d.ts +0 -7
  32. package/dist/agent/knowledge/indexer.d.ts.map +1 -1
  33. package/dist/agent/knowledge/indexer.js +34 -7
  34. package/dist/agent/knowledge/indexer.js.map +1 -1
  35. package/dist/agent/knowledge/lifecycle.d.ts +20 -4
  36. package/dist/agent/knowledge/lifecycle.d.ts.map +1 -1
  37. package/dist/agent/knowledge/lifecycle.js +33 -4
  38. package/dist/agent/knowledge/lifecycle.js.map +1 -1
  39. package/dist/agent/knowledge/reflection.d.ts +114 -0
  40. package/dist/agent/knowledge/reflection.d.ts.map +1 -0
  41. package/dist/agent/knowledge/reflection.js +447 -0
  42. package/dist/agent/knowledge/reflection.js.map +1 -0
  43. package/dist/agent/knowledge/shared-dedup.d.ts +85 -0
  44. package/dist/agent/knowledge/shared-dedup.d.ts.map +1 -0
  45. package/dist/agent/knowledge/shared-dedup.js +187 -0
  46. package/dist/agent/knowledge/shared-dedup.js.map +1 -0
  47. package/dist/agent/knowledge/shared-promote.d.ts +82 -7
  48. package/dist/agent/knowledge/shared-promote.d.ts.map +1 -1
  49. package/dist/agent/knowledge/shared-promote.js +244 -11
  50. package/dist/agent/knowledge/shared-promote.js.map +1 -1
  51. package/dist/agent/knowledge/shared-staleness.d.ts +51 -0
  52. package/dist/agent/knowledge/shared-staleness.d.ts.map +1 -0
  53. package/dist/agent/knowledge/shared-staleness.js +149 -0
  54. package/dist/agent/knowledge/shared-staleness.js.map +1 -0
  55. package/dist/agent/knowledge/shared-writer.d.ts +19 -0
  56. package/dist/agent/knowledge/shared-writer.d.ts.map +1 -1
  57. package/dist/agent/knowledge/shared-writer.js +42 -0
  58. package/dist/agent/knowledge/shared-writer.js.map +1 -1
  59. package/dist/agent/knowledge/types.d.ts +24 -0
  60. package/dist/agent/knowledge/types.d.ts.map +1 -1
  61. package/dist/agent/model-catalog.d.ts +62 -0
  62. package/dist/agent/model-catalog.d.ts.map +1 -0
  63. package/dist/agent/model-catalog.js +264 -0
  64. package/dist/agent/model-catalog.js.map +1 -0
  65. package/dist/agent/runner.d.ts +83 -0
  66. package/dist/agent/runner.d.ts.map +1 -1
  67. package/dist/agent/runner.js +281 -51
  68. package/dist/agent/runner.js.map +1 -1
  69. package/dist/agent/workspace-loader.d.ts +17 -2
  70. package/dist/agent/workspace-loader.d.ts.map +1 -1
  71. package/dist/agent/workspace-loader.js +17 -1
  72. package/dist/agent/workspace-loader.js.map +1 -1
  73. package/dist/api/cron-router.d.ts +12 -8
  74. package/dist/api/cron-router.d.ts.map +1 -1
  75. package/dist/api/cron-router.js +82 -16
  76. package/dist/api/cron-router.js.map +1 -1
  77. package/dist/api/gateway-router.d.ts +4 -0
  78. package/dist/api/gateway-router.d.ts.map +1 -1
  79. package/dist/api/gateway-router.js +16 -1
  80. package/dist/api/gateway-router.js.map +1 -1
  81. package/dist/api/manifest-sources.d.ts +15 -0
  82. package/dist/api/manifest-sources.d.ts.map +1 -0
  83. package/dist/api/manifest-sources.js +27 -0
  84. package/dist/api/manifest-sources.js.map +1 -0
  85. package/dist/api/meta-router.d.ts +13 -0
  86. package/dist/api/meta-router.d.ts.map +1 -0
  87. package/dist/api/meta-router.js +26 -0
  88. package/dist/api/meta-router.js.map +1 -0
  89. package/dist/api/packages.d.ts.map +1 -1
  90. package/dist/api/packages.js +18 -198
  91. package/dist/api/packages.js.map +1 -1
  92. package/dist/api/route-registry.d.ts +81 -0
  93. package/dist/api/route-registry.d.ts.map +1 -0
  94. package/dist/api/route-registry.js +44 -0
  95. package/dist/api/route-registry.js.map +1 -0
  96. package/dist/api/router.d.ts.map +1 -1
  97. package/dist/api/router.js +21 -3
  98. package/dist/api/router.js.map +1 -1
  99. package/dist/apps/compose-generator.js +7 -4
  100. package/dist/apps/compose-generator.js.map +1 -1
  101. package/dist/apps/installer.d.ts +154 -0
  102. package/dist/apps/installer.d.ts.map +1 -1
  103. package/dist/apps/installer.js +657 -54
  104. package/dist/apps/installer.js.map +1 -1
  105. package/dist/cli/args.d.ts +25 -0
  106. package/dist/cli/args.d.ts.map +1 -0
  107. package/dist/cli/args.js +55 -0
  108. package/dist/cli/args.js.map +1 -0
  109. package/dist/cli/colors.d.ts +37 -0
  110. package/dist/cli/colors.d.ts.map +1 -0
  111. package/dist/cli/colors.js +63 -0
  112. package/dist/cli/colors.js.map +1 -0
  113. package/dist/cli/command-names.d.ts +98 -0
  114. package/dist/cli/command-names.d.ts.map +1 -0
  115. package/dist/cli/command-names.js +109 -0
  116. package/dist/cli/command-names.js.map +1 -0
  117. package/dist/cli/commands/agents.d.ts +28 -0
  118. package/dist/cli/commands/agents.d.ts.map +1 -0
  119. package/dist/cli/commands/agents.js +321 -0
  120. package/dist/cli/commands/agents.js.map +1 -0
  121. package/dist/cli/commands/channels.d.ts +17 -0
  122. package/dist/cli/commands/channels.d.ts.map +1 -0
  123. package/dist/cli/commands/channels.js +101 -0
  124. package/dist/cli/commands/channels.js.map +1 -0
  125. package/dist/cli/commands/debug-bundle.d.ts +6 -0
  126. package/dist/cli/commands/debug-bundle.d.ts.map +1 -0
  127. package/dist/cli/commands/debug-bundle.js +220 -0
  128. package/dist/cli/commands/debug-bundle.js.map +1 -0
  129. package/dist/cli/commands/doctor.d.ts +3 -0
  130. package/dist/cli/commands/doctor.d.ts.map +1 -0
  131. package/dist/cli/commands/doctor.js +104 -0
  132. package/dist/cli/commands/doctor.js.map +1 -0
  133. package/dist/cli/commands/gateway.d.ts +12 -0
  134. package/dist/cli/commands/gateway.d.ts.map +1 -0
  135. package/dist/cli/commands/gateway.js +145 -0
  136. package/dist/cli/commands/gateway.js.map +1 -0
  137. package/dist/cli/commands/service.d.ts +33 -0
  138. package/dist/cli/commands/service.d.ts.map +1 -0
  139. package/dist/cli/commands/service.js +513 -0
  140. package/dist/cli/commands/service.js.map +1 -0
  141. package/dist/cli/commands/update.d.ts +16 -0
  142. package/dist/cli/commands/update.d.ts.map +1 -0
  143. package/dist/cli/commands/update.js +149 -0
  144. package/dist/cli/commands/update.js.map +1 -0
  145. package/dist/cli/commands.generated.d.ts +4 -0
  146. package/dist/cli/commands.generated.d.ts.map +1 -0
  147. package/dist/cli/commands.generated.js +220 -0
  148. package/dist/cli/commands.generated.js.map +1 -0
  149. package/dist/cli/health.d.ts +31 -0
  150. package/dist/cli/health.d.ts.map +1 -0
  151. package/dist/cli/health.js +49 -0
  152. package/dist/cli/health.js.map +1 -0
  153. package/dist/cli/http-client.d.ts +140 -0
  154. package/dist/cli/http-client.d.ts.map +1 -0
  155. package/dist/cli/http-client.js +332 -0
  156. package/dist/cli/http-client.js.map +1 -0
  157. package/dist/cli/index.d.ts +27 -0
  158. package/dist/cli/index.d.ts.map +1 -0
  159. package/dist/cli/index.js +372 -0
  160. package/dist/cli/index.js.map +1 -0
  161. package/dist/cli/manager.d.ts +64 -0
  162. package/dist/cli/manager.d.ts.map +1 -0
  163. package/dist/cli/manager.js +181 -0
  164. package/dist/cli/manager.js.map +1 -0
  165. package/dist/cli/output.d.ts +49 -0
  166. package/dist/cli/output.d.ts.map +1 -0
  167. package/dist/cli/output.js +101 -0
  168. package/dist/cli/output.js.map +1 -0
  169. package/dist/cli/prompt.d.ts +29 -0
  170. package/dist/cli/prompt.d.ts.map +1 -0
  171. package/dist/cli/prompt.js +154 -0
  172. package/dist/cli/prompt.js.map +1 -0
  173. package/dist/cli/redact.d.ts +3 -0
  174. package/dist/cli/redact.d.ts.map +1 -0
  175. package/dist/cli/redact.js +33 -0
  176. package/dist/cli/redact.js.map +1 -0
  177. package/dist/cli/types.d.ts +22 -0
  178. package/dist/cli/types.d.ts.map +1 -0
  179. package/dist/cli/types.js +4 -0
  180. package/dist/cli/types.js.map +1 -0
  181. package/dist/config/bootstrap.d.ts +33 -0
  182. package/dist/config/bootstrap.d.ts.map +1 -0
  183. package/dist/config/bootstrap.js +117 -0
  184. package/dist/config/bootstrap.js.map +1 -0
  185. package/dist/config/loader.d.ts.map +1 -1
  186. package/dist/config/loader.js +5 -1
  187. package/dist/config/loader.js.map +1 -1
  188. package/dist/config/watcher.d.ts.map +1 -1
  189. package/dist/config/watcher.js +2 -35
  190. package/dist/config/watcher.js.map +1 -1
  191. package/dist/discord/receiver.d.ts +6 -1
  192. package/dist/discord/receiver.d.ts.map +1 -1
  193. package/dist/discord/receiver.js +9 -1
  194. package/dist/discord/receiver.js.map +1 -1
  195. package/dist/entry.d.ts +3 -0
  196. package/dist/entry.d.ts.map +1 -0
  197. package/dist/entry.js +83 -0
  198. package/dist/entry.js.map +1 -0
  199. package/dist/index.js +197 -47
  200. package/dist/index.js.map +1 -1
  201. package/dist/load-dotenv.d.ts +2 -0
  202. package/dist/load-dotenv.d.ts.map +1 -0
  203. package/dist/load-dotenv.js +68 -0
  204. package/dist/load-dotenv.js.map +1 -0
  205. package/dist/packages/registry.d.ts +50 -0
  206. package/dist/packages/registry.d.ts.map +1 -0
  207. package/dist/packages/registry.js +209 -0
  208. package/dist/packages/registry.js.map +1 -0
  209. package/dist/session/process.d.ts +20 -3
  210. package/dist/session/process.d.ts.map +1 -1
  211. package/dist/session/process.js +120 -5
  212. package/dist/session/process.js.map +1 -1
  213. package/dist/shell/claude-pty-shell.js +146 -27
  214. package/dist/shell/claude-pty-shell.js.map +1 -1
  215. package/dist/shell/draft-phantom.d.ts +49 -0
  216. package/dist/shell/draft-phantom.d.ts.map +1 -0
  217. package/dist/shell/draft-phantom.js +59 -0
  218. package/dist/shell/draft-phantom.js.map +1 -0
  219. package/dist/shell/submit-diag.d.ts +67 -0
  220. package/dist/shell/submit-diag.d.ts.map +1 -0
  221. package/dist/shell/submit-diag.js +69 -0
  222. package/dist/shell/submit-diag.js.map +1 -0
  223. package/dist/shutdown-signals.d.ts +47 -0
  224. package/dist/shutdown-signals.d.ts.map +1 -0
  225. package/dist/shutdown-signals.js +62 -0
  226. package/dist/shutdown-signals.js.map +1 -0
  227. package/dist/telegram/receiver.d.ts +6 -1
  228. package/dist/telegram/receiver.d.ts.map +1 -1
  229. package/dist/telegram/receiver.js +9 -1
  230. package/dist/telegram/receiver.js.map +1 -1
  231. package/dist/types.d.ts +25 -0
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/utils/orphan-receivers.d.ts +90 -0
  234. package/dist/utils/orphan-receivers.d.ts.map +1 -0
  235. package/dist/utils/orphan-receivers.js +218 -0
  236. package/dist/utils/orphan-receivers.js.map +1 -0
  237. package/dist/utils/paths.d.ts +16 -0
  238. package/dist/utils/paths.d.ts.map +1 -0
  239. package/dist/utils/paths.js +60 -0
  240. package/dist/utils/paths.js.map +1 -0
  241. package/dist/utils/stop-child.d.ts +21 -0
  242. package/dist/utils/stop-child.d.ts.map +1 -0
  243. package/dist/utils/stop-child.js +64 -0
  244. package/dist/utils/stop-child.js.map +1 -0
  245. package/lib/pairing.ts +1 -1
  246. package/mcp/tools/agent/handlers.ts +1 -1
  247. package/mcp/tools/discord/module.ts +23 -15
  248. package/mcp/tools/discord/receiver-server.ts +4 -0
  249. package/mcp/tools/memory/archive-reader.test.ts +25 -1
  250. package/mcp/tools/memory/archive-reader.ts +70 -12
  251. package/mcp/tools/memory/archive-writer.test.ts +168 -0
  252. package/mcp/tools/memory/archive-writer.ts +137 -0
  253. package/mcp/tools/memory/module.test.ts +187 -0
  254. package/mcp/tools/memory/module.ts +192 -6
  255. package/mcp/tools/telegram/module.ts +10 -2
  256. package/mcp/tools/telegram/receiver-server.ts +15 -6
  257. package/mcp/tools/telegram/typing.ts +178 -34
  258. package/package.json +6 -4
@@ -0,0 +1,372 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CORE_HELP = exports.NOUN_NAME_W = exports.NAME_W = void 0;
37
+ exports.runCli = runCli;
38
+ exports.helpRow = helpRow;
39
+ const path = __importStar(require("path"));
40
+ const args_1 = require("./args");
41
+ const commands_generated_1 = require("./commands.generated");
42
+ const http_client_1 = require("./http-client");
43
+ const output_1 = require("./output");
44
+ const colors_1 = require("./colors");
45
+ const gateway_1 = require("./commands/gateway");
46
+ const service_1 = require("./commands/service");
47
+ const update_1 = require("./commands/update");
48
+ const doctor_1 = require("./commands/doctor");
49
+ const debug_bundle_1 = require("./commands/debug-bundle");
50
+ const agents_1 = require("./commands/agents");
51
+ const channels_1 = require("./commands/channels");
52
+ /** Flags that are always boolean regardless of command — never consume the next
53
+ * token as a value (see parseCliArgs). */
54
+ const GLOBAL_BOOLEAN_FLAGS = new Set(['help', 'json', 'yes', 'print']);
55
+ /** Flags every command accepts, on top of whatever the generated manifest
56
+ * declares for that command. Anything outside this set and the command's own
57
+ * flags is a typo, and is reported rather than dropped: a resource command
58
+ * builds its query/body from `cmd.flags` alone, so an unrecognised flag would
59
+ * otherwise be parsed, ignored, and reported as success. */
60
+ const GLOBAL_FLAG_NAMES = new Set([
61
+ ...GLOBAL_BOOLEAN_FLAGS,
62
+ 'url',
63
+ 'key',
64
+ 'config',
65
+ 'data',
66
+ ]);
67
+ const HELP_ALIASES = new Set(['help', '--help', '-h']);
68
+ const VERSION_ALIASES = new Set(['version', '--version', '-V']);
69
+ /**
70
+ * CLI entry point. Returns a process exit code. Never boots the server — the
71
+ * boot entry (src/index.ts) only calls this when argv[2] is a CLI command.
72
+ *
73
+ * Convention: stdout carries the command's result (JSON, pretty by default or
74
+ * compact with `--json`); human-facing help and errors go to stderr, so result
75
+ * output is never polluted.
76
+ */
77
+ async function runCli(argv) {
78
+ const [command, ...rest] = argv;
79
+ const { positionals, flags } = (0, args_1.parseCliArgs)(rest, GLOBAL_BOOLEAN_FLAGS);
80
+ const wantHelp = flags.help === true;
81
+ if (!command || HELP_ALIASES.has(command)) {
82
+ printGeneralHelp(true);
83
+ return 0;
84
+ }
85
+ if (VERSION_ALIASES.has(command)) {
86
+ process.stdout.write(readVersion() + '\n');
87
+ return 0;
88
+ }
89
+ // Flags with no command (`claude-gateway --config /etc/cg.json`) — the shape
90
+ // old service units used. There is nothing to run, so this is the same
91
+ // "here's what I can do" answer as a bare invocation, never a server boot.
92
+ if (command.startsWith('-')) {
93
+ printGeneralHelp(true);
94
+ return 0;
95
+ }
96
+ const config = (0, http_client_1.loadCliConfig)(typeof flags.config === 'string' ? flags.config : undefined);
97
+ try {
98
+ switch (command) {
99
+ case 'api':
100
+ return await runApiPassthrough(positionals, flags, config);
101
+ case 'gateway':
102
+ return await (0, gateway_1.runGatewayLifecycle)(positionals, flags, config);
103
+ case 'service':
104
+ return await (0, service_1.runService)(positionals, flags, config);
105
+ case 'update':
106
+ return await (0, update_1.runUpdate)('claude-gateway', positionals, flags);
107
+ case 'claude':
108
+ return await (0, update_1.runClaude)(positionals, flags);
109
+ case 'doctor':
110
+ return await (0, doctor_1.runDoctor)(flags, config);
111
+ case 'debug-bundle':
112
+ return await (0, debug_bundle_1.runDebugBundle)(flags);
113
+ case 'agents':
114
+ return await (0, agents_1.runAgents)(positionals, flags, config);
115
+ case 'channels':
116
+ return await (0, channels_1.runChannels)(positionals, flags, config);
117
+ }
118
+ // Resource nouns (generated).
119
+ if (!commands_generated_1.GENERATED_NOUNS.includes(command)) {
120
+ process.stderr.write(`Unknown command: ${command}\n\n`);
121
+ printGeneralHelp(false);
122
+ return 1;
123
+ }
124
+ return await runResourceCommand(command, rest, wantHelp, config);
125
+ }
126
+ catch (err) {
127
+ process.stderr.write(`Error: ${err.message}\n`);
128
+ return 1;
129
+ }
130
+ }
131
+ async function runResourceCommand(noun, rest, wantHelp, config) {
132
+ // First pass just to find the verb — a plain positional, so it parses the
133
+ // same regardless of which flags turn out to be boolean for this command.
134
+ const verb = (0, args_1.parseCliArgs)(rest, GLOBAL_BOOLEAN_FLAGS).positionals[0];
135
+ if (!verb) {
136
+ // `crons --help` is a help request (exit 0); a bare `crons` is a usage
137
+ // error (exit 1) even though both print the same listing.
138
+ printNounHelp(noun, wantHelp);
139
+ return wantHelp ? 0 : 1;
140
+ }
141
+ const cmd = commands_generated_1.GENERATED_COMMANDS.find((c) => c.noun === noun && c.verb === verb);
142
+ if (!cmd) {
143
+ process.stderr.write(`Unknown command: ${noun} ${verb}\n\n`);
144
+ printNounHelp(noun, false);
145
+ return 1;
146
+ }
147
+ if (wantHelp) {
148
+ printCommandHelp(cmd, true);
149
+ return 0;
150
+ }
151
+ // Re-parse now that the command's own boolean flags (e.g. `--force`) are
152
+ // known, so one placed right before a positional doesn't swallow it.
153
+ const booleanFlags = new Set([...GLOBAL_BOOLEAN_FLAGS, ...cmd.flags.filter((f) => f.boolean).map((f) => f.name)]);
154
+ const { positionals, flags } = (0, args_1.parseCliArgs)(rest, booleanFlags);
155
+ const restPositionals = positionals.slice(1);
156
+ // Positional path args
157
+ if (restPositionals.length < cmd.args.length) {
158
+ const missing = cmd.args.slice(restPositionals.length).map((a) => `<${a}>`).join(' ');
159
+ process.stderr.write(`Missing argument(s): ${missing}\n\n`);
160
+ printCommandHelp(cmd, false);
161
+ return 1;
162
+ }
163
+ let apiPath = cmd.path;
164
+ cmd.args.forEach((argName, idx) => {
165
+ apiPath = apiPath.replace(`:${argName}`, encodeURIComponent(restPositionals[idx]));
166
+ });
167
+ // Flags → query / body
168
+ const query = {};
169
+ let body;
170
+ if (typeof flags.data === 'string') {
171
+ let parsed;
172
+ try {
173
+ parsed = JSON.parse(flags.data);
174
+ }
175
+ catch {
176
+ process.stderr.write('Invalid --data: must be a JSON object.\n');
177
+ return 1;
178
+ }
179
+ // `JSON.parse` also accepts primitives and arrays. Merging flags into one
180
+ // of those throws further down (`'name' in 5`), surfacing a TypeError
181
+ // instead of the message above.
182
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
183
+ process.stderr.write('Invalid --data: must be a JSON object.\n');
184
+ return 1;
185
+ }
186
+ body = parsed;
187
+ }
188
+ const known = new Set([...GLOBAL_FLAG_NAMES, ...cmd.flags.map((f) => f.name)]);
189
+ const unknown = Object.keys(flags).filter((name) => !known.has(name));
190
+ if (unknown.length) {
191
+ // Same treatment as an unknown verb: refuse and show what is accepted. A
192
+ // mistyped flag used to reach the API as a missing field (`crons create
193
+ // --schedul ...` created a job with no schedule) or, on a command whose
194
+ // manifest declares no flags, as an empty body the server applied as a
195
+ // no-op — both exiting 0 as though they had worked.
196
+ process.stderr.write(`Unknown flag(s): ${unknown.map((f) => `--${f}`).join(' ')}\n\n`);
197
+ printCommandHelp(cmd, false);
198
+ return 1;
199
+ }
200
+ const missingRequired = [];
201
+ for (const f of cmd.flags) {
202
+ const val = flags[f.name];
203
+ if (val === undefined) {
204
+ if (f.required && !(body && f.name in body))
205
+ missingRequired.push(`--${f.name}`);
206
+ continue;
207
+ }
208
+ if (f.in === 'query') {
209
+ query[f.name] = String(val);
210
+ }
211
+ else {
212
+ body = body ?? {};
213
+ body[f.name] = f.boolean ? val === true || val === 'true' : val;
214
+ }
215
+ }
216
+ if (missingRequired.length) {
217
+ process.stderr.write(`Missing required flag(s): ${missingRequired.join(' ')}\n\n`);
218
+ printCommandHelp(cmd, false);
219
+ return 1;
220
+ }
221
+ const { baseUrl, fallbackUrl } = (0, http_client_1.resolveUrlPlan)({ flagUrl: strFlag(flags.url), env: process.env, config });
222
+ const key = (0, http_client_1.resolveKey)({ flagKey: strFlag(flags.key), env: process.env, config });
223
+ const result = await (0, http_client_1.request)({
224
+ method: cmd.method,
225
+ path: apiPath,
226
+ baseUrl,
227
+ fallbackBaseUrl: fallbackUrl,
228
+ key,
229
+ query,
230
+ body: cmd.method === 'GET' ? undefined : body,
231
+ });
232
+ (0, output_1.printResult)(result.data, flags.json === true);
233
+ return 0;
234
+ }
235
+ async function runApiPassthrough(positionals, flags, config) {
236
+ const method = (positionals[0] || '').toUpperCase();
237
+ const apiPath = positionals[1];
238
+ if (!method || !apiPath || flags.help === true) {
239
+ // An explicit `--help` succeeds; missing arguments are a usage error.
240
+ (0, output_1.writeCommandHelp)(flags.help === true, 'api', 'call any gateway endpoint directly (escape hatch)', 'claude-gateway api <METHOD> <path> [--data <json>] [--query k=v]');
241
+ return flags.help === true ? 0 : 1;
242
+ }
243
+ if (!apiPath.startsWith('/')) {
244
+ process.stderr.write('Path must start with "/" (e.g. /v1/agents)\n');
245
+ return 1;
246
+ }
247
+ let body;
248
+ if (typeof flags.data === 'string') {
249
+ try {
250
+ body = JSON.parse(flags.data);
251
+ }
252
+ catch {
253
+ process.stderr.write('Invalid --data: must be valid JSON.\n');
254
+ return 1;
255
+ }
256
+ }
257
+ const { baseUrl, fallbackUrl } = (0, http_client_1.resolveUrlPlan)({ flagUrl: strFlag(flags.url), env: process.env, config });
258
+ const key = (0, http_client_1.resolveKey)({ flagKey: strFlag(flags.key), env: process.env, config });
259
+ const result = await (0, http_client_1.request)({ method, path: apiPath, baseUrl, fallbackBaseUrl: fallbackUrl, key, body });
260
+ (0, output_1.printResult)(result.data, flags.json === true);
261
+ return 0;
262
+ }
263
+ // ─── helpers ──────────────────────────────────────────────────────────────────
264
+ function strFlag(v) {
265
+ return typeof v === 'string' ? v : undefined;
266
+ }
267
+ function readVersion() {
268
+ try {
269
+ // dist/cli/index.js → package.json at the package root
270
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
271
+ return require(path.join(__dirname, '..', '..', 'package.json')).version;
272
+ }
273
+ catch {
274
+ return 'unknown';
275
+ }
276
+ }
277
+ function usageFor(c) {
278
+ const positionals = c.args.map((a) => `<${a}>`).join(' ');
279
+ const flagStr = c.flags
280
+ .map((f) => (f.boolean ? `[--${f.name}]` : f.required ? `--${f.name} <v>` : `[--${f.name} <v>]`))
281
+ .join(' ');
282
+ return `${c.noun} ${c.verb}${positionals ? ' ' + positionals : ''}${flagStr ? ' ' + flagStr : ''}`.trim();
283
+ }
284
+ /** Two-column rows in the general help. The name column is padded to
285
+ * NAME_W; a name wider than that puts its description on the next line.
286
+ * Wide enough for the longest name (`service install|status|uninstall`, 32)
287
+ * plus a readable gap, so no core command wraps. Exported for the test that
288
+ * holds this table and the dispatcher to the same set of commands. */
289
+ exports.NAME_W = 36;
290
+ /** Usage strings in a resource noun's help (`crons list --limit <v>`) run much
291
+ * longer than a core command name, so that listing gets its own width. */
292
+ exports.NOUN_NAME_W = 48;
293
+ exports.CORE_HELP = [
294
+ ['gateway status|restart|stop', 'Manage the gateway process (manager-aware)'],
295
+ ['service install|status|uninstall', 'Run the gateway as a systemd-user or PM2 service'],
296
+ ['update [check]', 'Check for / install a newer claude-gateway'],
297
+ ['claude version|update [check]', 'Inspect / update the Claude Code binary'],
298
+ ['doctor', 'Check config/env/connectivity'],
299
+ ['debug-bundle', 'Write a small redacted diagnostics bundle'],
300
+ ['agents list|create|update', 'Create/manage agents (interactive wizard)'],
301
+ ['channels pending|approve|deny', 'Approve/deny incoming Telegram/Discord pairing requests'],
302
+ ['api <METHOD> <path>', 'Call any endpoint directly (escape hatch)'],
303
+ ['version', 'Print the gateway version'],
304
+ ];
305
+ /** Render one ` name description` row, padding before colouring so ANSI
306
+ * escapes never count toward the column width. A name at or past `width` puts
307
+ * its description on the next line, aligned with the others, rather than
308
+ * pushing it out of the column — which is what the two-line form is for.
309
+ * Shared by every help listing so they cannot drift apart. */
310
+ function helpRow(name, desc, paint, width = exports.NAME_W) {
311
+ if (name.length >= width)
312
+ return [` ${paint(name)}`, ` ${' '.repeat(width)}${desc}`];
313
+ return [` ${paint(name.padEnd(width))}${desc}`];
314
+ }
315
+ function printGeneralHelp(requested) {
316
+ const nouns = [...commands_generated_1.GENERATED_NOUNS].sort();
317
+ const stream = (0, output_1.helpStream)(requested);
318
+ const c = (0, colors_1.paletteFor)(stream);
319
+ // readVersion() falls back to 'unknown'; render that as a plain banner rather than "vunknown".
320
+ const version = readVersion();
321
+ // The brand tone is reserved for this banner — the one place the program
322
+ // introduces itself. Elsewhere the name is just bold, so colour stays a
323
+ // signal rather than decoration.
324
+ const name = c.brand('claude-gateway');
325
+ const banner = version === 'unknown'
326
+ ? `${name} — control a running gateway from the command line`
327
+ : `${name} ${c.dim(`v${version}`)} — control a running gateway from the command line`;
328
+ const lines = [
329
+ banner,
330
+ '',
331
+ `${c.bold('Usage:')} claude-gateway <command> [args] [--flags]`,
332
+ '',
333
+ c.bold('Start the gateway in the foreground:'),
334
+ ...helpRow('gateway start', 'Start the gateway server (the only command that boots it)', c.green),
335
+ '',
336
+ c.bold('Core commands:'),
337
+ ...exports.CORE_HELP.flatMap(([n, d]) => helpRow(n, d, c.cyan)),
338
+ '',
339
+ `${c.bold('Resource commands:')} ${nouns.map((n) => c.cyan(n)).join(', ')}`,
340
+ ` Run \`claude-gateway <resource> --help\` for its verbs.`,
341
+ '',
342
+ `${c.bold('Global flags:')} --url <url> --key <key> --json (compact/minified output) --data <json> --help`,
343
+ ];
344
+ stream.write(lines.join('\n') + '\n');
345
+ }
346
+ function printNounHelp(noun, requested) {
347
+ const cmds = commands_generated_1.GENERATED_COMMANDS.filter((c) => c.noun === noun);
348
+ const stream = (0, output_1.helpStream)(requested);
349
+ const p = (0, colors_1.paletteFor)(stream);
350
+ const lines = [`${p.bold('claude-gateway')} ${p.cyan(noun)} — commands:`, ''];
351
+ for (const c of cmds)
352
+ lines.push(...helpRow(usageFor(c), c.summary, p.cyan, exports.NOUN_NAME_W));
353
+ stream.write(lines.join('\n') + '\n');
354
+ }
355
+ function printCommandHelp(c, requested) {
356
+ const stream = (0, output_1.helpStream)(requested);
357
+ const p = (0, colors_1.paletteFor)(stream);
358
+ const lines = [
359
+ `${p.bold('claude-gateway')} ${p.cyan(usageFor(c))}`,
360
+ '',
361
+ ` ${c.summary}`,
362
+ ` ${p.dim(`${c.method} ${c.path} (auth: ${c.auth})`)}`,
363
+ ];
364
+ if (c.flags.length) {
365
+ lines.push('', ` ${p.bold('Flags:')}`);
366
+ for (const f of c.flags) {
367
+ lines.push(` --${f.name.padEnd(16)} ${f.in}${f.required ? ' (required)' : ''} ${f.description ?? ''}`.trimEnd());
368
+ }
369
+ }
370
+ stream.write(lines.join('\n') + '\n');
371
+ }
372
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /** Which process manager owns the running gateway. User systemd is preferred
2
+ * because `service systemd install` deliberately creates a user-scoped unit. */
3
+ export type Manager = 'systemd-user' | 'systemd-system' | 'pm2' | 'foreground' | 'unknown';
4
+ export declare function defaultPidfilePath(): string;
5
+ export interface DetectDeps {
6
+ /** Run a trusted manager command and return stdout; injectable for tests. */
7
+ exec?: (args: string[]) => string;
8
+ pidfilePath?: string;
9
+ /** True if a process with this pid is alive; injectable for tests. */
10
+ isAlive?: (pid: number) => boolean;
11
+ readPidfile?: (p: string) => string | null;
12
+ /** The command line of a live process, or null when it cannot be read;
13
+ * injectable for tests. See pidLooksLikeGateway(). */
14
+ readCmdline?: (pid: number) => string | null;
15
+ }
16
+ /**
17
+ * Best-effort check that `pid` is a gateway and not an unrelated process that
18
+ * inherited a recycled pid.
19
+ *
20
+ * readLocalGateway() deliberately stops at signal-0 — it runs on every CLI
21
+ * invocation and must stay cheap — but that only proves *something* holds the
22
+ * pid. A gateway lost to SIGKILL or the OOM killer leaves its pidfile behind,
23
+ * and once the kernel reuses that pid, anything reading the file would call a
24
+ * stranger "the gateway". Only callers about to act on the pid destructively
25
+ * (`gateway stop`, `gateway restart`) pay for this second check.
26
+ *
27
+ * Returns false when the command line cannot be read at all: an unverifiable
28
+ * pid is treated as not-a-gateway, because the cost of being wrong is
29
+ * terminating someone else's process.
30
+ */
31
+ export declare function pidLooksLikeGateway(pid: number, deps?: Pick<DetectDeps, 'readCmdline'>): boolean;
32
+ /**
33
+ * Detect the manager that currently owns the gateway, in priority order:
34
+ * user-systemd → system-systemd (legacy external install) → PM2 → foreground.
35
+ * Commands use fixed argument arrays, never user-controlled shell fragments.
36
+ */
37
+ export declare function detectManager(deps?: DetectDeps): Manager;
38
+ /** A gateway process running on this host, as recorded by its pidfile. */
39
+ export interface LocalGateway {
40
+ pid: number;
41
+ /** The port it is listening on, when the pidfile records one. Absent for a
42
+ * pidfile written by an older version (pid only). */
43
+ port?: number;
44
+ }
45
+ /**
46
+ * The gateway process alive on THIS host, per the pidfile the server writes on
47
+ * boot, or null when there is none. Every manager runs the same entry point, so
48
+ * the pidfile is present under systemd and PM2 too, not only in the foreground.
49
+ *
50
+ * Pidfile format is one field per line: pid, then the listening port. The port
51
+ * matters because the CLI cannot otherwise know it — `$PORT` is set in whatever
52
+ * shell launched the server, not necessarily in the one running the CLI, so
53
+ * deriving the port from the CLI's own environment can address a port nothing
54
+ * listens on. A pidfile from an older version has no second line; the port is
55
+ * then simply unknown and callers fall back to the environment.
56
+ *
57
+ * Deliberately cheap — one file read and one signal-0 — because `resolveUrl()`
58
+ * consults it on every CLI invocation. `detectManager()` is not usable there:
59
+ * it shells out to systemctl and pm2.
60
+ */
61
+ export declare function readLocalGateway(deps?: Pick<DetectDeps, 'pidfilePath' | 'isAlive' | 'readPidfile'>): LocalGateway | null;
62
+ /** True when a gateway process is alive on this host. See readLocalGateway(). */
63
+ export declare function localGatewayIsLive(deps?: Pick<DetectDeps, 'pidfilePath' | 'isAlive' | 'readPidfile'>): boolean;
64
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cli/manager.ts"],"names":[],"mappings":"AAKA;gFACgF;AAChF,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,gBAAgB,GAAG,KAAK,GAAG,YAAY,GAAG,SAAS,CAAC;AAE3F,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC3C;2DACuD;IACvD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC9C;AAiCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,IAAI,CAAC,UAAU,EAAE,aAAa,CAAM,GAAG,OAAO,CAOpG;AAUD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CA2B5D;AAED,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ;0DACsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,CAAM,GAAG,YAAY,GAAG,IAAI,CAY5H;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,GAAG,aAAa,CAAM,GAAG,OAAO,CAElH"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.defaultPidfilePath = defaultPidfilePath;
37
+ exports.pidLooksLikeGateway = pidLooksLikeGateway;
38
+ exports.detectManager = detectManager;
39
+ exports.readLocalGateway = readLocalGateway;
40
+ exports.localGatewayIsLive = localGatewayIsLive;
41
+ const child_process_1 = require("child_process");
42
+ const fs = __importStar(require("fs"));
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ function defaultPidfilePath() {
46
+ return path.join(os.homedir(), '.claude-gateway', 'gateway.pid');
47
+ }
48
+ function realExec(args) {
49
+ const [file, ...argv] = args;
50
+ return (0, child_process_1.execFileSync)(file, argv, { stdio: ['ignore', 'pipe', 'ignore'] }).toString();
51
+ }
52
+ function realIsAlive(pid) {
53
+ try {
54
+ process.kill(pid, 0);
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ /** Process command line, NUL-separated on Linux, space-joined elsewhere.
62
+ * `/proc` first because it needs no subprocess; `ps` covers macOS/BSD. */
63
+ function realReadCmdline(pid) {
64
+ try {
65
+ return fs.readFileSync(`/proc/${pid}/cmdline`, 'utf8').replace(/\0/g, ' ').trim();
66
+ }
67
+ catch {
68
+ /* not Linux, or the process is gone — fall through to ps */
69
+ }
70
+ try {
71
+ return (0, child_process_1.execFileSync)('ps', ['-o', 'command=', '-p', String(pid)], { stdio: ['ignore', 'pipe', 'ignore'] })
72
+ .toString()
73
+ .trim();
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ /**
80
+ * Best-effort check that `pid` is a gateway and not an unrelated process that
81
+ * inherited a recycled pid.
82
+ *
83
+ * readLocalGateway() deliberately stops at signal-0 — it runs on every CLI
84
+ * invocation and must stay cheap — but that only proves *something* holds the
85
+ * pid. A gateway lost to SIGKILL or the OOM killer leaves its pidfile behind,
86
+ * and once the kernel reuses that pid, anything reading the file would call a
87
+ * stranger "the gateway". Only callers about to act on the pid destructively
88
+ * (`gateway stop`, `gateway restart`) pay for this second check.
89
+ *
90
+ * Returns false when the command line cannot be read at all: an unverifiable
91
+ * pid is treated as not-a-gateway, because the cost of being wrong is
92
+ * terminating someone else's process.
93
+ */
94
+ function pidLooksLikeGateway(pid, deps = {}) {
95
+ const cmdline = (deps.readCmdline ?? realReadCmdline)(pid);
96
+ if (!cmdline)
97
+ return false;
98
+ // Either the installed binary/package path, or a checkout started straight
99
+ // from its entry point (`node /opt/gw/dist/index.js gateway start`), whose
100
+ // directory need not be named after the project.
101
+ return /claude-gateway/.test(cmdline) || /(^|[\\/])(dist|src)[\\/]index\.(js|ts)\b/.test(cmdline);
102
+ }
103
+ function realReadPidfile(p) {
104
+ try {
105
+ return fs.readFileSync(p, 'utf8');
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Detect the manager that currently owns the gateway, in priority order:
113
+ * user-systemd → system-systemd (legacy external install) → PM2 → foreground.
114
+ * Commands use fixed argument arrays, never user-controlled shell fragments.
115
+ */
116
+ function detectManager(deps = {}) {
117
+ const exec = deps.exec ?? realExec;
118
+ const isAlive = deps.isAlive ?? realIsAlive;
119
+ const readPidfile = deps.readPidfile ?? realReadPidfile;
120
+ try {
121
+ if (exec(['systemctl', '--user', 'is-active', 'claude-gateway.service']).trim() === 'active')
122
+ return 'systemd-user';
123
+ }
124
+ catch {
125
+ /* no reachable user manager or inactive unit */
126
+ }
127
+ try {
128
+ if (exec(['systemctl', 'is-active', 'claude-gateway.service']).trim() === 'active')
129
+ return 'systemd-system';
130
+ }
131
+ catch {
132
+ /* system service absent or inactive */
133
+ }
134
+ try {
135
+ const pid = exec(['pm2', 'pid', 'gateway']).trim();
136
+ if (/^\d+$/.test(pid) && Number(pid) > 0)
137
+ return 'pm2';
138
+ }
139
+ catch {
140
+ /* pm2 absent or process not found */
141
+ }
142
+ if (localGatewayIsLive({ pidfilePath: deps.pidfilePath, isAlive, readPidfile }))
143
+ return 'foreground';
144
+ return 'unknown';
145
+ }
146
+ /**
147
+ * The gateway process alive on THIS host, per the pidfile the server writes on
148
+ * boot, or null when there is none. Every manager runs the same entry point, so
149
+ * the pidfile is present under systemd and PM2 too, not only in the foreground.
150
+ *
151
+ * Pidfile format is one field per line: pid, then the listening port. The port
152
+ * matters because the CLI cannot otherwise know it — `$PORT` is set in whatever
153
+ * shell launched the server, not necessarily in the one running the CLI, so
154
+ * deriving the port from the CLI's own environment can address a port nothing
155
+ * listens on. A pidfile from an older version has no second line; the port is
156
+ * then simply unknown and callers fall back to the environment.
157
+ *
158
+ * Deliberately cheap — one file read and one signal-0 — because `resolveUrl()`
159
+ * consults it on every CLI invocation. `detectManager()` is not usable there:
160
+ * it shells out to systemctl and pm2.
161
+ */
162
+ function readLocalGateway(deps = {}) {
163
+ const isAlive = deps.isAlive ?? realIsAlive;
164
+ const readPidfile = deps.readPidfile ?? realReadPidfile;
165
+ const raw = readPidfile(deps.pidfilePath ?? defaultPidfilePath());
166
+ if (!raw)
167
+ return null;
168
+ const [pidLine, portLine] = raw.split('\n');
169
+ const pid = parseInt((pidLine ?? '').trim(), 10);
170
+ if (!(pid > 0) || !isAlive(pid))
171
+ return null;
172
+ const port = parseInt((portLine ?? '').trim(), 10);
173
+ // Port 0 means "let the OS choose" and is never a dialable address, so it is
174
+ // treated as unrecorded rather than written into a URL.
175
+ return { pid, port: port > 0 && port < 65536 ? port : undefined };
176
+ }
177
+ /** True when a gateway process is alive on this host. See readLocalGateway(). */
178
+ function localGatewayIsLive(deps = {}) {
179
+ return readLocalGateway(deps) !== null;
180
+ }
181
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cli/manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gDAEC;AA4DD,kDAOC;AAeD,sCA2BC;AA0BD,4CAYC;AAGD,gDAEC;AAnKD,iDAA6C;AAC7C,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAM7B,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AACnE,CAAC;AAcD,SAAS,QAAQ,CAAC,IAAc;IAC9B,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7B,OAAO,IAAA,4BAAY,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,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;2EAC2E;AAC3E,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAA,4BAAY,EAAC,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;aACtG,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,mBAAmB,CAAC,GAAW,EAAE,OAAwC,EAAE;IACzF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,2EAA2E;IAC3E,2EAA2E;IAC3E,iDAAiD;IACjD,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAAC,OAAmB,EAAE;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC;IAExD,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ;YAAE,OAAO,cAAc,CAAC;IACtH,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ;YAAE,OAAO,gBAAgB,CAAC;IAC9G,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IAED,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAAE,OAAO,YAAY,CAAC;IAErG,OAAO,SAAS,CAAC;AACnB,CAAC;AAUD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,gBAAgB,CAAC,OAAoE,EAAE;IACrG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,eAAe,CAAC;IACxD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,6EAA6E;IAC7E,wDAAwD;IACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACpE,CAAC;AAED,iFAAiF;AACjF,SAAgB,kBAAkB,CAAC,OAAoE,EAAE;IACvG,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACzC,CAAC"}