testeiya 0.4.3 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/prompt/clis.js +38 -0
- package/dist/prompt/clis.js.map +1 -0
- package/dist/prompt/comment-thread.js +56 -44
- package/dist/prompt/comment-thread.js.map +1 -1
- package/dist/prompt/system-prompt.js +154 -174
- package/dist/prompt/system-prompt.js.map +1 -1
- package/dist/src/doctor.js +9 -1
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/langfuse-extension.js +135 -0
- package/dist/src/langfuse-extension.js.map +1 -0
- package/dist/src/langfuse.js +143 -0
- package/dist/src/langfuse.js.map +1 -0
- package/dist/src/output.js +48 -3
- package/dist/src/output.js.map +1 -1
- package/dist/src/run.js +36 -12
- package/dist/src/run.js.map +1 -1
- package/dist/src/session.js +22 -8
- package/dist/src/session.js.map +1 -1
- package/package.json +1 -1
- package/prompt/clis.ts +45 -0
- package/prompt/comment-thread.ts +65 -47
- package/prompt/system-prompt.ts +182 -184
- package/skills/playwright/playwright-cli/SKILL.md +49 -0
- package/skills/playwright/playwright-cli/references/pr-attachments.md +60 -0
- package/skills/playwright/playwright-cli/references/session-management.md +2 -0
- package/skills/playwright/playwright-cli/references/video-recording.md +12 -0
- package/skills/skills.lock.json +3 -2
- package/skills/testomatio/requirements/write-user-story/SKILL.md +7 -10
- package/skills/testomatio/test-management/migrate-to-testomatio/SKILL.md +52 -0
- package/skills/testomatio/test-management/migrate-to-testomatio/references/CSV_MIGRATION.md +72 -0
- package/skills/testomatio/test-management/migrate-to-testomatio/references/CUSTOM_MIGRATION.md +11 -0
- package/skills/testomatio/test-management/migrate-to-testomatio/references/TESTRAIL_MIGRATION.md +87 -0
- package/skills/testomatio/test-management/migrate-to-testomatio/references/XRAY_MIGRATION.md +56 -0
- package/skills/testomatio/test-management/scan-automation-project/SKILL.md +103 -26
- package/dist/prompt/context.js +0 -79
- package/dist/prompt/context.js.map +0 -1
- package/dist/prompt/index.js +0 -60
- package/dist/prompt/index.js.map +0 -1
- package/dist/prompt/print.js +0 -30
- package/dist/prompt/print.js.map +0 -1
- package/dist/prompt/project-info.js +0 -2
- package/dist/prompt/project-info.js.map +0 -1
- package/dist/prompt/testomatio.js +0 -264
- package/dist/prompt/testomatio.js.map +0 -1
- package/dist/prompt/tools.js +0 -70
- package/dist/prompt/tools.js.map +0 -1
- package/dist/prompt/vocab.js +0 -8
- package/dist/prompt/vocab.js.map +0 -1
- package/prompt/context.ts +0 -101
- package/prompt/index.ts +0 -102
- package/prompt/print.ts +0 -32
- package/prompt/project-info.ts +0 -30
- package/prompt/testomatio.ts +0 -281
- package/prompt/tools.ts +0 -72
- package/prompt/vocab.ts +0 -7
package/dist/src/doctor.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { relative } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { TESTEIYA_HOME } from "./env.js";
|
|
5
|
+
import { langfuseConfig } from "./langfuse.js";
|
|
5
6
|
import { hasMcp, hasTestomatio, metadataCachePath, vendorBundle } from "./mcp.js";
|
|
6
7
|
import { PROVIDER_KEYS, resolveModel, UsageError } from "./model.js";
|
|
7
8
|
import { loadBundledSkills } from "./skills.js";
|
|
@@ -19,7 +20,7 @@ export async function runDoctor(options) {
|
|
|
19
20
|
checks.push(model.check);
|
|
20
21
|
const skills = await skillsChecks();
|
|
21
22
|
checks.push(...skills.checks);
|
|
22
|
-
checks.push(testomatioCheck(), mcpCacheCheck());
|
|
23
|
+
checks.push(testomatioCheck(), mcpCacheCheck(), langfuseCheck(options.envSources));
|
|
23
24
|
if (options.probe)
|
|
24
25
|
checks.push(await probeCheck(runtime, model.resolved));
|
|
25
26
|
if (options.json) {
|
|
@@ -132,6 +133,13 @@ function testomatioCheck() {
|
|
|
132
133
|
}
|
|
133
134
|
return { name: "testomatio", status: "ok", detail: "token and project id, MCP tools on" };
|
|
134
135
|
}
|
|
136
|
+
function langfuseCheck(sources) {
|
|
137
|
+
const config = langfuseConfig();
|
|
138
|
+
if (!config)
|
|
139
|
+
return { name: "langfuse", status: "ok", detail: "off" };
|
|
140
|
+
const from = sources.get("LANGFUSE_PUBLIC_KEY") ?? "environment";
|
|
141
|
+
return { name: "langfuse", status: "ok", detail: `${config.baseUrl}, keys from ${from}` };
|
|
142
|
+
}
|
|
135
143
|
function mcpCacheCheck() {
|
|
136
144
|
if (!hasMcp())
|
|
137
145
|
return { name: "mcp", status: "ok", detail: "off" };
|
package/dist/src/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAE1B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,MAAM,GAAY,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { VERSION } from "./env.js";
|
|
2
|
+
import { createTracer, langfuseConfig } from "./langfuse.js";
|
|
3
|
+
/**
|
|
4
|
+
* The run as a Langfuse trace: one agent observation per prompt, a generation
|
|
5
|
+
* per LLM call with tokens and cost, a tool observation per tool call. Off
|
|
6
|
+
* unless LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY are both set.
|
|
7
|
+
*/
|
|
8
|
+
export default function langfuseExtension(pi) {
|
|
9
|
+
const config = langfuseConfig();
|
|
10
|
+
if (!config)
|
|
11
|
+
return;
|
|
12
|
+
const tracer = createTracer(config);
|
|
13
|
+
const tools = new Map();
|
|
14
|
+
let root;
|
|
15
|
+
let generation;
|
|
16
|
+
let context = [];
|
|
17
|
+
pi.on("before_agent_start", (event, ctx) => {
|
|
18
|
+
root = tracer.trace(traceName(event.prompt), {
|
|
19
|
+
input: event.prompt,
|
|
20
|
+
tags: ["testeiya", "cli"],
|
|
21
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
22
|
+
metadata: metadata(ctx),
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
pi.on("context", (event) => {
|
|
26
|
+
context = event.messages;
|
|
27
|
+
});
|
|
28
|
+
pi.on("message_start", (event) => {
|
|
29
|
+
if (!root)
|
|
30
|
+
return;
|
|
31
|
+
if (event.message.role !== "assistant")
|
|
32
|
+
return;
|
|
33
|
+
generation = root.child("llm-generation", { type: "generation", input: context });
|
|
34
|
+
});
|
|
35
|
+
pi.on("message_end", (event) => {
|
|
36
|
+
const message = event.message;
|
|
37
|
+
if (!generation)
|
|
38
|
+
return;
|
|
39
|
+
if (message.role !== "assistant")
|
|
40
|
+
return;
|
|
41
|
+
generation.end({
|
|
42
|
+
model: message.model,
|
|
43
|
+
output: message.content,
|
|
44
|
+
usage: {
|
|
45
|
+
input: message.usage.input,
|
|
46
|
+
output: message.usage.output,
|
|
47
|
+
cache_read_input_tokens: message.usage.cacheRead,
|
|
48
|
+
cache_creation_input_tokens: message.usage.cacheWrite,
|
|
49
|
+
total: message.usage.totalTokens,
|
|
50
|
+
},
|
|
51
|
+
cost: {
|
|
52
|
+
input: message.usage.cost.input,
|
|
53
|
+
output: message.usage.cost.output,
|
|
54
|
+
cache_read_input_tokens: message.usage.cost.cacheRead,
|
|
55
|
+
cache_creation_input_tokens: message.usage.cost.cacheWrite,
|
|
56
|
+
total: message.usage.cost.total,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
generation = undefined;
|
|
60
|
+
});
|
|
61
|
+
pi.on("tool_execution_start", (event) => {
|
|
62
|
+
if (!root)
|
|
63
|
+
return;
|
|
64
|
+
tools.set(event.toolCallId, root.child(event.toolName, { type: "tool", input: event.args }));
|
|
65
|
+
});
|
|
66
|
+
pi.on("tool_execution_end", (event) => {
|
|
67
|
+
const span = tools.get(event.toolCallId);
|
|
68
|
+
if (!span)
|
|
69
|
+
return;
|
|
70
|
+
const fields = { output: event.result, level: "DEFAULT" };
|
|
71
|
+
if (event.isError)
|
|
72
|
+
fields.level = "ERROR";
|
|
73
|
+
span.end(fields);
|
|
74
|
+
tools.delete(event.toolCallId);
|
|
75
|
+
});
|
|
76
|
+
pi.on("agent_end", (event) => {
|
|
77
|
+
root?.update({ output: finalText(event.messages) });
|
|
78
|
+
});
|
|
79
|
+
// The only point pi guarantees is terminal: retries and queued continuations
|
|
80
|
+
// are done, and the CLI's own prompt call waits for this handler to finish.
|
|
81
|
+
pi.on("agent_settled", async () => {
|
|
82
|
+
for (const span of tools.values())
|
|
83
|
+
span.end();
|
|
84
|
+
tools.clear();
|
|
85
|
+
generation?.end();
|
|
86
|
+
generation = undefined;
|
|
87
|
+
root?.end();
|
|
88
|
+
root = undefined;
|
|
89
|
+
await tracer.flush();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function metadata(ctx) {
|
|
93
|
+
const value = { cwd: ctx.cwd, version: VERSION };
|
|
94
|
+
if (ctx.model)
|
|
95
|
+
value.model = `${ctx.model.provider}/${ctx.model.id}`;
|
|
96
|
+
if (process.env.TESTOMATIO_PROJECT_ID)
|
|
97
|
+
value.project = process.env.TESTOMATIO_PROJECT_ID;
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
// A `/skill` in the task is expanded in front of it, so the first line of what
|
|
101
|
+
// the agent reads is the skill, not the job. The trace is named after the job.
|
|
102
|
+
function traceName(prompt) {
|
|
103
|
+
let task = prompt;
|
|
104
|
+
const skillEnd = prompt.lastIndexOf("</skill>");
|
|
105
|
+
if (skillEnd !== -1)
|
|
106
|
+
task = prompt.slice(skillEnd + "</skill>".length);
|
|
107
|
+
const firstLine = task
|
|
108
|
+
.split("\n")
|
|
109
|
+
.map((line) => line.trim())
|
|
110
|
+
.find(Boolean);
|
|
111
|
+
if (!firstLine)
|
|
112
|
+
return "testeiya run";
|
|
113
|
+
if (firstLine.length <= 60)
|
|
114
|
+
return firstLine;
|
|
115
|
+
return `${firstLine.slice(0, 60)}…`;
|
|
116
|
+
}
|
|
117
|
+
function finalText(messages) {
|
|
118
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
119
|
+
const message = messages[i];
|
|
120
|
+
if (message?.role === "assistant")
|
|
121
|
+
return textOf(message.content);
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
function textOf(content) {
|
|
126
|
+
if (typeof content === "string")
|
|
127
|
+
return content;
|
|
128
|
+
if (!Array.isArray(content))
|
|
129
|
+
return undefined;
|
|
130
|
+
return content
|
|
131
|
+
.filter((part) => part?.type === "text")
|
|
132
|
+
.map((part) => part.text)
|
|
133
|
+
.join("\n");
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=langfuse-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse-extension.js","sourceRoot":"","sources":["../../src/langfuse-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
const CLOUD = "https://cloud.langfuse.com";
|
|
3
|
+
const OTLP_PATH = "/api/public/otel/v1/traces";
|
|
4
|
+
/** A tool result can be a whole file. Long values are cut, never dropped. */
|
|
5
|
+
const MAX_VALUE = 100_000;
|
|
6
|
+
/** Langfuse keys, or null when this run is not traced. */
|
|
7
|
+
export function langfuseConfig(env = process.env) {
|
|
8
|
+
const publicKey = env.LANGFUSE_PUBLIC_KEY;
|
|
9
|
+
const secretKey = env.LANGFUSE_SECRET_KEY;
|
|
10
|
+
if (!publicKey || !secretKey)
|
|
11
|
+
return null;
|
|
12
|
+
let baseUrl = env.LANGFUSE_BASE_URL ?? env.LANGFUSE_BASEURL ?? CLOUD;
|
|
13
|
+
while (baseUrl.endsWith("/"))
|
|
14
|
+
baseUrl = baseUrl.slice(0, -1);
|
|
15
|
+
return { publicKey, secretKey, baseUrl };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Spans held in memory, shipped as one OTLP request. Langfuse reads OTLP over
|
|
19
|
+
* plain JSON, so a trace costs no dependency: an install of this CLI carries no
|
|
20
|
+
* OpenTelemetry SDK for a feature most runs never turn on.
|
|
21
|
+
*/
|
|
22
|
+
export function createTracer(config) {
|
|
23
|
+
const finished = [];
|
|
24
|
+
let reported = false;
|
|
25
|
+
return { trace, flush };
|
|
26
|
+
function trace(name, fields) {
|
|
27
|
+
return open(randomBytes(16).toString("hex"), undefined, name, { type: "agent", ...fields });
|
|
28
|
+
}
|
|
29
|
+
function open(traceId, parentSpanId, name, fields) {
|
|
30
|
+
const spanId = randomBytes(8).toString("hex");
|
|
31
|
+
const startTimeUnixNano = nanos();
|
|
32
|
+
let current = fields;
|
|
33
|
+
let ended = false;
|
|
34
|
+
return {
|
|
35
|
+
child(childName, childFields) {
|
|
36
|
+
return open(traceId, spanId, childName, childFields);
|
|
37
|
+
},
|
|
38
|
+
update(extra) {
|
|
39
|
+
current = { ...current, ...extra };
|
|
40
|
+
},
|
|
41
|
+
end(extra) {
|
|
42
|
+
if (ended)
|
|
43
|
+
return;
|
|
44
|
+
ended = true;
|
|
45
|
+
current = { ...current, ...extra };
|
|
46
|
+
finished.push({
|
|
47
|
+
traceId,
|
|
48
|
+
spanId,
|
|
49
|
+
parentSpanId,
|
|
50
|
+
name,
|
|
51
|
+
kind: 1,
|
|
52
|
+
startTimeUnixNano,
|
|
53
|
+
endTimeUnixNano: nanos(),
|
|
54
|
+
attributes: spanAttributes(name, current, !parentSpanId),
|
|
55
|
+
status: {},
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function flush() {
|
|
61
|
+
if (finished.length === 0)
|
|
62
|
+
return;
|
|
63
|
+
const batch = finished.splice(0, finished.length);
|
|
64
|
+
const auth = Buffer.from(`${config.publicKey}:${config.secretKey}`).toString("base64");
|
|
65
|
+
const response = await fetch(`${config.baseUrl}${OTLP_PATH}`, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: { authorization: `Basic ${auth}`, "content-type": "application/json" },
|
|
68
|
+
body: JSON.stringify(otlpPayload(batch)),
|
|
69
|
+
}).catch((err) => err);
|
|
70
|
+
if (response instanceof Error)
|
|
71
|
+
return warn(response.message);
|
|
72
|
+
if (!response.ok)
|
|
73
|
+
warn(`${config.baseUrl} answered ${response.status}`);
|
|
74
|
+
}
|
|
75
|
+
// A trace nobody can see must never take the run down with it, and one line
|
|
76
|
+
// is enough: a broken key breaks every flush the same way.
|
|
77
|
+
function warn(message) {
|
|
78
|
+
if (reported)
|
|
79
|
+
return;
|
|
80
|
+
reported = true;
|
|
81
|
+
process.stderr.write(` langfuse: ${message}\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function otlpPayload(spans) {
|
|
85
|
+
return {
|
|
86
|
+
resourceSpans: [
|
|
87
|
+
{
|
|
88
|
+
resource: { attributes: [attribute("service.name", "testeiya")] },
|
|
89
|
+
scopeSpans: [{ scope: { name: "testeiya" }, spans }],
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function spanAttributes(name, fields, root) {
|
|
95
|
+
const out = [];
|
|
96
|
+
push(out, "langfuse.observation.type", fields.type);
|
|
97
|
+
push(out, "langfuse.observation.input", fields.input);
|
|
98
|
+
push(out, "langfuse.observation.output", fields.output);
|
|
99
|
+
push(out, "langfuse.observation.model.name", fields.model);
|
|
100
|
+
push(out, "langfuse.observation.usage_details", fields.usage);
|
|
101
|
+
push(out, "langfuse.observation.cost_details", fields.cost);
|
|
102
|
+
push(out, "langfuse.observation.metadata", fields.metadata);
|
|
103
|
+
push(out, "langfuse.observation.level", fields.level);
|
|
104
|
+
if (!root)
|
|
105
|
+
return out;
|
|
106
|
+
push(out, "langfuse.trace.name", name);
|
|
107
|
+
push(out, "langfuse.trace.input", fields.input);
|
|
108
|
+
push(out, "langfuse.trace.output", fields.output);
|
|
109
|
+
push(out, "langfuse.trace.tags", fields.tags);
|
|
110
|
+
push(out, "langfuse.trace.metadata", fields.metadata);
|
|
111
|
+
push(out, "langfuse.session.id", fields.sessionId);
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
function push(out, key, value) {
|
|
115
|
+
if (value === undefined || value === null)
|
|
116
|
+
return;
|
|
117
|
+
out.push(attribute(key, serialize(value)));
|
|
118
|
+
}
|
|
119
|
+
function attribute(key, value) {
|
|
120
|
+
return { key, value: { stringValue: value } };
|
|
121
|
+
}
|
|
122
|
+
function serialize(value) {
|
|
123
|
+
let text = "";
|
|
124
|
+
if (typeof value === "string")
|
|
125
|
+
text = value;
|
|
126
|
+
if (typeof value !== "string")
|
|
127
|
+
text = json(value);
|
|
128
|
+
if (text.length <= MAX_VALUE)
|
|
129
|
+
return text;
|
|
130
|
+
return `${text.slice(0, MAX_VALUE)}… (${text.length - MAX_VALUE} more)`;
|
|
131
|
+
}
|
|
132
|
+
function json(value) {
|
|
133
|
+
try {
|
|
134
|
+
return JSON.stringify(value) ?? "";
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return String(value);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function nanos() {
|
|
141
|
+
return `${Date.now()}000000`;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=langfuse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse.js","sourceRoot":"","sources":["../../src/langfuse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,KAAK,GAAG,4BAA4B,CAAC;AAC3C,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAC/C,6EAA6E;AAC7E,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC;IAC1C,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,GAAG,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,gBAAgB,IAAI,KAAK,CAAC;IACrE,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,MAAM,QAAQ,GAAe,EAAE,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAExB,SAAS,KAAK,CAAC,IAAY,EAAE,MAAkB;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,SAAS,IAAI,CACX,OAAe,EACf,YAAgC,EAChC,IAAY,EACZ,MAAkB;QAElB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,iBAAiB,GAAG,KAAK,EAAE,CAAC;QAClC,IAAI,OAAO,GAAG,MAAM,CAAC;QACrB,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,OAAO;YACL,KAAK,CAAC,SAAS,EAAE,WAAW;gBAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,CAAC,KAAK;gBACV,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;YACrC,CAAC;YACD,GAAG,CAAC,KAAK;gBACP,IAAI,KAAK;oBAAE,OAAO;gBAClB,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO;oBACP,MAAM;oBACN,YAAY;oBACZ,IAAI;oBACJ,IAAI,EAAE,CAAC;oBACP,iBAAiB;oBACjB,eAAe,EAAE,KAAK,EAAE;oBACxB,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC;oBACxD,MAAM,EAAE,EAAE;iBACX,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,KAAK;QAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,EAAE,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SACzC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,GAAY,CAAC,CAAC;QAEzC,IAAI,QAAQ,YAAY,KAAK;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,SAAS,IAAI,CAAC,OAAe;QAC3B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,IAAI,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,OAAO;QACL,aAAa,EAAE;YACb;gBACE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,EAAE;gBACjE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC;aACrD;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAkB,EAAE,IAAa;IAC5E,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,EAAE,4BAA4B,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,6BAA6B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,iCAAiC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,EAAE,oCAAoC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,EAAE,mCAAmC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,EAAE,+BAA+B,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,EAAE,4BAA4B,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,yBAAyB,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,IAAI,CAAC,GAAoB,EAAE,GAAW,EAAE,KAAc;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAClD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa;IAC3C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,IAAI,GAAG,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,SAAS,QAAQ,CAAC;AAC1E,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC/B,CAAC"}
|
package/dist/src/output.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { access, constants, readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { dirname, resolve } from "node:path";
|
|
3
3
|
import { run } from "./exec.js";
|
|
4
|
+
import { threadMarker } from "../prompt/comment-thread.js";
|
|
4
5
|
const GH_SCHEME = "gh:";
|
|
6
|
+
const MINIMIZE = "mutation($id:ID!){minimizeComment(input:{subjectId:$id,classifier:OUTDATED}){minimizedComment{isMinimized}}}";
|
|
5
7
|
const MARKER = "<!-- testeiya";
|
|
6
8
|
/**
|
|
7
9
|
* Where the report goes. Only known schemes are recognised: a generic
|
|
@@ -58,14 +60,38 @@ export async function preflight(destinations) {
|
|
|
58
60
|
return null;
|
|
59
61
|
}
|
|
60
62
|
/** Route the finished report. Returns a message when a destination failed. */
|
|
61
|
-
export async function deliver(destinations, envelope) {
|
|
63
|
+
export async function deliver(destinations, envelope, thread) {
|
|
62
64
|
for (const destination of destinations) {
|
|
63
|
-
const failure = await deliverOne(destination, envelope);
|
|
65
|
+
const failure = await deliverOne(destination, envelope, thread);
|
|
64
66
|
if (failure)
|
|
65
67
|
return failure;
|
|
66
68
|
}
|
|
67
69
|
return null;
|
|
68
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* This thread's comments, read before the run. Collapsing them afterwards needs
|
|
73
|
+
* no judgement: the answer posted in between cannot be in a list taken before
|
|
74
|
+
* it existed, which is the one thing an agent working the thread cannot know.
|
|
75
|
+
*/
|
|
76
|
+
export async function threadComments(pr, thread) {
|
|
77
|
+
if (!pr || !thread)
|
|
78
|
+
return [];
|
|
79
|
+
const view = await run("gh", ["pr", "view", String(pr), "--json", "comments"]);
|
|
80
|
+
if (view.code !== 0)
|
|
81
|
+
return [];
|
|
82
|
+
// The trailing space stops `thread=qa` from matching `thread=qa-nightly`.
|
|
83
|
+
const prefix = `${threadMarker(thread)} `;
|
|
84
|
+
const ids = [];
|
|
85
|
+
for (const comment of parseComments(view.stdout)) {
|
|
86
|
+
if (comment.isMinimized)
|
|
87
|
+
continue;
|
|
88
|
+
if (!comment.body?.startsWith(prefix))
|
|
89
|
+
continue;
|
|
90
|
+
if (comment.id)
|
|
91
|
+
ids.push(comment.id);
|
|
92
|
+
}
|
|
93
|
+
return ids;
|
|
94
|
+
}
|
|
69
95
|
/**
|
|
70
96
|
* The report as delivered, marker on top, header above it and footer under it.
|
|
71
97
|
* A footer is how a thread stays a thread: it tells the reader what to type to
|
|
@@ -120,7 +146,7 @@ export function pullRequestNumber(destinations) {
|
|
|
120
146
|
export function modelName(model) {
|
|
121
147
|
return model.slice(model.lastIndexOf("/") + 1);
|
|
122
148
|
}
|
|
123
|
-
async function deliverOne(destination, envelope) {
|
|
149
|
+
async function deliverOne(destination, envelope, thread) {
|
|
124
150
|
// The agent wrote this file, so it is rewritten rather than written: what
|
|
125
151
|
// lands on disk is the same body every other destination gets.
|
|
126
152
|
if (destination.kind === "markdown") {
|
|
@@ -153,8 +179,27 @@ async function deliverOne(destination, envelope) {
|
|
|
153
179
|
});
|
|
154
180
|
if (result.code !== 0)
|
|
155
181
|
return `gh pr comment failed: ${result.stderr.trim() || result.code}`;
|
|
182
|
+
await collapse(thread?.earlier ?? []);
|
|
156
183
|
return null;
|
|
157
184
|
}
|
|
185
|
+
// The answer is already posted, so a comment that will not collapse is a
|
|
186
|
+
// blemish on the thread, never a failed delivery.
|
|
187
|
+
async function collapse(ids) {
|
|
188
|
+
for (const id of ids) {
|
|
189
|
+
const result = await run("gh", ["api", "graphql", "-f", `query=${MINIMIZE}`, "-f", `id=${id}`]);
|
|
190
|
+
if (result.code === 0)
|
|
191
|
+
continue;
|
|
192
|
+
process.stderr.write(` could not collapse ${id}: ${result.stderr.trim() || result.code}\n`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function parseComments(stdout) {
|
|
196
|
+
try {
|
|
197
|
+
return JSON.parse(stdout).comments ?? [];
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
158
203
|
function parseOne(value) {
|
|
159
204
|
if (!value)
|
|
160
205
|
return "empty --output";
|
package/dist/src/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/src/run.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { existsSync, statSync } from "node:fs";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
3
5
|
import { chalkStderr as c } from "chalk";
|
|
4
6
|
import { describeUpdate, lastCheckpoint, readCheckpoint, readRepo, saveCheckpoint } from "./checkpoint.js";
|
|
5
7
|
import { VERSION } from "./env.js";
|
|
6
8
|
import { hasTestomatio } from "./mcp.js";
|
|
7
9
|
import { UsageError } from "./model.js";
|
|
8
|
-
import { decorate, defaultFooter, deliver, marker, markdownPath, modelName, pullRequestNumber, threadName, } from "./output.js";
|
|
10
|
+
import { decorate, defaultFooter, deliver, marker, markdownPath, modelName, pullRequestNumber, threadComments, threadName, } from "./output.js";
|
|
9
11
|
import { commentThread, threadHost } from "../prompt/comment-thread.js";
|
|
10
12
|
import { shortId } from "./sessions.js";
|
|
11
13
|
import { createTesteiyaSession } from "./session.js";
|
|
@@ -13,7 +15,7 @@ import { expandSkills } from "./skills.js";
|
|
|
13
15
|
export async function runPrint(options) {
|
|
14
16
|
const started = Date.now();
|
|
15
17
|
const result = {};
|
|
16
|
-
const outputPath = markdownPath(options.destinations);
|
|
18
|
+
const outputPath = markdownPath(options.destinations) ?? impliedReport(options.destinations);
|
|
17
19
|
const stampBefore = fileStamp(outputPath);
|
|
18
20
|
const cwd = process.cwd();
|
|
19
21
|
// A run that can use none of it never pays for the git calls: the checkout is
|
|
@@ -31,10 +33,6 @@ export async function runPrint(options) {
|
|
|
31
33
|
// How a thread is kept on this host. Rendered only in a job that has one.
|
|
32
34
|
const thread = threadName(options.thread);
|
|
33
35
|
const stamp = marks(options, thread, repo.commit, inThread);
|
|
34
|
-
const sections = [];
|
|
35
|
-
if (host) {
|
|
36
|
-
sections.push(commentThread({ host, thread, marker: marker(stamp), posts: Boolean(pr) }));
|
|
37
|
-
}
|
|
38
36
|
let created;
|
|
39
37
|
try {
|
|
40
38
|
created = await createTesteiyaSession({
|
|
@@ -44,7 +42,22 @@ export async function runPrint(options) {
|
|
|
44
42
|
model: options.model,
|
|
45
43
|
outputFile: outputPath,
|
|
46
44
|
brief: options.brief,
|
|
47
|
-
|
|
45
|
+
// The model names itself in the default footer, and the agent posts that
|
|
46
|
+
// footer, so the section cannot be built until the model is resolved.
|
|
47
|
+
sections: (model) => {
|
|
48
|
+
if (!host)
|
|
49
|
+
return [];
|
|
50
|
+
return [
|
|
51
|
+
commentThread({
|
|
52
|
+
host,
|
|
53
|
+
thread,
|
|
54
|
+
marker: marker(stamp),
|
|
55
|
+
reportFile: outputPath,
|
|
56
|
+
footer: footerFor(options, model),
|
|
57
|
+
delivered: Boolean(pr),
|
|
58
|
+
}),
|
|
59
|
+
];
|
|
60
|
+
},
|
|
48
61
|
...connectionOptions(),
|
|
49
62
|
});
|
|
50
63
|
}
|
|
@@ -76,9 +89,12 @@ export async function runPrint(options) {
|
|
|
76
89
|
note(c.dim(` → ${line}`));
|
|
77
90
|
note("");
|
|
78
91
|
}
|
|
92
|
+
// Read before the run: the answer delivered afterwards cannot be in it, so
|
|
93
|
+
// collapsing this list needs no judgement about which comment is the new one.
|
|
94
|
+
const earlier = await threadComments(pr, stamp.thread);
|
|
79
95
|
const run = watchRun(session);
|
|
80
96
|
await promptOnce(session, task.prompt, run);
|
|
81
|
-
const written = await collectReport(session, run, outputPath, stampBefore
|
|
97
|
+
const written = await collectReport(session, run, outputPath, stampBefore);
|
|
82
98
|
if (!run.error && checkpoint)
|
|
83
99
|
saveCheckpoint(options.sessionManager, checkpoint);
|
|
84
100
|
const report = sign(written, options, model, stamp);
|
|
@@ -104,7 +120,7 @@ export async function runPrint(options) {
|
|
|
104
120
|
note(c.dim(` ${"─".repeat(rule())}`));
|
|
105
121
|
note("");
|
|
106
122
|
}
|
|
107
|
-
const failure = await deliver(options.destinations, envelope);
|
|
123
|
+
const failure = await deliver(options.destinations, envelope, { earlier });
|
|
108
124
|
if (failure) {
|
|
109
125
|
note(` ${c.red(`✗ ${failure}`)}`);
|
|
110
126
|
// The report is worth more than the destination: never lose it.
|
|
@@ -266,7 +282,7 @@ async function promptOnce(session, text, run) {
|
|
|
266
282
|
run.error = errorText(err);
|
|
267
283
|
}
|
|
268
284
|
}
|
|
269
|
-
async function collectReport(session, run, path, before
|
|
285
|
+
async function collectReport(session, run, path, before) {
|
|
270
286
|
if (run.error)
|
|
271
287
|
return null;
|
|
272
288
|
if (!path)
|
|
@@ -274,8 +290,6 @@ async function collectReport(session, run, path, before, status) {
|
|
|
274
290
|
const report = await readIfFresh(path, before);
|
|
275
291
|
if (report)
|
|
276
292
|
return report;
|
|
277
|
-
if (status === "fail")
|
|
278
|
-
return null;
|
|
279
293
|
return nudgeForReport(session, run, path, before);
|
|
280
294
|
}
|
|
281
295
|
async function nudgeForReport(session, run, path, before) {
|
|
@@ -323,6 +337,16 @@ async function readIfFresh(path, before) {
|
|
|
323
337
|
return text;
|
|
324
338
|
return `${text}\n`;
|
|
325
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* A posted comment is read by people, so it must be the report the agent wrote,
|
|
342
|
+
* not whatever it happened to say last. Without a markdown `--output` the run
|
|
343
|
+
* gets a scratch one anyway, and the report file the prompt demands with it.
|
|
344
|
+
*/
|
|
345
|
+
function impliedReport(destinations) {
|
|
346
|
+
if (!destinations.some((destination) => destination.kind === "gh"))
|
|
347
|
+
return undefined;
|
|
348
|
+
return join(tmpdir(), `testeiya-report-${process.pid}.md`);
|
|
349
|
+
}
|
|
326
350
|
function fileStamp(path) {
|
|
327
351
|
if (!path || !existsSync(path))
|
|
328
352
|
return null;
|