@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,332 @@
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.expandHome = exports.DEFAULT_PORT = void 0;
37
+ exports.loadCliConfig = loadCliConfig;
38
+ exports.resolveUrlPlan = resolveUrlPlan;
39
+ exports.resolveUrl = resolveUrl;
40
+ exports.resolveLocalUrl = resolveLocalUrl;
41
+ exports.resolveKey = resolveKey;
42
+ exports.buildRequestUrl = buildRequestUrl;
43
+ exports.request = request;
44
+ exports.resolveReachableUrl = resolveReachableUrl;
45
+ const fs = __importStar(require("fs"));
46
+ const os = __importStar(require("os"));
47
+ const path = __importStar(require("path"));
48
+ const manager_1 = require("./manager");
49
+ const paths_1 = require("../utils/paths");
50
+ Object.defineProperty(exports, "expandHome", { enumerable: true, get: function () { return paths_1.expandHome; } });
51
+ const health_1 = require("./health");
52
+ /**
53
+ * CLI HTTP client — resolves where to talk to the gateway and which key to use,
54
+ * then makes the request. Kept deliberately light: it reads the config JSON
55
+ * directly rather than going through the server's loadConfig() (no validation,
56
+ * migration, or server-side side effects), so the CLI stays fast and works even
57
+ * when the gateway is misconfigured or down.
58
+ *
59
+ * Resolution never prints the API key.
60
+ */
61
+ exports.DEFAULT_PORT = 10850;
62
+ /** Read ~/.claude-gateway/config.json (or an override path) and extract the
63
+ * fields the CLI needs. Returns an empty view if the file is missing/unreadable
64
+ * so that flags/env can still drive resolution. */
65
+ function loadCliConfig(configPath) {
66
+ const file = (0, paths_1.expandHome)(configPath ||
67
+ process.env.GATEWAY_CONFIG ||
68
+ path.join(os.homedir(), '.claude-gateway', 'config.json'));
69
+ try {
70
+ const raw = fs.readFileSync(file, 'utf8');
71
+ const json = JSON.parse(raw);
72
+ return {
73
+ bind: json.gateway?.bind,
74
+ publicUrl: json.gateway?.publicUrl,
75
+ keys: json.gateway?.api?.keys,
76
+ logDir: json.gateway?.logDir,
77
+ };
78
+ }
79
+ catch {
80
+ return {};
81
+ }
82
+ }
83
+ /**
84
+ * Resolve where the CLI should talk to the gateway. Precedence:
85
+ * --url → $CLAUDE_GATEWAY_URL → http://<bind>:<port> *when a gateway is
86
+ * running on this host* → config.gateway.publicUrl → http://<bind>:<port>
87
+ *
88
+ * `config.gateway.publicUrl` describes *this* gateway as seen from outside,
89
+ * so when the gateway is running here, loopback and the public URL are the
90
+ * same server — the public one just adds a reverse-proxy hop. Preferring it
91
+ * from the gateway's own host makes every command depend on that proxy, and a
92
+ * proxy enforcing its own authentication (which the CLI has no credentials
93
+ * for) answers 401 to commands that work perfectly over loopback. So a live
94
+ * local gateway wins; `--url` and `$CLAUDE_GATEWAY_URL` still override, for
95
+ * deliberately exercising the proxy path or reaching another host.
96
+ *
97
+ * Liveness comes from a pidfile, which can lie: a gateway killed without
98
+ * cleanup leaves one behind, and the OS may reissue that pid to an unrelated
99
+ * process. The local address would then be preferred and nothing would answer
100
+ * it, so `publicUrl` is returned as `fallbackUrl` — the same gateway by its
101
+ * other name — for the caller to retry once. That cost is paid only when the
102
+ * local address is genuinely unreachable.
103
+ *
104
+ * A bind of 0.0.0.0 / :: is a listen address, not a dial address, so it is
105
+ * rewritten to loopback for the client. The port comes from the pidfile when a
106
+ * gateway is running (see readLocalGateway), else $PORT, else 10850. The
107
+ * returned URLs have no trailing slash.
108
+ */
109
+ function resolveUrlPlan(i = {}) {
110
+ const env = i.env ?? process.env;
111
+ const cfg = i.config ?? {};
112
+ const explicit = i.flagUrl || env.CLAUDE_GATEWAY_URL;
113
+ // An address the caller named is the address used, with no second guess:
114
+ // silently retrying somewhere else would defeat the point of naming it.
115
+ if (explicit)
116
+ return { baseUrl: stripSlash(explicit) };
117
+ const publicUrl = cfg.publicUrl ? stripSlash(cfg.publicUrl) : undefined;
118
+ const local = (i.localGateway ?? manager_1.readLocalGateway)();
119
+ if (!local)
120
+ return { baseUrl: publicUrl ?? bindUrl(cfg, env) };
121
+ const baseUrl = bindUrl(cfg, env, local.port);
122
+ return publicUrl && publicUrl !== baseUrl ? { baseUrl, fallbackUrl: publicUrl } : { baseUrl };
123
+ }
124
+ /** The base URL alone — see resolveUrlPlan() for the precedence and why. */
125
+ function resolveUrl(i = {}) {
126
+ return resolveUrlPlan(i).baseUrl;
127
+ }
128
+ function stripSlash(url) {
129
+ return url.replace(/\/+$/, '');
130
+ }
131
+ /** `http://<bind>:<port>` — where a gateway on THIS host actually listens.
132
+ * `knownPort` is the port a running gateway reported through its pidfile; it
133
+ * wins over `$PORT`, which describes the CLI's own shell and may have nothing
134
+ * to do with the shell the server was started from. */
135
+ function bindUrl(cfg, env, knownPort) {
136
+ // Same precedence the server resolves its own bind with (resolveBindHost in
137
+ // api/gateway-router): $GATEWAY_BIND → gateway.bind → loopback. The variable
138
+ // is visible here because the entry point loads ~/.claude-gateway/.env into
139
+ // process.env on every invocation, CLI runs included. Reading only the config
140
+ // file made the CLI dial 127.0.0.1 while the gateway listened on the address
141
+ // from .env, so `gateway status` and `service install`'s health check called
142
+ // a perfectly healthy gateway down.
143
+ let host = (env.GATEWAY_BIND || '').trim() || (cfg.bind || '').trim() || '127.0.0.1';
144
+ // A wildcard bind is not a dialable address; the loopback the server also
145
+ // listens on is.
146
+ if (host === '0.0.0.0' || host === '::' || host === '[::]')
147
+ host = '127.0.0.1';
148
+ const port = knownPort ?? (parseInt(env.PORT || String(exports.DEFAULT_PORT), 10) || exports.DEFAULT_PORT);
149
+ return `http://${hostForUrl(host)}:${port}`;
150
+ }
151
+ /** An IPv6 literal has to be bracketed inside a URL authority, or the colons
152
+ * read as a port separator: `http://::1:10850` is rejected by `fetch()` as an
153
+ * invalid URL, and every command then failed with a parse error naming a URL
154
+ * the user never typed. Only `::`/`[::]` were handled before, so any other
155
+ * literal (`::1`, `fd00::1`) was interpolated bare. Already-bracketed and
156
+ * zone-suffixed forms are left as they are. */
157
+ function hostForUrl(host) {
158
+ if (host.startsWith('['))
159
+ return host;
160
+ return host.includes(':') ? `[${host}]` : host;
161
+ }
162
+ /**
163
+ * Resolve the URL for probing the gateway *process on this host* — used by
164
+ * `gateway status` and by `service install`'s post-install health check.
165
+ * Precedence:
166
+ * --url → http://<bind>:<port>
167
+ *
168
+ * Deliberately NOT resolveUrl(): `config.gateway.publicUrl` (and
169
+ * `$CLAUDE_GATEWAY_URL`) usually point at a reverse proxy, which may be
170
+ * unreachable from the box itself — or, worse, still answering from a
171
+ * different instance, so a dead local service would be reported healthy.
172
+ * An explicit `--url` still wins, for deliberately checking another host.
173
+ */
174
+ function resolveLocalUrl(i = {}) {
175
+ const env = i.env ?? process.env;
176
+ if (i.flagUrl)
177
+ return stripSlash(i.flagUrl);
178
+ const local = (i.localGateway ?? manager_1.readLocalGateway)();
179
+ return stripSlash(bindUrl(i.config ?? {}, env, local?.port));
180
+ }
181
+ /**
182
+ * Resolve the API key. Precedence:
183
+ * --key → $CLAUDE_GATEWAY_API_KEY → first admin key in config → first key in config
184
+ *
185
+ * Returns undefined if none is available. The key is never logged.
186
+ */
187
+ function resolveKey(i = {}) {
188
+ const env = i.env ?? process.env;
189
+ const cfg = i.config ?? {};
190
+ if (i.flagKey)
191
+ return i.flagKey;
192
+ if (env.CLAUDE_GATEWAY_API_KEY)
193
+ return env.CLAUDE_GATEWAY_API_KEY;
194
+ const keys = cfg.keys ?? [];
195
+ const admin = keys.find((k) => k.admin);
196
+ if (admin)
197
+ return admin.key;
198
+ return keys[0]?.key;
199
+ }
200
+ /** A request that never reached a server (DNS, refused, timeout) — as opposed
201
+ * to one the gateway answered with an error status. Only the former is worth
202
+ * retrying at a different address. */
203
+ class TransportError extends Error {
204
+ constructor() {
205
+ super(...arguments);
206
+ this.transport = true;
207
+ }
208
+ }
209
+ /** Build the full request URL: `${baseUrl}/api${path}` plus any query string. */
210
+ function buildRequestUrl(baseUrl, apiPath, query) {
211
+ const base = baseUrl.replace(/\/+$/, '');
212
+ const p = apiPath.startsWith('/') ? apiPath : `/${apiPath}`;
213
+ let url = `${base}/api${p}`;
214
+ if (query) {
215
+ const qs = new URLSearchParams();
216
+ for (const [k, v] of Object.entries(query)) {
217
+ if (v !== undefined && v !== '')
218
+ qs.append(k, v);
219
+ }
220
+ const s = qs.toString();
221
+ if (s)
222
+ url += `?${s}`;
223
+ }
224
+ return url;
225
+ }
226
+ /**
227
+ * Make an authenticated request to the gateway. Throws a clear Error (with the
228
+ * server's message when present) on a non-2xx response or a transport failure,
229
+ * so command wrappers can surface it and exit non-zero.
230
+ */
231
+ async function request(opts) {
232
+ try {
233
+ return await attempt(opts.baseUrl, opts);
234
+ }
235
+ catch (err) {
236
+ if (!opts.fallbackBaseUrl || !(err instanceof TransportError))
237
+ throw err;
238
+ const notify = opts.onFallback ??
239
+ ((from, to, reason) => process.stderr.write(`Cannot reach the gateway at ${from} (${reason}); retrying at ${to}.\n`));
240
+ notify(opts.baseUrl, opts.fallbackBaseUrl, err.message);
241
+ return attempt(opts.fallbackBaseUrl, opts);
242
+ }
243
+ }
244
+ /** One request against one base URL. Throws TransportError when nothing
245
+ * answered, a plain Error when the gateway answered with a non-2xx. */
246
+ async function attempt(baseUrl, opts) {
247
+ const url = buildRequestUrl(baseUrl, opts.path, opts.query);
248
+ const headers = {};
249
+ if (opts.key)
250
+ headers['Authorization'] = `Bearer ${opts.key}`;
251
+ const hasBody = opts.body !== undefined && opts.method.toUpperCase() !== 'GET';
252
+ if (hasBody)
253
+ headers['Content-Type'] = 'application/json';
254
+ const controller = new AbortController();
255
+ const timeoutMs = opts.timeoutMs ?? 30000;
256
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
257
+ let res;
258
+ let text;
259
+ try {
260
+ try {
261
+ res = await fetch(url, {
262
+ method: opts.method.toUpperCase(),
263
+ headers,
264
+ body: hasBody ? JSON.stringify(opts.body) : undefined,
265
+ signal: controller.signal,
266
+ });
267
+ }
268
+ catch (err) {
269
+ const reason = err?.name === 'AbortError' ? `timed out after ${timeoutMs}ms` : err.message;
270
+ throw new TransportError(`Cannot reach gateway at ${baseUrl}: ${reason}`);
271
+ }
272
+ try {
273
+ // Inside the same deadline: `fetch` resolves once the headers arrive, so
274
+ // a gateway that wedges mid-body would otherwise hang the CLI forever.
275
+ text = await res.text();
276
+ }
277
+ catch (err) {
278
+ // Not a TransportError — the gateway answered, so falling back to another
279
+ // address would only re-ask the same wedged process through a proxy.
280
+ const reason = err?.name === 'AbortError' ? `timed out after ${timeoutMs}ms` : err.message;
281
+ throw new Error(`Gateway at ${baseUrl} answered but the response body failed: ${reason}`);
282
+ }
283
+ }
284
+ finally {
285
+ // In `finally`: a rejected fetch or body read would otherwise leave a live
286
+ // timer holding the event loop open.
287
+ clearTimeout(timer);
288
+ }
289
+ let data = text;
290
+ const ctype = res.headers.get('content-type') || '';
291
+ if (ctype.includes('application/json') || (text.startsWith('{') || text.startsWith('['))) {
292
+ try {
293
+ data = JSON.parse(text);
294
+ }
295
+ catch {
296
+ data = text;
297
+ }
298
+ }
299
+ if (!res.ok) {
300
+ const serverMsg = data && typeof data === 'object' && 'error' in data
301
+ ? String(data.error)
302
+ : typeof data === 'string' && data
303
+ ? data
304
+ : res.statusText;
305
+ throw new Error(`HTTP ${res.status} ${opts.method.toUpperCase()} ${opts.path}: ${serverMsg}`);
306
+ }
307
+ return { status: res.status, ok: res.ok, data };
308
+ }
309
+ /**
310
+ * Resolve a plan down to one base URL that something is actually answering on.
311
+ *
312
+ * `request()` carries the stale-pidfile fallback per call, which suits the
313
+ * one-shot commands. The interactive flows (`agents`, `channels`) thread a
314
+ * single base URL through many helpers and many requests, so they settle the
315
+ * question once up front instead: if the local address answers nothing, the
316
+ * whole session runs against `publicUrl`.
317
+ *
318
+ * Costs one extra `/health` round trip, and only when a fallback exists at all
319
+ * — that is, only when a pidfile pointed at a gateway on this host.
320
+ */
321
+ async function resolveReachableUrl(plan) {
322
+ if (!plan.fallbackUrl)
323
+ return plan.baseUrl;
324
+ const probe = await (0, health_1.probeHealth)(plan.baseUrl);
325
+ // `answered` rather than `ok`: a 401 or 500 means the gateway is there, and
326
+ // asking a different address would only hide its answer.
327
+ if (probe.answered)
328
+ return plan.baseUrl;
329
+ process.stderr.write(`Cannot reach the gateway at ${plan.baseUrl} (${probe.detail}); using ${plan.fallbackUrl}.\n`);
330
+ return plan.fallbackUrl;
331
+ }
332
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Paint } from './colors';
2
+ /**
3
+ * CLI entry point. Returns a process exit code. Never boots the server — the
4
+ * boot entry (src/index.ts) only calls this when argv[2] is a CLI command.
5
+ *
6
+ * Convention: stdout carries the command's result (JSON, pretty by default or
7
+ * compact with `--json`); human-facing help and errors go to stderr, so result
8
+ * output is never polluted.
9
+ */
10
+ export declare function runCli(argv: string[]): Promise<number>;
11
+ /** Two-column rows in the general help. The name column is padded to
12
+ * NAME_W; a name wider than that puts its description on the next line.
13
+ * Wide enough for the longest name (`service install|status|uninstall`, 32)
14
+ * plus a readable gap, so no core command wraps. Exported for the test that
15
+ * holds this table and the dispatcher to the same set of commands. */
16
+ export declare const NAME_W = 36;
17
+ /** Usage strings in a resource noun's help (`crons list --limit <v>`) run much
18
+ * longer than a core command name, so that listing gets its own width. */
19
+ export declare const NOUN_NAME_W = 48;
20
+ export declare const CORE_HELP: ReadonlyArray<readonly [string, string]>;
21
+ /** Render one ` name description` row, padding before colouring so ANSI
22
+ * escapes never count toward the column width. A name at or past `width` puts
23
+ * its description on the next line, aligned with the others, rather than
24
+ * pushing it out of the column — which is what the two-line form is for.
25
+ * Shared by every help listing so they cannot drift apart. */
26
+ export declare function helpRow(name: string, desc: string, paint: Paint, width?: number): string[];
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,EAAE,MAAM,UAAU,CAAC;AA2B7C;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwD5D;AA8KD;;;;uEAIuE;AACvE,eAAO,MAAM,MAAM,KAAK,CAAC;AAEzB;2EAC2E;AAC3E,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAW9D,CAAC;AAEF;;;;+DAI+D;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,SAAS,GAAG,MAAM,EAAE,CAG1F"}