blnkfld 0.1.3 → 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/README.md +2 -0
- package/cli/main.mjs +8 -0
- package/cli/report.mjs +12 -5
- package/cli/update.mjs +57 -0
- package/dist/client/assets/index-9KPr1HmV.css +1 -0
- package/dist/client/assets/{index-CdZXK9Na.js → index-Oy6E_vaZ.js} +1 -1
- package/dist/client/index.html +4 -4
- package/package.json +1 -1
- package/dist/client/assets/index-Crhw2Ojp.css +0 -1
package/README.md
CHANGED
|
@@ -22,6 +22,8 @@ node /absolute/path/to/blnkfld/cli/main.mjs /absolute/path/to/project
|
|
|
22
22
|
|
|
23
23
|
The command analyzes the project, validates the report, saves `.blnkfld/report.json`, starts a loopback server, and opens your browser. The Three.js interface displays the generated report, with System Overview first and a separate System Architecture diagram. When WebGL is unavailable, an interactive isometric SVG view preserves the components, connections, action playback, and source inspection. Run it again to refresh the analysis. Press Ctrl+C to stop. Use `--no-open` for a terminal-only environment, `--port 4174` to choose a port, or `--report-only` to save the report and exit.
|
|
24
24
|
|
|
25
|
+
On startup, blnkfld asks npm for the latest release. If your cached copy is older, it reruns the same command with the latest version, so `npx blnkfld` always stays current. The check times out after two seconds and falls back to the installed version when offline. Set `BLNKFLD_NO_UPDATE=1` to skip it; it is also skipped when `CI` is set.
|
|
26
|
+
|
|
25
27
|
## What the agent produces
|
|
26
28
|
|
|
27
29
|
- Project purpose, constraints, stack, and source-backed how-to-run instructions.
|
package/cli/main.mjs
CHANGED
|
@@ -6,6 +6,7 @@ import { spawn } from 'node:child_process';
|
|
|
6
6
|
import { selectAgent, analyze, run } from './agent.mjs';
|
|
7
7
|
import { validateAnalysis, toViewReport } from './report.mjs';
|
|
8
8
|
import { serve } from './server.mjs';
|
|
9
|
+
import { updateTarget, handoff } from './update.mjs';
|
|
9
10
|
|
|
10
11
|
const ignored=new Set(['.git','.blnkfld','node_modules','dist','build','.next','coverage','.venv','venv','vendor']);
|
|
11
12
|
async function inventory(root) {
|
|
@@ -26,6 +27,13 @@ async function main() {
|
|
|
26
27
|
const {values,positionals}=parseArgs({options:{help:{type:'boolean',short:'h'},agent:{type:'string',default:'auto'},'no-open':{type:'boolean'},port:{type:'string'},'report-only':{type:'boolean'}},allowPositionals:true});
|
|
27
28
|
if(values.help){console.log('Usage: blnkfld [project-directory] [--agent auto|codex|claude] [--no-open] [--port PORT] [--report-only]\n\nAnalyze a project with your signed-in coding agent and open its visual brief.\nRequires Node 22+ and a signed-in Codex or Claude Code CLI.\nThe analysis uses your agent account and may consume its usage allowance.\nReports are saved in .blnkfld/report.json. Ctrl+C stops the preview.');return;}
|
|
28
29
|
if(positionals.length>1)throw new Error('Provide at most one project directory.');
|
|
30
|
+
const update=await updateTarget();
|
|
31
|
+
if(update){
|
|
32
|
+
console.log(`Updating blnkfld ${update.current} → ${update.latest}…`);
|
|
33
|
+
const code=await handoff(update.latest,process.argv.slice(2));
|
|
34
|
+
if(code!==null){process.exitCode=code;return;}
|
|
35
|
+
console.log(`Could not start blnkfld ${update.latest}; continuing with ${update.current}.`);
|
|
36
|
+
}
|
|
29
37
|
if(!['auto','codex','claude'].includes(values.agent))throw new Error('Agent must be auto, codex, or claude.');
|
|
30
38
|
const port=values.port===undefined?0:Number(values.port);
|
|
31
39
|
if(!Number.isInteger(port)||port<0||port>65535)throw new Error('Port must be an integer from 0 to 65535.');
|
package/cli/report.mjs
CHANGED
|
@@ -48,15 +48,22 @@ export async function validateAnalysis(input, root) {
|
|
|
48
48
|
if(item.endLine < item.startLine || item.endLine > lines.length) throw new Error(`Invalid source lines: ${item.path}:${item.startLine}-${item.endLine}`);
|
|
49
49
|
evidence.set(item.path,{...item,excerpt:lines.slice(item.startLine-1,item.endLine).join('\n').slice(0,16000)});
|
|
50
50
|
}
|
|
51
|
-
// Agents sometimes repeat a validated source location instead of just its path
|
|
51
|
+
// Agents sometimes repeat a validated source location instead of just its path,
|
|
52
|
+
// occasionally followed by the claim itself ("README.md:3-3 identifies …").
|
|
52
53
|
// Normalize only when that path is already present in the checked evidence index.
|
|
53
54
|
const normalize = refs => refs.map(ref => {
|
|
54
55
|
if(evidence.has(ref)) return ref;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
let path, match;
|
|
57
|
+
for(const candidate of evidence.keys()) {
|
|
58
|
+
if(!ref.startsWith(candidate) || (path && candidate.length <= path.length)) continue;
|
|
59
|
+
const rest = ref.slice(candidate.length).match(/^(?::(\d+)(?:[-:](\d+))?)?(?:\s[\s\S]*)?$/);
|
|
60
|
+
if(rest) { path = candidate; match = rest; }
|
|
61
|
+
}
|
|
62
|
+
if(!path) return ref;
|
|
63
|
+
if(!match[1]) return path;
|
|
64
|
+
const entry=evidence.get(path), start=Number(match[1]), end=Number(match[2] || match[1]);
|
|
58
65
|
if(start < entry.startLine || end > entry.endLine || end < start) throw new Error(`Citation falls outside its checked evidence range: ${ref}`);
|
|
59
|
-
return
|
|
66
|
+
return path;
|
|
60
67
|
});
|
|
61
68
|
for(const field of ['summaryEvidence','runEvidence','dataEvidence']) report[field]=normalize(report[field]);
|
|
62
69
|
for(const item of [...report.system,...report.trace,...report.connections]) item.evidence=normalize(item.evidence);
|
package/cli/update.mjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
|
|
4
|
+
// `npx blnkfld` silently reuses a previously cached copy, so returning users can be
|
|
5
|
+
// stuck on an old release. On startup, ask the registry for the latest version and,
|
|
6
|
+
// if it is newer, hand off to it. Any failure falls back to the running version.
|
|
7
|
+
const REGISTRY = 'https://registry.npmjs.org/blnkfld/latest';
|
|
8
|
+
export const HANDOFF_ENV = 'BLNKFLD_UPDATED';
|
|
9
|
+
export const OPT_OUT_ENV = 'BLNKFLD_NO_UPDATE';
|
|
10
|
+
|
|
11
|
+
const parse = v => /^(\d+)\.(\d+)\.(\d+)$/.exec(String(v ?? '').trim())?.slice(1).map(Number);
|
|
12
|
+
export function isNewer(latest, current) {
|
|
13
|
+
const a = parse(latest), b = parse(current);
|
|
14
|
+
if(!a || !b) return false;
|
|
15
|
+
for(let i = 0; i < 3; i++) if(a[i] !== b[i]) return a[i] > b[i];
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function currentVersion() {
|
|
20
|
+
return JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function latestVersion({ fetchImpl = fetch, timeoutMs = 2000 } = {}) {
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetchImpl(REGISTRY, { signal: AbortSignal.timeout(timeoutMs), headers: { accept: 'application/json' } });
|
|
26
|
+
if(!response.ok) return null;
|
|
27
|
+
return (await response.json()).version ?? null;
|
|
28
|
+
} catch { return null; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function updateTarget({ env = process.env, current, fetchImpl, timeoutMs } = {}) {
|
|
32
|
+
if(env[HANDOFF_ENV] || env[OPT_OUT_ENV] || env.CI) return null;
|
|
33
|
+
current ??= await currentVersion();
|
|
34
|
+
const latest = await latestVersion({ fetchImpl, timeoutMs });
|
|
35
|
+
return isNewer(latest, current) ? { current, latest } : null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Re-run the same command with the latest release. Resolves with the exit code,
|
|
39
|
+
// or null if the newer version could not be started.
|
|
40
|
+
export function handoff(latest, args, { env = process.env } = {}) {
|
|
41
|
+
const windows = process.platform === 'win32';
|
|
42
|
+
const command = windows ? 'npx.cmd' : 'npx';
|
|
43
|
+
const argv = ['--yes', `blnkfld@${latest}`, ...args];
|
|
44
|
+
return new Promise(resolve => {
|
|
45
|
+
let child;
|
|
46
|
+
try {
|
|
47
|
+
child = spawn(command, windows ? argv.map(a => JSON.stringify(a)) : argv,
|
|
48
|
+
{ stdio: 'inherit', shell: windows, env: { ...env, [HANDOFF_ENV]: latest } });
|
|
49
|
+
} catch { resolve(null); return; }
|
|
50
|
+
// Ctrl+C reaches the child directly through the terminal; keep this process alive until it exits.
|
|
51
|
+
const ignore = () => {};
|
|
52
|
+
process.on('SIGINT', ignore); process.on('SIGTERM', ignore);
|
|
53
|
+
const done = code => { process.off('SIGINT', ignore); process.off('SIGTERM', ignore); resolve(code); };
|
|
54
|
+
child.on('error', () => done(null));
|
|
55
|
+
child.on('close', (code, signal) => done(code ?? (signal ? 1 : 0)));
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Lora Variable;src:url(/assets/lora-latin-wght-normal-BiLcIKcI.woff2) format("woff2");font-style:normal;font-weight:400 700;font-display:swap}@font-face{font-family:Lora Variable;src:url(/assets/lora-latin-wght-italic-DBI-iqMr.woff2) format("woff2");font-style:italic;font-weight:400 700;font-display:swap}@font-face{font-family:Inter Variable;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:Geist Mono Variable;src:url(/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2) format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:IBM Plex Mono;src:url(/assets/ibm-plex-mono-latin-700-normal-7sUh57Bg.woff2) format("woff2");font-style:normal;font-weight:700;font-display:swap}:root{--sans: "Inter Variable", sans-serif;--mono: "Geist Mono Variable", "IBM Plex Mono", monospace;--serif: "Iowan Old Style", "Lora Variable", "Times New Roman", serif}:root{color:#000;background:var(--paper);font-family:var(--sans);font-synthesis:none;font-weight:500;--paper: #fefefe;--ink: #000;--muted: rgba(0, 0, 0, .8);--line: #000;--hover-background: #181818;--diagram-pattern-color: rgba(0, 0, 0, .12);--accent: #D63800;--green: var(--accent);--mono-size: 11px}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;min-height:100vh;-webkit-font-smoothing:antialiased;background:var(--paper)}button,input{font:inherit}button{color:inherit}.brand-logo.blnkfld-mark{display:block;width:28px;height:28px;margin-bottom:10px;flex-shrink:0}.wordmark{font-family:var(--serif);font-size:25px;font-style:normal;line-height:1;letter-spacing:.01em;font-weight:600}.product-label{color:var(--green);margin-top:4px;font-family:var(--mono);font-size:var(--mono-size);line-height:1.15;letter-spacing:.08em;text-transform:uppercase;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:var(--serif)}h1,h2,h3{margin:0;font-weight:600;color:var(--ink)}h1{font-size:25px;letter-spacing:0;line-height:1.12}::selection{background:var(--accent);color:var(--paper)}code,pre,kbd,samp{font-family:var(--mono);font-weight:700;font-size:var(--mono-size)}.blnkfld-mark{display:inline-block;flex-shrink:0;aspect-ratio:1;margin-inline:0;transform-origin:center;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='232'%20height='232'%20viewBox='-4%20-4%20232%20232'%3e%3c!--%20Transparent%20padding%20keeps%20the%20outline%20away%20from%20mask%20rasterization%20edges.%20--%3e%3cpath%20fill='%23000'%20fill-rule='evenodd'%20d='M40%200h144a40%2040%200%200%201%2040%2040v144a40%2040%200%200%201-40%2040H40a40%2040%200%200%201-40-40V40A40%2040%200%200%201%2040%200z%20M40%2020a20%2020%200%200%200-20%2020v144a20%2020%200%200%200%2020%2020h144a20%2020%200%200%200%2020-20V40a20%2020%200%200%200-20-20H40z'%20/%3e%3c/svg%3e") center / contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='232'%20height='232'%20viewBox='-4%20-4%20232%20232'%3e%3c!--%20Transparent%20padding%20keeps%20the%20outline%20away%20from%20mask%20rasterization%20edges.%20--%3e%3cpath%20fill='%23000'%20fill-rule='evenodd'%20d='M40%200h144a40%2040%200%200%201%2040%2040v144a40%2040%200%200%201-40%2040H40a40%2040%200%200%201-40-40V40A40%2040%200%200%201%2040%200z%20M40%2020a20%2020%200%200%200-20%2020v144a20%2020%200%200%200%2020%2020h144a20%2020%200%200%200%2020-20V40a20%2020%200%200%200-20-20H40z'%20/%3e%3c/svg%3e") center / contain no-repeat}.blnkfld-lockup{display:inline-flex;align-items:baseline;gap:.3em;font-weight:500;line-height:1.28;letter-spacing:.03em}.blnkfld-lockup>.blnkfld-mark{display:inline-block;width:calc(1cap + 2px);height:calc(1cap + 2px);margin:0;flex:none}.instrument{--surface:var(--paper);--text:var(--ink);--soft:var(--muted);--rule:var(--line);background:var(--surface);color:var(--text);min-height:100vh;font-family:var(--sans);font-size:13px;font-weight:500}.instrument button,.instrument input{font:inherit}.instrument button{cursor:pointer}.instrument button:focus-visible,.instrument a:focus-visible,.instrument input:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.instrument-header{height:92px;padding:0 36px;display:flex;align-items:center;justify-content:space-between}.instrument a{color:inherit;text-decoration:none}.instrument-brand{font-size:25px;letter-spacing:-1.5px;font-weight:600;display:flex;align-items:center;gap:25px}.instrument-header-right,.eyebrow,.instrument-status,.scene-caption,.inspector-tabs,.instrument-footer,.inspector-footer{font-family:var(--mono);font-size:var(--mono-size);letter-spacing:.06em;font-weight:700}.instrument-header-right{display:flex;gap:36px}.instrument-header-right>span{color:var(--soft)}.instrument-body{display:grid;grid-template-columns:minmax(0,1fr) 300px;min-height:calc(100vh - 145px)}.instrument-workspace{padding:36px 36px 25px;min-width:0}.instrument-title{display:flex;justify-content:space-between;gap:20px}.eyebrow{color:var(--soft);display:block}.instrument h1{font-size:34px;letter-spacing:-1.5px;font-weight:500;margin:13px 0 9px}.instrument-title p{color:var(--soft);max-width:580px;font-size:12px;line-height:1.6;margin:0}.instrument-status{white-space:nowrap;height:fit-content;display:flex;gap:8px;align-items:center}.instrument-status:before{content:"";background:var(--ink);width:6px;height:6px;border-radius:50%}.scene-wrap{margin-top:35px}.scene-caption{display:flex;justify-content:space-between;color:var(--soft);font-size:var(--mono-size)}.instrument-scene{height:320px;width:100%;position:relative;overflow:hidden}.instrument-scene canvas{display:block}.module-controls{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}.module-controls button{text-align:left;border:0;background:none;padding:13px 0;color:var(--text);min-width:0}.module-controls button>span{font-family:var(--mono);font-size:var(--mono-size);display:block;margin-bottom:10px;font-weight:700}.module-controls strong{font-size:12px;font-weight:500;display:block}.module-controls small{font-size:11px;color:var(--soft);display:block;margin-top:5px}.module-controls button[aria-pressed=true]>span{color:var(--accent)}.module-controls button[aria-pressed=true]{box-shadow:0 -2px var(--accent)}.instrument-summary{display:grid;grid-template-columns:130px 1fr;gap:20px;margin:24px 0 32px}.instrument-summary p{margin:0;max-width:670px;font-size:12px;line-height:1.8;color:var(--muted)}.instrument-summary .eyebrow{padding-top:4px}.sequencer{padding-top:24px}.sequence-heading{display:flex;align-items:center;justify-content:space-between}.sequence-heading h2{font-size:21px;font-weight:500;margin:10px 0 20px}.play-button{width:32px;height:32px;flex-shrink:0;display:grid;place-items:center;padding:0;background:transparent;color:var(--ink);border:1px solid var(--ink);border-radius:50%}.play-button svg{width:16px;height:16px;display:block}.instrument-inspector{padding:0 25px 25px;position:relative}.inspector-tabs{height:66px;display:flex;gap:23px;align-items:center;margin-bottom:32px}.inspector-tabs button{border:0;background:none;text-transform:uppercase;color:var(--soft);font-size:var(--mono-size);padding:8px 0}.inspector-tabs button[aria-pressed=true]{color:var(--text);box-shadow:0 2px var(--text)}.instrument-inspector h2{font-size:16px;font-weight:500;letter-spacing:-.7px;margin:17px 0 12px}.instrument-inspector h3{font-size:13px;font-weight:500;margin-top:30px}.instrument-inspector p{font-size:12px;line-height:1.8;color:var(--muted)}.inspector-rule{margin:28px 0}.source-file{margin-top:22px}.source-file>span{font-family:var(--mono);font-size:var(--mono-size);overflow-wrap:anywhere;line-height:1.8;font-weight:700}.source-file p{font-size:12px;margin-top:7px}.inspector-note{margin-top:32px;padding:15px;font-size:11px;line-height:1.8;color:var(--muted)}.inspector-footer{color:var(--soft);font-size:var(--mono-size);line-height:2.1;margin-top:55px;overflow-wrap:anywhere}.instrument-footer{display:flex;align-items:center;gap:25px;padding:15px 36px;font-size:var(--mono-size)}.instrument-footer>span:last-child{margin-left:auto}.instrument-footer button{background:none;border:0;padding:0;font-size:var(--mono-size)}.repository-popover{position:fixed;left:28px;bottom:65px;width:min(430px,calc(100vw - 56px));background:var(--paper);padding:25px;border:1px solid var(--rule);box-shadow:0 10px 50px #0002;display:grid;gap:12px;z-index:5}.repository-popover input{width:100%;padding:12px;border:1px solid var(--line);background:transparent}.repository-popover button{padding:10px;background:var(--paper);border:1px solid var(--rule)}@media(min-width:1600px){.instrument-scene{height:440px}.instrument-workspace{padding:45px 55px}}@media(max-width:1000px){.instrument-body{grid-template-columns:minmax(0,1fr) 250px}.instrument-workspace{padding:28px 22px}.instrument-header{padding:0 22px}.instrument-status{display:none}.instrument-summary{grid-template-columns:1fr;gap:10px}.instrument-scene{height:260px}}@media(max-width:700px){.instrument-body{display:block}.instrument-header{height:75px}.instrument-header-right>span{display:none}.instrument-inspector{border-left:0;padding-bottom:25px}.instrument-title h1{font-size:28px}.scene-caption{font-size:var(--mono-size)}.instrument-scene{height:230px}.module-controls{gap:5px}.module-controls strong,.module-controls small{font-size:10px}.instrument-footer{padding:15px 22px}.instrument-footer>span:last-child{display:none}.instrument-footer>span{overflow-wrap:anywhere}.instrument-summary{margin-bottom:25px}}.instrument h1,.instrument h2,.instrument h3{font-family:var(--serif);font-weight:500;font-style:normal;letter-spacing:0}.instrument-brand{display:block;letter-spacing:normal}.instrument-brand .brand-logo{width:28px;height:28px;margin-bottom:10px}.instrument-header{height:145px}.instrument-body{min-height:calc(100vh - 198px)}.instrument h1,.instrument-title h1{font-size:21px;font-weight:500;font-style:normal}.instrument-brand .wordmark{font-size:25px;font-weight:500;letter-spacing:.03em;line-height:1.28}.instrument-brand .product-label{font-size:var(--mono-size)}.instrument-run{margin-top:28px;padding:24px 0;scroll-margin-top:24px}.instrument-run h2{font-size:21px;margin:12px 0}.instrument-run p{font-size:13px;line-height:1.8;max-width:720px}.run-evidence{display:flex;flex-wrap:wrap;gap:12px;font-family:var(--mono);font-size:var(--mono-size);line-height:1.7;overflow-wrap:anywhere;font-weight:700}.run-evidence>span:first-child{color:var(--muted)}@media(max-width:700px){.instrument-header{height:145px}.instrument-header-right{flex-direction:column;gap:16px}.instrument-run p{font-size:13px}}.trace-scene-wrap{margin-top:12px}.trace-controls button{min-height:72px}.trace-controls button>span{display:flex;justify-content:space-between}.analysis-coverage,.trace-empty{font-size:12px;line-height:1.8;color:var(--muted)}.source-file pre{font:700 var(--mono-size)/1.6 var(--mono);max-height:300px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.source-file summary{font:700 var(--mono-size) var(--mono);cursor:pointer;font-weight:700}.trace-empty{padding:20px 0}.play-button:disabled{opacity:.35;cursor:default}.isometric-fallback{height:100%;display:flex;flex-direction:column;justify-content:center}.isometric-fallback svg{width:100%;min-height:0;flex:1}.fallback-caption{font:700 var(--mono-size) var(--mono);color:var(--muted);padding-top:16px;font-weight:700}.isometric-fallback g[role=button]:focus-visible{outline:1px solid var(--accent)}.instrument-body{max-width:1600px;margin:0 auto;padding:28px 36px 36px;grid-template-columns:minmax(0,1fr) minmax(280px,320px);column-gap:48px;row-gap:0;align-items:start}.instrument-workspace{display:contents}.instrument-title{grid-column:1 / -1;grid-row:1}.instrument-summary{grid-column:1 / -1;grid-row:2;margin:26px 0 0;grid-template-columns:130px minmax(0,720px)}.instrument-workspace>.scene-wrap{grid-column:1;grid-row:4;margin-top:0}.sequencer{grid-column:1;grid-row:8;margin-top:0;padding-top:0}.instrument-inspector{grid-column:2;grid-row:4;min-width:0;padding:0;position:sticky;top:24px;max-height:calc(100vh - 48px);overflow:auto}.instrument-inspector.inspector-trace{grid-row:8}.inspector-tabs{height:auto;min-height:26px;margin:0 0 26px;align-items:flex-start}.inspector-tabs button{padding:0 0 8px}.instrument-run{grid-column:1 / -1;grid-row:11;margin-top:0}.analysis-coverage{grid-column:1;grid-row:5}.module-controls{grid-template-columns:repeat(auto-fit,minmax(115px,1fr));gap:16px}.module-controls strong,.module-controls small{overflow-wrap:anywhere;line-height:1.5}.instrument-scene{height:clamp(280px,26vw,400px)}.instrument-title p{max-width:720px}@media(max-width:1100px){.instrument-body{grid-template-columns:minmax(0,1fr);padding:24px 28px 32px}.instrument-title,.instrument-summary,.instrument-workspace>.scene-wrap,.sequencer,.instrument-run,.analysis-coverage,.instrument-inspector{grid-column:1}.instrument-inspector{grid-row:6;position:static;max-height:none;overflow:visible;margin:24px 0 0;max-width:720px}.instrument-inspector.inspector-trace{grid-row:9}.analysis-coverage{grid-row:5}.instrument-scene{height:320px}.instrument-status{display:flex}.inspector-footer{margin-top:24px}}@media(max-width:700px){.instrument-body{display:grid;padding:20px 22px 28px}.instrument-summary{grid-template-columns:1fr;gap:10px;margin-bottom:0}.instrument-status{display:none}.instrument-scene{height:250px}.module-controls{grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px}.module-controls strong{font-size:12px}.module-controls small{font-size:11px}.instrument-inspector{padding:0}}.module-controls button[aria-pressed=true] strong{color:var(--accent)}.module-controls button:hover>span,.instrument a:hover{color:var(--accent)}.inspector-tabs button[aria-pressed=true]{color:var(--accent);box-shadow:0 2px var(--accent)}.instrument-inspector[data-tab=part] .inspector-content .eyebrow:first-of-type{color:var(--accent)}.instrument-inspector[data-tab=part] .inspector-content .source-file{border-left:2px solid var(--accent);padding-left:12px}.inspection-context{font-family:var(--mono);font-size:var(--mono-size)!important;color:var(--accent)!important;font-weight:700}.module-controls button{height:132px;overflow:auto;align-self:start}.module-controls strong{height:33px;overflow:auto}.module-controls small{height:45px;overflow:auto}.trace-controls button{height:100px}.trace-controls strong{height:50px}@media(min-width:1101px){.instrument-inspector{contain:size;height:100%;min-height:0;padding-bottom:24px}.instrument-inspector.inspector-trace{margin-top:0;height:100%}}.instrument-title .eyebrow,.system-heading .eyebrow,.sequence-heading .eyebrow,.instrument-run>.eyebrow{font-weight:700}.module-controls strong{height:36px}.module-controls small{height:50px}.trace-controls strong{height:54px}.instrument-inspector{position:relative;top:auto}.module-controls button{height:148px}.trace-controls button{height:112px}.module-controls button,.trace-controls button{height:112px;min-height:0;overflow:hidden;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.module-controls button>span{flex:none}.module-controls strong,.trace-controls strong{height:auto;max-height:54px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.instrument-header-right a{font-weight:700}#repository,#action{scroll-margin-top:24px}.system-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:24px}.system-heading h2{font-size:21px;margin:10px 0 0}.system-view{display:flex;gap:16px;flex-shrink:0}.system-view button{font:700 var(--mono-size) var(--mono);border:0;border-bottom:1px solid transparent;background:none;padding:8px 0;color:var(--muted);font-weight:700}.system-view button[aria-pressed=true]{color:var(--accent);border-color:var(--accent)}.connection-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;font:700 var(--mono-size)/1.7 var(--mono);padding-top:0;font-weight:700}.connection-toolbar button{border:0;background:none;padding:4px 0;font:inherit;text-align:right;text-decoration:underline;text-underline-offset:4px}.connection-toolbar button[aria-pressed=true]{color:var(--accent)}.connection-context{font:700 var(--mono-size)/1.7 var(--mono);color:var(--soft);margin:14px 0 24px;max-width:660px;font-weight:700}.connection-empty{font-size:12px;line-height:1.8;padding:24px 0}.action-summary{font-size:12px;line-height:1.8;color:var(--soft);margin:0 0 26px;max-width:700px}@media(max-width:700px){.system-heading{align-items:flex-start;flex-direction:column;gap:12px}.connection-toolbar{align-items:flex-start}.connection-toolbar>span{min-width:0;overflow-wrap:anywhere}.connection-toolbar button{max-width:140px;flex-shrink:0}}.architecture-tools{display:flex;align-items:center;justify-content:space-between;gap:16px;font:700 var(--mono-size)/1.6 var(--mono);color:#666;margin:20px 0 14px;font-weight:700}.architecture-tools button{font:inherit;color:var(--text);background:none;border:1px solid #0003;padding:6px 10px}.architecture-frame{width:100%;border:1px solid #00000018;background:var(--paper)}.architecture-map{width:100%;margin-inline:auto;position:relative;isolation:isolate}.architecture-depth{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.architecture-depth canvas{display:block;width:100%;height:100%}.architecture-overlay{display:block;width:100%;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;overflow:visible}.architecture-node{cursor:pointer;outline:none}.architecture-node:focus-visible>rect{stroke:var(--accent);stroke-width:2}.architecture-node-copy{height:100%;display:flex;flex-direction:column;justify-content:center;gap:8px;text-align:left}.architecture-node-copy>span{font:700 var(--mono-size)/1 var(--mono);text-transform:uppercase;letter-spacing:.03em;color:#777;font-weight:700}.architecture-node-copy>strong{font:500 13px/1.35 var(--sans);overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.architecture-node.is-selected .architecture-node-copy>span{color:var(--accent)}.architecture-edge{color:#636363;transition:opacity .15s}.architecture-edge.is-selected{color:var(--accent)}.architecture-edge-hit{cursor:pointer}.architecture-edge-label{width:100%;height:100%;display:flex;justify-content:center;align-items:center;border:0;padding:0;background:transparent;color:inherit;font:700 var(--mono-size)/1.5 var(--mono);text-align:center;font-weight:700}.architecture-edge-label>span{padding:3px 5px;background:var(--paper);overflow-wrap:anywhere}.architecture-edge-label:hover,.architecture-edge-label[aria-pressed=true]{color:var(--accent)}.architecture-hint{font:700 var(--mono-size)/1.8 var(--mono);color:#777;margin:14px 0 0;font-weight:700}.architecture-evidence{border-top:1px solid #0003;margin:24px 0 0;padding-top:20px}.architecture-evidence>div:first-child{display:flex;justify-content:space-between;align-items:center}.architecture-evidence>div:first-child button{background:none;border:0;font-size:20px}.architecture-evidence h3{font-size:21px;margin:12px 0}.architecture-evidence>p{font-size:12px;line-height:1.7}.architecture-evidence .source-file{margin-top:14px}.architecture-evidence .source-file p{line-height:1.7;color:var(--muted)}@media(prefers-reduced-motion:reduce){.architecture-edge{transition:none}}.instrument-body{overflow-anchor:none}.smooth-height{transition:height .32s cubic-bezier(.22,.68,0,1.01);overflow:clip}.smooth-height-content{display:flow-root}.view-enter{animation:view-enter .22s ease-out}@keyframes view-enter{0%{opacity:0}to{opacity:1}}.instrument button{transition:color .16s ease,background-color .16s ease,border-color .16s ease,box-shadow .16s ease}.repository-popover{animation:popover-enter .22s ease-out}@keyframes popover-enter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.smooth-height,.instrument button{transition:none}.view-enter,.repository-popover{animation:none}}.instrument .readme-trigger{flex-shrink:0;align-self:flex-start;background:transparent;border:0;padding:0;font:700 var(--mono-size)/1.5 var(--mono);letter-spacing:.06em;white-space:nowrap;font-weight:700}.readme-trigger:hover{color:var(--accent)}.readme-actions{padding:24px 0 32px}.readme-download{display:inline-block}.readme-drawer .readme-text{padding-bottom:32px}.instrument .readme-download{font:700 var(--mono-size)/1.5 var(--mono);padding:12px 16px;border:1px solid #0003;background:transparent;color:var(--text);white-space:nowrap;font-weight:700}.readme-download:hover{border-color:var(--accent);color:var(--accent)}.readme-text{max-width:760px;overflow-wrap:anywhere}.readme-text>h3{font-size:21px;margin:0 0 12px}.readme-text h4{font:normal 500 21px/1.4 var(--serif);margin:30px 0 12px}.readme-text p,.readme-text li{font-size:13px;line-height:1.85;color:var(--muted);white-space:pre-wrap}.readme-text p{margin:0 0 14px}.readme-text ul,.readme-text ol{padding-left:22px;margin:0 0 18px}.readme-text li+li{margin-top:10px}.readme-text .readme-subtitle{color:var(--text)}@media(max-width:700px){.instrument-title{flex-wrap:wrap}.instrument .readme-trigger{font-size:var(--mono-size)}}.instrument-footer>button{font:inherit;letter-spacing:inherit}.instrument-footer>button,.instrument-footer>span{text-transform:uppercase}#system{scroll-margin-top:24px}.trace-view{margin:0 0 24px}.trace-diagram{width:100%;margin:0}@media(max-width:700px){.instrument-header-right{gap:12px}.instrument-header-right a{font-size:var(--mono-size)}}.instrument-header,.instrument-footer{width:100%;max-width:1600px;margin-inline:auto;padding-inline:36px}@media(max-width:1100px){.instrument-header,.instrument-footer{padding-inline:28px}}@media(max-width:700px){.instrument-header,.instrument-footer{padding-inline:22px}}.instrument-summary .project-haiku{grid-column:2;margin:18px 0 0;font:normal 500 14.5px/1.8 var(--serif);color:var(--soft)}.instrument-summary .project-haiku-label{grid-column:1;margin-top:18px}.project-haiku span{display:block}@media(max-width:700px){.instrument-summary .project-haiku-label{margin-top:12px}.instrument-summary .project-haiku{grid-column:1;margin-top:0}}.instrument .instrument-inspector h2,.instrument .instrument-inspector h3{font-family:var(--sans);font-weight:500;font-style:normal;color:var(--ink)}.section-divider{grid-column:1 / -1;width:100%;border:0;border-top:1px solid var(--rule);opacity:.5;margin:40px 0}.divider-system{grid-row:3}.divider-action{grid-row:7}.divider-run{grid-row:10}@media(max-width:700px){.section-divider{margin:32px 0}}.instrument-header,.instrument-body,.instrument-footer{max-width:1360px}.instrument-header{height:128px}.instrument-body{column-gap:36px;min-height:calc(100vh - 181px)}.instrument-summary{margin-top:20px;gap:16px 24px}.instrument-summary p{line-height:1.6}.instrument-summary .project-haiku,.instrument-summary .project-haiku-label{margin-top:0}.instrument-summary .project-haiku{line-height:1.6}.system-heading{margin-bottom:16px}.system-heading h2{margin-top:8px}.sequence-heading h2{margin:8px 0 12px}.action-summary{line-height:1.6;margin-bottom:16px}.trace-view{margin-bottom:16px}.instrument-scene{height:300px}.module-controls button,.trace-controls button{height:auto;min-height:80px;padding:12px 0;align-self:stretch}.module-controls button>span{margin-bottom:6px}.module-controls strong,.trace-controls strong{line-height:1.4;max-height:51px}.inspector-tabs{margin-bottom:16px}.instrument-inspector h2{margin:8px 0}.instrument-inspector h3{margin:20px 0 8px}.instrument-inspector p{line-height:1.6;margin:8px 0}.inspector-rule{margin:20px 0}.source-file{margin-top:12px}.source-file>span{line-height:1.6}.source-file p{margin:6px 0 0}.inspector-note{margin-top:20px;padding:0;line-height:1.6}.inspector-footer{margin-top:24px;line-height:1.7}.instrument-run{padding:0}.instrument-run h2{margin:8px 0 12px}.instrument-run p{line-height:1.6;margin:0 0 16px}.connection-context{margin:12px 0 16px}.architecture-tools{margin:16px 0 12px}.architecture-hint{line-height:1.6;margin-top:12px}@media(max-width:1100px){.instrument-scene{height:280px}}@media(max-width:700px){.instrument-summary{gap:10px}.instrument-summary .project-haiku-label{margin-top:6px}.instrument-scene{height:230px}.module-controls button,.trace-controls button{min-height:72px}}.instrument-cards .instrument-body{padding:40px 68px 68px}.instrument-cards :is(#repository,#system,#action,#how-to-run){scroll-margin-top:56px}.instrument-cards .section-divider{border-color:transparent;margin:44px 0}.section-card-outline{grid-column:1 / -1;align-self:stretch;position:relative;pointer-events:none;min-width:0;min-height:0}.section-card-outline:before{content:"";position:absolute;top:-32px;right:-32px;bottom:-32px;left:-32px;border:1px solid var(--rule);border-radius:8px;opacity:.2}.card-repository{grid-row:1 / 3}.card-system{grid-row:4 / 7}.card-action{grid-row:8 / 10}.card-run{grid-row:11 / 12}@media(max-width:1100px){.instrument-cards .instrument-body{padding:40px 60px 64px}}@media(max-width:700px){.instrument-cards .instrument-body{padding:32px 46px 52px}.instrument-cards .section-divider{margin:36px 0}.section-card-outline:before{top:-24px;right:-24px;bottom:-24px;left:-24px}}.app-theme-toggle{display:inline-flex;align-items:center;gap:10px;background:none;border:0;color:inherit;padding:0;min-height:32px}:root[data-theme=dark],:root[data-theme=blue]{color-scheme:dark;--paper:#181818;--ink:#fafafa;--muted:rgba(255,255,255,.82);--line:#fafafa;--hover-background:#fafafa;--diagram-pattern-color:rgba(255,255,255,.12);--accent:#FE6848;--green:var(--accent);color:var(--ink)}:root[data-theme=blue]{--paper:#0000a8}.instrument-header{height:auto;min-height:112px;position:relative;align-items:flex-start;padding-top:36px}.instrument-brand,.instrument-brand .wordmark{display:flex;align-items:center}@media(max-width:1100px){.instrument-header{padding-top:28px}}@media(max-width:700px){.instrument-header{padding-top:22px}}.instrument .app-theme-toggle{position:absolute;top:16px;right:24px;display:flex;align-items:center;gap:12px;min-height:44px;padding:8px 4px;border:0;background:none;color:inherit;font-family:Geist Mono Variable,monospace;font-size:11px;font-weight:500;letter-spacing:.16em;cursor:pointer}.app-theme-toggle span{width:9px;height:9px;background:currentColor}.app-theme-toggle:hover span{outline:1px solid currentColor;outline-offset:3px}.instrument .app-theme-toggle:focus-visible{outline:1px solid var(--ink);outline-offset:4px}.instrument>.instrument-header-right{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;width:100%;max-width:1360px;margin:0 auto;padding:0 36px 24px;gap:12px 36px}@media(max-width:1100px){.instrument>.instrument-header-right{padding-inline:28px}}@media(max-width:700px){.instrument>.instrument-header-right{padding-inline:22px;gap:12px 24px}}.instrument-summary .project-haiku{font-style:italic}:root[data-theme=blue]{--muted:#fafafa}:root[data-theme=blue] :is(.architecture-tools,.architecture-node-copy>span,.architecture-hint,.architecture-edge){color:var(--ink)}.instrument :is(.instrument-title,.system-heading,.sequence-heading,.instrument-run)>.eyebrow,.instrument :is(.instrument-title,.system-heading,.sequence-heading)>div>.eyebrow{color:var(--accent)}.repository-popover{border-radius:8px}.instrument-footer{flex-wrap:wrap}.instrument-footer>button{white-space:nowrap}.instrument-footer .changelog-trigger{margin-left:auto;font:inherit;letter-spacing:inherit;color:inherit}.changelog-trigger:hover{text-decoration:underline;text-underline-offset:4px}body:has(.changelog-drawer[open]){overflow:hidden}.changelog-drawer{position:fixed;inset:0 0 0 auto;margin:0;width:min(640px,100vw);max-width:100vw;height:100dvh;max-height:100dvh;padding:0 28px;border:0;border-left:1px solid #0003;border-radius:0;background:var(--paper);color:var(--ink);box-shadow:-16px 0 60px #0002;font-family:var(--sans);font-weight:500;letter-spacing:normal;overscroll-behavior:contain}.changelog-drawer[open]{animation:changelog-enter .24s ease-out}@keyframes changelog-enter{0%{transform:translate(100%)}to{transform:translate(0)}}@media(prefers-reduced-motion:reduce){.changelog-drawer[open]{animation:none}}.changelog-drawer::backdrop{background:#0005}.changelog-drawer header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:26px 0 24px;border-bottom:1px solid #0003}.changelog-drawer h2{font-size:21px;font-style:normal;margin:10px 0}.changelog-drawer header p{font-size:12px;line-height:1.6;margin:0;color:var(--muted)}.instrument .drawer-close{width:44px;height:44px;flex-shrink:0;display:grid;place-items:center;padding:0;border:0;background:none;color:var(--ink)}.drawer-close svg{display:block;width:12px;height:12px}.drawer-close:hover{color:var(--accent)}.changelog-entry{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;padding:24px 0;border-bottom:1px solid #0003}.changelog-entry:last-child{border-bottom:0}.changelog-date{font:700 var(--mono-size)/1.8 var(--mono);color:var(--muted);font-weight:700}.changelog-entry h3{font-size:21px;font-style:normal;line-height:1.35;margin:0}.changelog-category h4{font:500 12px/1.6 var(--sans);margin:16px 0 0}.changelog-category ul{margin-top:6px}.changelog-entry ul{margin:12px 0 0;padding-left:16px;font:500 12px/1.75 var(--sans);color:var(--muted)}.changelog-entry li+li{margin-top:8px}@media(max-width:700px){.instrument-footer{gap:16px 22px}.changelog-drawer{padding:0 20px}.changelog-entry{grid-template-columns:minmax(0,1fr);gap:8px}.changelog-drawer header{gap:12px}}.footer-links{display:flex;align-items:center;gap:12px;margin-left:auto}.footer-links>button{white-space:nowrap}.instrument-footer .footer-links>button{margin:0;font:inherit;letter-spacing:inherit}.how-to-run-trigger:hover{text-decoration:underline;text-underline-offset:4px}.setup-content{padding:0 0 32px}.setup-content section{margin-top:28px}.setup-content h3{font-size:21px;margin:0 0 12px}.setup-content p,.setup-content dd{font:500 12px/1.8 var(--sans);color:var(--muted);margin:0 0 14px}.setup-content pre{font:700 var(--mono-size)/1.8 var(--mono);padding:16px;background:#00000006;white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.setup-content code{font-family:var(--mono);font-size:var(--mono-size);font-weight:700}.setup-content dt{font:700 var(--mono-size)/1.8 var(--mono);margin:18px 0 6px;white-space:normal;font-weight:700}.setup-content{white-space:normal;overflow-wrap:anywhere}.setup-drawer header{white-space:normal}
|
|
@@ -4290,4 +4290,4 @@ void main() {
|
|
|
4290
4290
|
`));return`${t.join(`
|
|
4291
4291
|
|
|
4292
4292
|
`)}
|
|
4293
|
-
`}function FN({report:r}){const t=xe.useRef(null),i=xe.useMemo(()=>UN(r),[r]),e=xe.useMemo(()=>ON(i),[i]);return L.jsxs(L.Fragment,{children:[L.jsx("button",{className:"readme-trigger",type:"button","aria-haspopup":"dialog",onClick:()=>t.current.showModal(),children:"VIEW README ↗"}),L.jsxs("dialog",{ref:t,className:"changelog-drawer readme-drawer","aria-labelledby":"readme-heading",onClick:s=>{if(s.target===t.current){const o=t.current.getBoundingClientRect();(s.clientX<o.left||s.clientX>o.right||s.clientY<o.top||s.clientY>o.bottom)&&t.current.close()}},children:[L.jsxs("header",{children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:[r.traceStatus==="curated"?"CURATED EXAMPLE":r.analysisKind==="agent"?"AGENT BRIEF":"SOURCE MODEL"," / TEXT README"]}),L.jsx("h2",{id:"readme-heading",children:"README"})]}),L.jsx(Um,{label:"Close README",onClick:()=>t.current.close()})]}),L.jsx("div",{className:"readme-actions",children:L.jsx("a",{className:"readme-download",href:`data:text/markdown;charset=utf-8,${encodeURIComponent(e)}`,download:"README.md",children:"Download README.md ↓"})}),L.jsxs("article",{className:"readme-text","aria-label":"README preview",children:[L.jsx("h3",{children:i.title}),i.subtitle&&L.jsx("p",{className:"readme-subtitle",children:i.subtitle}),i.sections.map(s=>{const o=s.ordered?"ol":"ul";return L.jsxs("section",{children:[L.jsx("h4",{children:s.title}),s.paragraphs.map((c,h)=>L.jsx("p",{children:c},h)),s.items.length>0&&L.jsx(o,{children:s.items.map((c,h)=>L.jsx("li",{children:c},h))})]},s.title)})]})]})]})}function Om({children:r,className:t=""}){const i=xe.useRef(null),e=xe.useRef(null);return xe.useLayoutEffect(()=>{const s=i.current,o=e.current,c=()=>{const d=o.getBoundingClientRect().height;s.style.height=`${d}px`};c();const h=new ResizeObserver(c);return h.observe(o),()=>h.disconnect()},[]),L.jsx("div",{ref:i,className:`smooth-height ${t}`,children:L.jsx("div",{ref:e,className:"smooth-height-content",children:r})})}const BN="0.1.3",kN=[{version:"0.1.3",date:"2026-10-07",groups:[{title:"Added",changes:["Switch the app between light, dark, and blue themes from the header.","The website includes a getting-started guide with animated troubleshooting answers.","Matching rounded-square favicons adapt to light and dark browser themes."]},{title:"Changed",changes:["A shared outlined logo and consistent serif wordmark align the app, homepage, and docs.","Section navigation sits in its own row below the app header, alongside the updated AN AGENTIC README label.","Numbered card labels use the orange accent, and the rounded repository selector closes when clicking outside it.","The homepage command and its underline use orange, with a theme-aware footer mark.","Documentation typography and spacing are more consistent, and copying the homepage command no longer highlights its text."]},{title:"Fixed",changes:["Haikus use italic serif text again.","Blue mode uses white secondary text and theme-aware logo colors."]}]},{version:"0.1.2",date:"2026-10-06",groups:[{title:"Changed",changes:["App and drawer text is smaller and lighter, with consistent 21px medium serif headings and upright typography throughout, including the haiku.","Quick Start headings use periods in place of slash separators.","Quick Start uses the published npm package instead of requiring a local blnkfld checkout and build."]}]},{version:"0.1.1",date:"2026-10-06",groups:[{title:"Changed",changes:["System Architecture and Trace one action now step through five, four, three, two, and one column as the window narrows, preserving selection and playback.","Newly generated IN ONE MINUTE summaries contain one to five sentences, with additional detail in the expanded summary.","The changelog groups release notes by version and date and shows only releases up to the running app's version.","The hosted interface uses Lora and Times New Roman as fallbacks when Iowan Old Style is unavailable."]}]},{version:"0.1.0",date:"2026-10-05",groups:[{title:"Added",changes:["Run npx blnkfld inside a project to generate a source-backed brief using your installed Codex or Claude Code CLI.","Explore the project's system overview, architecture, and an action trace, with source excerpts supporting the explanation.","Read a project summary and haiku, inspect setup instructions, and export the brief as a README.","View reports in a local browser interface with bundled Inter, Geist Mono, IBM Plex Mono, and Lora fonts. Serif text prefers Iowan Old Style when installed, then Lora and Times New Roman."]}]}],zN=new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"});function HN(){const r=xe.useRef(null);return L.jsxs(L.Fragment,{children:[L.jsx("button",{className:"changelog-trigger",type:"button","aria-haspopup":"dialog",onClick:()=>r.current.showModal(),children:"CHANGELOG"}),L.jsxs("dialog",{ref:r,className:"changelog-drawer release-notes-drawer","aria-labelledby":"changelog-title",onClick:t=>{if(t.target===r.current){const i=r.current.getBoundingClientRect();(t.clientX<i.left||t.clientX>i.right||t.clientY<i.top||t.clientY>i.bottom)&&r.current.close()}},children:[L.jsxs("header",{children:[L.jsxs("div",{children:[L.jsx("span",{className:"eyebrow",children:"BLNKFLD / RELEASE NOTES"}),L.jsx("h2",{id:"changelog-title",children:"Changelog"}),L.jsxs("p",{children:["What’s changed through v",BN,"."]})]}),L.jsx(Um,{label:"Close changelog",onClick:()=>r.current.close()})]}),L.jsx("div",{className:"changelog-list",children:kN.map(t=>L.jsxs("article",{className:"changelog-entry",children:[L.jsx("time",{className:"changelog-date",dateTime:t.date,children:zN.format(new Date(`${t.date}T00:00:00Z`))}),L.jsxs("div",{children:[L.jsxs("h3",{children:["v",t.version]}),t.groups.map(i=>L.jsxs("section",{className:"changelog-category",children:[L.jsx("h4",{children:i.title}),L.jsx("ul",{children:i.changes.map(e=>L.jsx("li",{children:e},e))})]},i.title))]})]},t.version))})]})]})}function VN({report:r,selected:t,onSelect:i,curated:e}){var v,_,A;const[s,o]=xe.useState(!1),[c,h]=xe.useState(null),d=S_(),f=xe.useMemo(()=>NN(r.system,r.connections,d),[r.system,r.connections,d]),g=f.edges[c];function x(b){h(null),i(b)}function y(b){h(b),i(r.system.findIndex(S=>S.id===f.edges[b].from))}return L.jsxs("div",{className:"connections architecture-connections",children:[L.jsxs("div",{className:"connection-toolbar",children:[L.jsx("span",{children:"ENTIRE ARCHITECTURE"}),L.jsx("button",{disabled:!r.system[t],"aria-pressed":s,onClick:()=>o(!s),children:s?"Show all connections equally":"Highlight selected component"})]}),L.jsx("p",{className:"connection-context",children:e?"Reference architecture · arrows describe the documented interaction.":r.analysisKind==="agent"?"Source-based explanation · arrows describe the reported relationship, not an observed execution.":"Static imports · arrows point from the importing file to its dependency, not the direction of runtime data."}),L.jsx(v_,{layout:f,selected:t,onSelect:x,focused:s,activeEdge:c,onEdge:y}),!f.edges.length&&L.jsx("p",{className:"connection-empty",children:"No connections were established in this report. Components remain available to inspect."}),L.jsx(Om,{children:g&&L.jsxs("section",{className:"architecture-evidence","aria-label":"Selected connection evidence",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["CONNECTION / ",String(g.index+1).padStart(2,"0")]}),L.jsx("button",{onClick:()=>h(null),"aria-label":"Close connection evidence",children:"×"})]}),L.jsxs("h3",{children:[(v=r.system.find(b=>b.id===g.from))==null?void 0:v.label," → ",(_=r.system.find(b=>b.id===g.to))==null?void 0:_.label]}),L.jsx("p",{children:g.labelText}),(A=g.evidence)==null?void 0:A.map(b=>{var S;return L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:[b,g.line?` · line ${g.line}`:""]}),L.jsx("p",{children:((S=r.evidence.find(R=>R.path===b))==null?void 0:S.claim)||"Referenced by this relationship."})]},b)})]})})]})}function GN({nodes:r,selected:t,onSelect:i,connections:e,label:s}){const o=xe.useId().replaceAll(":",""),c=98*Xu/Jn,h=Math.max(360,(r.length-1)*c+210),d=r.map((y,v)=>105+v*c),f=e===void 0?r.slice(1).map((y,v)=>[v,v+1]):e.map(y=>[r.findIndex(v=>v.id===y.from),r.findIndex(v=>v.id===y.to)]).filter(([y,v])=>y>=0&&v>=0),g=(y,v,_,A,b,S)=>L.jsxs("g",{children:[L.jsx("polygon",{points:`${y-_},${v-b} ${y},${v+A-b} ${y},${v+A} ${y-_},${v}`,fill:"#cecece"}),L.jsx("polygon",{points:`${y},${v+A-b} ${y+_},${v-b} ${y+_},${v} ${y},${v+A}`,fill:"#b4b4b4"}),L.jsx("polygon",{points:`${y-_},${v-b} ${y},${v-A-b} ${y+_},${v-b} ${y},${v+A-b}`,fill:"#e9e9e9"})]},S);function x(y){return["browser","cli","input"].includes(y)?L.jsxs("g",{children:[g(0,120,18,8,4),L.jsx("path",{d:"M0 111V88",stroke:"#aaa",strokeWidth:"5"}),L.jsx("polygon",{points:"-28,54 28,78 28,111 -28,87",fill:"#aaa"}),L.jsx("polygon",{points:"-23,61 23,81 23,103 -23,83",fill:"#333"})]}):y==="react"?[0,1,2].map(v=>g(0,117-v*14,35-v*7,17-v*3,5,v)):y==="database"?L.jsx("g",{children:[0,1,2].map(v=>L.jsxs("g",{children:[L.jsx("path",{d:`M-25 ${110-v*16}v12c0 13 50 13 50 0v-12`,fill:"#bbb"}),L.jsx("ellipse",{cy:110-v*16,rx:"25",ry:"10",fill:"#ddd"})]},v))}):y==="api"?L.jsxs("g",{children:[g(-22,113,10,8,40),g(22,113,10,8,40),g(0,77,33,9,8)]}):y==="file"||y==="output"?L.jsxs("g",{children:[g(0,118,34,18,5),y==="output"&&L.jsx("path",{d:"M-20 110l28 13m-18-18l28 13m-18-18l28 13",stroke:"#777",strokeWidth:"2"})]}):y==="operation"?L.jsxs("g",{children:[L.jsx("path",{d:"M-25 90v28c0 14 50 14 50 0V90",fill:"#bbb"}),L.jsx("ellipse",{cy:"90",rx:"25",ry:"13",fill:"#ddd"})]}):y==="transfer"?g(0,104,27,18,15):g(0,119,29,16,36)}return L.jsxs("div",{className:"isometric-fallback",children:[L.jsx("span",{className:"fallback-caption",children:"ISOMETRIC COMPATIBILITY VIEW"}),L.jsxs("svg",{viewBox:`0 0 ${h} 220`,role:"group","aria-label":s.replace("three-dimensional","isometric"),children:[L.jsx("defs",{children:L.jsx("marker",{id:o,viewBox:"0 0 8 8",refX:"7",refY:"4",markerWidth:"5",markerHeight:"5",orient:"auto",children:L.jsx("path",{d:"M0 0 8 4 0 8Z",fill:"context-stroke"})})}),f.map(([y,v],_)=>L.jsx("path",{d:`M${d[y]} 148 V${175+_*5} H${d[v]} V148`,fill:"none",stroke:(t==null?void 0:t.index)===y||(t==null?void 0:t.index)===v?"var(--accent)":"#aaa",strokeWidth:"1.2",markerEnd:`url(#${o})`},_)),r.map((y,v)=>L.jsxs("g",{transform:`translate(${d[v]} 0)`,role:"button",tabIndex:"0","aria-label":`Select ${y.label}`,"aria-pressed":(t==null?void 0:t.index)===v,onClick:()=>i(v),onKeyDown:_=>{["Enter"," "].includes(_.key)&&(_.preventDefault(),i(v))},style:{cursor:"pointer"},children:[L.jsx("title",{children:y.label}),g(0,143,49,24.5,7),x(y.kind),L.jsx("path",{d:"M-32 143l19 9",stroke:(t==null?void 0:t.index)===v?"var(--accent)":"#777",strokeWidth:"3"}),L.jsx("text",{y:"210",textAnchor:"middle",fill:(t==null?void 0:t.index)===v?"var(--accent)":"#555",fontSize:"var(--mono-size)",fontFamily:"var(--mono)",fontWeight:"700",children:String(v+1).padStart(2,"0")})]},y.id||v))]})]})}function XN({nodes:r,selected:t,onSelect:i,connections:e,label:s="Interactive three-dimensional repository system"}){const o=xe.useRef(null),c=xe.useRef({selected:t,onSelect:i});c.current={selected:t,onSelect:i};const[h,d]=xe.useState(!1);return xe.useEffect(()=>{const f=o.current,g=getComputedStyle(f).getPropertyValue("--accent").trim();let x;try{x=new y_({antialias:!0,alpha:!0,preserveDrawingBuffer:!0})}catch{d(!0);return}x.setPixelRatio(Math.min(window.devicePixelRatio,2)),x.shadowMap.enabled=!0,x.shadowMap.type=PS,f.appendChild(x.domElement);const y=PM(r.length),v=new JS,_=new Gl(-9,9,7,-7,.1,100);_.position.set(5,13,20),_.lookAt(0,0,0),v.add(new E1(16777215,11908533,3));const A=new c_(16777215,4);A.position.set(-3,12,7),A.castShadow=!0,A.shadow.mapSize.set(2048,2048),Object.assign(A.shadow.camera,{left:-14,right:14,top:12,bottom:-12}),A.shadow.normalBias=.03,v.add(A);const b=[],S=[];function R(Et,Zt,me,Dt=0,fe=0,te=0){b.push(Et);const re=new o_({color:Zt,roughness:.75});S.push(re);const Pe=new Hn(Et,re);return Pe.position.set(Dt,fe,te),Pe.castShadow=!0,Pe.receiveShadow=!0,me.add(Pe),Pe}v.background=new Se(getComputedStyle(f).getPropertyValue("--paper").trim());const B=new g1({opacity:.12});S.push(B);const N=new Vl(200,200);b.push(N);const D=new Hn(N,B);D.position.y=-.005,D.rotation.x=-Math.PI/2,D.receiveShadow=!0,v.add(D);const I=new R1(y.gridSize,y.gridSize/Na,wM,CS);I.position.set(y.gridX,.002,y.gridZ),v.add(I);const O=[],M=[],w=[],z=[];r.forEach((Et,Zt)=>{const me=new co;me.position.set(y.centers[Zt],0,0),v.add(me),O.push(me);const Dt=new co;me.add(Dt),M.push(Dt),R(new yi(Jn,.18,Jn),"#d3d3d3",me,0,.09,0);const fe=R(new yi(.58,.025,.08),"#777777",me,-.65,.2,1);if(fe.material.dispose(),fe.material=new Zu({color:"#777777",toneMapped:!1}),S.push(fe.material),w.push(fe),Et.kind==="browser"||Et.kind==="input"||Et.kind==="cli")R(new yi(1.8,1.35,.15),"#555555",Dt,0,1.05,-.2),R(new yi(1.58,1.12,.025),"#252525",Dt,0,1.05,-.11),R(new yi(.1,.55,.12),"#818181",Dt,0,.45,-.2),R(new yi(1,.08,.55),"#adadad",Dt,0,.25,0);else if(Et.kind==="database")for(let te=0;te<3;te++)R(new Qu(.78,.78,.3,64),"#b9b9b9",Dt,0,.42+te*.36,0);else if(Et.kind==="output"){R(new yi(1.7,.14,1.5),"#eeeeee",Dt,0,.35,0);for(let te=0;te<3;te++)R(new yi(1.1,.03,.12),"#777777",Dt,0,.44,-.35+te*.3)}else if(Et.kind==="operation")R(new Qu(.7,.7,.65,8),"#bfbfbf",Dt,0,.6,0);else if(Et.kind==="transfer"){const te=R(new yi(1.25,.25,.9),"#bfbfbf",Dt,0,.7,0);te.rotation.y=Math.PI/4}else if(Et.kind==="react")for(let te=0;te<3;te++)R(new yi(1.8-te*.22,.22,1.5-te*.15),"#c1c1c1",Dt,0,.4+te*.35,0);else if(Et.kind==="step"||Et.kind==="file")R(new yi(1.65,.22,1.4),"#bfbfbf",Dt,0,.42,0);else if(Et.kind==="api")R(new yi(.35,1.3,1.25),"#b8b8b8",Dt,-.65,.85,0),R(new yi(.35,1.3,1.25),"#b8b8b8",Dt,.65,.85,0),R(new yi(1.65,.25,1.25),"#d8d8d8",Dt,0,1.5,0);else{R(new yi(1.65,1.3,1.4),"#bfbfbf",Dt,0,.85,0);for(let te=0;te<6;te++)R(new yi(.85,.035,.025),"#6b6b6b",Dt,0,.55+te*.13,.715)}me.traverse(te=>{te.isMesh&&(te.userData.index=Zt)}),!e&&Zt<r.length-1&&z.push(R(new yi(wS,.025,.045),"#999999",v,me.position.x+Xu/2,.03,0))}),e&&e.forEach((Et,Zt)=>{const me=r.findIndex(Le=>Le.id===Et.from),Dt=r.findIndex(Le=>Le.id===Et.to);if(me<0||Dt<0||me===Dt)return;const fe=O[me].position.x,te=O[Dt].position.x,re=-Jn/2-(Zt+1)*Na,Pe=[new J(fe,.03,-Jn/2),new J(fe,.03,re),new J(te,.03,re),new J(te,.03,-Jn/2)],ri=new m1;for(let Le=1;Le<Pe.length;Le++)ri.add(new s_(Pe[Le-1],Pe[Le]));const pi=R(new Lm(ri,24,.015,4,!1),"#999999",v);pi.userData.source=me,pi.userData.target=Dt,z.push(pi)}),z.forEach(Et=>{Et.material.dispose(),Et.material=new Zu({color:"#999999",toneMapped:!1}),S.push(Et.material)});const V=new N1,X=new le;function Q(Et){const Zt=f.getBoundingClientRect();return X.set((Et.clientX-Zt.left)/Zt.width*2-1,-(Et.clientY-Zt.top)/Zt.height*2+1),V.setFromCamera(X,_),V.intersectObjects(O,!0)[0]}function W(Et){const Zt=Q(Et);Zt&&c.current.onSelect(Zt.object.userData.index)}function tt(Et){f.style.cursor=Q(Et)?"pointer":"default"}f.addEventListener("click",W),f.addEventListener("pointermove",tt);let k=!0;const H=new ResizeObserver(()=>{const Et=f.clientWidth,Zt=f.clientHeight;x.setSize(Et,Zt);const me=Et/Zt,Dt=Math.max(4.5,(y.width/2+1.25)/me);_.left=-Dt*me,_.right=Dt*me,_.top=Dt,_.bottom=-Dt,_.updateProjectionMatrix(),k=!0});H.observe(f);const st=window.matchMedia("(prefers-reduced-motion: reduce)"),et=new Se(g),pt=new Se(g),U=new Se("#777777"),Y=new Se("#999999");let ft,At,Nt=0,zt=!1,ot=[],yt=[],wt=[];function ce(Et){var me;const Zt=(me=c.current.selected)==null?void 0:me.index;if((Zt!==At||At===void 0&&!ot.length)&&(ot=M.map(Dt=>Dt.position.y),yt=w.map(Dt=>Dt.material.color.clone()),wt=z.map(Dt=>Dt.material.color.clone()),At=Zt,Nt=Et,zt=!0),zt||k){const Dt=st.matches?1:Math.min((Et-Nt)/360,1),fe=1-Math.pow(1-Dt,3);O.forEach((te,re)=>{M[re].position.y=PA.lerp(ot[re],re===Zt?.22:0,fe),w[re].material.color.lerpColors(yt[re],re===Zt?pt:U,fe)}),z.forEach((te,re)=>{te.material.color.lerpColors(wt[re],(e?te.userData.target===Zt||te.userData.source===Zt:re===Zt-1)?et:Y,fe)}),x.render(v,_),zt=Dt<1,k=!1}ft=requestAnimationFrame(ce)}return ft=requestAnimationFrame(ce),()=>{cancelAnimationFrame(ft),H.disconnect(),f.removeEventListener("click",W),f.removeEventListener("pointermove",tt),b.forEach(Et=>Et.dispose()),S.forEach(Et=>Et.dispose()),I.geometry.dispose(),I.material.dispose(),x.dispose(),x.domElement.remove()}},[r,e]),L.jsx("div",{className:"instrument-scene",ref:o,"aria-label":s,children:h&&L.jsx(GN,{nodes:r,selected:t,onSelect:i,connections:e,label:s})})}function ap({path:r}){const t=r.split("/");return t.map((i,e)=>L.jsxs(xe.Fragment,{children:[i,e<t.length-1&&L.jsxs(L.Fragment,{children:["/",L.jsx("wbr",{})]})]},e))}function nS({report:r,curated:t,node:i,active:e,trace:s,step:o,mode:c,tab:h,setTab:d}){var g;const f=(s==null?void 0:s.evidence)||(i==null?void 0:i.evidence)||[];return L.jsxs("aside",{className:`instrument-inspector inspector-${c}`,"aria-label":c==="system"?"02 / Module details":"03 / Action details","data-tab":h,children:[L.jsx("div",{className:"inspector-tabs",children:["part","files","notes"].map(x=>L.jsx("button",{"aria-pressed":h===x,onClick:()=>d(x),children:x},x))}),L.jsxs(Om,{className:"inspector-content",children:[h==="part"?L.jsxs(L.Fragment,{children:[L.jsxs("span",{className:"eyebrow",children:[c==="trace"?s?`ACTION STEP / ${String(o+1).padStart(2,"0")}`:"ACTION OVERVIEW":`SELECTED MODULE / ${String(e+1).padStart(2,"0")}`," "]}),L.jsx("h2",{children:c==="trace"?(s==null?void 0:s.title)||r.traceTitle:(i==null?void 0:i.label)||"No source components"}),s&&i&&L.jsxs("p",{className:"inspection-context",children:["MODULE ",String(e+1).padStart(2,"0")," / ",i.label]}),L.jsx("p",{children:c==="trace"?(s==null?void 0:s.description)||r.traceSummary:(i==null?void 0:i.detail)||"No readable components were established."}),L.jsx("div",{className:"inspector-rule"}),L.jsx("span",{className:"eyebrow",children:f.length?"SUPPORTING FILES":"EVIDENCE STATUS"}),f.length?f.map(x=>{var y,v,_;return L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:["↳ ",L.jsx(ap,{path:x})]}),L.jsx("p",{children:((y=r.evidence.find(A=>A.path===x))==null?void 0:y.claim)||"Referenced by this action step."}),((v=r.evidence.find(A=>A.path===x))==null?void 0:v.excerpt)&&L.jsxs("details",{children:[L.jsxs("summary",{children:["Read source excerpt",(_=r.evidence.find(A=>A.path===x))!=null&&_.startLine?` · lines ${r.evidence.find(A=>A.path===x).startLine}–${r.evidence.find(A=>A.path===x).endLine}`:""]}),L.jsx("pre",{children:r.evidence.find(A=>A.path===x).excerpt})]})]},x)}):L.jsx("p",{children:c==="trace"&&!s?"Select an action step to inspect its supporting files.":"No source references are attached to this selection."}),!t&&((g=r.connections)==null?void 0:g.filter(x=>x.from===(i==null?void 0:i.id)||x.to===(i==null?void 0:i.id)).map((x,y)=>L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:[x.from," → ",x.to]}),L.jsx("p",{children:r.analysisKind==="agent"?x.label:`Import declared in ${x.from}:${x.line}.`})]},`edge-${y}`))),L.jsx("div",{className:"inspector-note",children:t?"Reference explanation. Playback illustrates the documented sequence; it is not a live execution.":r.analysisKind==="agent"?"Agent-authored source analysis. References are checked against local files; interpretations and runtime behavior are not independently verified.":"Source imports and direct calls only. This is a static reading, not a verified runtime or deployment graph."})]}):h==="files"?L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow",children:"REPOSITORY EVIDENCE"}),L.jsx("h2",{children:"Source index"}),r.evidence.map(x=>L.jsxs("div",{className:"source-file",children:[L.jsx("span",{children:L.jsx(ap,{path:x.path})}),L.jsx("p",{children:x.claim})]},x.path))]}):L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow",children:"OPERATOR NOTES"}),L.jsx("h2",{children:"What matters"}),L.jsx("p",{children:r.matters}),L.jsx("h3",{children:"Data & persistence"}),L.jsx("p",{children:r.dataSummary}),L.jsx("h3",{children:"Project map"}),r.projectMap.map(x=>L.jsxs("div",{className:"source-file",children:[L.jsx("span",{children:L.jsx(ap,{path:x.path})}),L.jsx("p",{children:x.description})]},x.path)),L.jsx("h3",{children:"Tech stack"}),L.jsx("p",{children:r.stack.join(" / ")}),r.decisions.map(x=>L.jsx("p",{children:x},x))]}),L.jsxs("div",{className:"inspector-footer",children:[r.fileCount," FILES / ",r.generatedAt,L.jsx("br",{}),"SOURCE: ",r.sourceLabel]})]})]})}function WN({initialReport:r=Da}){const[t,i]=xe.useState("light"),e=["light","dark","blue"],s=e[(e.indexOf(t)+1)%e.length];xe.useLayoutEffect(()=>(document.documentElement.dataset.theme=t,()=>{delete document.documentElement.dataset.theme}),[t]);const[o,c]=xe.useState(r),[h,d]=xe.useState(0),[f,g]=xe.useState(-1),[x,y]=xe.useState(!1),[v,_]=xe.useState("part"),[A,b]=xe.useState("part"),[S,R]=xe.useState(""),[B,N]=xe.useState(!1),[D,I]=xe.useState(""),[O,M]=xe.useState(!1),[w,z]=xe.useState("3d"),V=xe.useRef(null),X=xe.useRef(null),Q=xe.useRef(null);xe.useEffect(()=>{if(!O)return;function Y(At){var Nt,zt;!((Nt=X.current)!=null&&Nt.contains(At.target))&&!((zt=Q.current)!=null&&zt.contains(At.target))&&M(!1)}function ft(At){var Nt;At.key==="Escape"&&(M(!1),(Nt=Q.current)==null||Nt.focus())}return document.addEventListener("pointerdown",Y),document.addEventListener("keydown",ft),()=>{document.removeEventListener("pointerdown",Y),document.removeEventListener("keydown",ft)}},[O]);const W=o===Da,tt=f>=0?o.system.findIndex(Y=>{var ft;return Y.id===((ft=o.trace[f])==null?void 0:ft.nodeId)}):-1;function k(Y){g(Y),y(!1),b("part")}xe.useEffect(()=>{if(!x)return;const Y=setTimeout(()=>{if(f>=o.trace.length-1){y(!1);return}g(f+1)},1300);return()=>clearTimeout(Y)},[x,f,o]);function H(Y){d(Y),_("part")}async function st(Y){N(!0),I("");try{c(await Y()),d(0),g(-1),y(!1),_("part"),b("part"),M(!1)}catch(ft){I(ft.message)}finally{N(!1)}}const et=o.system[h],pt=o.system[tt],U=o.trace[f];return L.jsxs("main",{className:"instrument instrument-cards",children:[L.jsxs("header",{className:"instrument-header",children:[L.jsxs("a",{className:"instrument-brand",href:"/",children:[L.jsxs("span",{className:"wordmark blnkfld-lockup",children:[L.jsx("span",{className:"blnkfld-mark","aria-hidden":"true"}),L.jsx("span",{children:"blnkfld"})]}),L.jsx("div",{className:"product-label",children:"AN AGENTIC README"})]}),L.jsxs("button",{className:"app-theme-toggle","aria-label":`Theme: ${t}. Switch to ${s} theme`,onClick:()=>i(s),children:[L.jsx("span",{"aria-hidden":"true"}),"THEME"]})]}),L.jsxs("nav",{className:"instrument-header-right","aria-label":"Sections",children:[L.jsx("a",{href:"#repository",children:"01 / REPOSITORY"}),L.jsx("a",{href:"#system",children:"02 / SYSTEM"}),L.jsxs("a",{href:"#action",children:["03 / ",W||o.analysisKind==="agent"?"TRACE ONE ACTION":"SOURCE CALL PATH"]}),L.jsx("a",{href:"#how-to-run",children:"04 / GET STARTED"})]}),L.jsxs("div",{className:`instrument-body ${U?"inspecting-trace":"inspecting-system"}`,children:[L.jsxs("section",{className:"instrument-workspace",children:[L.jsxs("div",{id:"repository",className:"instrument-title",children:[L.jsxs("div",{children:[L.jsx("span",{className:"eyebrow",children:W?"01 / REFERENCE REPOSITORY":"01 / IMPORTED REPOSITORY"}),L.jsx("h1",{children:o.name}),L.jsx("p",{children:o.subtitle})]}),L.jsx(FN,{report:o})]}),L.jsxs("div",{className:"instrument-summary",children:[L.jsx("span",{className:"eyebrow",children:"IN ONE MINUTE"}),L.jsx("p",{children:o.summary}),Array.isArray(o.haiku)&&o.haiku.length===3&&L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow project-haiku-label",children:"A HAIKU"}),L.jsx("p",{className:"project-haiku","aria-label":"Project haiku",children:o.haiku.map((Y,ft)=>L.jsx("span",{children:Y},ft))})]})]}),L.jsx("hr",{className:"section-divider divider-system"}),L.jsxs("section",{id:"system",className:"scene-wrap","aria-labelledby":"system-heading",children:[L.jsxs("div",{className:"system-heading",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["02 / SYSTEM / ",String(o.system.length).padStart(2,"0")," COMPONENTS"]}),L.jsx("h2",{id:"system-heading",children:"How the parts work together"})]}),L.jsx("div",{className:"system-view","aria-label":"System view",children:["3d","connections"].map(Y=>L.jsx("button",{"aria-pressed":w===Y,onClick:()=>z(Y),children:Y==="3d"?"SYSTEM OVERVIEW":"SYSTEM ARCHITECTURE"},Y))})]}),L.jsx(Om,{children:L.jsxs("div",{className:"view-enter",children:[w==="3d"&&L.jsxs(L.Fragment,{children:[L.jsx(XN,{nodes:o.system,connections:W?void 0:o.connections,selected:{index:h},onSelect:H},t),L.jsx("div",{className:"module-controls",children:o.system.map((Y,ft)=>L.jsxs("button",{onClick:()=>H(ft),"aria-pressed":h===ft,children:[L.jsx("span",{children:String(ft+1).padStart(2,"0")}),L.jsx("strong",{children:Y.label})]},Y.id))})]}),w==="connections"&&L.jsx(VN,{report:o,selected:h,onSelect:H,curated:W},o.sourceLabel+o.generatedAt)]},w)})]}),o.analysisKind==="agent"&&L.jsxs("p",{className:"analysis-coverage",children:["Source references checked in ",o.evidence.length," files · ",o.fileCount," files inventoried · Static analysis by ",o.agent]}),o.analysisKind!=="agent"&&o.coverage&&L.jsxs("p",{className:"analysis-coverage",children:["Read ",o.coverage.readCount," of ",o.coverage.totalCount," files · Parsed ",o.coverage.parsedCount," JavaScript/TypeScript files",o.coverage.omittedCount>0?` · ${o.coverage.omittedCount} additional modules omitted from this view`:"",o.coverage.treeTruncated?" · GitHub tree is incomplete":"",". Other languages are not analyzed."]}),L.jsx("hr",{className:"section-divider divider-action"}),L.jsxs("section",{id:"action",className:"sequencer",children:[L.jsxs("div",{className:"sequence-heading",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["03 / ",W||o.analysisKind==="agent"?"TRACE ONE ACTION":"SOURCE CALL PATH"]}),L.jsx("h2",{children:o.traceTitle})]}),L.jsx("button",{className:"play-button","aria-label":x?"Pause action trace":"Play action trace",title:x?"Pause":"Play","aria-pressed":x,disabled:!o.trace.length,onClick:()=>{x?y(!1):((f<0||f===o.trace.length-1)&&g(0),y(!0),b("part"))},children:L.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:x?L.jsx("path",{d:"M9 6v12M15 6v12"}):L.jsx("path",{d:"m9 5 10 7-10 7Z"})})})]}),L.jsx("p",{className:"action-summary",children:o.traceSummary}),L.jsx(LN,{report:o,selected:f,onSelect:k})]}),L.jsx("hr",{className:"section-divider divider-run"}),L.jsxs("section",{id:"how-to-run",className:"instrument-run","aria-labelledby":"run-heading",children:[L.jsx("span",{className:"eyebrow",children:"04 / GET STARTED"}),L.jsx("h2",{id:"run-heading",children:"How to run"}),L.jsx("p",{children:o.howToRun}),L.jsxs("div",{className:"run-evidence",children:[L.jsx("span",{children:"EVIDENCE"}),(o.runEvidence||[]).map(Y=>L.jsx("span",{children:Y},Y))]})]})]}),L.jsx(nS,{report:o,curated:W,node:et,active:h,mode:"system",tab:v,setTab:_}),L.jsx(nS,{report:o,curated:W,node:pt,active:tt,trace:U,step:f,mode:"trace",tab:A,setTab:b}),["repository","system","action","run"].map(Y=>L.jsx("div",{className:`section-card-outline card-${Y}`,"aria-hidden":"true"},Y))]}),L.jsxs("footer",{className:"instrument-footer",children:[L.jsx("button",{ref:Q,"aria-expanded":O,"aria-controls":"repository-popover",onClick:()=>M(!O),children:"+ CHANGE REPOSITORY"}),L.jsx("span",{children:B?"ANALYZING…":o.sourceLabel}),L.jsxs("div",{className:"footer-links",children:[L.jsx(HN,{}),L.jsx("span",{"aria-hidden":"true",children:"/"}),L.jsx(IN,{})]})]}),O&&L.jsxs("form",{ref:X,id:"repository-popover",className:"repository-popover",onSubmit:Y=>{Y.preventDefault(),st(()=>CM(S))},children:[L.jsx("label",{htmlFor:"repo-url",children:"Public GitHub repository"}),L.jsx("input",{id:"repo-url",value:S,onChange:Y=>R(Y.target.value),placeholder:"https://github.com/owner/repository",required:!0}),L.jsx("button",{disabled:B,children:"Analyze repository ↗"}),L.jsx("button",{type:"button",disabled:B,onClick:()=>V.current.click(),children:"Choose local folder"}),D&&L.jsx("p",{role:"alert",children:D})]}),L.jsx("input",{ref:V,type:"file",webkitdirectory:"",multiple:!0,hidden:!0,onChange:Y=>{const ft=Array.from(Y.target.files);ft.length&&st(()=>AM(ft)),Y.target.value=""}})]})}const rp=Ob.createRoot(document.getElementById("root"));async function qN(){const r=new URLSearchParams(window.location.search);let t;if(r.get("local")==="1"||document.querySelector('meta[name="blnkfld-local"]')){rp.render(L.jsx("p",{style:{padding:36},children:"Opening your project brief…"}));try{const i=await fetch("/api/report");if(!i.ok)throw new Error("Could not load the local report. Open the link printed by blnkfld in your terminal.");if(t=await i.json(),!t.system||!t.evidence)throw new Error("The local report is invalid.");r.has("token")&&(r.delete("token"),window.history.replaceState(null,"","?"+r.toString()))}catch(i){rp.render(L.jsx("p",{role:"alert",style:{padding:36},children:i.message}));return}}rp.render(L.jsx(Pb.StrictMode,{children:L.jsx(WN,{initialReport:t})}))}qN();
|
|
4293
|
+
`}function FN({report:r}){const t=xe.useRef(null),i=xe.useMemo(()=>UN(r),[r]),e=xe.useMemo(()=>ON(i),[i]);return L.jsxs(L.Fragment,{children:[L.jsx("button",{className:"readme-trigger",type:"button","aria-haspopup":"dialog",onClick:()=>t.current.showModal(),children:"VIEW README ↗"}),L.jsxs("dialog",{ref:t,className:"changelog-drawer readme-drawer","aria-labelledby":"readme-heading",onClick:s=>{if(s.target===t.current){const o=t.current.getBoundingClientRect();(s.clientX<o.left||s.clientX>o.right||s.clientY<o.top||s.clientY>o.bottom)&&t.current.close()}},children:[L.jsxs("header",{children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:[r.traceStatus==="curated"?"CURATED EXAMPLE":r.analysisKind==="agent"?"AGENT BRIEF":"SOURCE MODEL"," / TEXT README"]}),L.jsx("h2",{id:"readme-heading",children:"README"})]}),L.jsx(Um,{label:"Close README",onClick:()=>t.current.close()})]}),L.jsx("div",{className:"readme-actions",children:L.jsx("a",{className:"readme-download",href:`data:text/markdown;charset=utf-8,${encodeURIComponent(e)}`,download:"README.md",children:"Download README.md ↓"})}),L.jsxs("article",{className:"readme-text","aria-label":"README preview",children:[L.jsx("h3",{children:i.title}),i.subtitle&&L.jsx("p",{className:"readme-subtitle",children:i.subtitle}),i.sections.map(s=>{const o=s.ordered?"ol":"ul";return L.jsxs("section",{children:[L.jsx("h4",{children:s.title}),s.paragraphs.map((c,h)=>L.jsx("p",{children:c},h)),s.items.length>0&&L.jsx(o,{children:s.items.map((c,h)=>L.jsx("li",{children:c},h))})]},s.title)})]})]})]})}function Om({children:r,className:t=""}){const i=xe.useRef(null),e=xe.useRef(null);return xe.useLayoutEffect(()=>{const s=i.current,o=e.current,c=()=>{const d=o.getBoundingClientRect().height;s.style.height=`${d}px`};c();const h=new ResizeObserver(c);return h.observe(o),()=>h.disconnect()},[]),L.jsx("div",{ref:i,className:`smooth-height ${t}`,children:L.jsx("div",{ref:e,className:"smooth-height-content",children:r})})}const BN="0.1.5",kN=[{version:"0.1.5",date:"2026-11-02",groups:[{title:"Added",changes:["npx blnkfld checks for a newer release on startup and runs it automatically, so returning users are no longer stuck on an old cached version. Set BLNKFLD_NO_UPDATE=1 to opt out."]}]},{version:"0.1.4",date:"2026-11-02",groups:[{title:"Fixed",changes:['Briefs no longer fail with "Missing evidence entry" when the agent appends its claim to a source citation.']},{title:"Changed",changes:["Use the rounded-outline mark without a visible wordmark across the app and website; retain the striped-circle design as a saved alternate.","Add Vercel Web Analytics to the website.","Center the homepage mark above a smaller tagline and add a linked project credit to the footer mark.","Refine docs labels, copy feedback, and app header spacing; match the app browser title to the homepage."]}]},{version:"0.1.3",date:"2026-10-07",groups:[{title:"Added",changes:["Switch the app between light, dark, and blue themes from the header.","The website includes a getting-started guide with animated troubleshooting answers.","Matching rounded-square favicons adapt to light and dark browser themes."]},{title:"Changed",changes:["A shared outlined logo and consistent serif wordmark align the app, homepage, and docs.","Section navigation sits in its own row below the app header, alongside the updated AN AGENTIC README label.","Numbered card labels use the orange accent, and the rounded repository selector closes when clicking outside it.","The homepage command and its underline use orange, with a theme-aware footer mark.","Documentation typography and spacing are more consistent, and copying the homepage command no longer highlights its text."]},{title:"Fixed",changes:["Haikus use italic serif text again.","Blue mode uses white secondary text and theme-aware logo colors."]}]},{version:"0.1.2",date:"2026-10-06",groups:[{title:"Changed",changes:["App and drawer text is smaller and lighter, with consistent 21px medium serif headings and upright typography throughout, including the haiku.","Quick Start headings use periods in place of slash separators.","Quick Start uses the published npm package instead of requiring a local blnkfld checkout and build."]}]},{version:"0.1.1",date:"2026-10-06",groups:[{title:"Changed",changes:["System Architecture and Trace one action now step through five, four, three, two, and one column as the window narrows, preserving selection and playback.","Newly generated IN ONE MINUTE summaries contain one to five sentences, with additional detail in the expanded summary.","The changelog groups release notes by version and date and shows only releases up to the running app's version.","The hosted interface uses Lora and Times New Roman as fallbacks when Iowan Old Style is unavailable."]}]},{version:"0.1.0",date:"2026-10-05",groups:[{title:"Added",changes:["Run npx blnkfld inside a project to generate a source-backed brief using your installed Codex or Claude Code CLI.","Explore the project's system overview, architecture, and an action trace, with source excerpts supporting the explanation.","Read a project summary and haiku, inspect setup instructions, and export the brief as a README.","View reports in a local browser interface with bundled Inter, Geist Mono, IBM Plex Mono, and Lora fonts. Serif text prefers Iowan Old Style when installed, then Lora and Times New Roman."]}]}],zN=new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",timeZone:"UTC"});function HN(){const r=xe.useRef(null);return L.jsxs(L.Fragment,{children:[L.jsx("button",{className:"changelog-trigger",type:"button","aria-haspopup":"dialog",onClick:()=>r.current.showModal(),children:"CHANGELOG"}),L.jsxs("dialog",{ref:r,className:"changelog-drawer release-notes-drawer","aria-labelledby":"changelog-title",onClick:t=>{if(t.target===r.current){const i=r.current.getBoundingClientRect();(t.clientX<i.left||t.clientX>i.right||t.clientY<i.top||t.clientY>i.bottom)&&r.current.close()}},children:[L.jsxs("header",{children:[L.jsxs("div",{children:[L.jsx("span",{className:"eyebrow",children:"BLNKFLD / RELEASE NOTES"}),L.jsx("h2",{id:"changelog-title",children:"Changelog"}),L.jsxs("p",{children:["What’s changed through v",BN,"."]})]}),L.jsx(Um,{label:"Close changelog",onClick:()=>r.current.close()})]}),L.jsx("div",{className:"changelog-list",children:kN.map(t=>L.jsxs("article",{className:"changelog-entry",children:[L.jsx("time",{className:"changelog-date",dateTime:t.date,children:zN.format(new Date(`${t.date}T00:00:00Z`))}),L.jsxs("div",{children:[L.jsxs("h3",{children:["v",t.version]}),t.groups.map(i=>L.jsxs("section",{className:"changelog-category",children:[L.jsx("h4",{children:i.title}),L.jsx("ul",{children:i.changes.map(e=>L.jsx("li",{children:e},e))})]},i.title))]})]},t.version))})]})]})}function VN({report:r,selected:t,onSelect:i,curated:e}){var v,_,A;const[s,o]=xe.useState(!1),[c,h]=xe.useState(null),d=S_(),f=xe.useMemo(()=>NN(r.system,r.connections,d),[r.system,r.connections,d]),g=f.edges[c];function x(b){h(null),i(b)}function y(b){h(b),i(r.system.findIndex(S=>S.id===f.edges[b].from))}return L.jsxs("div",{className:"connections architecture-connections",children:[L.jsxs("div",{className:"connection-toolbar",children:[L.jsx("span",{children:"ENTIRE ARCHITECTURE"}),L.jsx("button",{disabled:!r.system[t],"aria-pressed":s,onClick:()=>o(!s),children:s?"Show all connections equally":"Highlight selected component"})]}),L.jsx("p",{className:"connection-context",children:e?"Reference architecture · arrows describe the documented interaction.":r.analysisKind==="agent"?"Source-based explanation · arrows describe the reported relationship, not an observed execution.":"Static imports · arrows point from the importing file to its dependency, not the direction of runtime data."}),L.jsx(v_,{layout:f,selected:t,onSelect:x,focused:s,activeEdge:c,onEdge:y}),!f.edges.length&&L.jsx("p",{className:"connection-empty",children:"No connections were established in this report. Components remain available to inspect."}),L.jsx(Om,{children:g&&L.jsxs("section",{className:"architecture-evidence","aria-label":"Selected connection evidence",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["CONNECTION / ",String(g.index+1).padStart(2,"0")]}),L.jsx("button",{onClick:()=>h(null),"aria-label":"Close connection evidence",children:"×"})]}),L.jsxs("h3",{children:[(v=r.system.find(b=>b.id===g.from))==null?void 0:v.label," → ",(_=r.system.find(b=>b.id===g.to))==null?void 0:_.label]}),L.jsx("p",{children:g.labelText}),(A=g.evidence)==null?void 0:A.map(b=>{var S;return L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:[b,g.line?` · line ${g.line}`:""]}),L.jsx("p",{children:((S=r.evidence.find(R=>R.path===b))==null?void 0:S.claim)||"Referenced by this relationship."})]},b)})]})})]})}function GN({nodes:r,selected:t,onSelect:i,connections:e,label:s}){const o=xe.useId().replaceAll(":",""),c=98*Xu/Jn,h=Math.max(360,(r.length-1)*c+210),d=r.map((y,v)=>105+v*c),f=e===void 0?r.slice(1).map((y,v)=>[v,v+1]):e.map(y=>[r.findIndex(v=>v.id===y.from),r.findIndex(v=>v.id===y.to)]).filter(([y,v])=>y>=0&&v>=0),g=(y,v,_,A,b,S)=>L.jsxs("g",{children:[L.jsx("polygon",{points:`${y-_},${v-b} ${y},${v+A-b} ${y},${v+A} ${y-_},${v}`,fill:"#cecece"}),L.jsx("polygon",{points:`${y},${v+A-b} ${y+_},${v-b} ${y+_},${v} ${y},${v+A}`,fill:"#b4b4b4"}),L.jsx("polygon",{points:`${y-_},${v-b} ${y},${v-A-b} ${y+_},${v-b} ${y},${v+A-b}`,fill:"#e9e9e9"})]},S);function x(y){return["browser","cli","input"].includes(y)?L.jsxs("g",{children:[g(0,120,18,8,4),L.jsx("path",{d:"M0 111V88",stroke:"#aaa",strokeWidth:"5"}),L.jsx("polygon",{points:"-28,54 28,78 28,111 -28,87",fill:"#aaa"}),L.jsx("polygon",{points:"-23,61 23,81 23,103 -23,83",fill:"#333"})]}):y==="react"?[0,1,2].map(v=>g(0,117-v*14,35-v*7,17-v*3,5,v)):y==="database"?L.jsx("g",{children:[0,1,2].map(v=>L.jsxs("g",{children:[L.jsx("path",{d:`M-25 ${110-v*16}v12c0 13 50 13 50 0v-12`,fill:"#bbb"}),L.jsx("ellipse",{cy:110-v*16,rx:"25",ry:"10",fill:"#ddd"})]},v))}):y==="api"?L.jsxs("g",{children:[g(-22,113,10,8,40),g(22,113,10,8,40),g(0,77,33,9,8)]}):y==="file"||y==="output"?L.jsxs("g",{children:[g(0,118,34,18,5),y==="output"&&L.jsx("path",{d:"M-20 110l28 13m-18-18l28 13m-18-18l28 13",stroke:"#777",strokeWidth:"2"})]}):y==="operation"?L.jsxs("g",{children:[L.jsx("path",{d:"M-25 90v28c0 14 50 14 50 0V90",fill:"#bbb"}),L.jsx("ellipse",{cy:"90",rx:"25",ry:"13",fill:"#ddd"})]}):y==="transfer"?g(0,104,27,18,15):g(0,119,29,16,36)}return L.jsxs("div",{className:"isometric-fallback",children:[L.jsx("span",{className:"fallback-caption",children:"ISOMETRIC COMPATIBILITY VIEW"}),L.jsxs("svg",{viewBox:`0 0 ${h} 220`,role:"group","aria-label":s.replace("three-dimensional","isometric"),children:[L.jsx("defs",{children:L.jsx("marker",{id:o,viewBox:"0 0 8 8",refX:"7",refY:"4",markerWidth:"5",markerHeight:"5",orient:"auto",children:L.jsx("path",{d:"M0 0 8 4 0 8Z",fill:"context-stroke"})})}),f.map(([y,v],_)=>L.jsx("path",{d:`M${d[y]} 148 V${175+_*5} H${d[v]} V148`,fill:"none",stroke:(t==null?void 0:t.index)===y||(t==null?void 0:t.index)===v?"var(--accent)":"#aaa",strokeWidth:"1.2",markerEnd:`url(#${o})`},_)),r.map((y,v)=>L.jsxs("g",{transform:`translate(${d[v]} 0)`,role:"button",tabIndex:"0","aria-label":`Select ${y.label}`,"aria-pressed":(t==null?void 0:t.index)===v,onClick:()=>i(v),onKeyDown:_=>{["Enter"," "].includes(_.key)&&(_.preventDefault(),i(v))},style:{cursor:"pointer"},children:[L.jsx("title",{children:y.label}),g(0,143,49,24.5,7),x(y.kind),L.jsx("path",{d:"M-32 143l19 9",stroke:(t==null?void 0:t.index)===v?"var(--accent)":"#777",strokeWidth:"3"}),L.jsx("text",{y:"210",textAnchor:"middle",fill:(t==null?void 0:t.index)===v?"var(--accent)":"#555",fontSize:"var(--mono-size)",fontFamily:"var(--mono)",fontWeight:"700",children:String(v+1).padStart(2,"0")})]},y.id||v))]})]})}function XN({nodes:r,selected:t,onSelect:i,connections:e,label:s="Interactive three-dimensional repository system"}){const o=xe.useRef(null),c=xe.useRef({selected:t,onSelect:i});c.current={selected:t,onSelect:i};const[h,d]=xe.useState(!1);return xe.useEffect(()=>{const f=o.current,g=getComputedStyle(f).getPropertyValue("--accent").trim();let x;try{x=new y_({antialias:!0,alpha:!0,preserveDrawingBuffer:!0})}catch{d(!0);return}x.setPixelRatio(Math.min(window.devicePixelRatio,2)),x.shadowMap.enabled=!0,x.shadowMap.type=PS,f.appendChild(x.domElement);const y=PM(r.length),v=new JS,_=new Gl(-9,9,7,-7,.1,100);_.position.set(5,13,20),_.lookAt(0,0,0),v.add(new E1(16777215,11908533,3));const A=new c_(16777215,4);A.position.set(-3,12,7),A.castShadow=!0,A.shadow.mapSize.set(2048,2048),Object.assign(A.shadow.camera,{left:-14,right:14,top:12,bottom:-12}),A.shadow.normalBias=.03,v.add(A);const b=[],S=[];function R(Et,Zt,me,Dt=0,fe=0,te=0){b.push(Et);const re=new o_({color:Zt,roughness:.75});S.push(re);const Pe=new Hn(Et,re);return Pe.position.set(Dt,fe,te),Pe.castShadow=!0,Pe.receiveShadow=!0,me.add(Pe),Pe}v.background=new Se(getComputedStyle(f).getPropertyValue("--paper").trim());const B=new g1({opacity:.12});S.push(B);const N=new Vl(200,200);b.push(N);const D=new Hn(N,B);D.position.y=-.005,D.rotation.x=-Math.PI/2,D.receiveShadow=!0,v.add(D);const I=new R1(y.gridSize,y.gridSize/Na,wM,CS);I.position.set(y.gridX,.002,y.gridZ),v.add(I);const O=[],M=[],w=[],z=[];r.forEach((Et,Zt)=>{const me=new co;me.position.set(y.centers[Zt],0,0),v.add(me),O.push(me);const Dt=new co;me.add(Dt),M.push(Dt),R(new yi(Jn,.18,Jn),"#d3d3d3",me,0,.09,0);const fe=R(new yi(.58,.025,.08),"#777777",me,-.65,.2,1);if(fe.material.dispose(),fe.material=new Zu({color:"#777777",toneMapped:!1}),S.push(fe.material),w.push(fe),Et.kind==="browser"||Et.kind==="input"||Et.kind==="cli")R(new yi(1.8,1.35,.15),"#555555",Dt,0,1.05,-.2),R(new yi(1.58,1.12,.025),"#252525",Dt,0,1.05,-.11),R(new yi(.1,.55,.12),"#818181",Dt,0,.45,-.2),R(new yi(1,.08,.55),"#adadad",Dt,0,.25,0);else if(Et.kind==="database")for(let te=0;te<3;te++)R(new Qu(.78,.78,.3,64),"#b9b9b9",Dt,0,.42+te*.36,0);else if(Et.kind==="output"){R(new yi(1.7,.14,1.5),"#eeeeee",Dt,0,.35,0);for(let te=0;te<3;te++)R(new yi(1.1,.03,.12),"#777777",Dt,0,.44,-.35+te*.3)}else if(Et.kind==="operation")R(new Qu(.7,.7,.65,8),"#bfbfbf",Dt,0,.6,0);else if(Et.kind==="transfer"){const te=R(new yi(1.25,.25,.9),"#bfbfbf",Dt,0,.7,0);te.rotation.y=Math.PI/4}else if(Et.kind==="react")for(let te=0;te<3;te++)R(new yi(1.8-te*.22,.22,1.5-te*.15),"#c1c1c1",Dt,0,.4+te*.35,0);else if(Et.kind==="step"||Et.kind==="file")R(new yi(1.65,.22,1.4),"#bfbfbf",Dt,0,.42,0);else if(Et.kind==="api")R(new yi(.35,1.3,1.25),"#b8b8b8",Dt,-.65,.85,0),R(new yi(.35,1.3,1.25),"#b8b8b8",Dt,.65,.85,0),R(new yi(1.65,.25,1.25),"#d8d8d8",Dt,0,1.5,0);else{R(new yi(1.65,1.3,1.4),"#bfbfbf",Dt,0,.85,0);for(let te=0;te<6;te++)R(new yi(.85,.035,.025),"#6b6b6b",Dt,0,.55+te*.13,.715)}me.traverse(te=>{te.isMesh&&(te.userData.index=Zt)}),!e&&Zt<r.length-1&&z.push(R(new yi(wS,.025,.045),"#999999",v,me.position.x+Xu/2,.03,0))}),e&&e.forEach((Et,Zt)=>{const me=r.findIndex(Le=>Le.id===Et.from),Dt=r.findIndex(Le=>Le.id===Et.to);if(me<0||Dt<0||me===Dt)return;const fe=O[me].position.x,te=O[Dt].position.x,re=-Jn/2-(Zt+1)*Na,Pe=[new J(fe,.03,-Jn/2),new J(fe,.03,re),new J(te,.03,re),new J(te,.03,-Jn/2)],ri=new m1;for(let Le=1;Le<Pe.length;Le++)ri.add(new s_(Pe[Le-1],Pe[Le]));const pi=R(new Lm(ri,24,.015,4,!1),"#999999",v);pi.userData.source=me,pi.userData.target=Dt,z.push(pi)}),z.forEach(Et=>{Et.material.dispose(),Et.material=new Zu({color:"#999999",toneMapped:!1}),S.push(Et.material)});const V=new N1,X=new le;function Q(Et){const Zt=f.getBoundingClientRect();return X.set((Et.clientX-Zt.left)/Zt.width*2-1,-(Et.clientY-Zt.top)/Zt.height*2+1),V.setFromCamera(X,_),V.intersectObjects(O,!0)[0]}function W(Et){const Zt=Q(Et);Zt&&c.current.onSelect(Zt.object.userData.index)}function tt(Et){f.style.cursor=Q(Et)?"pointer":"default"}f.addEventListener("click",W),f.addEventListener("pointermove",tt);let k=!0;const H=new ResizeObserver(()=>{const Et=f.clientWidth,Zt=f.clientHeight;x.setSize(Et,Zt);const me=Et/Zt,Dt=Math.max(4.5,(y.width/2+1.25)/me);_.left=-Dt*me,_.right=Dt*me,_.top=Dt,_.bottom=-Dt,_.updateProjectionMatrix(),k=!0});H.observe(f);const st=window.matchMedia("(prefers-reduced-motion: reduce)"),et=new Se(g),pt=new Se(g),U=new Se("#777777"),Y=new Se("#999999");let ft,At,Nt=0,zt=!1,ot=[],yt=[],wt=[];function ce(Et){var me;const Zt=(me=c.current.selected)==null?void 0:me.index;if((Zt!==At||At===void 0&&!ot.length)&&(ot=M.map(Dt=>Dt.position.y),yt=w.map(Dt=>Dt.material.color.clone()),wt=z.map(Dt=>Dt.material.color.clone()),At=Zt,Nt=Et,zt=!0),zt||k){const Dt=st.matches?1:Math.min((Et-Nt)/360,1),fe=1-Math.pow(1-Dt,3);O.forEach((te,re)=>{M[re].position.y=PA.lerp(ot[re],re===Zt?.22:0,fe),w[re].material.color.lerpColors(yt[re],re===Zt?pt:U,fe)}),z.forEach((te,re)=>{te.material.color.lerpColors(wt[re],(e?te.userData.target===Zt||te.userData.source===Zt:re===Zt-1)?et:Y,fe)}),x.render(v,_),zt=Dt<1,k=!1}ft=requestAnimationFrame(ce)}return ft=requestAnimationFrame(ce),()=>{cancelAnimationFrame(ft),H.disconnect(),f.removeEventListener("click",W),f.removeEventListener("pointermove",tt),b.forEach(Et=>Et.dispose()),S.forEach(Et=>Et.dispose()),I.geometry.dispose(),I.material.dispose(),x.dispose(),x.domElement.remove()}},[r,e]),L.jsx("div",{className:"instrument-scene",ref:o,"aria-label":s,children:h&&L.jsx(GN,{nodes:r,selected:t,onSelect:i,connections:e,label:s})})}function ap({path:r}){const t=r.split("/");return t.map((i,e)=>L.jsxs(xe.Fragment,{children:[i,e<t.length-1&&L.jsxs(L.Fragment,{children:["/",L.jsx("wbr",{})]})]},e))}function nS({report:r,curated:t,node:i,active:e,trace:s,step:o,mode:c,tab:h,setTab:d}){var g;const f=(s==null?void 0:s.evidence)||(i==null?void 0:i.evidence)||[];return L.jsxs("aside",{className:`instrument-inspector inspector-${c}`,"aria-label":c==="system"?"02 / Module details":"03 / Action details","data-tab":h,children:[L.jsx("div",{className:"inspector-tabs",children:["part","files","notes"].map(x=>L.jsx("button",{"aria-pressed":h===x,onClick:()=>d(x),children:x},x))}),L.jsxs(Om,{className:"inspector-content",children:[h==="part"?L.jsxs(L.Fragment,{children:[L.jsxs("span",{className:"eyebrow",children:[c==="trace"?s?`ACTION STEP / ${String(o+1).padStart(2,"0")}`:"ACTION OVERVIEW":`SELECTED MODULE / ${String(e+1).padStart(2,"0")}`," "]}),L.jsx("h2",{children:c==="trace"?(s==null?void 0:s.title)||r.traceTitle:(i==null?void 0:i.label)||"No source components"}),s&&i&&L.jsxs("p",{className:"inspection-context",children:["MODULE ",String(e+1).padStart(2,"0")," / ",i.label]}),L.jsx("p",{children:c==="trace"?(s==null?void 0:s.description)||r.traceSummary:(i==null?void 0:i.detail)||"No readable components were established."}),L.jsx("div",{className:"inspector-rule"}),L.jsx("span",{className:"eyebrow",children:f.length?"SUPPORTING FILES":"EVIDENCE STATUS"}),f.length?f.map(x=>{var y,v,_;return L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:["↳ ",L.jsx(ap,{path:x})]}),L.jsx("p",{children:((y=r.evidence.find(A=>A.path===x))==null?void 0:y.claim)||"Referenced by this action step."}),((v=r.evidence.find(A=>A.path===x))==null?void 0:v.excerpt)&&L.jsxs("details",{children:[L.jsxs("summary",{children:["Read source excerpt",(_=r.evidence.find(A=>A.path===x))!=null&&_.startLine?` · lines ${r.evidence.find(A=>A.path===x).startLine}–${r.evidence.find(A=>A.path===x).endLine}`:""]}),L.jsx("pre",{children:r.evidence.find(A=>A.path===x).excerpt})]})]},x)}):L.jsx("p",{children:c==="trace"&&!s?"Select an action step to inspect its supporting files.":"No source references are attached to this selection."}),!t&&((g=r.connections)==null?void 0:g.filter(x=>x.from===(i==null?void 0:i.id)||x.to===(i==null?void 0:i.id)).map((x,y)=>L.jsxs("div",{className:"source-file",children:[L.jsxs("span",{children:[x.from," → ",x.to]}),L.jsx("p",{children:r.analysisKind==="agent"?x.label:`Import declared in ${x.from}:${x.line}.`})]},`edge-${y}`))),L.jsx("div",{className:"inspector-note",children:t?"Reference explanation. Playback illustrates the documented sequence; it is not a live execution.":r.analysisKind==="agent"?"Agent-authored source analysis. References are checked against local files; interpretations and runtime behavior are not independently verified.":"Source imports and direct calls only. This is a static reading, not a verified runtime or deployment graph."})]}):h==="files"?L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow",children:"REPOSITORY EVIDENCE"}),L.jsx("h2",{children:"Source index"}),r.evidence.map(x=>L.jsxs("div",{className:"source-file",children:[L.jsx("span",{children:L.jsx(ap,{path:x.path})}),L.jsx("p",{children:x.claim})]},x.path))]}):L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow",children:"OPERATOR NOTES"}),L.jsx("h2",{children:"What matters"}),L.jsx("p",{children:r.matters}),L.jsx("h3",{children:"Data & persistence"}),L.jsx("p",{children:r.dataSummary}),L.jsx("h3",{children:"Project map"}),r.projectMap.map(x=>L.jsxs("div",{className:"source-file",children:[L.jsx("span",{children:L.jsx(ap,{path:x.path})}),L.jsx("p",{children:x.description})]},x.path)),L.jsx("h3",{children:"Tech stack"}),L.jsx("p",{children:r.stack.join(" / ")}),r.decisions.map(x=>L.jsx("p",{children:x},x))]}),L.jsxs("div",{className:"inspector-footer",children:[r.fileCount," FILES / ",r.generatedAt,L.jsx("br",{}),"SOURCE: ",r.sourceLabel]})]})]})}function WN({initialReport:r=Da}){const[t,i]=xe.useState("light"),e=["light","dark","blue"],s=e[(e.indexOf(t)+1)%e.length];xe.useLayoutEffect(()=>(document.documentElement.dataset.theme=t,()=>{delete document.documentElement.dataset.theme}),[t]);const[o,c]=xe.useState(r),[h,d]=xe.useState(0),[f,g]=xe.useState(-1),[x,y]=xe.useState(!1),[v,_]=xe.useState("part"),[A,b]=xe.useState("part"),[S,R]=xe.useState(""),[B,N]=xe.useState(!1),[D,I]=xe.useState(""),[O,M]=xe.useState(!1),[w,z]=xe.useState("3d"),V=xe.useRef(null),X=xe.useRef(null),Q=xe.useRef(null);xe.useEffect(()=>{if(!O)return;function Y(At){var Nt,zt;!((Nt=X.current)!=null&&Nt.contains(At.target))&&!((zt=Q.current)!=null&&zt.contains(At.target))&&M(!1)}function ft(At){var Nt;At.key==="Escape"&&(M(!1),(Nt=Q.current)==null||Nt.focus())}return document.addEventListener("pointerdown",Y),document.addEventListener("keydown",ft),()=>{document.removeEventListener("pointerdown",Y),document.removeEventListener("keydown",ft)}},[O]);const W=o===Da,tt=f>=0?o.system.findIndex(Y=>{var ft;return Y.id===((ft=o.trace[f])==null?void 0:ft.nodeId)}):-1;function k(Y){g(Y),y(!1),b("part")}xe.useEffect(()=>{if(!x)return;const Y=setTimeout(()=>{if(f>=o.trace.length-1){y(!1);return}g(f+1)},1300);return()=>clearTimeout(Y)},[x,f,o]);function H(Y){d(Y),_("part")}async function st(Y){N(!0),I("");try{c(await Y()),d(0),g(-1),y(!1),_("part"),b("part"),M(!1)}catch(ft){I(ft.message)}finally{N(!1)}}const et=o.system[h],pt=o.system[tt],U=o.trace[f];return L.jsxs("main",{className:"instrument instrument-cards",children:[L.jsxs("header",{className:"instrument-header",children:[L.jsx("a",{className:"instrument-brand",href:"/","aria-label":"blnkfld home",children:L.jsx("span",{className:"wordmark blnkfld-lockup",children:L.jsx("span",{className:"blnkfld-mark","aria-hidden":"true"})})}),L.jsxs("button",{className:"app-theme-toggle","aria-label":`Theme: ${t}. Switch to ${s} theme`,onClick:()=>i(s),children:[L.jsx("span",{"aria-hidden":"true"}),"THEME"]})]}),L.jsxs("nav",{className:"instrument-header-right","aria-label":"Sections",children:[L.jsx("a",{href:"#repository",children:"01 / REPOSITORY"}),L.jsx("a",{href:"#system",children:"02 / SYSTEM"}),L.jsxs("a",{href:"#action",children:["03 / ",W||o.analysisKind==="agent"?"TRACE ONE ACTION":"SOURCE CALL PATH"]}),L.jsx("a",{href:"#how-to-run",children:"04 / GET STARTED"})]}),L.jsxs("div",{className:`instrument-body ${U?"inspecting-trace":"inspecting-system"}`,children:[L.jsxs("section",{className:"instrument-workspace",children:[L.jsxs("div",{id:"repository",className:"instrument-title",children:[L.jsxs("div",{children:[L.jsx("span",{className:"eyebrow",children:W?"01 / REFERENCE REPOSITORY":"01 / IMPORTED REPOSITORY"}),L.jsx("h1",{children:o.name}),L.jsx("p",{children:o.subtitle})]}),L.jsx(FN,{report:o})]}),L.jsxs("div",{className:"instrument-summary",children:[L.jsx("span",{className:"eyebrow",children:"IN ONE MINUTE"}),L.jsx("p",{children:o.summary}),Array.isArray(o.haiku)&&o.haiku.length===3&&L.jsxs(L.Fragment,{children:[L.jsx("span",{className:"eyebrow project-haiku-label",children:"A HAIKU"}),L.jsx("p",{className:"project-haiku","aria-label":"Project haiku",children:o.haiku.map((Y,ft)=>L.jsx("span",{children:Y},ft))})]})]}),L.jsx("hr",{className:"section-divider divider-system"}),L.jsxs("section",{id:"system",className:"scene-wrap","aria-labelledby":"system-heading",children:[L.jsxs("div",{className:"system-heading",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["02 / SYSTEM / ",String(o.system.length).padStart(2,"0")," COMPONENTS"]}),L.jsx("h2",{id:"system-heading",children:"How the parts work together"})]}),L.jsx("div",{className:"system-view","aria-label":"System view",children:["3d","connections"].map(Y=>L.jsx("button",{"aria-pressed":w===Y,onClick:()=>z(Y),children:Y==="3d"?"SYSTEM OVERVIEW":"SYSTEM ARCHITECTURE"},Y))})]}),L.jsx(Om,{children:L.jsxs("div",{className:"view-enter",children:[w==="3d"&&L.jsxs(L.Fragment,{children:[L.jsx(XN,{nodes:o.system,connections:W?void 0:o.connections,selected:{index:h},onSelect:H},t),L.jsx("div",{className:"module-controls",children:o.system.map((Y,ft)=>L.jsxs("button",{onClick:()=>H(ft),"aria-pressed":h===ft,children:[L.jsx("span",{children:String(ft+1).padStart(2,"0")}),L.jsx("strong",{children:Y.label})]},Y.id))})]}),w==="connections"&&L.jsx(VN,{report:o,selected:h,onSelect:H,curated:W},o.sourceLabel+o.generatedAt)]},w)})]}),o.analysisKind==="agent"&&L.jsxs("p",{className:"analysis-coverage",children:["Source references checked in ",o.evidence.length," files · ",o.fileCount," files inventoried · Static analysis by ",o.agent]}),o.analysisKind!=="agent"&&o.coverage&&L.jsxs("p",{className:"analysis-coverage",children:["Read ",o.coverage.readCount," of ",o.coverage.totalCount," files · Parsed ",o.coverage.parsedCount," JavaScript/TypeScript files",o.coverage.omittedCount>0?` · ${o.coverage.omittedCount} additional modules omitted from this view`:"",o.coverage.treeTruncated?" · GitHub tree is incomplete":"",". Other languages are not analyzed."]}),L.jsx("hr",{className:"section-divider divider-action"}),L.jsxs("section",{id:"action",className:"sequencer",children:[L.jsxs("div",{className:"sequence-heading",children:[L.jsxs("div",{children:[L.jsxs("span",{className:"eyebrow",children:["03 / ",W||o.analysisKind==="agent"?"TRACE ONE ACTION":"SOURCE CALL PATH"]}),L.jsx("h2",{children:o.traceTitle})]}),L.jsx("button",{className:"play-button","aria-label":x?"Pause action trace":"Play action trace",title:x?"Pause":"Play","aria-pressed":x,disabled:!o.trace.length,onClick:()=>{x?y(!1):((f<0||f===o.trace.length-1)&&g(0),y(!0),b("part"))},children:L.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:x?L.jsx("path",{d:"M9 6v12M15 6v12"}):L.jsx("path",{d:"m9 5 10 7-10 7Z"})})})]}),L.jsx("p",{className:"action-summary",children:o.traceSummary}),L.jsx(LN,{report:o,selected:f,onSelect:k})]}),L.jsx("hr",{className:"section-divider divider-run"}),L.jsxs("section",{id:"how-to-run",className:"instrument-run","aria-labelledby":"run-heading",children:[L.jsx("span",{className:"eyebrow",children:"04 / GET STARTED"}),L.jsx("h2",{id:"run-heading",children:"How to run"}),L.jsx("p",{children:o.howToRun}),L.jsxs("div",{className:"run-evidence",children:[L.jsx("span",{children:"EVIDENCE"}),(o.runEvidence||[]).map(Y=>L.jsx("span",{children:Y},Y))]})]})]}),L.jsx(nS,{report:o,curated:W,node:et,active:h,mode:"system",tab:v,setTab:_}),L.jsx(nS,{report:o,curated:W,node:pt,active:tt,trace:U,step:f,mode:"trace",tab:A,setTab:b}),["repository","system","action","run"].map(Y=>L.jsx("div",{className:`section-card-outline card-${Y}`,"aria-hidden":"true"},Y))]}),L.jsxs("footer",{className:"instrument-footer",children:[L.jsx("button",{ref:Q,"aria-expanded":O,"aria-controls":"repository-popover",onClick:()=>M(!O),children:"+ CHANGE REPOSITORY"}),L.jsx("span",{children:B?"ANALYZING…":o.sourceLabel}),L.jsxs("div",{className:"footer-links",children:[L.jsx(HN,{}),L.jsx("span",{"aria-hidden":"true",children:"/"}),L.jsx(IN,{})]})]}),O&&L.jsxs("form",{ref:X,id:"repository-popover",className:"repository-popover",onSubmit:Y=>{Y.preventDefault(),st(()=>CM(S))},children:[L.jsx("label",{htmlFor:"repo-url",children:"Public GitHub repository"}),L.jsx("input",{id:"repo-url",value:S,onChange:Y=>R(Y.target.value),placeholder:"https://github.com/owner/repository",required:!0}),L.jsx("button",{disabled:B,children:"Analyze repository ↗"}),L.jsx("button",{type:"button",disabled:B,onClick:()=>V.current.click(),children:"Choose local folder"}),D&&L.jsx("p",{role:"alert",children:D})]}),L.jsx("input",{ref:V,type:"file",webkitdirectory:"",multiple:!0,hidden:!0,onChange:Y=>{const ft=Array.from(Y.target.files);ft.length&&st(()=>AM(ft)),Y.target.value=""}})]})}const rp=Ob.createRoot(document.getElementById("root"));async function qN(){const r=new URLSearchParams(window.location.search);let t;if(r.get("local")==="1"||document.querySelector('meta[name="blnkfld-local"]')){rp.render(L.jsx("p",{style:{padding:36},children:"Opening your project brief…"}));try{const i=await fetch("/api/report");if(!i.ok)throw new Error("Could not load the local report. Open the link printed by blnkfld in your terminal.");if(t=await i.json(),!t.system||!t.evidence)throw new Error("The local report is invalid.");r.has("token")&&(r.delete("token"),window.history.replaceState(null,"","?"+r.toString()))}catch(i){rp.render(L.jsx("p",{role:"alert",style:{padding:36},children:i.message}));return}}rp.render(L.jsx(Pb.StrictMode,{children:L.jsx(WN,{initialReport:t})}))}qN();
|
package/dist/client/index.html
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<link rel="icon" type="image/svg+xml" href="/assets/favicon-CuD_SWDf.svg" />
|
|
7
|
-
<title>blnkfld
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/assets/favicon-CuD_SWDf.svg?v=rounded-square" />
|
|
7
|
+
<title>blnkfld : an agentic readme</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-Oy6E_vaZ.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-9KPr1HmV.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Lora Variable;src:url(/assets/lora-latin-wght-normal-BiLcIKcI.woff2) format("woff2");font-style:normal;font-weight:400 700;font-display:swap}@font-face{font-family:Lora Variable;src:url(/assets/lora-latin-wght-italic-DBI-iqMr.woff2) format("woff2");font-style:italic;font-weight:400 700;font-display:swap}@font-face{font-family:Inter Variable;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:Geist Mono Variable;src:url(/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2) format("woff2");font-style:normal;font-weight:100 900;font-display:swap}@font-face{font-family:IBM Plex Mono;src:url(/assets/ibm-plex-mono-latin-700-normal-7sUh57Bg.woff2) format("woff2");font-style:normal;font-weight:700;font-display:swap}:root{--sans: "Inter Variable", sans-serif;--mono: "Geist Mono Variable", "IBM Plex Mono", monospace;--serif: "Iowan Old Style", "Lora Variable", "Times New Roman", serif}:root{color:#000;background:var(--paper);font-family:var(--sans);font-synthesis:none;font-weight:500;--paper: #fefefe;--ink: #000;--muted: rgba(0, 0, 0, .8);--line: #000;--hover-background: #181818;--diagram-pattern-color: rgba(0, 0, 0, .12);--accent: #D63800;--green: var(--accent);--mono-size: 11px}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;min-height:100vh;-webkit-font-smoothing:antialiased;background:var(--paper)}button,input{font:inherit}button{color:inherit}.brand-logo.blnkfld-mark{display:block;width:28px;height:28px;margin-bottom:10px;flex-shrink:0}.wordmark{font-family:var(--serif);font-size:25px;font-style:normal;line-height:1;letter-spacing:.01em;font-weight:600}.product-label{color:var(--green);margin-top:4px;font-family:var(--mono);font-size:var(--mono-size);line-height:1.15;letter-spacing:.08em;text-transform:uppercase;font-weight:700}h1,h2,h3,h4,h5,h6{font-family:var(--serif)}h1,h2,h3{margin:0;font-weight:600;color:var(--ink)}h1{font-size:25px;letter-spacing:0;line-height:1.12}::selection{background:var(--accent);color:var(--paper)}code,pre,kbd,samp{font-family:var(--mono);font-weight:700;font-size:var(--mono-size)}.blnkfld-mark{display:inline-block;flex-shrink:0;aspect-ratio:1;margin-inline:0;transform-origin:center;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20224%20224'%3e%3cpath%20fill='%23000'%20fill-rule='evenodd'%20d='M40%200h144a40%2040%200%200%201%2040%2040v144a40%2040%200%200%201-40%2040H40a40%2040%200%200%201-40-40V40A40%2040%200%200%201%2040%200z%20M40%2020a20%2020%200%200%200-20%2020v144a20%2020%200%200%200%2020%2020h144a20%2020%200%200%200%2020-20V40a20%2020%200%200%200-20-20H40z'%20/%3e%3c/svg%3e") center / contain no-repeat;mask:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20224%20224'%3e%3cpath%20fill='%23000'%20fill-rule='evenodd'%20d='M40%200h144a40%2040%200%200%201%2040%2040v144a40%2040%200%200%201-40%2040H40a40%2040%200%200%201-40-40V40A40%2040%200%200%201%2040%200z%20M40%2020a20%2020%200%200%200-20%2020v144a20%2020%200%200%200%2020%2020h144a20%2020%200%200%200%2020-20V40a20%2020%200%200%200-20-20H40z'%20/%3e%3c/svg%3e") center / contain no-repeat}.blnkfld-lockup{display:inline-flex;align-items:baseline;gap:.3em;font-weight:500;line-height:1.28;letter-spacing:.03em}.blnkfld-lockup>.blnkfld-mark{display:inline-block;width:calc(1cap + 2px);height:calc(1cap + 2px);margin:0;flex:none}.instrument{--surface:var(--paper);--text:var(--ink);--soft:var(--muted);--rule:var(--line);background:var(--surface);color:var(--text);min-height:100vh;font-family:var(--sans);font-size:13px;font-weight:500}.instrument button,.instrument input{font:inherit}.instrument button{cursor:pointer}.instrument button:focus-visible,.instrument a:focus-visible,.instrument input:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.instrument-header{height:92px;padding:0 36px;display:flex;align-items:center;justify-content:space-between}.instrument a{color:inherit;text-decoration:none}.instrument-brand{font-size:25px;letter-spacing:-1.5px;font-weight:600;display:flex;align-items:center;gap:25px}.instrument-header-right,.eyebrow,.instrument-status,.scene-caption,.inspector-tabs,.instrument-footer,.inspector-footer{font-family:var(--mono);font-size:var(--mono-size);letter-spacing:.06em;font-weight:700}.instrument-header-right{display:flex;gap:36px}.instrument-header-right>span{color:var(--soft)}.instrument-body{display:grid;grid-template-columns:minmax(0,1fr) 300px;min-height:calc(100vh - 145px)}.instrument-workspace{padding:36px 36px 25px;min-width:0}.instrument-title{display:flex;justify-content:space-between;gap:20px}.eyebrow{color:var(--soft);display:block}.instrument h1{font-size:34px;letter-spacing:-1.5px;font-weight:500;margin:13px 0 9px}.instrument-title p{color:var(--soft);max-width:580px;font-size:12px;line-height:1.6;margin:0}.instrument-status{white-space:nowrap;height:fit-content;display:flex;gap:8px;align-items:center}.instrument-status:before{content:"";background:var(--ink);width:6px;height:6px;border-radius:50%}.scene-wrap{margin-top:35px}.scene-caption{display:flex;justify-content:space-between;color:var(--soft);font-size:var(--mono-size)}.instrument-scene{height:320px;width:100%;position:relative;overflow:hidden}.instrument-scene canvas{display:block}.module-controls{display:grid;grid-template-columns:repeat(5,1fr);gap:12px}.module-controls button{text-align:left;border:0;background:none;padding:13px 0;color:var(--text);min-width:0}.module-controls button>span{font-family:var(--mono);font-size:var(--mono-size);display:block;margin-bottom:10px;font-weight:700}.module-controls strong{font-size:12px;font-weight:500;display:block}.module-controls small{font-size:11px;color:var(--soft);display:block;margin-top:5px}.module-controls button[aria-pressed=true]>span{color:var(--accent)}.module-controls button[aria-pressed=true]{box-shadow:0 -2px var(--accent)}.instrument-summary{display:grid;grid-template-columns:130px 1fr;gap:20px;margin:24px 0 32px}.instrument-summary p{margin:0;max-width:670px;font-size:12px;line-height:1.8;color:var(--muted)}.instrument-summary .eyebrow{padding-top:4px}.sequencer{padding-top:24px}.sequence-heading{display:flex;align-items:center;justify-content:space-between}.sequence-heading h2{font-size:21px;font-weight:500;margin:10px 0 20px}.play-button{width:32px;height:32px;flex-shrink:0;display:grid;place-items:center;padding:0;background:transparent;color:var(--ink);border:1px solid var(--ink);border-radius:50%}.play-button svg{width:16px;height:16px;display:block}.instrument-inspector{padding:0 25px 25px;position:relative}.inspector-tabs{height:66px;display:flex;gap:23px;align-items:center;margin-bottom:32px}.inspector-tabs button{border:0;background:none;text-transform:uppercase;color:var(--soft);font-size:var(--mono-size);padding:8px 0}.inspector-tabs button[aria-pressed=true]{color:var(--text);box-shadow:0 2px var(--text)}.instrument-inspector h2{font-size:16px;font-weight:500;letter-spacing:-.7px;margin:17px 0 12px}.instrument-inspector h3{font-size:13px;font-weight:500;margin-top:30px}.instrument-inspector p{font-size:12px;line-height:1.8;color:var(--muted)}.inspector-rule{margin:28px 0}.source-file{margin-top:22px}.source-file>span{font-family:var(--mono);font-size:var(--mono-size);overflow-wrap:anywhere;line-height:1.8;font-weight:700}.source-file p{font-size:12px;margin-top:7px}.inspector-note{margin-top:32px;padding:15px;font-size:11px;line-height:1.8;color:var(--muted)}.inspector-footer{color:var(--soft);font-size:var(--mono-size);line-height:2.1;margin-top:55px;overflow-wrap:anywhere}.instrument-footer{display:flex;align-items:center;gap:25px;padding:15px 36px;font-size:var(--mono-size)}.instrument-footer>span:last-child{margin-left:auto}.instrument-footer button{background:none;border:0;padding:0;font-size:var(--mono-size)}.repository-popover{position:fixed;left:28px;bottom:65px;width:min(430px,calc(100vw - 56px));background:var(--paper);padding:25px;border:1px solid var(--rule);box-shadow:0 10px 50px #0002;display:grid;gap:12px;z-index:5}.repository-popover input{width:100%;padding:12px;border:1px solid var(--line);background:transparent}.repository-popover button{padding:10px;background:var(--paper);border:1px solid var(--rule)}@media(min-width:1600px){.instrument-scene{height:440px}.instrument-workspace{padding:45px 55px}}@media(max-width:1000px){.instrument-body{grid-template-columns:minmax(0,1fr) 250px}.instrument-workspace{padding:28px 22px}.instrument-header{padding:0 22px}.instrument-status{display:none}.instrument-summary{grid-template-columns:1fr;gap:10px}.instrument-scene{height:260px}}@media(max-width:700px){.instrument-body{display:block}.instrument-header{height:75px}.instrument-header-right>span{display:none}.instrument-inspector{border-left:0;padding-bottom:25px}.instrument-title h1{font-size:28px}.scene-caption{font-size:var(--mono-size)}.instrument-scene{height:230px}.module-controls{gap:5px}.module-controls strong,.module-controls small{font-size:10px}.instrument-footer{padding:15px 22px}.instrument-footer>span:last-child{display:none}.instrument-footer>span{overflow-wrap:anywhere}.instrument-summary{margin-bottom:25px}}.instrument h1,.instrument h2,.instrument h3{font-family:var(--serif);font-weight:500;font-style:normal;letter-spacing:0}.instrument-brand{display:block;letter-spacing:normal}.instrument-brand .brand-logo{width:28px;height:28px;margin-bottom:10px}.instrument-header{height:145px}.instrument-body{min-height:calc(100vh - 198px)}.instrument h1,.instrument-title h1{font-size:21px;font-weight:500;font-style:normal}.instrument-brand .wordmark{font-size:25px;font-weight:500;letter-spacing:.03em;line-height:1.28}.instrument-brand .product-label{font-size:var(--mono-size)}.instrument-run{margin-top:28px;padding:24px 0;scroll-margin-top:24px}.instrument-run h2{font-size:21px;margin:12px 0}.instrument-run p{font-size:13px;line-height:1.8;max-width:720px}.run-evidence{display:flex;flex-wrap:wrap;gap:12px;font-family:var(--mono);font-size:var(--mono-size);line-height:1.7;overflow-wrap:anywhere;font-weight:700}.run-evidence>span:first-child{color:var(--muted)}@media(max-width:700px){.instrument-header{height:145px}.instrument-header-right{flex-direction:column;gap:16px}.instrument-run p{font-size:13px}}.trace-scene-wrap{margin-top:12px}.trace-controls button{min-height:72px}.trace-controls button>span{display:flex;justify-content:space-between}.analysis-coverage,.trace-empty{font-size:12px;line-height:1.8;color:var(--muted)}.source-file pre{font:700 var(--mono-size)/1.6 var(--mono);max-height:300px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.source-file summary{font:700 var(--mono-size) var(--mono);cursor:pointer;font-weight:700}.trace-empty{padding:20px 0}.play-button:disabled{opacity:.35;cursor:default}.isometric-fallback{height:100%;display:flex;flex-direction:column;justify-content:center}.isometric-fallback svg{width:100%;min-height:0;flex:1}.fallback-caption{font:700 var(--mono-size) var(--mono);color:var(--muted);padding-top:16px;font-weight:700}.isometric-fallback g[role=button]:focus-visible{outline:1px solid var(--accent)}.instrument-body{max-width:1600px;margin:0 auto;padding:28px 36px 36px;grid-template-columns:minmax(0,1fr) minmax(280px,320px);column-gap:48px;row-gap:0;align-items:start}.instrument-workspace{display:contents}.instrument-title{grid-column:1 / -1;grid-row:1}.instrument-summary{grid-column:1 / -1;grid-row:2;margin:26px 0 0;grid-template-columns:130px minmax(0,720px)}.instrument-workspace>.scene-wrap{grid-column:1;grid-row:4;margin-top:0}.sequencer{grid-column:1;grid-row:8;margin-top:0;padding-top:0}.instrument-inspector{grid-column:2;grid-row:4;min-width:0;padding:0;position:sticky;top:24px;max-height:calc(100vh - 48px);overflow:auto}.instrument-inspector.inspector-trace{grid-row:8}.inspector-tabs{height:auto;min-height:26px;margin:0 0 26px;align-items:flex-start}.inspector-tabs button{padding:0 0 8px}.instrument-run{grid-column:1 / -1;grid-row:11;margin-top:0}.analysis-coverage{grid-column:1;grid-row:5}.module-controls{grid-template-columns:repeat(auto-fit,minmax(115px,1fr));gap:16px}.module-controls strong,.module-controls small{overflow-wrap:anywhere;line-height:1.5}.instrument-scene{height:clamp(280px,26vw,400px)}.instrument-title p{max-width:720px}@media(max-width:1100px){.instrument-body{grid-template-columns:minmax(0,1fr);padding:24px 28px 32px}.instrument-title,.instrument-summary,.instrument-workspace>.scene-wrap,.sequencer,.instrument-run,.analysis-coverage,.instrument-inspector{grid-column:1}.instrument-inspector{grid-row:6;position:static;max-height:none;overflow:visible;margin:24px 0 0;max-width:720px}.instrument-inspector.inspector-trace{grid-row:9}.analysis-coverage{grid-row:5}.instrument-scene{height:320px}.instrument-status{display:flex}.inspector-footer{margin-top:24px}}@media(max-width:700px){.instrument-body{display:grid;padding:20px 22px 28px}.instrument-summary{grid-template-columns:1fr;gap:10px;margin-bottom:0}.instrument-status{display:none}.instrument-scene{height:250px}.module-controls{grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:12px}.module-controls strong{font-size:12px}.module-controls small{font-size:11px}.instrument-inspector{padding:0}}.module-controls button[aria-pressed=true] strong{color:var(--accent)}.module-controls button:hover>span,.instrument a:hover{color:var(--accent)}.inspector-tabs button[aria-pressed=true]{color:var(--accent);box-shadow:0 2px var(--accent)}.instrument-inspector[data-tab=part] .inspector-content .eyebrow:first-of-type{color:var(--accent)}.instrument-inspector[data-tab=part] .inspector-content .source-file{border-left:2px solid var(--accent);padding-left:12px}.inspection-context{font-family:var(--mono);font-size:var(--mono-size)!important;color:var(--accent)!important;font-weight:700}.module-controls button{height:132px;overflow:auto;align-self:start}.module-controls strong{height:33px;overflow:auto}.module-controls small{height:45px;overflow:auto}.trace-controls button{height:100px}.trace-controls strong{height:50px}@media(min-width:1101px){.instrument-inspector{contain:size;height:100%;min-height:0;padding-bottom:24px}.instrument-inspector.inspector-trace{margin-top:0;height:100%}}.instrument-title .eyebrow,.system-heading .eyebrow,.sequence-heading .eyebrow,.instrument-run>.eyebrow{font-weight:700}.module-controls strong{height:36px}.module-controls small{height:50px}.trace-controls strong{height:54px}.instrument-inspector{position:relative;top:auto}.module-controls button{height:148px}.trace-controls button{height:112px}.module-controls button,.trace-controls button{height:112px;min-height:0;overflow:hidden;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.module-controls button>span{flex:none}.module-controls strong,.trace-controls strong{height:auto;max-height:54px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.instrument-header-right a{font-weight:700}#repository,#action{scroll-margin-top:24px}.system-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:24px}.system-heading h2{font-size:21px;margin:10px 0 0}.system-view{display:flex;gap:16px;flex-shrink:0}.system-view button{font:700 var(--mono-size) var(--mono);border:0;border-bottom:1px solid transparent;background:none;padding:8px 0;color:var(--muted);font-weight:700}.system-view button[aria-pressed=true]{color:var(--accent);border-color:var(--accent)}.connection-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;font:700 var(--mono-size)/1.7 var(--mono);padding-top:0;font-weight:700}.connection-toolbar button{border:0;background:none;padding:4px 0;font:inherit;text-align:right;text-decoration:underline;text-underline-offset:4px}.connection-toolbar button[aria-pressed=true]{color:var(--accent)}.connection-context{font:700 var(--mono-size)/1.7 var(--mono);color:var(--soft);margin:14px 0 24px;max-width:660px;font-weight:700}.connection-empty{font-size:12px;line-height:1.8;padding:24px 0}.action-summary{font-size:12px;line-height:1.8;color:var(--soft);margin:0 0 26px;max-width:700px}@media(max-width:700px){.system-heading{align-items:flex-start;flex-direction:column;gap:12px}.connection-toolbar{align-items:flex-start}.connection-toolbar>span{min-width:0;overflow-wrap:anywhere}.connection-toolbar button{max-width:140px;flex-shrink:0}}.architecture-tools{display:flex;align-items:center;justify-content:space-between;gap:16px;font:700 var(--mono-size)/1.6 var(--mono);color:#666;margin:20px 0 14px;font-weight:700}.architecture-tools button{font:inherit;color:var(--text);background:none;border:1px solid #0003;padding:6px 10px}.architecture-frame{width:100%;border:1px solid #00000018;background:var(--paper)}.architecture-map{width:100%;margin-inline:auto;position:relative;isolation:isolate}.architecture-depth{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.architecture-depth canvas{display:block;width:100%;height:100%}.architecture-overlay{display:block;width:100%;height:100%;position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;overflow:visible}.architecture-node{cursor:pointer;outline:none}.architecture-node:focus-visible>rect{stroke:var(--accent);stroke-width:2}.architecture-node-copy{height:100%;display:flex;flex-direction:column;justify-content:center;gap:8px;text-align:left}.architecture-node-copy>span{font:700 var(--mono-size)/1 var(--mono);text-transform:uppercase;letter-spacing:.03em;color:#777;font-weight:700}.architecture-node-copy>strong{font:500 13px/1.35 var(--sans);overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.architecture-node.is-selected .architecture-node-copy>span{color:var(--accent)}.architecture-edge{color:#636363;transition:opacity .15s}.architecture-edge.is-selected{color:var(--accent)}.architecture-edge-hit{cursor:pointer}.architecture-edge-label{width:100%;height:100%;display:flex;justify-content:center;align-items:center;border:0;padding:0;background:transparent;color:inherit;font:700 var(--mono-size)/1.5 var(--mono);text-align:center;font-weight:700}.architecture-edge-label>span{padding:3px 5px;background:var(--paper);overflow-wrap:anywhere}.architecture-edge-label:hover,.architecture-edge-label[aria-pressed=true]{color:var(--accent)}.architecture-hint{font:700 var(--mono-size)/1.8 var(--mono);color:#777;margin:14px 0 0;font-weight:700}.architecture-evidence{border-top:1px solid #0003;margin:24px 0 0;padding-top:20px}.architecture-evidence>div:first-child{display:flex;justify-content:space-between;align-items:center}.architecture-evidence>div:first-child button{background:none;border:0;font-size:20px}.architecture-evidence h3{font-size:21px;margin:12px 0}.architecture-evidence>p{font-size:12px;line-height:1.7}.architecture-evidence .source-file{margin-top:14px}.architecture-evidence .source-file p{line-height:1.7;color:var(--muted)}@media(prefers-reduced-motion:reduce){.architecture-edge{transition:none}}.instrument-body{overflow-anchor:none}.smooth-height{transition:height .32s cubic-bezier(.22,.68,0,1.01);overflow:clip}.smooth-height-content{display:flow-root}.view-enter{animation:view-enter .22s ease-out}@keyframes view-enter{0%{opacity:0}to{opacity:1}}.instrument button{transition:color .16s ease,background-color .16s ease,border-color .16s ease,box-shadow .16s ease}.repository-popover{animation:popover-enter .22s ease-out}@keyframes popover-enter{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.smooth-height,.instrument button{transition:none}.view-enter,.repository-popover{animation:none}}.instrument .readme-trigger{flex-shrink:0;align-self:flex-start;background:transparent;border:0;padding:0;font:700 var(--mono-size)/1.5 var(--mono);letter-spacing:.06em;white-space:nowrap;font-weight:700}.readme-trigger:hover{color:var(--accent)}.readme-actions{padding:24px 0 32px}.readme-download{display:inline-block}.readme-drawer .readme-text{padding-bottom:32px}.instrument .readme-download{font:700 var(--mono-size)/1.5 var(--mono);padding:12px 16px;border:1px solid #0003;background:transparent;color:var(--text);white-space:nowrap;font-weight:700}.readme-download:hover{border-color:var(--accent);color:var(--accent)}.readme-text{max-width:760px;overflow-wrap:anywhere}.readme-text>h3{font-size:21px;margin:0 0 12px}.readme-text h4{font:normal 500 21px/1.4 var(--serif);margin:30px 0 12px}.readme-text p,.readme-text li{font-size:13px;line-height:1.85;color:var(--muted);white-space:pre-wrap}.readme-text p{margin:0 0 14px}.readme-text ul,.readme-text ol{padding-left:22px;margin:0 0 18px}.readme-text li+li{margin-top:10px}.readme-text .readme-subtitle{color:var(--text)}@media(max-width:700px){.instrument-title{flex-wrap:wrap}.instrument .readme-trigger{font-size:var(--mono-size)}}.instrument-footer>button{font:inherit;letter-spacing:inherit}.instrument-footer>button,.instrument-footer>span{text-transform:uppercase}#system{scroll-margin-top:24px}.trace-view{margin:0 0 24px}.trace-diagram{width:100%;margin:0}@media(max-width:700px){.instrument-header-right{gap:12px}.instrument-header-right a{font-size:var(--mono-size)}}.instrument-header,.instrument-footer{width:100%;max-width:1600px;margin-inline:auto;padding-inline:36px}@media(max-width:1100px){.instrument-header,.instrument-footer{padding-inline:28px}}@media(max-width:700px){.instrument-header,.instrument-footer{padding-inline:22px}}.instrument-summary .project-haiku{grid-column:2;margin:18px 0 0;font:normal 500 14.5px/1.8 var(--serif);color:var(--soft)}.instrument-summary .project-haiku-label{grid-column:1;margin-top:18px}.project-haiku span{display:block}@media(max-width:700px){.instrument-summary .project-haiku-label{margin-top:12px}.instrument-summary .project-haiku{grid-column:1;margin-top:0}}.instrument .instrument-inspector h2,.instrument .instrument-inspector h3{font-family:var(--sans);font-weight:500;font-style:normal;color:var(--ink)}.section-divider{grid-column:1 / -1;width:100%;border:0;border-top:1px solid var(--rule);opacity:.5;margin:40px 0}.divider-system{grid-row:3}.divider-action{grid-row:7}.divider-run{grid-row:10}@media(max-width:700px){.section-divider{margin:32px 0}}.instrument-header,.instrument-body,.instrument-footer{max-width:1360px}.instrument-header{height:128px}.instrument-body{column-gap:36px;min-height:calc(100vh - 181px)}.instrument-summary{margin-top:20px;gap:16px 24px}.instrument-summary p{line-height:1.6}.instrument-summary .project-haiku,.instrument-summary .project-haiku-label{margin-top:0}.instrument-summary .project-haiku{line-height:1.6}.system-heading{margin-bottom:16px}.system-heading h2{margin-top:8px}.sequence-heading h2{margin:8px 0 12px}.action-summary{line-height:1.6;margin-bottom:16px}.trace-view{margin-bottom:16px}.instrument-scene{height:300px}.module-controls button,.trace-controls button{height:auto;min-height:80px;padding:12px 0;align-self:stretch}.module-controls button>span{margin-bottom:6px}.module-controls strong,.trace-controls strong{line-height:1.4;max-height:51px}.inspector-tabs{margin-bottom:16px}.instrument-inspector h2{margin:8px 0}.instrument-inspector h3{margin:20px 0 8px}.instrument-inspector p{line-height:1.6;margin:8px 0}.inspector-rule{margin:20px 0}.source-file{margin-top:12px}.source-file>span{line-height:1.6}.source-file p{margin:6px 0 0}.inspector-note{margin-top:20px;padding:0;line-height:1.6}.inspector-footer{margin-top:24px;line-height:1.7}.instrument-run{padding:0}.instrument-run h2{margin:8px 0 12px}.instrument-run p{line-height:1.6;margin:0 0 16px}.connection-context{margin:12px 0 16px}.architecture-tools{margin:16px 0 12px}.architecture-hint{line-height:1.6;margin-top:12px}@media(max-width:1100px){.instrument-scene{height:280px}}@media(max-width:700px){.instrument-summary{gap:10px}.instrument-summary .project-haiku-label{margin-top:6px}.instrument-scene{height:230px}.module-controls button,.trace-controls button{min-height:72px}}.instrument-cards .instrument-body{padding:40px 68px 68px}.instrument-cards :is(#repository,#system,#action,#how-to-run){scroll-margin-top:56px}.instrument-cards .section-divider{border-color:transparent;margin:44px 0}.section-card-outline{grid-column:1 / -1;align-self:stretch;position:relative;pointer-events:none;min-width:0;min-height:0}.section-card-outline:before{content:"";position:absolute;top:-32px;right:-32px;bottom:-32px;left:-32px;border:1px solid var(--rule);border-radius:8px;opacity:.2}.card-repository{grid-row:1 / 3}.card-system{grid-row:4 / 7}.card-action{grid-row:8 / 10}.card-run{grid-row:11 / 12}@media(max-width:1100px){.instrument-cards .instrument-body{padding:40px 60px 64px}}@media(max-width:700px){.instrument-cards .instrument-body{padding:32px 46px 52px}.instrument-cards .section-divider{margin:36px 0}.section-card-outline:before{top:-24px;right:-24px;bottom:-24px;left:-24px}}.app-theme-toggle{display:inline-flex;align-items:center;gap:10px;background:none;border:0;color:inherit;padding:0;min-height:32px}:root[data-theme=dark],:root[data-theme=blue]{color-scheme:dark;--paper:#181818;--ink:#fafafa;--muted:rgba(255,255,255,.82);--line:#fafafa;--hover-background:#fafafa;--diagram-pattern-color:rgba(255,255,255,.12);--accent:#FE6848;--green:var(--accent);color:var(--ink)}:root[data-theme=blue]{--paper:#0000a8}.instrument-header{height:auto;min-height:112px;position:relative}.instrument .app-theme-toggle{position:absolute;top:16px;right:24px;display:flex;align-items:center;gap:12px;min-height:44px;padding:8px 4px;border:0;background:none;color:inherit;font-family:Geist Mono Variable,monospace;font-size:11px;font-weight:500;letter-spacing:.16em;cursor:pointer}.app-theme-toggle span{width:9px;height:9px;background:currentColor}.app-theme-toggle:hover span{outline:1px solid currentColor;outline-offset:3px}.instrument .app-theme-toggle:focus-visible{outline:1px solid var(--ink);outline-offset:4px}.instrument>.instrument-header-right{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;width:100%;max-width:1360px;margin:0 auto;padding:0 36px 24px;gap:12px 36px}@media(max-width:1100px){.instrument>.instrument-header-right{padding-inline:28px}}@media(max-width:700px){.instrument>.instrument-header-right{padding-inline:22px;gap:12px 24px}}.instrument-summary .project-haiku{font-style:italic}:root[data-theme=blue]{--muted:#fafafa}:root[data-theme=blue] :is(.architecture-tools,.architecture-node-copy>span,.architecture-hint,.architecture-edge){color:var(--ink)}.instrument :is(.instrument-title,.system-heading,.sequence-heading,.instrument-run)>.eyebrow,.instrument :is(.instrument-title,.system-heading,.sequence-heading)>div>.eyebrow{color:var(--accent)}.repository-popover{border-radius:8px}.instrument-footer{flex-wrap:wrap}.instrument-footer>button{white-space:nowrap}.instrument-footer .changelog-trigger{margin-left:auto;font:inherit;letter-spacing:inherit;color:inherit}.changelog-trigger:hover{text-decoration:underline;text-underline-offset:4px}body:has(.changelog-drawer[open]){overflow:hidden}.changelog-drawer{position:fixed;inset:0 0 0 auto;margin:0;width:min(640px,100vw);max-width:100vw;height:100dvh;max-height:100dvh;padding:0 28px;border:0;border-left:1px solid #0003;border-radius:0;background:var(--paper);color:var(--ink);box-shadow:-16px 0 60px #0002;font-family:var(--sans);font-weight:500;letter-spacing:normal;overscroll-behavior:contain}.changelog-drawer[open]{animation:changelog-enter .24s ease-out}@keyframes changelog-enter{0%{transform:translate(100%)}to{transform:translate(0)}}@media(prefers-reduced-motion:reduce){.changelog-drawer[open]{animation:none}}.changelog-drawer::backdrop{background:#0005}.changelog-drawer header{display:flex;align-items:flex-start;justify-content:space-between;gap:24px;padding:26px 0 24px;border-bottom:1px solid #0003}.changelog-drawer h2{font-size:21px;font-style:normal;margin:10px 0}.changelog-drawer header p{font-size:12px;line-height:1.6;margin:0;color:var(--muted)}.instrument .drawer-close{width:44px;height:44px;flex-shrink:0;display:grid;place-items:center;padding:0;border:0;background:none;color:var(--ink)}.drawer-close svg{display:block;width:12px;height:12px}.drawer-close:hover{color:var(--accent)}.changelog-entry{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;padding:24px 0;border-bottom:1px solid #0003}.changelog-entry:last-child{border-bottom:0}.changelog-date{font:700 var(--mono-size)/1.8 var(--mono);color:var(--muted);font-weight:700}.changelog-entry h3{font-size:21px;font-style:normal;line-height:1.35;margin:0}.changelog-category h4{font:500 12px/1.6 var(--sans);margin:16px 0 0}.changelog-category ul{margin-top:6px}.changelog-entry ul{margin:12px 0 0;padding-left:16px;font:500 12px/1.75 var(--sans);color:var(--muted)}.changelog-entry li+li{margin-top:8px}@media(max-width:700px){.instrument-footer{gap:16px 22px}.changelog-drawer{padding:0 20px}.changelog-entry{grid-template-columns:minmax(0,1fr);gap:8px}.changelog-drawer header{gap:12px}}.footer-links{display:flex;align-items:center;gap:12px;margin-left:auto}.footer-links>button{white-space:nowrap}.instrument-footer .footer-links>button{margin:0;font:inherit;letter-spacing:inherit}.how-to-run-trigger:hover{text-decoration:underline;text-underline-offset:4px}.setup-content{padding:0 0 32px}.setup-content section{margin-top:28px}.setup-content h3{font-size:21px;margin:0 0 12px}.setup-content p,.setup-content dd{font:500 12px/1.8 var(--sans);color:var(--muted);margin:0 0 14px}.setup-content pre{font:700 var(--mono-size)/1.8 var(--mono);padding:16px;background:#00000006;white-space:pre-wrap;overflow-wrap:anywhere;font-weight:700}.setup-content code{font-family:var(--mono);font-size:var(--mono-size);font-weight:700}.setup-content dt{font:700 var(--mono-size)/1.8 var(--mono);margin:18px 0 6px;white-space:normal;font-weight:700}.setup-content{white-space:normal;overflow-wrap:anywhere}.setup-drawer header{white-space:normal}
|