@mongodb-js/harness-tester 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/harness/claude/claudeConfig.d.ts +0 -4
- package/dist/harness/claude/claudeConfig.d.ts.map +1 -1
- package/dist/harness/claude/claudeConfig.js +13 -3
- package/dist/harness/claude/claudeConfig.js.map +1 -1
- package/dist/harness/claude/parseClaudeToolCalls.d.ts +0 -5
- package/dist/harness/claude/parseClaudeToolCalls.d.ts.map +1 -1
- package/dist/harness/claude/parseClaudeToolCalls.js +1 -1
- package/dist/harness/claude/parseClaudeToolCalls.js.map +1 -1
- package/dist/harness/codex/codexConfig.d.ts +23 -6
- package/dist/harness/codex/codexConfig.d.ts.map +1 -1
- package/dist/harness/codex/codexConfig.js +83 -13
- package/dist/harness/codex/codexConfig.js.map +1 -1
- package/dist/harness/codex/codexHarness.d.ts +1 -0
- package/dist/harness/codex/codexHarness.d.ts.map +1 -1
- package/dist/harness/codex/codexHarness.js +11 -2
- package/dist/harness/codex/codexHarness.js.map +1 -1
- package/dist/harness/codex/codexSession.d.ts +3 -2
- package/dist/harness/codex/codexSession.d.ts.map +1 -1
- package/dist/harness/codex/codexSession.js +9 -5
- package/dist/harness/codex/codexSession.js.map +1 -1
- package/dist/harness/codex/codexTuiMarkers.d.ts +2 -0
- package/dist/harness/codex/codexTuiMarkers.d.ts.map +1 -1
- package/dist/harness/codex/codexTuiMarkers.js +11 -0
- package/dist/harness/codex/codexTuiMarkers.js.map +1 -1
- package/dist/harness/tuiSession.d.ts +26 -0
- package/dist/harness/tuiSession.d.ts.map +1 -1
- package/dist/harness/tuiSession.js +88 -18
- package/dist/harness/tuiSession.js.map +1 -1
- package/dist/useAgent.d.ts.map +1 -1
- package/dist/useAgent.js +9 -1
- package/dist/useAgent.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -88,7 +88,7 @@ if (turn.state === "elicitation") {
|
|
|
88
88
|
| `GROVE_API_KEY` | Provider key for the grove gateway (required). |
|
|
89
89
|
| `AGENT_E2E_MODEL` | Shared model override (overridden by the per-harness vars). |
|
|
90
90
|
| `AGENT_E2E_CODEX_MODEL` | Codex model override (default: host config model, else `gpt-6-luna`). |
|
|
91
|
-
| `AGENT_E2E_CLAUDE_MODEL` | Claude model override (default: `claude-haiku-
|
|
91
|
+
| `AGENT_E2E_CLAUDE_MODEL` | Claude model override (default: `claude-haiku-4-5`). |
|
|
92
92
|
| `AGENT_E2E_CODEX_BIN` | Codex binary path (default: `codex`). |
|
|
93
93
|
| `AGENT_E2E_CLAUDE_BIN` | Claude binary path (default: `claude`). |
|
|
94
94
|
| `AGENT_E2E_TUI_BACKEND` | tui-test backend: `alacritty` (default), `ghostty`, `rio`. |
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type { AgentHarnessConfig, AgentHarnessOptions } from "../types.js";
|
|
2
|
-
/** Default model: grove serves the undated id; `haiku` resolves to a dated id it lacks. */
|
|
3
|
-
export declare const DEFAULT_CLAUDE_MODEL = "claude-haiku-5-5";
|
|
4
2
|
/** Minimum reasoning effort for e2e runs (mirrors the codex harness's `"low"`). */
|
|
5
3
|
export declare const DEFAULT_CLAUDE_EFFORT_LEVEL = "low";
|
|
6
|
-
/** Grove gateway Anthropic endpoint (no trailing /v1; claude appends it). */
|
|
7
|
-
export declare const GROVE_ANTHROPIC_BASE_URL = "https://grove-gateway-prod.azure-api.net/grove-foundry-prod/anthropic";
|
|
8
4
|
export declare function resolveClaudeModel(options: AgentHarnessOptions): string;
|
|
9
5
|
/** Env for the spawned claude process; the grove key is read live from `GROVE_API_KEY`, never written to config files. */
|
|
10
6
|
export declare function buildClaudeEnv(options: AgentHarnessOptions): Record<string, string>;
|
|
@@ -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;
|
|
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;AAS3E,mFAAmF;AACnF,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAKjD,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,CA4BP"}
|
|
@@ -2,12 +2,16 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { canonicalPath, oauthCredentialStoreKey } from "../shared.js";
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Default model: grove serves undated ids, while `haiku` resolves to a dated id it
|
|
7
|
+
* lacks. `claude-haiku-5-5` is catalog-only (no deployment), so pin the latest haiku
|
|
8
|
+
* grove actually deploys.
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_CLAUDE_MODEL = "claude-haiku-4-5";
|
|
7
11
|
/** Minimum reasoning effort for e2e runs (mirrors the codex harness's `"low"`). */
|
|
8
12
|
export const DEFAULT_CLAUDE_EFFORT_LEVEL = "low";
|
|
9
13
|
/** Grove gateway Anthropic endpoint (no trailing /v1; claude appends it). */
|
|
10
|
-
|
|
14
|
+
const GROVE_ANTHROPIC_BASE_URL = "https://grove-gateway-prod.azure-api.net/grove-foundry-prod/anthropic";
|
|
11
15
|
export function resolveClaudeModel(options) {
|
|
12
16
|
// Model priority: explicit `options.model` (CI override) > env override > default.
|
|
13
17
|
return options.model || process.env.AGENT_E2E_CLAUDE_MODEL || DEFAULT_CLAUDE_MODEL;
|
|
@@ -119,6 +123,12 @@ export function seedClaudeHome({ homeDir, workDir, mcpServerName = "mongo", }) {
|
|
|
119
123
|
hasCompletedOnboarding: true,
|
|
120
124
|
shiftEnterKeyBindingInstalled: true,
|
|
121
125
|
theme: "dark",
|
|
126
|
+
// Suppress Claude Code's auto-mode onboarding. It interposes a blocking
|
|
127
|
+
// "Make auto mode your default permission mode?" dialog (and related
|
|
128
|
+
// notices) that stalls the TUI before the composer is ready.
|
|
129
|
+
hasSeenAutoDefaultNudge: true,
|
|
130
|
+
hasSeenAutoModeEntryWarning: true,
|
|
131
|
+
hasSeenAutoDefaultNotice: true,
|
|
122
132
|
// Mark the test workdir trusted so the trust gate never shows.
|
|
123
133
|
projects: {
|
|
124
134
|
[canonical]: { hasTrustDialogAccepted: true, allowedTools: [] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claudeConfig.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAGtE
|
|
1
|
+
{"version":3,"file":"claudeConfig.js","sourceRoot":"","sources":["../../../src/harness/claude/claudeConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,6 @@ export { normalizeToolName };
|
|
|
4
4
|
export interface ClaudeTranscriptParseResult {
|
|
5
5
|
toolCalls: ToolCallRecord[];
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Exact tool calls from the session JSONL claude writes per session under
|
|
9
|
-
* `$CLAUDE_CONFIG_DIR/projects/<dir>/<session>.jsonl`.
|
|
10
|
-
*/
|
|
11
|
-
export declare function collectSessionJsonlToolCalls(claudeHomeDir: string, seenCallKeys?: Set<string>): ToolCallRecord[];
|
|
12
7
|
export interface ParseClaudeTurnOptions {
|
|
13
8
|
/** Hermetic `CLAUDE_CONFIG_DIR`; exact tool calls are read from the session JSONL. */
|
|
14
9
|
claudeHomeDir?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseClaudeToolCalls.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/parseClaudeToolCalls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,MAAM,WAAW,2BAA2B;IACxC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"parseClaudeToolCalls.d.ts","sourceRoot":"","sources":["../../../src/harness/claude/parseClaudeToolCalls.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,MAAM,WAAW,2BAA2B;IACxC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC/B;AAuED,MAAM,WAAW,sBAAsB;IACnC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,sBAAsB,GAAG,2BAA2B,CAOpH"}
|
|
@@ -6,7 +6,7 @@ export { normalizeToolName };
|
|
|
6
6
|
* Exact tool calls from the session JSONL claude writes per session under
|
|
7
7
|
* `$CLAUDE_CONFIG_DIR/projects/<dir>/<session>.jsonl`.
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
function collectSessionJsonlToolCalls(claudeHomeDir, seenCallKeys) {
|
|
10
10
|
const projectsDir = path.join(claudeHomeDir, "projects");
|
|
11
11
|
const records = [];
|
|
12
12
|
// A persistent per-session key set skips calls from earlier turns; otherwise dedupe is per call.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseClaudeToolCalls.js","sourceRoot":"","sources":["../../../src/harness/claude/parseClaudeToolCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"parseClaudeToolCalls.js","sourceRoot":"","sources":["../../../src/harness/claude/parseClaudeToolCalls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B;;;GAGG;AACH,SAAS,4BAA4B,CAAC,aAAqB,EAAE,YAA0B;IACnF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,iGAAiG;IACjG,MAAM,IAAI,GAAG,YAAY,IAAI,IAAI,GAAG,EAAU,CAAC;IAC/C,MAAM,WAAW,GAAG,CAAC,IAAY,EAAQ,EAAE;QACvC,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACf,SAAS;YACb,CAAC;YACD,IAAI,KAAc,CAAC;YACnB,IAAI,CAAC;gBACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC9C,SAAS;YACb,CAAC;YACD,MAAM,GAAG,GAAI,KAA6C,CAAC,OAAO,CAAC;YACnE,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACb,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC9C,SAAS;gBACb,CAAC;gBACD,MAAM,CAAC,GAAG,KAA0D,CAAC;gBACrE,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACnC,SAAS;gBACb,CAAC;gBACD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;gBACvB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC;gBAChE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACtB,SAAS;gBACb,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IACF,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,yEAAyE;YACzE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,oEAAoE;IACxE,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,EAAE,aAAa,EAAE,YAAY,EAA0B;IACnF,4FAA4F;IAC5F,kGAAkG;IAClG,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,4BAA4B,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,OAAO;QACH,SAAS,EAAE,YAAY;KAC1B,CAAC;AACN,CAAC"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import type { AgentHarnessConfig, AgentHarnessOptions } from "../types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* "Try new model" onboarding dialog (which blocks the composer) on first run.
|
|
3
|
+
* Abort a model response stream after this long without a chunk, then retry.
|
|
4
|
+
* Codex's default is 5 minutes, which outlives a test's turn budget.
|
|
6
5
|
*/
|
|
7
|
-
export declare const
|
|
8
|
-
/** Reasoning effort applied to the harness session's model. */
|
|
9
|
-
export declare const DEFAULT_CODEX_REASONING_EFFORT = "low";
|
|
6
|
+
export declare const STREAM_IDLE_TIMEOUT_MS = 30000;
|
|
10
7
|
/** {@link AgentHarnessConfig} for codex (OpenAI CLI agent). */
|
|
11
8
|
export declare class CodexHarnessConfig implements AgentHarnessConfig {
|
|
12
9
|
readonly homeDirEnvVar = "CODEX_HOME";
|
|
13
10
|
readonly configFileName = "config.toml";
|
|
11
|
+
private readonly binaryPath;
|
|
12
|
+
constructor({ binaryPath }?: {
|
|
13
|
+
binaryPath?: string;
|
|
14
|
+
});
|
|
14
15
|
/** Directory codex uses for its config/auth/caches (`CODEX_HOME` or ~/.codex). */
|
|
15
16
|
getHostHomeDir(): string;
|
|
16
17
|
/** Path to the user's real codex config (outside the hermetic session). */
|
|
@@ -38,6 +39,22 @@ export declare class CodexHarnessConfig implements AgentHarnessConfig {
|
|
|
38
39
|
/** Whitelist the session to MCP tools only: disable shell + web-search. */
|
|
39
40
|
private buildSandboxToml;
|
|
40
41
|
private buildMcpServerToml;
|
|
42
|
+
/**
|
|
43
|
+
* Render codex's built-in model catalog (`codex debug models`) into the
|
|
44
|
+
* session home. Used on machines without a cached catalog (CI): without a
|
|
45
|
+
* catalog codex applies its built-in 10k-token tool truncation, which drops
|
|
46
|
+
* the server's larger tool definitions.
|
|
47
|
+
*/
|
|
48
|
+
private renderBuiltinCatalog;
|
|
49
|
+
/**
|
|
50
|
+
* Catalog to copy into the hermetic home with the active model's truncation
|
|
51
|
+
* limit lifted: the host's catalog when it lists the active model, else
|
|
52
|
+
* codex's built-in one. The host cache can be stale and lack newer models,
|
|
53
|
+
* in which case codex falls back to its 10k-token tool truncation.
|
|
54
|
+
*/
|
|
55
|
+
private resolveModelCatalogPath;
|
|
56
|
+
/** Whether a model catalog file lists the given model slug. */
|
|
57
|
+
private catalogHasModel;
|
|
41
58
|
buildConfig(options: AgentHarnessOptions, sessionHomeDir: string): string;
|
|
42
59
|
}
|
|
43
60
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codexConfig.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAY3E;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAO7C,+DAA+D;AAC/D,qBAAa,kBAAmB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,aAAa,gBAAgB;IACtC,QAAQ,CAAC,cAAc,iBAAiB;IAExC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,EAAE,UAAuD,EAAE,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAIrG,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;IAgBzB;;;;OAIG;IACH,OAAO,CAAC,+BAA+B;IA6BvC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAIhC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,kBAAkB;IAwC1B;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAgB/B,+DAA+D;IAC/D,OAAO,CAAC,eAAe;IASvB,WAAW,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM;CA2C5E;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,3 +1,4 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
1
2
|
import fs, { existsSync } from "node:fs";
|
|
2
3
|
import os from "node:os";
|
|
3
4
|
import path from "node:path";
|
|
@@ -7,18 +8,24 @@ import { canonicalPath, oauthCredentialStoreKey } from "../shared.js";
|
|
|
7
8
|
* Keep this on the latest model codex ships, so codex does not show its
|
|
8
9
|
* "Try new model" onboarding dialog (which blocks the composer) on first run.
|
|
9
10
|
*/
|
|
10
|
-
|
|
11
|
+
const DEFAULT_CODEX_MODEL = "gpt-6-luna";
|
|
11
12
|
/** Reasoning effort applied to the harness session's model. */
|
|
12
|
-
|
|
13
|
+
const DEFAULT_CODEX_REASONING_EFFORT = "low";
|
|
14
|
+
/**
|
|
15
|
+
* Abort a model response stream after this long without a chunk, then retry.
|
|
16
|
+
* Codex's default is 5 minutes, which outlives a test's turn budget.
|
|
17
|
+
*/
|
|
18
|
+
export const STREAM_IDLE_TIMEOUT_MS = 30000;
|
|
13
19
|
function tomlString(value) {
|
|
14
20
|
// TOML basic strings: escape backslash + double quote.
|
|
15
21
|
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
16
22
|
}
|
|
17
23
|
/** {@link AgentHarnessConfig} for codex (OpenAI CLI agent). */
|
|
18
24
|
export class CodexHarnessConfig {
|
|
19
|
-
constructor() {
|
|
25
|
+
constructor({ binaryPath = process.env.AGENT_E2E_CODEX_BIN ?? "codex" } = {}) {
|
|
20
26
|
this.homeDirEnvVar = "CODEX_HOME";
|
|
21
27
|
this.configFileName = "config.toml";
|
|
28
|
+
this.binaryPath = binaryPath;
|
|
22
29
|
}
|
|
23
30
|
/** Directory codex uses for its config/auth/caches (`CODEX_HOME` or ~/.codex). */
|
|
24
31
|
getHostHomeDir() {
|
|
@@ -62,6 +69,10 @@ export class CodexHarnessConfig {
|
|
|
62
69
|
`env_key_instructions = "Set GROVE_API_KEY in your environment"`,
|
|
63
70
|
`supports_websockets = false`,
|
|
64
71
|
`env_http_headers = { "api-key" = "GROVE_API_KEY" }`,
|
|
72
|
+
// The default 5-minute idle timeout is longer than a test's turn budget, so a
|
|
73
|
+
// stalled response stream (seen behind CI's proxy) looks like a hang. Abort and
|
|
74
|
+
// retry much sooner so a transient stall recovers within the harness timeout.
|
|
75
|
+
`stream_idle_timeout_ms = ${STREAM_IDLE_TIMEOUT_MS}`,
|
|
65
76
|
].join("\n");
|
|
66
77
|
}
|
|
67
78
|
/**
|
|
@@ -102,6 +113,14 @@ export class CodexHarnessConfig {
|
|
|
102
113
|
buildMcpServerToml(options, mcpServerName) {
|
|
103
114
|
// Codex's 10s default MCP startup timeout is too short for this server.
|
|
104
115
|
const startupTimeout = "startup_timeout_sec = 60";
|
|
116
|
+
// Auto-approve MCP tool calls: codex otherwise interposes a blocking
|
|
117
|
+
// tool-approval prompt the harness cannot answer. The server's own
|
|
118
|
+
// elicitation (confirmation-required tools) is still surfaced.
|
|
119
|
+
const toolsApprovalMode = 'default_tools_approval_mode = "approve"';
|
|
120
|
+
// Wait for the tool catalog before accepting a prompt: otherwise codex
|
|
121
|
+
// shows an idle composer while the MCP servers boot, and a prompt sent
|
|
122
|
+
// in that window runs without the server's tools.
|
|
123
|
+
const startupReadiness = 'startup_readiness = "catalog"';
|
|
105
124
|
if (options.stdioServer) {
|
|
106
125
|
const { command, args, env } = options.stdioServer;
|
|
107
126
|
const envLines = Object.entries(env).map(([k, v]) => `${k} = ${tomlString(v)}`);
|
|
@@ -110,6 +129,8 @@ export class CodexHarnessConfig {
|
|
|
110
129
|
`command = ${tomlString(command)}`,
|
|
111
130
|
`args = [${args.map((a) => tomlString(a)).join(", ")}]`,
|
|
112
131
|
startupTimeout,
|
|
132
|
+
toolsApprovalMode,
|
|
133
|
+
startupReadiness,
|
|
113
134
|
...(envLines.length ? [``, `[mcp_servers.${mcpServerName}.env]`, ...envLines] : []),
|
|
114
135
|
].join("\n");
|
|
115
136
|
}
|
|
@@ -117,6 +138,8 @@ export class CodexHarnessConfig {
|
|
|
117
138
|
`[mcp_servers.${mcpServerName}]`,
|
|
118
139
|
`url = ${tomlString(options.serverUrl ?? "")}`,
|
|
119
140
|
startupTimeout,
|
|
141
|
+
toolsApprovalMode,
|
|
142
|
+
startupReadiness,
|
|
120
143
|
];
|
|
121
144
|
const headerLines = Object.entries(options.headers ?? {}).map(([k, v]) => `${tomlString(k)} = ${tomlString(v)}`);
|
|
122
145
|
if (headerLines.length > 0) {
|
|
@@ -124,21 +147,68 @@ export class CodexHarnessConfig {
|
|
|
124
147
|
}
|
|
125
148
|
return lines.join("\n");
|
|
126
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Render codex's built-in model catalog (`codex debug models`) into the
|
|
152
|
+
* session home. Used on machines without a cached catalog (CI): without a
|
|
153
|
+
* catalog codex applies its built-in 10k-token tool truncation, which drops
|
|
154
|
+
* the server's larger tool definitions.
|
|
155
|
+
*/
|
|
156
|
+
renderBuiltinCatalog(sessionHomeDir) {
|
|
157
|
+
const dest = path.join(sessionHomeDir, "builtin-model-catalog.json");
|
|
158
|
+
try {
|
|
159
|
+
const json = execFileSync(this.binaryPath, ["debug", "models"], {
|
|
160
|
+
env: { ...process.env, CODEX_HOME: sessionHomeDir },
|
|
161
|
+
encoding: "utf8",
|
|
162
|
+
timeout: 30000,
|
|
163
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
164
|
+
});
|
|
165
|
+
JSON.parse(json);
|
|
166
|
+
fs.writeFileSync(dest, json);
|
|
167
|
+
return dest;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Catalog to copy into the hermetic home with the active model's truncation
|
|
175
|
+
* limit lifted: the host's catalog when it lists the active model, else
|
|
176
|
+
* codex's built-in one. The host cache can be stale and lack newer models,
|
|
177
|
+
* in which case codex falls back to its 10k-token tool truncation.
|
|
178
|
+
*/
|
|
179
|
+
resolveModelCatalogPath(sessionHomeDir, activeModel) {
|
|
180
|
+
const hostCatalog = this.resolveHostModelCatalogPath();
|
|
181
|
+
const hostHasModel = hostCatalog !== undefined && existsSync(hostCatalog) && this.catalogHasModel(hostCatalog, activeModel);
|
|
182
|
+
const source = (hostHasModel ? hostCatalog : undefined) ??
|
|
183
|
+
this.renderBuiltinCatalog(sessionHomeDir) ??
|
|
184
|
+
(hostCatalog !== undefined && existsSync(hostCatalog) ? hostCatalog : undefined);
|
|
185
|
+
if (!source) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
const dest = path.join(sessionHomeDir, "model-catalog.json");
|
|
189
|
+
this.copyCatalogWithLiftedTruncation({ source, dest, activeModel });
|
|
190
|
+
return dest;
|
|
191
|
+
}
|
|
192
|
+
/** Whether a model catalog file lists the given model slug. */
|
|
193
|
+
catalogHasModel(catalogPath, model) {
|
|
194
|
+
try {
|
|
195
|
+
const catalog = JSON.parse(fs.readFileSync(catalogPath, "utf8"));
|
|
196
|
+
return (catalog.models ?? []).some((entry) => entry.slug === model);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
127
202
|
buildConfig(options, sessionHomeDir) {
|
|
128
203
|
const { mcpServerName = "mongo", model, workDir } = options;
|
|
129
204
|
// Model: `options.model` > the model codex already uses > fallback.
|
|
130
205
|
const resolvedModel = model ?? this.getHostTopLevelValue("model") ?? DEFAULT_CODEX_MODEL;
|
|
131
|
-
// Copy the model catalog so codex can resolve model metadata
|
|
206
|
+
// Copy the model catalog so codex can resolve model metadata and does not
|
|
207
|
+
// truncate the server's tool definitions from the model request.
|
|
132
208
|
const catalogLines = [];
|
|
133
|
-
const catalogSource = this.
|
|
134
|
-
if (catalogSource
|
|
135
|
-
|
|
136
|
-
this.copyCatalogWithLiftedTruncation({
|
|
137
|
-
source: catalogSource,
|
|
138
|
-
dest: catalogDest,
|
|
139
|
-
activeModel: resolvedModel,
|
|
140
|
-
});
|
|
141
|
-
catalogLines.push(`model_catalog_json = ${tomlString(catalogDest)}`);
|
|
209
|
+
const catalogSource = this.resolveModelCatalogPath(sessionHomeDir, resolvedModel);
|
|
210
|
+
if (catalogSource) {
|
|
211
|
+
catalogLines.push(`model_catalog_json = ${tomlString(catalogSource)}`);
|
|
142
212
|
}
|
|
143
213
|
const lines = [
|
|
144
214
|
"# Minimal hermetic codex config for the MongoDB MCP server agent e2e test.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexConfig.js","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAGtE;;;;GAIG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"codexConfig.js","sourceRoot":"","sources":["../../../src/harness/codex/codexConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Backend } from "@microsoft/tui-test";
|
|
2
2
|
import { type CodexState } from "./codexSession.js";
|
|
3
3
|
import type { AgentHarness, AgentHarnessOptions, AgentSession } from "../types.js";
|
|
4
|
+
export declare function buildCodexTuiArgs(helpText: string): string[];
|
|
4
5
|
export interface CodexTuiHarnessOptions {
|
|
5
6
|
/** Override the codex binary path (default: "codex" on PATH). */
|
|
6
7
|
binaryPath?: string;
|
|
@@ -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;
|
|
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,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED,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;CAoCnE"}
|
|
@@ -6,6 +6,9 @@ import { CodexHarnessConfig, seedCodexOAuthCredentials } from "./codexConfig.js"
|
|
|
6
6
|
import { assertRemoteServerOptions, resolveBackend } from "../shared.js";
|
|
7
7
|
import { HarnessLogger } from "../logger.js";
|
|
8
8
|
import { CodexTuiSession } from "./codexSession.js";
|
|
9
|
+
export function buildCodexTuiArgs(helpText) {
|
|
10
|
+
return /^\s*--no-daemon(?:\s|$)/m.test(helpText) ? ["--no-daemon"] : [];
|
|
11
|
+
}
|
|
9
12
|
export class CodexTuiHarness {
|
|
10
13
|
constructor(options = {}) {
|
|
11
14
|
this.name = "codex-tui";
|
|
@@ -40,8 +43,14 @@ export class CodexTuiHarness {
|
|
|
40
43
|
}
|
|
41
44
|
async start(options) {
|
|
42
45
|
assertRemoteServerOptions(options);
|
|
46
|
+
const binaryPath = this.getBinaryPath();
|
|
47
|
+
const helpText = execFileSync(binaryPath, ["--help"], {
|
|
48
|
+
encoding: "utf8",
|
|
49
|
+
timeout: 30000,
|
|
50
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
51
|
+
});
|
|
43
52
|
// Per-session CODEX_HOME: developer config untouched, no state reused across sessions.
|
|
44
|
-
const config = new CodexHarnessConfig();
|
|
53
|
+
const config = new CodexHarnessConfig({ binaryPath });
|
|
45
54
|
const codexHome = path.join(options.workDir, `codex-home-${Math.random().toString(36).slice(2, 8)}`);
|
|
46
55
|
await fs.mkdir(codexHome, { recursive: true });
|
|
47
56
|
const configToml = config.buildConfig(options, codexHome);
|
|
@@ -51,7 +60,7 @@ export class CodexTuiHarness {
|
|
|
51
60
|
backend: this.backend,
|
|
52
61
|
timeouts: { ready: 60000, text: 60000, idle: 60000 },
|
|
53
62
|
});
|
|
54
|
-
await terminal.run(
|
|
63
|
+
await terminal.run(binaryPath, buildCodexTuiArgs(helpText), {
|
|
55
64
|
cwd: options.workDir,
|
|
56
65
|
cols: this.cols,
|
|
57
66
|
rows: this.rows,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexHarness.js","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAgB,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAmB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"codexHarness.js","sourceRoot":"","sources":["../../../src/harness/codex/codexHarness.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,10 @@ export declare class CodexTuiSession extends TuiSessionBase {
|
|
|
12
12
|
protected isWorking(text: string): boolean;
|
|
13
13
|
protected isComposerIdle(text: string): boolean;
|
|
14
14
|
protected isTransitional(text: string): boolean;
|
|
15
|
+
protected isElicitation(text: string): boolean;
|
|
15
16
|
/**
|
|
16
|
-
* Codex renders the elicitation as a numbered
|
|
17
|
-
*
|
|
17
|
+
* Codex renders the elicitation as a numbered picker with the cursor on the
|
|
18
|
+
* first option, so navigate to the chosen option before submitting.
|
|
18
19
|
*/
|
|
19
20
|
protected sendChoice(choice: "confirm" | "decline"): Promise<void>;
|
|
20
21
|
protected extractToolCalls(delta: string): ToolCallRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexSession.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;AAElC,qBAAa,eAAgB,SAAQ,cAAc;gBACnC,EACR,QAAQ,EACR,OAAO,EACP,OAAO,GACV,EAAE;QACC,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,mBAAmB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;KACvC;IAID,SAAS,KAAK,KAAK,IAAI,MAAM,CAE5B;IAED,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;cAI5B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"codexSession.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;AAElC,qBAAa,eAAgB,SAAQ,cAAc;gBACnC,EACR,QAAQ,EACR,OAAO,EACP,OAAO,GACV,EAAE;QACC,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,mBAAmB,CAAC;QAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;KACvC;IAID,SAAS,KAAK,KAAK,IAAI,MAAM,CAE5B;IAED,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1C,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;cAI5B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;cAIrC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvD;;;OAGG;cACsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjF,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;CAG9D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseTuiTranscript } from "./codexParseTuiTranscript.js";
|
|
2
|
-
import { isCodexComposerIdle, isCodexTransitional, isCodexWorking } from "./codexTuiMarkers.js";
|
|
2
|
+
import { isCodexComposerIdle, isCodexElicitation, isCodexTransitional, isCodexWorking } from "./codexTuiMarkers.js";
|
|
3
3
|
import { TuiSessionBase } from "../tuiSession.js";
|
|
4
4
|
export class CodexTuiSession extends TuiSessionBase {
|
|
5
5
|
constructor({ terminal, options, onState, }) {
|
|
@@ -17,13 +17,17 @@ export class CodexTuiSession extends TuiSessionBase {
|
|
|
17
17
|
isTransitional(text) {
|
|
18
18
|
return isCodexTransitional(text);
|
|
19
19
|
}
|
|
20
|
+
isElicitation(text) {
|
|
21
|
+
return isCodexElicitation(text);
|
|
22
|
+
}
|
|
20
23
|
/**
|
|
21
|
-
* Codex renders the elicitation as a numbered
|
|
22
|
-
*
|
|
24
|
+
* Codex renders the elicitation as a numbered picker with the cursor on the
|
|
25
|
+
* first option, so navigate to the chosen option before submitting.
|
|
23
26
|
*/
|
|
24
27
|
async sendChoice(choice) {
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
if (choice === "decline") {
|
|
29
|
+
await this.terminal.keyboard.press("Down");
|
|
30
|
+
}
|
|
27
31
|
await this.terminal.keyboard.press("Enter");
|
|
28
32
|
}
|
|
29
33
|
extractToolCalls(delta) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexSession.js","sourceRoot":"","sources":["../../../src/harness/codex/codexSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"codexSession.js","sourceRoot":"","sources":["../../../src/harness/codex/codexSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpH,OAAO,EAAE,cAAc,EAAiB,MAAM,kBAAkB,CAAC;AAKjE,MAAM,OAAO,eAAgB,SAAQ,cAAc;IAC/C,YAAY,EACR,QAAQ,EACR,OAAO,EACP,OAAO,GAKV;QACG,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAc,KAAK;QACf,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,SAAS,CAAC,IAAY;QAC5B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAES,cAAc,CAAC,IAAY;QACjC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEkB,cAAc,CAAC,IAAY;QAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEkB,aAAa,CAAC,IAAY;QACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACgB,KAAK,CAAC,UAAU,CAAC,MAA6B;QAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAES,gBAAgB,CAAC,KAAa;QACpC,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;CACJ"}
|
|
@@ -13,4 +13,6 @@ export declare function isCodexWorking(text: string): boolean;
|
|
|
13
13
|
export declare function isCodexComposerIdle(text: string): boolean;
|
|
14
14
|
/** Whether the viewport shows a transient startup/reconnect banner (not a real input prompt). */
|
|
15
15
|
export declare function isCodexTransitional(text: string): boolean;
|
|
16
|
+
/** Whether the viewport shows the server's confirmation form. */
|
|
17
|
+
export declare function isCodexElicitation(text: string): boolean;
|
|
16
18
|
//# sourceMappingURL=codexTuiMarkers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexTuiMarkers.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexTuiMarkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"codexTuiMarkers.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexTuiMarkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2BH,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
|
@@ -21,6 +21,13 @@ const COMPOSER_IDLE_MARKER = "Ask Codex to do anything";
|
|
|
21
21
|
const WORKING_MARKER = /^[^\s›].*\(\d+[smh](?:[ \t]\d+[smh])*[ \t]•[ \t][^)]*to interrupt\)(?:[ \t]·[ \t].*)?[ \t]*$/m;
|
|
22
22
|
/** Transient banners rendered as "neither working nor idle" that are not input prompts. */
|
|
23
23
|
const TRANSITIONAL_MARKER = /^[ \t]*(?:Waiting for startup|Reconnecting to app-server|Loading earlier messages)\b/m;
|
|
24
|
+
/**
|
|
25
|
+
* The confirmation form the server elicits before a destructive tool runs.
|
|
26
|
+
* Codex renders the message ("Do you confirm the execution of the action?")
|
|
27
|
+
* and the Yes/No options; the marker separates a real elicitation from a
|
|
28
|
+
* transient "neither working nor idle" frame such as the just-submitted prompt.
|
|
29
|
+
*/
|
|
30
|
+
const ELICITATION_MARKER = /\bconfirm\b/i;
|
|
24
31
|
/** Whether the viewport shows an in-progress turn, regardless of the status header. */
|
|
25
32
|
export function isCodexWorking(text) {
|
|
26
33
|
return WORKING_MARKER.test(text);
|
|
@@ -33,4 +40,8 @@ export function isCodexComposerIdle(text) {
|
|
|
33
40
|
export function isCodexTransitional(text) {
|
|
34
41
|
return TRANSITIONAL_MARKER.test(text);
|
|
35
42
|
}
|
|
43
|
+
/** Whether the viewport shows the server's confirmation form. */
|
|
44
|
+
export function isCodexElicitation(text) {
|
|
45
|
+
return ELICITATION_MARKER.test(text);
|
|
46
|
+
}
|
|
36
47
|
//# sourceMappingURL=codexTuiMarkers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexTuiMarkers.js","sourceRoot":"","sources":["../../../src/harness/codex/codexTuiMarkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,+FAA+F,CAAC;AAEvH,2FAA2F;AAC3F,MAAM,mBAAmB,GAAG,uFAAuF,CAAC;AAEpH,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC/C,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|
|
1
|
+
{"version":3,"file":"codexTuiMarkers.js","sourceRoot":"","sources":["../../../src/harness/codex/codexTuiMarkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,mFAAmF;AACnF,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,+FAA+F,CAAC;AAEvH,2FAA2F;AAC3F,MAAM,mBAAmB,GAAG,uFAAuF,CAAC;AAEpH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,uFAAuF;AACvF,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AAC/C,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { TuiTest } from "@microsoft/tui-test";
|
|
2
2
|
import type { AgentHarnessOptions, AgentSession, AgentTurn, AgentTurnState, ToolCallRecord } from "./types.js";
|
|
3
|
+
/** Forget previously tracked sessions; call at the start of each test. */
|
|
4
|
+
export declare function resetSessionSnapshots(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Print the poll snapshot history of every session tracked since the last
|
|
7
|
+
* reset. Always visible (not gated on `AGENT_E2E_DEBUG`): call it when a test
|
|
8
|
+
* fails, since the failing run is usually not one debug mode was enabled for.
|
|
9
|
+
*/
|
|
10
|
+
export declare function dumpSessionSnapshots(reason: string): void;
|
|
3
11
|
/** Per-poll state shared by both agent TUI sessions. */
|
|
4
12
|
export interface TuiState {
|
|
5
13
|
/** True while the session's status/footer shows an in-progress turn. */
|
|
@@ -26,12 +34,22 @@ export declare abstract class TuiSessionBase implements AgentSession {
|
|
|
26
34
|
/** Transcript snapshot the current turn started from (so chooseOption can continue it). */
|
|
27
35
|
private currentTurnStartText;
|
|
28
36
|
private currentState;
|
|
37
|
+
/** Recent poll snapshots across all turns, kept so a failure can be diagnosed without `AGENT_E2E_DEBUG`. */
|
|
38
|
+
private readonly snapshotHistory;
|
|
29
39
|
get state(): AgentTurnState;
|
|
30
40
|
protected constructor({ terminal, options, onState, }: {
|
|
31
41
|
terminal: TuiTest;
|
|
32
42
|
options: AgentHarnessOptions;
|
|
33
43
|
onState?: (state: TuiState) => void;
|
|
34
44
|
});
|
|
45
|
+
/** Record one poll snapshot, evicting the oldest past {@link SNAPSHOT_HISTORY_LIMIT}. */
|
|
46
|
+
private recordSnapshot;
|
|
47
|
+
/**
|
|
48
|
+
* Print the retained snapshots. Unlike the per-poll debug stream this is
|
|
49
|
+
* always visible: a failed test (assertion, harness abort, or vitest's own
|
|
50
|
+
* timeout) is undiagnosable without the state history.
|
|
51
|
+
*/
|
|
52
|
+
dumpSnapshotHistory(reason: string): void;
|
|
35
53
|
/** Agent label used in debug/error output (e.g. "codex"). */
|
|
36
54
|
protected abstract get label(): string;
|
|
37
55
|
private get log();
|
|
@@ -61,6 +79,14 @@ export declare abstract class TuiSessionBase implements AgentSession {
|
|
|
61
79
|
* states must not be mistaken for an elicitation. Harnesses opt in.
|
|
62
80
|
*/
|
|
63
81
|
protected isTransitional?(text: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Whether the viewport is a confirmation prompt the agent is waiting on.
|
|
84
|
+
* The default is permissive: any frame that is neither working nor idle
|
|
85
|
+
* counts. Harnesses whose transient frames look the same (e.g. codex's
|
|
86
|
+
* just-submitted prompt) override this with a positive marker so such a
|
|
87
|
+
* frame is not reported as an elicitation before the turn has begun.
|
|
88
|
+
*/
|
|
89
|
+
protected isElicitation(text: string): boolean;
|
|
64
90
|
protected approveTool(): Promise<void>;
|
|
65
91
|
prompt(prompt: string): Promise<AgentTurn>;
|
|
66
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tuiSession.d.ts","sourceRoot":"","sources":["../../src/harness/tuiSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tuiSession.d.ts","sourceRoot":"","sources":["../../src/harness/tuiSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,28 @@ const TYPE_TO_ENTER_DELAY_MS = 800;
|
|
|
7
7
|
const IDLE_BAIL_GRACE_MS = 30000;
|
|
8
8
|
/** How long the not-working+not-idle state must persist before we treat it as an awaited confirmation. */
|
|
9
9
|
const CONFIRMATION_PENDING_GRACE_MS = 1000;
|
|
10
|
+
/** Codex may briefly show an idle composer between commentary and a tool call. */
|
|
11
|
+
const TURN_COMPLETE_GRACE_MS = 1000;
|
|
12
|
+
/** How many poll snapshots to retain for the on-failure dump (~1 per 500ms). */
|
|
13
|
+
const SNAPSHOT_HISTORY_LIMIT = 240;
|
|
14
|
+
/** Viewport characters kept per retained snapshot, so the dump stays readable. */
|
|
15
|
+
const SNAPSHOT_VIEWPORT_CHARS = 600;
|
|
16
|
+
/** Sessions created since the last {@link resetSessionSnapshots}, in creation order. */
|
|
17
|
+
const trackedSessions = [];
|
|
18
|
+
/** Forget previously tracked sessions; call at the start of each test. */
|
|
19
|
+
export function resetSessionSnapshots() {
|
|
20
|
+
trackedSessions.length = 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Print the poll snapshot history of every session tracked since the last
|
|
24
|
+
* reset. Always visible (not gated on `AGENT_E2E_DEBUG`): call it when a test
|
|
25
|
+
* fails, since the failing run is usually not one debug mode was enabled for.
|
|
26
|
+
*/
|
|
27
|
+
export function dumpSessionSnapshots(reason) {
|
|
28
|
+
for (const session of trackedSessions) {
|
|
29
|
+
session.dumpSnapshotHistory(reason);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
10
32
|
/**
|
|
11
33
|
* Shared polling loop + terminal helpers for agent TUI sessions. Subclasses
|
|
12
34
|
* supply only the agent-specific bits: the label, the in-progress and idle
|
|
@@ -20,9 +42,33 @@ export class TuiSessionBase {
|
|
|
20
42
|
/** Transcript snapshot the current turn started from (so chooseOption can continue it). */
|
|
21
43
|
this.currentTurnStartText = "";
|
|
22
44
|
this.currentState = "completed";
|
|
45
|
+
/** Recent poll snapshots across all turns, kept so a failure can be diagnosed without `AGENT_E2E_DEBUG`. */
|
|
46
|
+
this.snapshotHistory = [];
|
|
23
47
|
this.terminal = terminal;
|
|
24
48
|
this.options = options;
|
|
25
49
|
this.onState = onState ?? ((state) => this.printState(state));
|
|
50
|
+
trackedSessions.push(this);
|
|
51
|
+
}
|
|
52
|
+
/** Record one poll snapshot, evicting the oldest past {@link SNAPSHOT_HISTORY_LIMIT}. */
|
|
53
|
+
recordSnapshot(state) {
|
|
54
|
+
const viewport = state.viewport.slice(-SNAPSHOT_VIEWPORT_CHARS);
|
|
55
|
+
this.snapshotHistory.push(`t=${(state.elapsedMs / 1000).toFixed(1)}s working=${state.working} idle=${state.composerIdle}\n${viewport}`);
|
|
56
|
+
if (this.snapshotHistory.length > SNAPSHOT_HISTORY_LIMIT) {
|
|
57
|
+
this.snapshotHistory.shift();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Print the retained snapshots. Unlike the per-poll debug stream this is
|
|
62
|
+
* always visible: a failed test (assertion, harness abort, or vitest's own
|
|
63
|
+
* timeout) is undiagnosable without the state history.
|
|
64
|
+
*/
|
|
65
|
+
dumpSnapshotHistory(reason) {
|
|
66
|
+
if (this.snapshotHistory.length === 0) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.log.info(`${reason}; last ${this.snapshotHistory.length} poll snapshot(s) follow` +
|
|
70
|
+
` (set AGENT_E2E_DEBUG=1 for the full transcript stream):\n` +
|
|
71
|
+
this.snapshotHistory.join("\n---\n"));
|
|
26
72
|
}
|
|
27
73
|
get log() {
|
|
28
74
|
return (this._log ?? (this._log = new HarnessLogger(`${this.label}-tui`)));
|
|
@@ -36,6 +82,9 @@ export class TuiSessionBase {
|
|
|
36
82
|
* completion, returning the completed {@link AgentTurn}.
|
|
37
83
|
*/
|
|
38
84
|
async chooseOption(choice) {
|
|
85
|
+
if (this.currentState !== "elicitation") {
|
|
86
|
+
throw new Error(`${this.label} TUI has no pending elicitation`);
|
|
87
|
+
}
|
|
39
88
|
await this.sendChoice(choice);
|
|
40
89
|
return this.pollTurn(false);
|
|
41
90
|
}
|
|
@@ -43,6 +92,16 @@ export class TuiSessionBase {
|
|
|
43
92
|
isToolApproval(text) {
|
|
44
93
|
return /Allow the .* MCP server to run tool/.test(text);
|
|
45
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Whether the viewport is a confirmation prompt the agent is waiting on.
|
|
97
|
+
* The default is permissive: any frame that is neither working nor idle
|
|
98
|
+
* counts. Harnesses whose transient frames look the same (e.g. codex's
|
|
99
|
+
* just-submitted prompt) override this with a positive marker so such a
|
|
100
|
+
* frame is not reported as an elicitation before the turn has begun.
|
|
101
|
+
*/
|
|
102
|
+
isElicitation(text) {
|
|
103
|
+
return !this.isWorking(text) && !this.isComposerIdle(text);
|
|
104
|
+
}
|
|
46
105
|
async approveTool() {
|
|
47
106
|
await this.terminal.keyboard.press("Enter");
|
|
48
107
|
}
|
|
@@ -63,15 +122,19 @@ export class TuiSessionBase {
|
|
|
63
122
|
const timeoutMs = this.options.promptTimeoutMs ?? DEFAULT_PROMPT_TIMEOUT_MS;
|
|
64
123
|
const deadline = Date.now() + timeoutMs;
|
|
65
124
|
const startedAt = Date.now();
|
|
125
|
+
// Keep history across turns (an assertion may fail on any of them) but mark the boundary.
|
|
126
|
+
this.snapshotHistory.push(`=== new turn (${stopOnElicitation ? "prompt" : "chooseOption"}) ===`);
|
|
66
127
|
let lastError = "";
|
|
67
|
-
// A turn is only "real" once we have observed it begin: the working
|
|
68
|
-
// the composer leaving its idle placeholder
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
|
|
128
|
+
// A turn is only "real" once we have observed it begin: the working
|
|
129
|
+
// marker or the composer leaving its idle placeholder. Without this the
|
|
130
|
+
// first poll after Enter (before the agent has rendered anything)
|
|
131
|
+
// satisfies `!working && composerIdle` and returns a bogus empty turn.
|
|
132
|
+
// Transcript growth is deliberately not a signal: the prompt echo lands
|
|
133
|
+
// in the transcript before the agent starts, so it would arm the guard
|
|
134
|
+
// during the same pre-turn idle window.
|
|
135
|
+
// A choice continues an already-active turn, even if it completes before the first poll.
|
|
136
|
+
let sawTurnActivity = !stopOnElicitation;
|
|
73
137
|
let confirmationPendingSinceMs;
|
|
74
|
-
let prevDeltaLength;
|
|
75
138
|
let idleSinceMs;
|
|
76
139
|
while (Date.now() < deadline) {
|
|
77
140
|
const full = await this.transcriptText();
|
|
@@ -84,16 +147,23 @@ export class TuiSessionBase {
|
|
|
84
147
|
elapsedMs: Date.now() - startedAt,
|
|
85
148
|
};
|
|
86
149
|
this.onState(state);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
150
|
+
this.recordSnapshot(state);
|
|
151
|
+
// A transitional banner ("Waiting for startup", ...) also renders as
|
|
152
|
+
// "not idle", but it is pre-turn chrome rather than the turn beginning:
|
|
153
|
+
// counting it would mark the turn active before the agent has started,
|
|
154
|
+
// so the next poll (idle composer, agent still booting) would return a
|
|
155
|
+
// bogus completed turn.
|
|
156
|
+
const transitional = this.isTransitional?.(viewport) ?? false;
|
|
157
|
+
if (state.working || (!state.composerIdle && !transitional)) {
|
|
90
158
|
sawTurnActivity = true;
|
|
91
159
|
}
|
|
92
|
-
prevDeltaLength = delta.length;
|
|
93
160
|
// Agent is awaiting input when not working and not idle; require that
|
|
94
161
|
// state to persist a couple of polls so we do not fire mid-transition.
|
|
95
|
-
|
|
96
|
-
|
|
162
|
+
// The positive `isElicitation` marker keeps a transient frame that only
|
|
163
|
+
// looks like input (e.g. codex's just-submitted prompt) from firing.
|
|
164
|
+
const awaitingInput = this.isElicitation(viewport) || this.isToolApproval(viewport);
|
|
165
|
+
if (sawTurnActivity && !state.working && !state.composerIdle && awaitingInput) {
|
|
166
|
+
if (transitional) {
|
|
97
167
|
confirmationPendingSinceMs = undefined;
|
|
98
168
|
}
|
|
99
169
|
else {
|
|
@@ -122,10 +192,11 @@ export class TuiSessionBase {
|
|
|
122
192
|
else {
|
|
123
193
|
confirmationPendingSinceMs = undefined;
|
|
124
194
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
195
|
+
if (!state.working && state.composerIdle && !transitional) {
|
|
196
|
+
idleSinceMs ?? (idleSinceMs = state.elapsedMs);
|
|
197
|
+
const idleDurationMs = state.elapsedMs - idleSinceMs;
|
|
198
|
+
if ((sawTurnActivity && idleDurationMs >= TURN_COMPLETE_GRACE_MS) ||
|
|
199
|
+
idleDurationMs >= IDLE_BAIL_GRACE_MS) {
|
|
129
200
|
this.log.debug(`<<turn complete after ${state.elapsedMs}ms>>`);
|
|
130
201
|
this.onState({
|
|
131
202
|
...state,
|
|
@@ -133,7 +204,6 @@ export class TuiSessionBase {
|
|
|
133
204
|
});
|
|
134
205
|
return await this.buildTurn(startText);
|
|
135
206
|
}
|
|
136
|
-
idleSinceMs ?? (idleSinceMs = state.elapsedMs);
|
|
137
207
|
}
|
|
138
208
|
else {
|
|
139
209
|
idleSinceMs = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tuiSession.js","sourceRoot":"","sources":["../../src/harness/tuiSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,wFAAwF;AACxF,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;2FAC2F;AAC3F,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAElC,0GAA0G;AAC1G,MAAM,6BAA6B,GAAG,IAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tuiSession.js","sourceRoot":"","sources":["../../src/harness/tuiSession.ts"],"names":[],"mappings":"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"}
|
package/dist/useAgent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgent.d.ts","sourceRoot":"","sources":["../src/useAgent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAgent.d.ts","sourceRoot":"","sources":["../src/useAgent.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,0EAA0E;IAC1E,kBAAkB,EAAE,MAAM,OAAO,CAAC;IAClC,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,KAAK,mBAAmB,CAAC;CACnF;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,YAAY,CAiD7E"}
|
package/dist/useAgent.js
CHANGED
|
@@ -3,6 +3,7 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { afterAll, beforeAll, beforeEach } from "vitest";
|
|
5
5
|
import { DEFAULT_PROMPT_TIMEOUT_MS } from "./harness/shared.js";
|
|
6
|
+
import { dumpSessionSnapshots, resetSessionSnapshots } from "./harness/tuiSession.js";
|
|
6
7
|
/**
|
|
7
8
|
* Agent e2e suite setup: temp workdir, availability skip gate, and base
|
|
8
9
|
* session options. Call inside a `describe` block with the harness to drive.
|
|
@@ -18,10 +19,17 @@ export function useAgent({ harness }) {
|
|
|
18
19
|
if (!isHarnessAvailable()) {
|
|
19
20
|
ctx.skip(`harness '${harness.name}' not available; agent e2e suite skipped`);
|
|
20
21
|
}
|
|
22
|
+
// Always surface the harness snapshot history when a test fails, debug mode or not.
|
|
23
|
+
// Hooking the test failure (not the session) also covers assertion failures after a
|
|
24
|
+
// turn the harness considered complete, and vitest's own timeout killing the test.
|
|
25
|
+
resetSessionSnapshots();
|
|
26
|
+
ctx.onTestFailed(() => dumpSessionSnapshots(`test "${ctx.task.name}" failed`));
|
|
21
27
|
});
|
|
22
28
|
afterAll(async () => {
|
|
23
29
|
if (workDir) {
|
|
24
|
-
|
|
30
|
+
// Codex's app-server daemon can outlive the TUI and keep writing lock
|
|
31
|
+
// files into the workdir, racing the removal (ENOTEMPTY); retry briefly.
|
|
32
|
+
await fs.rm(workDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 200 });
|
|
25
33
|
}
|
|
26
34
|
});
|
|
27
35
|
return {
|
package/dist/useAgent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgent.js","sourceRoot":"","sources":["../src/useAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAgent.js","sourceRoot":"","sources":["../src/useAgent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAWtF;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,OAAO,EAA6B;IAC3D,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,IAAI,gBAAqC,CAAC;IAC1C,MAAM,kBAAkB,GAAG,GAAY,EAAE,CAAC,CAAC,gBAAgB,KAAhB,gBAAgB,GAAK,OAAO,CAAC,WAAW,EAAE,EAAC,CAAC;IAEvF,SAAS,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,0CAA0C,CAAC,CAAC;QACjF,CAAC;QACD,oFAAoF;QACpF,oFAAoF;QACpF,mFAAmF;QACnF,qBAAqB,EAAE,CAAC;QACxB,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,OAAO,EAAE,CAAC;YACV,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,OAAO;QACP,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;QACtB,kBAAkB;QAClB,YAAY,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO;YACP,yEAAyE;YACzE,GAAG,CAAC,GAAuB,EAAE;gBACzB,MAAM,KAAK,GACP,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;oBACnE,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;oBACrE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,CAAC,CAAC,EAAE;YACJ,eAAe,EAAE,yBAAyB;YAC1C,6DAA6D;YAC7D,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe;YACpC,GAAG,SAAS;SACf,CAAC;KACkB,CAAC;AAC7B,CAAC"}
|
package/package.json
CHANGED