@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.
- package/README.md +178 -44
- package/dist/agent/builtin-commands.js +2 -2
- package/dist/agent/builtin-commands.js.map +1 -1
- package/dist/agent/dreaming/accept.d.ts.map +1 -1
- package/dist/agent/dreaming/accept.js +4 -1
- package/dist/agent/dreaming/accept.js.map +1 -1
- package/dist/agent/dreaming/config.d.ts.map +1 -1
- package/dist/agent/dreaming/config.js +2 -0
- package/dist/agent/dreaming/config.js.map +1 -1
- package/dist/agent/dreaming/reviewer.d.ts.map +1 -1
- package/dist/agent/dreaming/reviewer.js +9 -2
- package/dist/agent/dreaming/reviewer.js.map +1 -1
- package/dist/agent/dreaming/staleness.d.ts +7 -1
- package/dist/agent/dreaming/staleness.d.ts.map +1 -1
- package/dist/agent/dreaming/staleness.js +17 -2
- package/dist/agent/dreaming/staleness.js.map +1 -1
- package/dist/agent/dreaming/types.d.ts +17 -1
- package/dist/agent/dreaming/types.d.ts.map +1 -1
- package/dist/agent/knowledge/archive-db.d.ts +43 -0
- package/dist/agent/knowledge/archive-db.d.ts.map +1 -1
- package/dist/agent/knowledge/archive-db.js +130 -0
- package/dist/agent/knowledge/archive-db.js.map +1 -1
- package/dist/agent/knowledge/config.d.ts +3 -1
- package/dist/agent/knowledge/config.d.ts.map +1 -1
- package/dist/agent/knowledge/config.js +32 -10
- package/dist/agent/knowledge/config.js.map +1 -1
- package/dist/agent/knowledge/index.d.ts +11 -4
- package/dist/agent/knowledge/index.d.ts.map +1 -1
- package/dist/agent/knowledge/index.js +22 -1
- package/dist/agent/knowledge/index.js.map +1 -1
- package/dist/agent/knowledge/indexer.d.ts +0 -7
- package/dist/agent/knowledge/indexer.d.ts.map +1 -1
- package/dist/agent/knowledge/indexer.js +34 -7
- package/dist/agent/knowledge/indexer.js.map +1 -1
- package/dist/agent/knowledge/lifecycle.d.ts +20 -4
- package/dist/agent/knowledge/lifecycle.d.ts.map +1 -1
- package/dist/agent/knowledge/lifecycle.js +33 -4
- package/dist/agent/knowledge/lifecycle.js.map +1 -1
- package/dist/agent/knowledge/reflection.d.ts +114 -0
- package/dist/agent/knowledge/reflection.d.ts.map +1 -0
- package/dist/agent/knowledge/reflection.js +447 -0
- package/dist/agent/knowledge/reflection.js.map +1 -0
- package/dist/agent/knowledge/shared-dedup.d.ts +85 -0
- package/dist/agent/knowledge/shared-dedup.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-dedup.js +187 -0
- package/dist/agent/knowledge/shared-dedup.js.map +1 -0
- package/dist/agent/knowledge/shared-promote.d.ts +82 -7
- package/dist/agent/knowledge/shared-promote.d.ts.map +1 -1
- package/dist/agent/knowledge/shared-promote.js +244 -11
- package/dist/agent/knowledge/shared-promote.js.map +1 -1
- package/dist/agent/knowledge/shared-staleness.d.ts +51 -0
- package/dist/agent/knowledge/shared-staleness.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-staleness.js +149 -0
- package/dist/agent/knowledge/shared-staleness.js.map +1 -0
- package/dist/agent/knowledge/shared-writer.d.ts +19 -0
- package/dist/agent/knowledge/shared-writer.d.ts.map +1 -1
- package/dist/agent/knowledge/shared-writer.js +42 -0
- package/dist/agent/knowledge/shared-writer.js.map +1 -1
- package/dist/agent/knowledge/types.d.ts +24 -0
- package/dist/agent/knowledge/types.d.ts.map +1 -1
- package/dist/agent/model-catalog.d.ts +62 -0
- package/dist/agent/model-catalog.d.ts.map +1 -0
- package/dist/agent/model-catalog.js +264 -0
- package/dist/agent/model-catalog.js.map +1 -0
- package/dist/agent/runner.d.ts +83 -0
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +281 -51
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/workspace-loader.d.ts +17 -2
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +17 -1
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/cron-router.d.ts +12 -8
- package/dist/api/cron-router.d.ts.map +1 -1
- package/dist/api/cron-router.js +82 -16
- package/dist/api/cron-router.js.map +1 -1
- package/dist/api/gateway-router.d.ts +4 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +16 -1
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/manifest-sources.d.ts +15 -0
- package/dist/api/manifest-sources.d.ts.map +1 -0
- package/dist/api/manifest-sources.js +27 -0
- package/dist/api/manifest-sources.js.map +1 -0
- package/dist/api/meta-router.d.ts +13 -0
- package/dist/api/meta-router.d.ts.map +1 -0
- package/dist/api/meta-router.js +26 -0
- package/dist/api/meta-router.js.map +1 -0
- package/dist/api/packages.d.ts.map +1 -1
- package/dist/api/packages.js +18 -198
- package/dist/api/packages.js.map +1 -1
- package/dist/api/route-registry.d.ts +81 -0
- package/dist/api/route-registry.d.ts.map +1 -0
- package/dist/api/route-registry.js +44 -0
- package/dist/api/route-registry.js.map +1 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +21 -3
- package/dist/api/router.js.map +1 -1
- package/dist/apps/compose-generator.js +7 -4
- package/dist/apps/compose-generator.js.map +1 -1
- package/dist/apps/installer.d.ts +154 -0
- package/dist/apps/installer.d.ts.map +1 -1
- package/dist/apps/installer.js +657 -54
- package/dist/apps/installer.js.map +1 -1
- package/dist/cli/args.d.ts +25 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +55 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/colors.d.ts +37 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +63 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/command-names.d.ts +98 -0
- package/dist/cli/command-names.d.ts.map +1 -0
- package/dist/cli/command-names.js +109 -0
- package/dist/cli/command-names.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +28 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +321 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/channels.d.ts +17 -0
- package/dist/cli/commands/channels.d.ts.map +1 -0
- package/dist/cli/commands/channels.js +101 -0
- package/dist/cli/commands/channels.js.map +1 -0
- package/dist/cli/commands/debug-bundle.d.ts +6 -0
- package/dist/cli/commands/debug-bundle.d.ts.map +1 -0
- package/dist/cli/commands/debug-bundle.js +220 -0
- package/dist/cli/commands/debug-bundle.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +104 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gateway.d.ts +12 -0
- package/dist/cli/commands/gateway.d.ts.map +1 -0
- package/dist/cli/commands/gateway.js +145 -0
- package/dist/cli/commands/gateway.js.map +1 -0
- package/dist/cli/commands/service.d.ts +33 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +513 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/update.d.ts +16 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +149 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands.generated.d.ts +4 -0
- package/dist/cli/commands.generated.d.ts.map +1 -0
- package/dist/cli/commands.generated.js +220 -0
- package/dist/cli/commands.generated.js.map +1 -0
- package/dist/cli/health.d.ts +31 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +49 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/http-client.d.ts +140 -0
- package/dist/cli/http-client.d.ts.map +1 -0
- package/dist/cli/http-client.js +332 -0
- package/dist/cli/http-client.js.map +1 -0
- package/dist/cli/index.d.ts +27 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +372 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/manager.d.ts +64 -0
- package/dist/cli/manager.d.ts.map +1 -0
- package/dist/cli/manager.js +181 -0
- package/dist/cli/manager.js.map +1 -0
- package/dist/cli/output.d.ts +49 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +101 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +29 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +154 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/redact.d.ts +3 -0
- package/dist/cli/redact.d.ts.map +1 -0
- package/dist/cli/redact.js +33 -0
- package/dist/cli/redact.js.map +1 -0
- package/dist/cli/types.d.ts +22 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +4 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/bootstrap.d.ts +33 -0
- package/dist/config/bootstrap.d.ts.map +1 -0
- package/dist/config/bootstrap.js +117 -0
- package/dist/config/bootstrap.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +5 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +2 -35
- package/dist/config/watcher.js.map +1 -1
- package/dist/discord/receiver.d.ts +6 -1
- package/dist/discord/receiver.d.ts.map +1 -1
- package/dist/discord/receiver.js +9 -1
- package/dist/discord/receiver.js.map +1 -1
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +83 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.js +197 -47
- package/dist/index.js.map +1 -1
- package/dist/load-dotenv.d.ts +2 -0
- package/dist/load-dotenv.d.ts.map +1 -0
- package/dist/load-dotenv.js +68 -0
- package/dist/load-dotenv.js.map +1 -0
- package/dist/packages/registry.d.ts +50 -0
- package/dist/packages/registry.d.ts.map +1 -0
- package/dist/packages/registry.js +209 -0
- package/dist/packages/registry.js.map +1 -0
- package/dist/session/process.d.ts +20 -3
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +120 -5
- package/dist/session/process.js.map +1 -1
- package/dist/shell/claude-pty-shell.js +146 -27
- package/dist/shell/claude-pty-shell.js.map +1 -1
- package/dist/shell/draft-phantom.d.ts +49 -0
- package/dist/shell/draft-phantom.d.ts.map +1 -0
- package/dist/shell/draft-phantom.js +59 -0
- package/dist/shell/draft-phantom.js.map +1 -0
- package/dist/shell/submit-diag.d.ts +67 -0
- package/dist/shell/submit-diag.d.ts.map +1 -0
- package/dist/shell/submit-diag.js +69 -0
- package/dist/shell/submit-diag.js.map +1 -0
- package/dist/shutdown-signals.d.ts +47 -0
- package/dist/shutdown-signals.d.ts.map +1 -0
- package/dist/shutdown-signals.js +62 -0
- package/dist/shutdown-signals.js.map +1 -0
- package/dist/telegram/receiver.d.ts +6 -1
- package/dist/telegram/receiver.d.ts.map +1 -1
- package/dist/telegram/receiver.js +9 -1
- package/dist/telegram/receiver.js.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/orphan-receivers.d.ts +90 -0
- package/dist/utils/orphan-receivers.d.ts.map +1 -0
- package/dist/utils/orphan-receivers.js +218 -0
- package/dist/utils/orphan-receivers.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +60 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/stop-child.d.ts +21 -0
- package/dist/utils/stop-child.d.ts.map +1 -0
- package/dist/utils/stop-child.js +64 -0
- package/dist/utils/stop-child.js.map +1 -0
- package/lib/pairing.ts +1 -1
- package/mcp/tools/agent/handlers.ts +1 -1
- package/mcp/tools/discord/module.ts +23 -15
- package/mcp/tools/discord/receiver-server.ts +4 -0
- package/mcp/tools/memory/archive-reader.test.ts +25 -1
- package/mcp/tools/memory/archive-reader.ts +70 -12
- package/mcp/tools/memory/archive-writer.test.ts +168 -0
- package/mcp/tools/memory/archive-writer.ts +137 -0
- package/mcp/tools/memory/module.test.ts +187 -0
- package/mcp/tools/memory/module.ts +192 -6
- package/mcp/tools/telegram/module.ts +10 -2
- package/mcp/tools/telegram/receiver-server.ts +15 -6
- package/mcp/tools/telegram/typing.ts +178 -34
- 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"}
|