Skip to content

Commit bb544d4

Browse files
author
lpb-docs
committed
Deployed 5d70872 to edge with MkDocs 1.6.1 and mike 2.2.0
1 parent 2c0d9b9 commit bb544d4

8 files changed

Lines changed: 307 additions & 310 deletions

File tree

edge/index.html

Lines changed: 146 additions & 149 deletions
Large diffs are not rendered by default.

edge/operations/subagent-spawning-pattern/index.html

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -881,56 +881,56 @@ <h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanen
881881
<p>When spawning subagents for browser testing, use the following pattern to ensure isolated sessions and structured JSON output.</p>
882882
<h2 id="steps">Steps<a class="headerlink" href="#steps" title="Permanent link">&para;</a></h2>
883883
<h3 id="1-generate-a-unique-session-id">1. Generate a Unique Session ID<a class="headerlink" href="#1-generate-a-unique-session-id" title="Permanent link">&para;</a></h3>
884-
<pre><code class="language-bash">SESSION_ID=$(npx tsx bin/session-uuid.ts &quot;${PI_WORKTREE_ID}-&lt;test-name&gt;&quot;)
885-
</code></pre>
884+
<div class="highlight"><pre><span></span><code><span class="nv">SESSION_ID</span><span class="o">=</span><span class="k">$(</span>npx<span class="w"> </span>tsx<span class="w"> </span>bin/session-uuid.ts<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PI_WORKTREE_ID</span><span class="si">}</span><span class="s2">-&lt;test-name&gt;&quot;</span><span class="k">)</span>
885+
</code></pre></div>
886886
<p>Example output: <code>pi-main-abc123-login-flow-7f3a9b2c</code></p>
887887
<h3 id="2-load-the-system-prompt-template">2. Load the System Prompt Template<a class="headerlink" href="#2-load-the-system-prompt-template" title="Permanent link">&para;</a></h3>
888-
<pre><code class="language-bash">PROMPT=$(cat subagent-browser-prompt.txt)
889-
</code></pre>
888+
<div class="highlight"><pre><span></span><code><span class="nv">PROMPT</span><span class="o">=</span><span class="k">$(</span>cat<span class="w"> </span>subagent-browser-prompt.txt<span class="k">)</span>
889+
</code></pre></div>
890890
<p>The template at <code>subagent-browser-prompt.txt</code> includes:
891891
- The JSON schema the subagent must produce
892892
- Instructions for using agent-browser with bundled Chrome
893893
- Metrics collection steps (vitals, a11y, snapshot)</p>
894894
<h3 id="3-spawn-the-subagent">3. Spawn the Subagent<a class="headerlink" href="#3-spawn-the-subagent" title="Permanent link">&para;</a></h3>
895-
<pre><code class="language-javascript">// Via the subagent tool in Pi:
896-
subagent({
897-
agent: &quot;researcher&quot;,
898-
task: `Run browser test on https://example.com:
899-
1. Navigate to the URL
900-
2. Verify the page loads correctly
901-
3. Check for accessibility issues
902-
4. Measure performance metrics
903-
904-
Session ID: ${SESSION_ID}
905-
Prompt: ${PROMPT}`,
906-
outputSchema: JSON.parse(readFileSync(&quot;subagent-browser-schema.json&quot;)),
907-
});
908-
</code></pre>
895+
<div class="highlight"><pre><span></span><code><span class="c1">// Via the subagent tool in Pi:</span>
896+
<span class="nx">subagent</span><span class="p">({</span>
897+
<span class="w"> </span><span class="nx">agent</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;researcher&quot;</span><span class="p">,</span>
898+
<span class="w"> </span><span class="nx">task</span><span class="o">:</span><span class="w"> </span><span class="sb">`Run browser test on https://example.com:</span>
899+
<span class="sb"> 1. Navigate to the URL</span>
900+
<span class="sb"> 2. Verify the page loads correctly</span>
901+
<span class="sb"> 3. Check for accessibility issues</span>
902+
<span class="sb"> 4. Measure performance metrics</span>
903+
904+
<span class="sb"> Session ID: </span><span class="si">${</span><span class="nx">SESSION_ID</span><span class="si">}</span>
905+
<span class="sb"> Prompt: </span><span class="si">${</span><span class="nx">PROMPT</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
906+
<span class="w"> </span><span class="nx">outputSchema</span><span class="o">:</span><span class="w"> </span><span class="nb">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s2">&quot;subagent-browser-schema.json&quot;</span><span class="p">)),</span>
907+
<span class="p">});</span>
908+
</code></pre></div>
909909
<h3 id="4-collect-and-validate-the-result">4. Collect and Validate the Result<a class="headerlink" href="#4-collect-and-validate-the-result" title="Permanent link">&para;</a></h3>
910-
<pre><code class="language-bash"># Pipe subagent output to the validator
911-
echo &quot;${SUBAGENT_OUTPUT}&quot; | npx tsx bin/validate-subagent-output.ts
910+
<div class="highlight"><pre><span></span><code><span class="c1"># Pipe subagent output to the validator</span>
911+
<span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">SUBAGENT_OUTPUT</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>npx<span class="w"> </span>tsx<span class="w"> </span>bin/validate-subagent-output.ts
912912

913-
# Close the browser session to prevent zombie processes
914-
agent-browser --session &quot;$SESSION_ID&quot; close
915-
</code></pre>
913+
<span class="c1"># Close the browser session to prevent zombie processes</span>
914+
agent-browser<span class="w"> </span>--session<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$SESSION_ID</span><span class="s2">&quot;</span><span class="w"> </span>close
915+
</code></pre></div>
916916
<h3 id="5-retry-on-failure-max-3-attempts">5. Retry on Failure (Max 3 Attempts)<a class="headerlink" href="#5-retry-on-failure-max-3-attempts" title="Permanent link">&para;</a></h3>
917-
<pre><code class="language-typescript">import { validate, buildRepairPrompt } from &quot;./bin/validate-subagent-output&quot;;
918-
919-
let output = await spawnSubagent(task);
920-
let result = validate(output);
921-
let attempts = 1;
922-
923-
while (!result.success &amp;&amp; attempts &lt; 3) {
924-
const repairPrompt = buildRepairPrompt(result.error!, originalTask);
925-
output = await spawnSubagent(repairPrompt);
926-
result = validate(output);
927-
attempts++;
928-
}
929-
930-
if (!result.success) {
931-
console.error(`Test failed after ${attempts} attempts: ${result.error}`);
932-
}
933-
</code></pre>
917+
<div class="highlight"><pre><span></span><code><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">validate</span><span class="p">,</span><span class="w"> </span><span class="nx">buildRepairPrompt</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s2">&quot;./bin/validate-subagent-output&quot;</span><span class="p">;</span>
918+
919+
<span class="kd">let</span><span class="w"> </span><span class="nx">output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">spawnSubagent</span><span class="p">(</span><span class="nx">task</span><span class="p">);</span>
920+
<span class="kd">let</span><span class="w"> </span><span class="nx">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">validate</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
921+
<span class="kd">let</span><span class="w"> </span><span class="nx">attempts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span>
922+
923+
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">result</span><span class="p">.</span><span class="nx">success</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">attempts</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mf">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
924+
<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">repairPrompt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">buildRepairPrompt</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">error</span><span class="o">!</span><span class="p">,</span><span class="w"> </span><span class="nx">originalTask</span><span class="p">);</span>
925+
<span class="w"> </span><span class="nx">output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">spawnSubagent</span><span class="p">(</span><span class="nx">repairPrompt</span><span class="p">);</span>
926+
<span class="w"> </span><span class="nx">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">validate</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
927+
<span class="w"> </span><span class="nx">attempts</span><span class="o">++</span><span class="p">;</span>
928+
<span class="p">}</span>
929+
930+
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">result</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
931+
<span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="sb">`Test failed after </span><span class="si">${</span><span class="nx">attempts</span><span class="si">}</span><span class="sb"> attempts: </span><span class="si">${</span><span class="nx">result</span><span class="p">.</span><span class="nx">error</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
932+
<span class="p">}</span>
933+
</code></pre></div>
934934
<h2 id="key-points">Key Points<a class="headerlink" href="#key-points" title="Permanent link">&para;</a></h2>
935935
<ul>
936936
<li><strong>Always use bundled Chrome</strong> (not CDP) for subagents</li>

edge/reference/fork-improvements/index.html

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,17 +1499,17 @@ <h2 id="subagents-fork-lpb-stackpi-subagents">Subagents Fork (<code>lpb-stack/pi
14991499
2. <code>model</code> field in agent <code>.md</code> frontmatter
15001500
3. <strong><code>globalDefaultModel</code></strong> from <code>pi-defaults.json</code> / <code>subagents.json</code> (centralized registry)
15011501
4. Parent session model (inherit)</p>
1502-
<p><strong>Configuration for local-first:</strong></p>
1503-
<pre><code class="language-json">{
1504-
&quot;extensions&quot;: {
1505-
&quot;@tintinweb/pi-subagents&quot;: {
1506-
&quot;globalDefaultModel&quot;: null,
1507-
&quot;disableDefaultAgents&quot;: true
1508-
}
1509-
}
1510-
}
1511-
</code></pre>
1512-
<p><code>globalDefaultModel: null</code> means subagents inherit whatever model the parent session uses — <strong>zero Anthropic dependency</strong>.</p>
1502+
<p><strong>Configuration for local-first:</strong>
1503+
<div class="highlight"><pre><span></span><code><span class="p">{</span>
1504+
<span class="w"> </span><span class="nt">&quot;extensions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
1505+
<span class="w"> </span><span class="nt">&quot;@tintinweb/pi-subagents&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
1506+
<span class="w"> </span><span class="nt">&quot;globalDefaultModel&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
1507+
<span class="w"> </span><span class="nt">&quot;disableDefaultAgents&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
1508+
<span class="w"> </span><span class="p">}</span>
1509+
<span class="w"> </span><span class="p">}</span>
1510+
<span class="p">}</span>
1511+
</code></pre></div>
1512+
<code>globalDefaultModel: null</code> means subagents inherit whatever model the parent session uses — <strong>zero Anthropic dependency</strong>.</p>
15131513
<p><strong>Verdict:</strong> This is the <strong>glue that makes the local-only stack work end-to-end</strong> — it ensures subagents (like <code>vision-analysis</code>, <code>researcher</code>, etc.) all use the session's local Qwen model instead of falling back to Anthropic.</p>
15141514
<hr />
15151515
<h2 id="lemonade-fork-lpb-stacklemonade-pi-plugin">Lemonade Fork (<code>lpb-stack/lemonade-pi-plugin</code>)<a class="headerlink" href="#lemonade-fork-lpb-stacklemonade-pi-plugin" title="Permanent link">&para;</a></h2>
@@ -1749,16 +1749,16 @@ <h3 id="9-documentation-version">9. Documentation &amp; Version<a class="headerl
17491749
<h2 id="key-design-decisions">Key Design Decisions<a class="headerlink" href="#key-design-decisions" title="Permanent link">&para;</a></h2>
17501750
<h3 id="patch-model">Patch Model<a class="headerlink" href="#patch-model" title="Permanent link">&para;</a></h3>
17511751
<p>All LocalPibox changes are kept as a <strong>single squashed commit</strong> on top of upstream <code>main</code>. The delta is always one clean patch.</p>
1752-
<pre><code>upstream main ──→ [latest] ──┐
1752+
<div class="highlight"><pre><span></span><code>upstream main ──→ [latest] ──┐
17531753
17541754
lpb-dev branch ──→ [lpb patch]──┘
1755-
</code></pre>
1756-
<p>To update:</p>
1757-
<pre><code class="language-bash">git fetch upstream main
1758-
git checkout lpb-dev
1759-
git rebase upstream/main
1760-
git push --force-with-lease origin lpb-dev
1761-
</code></pre>
1755+
</code></pre></div>
1756+
<p>To update:
1757+
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>fetch<span class="w"> </span>upstream<span class="w"> </span>main
1758+
git<span class="w"> </span>checkout<span class="w"> </span>lpb-dev
1759+
git<span class="w"> </span>rebase<span class="w"> </span>upstream/main
1760+
git<span class="w"> </span>push<span class="w"> </span>--force-with-lease<span class="w"> </span>origin<span class="w"> </span>lpb-dev
1761+
</code></pre></div></p>
17621762
<h3 id="why-the-ratios-matter">Why the Ratios Matter<a class="headerlink" href="#why-the-ratios-matter" title="Permanent link">&para;</a></h3>
17631763
<table>
17641764
<thead>
@@ -1815,20 +1815,20 @@ <h3 id="custom-agent-vision-analysis">Custom Agent (<code>vision-analysis</code>
18151815
2. <code>mcp</code><code>agent-browser_screenshot</code> — capture screenshot
18161816
3. <code>read</code> — pass image to session model for vision analysis
18171817
4. <code>mcp</code><code>agent-browser_close</code> — close browser</p>
1818-
<p><strong>Usage:</strong></p>
1819-
<pre><code class="language-bash">Agent(description: &quot;Vision analysis of &lt;url&gt;&quot;, subagent_type: &quot;vision-analysis&quot;, prompt: &quot;Analyze this page: &lt;url&gt;&quot;)
1820-
</code></pre>
1818+
<p><strong>Usage:</strong>
1819+
<div class="highlight"><pre><span></span><code>Agent<span class="o">(</span>description:<span class="w"> </span><span class="s2">&quot;Vision analysis of &lt;url&gt;&quot;</span>,<span class="w"> </span>subagent_type:<span class="w"> </span><span class="s2">&quot;vision-analysis&quot;</span>,<span class="w"> </span>prompt:<span class="w"> </span><span class="s2">&quot;Analyze this page: &lt;url&gt;&quot;</span><span class="o">)</span>
1820+
</code></pre></div></p>
18211821
<p>Runs in background, uses session model by default (can override with <code>model:</code> parameter).</p>
18221822
<h3 id="manual-alternative">Manual Alternative<a class="headerlink" href="#manual-alternative" title="Permanent link">&para;</a></h3>
1823-
<pre><code class="language-bash"># Open browser
1824-
mcp({ tool: &quot;agent-browser_open&quot;, args: { url: &quot;...&quot; } })
1825-
# Take screenshot
1826-
mcp({ tool: &quot;agent-browser_screenshot&quot;, args: {} })
1827-
# Read image (passes to session model)
1828-
read(path: &quot;/home/lpb/.agent-browser/tmp/screenshots/screenshot-xxx.png&quot;)
1829-
# Close browser
1830-
mcp({ tool: &quot;agent-browser_close&quot;, args: { all: false } })
1831-
</code></pre>
1823+
<div class="highlight"><pre><span></span><code><span class="c1"># Open browser</span>
1824+
mcp<span class="o">({</span><span class="w"> </span>tool:<span class="w"> </span><span class="s2">&quot;agent-browser_open&quot;</span>,<span class="w"> </span>args:<span class="w"> </span><span class="o">{</span><span class="w"> </span>url:<span class="w"> </span><span class="s2">&quot;...&quot;</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">})</span>
1825+
<span class="c1"># Take screenshot</span>
1826+
mcp<span class="o">({</span><span class="w"> </span>tool:<span class="w"> </span><span class="s2">&quot;agent-browser_screenshot&quot;</span>,<span class="w"> </span>args:<span class="w"> </span><span class="o">{}</span><span class="w"> </span><span class="o">})</span>
1827+
<span class="c1"># Read image (passes to session model)</span>
1828+
read<span class="o">(</span>path:<span class="w"> </span><span class="s2">&quot;/home/lpb/.agent-browser/tmp/screenshots/screenshot-xxx.png&quot;</span><span class="o">)</span>
1829+
<span class="c1"># Close browser</span>
1830+
mcp<span class="o">({</span><span class="w"> </span>tool:<span class="w"> </span><span class="s2">&quot;agent-browser_close&quot;</span>,<span class="w"> </span>args:<span class="w"> </span><span class="o">{</span><span class="w"> </span>all:<span class="w"> </span><span class="nb">false</span><span class="w"> </span><span class="o">}</span><span class="w"> </span><span class="o">})</span>
1831+
</code></pre></div>
18321832
<hr />
18331833
<h2 id="known-issues-mitigations">Known Issues &amp; Mitigations<a class="headerlink" href="#known-issues-mitigations" title="Permanent link">&para;</a></h2>
18341834
<h3 id="qwen3-thinking-overflow-2026-08-02">Qwen3 Thinking Overflow (2026-08-02)<a class="headerlink" href="#qwen3-thinking-overflow-2026-08-02" title="Permanent link">&para;</a></h3>

0 commit comments

Comments
 (0)