@mongodb-js/harness-tester 3.0.3 → 3.0.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.
package/README.md CHANGED
@@ -11,4 +11,21 @@ What lives here:
11
11
  - `useAgent({ harness })` — pure agent hook: temp workdir, availability skip gate, and base `AgentHarnessOptions` (model overrides, timeout).
12
12
  - `AGENT_HARNESSES` — the registry of harness classes.
13
13
 
14
+ ## Remote servers: headers and OAuth
15
+
16
+ `AgentHarnessOptions` can point a harness at a remote MCP server instead of spawning one:
17
+
18
+ - `serverUrl` — streamable HTTP endpoint (mutually exclusive with `stdioServer`).
19
+ - `headers` — extra HTTP headers for that server, e.g. `{ Authorization: "Bearer ..." }`.
20
+ - `oauth` — pre-seeded OAuth credentials (`accessToken`, and optional `refreshToken`, `expiresAt`, `clientId`, `clientSecret`, `scopes`, `issuer`). The harness writes them into the agent's native credential store before startup, so no interactive browser login is needed.
21
+
22
+ Where `oauth` is written:
23
+
24
+ | Harness | Store |
25
+ | ------- | ---------------------------------------------------------------------------------------------------- |
26
+ | codex | `$CODEX_HOME/.credentials.json`, with `mcp_oauth_credentials_store = "file"` in the generated config |
27
+ | claude | the `mcpOAuth` map in `$CLAUDE_CONFIG_DIR/.credentials.json` |
28
+
29
+ `oauth` cannot be combined with `stdioServer`. On macOS, claude normally reads the `Claude Code-credentials` OS keychain, which the seeded file does not override (the file store is the fallback used on CI/Linux).
30
+
14
31
  The MCP/MongoDB side of an e2e suite (in-process MongoDB MCP server, mongod spin-up, connection wiring) lives in `packages/e2e-tests` (`useMcpAgent`), which composes with the `useAgent` hook here. See that package's README.
@@ -16,6 +16,19 @@ export declare class ClaudeHarnessConfig implements AgentHarnessConfig {
16
16
  getHostHomeDir(): string;
17
17
  buildConfig(options: AgentHarnessOptions): string;
18
18
  }
19
+ /**
20
+ * Pre-seed `mcpOAuth` tokens in the session's `.credentials.json`, keyed by
21
+ * {@link oauthCredentialStoreKey}, so claude connects to a remote server without
22
+ * an interactive browser login. No-op unless `options.oauth` is set.
23
+ *
24
+ * Caveat: on macOS claude normally reads the `Claude Code-credentials` OS
25
+ * keychain, which this file does not override; the file store is the fallback
26
+ * (and what CI/Linux use).
27
+ */
28
+ export declare function seedClaudeOAuthCredentials({ homeDir, options, }: {
29
+ homeDir: string;
30
+ options: AgentHarnessOptions;
31
+ }): void;
19
32
  /**
20
33
  * Pre-seed the hermetic claude home to suppress onboarding/trust dialogs.
21
34
  * Mutates nothing outside the home.
@@ -1 +1 @@
1
- {"version":3,"file":"claudeConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,0EAA0E,CAAC;AAEhH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAIvE;AAED,0HAA0H;AAC1H,wBAAgB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBnF;AAED,uGAAuG;AACvG,qBAAa,mBAAoB,YAAW,kBAAkB;IAC1D,QAAQ,CAAC,aAAa,uBAAuB;IAC7C,QAAQ,CAAC,cAAc,qBAAqB;IAE5C,sEAAsE;IACtE,cAAc,IAAI,MAAM;IAIxB,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM;CAYpD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,aAAuB,GAC1B,EAAE;IACC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CAsBP"}
1
+ {"version":3,"file":"claudeConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAEjD,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,0EAA0E,CAAC;AAEhH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAIvE;AAED,0HAA0H;AAC1H,wBAAgB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBnF;AAED,uGAAuG;AACvG,qBAAa,mBAAoB,YAAW,kBAAkB;IAC1D,QAAQ,CAAC,aAAa,uBAAuB;IAC7C,QAAQ,CAAC,cAAc,qBAAqB;IAE5C,sEAAsE;IACtE,cAAc,IAAI,MAAM;IAIxB,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM;CAgBpD;AAWD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,EACvC,OAAO,EACP,OAAO,GACV,EAAE;IACC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,mBAAmB,CAAC;CAChC,GAAG,IAAI,CA6BP;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,aAAuB,GAC1B,EAAE;IACC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CAsBP"}
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- import { canonicalPath } from "../shared.js";
4
+ import { canonicalPath, oauthCredentialStoreKey } from "../shared.js";
5
5
  /** Default model: grove serves the undated id; `haiku` resolves to a dated id it lacks. */
6
6
  export const DEFAULT_CLAUDE_MODEL = "claude-haiku-4-5";
7
7
  /** Minimum reasoning effort for e2e runs (mirrors the codex harness's `"low"`). */
@@ -51,10 +51,62 @@ export class ClaudeHarnessConfig {
51
51
  args: options.stdioServer.args,
52
52
  env: options.stdioServer.env,
53
53
  }
54
- : { type: "http", url: options.serverUrl ?? "" };
54
+ : {
55
+ type: "http",
56
+ url: options.serverUrl ?? "",
57
+ ...(options.headers && Object.keys(options.headers).length > 0 ? { headers: options.headers } : {}),
58
+ };
55
59
  return JSON.stringify({ mcpServers: { [mcpServerName]: server } }, null, 2);
56
60
  }
57
61
  }
62
+ /** Read and parse a JSON file, or `undefined` when missing/unreadable. */
63
+ function readJsonFile(filePath) {
64
+ try {
65
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ }
71
+ /**
72
+ * Pre-seed `mcpOAuth` tokens in the session's `.credentials.json`, keyed by
73
+ * {@link oauthCredentialStoreKey}, so claude connects to a remote server without
74
+ * an interactive browser login. No-op unless `options.oauth` is set.
75
+ *
76
+ * Caveat: on macOS claude normally reads the `Claude Code-credentials` OS
77
+ * keychain, which this file does not override; the file store is the fallback
78
+ * (and what CI/Linux use).
79
+ */
80
+ export function seedClaudeOAuthCredentials({ homeDir, options, }) {
81
+ if (!options.oauth || !options.serverUrl) {
82
+ return;
83
+ }
84
+ const { oauth } = options;
85
+ const serverName = options.mcpServerName ?? "mongo";
86
+ const credentialsPath = path.join(homeDir, ".credentials.json");
87
+ const existing = readJsonFile(credentialsPath) ?? {};
88
+ const mcpOAuth = { ...(existing.mcpOAuth ?? {}) };
89
+ const key = oauthCredentialStoreKey({
90
+ serverName,
91
+ serverUrl: options.serverUrl,
92
+ headers: options.headers,
93
+ });
94
+ mcpOAuth[key] = {
95
+ serverName,
96
+ serverUrl: options.serverUrl,
97
+ accessToken: oauth.accessToken,
98
+ ...(oauth.refreshToken !== undefined ? { refreshToken: oauth.refreshToken } : {}),
99
+ ...(oauth.expiresAt !== undefined ? { expiresAt: oauth.expiresAt } : {}),
100
+ ...(oauth.clientId !== undefined ? { clientId: oauth.clientId } : {}),
101
+ ...(oauth.clientSecret !== undefined ? { clientSecret: oauth.clientSecret } : {}),
102
+ ...(oauth.issuer !== undefined ? { issuer: oauth.issuer } : {}),
103
+ // Only set the discovery URL from the actual issuer: the MCP resource URL is a
104
+ // different host (e.g. mcp.mongodb.com vs cloud.mongodb.com), so falling back to
105
+ // it would make Claude refresh against the wrong authorization server.
106
+ ...(oauth.issuer !== undefined ? { discoveryState: { authorizationServerUrl: oauth.issuer } } : {}),
107
+ };
108
+ fs.writeFileSync(credentialsPath, JSON.stringify({ ...existing, mcpOAuth }, null, 2), { mode: 0o600 });
109
+ }
58
110
  /**
59
111
  * Pre-seed the hermetic claude home to suppress onboarding/trust dialogs.
60
112
  * Mutates nothing outside the home.
@@ -1 +1 @@
1
- {"version":3,"file":"claudeConfig.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeConfig.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claudeHarness.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/claudeHarness.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAU5D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,WAAW,uBAAuB;IACpC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;gBAExC,OAAO,GAAE,uBAA4B;IAQjD,aAAa,IAAI,MAAM;IAIvB,UAAU,IAAI,OAAO;IAIrB,2FAA2F;IAC3F,WAAW,IAAI,OAAO;IAehB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;CAiDnE"}
1
+ {"version":3,"file":"claudeHarness.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/claudeHarness.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAW5D,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,WAAW,uBAAuB;IACpC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;gBAExC,OAAO,GAAE,uBAA4B;IAQjD,aAAa,IAAI,MAAM;IAIvB,UAAU,IAAI,OAAO;IAIrB,2FAA2F;IAC3F,WAAW,IAAI,OAAO;IAehB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;CAmDnE"}
@@ -2,8 +2,8 @@ import { execFileSync } from "node:child_process";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { TuiTest } from "@microsoft/tui-test";
5
- import { ClaudeHarnessConfig, buildClaudeEnv, DEFAULT_CLAUDE_EFFORT_LEVEL, resolveClaudeModel, seedClaudeHome, } from "./claudeConfig.js";
6
- import { resolveBackend } from "../shared.js";
5
+ import { ClaudeHarnessConfig, buildClaudeEnv, DEFAULT_CLAUDE_EFFORT_LEVEL, resolveClaudeModel, seedClaudeHome, seedClaudeOAuthCredentials, } from "./claudeConfig.js";
6
+ import { assertRemoteServerOptions, resolveBackend } from "../shared.js";
7
7
  import { HarnessLogger } from "../logger.js";
8
8
  import { ClaudeTuiSession } from "./claudeSession.js";
9
9
  export class ClaudeTuiHarness {
@@ -39,6 +39,7 @@ export class ClaudeTuiHarness {
39
39
  return false;
40
40
  }
41
41
  async start(options) {
42
+ assertRemoteServerOptions(options);
42
43
  // Per-session CLAUDE_CONFIG_DIR: developer config untouched, no state or JSONL reused.
43
44
  const config = new ClaudeHarnessConfig();
44
45
  const claudeHome = path.join(options.workDir, `claude-home-${Math.random().toString(36).slice(2, 8)}`);
@@ -46,6 +47,7 @@ export class ClaudeTuiHarness {
46
47
  // Pre-seed onboarding/trust state + MCP config (whitelists MCP tools, so no permission flags needed).
47
48
  const mcpServerName = options.mcpServerName ?? "mongo";
48
49
  seedClaudeHome({ homeDir: claudeHome, workDir: options.workDir, mcpServerName });
50
+ seedClaudeOAuthCredentials({ homeDir: claudeHome, options });
49
51
  const mcpConfig = config.buildConfig(options);
50
52
  const mcpConfigPath = path.join(claudeHome, config.configFileName);
51
53
  await fs.writeFile(mcpConfigPath, mcpConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"claudeHarness.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeHarness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudeHarness.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeHarness.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import type { AgentHarnessConfig, AgentHarnessOptions } from "../types.js";
2
- /** Fallback model when neither the real config nor an override is available. */
3
- export declare const DEFAULT_CODEX_MODEL = "gpt-5.6-luna";
2
+ /**
3
+ * Fallback model when neither the real config nor an override is available.
4
+ * Keep this on the latest model codex ships, so codex does not show its
5
+ * "Try new model" onboarding dialog (which blocks the composer) on first run.
6
+ */
7
+ export declare const DEFAULT_CODEX_MODEL = "gpt-6-luna";
4
8
  /** Reasoning effort applied to the harness session's model. */
5
9
  export declare const DEFAULT_CODEX_REASONING_EFFORT = "low";
6
10
  /** {@link AgentHarnessConfig} for codex (OpenAI CLI agent). */
@@ -27,12 +31,24 @@ export declare class CodexHarnessConfig implements AgentHarnessConfig {
27
31
  */
28
32
  private copyCatalogWithLiftedTruncation;
29
33
  /**
30
- * Whitelist the session to MCP tools only: disable shell + web-search and
31
- * pin the sandbox to read-only (the MCP HTTP call runs in the orchestrator,
32
- * outside the sandbox).
34
+ * Top-level scalars; must precede every table header (otherwise TOML absorbs them into the
35
+ * following `[mcp_servers.X.env]`/`.http_headers` table and codex rejects a non-string env value).
33
36
  */
37
+ private buildSandboxTopLevelToml;
38
+ /** Whitelist the session to MCP tools only: disable shell + web-search. */
34
39
  private buildSandboxToml;
35
40
  private buildMcpServerToml;
36
41
  buildConfig(options: AgentHarnessOptions, sessionHomeDir: string): string;
37
42
  }
43
+ /**
44
+ * Pre-seed OAuth tokens in the session's `.credentials.json` so codex connects
45
+ * to a remote server without an interactive login. Requires
46
+ * `mcp_oauth_credentials_store = "file"` (set by `buildConfig` when `oauth` is
47
+ * present); codex matches entries by `server_name` + `server_url`, so the map
48
+ * key is informational. No-op unless `options.oauth` is set.
49
+ */
50
+ export declare function seedCodexOAuthCredentials({ homeDir, options, }: {
51
+ homeDir: string;
52
+ options: AgentHarnessOptions;
53
+ }): void;
38
54
  //# sourceMappingURL=codexConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codexConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AAOpD,+DAA+D;AAC/D,qBAAa,kBAAmB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,aAAa,gBAAgB;IACtC,QAAQ,CAAC,cAAc,iBAAiB;IAExC,kFAAkF;IAClF,cAAc,IAAI,MAAM;IAIxB,2EAA2E;IAC3E,iBAAiB,IAAI,MAAM;IAI3B,+FAA+F;IAC/F,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUrD;;;OAGG;IACH,2BAA2B,IAAI,MAAM,GAAG,SAAS;IAUjD,kGAAkG;IAClG,OAAO,CAAC,iBAAiB;IAYzB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IA6BvC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,kBAAkB;IAiB1B,WAAW,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM;CA2C5E"}
1
+ {"version":3,"file":"codexConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AAOpD,+DAA+D;AAC/D,qBAAa,kBAAmB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,aAAa,gBAAgB;IACtC,QAAQ,CAAC,cAAc,iBAAiB;IAExC,kFAAkF;IAClF,cAAc,IAAI,MAAM;IAIxB,2EAA2E;IAC3E,iBAAiB,IAAI,MAAM;IAI3B,+FAA+F;IAC/F,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUrD;;;OAGG;IACH,2BAA2B,IAAI,MAAM,GAAG,SAAS;IAUjD,kGAAkG;IAClG,OAAO,CAAC,iBAAiB;IAYzB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IA6BvC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAIhC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,kBAAkB;IA4B1B,WAAW,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM;CAgD5E;AAWD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EACtC,OAAO,EACP,OAAO,GACV,EAAE;IACC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,mBAAmB,CAAC;CAChC,GAAG,IAAI,CAwBP"}
@@ -1,9 +1,13 @@
1
1
  import fs, { existsSync } from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
- import { canonicalPath } from "../shared.js";
5
- /** Fallback model when neither the real config nor an override is available. */
6
- export const DEFAULT_CODEX_MODEL = "gpt-5.6-luna";
4
+ import { canonicalPath, oauthCredentialStoreKey } from "../shared.js";
5
+ /**
6
+ * Fallback model when neither the real config nor an override is available.
7
+ * Keep this on the latest model codex ships, so codex does not show its
8
+ * "Try new model" onboarding dialog (which blocks the composer) on first run.
9
+ */
10
+ export const DEFAULT_CODEX_MODEL = "gpt-6-luna";
7
11
  /** Reasoning effort applied to the harness session's model. */
8
12
  export const DEFAULT_CODEX_REASONING_EFFORT = "low";
9
13
  function tomlString(value) {
@@ -85,22 +89,15 @@ export class CodexHarnessConfig {
85
89
  }
86
90
  }
87
91
  /**
88
- * Whitelist the session to MCP tools only: disable shell + web-search and
89
- * pin the sandbox to read-only (the MCP HTTP call runs in the orchestrator,
90
- * outside the sandbox).
92
+ * Top-level scalars; must precede every table header (otherwise TOML absorbs them into the
93
+ * following `[mcp_servers.X.env]`/`.http_headers` table and codex rejects a non-string env value).
91
94
  */
95
+ buildSandboxTopLevelToml() {
96
+ return ['sandbox_mode = "read-only"', "allow_login_shell = false"].join("\n");
97
+ }
98
+ /** Whitelist the session to MCP tools only: disable shell + web-search. */
92
99
  buildSandboxToml() {
93
- return [
94
- 'sandbox_mode = "read-only"',
95
- // Top-level scalars must precede the table headers below.
96
- "allow_login_shell = false",
97
- "",
98
- "[features]",
99
- "shell_tool = false",
100
- "",
101
- "[tools]",
102
- "web_search = false",
103
- ].join("\n");
100
+ return ["[features]", "shell_tool = false", "", "[tools]", "web_search = false"].join("\n");
104
101
  }
105
102
  buildMcpServerToml(options, mcpServerName) {
106
103
  // Codex's 10s default MCP startup timeout is too short for this server.
@@ -116,7 +113,16 @@ export class CodexHarnessConfig {
116
113
  ...(envLines.length ? [``, `[mcp_servers.${mcpServerName}.env]`, ...envLines] : []),
117
114
  ].join("\n");
118
115
  }
119
- return `[mcp_servers.${mcpServerName}]\nurl = ${tomlString(options.serverUrl ?? "")}\n${startupTimeout}`;
116
+ const lines = [
117
+ `[mcp_servers.${mcpServerName}]`,
118
+ `url = ${tomlString(options.serverUrl ?? "")}`,
119
+ startupTimeout,
120
+ ];
121
+ const headerLines = Object.entries(options.headers ?? {}).map(([k, v]) => `${tomlString(k)} = ${tomlString(v)}`);
122
+ if (headerLines.length > 0) {
123
+ lines.push("", `[mcp_servers.${mcpServerName}.http_headers]`, ...headerLines);
124
+ }
125
+ return lines.join("\n");
120
126
  }
121
127
  buildConfig(options, sessionHomeDir) {
122
128
  const { mcpServerName = "mongo", model, workDir } = options;
@@ -139,8 +145,13 @@ export class CodexHarnessConfig {
139
145
  `model = ${tomlString(resolvedModel)}`,
140
146
  `model_provider = "grove"`,
141
147
  `model_reasoning_effort = ${tomlString(DEFAULT_CODEX_REASONING_EFFORT)}`,
148
+ // Keep pre-seeded OAuth tokens in the hermetic home instead of the OS keyring.
149
+ ...(options.oauth ? [`mcp_oauth_credentials_store = "file"`] : []),
142
150
  ...catalogLines,
143
151
  "",
152
+ // Top-level scalars must precede the table headers below.
153
+ this.buildSandboxTopLevelToml(),
154
+ "",
144
155
  this.buildProviderToml(),
145
156
  "",
146
157
  this.buildMcpServerToml(options, mcpServerName),
@@ -159,4 +170,45 @@ export class CodexHarnessConfig {
159
170
  return lines.join("\n");
160
171
  }
161
172
  }
173
+ /** Read and parse a JSON file, or an empty map when missing/unreadable. */
174
+ function readJsonFile(filePath) {
175
+ try {
176
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
177
+ }
178
+ catch {
179
+ return {};
180
+ }
181
+ }
182
+ /**
183
+ * Pre-seed OAuth tokens in the session's `.credentials.json` so codex connects
184
+ * to a remote server without an interactive login. Requires
185
+ * `mcp_oauth_credentials_store = "file"` (set by `buildConfig` when `oauth` is
186
+ * present); codex matches entries by `server_name` + `server_url`, so the map
187
+ * key is informational. No-op unless `options.oauth` is set.
188
+ */
189
+ export function seedCodexOAuthCredentials({ homeDir, options, }) {
190
+ if (!options.oauth || !options.serverUrl) {
191
+ return;
192
+ }
193
+ const { oauth } = options;
194
+ const serverName = options.mcpServerName ?? "mongo";
195
+ const key = oauthCredentialStoreKey({
196
+ serverName,
197
+ serverUrl: options.serverUrl,
198
+ headers: options.headers,
199
+ });
200
+ const store = readJsonFile(path.join(homeDir, ".credentials.json"));
201
+ store[key] = {
202
+ server_name: serverName,
203
+ server_url: options.serverUrl,
204
+ ...(oauth.issuer !== undefined ? { issuer: oauth.issuer } : {}),
205
+ client_id: oauth.clientId ?? "",
206
+ ...(oauth.clientSecret !== undefined ? { client_secret: oauth.clientSecret } : {}),
207
+ access_token: oauth.accessToken,
208
+ ...(oauth.expiresAt !== undefined ? { expires_at: oauth.expiresAt } : {}),
209
+ ...(oauth.refreshToken !== undefined ? { refresh_token: oauth.refreshToken } : {}),
210
+ scopes: oauth.scopes ?? [],
211
+ };
212
+ fs.writeFileSync(path.join(homeDir, ".credentials.json"), JSON.stringify(store, null, 2), { mode: 0o600 });
213
+ }
162
214
  //# sourceMappingURL=codexConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codexConfig.js","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codexConfig.js","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codexHarness.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI5D,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACnC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AAED,qBAAa,eAAgB,YAAW,YAAY;IAChD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;gBAExC,OAAO,GAAE,sBAA2B;IAQhD,aAAa,IAAI,MAAM;IAIvB,UAAU,IAAI,OAAO;IAIrB,2FAA2F;IAC3F,WAAW,IAAI,OAAO;IAehB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;CA4BnE"}
1
+ {"version":3,"file":"codexHarness.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI5D,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACnC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AAED,qBAAa,eAAgB,YAAW,YAAY;IAChD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IACpE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgC;gBAExC,OAAO,GAAE,sBAA2B;IAQhD,aAAa,IAAI,MAAM;IAIvB,UAAU,IAAI,OAAO;IAIrB,2FAA2F;IAC3F,WAAW,IAAI,OAAO;IAehB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;CA8BnE"}
@@ -2,8 +2,8 @@ import { execFileSync } from "node:child_process";
2
2
  import fs from "node:fs/promises";
3
3
  import path from "node:path";
4
4
  import { TuiTest } from "@microsoft/tui-test";
5
- import { CodexHarnessConfig } from "./codexConfig.js";
6
- import { resolveBackend } from "../shared.js";
5
+ import { CodexHarnessConfig, seedCodexOAuthCredentials } from "./codexConfig.js";
6
+ import { assertRemoteServerOptions, resolveBackend } from "../shared.js";
7
7
  import { HarnessLogger } from "../logger.js";
8
8
  import { CodexTuiSession } from "./codexSession.js";
9
9
  export class CodexTuiHarness {
@@ -39,12 +39,14 @@ export class CodexTuiHarness {
39
39
  return false;
40
40
  }
41
41
  async start(options) {
42
+ assertRemoteServerOptions(options);
42
43
  // Per-session CODEX_HOME: developer config untouched, no state reused across sessions.
43
44
  const config = new CodexHarnessConfig();
44
45
  const codexHome = path.join(options.workDir, `codex-home-${Math.random().toString(36).slice(2, 8)}`);
45
46
  await fs.mkdir(codexHome, { recursive: true });
46
47
  const configToml = config.buildConfig(options, codexHome);
47
48
  await fs.writeFile(path.join(codexHome, config.configFileName), configToml);
49
+ seedCodexOAuthCredentials({ homeDir: codexHome, options });
48
50
  const terminal = new TuiTest(`codex-${process.pid}-${Math.random().toString(36).slice(2, 8)}`, {
49
51
  backend: this.backend,
50
52
  timeouts: { ready: 60000, text: 60000, idle: 60000 },
@@ -1 +1 @@
1
- {"version":3,"file":"codexHarness.js","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codexHarness.js","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Backend } from "@microsoft/tui-test";
2
+ import type { AgentHarnessOptions } from "./types.js";
2
3
  /**
3
4
  * Canonicalize a path so config keys match the agent's view of the filesystem
4
5
  * (macOS resolves `/var` -> `/private/var`; a non-canonical key silently misses).
@@ -15,4 +16,20 @@ export declare const DEFAULT_PROMPT_TIMEOUT_MS: number;
15
16
  export declare function resolveBackend(explicit?: Backend): Backend;
16
17
  /** Strip the `<server>.` / `mcp__<server>__` prefix agents render before tool names. */
17
18
  export declare function normalizeToolName(name: string): string;
19
+ /**
20
+ * Key under which claude/codex persist MCP OAuth credentials for a remote
21
+ * server: `<name>|<sha256(JSON.stringify({type,url,headers}))[0..16]>`.
22
+ *
23
+ * The payload field order (`type`, `url`, `headers`) is load-bearing: both CLIs
24
+ * serialize it verbatim, so reordering changes the key and the token is missed.
25
+ * Codex only uses this as the file-store key (it matches entries by
26
+ * `server_name` + `server_url`), but claude looks the entry up by this exact key.
27
+ */
28
+ export declare function oauthCredentialStoreKey({ serverName, serverUrl, headers, }: {
29
+ serverName: string;
30
+ serverUrl: string;
31
+ headers?: Record<string, string>;
32
+ }): string;
33
+ /** Guard `oauth` against stdio/missing-URL misuse (it only applies to a remote server). */
34
+ export declare function assertRemoteServerOptions(options: AgentHarnessOptions): void;
18
35
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/harness/shared.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,oDAAoD;AACpD,eAAO,MAAM,yBAAyB,QAAgB,CAAC;AAIvD,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/harness/shared.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,oDAAoD;AACpD,eAAO,MAAM,yBAAyB,QAAgB,CAAC;AAIvD,qGAAqG;AACrG,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,OAAY,GACf,EAAE;IACC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,GAAG,MAAM,CAIT;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAO5E"}
@@ -1,3 +1,4 @@
1
+ import { createHash } from "node:crypto";
1
2
  import fs from "node:fs";
2
3
  import path from "node:path";
3
4
  /**
@@ -43,4 +44,27 @@ export function normalizeToolName(name) {
43
44
  const lastSegment = name.split(/__|\./).pop();
44
45
  return lastSegment ?? name;
45
46
  }
47
+ /**
48
+ * Key under which claude/codex persist MCP OAuth credentials for a remote
49
+ * server: `<name>|<sha256(JSON.stringify({type,url,headers}))[0..16]>`.
50
+ *
51
+ * The payload field order (`type`, `url`, `headers`) is load-bearing: both CLIs
52
+ * serialize it verbatim, so reordering changes the key and the token is missed.
53
+ * Codex only uses this as the file-store key (it matches entries by
54
+ * `server_name` + `server_url`), but claude looks the entry up by this exact key.
55
+ */
56
+ export function oauthCredentialStoreKey({ serverName, serverUrl, headers = {}, }) {
57
+ const payload = JSON.stringify({ type: "http", url: serverUrl, headers });
58
+ const hash = createHash("sha256").update(payload).digest("hex").slice(0, 16);
59
+ return `${serverName}|${hash}`;
60
+ }
61
+ /** Guard `oauth` against stdio/missing-URL misuse (it only applies to a remote server). */
62
+ export function assertRemoteServerOptions(options) {
63
+ if (options.oauth && options.stdioServer) {
64
+ throw new Error("`oauth` cannot be combined with `stdioServer`; use a remote `serverUrl` server");
65
+ }
66
+ if (options.oauth && !options.serverUrl) {
67
+ throw new Error("`oauth` requires a remote `serverUrl` server");
68
+ }
69
+ }
46
70
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/harness/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACnC,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACzC,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,MAAM,sBAAsB,GAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAEnF,qGAAqG;AACrG,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAClD,IAAI,OAAO,IAAK,sBAA4C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAkB,CAAC;IAC9B,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9C,OAAO,WAAW,IAAI,IAAI,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/harness/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACnC,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;AACL,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACzC,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD,MAAM,sBAAsB,GAAuB,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAEnF,qGAAqG;AACrG,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAClD,IAAI,OAAO,IAAK,sBAA4C,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAkB,CAAC;IAC9B,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9C,OAAO,WAAW,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,OAAO,GAAG,EAAE,GAKf;IACG,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,yBAAyB,CAAC,OAA4B;IAClE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;AACL,CAAC"}
@@ -24,6 +24,18 @@ export interface AgentHarnessOptions {
24
24
  * `http://127.0.0.1:PORT/mcp`. Mutually exclusive with `stdioServer`.
25
25
  */
26
26
  serverUrl?: string;
27
+ /**
28
+ * Extra HTTP headers sent to the remote (`serverUrl`) MCP server, e.g.
29
+ * `{ Authorization: "Bearer ..." }`. Ignored for `stdioServer`.
30
+ */
31
+ headers?: Record<string, string>;
32
+ /**
33
+ * Pre-seed OAuth credentials for the remote (`serverUrl`) MCP server so the
34
+ * agent can authenticate without an interactive login. The harness writes
35
+ * them into its native credential store before starting. Mutually exclusive
36
+ * with `stdioServer`.
37
+ */
38
+ oauth?: OAuthCredentials;
27
39
  /**
28
40
  * Stdio server spec; when set, the harness spawns the MCP server itself.
29
41
  * Mutually exclusive with `serverUrl`.
@@ -44,6 +56,26 @@ export interface AgentHarnessOptions {
44
56
  /** Dump the generated config (redacted) to the test logs. */
45
57
  debug?: boolean;
46
58
  }
59
+ /**
60
+ * OAuth tokens for a remote MCP server, seeded into the harness's credential
61
+ * store ahead of an interactive browser login.
62
+ */
63
+ export interface OAuthCredentials {
64
+ /** Bearer access token. */
65
+ accessToken: string;
66
+ /** Refresh token, persisted so the agent can refresh non-interactively. */
67
+ refreshToken?: string;
68
+ /** Access-token expiry as epoch milliseconds. */
69
+ expiresAt?: number;
70
+ /** OAuth client id the tokens were issued to. */
71
+ clientId?: string;
72
+ /** OAuth client secret, persisted alongside the tokens when provided. */
73
+ clientSecret?: string;
74
+ /** Granted scopes (used by codex; claude does not persist scopes). */
75
+ scopes?: string[];
76
+ /** Authorization-server issuer the tokens are bound to. */
77
+ issuer?: string;
78
+ }
47
79
  export interface AgentHarness {
48
80
  readonly name: string;
49
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACtB,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,oFAAoF;IACpF,KAAK,EAAE,cAAc,CAAC;IACtB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,uFAAuF;AACvF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,aAAa,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAC/E,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,YAAY;IACzB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,6BAA6B;IAC7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,8GAA8G;AAC9G,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,2GAA2G;IAC3G,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,oFAAoF;IACpF,cAAc,IAAI,MAAM,CAAC;IAEzB;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/harness/types.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,6 @@ import { ClaudeTuiHarness } from "./harness/claude/claudeHarness.js";
2
2
  import { CodexTuiHarness } from "./harness/codex/codexHarness.js";
3
3
  export { useAgent, type AgentContext } from "./useAgent.js";
4
4
  export { AGENT_HARNESSES } from "./harnesses.js";
5
- export type { AgentHarness, AgentHarnessConfig, AgentHarnessOptions, AgentSession, AgentTurn, AgentTurnState, ToolCallRecord, } from "./harness/types.js";
5
+ export type { AgentHarness, AgentHarnessConfig, AgentHarnessOptions, AgentSession, AgentTurn, AgentTurnState, OAuthCredentials, ToolCallRecord, } from "./harness/types.js";
6
6
  export { ClaudeTuiHarness, CodexTuiHarness };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACR,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACR,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAWjD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mongodb-js/harness-tester",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "type": "module",
5
5
  "description": "Tooling to drive real LLM coding-agent CLIs (codex, claude) interactively through their TUIs for end-to-end tests",
6
6
  "license": "Apache-2.0",