@taewooopark/agent-blackbox 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1204,9 +1204,227 @@ async function readTraceEvents(filePath) {
1204
1204
 
1205
1205
  // apps/daemon/dist/server.js
1206
1206
  import { createServer as createServer2 } from "node:http";
1207
- import { join as join2 } from "node:path";
1207
+ import { join as join3 } from "node:path";
1208
1208
  import { WebSocket, WebSocketServer } from "ws";
1209
1209
 
1210
+ // apps/daemon/dist/optimize.js
1211
+ import { mkdir as mkdir2, readFile as readFile3, rm, writeFile } from "node:fs/promises";
1212
+ import { dirname as dirname2, join as join2 } from "node:path";
1213
+ var flaggedIds = (report) => report.metrics.filter((m) => m.status !== "good").map((m) => m.id);
1214
+ var joinIds = (ids) => ids.join(", ");
1215
+ var REVERT_MARGIN = 3;
1216
+ async function runOptimize(options) {
1217
+ const result = await computeOptimize(options);
1218
+ const content = await readMaybe(result.agentsMdPath);
1219
+ return { ...result, applied: content !== null && hasManagedBlock(content) };
1220
+ }
1221
+ async function computeOptimize(options) {
1222
+ const eventsFile = options.eventsFile ?? join2(options.projectDir, ".agent-blackbox", "events.ndjson");
1223
+ const agentsMdPath = join2(options.projectDir, "AGENTS.md");
1224
+ const statePath = join2(options.projectDir, ".agent-blackbox", "optimization.json");
1225
+ const events = await loadTraceEvents(eventsFile);
1226
+ const { runId, events: runEvents } = latestRun(events);
1227
+ const latestTs = runEvents.reduce((max, e) => e.ts > max ? e.ts : max, "");
1228
+ const report = runEvents.length > 0 ? computeEfficiencyReport(runEvents) : null;
1229
+ const score = report ? report.overallScore : null;
1230
+ if (options.mode === "revert") {
1231
+ return revert(agentsMdPath, statePath, score);
1232
+ }
1233
+ const block = report ? buildEfficiencyMemory(report, { verifiedCommands: verifiedCommands(runEvents) }) : null;
1234
+ if (options.mode === "preview") {
1235
+ return {
1236
+ mode: "preview",
1237
+ action: block ? "Preview only \u2014 re-run with --apply to write this to AGENTS.md." : "This run is clean \u2014 nothing worth pinning.",
1238
+ score,
1239
+ baselineScore: null,
1240
+ reclaimableTokens: report?.reclaimableTokens,
1241
+ block,
1242
+ agentsMdPath,
1243
+ changed: false
1244
+ };
1245
+ }
1246
+ if (options.mode === "apply") {
1247
+ if (!block || !report || score === null || runId === null) {
1248
+ return { mode: "apply", action: "This run is clean \u2014 nothing to apply.", score, baselineScore: null, block: null, agentsMdPath, changed: false };
1249
+ }
1250
+ const prior = await readMaybe(agentsMdPath);
1251
+ const next = upsertManagedBlock(prior ?? "", block);
1252
+ await writeFile(agentsMdPath, next, "utf8");
1253
+ await writeState(statePath, {
1254
+ runId: runId ?? "",
1255
+ baselineScore: score,
1256
+ baselineLatestTs: latestTs,
1257
+ baselineFlagged: flaggedIds(report),
1258
+ fileExisted: prior !== null,
1259
+ appliedAt: (/* @__PURE__ */ new Date()).toISOString()
1260
+ });
1261
+ return {
1262
+ mode: "apply",
1263
+ action: `Wrote efficiency memory to AGENTS.md \u2014 targets ~${report.reclaimableTokens} reclaimable tokens on similar future runs (no re-run needed). Optional: re-run the same task + \`optimize --check\` to benchmark the gain.`,
1264
+ score,
1265
+ baselineScore: score,
1266
+ reclaimableTokens: report.reclaimableTokens,
1267
+ block,
1268
+ agentsMdPath,
1269
+ changed: prior !== next
1270
+ };
1271
+ }
1272
+ const state = await readState(statePath);
1273
+ if (!state) {
1274
+ return { mode: "check", action: "Nothing applied yet \u2014 run `optimize --apply` first.", score, baselineScore: null, block: null, agentsMdPath, changed: false };
1275
+ }
1276
+ if (runId === null) {
1277
+ return { mode: "check", action: "No runs recorded yet.", score, baselineScore: state.baselineScore, block: null, agentsMdPath, changed: false };
1278
+ }
1279
+ if (latestTs <= state.baselineLatestTs) {
1280
+ return {
1281
+ mode: "check",
1282
+ action: "No new run since apply. Run your agent with the memory in place, then re-check.",
1283
+ score,
1284
+ baselineScore: state.baselineScore,
1285
+ block: null,
1286
+ agentsMdPath,
1287
+ changed: false
1288
+ };
1289
+ }
1290
+ const delta = (score ?? 0) - state.baselineScore;
1291
+ const nowFlagged = report ? flaggedIds(report) : [];
1292
+ const baseFlagged = state.baselineFlagged ?? [];
1293
+ const cleared = baseFlagged.filter((id) => !nowFlagged.includes(id));
1294
+ const appeared = nowFlagged.filter((id) => !baseFlagged.includes(id));
1295
+ const metricDiff = [cleared.length ? `cleared ${joinIds(cleared)}` : "", appeared.length ? `new ${joinIds(appeared)}` : ""].filter(Boolean).join("; ");
1296
+ const diffSuffix = metricDiff ? ` [${metricDiff}]` : "";
1297
+ if (delta < -REVERT_MARGIN) {
1298
+ const changed = await restore(agentsMdPath, state.fileExisted);
1299
+ await rm(statePath, { force: true });
1300
+ return {
1301
+ mode: "check",
1302
+ action: `Score dropped ${state.baselineScore} \u2192 ${score ?? "?"} (\u0394${delta})${diffSuffix} on the new run \u2014 rolled the memory back.`,
1303
+ score,
1304
+ baselineScore: state.baselineScore,
1305
+ block: null,
1306
+ agentsMdPath,
1307
+ changed
1308
+ };
1309
+ }
1310
+ return {
1311
+ mode: "check",
1312
+ action: `Score ${state.baselineScore} \u2192 ${score ?? "?"} (\u0394${delta >= 0 ? "+" : ""}${delta})${diffSuffix} \u2014 kept the memory.`,
1313
+ score,
1314
+ baselineScore: state.baselineScore,
1315
+ block: null,
1316
+ agentsMdPath,
1317
+ changed: false
1318
+ };
1319
+ }
1320
+ async function revert(agentsMdPath, statePath, score) {
1321
+ const state = await readState(statePath);
1322
+ const changed = await restore(agentsMdPath, state ? state.fileExisted : true);
1323
+ if (state)
1324
+ await rm(statePath, { force: true });
1325
+ return {
1326
+ mode: "revert",
1327
+ action: changed ? "Removed the managed efficiency block from AGENTS.md." : "Nothing to revert.",
1328
+ score,
1329
+ baselineScore: state ? state.baselineScore : null,
1330
+ block: null,
1331
+ agentsMdPath,
1332
+ changed
1333
+ };
1334
+ }
1335
+ async function restore(agentsMdPath, fileExisted) {
1336
+ const current = await readMaybe(agentsMdPath);
1337
+ if (current === null)
1338
+ return false;
1339
+ const next = removeManagedBlock(current);
1340
+ if (next === current)
1341
+ return false;
1342
+ if (next.trim() === "" && !fileExisted) {
1343
+ await rm(agentsMdPath, { force: true });
1344
+ return true;
1345
+ }
1346
+ await writeFile(agentsMdPath, next, "utf8");
1347
+ return true;
1348
+ }
1349
+ function latestRun(events) {
1350
+ let latest;
1351
+ for (const e of events)
1352
+ if (!latest || e.ts > latest.ts)
1353
+ latest = e;
1354
+ if (!latest)
1355
+ return { runId: null, events: [] };
1356
+ const runId = latest.runId;
1357
+ return { runId, events: events.filter((e) => e.runId === runId) };
1358
+ }
1359
+ var NAV_VERBS = /* @__PURE__ */ new Set([
1360
+ "ls",
1361
+ "pwd",
1362
+ "cat",
1363
+ "find",
1364
+ "grep",
1365
+ "rg",
1366
+ "fd",
1367
+ "head",
1368
+ "tail",
1369
+ "echo",
1370
+ "which",
1371
+ "env",
1372
+ "cd",
1373
+ "tree",
1374
+ "stat",
1375
+ "wc",
1376
+ "sort",
1377
+ "uniq",
1378
+ "clear",
1379
+ "sleep",
1380
+ "true",
1381
+ "false"
1382
+ ]);
1383
+ function verifiedCommands(events) {
1384
+ const out = [];
1385
+ const seen = /* @__PURE__ */ new Set();
1386
+ for (const e of events) {
1387
+ if (e.kind !== "bash")
1388
+ continue;
1389
+ const payload = e.payload;
1390
+ if (!payload || payload.exitCode !== 0)
1391
+ continue;
1392
+ const command = typeof payload.command === "string" ? payload.command.trim() : "";
1393
+ if (!command || seen.has(command))
1394
+ continue;
1395
+ const verb = command.split(/\s+/)[0] ?? "";
1396
+ if (NAV_VERBS.has(verb))
1397
+ continue;
1398
+ seen.add(command);
1399
+ out.push(command);
1400
+ }
1401
+ return out;
1402
+ }
1403
+ async function readMaybe(path) {
1404
+ try {
1405
+ return await readFile3(path, "utf8");
1406
+ } catch (error) {
1407
+ if (error.code === "ENOENT")
1408
+ return null;
1409
+ throw error;
1410
+ }
1411
+ }
1412
+ async function readState(path) {
1413
+ const raw = await readMaybe(path);
1414
+ if (!raw)
1415
+ return null;
1416
+ try {
1417
+ return JSON.parse(raw);
1418
+ } catch {
1419
+ return null;
1420
+ }
1421
+ }
1422
+ async function writeState(path, state) {
1423
+ await mkdir2(dirname2(path), { recursive: true });
1424
+ await writeFile(path, `${JSON.stringify(state, null, 2)}
1425
+ `, "utf8");
1426
+ }
1427
+
1210
1428
  // apps/daemon/dist/suggestionProvider.js
1211
1429
  import { spawn } from "node:child_process";
1212
1430
  var TIMEOUT_MS = 45e3;
@@ -1458,11 +1676,11 @@ function extractJsonObject(text) {
1458
1676
 
1459
1677
  // apps/daemon/dist/server.js
1460
1678
  async function startTraceDaemon(options) {
1461
- const eventsFile = options.eventsFile ?? join2(options.projectDir, ".agent-blackbox", "events.ndjson");
1679
+ const eventsFile = options.eventsFile ?? join3(options.projectDir, ".agent-blackbox", "events.ndjson");
1462
1680
  const suggestConfig = options.suggest ?? { mode: "auto" };
1463
1681
  const clients = /* @__PURE__ */ new Set();
1464
1682
  const server = createServer2((request, response) => {
1465
- void handleRequest(request, response, eventsFile, clients, suggestConfig);
1683
+ void handleRequest(request, response, eventsFile, clients, suggestConfig, options.projectDir);
1466
1684
  });
1467
1685
  const streamServer = new WebSocketServer({ noServer: true });
1468
1686
  server.on("upgrade", (request, socket, head) => {
@@ -1542,7 +1760,7 @@ async function buildTraceSnapshot(eventsFile, replay = {}) {
1542
1760
  }
1543
1761
  };
1544
1762
  }
1545
- async function handleRequest(request, response, eventsFile, clients, suggestConfig) {
1763
+ async function handleRequest(request, response, eventsFile, clients, suggestConfig, projectDir) {
1546
1764
  try {
1547
1765
  const url = new URL(request.url ?? "/", "http://127.0.0.1");
1548
1766
  const replay = parseReplayQuery(url);
@@ -1588,6 +1806,18 @@ async function handleRequest(request, response, eventsFile, clients, suggestConf
1588
1806
  sendJson(response, 200, { ok: true, data: result });
1589
1807
  return;
1590
1808
  }
1809
+ if (request.method === "GET" && url.pathname === "/optimize") {
1810
+ sendJson(response, 200, { ok: true, data: await runOptimize({ projectDir, eventsFile, mode: "preview" }) });
1811
+ return;
1812
+ }
1813
+ if (request.method === "POST" && url.pathname === "/optimize/apply") {
1814
+ sendJson(response, 200, { ok: true, data: await runOptimize({ projectDir, eventsFile, mode: "apply" }) });
1815
+ return;
1816
+ }
1817
+ if (request.method === "POST" && url.pathname === "/optimize/revert") {
1818
+ sendJson(response, 200, { ok: true, data: await runOptimize({ projectDir, eventsFile, mode: "revert" }) });
1819
+ return;
1820
+ }
1591
1821
  if (request.method === "POST" && url.pathname === "/events") {
1592
1822
  const body = await readJsonBody(request);
1593
1823
  const validation = validateTraceEvent(body);
@@ -1682,29 +1912,29 @@ function isNodeError(error) {
1682
1912
  }
1683
1913
 
1684
1914
  // apps/daemon/dist/initOpenCode.js
1685
- import { mkdir as mkdir2, readFile as readFile3, writeFile } from "node:fs/promises";
1686
- import { join as join3 } from "node:path";
1915
+ import { mkdir as mkdir3, readFile as readFile4, writeFile as writeFile2 } from "node:fs/promises";
1916
+ import { join as join4 } from "node:path";
1687
1917
  var defaultAdapterPackage = "@agent-blackbox/opencode-adapter";
1688
1918
  var defaultDaemonUrl = "http://127.0.0.1:47831";
1689
1919
  async function initOpenCodeProject(options) {
1690
1920
  const adapterPackage = options.adapterPackage ?? defaultAdapterPackage;
1691
1921
  const adapterImport = inferAdapterImport(adapterPackage);
1692
1922
  const daemonUrl = options.daemonUrl ?? defaultDaemonUrl;
1693
- const opencodeDir = join3(options.projectDir, ".opencode");
1694
- const pluginsDir = join3(opencodeDir, "plugins");
1695
- const pluginPath = join3(pluginsDir, "agent-blackbox.ts");
1696
- const packageJsonPath = join3(opencodeDir, "package.json");
1697
- await mkdir2(pluginsDir, { recursive: true });
1923
+ const opencodeDir = join4(options.projectDir, ".opencode");
1924
+ const pluginsDir = join4(opencodeDir, "plugins");
1925
+ const pluginPath = join4(pluginsDir, "agent-blackbox.ts");
1926
+ const packageJsonPath = join4(opencodeDir, "package.json");
1927
+ await mkdir3(pluginsDir, { recursive: true });
1698
1928
  if (!options.force && await pathExists(pluginPath)) {
1699
1929
  throw new Error(`${pluginPath} already exists. Re-run with --force to overwrite it.`);
1700
1930
  }
1701
1931
  if (options.pluginBundlePath && await pathExists(options.pluginBundlePath)) {
1702
- const bundle = await readFile3(options.pluginBundlePath, "utf8");
1932
+ const bundle = await readFile4(options.pluginBundlePath, "utf8");
1703
1933
  const inlined = bundle.replaceAll("__ABB_DAEMON_URL__", daemonUrl);
1704
- await writeFile(pluginPath, inlined, "utf8");
1934
+ await writeFile2(pluginPath, inlined, "utf8");
1705
1935
  return { pluginPath, packageJsonPath, adapterPackage, adapterImport };
1706
1936
  }
1707
- await writeFile(pluginPath, renderOpenCodePlugin({ adapterImport, daemonUrl, optimize: options.optimize ?? false }), "utf8");
1937
+ await writeFile2(pluginPath, renderOpenCodePlugin({ adapterImport, daemonUrl, optimize: options.optimize ?? false }), "utf8");
1708
1938
  await writePackageJson(packageJsonPath, adapterPackage, adapterImport);
1709
1939
  return {
1710
1940
  pluginPath,
@@ -1727,7 +1957,7 @@ async function writePackageJson(packageJsonPath, adapterPackage, adapterImport)
1727
1957
  ...existing.dependencies ?? {},
1728
1958
  [adapterImport]: adapterPackage
1729
1959
  };
1730
- await writeFile(packageJsonPath, `${JSON.stringify({ ...existing, dependencies }, null, 2)}
1960
+ await writeFile2(packageJsonPath, `${JSON.stringify({ ...existing, dependencies }, null, 2)}
1731
1961
  `, "utf8");
1732
1962
  }
1733
1963
  function inferAdapterImport(adapterPackage) {
@@ -1738,7 +1968,7 @@ function inferAdapterImport(adapterPackage) {
1738
1968
  }
1739
1969
  async function readPackageJson(packageJsonPath) {
1740
1970
  try {
1741
- return JSON.parse(await readFile3(packageJsonPath, "utf8"));
1971
+ return JSON.parse(await readFile4(packageJsonPath, "utf8"));
1742
1972
  } catch (error) {
1743
1973
  if (isNodeError2(error) && error.code === "ENOENT") {
1744
1974
  return {};
@@ -1748,7 +1978,7 @@ async function readPackageJson(packageJsonPath) {
1748
1978
  }
1749
1979
  async function pathExists(path) {
1750
1980
  try {
1751
- await readFile3(path, "utf8");
1981
+ await readFile4(path, "utf8");
1752
1982
  return true;
1753
1983
  } catch (error) {
1754
1984
  if (isNodeError2(error) && error.code === "ENOENT") {
@@ -1767,219 +1997,6 @@ function describeDaemon() {
1767
1997
  return "Agent-Blackbox daemon: local ingest, replay, and dashboard bridge.";
1768
1998
  }
1769
1999
 
1770
- // apps/daemon/dist/optimize.js
1771
- import { mkdir as mkdir3, readFile as readFile4, rm, writeFile as writeFile2 } from "node:fs/promises";
1772
- import { dirname as dirname2, join as join4 } from "node:path";
1773
- var flaggedIds = (report) => report.metrics.filter((m) => m.status !== "good").map((m) => m.id);
1774
- var joinIds = (ids) => ids.join(", ");
1775
- var REVERT_MARGIN = 3;
1776
- async function runOptimize(options) {
1777
- const eventsFile = join4(options.projectDir, ".agent-blackbox", "events.ndjson");
1778
- const agentsMdPath = join4(options.projectDir, "AGENTS.md");
1779
- const statePath = join4(options.projectDir, ".agent-blackbox", "optimization.json");
1780
- const events = await loadTraceEvents(eventsFile);
1781
- const { runId, events: runEvents } = latestRun(events);
1782
- const latestTs = runEvents.reduce((max, e) => e.ts > max ? e.ts : max, "");
1783
- const report = runEvents.length > 0 ? computeEfficiencyReport(runEvents) : null;
1784
- const score = report ? report.overallScore : null;
1785
- if (options.mode === "revert") {
1786
- return revert(agentsMdPath, statePath, score);
1787
- }
1788
- const block = report ? buildEfficiencyMemory(report, { verifiedCommands: verifiedCommands(runEvents) }) : null;
1789
- if (options.mode === "preview") {
1790
- return {
1791
- mode: "preview",
1792
- action: block ? "Preview only \u2014 re-run with --apply to write this to AGENTS.md." : "This run is clean \u2014 nothing worth pinning.",
1793
- score,
1794
- baselineScore: null,
1795
- reclaimableTokens: report?.reclaimableTokens,
1796
- block,
1797
- agentsMdPath,
1798
- changed: false
1799
- };
1800
- }
1801
- if (options.mode === "apply") {
1802
- if (!block || !report || score === null || runId === null) {
1803
- return { mode: "apply", action: "This run is clean \u2014 nothing to apply.", score, baselineScore: null, block: null, agentsMdPath, changed: false };
1804
- }
1805
- const prior = await readMaybe(agentsMdPath);
1806
- const next = upsertManagedBlock(prior ?? "", block);
1807
- await writeFile2(agentsMdPath, next, "utf8");
1808
- await writeState(statePath, {
1809
- runId: runId ?? "",
1810
- baselineScore: score,
1811
- baselineLatestTs: latestTs,
1812
- baselineFlagged: flaggedIds(report),
1813
- fileExisted: prior !== null,
1814
- appliedAt: (/* @__PURE__ */ new Date()).toISOString()
1815
- });
1816
- return {
1817
- mode: "apply",
1818
- action: `Wrote efficiency memory to AGENTS.md \u2014 targets ~${report.reclaimableTokens} reclaimable tokens on similar future runs (no re-run needed). Optional: re-run the same task + \`optimize --check\` to benchmark the gain.`,
1819
- score,
1820
- baselineScore: score,
1821
- reclaimableTokens: report.reclaimableTokens,
1822
- block,
1823
- agentsMdPath,
1824
- changed: prior !== next
1825
- };
1826
- }
1827
- const state = await readState(statePath);
1828
- if (!state) {
1829
- return { mode: "check", action: "Nothing applied yet \u2014 run `optimize --apply` first.", score, baselineScore: null, block: null, agentsMdPath, changed: false };
1830
- }
1831
- if (runId === null) {
1832
- return { mode: "check", action: "No runs recorded yet.", score, baselineScore: state.baselineScore, block: null, agentsMdPath, changed: false };
1833
- }
1834
- if (latestTs <= state.baselineLatestTs) {
1835
- return {
1836
- mode: "check",
1837
- action: "No new run since apply. Run your agent with the memory in place, then re-check.",
1838
- score,
1839
- baselineScore: state.baselineScore,
1840
- block: null,
1841
- agentsMdPath,
1842
- changed: false
1843
- };
1844
- }
1845
- const delta = (score ?? 0) - state.baselineScore;
1846
- const nowFlagged = report ? flaggedIds(report) : [];
1847
- const baseFlagged = state.baselineFlagged ?? [];
1848
- const cleared = baseFlagged.filter((id) => !nowFlagged.includes(id));
1849
- const appeared = nowFlagged.filter((id) => !baseFlagged.includes(id));
1850
- const metricDiff = [cleared.length ? `cleared ${joinIds(cleared)}` : "", appeared.length ? `new ${joinIds(appeared)}` : ""].filter(Boolean).join("; ");
1851
- const diffSuffix = metricDiff ? ` [${metricDiff}]` : "";
1852
- if (delta < -REVERT_MARGIN) {
1853
- const changed = await restore(agentsMdPath, state.fileExisted);
1854
- await rm(statePath, { force: true });
1855
- return {
1856
- mode: "check",
1857
- action: `Score dropped ${state.baselineScore} \u2192 ${score ?? "?"} (\u0394${delta})${diffSuffix} on the new run \u2014 rolled the memory back.`,
1858
- score,
1859
- baselineScore: state.baselineScore,
1860
- block: null,
1861
- agentsMdPath,
1862
- changed
1863
- };
1864
- }
1865
- return {
1866
- mode: "check",
1867
- action: `Score ${state.baselineScore} \u2192 ${score ?? "?"} (\u0394${delta >= 0 ? "+" : ""}${delta})${diffSuffix} \u2014 kept the memory.`,
1868
- score,
1869
- baselineScore: state.baselineScore,
1870
- block: null,
1871
- agentsMdPath,
1872
- changed: false
1873
- };
1874
- }
1875
- async function revert(agentsMdPath, statePath, score) {
1876
- const state = await readState(statePath);
1877
- const changed = await restore(agentsMdPath, state ? state.fileExisted : true);
1878
- if (state)
1879
- await rm(statePath, { force: true });
1880
- return {
1881
- mode: "revert",
1882
- action: changed ? "Removed the managed efficiency block from AGENTS.md." : "Nothing to revert.",
1883
- score,
1884
- baselineScore: state ? state.baselineScore : null,
1885
- block: null,
1886
- agentsMdPath,
1887
- changed
1888
- };
1889
- }
1890
- async function restore(agentsMdPath, fileExisted) {
1891
- const current = await readMaybe(agentsMdPath);
1892
- if (current === null)
1893
- return false;
1894
- const next = removeManagedBlock(current);
1895
- if (next === current)
1896
- return false;
1897
- if (next.trim() === "" && !fileExisted) {
1898
- await rm(agentsMdPath, { force: true });
1899
- return true;
1900
- }
1901
- await writeFile2(agentsMdPath, next, "utf8");
1902
- return true;
1903
- }
1904
- function latestRun(events) {
1905
- let latest;
1906
- for (const e of events)
1907
- if (!latest || e.ts > latest.ts)
1908
- latest = e;
1909
- if (!latest)
1910
- return { runId: null, events: [] };
1911
- const runId = latest.runId;
1912
- return { runId, events: events.filter((e) => e.runId === runId) };
1913
- }
1914
- var NAV_VERBS = /* @__PURE__ */ new Set([
1915
- "ls",
1916
- "pwd",
1917
- "cat",
1918
- "find",
1919
- "grep",
1920
- "rg",
1921
- "fd",
1922
- "head",
1923
- "tail",
1924
- "echo",
1925
- "which",
1926
- "env",
1927
- "cd",
1928
- "tree",
1929
- "stat",
1930
- "wc",
1931
- "sort",
1932
- "uniq",
1933
- "clear",
1934
- "sleep",
1935
- "true",
1936
- "false"
1937
- ]);
1938
- function verifiedCommands(events) {
1939
- const out = [];
1940
- const seen = /* @__PURE__ */ new Set();
1941
- for (const e of events) {
1942
- if (e.kind !== "bash")
1943
- continue;
1944
- const payload = e.payload;
1945
- if (!payload || payload.exitCode !== 0)
1946
- continue;
1947
- const command = typeof payload.command === "string" ? payload.command.trim() : "";
1948
- if (!command || seen.has(command))
1949
- continue;
1950
- const verb = command.split(/\s+/)[0] ?? "";
1951
- if (NAV_VERBS.has(verb))
1952
- continue;
1953
- seen.add(command);
1954
- out.push(command);
1955
- }
1956
- return out;
1957
- }
1958
- async function readMaybe(path) {
1959
- try {
1960
- return await readFile4(path, "utf8");
1961
- } catch (error) {
1962
- if (error.code === "ENOENT")
1963
- return null;
1964
- throw error;
1965
- }
1966
- }
1967
- async function readState(path) {
1968
- const raw = await readMaybe(path);
1969
- if (!raw)
1970
- return null;
1971
- try {
1972
- return JSON.parse(raw);
1973
- } catch {
1974
- return null;
1975
- }
1976
- }
1977
- async function writeState(path, state) {
1978
- await mkdir3(dirname2(path), { recursive: true });
1979
- await writeFile2(path, `${JSON.stringify(state, null, 2)}
1980
- `, "utf8");
1981
- }
1982
-
1983
2000
  // apps/daemon/dist/cli.js
1984
2001
  var args = process.argv.slice(2);
1985
2002
  var cliDir = dirname3(fileURLToPath(import.meta.url));
@@ -0,0 +1 @@
1
+ :root{color:var(--text);background:var(--bg);font-synthesis:none;text-rendering:optimizelegibility;--card-bg:transparent;--card-border-color:var(--hair);--card-radius:2px;--card-shadow:none;--card-blur:none;--fs-title:14px;--fs-body:12px;--fs-label:9.5px;--bg:#f2f2f2;--bg-elevated:#ececec;--panel-grad:transparent;--scrim:#0006;--surface-strong:#00000008;--surface-soft:#00000005;--surface-tint:#00000006;--surface-tint-faint:#00000004;--ink-line:#0000008c;--hair:#00000029;--border:#00000029;--border-strong:#0000004d;--border-contrast:#00000080;--fill-subtle:#0000000d;--fill-hover:#00000012;--node-hover:#0000001a;--control-fill:#0003;--control-fill-hover:#00000061;--dot-fill:var(--text);--tick-fill:var(--text-muted);--fillbar:#2a2a2a;--text:#191919;--text-heading:#191919;--text-secondary:#5c5c5c;--text-muted:#8c8c8c;--text-faint:#bcbcbc;--action-bg:transparent;--action-fg:var(--text);--status-dot:#8c8c8c;--tick-empty:#0000002e;--tick-work:#00000057;--tick-decision:#0000006b;--tick-claim:#00000042;--danger:#8f342b;--danger-2:#8f342b;--danger-solid:#8f342b;--danger-bg:#8f342b1a;--danger-bg-2:#8f342b14;--danger-border:#8f342b6b;--danger-border-soft:#8f342b4d;--danger-border-strong:#8f342b99;--danger-bar:#a7463c;--danger-tint:#8f342b14;--success:#5c5c5c;--success-solid:#5c5c5c;--success-tint:#0000000a;--success-bar:var(--fillbar);--warn-bg:#0000000a;--warn-border:var(--hair);--warn-text:#5c5c5c;--bar-neutral:var(--hair);--bar-work:var(--hair);--bar-info:var(--border-strong);--bar-coord:var(--border-strong);--shadow-color:#0000002e;font-family:Spectral,Georgia,Times New Roman,serif;font-weight:400}*{box-sizing:border-box}body{min-width:320px;min-height:100vh;font-size:var(--fs-body);margin:0;overflow:hidden}button{font:inherit}.shell{background:var(--bg);flex-direction:column;height:100vh;min-height:100vh;display:flex;overflow:hidden}.topbar{color:var(--text);background:0 0;border-bottom:0;justify-content:space-between;align-items:center;gap:14px;min-height:50px;padding:10px 16px 8px;display:flex}.topbar strong{font-size:var(--fs-title);letter-spacing:0;text-overflow:ellipsis;white-space:nowrap;max-width:min(620px,70vw);line-height:1.2;display:block;overflow:hidden}.topbarStatus{flex:none;align-items:center;gap:6px;display:flex}.statusChip{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-secondary);font-size:var(--fs-body);white-space:nowrap;align-items:center;gap:5px;padding:4px 9px;font-weight:700;display:inline-flex}.runPicker{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-body);max-width:240px;padding:4px 9px;font-weight:700}.runPicker:hover{border-color:var(--border-strong)}.topbarAction{background:var(--action-bg);border:1px solid var(--border-strong);border-radius:var(--card-radius);color:var(--action-fg);cursor:pointer;font-size:var(--fs-body);padding:4px 11px;font-weight:700}.topbarAction:disabled{cursor:not-allowed;opacity:.4}.themeToggle{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-title);justify-content:center;align-items:center;min-height:28px;padding:4px 8px;line-height:1;display:inline-flex}.themeToggle:hover{border-color:var(--border-strong)}.handoffOverlay{background:var(--scrim);z-index:50;justify-content:center;align-items:center;padding:40px;display:flex;position:fixed;inset:0}.handoffPanel{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);width:min(720px,90vw);max-height:80vh;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);flex-direction:column;padding:14px;display:flex;overflow:hidden}.handoffHeader{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.handoffActions{gap:6px;display:flex}.handoffActions button{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-body);padding:4px 10px;font-weight:700}.handoffBody{background:var(--surface-soft);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);font-size:var(--fs-body);white-space:pre-wrap;word-break:break-word;margin:0;padding:12px;line-height:1.5;overflow:auto}.statusChip.host{color:var(--text-heading);text-transform:lowercase}.statusChip.state{text-transform:capitalize}.statusDot{background:var(--status-dot);border-radius:999px;width:6px;height:6px}.state-active .statusDot{background:var(--success-solid)}.state-idle .statusDot{background:var(--status-dot)}.state-error{color:var(--danger)}.state-error .statusDot{background:var(--danger-solid)}.statusChip.risk{background:var(--danger-bg);border-color:var(--danger-border);color:var(--danger)}button.statusChip{cursor:pointer;font:inherit}button.statusChip:hover{border-color:var(--danger-border-strong)}.stats{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.metric{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);min-width:60px;padding:5px 7px}.metric span{color:var(--text-muted);font-size:var(--fs-body);margin:0}.metric strong{color:var(--text);font-size:var(--fs-title)}.metric.ok strong{color:var(--success)}.metric.risk strong{color:var(--danger-2)}.banner{background:var(--warn-bg);border-bottom:1px solid var(--warn-border);color:var(--warn-text);font-size:var(--fs-body);padding:7px 16px}.workspace{flex:auto;grid-template-columns:190px minmax(0,1fr) 324px;gap:12px;min-height:0;padding:0 14px 8px;display:grid;position:relative;overflow:hidden}.fileEdgeLayer{pointer-events:none;z-index:5;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.fileEdge{fill:none;opacity:.16;stroke:var(--text);stroke-linecap:round;stroke-width:1.1px;transition:opacity .14s,stroke-width .14s}.fileEdgeLayer.hasFocus .fileEdge:not(.focused){opacity:.04}.fileEdge.focused{opacity:.85;stroke-width:1.8px}.lanes{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);height:100%;min-height:0;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);padding:14px;overflow-y:auto}.copilot{height:100%;min-height:0;overflow:hidden auto}h2{color:var(--text-heading);font-size:var(--fs-body);letter-spacing:0;text-transform:uppercase;margin:0 0 8px}h3{font-size:var(--fs-title);overflow-wrap:anywhere;margin:6px 0 8px;line-height:1.25}.muted{color:var(--text-muted);font-size:var(--fs-body)}.lane{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text);cursor:pointer;text-align:left;grid-template-columns:18px minmax(0,1fr) auto;align-items:center;gap:7px;width:100%;min-height:36px;margin-bottom:7px;padding:7px;display:grid}.lane.active,.lane:hover{border-color:var(--border-contrast);box-shadow:0 8px 28px var(--shadow-color)}.laneMarker{background:var(--text-heading);border:3px solid var(--surface-strong);box-shadow:0 0 0 1px var(--border-strong);border-radius:999px;width:12px;height:12px;display:block}.laneMain{gap:1px;min-width:0;display:grid}.laneMain strong{color:var(--text);font-size:var(--fs-body);text-overflow:ellipsis;white-space:nowrap;line-height:1.15;overflow:hidden}.laneMain span{color:var(--text-muted);font-size:var(--fs-label);text-transform:uppercase;font-weight:700}.laneBadges{justify-content:end;align-items:center;display:flex}.timeline{margin-top:18px}.timelineBar{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;margin:0 14px 12px;padding:7px 12px;display:grid}.timelineBar .ticks{grid-column:1;gap:2px;min-width:0;display:flex;overflow:hidden}.timelineBar .tick{border-radius:2px;flex:1 1 0;min-width:0;height:18px}.timelineControls{grid-column:2;align-items:center;gap:10px;display:flex}.timelineLive{background:var(--fill-subtle);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-body);white-space:nowrap;padding:4px 10px;font-weight:700}.timelineLive:disabled{color:var(--success);cursor:default}.timelineRange{width:160px}.timelineLabel{color:var(--text-muted);font-size:var(--fs-label);font-variant-numeric:tabular-nums;white-space:nowrap}.tokenPanel{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);margin-top:16px;padding:10px}.tokenTotal{color:var(--text);font-size:var(--fs-title);margin-bottom:8px;line-height:1.2;display:block}.tokenRows{gap:3px;display:grid}.tokenRow{color:var(--text-muted);font-size:var(--fs-body);justify-content:space-between;align-items:center;display:flex}.tokenRow strong{color:var(--text-heading);font-size:var(--fs-body)}.contextPanel{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);padding:12px}.contextHead{align-items:center;gap:10px;margin-bottom:10px;display:flex}.contextScoreBig{letter-spacing:-.02em;font-size:30px;font-weight:700;line-height:.9}.contextHeadMeta{gap:2px;min-width:0;display:grid}.contextHeadMeta h2{margin:0}.contextHeadline{color:var(--text-muted);font-size:var(--fs-label);line-height:1.3}.contextTopFixes{gap:6px;margin-bottom:10px;display:grid}.contextTopFix{background:var(--fill-subtle);border:0;border-left:2px solid var(--text-faint);cursor:pointer;text-align:left;border-radius:5px;gap:2px;padding:7px 9px;display:grid}.contextTopFix:hover{background:var(--fill-hover)}.contextTopFix.severity-warn{border-left-color:var(--warn-text)}.contextTopFix.severity-bad{border-left-color:var(--danger)}.contextTopFixTitle{color:var(--text-heading);font-size:var(--fs-body);font-weight:700}.contextTopFixAction{color:var(--text-secondary);font-size:var(--fs-label);line-height:1.45}.contextAllClear{color:var(--success);font-size:var(--fs-label);margin:0 0 10px;line-height:1.4}.contextMetrics{gap:6px;display:grid}.contextMetricWrap{gap:4px;display:grid}.contextSuggestion{background:var(--fill-subtle);border-left:2px solid var(--text-faint);color:var(--text-secondary);font-size:var(--fs-label);border-radius:4px;margin:0 0 2px;padding:6px 8px;line-height:1.45}.contextSuggestion.severity-warn{border-left-color:var(--warn-text)}.contextSuggestion.severity-bad{border-left-color:var(--danger)}.contextSuggestionSource{color:var(--text-faint);text-transform:uppercase}.contextAi{gap:5px;margin-bottom:10px;display:grid}.contextAiButton{background:var(--fill-subtle);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-body);padding:5px 9px;font-weight:700}.contextAiButton:hover:not(:disabled){border-color:var(--border-strong)}.contextAiButton:disabled{cursor:default;opacity:.6}.contextAiNote{color:var(--text-muted);font-size:var(--fs-label);line-height:1.4}.optimizeButton{background:var(--text-heading);border:1px solid var(--text-heading);border-radius:var(--card-radius);color:var(--bg);cursor:pointer;text-align:left;gap:1px;padding:7px 10px;transition:opacity .12s;display:grid}.optimizeButton:hover:not(:disabled){opacity:.86}.optimizeButton:disabled{cursor:default;opacity:.4}.optimizeButtonLabel{font-size:var(--fs-body);font-weight:700}.optimizeButtonHint{font-size:var(--fs-label);opacity:.8}.optimizeOverlay{background:var(--scrim);z-index:60;justify-content:center;align-items:center;padding:40px;display:flex;position:fixed;inset:0}.optimizePanel{background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--card-radius);flex-direction:column;gap:12px;width:min(560px,92vw);max-height:84vh;padding:18px;display:flex;overflow:hidden}.optimizeHeader{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.optimizeHeaderText h2{font-size:var(--fs-title);margin:0 0 4px}.optimizeSub{color:var(--text-secondary);font-size:var(--fs-body);margin:0;line-height:1.5}.optimizeSub code{background:var(--surface-strong);border-radius:2px;padding:0 3px}.optimizeClose{border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-muted);cursor:pointer;font-size:var(--fs-body);background:0 0;flex:none;padding:4px 7px;line-height:1}.optimizeClose:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-heading)}.optimizeClose:disabled{cursor:default;opacity:.4}.optimizeStatus{color:var(--text-secondary);font-size:var(--fs-body);margin:0;line-height:1.5}.optimizeStatus.error{color:var(--danger)}.optimizeStatus.done{color:var(--text-heading)}.optimizeMeta{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.optimizeBadge{border:1px solid var(--card-border-color);font-size:var(--fs-label);letter-spacing:.04em;text-transform:uppercase;border-radius:999px;padding:2px 8px;font-weight:700}.optimizeBadge.on{background:var(--text-heading);border-color:var(--text-heading);color:var(--bg)}.optimizeBadge.off{color:var(--text-muted)}.optimizeReclaim{color:var(--text-secondary);font-size:var(--fs-label)}.optimizePath{color:var(--text-muted);font-size:var(--fs-label);margin-left:auto}.optimizeBlockLabel{color:var(--text-muted);font-size:var(--fs-label);letter-spacing:.05em;text-transform:uppercase;margin:0}.optimizeBlock{background:var(--surface-soft);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text);white-space:pre-wrap;word-break:break-word;margin:0;padding:12px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:11px;line-height:1.55;overflow:auto}.optimizeFooter{align-items:center;gap:8px;margin-top:2px;display:flex}.optimizeApply{background:var(--text-heading);border:1px solid var(--text-heading);border-radius:var(--card-radius);color:var(--bg);cursor:pointer;font-size:var(--fs-body);padding:6px 12px;font-weight:700}.optimizeApply:hover:not(:disabled){opacity:.86}.optimizeApply:disabled{cursor:default;opacity:.5}.optimizeRevert{background:var(--danger-bg);border:1px solid var(--danger-border);border-radius:var(--card-radius);color:var(--danger);cursor:pointer;font-size:var(--fs-body);padding:6px 12px;font-weight:700}.optimizeRevert:hover:not(:disabled){border-color:var(--danger-border-strong)}.optimizeRevert:disabled{cursor:default;opacity:.5}.optimizeCancel{border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-secondary);cursor:pointer;font-size:var(--fs-body);background:0 0;margin-left:auto;padding:6px 12px}.optimizeCancel:hover:not(:disabled){border-color:var(--border-strong);color:var(--text-heading)}.optimizeCancel:disabled{cursor:default;opacity:.5}.contextTokensToggle{border:0;border-top:1px solid var(--card-border-color);color:var(--text-muted);cursor:pointer;font-size:var(--fs-body);background:0 0;justify-content:space-between;align-items:center;width:100%;margin-top:10px;padding:8px 0 0;display:flex}.contextTokensTotal{color:var(--text-heading);font-weight:700}.contextTokenRows{gap:3px;margin-top:6px;display:grid}.contextMetric{cursor:pointer;text-align:left;background:0 0;border:0;border-radius:5px;gap:3px;width:calc(100% + 8px);margin:0 -4px;padding:3px 4px;display:grid}.contextMetric:hover:not(:disabled){background:var(--fill-subtle)}.contextMetric:disabled{cursor:default}.contextMetricTop{font-size:var(--fs-body);justify-content:space-between;align-items:center;display:flex}.contextMetricLabel{color:var(--text-muted)}.contextMetricValue{color:var(--text-heading);font-weight:700}.contextBar{background:var(--fill-subtle);border-radius:999px;height:3px;display:block;overflow:hidden}.contextBarFill{background:var(--text-faint);border-radius:999px;height:100%;display:block}.status-good{color:var(--success)}.status-warn{color:var(--warn-text)}.status-bad{color:var(--danger)}.contextMetric.status-good .contextBarFill{background:var(--success)}.contextMetric.status-warn .contextBarFill{background:var(--warn-text)}.contextMetric.status-bad .contextBarFill{background:var(--danger)}.replayControls{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;display:grid}.replayControls input{accent-color:var(--text-heading);width:100%;min-width:0}.replayControls button,.glassInspector button{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-heading);cursor:pointer;font-size:var(--fs-body);min-height:26px;padding:4px 8px}.replayControls button:disabled{color:var(--text-faint);cursor:not-allowed}.replayLabel{color:var(--text-muted);font-size:var(--fs-body);margin:8px 0}.ticks{grid-template-columns:repeat(12,1fr);gap:3px;display:grid}.tick{background:var(--tick-empty);border:0;border-radius:3px;height:16px;padding:0;display:block}.tick.seen{box-shadow:inset 0 0 0 2px var(--surface-soft)}.tick-work{background:var(--tick-work)}.tick-decision{background:var(--tick-decision)}.tick-risk{background:var(--danger-solid)}.tick-success{background:var(--success-solid)}.tick-claim{background:var(--tick-claim)}.sessionMap{height:100%;min-height:0;padding:14px 0 0;position:relative;overflow:hidden}.workflowHeader{justify-content:space-between;align-items:center;gap:12px;margin:0 0 10px;display:flex}.workflowHeader h2{margin-bottom:2px}.workflowHeader p{color:var(--text-muted);font-size:var(--fs-body);margin:0;line-height:1.3}.workflowTools{flex:none;align-items:center;gap:7px;display:flex}.workflowTools>span{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);color:var(--text-secondary);font-size:var(--fs-body);flex:none;padding:5px 9px;font-weight:700}.workflowTools button{background:var(--action-bg);border:1px solid var(--border-strong);border-radius:var(--card-radius);box-shadow:0 8px 22px var(--shadow-color);color:var(--action-fg);cursor:pointer;font-size:var(--fs-body);min-height:28px;padding:4px 9px;font-weight:700}.zoomControls{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);flex:none;align-items:stretch;display:flex;overflow:hidden}.workflowTools .zoomControls button{box-shadow:none;color:var(--text);background:0 0;border:0;border-radius:0;min-width:30px;padding:4px 8px}.workflowTools .zoomControls button:hover:not(:disabled){background:var(--fill-hover)}.workflowTools .zoomControls button:disabled{color:var(--text-faint);cursor:default}.workflowTools .zoomControls button:nth-child(2){border-left:1px solid var(--card-border-color);border-right:1px solid var(--card-border-color);font-variant-numeric:tabular-nums;min-width:48px}.mapCanvas{justify-content:center;align-items:flex-start;height:calc(100vh - 104px);min-height:calc(100vh - 104px);padding:26px;display:flex;position:relative;overflow:hidden}.mapColumn,.workflowTree{z-index:2;grid-column:1;min-width:0;position:relative}.workflowTree{width:var(--tree-render-width,100%);height:var(--tree-render-height,100%);overscroll-behavior:contain;scrollbar-gutter:auto;padding:0;overflow:visible}.connectionLayer{pointer-events:none;z-index:1;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.mapEdge{fill:none;opacity:.32;stroke:var(--text);stroke-linecap:round;stroke-width:1.25px;transition:opacity .14s,stroke-width .14s}.mapCanvas.hasFocus .mapEdge:not(.focused),.mapCanvas.hasFocus .treeEdge:not(.focused){filter:blur(.2px);opacity:.09}.mapEdge.focused{opacity:1;stroke-width:2.05px}.treeEdge{fill:none;opacity:.32;stroke:var(--text);stroke-linecap:round;stroke-width:1.25px;transition:opacity .14s,stroke-width .14s}.treeEdge-trunk,.treeEdge-branch,.treeEdge-lane{opacity:.32}.treeEdge.focused{opacity:1;stroke-width:2.05px}.emptyWorkflow{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);max-width:460px;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);padding:18px}.emptySteps{gap:10px;margin:14px 0 6px;padding-left:18px;display:grid}.emptySteps li{color:var(--text-heading);font-size:var(--fs-body);line-height:1.4}.emptySteps code,.banner code{background:var(--fill-subtle);border:1px solid var(--card-border-color);font-family:Helvetica,Arial,sans-serif;font-size:var(--fs-label);overflow-wrap:anywhere;border-radius:6px;margin-top:4px;padding:3px 6px;display:inline-block}.banner code{margin-top:0}.emptyHint{margin-top:12px}.spine,.treeGrid{margin:0;padding:0;list-style:none;display:block;position:relative}.treeGrid{min-width:0;transform:translate(var(--tree-pan-x,0px), var(--tree-pan-y,0px)) scale(var(--tree-scale,1));transform-origin:0 0;transition:none}.mapCanvas.autoLayouting .treeGrid{transition:transform .42s cubic-bezier(.2,.8,.2,1)}.treeGrid.fit{min-width:0}.spine:before{background:var(--node-hover);content:"";width:1px;position:absolute;top:22px;bottom:22px;left:17px}.spineItem{min-height:36px;position:relative}.spineStep{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);color:var(--text);cursor:pointer;text-align:left;width:100%;min-height:29px;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);grid-template-columns:20px minmax(0,1fr) auto;align-items:center;gap:4px;padding:4px 5px;display:grid;position:relative;overflow:hidden}.treeStep.tone-neutral{box-shadow:var(--card-shadow), inset 3px 0 0 var(--bar-neutral)}.treeStep.tone-claim{box-shadow:var(--card-shadow), inset 3px 0 0 var(--bar-work)}.treeStep.tone-work{box-shadow:var(--card-shadow), inset 3px 0 0 var(--bar-info)}.treeStep.tone-decision{box-shadow:var(--card-shadow), inset 3px 0 0 var(--bar-coord)}.treeStep.tone-success{box-shadow:var(--card-shadow), inset 3px 0 0 var(--success-bar)}.treeStep.tone-success .stepMain strong{color:var(--success)}.treeStep.tone-risk{background:var(--danger-bg-2);border-color:var(--danger-border-soft);box-shadow:var(--card-shadow), inset 3px 0 0 var(--danger-bar)}.treeNode{cursor:grab;touch-action:none;will-change:transform;min-width:0;width:var(--node-width,132px);z-index:2;transition:border-color .14s,box-shadow .14s,filter .14s,opacity .14s,transform .42s cubic-bezier(.2,.8,.2,1);position:absolute}.treeNode:active{cursor:grabbing}.autoLayouting .treeNode{transition:transform .42s cubic-bezier(.2,.8,.2,1),box-shadow .16s,border-color .16s}.mapCanvas.nodeDragging .treeNode{transition:border-color .14s,box-shadow .14s,filter .14s,opacity .14s}.treeStep{min-height:29px}.treeGrid.fit .spineStep{grid-template-columns:minmax(0,1fr);min-height:34px;padding:8px 11px}.mapCanvas.hasFocus .treeNode:not(.selected):not(.agentFocused):not(.manualSelected):not(.fileFocused){filter:blur(.8px)grayscale();opacity:.16}.mapCanvas.hasFocus .treeNode.selected,.mapCanvas.hasFocus .treeNode.agentFocused,.mapCanvas.hasFocus .treeNode.manualSelected,.mapCanvas.hasFocus .treeNode.fileFocused{filter:none;opacity:1;z-index:7}.agentStep{background:var(--surface-soft);border-color:var(--border)}.agentStartCard{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);color:var(--text-heading);cursor:pointer;text-align:left;min-height:26px;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);grid-template-columns:13px minmax(0,1fr);align-items:center;gap:4px;padding:4px 5px;display:grid;overflow:hidden}.agentStartCard:hover,.agentStartCard.selected,.agentStartCard.manualSelected,.agentStartCard.agentFocused{border-color:var(--border-contrast);box-shadow:0 8px 28px var(--shadow-color)}.agentStemDot{background:var(--text-heading);border:3px solid var(--surface-strong);box-shadow:0 0 0 1px var(--border-strong);border-radius:999px;width:9px;height:9px;display:block}.agentStartText{gap:1px;min-width:0;display:grid}.agentStartText span,.agentPill{color:var(--text-muted);font-size:var(--fs-label);text-transform:uppercase;font-weight:700}.agentStartText strong{color:var(--text);font-size:var(--fs-body);text-overflow:ellipsis;white-space:nowrap;line-height:1.15;overflow:hidden}.agentMarker{background:var(--fill-subtle)}.agentMarker:after{background:var(--text-heading);content:"";border-radius:999px;width:6px;height:6px}.agentPill{text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:5px;min-width:0;display:flex;overflow:hidden}.agentPill span{background:var(--surface-tint);border:1px solid var(--border);color:var(--text-muted);font-size:var(--fs-label);text-transform:uppercase;border-radius:999px;flex:none;padding:1px 4px}.treeGrid.fit .stepBadges,.treeGrid.fit .stepMarker{display:none}.treeGrid.fit .agentStartCard{grid-template-columns:9px minmax(0,1fr);min-height:34px;padding:8px 11px}.treeGrid.fit .agentStemDot{width:7px;height:7px}.treeGrid.fit .stepMain strong,.treeGrid.fit .agentStartText strong{font-size:var(--fs-body)}.treeGrid.fit .stepInlineStats{font-size:var(--fs-label)}.spineStep:hover,.spineStep.selected,.spineStep.manualSelected,.spineStep.agentFocused{border-color:var(--border-contrast);box-shadow:0 8px 28px var(--shadow-color)}.treeNode.manualSelected{outline:1px solid var(--border-contrast);outline-offset:2px}.treeNode.agentFocused{background:var(--surface-strong)}.treeNode.selected,.treeNode.agentFocused,.treeNode.fileFocused{outline:1px solid var(--border-contrast);outline-offset:2px}.treeNode.expanded{box-shadow:0 18px 52px var(--shadow-color), inset 0 0 0 1px var(--fill-subtle);z-index:8;width:238px;min-height:62px}.treeGrid.fit .treeNode.expanded{width:228px}.selectionBox{background:var(--fill-subtle);border:1px solid var(--border-contrast);border-radius:var(--card-radius);pointer-events:none;z-index:5;position:absolute}.stepMarker{background:var(--surface-strong);border:1px solid var(--border-strong);color:var(--text-heading);font-size:var(--fs-body);z-index:1;border-radius:999px;justify-content:center;align-items:center;width:16px;height:16px;font-weight:700;display:flex;position:relative}.stepMain{gap:1px;min-width:0;display:grid}.stepMeta{color:var(--text-faint);font-size:var(--fs-label);font-weight:700}.stepMain strong{color:var(--text);font-size:var(--fs-body);overflow-wrap:anywhere;text-overflow:ellipsis;white-space:nowrap;line-height:1.15;overflow:hidden}.stepMain em,.stepInlineStats,.stepSummary,.agentStartDetail{display:none}.treeGrid.fit .stepInlineStats,.spineStep.expanded .stepInlineStats{color:var(--text-muted);font-size:var(--fs-label);text-overflow:ellipsis;white-space:nowrap;font-weight:700;line-height:1.1;display:block;overflow:hidden}.spineStep.expanded .stepSummary,.agentStartCard.expanded .agentStartDetail{color:var(--text-secondary);font-size:var(--fs-body);overflow-wrap:anywhere;text-transform:none;max-height:28px;margin-top:3px;font-weight:700;line-height:1.22;display:block;overflow:hidden}.stepCount{background:var(--surface-tint);border:1px solid var(--border);color:var(--text-muted);font-size:var(--fs-label);white-space:nowrap;border-radius:999px;align-self:start;padding:2px 5px;font-weight:700}.stepBadges{justify-content:end;align-self:center;align-items:center;gap:4px;display:flex}.tokenPill{background:var(--fill-subtle);border:1px solid var(--border);color:var(--text-secondary);font-size:var(--fs-label);white-space:nowrap;border-radius:999px;padding:2px 5px;font-weight:700}.fileStructure{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);min-width:0;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);margin-top:12px;padding:10px;position:relative;overflow:hidden}.fileAnchorRail{pointer-events:none;z-index:6;width:12px;position:absolute;top:74px;bottom:10px;left:-8px}.fileAnchorTick{background:var(--tick-fill);border:2px solid var(--surface-strong);box-shadow:0 0 0 1px var(--border);border-radius:999px;width:8px;height:8px;transition:background .14s,box-shadow .14s,opacity .14s;display:block;position:absolute;left:2px;transform:translateY(-50%)}.fileAnchorTick.selected,.fileAnchorTick.linked,.fileAnchorTick.agentLinked,.fileAnchorTick.eventLinked{background:var(--action-bg);box-shadow:0 0 0 2px var(--shadow-color), 0 8px 18px var(--shadow-color)}.fileStructure.hasFocus .fileAnchorTick{opacity:.18}.fileStructure.hasFocus .fileAnchorTick.selected,.fileStructure.hasFocus .fileAnchorTick.linked,.fileStructure.hasFocus .fileAnchorTick.agentLinked,.fileStructure.hasFocus .fileAnchorTick.eventLinked{opacity:1}.resizeHandle{cursor:col-resize;z-index:4;background:0 0;border:0;width:12px;padding:0;position:absolute;top:10px;bottom:10px;left:-6px}.resizeHandle:after{background:var(--control-fill);content:"";border-radius:999px;width:2px;height:44px;position:absolute;top:calc(50% - 22px);left:5px}.resizeHandle:hover:after{background:var(--control-fill-hover)}.finderChrome{gap:5px;margin:2px 0 8px;display:flex}.finderChrome span{background:var(--dot-fill);border-radius:999px;width:8px;height:8px;display:block}.fileHeader{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.fileHeader h2{margin:0}.fileHeader span{color:var(--text-muted);font-size:var(--fs-body);font-weight:700}.finderColumns{background:var(--surface-tint);border:1px solid var(--border);color:var(--text-muted);font-size:var(--fs-label);text-transform:uppercase;border-radius:7px 7px 0 0;grid-template-columns:minmax(0,1fr) 40px 52px;align-items:center;min-height:22px;padding:0 7px;font-weight:700;display:grid}.finderColumns span{border-left:1px solid var(--border);text-overflow:ellipsis;white-space:nowrap;min-width:0;padding-left:7px;overflow:hidden}.finderColumns span:first-child{border-left:0;padding-left:0}.fileRows{overscroll-behavior:contain;scrollbar-gutter:stable;max-height:min(430px,100vh - 194px);display:block;position:relative;overflow:auto}.finderRow{color:var(--text-heading);font-size:var(--fs-body);border:0;grid-template-columns:minmax(0,1fr) 40px 52px;align-items:center;gap:0;width:100%;min-height:23px;padding:0 7px;display:grid;position:relative}.finderRow:nth-child(2n){background:var(--surface-tint-faint)}.finderRow>span{border-left:1px solid var(--border);color:var(--text-muted);text-overflow:ellipsis;white-space:nowrap;min-width:0;padding-left:7px;overflow:hidden}.finderRow>span:first-child{border-left:0;padding-left:0}.folderRow{color:var(--text-heading);cursor:pointer;text-align:left;background:0 0;font-weight:700}.folderRow:hover{background:var(--fill-subtle)}.fileNode{color:var(--text-heading);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:5px}.fileNode:hover,.fileNode.selected,.fileNode.linked,.fileNode.agentLinked,.fileNode.eventLinked{background:var(--fill-subtle)}.fileNode.selected,.fileNode.linked,.fileNode.agentLinked,.fileNode.eventLinked{box-shadow:inset 0 0 0 1px var(--border-strong)}.fileStructure.hasFocus .finderRow{opacity:.24;transition:background .14s,opacity .14s}.fileStructure.hasFocus .folderRow{opacity:.38}.fileStructure.hasFocus .fileNode.selected,.fileStructure.hasFocus .fileNode.linked,.fileStructure.hasFocus .fileNode.agentLinked,.fileStructure.hasFocus .fileNode.eventLinked{opacity:1}.finderName{color:var(--text-heading);min-width:0;padding-left:var(--depth,0);align-items:center;gap:5px;display:flex}.finderName strong{font-size:var(--fs-body);text-overflow:ellipsis;white-space:nowrap;font-weight:700;overflow:hidden}.disclosure{border-bottom:4px solid #0000;border-left:5px solid var(--text-faint);border-top:4px solid #0000;flex:none;width:0;height:0;display:block;transform:rotate(90deg)}.disclosure.collapsed{transform:rotate(0)}.disclosure.placeholder{border-left-color:#0000}.folderGlyph,.fileGlyph{border:1px solid var(--border-strong);flex:none;display:block}.folderGlyph{background:linear-gradient(to bottom, var(--surface-soft), var(--panel-grad)), var(--bg-elevated);border-radius:3px;width:13px;height:10px;position:relative}.folderGlyph:before{background:var(--bg-elevated);border:1px solid var(--border-strong);content:"";border-bottom:0;border-radius:3px 3px 0 0;width:7px;height:4px;position:absolute;top:-4px;left:1px}.fileGlyph{background:var(--surface-strong);border-radius:2px;width:10px;height:13px}.glassInspector{background:var(--card-bg);border:1px solid var(--card-border-color);border-radius:var(--card-radius);box-shadow:var(--card-shadow);z-index:6;width:296px;-webkit-backdrop-filter:var(--card-blur);backdrop-filter:var(--card-blur);gap:6px;padding:12px;display:grid;position:absolute;overflow:hidden}.glassKicker{color:var(--text-muted);font-size:var(--fs-body);text-transform:uppercase;font-weight:700}.glassInspector strong{color:var(--text);font-size:var(--fs-title);overflow-wrap:anywhere;line-height:1.2}.glassInspector p{color:var(--text-secondary);font-size:var(--fs-body);margin:0;line-height:1.25}.glassInspector .glassFullText{white-space:pre-wrap;max-height:none;padding-right:4px;overflow:auto}.glassMeta{flex-wrap:wrap;gap:5px;display:flex}.glassMeta span{background:var(--surface-tint);border:1px solid var(--border);color:var(--text-secondary);font-size:var(--fs-body);border-radius:999px;padding:3px 6px;font-weight:700}.glassInspector button{justify-self:start}.status{font-size:var(--fs-label);border-radius:999px;justify-self:start;padding:2px 6px;font-weight:700;display:inline-block}.status-active,.status-succeeded{background:var(--success-tint);color:var(--success)}.status-failed,.status-blocked{background:var(--danger-tint);color:var(--danger-2)}.status-needs_approval,.status-unknown,.status-pending{background:var(--bg-elevated);color:var(--text-secondary)}@media (width<=980px){.workspace{grid-template-columns:1fr}.lanes{min-height:auto}.sessionMap{min-height:720px}.mapCanvas{padding-right:calc(var(--files-width,220px) + 20px)}.resizeHandle,.connectionLayer{display:none}}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0d0d0d;--bg-elevated:#131313;--panel-grad:transparent;--scrim:#000000a8;--surface-strong:#ffffff0a;--surface-soft:#ffffff08;--surface-tint:#ffffff06;--surface-tint-faint:#ffffff04;--ink-line:#ffffff85;--hair:#ffffff26;--border:#ffffff26;--border-strong:#ffffff4d;--border-contrast:#ffffff80;--fill-subtle:#ffffff0d;--fill-hover:#ffffff14;--node-hover:#ffffff1a;--control-fill:#fff3;--control-fill-hover:#ffffff61;--dot-fill:var(--text);--tick-fill:var(--text-muted);--fillbar:#d6d6d6;--text:#e9e9e9;--text-heading:#f2f2f2;--text-secondary:#b0b0b0;--text-muted:#8a8a8a;--text-faint:#565656;--action-bg:transparent;--action-fg:var(--text);--status-dot:#6e6e6e;--tick-empty:#ffffff29;--tick-work:#ffffff57;--tick-decision:#ffffff70;--tick-claim:#ffffff3d;--danger:#b5675c;--danger-2:#b5675c;--danger-solid:#b5675c;--danger-bg:#b5675c29;--danger-bg-2:#b5675c1f;--danger-border:#b5675c66;--danger-border-soft:#b5675c4d;--danger-border-strong:#b5675c99;--danger-bar:#a85a4e;--danger-tint:#b5675c24;--success:#b0b0b0;--success-solid:#b0b0b0;--success-tint:#ffffff0d;--success-bar:var(--fillbar);--warn-bg:#ffffff0d;--warn-border:var(--hair);--warn-text:#b0b0b0;--bar-neutral:var(--hair);--bar-work:var(--hair);--bar-info:var(--border-strong);--bar-coord:var(--border-strong);--shadow-color:#00000080;--card-bg:transparent;--card-border-color:var(--hair);--card-blur:none;--card-shadow:none}.treeGrid.fit .treeStep,.treeGrid.fit .agentStartCard{min-height:20px;padding:3px 2px;box-shadow:none!important;background:0 0!important;border:none!important}.treeGrid.fit .spineStep{grid-template-columns:minmax(0,1fr) 11px;align-items:center;gap:9px;display:grid}.treeGrid.fit .spineStep .stepMain{text-align:right;order:1;align-items:flex-end}.treeGrid.fit .spineStep .stepMarker{order:2}.treeGrid.fit .treeStep .stepMarker{background:var(--bg);border:1px solid var(--ink-line);width:9px;min-width:9px;height:9px;box-shadow:none;color:#0000;border-radius:999px;padding:0;font-size:0;display:flex}.treeGrid.fit .stepMarker.agentMarker{background:var(--bg)}.treeGrid.fit .agentMarker:after{display:none}.treeStep.tone-risk .stepMarker{border-color:var(--danger);border-width:1.5px}.treeGrid.fit .stepMain{gap:1px}.treeGrid.fit .stepMain strong{color:var(--text);font-size:13px;font-weight:400}.treeStep.tone-risk .stepMain strong{color:var(--danger)}.treeGrid.fit .stepInlineStats{color:var(--text-secondary);font-size:10.5px;font-style:italic}.treeGrid.fit .agentPill{color:var(--text-muted);letter-spacing:.12em;text-transform:uppercase;font-size:9px}.treeGrid.fit .agentPill span{display:none}.treeGrid.fit .stepBadges{display:none!important}.treeGrid.fit .agentStartCard{grid-template-columns:minmax(0,1fr) 10px;gap:9px}.treeGrid.fit .agentStartCard .agentStartText{text-align:right;order:1}.treeGrid.fit .agentStartCard .agentStemDot{order:2}.treeGrid.fit .agentStemDot{background:var(--bg);border:1px solid var(--ink-line);box-shadow:none;width:9px;height:9px}.treeGrid.fit .treeNode.selected,.treeGrid.fit .treeNode.manualSelected,.treeGrid.fit .treeNode.agentFocused,.treeGrid.fit .treeNode.fileFocused{background:0 0;outline:none}.treeGrid.fit .treeNode.selected .stepMarker,.treeGrid.fit .treeNode.selected .agentStemDot,.treeGrid.fit .treeNode.fileFocused .stepMarker{background:var(--ink-line);border-color:var(--ink-line)}.treeGrid.fit .treeNode.selected .stepMain strong{text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:.5px}.treeEdge{stroke-width:1px;opacity:.5}.treeEdge-branch,.treeEdge-lane{stroke-dasharray:1.5 4;stroke-linecap:round;opacity:.5}.treeEdge.focused{stroke-width:1.4px;opacity:1}.fileEdge{stroke-width:1px;opacity:.26}.timelineBar{border:none;border-top:1px solid var(--hair);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;background:0 0;border-radius:0;margin:0 16px;padding:11px 4px 6px}.timelineBar .ticks{align-items:center;gap:3px;height:22px;position:relative}.timelineBar .ticks:before{content:"";background:var(--ink-line);opacity:.45;height:1px;position:absolute;top:50%;left:0;right:0}.timelineBar .tick{background:var(--tick-empty);border-radius:0;align-self:center;height:7px}.timelineBar .tick.seen{background:var(--tick-decision)}.timelineBar .tick.tick-risk{background:var(--danger);height:14px}.timelineLive{border:1px solid var(--hair);color:var(--text-secondary);background:0 0}.timelineLive:disabled{color:var(--text)}.timelineRange,input[type=range]{accent-color:var(--text)}button:focus-visible,select:focus-visible{outline:1px solid var(--border-contrast);outline-offset:2px}.runPicker{color:var(--text)}.glassInspector{background:var(--bg);border:1px solid var(--border-strong);box-shadow:0 14px 44px var(--shadow-color);z-index:60}.handoffPanel{background:var(--bg);border:1px solid var(--border-strong);box-shadow:0 14px 44px var(--shadow-color)}