@glubean/mcp 0.8.1 → 0.9.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.
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Glubean Cloud client for the MCP open* tools — `/v1/*` ingest contract
3
+ * (GLU-77).
4
+ *
5
+ * The legacy Open Platform (`POST /open/v1/runs` — server-side bundle
6
+ * execution) was retired with the old stack. The new platform API exposes an
7
+ * INGEST model instead: tests execute locally, and the results are POSTed to
8
+ * `POST {apiUrl}/v1/projects/{projectId}/targets/{targetId}/runs` with a
9
+ * Bearer token — the same contract `glubean run --upload` uses.
10
+ *
11
+ * Credential resolution mirrors the CLI (packages/cli/src/lib/auth.ts) —
12
+ * keep the precedence in sync:
13
+ * 1. explicit tool argument
14
+ * 2. process env (GLUBEAN_TOKEN / GLUBEAN_PROJECT_ID / GLUBEAN_TARGET_ID /
15
+ * GLUBEAN_API_URL)
16
+ * 3. project `.env` + `.env.secrets` vars
17
+ * 4. `~/.glubean/credentials.json` (written by `glubean login`)
18
+ *
19
+ * NOT a direct import of `@glubean/cli`: that package exposes only its bin
20
+ * entry (`exports: { ".": dist/main.js }` — importing it executes the CLI
21
+ * program), so the small resolution/upload surface is mirrored here.
22
+ */
23
+ import type { GlobalRules } from "@glubean/redaction";
24
+ /** Mirror of packages/cli/src/lib/constants.ts `DEFAULT_API_URL` (the
25
+ * platform/ingest API, `/v1/*`). */
26
+ export declare const DEFAULT_API_URL = "https://api.glubean.com";
27
+ export interface CloudAuthArgs {
28
+ apiUrl?: string;
29
+ token?: string;
30
+ projectId?: string;
31
+ targetId?: string;
32
+ }
33
+ export interface CloudAuthSources {
34
+ /** Merged vars from `.env` + `.env.secrets` (secrets win on collision). */
35
+ envFileVars?: Record<string, string>;
36
+ }
37
+ export interface ResolvedCloudAuth {
38
+ apiUrl: string;
39
+ token?: string;
40
+ projectId?: string;
41
+ targetId?: string;
42
+ }
43
+ /**
44
+ * Resolve Cloud credentials with the CLI's precedence: explicit argument >
45
+ * process env > .env/.env.secrets vars > ~/.glubean/credentials.json.
46
+ * (`||` not `??` — an empty-string env var is treated as absent, matching
47
+ * the CLI's resolveToken.)
48
+ *
49
+ * Two CLI sources are intentionally NOT mirrored (codex GLU-77 R1):
50
+ * - package.json `glubean.cloud` config — dead in the CLI too: the config
51
+ * consolidation (docs/06 P2) stopped reading the legacy package.json
52
+ * `glubean` shape, so `glubeanConfig.cloud` is always the built-in default
53
+ * (undefined) on the upload path.
54
+ * - per-profile `upload.tokenEnv` — profiles are a `glubean run` concept; the
55
+ * MCP server has no profile context to resolve one from.
56
+ */
57
+ export declare function resolveCloudAuth(args: CloudAuthArgs, sources?: CloudAuthSources): Promise<ResolvedCloudAuth>;
58
+ /** Human-actionable message for a missing credential piece. */
59
+ export declare const MISSING_AUTH_MESSAGES: {
60
+ readonly token: string;
61
+ readonly projectId: string;
62
+ readonly targetId: string;
63
+ };
64
+ /**
65
+ * Resolve the project's DEFAULT target id when none is configured. Fast path
66
+ * (no network): a default project's default target id is deterministic.
67
+ * Fallback: list the project's targets and pick the `"default"` slug, or the
68
+ * single target when there is exactly one. Null → the caller asks the user
69
+ * for an explicit target.
70
+ */
71
+ export declare function resolveDefaultTargetId(apiUrl: string, projectId: string, token: string): Promise<string | null>;
72
+ export declare function runIngestUrl(apiUrl: string, projectId: string, targetId: string): string;
73
+ export declare function runUrl(apiUrl: string, projectId: string, targetId: string, runId: string): string;
74
+ export declare function runTestResultsUrl(apiUrl: string, projectId: string, targetId: string, runId: string): string;
75
+ export declare function runTestEventsUrl(apiUrl: string, projectId: string, targetId: string, runId: string, testId: string): string;
76
+ export declare function cloudFetchJson(url: string, init: RequestInit & {
77
+ token: string;
78
+ timeoutMs?: number;
79
+ }): Promise<unknown>;
80
+ /**
81
+ * Derive the run's environment label from the env file name the way the CLI
82
+ * does: `.env` → "default", `.env.staging` → "staging", `custom.env` →
83
+ * "custom". Keep in sync with the CLI's `envLabelFromEnvFile`.
84
+ */
85
+ export declare function envLabelFromEnvFile(envFile?: string): string;
86
+ export interface UploadRedaction {
87
+ globalRules: GlobalRules;
88
+ replacementFormat: "simple" | "labeled" | "partial";
89
+ }
90
+ /**
91
+ * Load the project's upload redaction rules — the built-in baseline
92
+ * (DEFAULT_GLOBAL_RULES + built-in sensitive keys, applied inside
93
+ * `redactValue`) plus any custom `sensitiveKeys` / `customPatterns` /
94
+ * `replacementFormat` from glubean.yaml `defaults.redaction`. Mirror of the
95
+ * CLI's `resolveRedactionConfig` merge semantics (additive on the baseline);
96
+ * without this, projects relying on custom rules would leak matching values
97
+ * through MCP uploads that the CLI would have scrubbed (codex GLU-77 R1).
98
+ * A missing or malformed glubean.yaml falls back to the baseline.
99
+ */
100
+ export declare function loadUploadRedaction(projectRoot: string): Promise<UploadRedaction>;
101
+ /** Structural view of the fields `buildRunIngestBody` needs from the MCP's
102
+ * `LocalRunSnapshot` (index.ts) — kept structural to avoid an import cycle. */
103
+ export interface SnapshotForUpload {
104
+ /** When the run FINISHED (the snapshot is taken after the run completes). */
105
+ createdAt: string;
106
+ /** When the run STARTED (recorded before execution). Optional for older
107
+ * snapshot shapes; without it, durations fall back to summed test times. */
108
+ startedAt?: string;
109
+ /** Stable per-snapshot idempotency id — re-uploading the SAME snapshot
110
+ * REPLACES the Cloud run (`(targetId, clientRunId)` dedupe) instead of
111
+ * duplicating it. Generated once when the snapshot is taken. */
112
+ clientRunId?: string;
113
+ fileUrl: string;
114
+ projectRoot: string;
115
+ summary: {
116
+ total: number;
117
+ passed: number;
118
+ failed: number;
119
+ skipped: number;
120
+ };
121
+ results: Array<{
122
+ exportName: string;
123
+ id: string;
124
+ name?: string;
125
+ success: boolean;
126
+ skipped?: boolean;
127
+ durationMs: number;
128
+ assertions: Array<{
129
+ passed: boolean;
130
+ message: string;
131
+ actual?: unknown;
132
+ expected?: unknown;
133
+ }>;
134
+ logs: Array<{
135
+ message: string;
136
+ data?: unknown;
137
+ }>;
138
+ error?: {
139
+ message: string;
140
+ stack?: string;
141
+ };
142
+ }>;
143
+ filter?: string;
144
+ }
145
+ /**
146
+ * Build the `RunIngest` wire body (kind=test, schemaVersion=glubean.test.v1)
147
+ * from a local run snapshot.
148
+ *
149
+ * - The `result` blob is shaped like the CLI's payload (`tests[].events`) so
150
+ * Cloud's per-test events drill-down (`extractTestEvents`) can read it.
151
+ * - Traces are intentionally NOT uploaded: the MCP's local trace view keeps
152
+ * the `authorization` header for AI debugging (DEFAULT_MCP_TRACE_CONFIG) —
153
+ * that must never leave the machine.
154
+ * - The blob is deep-redacted client-side before upload (assertion
155
+ * actual/expected and log data can carry live secrets). The server does a
156
+ * baseline pass too, but the client scrubs first — same policy as the CLI.
157
+ */
158
+ export declare function buildRunIngestBody(snapshot: SnapshotForUpload, opts?: {
159
+ environment?: string;
160
+ redaction?: UploadRedaction;
161
+ }): Record<string, unknown>;
162
+ //# sourceMappingURL=cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD;qCACqC;AACrC,eAAO,MAAM,eAAe,4BAA4B,CAAC;AAIzD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CA6B5B;AAED,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB;;;;CAaxB,CAAC;AAOX;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAER;AAgDD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD,OAAO,CAAC,OAAO,CAAC,CAiClB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5D;AAID,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CACrD;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4CvF;AAQD;gFACgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB;iFAC6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;qEAEiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,OAAO,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,KAAK,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,OAAO,CAAC;YACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;QACH,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACjD,KAAK,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,eAAe,CAAA;CAAE,GAC3D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0FzB"}
package/dist/cloud.js ADDED
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Glubean Cloud client for the MCP open* tools — `/v1/*` ingest contract
3
+ * (GLU-77).
4
+ *
5
+ * The legacy Open Platform (`POST /open/v1/runs` — server-side bundle
6
+ * execution) was retired with the old stack. The new platform API exposes an
7
+ * INGEST model instead: tests execute locally, and the results are POSTed to
8
+ * `POST {apiUrl}/v1/projects/{projectId}/targets/{targetId}/runs` with a
9
+ * Bearer token — the same contract `glubean run --upload` uses.
10
+ *
11
+ * Credential resolution mirrors the CLI (packages/cli/src/lib/auth.ts) —
12
+ * keep the precedence in sync:
13
+ * 1. explicit tool argument
14
+ * 2. process env (GLUBEAN_TOKEN / GLUBEAN_PROJECT_ID / GLUBEAN_TARGET_ID /
15
+ * GLUBEAN_API_URL)
16
+ * 3. project `.env` + `.env.secrets` vars
17
+ * 4. `~/.glubean/credentials.json` (written by `glubean login`)
18
+ *
19
+ * NOT a direct import of `@glubean/cli`: that package exposes only its bin
20
+ * entry (`exports: { ".": dist/main.js }` — importing it executes the CLI
21
+ * program), so the small resolution/upload surface is mirrored here.
22
+ */
23
+ import { readFile } from "node:fs/promises";
24
+ import { basename, extname, join, resolve } from "node:path";
25
+ import { randomUUID } from "node:crypto";
26
+ import { parse as parseYaml } from "yaml";
27
+ import { DEFAULT_GLOBAL_RULES, redactValue } from "@glubean/redaction";
28
+ import { MCP_PACKAGE_VERSION } from "./version.js";
29
+ /** Mirror of packages/cli/src/lib/constants.ts `DEFAULT_API_URL` (the
30
+ * platform/ingest API, `/v1/*`). */
31
+ export const DEFAULT_API_URL = "https://api.glubean.com";
32
+ async function readCredentialsFile() {
33
+ const home = process.env.HOME || process.env.USERPROFILE;
34
+ if (!home)
35
+ return null;
36
+ try {
37
+ const text = await readFile(join(home, ".glubean", "credentials.json"), "utf-8");
38
+ return JSON.parse(text);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Resolve Cloud credentials with the CLI's precedence: explicit argument >
46
+ * process env > .env/.env.secrets vars > ~/.glubean/credentials.json.
47
+ * (`||` not `??` — an empty-string env var is treated as absent, matching
48
+ * the CLI's resolveToken.)
49
+ *
50
+ * Two CLI sources are intentionally NOT mirrored (codex GLU-77 R1):
51
+ * - package.json `glubean.cloud` config — dead in the CLI too: the config
52
+ * consolidation (docs/06 P2) stopped reading the legacy package.json
53
+ * `glubean` shape, so `glubeanConfig.cloud` is always the built-in default
54
+ * (undefined) on the upload path.
55
+ * - per-profile `upload.tokenEnv` — profiles are a `glubean run` concept; the
56
+ * MCP server has no profile context to resolve one from.
57
+ */
58
+ export async function resolveCloudAuth(args, sources) {
59
+ const envFileVars = sources?.envFileVars ?? {};
60
+ const fromEnv = (name) => process.env[name] || envFileVars[name] || undefined;
61
+ // Only hit the credentials file when something is still unresolved.
62
+ let credsCache;
63
+ const creds = async () => {
64
+ if (credsCache === undefined)
65
+ credsCache = await readCredentialsFile();
66
+ return credsCache;
67
+ };
68
+ const token = args.token || fromEnv("GLUBEAN_TOKEN") || (await creds())?.token || undefined;
69
+ const projectId = args.projectId ||
70
+ fromEnv("GLUBEAN_PROJECT_ID") ||
71
+ (await creds())?.projectId ||
72
+ undefined;
73
+ // The credentials file has no target — the target is per-project config.
74
+ const targetId = args.targetId || fromEnv("GLUBEAN_TARGET_ID") || undefined;
75
+ const apiUrl = (args.apiUrl ||
76
+ fromEnv("GLUBEAN_API_URL") ||
77
+ (await creds())?.apiUrl ||
78
+ DEFAULT_API_URL).replace(/\/+$/, "");
79
+ return { apiUrl, token, projectId, targetId };
80
+ }
81
+ /** Human-actionable message for a missing credential piece. */
82
+ export const MISSING_AUTH_MESSAGES = {
83
+ token: "No Glubean Cloud token configured. Pass `token`, set GLUBEAN_TOKEN " +
84
+ "(process env or .env.secrets in the project root), or run `glubean login` " +
85
+ "(writes ~/.glubean/credentials.json).",
86
+ projectId: "No Glubean Cloud project configured. Pass `projectId`, set " +
87
+ "GLUBEAN_PROJECT_ID (process env or .env in the project root), or run " +
88
+ "`glubean login`.",
89
+ targetId: "Could not resolve the target for this project. Pass `targetId` or set " +
90
+ "GLUBEAN_TARGET_ID — the project has no unambiguous default target, or " +
91
+ "the token lacks the targets:read scope needed to list targets.",
92
+ };
93
+ /** A DEFAULT project's id is `proj_default_<orgId>`; its auto-provisioned
94
+ * default target is `tgt_default_<orgId>` (mirror of the CLI's
95
+ * resolveDefaultTargetId — migration-stable id scheme). */
96
+ const DEFAULT_PROJECT_PREFIX = "proj_default_";
97
+ /**
98
+ * Resolve the project's DEFAULT target id when none is configured. Fast path
99
+ * (no network): a default project's default target id is deterministic.
100
+ * Fallback: list the project's targets and pick the `"default"` slug, or the
101
+ * single target when there is exactly one. Null → the caller asks the user
102
+ * for an explicit target.
103
+ */
104
+ export async function resolveDefaultTargetId(apiUrl, projectId, token) {
105
+ if (projectId.startsWith(DEFAULT_PROJECT_PREFIX)) {
106
+ return `tgt_default_${projectId.slice(DEFAULT_PROJECT_PREFIX.length)}`;
107
+ }
108
+ try {
109
+ const resp = await fetch(`${apiUrl}/v1/projects/${encodeURIComponent(projectId)}/targets`, { headers: { Authorization: `Bearer ${token}` } });
110
+ if (!resp.ok)
111
+ return null;
112
+ const targets = (await resp.json());
113
+ if (!Array.isArray(targets))
114
+ return null;
115
+ const ids = targets.filter((t) => typeof t?.id === "string");
116
+ const def = ids.find((t) => t.slug === "default");
117
+ if (def)
118
+ return def.id;
119
+ return ids.length === 1 ? ids[0].id : null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ // ── /v1 endpoint URLs ────────────────────────────────────────────────────────
126
+ function runsBase(apiUrl, projectId, targetId) {
127
+ return (`${apiUrl.replace(/\/+$/, "")}/v1/projects/${encodeURIComponent(projectId)}` +
128
+ `/targets/${encodeURIComponent(targetId)}/runs`);
129
+ }
130
+ export function runIngestUrl(apiUrl, projectId, targetId) {
131
+ return runsBase(apiUrl, projectId, targetId);
132
+ }
133
+ export function runUrl(apiUrl, projectId, targetId, runId) {
134
+ return `${runsBase(apiUrl, projectId, targetId)}/${encodeURIComponent(runId)}`;
135
+ }
136
+ export function runTestResultsUrl(apiUrl, projectId, targetId, runId) {
137
+ return `${runUrl(apiUrl, projectId, targetId, runId)}/test-results`;
138
+ }
139
+ export function runTestEventsUrl(apiUrl, projectId, targetId, runId, testId) {
140
+ return `${runUrl(apiUrl, projectId, targetId, runId)}/tests/${encodeURIComponent(testId)}/events`;
141
+ }
142
+ // ── Fetch with human-actionable error mapping ────────────────────────────────
143
+ /**
144
+ * Scrub bearer-token-shaped strings from server error text before it reaches
145
+ * the MCP client — a misconfigured apiUrl / proxy can echo request headers
146
+ * (including `Authorization: Bearer glb_…`) back in the error body.
147
+ */
148
+ function scrubTokens(text) {
149
+ return text
150
+ .replace(/glb_[A-Za-z0-9_-]{6,}/g, "glb_[redacted]")
151
+ .replace(/Bearer\s+[A-Za-z0-9._~+/=-]{6,}/gi, "Bearer [redacted]");
152
+ }
153
+ function friendlyHttpError(status, body) {
154
+ const detail = scrubTokens(body.slice(0, 2000));
155
+ switch (status) {
156
+ case 401:
157
+ return (`Unauthorized (401): the Cloud rejected the token. Check GLUBEAN_TOKEN ` +
158
+ `(is it expired or for a different environment?) or run \`glubean login\`. ${detail}`);
159
+ case 403:
160
+ return (`Forbidden (403): the token lacks the required scope (runs:read / ` +
161
+ `runs:write) or its user lost project membership. ${detail}`);
162
+ case 404:
163
+ return (`Not found (404): check projectId / targetId / runId — or the apiUrl ` +
164
+ `points at the wrong service (the ingest API is the platform API, ` +
165
+ `default ${DEFAULT_API_URL}). ${detail}`);
166
+ case 413:
167
+ return `Payload too large (413): the run body exceeds the ingest cap. ${detail}`;
168
+ case 429:
169
+ return `Ingest quota exceeded (429): too many runs in the current window. ${detail}`;
170
+ default:
171
+ return `HTTP ${status}: ${detail}`;
172
+ }
173
+ }
174
+ /** Default request timeout — an MCP tool must not hang on a stalled network
175
+ * call (mirrors the spirit of the CLI's RESULTS_TIMEOUT_MS, slightly wider
176
+ * since ingest bodies can be larger than a status GET). */
177
+ const CLOUD_FETCH_TIMEOUT_MS = 15_000;
178
+ export async function cloudFetchJson(url, init) {
179
+ const { token, timeoutMs, ...fetchInit } = init;
180
+ const budget = timeoutMs ?? CLOUD_FETCH_TIMEOUT_MS;
181
+ const controller = new AbortController();
182
+ const timer = setTimeout(() => controller.abort(), budget);
183
+ let res;
184
+ try {
185
+ res = await fetch(url, {
186
+ ...fetchInit,
187
+ signal: controller.signal,
188
+ headers: {
189
+ ...(fetchInit.headers ?? {}),
190
+ Authorization: `Bearer ${token}`,
191
+ },
192
+ });
193
+ }
194
+ catch (err) {
195
+ if (err instanceof DOMException && err.name === "AbortError") {
196
+ throw new Error(`Request to Glubean Cloud timed out after ${budget}ms — check the apiUrl and your network.`);
197
+ }
198
+ throw err;
199
+ }
200
+ finally {
201
+ clearTimeout(timer);
202
+ }
203
+ const text = await res.text();
204
+ if (!res.ok)
205
+ throw new Error(friendlyHttpError(res.status, text));
206
+ if (!text)
207
+ return null;
208
+ try {
209
+ return JSON.parse(text);
210
+ }
211
+ catch {
212
+ return text;
213
+ }
214
+ }
215
+ // ── Upload environment label (mirror of packages/cli/src/lib/upload.ts) ─────
216
+ /**
217
+ * Derive the run's environment label from the env file name the way the CLI
218
+ * does: `.env` → "default", `.env.staging` → "staging", `custom.env` →
219
+ * "custom". Keep in sync with the CLI's `envLabelFromEnvFile`.
220
+ */
221
+ export function envLabelFromEnvFile(envFile) {
222
+ const fileName = basename(envFile || ".env");
223
+ if (fileName === ".env")
224
+ return "default";
225
+ if (fileName.startsWith(".env.")) {
226
+ return fileName.slice(".env.".length) || "default";
227
+ }
228
+ const ext = extname(fileName);
229
+ const stem = ext ? basename(fileName, ext) : fileName;
230
+ return stem || "default";
231
+ }
232
+ /**
233
+ * Load the project's upload redaction rules — the built-in baseline
234
+ * (DEFAULT_GLOBAL_RULES + built-in sensitive keys, applied inside
235
+ * `redactValue`) plus any custom `sensitiveKeys` / `customPatterns` /
236
+ * `replacementFormat` from glubean.yaml `defaults.redaction`. Mirror of the
237
+ * CLI's `resolveRedactionConfig` merge semantics (additive on the baseline);
238
+ * without this, projects relying on custom rules would leak matching values
239
+ * through MCP uploads that the CLI would have scrubbed (codex GLU-77 R1).
240
+ * A missing or malformed glubean.yaml falls back to the baseline.
241
+ */
242
+ export async function loadUploadRedaction(projectRoot) {
243
+ const rules = structuredClone(DEFAULT_GLOBAL_RULES);
244
+ let replacementFormat = "partial";
245
+ try {
246
+ const parsed = parseYaml(await readFile(resolve(projectRoot, "glubean.yaml"), "utf-8"));
247
+ const input = parsed?.defaults?.redaction;
248
+ if (input) {
249
+ if (Array.isArray(input.sensitiveKeys)) {
250
+ for (const key of input.sensitiveKeys) {
251
+ if (typeof key === "string" && !rules.sensitiveKeys.includes(key)) {
252
+ rules.sensitiveKeys.push(key);
253
+ }
254
+ }
255
+ }
256
+ if (Array.isArray(input.customPatterns)) {
257
+ for (const pattern of input.customPatterns) {
258
+ const p = pattern;
259
+ if (p && typeof p.name === "string" && typeof p.regex === "string") {
260
+ rules.customPatterns.push({ name: p.name, regex: p.regex });
261
+ }
262
+ }
263
+ }
264
+ if (input.replacementFormat === "simple" ||
265
+ input.replacementFormat === "labeled" ||
266
+ input.replacementFormat === "partial") {
267
+ replacementFormat = input.replacementFormat;
268
+ }
269
+ }
270
+ }
271
+ catch {
272
+ // Missing/unreadable glubean.yaml → baseline rules.
273
+ }
274
+ return { globalRules: rules, replacementFormat };
275
+ }
276
+ /**
277
+ * Build the `RunIngest` wire body (kind=test, schemaVersion=glubean.test.v1)
278
+ * from a local run snapshot.
279
+ *
280
+ * - The `result` blob is shaped like the CLI's payload (`tests[].events`) so
281
+ * Cloud's per-test events drill-down (`extractTestEvents`) can read it.
282
+ * - Traces are intentionally NOT uploaded: the MCP's local trace view keeps
283
+ * the `authorization` header for AI debugging (DEFAULT_MCP_TRACE_CONFIG) —
284
+ * that must never leave the machine.
285
+ * - The blob is deep-redacted client-side before upload (assertion
286
+ * actual/expected and log data can carry live secrets). The server does a
287
+ * baseline pass too, but the client scrubs first — same policy as the CLI.
288
+ */
289
+ export function buildRunIngestBody(snapshot, opts) {
290
+ const summedMs = snapshot.results.reduce((acc, r) => acc + r.durationMs, 0);
291
+ const { total, passed, failed, skipped } = snapshot.summary;
292
+ // `createdAt` is the run's END (the snapshot is taken after the run). When
293
+ // the snapshot carries a real start time, duration is wall-clock; otherwise
294
+ // (older shape) fall back to summed per-test durations from the start.
295
+ const startedAt = snapshot.startedAt ?? snapshot.createdAt;
296
+ const durationMs = snapshot.startedAt
297
+ ? Math.max(0, Date.parse(snapshot.createdAt) - Date.parse(snapshot.startedAt))
298
+ : summedMs;
299
+ const completedAt = snapshot.startedAt
300
+ ? snapshot.createdAt
301
+ : new Date(Date.parse(startedAt) + summedMs).toISOString();
302
+ const tests = snapshot.results.map((r) => ({
303
+ testId: r.id,
304
+ testName: r.name ?? r.id,
305
+ success: r.success,
306
+ durationMs: r.durationMs,
307
+ events: [
308
+ ...r.assertions.map((a) => ({
309
+ type: "assertion",
310
+ passed: a.passed,
311
+ message: a.message,
312
+ ...(a.actual !== undefined ? { actual: a.actual } : {}),
313
+ ...(a.expected !== undefined ? { expected: a.expected } : {}),
314
+ })),
315
+ ...r.logs.map((l) => ({
316
+ type: "log",
317
+ message: l.message,
318
+ ...(l.data !== undefined ? { data: l.data } : {}),
319
+ })),
320
+ ...(r.error ? [{ type: "error", message: r.error.message }] : []),
321
+ {
322
+ type: "status",
323
+ status: r.skipped ? "skipped" : r.success ? "completed" : "failed",
324
+ },
325
+ ],
326
+ }));
327
+ const resultBlob = {
328
+ runAt: startedAt,
329
+ summary: { total, passed, failed, skipped, durationMs },
330
+ context: {
331
+ source: "@glubean/mcp",
332
+ mcpVersion: MCP_PACKAGE_VERSION,
333
+ fileUrl: snapshot.fileUrl,
334
+ ...(snapshot.filter ? { filter: snapshot.filter } : {}),
335
+ },
336
+ tests,
337
+ };
338
+ const redaction = opts?.redaction ?? {
339
+ globalRules: DEFAULT_GLOBAL_RULES,
340
+ replacementFormat: "partial",
341
+ };
342
+ const redactedResult = redactValue(resultBlob, {
343
+ globalRules: redaction.globalRules,
344
+ replacementFormat: redaction.replacementFormat,
345
+ maxDepth: 64,
346
+ });
347
+ // Per-test rows → server `test_result` (single-test history / flaky
348
+ // substrate). Clean skip → "skipped" (excluded from flaky denominators).
349
+ const testResults = snapshot.results.map((r) => ({
350
+ testId: r.id,
351
+ name: r.name ?? r.id,
352
+ status: r.skipped ? "skipped" : r.success ? "passed" : "failed",
353
+ durationMs: r.durationMs,
354
+ }));
355
+ return {
356
+ kind: "test",
357
+ schemaVersion: "glubean.test.v1",
358
+ // Stable idempotency id (P1) — re-uploading the same snapshot replaces
359
+ // the run server-side instead of duplicating it. The snapshot carries the
360
+ // id (generated once at snapshot time); randomUUID is only the fallback
361
+ // for older snapshot shapes.
362
+ clientRunId: snapshot.clientRunId ?? randomUUID(),
363
+ status: failed > 0 ? "failed" : "passed",
364
+ startedAt,
365
+ completedAt,
366
+ durationMs,
367
+ summary: { total, passed, failed, skipped, durationMs },
368
+ result: redactedResult,
369
+ ...(testResults.length > 0 ? { testResults } : {}),
370
+ trigger: "mcp",
371
+ runnerVersion: MCP_PACKAGE_VERSION,
372
+ ...(opts?.environment ? { environment: opts.environment } : {}),
373
+ };
374
+ }
375
+ //# sourceMappingURL=cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,23 @@ export declare function findProjectRoot(startDir: string): Promise<string>;
7
7
  * Convention: `.env` → `.env.secrets`, `.env.staging` → `.env.staging.secrets`.
8
8
  */
9
9
  export declare function deriveSecretsPath(envPath: string): string;
10
+ /**
11
+ * Thrown by `resolveEnvPath` when the active env resolves to a sensitive
12
+ * (prod-like) name and no explicit `envFile` was given. Callers should let
13
+ * this propagate — the MCP SDK surfaces thrown errors as a tool error
14
+ * response, which is exactly the "loud failure instead of silent prod
15
+ * upload" behavior GLU-88 requires.
16
+ */
17
+ export declare class SensitiveActiveEnvError extends Error {
18
+ readonly envName: string;
19
+ constructor(envName: string);
20
+ }
21
+ /**
22
+ * Resolve the env file path, checking `.glubean/active-env` when no explicit envFile is given.
23
+ * Throws `SensitiveActiveEnvError` instead of silently resolving a prod-like
24
+ * active-env (GLU-88) — explicit `envFile` always bypasses this check.
25
+ */
26
+ export declare function resolveEnvPath(projectRoot: string, envFile?: string): Promise<string>;
10
27
  /**
11
28
  * Unified test metadata for MCP discovery.
12
29
  * Follows CLI's DiscoveredTestMeta pattern — contract cases carry
@@ -76,7 +93,14 @@ export interface LocalDebugEvent {
76
93
  };
77
94
  }
78
95
  export interface LocalRunSnapshot {
96
+ /** When the run finished (the snapshot is taken after completion). */
79
97
  createdAt: string;
98
+ /** When the run started (recorded before execution) — the honest
99
+ * `startedAt` for the Cloud upload envelope. */
100
+ startedAt: string;
101
+ /** Stable idempotency id for Cloud upload — re-uploading the SAME snapshot
102
+ * replaces the Cloud run instead of duplicating it. */
103
+ clientRunId: string;
80
104
  fileUrl: string;
81
105
  projectRoot: string;
82
106
  summary: {
@@ -89,6 +113,8 @@ export interface LocalRunSnapshot {
89
113
  includeLogs: boolean;
90
114
  includeTraces: boolean;
91
115
  filter?: string;
116
+ /** The envFile argument the run was executed with (env label provenance). */
117
+ envFile?: string;
92
118
  }
93
119
  export interface ConfigDiagnostics {
94
120
  projectRoot: string;
@@ -166,6 +192,14 @@ export declare function runLocalTestsFromFile(args: {
166
192
  failed: number;
167
193
  skipped: number;
168
194
  };
195
+ /**
196
+ * The RESOLVED env file path this run used (explicit envFile, else
197
+ * `.glubean/active-env`, else `.env`). Recorded on the snapshot so a later
198
+ * Cloud upload sources credentials + the environment label from the env
199
+ * the run ACTUALLY used — even if active-env changes in between (codex
200
+ * GLU-77 R3). Absent only on the version-skew early return (no run).
201
+ */
202
+ envPath?: string;
169
203
  error?: string;
170
204
  /** Runner-fallback or protocol warnings emitted by the executor. (Plan 1 AC6) */
171
205
  warnings?: string[];
@@ -188,7 +222,7 @@ export declare const MCP_TOOL_NAMES: {
188
222
  readonly openapi: "glubean_openapi";
189
223
  readonly diagnoseConfig: "glubean_diagnose_config";
190
224
  readonly getMetadata: "glubean_get_metadata";
191
- readonly openTriggerRun: "glubean_open_trigger_run";
225
+ readonly openUploadRun: "glubean_open_upload_run";
192
226
  readonly openGetRun: "glubean_open_get_run";
193
227
  readonly openGetRunEvents: "glubean_open_get_run_events";
194
228
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}