diff --git a/client/src/pages/run/RunDetailPage.tsx b/client/src/pages/run/RunDetailPage.tsx index 6f89590..25aa3aa 100644 --- a/client/src/pages/run/RunDetailPage.tsx +++ b/client/src/pages/run/RunDetailPage.tsx @@ -154,7 +154,7 @@ export function RunDetailPage() { }, [id, runId]); const stepColumns: TableColumn[] = [ - { key: 'order', header: t('runs.step_order'), render: (s) => s.order, width: 50 }, + { key: 'order', header: t('runs.step_order'), render: (s) => s.order + 1, width: 50 }, { key: 'title', header: t('runs.step_title'), diff --git a/server/src/browser/browser.module.ts b/server/src/browser/browser.module.ts index 7e1ea3c..07152a3 100644 --- a/server/src/browser/browser.module.ts +++ b/server/src/browser/browser.module.ts @@ -3,9 +3,10 @@ import { BrowserController } from "./browser.controller"; import { BrowserService } from "./browser.service"; import { SessionModule } from "../session/session.module"; import { CodeExecutorModule } from "../code-executor/code-executor.module"; +import { SnippetModule } from "../snippet/snippet.module"; @Module({ - imports: [SessionModule, CodeExecutorModule], + imports: [SessionModule, CodeExecutorModule, SnippetModule], controllers: [BrowserController], providers: [BrowserService], exports: [BrowserService], diff --git a/server/src/browser/browser.service.ts b/server/src/browser/browser.service.ts index ddc5767..abd84d6 100644 --- a/server/src/browser/browser.service.ts +++ b/server/src/browser/browser.service.ts @@ -12,6 +12,7 @@ import { SessionContextService } from "../session/session-context.service"; import { SessionService } from "../session/session.service"; import { CodeExecutorService } from "../code-executor/code-executor.service"; import type { ExecResult } from "../code-executor/code-executor.service"; +import { SnippetService } from "../snippet/snippet.service"; import type { Cookie } from "playwright"; export type { ExecResult } from "../code-executor/code-executor.service"; @@ -30,6 +31,7 @@ export class BrowserService { private readonly sessionContextService: SessionContextService, private readonly sessionService: SessionService, private readonly codeExecutor: CodeExecutorService, + private readonly snippetService: SnippetService, ) {} private parseCookies(raw: string | null | undefined): Cookie[] { @@ -171,13 +173,25 @@ export class BrowserService { const { page, context } = await this.getOrCreateNamedHandle(sessionName); this.logger.log(`[${label}] exec: using persistent context`); + const snippets = await this.snippetService + .buildSnippetMap() + .catch(() => ({}) as Record); try { if (url) { this.logger.log(`[${label}] exec: navigating to ${url}`); await page.goto(url, { waitUntil: "networkidle" }); } this.logger.log(`[${label}] exec: running user code`); - const result = await this.codeExecutor.execute(page, context, code); + const result = await this.codeExecutor.execute( + page, + context, + code, + undefined, + undefined, + undefined, + undefined, + snippets, + ); this.logger.log(`[${label}] exec: done`); return result; } catch (err) { @@ -186,6 +200,9 @@ export class BrowserService { } // Anonymous — ephemeral browser + const snippetMap = await this.snippetService + .buildSnippetMap() + .catch(() => ({}) as Record); const browser = await chromium.launch({ headless: true, executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH, @@ -200,7 +217,16 @@ export class BrowserService { } this.logger.log(`[${label}] exec: running user code`); - const result = await this.codeExecutor.execute(page, context, code); + const result = await this.codeExecutor.execute( + page, + context, + code, + undefined, + undefined, + undefined, + undefined, + snippetMap, + ); this.logger.log(`[${label}] exec: done`); return result; } catch (err) {