run402-mcp 3.5.4 → 3.5.5

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.
@@ -1,4 +1,14 @@
1
+ export declare const DEFAULT_API_BASE = "https://api.run402.com";
2
+ export type ApiTargetKind = "cloud" | "core" | "unknown";
3
+ export interface ApiTargetConfig {
4
+ api_base?: string;
5
+ target_kind?: ApiTargetKind;
6
+ updated_at?: string;
7
+ health_status?: string;
8
+ health_error?: string;
9
+ }
1
10
  export declare function getApiBase(): string;
11
+ export declare function getApiBaseSource(): "env" | "profile" | "default";
2
12
  /**
3
13
  * API base for the deploy-v2 routes. Defaults to the same value as
4
14
  * `getApiBase()`. Set `RUN402_DEPLOY_API_BASE` to point only deploy traffic
@@ -35,5 +45,14 @@ export declare function getProfilesDir(): string;
35
45
  */
36
46
  export declare function getConfigDir(): string;
37
47
  export declare function getKeystorePath(): string;
48
+ export declare function getApiTargetConfigPath(): string;
49
+ export declare function readApiTargetConfig(path?: string): ApiTargetConfig | null;
50
+ export declare function saveApiTargetConfig(config: ApiTargetConfig, path?: string): void;
51
+ export declare function configureApiBase(apiBase: string, options?: Omit<ApiTargetConfig, "api_base" | "updated_at"> & {
52
+ updated_at?: string;
53
+ }): ApiTargetConfig;
54
+ export declare function getConfiguredApiBase(): string | null;
55
+ export declare function getApiTargetKind(): ApiTargetKind;
56
+ export declare function isCoreApiTarget(): boolean;
38
57
  export declare function getAllowancePath(): string;
39
58
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAwCA,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,eAAO,MAAM,eAAe,YAAY,CAAC;AASzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAmBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoCD,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,gBAAgB,IAAI,KAAK,GAAG,SAAS,GAAG,SAAS,CAGhE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,eAAO,MAAM,eAAe,YAAY,CAAC;AASzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAmBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,8DAA8D;AAC9D,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAmBzE;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAGhF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvF,eAAe,CAiBjB;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAKpD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC"}
@@ -1,7 +1,8 @@
1
1
  import { homedir } from "node:os";
2
- import { join } from "node:path";
3
- import { existsSync, renameSync, mkdirSync, chmodSync } from "node:fs";
4
- const DEFAULT_API_BASE = "https://api.run402.com";
2
+ import { dirname, join } from "node:path";
3
+ import { existsSync, renameSync, mkdirSync, chmodSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { randomBytes } from "node:crypto";
5
+ export const DEFAULT_API_BASE = "https://api.run402.com";
5
6
  /**
6
7
  * Validate a user-supplied API base URL. Throws a clear error message that
7
8
  * names the env var when the URL is malformed or uses a scheme other than
@@ -33,7 +34,12 @@ function validateApiBase(envVar, raw, fallback) {
33
34
  }
34
35
  export function getApiBase() {
35
36
  const validated = validateApiBase("RUN402_API_BASE", process.env.RUN402_API_BASE, DEFAULT_API_BASE);
36
- return validated ?? DEFAULT_API_BASE;
37
+ return validated ?? getConfiguredApiBase() ?? DEFAULT_API_BASE;
38
+ }
39
+ export function getApiBaseSource() {
40
+ if (process.env.RUN402_API_BASE !== undefined)
41
+ return "env";
42
+ return getConfiguredApiBase() ? "profile" : "default";
37
43
  }
38
44
  /**
39
45
  * API base for the deploy-v2 routes. Defaults to the same value as
@@ -115,6 +121,82 @@ export function getConfigDir() {
115
121
  export function getKeystorePath() {
116
122
  return join(getConfigDir(), "projects.json");
117
123
  }
124
+ export function getApiTargetConfigPath() {
125
+ return join(getConfigDir(), "target.json");
126
+ }
127
+ export function readApiTargetConfig(path) {
128
+ const p = path ?? getApiTargetConfigPath();
129
+ try {
130
+ const parsed = JSON.parse(readFileSync(p, "utf-8"));
131
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
132
+ return null;
133
+ const cfg = parsed;
134
+ if (cfg.api_base !== undefined && typeof cfg.api_base !== "string")
135
+ return null;
136
+ if (cfg.target_kind !== undefined &&
137
+ cfg.target_kind !== "cloud" &&
138
+ cfg.target_kind !== "core" &&
139
+ cfg.target_kind !== "unknown") {
140
+ return null;
141
+ }
142
+ return cfg;
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function atomicWrite(path, content, mode) {
149
+ const dir = dirname(path);
150
+ mkdirSync(dir, { recursive: true });
151
+ const tmp = join(dir, `.target.${randomBytes(4).toString("hex")}.tmp`);
152
+ writeFileSync(tmp, content, { mode });
153
+ renameSync(tmp, path);
154
+ try {
155
+ chmodSync(path, mode);
156
+ }
157
+ catch {
158
+ /* best-effort on non-POSIX */
159
+ }
160
+ }
161
+ export function saveApiTargetConfig(config, path) {
162
+ const p = path ?? getApiTargetConfigPath();
163
+ atomicWrite(p, JSON.stringify(config, null, 2), 0o600);
164
+ }
165
+ export function configureApiBase(apiBase, options = {}) {
166
+ if (apiBase === "") {
167
+ throw new Error("api_base must be a non-empty http(s) URL.");
168
+ }
169
+ const validated = validateApiBase("api_base", apiBase, DEFAULT_API_BASE);
170
+ if (!validated) {
171
+ throw new Error("api_base must be a non-empty http(s) URL.");
172
+ }
173
+ const config = {
174
+ api_base: validated.replace(/\/+$/, ""),
175
+ target_kind: options.target_kind ?? "unknown",
176
+ updated_at: options.updated_at ?? new Date().toISOString(),
177
+ ...(options.health_status ? { health_status: options.health_status } : {}),
178
+ ...(options.health_error ? { health_error: options.health_error } : {}),
179
+ };
180
+ saveApiTargetConfig(config);
181
+ return config;
182
+ }
183
+ export function getConfiguredApiBase() {
184
+ const cfg = readApiTargetConfig();
185
+ if (!cfg?.api_base)
186
+ return null;
187
+ const validated = validateApiBase("api_base", cfg.api_base, DEFAULT_API_BASE);
188
+ return validated ? validated.replace(/\/+$/, "") : null;
189
+ }
190
+ export function getApiTargetKind() {
191
+ const cfg = readApiTargetConfig();
192
+ return cfg?.target_kind ?? "unknown";
193
+ }
194
+ export function isCoreApiTarget() {
195
+ const cfg = readApiTargetConfig();
196
+ if (cfg?.target_kind !== "core" || !cfg.api_base)
197
+ return false;
198
+ return getApiBase().replace(/\/+$/, "") === cfg.api_base.replace(/\/+$/, "");
199
+ }
118
200
  export function getAllowancePath() {
119
201
  if (process.env.RUN402_ALLOWANCE_PATH)
120
202
  return process.env.RUN402_ALLOWANCE_PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAYzD;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,GAAuB,EAAE,QAAgB;IAChF,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,MAAM,kFAAkF,CACrG,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wDAAwD,CAC7G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,2BAA2B,CAAC,CAAC,QAAQ,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAAG,eAAe,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACpG,OAAO,SAAS,IAAI,oBAAoB,EAAE,IAAI,gBAAgB,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,wBAAwB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC1G,OAAO,SAAS,IAAI,QAAQ,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,4EAA4E;AAC5E,sEAAsE;AACtE,+EAA+E;AAC/E,sEAAsE;AACtE,6EAA6E;AAC7E,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO;IACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;YACrD,0FAA0F;YAC1F,mDAAmD,CACtD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,eAAe,CAAC;IAClC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,MAAM,CAAC,GAAG,IAAI,IAAI,sBAAsB,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAChF,MAAM,GAAG,GAAG,MAAyB,CAAC;QACtC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChF,IACE,GAAG,CAAC,WAAW,KAAK,SAAS;YAC7B,GAAG,CAAC,WAAW,KAAK,OAAO;YAC3B,GAAG,CAAC,WAAW,KAAK,MAAM;YAC1B,GAAG,CAAC,WAAW,KAAK,SAAS,EAC7B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAuB,EAAE,IAAa;IACxE,MAAM,CAAC,GAAG,IAAI,IAAI,sBAAsB,EAAE,CAAC;IAC3C,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,UAAsF,EAAE;IAExF,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACzE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAoB;QAC9B,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;QAC7C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1D,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IACF,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,OAAO,GAAG,EAAE,WAAW,IAAI,SAAS,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,IAAI,GAAG,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,UAAU,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAChF,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,2EAA2E;IAC3E,yEAAyE;IACzE,oEAAoE;IACpE,wEAAwE;IACxE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,sCAAsC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { getApiBase, getConfigDir, getKeystorePath, getAllowancePath, getActiveProfile } from "../core/dist/config.js";
1
+ export { getApiBase, getConfigDir, getKeystorePath, getAllowancePath, getActiveProfile, } from "../core/dist/config.js";
2
2
  export { readMeta } from "../core/dist/profiles.js";
3
3
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/config.js CHANGED
@@ -1,3 +1,3 @@
1
- export { getApiBase, getConfigDir, getKeystorePath, getAllowancePath, getActiveProfile } from "../core/dist/config.js";
1
+ export { getApiBase, getConfigDir, getKeystorePath, getAllowancePath, getActiveProfile, } from "../core/dist/config.js";
2
2
  export { readMeta } from "../core/dist/profiles.js";
3
3
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/sdk.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKrF,wBAAgB,MAAM,IAAI,UAAU,CASnC;AAED,gDAAgD;AAChD,wBAAgB,SAAS,IAAI,IAAI,CAGhC"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAMrF,wBAAgB,MAAM,IAAI,UAAU,CASnC;AAED,gDAAgD;AAChD,wBAAgB,SAAS,IAAI,IAAI,CAGhC"}
package/dist/sdk.js CHANGED
@@ -8,6 +8,7 @@
8
8
  * instead of silently reusing stale paths.
9
9
  */
10
10
  import { run402 as createNodeSdk } from "../sdk/dist/node/index.js";
11
+ import { getApiBase } from "./config.js";
11
12
  let cached = null;
12
13
  let cachedKey = null;
13
14
  export function getSdk() {
@@ -27,7 +28,7 @@ export function _resetSdk() {
27
28
  }
28
29
  function sdkCacheKey() {
29
30
  return JSON.stringify({
30
- apiBase: process.env.RUN402_API_BASE ?? null,
31
+ apiBase: getApiBase(),
31
32
  configDir: process.env.RUN402_CONFIG_DIR ?? null,
32
33
  allowancePath: process.env.RUN402_ALLOWANCE_PATH ?? null,
33
34
  wallet: process.env.RUN402_WALLET ?? null,
package/dist/sdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAErF,IAAI,MAAM,GAAsB,IAAI,CAAC;AACrC,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,MAAM,UAAU,MAAM;IACpB,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACjC,MAAM,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,SAAS,GAAG,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,IAAI,CAAC;IACd,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI;QAC5C,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI;QAChD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI;QACxD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI;QACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI;KAC5C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,IAAI,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,MAAM,GAAsB,IAAI,CAAC;AACrC,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,MAAM,UAAU,MAAM;IACpB,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACjC,MAAM,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,SAAS,GAAG,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,IAAI,CAAC;IACd,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,UAAU,EAAE;QACrB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI;QAChD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI;QACxD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI;QACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI;KAC5C,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402-mcp",
3
- "version": "3.5.4",
3
+ "version": "3.5.5",
4
4
  "description": "MCP server for Run402 — AI-native Postgres databases with REST API, auth, storage, and row-level security. Pay with x402 USDC micropayments.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,8 +29,8 @@
29
29
  "test:skill": "node --test --import tsx SKILL.test.ts",
30
30
  "test:sync": "node --test --import tsx sync.test.ts",
31
31
  "test:docs": "npm run check:docs --workspace=@run402/sdk -- --skip-build",
32
- "test": "npm run build && node --experimental-test-module-mocks --test --import tsx SKILL.test.ts sync.test.ts 'core/src/**/*.test.ts' 'sdk/src/**/*.test.ts' 'src/**/*.test.ts' && node --test cli-output-contract.test.mjs cli-e2e.test.mjs cli-help.test.mjs cli-provision-active.test.mjs cli-argv.test.mjs cli-env.test.mjs cli-wallets.test.mjs cli-org.test.mjs cli-ci.test.mjs cli-deploy-ci.test.mjs cli-operator-loopback.test.mjs cli/lib/doctor-source-scan.test.mjs cli-bootstrap-next-actions.test.mjs && npm run test:docs",
33
- "test:e2e": "npm run build && node --test cli-output-contract.test.mjs cli-e2e.test.mjs cli-help.test.mjs cli-provision-active.test.mjs cli-argv.test.mjs cli-env.test.mjs cli-wallets.test.mjs cli-org.test.mjs cli-ci.test.mjs cli-deploy-ci.test.mjs cli-operator-loopback.test.mjs cli/lib/doctor-source-scan.test.mjs cli-bootstrap-next-actions.test.mjs",
32
+ "test": "npm run build && node --experimental-test-module-mocks --test --import tsx SKILL.test.ts sync.test.ts 'core/src/**/*.test.ts' 'sdk/src/**/*.test.ts' 'src/**/*.test.ts' && node --test cli-core-target.test.mjs && node --test cli-output-contract.test.mjs cli-e2e.test.mjs cli-help.test.mjs cli-provision-active.test.mjs cli-argv.test.mjs cli-env.test.mjs cli-wallets.test.mjs cli-org.test.mjs cli-ci.test.mjs cli-deploy-ci.test.mjs cli-operator-loopback.test.mjs cli/lib/doctor-source-scan.test.mjs cli-bootstrap-next-actions.test.mjs && npm run test:docs",
33
+ "test:e2e": "npm run build && node --test cli-core-target.test.mjs && node --test cli-output-contract.test.mjs cli-e2e.test.mjs cli-help.test.mjs cli-provision-active.test.mjs cli-argv.test.mjs cli-env.test.mjs cli-wallets.test.mjs cli-org.test.mjs cli-ci.test.mjs cli-deploy-ci.test.mjs cli-operator-loopback.test.mjs cli/lib/doctor-source-scan.test.mjs cli-bootstrap-next-actions.test.mjs",
34
34
  "test:help": "npm run build && node --test cli-help.test.mjs",
35
35
  "test:integration": "node --test --import tsx core/src/siwx-integration.integ.ts",
36
36
  "test:integration:full": "node --test --import tsx cli-integration.test.ts",
package/sdk/README.md CHANGED
@@ -10,7 +10,7 @@ npm install @run402/sdk
10
10
 
11
11
  | Import | Use when |
12
12
  |---|---|
13
- | `@run402/sdk/node` | Running in Node 22 with the local keystore + allowance. Auto-loads `~/.config/run402/projects.json` and signs x402 payments from `~/.config/run402/allowance.json`. Includes `r.sites.deployDir(dir)`, `fileSetFromDir(dir)`, `loadDeployManifest(path)`, and `normalizeDeployManifest(input)`. |
13
+ | `@run402/sdk/node` | Running in Node 22 with the local keystore + allowance. Auto-loads the configured API base, `~/.config/run402/projects.json`, and signs x402 payments from `~/.config/run402/allowance.json`. Includes `r.sites.deployDir(dir)`, `fileSetFromDir(dir)`, `loadDeployManifest(path)`, and `normalizeDeployManifest(input)`. |
14
14
  | `@run402/sdk` | Isomorphic — works in Node, Deno, Bun, V8 isolates. No filesystem access. Bring your own `CredentialsProvider` (a session-token shim, a remote vault, anything that resolves project keys + auth headers). |
15
15
 
16
16
  ## Quick start (Node)
@@ -25,6 +25,8 @@ await (await r.project(project.project_id)).assets.put("hello.txt", { content: "
25
25
 
26
26
  That's it — credentials are read, x402 payments are signed, results are typed.
27
27
 
28
+ For a self-hosted Run402 Core Gateway, run `run402 init --api-base=http://my-core:4020` once. The Node SDK then targets that API base by default; explicit `run402({ apiBase })` still wins.
29
+
28
30
  ### Project-scoped sub-client
29
31
 
30
32
  Most operations are project-scoped. Bind once and skip the id arg on every call:
@@ -1,4 +1,14 @@
1
+ export declare const DEFAULT_API_BASE = "https://api.run402.com";
2
+ export type ApiTargetKind = "cloud" | "core" | "unknown";
3
+ export interface ApiTargetConfig {
4
+ api_base?: string;
5
+ target_kind?: ApiTargetKind;
6
+ updated_at?: string;
7
+ health_status?: string;
8
+ health_error?: string;
9
+ }
1
10
  export declare function getApiBase(): string;
11
+ export declare function getApiBaseSource(): "env" | "profile" | "default";
2
12
  /**
3
13
  * API base for the deploy-v2 routes. Defaults to the same value as
4
14
  * `getApiBase()`. Set `RUN402_DEPLOY_API_BASE` to point only deploy traffic
@@ -35,5 +45,14 @@ export declare function getProfilesDir(): string;
35
45
  */
36
46
  export declare function getConfigDir(): string;
37
47
  export declare function getKeystorePath(): string;
48
+ export declare function getApiTargetConfigPath(): string;
49
+ export declare function readApiTargetConfig(path?: string): ApiTargetConfig | null;
50
+ export declare function saveApiTargetConfig(config: ApiTargetConfig, path?: string): void;
51
+ export declare function configureApiBase(apiBase: string, options?: Omit<ApiTargetConfig, "api_base" | "updated_at"> & {
52
+ updated_at?: string;
53
+ }): ApiTargetConfig;
54
+ export declare function getConfiguredApiBase(): string | null;
55
+ export declare function getApiTargetKind(): ApiTargetKind;
56
+ export declare function isCoreApiTarget(): boolean;
38
57
  export declare function getAllowancePath(): string;
39
58
  //# sourceMappingURL=config.d.ts.map
@@ -1,7 +1,8 @@
1
1
  import { homedir } from "node:os";
2
- import { join } from "node:path";
3
- import { existsSync, renameSync, mkdirSync, chmodSync } from "node:fs";
4
- const DEFAULT_API_BASE = "https://api.run402.com";
2
+ import { dirname, join } from "node:path";
3
+ import { existsSync, renameSync, mkdirSync, chmodSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { randomBytes } from "node:crypto";
5
+ export const DEFAULT_API_BASE = "https://api.run402.com";
5
6
  /**
6
7
  * Validate a user-supplied API base URL. Throws a clear error message that
7
8
  * names the env var when the URL is malformed or uses a scheme other than
@@ -33,7 +34,12 @@ function validateApiBase(envVar, raw, fallback) {
33
34
  }
34
35
  export function getApiBase() {
35
36
  const validated = validateApiBase("RUN402_API_BASE", process.env.RUN402_API_BASE, DEFAULT_API_BASE);
36
- return validated ?? DEFAULT_API_BASE;
37
+ return validated ?? getConfiguredApiBase() ?? DEFAULT_API_BASE;
38
+ }
39
+ export function getApiBaseSource() {
40
+ if (process.env.RUN402_API_BASE !== undefined)
41
+ return "env";
42
+ return getConfiguredApiBase() ? "profile" : "default";
37
43
  }
38
44
  /**
39
45
  * API base for the deploy-v2 routes. Defaults to the same value as
@@ -115,6 +121,82 @@ export function getConfigDir() {
115
121
  export function getKeystorePath() {
116
122
  return join(getConfigDir(), "projects.json");
117
123
  }
124
+ export function getApiTargetConfigPath() {
125
+ return join(getConfigDir(), "target.json");
126
+ }
127
+ export function readApiTargetConfig(path) {
128
+ const p = path ?? getApiTargetConfigPath();
129
+ try {
130
+ const parsed = JSON.parse(readFileSync(p, "utf-8"));
131
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
132
+ return null;
133
+ const cfg = parsed;
134
+ if (cfg.api_base !== undefined && typeof cfg.api_base !== "string")
135
+ return null;
136
+ if (cfg.target_kind !== undefined &&
137
+ cfg.target_kind !== "cloud" &&
138
+ cfg.target_kind !== "core" &&
139
+ cfg.target_kind !== "unknown") {
140
+ return null;
141
+ }
142
+ return cfg;
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ function atomicWrite(path, content, mode) {
149
+ const dir = dirname(path);
150
+ mkdirSync(dir, { recursive: true });
151
+ const tmp = join(dir, `.target.${randomBytes(4).toString("hex")}.tmp`);
152
+ writeFileSync(tmp, content, { mode });
153
+ renameSync(tmp, path);
154
+ try {
155
+ chmodSync(path, mode);
156
+ }
157
+ catch {
158
+ /* best-effort on non-POSIX */
159
+ }
160
+ }
161
+ export function saveApiTargetConfig(config, path) {
162
+ const p = path ?? getApiTargetConfigPath();
163
+ atomicWrite(p, JSON.stringify(config, null, 2), 0o600);
164
+ }
165
+ export function configureApiBase(apiBase, options = {}) {
166
+ if (apiBase === "") {
167
+ throw new Error("api_base must be a non-empty http(s) URL.");
168
+ }
169
+ const validated = validateApiBase("api_base", apiBase, DEFAULT_API_BASE);
170
+ if (!validated) {
171
+ throw new Error("api_base must be a non-empty http(s) URL.");
172
+ }
173
+ const config = {
174
+ api_base: validated.replace(/\/+$/, ""),
175
+ target_kind: options.target_kind ?? "unknown",
176
+ updated_at: options.updated_at ?? new Date().toISOString(),
177
+ ...(options.health_status ? { health_status: options.health_status } : {}),
178
+ ...(options.health_error ? { health_error: options.health_error } : {}),
179
+ };
180
+ saveApiTargetConfig(config);
181
+ return config;
182
+ }
183
+ export function getConfiguredApiBase() {
184
+ const cfg = readApiTargetConfig();
185
+ if (!cfg?.api_base)
186
+ return null;
187
+ const validated = validateApiBase("api_base", cfg.api_base, DEFAULT_API_BASE);
188
+ return validated ? validated.replace(/\/+$/, "") : null;
189
+ }
190
+ export function getApiTargetKind() {
191
+ const cfg = readApiTargetConfig();
192
+ return cfg?.target_kind ?? "unknown";
193
+ }
194
+ export function isCoreApiTarget() {
195
+ const cfg = readApiTargetConfig();
196
+ if (cfg?.target_kind !== "core" || !cfg.api_base)
197
+ return false;
198
+ return getApiBase().replace(/\/+$/, "") === cfg.api_base.replace(/\/+$/, "");
199
+ }
118
200
  export function getAllowancePath() {
119
201
  if (process.env.RUN402_ALLOWANCE_PATH)
120
202
  return process.env.RUN402_ALLOWANCE_PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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"}