@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 +247 -230
- package/dist/dashboard/assets/index-Ck9bKtYh.css +1 -0
- package/dist/dashboard/assets/index-D1NSYhKy.js +12 -0
- package/dist/dashboard/index.html +2 -2
- package/package.json +1 -1
- package/dist/dashboard/assets/index-Bg3QRJRt.css +0 -1
- package/dist/dashboard/assets/index-CEKyCY1L.js +0 -12
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
|
|
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 ??
|
|
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
|
|
1686
|
-
import { join as
|
|
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 =
|
|
1694
|
-
const pluginsDir =
|
|
1695
|
-
const pluginPath =
|
|
1696
|
-
const packageJsonPath =
|
|
1697
|
-
await
|
|
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
|
|
1932
|
+
const bundle = await readFile4(options.pluginBundlePath, "utf8");
|
|
1703
1933
|
const inlined = bundle.replaceAll("__ABB_DAEMON_URL__", daemonUrl);
|
|
1704
|
-
await
|
|
1934
|
+
await writeFile2(pluginPath, inlined, "utf8");
|
|
1705
1935
|
return { pluginPath, packageJsonPath, adapterPackage, adapterImport };
|
|
1706
1936
|
}
|
|
1707
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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)}
|