💬 Commit message: Update 2026-02-06 21:50:58, 15 files, 983 lines

📁 Files changed: 15
📝 Lines changed: 983

  • .gitignore
  • browser.ts.html
  • clover.xml
  • coverage-final.json
  • index.html
  • logger.ts.html
  • server.ts.html
  • types.ts.html
  • package.json
  • browser.integration.test.ts
  • logger.test.ts
  • server.test.ts
  • vitest.all.config.ts
  • vitest.config.ts
  • vitest.integration.config.ts
This commit is contained in:
Adam Ladachowski
2026-02-06 21:50:58 +01:00
parent 880e24877d
commit 4a85e0087c
15 changed files with 635 additions and 462 deletions
+156 -156
View File
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">58.42% </span>
<span class="strong">91.01% </span>
<span class="quiet">Statements</span>
<span class='fraction'>52/89</span>
<span class='fraction'>81/89</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">75.67% </span>
<span class="strong">89.18% </span>
<span class="quiet">Branches</span>
<span class='fraction'>28/37</span>
<span class='fraction'>33/37</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">80.95% </span>
<span class="strong">85.71% </span>
<span class="quiet">Functions</span>
<span class='fraction'>17/21</span>
<span class='fraction'>18/21</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">58.42% </span>
<span class="strong">91.01% </span>
<span class="quiet">Lines</span>
<span class='fraction'>52/89</span>
<span class='fraction'>81/89</span>
</div>
@@ -61,7 +61,7 @@
</div>
</template>
</div>
<div class='status-line medium'></div>
<div class='status-line high'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
@@ -270,13 +270,13 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -284,43 +284,43 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">44x</span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">32x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -329,8 +329,8 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
@@ -346,111 +346,67 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-yes">28x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -458,6 +414,50 @@
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -485,44 +485,44 @@ export class ClaudeBrowser {
};
}
&nbsp;
async <span class="fstat-no" title="function not covered" >launch(): Promise&lt;void&gt; {</span>
<span class="cstat-no" title="statement not covered" > this.browser = await webkit.launch({ headless: this.options.headless });</span>
<span class="cstat-no" title="statement not covered" > this.context = await this.browser.newContext({</span>
async launch(): Promise&lt;void&gt; {
this.browser = await webkit.launch({ headless: this.options.headless });
this.context = await this.browser.newContext({
viewport: {
width: this.options.width,
height: this.options.height,
},
});
<span class="cstat-no" title="statement not covered" > this.page = await this.context.newPage();</span>
this.page = await this.context.newPage();
}
&nbsp;
async close(): Promise&lt;void&gt; {
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.browser) {
<span class="cstat-no" title="statement not covered" > await this.browser.close();</span>
<span class="cstat-no" title="statement not covered" > this.browser = null;</span>
<span class="cstat-no" title="statement not covered" > this.context = null;</span>
<span class="cstat-no" title="statement not covered" > this.page = null;</span>
if (this.browser) {
await this.browser.close();
this.browser = null;
this.context = null;
this.page = null;
}
}
&nbsp;
private ensurePage(): Page {
<span class="missing-if-branch" title="else path not taken" >E</span>if (!this.page) {
if (!this.page) {
throw new Error('Browser not launched. Call launch() first.');
}
<span class="cstat-no" title="statement not covered" > return this.page;</span>
return this.page;
}
&nbsp;
async goto(url: string): Promise&lt;{ url: string; title: string }&gt; {
const page = this.ensurePage();
await page.goto(url, { waitUntil: 'networkidle' });
<span class="cstat-no" title="statement not covered" > return { url: page.url(), title: await page.title() };</span>
return { url: page.url(), title: await page.title() };
}
&nbsp;
async click(selector: string): Promise&lt;{ url: string }&gt; {
const page = this.ensurePage();
await page.click(selector);
<span class="cstat-no" title="statement not covered" > await page.waitForLoadState('networkidle').catch(<span class="fstat-no" title="function not covered" >() =&gt; {</span>});</span>
<span class="cstat-no" title="statement not covered" > return { url: page.url() };</span>
await page.waitForLoadState('networkidle').catch(<span class="fstat-no" title="function not covered" >() =&gt; {</span>});
return { url: page.url() };
}
&nbsp;
async type(selector: string, text: string): Promise&lt;void&gt; {
@@ -551,7 +551,7 @@ export class ClaudeBrowser {
const page = this.ensurePage();
const resolvedPath = resolve(path || <span class="branch-1 cbranch-no" title="branch not covered" >'screenshot.png')</span>;
const buffer = await page.screenshot({ path: resolvedPath, fullPage });
<span class="cstat-no" title="statement not covered" > return { path: resolvedPath, buffer };</span>
return { path: resolvedPath, buffer };
}
&nbsp;
async getUrl(): Promise&lt;{ url: string; title: string }&gt; {
@@ -562,25 +562,25 @@ export class ClaudeBrowser {
async getHtml(full = false): Promise&lt;string&gt; {
const page = this.ensurePage();
const html = await page.content();
<span class="cstat-no" title="statement not covered" > return full ? html : html.slice(0, 10000);</span>
return full ? html : html.slice(0, 10000);
}
&nbsp;
async back(): Promise&lt;{ url: string }&gt; {
const page = this.ensurePage();
await page.goBack();
<span class="cstat-no" title="statement not covered" > return { url: page.url() };</span>
return { url: page.url() };
}
&nbsp;
async forward(): Promise&lt;{ url: string }&gt; {
const page = this.ensurePage();
await page.goForward();
<span class="cstat-no" title="statement not covered" > return { url: page.url() };</span>
return { url: page.url() };
}
&nbsp;
async reload(): Promise&lt;{ url: string }&gt; {
const page = this.ensurePage();
await page.reload();
<span class="cstat-no" title="statement not covered" > return { url: page.url() };</span>
return { url: page.url() };
}
&nbsp;
async wait(ms = 1000): Promise&lt;void&gt; {
@@ -589,10 +589,10 @@ export class ClaudeBrowser {
}
&nbsp;
async newPage(): Promise&lt;void&gt; {
<span class="missing-if-branch" title="else path not taken" >E</span>if (!this.context) {
if (!this.context) {
throw new Error('Browser not launched. Call launch() first.');
}
<span class="cstat-no" title="statement not covered" > this.page = await this.context.newPage();</span>
this.page = await this.context.newPage();
}
&nbsp;
async eval(script: string): Promise&lt;unknown&gt; {
@@ -605,11 +605,11 @@ export class ClaudeBrowser {
switch (cmd.cmd) {
case 'goto': {
const result = await this.goto(cmd.url);
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'click': {
const result = await this.click(cmd.selector);
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'type': {
await this.type(cmd.selector, cmd.text);
@@ -617,39 +617,39 @@ export class ClaudeBrowser {
}
case 'query': {
const elements = await this.query(cmd.selector);
<span class="cstat-no" title="statement not covered" > return { ok: true, count: elements.length, elements };</span>
return { ok: true, count: elements.length, elements };
}
case 'screenshot': {
const result = await this.screenshot(cmd.path, cmd.fullPage);
<span class="cstat-no" title="statement not covered" > return { ok: true, path: result.path };</span>
return { ok: true, path: result.path };
}
case 'url': {
const result = await this.getUrl();
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'html': {
const html = await this.getHtml(cmd.full);
<span class="cstat-no" title="statement not covered" > return { ok: true, html };</span>
return { ok: true, html };
}
case 'back': {
const result = await this.back();
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'forward': {
const result = await this.forward();
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'reload': {
const result = await this.reload();
<span class="cstat-no" title="statement not covered" > return { ok: true, ...result };</span>
return { ok: true, ...result };
}
case 'wait': {
await this.wait(cmd.ms);
<span class="cstat-no" title="statement not covered" > return { ok: true };</span>
return { ok: true };
}
case 'newpage': {
await this.newPage();
<span class="cstat-no" title="statement not covered" > return { ok: true };</span>
return { ok: true };
}
case 'close': {
await this.close();
@@ -657,7 +657,7 @@ export class ClaudeBrowser {
}
case 'eval': {
const result = await this.eval(cmd.script);
<span class="cstat-no" title="statement not covered" > return { ok: true, result };</span>
return { ok: true, result };
}
<span class="branch-14 cbranch-no" title="branch not covered" > default: {</span>
const _exhaustive: never = <span class="cstat-no" title="statement not covered" >cmd;</span>
@@ -676,7 +676,7 @@ export class ClaudeBrowser {
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-02-06T20:43:25.074Z
at 2026-02-06T20:50:54.063Z
</div>
<script src="prettify.js"></script>
<script>