@empiricalrun/test-gen 0.72.0 → 0.73.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.
- package/CHANGELOG.md +28 -0
- package/dist/agent/chat/agent-loop.d.ts.map +1 -1
- package/dist/agent/chat/agent-loop.js +1 -0
- package/dist/agent/chat/index.d.ts.map +1 -1
- package/dist/agent/chat/index.js +12 -22
- package/dist/agent/chat/prompt/index.d.ts.map +1 -1
- package/dist/agent/chat/prompt/index.js +3 -2
- package/dist/agent/code-review/prompt.d.ts +2 -0
- package/dist/agent/code-review/prompt.d.ts.map +1 -0
- package/dist/agent/code-review/prompt.js +19 -0
- package/dist/agent/codegen/create-test-block.d.ts.map +1 -1
- package/dist/agent/codegen/create-test-block.js +0 -10
- package/dist/agent/diagnosis-agent/index.d.ts.map +1 -1
- package/dist/agent/diagnosis-agent/index.js +0 -9
- package/dist/agent/master/execute-browser-action.d.ts +1 -1
- package/dist/agent/master/execute-browser-action.d.ts.map +1 -1
- package/dist/agent/master/execute-skill-action.d.ts +1 -1
- package/dist/agent/master/execute-skill-action.d.ts.map +1 -1
- package/dist/agent/master/run.d.ts.map +1 -1
- package/dist/agent/master/run.js +0 -74
- package/dist/artifacts/index.d.ts.map +1 -1
- package/dist/artifacts/index.js +18 -6
- package/dist/artifacts/utils.d.ts +2 -2
- package/dist/artifacts/utils.d.ts.map +1 -1
- package/dist/artifacts/utils.js +16 -5
- package/dist/auth/cli-auth.d.ts.map +1 -1
- package/dist/auth/cli-auth.js +3 -7
- package/dist/auth/index.d.ts +1 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +2 -4
- package/dist/auth/token-store.d.ts +1 -1
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +3 -3
- package/dist/bin/environments.d.ts +5 -1
- package/dist/bin/environments.d.ts.map +1 -1
- package/dist/bin/environments.js +9 -11
- package/dist/bin/index.js +33 -74
- package/dist/bin/setup.d.ts +3 -1
- package/dist/bin/setup.d.ts.map +1 -1
- package/dist/bin/setup.js +6 -10
- package/dist/dashboard/client.d.ts +26 -0
- package/dist/dashboard/client.d.ts.map +1 -0
- package/dist/dashboard/client.js +185 -0
- package/dist/dashboard/index.d.ts +2 -20
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -81
- package/dist/dashboard/totp.d.ts +1 -1
- package/dist/dashboard/totp.d.ts.map +1 -1
- package/dist/dashboard/totp.js +2 -6
- package/dist/dashboard/types.d.ts +9 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +17 -0
- package/dist/file-info/github.d.ts +2 -2
- package/dist/file-info/github.d.ts.map +1 -1
- package/dist/file-info/github.js +9 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -9
- package/dist/recorder/env-variables.d.ts.map +1 -1
- package/dist/recorder/env-variables.js +3 -7
- package/dist/recorder/index.js +5 -5
- package/dist/recorder/request.js +4 -9
- package/dist/recorder/upload.d.ts +3 -2
- package/dist/recorder/upload.d.ts.map +1 -1
- package/dist/recorder/upload.js +20 -22
- package/dist/tools/commit-and-create-pr.d.ts.map +1 -1
- package/dist/tools/commit-and-create-pr.js +42 -35
- package/dist/tools/delete-file.d.ts +3 -0
- package/dist/tools/delete-file.d.ts.map +1 -0
- package/dist/tools/delete-file.js +83 -0
- package/dist/tools/diagnosis-fetcher.d.ts.map +1 -1
- package/dist/tools/diagnosis-fetcher.js +3 -7
- package/dist/tools/executor/index.d.ts +6 -9
- package/dist/tools/executor/index.d.ts.map +1 -1
- package/dist/tools/executor/index.js +23 -29
- package/dist/tools/executor/utils/checkpoint.d.ts +2 -2
- package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
- package/dist/tools/executor/utils/checkpoint.js +6 -5
- package/dist/tools/executor/utils/git.d.ts +7 -12
- package/dist/tools/executor/utils/git.d.ts.map +1 -1
- package/dist/tools/executor/utils/git.js +11 -36
- package/dist/tools/executor/utils/index.d.ts +37 -21
- package/dist/tools/executor/utils/index.d.ts.map +1 -1
- package/dist/tools/executor/utils/index.js +57 -58
- package/dist/tools/executor/utils/pr-description.d.ts +4 -0
- package/dist/tools/executor/utils/pr-description.d.ts.map +1 -0
- package/dist/tools/executor/utils/pr-description.js +24 -0
- package/dist/tools/fetch-image/index.d.ts +3 -0
- package/dist/tools/fetch-image/index.d.ts.map +1 -0
- package/dist/tools/fetch-image/index.js +62 -0
- package/dist/tools/grep/index.d.ts.map +1 -1
- package/dist/tools/grep/index.js +1 -1
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +60 -0
- package/dist/tools/list-environments.d.ts.map +1 -1
- package/dist/tools/list-environments.js +2 -5
- package/dist/tools/merge-conflicts.d.ts +3 -0
- package/dist/tools/merge-conflicts.d.ts.map +1 -0
- package/dist/tools/merge-conflicts.js +107 -0
- package/dist/tools/run-test.d.ts.map +1 -1
- package/dist/tools/run-test.js +2 -2
- package/dist/tools/test-run-fetcher/index.d.ts.map +1 -1
- package/dist/tools/test-run-fetcher/index.js +2 -6
- package/dist/tools/upgrade-packages/index.d.ts.map +1 -1
- package/dist/tools/upgrade-packages/index.js +10 -11
- package/dist/tools/upgrade-packages/utils.d.ts +3 -2
- package/dist/tools/upgrade-packages/utils.d.ts.map +1 -1
- package/dist/tools/upgrade-packages/utils.js +5 -8
- package/dist/tools/utils/queue.d.ts +5 -0
- package/dist/tools/utils/queue.d.ts.map +1 -0
- package/dist/tools/utils/queue.js +41 -0
- package/package.json +5 -5
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/auth/api-client.d.ts +0 -13
- package/dist/auth/api-client.d.ts.map +0 -1
- package/dist/auth/api-client.js +0 -107
- package/dist/session/index.d.ts +0 -20
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -104
- package/dist/tools/definitions/index.d.ts +0 -22
- package/dist/tools/definitions/index.d.ts.map +0 -1
- package/dist/tools/definitions/index.js +0 -61
- package/dist/tools/definitions/utils/queue.d.ts +0 -8
- package/dist/tools/definitions/utils/queue.d.ts.map +0 -1
- package/dist/tools/definitions/utils/queue.js +0 -58
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.deleteFileTool = void 0;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const git_1 = require("./executor/utils/git");
|
|
11
|
+
const DeleteFileInputSchema = zod_1.z.object({
|
|
12
|
+
path: zod_1.z
|
|
13
|
+
.string()
|
|
14
|
+
.describe("The path to the file to delete (relative to the repository root). For example, tests/foo.spec.ts"),
|
|
15
|
+
});
|
|
16
|
+
exports.deleteFileTool = {
|
|
17
|
+
schema: {
|
|
18
|
+
name: "deleteFile",
|
|
19
|
+
description: `Delete a file from the filesystem.
|
|
20
|
+
This tool will permanently remove the specified file.
|
|
21
|
+
Use with caution as deleted files cannot be recovered.`,
|
|
22
|
+
parameters: DeleteFileInputSchema,
|
|
23
|
+
},
|
|
24
|
+
needsBrowser: false,
|
|
25
|
+
execute: async ({ input, repoPath, collectArtifacts, }) => {
|
|
26
|
+
try {
|
|
27
|
+
const filePath = path_1.default.join(repoPath, input.path);
|
|
28
|
+
// Validate that the file exists and is actually a file (not a directory)
|
|
29
|
+
try {
|
|
30
|
+
const stats = await (0, promises_1.stat)(filePath);
|
|
31
|
+
if (!stats.isFile()) {
|
|
32
|
+
return {
|
|
33
|
+
isError: true,
|
|
34
|
+
result: `Error: '${input.path}' is not a file. Use a different tool to delete directories.`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
isError: true,
|
|
41
|
+
result: `Error: File '${input.path}' does not exist.`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const resolvedPath = path_1.default.resolve(filePath);
|
|
45
|
+
const resolvedRepoPath = path_1.default.resolve(repoPath);
|
|
46
|
+
if (!resolvedPath.startsWith(resolvedRepoPath)) {
|
|
47
|
+
return {
|
|
48
|
+
isError: true,
|
|
49
|
+
result: `Error: Cannot delete files outside the repository root.`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
await (0, promises_1.unlink)(filePath);
|
|
53
|
+
// Collect git patch artifact after deletion
|
|
54
|
+
if (collectArtifacts) {
|
|
55
|
+
try {
|
|
56
|
+
const gitPatch = (0, git_1.getGitDiff)(input.path, repoPath);
|
|
57
|
+
if (gitPatch.trim()) {
|
|
58
|
+
const patchArtifact = {
|
|
59
|
+
name: `${path_1.default.basename(input.path, path_1.default.extname(input.path))}_delete.patch`,
|
|
60
|
+
contentType: "text/plain",
|
|
61
|
+
data: Buffer.from(gitPatch, "utf-8"),
|
|
62
|
+
};
|
|
63
|
+
collectArtifacts([patchArtifact]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.warn("Failed to create git patch artifact:", error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
isError: false,
|
|
72
|
+
result: `Successfully deleted file: ${input.path}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error("Error deleting file", error);
|
|
77
|
+
return {
|
|
78
|
+
isError: true,
|
|
79
|
+
result: error instanceof Error ? error.message : String(error),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnosis-fetcher.d.ts","sourceRoot":"","sources":["../../src/tools/diagnosis-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"diagnosis-fetcher.d.ts","sourceRoot":"","sources":["../../src/tools/diagnosis-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAavD,eAAO,MAAM,wBAAwB,EAAE,IAiFtC,CAAC"}
|
|
@@ -7,7 +7,6 @@ exports.fetchDiagnosisReportTool = void 0;
|
|
|
7
7
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const zod_1 = require("zod");
|
|
10
|
-
const utils_1 = require("./executor/utils");
|
|
11
10
|
const DiagnosisSchema = zod_1.z.object({
|
|
12
11
|
diagnosisUrl: zod_1.z
|
|
13
12
|
.string()
|
|
@@ -20,9 +19,7 @@ exports.fetchDiagnosisReportTool = {
|
|
|
20
19
|
parameters: DiagnosisSchema,
|
|
21
20
|
},
|
|
22
21
|
needsBrowser: false,
|
|
23
|
-
execute: async (
|
|
24
|
-
const { input } = params;
|
|
25
|
-
const { repoPath, apiKey } = params;
|
|
22
|
+
execute: async ({ input, repoPath, apiClient }) => {
|
|
26
23
|
const { diagnosisUrl } = input;
|
|
27
24
|
// Extract the slug from the URL - it's the part after the last '--'
|
|
28
25
|
const slug = diagnosisUrl.split("--").pop();
|
|
@@ -34,9 +31,8 @@ exports.fetchDiagnosisReportTool = {
|
|
|
34
31
|
}
|
|
35
32
|
let data = null;
|
|
36
33
|
try {
|
|
37
|
-
data = await
|
|
38
|
-
|
|
39
|
-
apiKey,
|
|
34
|
+
data = await apiClient.request(`/api/diagnosis/${slug}/detailed`, {
|
|
35
|
+
method: "GET",
|
|
40
36
|
});
|
|
41
37
|
}
|
|
42
38
|
catch (error) {
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
import { TraceClient } from "@empiricalrun/llm";
|
|
2
2
|
import { PendingToolCall, ToolResult } from "@empiricalrun/llm/chat";
|
|
3
|
-
import {
|
|
3
|
+
import { ChatSessionInfo, IDashboardAPIClient, ToolExecute } from "@empiricalrun/shared-types";
|
|
4
4
|
export declare class ToolExecutor {
|
|
5
|
-
tools: Tool[];
|
|
6
5
|
toolExecutors: Record<string, ToolExecute>;
|
|
7
|
-
|
|
8
|
-
selectedModel: SupportedChatModels;
|
|
6
|
+
chatSession: ChatSessionInfo | null;
|
|
9
7
|
branchName: string;
|
|
10
8
|
repoPath: string;
|
|
11
|
-
|
|
9
|
+
apiClient: IDashboardAPIClient;
|
|
12
10
|
trace?: TraceClient;
|
|
13
11
|
featureFlags: string[];
|
|
14
12
|
environmentOverrides: Record<string, string>;
|
|
15
|
-
constructor({
|
|
16
|
-
|
|
17
|
-
selectedModel: SupportedChatModels;
|
|
13
|
+
constructor({ chatSession, branchName, repoPath, apiClient, trace, featureFlags, environmentOverrides, }: {
|
|
14
|
+
chatSession: ChatSessionInfo | null;
|
|
18
15
|
branchName: string;
|
|
19
16
|
repoPath: string;
|
|
20
|
-
|
|
17
|
+
apiClient: IDashboardAPIClient;
|
|
21
18
|
trace?: TraceClient;
|
|
22
19
|
featureFlags: string[];
|
|
23
20
|
environmentOverrides?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAEL,eAAe,EACf,mBAAmB,EACnB,WAAW,EACZ,MAAM,4BAA4B,CAAC;AAqBpC,qBAAa,YAAY;IACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAM;IAChD,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEjC,EACV,WAAW,EACX,UAAU,EACV,QAAQ,EACR,SAAS,EACT,KAAK,EACL,YAAY,EACZ,oBAAyB,GAC1B,EAAE;QACD,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,mBAAmB,CAAC;QAC/B,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/C;IAkCK,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAqEnE"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ToolExecutor = void 0;
|
|
4
|
-
const chat_1 = require("@empiricalrun/llm/chat");
|
|
5
4
|
const artifacts_1 = require("../../artifacts");
|
|
6
5
|
const commit_and_create_pr_1 = require("../commit-and-create-pr");
|
|
6
|
+
const delete_file_1 = require("../delete-file");
|
|
7
7
|
const diagnosis_fetcher_1 = require("../diagnosis-fetcher");
|
|
8
8
|
const download_build_1 = require("../download-build");
|
|
9
|
+
const fetch_image_1 = require("../fetch-image");
|
|
9
10
|
const grep_1 = require("../grep");
|
|
10
11
|
const list_environments_1 = require("../list-environments");
|
|
12
|
+
const merge_conflicts_1 = require("../merge-conflicts");
|
|
11
13
|
const run_test_1 = require("../run-test");
|
|
12
14
|
const str_replace_editor_1 = require("../str_replace_editor");
|
|
13
15
|
const test_gen_browser_1 = require("../test-gen-browser");
|
|
@@ -15,50 +17,46 @@ const test_run_fetcher_1 = require("../test-run-fetcher");
|
|
|
15
17
|
const upgrade_packages_1 = require("../upgrade-packages");
|
|
16
18
|
const checkpoint_1 = require("./utils/checkpoint");
|
|
17
19
|
class ToolExecutor {
|
|
18
|
-
tools = [];
|
|
19
20
|
toolExecutors = {};
|
|
20
|
-
|
|
21
|
-
selectedModel;
|
|
21
|
+
chatSession;
|
|
22
22
|
branchName;
|
|
23
23
|
repoPath;
|
|
24
|
-
|
|
24
|
+
apiClient;
|
|
25
25
|
trace;
|
|
26
26
|
featureFlags;
|
|
27
27
|
environmentOverrides;
|
|
28
|
-
constructor({
|
|
29
|
-
this.
|
|
30
|
-
this.selectedModel = selectedModel;
|
|
28
|
+
constructor({ chatSession, branchName, repoPath, apiClient, trace, featureFlags, environmentOverrides = {}, }) {
|
|
29
|
+
this.chatSession = chatSession;
|
|
31
30
|
this.branchName = branchName;
|
|
32
31
|
this.trace = trace;
|
|
33
32
|
this.repoPath = repoPath;
|
|
34
|
-
this.
|
|
33
|
+
this.apiClient = apiClient;
|
|
35
34
|
this.featureFlags = featureFlags;
|
|
36
35
|
this.environmentOverrides = environmentOverrides;
|
|
37
|
-
|
|
36
|
+
const tools = [
|
|
38
37
|
grep_1.grepTool,
|
|
39
38
|
run_test_1.runTestTool,
|
|
40
39
|
test_run_fetcher_1.fetchTestRunReportTool,
|
|
41
40
|
diagnosis_fetcher_1.fetchDiagnosisReportTool,
|
|
42
41
|
test_gen_browser_1.generateTestWithBrowserAgent,
|
|
43
42
|
commit_and_create_pr_1.createPullRequestTool,
|
|
43
|
+
merge_conflicts_1.mergeConflictsTool,
|
|
44
44
|
list_environments_1.listEnvironmentsTool,
|
|
45
45
|
download_build_1.downloadBuildTool,
|
|
46
46
|
upgrade_packages_1.upgradePackagesTool,
|
|
47
|
+
fetch_image_1.fetchImageTool,
|
|
48
|
+
delete_file_1.deleteFileTool,
|
|
49
|
+
...str_replace_editor_1.textEditorTools,
|
|
47
50
|
];
|
|
48
|
-
|
|
49
|
-
this.tools.push(...str_replace_editor_1.textEditorTools);
|
|
50
|
-
}
|
|
51
|
-
this.tools.forEach((tool) => {
|
|
51
|
+
tools.forEach((tool) => {
|
|
52
52
|
this.toolExecutors[tool.schema.name] = tool.execute;
|
|
53
53
|
});
|
|
54
|
-
|
|
55
|
-
this.toolExecutors
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
};
|
|
61
|
-
}
|
|
54
|
+
this.toolExecutors = {
|
|
55
|
+
...this.toolExecutors,
|
|
56
|
+
// Support for Claude 3x and 4: They use different tool names
|
|
57
|
+
str_replace_editor: str_replace_editor_1.strReplaceEditorExecutor,
|
|
58
|
+
str_replace_based_edit_tool: str_replace_editor_1.strReplaceEditorExecutor,
|
|
59
|
+
};
|
|
62
60
|
}
|
|
63
61
|
async execute(toolCalls) {
|
|
64
62
|
const executeSpan = this.trace?.span({
|
|
@@ -76,7 +74,6 @@ class ToolExecutor {
|
|
|
76
74
|
uploadArtifactsQueue.addTask(artifactsInput).catch((error) => {
|
|
77
75
|
console.error("Error collecting artifacts:", error);
|
|
78
76
|
});
|
|
79
|
-
return;
|
|
80
77
|
};
|
|
81
78
|
const toolExecutor = this.toolExecutors[toolCall.name];
|
|
82
79
|
if (!toolExecutor) {
|
|
@@ -89,16 +86,13 @@ class ToolExecutor {
|
|
|
89
86
|
span?.end({ output: errorResult });
|
|
90
87
|
continue;
|
|
91
88
|
}
|
|
92
|
-
if (!this.apiKey) {
|
|
93
|
-
throw new Error("API key is required for tool execution");
|
|
94
|
-
}
|
|
95
89
|
try {
|
|
96
90
|
const result = await toolExecutor({
|
|
97
91
|
input: toolCall.input,
|
|
98
92
|
repoPath: this.repoPath,
|
|
99
|
-
|
|
93
|
+
apiClient: this.apiClient,
|
|
100
94
|
trace: this.trace,
|
|
101
|
-
|
|
95
|
+
chatSession: this.chatSession,
|
|
102
96
|
collectArtifacts: collectArtifactsFn,
|
|
103
97
|
environmentOverrides: this.environmentOverrides,
|
|
104
98
|
featureFlags: this.featureFlags,
|
|
@@ -117,7 +111,7 @@ class ToolExecutor {
|
|
|
117
111
|
span?.end({ output: errorResult });
|
|
118
112
|
}
|
|
119
113
|
}
|
|
120
|
-
|
|
114
|
+
(0, checkpoint_1.createCommitCheckpoint)({
|
|
121
115
|
toolCalls,
|
|
122
116
|
branchName: this.branchName,
|
|
123
117
|
repoPath: this.repoPath,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PendingToolCall } from "@empiricalrun/llm/chat";
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function createCommitCheckpoint({ toolCalls, branchName, repoPath, }: {
|
|
3
3
|
toolCalls: PendingToolCall[];
|
|
4
4
|
branchName: string;
|
|
5
5
|
repoPath: string;
|
|
6
|
-
}):
|
|
6
|
+
}): void;
|
|
7
7
|
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD,wBAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,UAAU,EACV,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,QA0BA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createCommitCheckpoint = createCommitCheckpoint;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
4
5
|
const git_1 = require("./git");
|
|
5
|
-
|
|
6
|
-
const filesChanged =
|
|
6
|
+
function createCommitCheckpoint({ toolCalls, branchName, repoPath, }) {
|
|
7
|
+
const filesChanged = (0, git_1.getFilesChanged)(repoPath);
|
|
7
8
|
const toolsWithUpdatedFiles = toolCalls
|
|
8
9
|
.filter((tc) => "path" in tc.input &&
|
|
9
10
|
tc.input.path &&
|
|
@@ -15,11 +16,11 @@ async function createCheckpoint({ toolCalls, branchName, repoPath, }) {
|
|
|
15
16
|
const filesToCommit = toolsWithUpdatedFiles.map((tool) => tool.path);
|
|
16
17
|
if (toolsWithUpdatedFiles.length > 0) {
|
|
17
18
|
let commitMessage = `${toolsWithUpdatedFiles.map((tool) => `${tool.name} on ${tool.path}`).join(", ")}`;
|
|
18
|
-
|
|
19
|
+
(0, git_1.commitFilesAsBotUser)({
|
|
19
20
|
commitMessage,
|
|
20
|
-
branchName,
|
|
21
21
|
files: filesToCommit,
|
|
22
22
|
repoPath,
|
|
23
23
|
});
|
|
24
|
+
(0, child_process_1.execSync)(`git push origin ${branchName}`, { cwd: repoPath });
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -1,24 +1,19 @@
|
|
|
1
|
+
import { IDashboardAPIClient } from "@empiricalrun/shared-types";
|
|
1
2
|
export declare function getGitDiff(filepath: string, cwd: string): string;
|
|
2
3
|
export declare function getGitDiffForNewFile(filepath: string, cwd: string): string;
|
|
3
4
|
export declare function checkoutBranch(branchName: string, cwd: string): Promise<void>;
|
|
4
|
-
export declare function commitAsBotUser(commitMessage: string, cwd: string):
|
|
5
|
+
export declare function commitAsBotUser(commitMessage: string, cwd: string): boolean;
|
|
5
6
|
export declare function getCurrentBranchName(repoPath: string): Promise<string>;
|
|
6
7
|
export declare function pullBranch(branchName: string, cwd: string): Promise<void>;
|
|
7
|
-
export declare function
|
|
8
|
+
export declare function commitFilesAsBotUser({ commitMessage, files, repoPath, }: {
|
|
8
9
|
commitMessage: string;
|
|
9
|
-
branchName: string;
|
|
10
10
|
files: string[];
|
|
11
11
|
repoPath: string;
|
|
12
|
-
}):
|
|
13
|
-
export declare function getFilesChanged(cwd: string):
|
|
14
|
-
export declare function mergePullRequest({ repoName, prNumber,
|
|
12
|
+
}): void;
|
|
13
|
+
export declare function getFilesChanged(cwd: string): string[];
|
|
14
|
+
export declare function mergePullRequest({ repoName, prNumber, apiClient, }: {
|
|
15
15
|
repoName: string;
|
|
16
16
|
prNumber: number;
|
|
17
|
-
|
|
17
|
+
apiClient: IDashboardAPIClient;
|
|
18
18
|
}): Promise<boolean>;
|
|
19
|
-
export declare function deleteBranch({ repoName, branchName, apiKey, }: {
|
|
20
|
-
repoName: string;
|
|
21
|
-
branchName: string;
|
|
22
|
-
apiKey: string;
|
|
23
|
-
}): Promise<void>;
|
|
24
19
|
//# sourceMappingURL=git.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAe1E;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAMnE;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,WAcjE;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,mBAO1D;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAE/D;AAED,wBAAgB,oBAAoB,CAAC,EACnC,aAAa,EACb,KAAK,EACL,QAAQ,GACT,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,QAGA;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,YAU1C;AAED,wBAAsB,gBAAgB,CAAC,EACrC,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;CAChC,oBA8BA"}
|
|
@@ -6,12 +6,10 @@ exports.checkoutBranch = checkoutBranch;
|
|
|
6
6
|
exports.commitAsBotUser = commitAsBotUser;
|
|
7
7
|
exports.getCurrentBranchName = getCurrentBranchName;
|
|
8
8
|
exports.pullBranch = pullBranch;
|
|
9
|
-
exports.
|
|
9
|
+
exports.commitFilesAsBotUser = commitFilesAsBotUser;
|
|
10
10
|
exports.getFilesChanged = getFilesChanged;
|
|
11
11
|
exports.mergePullRequest = mergePullRequest;
|
|
12
|
-
exports.deleteBranch = deleteBranch;
|
|
13
12
|
const child_process_1 = require("child_process");
|
|
14
|
-
const index_1 = require("./index");
|
|
15
13
|
const GIT_USER_NAME = "empiricalrun[bot]";
|
|
16
14
|
const GIT_USER_EMAIL = "180257021+empiricalrun[bot]@users.noreply.github.com";
|
|
17
15
|
function getGitDiff(filepath, cwd) {
|
|
@@ -39,22 +37,20 @@ function getGitDiffForNewFile(filepath, cwd) {
|
|
|
39
37
|
}
|
|
40
38
|
}
|
|
41
39
|
async function checkoutBranch(branchName, cwd) {
|
|
42
|
-
// TODO: This assumes repoDir is process.cwd()
|
|
43
40
|
try {
|
|
44
41
|
(0, child_process_1.execSync)(`git checkout ${branchName}`, { cwd });
|
|
45
42
|
}
|
|
46
43
|
catch (e) {
|
|
47
|
-
// If branch doesn't exist, create it
|
|
48
44
|
(0, child_process_1.execSync)(`git checkout -b ${branchName}`, { cwd });
|
|
49
45
|
}
|
|
50
46
|
}
|
|
51
|
-
|
|
47
|
+
function commitAsBotUser(commitMessage, cwd) {
|
|
52
48
|
const status = (0, child_process_1.execSync)("git status --porcelain", {
|
|
53
49
|
encoding: "utf-8",
|
|
54
50
|
cwd,
|
|
55
51
|
});
|
|
56
52
|
if (!status) {
|
|
57
|
-
return false;
|
|
53
|
+
return false;
|
|
58
54
|
}
|
|
59
55
|
const commitMessageWithSkipCi = `${commitMessage} [skip ci]`;
|
|
60
56
|
(0, child_process_1.execSync)(`git -c user.name="${GIT_USER_NAME}" -c user.email="${GIT_USER_EMAIL}" commit -m "${commitMessageWithSkipCi}"`, { cwd });
|
|
@@ -71,12 +67,11 @@ async function getCurrentBranchName(repoPath) {
|
|
|
71
67
|
async function pullBranch(branchName, cwd) {
|
|
72
68
|
(0, child_process_1.execSync)(`git pull origin ${branchName}`, { cwd });
|
|
73
69
|
}
|
|
74
|
-
|
|
70
|
+
function commitFilesAsBotUser({ commitMessage, files, repoPath, }) {
|
|
75
71
|
(0, child_process_1.execSync)(`git add ${files.join(" ")}`, { cwd: repoPath });
|
|
76
|
-
|
|
77
|
-
(0, child_process_1.execSync)(`git push origin ${branchName}`, { cwd: repoPath });
|
|
72
|
+
commitAsBotUser(commitMessage, repoPath);
|
|
78
73
|
}
|
|
79
|
-
|
|
74
|
+
function getFilesChanged(cwd) {
|
|
80
75
|
const output = (0, child_process_1.execSync)("git status --porcelain --untracked-files", {
|
|
81
76
|
cwd,
|
|
82
77
|
}).toString();
|
|
@@ -87,20 +82,19 @@ async function getFilesChanged(cwd) {
|
|
|
87
82
|
.filter((fileName) => fileName != "");
|
|
88
83
|
return filesChanged;
|
|
89
84
|
}
|
|
90
|
-
async function mergePullRequest({ repoName, prNumber,
|
|
91
|
-
const url =
|
|
85
|
+
async function mergePullRequest({ repoName, prNumber, apiClient, }) {
|
|
86
|
+
const url = `/repos/empirical-run/${repoName}/pulls/${prNumber}/merge`;
|
|
92
87
|
const mergeBody = {
|
|
93
88
|
merge_method: "squash",
|
|
94
89
|
};
|
|
95
90
|
try {
|
|
96
|
-
const
|
|
91
|
+
const data = await apiClient.callGitHubProxy({
|
|
97
92
|
method: "PUT",
|
|
98
93
|
url: url,
|
|
99
94
|
body: mergeBody,
|
|
100
|
-
apiKey,
|
|
101
95
|
});
|
|
102
|
-
if (!
|
|
103
|
-
console.log(`PR #${prNumber} for ${repoName} could not be merged: ${
|
|
96
|
+
if (!data?.merged) {
|
|
97
|
+
console.log(`PR #${prNumber} for ${repoName} could not be merged: ${data.message}`);
|
|
104
98
|
return false;
|
|
105
99
|
}
|
|
106
100
|
console.log(`Merged PR #${prNumber} for ${repoName} via proxy`);
|
|
@@ -111,22 +105,3 @@ async function mergePullRequest({ repoName, prNumber, apiKey, }) {
|
|
|
111
105
|
return false;
|
|
112
106
|
}
|
|
113
107
|
}
|
|
114
|
-
async function deleteBranch({ repoName, branchName, apiKey, }) {
|
|
115
|
-
const url = `${index_1.GITHUB_API_BASE}/${repoName}/git/refs/heads/${branchName}`;
|
|
116
|
-
try {
|
|
117
|
-
await (0, index_1.callGitHubProxy)({
|
|
118
|
-
method: "DELETE",
|
|
119
|
-
url: url,
|
|
120
|
-
apiKey,
|
|
121
|
-
});
|
|
122
|
-
console.log(`Deleted branch ${branchName} from ${repoName} via proxy`);
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
if (error.message?.includes("422")) {
|
|
126
|
-
console.log(`Branch ${branchName} likely already deleted or never existed on ${repoName}.`);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
console.error(`Error deleting branch ${branchName} from ${repoName} via proxy: ${error.message}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
path: string;
|
|
3
|
-
method?: string;
|
|
4
|
-
body?: any;
|
|
5
|
-
apiKey: string;
|
|
6
|
-
}): Promise<T>;
|
|
7
|
-
export declare function callGitHubProxy<T>({ method, url, body, apiKey, }: {
|
|
8
|
-
method: string;
|
|
9
|
-
url: string;
|
|
10
|
-
body?: any;
|
|
11
|
-
apiKey: string;
|
|
12
|
-
}): Promise<T>;
|
|
13
|
-
export declare const GITHUB_API_BASE = "https://api.github.com/repos/empirical-run";
|
|
1
|
+
import { IDashboardAPIClient } from "@empiricalrun/shared-types";
|
|
14
2
|
export interface GitHubRepoInfo {
|
|
15
3
|
owner: string;
|
|
16
4
|
repo: string;
|
|
@@ -21,15 +9,43 @@ export interface PullRequestInfo {
|
|
|
21
9
|
html_url: string;
|
|
22
10
|
head: {
|
|
23
11
|
ref: string;
|
|
12
|
+
sha: string;
|
|
24
13
|
};
|
|
14
|
+
base: {
|
|
15
|
+
ref: string;
|
|
16
|
+
sha: string;
|
|
17
|
+
};
|
|
18
|
+
state: string;
|
|
19
|
+
title: string;
|
|
20
|
+
body: string;
|
|
21
|
+
created_at: string;
|
|
22
|
+
updated_at: string;
|
|
23
|
+
closed_at: string;
|
|
24
|
+
merged_at: string;
|
|
25
|
+
merge_commit_sha: string;
|
|
26
|
+
commits: number;
|
|
27
|
+
additions: number;
|
|
28
|
+
deletions: number;
|
|
29
|
+
changed_files: number;
|
|
30
|
+
user: {
|
|
31
|
+
login: string;
|
|
32
|
+
};
|
|
33
|
+
mergeable_state: "clean" | "dirty" | "unstable" | "unknown";
|
|
25
34
|
}
|
|
26
|
-
export declare function
|
|
35
|
+
export declare function getExistingPR({ owner, repo, branchName, apiClient, }: {
|
|
27
36
|
owner: string;
|
|
28
37
|
repo: string;
|
|
29
38
|
branchName: string;
|
|
30
|
-
|
|
39
|
+
apiClient: IDashboardAPIClient;
|
|
31
40
|
}): Promise<PullRequestInfo | null>;
|
|
32
|
-
export declare function
|
|
41
|
+
export declare function getMergeableState({ owner, repo, pullRequest, apiClient, }: {
|
|
42
|
+
owner: string;
|
|
43
|
+
repo: string;
|
|
44
|
+
pullRequest: PullRequestInfo;
|
|
45
|
+
apiClient: IDashboardAPIClient;
|
|
46
|
+
}): Promise<"clean" | "dirty" | "unstable" | "unknown">;
|
|
47
|
+
export declare function getMergeableStateDescription(state: "clean" | "dirty" | "unstable" | "unknown" | string): string;
|
|
48
|
+
export declare function createPullRequest({ owner, repo, title, head, base, body, labels, apiClient, }: {
|
|
33
49
|
owner: string;
|
|
34
50
|
repo: string;
|
|
35
51
|
title: string;
|
|
@@ -37,23 +53,23 @@ export declare function createPullRequest({ owner, repo, title, head, base, body
|
|
|
37
53
|
base?: string;
|
|
38
54
|
body: string;
|
|
39
55
|
labels?: string[];
|
|
40
|
-
|
|
56
|
+
apiClient: IDashboardAPIClient;
|
|
41
57
|
}): Promise<PullRequestInfo>;
|
|
42
|
-
export declare function updatePullRequest({ owner, repo, prNumber, body,
|
|
58
|
+
export declare function updatePullRequest({ owner, repo, prNumber, body, apiClient, }: {
|
|
43
59
|
owner: string;
|
|
44
60
|
repo: string;
|
|
45
61
|
prNumber: number;
|
|
46
62
|
body?: string;
|
|
47
|
-
|
|
63
|
+
apiClient: IDashboardAPIClient;
|
|
48
64
|
}): Promise<PullRequestInfo>;
|
|
49
|
-
export declare function findOrCreatePullRequest({ owner, repo, branchName, title, body, labels,
|
|
65
|
+
export declare function findOrCreatePullRequest({ owner, repo, branchName, title, body, labels, apiClient, }: {
|
|
50
66
|
owner: string;
|
|
51
67
|
repo: string;
|
|
52
68
|
branchName: string;
|
|
53
69
|
title: string;
|
|
54
70
|
body: string;
|
|
55
71
|
labels?: string[];
|
|
56
|
-
|
|
72
|
+
apiClient: IDashboardAPIClient;
|
|
57
73
|
}): Promise<{
|
|
58
74
|
pr: PullRequestInfo;
|
|
59
75
|
isNew: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tools/executor/utils/index.ts"],"names":[],"mappings":"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"}
|