@empiricalrun/test-gen 0.74.2 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/agent/base/index.d.ts +43 -0
  3. package/dist/agent/base/index.d.ts.map +1 -0
  4. package/dist/agent/base/index.js +106 -0
  5. package/dist/agent/chat/agent-loop.d.ts +7 -7
  6. package/dist/agent/chat/agent-loop.d.ts.map +1 -1
  7. package/dist/agent/chat/agent-loop.js +5 -18
  8. package/dist/agent/chat/exports.d.ts +6 -4
  9. package/dist/agent/chat/exports.d.ts.map +1 -1
  10. package/dist/agent/chat/exports.js +9 -8
  11. package/dist/agent/chat/index.d.ts +6 -10
  12. package/dist/agent/chat/index.d.ts.map +1 -1
  13. package/dist/agent/chat/index.js +130 -200
  14. package/dist/agent/chat/prompt/index.d.ts +5 -4
  15. package/dist/agent/chat/prompt/index.d.ts.map +1 -1
  16. package/dist/agent/chat/prompt/index.js +79 -68
  17. package/dist/agent/chat/state.d.ts +3 -5
  18. package/dist/agent/chat/state.d.ts.map +1 -1
  19. package/dist/agent/chat/state.js +2 -10
  20. package/dist/agent/chat/utils.d.ts +2 -4
  21. package/dist/agent/chat/utils.d.ts.map +1 -1
  22. package/dist/agent/chat/utils.js +2 -16
  23. package/dist/agent/cli.d.ts +11 -0
  24. package/dist/agent/cli.d.ts.map +1 -0
  25. package/dist/agent/cli.js +209 -0
  26. package/dist/agent/code-review/index.d.ts +7 -0
  27. package/dist/agent/code-review/index.d.ts.map +1 -0
  28. package/dist/agent/code-review/index.js +65 -0
  29. package/dist/agent/code-review/prompt.d.ts +1 -1
  30. package/dist/agent/code-review/prompt.d.ts.map +1 -1
  31. package/dist/agent/code-review/prompt.js +52 -16
  32. package/dist/agent/index.d.ts +10 -0
  33. package/dist/agent/index.d.ts.map +1 -0
  34. package/dist/agent/index.js +19 -0
  35. package/dist/agent/triage/index.d.ts +7 -0
  36. package/dist/agent/triage/index.d.ts.map +1 -0
  37. package/dist/agent/triage/index.js +102 -0
  38. package/dist/agent/video-analysis/index.d.ts +7 -0
  39. package/dist/agent/video-analysis/index.d.ts.map +1 -0
  40. package/dist/agent/video-analysis/index.js +35 -0
  41. package/dist/bin/index.js +6 -6
  42. package/dist/file-info/adapters/github/index.d.ts +2 -2
  43. package/dist/file-info/adapters/github/index.d.ts.map +1 -1
  44. package/dist/file-info/adapters/github/index.js +4 -4
  45. package/dist/file-info/adapters/github/reader.d.ts +5 -10
  46. package/dist/file-info/adapters/github/reader.d.ts.map +1 -1
  47. package/dist/file-info/adapters/github/reader.js +168 -138
  48. package/dist/tools/create-pull-request/index.d.ts.map +1 -0
  49. package/dist/tools/{definitions/commit-and-create-pr.js → create-pull-request/index.js} +30 -1
  50. package/dist/tools/create-pull-request/utils.d.ts +21 -0
  51. package/dist/tools/create-pull-request/utils.d.ts.map +1 -0
  52. package/dist/tools/create-pull-request/utils.js +83 -0
  53. package/dist/tools/definitions/extract-frames-from-video.d.ts +39 -0
  54. package/dist/tools/definitions/extract-frames-from-video.d.ts.map +1 -0
  55. package/dist/tools/definitions/extract-frames-from-video.js +60 -0
  56. package/dist/tools/definitions/fetch-video-analysis.d.ts +28 -0
  57. package/dist/tools/definitions/fetch-video-analysis.d.ts.map +1 -1
  58. package/dist/tools/definitions/fetch-video-analysis.js +39 -4
  59. package/dist/tools/definitions/rename-file.d.ts +3 -0
  60. package/dist/tools/definitions/rename-file.d.ts.map +1 -0
  61. package/dist/tools/definitions/rename-file.js +23 -0
  62. package/dist/tools/delete-file/index.d.ts.map +1 -1
  63. package/dist/tools/delete-file/index.js +13 -1
  64. package/dist/tools/executor/index.d.ts +1 -1
  65. package/dist/tools/executor/index.d.ts.map +1 -1
  66. package/dist/tools/executor/index.js +22 -7
  67. package/dist/tools/executor/utils/checkpoint.d.ts +1 -3
  68. package/dist/tools/executor/utils/checkpoint.d.ts.map +1 -1
  69. package/dist/tools/executor/utils/checkpoint.js +17 -17
  70. package/dist/tools/executor/utils/git.d.ts +9 -1
  71. package/dist/tools/executor/utils/git.d.ts.map +1 -1
  72. package/dist/tools/executor/utils/git.js +72 -2
  73. package/dist/tools/extract-frames-from-video/index.d.ts +7 -0
  74. package/dist/tools/extract-frames-from-video/index.d.ts.map +1 -0
  75. package/dist/tools/extract-frames-from-video/index.js +145 -0
  76. package/dist/tools/{fetch-image → fetch-file}/index.d.ts +2 -2
  77. package/dist/tools/fetch-file/index.d.ts.map +1 -0
  78. package/dist/tools/fetch-file/index.js +97 -0
  79. package/dist/tools/fetch-session-diff/index.d.ts +3 -0
  80. package/dist/tools/fetch-session-diff/index.d.ts.map +1 -0
  81. package/dist/tools/fetch-session-diff/index.js +46 -0
  82. package/dist/tools/fetch-video-analysis/index.d.ts +3 -3
  83. package/dist/tools/fetch-video-analysis/index.d.ts.map +1 -1
  84. package/dist/tools/fetch-video-analysis/index.js +84 -24
  85. package/dist/tools/fetch-video-analysis/open-ai.d.ts +6 -0
  86. package/dist/tools/fetch-video-analysis/open-ai.d.ts.map +1 -0
  87. package/dist/tools/fetch-video-analysis/open-ai.js +37 -0
  88. package/dist/tools/fetch-video-analysis/utils.d.ts +9 -3
  89. package/dist/tools/fetch-video-analysis/utils.d.ts.map +1 -1
  90. package/dist/tools/fetch-video-analysis/utils.js +64 -15
  91. package/dist/tools/fetch-video-analysis/video-analysis.d.ts +2 -2
  92. package/dist/tools/fetch-video-analysis/video-analysis.d.ts.map +1 -1
  93. package/dist/tools/fetch-video-analysis/video-analysis.js +24 -8
  94. package/dist/tools/file-operations/create.d.ts.map +1 -1
  95. package/dist/tools/file-operations/create.js +6 -3
  96. package/dist/tools/file-operations/insert.d.ts.map +1 -1
  97. package/dist/tools/file-operations/insert.js +6 -3
  98. package/dist/tools/file-operations/replace.d.ts.map +1 -1
  99. package/dist/tools/file-operations/replace.js +6 -3
  100. package/dist/tools/file-operations/shared/git-helper.d.ts.map +1 -1
  101. package/dist/tools/file-operations/shared/git-helper.js +1 -1
  102. package/dist/tools/file-operations/view/index.d.ts +2 -5
  103. package/dist/tools/file-operations/view/index.d.ts.map +1 -1
  104. package/dist/tools/file-operations/view/index.js +2 -22
  105. package/dist/tools/index.d.ts +28 -2
  106. package/dist/tools/index.d.ts.map +1 -1
  107. package/dist/tools/index.js +50 -22
  108. package/dist/tools/issues/update-issue.d.ts.map +1 -1
  109. package/dist/tools/issues/update-issue.js +16 -9
  110. package/dist/tools/merge-conflicts/index.js +1 -1
  111. package/dist/tools/rename-file/index.d.ts +3 -0
  112. package/dist/tools/rename-file/index.d.ts.map +1 -0
  113. package/dist/tools/rename-file/index.js +88 -0
  114. package/dist/tools/review-pull-request/index.d.ts +3 -0
  115. package/dist/tools/review-pull-request/index.d.ts.map +1 -0
  116. package/dist/tools/review-pull-request/index.js +103 -0
  117. package/dist/tools/run-test.js +2 -2
  118. package/dist/tools/test-run-fetcher/index.d.ts.map +1 -1
  119. package/dist/tools/test-run-fetcher/index.js +4 -14
  120. package/dist/tools/trace-dot-zip/index.d.ts.map +1 -1
  121. package/dist/tools/trace-dot-zip/index.js +2 -1
  122. package/dist/tools/trace-dot-zip/types.d.ts +35 -3
  123. package/dist/tools/trace-dot-zip/types.d.ts.map +1 -1
  124. package/dist/tools/trace-dot-zip/utils/network-trace.d.ts +7 -2
  125. package/dist/tools/trace-dot-zip/utils/network-trace.d.ts.map +1 -1
  126. package/dist/tools/trace-dot-zip/utils/network-trace.js +130 -10
  127. package/dist/tools/upgrade-packages/index.js +1 -1
  128. package/dist/tools/utils/urls.d.ts +5 -0
  129. package/dist/tools/utils/urls.d.ts.map +1 -0
  130. package/dist/tools/utils/urls.js +19 -0
  131. package/dist/tools/view-failed-test-run-report/index.d.ts.map +1 -1
  132. package/dist/tools/view-failed-test-run-report/index.js +3 -15
  133. package/dist/utils/file.d.ts +1 -0
  134. package/dist/utils/file.d.ts.map +1 -1
  135. package/dist/utils/file.js +45 -1
  136. package/dist/utils/index.d.ts +0 -1
  137. package/dist/utils/index.d.ts.map +1 -1
  138. package/dist/utils/index.js +1 -3
  139. package/dist/utils/local-ffmpeg-client.d.ts +27 -0
  140. package/dist/utils/local-ffmpeg-client.d.ts.map +1 -0
  141. package/dist/{tools/fetch-video-analysis → utils}/local-ffmpeg-client.js +117 -27
  142. package/package.json +5 -5
  143. package/tsconfig.tsbuildinfo +1 -1
  144. package/dist/agent/chat/utils/tool-calls.d.ts +0 -21
  145. package/dist/agent/chat/utils/tool-calls.d.ts.map +0 -1
  146. package/dist/agent/chat/utils/tool-calls.js +0 -64
  147. package/dist/tools/commit-and-create-pr/index.d.ts.map +0 -1
  148. package/dist/tools/commit-and-create-pr/index.js +0 -83
  149. package/dist/tools/definitions/commit-and-create-pr.d.ts +0 -3
  150. package/dist/tools/definitions/commit-and-create-pr.d.ts.map +0 -1
  151. package/dist/tools/fetch-image/index.d.ts.map +0 -1
  152. package/dist/tools/fetch-image/index.js +0 -63
  153. package/dist/tools/fetch-video-analysis/local-ffmpeg-client.d.ts +0 -24
  154. package/dist/tools/fetch-video-analysis/local-ffmpeg-client.d.ts.map +0 -1
  155. /package/dist/tools/{commit-and-create-pr → create-pull-request}/index.d.ts +0 -0
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reviewPullRequestTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const exports_1 = require("../../agent/chat/exports");
6
+ const state_1 = require("../../agent/chat/state");
7
+ const code_review_1 = require("../../agent/code-review");
8
+ const fetch_session_diff_1 = require("../fetch-session-diff");
9
+ const CODE_REVIEW_MODEL = "claude-sonnet-4-20250514";
10
+ const ReviewPullRequestInputSchema = zod_1.z.object({
11
+ sessionUrl: zod_1.z.string().describe("The URL of the chat session to review"),
12
+ });
13
+ exports.reviewPullRequestTool = {
14
+ schema: {
15
+ name: "reviewPullRequest",
16
+ description: `Reviews a pull request by using CodeReviewAgent to fetch session diff and analyze it. Returns a boolean result with an explanation.`,
17
+ parameters: ReviewPullRequestInputSchema,
18
+ },
19
+ needsBrowser: false,
20
+ isInlineTool: true,
21
+ execute: async ({ input, apiClient }) => {
22
+ try {
23
+ const { sessionUrl } = input;
24
+ if (!sessionUrl) {
25
+ return {
26
+ isError: true,
27
+ result: "No chat session URL provided",
28
+ };
29
+ }
30
+ const agent = new code_review_1.CodeReviewAgent({
31
+ featureFlags: [],
32
+ selectedModel: CODE_REVIEW_MODEL,
33
+ });
34
+ const userPrompt = `Review this session: ${sessionUrl}`;
35
+ const chatState = (0, state_1.createChatState)({
36
+ userPrompt,
37
+ attachments: [],
38
+ existingState: undefined,
39
+ selectedModel: CODE_REVIEW_MODEL,
40
+ error: null,
41
+ });
42
+ agent.initializeWithState(chatState);
43
+ let chatModel = (0, exports_1.createChatModel)(chatState.messages, CODE_REVIEW_MODEL);
44
+ while (!chatModel.askUserForInput) {
45
+ await agent.runLoop({
46
+ messages: chatModel.messages,
47
+ reporter: async (data) => {
48
+ console.log("Review progress:", data);
49
+ },
50
+ onPendingToolCall: async (toolCalls) => {
51
+ const [toolCall] = toolCalls;
52
+ // TODO: This will only work for 1 tool - will break if
53
+ // code review agent has more tools: need first class primitive
54
+ // for inline tool execution
55
+ if (toolCall?.name === "fetchSessionDiff") {
56
+ const tool = fetch_session_diff_1.fetchSessionDiffTool;
57
+ const result = await tool.execute({
58
+ input: toolCall.input,
59
+ apiClient,
60
+ repoPath: ``,
61
+ featureFlags: [],
62
+ });
63
+ chatModel.pushToolResultsMessage([toolCall], [result]);
64
+ }
65
+ },
66
+ onLLMResponse: async (response, model) => {
67
+ console.log(`Agent responded using ${model}:`, response);
68
+ },
69
+ });
70
+ // Update the chatModel with the agent's final state for next iteration
71
+ if (agent.messages) {
72
+ chatModel = (0, exports_1.createChatModel)(agent.messages, CODE_REVIEW_MODEL);
73
+ }
74
+ }
75
+ const messages = agent.messages || [];
76
+ const lastMessage = messages.length
77
+ ? messages[messages.length - 1]
78
+ : undefined;
79
+ const lastMessageTextPart = lastMessage
80
+ ? lastMessage.parts
81
+ .filter((p) => "text" in p)
82
+ .find((p) => "text" in p && !!p.text)
83
+ : undefined;
84
+ if (!lastMessageTextPart) {
85
+ return {
86
+ isError: true,
87
+ result: "Could not extract text response from agent",
88
+ };
89
+ }
90
+ return {
91
+ isError: false,
92
+ result: lastMessageTextPart.text,
93
+ };
94
+ }
95
+ catch (error) {
96
+ console.error("Error reviewing pull request", error);
97
+ return {
98
+ isError: true,
99
+ result: error instanceof Error ? error.message : String(error),
100
+ };
101
+ }
102
+ },
103
+ };
@@ -9,7 +9,7 @@ const fs_1 = __importDefault(require("fs"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const artifacts_1 = require("../artifacts");
11
11
  const utils_1 = require("../artifacts/utils");
12
- const utils_2 = require("../utils");
12
+ const json_1 = require("../utils/json");
13
13
  const run_test_1 = require("./definitions/run-test");
14
14
  function buildReportUrl(projectName, testRunId) {
15
15
  return `https://reports.empirical.run/${projectName}/${testRunId}/index.html`;
@@ -17,7 +17,7 @@ function buildReportUrl(projectName, testRunId) {
17
17
  function buildResult({ hasTestPassed, summaryJson, reportUrl, }) {
18
18
  const summaryWithoutConfig = { ...summaryJson, config: undefined };
19
19
  delete summaryWithoutConfig["config"];
20
- const truncatedSummaryJson = (0, utils_2.truncateJsonValues)(summaryWithoutConfig);
20
+ const truncatedSummaryJson = (0, json_1.truncateJsonValues)(summaryWithoutConfig);
21
21
  return `
22
22
  Test run is complete. Result: ${hasTestPassed ? "Passed" : "Failed"}
23
23
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAavD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,eAAO,MAAM,sBAAsB,EAAE,IA8HpC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/test-run-fetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAcvD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,eAAO,MAAM,sBAAsB,EAAE,IAkHpC,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fetchTestRunReportTool = void 0;
4
4
  exports.extractPathAfterSourceRepo = extractPathAfterSourceRepo;
5
5
  const zod_1 = require("zod");
6
+ const urls_1 = require("../utils/urls");
6
7
  const TestRunSchema = zod_1.z.object({
7
8
  testRunUrl: zod_1.z
8
9
  .string()
@@ -26,23 +27,12 @@ exports.fetchTestRunReportTool = {
26
27
  needsBrowser: false,
27
28
  isInlineTool: true,
28
29
  execute: async ({ input, apiClient }) => {
29
- const { testRunUrl } = input;
30
- // Remove query parameters if they exist
31
- const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
32
- // Extract the run ID and repo name from the URL
33
- const urlParts = urlWithoutParams.split("/");
34
- const runId = urlParts.pop(); // Last part is the run ID
35
- const repoName = urlParts[urlParts.length - 2]; // Second to last part is the repo name
36
- if (!runId || !repoName) {
37
- return {
38
- isError: true,
39
- result: "Invalid test run URL - could not extract run ID or repo name",
40
- };
41
- }
42
- let data = null;
43
30
  if (!apiClient) {
44
31
  throw new Error("Dashboard API client is not available.");
45
32
  }
33
+ const { testRunUrl } = input;
34
+ let data = null;
35
+ const { repoName, runId } = (0, urls_1.extractProjectFromUrl)(testRunUrl);
46
36
  try {
47
37
  data = await apiClient.request(`/api/test-runs/${runId}?repo_name=${repoName}`, { method: "GET" });
48
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAa9D,eAAO,MAAM,eAAe,EAAE,IAqD7B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAa9D,eAAO,MAAM,eAAe,EAAE,IAwD7B,CAAC"}
@@ -28,11 +28,12 @@ exports.traceDotZipTool = {
28
28
  (0, network_trace_1.generateNetworkTraceFromZipUrl)({ url: traceFileUrl }),
29
29
  (0, console_trace_1.generateConsoleTraceFromZipUrl)({ url: traceFileUrl }),
30
30
  ]);
31
- const cleanNetworkTraceOutput = (0, network_trace_1.stripIrrelevantInfoFromNetworkFailureArray)(networkTraceOutput);
31
+ const cleanNetworkTraceOutput = (0, network_trace_1.stripIrrelevantInfoFromNetworkFailureArray)(networkTraceOutput.hydratedFailedCalls);
32
32
  return {
33
33
  isError: false,
34
34
  result: JSON.stringify({
35
35
  failed_network_requests: cleanNetworkTraceOutput,
36
+ request_sequence: networkTraceOutput.networkCallSequence,
36
37
  console_error_logs: consoleTraceOutput,
37
38
  }, null, 2),
38
39
  };
@@ -8,13 +8,35 @@ export type CapturedNetworkFailure = {
8
8
  headers: {
9
9
  [any: string]: string;
10
10
  }[] | [];
11
+ body?: {
12
+ mimeType?: string;
13
+ text?: string;
14
+ params?: any[];
15
+ _sha1?: string;
16
+ content?: string;
17
+ };
11
18
  };
12
19
  response: {
13
20
  headers: {
14
21
  [any: string]: string;
15
22
  }[] | [];
23
+ body?: {
24
+ mimeType?: string;
25
+ text?: string;
26
+ params?: any[];
27
+ _sha1?: string;
28
+ content?: string;
29
+ };
16
30
  };
17
31
  };
32
+ export type NetworkRequestSequence = {
33
+ step: number;
34
+ method: string;
35
+ endpoint: string;
36
+ status: number;
37
+ redirect_to?: string;
38
+ duration_ms: number;
39
+ };
18
40
  export type CapturedConsoleLog = {
19
41
  type: "console";
20
42
  messageType: "log" | "info" | "warning" | "error" | string;
@@ -44,11 +66,12 @@ export type PlaywrightNetworkTrace = {
44
66
  queryString: any[];
45
67
  headersSize: number;
46
68
  bodySize: number;
47
- postData: {
69
+ postData?: {
48
70
  mimeType: string;
49
- text: string;
71
+ text?: string;
50
72
  params: any[];
51
- _sha1: string;
73
+ _sha1?: string;
74
+ _file?: string;
52
75
  };
53
76
  };
54
77
  response: {
@@ -61,6 +84,15 @@ export type PlaywrightNetworkTrace = {
61
84
  bodySize: number;
62
85
  redirectURL: string;
63
86
  _transferSize: number;
87
+ content: {
88
+ size: number;
89
+ mimeType: string;
90
+ text?: string;
91
+ encoding?: string;
92
+ _sha1?: string;
93
+ _file?: string;
94
+ compression?: number;
95
+ };
64
96
  };
65
97
  cache: any;
66
98
  timings: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC,EAAE,MAAM,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,OAAO,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE,CAAC;KAC3C,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE,CAAC;KAC3C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,WAAW,EAAE,GAAG,EAAE,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE;gBACR,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,GAAG,EAAE,CAAC;gBACd,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;SACH,CAAC;QACF,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAC;YACf,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,KAAK,EAAE,GAAG,CAAC;QACX,OAAO,EAAE;YACP,GAAG,EAAE,MAAM,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/trace-dot-zip/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC,EAAE,MAAM,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,OAAO,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,EAAE;YACL,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;YACf,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,EAAE;YACL,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;YACf,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,WAAW,EAAE,GAAG,EAAE,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,CAAC,EAAE;gBACT,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE,GAAG,EAAE,CAAC;gBACd,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,CAAC;SACH,CAAC;QACF,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAC;YACf,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,EAAE,CAAC;YACf,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC;SACH,CAAC;QACF,KAAK,EAAE,GAAG,CAAC;QACX,OAAO,EAAE;YACP,GAAG,EAAE,MAAM,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import { CapturedNetworkFailure } from "../types";
1
+ import { CapturedNetworkFailure, NetworkRequestSequence, PlaywrightNetworkTrace } from "../types";
2
2
  type ArgsT = {
3
3
  url: string;
4
4
  logPrefix?: string;
@@ -15,7 +15,12 @@ export declare const generateNetworkTrace: ({ logPrefix, url, failure, }: ArgsT)
15
15
  allFailedCalls: CapturedNetworkFailure[];
16
16
  failedCallsWithinTimeRange: CapturedNetworkFailure[];
17
17
  }>;
18
- export declare const generateNetworkTraceFromZipUrl: ({ url, }: ArgsT) => Promise<CapturedNetworkFailure[]>;
18
+ export declare const generateNetworkTraceFromZipUrl: ({ url, }: ArgsT) => Promise<{
19
+ hydratedFailedCalls: CapturedNetworkFailure[];
20
+ networkCallSequence: NetworkRequestSequence[];
21
+ }>;
19
22
  export declare const stripIrrelevantInfoFromNetworkFailureArray: (failures: CapturedNetworkFailure[]) => Partial<CapturedNetworkFailure>[];
23
+ export declare const hydrateSha1Bodies: (failures: CapturedNetworkFailure[], zipUrl: string) => Promise<CapturedNetworkFailure[]>;
24
+ export declare const buildNetworkCallSequence: (unformattedFailedNetworkCallsWithHeaders: PlaywrightNetworkTrace[]) => NetworkRequestSequence[];
20
25
  export {};
21
26
  //# sourceMappingURL=network-trace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"network-trace.d.ts","sourceRoot":"","sources":["../../../../src/tools/trace-dot-zip/utils/network-trace.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,sBAAsB,EAA0B,MAAM,UAAU,CAAC;AAU1E,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,EACJ;YACE,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,GACD,SAAS,CAAC;KACf,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,8BAIxC,KAAK,KAAG,OAAO,CAAC;IACjB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;CACtD,CA8KA,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAU,UAElD,KAAK,KAAG,OAAO,CAAC,sBAAsB,EAAE,CAmC1C,CAAC;AAoBF,eAAO,MAAM,0CAA0C,GACrD,UAAU,sBAAsB,EAAE,KACjC,OAAO,CAAC,sBAAsB,CAAC,EAUjC,CAAC"}
1
+ {"version":3,"file":"network-trace.d.ts","sourceRoot":"","sources":["../../../../src/tools/trace-dot-zip/utils/network-trace.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAUlB,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,EACJ;YACE,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;SAChB,GACD,SAAS,CAAC;KACf,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,8BAIxC,KAAK,KAAG,OAAO,CAAC;IACjB,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;CACtD,CA+KA,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAU,UAElD,KAAK,KAAG,OAAO,CAAC;IACjB,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;CAC/C,CAyEA,CAAC;AAsBF,eAAO,MAAM,0CAA0C,GACrD,UAAU,sBAAsB,EAAE,KACjC,OAAO,CAAC,sBAAsB,CAAC,EAoBjC,CAAC;AAmCF,eAAO,MAAM,iBAAiB,GAC5B,UAAU,sBAAsB,EAAE,EAClC,QAAQ,MAAM,KACb,OAAO,CAAC,sBAAsB,EAAE,CA+BlC,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,0CAA0C,sBAAsB,EAAE,KACjE,sBAAsB,EA2BxB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stripIrrelevantInfoFromNetworkFailureArray = exports.generateNetworkTraceFromZipUrl = exports.generateNetworkTrace = void 0;
3
+ exports.buildNetworkCallSequence = exports.hydrateSha1Bodies = exports.stripIrrelevantInfoFromNetworkFailureArray = exports.generateNetworkTraceFromZipUrl = exports.generateNetworkTrace = void 0;
4
4
  const date_fns_1 = require("date-fns");
5
+ const json_1 = require("../../../utils/json");
5
6
  const extract_zip_1 = require("./extract-zip");
6
7
  const NON_RELEVANT_NETWORK_CALL_KEYWORDS = [
7
8
  "sentry",
@@ -97,6 +98,7 @@ const generateNetworkTrace = async ({ logPrefix = "network-trace", url, failure,
97
98
  method: call?.snapshot?.request?.method,
98
99
  request: {
99
100
  headers: call?.snapshot?.request?.headers ?? [],
101
+ body: call?.snapshot?.request?.postData ?? undefined,
100
102
  },
101
103
  response: {
102
104
  headers: call?.snapshot?.response?.headers ?? [],
@@ -130,7 +132,8 @@ const generateNetworkTrace = async ({ logPrefix = "network-trace", url, failure,
130
132
  exports.generateNetworkTrace = generateNetworkTrace;
131
133
  const generateNetworkTraceFromZipUrl = async ({ url, }) => {
132
134
  try {
133
- const failedCalls = [];
135
+ const allNetworkCalls = [];
136
+ const relevantNetworkCalls = [];
134
137
  await (0, extract_zip_1.extractFileFromZipFromUrl)({
135
138
  zipUrl: url,
136
139
  fileNames: ["0-trace.network"],
@@ -141,23 +144,47 @@ const generateNetworkTraceFromZipUrl = async ({ url, }) => {
141
144
  let lines = tempBuffer.split("\n");
142
145
  lines.slice(0, -1).forEach((line) => {
143
146
  const parsedNetworkTrace = JSON.parse(line);
144
- const responseStatus = parsedNetworkTrace?.snapshot?.response?.status;
145
- // const networkTriggerTime =
146
- // parsedNetworkTrace?.snapshot?.startedDateTime;
147
- if (400 <= responseStatus && responseStatus < 600) {
148
- failedCalls.push(parsedNetworkTrace);
147
+ const hasValidResponseStatus = !!parsedNetworkTrace?.snapshot?.response?.status;
148
+ const responseStatus = Number(parsedNetworkTrace?.snapshot?.response?.status);
149
+ allNetworkCalls.push(parsedNetworkTrace);
150
+ // only failures & redirects for detailed analysis
151
+ if (hasValidResponseStatus &&
152
+ (responseStatus === 308 ||
153
+ (400 <= responseStatus && responseStatus < 600))) {
154
+ relevantNetworkCalls.push(parsedNetworkTrace);
149
155
  }
150
156
  });
151
157
  tempBuffer = lines[lines.length - 1] || "";
152
158
  };
153
159
  },
154
160
  });
155
- return failedCalls.map(formatNetworkFailure);
161
+ const failedCalls = relevantNetworkCalls.filter((c) => {
162
+ const status = c.snapshot.response.status;
163
+ return 400 <= status && status < 600;
164
+ });
165
+ const sequenceCalls = allNetworkCalls.filter((c) => {
166
+ const hasValidResponseStatus = !!c.snapshot.response.status;
167
+ const status = Number(c.snapshot.response.status);
168
+ return (hasValidResponseStatus &&
169
+ ((400 <= status && status < 600) ||
170
+ status === 307 ||
171
+ status === 308 ||
172
+ status === 301 ||
173
+ status === 302));
174
+ // excluding: 304 (cached), 2xx success
175
+ });
176
+ const networkCallSequence = (0, exports.buildNetworkCallSequence)(sequenceCalls);
177
+ const formattedFailedCalls = failedCalls.map(formatNetworkFailure);
178
+ const hydratedFailedCalls = await (0, exports.hydrateSha1Bodies)(formattedFailedCalls, url);
179
+ return { hydratedFailedCalls, networkCallSequence };
156
180
  }
157
181
  catch (error) {
158
182
  console.error(`Error fetching or processing the zip file: ${url}`, error);
159
183
  }
160
- return [];
184
+ return {
185
+ hydratedFailedCalls: [],
186
+ networkCallSequence: [],
187
+ };
161
188
  };
162
189
  exports.generateNetworkTraceFromZipUrl = generateNetworkTraceFromZipUrl;
163
190
  const formatNetworkFailure = (call) => {
@@ -169,21 +196,114 @@ const formatNetworkFailure = (call) => {
169
196
  method: call?.snapshot?.request?.method,
170
197
  request: {
171
198
  headers: call?.snapshot?.request?.headers ?? [],
199
+ body: call?.snapshot?.request?.postData ?? undefined,
172
200
  },
173
201
  response: {
174
202
  headers: call?.snapshot?.response?.headers ?? [],
203
+ body: call?.snapshot?.response?.content ?? undefined,
175
204
  },
176
205
  };
177
206
  };
178
207
  const stripIrrelevantInfoFromNetworkFailureArray = (failures) => {
179
- return failures.map(({ endpoint, status, timestamp, method }) => {
208
+ return failures.map(({ endpoint, status, timestamp, method, request, response }) => {
180
209
  const strippedFailureInfo = {
181
210
  endpoint,
182
211
  status,
183
212
  timestamp,
184
213
  method,
214
+ request: {
215
+ headers: [],
216
+ body: request.body,
217
+ },
218
+ response: {
219
+ headers: [],
220
+ body: response.body,
221
+ },
185
222
  };
186
223
  return strippedFailureInfo;
187
224
  });
188
225
  };
189
226
  exports.stripIrrelevantInfoFromNetworkFailureArray = stripIrrelevantInfoFromNetworkFailureArray;
227
+ const resolveSha1File = async (zipUrl, sha1) => {
228
+ if (!sha1)
229
+ return undefined;
230
+ let result;
231
+ const fileName = `resources/${sha1}`; // the _sha1 reference is a filename like abcd.bin or abcd.json
232
+ await (0, extract_zip_1.extractFileFromZipFromUrl)({
233
+ zipUrl,
234
+ fileNames: [fileName],
235
+ chunkProcessor: () => {
236
+ let buffer = "";
237
+ return (chunk) => {
238
+ buffer += chunk.toString("utf-8");
239
+ result = buffer;
240
+ };
241
+ },
242
+ });
243
+ if (!result)
244
+ return undefined;
245
+ let truncatedContent;
246
+ try {
247
+ const parsedResult = JSON.parse(result);
248
+ truncatedContent = JSON.stringify((0, json_1.truncateJsonValues)(parsedResult));
249
+ }
250
+ catch {
251
+ truncatedContent = (0, json_1.truncateJsonValues)(result);
252
+ }
253
+ return truncatedContent;
254
+ };
255
+ const hydrateSha1Bodies = async (failures, zipUrl) => {
256
+ return Promise.all(failures.map(async (failure) => {
257
+ const reqSha1 = failure.request.body?._sha1;
258
+ const reqMimeType = failure.request.body?.mimeType;
259
+ const resSha1 = failure.response.body?._sha1;
260
+ const resMimeType = failure.response.body?.mimeType;
261
+ return {
262
+ ...failure,
263
+ request: {
264
+ ...failure.request,
265
+ body: reqSha1
266
+ ? {
267
+ mimeType: reqMimeType,
268
+ content: await resolveSha1File(zipUrl, reqSha1),
269
+ }
270
+ : failure.request.body,
271
+ },
272
+ response: {
273
+ ...failure.response,
274
+ body: resSha1
275
+ ? {
276
+ mimeType: resMimeType,
277
+ content: await resolveSha1File(zipUrl, resSha1),
278
+ }
279
+ : failure.response.body,
280
+ },
281
+ };
282
+ }));
283
+ };
284
+ exports.hydrateSha1Bodies = hydrateSha1Bodies;
285
+ const buildNetworkCallSequence = (unformattedFailedNetworkCallsWithHeaders) => {
286
+ return unformattedFailedNetworkCallsWithHeaders.map((trace, idx) => {
287
+ const snap = trace.snapshot;
288
+ const url = new URL(snap.request.url);
289
+ let redirect_to = undefined;
290
+ if (snap.response.redirectURL) {
291
+ try {
292
+ // attempting to make it absolute if relative
293
+ redirect_to = new URL(snap.response.redirectURL, snap.request.url).toString();
294
+ }
295
+ catch {
296
+ redirect_to = snap.response.redirectURL; // fallback as-is
297
+ }
298
+ }
299
+ return {
300
+ step: idx + 1,
301
+ method: snap.request.method,
302
+ endpoint: url.pathname,
303
+ status: snap.response.status,
304
+ redirect_to,
305
+ duration_ms: Math.round(snap.time),
306
+ };
307
+ });
308
+ };
309
+ exports.buildNetworkCallSequence = buildNetworkCallSequence;
@@ -50,7 +50,7 @@ exports.upgradePackagesTool = {
50
50
  };
51
51
  }
52
52
  const updateMessage = `upgrade ${changes.length} package${changes.length === 1 ? "" : "s"}`;
53
- (0, git_1.commitFilesAsBotUser)({
53
+ (0, git_1.stageAndCommitFilesAsBotUser)({
54
54
  commitMessage: `[upgrade-packages] ${updateMessage}`,
55
55
  files: ["package.json", "package-lock.json"],
56
56
  repoPath,
@@ -0,0 +1,5 @@
1
+ export declare function extractProjectFromUrl(testRunUrl: string): {
2
+ repoName: string;
3
+ runId: string;
4
+ };
5
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/urls.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM;;;EAiBvD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractProjectFromUrl = extractProjectFromUrl;
4
+ function extractProjectFromUrl(testRunUrl) {
5
+ // Remove query parameters if they exist
6
+ const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
7
+ // Extract the run ID and repo name from the URL
8
+ const urlParts = urlWithoutParams.split("/");
9
+ const runId = urlParts.pop();
10
+ const projectSlug = urlParts[urlParts.length - 2];
11
+ if (!runId || !projectSlug) {
12
+ throw new Error("Invalid test run URL - could not extract run ID or project slug");
13
+ }
14
+ const repoName = `${projectSlug}-tests`;
15
+ return {
16
+ repoName,
17
+ runId,
18
+ };
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/view-failed-test-run-report/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,6BAA6B;;;;;;EAExC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,6BAA6B,CACrC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,IAoLzC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/view-failed-test-run-report/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,6BAA6B;;;;;;EAExC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,6BAA6B,CACrC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,IAsKzC,CAAC"}
@@ -4,6 +4,7 @@ exports.viewFailedTestRunReportTool = exports.ViewFailedTestRunReportSchema = vo
4
4
  // import fs from "fs";
5
5
  const zod_1 = require("zod");
6
6
  const playwright_report_parser_1 = require("../../utils/playwright-report-parser");
7
+ const urls_1 = require("../utils/urls");
7
8
  exports.ViewFailedTestRunReportSchema = zod_1.z.object({
8
9
  testRunUrl: zod_1.z.string().describe("The URL of the test run to process."),
9
10
  });
@@ -17,18 +18,7 @@ exports.viewFailedTestRunReportTool = {
17
18
  isInlineTool: true,
18
19
  execute: async ({ input, apiClient }) => {
19
20
  const { testRunUrl } = input;
20
- // Remove query parameters if they exist
21
- const urlWithoutParams = testRunUrl.split("?")[0] || testRunUrl;
22
- // Extract the run ID and repo name from the URL
23
- const urlParts = urlWithoutParams.split("/");
24
- const runId = urlParts.pop(); // Last part is the run ID
25
- const repoName = urlParts[urlParts.length - 2]; // Second to last part is the repo name
26
- if (!runId || !repoName) {
27
- return {
28
- isError: true,
29
- result: "Invalid test run URL - could not extract run ID or repo name",
30
- };
31
- }
21
+ const { repoName, runId } = (0, urls_1.extractProjectFromUrl)(testRunUrl);
32
22
  let result = {
33
23
  testRun: null,
34
24
  summary: null,
@@ -80,9 +70,7 @@ exports.viewFailedTestRunReportTool = {
80
70
  // );
81
71
  const htmlDetailed = await apiClient.request(`/api/reports/html-detailed`, {
82
72
  method: "GET",
83
- params: {
84
- url: indexHtmlUrl,
85
- },
73
+ params: { url: indexHtmlUrl },
86
74
  });
87
75
  const parsedReport = (0, playwright_report_parser_1.parsePlaywrightTestReport)(summaryData);
88
76
  // fs.writeFileSync(
@@ -1,2 +1,3 @@
1
+ export declare const safeCleanupDirectory: (dirPath: string, label?: string) => Promise<void>;
1
2
  export declare function findFileRecursively(directory: string, fileName: string): string | undefined;
2
3
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,cAAiB,KAChB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAgBpB"}
@@ -1,11 +1,55 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.safeCleanupDirectory = void 0;
6
40
  exports.findFileRecursively = findFileRecursively;
7
- const fs_1 = __importDefault(require("fs"));
41
+ const fs_1 = __importStar(require("fs"));
8
42
  const path_1 = __importDefault(require("path"));
43
+ const safeCleanupDirectory = async (dirPath, label = "cleanup") => {
44
+ try {
45
+ console.log(`[${label}] Cleaning up directory: ${dirPath}`);
46
+ await fs_1.promises.rm(dirPath, { recursive: true });
47
+ }
48
+ catch (error) {
49
+ console.warn(`[${label}] Failed to cleanup directory ${dirPath}:`, error instanceof Error ? error.message : String(error));
50
+ }
51
+ };
52
+ exports.safeCleanupDirectory = safeCleanupDirectory;
9
53
  function findFileRecursively(directory, fileName) {
10
54
  const files = fs_1.default.readdirSync(directory);
11
55
  for (const file of files) {
@@ -1,3 +1,2 @@
1
1
  export { getTypescriptTestBlock } from "../bin/utils/platform/web";
2
- export { truncateJsonValues } from "./json";
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}