run402-mcp 3.5.4 → 3.5.6

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 (40) hide show
  1. package/README.md +1 -1
  2. package/core/dist/config.d.ts +19 -0
  3. package/core/dist/config.d.ts.map +1 -1
  4. package/core/dist/config.js +103 -4
  5. package/core/dist/config.js.map +1 -1
  6. package/dist/config.d.ts +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +1 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/sdk.d.ts.map +1 -1
  11. package/dist/sdk.js +2 -1
  12. package/dist/sdk.js.map +1 -1
  13. package/package.json +3 -3
  14. package/schemas/release-spec.v1.json +29 -2
  15. package/sdk/README.md +30 -1
  16. package/sdk/core-dist/config.d.ts +19 -0
  17. package/sdk/core-dist/config.js +103 -4
  18. package/sdk/dist/namespaces/deploy.d.ts.map +1 -1
  19. package/sdk/dist/namespaces/deploy.js +281 -21
  20. package/sdk/dist/namespaces/deploy.js.map +1 -1
  21. package/sdk/dist/namespaces/deploy.types.d.ts +16 -1
  22. package/sdk/dist/namespaces/deploy.types.d.ts.map +1 -1
  23. package/sdk/dist/namespaces/deploy.types.js.map +1 -1
  24. package/sdk/dist/namespaces/projects.d.ts.map +1 -1
  25. package/sdk/dist/namespaces/projects.js +1 -0
  26. package/sdk/dist/namespaces/projects.js.map +1 -1
  27. package/sdk/dist/namespaces/projects.types.d.ts +7 -0
  28. package/sdk/dist/namespaces/projects.types.d.ts.map +1 -1
  29. package/sdk/dist/node/deploy-manifest.d.ts +5 -3
  30. package/sdk/dist/node/deploy-manifest.d.ts.map +1 -1
  31. package/sdk/dist/node/deploy-manifest.js +16 -2
  32. package/sdk/dist/node/deploy-manifest.js.map +1 -1
  33. package/sdk/dist/node/index.d.ts +2 -0
  34. package/sdk/dist/node/index.d.ts.map +1 -1
  35. package/sdk/dist/node/index.js +1 -0
  36. package/sdk/dist/node/index.js.map +1 -1
  37. package/sdk/dist/node/target-profile.d.ts +40 -0
  38. package/sdk/dist/node/target-profile.d.ts.map +1 -0
  39. package/sdk/dist/node/target-profile.js +98 -0
  40. package/sdk/dist/node/target-profile.js.map +1 -0
package/README.md CHANGED
@@ -285,7 +285,7 @@ npm install @run402/sdk
285
285
  Two entry points:
286
286
 
287
287
  - **`@run402/sdk`** — isomorphic. Bring your own `CredentialsProvider` (a session-token shim, a remote vault, anything that resolves project keys + auth headers). Works in Node 22, Deno, Bun, V8 isolates.
288
- - **`@run402/sdk/node`** — Node-only convenience. Reads `~/.config/run402/projects.json`, signs x402 payments from the local allowance, exposes `sites.deployDir(...)`, `fileSetFromDir(...)`, and typed deploy-manifest helpers (`loadDeployManifest`, `normalizeDeployManifest`).
288
+ - **`@run402/sdk/node`** — Node-only convenience. Reads `~/.config/run402/projects.json`, signs x402 payments from the local allowance, exposes `sites.deployDir(...)`, `fileSetFromDir(...)`, typed deploy-manifest helpers (`loadDeployManifest`, `normalizeDeployManifest`), and `resolveRun402TargetProfile()` for app build scripts that need the same Core/Cloud target the CLI uses.
289
289
 
290
290
  ```ts
291
291
  import { run402 } from "@run402/sdk/node";
@@ -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,CAQzC;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,99 @@ 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
+ function stripTrailingSlashes(value) {
195
+ return value.replace(/\/+$/, "");
196
+ }
197
+ function isExplicitHttpCoreTarget(apiBase) {
198
+ if (stripTrailingSlashes(apiBase) === stripTrailingSlashes(DEFAULT_API_BASE))
199
+ return false;
200
+ try {
201
+ return new URL(apiBase).protocol === "http:";
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ export function isCoreApiTarget() {
208
+ const apiBase = getApiBase();
209
+ const cfg = readApiTargetConfig();
210
+ if (cfg?.target_kind === "core" && cfg.api_base) {
211
+ return stripTrailingSlashes(apiBase) === stripTrailingSlashes(cfg.api_base);
212
+ }
213
+ if (process.env.RUN402_API_BASE !== undefined && isExplicitHttpCoreTarget(apiBase))
214
+ return true;
215
+ return false;
216
+ }
118
217
  export function getAllowancePath() {
119
218
  if (process.env.RUN402_ALLOWANCE_PATH)
120
219
  return process.env.RUN402_ALLOWANCE_PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvE,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD;;;;;;;;;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,gBAAgB,CAAC;AACvC,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,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"}
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,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,oBAAoB,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAClC,IAAI,GAAG,EAAE,WAAW,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChD,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAK,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,wBAAwB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,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.6",
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",
@@ -10,6 +10,10 @@
10
10
  "type": "string",
11
11
  "description": "Editor metadata only. Manifest adapters strip this before deploy planning."
12
12
  },
13
+ "x-run402-omitted_features": {
14
+ "type": "array",
15
+ "description": "App-kit evidence metadata for humans/agents. Manifest adapters preserve it in the loaded manifest and strip it before deploy planning."
16
+ },
13
17
  "project": {
14
18
  "type": "string",
15
19
  "description": "SDK-native project id."
@@ -196,7 +200,12 @@
196
200
  "additionalProperties": false,
197
201
  "required": ["replace"],
198
202
  "properties": {
199
- "replace": { "$ref": "#/$defs/fileSet" },
203
+ "replace": {
204
+ "oneOf": [
205
+ { "$ref": "#/$defs/fileSet" },
206
+ { "$ref": "#/$defs/localDirRef" }
207
+ ]
208
+ },
200
209
  "public_paths": { "$ref": "#/$defs/sitePublicPaths" }
201
210
  }
202
211
  },
@@ -209,7 +218,12 @@
209
218
  "type": "object",
210
219
  "additionalProperties": false,
211
220
  "properties": {
212
- "put": { "$ref": "#/$defs/fileSet" },
221
+ "put": {
222
+ "oneOf": [
223
+ { "$ref": "#/$defs/fileSet" },
224
+ { "$ref": "#/$defs/localDirRef" }
225
+ ]
226
+ },
213
227
  "delete": {
214
228
  "type": "array",
215
229
  "items": { "type": "string" }
@@ -392,6 +406,19 @@
392
406
  "type": "object",
393
407
  "additionalProperties": { "$ref": "#/$defs/fileEntry" }
394
408
  },
409
+ "localDirRef": {
410
+ "type": "object",
411
+ "additionalProperties": false,
412
+ "required": ["__source", "path"],
413
+ "properties": {
414
+ "__source": { "const": "local-dir" },
415
+ "path": {
416
+ "type": "string",
417
+ "description": "Local directory path resolved by the SDK/CLI from the manifest directory and stripped before the apply request."
418
+ }
419
+ },
420
+ "description": "CLI/MCP/Node SDK authoring form for static site directories. This is never sent to the gateway wire API."
421
+ },
395
422
  "fileEntry": {
396
423
  "oneOf": [
397
424
  { "type": "string" },
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)`, `normalizeDeployManifest(input)`, and `resolveRun402TargetProfile()`. |
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,35 @@ 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
+
30
+ App build scripts should use the same target/profile store instead of parsing `target.json` or `projects.json`:
31
+
32
+ ```ts
33
+ import { resolveRun402TargetProfile } from "@run402/sdk/node";
34
+
35
+ const target = resolveRun402TargetProfile({
36
+ requiredTarget: "core",
37
+ requireProject: true,
38
+ requireAnonKey: true,
39
+ });
40
+
41
+ console.log(target.apiBase, target.projectId, target.anonKey);
42
+ ```
43
+
44
+ For app-specific legacy env names, pass aliases:
45
+
46
+ ```ts
47
+ import { resolveRun402TargetProfile } from "@run402/sdk/node";
48
+
49
+ resolveRun402TargetProfile({
50
+ envAliases: {
51
+ projectId: ["MY_APP_PROJECT_ID"],
52
+ anonKey: ["MY_APP_ANON_KEY"],
53
+ },
54
+ });
55
+ ```
56
+
28
57
  ### Project-scoped sub-client
29
58
 
30
59
  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,99 @@ 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
+ function stripTrailingSlashes(value) {
195
+ return value.replace(/\/+$/, "");
196
+ }
197
+ function isExplicitHttpCoreTarget(apiBase) {
198
+ if (stripTrailingSlashes(apiBase) === stripTrailingSlashes(DEFAULT_API_BASE))
199
+ return false;
200
+ try {
201
+ return new URL(apiBase).protocol === "http:";
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ export function isCoreApiTarget() {
208
+ const apiBase = getApiBase();
209
+ const cfg = readApiTargetConfig();
210
+ if (cfg?.target_kind === "core" && cfg.api_base) {
211
+ return stripTrailingSlashes(apiBase) === stripTrailingSlashes(cfg.api_base);
212
+ }
213
+ if (process.env.RUN402_API_BASE !== undefined && isExplicitHttpCoreTarget(apiBase))
214
+ return true;
215
+ return false;
216
+ }
118
217
  export function getAllowancePath() {
119
218
  if (process.env.RUN402_ALLOWANCE_PATH)
120
219
  return process.env.RUN402_ALLOWANCE_PATH;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EAQtB,WAAW,EACX,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAarB,iBAAiB,EAGjB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAqE3B,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4C9E;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAI3E;;;;OAIG;IACG,IAAI,CACR,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACvD,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;KAAE,CAAC;IAIxE;;;;;OAKG;IACG,MAAM,CACV,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;KACxC,GACA,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QACvC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,YAAY,CAAC;IAMxB;;;;;;;;;OASG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACtE,OAAO,CAAC,YAAY,CAAC;IAqBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC;IA2CzB;;;;OAIG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9B,OAAO,CAAC,iBAAiB,CAAC;IAmB7B;;;;;;OAMG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IA6B9B;;;;;;;;OAQG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GACxB,OAAO,CAAC,oBAAoB,CAAC;IAmBhC;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2B9E;;;;OAIG;IACG,gBAAgB,CACpB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,sBAAsB,CAAC;IAqBlC;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+BnE;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAW1E;AAkjDD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;iEAG6D;IAC7D,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;CACvC"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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"}