@mongodb-js/harness-tester 3.1.0-pre.1 → 3.1.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 +76 -10
- package/dist/harness/claude/claudeConfig.d.ts +1 -1
- package/dist/harness/claude/claudeConfig.js +1 -1
- package/dist/harness/codex/codexParseTuiTranscript.d.ts.map +1 -1
- package/dist/harness/codex/codexParseTuiTranscript.js +5 -3
- package/dist/harness/codex/codexParseTuiTranscript.js.map +1 -1
- package/dist/harness/codex/codexSession.d.ts +1 -0
- package/dist/harness/codex/codexSession.d.ts.map +1 -1
- package/dist/harness/codex/codexSession.js +6 -4
- package/dist/harness/codex/codexSession.js.map +1 -1
- package/dist/harness/codex/codexTuiMarkers.d.ts +16 -0
- package/dist/harness/codex/codexTuiMarkers.d.ts.map +1 -0
- package/dist/harness/codex/codexTuiMarkers.js +36 -0
- package/dist/harness/codex/codexTuiMarkers.js.map +1 -0
- package/dist/harness/tuiSession.d.ts +6 -0
- package/dist/harness/tuiSession.d.ts.map +1 -1
- package/dist/harness/tuiSession.js +24 -12
- package/dist/harness/tuiSession.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,14 +2,69 @@
|
|
|
2
2
|
|
|
3
3
|
Agent-only tooling for driving real LLM coding-agent CLIs interactively through their TUIs, with **no MCP or MongoDB dependencies**.
|
|
4
4
|
|
|
5
|
-
Harnesses
|
|
5
|
+
Harnesses: [codex](https://github.com/openai/codex) and [claude](https://github.com/anthropics/claude-code), driven inside [`@microsoft/tui-test`](https://github.com/microsoft/tui-test/blob/main/bindings/js/README.md)'s headless terminal emulator. Both need the agent binary on `PATH` and `GROVE_API_KEY`.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- `harness/codex/`, `harness/claude/` — per-agent config, TUI drive loops, and tool-call parsers (`AgentHarness`; the contract is in `harness/types.ts`). Turn text is raw terminal content — tests keyword-match it.
|
|
8
|
+
- `useAgent({ harness })` — vitest hook: temp workdir, availability skip gate, and base `AgentHarnessOptions`.
|
|
9
|
+
- `AGENT_HARNESSES` — registry of harness classes.
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Drive a harness directly:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { ClaudeTuiHarness } from "@mongodb-js/harness-tester";
|
|
17
|
+
|
|
18
|
+
const harness = new ClaudeTuiHarness(); // or CodexTuiHarness
|
|
19
|
+
const session = await harness.start({
|
|
20
|
+
workDir: "/tmp/agent-session",
|
|
21
|
+
serverUrl: "http://127.0.0.1:3000/mcp",
|
|
22
|
+
mcpServerName: "mongo",
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const turn = await session.prompt("List the databases on the mongo server.");
|
|
27
|
+
console.log(turn.text, turn.toolCalls);
|
|
28
|
+
} finally {
|
|
29
|
+
await session.dispose();
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
In a vitest suite, `useAgent` creates a temp workdir, skips when the harness is unavailable, and builds base options:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { describe, expect, it } from "vitest";
|
|
37
|
+
import { CodexTuiHarness, useAgent } from "@mongodb-js/harness-tester";
|
|
38
|
+
|
|
39
|
+
describe("mongo agent", () => {
|
|
40
|
+
const { harness, buildOptions } = useAgent({
|
|
41
|
+
harness: new CodexTuiHarness(),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("lists databases", async () => {
|
|
45
|
+
const session = await harness.start(
|
|
46
|
+
buildOptions({ serverUrl: "http://127.0.0.1:3000/mcp" })
|
|
47
|
+
);
|
|
48
|
+
try {
|
|
49
|
+
const turn = await session.prompt("List the databases.");
|
|
50
|
+
expect(turn.toolCalls.map((call) => call.name)).toContain(
|
|
51
|
+
"list-databases"
|
|
52
|
+
);
|
|
53
|
+
} finally {
|
|
54
|
+
await session.dispose();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
When a turn pauses for confirmation, answer it with `chooseOption`:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
const turn = await session.prompt('Use "drop-database" to drop "test_db".');
|
|
64
|
+
if (turn.state === "elicitation") {
|
|
65
|
+
await session.chooseOption("confirm"); // or "decline"
|
|
66
|
+
}
|
|
67
|
+
```
|
|
13
68
|
|
|
14
69
|
## Remote servers: headers and OAuth
|
|
15
70
|
|
|
@@ -19,13 +74,24 @@ What lives here:
|
|
|
19
74
|
- `headers` — extra HTTP headers for that server, e.g. `{ Authorization: "Bearer ..." }`.
|
|
20
75
|
- `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
76
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
| Harness | Store |
|
|
77
|
+
| Harness | OAuth store |
|
|
25
78
|
| ------- | ---------------------------------------------------------------------------------------------------- |
|
|
26
79
|
| codex | `$CODEX_HOME/.credentials.json`, with `mcp_oauth_credentials_store = "file"` in the generated config |
|
|
27
80
|
| claude | the `mcpOAuth` map in `$CLAUDE_CONFIG_DIR/.credentials.json` |
|
|
28
81
|
|
|
29
82
|
`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
83
|
|
|
31
|
-
|
|
84
|
+
## Environment variables
|
|
85
|
+
|
|
86
|
+
| Variable | Purpose |
|
|
87
|
+
| ------------------------ | --------------------------------------------------------------------- |
|
|
88
|
+
| `GROVE_API_KEY` | Provider key for the grove gateway (required). |
|
|
89
|
+
| `AGENT_E2E_MODEL` | Shared model override (overridden by the per-harness vars). |
|
|
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-5-5`). |
|
|
92
|
+
| `AGENT_E2E_CODEX_BIN` | Codex binary path (default: `codex`). |
|
|
93
|
+
| `AGENT_E2E_CLAUDE_BIN` | Claude binary path (default: `claude`). |
|
|
94
|
+
| `AGENT_E2E_TUI_BACKEND` | tui-test backend: `alacritty` (default), `ghostty`, `rio`. |
|
|
95
|
+
| `AGENT_E2E_DEBUG` | Dump config (redacted), TUI state, and agent replies. |
|
|
96
|
+
|
|
97
|
+
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 `useAgent`. See that package's README.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentHarnessConfig, AgentHarnessOptions } from "../types.js";
|
|
2
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-
|
|
3
|
+
export declare const DEFAULT_CLAUDE_MODEL = "claude-haiku-5-5";
|
|
4
4
|
/** Minimum reasoning effort for e2e runs (mirrors the codex harness's `"low"`). */
|
|
5
5
|
export declare const DEFAULT_CLAUDE_EFFORT_LEVEL = "low";
|
|
6
6
|
/** Grove gateway Anthropic endpoint (no trailing /v1; claude appends it). */
|
|
@@ -3,7 +3,7 @@ import os from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
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
|
-
export const DEFAULT_CLAUDE_MODEL = "claude-haiku-
|
|
6
|
+
export const DEFAULT_CLAUDE_MODEL = "claude-haiku-5-5";
|
|
7
7
|
/** Minimum reasoning effort for e2e runs (mirrors the codex harness's `"low"`). */
|
|
8
8
|
export const DEFAULT_CLAUDE_EFFORT_LEVEL = "low";
|
|
9
9
|
/** Grove gateway Anthropic endpoint (no trailing /v1; claude appends it). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexParseTuiTranscript.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexParseTuiTranscript.ts"],"names":[],"mappings":"AAAA,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,wBAAwB;IACrC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"codexParseTuiTranscript.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexParseTuiTranscript.ts"],"names":[],"mappings":"AAAA,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,wBAAwB;IACrC,SAAS,EAAE,cAAc,EAAE,CAAC;CAC/B;AAiCD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAI/E"}
|
|
@@ -4,15 +4,17 @@ function collectToolCalls(transcript) {
|
|
|
4
4
|
const toolCalls = [];
|
|
5
5
|
const seen = new Set();
|
|
6
6
|
for (const line of transcript.split("\n")) {
|
|
7
|
-
|
|
7
|
+
// Args are optional: codex's collapsed activity preview renders
|
|
8
|
+
// `• Called mongo.list-databases` with no `(...)`.
|
|
9
|
+
const match = line.match(/•\s*Called\s+([^\s(]+)/);
|
|
8
10
|
if (!match) {
|
|
9
11
|
continue;
|
|
10
12
|
}
|
|
11
13
|
const rawName = match[1] ?? "";
|
|
12
14
|
const name = normalizeToolName(rawName);
|
|
13
|
-
const
|
|
15
|
+
const openParen = line.indexOf("(", match.index ?? 0);
|
|
14
16
|
const argsEnd = line.lastIndexOf(")");
|
|
15
|
-
const argsText = argsEnd >
|
|
17
|
+
const argsText = openParen >= 0 && argsEnd > openParen ? line.slice(openParen + 1, argsEnd).trim() : "";
|
|
16
18
|
let args;
|
|
17
19
|
try {
|
|
18
20
|
args = argsText ? JSON.parse(argsText) : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexParseTuiTranscript.js","sourceRoot":"","sources":["../../../src/harness/codex/codexParseTuiTranscript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B,SAAS,gBAAgB,CAAC,UAAkB;IACxC,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"codexParseTuiTranscript.js","sourceRoot":"","sources":["../../../src/harness/codex/codexParseTuiTranscript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B,SAAS,gBAAgB,CAAC,UAAkB;IACxC,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,gEAAgE;QAChE,mDAAmD;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,SAAS;QACb,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACD,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACL,IAAI,GAAG,QAAQ,CAAC;QACpB,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtB,SAAS;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACjD,OAAO;QACH,SAAS,EAAE,gBAAgB,CAAC,UAAU,CAAC;KAC1C,CAAC;AACN,CAAC"}
|
|
@@ -11,6 +11,7 @@ export declare class CodexTuiSession extends TuiSessionBase {
|
|
|
11
11
|
protected get label(): string;
|
|
12
12
|
protected isWorking(text: string): boolean;
|
|
13
13
|
protected isComposerIdle(text: string): boolean;
|
|
14
|
+
protected isTransitional(text: string): boolean;
|
|
14
15
|
/**
|
|
15
16
|
* Codex renders the elicitation as a numbered list using the schema's verbatim
|
|
16
17
|
* enumNames ("Yes, I confirm"/"No, I do not confirm"), so type the label.
|
|
@@ -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;
|
|
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;IAIxD;;;OAGG;cACsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjF,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;CAG9D"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { parseTuiTranscript } from "./codexParseTuiTranscript.js";
|
|
2
|
+
import { isCodexComposerIdle, isCodexTransitional, isCodexWorking } from "./codexTuiMarkers.js";
|
|
2
3
|
import { TuiSessionBase } from "../tuiSession.js";
|
|
3
|
-
/** Composer idle marker (turn finished). */
|
|
4
|
-
const COMPOSER_IDLE_MARKER = "Ask Codex to do anything";
|
|
5
4
|
export class CodexTuiSession extends TuiSessionBase {
|
|
6
5
|
constructor({ terminal, options, onState, }) {
|
|
7
6
|
super({ terminal, options, onState });
|
|
@@ -10,10 +9,13 @@ export class CodexTuiSession extends TuiSessionBase {
|
|
|
10
9
|
return "codex";
|
|
11
10
|
}
|
|
12
11
|
isWorking(text) {
|
|
13
|
-
return
|
|
12
|
+
return isCodexWorking(text);
|
|
14
13
|
}
|
|
15
14
|
isComposerIdle(text) {
|
|
16
|
-
return text
|
|
15
|
+
return isCodexComposerIdle(text);
|
|
16
|
+
}
|
|
17
|
+
isTransitional(text) {
|
|
18
|
+
return isCodexTransitional(text);
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* Codex renders the elicitation as a numbered list using the schema's verbatim
|
|
@@ -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,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,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAChG,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;IAED;;;OAGG;IACgB,KAAK,CAAC,UAAU,CAAC,MAA6B;QAC7D,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC/E,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex TUI markers.
|
|
3
|
+
*
|
|
4
|
+
* The status indicator's header changes during a turn ("Working", a
|
|
5
|
+
* reasoning-summary line, ...), so "turn in progress" is detected from the
|
|
6
|
+
* stable trailing interrupt hint instead of the header text. Both patterns are
|
|
7
|
+
* line-anchored: they are tested against the whole viewport, so an echoed prompt
|
|
8
|
+
* or transcript line quoting the hint must not be mistaken for live UI.
|
|
9
|
+
*/
|
|
10
|
+
/** Whether the viewport shows an in-progress turn, regardless of the status header. */
|
|
11
|
+
export declare function isCodexWorking(text: string): boolean;
|
|
12
|
+
/** Whether the composer is idle and ready for a prompt. */
|
|
13
|
+
export declare function isCodexComposerIdle(text: string): boolean;
|
|
14
|
+
/** Whether the viewport shows a transient startup/reconnect banner (not a real input prompt). */
|
|
15
|
+
export declare function isCodexTransitional(text: string): boolean;
|
|
16
|
+
//# sourceMappingURL=codexTuiMarkers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexTuiMarkers.d.ts","sourceRoot":"","sources":["../../../src/harness/codex/codexTuiMarkers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex TUI markers.
|
|
3
|
+
*
|
|
4
|
+
* The status indicator's header changes during a turn ("Working", a
|
|
5
|
+
* reasoning-summary line, ...), so "turn in progress" is detected from the
|
|
6
|
+
* stable trailing interrupt hint instead of the header text. Both patterns are
|
|
7
|
+
* line-anchored: they are tested against the whole viewport, so an echoed prompt
|
|
8
|
+
* or transcript line quoting the hint must not be mistaken for live UI.
|
|
9
|
+
*/
|
|
10
|
+
/** Composer placeholder shown when the composer is idle and ready for a prompt. */
|
|
11
|
+
const COMPOSER_IDLE_MARKER = "Ask Codex to do anything";
|
|
12
|
+
/**
|
|
13
|
+
* A complete status-indicator line
|
|
14
|
+
* (`<indicator> <header> (<elapsed> • <binding> to interrupt)`), optionally
|
|
15
|
+
* followed by an inline ` · <message>`.
|
|
16
|
+
*
|
|
17
|
+
* The leading glyph is not pinned to `•`: with animations enabled codex blinks
|
|
18
|
+
* between `•` and `◦`, so matching the glyph would miss live turns. Anchoring to
|
|
19
|
+
* the elapsed/interrupt shape keeps echoed prompt text from matching.
|
|
20
|
+
*/
|
|
21
|
+
const WORKING_MARKER = /^[^\s›].*\(\d+[smh](?:[ \t]\d+[smh])*[ \t]•[ \t][^)]*to interrupt\)(?:[ \t]·[ \t].*)?[ \t]*$/m;
|
|
22
|
+
/** Transient banners rendered as "neither working nor idle" that are not input prompts. */
|
|
23
|
+
const TRANSITIONAL_MARKER = /^[ \t]*(?:Waiting for startup|Reconnecting to app-server|Loading earlier messages)\b/m;
|
|
24
|
+
/** Whether the viewport shows an in-progress turn, regardless of the status header. */
|
|
25
|
+
export function isCodexWorking(text) {
|
|
26
|
+
return WORKING_MARKER.test(text);
|
|
27
|
+
}
|
|
28
|
+
/** Whether the composer is idle and ready for a prompt. */
|
|
29
|
+
export function isCodexComposerIdle(text) {
|
|
30
|
+
return text.includes(COMPOSER_IDLE_MARKER);
|
|
31
|
+
}
|
|
32
|
+
/** Whether the viewport shows a transient startup/reconnect banner (not a real input prompt). */
|
|
33
|
+
export function isCodexTransitional(text) {
|
|
34
|
+
return TRANSITIONAL_MARKER.test(text);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=codexTuiMarkers.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -55,6 +55,12 @@ export declare abstract class TuiSessionBase implements AgentSession {
|
|
|
55
55
|
protected abstract sendChoice(choice: "confirm" | "decline"): Promise<void>;
|
|
56
56
|
/** Codex interposes its own tool-approval prompt before the server's elicitation. */
|
|
57
57
|
protected isToolApproval(text: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Whether the viewport shows a transient banner (startup, reconnect, ...)
|
|
60
|
+
* that renders as "neither working nor idle" but is not real input. Such
|
|
61
|
+
* states must not be mistaken for an elicitation. Harnesses opt in.
|
|
62
|
+
*/
|
|
63
|
+
protected isTransitional?(text: string): boolean;
|
|
58
64
|
protected approveTool(): Promise<void>;
|
|
59
65
|
prompt(prompt: string): Promise<AgentTurn>;
|
|
60
66
|
/**
|
|
@@ -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;AAY/G,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACrB,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,OAAO,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,8BAAsB,cAAe,YAAW,YAAY;IACxD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,IAAI,CAA4B;IACxC,6EAA6E;IAC7E,OAAO,CAAC,oBAAoB,CAAqB;IACjD,2FAA2F;IAC3F,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,YAAY,CAA+B;IAEnD,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,SAAS,aAAa,EAClB,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;IAMD,6DAA6D;IAC7D,SAAS,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC;IACvC,OAAO,KAAK,GAAG,GAEd;IACD,sDAAsD;IACtD,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IACnD,iEAAiE;IACjE,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IACxD,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAEpE,qDAAqD;IAC/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAKrE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3E,qFAAqF;IACrF,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;
|
|
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;AAY/G,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACrB,wEAAwE;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,YAAY,EAAE,OAAO,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,8BAAsB,cAAe,YAAW,YAAY;IACxD,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,IAAI,CAA4B;IACxC,6EAA6E;IAC7E,OAAO,CAAC,oBAAoB,CAAqB;IACjD,2FAA2F;IAC3F,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,YAAY,CAA+B;IAEnD,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,SAAS,aAAa,EAClB,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;IAMD,6DAA6D;IAC7D,SAAS,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC;IACvC,OAAO,KAAK,GAAG,GAEd;IACD,sDAAsD;IACtD,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IACnD,iEAAiE;IACjE,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IACxD,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAEpE,qDAAqD;IAC/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAKrE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3E,qFAAqF;IACrF,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/C;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;cAEhC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAShD;;;OAGG;YACW,QAAQ;IAqHtB,4EAA4E;YAC9D,gBAAgB;YAahB,YAAY;YAIZ,cAAc;YAId,SAAS;IAgBvB,OAAO,CAAC,UAAU;IAWZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
|
|
@@ -93,17 +93,29 @@ export class TuiSessionBase {
|
|
|
93
93
|
// Agent is awaiting input when not working and not idle; require that
|
|
94
94
|
// state to persist a couple of polls so we do not fire mid-transition.
|
|
95
95
|
if (sawTurnActivity && !state.working && !state.composerIdle) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
96
|
+
if (this.isTransitional?.(viewport)) {
|
|
97
|
+
confirmationPendingSinceMs = undefined;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
confirmationPendingSinceMs ?? (confirmationPendingSinceMs = state.elapsedMs);
|
|
101
|
+
if (state.elapsedMs - confirmationPendingSinceMs >= CONFIRMATION_PENDING_GRACE_MS) {
|
|
102
|
+
if (this.isToolApproval(viewport)) {
|
|
103
|
+
await this.approveTool();
|
|
104
|
+
confirmationPendingSinceMs = undefined;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (stopOnElicitation) {
|
|
108
|
+
this.currentState = "elicitation";
|
|
109
|
+
this.lastShownDeltaLength = delta.length;
|
|
110
|
+
// A real turn can call tools before eliciting, so keep what the
|
|
111
|
+
// delta already shows instead of discarding observed calls.
|
|
112
|
+
return {
|
|
113
|
+
text: delta,
|
|
114
|
+
toolCalls: this.extractToolCalls(delta),
|
|
115
|
+
state: "elicitation",
|
|
116
|
+
confirmation: viewport,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
107
119
|
}
|
|
108
120
|
}
|
|
109
121
|
}
|
|
@@ -149,7 +161,7 @@ export class TuiSessionBase {
|
|
|
149
161
|
// Fail loudly with the raw transcript attached for diagnosis.
|
|
150
162
|
return {
|
|
151
163
|
text: `ERROR: ${message}${text ? "\n\n--- terminal content ---\n" + text : ""}`,
|
|
152
|
-
toolCalls:
|
|
164
|
+
toolCalls: this.extractToolCalls(delta),
|
|
153
165
|
state: "completed",
|
|
154
166
|
};
|
|
155
167
|
}
|
|
@@ -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;AAc5C;;;;GAIG;AACH,MAAM,OAAgB,cAAc;IAWhC,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,YAAsB,EAClB,QAAQ,EACR,OAAO,EACP,OAAO,GAKV;QAhBD,2FAA2F;QACnF,yBAAoB,GAAG,EAAE,CAAC;QAC1B,iBAAY,GAAmB,WAAW,CAAC;QAe/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC,KAAK,EAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;IAID,IAAY,GAAG;QACX,OAAO,CAAC,IAAI,CAAC,IAAI,KAAT,IAAI,CAAC,IAAI,GAAK,IAAI,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,EAAC,CAAC;IAClE,CAAC;IAQD,qDAAqD;IACrD,KAAK,CAAC,UAAU;QACZ,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,MAA6B;QAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAQD,qFAAqF;IAC3E,cAAc,CAAC,IAAY;QACjC,OAAO,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;
|
|
1
|
+
{"version":3,"file":"tuiSession.js","sourceRoot":"","sources":["../../src/harness/tuiSession.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mongodb-js/harness-tester",
|
|
3
|
-
"version": "3.1.0
|
|
3
|
+
"version": "3.1.0",
|
|
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",
|