@post-print/agent-harness 1.1.9 → 2.0.1

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.
Files changed (113) hide show
  1. package/README.md +11 -93
  2. package/dist/agent-definition.d.ts +77 -0
  3. package/dist/agent-definition.d.ts.map +1 -0
  4. package/dist/agent-definition.js +46 -0
  5. package/dist/agent-definition.js.map +1 -0
  6. package/dist/agent-session.d.ts +17 -0
  7. package/dist/agent-session.d.ts.map +1 -0
  8. package/dist/agent-session.js +165 -0
  9. package/dist/agent-session.js.map +1 -0
  10. package/dist/agent-worker.d.ts +2 -0
  11. package/dist/agent-worker.d.ts.map +1 -0
  12. package/dist/agent-worker.js +167 -0
  13. package/dist/agent-worker.js.map +1 -0
  14. package/dist/capture.d.ts +1 -0
  15. package/dist/capture.d.ts.map +1 -1
  16. package/dist/capture.js +119 -101
  17. package/dist/capture.js.map +1 -1
  18. package/dist/claude-capture.d.ts +0 -1
  19. package/dist/claude-capture.d.ts.map +1 -1
  20. package/dist/claude-capture.js +96 -106
  21. package/dist/claude-capture.js.map +1 -1
  22. package/dist/claude-run.d.ts +3 -11
  23. package/dist/claude-run.d.ts.map +1 -1
  24. package/dist/claude-run.js +178 -166
  25. package/dist/claude-run.js.map +1 -1
  26. package/dist/cursor-auth.d.ts +0 -1
  27. package/dist/cursor-auth.d.ts.map +1 -1
  28. package/dist/cursor-auth.js +5 -3
  29. package/dist/cursor-auth.js.map +1 -1
  30. package/dist/cursor-run.d.ts +6 -34
  31. package/dist/cursor-run.d.ts.map +1 -1
  32. package/dist/cursor-run.js +123 -175
  33. package/dist/cursor-run.js.map +1 -1
  34. package/dist/index.d.ts +8 -40
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +6 -47
  37. package/dist/index.js.map +1 -1
  38. package/dist/mcp.d.ts.map +1 -1
  39. package/dist/mcp.js +37 -39
  40. package/dist/mcp.js.map +1 -1
  41. package/dist/openai-capture.d.ts.map +1 -1
  42. package/dist/openai-capture.js +66 -57
  43. package/dist/openai-capture.js.map +1 -1
  44. package/dist/openai-run.d.ts +4 -13
  45. package/dist/openai-run.d.ts.map +1 -1
  46. package/dist/openai-run.js +168 -159
  47. package/dist/openai-run.js.map +1 -1
  48. package/dist/sealed-workspace.d.ts +0 -8
  49. package/dist/sealed-workspace.d.ts.map +1 -1
  50. package/dist/sealed-workspace.js +32 -65
  51. package/dist/sealed-workspace.js.map +1 -1
  52. package/dist/skills-context.d.ts +0 -24
  53. package/dist/skills-context.d.ts.map +1 -1
  54. package/dist/skills-context.js +12 -156
  55. package/dist/skills-context.js.map +1 -1
  56. package/dist/types.d.ts +0 -84
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/user-skills.d.ts +6 -6
  59. package/dist/user-skills.d.ts.map +1 -1
  60. package/dist/user-skills.js +32 -27
  61. package/dist/user-skills.js.map +1 -1
  62. package/dist/working-tree-guard.d.ts.map +1 -1
  63. package/dist/working-tree-guard.js +3 -1
  64. package/dist/working-tree-guard.js.map +1 -1
  65. package/package.json +3 -3
  66. package/dist/adapters/index.d.ts +0 -28
  67. package/dist/adapters/index.d.ts.map +0 -1
  68. package/dist/adapters/index.js +0 -271
  69. package/dist/adapters/index.js.map +0 -1
  70. package/dist/classifier.d.ts +0 -15
  71. package/dist/classifier.d.ts.map +0 -1
  72. package/dist/classifier.js +0 -102
  73. package/dist/classifier.js.map +0 -1
  74. package/dist/context.d.ts +0 -26
  75. package/dist/context.d.ts.map +0 -1
  76. package/dist/context.js +0 -227
  77. package/dist/context.js.map +0 -1
  78. package/dist/conversation.d.ts +0 -28
  79. package/dist/conversation.d.ts.map +0 -1
  80. package/dist/conversation.js +0 -191
  81. package/dist/conversation.js.map +0 -1
  82. package/dist/host-registry.d.ts +0 -11
  83. package/dist/host-registry.d.ts.map +0 -1
  84. package/dist/host-registry.js +0 -36
  85. package/dist/host-registry.js.map +0 -1
  86. package/dist/judge.d.ts +0 -132
  87. package/dist/judge.d.ts.map +0 -1
  88. package/dist/judge.js +0 -795
  89. package/dist/judge.js.map +0 -1
  90. package/dist/logger.d.ts +0 -11
  91. package/dist/logger.d.ts.map +0 -1
  92. package/dist/logger.js +0 -20
  93. package/dist/logger.js.map +0 -1
  94. package/dist/main.d.ts +0 -9
  95. package/dist/main.d.ts.map +0 -1
  96. package/dist/main.js +0 -7
  97. package/dist/main.js.map +0 -1
  98. package/dist/retry.d.ts +0 -14
  99. package/dist/retry.d.ts.map +0 -1
  100. package/dist/retry.js +0 -52
  101. package/dist/retry.js.map +0 -1
  102. package/dist/user-simulator.d.ts +0 -10
  103. package/dist/user-simulator.d.ts.map +0 -1
  104. package/dist/user-simulator.js +0 -47
  105. package/dist/user-simulator.js.map +0 -1
  106. package/dist/worktree-leak.d.ts +0 -16
  107. package/dist/worktree-leak.d.ts.map +0 -1
  108. package/dist/worktree-leak.js +0 -110
  109. package/dist/worktree-leak.js.map +0 -1
  110. package/dist/worktree.d.ts +0 -10
  111. package/dist/worktree.d.ts.map +0 -1
  112. package/dist/worktree.js +0 -58
  113. package/dist/worktree.js.map +0 -1
package/dist/context.js DELETED
@@ -1,227 +0,0 @@
1
- import { access, readdir, readFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { loadSkillContext, normalizeSkillContext, } from "./skills-context.js";
4
- const SHARED_SOURCES = [
5
- "AGENTS.md",
6
- ".agents/skills/README.md",
7
- ".cursor/skills/README.md",
8
- ".codex/skills/README.md",
9
- ".claude/skills/README.md",
10
- ];
11
- const CLAUDE_SOURCES = ["CLAUDE.md", "AGENTS.md"];
12
- const SKELETON_REGISTRY = ".skeleton/registry.md";
13
- const SKELETON_TOML = "skeleton.toml";
14
- const SKELETON_CONFIG = ".skeleton/config.yaml";
15
- const SKELETON_CUSTOMIZE_DIR = ".skeleton/customize";
16
- const CURSOR_RULES_DIR = ".cursor/rules";
17
- /** Max chars of skeleton.toml or config.yaml kept in the preamble. */
18
- const SKELETON_CONFIG_SUMMARY_MAX_CHARS = 2_500;
19
- async function fileExists(path) {
20
- try {
21
- await access(path);
22
- return true;
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- async function readIfExists(cwd, rel) {
29
- const path = join(cwd, rel);
30
- if (!(await fileExists(path))) {
31
- return null;
32
- }
33
- return readFile(path, "utf8");
34
- }
35
- async function loadCursorRules(cwd) {
36
- const rulesDir = join(cwd, CURSOR_RULES_DIR);
37
- if (!(await fileExists(rulesDir))) {
38
- return [];
39
- }
40
- const entries = (await readdir(rulesDir)).filter((name) => name.endsWith(".mdc")).sort();
41
- const loaded = [];
42
- for (const name of entries) {
43
- const rel = `${CURSOR_RULES_DIR}/${name}`;
44
- const text = await readIfExists(cwd, rel);
45
- if (text !== null) {
46
- loaded.push({ rel, text });
47
- }
48
- }
49
- return loaded;
50
- }
51
- function sourcesForProfile(profile) {
52
- switch (profile) {
53
- case "claude":
54
- return [...SHARED_SOURCES, ...CLAUDE_SOURCES];
55
- case "skeleton":
56
- return [...SHARED_SOURCES, SKELETON_REGISTRY];
57
- default:
58
- return SHARED_SOURCES;
59
- }
60
- }
61
- /**
62
- * Lightweight parse of `customize.alwaysInclude` from `.skeleton/config.yaml`
63
- * without a YAML dependency. Paths are basenames under `.skeleton/customize/`.
64
- */
65
- export function parseSkeletonAlwaysInclude(configText) {
66
- const lines = configText.split(/\r?\n/);
67
- let inCustomize = false;
68
- let inAlwaysInclude = false;
69
- const items = [];
70
- for (const line of lines) {
71
- if (/^\s*#/.test(line) || line.trim() === "") {
72
- continue;
73
- }
74
- const indent = line.match(/^(\s*)/)?.[1]?.length ?? 0;
75
- const trimmed = line.trim();
76
- if (indent === 0) {
77
- inCustomize = /^customize\s*:/.test(trimmed);
78
- inAlwaysInclude = false;
79
- continue;
80
- }
81
- if (!inCustomize) {
82
- continue;
83
- }
84
- if (indent <= 2 && /^alwaysInclude\s*:/.test(trimmed)) {
85
- inAlwaysInclude = true;
86
- continue;
87
- }
88
- if (indent <= 2 && !trimmed.startsWith("-")) {
89
- inAlwaysInclude = false;
90
- continue;
91
- }
92
- if (inAlwaysInclude && trimmed.startsWith("-")) {
93
- const value = trimmed
94
- .replace(/^-\s*/, "")
95
- .replace(/^["']|["']$/g, "")
96
- .trim();
97
- if (value.length > 0) {
98
- items.push(value);
99
- }
100
- }
101
- }
102
- return items;
103
- }
104
- /** Compact config summary for preamble — skips deep plugin trees / long lists. */
105
- export function summarizeSkeletonConfig(configText) {
106
- const kept = [];
107
- let chars = 0;
108
- for (const line of configText.split(/\r?\n/)) {
109
- const trimmed = line.trim();
110
- if (trimmed.startsWith("#") && !trimmed.startsWith("# yaml-language-server")) {
111
- continue;
112
- }
113
- // Drop plugins / large nested blobs that are not useful as ambient context.
114
- if (/^\s*plugins\s*:/.test(line) || /^\s*-\s+\.skeleton\/plugins\//.test(line)) {
115
- continue;
116
- }
117
- const next = kept.length === 0 ? line : `${kept.join("\n")}\n${line}`;
118
- if (next.length > SKELETON_CONFIG_SUMMARY_MAX_CHARS) {
119
- kept.push("… (truncated)");
120
- break;
121
- }
122
- kept.push(line);
123
- chars = next.length;
124
- void chars;
125
- }
126
- return kept.join("\n").trim();
127
- }
128
- function resolveContextSourcePath(rel) {
129
- const normalized = rel.replace(/^\.\//, "");
130
- if (normalized.startsWith(".skeleton/") ||
131
- normalized.startsWith("AGENTS.md") ||
132
- normalized.includes("/")) {
133
- return normalized;
134
- }
135
- return `${SKELETON_CUSTOMIZE_DIR}/${normalized}`;
136
- }
137
- /** Load canonical agent context files from the repo. */
138
- export async function loadContext(options) {
139
- const mode = options.mode ?? "harness-preamble";
140
- const profile = options.profile ?? "shared";
141
- if (mode === "host-native") {
142
- const contextSources = (options.contextSources ?? []).filter((source) => typeof source === "string" && source.trim().length > 0);
143
- if (contextSources.length > 0) {
144
- throw new Error("host-native context mode does not allow contextSources prompt injection");
145
- }
146
- if (normalizeSkillContext(options.skills).mode !== "none") {
147
- throw new Error("host-native context mode does not allow a synthetic skills catalog");
148
- }
149
- return {
150
- mode,
151
- profile,
152
- cwd: options.cwd,
153
- sources: [],
154
- preamble: "",
155
- skillsMode: "none",
156
- };
157
- }
158
- const seen = new Set();
159
- const parts = [];
160
- const loaded = [];
161
- const pushSource = async (rel, textOverride) => {
162
- if (seen.has(rel)) {
163
- return;
164
- }
165
- const text = textOverride ?? (await readIfExists(options.cwd, rel));
166
- if (text === null) {
167
- return;
168
- }
169
- seen.add(rel);
170
- loaded.push(rel);
171
- parts.push(`<!-- ${rel} -->\n${text}`);
172
- };
173
- for (const rel of sourcesForProfile(profile)) {
174
- await pushSource(rel);
175
- }
176
- if (profile === "cursor") {
177
- for (const rule of await loadCursorRules(options.cwd)) {
178
- await pushSource(rule.rel, rule.text);
179
- }
180
- }
181
- if (profile === "skeleton") {
182
- const tomlText = await readIfExists(options.cwd, SKELETON_TOML);
183
- if (tomlText !== null) {
184
- const summary = summarizeSkeletonConfig(tomlText);
185
- await pushSource(SKELETON_TOML, summary.length > 0 ? summary : tomlText);
186
- }
187
- else {
188
- const configText = await readIfExists(options.cwd, SKELETON_CONFIG);
189
- if (configText !== null) {
190
- const summary = summarizeSkeletonConfig(configText);
191
- await pushSource(SKELETON_CONFIG, summary.length > 0 ? summary : configText);
192
- for (const basename of parseSkeletonAlwaysInclude(configText)) {
193
- await pushSource(resolveContextSourcePath(basename));
194
- }
195
- }
196
- }
197
- }
198
- for (const raw of options.contextSources ?? []) {
199
- if (typeof raw !== "string" || raw.trim().length === 0) {
200
- continue;
201
- }
202
- const rel = raw.trim().replace(/^\.\//, "").replace(/\\/g, "/");
203
- if (rel.length === 0) {
204
- continue;
205
- }
206
- await pushSource(rel);
207
- }
208
- const skillContext = await loadSkillContext(options.cwd, options.skills);
209
- if (skillContext.preamble) {
210
- for (const rel of skillContext.sources) {
211
- if (!seen.has(rel)) {
212
- seen.add(rel);
213
- loaded.push(rel);
214
- }
215
- }
216
- parts.push(skillContext.preamble);
217
- }
218
- return {
219
- mode,
220
- profile,
221
- cwd: options.cwd,
222
- sources: loaded,
223
- preamble: parts.join("\n\n---\n\n"),
224
- skillsMode: skillContext.mode,
225
- };
226
- }
227
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import type { AgentSession, AgentTrace } from "./types.js";
2
- export interface UserQuestion {
3
- toolName: string;
4
- prompt: string;
5
- options?: string[];
6
- }
7
- export interface UserSimulator {
8
- reply(input: {
9
- questions: UserQuestion[];
10
- trace: AgentTrace;
11
- turn: number;
12
- }): Promise<string>;
13
- }
14
- export interface RunConversationOptions {
15
- initialPrompt: string;
16
- runTurn: (prompt: string, turn: number) => Promise<AgentSession>;
17
- userSimulator: UserSimulator;
18
- maxTurns?: number;
19
- }
20
- /** Pull AskQuestion-style prompts from a live trace. */
21
- export declare function extractUserQuestions(trace: AgentTrace): UserQuestion[];
22
- /** Append a user reply and the next agent turn onto the conversation trace. */
23
- export declare function mergeConversationTraces(prior: AgentTrace, userReply: string, next: AgentTrace): AgentTrace;
24
- /** Rebuild a follow-up turn so a new host process still sees the conversation. */
25
- export declare function composeFollowUpPrompt(initialPrompt: string, prior: AgentTrace, userReply: string): string;
26
- /** Drive a test agent and a user simulator until the agent finishes or hits maxTurns. */
27
- export declare function runConversation(options: RunConversationOptions): Promise<AgentSession>;
28
- //# sourceMappingURL=conversation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9F;AAED,MAAM,WAAW,sBAAsB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACjE,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAkED,wDAAwD;AACxD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAStE;AAQD,+EAA+E;AAC/E,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,UAAU,GACd,UAAU,CAwBZ;AAYD,kFAAkF;AAClF,wBAAgB,qBAAqB,CACpC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,GACf,MAAM,CAWR;AAED,yFAAyF;AACzF,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6E5F"}
@@ -1,191 +0,0 @@
1
- import { enrichTrace, mergeAgentUsage } from "./capture.js";
2
- import { formatTraceForJudge } from "./judge.js";
3
- import { isUserInputTool } from "./run-guards.js";
4
- const DEFAULT_MAX_TURNS = 6;
5
- function questionText(value) {
6
- if (typeof value === "string" && value.trim()) {
7
- return value.trim();
8
- }
9
- if (!value || typeof value !== "object" || Array.isArray(value)) {
10
- return undefined;
11
- }
12
- const record = value;
13
- for (const key of ["prompt", "question", "text", "message", "title"]) {
14
- const text = questionText(record[key]);
15
- if (text) {
16
- return text;
17
- }
18
- }
19
- return undefined;
20
- }
21
- function optionLabels(value) {
22
- if (!Array.isArray(value)) {
23
- return undefined;
24
- }
25
- const labels = value
26
- .map((item) => {
27
- if (typeof item === "string") {
28
- return item;
29
- }
30
- if (item && typeof item === "object" && "label" in item) {
31
- const label = item.label;
32
- return typeof label === "string" ? label : undefined;
33
- }
34
- return undefined;
35
- })
36
- .filter((item) => Boolean(item));
37
- return labels.length > 0 ? labels : undefined;
38
- }
39
- function questionsFromArgs(toolName, args) {
40
- if (!args) {
41
- return [{ toolName, prompt: "(agent asked a question with empty args)" }];
42
- }
43
- const nested = args.questions;
44
- if (Array.isArray(nested) && nested.length > 0) {
45
- return nested.map((item) => ({
46
- toolName,
47
- prompt: questionText(item) ?? "(untitled question)",
48
- options: optionLabels(item && typeof item === "object" ? item.options : undefined),
49
- }));
50
- }
51
- return [
52
- {
53
- toolName,
54
- prompt: questionText(args) ?? JSON.stringify(args),
55
- options: optionLabels(args.options),
56
- },
57
- ];
58
- }
59
- /** Pull AskQuestion-style prompts from a live trace. */
60
- export function extractUserQuestions(trace) {
61
- const questions = [];
62
- for (const call of trace.toolCalls) {
63
- if (!isUserInputTool(call.name)) {
64
- continue;
65
- }
66
- questions.push(...questionsFromArgs(call.name, call.args));
67
- }
68
- return questions;
69
- }
70
- function nextSeq(trace) {
71
- const messageSeq = trace.messages.map((m) => m.seq ?? 0);
72
- const toolSeq = trace.toolCalls.map((call) => call.seq ?? 0);
73
- return Math.max(0, ...messageSeq, ...toolSeq) + 1;
74
- }
75
- /** Append a user reply and the next agent turn onto the conversation trace. */
76
- export function mergeConversationTraces(prior, userReply, next) {
77
- const seq = nextSeq(prior);
78
- const userMessage = { role: "user", content: userReply, seq };
79
- const offset = seq + 1;
80
- const shiftedMessages = next.messages.map((message) => ({
81
- ...message,
82
- seq: (message.seq ?? 0) + offset,
83
- }));
84
- const shiftedTools = next.toolCalls.map((call) => ({
85
- ...call,
86
- seq: (call.seq ?? 0) + offset,
87
- }));
88
- return enrichTrace({
89
- messages: [...prior.messages, userMessage, ...shiftedMessages],
90
- toolCalls: [...prior.toolCalls, ...shiftedTools],
91
- shellCommands: [...new Set([...prior.shellCommands, ...next.shellCommands])],
92
- skillsInvoked: [...new Set([...(prior.skillsInvoked ?? []), ...(next.skillsInvoked ?? [])])],
93
- gitDiff: next.gitDiff ?? prior.gitDiff,
94
- prBody: next.prBody ?? prior.prBody,
95
- artifacts: { ...prior.artifacts, ...next.artifacts },
96
- routing: next.routing ?? prior.routing,
97
- assistantTextBeforeTools: prior.assistantTextBeforeTools,
98
- usage: mergeAgentUsage(prior.usage, next.usage),
99
- });
100
- }
101
- function withConversationMeta(trace, turns) {
102
- return {
103
- ...trace,
104
- artifacts: {
105
- ...trace.artifacts,
106
- conversationTurns: String(turns),
107
- },
108
- };
109
- }
110
- /** Rebuild a follow-up turn so a new host process still sees the conversation. */
111
- export function composeFollowUpPrompt(initialPrompt, prior, userReply) {
112
- return [
113
- `Original task:\n${initialPrompt}`,
114
- "",
115
- "Conversation so far:",
116
- formatTraceForJudge(prior),
117
- "",
118
- `User reply to your question:\n${userReply}`,
119
- "",
120
- "Continue the task. Do not repeat finished work.",
121
- ].join("\n");
122
- }
123
- /** Drive a test agent and a user simulator until the agent finishes or hits maxTurns. */
124
- export async function runConversation(options) {
125
- const maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;
126
- let turnPrompt = options.initialPrompt;
127
- let lastReply;
128
- let merged;
129
- let lastSession;
130
- let usage;
131
- const started = performance.now();
132
- for (let turn = 1; turn <= maxTurns; turn++) {
133
- const session = await options.runTurn(turnPrompt, turn);
134
- lastSession = session;
135
- usage = mergeAgentUsage(usage, session.usage);
136
- merged =
137
- lastReply === undefined
138
- ? enrichTrace(session.trace)
139
- : mergeConversationTraces(merged ?? session.trace, lastReply, session.trace);
140
- if (session.status !== "completed" && !extractUserQuestions(session.trace).length) {
141
- return {
142
- ...session,
143
- trace: withConversationMeta(merged, turn),
144
- usage,
145
- durationMs: Math.round(performance.now() - started),
146
- };
147
- }
148
- const askedThisTurn = extractUserQuestions(session.trace);
149
- if (askedThisTurn.length === 0) {
150
- return {
151
- ...session,
152
- status: "completed",
153
- trace: withConversationMeta(merged, turn),
154
- usage,
155
- durationMs: Math.round(performance.now() - started),
156
- error: undefined,
157
- };
158
- }
159
- if (turn === maxTurns) {
160
- return {
161
- host: session.host,
162
- status: "failed",
163
- trace: withConversationMeta(merged, turn),
164
- usage,
165
- durationMs: Math.round(performance.now() - started),
166
- error: `agent kept asking questions after maxTurns=${maxTurns}`,
167
- };
168
- }
169
- lastReply = (await options.userSimulator.reply({ questions: askedThisTurn, trace: merged, turn })).trim();
170
- if (!lastReply) {
171
- return {
172
- host: session.host,
173
- status: "failed",
174
- trace: withConversationMeta(merged, turn),
175
- usage,
176
- durationMs: Math.round(performance.now() - started),
177
- error: "user simulator returned an empty reply",
178
- };
179
- }
180
- turnPrompt = composeFollowUpPrompt(options.initialPrompt, merged, lastReply);
181
- }
182
- return {
183
- host: lastSession?.host ?? "cursor",
184
- status: "failed",
185
- trace: withConversationMeta(merged ?? { messages: [], toolCalls: [], shellCommands: [], artifacts: {} }, maxTurns),
186
- usage,
187
- durationMs: Math.round(performance.now() - started),
188
- error: `agent kept asking questions after maxTurns=${maxTurns}`,
189
- };
190
- }
191
- //# sourceMappingURL=conversation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { HostAdapter } from "./types.js";
2
- import { type AgentHost } from "./types.js";
3
- export declare function listRegisteredHosts(): AgentHost[];
4
- export declare function getRegisteredAdapter(host: string): HostAdapter | undefined;
5
- export declare function knownAgentHosts(): AgentHost[];
6
- export declare function isKnownAgentHost(value: string): value is AgentHost;
7
- export declare function clearRegisteredHostAdapters(): void;
8
- export declare function unregisterHostAdapter(host: string): boolean;
9
- /** Register a consumer host adapter. Builtin ids stay reserved. */
10
- export declare function registerHostAdapter(adapter: HostAdapter): void;
11
- //# sourceMappingURL=host-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-registry.d.ts","sourceRoot":"","sources":["../src/host-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAe,KAAK,SAAS,EAAkC,MAAM,YAAY,CAAC;AAMzF,wBAAgB,mBAAmB,IAAI,SAAS,EAAE,CAEjD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE1E;AAED,wBAAgB,eAAe,IAAI,SAAS,EAAE,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAElE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAc9D"}
@@ -1,36 +0,0 @@
1
- import { AGENT_HOSTS, isBuiltinAgentHost, isHostSlug } from "./types.js";
2
- const RESERVED_HOST_IDS = new Set([...AGENT_HOSTS, "replay", "all"]);
3
- const adapters = new Map();
4
- export function listRegisteredHosts() {
5
- return [...adapters.keys()];
6
- }
7
- export function getRegisteredAdapter(host) {
8
- return adapters.get(host);
9
- }
10
- export function knownAgentHosts() {
11
- return [...AGENT_HOSTS, ...listRegisteredHosts()];
12
- }
13
- export function isKnownAgentHost(value) {
14
- return isBuiltinAgentHost(value) || adapters.has(value);
15
- }
16
- export function clearRegisteredHostAdapters() {
17
- adapters.clear();
18
- }
19
- export function unregisterHostAdapter(host) {
20
- return adapters.delete(host);
21
- }
22
- /** Register a consumer host adapter. Builtin ids stay reserved. */
23
- export function registerHostAdapter(adapter) {
24
- const host = adapter.host?.trim() ?? "";
25
- if (!isHostSlug(host)) {
26
- throw new Error(`Host id must be a lowercase slug (a-z, digits, hyphen), got ${JSON.stringify(adapter.host)}`);
27
- }
28
- if (RESERVED_HOST_IDS.has(host)) {
29
- throw new Error(`Host id "${host}" is reserved. Pick a different slug.`);
30
- }
31
- if (adapters.has(host)) {
32
- throw new Error(`Host "${host}" is already registered.`);
33
- }
34
- adapters.set(host, adapter);
35
- }
36
- //# sourceMappingURL=host-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"host-registry.js","sourceRoot":"","sources":["../src/host-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAkB,kBAAkB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAE7E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEhD,MAAM,UAAU,mBAAmB;IAClC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,mBAAmB,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC7C,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IACjD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACd,+DAA+D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;IACH,CAAC;IACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,uCAAuC,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7B,CAAC"}
package/dist/judge.d.ts DELETED
@@ -1,132 +0,0 @@
1
- import type { JudgeClassifierResult } from "./cursor-run.js";
2
- import type { AgentHost, AgentTrace, AgentUsage, JudgeWorkspaceContext } from "./types.js";
3
- export interface JudgeCriterion {
4
- id: string;
5
- question: string;
6
- }
7
- export interface JudgeVerdict {
8
- id: string;
9
- pass: boolean;
10
- rationale: string;
11
- evidence?: string[];
12
- /** Exact classifier input retained for report inspection. */
13
- prompt?: string;
14
- /** Exact classifier output retained for report inspection. */
15
- response?: string;
16
- /** Present when the judge SDK run failed (distinct from a criterion miss). */
17
- infraError?: string;
18
- /** Present when the judge returned an unparseable contract (distinct from infra). */
19
- parseError?: string;
20
- /** Unnormalized SDK status when the judge run did not finish. */
21
- rawSdkStatus?: string;
22
- sdkError?: {
23
- message?: string;
24
- code?: string;
25
- };
26
- /** Attempt number (1 until retries land). */
27
- attempt?: number;
28
- /** Wall time for this judge criterion call (ms). */
29
- durationMs?: number;
30
- /** Token usage for this judge criterion call when reported. */
31
- usage?: AgentUsage;
32
- transcriptChars?: number;
33
- promptChars?: number;
34
- /** Named workspaces made available as read-only judge evidence. */
35
- workspaceEvidence?: string[];
36
- }
37
- export interface JudgeTraceOptions {
38
- cwd: string;
39
- /** Named, read-only workspaces available to the classifier. */
40
- workspaces?: readonly JudgeWorkspaceContext[];
41
- apiKey?: string;
42
- /** Host that scores the transcript. Defaults to cursor. */
43
- host?: AgentHost;
44
- /** Injected classifier for tests. */
45
- classify?: (options: {
46
- host: AgentHost;
47
- cwd: string;
48
- prompt: string;
49
- apiKey?: string;
50
- workspaces?: readonly JudgeWorkspaceContext[];
51
- onText?: (text: string) => void;
52
- }) => Promise<JudgeClassifierResult>;
53
- /** Cumulative classifier text for the current criterion. */
54
- onText?: (text: string) => void;
55
- onEvent?: (event: JudgeProgressEvent) => void;
56
- }
57
- export type JudgeProgressEvent = {
58
- type: "criterion_started";
59
- id: string;
60
- question: string;
61
- } | {
62
- type: "text";
63
- id: string;
64
- question: string;
65
- text: string;
66
- } | {
67
- type: "criterion_finished";
68
- question: string;
69
- verdict: JudgeVerdict;
70
- };
71
- export interface JudgeTraceResult {
72
- verdicts: JudgeVerdict[];
73
- skipped: boolean;
74
- error?: string;
75
- /** Sum of per-criterion judge usage when reported. */
76
- usage?: AgentUsage;
77
- }
78
- export interface ParsedJudgeJson {
79
- pass: boolean;
80
- rationale: string;
81
- evidence: string[];
82
- valid: boolean;
83
- }
84
- /** Full live transcript for a judge, including tool names, args, and results. */
85
- export declare function formatTraceForJudge(trace: AgentTrace): string;
86
- /** Judge questions for mustInvokeSkill — replaces prose regex heuristics. */
87
- export declare function skillInvokeJudgeCriteria(skillNames: string[]): JudgeCriterion[];
88
- /** Parse structured judge JSON (`verdict`, `evidence`, `rationale`). */
89
- export declare function parseJudgeJsonResponse(text: string): ParsedJudgeJson;
90
- /** Fallback when model ignores JSON contract — parse YES/NO prose. */
91
- export declare function parseJudgeLegacyResponse(text: string): ParsedJudgeJson;
92
- /**
93
- * Parse structured JSON first, then legacy YES/NO prose.
94
- * Once a real JSON contract attempt is detected (array, object with `verdict`,
95
- * or truncated JSON-shaped text), never salvage YES/NO from the body — invalid
96
- * contracts are infra failures, not rubric answers.
97
- */
98
- export declare function parseJudgeResponse(text: string): ParsedJudgeJson;
99
- export declare function buildCompareJudgePrompt(options: {
100
- aLabel: string;
101
- aTranscript: string;
102
- bLabel: string;
103
- bTranscript: string;
104
- question: string;
105
- workspaces?: readonly JudgeWorkspaceContext[];
106
- }): string;
107
- export declare function buildMultiArmCompareJudgePrompt(options: {
108
- arms: Array<{
109
- label: string;
110
- transcript: string;
111
- }>;
112
- question: string;
113
- workspaces?: readonly JudgeWorkspaceContext[];
114
- }): string;
115
- /** Score fuzzy rubric criteria with a structured JSON judge (live runs only). */
116
- export declare function judgeTrace(trace: AgentTrace, criteria: JudgeCriterion[], options: JudgeTraceOptions): Promise<JudgeTraceResult>;
117
- export interface CompareJudgePair {
118
- aLabel: string;
119
- a: AgentTrace;
120
- bLabel: string;
121
- b: AgentTrace;
122
- }
123
- export interface CompareJudgeArm {
124
- label: string;
125
- trace: AgentTrace;
126
- }
127
- export type CompareJudgeInput = CompareJudgePair | {
128
- arms: CompareJudgeArm[];
129
- };
130
- /** Score criteria against every arm transcript. */
131
- export declare function judgeCompareTraces(input: CompareJudgeInput, criteria: JudgeCriterion[], options: JudgeTraceOptions): Promise<JudgeTraceResult>;
132
- //# sourceMappingURL=judge.d.ts.map