codeloop-mcp-server 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +550 -40
- package/dist/index.js.map +1 -1
- package/dist/project-discovery.d.ts +17 -0
- package/dist/project-discovery.d.ts.map +1 -0
- package/dist/project-discovery.js +109 -0
- package/dist/project-discovery.js.map +1 -0
- package/dist/runners/app_logger.d.ts +31 -0
- package/dist/runners/app_logger.d.ts.map +1 -0
- package/dist/runners/app_logger.js +203 -0
- package/dist/runners/app_logger.js.map +1 -0
- package/dist/runners/base.d.ts.map +1 -1
- package/dist/runners/base.js +4 -2
- package/dist/runners/base.js.map +1 -1
- package/dist/runners/flutter.d.ts +1 -0
- package/dist/runners/flutter.d.ts.map +1 -1
- package/dist/runners/flutter.js +29 -0
- package/dist/runners/flutter.js.map +1 -1
- package/dist/runners/platform_detect.d.ts +14 -0
- package/dist/runners/platform_detect.d.ts.map +1 -0
- package/dist/runners/platform_detect.js +102 -0
- package/dist/runners/platform_detect.js.map +1 -0
- package/dist/runners/screenshot.d.ts +3 -7
- package/dist/runners/screenshot.d.ts.map +1 -1
- package/dist/runners/screenshot.js +115 -28
- package/dist/runners/screenshot.js.map +1 -1
- package/dist/runners/video_recorder.d.ts +47 -0
- package/dist/runners/video_recorder.d.ts.map +1 -0
- package/dist/runners/video_recorder.js +478 -0
- package/dist/runners/video_recorder.js.map +1 -0
- package/dist/runners/window_manager.d.ts +55 -0
- package/dist/runners/window_manager.d.ts.map +1 -0
- package/dist/runners/window_manager.js +481 -0
- package/dist/runners/window_manager.js.map +1 -0
- package/dist/tools/design_compare.d.ts +1 -1
- package/dist/tools/design_compare.d.ts.map +1 -1
- package/dist/tools/design_compare.js +1 -2
- package/dist/tools/design_compare.js.map +1 -1
- package/dist/tools/discover_screens.d.ts +3 -3
- package/dist/tools/discover_screens.d.ts.map +1 -1
- package/dist/tools/discover_screens.js +140 -157
- package/dist/tools/discover_screens.js.map +1 -1
- package/dist/tools/gate_check.js +13 -1
- package/dist/tools/gate_check.js.map +1 -1
- package/dist/tools/init-project.d.ts +15 -0
- package/dist/tools/init-project.d.ts.map +1 -0
- package/dist/tools/init-project.js +273 -0
- package/dist/tools/init-project.js.map +1 -0
- package/dist/tools/interaction_replay.d.ts +2 -1
- package/dist/tools/interaction_replay.d.ts.map +1 -1
- package/dist/tools/interaction_replay.js +24 -2
- package/dist/tools/interaction_replay.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +203 -52
- package/dist/tools/verify.js.map +1 -1
- package/dist/tools/visual_review.d.ts +1 -1
- package/dist/tools/visual_review.d.ts.map +1 -1
- package/dist/tools/visual_review.js +1 -2
- package/dist/tools/visual_review.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
export async function runInitProject(input) {
|
|
4
|
+
const cwd = input.project_dir;
|
|
5
|
+
const projectType = input.project_type === "auto" || !input.project_type
|
|
6
|
+
? detectProjectType(cwd)
|
|
7
|
+
: input.project_type;
|
|
8
|
+
const ide = detectIDE(cwd);
|
|
9
|
+
const filesCreated = [];
|
|
10
|
+
const filesMerged = [];
|
|
11
|
+
// 1. Create .codeloop/config.json
|
|
12
|
+
const configPath = join(cwd, ".codeloop", "config.json");
|
|
13
|
+
if (!existsSync(configPath)) {
|
|
14
|
+
const apiKey = process.env.CODELOOP_API_KEY || "";
|
|
15
|
+
const config = createConfig(apiKey, projectType);
|
|
16
|
+
writeFileEnsureDir(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
17
|
+
filesCreated.push(".codeloop/config.json");
|
|
18
|
+
}
|
|
19
|
+
// 2. Create artifacts directory
|
|
20
|
+
const artifactsDir = join(cwd, "artifacts");
|
|
21
|
+
if (!existsSync(artifactsDir)) {
|
|
22
|
+
mkdirSync(artifactsDir, { recursive: true });
|
|
23
|
+
filesCreated.push("artifacts/");
|
|
24
|
+
}
|
|
25
|
+
// 3. IDE-specific setup
|
|
26
|
+
if (ide === "cursor" || ide === "both") {
|
|
27
|
+
setupCursorProject(cwd, projectType, filesCreated, filesMerged);
|
|
28
|
+
}
|
|
29
|
+
if (ide === "claude" || ide === "both") {
|
|
30
|
+
setupClaudeProject(cwd, projectType, filesCreated, filesMerged);
|
|
31
|
+
}
|
|
32
|
+
if (ide === "unknown") {
|
|
33
|
+
setupCursorProject(cwd, projectType, filesCreated, filesMerged);
|
|
34
|
+
setupClaudeProject(cwd, projectType, filesCreated, filesMerged);
|
|
35
|
+
}
|
|
36
|
+
// 4. Update .gitignore
|
|
37
|
+
updateGitignore(cwd, filesCreated);
|
|
38
|
+
return {
|
|
39
|
+
initialized: true,
|
|
40
|
+
project_dir: cwd,
|
|
41
|
+
project_type: projectType,
|
|
42
|
+
ide_detected: ide,
|
|
43
|
+
files_created: filesCreated,
|
|
44
|
+
files_merged: filesMerged,
|
|
45
|
+
message: `CodeLoop initialized for ${projectType} project. Created ${filesCreated.length} files, merged ${filesMerged.length} configs.`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function detectProjectType(cwd) {
|
|
49
|
+
if (existsSync(join(cwd, "pubspec.yaml")))
|
|
50
|
+
return "flutter";
|
|
51
|
+
if (existsSync(join(cwd, "playwright.config.ts")) ||
|
|
52
|
+
existsSync(join(cwd, "playwright.config.js")))
|
|
53
|
+
return "web";
|
|
54
|
+
if (existsSync(join(cwd, "package.json"))) {
|
|
55
|
+
try {
|
|
56
|
+
const pkg = JSON.parse(readFileSync(join(cwd, "package.json"), "utf-8"));
|
|
57
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
58
|
+
const webFrameworks = [
|
|
59
|
+
"react", "next", "vue", "nuxt", "svelte", "@sveltejs/kit",
|
|
60
|
+
"angular", "@angular/core", "gatsby", "remix", "astro", "vite",
|
|
61
|
+
"@playwright/test",
|
|
62
|
+
];
|
|
63
|
+
if (webFrameworks.some(fw => fw in deps))
|
|
64
|
+
return "web";
|
|
65
|
+
}
|
|
66
|
+
catch { /* fall through */ }
|
|
67
|
+
return "node";
|
|
68
|
+
}
|
|
69
|
+
if (hasFileWith(cwd, ".xcodeproj") || hasFileWith(cwd, ".xcworkspace"))
|
|
70
|
+
return "xcode";
|
|
71
|
+
if (existsSync(join(cwd, "build.gradle")) || existsSync(join(cwd, "build.gradle.kts")))
|
|
72
|
+
return "android";
|
|
73
|
+
if (hasFileWith(cwd, ".sln") || hasFileWith(cwd, ".csproj"))
|
|
74
|
+
return "dotnet";
|
|
75
|
+
return "unknown";
|
|
76
|
+
}
|
|
77
|
+
function hasFileWith(dir, ext) {
|
|
78
|
+
try {
|
|
79
|
+
return readdirSync(dir).some(f => f.endsWith(ext));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function detectIDE(cwd) {
|
|
86
|
+
const hasCursor = existsSync(join(cwd, ".cursor"));
|
|
87
|
+
const hasClaude = existsSync(join(cwd, ".claude")) || existsSync(join(cwd, "CLAUDE.md"));
|
|
88
|
+
if (hasCursor && hasClaude)
|
|
89
|
+
return "both";
|
|
90
|
+
if (hasCursor)
|
|
91
|
+
return "cursor";
|
|
92
|
+
if (hasClaude)
|
|
93
|
+
return "claude";
|
|
94
|
+
return "unknown";
|
|
95
|
+
}
|
|
96
|
+
function createConfig(apiKey, projectType) {
|
|
97
|
+
return {
|
|
98
|
+
api_key: apiKey,
|
|
99
|
+
vision_model: "auto",
|
|
100
|
+
platforms: projectType !== "unknown" ? [projectType] : ["auto"],
|
|
101
|
+
screenshot_viewports: ["375x812", "390x844", "1440x900"],
|
|
102
|
+
design_match_threshold: 0.85,
|
|
103
|
+
max_loop_iterations: 10,
|
|
104
|
+
auto_verify_on_complete: true,
|
|
105
|
+
auto_gate_check: true,
|
|
106
|
+
recommendations: {
|
|
107
|
+
enabled: true,
|
|
108
|
+
external_tools: true,
|
|
109
|
+
sponsored: false,
|
|
110
|
+
preferences: {
|
|
111
|
+
budget: "low",
|
|
112
|
+
self_hosted: false,
|
|
113
|
+
open_source_only: false,
|
|
114
|
+
gdpr_sensitive: false,
|
|
115
|
+
preferred_cloud: "",
|
|
116
|
+
region: "",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
evidence: {
|
|
120
|
+
capture_screenshots: true,
|
|
121
|
+
capture_traces: true,
|
|
122
|
+
capture_videos: true,
|
|
123
|
+
baseline_auto_update: false,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function setupCursorProject(cwd, projectType, filesCreated, filesMerged) {
|
|
128
|
+
// Merge MCP config
|
|
129
|
+
const mcpPath = join(cwd, ".cursor", "mcp.json");
|
|
130
|
+
mergeMcpEntry(mcpPath);
|
|
131
|
+
filesMerged.push(".cursor/mcp.json");
|
|
132
|
+
// Create core rules
|
|
133
|
+
const rulesDir = join(cwd, ".cursor", "rules");
|
|
134
|
+
if (!existsSync(rulesDir))
|
|
135
|
+
mkdirSync(rulesDir, { recursive: true });
|
|
136
|
+
writeIfMissing(join(rulesDir, "core.mdc"), CORE_RULE, filesCreated, ".cursor/rules/core.mdc");
|
|
137
|
+
writeIfMissing(join(rulesDir, "loop.mdc"), LOOP_RULE, filesCreated, ".cursor/rules/loop.mdc");
|
|
138
|
+
if (projectType === "web") {
|
|
139
|
+
writeIfMissing(join(rulesDir, "web.mdc"), WEB_RULE, filesCreated, ".cursor/rules/web.mdc");
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function setupClaudeProject(cwd, projectType, filesCreated, filesMerged) {
|
|
143
|
+
// Merge MCP config
|
|
144
|
+
const settingsPath = join(cwd, ".claude", "settings.local.json");
|
|
145
|
+
mergeMcpEntry(settingsPath);
|
|
146
|
+
filesMerged.push(".claude/settings.local.json");
|
|
147
|
+
// Create CLAUDE.md
|
|
148
|
+
const claudeMdPath = join(cwd, "CLAUDE.md");
|
|
149
|
+
const platformNote = projectType === "web"
|
|
150
|
+
? "\n- For web projects: run `codeloop_verify` with platform 'web' after UI changes"
|
|
151
|
+
: "";
|
|
152
|
+
writeIfMissing(claudeMdPath, CLAUDE_RULE(platformNote), filesCreated, "CLAUDE.md");
|
|
153
|
+
}
|
|
154
|
+
function mergeMcpEntry(filePath) {
|
|
155
|
+
const dir = dirname(filePath);
|
|
156
|
+
if (!existsSync(dir))
|
|
157
|
+
mkdirSync(dir, { recursive: true });
|
|
158
|
+
let existing = {};
|
|
159
|
+
if (existsSync(filePath)) {
|
|
160
|
+
try {
|
|
161
|
+
existing = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
162
|
+
}
|
|
163
|
+
catch { /* use empty */ }
|
|
164
|
+
}
|
|
165
|
+
const servers = (existing.mcpServers ?? {});
|
|
166
|
+
if (!servers.codeloop) {
|
|
167
|
+
servers.codeloop = {
|
|
168
|
+
command: "npx",
|
|
169
|
+
args: ["-y", "codeloop-mcp-server"],
|
|
170
|
+
env: { CODELOOP_API_KEY: "${CODELOOP_API_KEY}" },
|
|
171
|
+
};
|
|
172
|
+
existing.mcpServers = servers;
|
|
173
|
+
writeFileSync(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function updateGitignore(cwd, filesCreated) {
|
|
177
|
+
const gitignorePath = join(cwd, ".gitignore");
|
|
178
|
+
const entries = [".codeloop/config.json", "artifacts/", ".env", ".env.*", "!.env.example"];
|
|
179
|
+
let content = "";
|
|
180
|
+
if (existsSync(gitignorePath)) {
|
|
181
|
+
content = readFileSync(gitignorePath, "utf-8");
|
|
182
|
+
}
|
|
183
|
+
const newEntries = entries.filter(e => !content.includes(e));
|
|
184
|
+
if (newEntries.length > 0) {
|
|
185
|
+
const addition = (content.endsWith("\n") ? "" : "\n") +
|
|
186
|
+
"\n# CodeLoop\n" + newEntries.join("\n") + "\n";
|
|
187
|
+
writeFileSync(gitignorePath, content + addition, "utf-8");
|
|
188
|
+
filesCreated.push(".gitignore");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function writeFileEnsureDir(filePath, content) {
|
|
192
|
+
const dir = dirname(filePath);
|
|
193
|
+
if (!existsSync(dir))
|
|
194
|
+
mkdirSync(dir, { recursive: true });
|
|
195
|
+
writeFileSync(filePath, content, "utf-8");
|
|
196
|
+
}
|
|
197
|
+
function writeIfMissing(filePath, content, filesCreated, displayPath) {
|
|
198
|
+
if (!existsSync(filePath)) {
|
|
199
|
+
writeFileEnsureDir(filePath, content);
|
|
200
|
+
filesCreated.push(displayPath);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Minimal rule templates — enough to activate CodeLoop's verification loop.
|
|
204
|
+
// Full templates are available via `npx codeloop init` (CLI package).
|
|
205
|
+
const CORE_RULE = `---
|
|
206
|
+
description: CodeLoop automated verification — core workflow
|
|
207
|
+
globs: "**/*"
|
|
208
|
+
alwaysApply: true
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
# CodeLoop Core Rules
|
|
212
|
+
|
|
213
|
+
## After every code change
|
|
214
|
+
|
|
215
|
+
1. Call \`codeloop_verify\` to run tests and static analysis
|
|
216
|
+
2. Call \`codeloop_capture_screenshot\` to capture visual evidence
|
|
217
|
+
3. If tests fail, call \`codeloop_diagnose\` and fix issues
|
|
218
|
+
4. Call \`codeloop_gate_check\` before marking complete
|
|
219
|
+
|
|
220
|
+
## Never
|
|
221
|
+
|
|
222
|
+
- Never skip verification after code changes
|
|
223
|
+
- Never mark a task complete without evidence
|
|
224
|
+
- Never ignore test failures
|
|
225
|
+
`;
|
|
226
|
+
const LOOP_RULE = `---
|
|
227
|
+
description: CodeLoop verify-diagnose-fix cycle
|
|
228
|
+
globs: "**/*"
|
|
229
|
+
alwaysApply: false
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
# CodeLoop Loop
|
|
233
|
+
|
|
234
|
+
When implementing features:
|
|
235
|
+
|
|
236
|
+
1. Make the code change
|
|
237
|
+
2. \`codeloop_verify\` — run tests
|
|
238
|
+
3. If failures → \`codeloop_diagnose\` → fix → goto 2
|
|
239
|
+
4. \`codeloop_capture_screenshot\` — visual evidence
|
|
240
|
+
5. \`codeloop_gate_check\` — final quality gate
|
|
241
|
+
`;
|
|
242
|
+
const WEB_RULE = `---
|
|
243
|
+
description: CodeLoop web project verification
|
|
244
|
+
globs: "**/*.{ts,tsx,js,jsx,html,css}"
|
|
245
|
+
alwaysApply: false
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
# CodeLoop Web Rules
|
|
249
|
+
|
|
250
|
+
## Verification for web projects
|
|
251
|
+
|
|
252
|
+
- Use platform "web" with \`codeloop_verify\`
|
|
253
|
+
- Playwright tests are the primary verification method
|
|
254
|
+
- Capture screenshots at key viewports (375, 390, 1440)
|
|
255
|
+
- Use \`codeloop_start_recording\` for interaction testing
|
|
256
|
+
- Interact with ALL elements during video capture
|
|
257
|
+
`;
|
|
258
|
+
function CLAUDE_RULE(platformNote) {
|
|
259
|
+
return `# CodeLoop Integration
|
|
260
|
+
|
|
261
|
+
This project uses CodeLoop for automated verification.
|
|
262
|
+
|
|
263
|
+
## After every code change
|
|
264
|
+
|
|
265
|
+
1. Call \`codeloop_verify\` to run tests and static analysis
|
|
266
|
+
2. Call \`codeloop_capture_screenshot\` for visual evidence
|
|
267
|
+
3. If tests fail, call \`codeloop_diagnose\` and fix issues
|
|
268
|
+
4. Call \`codeloop_gate_check\` before marking complete${platformNote}
|
|
269
|
+
|
|
270
|
+
## Never skip verification after code changes.
|
|
271
|
+
`;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=init-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../src/tools/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,11 @@ export interface InteractionReplayOutput {
|
|
|
10
10
|
framePaths: string[];
|
|
11
11
|
expected_flow: string;
|
|
12
12
|
ffmpeg_available: boolean;
|
|
13
|
+
logExcerpt?: string;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
16
|
* Extracts key frames from a video recording and returns their paths
|
|
16
17
|
* for the AI agent to analyze via its own vision model.
|
|
17
18
|
*/
|
|
18
|
-
export declare function runInteractionReplay(input: InteractionReplayInput, _config: CodeLoopConfig): Promise<InteractionReplayOutput>;
|
|
19
|
+
export declare function runInteractionReplay(input: InteractionReplayInput, _config: CodeLoopConfig, cwd?: string): Promise<InteractionReplayOutput>;
|
|
19
20
|
//# sourceMappingURL=interaction_replay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction_replay.d.ts","sourceRoot":"","sources":["../../src/tools/interaction_replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"interaction_replay.d.ts","sourceRoot":"","sources":["../../src/tools/interaction_replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAO3D,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiFD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,uBAAuB,CAAC,CAyElC"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readdirSync, mkdirSync } from "fs";
|
|
|
2
2
|
import { join, resolve } from "path";
|
|
3
3
|
import { execFile } from "child_process";
|
|
4
4
|
import { getArtifactsBaseDir, getRunDir, listRuns } from "../evidence/artifacts.js";
|
|
5
|
+
import { readLogTail } from "../runners/app_logger.js";
|
|
5
6
|
function findVideoInRun(runId, cwd) {
|
|
6
7
|
const base = getArtifactsBaseDir(cwd);
|
|
7
8
|
const videosDir = join(getRunDir(runId, base), "videos");
|
|
@@ -13,6 +14,14 @@ function findVideoInRun(runId, cwd) {
|
|
|
13
14
|
});
|
|
14
15
|
return files.length > 0 ? join(videosDir, files[0]) : null;
|
|
15
16
|
}
|
|
17
|
+
function findLogInRun(runId, cwd) {
|
|
18
|
+
const base = getArtifactsBaseDir(cwd);
|
|
19
|
+
const logsDir = join(getRunDir(runId, base), "logs");
|
|
20
|
+
if (!existsSync(logsDir))
|
|
21
|
+
return null;
|
|
22
|
+
const files = readdirSync(logsDir).filter((f) => f.startsWith("app_log_") && f.endsWith(".txt"));
|
|
23
|
+
return files.length > 0 ? join(logsDir, files[0]) : null;
|
|
24
|
+
}
|
|
16
25
|
const MAX_FRAMES = 15;
|
|
17
26
|
function extractFrames(videoPath, outputDir, maxFrames) {
|
|
18
27
|
return new Promise((resolveP, reject) => {
|
|
@@ -63,8 +72,7 @@ function isFfmpegAvailable() {
|
|
|
63
72
|
* Extracts key frames from a video recording and returns their paths
|
|
64
73
|
* for the AI agent to analyze via its own vision model.
|
|
65
74
|
*/
|
|
66
|
-
export async function runInteractionReplay(input, _config) {
|
|
67
|
-
const cwd = process.cwd();
|
|
75
|
+
export async function runInteractionReplay(input, _config, cwd = process.cwd()) {
|
|
68
76
|
let videoPath = null;
|
|
69
77
|
if (input.video_path) {
|
|
70
78
|
videoPath = resolve(cwd, input.video_path);
|
|
@@ -78,6 +86,16 @@ export async function runInteractionReplay(input, _config) {
|
|
|
78
86
|
videoPath = findVideoInRun(runs[0], cwd);
|
|
79
87
|
}
|
|
80
88
|
}
|
|
89
|
+
// Find log file for this run (if available)
|
|
90
|
+
let logExcerpt;
|
|
91
|
+
if (input.run_id) {
|
|
92
|
+
const logPath = findLogInRun(input.run_id, cwd);
|
|
93
|
+
if (logPath) {
|
|
94
|
+
const content = readLogTail(logPath, 200);
|
|
95
|
+
if (content.trim())
|
|
96
|
+
logExcerpt = content;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
81
99
|
if (!videoPath || !existsSync(videoPath)) {
|
|
82
100
|
return {
|
|
83
101
|
video_analyzed: videoPath ?? "(none)",
|
|
@@ -85,6 +103,7 @@ export async function runInteractionReplay(input, _config) {
|
|
|
85
103
|
framePaths: [],
|
|
86
104
|
expected_flow: input.expected_flow,
|
|
87
105
|
ffmpeg_available: false,
|
|
106
|
+
logExcerpt,
|
|
88
107
|
};
|
|
89
108
|
}
|
|
90
109
|
const hasFfmpeg = await isFfmpegAvailable();
|
|
@@ -95,6 +114,7 @@ export async function runInteractionReplay(input, _config) {
|
|
|
95
114
|
framePaths: [],
|
|
96
115
|
expected_flow: input.expected_flow,
|
|
97
116
|
ffmpeg_available: false,
|
|
117
|
+
logExcerpt,
|
|
98
118
|
};
|
|
99
119
|
}
|
|
100
120
|
const framesDir = join(getArtifactsBaseDir(cwd), "replay_frames", `frames_${Date.now()}`);
|
|
@@ -106,6 +126,7 @@ export async function runInteractionReplay(input, _config) {
|
|
|
106
126
|
framePaths,
|
|
107
127
|
expected_flow: input.expected_flow,
|
|
108
128
|
ffmpeg_available: true,
|
|
129
|
+
logExcerpt,
|
|
109
130
|
};
|
|
110
131
|
}
|
|
111
132
|
catch {
|
|
@@ -115,6 +136,7 @@ export async function runInteractionReplay(input, _config) {
|
|
|
115
136
|
framePaths: [],
|
|
116
137
|
expected_flow: input.expected_flow,
|
|
117
138
|
ffmpeg_available: true,
|
|
139
|
+
logExcerpt,
|
|
118
140
|
};
|
|
119
141
|
}
|
|
120
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction_replay.js","sourceRoot":"","sources":["../../src/tools/interaction_replay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"interaction_replay.js","sourceRoot":"","sources":["../../src/tools/interaction_replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/tools/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA0BlD;AAQD,wBAAsB,SAAS,CAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAqKvB"}
|