@post-print/agent-harness 1.1.9 → 2.0.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 +11 -93
- package/dist/agent-definition.d.ts +77 -0
- package/dist/agent-definition.d.ts.map +1 -0
- package/dist/agent-definition.js +46 -0
- package/dist/agent-definition.js.map +1 -0
- package/dist/agent-session.d.ts +17 -0
- package/dist/agent-session.d.ts.map +1 -0
- package/dist/agent-session.js +165 -0
- package/dist/agent-session.js.map +1 -0
- package/dist/agent-worker.d.ts +2 -0
- package/dist/agent-worker.d.ts.map +1 -0
- package/dist/agent-worker.js +167 -0
- package/dist/agent-worker.js.map +1 -0
- package/dist/capture.d.ts +1 -0
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +119 -101
- package/dist/capture.js.map +1 -1
- package/dist/claude-capture.d.ts +0 -1
- package/dist/claude-capture.d.ts.map +1 -1
- package/dist/claude-capture.js +96 -106
- package/dist/claude-capture.js.map +1 -1
- package/dist/claude-run.d.ts +3 -11
- package/dist/claude-run.d.ts.map +1 -1
- package/dist/claude-run.js +178 -166
- package/dist/claude-run.js.map +1 -1
- package/dist/cursor-auth.d.ts +0 -1
- package/dist/cursor-auth.d.ts.map +1 -1
- package/dist/cursor-auth.js +5 -3
- package/dist/cursor-auth.js.map +1 -1
- package/dist/cursor-run.d.ts +6 -34
- package/dist/cursor-run.d.ts.map +1 -1
- package/dist/cursor-run.js +123 -175
- package/dist/cursor-run.js.map +1 -1
- package/dist/index.d.ts +8 -40
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -47
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +37 -39
- package/dist/mcp.js.map +1 -1
- package/dist/openai-capture.d.ts.map +1 -1
- package/dist/openai-capture.js +66 -57
- package/dist/openai-capture.js.map +1 -1
- package/dist/openai-run.d.ts +4 -13
- package/dist/openai-run.d.ts.map +1 -1
- package/dist/openai-run.js +168 -159
- package/dist/openai-run.js.map +1 -1
- package/dist/sealed-workspace.d.ts +0 -8
- package/dist/sealed-workspace.d.ts.map +1 -1
- package/dist/sealed-workspace.js +32 -65
- package/dist/sealed-workspace.js.map +1 -1
- package/dist/skills-context.d.ts +0 -24
- package/dist/skills-context.d.ts.map +1 -1
- package/dist/skills-context.js +12 -156
- package/dist/skills-context.js.map +1 -1
- package/dist/types.d.ts +0 -84
- package/dist/types.d.ts.map +1 -1
- package/dist/user-skills.d.ts +6 -6
- package/dist/user-skills.d.ts.map +1 -1
- package/dist/user-skills.js +32 -27
- package/dist/user-skills.js.map +1 -1
- package/dist/working-tree-guard.d.ts.map +1 -1
- package/dist/working-tree-guard.js +3 -1
- package/dist/working-tree-guard.js.map +1 -1
- package/package.json +3 -3
- package/dist/adapters/index.d.ts +0 -28
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -271
- package/dist/adapters/index.js.map +0 -1
- package/dist/classifier.d.ts +0 -15
- package/dist/classifier.d.ts.map +0 -1
- package/dist/classifier.js +0 -102
- package/dist/classifier.js.map +0 -1
- package/dist/context.d.ts +0 -26
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -227
- package/dist/context.js.map +0 -1
- package/dist/conversation.d.ts +0 -28
- package/dist/conversation.d.ts.map +0 -1
- package/dist/conversation.js +0 -191
- package/dist/conversation.js.map +0 -1
- package/dist/host-registry.d.ts +0 -11
- package/dist/host-registry.d.ts.map +0 -1
- package/dist/host-registry.js +0 -36
- package/dist/host-registry.js.map +0 -1
- package/dist/judge.d.ts +0 -132
- package/dist/judge.d.ts.map +0 -1
- package/dist/judge.js +0 -795
- package/dist/judge.js.map +0 -1
- package/dist/logger.d.ts +0 -11
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -20
- package/dist/logger.js.map +0 -1
- package/dist/main.d.ts +0 -9
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -7
- package/dist/main.js.map +0 -1
- package/dist/retry.d.ts +0 -14
- package/dist/retry.d.ts.map +0 -1
- package/dist/retry.js +0 -52
- package/dist/retry.js.map +0 -1
- package/dist/user-simulator.d.ts +0 -10
- package/dist/user-simulator.d.ts.map +0 -1
- package/dist/user-simulator.js +0 -47
- package/dist/user-simulator.js.map +0 -1
- package/dist/worktree-leak.d.ts +0 -16
- package/dist/worktree-leak.d.ts.map +0 -1
- package/dist/worktree-leak.js +0 -110
- package/dist/worktree-leak.js.map +0 -1
- package/dist/worktree.d.ts +0 -10
- package/dist/worktree.d.ts.map +0 -1
- package/dist/worktree.js +0 -58
- package/dist/worktree.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,106 +1,24 @@
|
|
|
1
1
|
# @post-print/agent-harness
|
|
2
2
|
|
|
3
|
-
<!-- source-of-truth: agent
|
|
4
|
-
|
|
3
|
+
<!-- source-of-truth: configured agent definitions and isolated harness sessions -->
|
|
5
4
|
<!-- doc-meta: owner=eng | last-reviewed=2026-09-16 -->
|
|
6
|
-
|
|
7
5
|
<!-- review-deps: paths=packages/harness/src/*.ts,packages/harness/src/**/*.ts,packages/harness/package.json -->
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
Configure coding agents for agent-test. Definitions are reusable; each task session owns an isolated worker and host runtime.
|
|
10
8
|
|
|
11
9
|
```ts
|
|
12
|
-
import {
|
|
13
|
-
runAgent,
|
|
14
|
-
loadContext,
|
|
15
|
-
judgeTrace,
|
|
16
|
-
createSealedWorkspace,
|
|
17
|
-
} from "@post-print/agent-harness";
|
|
10
|
+
import { openai, claude, cursor } from "@post-print/agent-harness";
|
|
18
11
|
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
context,
|
|
25
|
-
prompt: "…",
|
|
26
|
-
});
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
For a host-native session, keep the scenario prompt unchanged and let the host discover its supported project files:
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
const context = await loadContext({
|
|
33
|
-
cwd: sealed.path,
|
|
34
|
-
profile: "cursor",
|
|
35
|
-
mode: "host-native",
|
|
12
|
+
export const coder = openai({
|
|
13
|
+
auth: { type: "subscription" },
|
|
14
|
+
skills: ["./skills/testing"],
|
|
15
|
+
context: { instructions: ["Run the relevant tests."], files: ["./context/project.md"] },
|
|
16
|
+
includeGlobalSkills: false,
|
|
36
17
|
});
|
|
37
18
|
```
|
|
38
19
|
|
|
39
|
-
`
|
|
40
|
-
|
|
41
|
-
Replay-based testing is deprecated and removed. `runAgent` always launches the selected agent host. Untyped calls with `host: "replay"` fail with migration guidance.
|
|
42
|
-
|
|
43
|
-
`runAgent` / `runCursorAgent` / `runClaudeAgent` / `runOpenaiAgent` accept optional `timeoutMs` and `failOnUserInput` (default `true`). Set `failOnUserInput: false` to start a user simulator that answers AskQuestion-style tools. The next host turn receives the original task plus the transcript.
|
|
44
|
-
|
|
45
|
-
## Hosts
|
|
46
|
-
|
|
47
|
-
| Host | Binary / SDK | Auth |
|
|
48
|
-
| --- | --- | --- |
|
|
49
|
-
| `cursor` | `@cursor/sdk` | Subscription after `npx agent-test login`, or `--auth-mode api-key` plus `CURSOR_API_KEY` |
|
|
50
|
-
| `claude` | `claude` or `CLAUDE_CODE_BIN` | Subscription after Claude Code login, or `--auth-mode api-key` plus `ANTHROPIC_API_KEY` |
|
|
51
|
-
| `openai` | `codex` or `CODEX_BIN` | Subscription after `codex login`, or `--auth-mode api-key` plus `OPENAI_API_KEY` or `CODEX_API_KEY` |
|
|
52
|
-
| custom slug | your `HostAdapter` | `missingAuth()` on the adapter |
|
|
53
|
-
|
|
54
|
-
A consumer repo can add a host. Implement `HostAdapter` and call `registerHostAdapter`. Builtin ids stay reserved.
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
import { registerHostAdapter, type HostAdapter, runAgent } from "@post-print/agent-harness";
|
|
58
|
-
|
|
59
|
-
const gemini: HostAdapter = {
|
|
60
|
-
host: "gemini",
|
|
61
|
-
missingAuth() {
|
|
62
|
-
return process.env.GEMINI_API_KEY ? undefined : "GEMINI_API_KEY not set";
|
|
63
|
-
},
|
|
64
|
-
classifierHost: "cursor",
|
|
65
|
-
async run(options) {
|
|
66
|
-
return {
|
|
67
|
-
host: "gemini",
|
|
68
|
-
status: "completed",
|
|
69
|
-
durationMs: 0,
|
|
70
|
-
trace: {
|
|
71
|
-
messages: [{ role: "assistant", content: options.prompt }],
|
|
72
|
-
toolCalls: [],
|
|
73
|
-
shellCommands: [],
|
|
74
|
-
artifacts: {},
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
registerHostAdapter(gemini);
|
|
81
|
-
await runAgent({ host: "gemini", cwd: process.cwd(), prompt: "…" });
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
For `agent-test`, put adapters in `agent-test.config.mjs` or pass `--adapter ./hosts/gemini.mjs`. Isolated children load the same config.
|
|
85
|
-
|
|
86
|
-
Set `classifierHost` to `cursor`, `claude`, or `openai`, or implement `classify()`. A custom host without one cannot run the judge.
|
|
87
|
-
|
|
88
|
-
Claude `api-key` mode uses `--bare` for harness-preamble runs and project setting sources for host-native runs. Subscription mode uses `--strict-mcp-config`. OpenAI agent runs use `codex exec --json --sandbox workspace-write --cd <sealed> --ignore-user-config -c approval_policy=never`. Pass `networkAccess: true` to add `-c sandbox_workspace_write.network_access=true` to that workspace-write child; omitted or `false` stays offline. Suite MCP servers pass to Codex as `-c mcp_servers.<name>=…`. A user `~/.codex/config.toml` model pin does not apply. When user skills stay out, the Codex child gets a temp home with only its login file.
|
|
89
|
-
|
|
90
|
-
## Skills
|
|
91
|
-
|
|
92
|
-
The sealed workspace is a git repo. Each host discovers its own project skill roots: Cursor uses `.cursor/skills` and `.agents/skills`, Claude uses `.claude/skills`, and Codex uses `.agents/skills`. Optional `skills` paths are only used by harness-preamble mode to build a synthetic catalog. Host-global user skills stay out unless `allowUserSkills` is true. The deny path uses Cursor `settingSources: ["project"]` plus a temp `HOME` with no skill trees, Claude project-only settings or `--bare`, and Codex `--ignore-user-config` plus an auth-only temp home. The judge scores any criterion against the full transcript, including tool names, args, and results. A tool result is an outcome.
|
|
93
|
-
|
|
94
|
-
## Isolation
|
|
95
|
-
|
|
96
|
-
`createSealedWorkspace` copies `git archive HEAD` plus caller context (rules, skill trees, `AGENTS.md`, `skeleton.toml`) into a temp folder. Pass `workspace` to copy a caller-relative folder instead. It then runs `git init` in that folder so git does not walk to the caller repo. Cursor file and shell tools use that same folder. The test runner fails the scenario when tool paths leave it. Cursor's temporary large-output files are host evidence and do not count as leaks.
|
|
97
|
-
|
|
98
|
-
## Judge
|
|
99
|
-
|
|
100
|
-
`judgeTrace` uses the same host family as the test agent. Default auth is subscription. Cursor judge calls use the SDK login store, or `CURSOR_API_KEY` when `--auth-mode api-key` is set. Claude and OpenAI judges use their own host credentials.
|
|
101
|
-
|
|
102
|
-
The Cursor app login does not feed the SDK. Run `npx agent-test login`, or pass `--auth-mode api-key` plus `CURSOR_API_KEY`. Subscription mode uses the Codex CLI login and strips stale API keys from the child env.
|
|
20
|
+
`openai()` runs Codex, `claude()` runs Claude Code, and `cursor()` uses the Cursor SDK. All accept model and authentication options. API-key authentication names an environment variable: `{ type: "api-key", env: "OPENAI_API_KEY" }`.
|
|
103
21
|
|
|
104
|
-
|
|
22
|
+
Factories do not launch agents. Agent-test prepares workspaces, installs attached skills, supplies context, creates sessions, and guarantees cleanup. Custom adapters use `defineAgent()` and `customAgent()`; see [the SDK guide](../../docs/sdk-v2.md#custom-agents).
|
|
105
23
|
|
|
106
|
-
|
|
24
|
+
Built-in continuation currently reconstructs prior conversation. Cursor does not yet support enforced read-only judge sessions; use OpenAI or Claude as the judge. ACP is not introduced by this change.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { AgentTrace, AgentUsage, BuiltinAgentHost, McpServerConfig } from "./types.js";
|
|
2
|
+
export type AgentAuth = {
|
|
3
|
+
type: "subscription";
|
|
4
|
+
} | {
|
|
5
|
+
type: "api-key";
|
|
6
|
+
env: string;
|
|
7
|
+
};
|
|
8
|
+
export interface AgentContext {
|
|
9
|
+
instructions?: readonly string[];
|
|
10
|
+
files?: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
export interface AgentOptions {
|
|
13
|
+
model?: string;
|
|
14
|
+
auth?: AgentAuth;
|
|
15
|
+
skills?: readonly string[];
|
|
16
|
+
context?: AgentContext;
|
|
17
|
+
/** Include host-global skills only when explicitly enabled. Defaults to false. */
|
|
18
|
+
includeGlobalSkills?: boolean;
|
|
19
|
+
mcpServers?: Record<string, McpServerConfig>;
|
|
20
|
+
networkAccess?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface AgentDefinition {
|
|
23
|
+
readonly host?: BuiltinAgentHost;
|
|
24
|
+
readonly adapter?: string;
|
|
25
|
+
readonly options: Readonly<AgentOptions & Record<string, unknown>>;
|
|
26
|
+
}
|
|
27
|
+
export interface AgentCapabilities {
|
|
28
|
+
conversation: "native" | "reconstructed";
|
|
29
|
+
toolCalls?: boolean;
|
|
30
|
+
commandExitCodes?: boolean;
|
|
31
|
+
fileReads?: boolean;
|
|
32
|
+
tokenUsage?: boolean;
|
|
33
|
+
readOnly?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type AgentEvent = {
|
|
36
|
+
type: "text";
|
|
37
|
+
text: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: "tool";
|
|
40
|
+
name: string;
|
|
41
|
+
args?: Record<string, unknown>;
|
|
42
|
+
result?: string;
|
|
43
|
+
exitCode?: number;
|
|
44
|
+
succeeded?: boolean;
|
|
45
|
+
} | {
|
|
46
|
+
type: "usage";
|
|
47
|
+
usage: AgentUsage;
|
|
48
|
+
} | {
|
|
49
|
+
type: "trace";
|
|
50
|
+
trace: AgentTrace;
|
|
51
|
+
};
|
|
52
|
+
export interface AdapterSession {
|
|
53
|
+
run(prompt: string): AsyncIterable<AgentEvent>;
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export interface AgentAdapter<T = Record<string, unknown>> {
|
|
57
|
+
name: string;
|
|
58
|
+
capabilities: AgentCapabilities;
|
|
59
|
+
createSession(input: {
|
|
60
|
+
options: T;
|
|
61
|
+
workspace: {
|
|
62
|
+
path: string;
|
|
63
|
+
};
|
|
64
|
+
signal: AbortSignal;
|
|
65
|
+
readOnly: boolean;
|
|
66
|
+
}): Promise<AdapterSession>;
|
|
67
|
+
}
|
|
68
|
+
/** Run the OpenAI Codex coding agent. Does not start a session. */
|
|
69
|
+
export declare const openai: (options?: AgentOptions) => AgentDefinition;
|
|
70
|
+
export declare const claude: (options?: AgentOptions) => AgentDefinition;
|
|
71
|
+
export declare const cursor: (options?: AgentOptions) => AgentDefinition;
|
|
72
|
+
export declare function customAgent<T extends Record<string, unknown>>(input: {
|
|
73
|
+
adapter: string;
|
|
74
|
+
options: T & AgentOptions;
|
|
75
|
+
}): AgentDefinition;
|
|
76
|
+
export declare function defineAgent<T>(adapter: AgentAdapter<T>): AgentAdapter<T>;
|
|
77
|
+
//# sourceMappingURL=agent-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-definition.d.ts","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
function freeze(value) {
|
|
2
|
+
if (value && typeof value === "object") {
|
|
3
|
+
for (const child of Object.values(value))
|
|
4
|
+
freeze(child);
|
|
5
|
+
Object.freeze(value);
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function definition(value) {
|
|
10
|
+
if (Object.hasOwn(value.options, "allowUserSkills"))
|
|
11
|
+
throw new Error("allowUserSkills was renamed to includeGlobalSkills");
|
|
12
|
+
const copy = JSON.parse(JSON.stringify({
|
|
13
|
+
...value,
|
|
14
|
+
options: {
|
|
15
|
+
...value.options,
|
|
16
|
+
includeGlobalSkills: value.options.includeGlobalSkills ?? false,
|
|
17
|
+
},
|
|
18
|
+
}, (_key, item) => {
|
|
19
|
+
if (typeof item === "function" || typeof item === "symbol" || typeof item === "bigint")
|
|
20
|
+
throw new Error("Agent definitions must contain serializable configuration only");
|
|
21
|
+
return item;
|
|
22
|
+
}));
|
|
23
|
+
if (value.options.auth?.type === "api-key" && !value.options.auth.env.trim()) {
|
|
24
|
+
throw new Error("API-key authentication requires an environment variable name");
|
|
25
|
+
}
|
|
26
|
+
return freeze(copy);
|
|
27
|
+
}
|
|
28
|
+
function builtin(host, options = {}) {
|
|
29
|
+
if (options.networkAccess && host !== "openai")
|
|
30
|
+
throw new Error(`networkAccess is not supported by ${host}`);
|
|
31
|
+
return definition({
|
|
32
|
+
host,
|
|
33
|
+
options: { auth: { type: "subscription" }, ...options },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Run the OpenAI Codex coding agent. Does not start a session. */
|
|
37
|
+
export const openai = (options) => builtin("openai", options);
|
|
38
|
+
export const claude = (options) => builtin("claude", options);
|
|
39
|
+
export const cursor = (options) => builtin("cursor", options);
|
|
40
|
+
export function customAgent(input) {
|
|
41
|
+
return definition(input);
|
|
42
|
+
}
|
|
43
|
+
export function defineAgent(adapter) {
|
|
44
|
+
return adapter;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=agent-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-definition.js","sourceRoot":"","sources":["../src/agent-definition.ts"],"names":[],"mappings":"AAwDA,SAAS,MAAM,CAAI,KAAQ;IAC1B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AACD,SAAS,UAAU,CAAC,KAAsB;IACzC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACtB,IAAI,CAAC,SAAS,CACb;QACC,GAAG,KAAK;QACR,OAAO,EAAE;YACR,GAAG,KAAK,CAAC,OAAO;YAChB,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,mBAAmB,IAAI,KAAK;SAC/D;KACD,EACD,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ;YACrF,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACb,CAAC,CACD,CACkB,CAAC;IACrB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AACD,SAAS,OAAO,CAAC,IAAsB,EAAE,OAAO,GAAiB,EAAE;IAClE,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,KAAK,QAAQ;QAC7C,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC;QACjB,IAAI;QACJ,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,GAAG,OAAO,EAAE;KACvD,CAAC,CAAC;AACJ,CAAC;AACD,mEAAmE;AACnE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAmB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAmB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAmB,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9F,MAAM,UAAU,WAAW,CAAoC,KAG9D;IACA,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AACD,MAAM,UAAU,WAAW,CAAI,OAAwB;IACtD,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentCapabilities, AgentDefinition, AgentEvent } from "./agent-definition.js";
|
|
2
|
+
import type { AgentTrace } from "./types.js";
|
|
3
|
+
export interface HarnessSession {
|
|
4
|
+
capabilities: AgentCapabilities;
|
|
5
|
+
run(prompt: string, onEvent?: (event: AgentEvent) => void): Promise<AgentTrace>;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
interface SessionInput {
|
|
9
|
+
agent: AgentDefinition;
|
|
10
|
+
workspace: string;
|
|
11
|
+
signal: AbortSignal;
|
|
12
|
+
readOnly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Each session owns a worker and all mutable host state within it. */
|
|
15
|
+
export declare function createAgentSession(input: SessionInput): Promise<HarnessSession>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=agent-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../src/agent-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC9B,YAAY,EAAE,iBAAiB,CAAC;IAChC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AACD,UAAU,YAAY;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA6ID,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAG/E"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { fork } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
class SessionWorker {
|
|
4
|
+
input;
|
|
5
|
+
child = fork(fileURLToPath(new URL("./agent-worker.js", import.meta.url)), [], {
|
|
6
|
+
stdio: ["ignore", "ignore", "pipe", "ipc"],
|
|
7
|
+
detached: process.platform !== "win32",
|
|
8
|
+
execArgv: [],
|
|
9
|
+
env: { ...process.env, AGENT_HARNESS_SESSION_WORKER: "1" },
|
|
10
|
+
});
|
|
11
|
+
exited;
|
|
12
|
+
stderr = "";
|
|
13
|
+
pending;
|
|
14
|
+
listener;
|
|
15
|
+
closed = false;
|
|
16
|
+
busy = false;
|
|
17
|
+
closing;
|
|
18
|
+
constructor(input) {
|
|
19
|
+
this.input = input;
|
|
20
|
+
this.exited = new Promise((resolve) => {
|
|
21
|
+
this.child.once("exit", () => resolve());
|
|
22
|
+
this.child.once("error", () => resolve());
|
|
23
|
+
});
|
|
24
|
+
this.child.stderr?.on("data", (chunk) => {
|
|
25
|
+
this.stderr = (this.stderr + chunk).slice(-8192);
|
|
26
|
+
});
|
|
27
|
+
this.child.on("message", (raw) => this.receive(raw));
|
|
28
|
+
this.child.on("error", (error) => this.fail(error));
|
|
29
|
+
this.child.on("exit", (code, signal) => {
|
|
30
|
+
this.closed = true;
|
|
31
|
+
this.fail(new Error(`Agent worker exited (${signal ?? code}): ${this.stderr}`));
|
|
32
|
+
});
|
|
33
|
+
input.signal.addEventListener("abort", this.abort, { once: true });
|
|
34
|
+
if (input.signal.aborted)
|
|
35
|
+
this.abort();
|
|
36
|
+
}
|
|
37
|
+
fail(error) {
|
|
38
|
+
this.pending?.reject(error);
|
|
39
|
+
this.pending = undefined;
|
|
40
|
+
}
|
|
41
|
+
receive(raw) {
|
|
42
|
+
const message = raw;
|
|
43
|
+
if (message.type === "event") {
|
|
44
|
+
try {
|
|
45
|
+
this.listener?.(message.value);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
this.fail(error);
|
|
49
|
+
this.abort();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (message.type === "error")
|
|
53
|
+
this.fail(new Error(message.error));
|
|
54
|
+
else {
|
|
55
|
+
this.pending?.resolve(message.value);
|
|
56
|
+
this.pending = undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
request(message) {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
if (this.closed) {
|
|
62
|
+
reject(new Error("Agent session is closed"));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.pending = { resolve, reject };
|
|
66
|
+
this.child.send(message, (error) => {
|
|
67
|
+
if (error)
|
|
68
|
+
this.fail(error);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
kill = () => {
|
|
73
|
+
if (!this.child.pid)
|
|
74
|
+
return;
|
|
75
|
+
try {
|
|
76
|
+
if (process.platform === "win32")
|
|
77
|
+
this.child.kill("SIGKILL");
|
|
78
|
+
else
|
|
79
|
+
process.kill(-this.child.pid, "SIGKILL");
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
/* Already exited. */
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
abort = () => {
|
|
86
|
+
this.closed = true;
|
|
87
|
+
this.fail(new Error("Agent session cancelled"));
|
|
88
|
+
try {
|
|
89
|
+
if (this.child.pid && process.platform !== "win32")
|
|
90
|
+
process.kill(-this.child.pid, "SIGTERM");
|
|
91
|
+
else
|
|
92
|
+
this.child.kill("SIGTERM");
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* Already exited. */
|
|
96
|
+
}
|
|
97
|
+
setTimeout(this.kill, 500).unref();
|
|
98
|
+
};
|
|
99
|
+
async initialize() {
|
|
100
|
+
try {
|
|
101
|
+
const { agent, workspace, readOnly } = this.input;
|
|
102
|
+
const capabilities = (await this.request({
|
|
103
|
+
type: "init",
|
|
104
|
+
value: { agent, workspace, readOnly: readOnly === true },
|
|
105
|
+
}));
|
|
106
|
+
return {
|
|
107
|
+
capabilities,
|
|
108
|
+
run: (prompt, onEvent) => this.run(prompt, onEvent),
|
|
109
|
+
close: () => this.close(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.input.signal.removeEventListener("abort", this.abort);
|
|
114
|
+
this.kill();
|
|
115
|
+
await this.exited;
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async run(prompt, onEvent) {
|
|
120
|
+
this.input.signal.throwIfAborted();
|
|
121
|
+
if (this.busy)
|
|
122
|
+
throw new Error("Overlapping runs on one session are not supported; use variants");
|
|
123
|
+
this.busy = true;
|
|
124
|
+
this.listener = onEvent;
|
|
125
|
+
try {
|
|
126
|
+
return (await this.request({ type: "run", value: prompt }));
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
this.busy = false;
|
|
130
|
+
this.listener = undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
close() {
|
|
134
|
+
this.closing ??= this.dispose();
|
|
135
|
+
return this.closing;
|
|
136
|
+
}
|
|
137
|
+
async dispose() {
|
|
138
|
+
this.input.signal.removeEventListener("abort", this.abort);
|
|
139
|
+
if (this.closed) {
|
|
140
|
+
await this.exited;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (this.busy) {
|
|
144
|
+
this.abort();
|
|
145
|
+
await this.exited;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const timer = setTimeout(this.kill, 2000);
|
|
149
|
+
try {
|
|
150
|
+
await this.request({ type: "close" });
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
this.kill();
|
|
155
|
+
this.closed = true;
|
|
156
|
+
await this.exited;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Each session owns a worker and all mutable host state within it. */
|
|
161
|
+
export function createAgentSession(input) {
|
|
162
|
+
input.signal.throwIfAborted();
|
|
163
|
+
return new SessionWorker(input).initialize();
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=agent-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../src/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-worker.d.ts","sourceRoot":"","sources":["../src/agent-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { pathToFileURL } from "node:url";
|
|
2
|
+
import { cancelActiveClaudeRun, runClaudeAgent } from "./claude-run.js";
|
|
3
|
+
import { cancelActiveCursorRun, runCursorAgent } from "./cursor-run.js";
|
|
4
|
+
import { cancelActiveOpenaiRun, runOpenaiAgent } from "./openai-run.js";
|
|
5
|
+
let session;
|
|
6
|
+
const signal = new AbortController();
|
|
7
|
+
const send = (type, value) => process.send?.({ type, value });
|
|
8
|
+
function empty() {
|
|
9
|
+
return { messages: [], toolCalls: [], shellCommands: [], artifacts: {} };
|
|
10
|
+
}
|
|
11
|
+
async function initialize(input) {
|
|
12
|
+
const { agent, readOnly } = input;
|
|
13
|
+
if (agent.adapter)
|
|
14
|
+
return initializeCustom(input, agent.adapter);
|
|
15
|
+
if (readOnly && agent.host === "cursor")
|
|
16
|
+
throw new Error("Cursor adapter does not yet provide enforced read-only judging; use openai or claude as the judge");
|
|
17
|
+
session = builtinSession(input);
|
|
18
|
+
return {
|
|
19
|
+
conversation: "reconstructed",
|
|
20
|
+
toolCalls: true,
|
|
21
|
+
commandExitCodes: true,
|
|
22
|
+
fileReads: true,
|
|
23
|
+
tokenUsage: true,
|
|
24
|
+
readOnly: agent.host !== "cursor",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function initializeCustom(input, adapterPath) {
|
|
28
|
+
const { agent, workspace, readOnly } = input;
|
|
29
|
+
const url = adapterPath.startsWith("file:") ? adapterPath : pathToFileURL(adapterPath).href;
|
|
30
|
+
const adapter = (await import(url)).default;
|
|
31
|
+
if (!adapter?.createSession || !adapter.capabilities)
|
|
32
|
+
throw new Error("Custom adapter must export defineAgent(...) as default");
|
|
33
|
+
if (readOnly && !adapter.capabilities.readOnly)
|
|
34
|
+
throw new Error("Judge requires an adapter with readOnly capability");
|
|
35
|
+
session = await adapter.createSession({
|
|
36
|
+
options: agent.options,
|
|
37
|
+
workspace: { path: workspace },
|
|
38
|
+
signal: signal.signal,
|
|
39
|
+
readOnly,
|
|
40
|
+
});
|
|
41
|
+
return adapter.capabilities;
|
|
42
|
+
}
|
|
43
|
+
function builtinOptions(input, prompt) {
|
|
44
|
+
const { agent, workspace, readOnly } = input;
|
|
45
|
+
const auth = agent.options.auth ?? { type: "subscription" };
|
|
46
|
+
const apiKey = auth.type === "api-key" ? process.env[auth.env] : undefined;
|
|
47
|
+
if (auth.type === "api-key" && !apiKey)
|
|
48
|
+
throw new Error(`Missing API key in ${auth.env}`);
|
|
49
|
+
return {
|
|
50
|
+
cwd: workspace,
|
|
51
|
+
prompt,
|
|
52
|
+
apiKey,
|
|
53
|
+
authMode: auth.type,
|
|
54
|
+
includeGlobalSkills: agent.options.includeGlobalSkills === true,
|
|
55
|
+
mcpServers: readOnly ? undefined : agent.options.mcpServers,
|
|
56
|
+
failOnUserInput: true,
|
|
57
|
+
onAgentEvent: (event) => send("event", event),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function runBuiltin(input, prompt) {
|
|
61
|
+
const common = builtinOptions(input, prompt);
|
|
62
|
+
const { agent, readOnly } = input;
|
|
63
|
+
if (agent.host === "openai")
|
|
64
|
+
return runOpenaiAgent({
|
|
65
|
+
...common,
|
|
66
|
+
model: agent.options.model,
|
|
67
|
+
sandbox: readOnly ? "read-only" : "workspace-write",
|
|
68
|
+
networkAccess: agent.options.networkAccess,
|
|
69
|
+
});
|
|
70
|
+
if (agent.host === "claude")
|
|
71
|
+
return runClaudeAgent({
|
|
72
|
+
...common,
|
|
73
|
+
model: agent.options.model,
|
|
74
|
+
loadProjectContext: true,
|
|
75
|
+
readOnly,
|
|
76
|
+
});
|
|
77
|
+
return runCursorAgent({
|
|
78
|
+
...common,
|
|
79
|
+
model: agent.options.model ? { id: agent.options.model } : undefined,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function builtinSession(input) {
|
|
83
|
+
const history = [];
|
|
84
|
+
return {
|
|
85
|
+
async *run(prompt) {
|
|
86
|
+
const submitted = history.length
|
|
87
|
+
? `Previous conversation (context only):\n${history.join("\n\n")}\n\nCurrent user request:\n${prompt}`
|
|
88
|
+
: prompt;
|
|
89
|
+
const result = await runBuiltin(input, submitted);
|
|
90
|
+
if (result.status !== "completed") {
|
|
91
|
+
send("event", { type: "trace", trace: result.trace });
|
|
92
|
+
throw new Error(`Agent execution failed: ${JSON.stringify(result.trace.artifacts)}`);
|
|
93
|
+
}
|
|
94
|
+
const answer = result.trace.messages
|
|
95
|
+
.filter((message) => message.role === "assistant")
|
|
96
|
+
.map((message) => message.content)
|
|
97
|
+
.join("\n");
|
|
98
|
+
history.push(`User: ${prompt}`, `Assistant: ${answer}`);
|
|
99
|
+
yield { type: "trace", trace: result.trace };
|
|
100
|
+
},
|
|
101
|
+
async close() { },
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function recordEvent(trace, event) {
|
|
105
|
+
switch (event.type) {
|
|
106
|
+
case "trace":
|
|
107
|
+
return event.trace;
|
|
108
|
+
case "text":
|
|
109
|
+
trace.messages.push({ role: "assistant", content: event.text });
|
|
110
|
+
break;
|
|
111
|
+
case "tool":
|
|
112
|
+
trace.toolCalls.push({
|
|
113
|
+
name: event.name,
|
|
114
|
+
args: event.args,
|
|
115
|
+
result: event.result,
|
|
116
|
+
exitCode: event.exitCode,
|
|
117
|
+
succeeded: event.succeeded,
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
case "usage":
|
|
121
|
+
trace.usage = event.usage;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
return trace;
|
|
125
|
+
}
|
|
126
|
+
async function run(prompt) {
|
|
127
|
+
let trace = empty();
|
|
128
|
+
trace.messages.push({ role: "user", content: prompt });
|
|
129
|
+
for await (const event of session.run(prompt)) {
|
|
130
|
+
send("event", event);
|
|
131
|
+
trace = recordEvent(trace, event);
|
|
132
|
+
}
|
|
133
|
+
send("result", trace);
|
|
134
|
+
}
|
|
135
|
+
process.on("SIGTERM", () => {
|
|
136
|
+
signal.abort();
|
|
137
|
+
cancelActiveClaudeRun();
|
|
138
|
+
cancelActiveCursorRun();
|
|
139
|
+
cancelActiveOpenaiRun();
|
|
140
|
+
});
|
|
141
|
+
process.on("disconnect", () => {
|
|
142
|
+
signal.abort();
|
|
143
|
+
cancelActiveClaudeRun();
|
|
144
|
+
cancelActiveCursorRun();
|
|
145
|
+
cancelActiveOpenaiRun();
|
|
146
|
+
process.exit(1);
|
|
147
|
+
});
|
|
148
|
+
process.on("message", async (raw) => {
|
|
149
|
+
const message = raw;
|
|
150
|
+
try {
|
|
151
|
+
if (message.type === "init")
|
|
152
|
+
send("ready", await initialize(message.value));
|
|
153
|
+
if (message.type === "run")
|
|
154
|
+
await run(message.value);
|
|
155
|
+
if (message.type === "close") {
|
|
156
|
+
await session.close();
|
|
157
|
+
send("closed");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
process.send?.({
|
|
162
|
+
type: "error",
|
|
163
|
+
error: error instanceof Error ? error.message : String(error),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=agent-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-worker.js","sourceRoot":"","sources":["../src/agent-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/capture.d.ts
CHANGED
|
@@ -82,6 +82,7 @@ export interface TraceAccumulator {
|
|
|
82
82
|
usage?: AgentUsage;
|
|
83
83
|
}
|
|
84
84
|
export declare function createTraceAccumulator(): TraceAccumulator;
|
|
85
|
+
export declare function mergeToolCall(previous: AgentToolCall, toolCall: AgentToolCall): AgentToolCall;
|
|
85
86
|
/** Fold one SDK stream event into trace fields without retaining the raw event. */
|
|
86
87
|
export declare function accumulateSdkEvent(acc: TraceAccumulator, event: SdkMessage): void;
|
|
87
88
|
export declare function finalizeTraceAccumulator(acc: TraceAccumulator, options?: {
|