@empiricalrun/test-gen 0.79.5 → 0.79.6
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/CHANGELOG.md +9 -0
- package/dist/agent/base/index.d.ts +2 -2
- package/dist/agent/base/index.d.ts.map +1 -1
- package/dist/agent/base/index.js +38 -7
- package/dist/agent/browsing/utils.d.ts.map +1 -1
- package/dist/agent/browsing/utils.js +8 -3
- package/dist/agent/chat/exports.d.ts +1 -1
- package/dist/agent/chat/exports.d.ts.map +1 -1
- package/dist/agent/chat/exports.js +1 -2
- package/dist/agent/chat/index.d.ts.map +1 -1
- package/dist/agent/chat/index.js +5 -5
- package/dist/agent/chat/prompt/repo.d.ts.map +1 -1
- package/dist/agent/chat/prompt/repo.js +24 -0
- package/dist/agent/chat/state.d.ts +0 -1
- package/dist/agent/chat/state.d.ts.map +1 -1
- package/dist/agent/chat/state.js +0 -28
- package/dist/agent/master/browser-tests/cua.spec.js +3 -3
- package/dist/agent/master/browser-tests/index.spec.js +2 -111
- package/dist/agent/master/run.d.ts +0 -1
- package/dist/agent/master/run.d.ts.map +1 -1
- package/dist/agent/master/run.js +1 -3
- package/dist/bin/index.js +0 -12
- package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
- package/dist/file-info/adapters/github/reader.js +10 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -29
- package/dist/recorder/index.d.ts.map +1 -1
- package/dist/recorder/index.js +1 -1
- package/dist/tools/api-client/index.d.ts +3 -0
- package/dist/tools/api-client/index.d.ts.map +1 -0
- package/dist/tools/api-client/index.js +73 -0
- package/dist/tools/create-pull-request/utils.d.ts +1 -1
- package/dist/tools/definitions/run-test.d.ts +2 -2
- package/dist/tools/definitions/run-test.d.ts.map +1 -1
- package/dist/tools/definitions/run-test.js +6 -5
- package/dist/tools/definitions/safe-bash.d.ts +1 -0
- package/dist/tools/definitions/safe-bash.d.ts.map +1 -1
- package/dist/tools/definitions/safe-bash.js +15 -6
- package/dist/tools/definitions/test-gen-browser.d.ts +2 -2
- package/dist/tools/definitions/test-gen-browser.d.ts.map +1 -1
- package/dist/tools/definitions/test-gen-browser.js +4 -5
- package/dist/tools/delete-file/index.d.ts.map +1 -1
- package/dist/tools/delete-file/index.js +4 -5
- package/dist/tools/executor/index.d.ts.map +1 -1
- package/dist/tools/executor/index.js +0 -4
- package/dist/tools/fetch-file/index.d.ts.map +1 -1
- package/dist/tools/fetch-file/index.js +3 -7
- package/dist/tools/file-operations/create.js +4 -4
- package/dist/tools/file-operations/insert.js +5 -5
- package/dist/tools/file-operations/replace.js +5 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -4
- package/dist/tools/issues-v1/utils.d.ts +1 -3
- package/dist/tools/issues-v1/utils.d.ts.map +1 -1
- package/dist/tools/issues-v1/utils.js +0 -16
- package/dist/tools/list-tests-and-projects/index.d.ts.map +1 -1
- package/dist/tools/list-tests-and-projects/index.js +1 -1
- package/dist/tools/rename-file/index.d.ts.map +1 -1
- package/dist/tools/rename-file/index.js +7 -4
- package/dist/tools/run-test.d.ts.map +1 -1
- package/dist/tools/run-test.js +33 -7
- package/dist/tools/safe-bash/index.d.ts.map +1 -1
- package/dist/tools/safe-bash/index.js +25 -10
- package/dist/tools/test-gen-browser.d.ts.map +1 -1
- package/dist/tools/test-gen-browser.js +24 -5
- package/dist/tools/utils/validators.d.ts +7 -0
- package/dist/tools/utils/validators.d.ts.map +1 -0
- package/dist/tools/utils/validators.js +93 -0
- package/dist/video-core/index.d.ts.map +1 -1
- package/dist/video-core/index.js +5 -0
- package/package.json +9 -11
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/bin/environments.d.ts +0 -6
- package/dist/bin/environments.d.ts.map +0 -1
- package/dist/bin/environments.js +0 -99
- package/dist/tools/definitions/upgrade-packages.d.ts +0 -14
- package/dist/tools/definitions/upgrade-packages.d.ts.map +0 -1
- package/dist/tools/definitions/upgrade-packages.js +0 -21
- package/dist/tools/upgrade-packages/index.d.ts +0 -3
- package/dist/tools/upgrade-packages/index.d.ts.map +0 -1
- package/dist/tools/upgrade-packages/index.js +0 -134
- package/dist/tools/upgrade-packages/utils.d.ts +0 -28
- package/dist/tools/upgrade-packages/utils.d.ts.map +0 -1
- package/dist/tools/upgrade-packages/utils.js +0 -152
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IChatModel } from "@empiricalrun/llm/chat";
|
|
2
|
-
import type { CanonicalMessage, ChatState, ChatStateGeneric, MessageCheckpoint, PendingToolCall, ReporterFunction, StreamingMessageReporterFunc, SupportedChatModels, TextMessagePart, TextMessageWithAttachmentsPart, ToolResult, ToolsForLLM } from "@empiricalrun/shared-types/chat-agent";
|
|
2
|
+
import type { CanonicalMessage, ChatState, ChatStateGeneric, MessageCheckpoint, PendingToolCall, ProcessToolResultsResult, ReporterFunction, StreamingMessageReporterFunc, SupportedChatModels, TextMessagePart, TextMessageWithAttachmentsPart, ToolResult, ToolsForLLM } from "@empiricalrun/shared-types/chat-agent";
|
|
3
3
|
import type { TraceClient } from "@empiricalrun/shared-types/common";
|
|
4
4
|
import type { FileInfo } from "@empiricalrun/shared-types/test-gen";
|
|
5
5
|
import type { IToolExecutor } from "../../tools/executor/types";
|
|
@@ -50,7 +50,7 @@ export declare abstract class BaseAgent<T> {
|
|
|
50
50
|
setChatState(chatState: ChatStateGeneric<T>): void;
|
|
51
51
|
changeModel(newModel: SupportedChatModels): void;
|
|
52
52
|
stop(): ChatStateGeneric<T>;
|
|
53
|
-
processToolResults(toolCalls: PendingToolCall[], toolResults: ToolResult[], checkpoint: MessageCheckpoint | null):
|
|
53
|
+
processToolResults(toolCalls: PendingToolCall[], toolResults: ToolResult[], checkpoint: MessageCheckpoint | null): ProcessToolResultsResult;
|
|
54
54
|
toolCallHandler(toolCalls: PendingToolCall[]): Promise<void>;
|
|
55
55
|
runLoop(params: RunLoopParams<any>): Promise<void>;
|
|
56
56
|
getHumanReadableLatestMessage(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/base/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/base/index.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/base/index.js
CHANGED
|
@@ -97,12 +97,43 @@ class BaseAgent {
|
|
|
97
97
|
if (filteredToolCalls.length > 0) {
|
|
98
98
|
this.chatModel.pushToolResultsMessage(filteredToolCalls, filteredToolResults, checkpoint);
|
|
99
99
|
return {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
status: "accepted",
|
|
101
|
+
chatState: {
|
|
102
|
+
...this.chatState,
|
|
103
|
+
messages: this.chatModel.messages,
|
|
104
|
+
askUserForInput: this.chatModel.askUserForInput,
|
|
105
|
+
},
|
|
103
106
|
};
|
|
104
107
|
}
|
|
105
|
-
|
|
108
|
+
// Check if these tool calls were already completed (idempotent retry)
|
|
109
|
+
const messages = this.chatModel.messages;
|
|
110
|
+
const completedToolCallIds = new Set();
|
|
111
|
+
for (const msg of messages) {
|
|
112
|
+
if (msg.role === "tool") {
|
|
113
|
+
for (const part of msg.parts) {
|
|
114
|
+
if ("toolCallId" in part && part.toolCallId) {
|
|
115
|
+
completedToolCallIds.add(part.toolCallId);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (toolCalls.every((tc) => completedToolCallIds.has(tc.id))) {
|
|
121
|
+
console.log(`[processToolResults] Tool calls already completed (idempotent retry): ${toolCalls.map((tc) => `${tc.id} (${tc.name})`).join(", ")}`);
|
|
122
|
+
return { status: "already_accepted" };
|
|
123
|
+
}
|
|
124
|
+
// Diagnose why no tool calls matched
|
|
125
|
+
for (const call of toolCalls) {
|
|
126
|
+
if (completedToolCallIds.has(call.id)) {
|
|
127
|
+
console.log(`[processToolResults] Tool call ${call.id} (${call.name}) already has a result`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(`[processToolResults] Tool call ${call.id} (${call.name}) not found in messages (${messages.length} messages)`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (pendingToolCalls.length > 0) {
|
|
134
|
+
console.log(`[processToolResults] Pending tool calls: ${pendingToolCalls.map((p) => `${p.id} (${p.name})`).join(", ")}`);
|
|
135
|
+
}
|
|
136
|
+
return { status: "rejected" };
|
|
106
137
|
}
|
|
107
138
|
async toolCallHandler(toolCalls) {
|
|
108
139
|
if (!this.toolExecutor) {
|
|
@@ -113,9 +144,9 @@ class BaseAgent {
|
|
|
113
144
|
}
|
|
114
145
|
const result = await this.toolExecutor.execute(toolCalls);
|
|
115
146
|
if (result.status === "completed") {
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
118
|
-
await this.onToolResultsProcessed(
|
|
147
|
+
const { status, chatState } = this.processToolResults(toolCalls, result.toolResults, result.checkpoint);
|
|
148
|
+
if (status === "accepted" && chatState && this.onToolResultsProcessed) {
|
|
149
|
+
await this.onToolResultsProcessed(chatState);
|
|
119
150
|
}
|
|
120
151
|
}
|
|
121
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAOvD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,MAAM,CAKhD;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/agent/browsing/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAOvD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,MAAM,CAKhD;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAmB1E;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAsBpB;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,IAAI,iBA0GxD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,CA2B/B;AAWD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,oBAAoB,EACtC,gBAAgB,GAAE,MAAM,EAAU,GACjC,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
|
|
@@ -20,9 +20,14 @@ function isRegExp(obj) {
|
|
|
20
20
|
Object.prototype.toString.call(obj) === "[object RegExp]");
|
|
21
21
|
}
|
|
22
22
|
function addImportForMethod(testFilePath, methodName) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
let importSource;
|
|
24
|
+
try {
|
|
25
|
+
importSource = require.resolve("@empiricalrun/test-gen");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Fallback for bundled context (e.g. sandbox-wrapper)
|
|
29
|
+
importSource = path_1.default.join(__dirname, "index.js");
|
|
30
|
+
}
|
|
26
31
|
if (!fs_1.default.existsSync(importSource)) {
|
|
27
32
|
throw new Error(`createTest import source not found at ${importSource}`);
|
|
28
33
|
}
|
|
@@ -9,6 +9,6 @@ export { CodeReviewAgent } from "../code-review";
|
|
|
9
9
|
export { FastTriageAgent } from "../fast-triage";
|
|
10
10
|
export { TriageAgent } from "../triage";
|
|
11
11
|
export { ChatAgent } from "./index";
|
|
12
|
-
export { fetchToolCallFromId,
|
|
12
|
+
export { fetchToolCallFromId, LATEST_CHAT_STATE_VERSION } from "./state";
|
|
13
13
|
export { extractAttachments } from "./utils";
|
|
14
14
|
//# sourceMappingURL=exports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/exports.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/exports.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.extractAttachments = exports.LATEST_CHAT_STATE_VERSION = exports.
|
|
3
|
+
exports.extractAttachments = exports.LATEST_CHAT_STATE_VERSION = exports.fetchToolCallFromId = exports.ChatAgent = exports.TriageAgent = exports.FastTriageAgent = exports.CodeReviewAgent = exports.BaseAgent = exports.viewFileUsingGitHub = exports.getFileInfoFromGitHub = exports.SUPPORTED_CHAT_MODELS = exports.createChatModel = void 0;
|
|
4
4
|
var chat_1 = require("@empiricalrun/llm/chat");
|
|
5
5
|
Object.defineProperty(exports, "createChatModel", { enumerable: true, get: function () { return chat_1.createChatModel; } });
|
|
6
6
|
var constants_1 = require("@empiricalrun/llm/chat/constants");
|
|
@@ -20,7 +20,6 @@ var index_1 = require("./index");
|
|
|
20
20
|
Object.defineProperty(exports, "ChatAgent", { enumerable: true, get: function () { return index_1.ChatAgent; } });
|
|
21
21
|
var state_1 = require("./state");
|
|
22
22
|
Object.defineProperty(exports, "fetchToolCallFromId", { enumerable: true, get: function () { return state_1.fetchToolCallFromId; } });
|
|
23
|
-
Object.defineProperty(exports, "getLatestDownloadBuildUrl", { enumerable: true, get: function () { return state_1.getLatestDownloadBuildUrl; } });
|
|
24
23
|
Object.defineProperty(exports, "LATEST_CHAT_STATE_VERSION", { enumerable: true, get: function () { return state_1.LATEST_CHAT_STATE_VERSION; } });
|
|
25
24
|
var utils_1 = require("./utils");
|
|
26
25
|
Object.defineProperty(exports, "extractAttachments", { enumerable: true, get: function () { return utils_1.extractAttachments; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAsBpE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMpC,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,IAAI,WAAW;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAsBpE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAMpC,qBAAa,SAAS,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,IAAI,WAAW;IA2B3B,iBAAiB,CACrB,eAAe,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC;CAwGnB"}
|
package/dist/agent/chat/index.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ChatAgent = void 0;
|
|
4
4
|
const tools_1 = require("../../tools");
|
|
5
|
+
const api_client_1 = require("../../tools/api-client");
|
|
5
6
|
const analyse_video_1 = require("../../tools/definitions/analyse-video");
|
|
6
|
-
const download_build_1 = require("../../tools/definitions/download-build");
|
|
7
7
|
const grep_1 = require("../../tools/definitions/grep");
|
|
8
8
|
const list_tests_and_projects_1 = require("../../tools/definitions/list-tests-and-projects");
|
|
9
9
|
const run_test_1 = require("../../tools/definitions/run-test");
|
|
@@ -18,17 +18,18 @@ const test_case_def_1 = require("./prompt/test-case-def");
|
|
|
18
18
|
const trace_utils_docs_1 = require("./prompt/trace-utils-docs");
|
|
19
19
|
class ChatAgent extends base_1.BaseAgent {
|
|
20
20
|
getTools() {
|
|
21
|
+
const useAPIClientTool = this.featureFlags.includes("useAPIClientTool");
|
|
21
22
|
const custom = [
|
|
22
23
|
analyse_video_1.analyseVideo,
|
|
23
24
|
run_test_1.runTestTool,
|
|
24
25
|
grep_1.grepTool,
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
...(useAPIClientTool
|
|
27
|
+
? [api_client_1.apiClientTool]
|
|
28
|
+
: [list_environments_1.listEnvironmentsTool, test_run_fetcher_1.fetchTestRunDetailsTool]),
|
|
27
29
|
fetch_file_1.fetchFileTool,
|
|
28
30
|
list_tests_and_projects_1.listProjectsTool,
|
|
29
31
|
list_tests_and_projects_1.listTestsForProjectTool,
|
|
30
32
|
...tools_1.testGenerationTools,
|
|
31
|
-
test_run_fetcher_1.fetchTestRunDetailsTool,
|
|
32
33
|
diagnosis_fetcher_1.fetchDiagnosisReportTool,
|
|
33
34
|
...(0, tools_1.textEditorToolsForModel)(this.selectedModel),
|
|
34
35
|
tools_1.safeBashTool,
|
|
@@ -45,7 +46,6 @@ class ChatAgent extends base_1.BaseAgent {
|
|
|
45
46
|
async buildSystemPrompt(repoInfoBuilder) {
|
|
46
47
|
const repoInfo = await repoInfoBuilder();
|
|
47
48
|
const repoContext = await (0, repo_1.getRepoContextPrompt)(repoInfo);
|
|
48
|
-
const hasTraceUtils = this.featureFlags.includes("enableTraceUtilsViaBash");
|
|
49
49
|
const preamble = `
|
|
50
50
|
You are a helpful assistant that can answer questions and help with tasks related to writing and maintaining Playwright tests.
|
|
51
51
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../../src/agent/chat/prompt/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAoF/D,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,mBA8B5D"}
|
|
@@ -6,6 +6,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.getRepoContextPrompt = getRepoContextPrompt;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const repo_tree_1 = require("../../../utils/repo-tree");
|
|
9
|
+
async function environmentsYamlSection(directory) {
|
|
10
|
+
if (directory.type !== "directory") {
|
|
11
|
+
return "";
|
|
12
|
+
}
|
|
13
|
+
const empiricalrunDir = directory.children.find((child) => child.type === "directory" && child.path === ".empiricalrun");
|
|
14
|
+
if (!empiricalrunDir || empiricalrunDir.type !== "directory") {
|
|
15
|
+
return "";
|
|
16
|
+
}
|
|
17
|
+
const envFile = empiricalrunDir.children.find((child) => child.type === "file" &&
|
|
18
|
+
path_1.default.basename(child.path) === "ENVIRONMENTS.yaml");
|
|
19
|
+
if (!envFile || envFile.type !== "file") {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
const content = await envFile.getContent();
|
|
23
|
+
return `## Environments
|
|
24
|
+
|
|
25
|
+
The repo is configured to run tests for these environments with .empiricalrun/ENVIRONMENTS.yaml (see docs: https://docs.empirical.run/agents/env-vars)
|
|
26
|
+
|
|
27
|
+
\`\`\`yaml
|
|
28
|
+
${content}
|
|
29
|
+
\`\`\``;
|
|
30
|
+
}
|
|
9
31
|
async function getAllMarkdownFiles(directory) {
|
|
10
32
|
if (directory.type !== "directory") {
|
|
11
33
|
return [];
|
|
@@ -60,6 +82,8 @@ While specifying paths to files, prefer using absolute paths with the /repo/ pre
|
|
|
60
82
|
- Preferred: "/repo/tests/lesson.spec.ts" (absolute path with /repo/ prefix)
|
|
61
83
|
- Also supported: "tests/lesson.spec.ts" (relative path from repository root)
|
|
62
84
|
- Incorrect: "/${repoInfo.name}/tests/lesson.spec.ts" (wrong prefix)
|
|
85
|
+
|
|
86
|
+
${await environmentsYamlSection(repoInfo)}
|
|
63
87
|
`;
|
|
64
88
|
const knowledge = await knowledgeContext(repoInfo);
|
|
65
89
|
if (knowledge.length > 0) {
|
|
@@ -18,7 +18,6 @@ export declare function loadChatState<T>({ resetChat, }: {
|
|
|
18
18
|
resetChat: boolean;
|
|
19
19
|
}): ChatStateGeneric<T> | undefined;
|
|
20
20
|
export declare function saveToDisk<T>(chatState: ChatStateGeneric<T>): void;
|
|
21
|
-
export declare function getLatestDownloadBuildUrl(messages: CanonicalMessage[]): string | null;
|
|
22
21
|
export declare function fetchToolCallFromId(toolCallId: String, messages: CanonicalMessage[]): {
|
|
23
22
|
toolCallQueuedAt: Date | undefined;
|
|
24
23
|
toolCall: PendingToolCall | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,eAAe,EAEf,UAAU,EACX,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/agent/chat/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,eAAe,EAEf,UAAU,EACX,MAAM,uCAAuC,CAAC;AAI/C,eAAO,MAAM,kCAAkC,EAAE,MAAM,CACrD,MAAM,EACN,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAGpB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C,eAAO,MAAM,eAAe,QAI3B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EACpC,SAAS,EACT,KAAK,GACN,EAAE;IACD,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CAC9B;;;;;;EAQA;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,gBAAgB,EAClD,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC7B,MAAM,CA4BR;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAC/B,SAAS,GACV,EAAE;IACD,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS,CAoBlC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,QAQ3D;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,gBAAgB,EAAE,GAC3B;IACD,gBAAgB,EAAE,IAAI,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;CACpC,CA0BA"}
|
package/dist/agent/chat/state.js
CHANGED
|
@@ -8,7 +8,6 @@ exports.chatStateFromModel = chatStateFromModel;
|
|
|
8
8
|
exports.getUsageSummary = getUsageSummary;
|
|
9
9
|
exports.loadChatState = loadChatState;
|
|
10
10
|
exports.saveToDisk = saveToDisk;
|
|
11
|
-
exports.getLatestDownloadBuildUrl = getLatestDownloadBuildUrl;
|
|
12
11
|
exports.fetchToolCallFromId = fetchToolCallFromId;
|
|
13
12
|
const fs_1 = __importDefault(require("fs"));
|
|
14
13
|
const path_1 = __importDefault(require("path"));
|
|
@@ -77,33 +76,6 @@ function saveToDisk(chatState) {
|
|
|
77
76
|
}
|
|
78
77
|
fs_1.default.writeFileSync(statePath, JSON.stringify(chatState, null, 2));
|
|
79
78
|
}
|
|
80
|
-
function findLatestToolCall(messages, toolName) {
|
|
81
|
-
return messages
|
|
82
|
-
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
83
|
-
.find((m) => m.parts.some((p) => "toolCall" in p && p.toolCall?.name === toolName));
|
|
84
|
-
}
|
|
85
|
-
function findSuccessfulToolResponse(messages, toolCallId) {
|
|
86
|
-
return messages.find((m) => m.parts.some((p) => {
|
|
87
|
-
if ("toolResult" in p) {
|
|
88
|
-
return p.toolCallId === toolCallId && !p.toolResult.isError;
|
|
89
|
-
}
|
|
90
|
-
return false;
|
|
91
|
-
}));
|
|
92
|
-
}
|
|
93
|
-
function getLatestDownloadBuildUrl(messages) {
|
|
94
|
-
const toolCallMessage = findLatestToolCall(messages, "downloadBuild");
|
|
95
|
-
if (!toolCallMessage)
|
|
96
|
-
return null;
|
|
97
|
-
const toolCallPart = toolCallMessage.parts.find((p) => "toolCall" in p && p.toolCall?.name === "downloadBuild");
|
|
98
|
-
if (!toolCallPart || !("toolCall" in toolCallPart))
|
|
99
|
-
return null;
|
|
100
|
-
const toolCallId = toolCallPart.toolCall.id;
|
|
101
|
-
const toolResponseMessage = findSuccessfulToolResponse(messages, toolCallId);
|
|
102
|
-
if (!toolResponseMessage)
|
|
103
|
-
return null;
|
|
104
|
-
const input = toolCallPart.toolCall.input;
|
|
105
|
-
return input.buildUrl;
|
|
106
|
-
}
|
|
107
79
|
function fetchToolCallFromId(toolCallId, messages) {
|
|
108
80
|
const toolCallMessage = messages.find((message) => message.parts.some((part) => {
|
|
109
81
|
return "toolCall" in part && part.toolCallId === toolCallId;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const cua_1 = require("@empiricalrun/cua");
|
|
4
4
|
const fixtures_1 = require("./fixtures");
|
|
5
5
|
fixtures_1.test.skip("computer use agent generates code for iframes", async ({ page, server, }) => {
|
|
6
6
|
await page.goto(`${server.baseURL}/iframe-elements.html`);
|
|
7
|
-
const result = await (0,
|
|
7
|
+
const result = await (0, cua_1.createTestUsingComputerUseAgent)({
|
|
8
8
|
page,
|
|
9
9
|
task: `Click on both of the "Enter your name" input fields`,
|
|
10
10
|
});
|
|
@@ -13,7 +13,7 @@ fixtures_1.test.skip("computer use agent generates code for iframes", async ({ p
|
|
|
13
13
|
});
|
|
14
14
|
fixtures_1.test.skip("computer use agent generates code for google login", async ({ page, }) => {
|
|
15
15
|
await page.goto(`https://dash.empirical.run`);
|
|
16
|
-
const result = await (0,
|
|
16
|
+
const result = await (0, cua_1.createTestUsingComputerUseAgent)({
|
|
17
17
|
page,
|
|
18
18
|
task: `Click on the "Sign in with Google" button and enter dpdzero-test-user@empirical.run
|
|
19
19
|
as the email and click continue. then enter password as 1234556789`,
|
|
@@ -1,81 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const utils_1 = require("../../browsing/utils");
|
|
9
|
-
const element_annotation_1 = require("../element-annotation");
|
|
10
|
-
const run_1 = require("../run");
|
|
3
|
+
const cua_1 = require("@empiricalrun/cua");
|
|
11
4
|
const fixtures_1 = require("./fixtures");
|
|
12
|
-
fixtures_1.test.skip("able to scroll and interact with elements", async ({ page, server, }) => {
|
|
13
|
-
await page.goto(`${server.baseURL}/blog-page.html`);
|
|
14
|
-
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
15
|
-
task: `fill test@test.com into the email field and click the submit`,
|
|
16
|
-
page,
|
|
17
|
-
options: {},
|
|
18
|
-
});
|
|
19
|
-
console.log(response);
|
|
20
|
-
(0, fixtures_1.expect)(response.importPaths.length).toBe(0);
|
|
21
|
-
(0, fixtures_1.expect)(response.code).toContain("await page.getByPlaceholder('Enter your email').fill(\"test@test.com\")");
|
|
22
|
-
(0, fixtures_1.expect)(response.code).toContain("await page.getByRole('button', { name: 'Subscribe' }).click()");
|
|
23
|
-
});
|
|
24
|
-
fixtures_1.test.skip("scroll when element does not exist", async ({ page, server }) => {
|
|
25
|
-
await page.goto(`${server.baseURL}/blog-page.html`);
|
|
26
|
-
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
27
|
-
task: `click search button`,
|
|
28
|
-
page,
|
|
29
|
-
options: {},
|
|
30
|
-
});
|
|
31
|
-
console.log(response);
|
|
32
|
-
(0, fixtures_1.expect)(response.importPaths.length).toBe(0);
|
|
33
|
-
(0, fixtures_1.expect)(response.code.length).toBe(0);
|
|
34
|
-
});
|
|
35
|
-
fixtures_1.test.skip("scroll and click inside div elements", async ({ page, server }) => {
|
|
36
|
-
await page.goto(`${server.baseURL}/dropdown-scrolls.html`);
|
|
37
|
-
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
38
|
-
task: `click on x-3 inside bmw dropdown, and then,
|
|
39
|
-
click on maverick inside ford dropdown`,
|
|
40
|
-
page,
|
|
41
|
-
options: {},
|
|
42
|
-
});
|
|
43
|
-
console.log(response);
|
|
44
|
-
(0, fixtures_1.expect)(response.importPaths.length).toBe(0);
|
|
45
|
-
(0, fixtures_1.expect)(response.code.length).toBeGreaterThan(0);
|
|
46
|
-
const lines = response.code.split("\n");
|
|
47
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page.+BMW.+.click/))).toBeTruthy();
|
|
48
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page.+X3.+.click/))).toBeTruthy();
|
|
49
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page.+Ford.+.click/))).toBeTruthy();
|
|
50
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page.+Maverick.+.click/))).toBeTruthy();
|
|
51
|
-
});
|
|
52
|
-
fixtures_1.test.skip("master agent can click icons accurately", async ({ page, server, }) => {
|
|
53
|
-
await page.goto(`${server.baseURL}/icons-navbar.html`);
|
|
54
|
-
await (0, fixtures_1.expect)(page.getByText("select an icon")).toBeVisible();
|
|
55
|
-
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
56
|
-
task: `click on the gear icon`,
|
|
57
|
-
page,
|
|
58
|
-
options: {},
|
|
59
|
-
});
|
|
60
|
-
// Validate code generated and action performed
|
|
61
|
-
await (0, fixtures_1.expect)(page.getByText("you clicked Gear")).toBeVisible();
|
|
62
|
-
console.log(response);
|
|
63
|
-
(0, fixtures_1.expect)(response.importPaths.length).toBe(0);
|
|
64
|
-
(0, fixtures_1.expect)(response.code).toContain("page.locator");
|
|
65
|
-
(0, fixtures_1.expect)(response.code).toContain("click()");
|
|
66
|
-
// Validate icons registry
|
|
67
|
-
const iconsRegistryFile = path_1.default.join(process.cwd(), ".empiricalrun", "icons.json");
|
|
68
|
-
const icons = JSON.parse(fs_1.default.readFileSync(iconsRegistryFile, "utf-8"));
|
|
69
|
-
(0, fixtures_1.expect)(icons.length).toBeGreaterThan(0);
|
|
70
|
-
// Commenting out this check since with parallel test executions,
|
|
71
|
-
// we can have icons from other tests in the same file
|
|
72
|
-
// expect(icons.length).toBe(4); // 1 for each unique icon
|
|
73
|
-
fs_1.default.unlinkSync(iconsRegistryFile);
|
|
74
|
-
});
|
|
75
5
|
fixtures_1.test.skip("cua agent can click icons accurately", async ({ page, server }) => {
|
|
76
6
|
await page.goto(`${server.baseURL}/icons-navbar.html`);
|
|
77
7
|
await (0, fixtures_1.expect)(page.getByText("select an icon")).toBeVisible();
|
|
78
|
-
const response = await (0,
|
|
8
|
+
const response = await (0, cua_1.createTestUsingComputerUseAgent)({
|
|
79
9
|
task: `click on the gear icon`,
|
|
80
10
|
page,
|
|
81
11
|
});
|
|
@@ -86,42 +16,3 @@ fixtures_1.test.skip("cua agent can click icons accurately", async ({ page, serv
|
|
|
86
16
|
(0, fixtures_1.expect)(response.code).toContain("page.locator");
|
|
87
17
|
(0, fixtures_1.expect)(response.code).toContain("click()");
|
|
88
18
|
});
|
|
89
|
-
fixtures_1.test.skip("annotate and enrich annotations correctly", async ({ page, server, }) => {
|
|
90
|
-
await (0, utils_1.injectPwLocatorGenerator)(page);
|
|
91
|
-
await page.goto(`${server.baseURL}/iframe-elements.html`);
|
|
92
|
-
const { annotationKeys: keys } = await (0, element_annotation_1.getAnnotationKeys)({
|
|
93
|
-
page,
|
|
94
|
-
preference: {
|
|
95
|
-
actionType: "all",
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
console.log(keys);
|
|
99
|
-
(0, fixtures_1.expect)(keys.length).toBe(6);
|
|
100
|
-
// 2 icons: 1 in main frame, 1 in iframe
|
|
101
|
-
(0, fixtures_1.expect)(keys.filter((k) => k.text.includes("icon") && k.text.includes("close"))
|
|
102
|
-
.length).toBe(2);
|
|
103
|
-
// 2 text inputs: 1 in main frame, 1 in iframe
|
|
104
|
-
(0, fixtures_1.expect)(keys.filter((k) => k.text.includes("Enter your name")).length).toBe(2);
|
|
105
|
-
// 2 clickable divs: 1 in main frame, 1 in iframe
|
|
106
|
-
(0, fixtures_1.expect)(keys.filter((k) => k.text.includes("Lorem Ipsum")).length).toBe(2);
|
|
107
|
-
});
|
|
108
|
-
fixtures_1.test.skip("fill action with multiple pages", async ({ context }) => {
|
|
109
|
-
const page1 = await context.newPage();
|
|
110
|
-
const page2 = await context.newPage();
|
|
111
|
-
const response = await (0, run_1.createTestUsingMasterAgent)({
|
|
112
|
-
task: `goto empirical.run on page1 and goto github.com/search in page2. Enter text empirical on page2 and click on search.`,
|
|
113
|
-
page: page2,
|
|
114
|
-
options: {},
|
|
115
|
-
scopeVars: {
|
|
116
|
-
context,
|
|
117
|
-
page1,
|
|
118
|
-
page2,
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
(0, fixtures_1.expect)(response.code).toBeTruthy();
|
|
122
|
-
console.log(response.code);
|
|
123
|
-
const lines = response.code.split("\n");
|
|
124
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page1\.goto(.+)empirical\.run/))).toBeTruthy();
|
|
125
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page2\.goto(.+)github\.com\/search/))).toBeTruthy();
|
|
126
|
-
(0, fixtures_1.expect)(lines.find((l) => l.match(/^await page2(.+)fill(.+)empirical/))).toBeTruthy();
|
|
127
|
-
});
|
|
@@ -2,7 +2,6 @@ import type { TestGenConfigOptions } from "@empiricalrun/shared-types/agent-work
|
|
|
2
2
|
import type { TestCaseWithSuitesAsArray } from "@empiricalrun/shared-types/api/test-cases";
|
|
3
3
|
import { Page } from "playwright";
|
|
4
4
|
import { ScopeVars } from "../../types";
|
|
5
|
-
export { createTestUsingComputerUseAgent } from "@empiricalrun/cua";
|
|
6
5
|
export declare const IS_ALLOWED_TO_USE_SKILLS = false;
|
|
7
6
|
export declare function createTestUsingMasterAgent({ task, page, testCase, specPath, options, scopeVars, }: {
|
|
8
7
|
task: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYlC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/agent/master/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYlC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWxC,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAqB9C,wBAAsB,0BAA0B,CAAC,EAC/C,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;;;GAwJA"}
|
package/dist/agent/master/run.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.IS_ALLOWED_TO_USE_SKILLS =
|
|
3
|
+
exports.IS_ALLOWED_TO_USE_SKILLS = void 0;
|
|
4
4
|
exports.createTestUsingMasterAgent = createTestUsingMasterAgent;
|
|
5
5
|
const llm_1 = require("@empiricalrun/llm");
|
|
6
6
|
const actions_1 = require("../../actions");
|
|
@@ -15,8 +15,6 @@ const run_time_planner_1 = require("../planner/run-time-planner");
|
|
|
15
15
|
const action_tool_calls_1 = require("./action-tool-calls");
|
|
16
16
|
const execute_browser_action_1 = require("./execute-browser-action");
|
|
17
17
|
const next_action_1 = require("./next-action");
|
|
18
|
-
var cua_1 = require("@empiricalrun/cua");
|
|
19
|
-
Object.defineProperty(exports, "createTestUsingComputerUseAgent", { enumerable: true, get: function () { return cua_1.createTestUsingComputerUseAgent; } });
|
|
20
18
|
const MAX_ERROR_COUNT = 2;
|
|
21
19
|
// Disabling skills as we're seeing false usage with chat agent
|
|
22
20
|
exports.IS_ALLOWED_TO_USE_SKILLS = false;
|
package/dist/bin/index.js
CHANGED
|
@@ -14,7 +14,6 @@ const client_1 = require("../dashboard/client");
|
|
|
14
14
|
const recorder_1 = require("../recorder");
|
|
15
15
|
const validation_1 = require("../recorder/validation");
|
|
16
16
|
const test_build_1 = require("../test-build");
|
|
17
|
-
const environments_1 = require("./environments");
|
|
18
17
|
const setup_1 = require("./setup");
|
|
19
18
|
const utils_1 = require("./utils");
|
|
20
19
|
dotenv_1.default.config({
|
|
@@ -132,17 +131,6 @@ async function main() {
|
|
|
132
131
|
await (0, setup_1.runSetup)({ apiClient, repoName: opts.repoName });
|
|
133
132
|
process.exit(0);
|
|
134
133
|
});
|
|
135
|
-
program
|
|
136
|
-
.command("environments")
|
|
137
|
-
.description("List environments and their latest builds")
|
|
138
|
-
.option("--auth-type <type>", 'Use "user-access-token" or "project-api-key"', "user-access-token")
|
|
139
|
-
.action(async (opts) => {
|
|
140
|
-
const apiClient = new client_1.DashboardAPIClient({
|
|
141
|
-
authType: opts.authType,
|
|
142
|
-
});
|
|
143
|
-
await (0, environments_1.listEnvironments)({ apiClient, repoPath: process.cwd() });
|
|
144
|
-
process.exit(0);
|
|
145
|
-
});
|
|
146
134
|
program
|
|
147
135
|
.command("download-build")
|
|
148
136
|
.description("Download a build from a URL")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../../src/file-info/adapters/github/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAwB/E,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;gBADT,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB;IAGlC,iBAAiB,CACrB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAoBZ,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../../src/file-info/adapters/github/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAwB/E,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;gBADT,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB;IAGlC,iBAAiB,CACrB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC;IAoBZ,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAoDnB,aAAa;CAoD5B;AAyED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,QAAQ,CAAC,CAwFnB"}
|
|
@@ -44,6 +44,16 @@ class GitHubFileReader {
|
|
|
44
44
|
console.log(`[GitHubFileReader] Reading as directory: ${filePath}`);
|
|
45
45
|
return this.readDirectory(filePath, resolvedBranch);
|
|
46
46
|
}
|
|
47
|
+
// For dotfiles without extensions (e.g. .empiricalrun, .github), we can't
|
|
48
|
+
// tell if they're files or directories by name alone. Try directory first
|
|
49
|
+
// since that API is faster and won't hang for misclassified paths.
|
|
50
|
+
if (isDotfile(filePath) && !path_1.default.extname(filePath)) {
|
|
51
|
+
console.log(`[GitHubFileReader] Dotfile without extension, trying directory first: ${filePath}`);
|
|
52
|
+
const dirResult = await this.readDirectory(filePath, resolvedBranch);
|
|
53
|
+
if (dirResult) {
|
|
54
|
+
return dirResult;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
47
57
|
try {
|
|
48
58
|
console.log(`[GitHubFileReader] Reading as file: ${filePath}, resolved branch: ${resolvedBranch}`);
|
|
49
59
|
const params = {
|
|
@@ -62,12 +72,10 @@ class GitHubFileReader {
|
|
|
62
72
|
};
|
|
63
73
|
}
|
|
64
74
|
console.log(`[GitHubFileReader] File not available: ${filePath}`);
|
|
65
|
-
// For file paths (with extensions), don't fall back to directory reading
|
|
66
75
|
return null;
|
|
67
76
|
}
|
|
68
77
|
catch (error) {
|
|
69
78
|
console.log(`[GitHubFileReader] Error reading file ${filePath}:`, error);
|
|
70
|
-
// For file paths, return null (file not found)
|
|
71
79
|
return null;
|
|
72
80
|
}
|
|
73
81
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { FrameLocator, Page } from "playwright";
|
|
2
2
|
import { ScopeVars } from "./types";
|
|
3
|
-
export { downloadBuild } from "./test-build";
|
|
4
3
|
export { extractFileFromZipFromUrl, getFilenamesInZip, } from "./tools/trace-dot-zip/utils/extract-zip";
|
|
5
4
|
export { generateNetworkTrace } from "./tools/trace-dot-zip/utils/network-trace";
|
|
6
|
-
export declare function createTest(task: string, pageRef: Page | FrameLocator,
|
|
5
|
+
export declare function createTest(task: string, pageRef: Page | FrameLocator, _scope?: ScopeVars): Promise<void>;
|
|
7
6
|
export declare function recordTest(pageRef: Page): Promise<void>;
|
|
8
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAcjF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,GAAG,YAAY,EAC5B,MAAM,CAAC,EAAE,SAAS,iBAyCnB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,IAAI,iBAY7C"}
|