@ashlr/hub 3.5.0 → 3.7.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/CHANGELOG.md +160 -0
- package/README.md +3 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/activation.d.ts +41 -0
- package/dist/cli/activation.js +485 -0
- package/dist/cli/activation.js.map +1 -0
- package/dist/core/daemon/cutoff-checkpoint-scheduler.js +7 -0
- package/dist/core/daemon/cutoff-checkpoint-scheduler.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +19 -0
- package/dist/core/daemon/loop.js +235 -5
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/overnight-status.d.ts +152 -0
- package/dist/core/daemon/overnight-status.js +275 -0
- package/dist/core/daemon/overnight-status.js.map +1 -0
- package/dist/core/daemon/post-merge-halt.d.ts +212 -0
- package/dist/core/daemon/post-merge-halt.js +503 -0
- package/dist/core/daemon/post-merge-halt.js.map +1 -0
- package/dist/core/daemon/run-window.d.ts +218 -0
- package/dist/core/daemon/run-window.js +420 -0
- package/dist/core/daemon/run-window.js.map +1 -0
- package/dist/core/fleet/external-skill-audit.js +1 -1
- package/dist/core/fleet/external-skill-audit.js.map +1 -1
- package/dist/core/fleet/generated-repair-resolution.d.ts +36 -0
- package/dist/core/fleet/generated-repair-resolution.js +245 -0
- package/dist/core/fleet/generated-repair-resolution.js.map +1 -0
- package/dist/core/local-runtime/llama/config.d.ts +28 -6
- package/dist/core/local-runtime/llama/config.js +28 -6
- package/dist/core/local-runtime/llama/config.js.map +1 -1
- package/dist/core/local-runtime/llama/port.d.ts +17 -0
- package/dist/core/local-runtime/llama/port.js +47 -0
- package/dist/core/local-runtime/llama/port.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-host.d.ts +54 -0
- package/dist/core/local-runtime/llama/proxy-host.js +159 -0
- package/dist/core/local-runtime/llama/proxy-host.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-process.d.ts +148 -0
- package/dist/core/local-runtime/llama/proxy-process.js +250 -0
- package/dist/core/local-runtime/llama/proxy-process.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-record.d.ts +40 -0
- package/dist/core/local-runtime/llama/proxy-record.js +133 -0
- package/dist/core/local-runtime/llama/proxy-record.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +118 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.js +511 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Cgi6j1Gk.css +1 -0
- package/dist/core/web/public/next/assets/App-vtaHB9mp.js +7 -0
- package/dist/core/web/public/next/assets/App-vtaHB9mp.js.map +1 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-B-bFJ0I9.js +2 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-B-bFJ0I9.js.map +1 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-Su-NUTis.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-CHjxJt2z.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-DoqmsCjw.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-DoqmsCjw.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js +80 -0
- package/dist/core/web/public/next/assets/ChatSection-vNPIJffd.js.map +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-Dd2APQhB.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-cYuivhCX.css → ConfirmDialog-Dx15x0Ho.css} +1 -1
- package/dist/core/web/public/next/assets/Dialog-CPM9JxBc.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-CPM9JxBc.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-B84qVef9.js +7 -0
- package/dist/core/web/public/next/assets/DiffViewer-B84qVef9.js.map +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-C8HHTnVE.css +1 -0
- package/dist/core/web/public/next/assets/McpSection-CEUpV_5X.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-CEUpV_5X.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-D88QlDpG.css +1 -0
- package/dist/core/web/public/next/assets/Meter--h3MmZS-.js +2 -0
- package/dist/core/web/public/next/assets/Meter--h3MmZS-.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-CLcr-4wS.css +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-jWLLCxWn.css → MutationTokenDialog-CrfJ0PdD.css} +1 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-DA8t97XT.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DA8t97XT.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Bq7Vyud0.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Bq7Vyud0.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CM_8pJs6.css +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Badio_uO.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Badio_uO.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-ekyMXAK8.css +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-BII7TTSD.css +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-BwrpQlpP.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-BwrpQlpP.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Dh7A-hLD.css +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-_FSohAdN.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-_FSohAdN.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Bqa8DH57.css +1 -0
- package/dist/core/web/public/next/assets/UniverseView-DqcXbed4.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-DqcXbed4.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-Bq6Daaby.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CsIQv9id.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-CTZJ-JrH.js +2 -0
- package/dist/core/web/public/next/assets/charts-CTZJ-JrH.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-CsrtT4rk.css +1 -0
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +1 -0
- package/dist/core/web/public/next/assets/format-BNYWGJat.js +2 -0
- package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +1 -0
- package/dist/core/web/public/next/assets/global-D6bTxIRn.js +2 -0
- package/dist/core/web/public/next/assets/global-D6bTxIRn.js.map +1 -0
- package/dist/core/web/public/next/assets/global-z-JfD3ow.css +1 -0
- package/dist/core/web/public/next/assets/icons-D9vlf85u.js +2 -0
- package/dist/core/web/public/next/assets/icons-D9vlf85u.js.map +1 -0
- package/dist/core/web/public/next/assets/index-CZamKRUg.js +11 -0
- package/dist/core/web/public/next/assets/index-CZamKRUg.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-B8eBnFox.js +2 -0
- package/dist/core/web/public/next/assets/queries-B8eBnFox.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-bzrVVAYq.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-bzrVVAYq.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +1 -0
- package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/node_modules/marked/README.md +8 -0
- package/node_modules/marked/bin/main.js +12 -11
- package/node_modules/marked/lib/marked.d.ts +88 -25
- package/node_modules/marked/lib/marked.esm.js +50 -44
- package/node_modules/marked/lib/marked.esm.js.map +3 -3
- package/node_modules/marked/lib/marked.umd.js +50 -44
- package/node_modules/marked/lib/marked.umd.js.map +3 -3
- package/node_modules/marked/man/marked.1 +1 -1
- package/node_modules/marked/package.json +21 -21
- package/package.json +13 -8
- package/dist/core/web/public/next/assets/App-BCKqSppK.css +0 -1
- package/dist/core/web/public/next/assets/App-CsbPYQqy.js +0 -16
- package/dist/core/web/public/next/assets/App-CsbPYQqy.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-CBZquyLK.js +0 -2
- package/dist/core/web/public/next/assets/ApprovalsSection-CBZquyLK.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-CRP59wSb.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-CQVpEdCE.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-CQVpEdCE.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-DTN6m6QE.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DiRvNX3Q.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DmE9K0Tg.js +0 -77
- package/dist/core/web/public/next/assets/ChatSection-DmE9K0Tg.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-deO0C0iY.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-deO0C0iY.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-CNd7q89m.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-CNd7q89m.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-DxN7RgB5.css +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DTO0KRuG.js +0 -7
- package/dist/core/web/public/next/assets/DiffViewer-DTO0KRuG.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-hN7X6wGT.css +0 -1
- package/dist/core/web/public/next/assets/Epistemic-53PikaUI.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-53PikaUI.js.map +0 -1
- package/dist/core/web/public/next/assets/Epistemic-DiyMyeaN.css +0 -1
- package/dist/core/web/public/next/assets/Meter-CGBsbXUX.css +0 -1
- package/dist/core/web/public/next/assets/Meter-DRWZQgr1.js +0 -2
- package/dist/core/web/public/next/assets/Meter-DRWZQgr1.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-DYF8n_RD.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-DYF8n_RD.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-DXJQXKyA.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-DXJQXKyA.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-O7jUBOmX.css +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DLl4DbGG.css +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-hDSEFdLU.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-hDSEFdLU.js.map +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BIpdnxp-.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CZd7ln8v.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CZd7ln8v.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-C9Qs9JWW.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-C9Qs9JWW.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DGJMdUh2.css +0 -1
- package/dist/core/web/public/next/assets/Skeleton-D2JaTXyv.css +0 -1
- package/dist/core/web/public/next/assets/Skeleton-YkcOpgFb.js +0 -2
- package/dist/core/web/public/next/assets/Skeleton-YkcOpgFb.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-DJw0LSPg.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-DJw0LSPg.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-TpDqZf6K.css +0 -1
- package/dist/core/web/public/next/assets/TableView-Bj-w1O6o.js +0 -2
- package/dist/core/web/public/next/assets/TableView-Bj-w1O6o.js.map +0 -1
- package/dist/core/web/public/next/assets/TableView-R6Yeztp1.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bs2fxaen.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bs2fxaen.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CiZZxRPV.css +0 -1
- package/dist/core/web/public/next/assets/UniverseView-B6b2hw-8.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-B6b2hw-8.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-gBxl6yum.css +0 -1
- package/dist/core/web/public/next/assets/UsageSection-C__ziNkV.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-C__ziNkV.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-UUYDidOg.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cu5aG6J6.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-Cu5aG6J6.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-mOAXvWa6.css +0 -1
- package/dist/core/web/public/next/assets/fleet-model-DXCfVtNW.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-DXCfVtNW.js.map +0 -1
- package/dist/core/web/public/next/assets/format-fggwu_Rs.js +0 -2
- package/dist/core/web/public/next/assets/format-fggwu_Rs.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BHjd6fVZ.js +0 -2
- package/dist/core/web/public/next/assets/global-BHjd6fVZ.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BeRYd1Bu.css +0 -1
- package/dist/core/web/public/next/assets/index-CJ-e8YA9.js +0 -2
- package/dist/core/web/public/next/assets/index-CJ-e8YA9.js.map +0 -1
- package/dist/core/web/public/next/assets/index-CpgkRaTi.js +0 -51
- package/dist/core/web/public/next/assets/index-CpgkRaTi.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-856qUN3Y.js +0 -2
- package/dist/core/web/public/next/assets/queries-856qUN3Y.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-Bqa2v0a-.css +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-DwaESKVy.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-DwaESKVy.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-Dllo8rRt.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-Dllo8rRt.js.map +0 -1
- package/dist/core/web/public/next/assets/workspace-model-JgmWDKt4.js +0 -2
- package/dist/core/web/public/next/assets/workspace-model-JgmWDKt4.js.map +0 -1
- /package/node_modules/marked/{LICENSE.md → LICENSE} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{o as t,b as x,t as _,x as u,g as y}from"./global-BHjd6fVZ.js";import{r as p,j as s}from"./index-CpgkRaTi.js";import{D as v}from"./Dialog-CNd7q89m.js";class j extends Error{constructor(){super("No mutation token held for this session yet."),this.name="MissingMutationTokenError"}}async function i(o,e){const a=y();if(!a)throw new j;const r=await x(o,e,a);return _(),r}async function I(){await i("/api/fleet/pause",{}),t("dashboard-snapshot"),t("control-snapshot"),t("fleet"),t("fleet-activity")}async function P(){await i("/api/fleet/resume",{}),t("dashboard-snapshot"),t("control-snapshot"),t("fleet"),t("fleet-activity")}async function $(o){await i(`/api/inbox/${encodeURIComponent(o)}/approve`,{}),t("inbox"),t("dashboard-snapshot"),t(`proposal-detail-${o}`),u("inbox-list:")}async function D(o){await i(`/api/inbox/${encodeURIComponent(o)}/reject`,{}),t("inbox"),t("dashboard-snapshot"),t(`proposal-detail-${o}`),u("inbox-list:")}const k="_body_15hsz_1",g="_error_15hsz_8",w="_actions_15hsz_17",z="_cancel_15hsz_23",C="_confirm_15hsz_33",M="_destructive_15hsz_48",n={body:k,error:g,actions:w,cancel:z,confirm:C,destructive:M};function F({open:o,onClose:e,title:a,body:r,confirmLabel:f,destructive:h,onConfirm:m,busy:c,error:l}){const b=p.useId(),d=p.useRef(null);return s.jsxs(v,{open:o,onClose:e,titleId:b,title:a,initialFocusRef:d,children:[s.jsx("div",{className:n.body,children:r}),l?s.jsx("p",{className:n.error,role:"alert",children:l}):null,s.jsxs("div",{className:n.actions,children:[s.jsx("button",{type:"button",className:n.cancel,onClick:e,disabled:c,children:"Cancel"}),s.jsx("button",{ref:d,type:"button",className:h?n.destructive:n.confirm,onClick:m,disabled:c,children:c?"Working…":f})]})]})}export{F as C,$ as a,P as b,I as p,D as r};
|
|
2
|
-
//# sourceMappingURL=ConfirmDialog-deO0C0iY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog-deO0C0iY.js","sources":["../../../../../../src/web-ui/data/mutations.ts","../../../../../../src/web-ui/routes/inbox/ConfirmDialog.tsx"],"sourcesContent":["/**\n * data/mutations.ts — every mutating call the foundation ships with, each\n * wrapped so it (a) pulls the held mutation token from auth-store instead\n * of asking every call site to thread it through, (b) touches the hold on\n * success so a burst of approvals doesn't idle-expire mid-session, and\n * (c) invalidates whatever cache keys the mutation obviously affects so\n * views update without waiting for the next SSE tick.\n *\n * Routes mirror the mutating surface documented at the top of\n * src/core/web/api.ts. Every one of these 404s (not 401/403) when the\n * server was started without --allow-dispatch — apiPost already maps that\n * to DispatchDisabledError.\n */\nimport { apiPost } from './client.js';\nimport { getMutationToken, touchMutationHold } from './auth-store.js';\nimport { invalidate, invalidatePrefix } from './cache.js';\n\nclass MissingMutationTokenError extends Error {\n constructor() {\n super('No mutation token held for this session yet.');\n this.name = 'MissingMutationTokenError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new MissingMutationTokenError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nexport async function pauseFleet(): Promise<void> {\n await post('/api/fleet/pause', {});\n invalidate('dashboard-snapshot');\n invalidate('control-snapshot');\n invalidate('fleet');\n invalidate('fleet-activity');\n}\n\nexport async function resumeFleet(): Promise<void> {\n await post('/api/fleet/resume', {});\n invalidate('dashboard-snapshot');\n invalidate('control-snapshot');\n invalidate('fleet');\n invalidate('fleet-activity');\n}\n\nexport async function approveProposal(id: string): Promise<void> {\n await post(`/api/inbox/${encodeURIComponent(id)}/approve`, {});\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidate(`proposal-detail-${id}`);\n invalidatePrefix('inbox-list:');\n}\n\nexport async function rejectProposal(id: string): Promise<void> {\n await post(`/api/inbox/${encodeURIComponent(id)}/reject`, {});\n invalidate('inbox');\n invalidate('dashboard-snapshot');\n invalidate(`proposal-detail-${id}`);\n invalidatePrefix('inbox-list:');\n}\n\nexport interface OpenTargetRequest {\n path: string;\n target: 'editor' | 'finder';\n}\n\nexport async function openTarget(req: OpenTargetRequest): Promise<void> {\n await post('/api/open', req);\n}\n","/**\n * routes/inbox/ConfirmDialog.tsx — explicit confirmation for approve/reject\n * (single or batch). Approve is the single most irreversible action in the\n * product (operator-console brief non-negotiable): it must require explicit\n * confirmation and clearly state what will happen, never fire on a single\n * click. Built on the shared Dialog primitive so it gets the same focus\n * trap / Escape / backdrop-close behavior as MutationTokenDialog and the\n * command palette for free.\n */\nimport { useId, useRef, type ReactNode } from 'react';\nimport { Dialog } from '../../components/primitives/Dialog.js';\nimport styles from './ConfirmDialog.module.css';\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onClose: () => void;\n title: string;\n body: ReactNode;\n confirmLabel: string;\n /**\n * Weight the confirm button as the dangerous one. The rule is IRREVERSIBLE,\n * not \"negative-sounding\": whichever branch the operator cannot undo gets\n * the weight. In Verse's approvals that is Approve — a `pr` pushes a branch\n * and opens a real pull request other people see immediately, a `patch`\n * writes to disk now — while Reject only discards a proposal that stays in\n * history. This doc used to say the opposite, which is how the red button\n * came to be the safe one.\n */\n destructive?: boolean;\n onConfirm: () => void;\n busy?: boolean;\n error?: string | null;\n}\n\nexport function ConfirmDialog({ open, onClose, title, body, confirmLabel, destructive, onConfirm, busy, error }: ConfirmDialogProps) {\n const titleId = useId();\n const confirmRef = useRef<HTMLButtonElement>(null);\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title={title} initialFocusRef={confirmRef}>\n <div className={styles.body}>{body}</div>\n {error ? (\n <p className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose} disabled={busy}>\n Cancel\n </button>\n <button\n ref={confirmRef}\n type=\"button\"\n className={destructive ? styles.destructive : styles.confirm}\n onClick={onConfirm}\n disabled={busy}\n >\n {busy ? 'Working…' : confirmLabel}\n </button>\n </div>\n </Dialog>\n );\n}\n"],"names":["MissingMutationTokenError","post","path","body","token","getMutationToken","result","apiPost","touchMutationHold","pauseFleet","invalidate","resumeFleet","approveProposal","id","invalidatePrefix","rejectProposal","ConfirmDialog","open","onClose","title","confirmLabel","destructive","onConfirm","busy","error","titleId","useId","confirmRef","useRef","Dialog","jsx","styles","jsxs"],"mappings":"6JAiBA,MAAMA,UAAkC,KAAM,CAC5C,aAAc,CACZ,MAAM,8CAA8C,EACpD,KAAK,KAAO,2BACd,CACF,CAEA,eAAeC,EAAQC,EAAcC,EAA2B,CAC9D,MAAMC,EAAQC,EAAA,EACd,GAAI,CAACD,EAAO,MAAM,IAAIJ,EACtB,MAAMM,EAAS,MAAMC,EAAWL,EAAMC,EAAMC,CAAK,EACjD,OAAAI,EAAA,EACOF,CACT,CAEA,eAAsBG,GAA4B,CAChD,MAAMR,EAAK,mBAAoB,EAAE,EACjCS,EAAW,oBAAoB,EAC/BA,EAAW,kBAAkB,EAC7BA,EAAW,OAAO,EAClBA,EAAW,gBAAgB,CAC7B,CAEA,eAAsBC,GAA6B,CACjD,MAAMV,EAAK,oBAAqB,EAAE,EAClCS,EAAW,oBAAoB,EAC/BA,EAAW,kBAAkB,EAC7BA,EAAW,OAAO,EAClBA,EAAW,gBAAgB,CAC7B,CAEA,eAAsBE,EAAgBC,EAA2B,CAC/D,MAAMZ,EAAK,cAAc,mBAAmBY,CAAE,CAAC,WAAY,EAAE,EAC7DH,EAAW,OAAO,EAClBA,EAAW,oBAAoB,EAC/BA,EAAW,mBAAmBG,CAAE,EAAE,EAClCC,EAAiB,aAAa,CAChC,CAEA,eAAsBC,EAAeF,EAA2B,CAC9D,MAAMZ,EAAK,cAAc,mBAAmBY,CAAE,CAAC,UAAW,EAAE,EAC5DH,EAAW,OAAO,EAClBA,EAAW,oBAAoB,EAC/BA,EAAW,mBAAmBG,CAAE,EAAE,EAClCC,EAAiB,aAAa,CAChC,qMC5BO,SAASE,EAAc,CAAE,KAAAC,EAAM,QAAAC,EAAS,MAAAC,EAAO,KAAAhB,EAAM,aAAAiB,EAAc,YAAAC,EAAa,UAAAC,EAAW,KAAAC,EAAM,MAAAC,CAAA,EAA6B,CACnI,MAAMC,EAAUC,EAAAA,MAAA,EACVC,EAAaC,EAAAA,OAA0B,IAAI,EAEjD,cACGC,EAAA,CAAO,KAAAZ,EAAY,QAAAC,EAAkB,QAAAO,EAAkB,MAAAN,EAAc,gBAAiBQ,EACrF,SAAA,CAAAG,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAO,KAAO,SAAA5B,EAAK,EAClCqB,QACE,IAAA,CAAE,UAAWO,EAAO,MAAO,KAAK,QAC9B,SAAAP,CAAA,CACH,EACE,KACJQ,EAAAA,KAAC,MAAA,CAAI,UAAWD,EAAO,QACrB,SAAA,CAAAD,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAWC,EAAO,OAAQ,QAASb,EAAS,SAAUK,EAAM,SAAA,QAAA,CAElF,EACAO,EAAAA,IAAC,SAAA,CACC,IAAKH,EACL,KAAK,SACL,UAAWN,EAAcU,EAAO,YAAcA,EAAO,QACrD,QAAST,EACT,SAAUC,EAET,WAAO,WAAaH,CAAA,CAAA,CACvB,CAAA,CACF,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as f,j as l}from"./index-CpgkRaTi.js";import{r as p}from"./index-CJ-e8YA9.js";const m=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(",");function b(e){return Array.from(e.querySelectorAll(m)).filter(r=>r.offsetParent!==null)}function g({open:e,containerRef:r,onClose:s,initialFocusRef:d}){f.useEffect(()=>{if(!e)return;const n=document.activeElement;return(d?.current??r.current)?.focus({preventScroll:!0}),()=>{n?.focus?.({preventScroll:!0})}},[e]),f.useEffect(()=>{if(!e)return;function n(t){if(t.key==="Escape"){t.stopPropagation(),s();return}if(t.key!=="Tab")return;const i=r.current;if(!i)return;const o=b(i);if(o.length===0)return;const a=o[0],c=o[o.length-1];t.shiftKey&&document.activeElement===a?(t.preventDefault(),c.focus()):!t.shiftKey&&document.activeElement===c&&(t.preventDefault(),a.focus())}return document.addEventListener("keydown",n,!0),()=>document.removeEventListener("keydown",n,!0)},[e,s])}const E="_backdrop_10r5p_1",v="_dialog_10r5p_13",x="_title_10r5p_25",y="_description_10r5p_36",u={backdrop:E,dialog:v,title:x,description:y};function k({open:e,onClose:r,titleId:s,title:d,description:n,children:t,initialFocusRef:i,widthClassName:o}){const a=f.useRef(null);return g({open:e,containerRef:a,onClose:r,initialFocusRef:i}),e?p.createPortal(l.jsx("div",{className:u.backdrop,onMouseDown:c=>c.target===c.currentTarget&&r(),children:l.jsxs("div",{ref:a,className:`${u.dialog} ${o??""}`,role:"dialog","aria-modal":"true","aria-labelledby":s,tabIndex:-1,children:[l.jsx("h2",{id:s,className:u.title,children:d}),n?l.jsx("p",{className:u.description,children:n}):null,t]})}),document.body):null}export{k as D};
|
|
2
|
-
//# sourceMappingURL=Dialog-CNd7q89m.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog-CNd7q89m.js","sources":["../../../../../../src/web-ui/components/primitives/focus-trap.ts","../../../../../../src/web-ui/components/primitives/Dialog.tsx"],"sourcesContent":["/**\n * components/primitives/focus-trap.ts — the modal focus contract, extracted\n * from Dialog.tsx so Sheet.tsx (the slide-over overlay) gets exactly the same\n * behavior instead of a second, subtly different implementation:\n *\n * - focus moves into the overlay (or `initialFocusRef`) on open\n * - focus is trapped inside while open (Tab/Shift+Tab wrap)\n * - focus returns to the element that opened it on close\n * - Escape closes\n *\n * Dialog.tsx is unchanged in behavior — it now calls this instead of\n * inlining it. Any future overlay MUST use this rather than hand-rolling a\n * trap (DESIGN.md §3, \"primitives own their accessibility\").\n */\nimport { useEffect, type RefObject } from 'react';\n\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/** Focusable descendants that are actually rendered (offsetParent is null for hidden nodes). */\nexport function focusableWithin(node: HTMLElement): HTMLElement[] {\n return Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) => el.offsetParent !== null);\n}\n\nexport interface FocusTrapOptions {\n open: boolean;\n containerRef: RefObject<HTMLElement | null>;\n onClose: () => void;\n initialFocusRef?: RefObject<HTMLElement | null>;\n}\n\nexport function useFocusTrap({ open, containerRef, onClose, initialFocusRef }: FocusTrapOptions): void {\n useEffect(() => {\n if (!open) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n const target = initialFocusRef?.current ?? containerRef.current;\n target?.focus({ preventScroll: true });\n\n return () => {\n previouslyFocused?.focus?.({ preventScroll: true });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- the refs are refs (stable identity is not the point); only `open` should re-run this.\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n return;\n }\n if (e.key !== 'Tab') return;\n const node = containerRef.current;\n if (!node) return;\n const focusable = focusableWithin(node);\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener('keydown', onKeyDown, true);\n return () => document.removeEventListener('keydown', onKeyDown, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- containerRef is a ref; re-binding on every render would drop in-flight key handling.\n }, [open, onClose]);\n}\n","/**\n * components/primitives/Dialog.tsx — focus-managed modal base. Used by\n * MutationTokenDialog, CommandPalette and the Verse confirm flows so all of\n * them get the same accessible behavior instead of each hand-rolling it:\n *\n * - focus moves to the dialog (or `initialFocusRef`) on open\n * - focus is trapped inside while open (Tab/Shift+Tab wrap)\n * - focus returns to the trigger element on close\n * - Escape closes\n * - a click on the backdrop closes\n *\n * The trap itself lives in ./focus-trap.ts, shared with Sheet.tsx — the\n * behavior here is unchanged, it just stopped being copy-pasteable.\n */\nimport { useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from './focus-trap.js';\nimport styles from './Dialog.module.css';\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n titleId: string;\n title: ReactNode;\n children: ReactNode;\n /** Optional one-line description under the title. */\n description?: ReactNode;\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n widthClassName?: string;\n}\n\nexport function Dialog({\n open,\n onClose,\n titleId,\n title,\n description,\n children,\n initialFocusRef,\n widthClassName,\n}: DialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n\n useFocusTrap({ open, containerRef: dialogRef, onClose, initialFocusRef });\n\n if (!open) return null;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div\n ref={dialogRef}\n className={`${styles.dialog} ${widthClassName ?? ''}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <h2 id={titleId} className={styles.title}>\n {title}\n </h2>\n {description ? <p className={styles.description}>{description}</p> : null}\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n"],"names":["FOCUSABLE_SELECTOR","focusableWithin","node","el","useFocusTrap","open","containerRef","onClose","initialFocusRef","useEffect","previouslyFocused","onKeyDown","e","focusable","first","last","Dialog","titleId","title","description","children","widthClassName","dialogRef","useRef","createPortal","jsx","styles","jsxs"],"mappings":"uFAgBO,MAAMA,EAAqB,CAChC,UACA,yBACA,wBACA,yBACA,2BACA,iCACF,EAAE,KAAK,GAAG,EAGH,SAASC,EAAgBC,EAAkC,CAChE,OAAO,MAAM,KAAKA,EAAK,iBAA8BF,CAAkB,CAAC,EAAE,OAAQG,GAAOA,EAAG,eAAiB,IAAI,CACnH,CASO,SAASC,EAAa,CAAE,KAAAC,EAAM,aAAAC,EAAc,QAAAC,EAAS,gBAAAC,GAA2C,CACrGC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAM,OACX,MAAMK,EAAoB,SAAS,cAEnC,OADeF,GAAiB,SAAWF,EAAa,UAChD,MAAM,CAAE,cAAe,EAAA,CAAM,EAE9B,IAAM,CACXI,GAAmB,QAAQ,CAAE,cAAe,EAAA,CAAM,CACpD,CAEF,EAAG,CAACL,CAAI,CAAC,EAETI,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAM,OACX,SAASM,EAAUC,EAAkB,CACnC,GAAIA,EAAE,MAAQ,SAAU,CACtBA,EAAE,gBAAA,EACFL,EAAA,EACA,MACF,CACA,GAAIK,EAAE,MAAQ,MAAO,OACrB,MAAMV,EAAOI,EAAa,QAC1B,GAAI,CAACJ,EAAM,OACX,MAAMW,EAAYZ,EAAgBC,CAAI,EACtC,GAAIW,EAAU,SAAW,EAAG,OAC5B,MAAMC,EAAQD,EAAU,CAAC,EACnBE,EAAOF,EAAUA,EAAU,OAAS,CAAC,EACvCD,EAAE,UAAY,SAAS,gBAAkBE,GAC3CF,EAAE,eAAA,EACFG,EAAK,MAAA,GACI,CAACH,EAAE,UAAY,SAAS,gBAAkBG,IACnDH,EAAE,eAAA,EACFE,EAAM,MAAA,EAEV,CACA,gBAAS,iBAAiB,UAAWH,EAAW,EAAI,EAC7C,IAAM,SAAS,oBAAoB,UAAWA,EAAW,EAAI,CAEtE,EAAG,CAACN,EAAME,CAAO,CAAC,CACpB,8IC9CO,SAASS,EAAO,CACrB,KAAAX,EACA,QAAAE,EACA,QAAAU,EACA,MAAAC,EACA,YAAAC,EACA,SAAAC,EACA,gBAAAZ,EACA,eAAAa,CACF,EAAgB,CACd,MAAMC,EAAYC,EAAAA,OAAuB,IAAI,EAI7C,OAFAnB,EAAa,CAAE,KAAAC,EAAM,aAAciB,EAAW,QAAAf,EAAS,gBAAAC,EAAiB,EAEnEH,EAEEmB,EAAAA,aACLC,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAO,SAAU,YAAcd,GAAMA,EAAE,SAAWA,EAAE,eAAiBL,IACnF,SAAAoB,EAAAA,KAAC,MAAA,CACC,IAAKL,EACL,UAAW,GAAGI,EAAO,MAAM,IAAIL,GAAkB,EAAE,GACnD,KAAK,SACL,aAAW,OACX,kBAAiBJ,EACjB,SAAU,GAEV,SAAA,CAAAQ,MAAC,MAAG,GAAIR,EAAS,UAAWS,EAAO,MAChC,SAAAR,EACH,EACCC,EAAcM,EAAAA,IAAC,IAAA,CAAE,UAAWC,EAAO,YAAc,WAAY,EAAO,KACpEN,CAAA,CAAA,CAAA,EAEL,EACA,SAAS,IAAA,EAnBO,IAqBpB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._backdrop_10r5p_1{position:fixed;inset:0;background:var(--bg-overlay);display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;z-index:var(--z-dialog);animation:_fade_10r5p_1 var(--duration-fast) var(--ease-standard)}._dialog_10r5p_13{width:min(480px,calc(100vw - var(--space-8)));max-height:76vh;overflow:auto;background:var(--bg-surface-raised);border:1px solid var(--border-default);border-radius:var(--radius-lg);box-shadow:var(--shadow-dialog);padding:var(--space-5);animation:_rise_10r5p_1 var(--duration-base) var(--ease-decelerate)}._title_10r5p_25{margin:0 0 var(--space-4);font-family:var(--font-display);font-size:var(--text-md-size);line-height:var(--text-md-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display)}._description_10r5p_36{margin:calc(var(--space-4) * -1 + var(--space-1)) 0 var(--space-4);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}@keyframes _fade_10r5p_1{0%{opacity:0}}@keyframes _rise_10r5p_1{0%{opacity:0;transform:translateY(4px)}}@media(prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._backdrop_10r5p_1,:root:not([data-motion=full]) ._dialog_10r5p_13{animation:none}}:root[data-motion=reduce] ._backdrop_10r5p_1,:root[data-motion=reduce] ._dialog_10r5p_13{animation:none}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{r as y,j as i}from"./index-CpgkRaTi.js";const T=/^diff --git a\/(.+) b\/(.+)$/,L=/^--- (?:a\/(.+)|(\/dev\/null))\s*$/,D=/^\+\+\+ (?:b\/(.+)|(\/dev\/null))\s*$/,A=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/;function P(l){return l.replace(/^[ab]\//,"")}function E(l){const d=l.split(`
|
|
2
|
-
`),e=d.some(t=>T.test(t)),o=[];for(let t=0;t<d.length;t++){const a=d[t];(e?T.test(a):L.test(a))&&o.push(t)}if(o.length===0)return[];const n=[];for(let t=0;t<o.length;t++){const a=o[t],c=t+1<o.length?o[t+1]:d.length;n.push(d.slice(a,c).join(`
|
|
3
|
-
`))}return n}function I(l,d){const e=l.split(`
|
|
4
|
-
`);e.length>0&&e[e.length-1]===""&&e.pop();let o=null,n=null,t=-1;for(let u=0;u<e.length;u++){const m=e[u],g=L.exec(m);if(g){o=g[2]?null:P(g[1]);continue}const k=D.exec(m);if(k){n=k[2]?null:P(k[1]),t=u+1;break}const x=T.exec(m);x&&o===null&&n===null&&(o=x[1]??null,n=x[2]??null)}let a="modified";o===null&&n!==null?a="added":o!==null&&n===null?a="deleted":o!==null&&n!==null&&o!==n&&(a="renamed");const c=n??o??`(unknown file ${d+1})`,f=[];let r=0,h=0,_=null;if(t===-1){const u=e.join(`
|
|
5
|
-
`).trim();return{id:`${d}:${c}`,oldPath:o,newPath:n,displayPath:c,status:a,hunks:[],additions:0,deletions:0,unparsedNotice:u||null}}let p=t;for(;p<e.length;){const u=A.exec(e[p]);if(!u){e[p].trim()&&(_=((_?_+`
|
|
6
|
-
`:"")+e[p]).trim()),p++;continue}const m=Number(u[1]),g=u[2]!==void 0?Number(u[2]):1,k=Number(u[3]),x=u[4]!==void 0?Number(u[4]):1,w={header:e[p],oldStart:m,oldLines:g,newStart:k,newLines:x,lines:[]};p++;let N=m,b=k;for(;p<e.length&&!A.test(e[p]);){const j=e[p];if(j.startsWith("\\")){p++;continue}const v=j[0],$=j.slice(1);v==="+"?(w.lines.push({kind:"add",text:$,oldLineNo:null,newLineNo:b}),b++,r++):v==="-"?(w.lines.push({kind:"del",text:$,oldLineNo:N,newLineNo:null}),N++,h++):(w.lines.push({kind:"context",text:v===" "?$:j,oldLineNo:N,newLineNo:b}),N++,b++),p++}f.push(w)}return{id:`${d}:${c}`,oldPath:o,newPath:n,displayPath:c,status:a,hunks:f,additions:r,deletions:h,unparsedNotice:_}}function C(l){const d=l??"";if(!d.trim())return{files:[],malformed:!1};const e=E(d);return e.length===0?{malformed:!0,files:[{id:"raw",oldPath:null,newPath:null,displayPath:"(unparsed diff)",status:"modified",hunks:[],additions:0,deletions:0,unparsedNotice:d}]}:{files:e.map((o,n)=>I(o,n)),malformed:!1}}function H(l){const d=[];let e=0;for(;e<l.length;){const o=l[e];if(o.kind==="context"){d.push({left:o,right:o}),e++;continue}const n=[];for(;e<l.length&&l[e].kind==="del";)n.push(l[e]),e++;const t=[];for(;e<l.length&&l[e].kind==="add";)t.push(l[e]),e++;const a=Math.max(n.length,t.length);for(let c=0;c<a;c++)d.push({left:n[c]??null,right:t[c]??null})}return d}const M={ts:"c-like",tsx:"c-like",js:"c-like",jsx:"c-like",mjs:"c-like",cjs:"c-like",mts:"c-like",cts:"c-like",java:"c-like",go:"c-like",rs:"c-like",c:"c-like",h:"c-like",cpp:"c-like",hpp:"c-like",cc:"c-like",swift:"c-like",kt:"c-like",kts:"c-like",py:"python",pyi:"python",sh:"shell",bash:"shell",zsh:"shell",css:"css",scss:"css",less:"css",json:"json",jsonc:"json",yml:"yaml",yaml:"yaml"};function z(l){if(!l)return"plain";const d=l.split(".").pop()?.toLowerCase()??"";return M[d]??"plain"}const F={"c-like":new Set(["const","let","var","function","return","if","else","for","while","do","switch","case","break","continue","class","extends","implements","interface","type","enum","export","import","from","default","new","this","super","try","catch","finally","throw","async","await","yield","static","public","private","protected","readonly","abstract","null","undefined","true","false","void","typeof","instanceof","in","of","as","is","never","unknown","any","package","struct","fn","impl","mod","pub","use","trait","match","func","defer","chan"]),python:new Set(["def","class","return","if","elif","else","for","while","break","continue","import","from","as","with","try","except","finally","raise","pass","lambda","yield","async","await","None","True","False","and","or","not","in","is","global","nonlocal","self"]),shell:new Set(["if","then","else","elif","fi","for","while","do","done","case","esac","function","return","export","local","echo","set","in","break","continue"]),css:new Set,json:new Set,yaml:new Set,plain:new Set},R={"c-like":/(?<comment>\/\/.*$|\/\*.*?\*\/)|(?<string>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|`(?:[^`\\]|\\.)*`)|(?<number>\b\d+(?:\.\d+)?\b)|(?<word>[A-Za-z_$][A-Za-z0-9_$]*)/g,python:/(?<comment>#.*$)|(?<string>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|(?<number>\b\d+(?:\.\d+)?\b)|(?<word>[A-Za-z_][A-Za-z0-9_]*)/g,shell:/(?<comment>#.*$)|(?<string>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|(?<word>[A-Za-z_][A-Za-z0-9_]*)/g,css:/(?<comment>\/\*.*?\*\/)|(?<string>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|(?<number>\b\d+(?:\.\d+)?\b)|(?<word>[A-Za-z_-][A-Za-z0-9_-]*)/g,json:/(?<string>"(?:[^"\\]|\\.)*")|(?<number>-?\b\d+(?:\.\d+)?\b)|(?<word>\btrue\b|\bfalse\b|\bnull\b)/g,yaml:/(?<comment>#.*$)|(?<string>"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/g};function Z(l,d){const e=R[d];if(!e)return[{kind:"plain",text:l}];const o=F[d],n=[];let t=0;e.lastIndex=0;let a;for(;a=e.exec(l);){a.index>t&&n.push({kind:"plain",text:l.slice(t,a.index)});const c=a.groups??{};if(c.comment!==void 0)n.push({kind:"comment",text:a[0]});else if(c.string!==void 0)n.push({kind:"string",text:a[0]});else if(c.number!==void 0)n.push({kind:"number",text:a[0]});else if(c.word!==void 0){const f=d==="json"||o.has(c.word);n.push({kind:f?"keyword":"plain",text:a[0]})}else n.push({kind:"plain",text:a[0]});t=a.index+a[0].length,a[0].length===0&&e.lastIndex++}return t<l.length&&n.push({kind:"plain",text:l.slice(t)}),n}const B="_viewer_gf84p_1",K="_malformedNotice_gf84p_9",U="_empty_gf84p_18",O="_tree_gf84p_27",W="_treeItem_gf84p_40",Y="_treeItemActive_gf84p_59",G="_statusDot_gf84p_64",V="_status_added_gf84p_70",X="_status_deleted_gf84p_71",q="_status_modified_gf84p_72",J="_status_renamed_gf84p_73",Q="_treePath_gf84p_75",ee="_treeStats_gf84p_83",te="_add_gf84p_89",ne="_del_gf84p_90",se="_body_gf84p_92",ie="_fileHeader_gf84p_99",le="_filePath_gf84p_109",oe="_modeToggle_gf84p_118",ae="_modeActive_gf84p_132",de="_notice_gf84p_138",ce="_emptyFile_gf84p_149",re="_hunkTable_gf84p_155",ue="_hunkCaption_gf84p_163",pe="_lineNo_gf84p_173",he="_lineMarker_gf84p_184",fe="_lineText_gf84p_192",_e="_hunkTableSplit_gf84p_199",me="_rowBlank_gf84p_203",ke="_row_add_gf84p_207",ge="_row_del_gf84p_210",xe="_row_context_gf84p_213",we="_code_gf84p_217",Ne="_tok_plain_gf84p_221",be="_tok_comment_gf84p_222",je="_tok_string_gf84p_223",ye="_tok_number_gf84p_224",ve="_tok_keyword_gf84p_225",s={viewer:B,malformedNotice:K,empty:U,tree:O,treeItem:W,treeItemActive:Y,statusDot:G,status_added:V,status_deleted:X,status_modified:q,status_renamed:J,treePath:Q,treeStats:ee,add:te,del:ne,body:se,fileHeader:ie,filePath:le,modeToggle:oe,modeActive:ae,notice:de,emptyFile:ce,hunkTable:re,hunkCaption:ue,lineNo:pe,lineMarker:he,lineText:fe,hunkTableSplit:_e,rowBlank:me,row_add:ke,row_del:ge,row_context:xe,code:we,tok_plain:Ne,tok_comment:be,tok_string:je,tok_number:ye,tok_keyword:ve};function Te({diff:l,proposalKind:d}){const e=y.useMemo(()=>C(l),[l]),[o,n]=y.useState(e.files[0]?.id??null),[t,a]=y.useState("unified");if(y.useEffect(()=>{n(e.files[0]?.id??null)},[l]),e.files.length===0)return i.jsxs("div",{className:s.empty,children:["No diff attached to this proposal (kind: ",d,")."]});const c=e.files.find(r=>r.id===o)??e.files[0];function f(r){const h=e.files.findIndex(_=>_.id===c.id);r.key==="ArrowDown"?(r.preventDefault(),n(e.files[Math.min(h+1,e.files.length-1)].id)):r.key==="ArrowUp"&&(r.preventDefault(),n(e.files[Math.max(h-1,0)].id))}return i.jsxs("div",{className:s.viewer,children:[e.malformed?i.jsx("p",{className:s.malformedNotice,children:"Could not parse this as a unified diff — showing raw content."}):null,i.jsx("div",{className:s.tree,role:"tree","aria-label":"Changed files",onKeyDown:f,children:e.files.map(r=>i.jsxs("button",{type:"button",role:"treeitem","aria-selected":r.id===c.id,tabIndex:r.id===c.id?0:-1,className:`${s.treeItem} ${r.id===c.id?s.treeItemActive:""}`,onClick:()=>n(r.id),children:[i.jsx("span",{className:`${s.statusDot} ${s[`status_${r.status}`]}`,"aria-hidden":"true"}),i.jsx("span",{className:s.treePath,title:r.displayPath,children:r.displayPath}),i.jsxs("span",{className:s.treeStats,children:[r.additions>0?i.jsxs("span",{className:s.add,children:["+",r.additions]}):null,r.deletions>0?i.jsxs("span",{className:s.del,children:["-",r.deletions]}):null]})]},r.id))}),i.jsxs("div",{className:s.body,children:[i.jsxs("div",{className:s.fileHeader,children:[i.jsx("span",{className:s.filePath,children:c.displayPath}),i.jsxs("div",{className:s.modeToggle,role:"group","aria-label":"Diff view mode",children:[i.jsx("button",{type:"button","aria-pressed":t==="unified",className:t==="unified"?s.modeActive:"",onClick:()=>a("unified"),children:"Unified"}),i.jsx("button",{type:"button","aria-pressed":t==="split",className:t==="split"?s.modeActive:"",onClick:()=>a("split"),children:"Split"})]})]}),c.unparsedNotice?i.jsx("pre",{className:s.notice,children:c.unparsedNotice}):null,c.hunks.length===0&&!c.unparsedNotice?i.jsx("p",{className:s.emptyFile,children:"No line-level changes captured for this file."}):c.hunks.map((r,h)=>i.jsx($e,{hunk:r,mode:t,path:c.displayPath},h))]})]})}function $e({hunk:l,mode:d,path:e}){const o=z(e);if(d==="split"){const n=H(l.lines);return i.jsxs("table",{className:`${s.hunkTable} ${s.hunkTableSplit}`,children:[i.jsx("caption",{className:s.hunkCaption,children:l.header}),i.jsx("tbody",{children:n.map((t,a)=>i.jsxs("tr",{children:[i.jsx("td",{className:s.lineNo,children:t.left?.oldLineNo??""}),i.jsx("td",{className:`${s.lineText} ${t.left?s[`row_${t.left.kind}`]:s.rowBlank}`,children:t.left?i.jsx(S,{text:t.left.text,lang:o}):null}),i.jsx("td",{className:s.lineNo,children:t.right?.newLineNo??""}),i.jsx("td",{className:`${s.lineText} ${t.right?s[`row_${t.right.kind}`]:s.rowBlank}`,children:t.right?i.jsx(S,{text:t.right.text,lang:o}):null})]},a))})]})}return i.jsxs("table",{className:s.hunkTable,children:[i.jsx("caption",{className:s.hunkCaption,children:l.header}),i.jsx("tbody",{children:l.lines.map((n,t)=>i.jsxs("tr",{className:s[`row_${n.kind}`],children:[i.jsx("td",{className:s.lineNo,children:n.oldLineNo??""}),i.jsx("td",{className:s.lineNo,children:n.newLineNo??""}),i.jsx("td",{className:s.lineMarker,"aria-hidden":"true",children:n.kind==="add"?"+":n.kind==="del"?"-":""}),i.jsx("td",{className:s.lineText,children:i.jsx(S,{text:n.text,lang:o})})]},t))})]})}function S({text:l,lang:d}){const e=Z(l,d);return i.jsx("code",{className:s.code,children:e.map((o,n)=>i.jsx("span",{className:s[`tok_${o.kind}`],children:o.text},n))})}export{Te as D,z as l,C as p,Z as t};
|
|
7
|
-
//# sourceMappingURL=DiffViewer-DTO0KRuG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DiffViewer-DTO0KRuG.js","sources":["../../../../../../src/web-ui/routes/inbox/diff-parser.ts","../../../../../../src/web-ui/routes/inbox/highlight.ts","../../../../../../src/web-ui/routes/inbox/DiffViewer.tsx"],"sourcesContent":["/**\n * routes/inbox/diff-parser.ts — pure parsing of a unified diff string\n * (Proposal.diff, src/core/types.ts) into a per-file, per-hunk structure the\n * DiffViewer can render with a file tree and syntax highlighting, instead of\n * dumping the raw string into an escaped <pre> block (the old UI's\n * approach — \"not acceptable for a tool meant to be elite\" per the\n * operator-console brief). No dependency: hand-rolled parser over the\n * unified diff format, which is regular enough (`--- `/`+++ `/`@@ `/leading\n * `-`/`+`/` `) that a small line-scan state machine covers it completely.\n *\n * Pure functions only — no React, no DOM — so this is trivially unit\n * testable (see diff-parser.test.ts) independent of rendering.\n */\n\nexport type DiffLineKind = 'context' | 'add' | 'del';\n\nexport interface DiffLine {\n kind: DiffLineKind;\n text: string;\n oldLineNo: number | null;\n newLineNo: number | null;\n}\n\nexport interface DiffHunk {\n header: string;\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: DiffLine[];\n}\n\nexport type FileChangeStatus = 'added' | 'deleted' | 'renamed' | 'modified';\n\nexport interface DiffFile {\n /** Stable key for React lists / file-tree selection. */\n id: string;\n oldPath: string | null;\n newPath: string | null;\n /** The path to show — newPath, falling back to oldPath for deletes. */\n displayPath: string;\n status: FileChangeStatus;\n hunks: DiffHunk[];\n additions: number;\n deletions: number;\n /** Raw text that didn't parse as hunks (e.g. a \"Binary files differ\"\n * notice) — preserved verbatim so nothing is silently dropped. */\n unparsedNotice: string | null;\n}\n\nexport interface ParsedDiff {\n files: DiffFile[];\n /** True when the input didn't look like a unified diff at all (no\n * `--- `/`+++ ` pairs found) — the raw string is returned as one\n * unparsed \"file\" so the viewer can still show *something*. */\n malformed: boolean;\n}\n\nconst FILE_HEADER_RE = /^diff --git a\\/(.+) b\\/(.+)$/;\nconst OLD_PATH_RE = /^--- (?:a\\/(.+)|(\\/dev\\/null))\\s*$/;\nconst NEW_PATH_RE = /^\\+\\+\\+ (?:b\\/(.+)|(\\/dev\\/null))\\s*$/;\nconst HUNK_HEADER_RE = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(.*)$/;\n\nfunction stripPathPrefix(p: string): string {\n return p.replace(/^[ab]\\//, '');\n}\n\n/** Split raw text into per-file chunks: before each `diff --git` line if\n * any are present, otherwise before each `--- ` line. */\nfunction splitFileChunks(text: string): string[] {\n const lines = text.split('\\n');\n const hasGitHeaders = lines.some((l) => FILE_HEADER_RE.test(l));\n const starts: number[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (hasGitHeaders ? FILE_HEADER_RE.test(line) : OLD_PATH_RE.test(line)) starts.push(i);\n }\n if (starts.length === 0) return [];\n const chunks: string[] = [];\n for (let i = 0; i < starts.length; i++) {\n const from = starts[i]!;\n const to = i + 1 < starts.length ? starts[i + 1]! : lines.length;\n chunks.push(lines.slice(from, to).join('\\n'));\n }\n return chunks;\n}\n\nfunction parseFileChunk(chunk: string, index: number): DiffFile {\n const lines = chunk.split('\\n');\n // A trailing '\\n' in the source text produces one trailing empty array\n // element that is never real diff content — every genuine line (context/\n // add/del) carries at least its 1-char marker (' '/'+'/'-'), so an empty\n // string here can only be that artifact. Drop it before parsing so it\n // isn't mistaken for a blank context line inside the last hunk.\n if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n let oldPath: string | null = null;\n let newPath: string | null = null;\n let bodyStart = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n const oldMatch = OLD_PATH_RE.exec(line);\n if (oldMatch) {\n oldPath = oldMatch[2] ? null : stripPathPrefix(oldMatch[1]!);\n continue;\n }\n const newMatch = NEW_PATH_RE.exec(line);\n if (newMatch) {\n newPath = newMatch[2] ? null : stripPathPrefix(newMatch[1]!);\n bodyStart = i + 1;\n break;\n }\n const gitHeader = FILE_HEADER_RE.exec(line);\n if (gitHeader && oldPath === null && newPath === null) {\n // Fallback path source used only if the chunk never reaches a proper\n // `+++` line (e.g. a binary-file notice with no hunks at all).\n oldPath = gitHeader[1] ?? null;\n newPath = gitHeader[2] ?? null;\n }\n }\n\n let status: FileChangeStatus = 'modified';\n if (oldPath === null && newPath !== null) status = 'added';\n else if (oldPath !== null && newPath === null) status = 'deleted';\n else if (oldPath !== null && newPath !== null && oldPath !== newPath) status = 'renamed';\n\n const displayPath = newPath ?? oldPath ?? `(unknown file ${index + 1})`;\n\n const hunks: DiffHunk[] = [];\n let additions = 0;\n let deletions = 0;\n let unparsedNotice: string | null = null;\n\n if (bodyStart === -1) {\n // Never found a `+++` line at all — likely a binary-file notice or a\n // chunk this parser doesn't understand. Preserve it verbatim.\n const trimmed = lines.join('\\n').trim();\n return {\n id: `${index}:${displayPath}`,\n oldPath,\n newPath,\n displayPath,\n status,\n hunks: [],\n additions: 0,\n deletions: 0,\n unparsedNotice: trimmed || null,\n };\n }\n\n let i = bodyStart;\n while (i < lines.length) {\n const header = HUNK_HEADER_RE.exec(lines[i]!);\n if (!header) {\n // Stray text between the file header and the first hunk (rare) —\n // fold into the notice rather than lose it.\n if (lines[i]!.trim()) {\n unparsedNotice = ((unparsedNotice ? unparsedNotice + '\\n' : '') + lines[i]).trim();\n }\n i++;\n continue;\n }\n const oldStart = Number(header[1]);\n const oldLines = header[2] !== undefined ? Number(header[2]) : 1;\n const newStart = Number(header[3]);\n const newLines = header[4] !== undefined ? Number(header[4]) : 1;\n const hunk: DiffHunk = { header: lines[i]!, oldStart, oldLines, newStart, newLines, lines: [] };\n i++;\n let oldNo = oldStart;\n let newNo = newStart;\n while (i < lines.length && !HUNK_HEADER_RE.test(lines[i]!)) {\n const raw = lines[i]!;\n if (raw.startsWith('\\\\')) {\n i++;\n continue; // \"\\"\n }\n const marker = raw[0];\n const text = raw.slice(1);\n if (marker === '+') {\n hunk.lines.push({ kind: 'add', text, oldLineNo: null, newLineNo: newNo });\n newNo++;\n additions++;\n } else if (marker === '-') {\n hunk.lines.push({ kind: 'del', text, oldLineNo: oldNo, newLineNo: null });\n oldNo++;\n deletions++;\n } else {\n // Context line (leading space), or an empty line inside a hunk.\n hunk.lines.push({ kind: 'context', text: marker === ' ' ? text : raw, oldLineNo: oldNo, newLineNo: newNo });\n oldNo++;\n newNo++;\n }\n i++;\n }\n hunks.push(hunk);\n }\n\n return { id: `${index}:${displayPath}`, oldPath, newPath, displayPath, status, hunks, additions, deletions, unparsedNotice };\n}\n\nexport function parseUnifiedDiff(raw: string | undefined | null): ParsedDiff {\n const text = raw ?? '';\n if (!text.trim()) return { files: [], malformed: false };\n const chunks = splitFileChunks(text);\n if (chunks.length === 0) {\n return {\n malformed: true,\n files: [\n {\n id: 'raw',\n oldPath: null,\n newPath: null,\n displayPath: '(unparsed diff)',\n status: 'modified',\n hunks: [],\n additions: 0,\n deletions: 0,\n unparsedNotice: text,\n },\n ],\n };\n }\n return { files: chunks.map((c, idx) => parseFileChunk(c, idx)), malformed: false };\n}\n\nexport interface SplitRow {\n left: DiffLine | null;\n right: DiffLine | null;\n}\n\n/** Zip a hunk's lines into side-by-side rows for the split view: a run of\n * consecutive deletions is paired with the following run of consecutive\n * additions (the usual shape of a changed block), padding the shorter side\n * with a blank cell. Pure context lines occupy both sides identically. */\nexport function toSplitRows(lines: DiffLine[]): SplitRow[] {\n const rows: SplitRow[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n if (line.kind === 'context') {\n rows.push({ left: line, right: line });\n i++;\n continue;\n }\n const dels: DiffLine[] = [];\n while (i < lines.length && lines[i]!.kind === 'del') {\n dels.push(lines[i]!);\n i++;\n }\n const adds: DiffLine[] = [];\n while (i < lines.length && lines[i]!.kind === 'add') {\n adds.push(lines[i]!);\n i++;\n }\n const n = Math.max(dels.length, adds.length);\n for (let j = 0; j < n; j++) rows.push({ left: dels[j] ?? null, right: adds[j] ?? null });\n }\n return rows;\n}\n","/**\n * routes/inbox/highlight.ts — minimal, dependency-free syntax highlighting\n * for the diff viewer. Per the operator-console brief: \"do NOT pull in a\n * heavy dependency without checking what's already available — hand-rolled\n * highlighting for common languages is acceptable and preferable to a large\n * runtime dep.\" This is a single-pass tokenizer per *line* (the diff viewer\n * already renders line-by-line) — cross-line state like multi-line block\n * comments is intentionally not tracked, so an occasional line inside a\n * block comment may be mis-colored. That's a fine trade for zero\n * dependencies and O(n) rendering with no dependency on the file's context\n * outside the visible hunk.\n */\n\nexport type TokenKind = 'plain' | 'comment' | 'string' | 'number' | 'keyword';\n\nexport interface Token {\n kind: TokenKind;\n text: string;\n}\n\nexport type LangFamily = 'c-like' | 'python' | 'shell' | 'css' | 'json' | 'yaml' | 'plain';\n\nconst EXT_TO_FAMILY: Record<string, LangFamily> = {\n ts: 'c-like', tsx: 'c-like', js: 'c-like', jsx: 'c-like', mjs: 'c-like', cjs: 'c-like', mts: 'c-like', cts: 'c-like',\n java: 'c-like', go: 'c-like', rs: 'c-like', c: 'c-like', h: 'c-like', cpp: 'c-like', hpp: 'c-like', cc: 'c-like',\n swift: 'c-like', kt: 'c-like', kts: 'c-like',\n py: 'python', pyi: 'python',\n sh: 'shell', bash: 'shell', zsh: 'shell',\n css: 'css', scss: 'css', less: 'css',\n json: 'json', jsonc: 'json',\n yml: 'yaml', yaml: 'yaml',\n};\n\nexport function languageForPath(path: string | null | undefined): LangFamily {\n if (!path) return 'plain';\n const ext = path.split('.').pop()?.toLowerCase() ?? '';\n return EXT_TO_FAMILY[ext] ?? 'plain';\n}\n\nconst KEYWORDS: Record<LangFamily, Set<string>> = {\n 'c-like': new Set([\n 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', 'do', 'switch', 'case',\n 'break', 'continue', 'class', 'extends', 'implements', 'interface', 'type', 'enum', 'export', 'import',\n 'from', 'default', 'new', 'this', 'super', 'try', 'catch', 'finally', 'throw', 'async', 'await',\n 'yield', 'static', 'public', 'private', 'protected', 'readonly', 'abstract', 'null', 'undefined',\n 'true', 'false', 'void', 'typeof', 'instanceof', 'in', 'of', 'as', 'is', 'never', 'unknown', 'any',\n 'package', 'struct', 'fn', 'impl', 'mod', 'pub', 'use', 'trait', 'match', 'func', 'defer', 'chan',\n ]),\n python: new Set([\n 'def', 'class', 'return', 'if', 'elif', 'else', 'for', 'while', 'break', 'continue', 'import', 'from',\n 'as', 'with', 'try', 'except', 'finally', 'raise', 'pass', 'lambda', 'yield', 'async', 'await', 'None',\n 'True', 'False', 'and', 'or', 'not', 'in', 'is', 'global', 'nonlocal', 'self',\n ]),\n shell: new Set([\n 'if', 'then', 'else', 'elif', 'fi', 'for', 'while', 'do', 'done', 'case', 'esac', 'function', 'return',\n 'export', 'local', 'echo', 'set', 'in', 'break', 'continue',\n ]),\n css: new Set(),\n json: new Set(),\n yaml: new Set(),\n plain: new Set(),\n};\n\n// One combined rule regex per family, using named groups so a single\n// generic scan loop works for every family regardless of which groups it\n// defines. First match wins scanning left-to-right; the gaps between\n// matches become plain-text tokens verbatim.\nconst RULES: Partial<Record<LangFamily, RegExp>> = {\n 'c-like':\n /(?<comment>\\/\\/.*$|\\/\\*.*?\\*\\/)|(?<string>\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|`(?:[^`\\\\]|\\\\.)*`)|(?<number>\\b\\d+(?:\\.\\d+)?\\b)|(?<word>[A-Za-z_$][A-Za-z0-9_$]*)/g,\n python:\n /(?<comment>#.*$)|(?<string>\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')|(?<number>\\b\\d+(?:\\.\\d+)?\\b)|(?<word>[A-Za-z_][A-Za-z0-9_]*)/g,\n shell: /(?<comment>#.*$)|(?<string>\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')|(?<word>[A-Za-z_][A-Za-z0-9_]*)/g,\n css: /(?<comment>\\/\\*.*?\\*\\/)|(?<string>\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')|(?<number>\\b\\d+(?:\\.\\d+)?\\b)|(?<word>[A-Za-z_-][A-Za-z0-9_-]*)/g,\n json: /(?<string>\"(?:[^\"\\\\]|\\\\.)*\")|(?<number>-?\\b\\d+(?:\\.\\d+)?\\b)|(?<word>\\btrue\\b|\\bfalse\\b|\\bnull\\b)/g,\n yaml: /(?<comment>#.*$)|(?<string>\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')/g,\n};\n\nexport function tokenizeLine(text: string, family: LangFamily): Token[] {\n const rule = RULES[family];\n if (!rule) return [{ kind: 'plain', text }];\n const keywords = KEYWORDS[family];\n const tokens: Token[] = [];\n let last = 0;\n rule.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = rule.exec(text))) {\n if (match.index > last) tokens.push({ kind: 'plain', text: text.slice(last, match.index) });\n const g = match.groups ?? {};\n if (g.comment !== undefined) {\n tokens.push({ kind: 'comment', text: match[0] });\n } else if (g.string !== undefined) {\n tokens.push({ kind: 'string', text: match[0] });\n } else if (g.number !== undefined) {\n tokens.push({ kind: 'number', text: match[0] });\n } else if (g.word !== undefined) {\n const isKeyword = family === 'json' || keywords.has(g.word);\n tokens.push({ kind: isKeyword ? 'keyword' : 'plain', text: match[0] });\n } else {\n tokens.push({ kind: 'plain', text: match[0] });\n }\n last = match.index + match[0].length;\n if (match[0].length === 0) rule.lastIndex++; // guard against zero-width matches\n }\n if (last < text.length) tokens.push({ kind: 'plain', text: text.slice(last) });\n return tokens;\n}\n","/**\n * routes/inbox/DiffViewer.tsx — the core review interaction (operator-\n * console brief item 2). A multi-file unified diff gets a file tree plus a\n * syntax-highlighted, split/unified-toggleable hunk view instead of one\n * escaped <pre> block (the old UI's approach). No diff/highlighting\n * dependency: diff-parser.ts and highlight.ts are both hand-rolled per the\n * foundation's \"keep new runtime deps minimal\" constraint — checked\n * package.json first; nothing suitable was already a dependency.\n */\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport { parseUnifiedDiff, toSplitRows, type DiffHunk } from './diff-parser.js';\nimport { languageForPath, tokenizeLine, type LangFamily } from './highlight.js';\nimport styles from './DiffViewer.module.css';\n\ntype ViewMode = 'unified' | 'split';\n\nexport function DiffViewer({ diff, proposalKind }: { diff: string | undefined; proposalKind: string }) {\n const parsed = useMemo(() => parseUnifiedDiff(diff), [diff]);\n const [selectedId, setSelectedId] = useState<string | null>(parsed.files[0]?.id ?? null);\n const [mode, setMode] = useState<ViewMode>('unified');\n\n // Diff identity changed (a different proposal is now shown) — reset the\n // selected file rather than holding on to a stale id from the last one.\n useEffect(() => {\n setSelectedId(parsed.files[0]?.id ?? null);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- reset on diff content change only\n }, [diff]);\n\n if (parsed.files.length === 0) {\n return (\n <div className={styles.empty}>No diff attached to this proposal (kind: {proposalKind}).</div>\n );\n }\n\n const selected = parsed.files.find((f) => f.id === selectedId) ?? parsed.files[0]!;\n\n function onTreeKeyDown(e: React.KeyboardEvent) {\n const idx = parsed.files.findIndex((f) => f.id === selected.id);\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.min(idx + 1, parsed.files.length - 1)]!.id);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedId(parsed.files[Math.max(idx - 1, 0)]!.id);\n }\n }\n\n return (\n <div className={styles.viewer}>\n {parsed.malformed ? (\n <p className={styles.malformedNotice}>Could not parse this as a unified diff — showing raw content.</p>\n ) : null}\n <div className={styles.tree} role=\"tree\" aria-label=\"Changed files\" onKeyDown={onTreeKeyDown}>\n {parsed.files.map((f) => (\n <button\n key={f.id}\n type=\"button\"\n role=\"treeitem\"\n aria-selected={f.id === selected.id}\n tabIndex={f.id === selected.id ? 0 : -1}\n className={`${styles.treeItem} ${f.id === selected.id ? styles.treeItemActive : ''}`}\n onClick={() => setSelectedId(f.id)}\n >\n <span className={`${styles.statusDot} ${styles[`status_${f.status}`]}`} aria-hidden=\"true\" />\n <span className={styles.treePath} title={f.displayPath}>\n {f.displayPath}\n </span>\n <span className={styles.treeStats}>\n {f.additions > 0 ? <span className={styles.add}>+{f.additions}</span> : null}\n {f.deletions > 0 ? <span className={styles.del}>-{f.deletions}</span> : null}\n </span>\n </button>\n ))}\n </div>\n\n <div className={styles.body}>\n <div className={styles.fileHeader}>\n <span className={styles.filePath}>{selected.displayPath}</span>\n <div className={styles.modeToggle} role=\"group\" aria-label=\"Diff view mode\">\n <button\n type=\"button\"\n aria-pressed={mode === 'unified'}\n className={mode === 'unified' ? styles.modeActive : ''}\n onClick={() => setMode('unified')}\n >\n Unified\n </button>\n <button\n type=\"button\"\n aria-pressed={mode === 'split'}\n className={mode === 'split' ? styles.modeActive : ''}\n onClick={() => setMode('split')}\n >\n Split\n </button>\n </div>\n </div>\n {selected.unparsedNotice ? <pre className={styles.notice}>{selected.unparsedNotice}</pre> : null}\n {selected.hunks.length === 0 && !selected.unparsedNotice ? (\n <p className={styles.emptyFile}>No line-level changes captured for this file.</p>\n ) : (\n selected.hunks.map((hunk, i) => <Hunk key={i} hunk={hunk} mode={mode} path={selected.displayPath} />)\n )}\n </div>\n </div>\n );\n}\n\nfunction Hunk({ hunk, mode, path }: { hunk: DiffHunk; mode: ViewMode; path: string }) {\n const lang = languageForPath(path);\n if (mode === 'split') {\n const rows = toSplitRows(hunk.lines);\n return (\n <table className={`${styles.hunkTable} ${styles.hunkTableSplit}`}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {rows.map((row, i) => (\n <tr key={i}>\n <td className={styles.lineNo}>{row.left?.oldLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.left ? styles[`row_${row.left.kind}`] : styles.rowBlank}`}>\n {row.left ? <CodeLine text={row.left.text} lang={lang} /> : null}\n </td>\n <td className={styles.lineNo}>{row.right?.newLineNo ?? ''}</td>\n <td className={`${styles.lineText} ${row.right ? styles[`row_${row.right.kind}`] : styles.rowBlank}`}>\n {row.right ? <CodeLine text={row.right.text} lang={lang} /> : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n return (\n <table className={styles.hunkTable}>\n <caption className={styles.hunkCaption}>{hunk.header}</caption>\n <tbody>\n {hunk.lines.map((line, i) => (\n <tr key={i} className={styles[`row_${line.kind}`]}>\n <td className={styles.lineNo}>{line.oldLineNo ?? ''}</td>\n <td className={styles.lineNo}>{line.newLineNo ?? ''}</td>\n <td className={styles.lineMarker} aria-hidden=\"true\">\n {line.kind === 'add' ? '+' : line.kind === 'del' ? '-' : ''}\n </td>\n <td className={styles.lineText}>\n <CodeLine text={line.text} lang={lang} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction CodeLine({ text, lang }: { text: string; lang: LangFamily }): ReactNode {\n const tokens = tokenizeLine(text, lang);\n return (\n <code className={styles.code}>\n {tokens.map((t, i) => (\n <span key={i} className={styles[`tok_${t.kind}`]}>\n {t.text}\n </span>\n ))}\n </code>\n );\n}\n"],"names":["FILE_HEADER_RE","OLD_PATH_RE","NEW_PATH_RE","HUNK_HEADER_RE","stripPathPrefix","p","splitFileChunks","text","lines","hasGitHeaders","l","starts","i","line","chunks","from","to","parseFileChunk","chunk","index","oldPath","newPath","bodyStart","oldMatch","newMatch","gitHeader","status","displayPath","hunks","additions","deletions","unparsedNotice","trimmed","header","oldStart","oldLines","newStart","newLines","hunk","oldNo","newNo","raw","marker","parseUnifiedDiff","c","idx","toSplitRows","rows","dels","adds","n","j","EXT_TO_FAMILY","languageForPath","path","ext","KEYWORDS","RULES","tokenizeLine","family","rule","keywords","tokens","last","match","g","isKeyword","DiffViewer","diff","proposalKind","parsed","useMemo","selectedId","setSelectedId","useState","mode","setMode","useEffect","jsxs","styles","selected","f","onTreeKeyDown","e","jsx","Hunk","lang","row","CodeLine","t"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._viewer_gf84p_1{display:grid;grid-template-columns:minmax(180px,260px) 1fr;gap:var(--space-4);align-items:start;min-height:0}._malformedNotice_gf84p_9{grid-column:1 / -1;padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:var(--status-warning-bg);color:var(--status-warning-fg);font-size:var(--text-xs-size)}._empty_gf84p_18{padding:var(--space-6);text-align:center;color:var(--text-tertiary);font-size:var(--text-sm-size);border:1px dashed var(--border-default);border-radius:var(--radius-md)}._tree_gf84p_27{display:flex;flex-direction:column;gap:var(--space-1);border:1px solid var(--border-subtle);border-radius:var(--radius-md);padding:var(--space-2);max-height:480px;overflow-y:auto;position:sticky;top:0}._treeItem_gf84p_40{display:flex;align-items:center;gap:var(--space-2);width:100%;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);background:transparent;border:none;text-align:left;font-size:var(--text-xs-size);color:var(--text-secondary);cursor:pointer}._treeItem_gf84p_40:hover{background:var(--bg-hover)}._treeItemActive_gf84p_59{background:var(--bg-selected);color:var(--text-primary)}._statusDot_gf84p_64{flex:0 0 auto;width:8px;height:8px;border-radius:var(--radius-full)}._status_added_gf84p_70{background:var(--status-success-solid)}._status_deleted_gf84p_71{background:var(--status-danger-solid)}._status_modified_gf84p_72{background:var(--status-info-solid)}._status_renamed_gf84p_73{background:var(--status-warning-solid)}._treePath_gf84p_75{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono)}._treeStats_gf84p_83{flex:0 0 auto;display:flex;gap:var(--space-1);font-variant-numeric:tabular-nums}._add_gf84p_89{color:var(--status-success-fg)}._del_gf84p_90{color:var(--status-danger-fg)}._body_gf84p_92{min-width:0;border:1px solid var(--border-subtle);border-radius:var(--radius-md);overflow:hidden}._fileHeader_gf84p_99{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas)}._filePath_gf84p_109{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._modeToggle_gf84p_118{flex:0 0 auto;display:flex;gap:var(--space-1)}._modeToggle_gf84p_118 button{padding:var(--space-1) var(--space-2);font-size:var(--text-xs-size);border-radius:var(--radius-sm);border:1px solid var(--border-default);background:var(--bg-surface);color:var(--text-secondary);cursor:pointer}._modeActive_gf84p_132{background:var(--accent-50);border-color:var(--accent-500)!important;color:var(--accent-600)!important}._notice_gf84p_138{margin:var(--space-3);padding:var(--space-2);background:var(--bg-code);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs-size);white-space:pre-wrap;word-break:break-word}._emptyFile_gf84p_149{padding:var(--space-4);color:var(--text-tertiary);font-size:var(--text-sm-size)}._hunkTable_gf84p_155{width:100%;border-collapse:collapse;font-family:var(--font-mono);font-size:var(--text-xs-size);table-layout:fixed}._hunkCaption_gf84p_163{caption-side:top;text-align:left;padding:var(--space-1) var(--space-3);color:var(--text-tertiary);background:var(--bg-canvas);border-bottom:1px solid var(--border-subtle);border-top:1px solid var(--border-subtle)}._lineNo_gf84p_173{width:44px;min-width:44px;padding:0 var(--space-2);text-align:right;color:var(--text-disabled);user-select:none;vertical-align:top;font-variant-numeric:tabular-nums}._lineMarker_gf84p_184{width:16px;min-width:16px;text-align:center;user-select:none;vertical-align:top}._lineText_gf84p_192{padding:0 var(--space-2);white-space:pre-wrap;word-break:break-word;vertical-align:top}._hunkTableSplit_gf84p_199 ._lineText_gf84p_192{width:50%}._rowBlank_gf84p_203{background:var(--bg-canvas)}._row_add_gf84p_207{background:var(--status-success-bg)}._row_del_gf84p_210{background:var(--status-danger-bg)}._row_context_gf84p_213{background:transparent}._code_gf84p_217{font-family:inherit}._tok_plain_gf84p_221{color:var(--text-primary)}._tok_comment_gf84p_222{color:var(--text-tertiary);font-style:italic}._tok_string_gf84p_223{color:var(--status-success-fg)}._tok_number_gf84p_224{color:var(--status-warning-fg)}._tok_keyword_gf84p_225{color:var(--accent-600);font-weight:var(--font-weight-medium)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./index-CpgkRaTi.js";const i="_unknown_4gf0c_1",u="_dot_4gf0c_11",d="_badge_4gf0c_19",a={unknown:i,dot:u,badge:d};function r(n){return n?n.sourceState==="healthy"&&n.complete!==!1:!0}function f({quality:n,children:s,renderControl:c,label:t}){if(r(n))return e.jsxs(e.Fragment,{children:[s,c?.()]});const o=n?.reason;return e.jsxs("span",{className:a.unknown,title:o?`Unavailable: ${o}`:"Source data unavailable",children:[e.jsx("span",{className:a.dot,"aria-hidden":"true"}),"unknown",t?e.jsxs("span",{className:"visually-hidden",children:[" (",t,")"]}):null]})}function m({quality:n,label:s}){return r(n)?null:e.jsxs("span",{className:a.badge,title:n?.reason??"Source data unavailable",children:[s?`${s}: `:"","unknown"]})}export{f as E,m as a,r as i};
|
|
2
|
-
//# sourceMappingURL=Epistemic-53PikaUI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Epistemic-53PikaUI.js","sources":["../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":["/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"names":["isKnown","quality","Epistemic","children","renderControl","label","jsxs","Fragment","reason","styles","jsx","EpistemicBadge"],"mappings":"qIAkBO,SAASA,EAAQC,EAA6C,CACnE,OAAKA,EACEA,EAAQ,cAAgB,WAAaA,EAAQ,WAAa,GAD5C,EAEvB,CAkBO,SAASC,EAAU,CAAE,QAAAD,EAAS,SAAAE,EAAU,cAAAC,EAAe,MAAAC,GAAoC,CAChG,GAAIL,EAAQC,CAAO,EACjB,OACEK,EAAAA,KAAAC,WAAA,CACG,SAAA,CAAAJ,EACAC,IAAA,CAAgB,EACnB,EAIJ,MAAMI,EAASP,GAAS,OACxB,OACEK,EAAAA,KAAC,OAAA,CAAK,UAAWG,EAAO,QAAS,MAAOD,EAAS,gBAAgBA,CAAM,GAAK,0BAC1E,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,IAAK,cAAY,OAAO,EAAE,UAEjDJ,EAAQC,EAAAA,KAAC,OAAA,CAAK,UAAU,kBAAkB,SAAA,CAAA,KAAGD,EAAM,GAAA,CAAA,CAAC,EAAU,IAAA,EACjE,CAEJ,CAGO,SAASM,EAAe,CAAE,QAAAV,EAAS,MAAAI,GAA4E,CACpH,OAAIL,EAAQC,CAAO,EAAU,KAE3BK,OAAC,QAAK,UAAWG,EAAO,MAAO,MAAOR,GAAS,QAAU,0BACtD,SAAA,CAAAI,EAAQ,GAAGA,CAAK,KAAO,GAAG,SAAA,EAC7B,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._unknown_4gf0c_1{display:inline-flex;align-items:center;gap:var(--space-1);color:var(--status-unknown-fg);font-size:var(--text-sm-size);font-style:italic;cursor:help}._dot_4gf0c_11{width:6px;height:6px;border-radius:var(--radius-full);background:var(--status-unknown-solid);flex-shrink:0}._badge_4gf0c_19{display:inline-flex;align-items:center;padding:1px var(--space-2);border-radius:var(--radius-xs);background:var(--status-unknown-bg);color:var(--status-unknown-fg);font-size:var(--text-xs-size);font-style:italic;cursor:help}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._wrap_ti026_1{display:flex;flex-direction:column;gap:var(--space-1);min-width:0}._lineWrap_ti026_8{width:100%}._head_ti026_12{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2)}._label_ti026_19{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._value_ti026_28{flex:none;font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-xs-size);letter-spacing:var(--tracking-display);color:var(--text-secondary)}._unknown_ti026_37{font-family:var(--font-ui);font-style:italic;color:var(--status-unknown-fg)}._track_ti026_43{width:100%;overflow:hidden;background:var(--bg-active)}._bar_ti026_49{height:4px;border-radius:var(--radius-full)}._line_ti026_8{height:2px;border-radius:0;background:var(--border-subtle)}._fill_ti026_61{height:100%;transition:width var(--duration-base) var(--ease-standard)}._accent_ti026_66{background:var(--accent-500)}._neutral_ti026_69{background:var(--status-neutral-solid)}._running_ti026_72{background:var(--status-running-solid)}._warning_ti026_75{background:var(--status-warning-solid)}._danger_ti026_78{background:var(--status-danger-solid)}._engine_ti026_81{background:var(--status-neutral-solid)}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as t}from"./index-CpgkRaTi.js";const p="_wrap_ti026_1",k="_lineWrap_ti026_8",m="_head_ti026_12",f="_label_ti026_19",x="_value_ti026_28",b="_unknown_ti026_37",j="_track_ti026_43",v="_bar_ti026_49",N="_line_ti026_8",M="_fill_ti026_61",F="_accent_ti026_66",W="_neutral_ti026_69",y="_running_ti026_72",E="_warning_ti026_75",P="_danger_ti026_78",R="_engine_ti026_81",e={wrap:p,lineWrap:k,head:m,label:f,value:x,unknown:b,track:j,bar:v,line:N,fill:M,accent:F,neutral:W,running:y,warning:E,danger:P,engine:R};function g(n){return n>=1e6?`${(n/1e6).toFixed(n>=1e7?0:1)}m`:n>=1e3?`${(n/1e3).toFixed(n>=1e4?0:1)}k`:String(Math.round(n))}function S(n){return n>=90?"danger":n>=70?"warning":"accent"}function z({value:n,max:r,variant:c="labelled",label:s,valueText:l,tone:h,engineColor:o,className:_,...$}){const i=n!==null&&Number.isFinite(n)&&r!==null&&Number.isFinite(r)&&r>0,a=i?Math.min(100,Math.max(0,n/r*100)):0,u=h??(i?S(a):"neutral"),d=i?l??`${g(n)} / ${g(r)}`:l??"unknown",w=t.jsx("div",{className:`${e.track} ${c==="line"?e.line:e.bar}`,role:"meter","aria-valuenow":i?Math.round(a):void 0,"aria-valuemin":0,"aria-valuemax":100,"aria-valuetext":i?`${Math.round(a)}%`:"unknown",...$,children:t.jsx("div",{className:`${e.fill} ${e[u]}`,style:{width:`${a}%`,...u==="engine"&&o?{background:o}:{}}})});return c==="line"?t.jsx("div",{className:`${e.lineWrap} ${_??""}`,children:w}):t.jsxs("div",{className:`${e.wrap} ${_??""}`,children:[s||d?t.jsxs("div",{className:e.head,children:[s?t.jsx("span",{className:e.label,children:s}):t.jsx("span",{}),t.jsx("span",{className:`${e.value} ${i?"":e.unknown}`,children:d})]}):null,w]})}export{z as M};
|
|
2
|
-
//# sourceMappingURL=Meter-DRWZQgr1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Meter-DRWZQgr1.js","sources":["../../../../../../src/web-ui/components/primitives/Meter.tsx"],"sourcesContent":["/**\n * components/primitives/Meter.tsx — occupancy against a limit: context\n * window, daily spend against the cap, a plan's usage window.\n *\n * Two forms, one component:\n * variant=\"line\" the 2px full-width rule the design language puts\n * directly under a header strip. No text of its own —\n * wrap it in <Tooltip> and put the numbers beside it.\n * variant=\"labelled\" a 4px bar with a label and a right-aligned\n * \"18k / 66k\" in the display face.\n *\n * Tone thresholds match the V1 context meter (amber >= 70%, danger >= 90%)\n * and are ALWAYS paired with the readable value, never color alone.\n * An unknown limit renders an honest empty track and the text \"unknown\" —\n * never a full bar, never zero (DESIGN.md §7).\n */\nimport type { ReactNode } from 'react';\nimport styles from './Meter.module.css';\n\nexport type MeterTone = 'accent' | 'neutral' | 'running' | 'warning' | 'danger' | 'engine';\n\nexport interface MeterProps {\n /** Current value. null = genuinely unknown. */\n value: number | null;\n /** Limit. null/0 = unknown limit; the meter says so instead of guessing. */\n max: number | null;\n variant?: 'line' | 'labelled';\n label?: ReactNode;\n /** Right-aligned readout. Defaults to `value / max` formatted compactly. */\n valueText?: ReactNode;\n /** Force a tone; by default it is derived from the percentage. */\n tone?: MeterTone;\n /** For tone=\"engine\": the CSS color to paint the fill (an --engine-* var). */\n engineColor?: string;\n /** Accessible name when no visible label is rendered (the line variant). */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction compact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(n >= 10_000_000 ? 0 : 1)}m`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(n >= 10_000 ? 0 : 1)}k`;\n return String(Math.round(n));\n}\n\nexport function toneForPercent(percent: number): MeterTone {\n if (percent >= 90) return 'danger';\n if (percent >= 70) return 'warning';\n return 'accent';\n}\n\nexport function Meter({\n value,\n max,\n variant = 'labelled',\n label,\n valueText,\n tone,\n engineColor,\n className,\n ...aria\n}: MeterProps) {\n const known = value !== null && Number.isFinite(value) && max !== null && Number.isFinite(max) && max > 0;\n const percent = known ? Math.min(100, Math.max(0, (value! / max!) * 100)) : 0;\n const resolvedTone = tone ?? (known ? toneForPercent(percent) : 'neutral');\n const readout = known ? (valueText ?? `${compact(value!)} / ${compact(max!)}`) : (valueText ?? 'unknown');\n\n const track = (\n <div\n className={`${styles.track} ${variant === 'line' ? styles.line : styles.bar}`}\n role=\"meter\"\n aria-valuenow={known ? Math.round(percent) : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={known ? `${Math.round(percent)}%` : 'unknown'}\n {...aria}\n >\n <div\n className={`${styles.fill} ${styles[resolvedTone]}`}\n style={{\n width: `${percent}%`,\n ...(resolvedTone === 'engine' && engineColor ? { background: engineColor } : {}),\n }}\n />\n </div>\n );\n\n if (variant === 'line') return <div className={`${styles.lineWrap} ${className ?? ''}`}>{track}</div>;\n\n return (\n <div className={`${styles.wrap} ${className ?? ''}`}>\n {label || readout ? (\n <div className={styles.head}>\n {label ? <span className={styles.label}>{label}</span> : <span />}\n <span className={`${styles.value} ${known ? '' : styles.unknown}`}>{readout}</span>\n </div>\n ) : null}\n {track}\n </div>\n );\n}\n"],"names":["compact","toneForPercent","percent","Meter","value","max","variant","label","valueText","tone","engineColor","className","aria","known","resolvedTone","readout","track","jsx","styles","jsxs"],"mappings":"+fAuCA,SAASA,EAAQ,EAAmB,CAClC,OAAI,GAAK,IAAkB,IAAI,EAAI,KAAW,QAAQ,GAAK,IAAa,EAAI,CAAC,CAAC,IAC1E,GAAK,IAAc,IAAI,EAAI,KAAO,QAAQ,GAAK,IAAS,EAAI,CAAC,CAAC,IAC3D,OAAO,KAAK,MAAM,CAAC,CAAC,CAC7B,CAEO,SAASC,EAAeC,EAA4B,CACzD,OAAIA,GAAW,GAAW,SACtBA,GAAW,GAAW,UACnB,QACT,CAEO,SAASC,EAAM,CACpB,MAAAC,EACA,IAAAC,EACA,QAAAC,EAAU,WACV,MAAAC,EACA,UAAAC,EACA,KAAAC,EACA,YAAAC,EACA,UAAAC,EACA,GAAGC,CACL,EAAe,CACb,MAAMC,EAAQT,IAAU,MAAQ,OAAO,SAASA,CAAK,GAAKC,IAAQ,MAAQ,OAAO,SAASA,CAAG,GAAKA,EAAM,EAClGH,EAAUW,EAAQ,KAAK,IAAI,IAAK,KAAK,IAAI,EAAIT,EAASC,EAAQ,GAAG,CAAC,EAAI,EACtES,EAAeL,IAASI,EAAQZ,EAAeC,CAAO,EAAI,WAC1Da,EAAUF,EAASL,GAAa,GAAGR,EAAQI,CAAM,CAAC,MAAMJ,EAAQK,CAAI,CAAC,GAAOG,GAAa,UAEzFQ,EACJC,EAAAA,IAAC,MAAA,CACC,UAAW,GAAGC,EAAO,KAAK,IAAIZ,IAAY,OAASY,EAAO,KAAOA,EAAO,GAAG,GAC3E,KAAK,QACL,gBAAeL,EAAQ,KAAK,MAAMX,CAAO,EAAI,OAC7C,gBAAe,EACf,gBAAe,IACf,iBAAgBW,EAAQ,GAAG,KAAK,MAAMX,CAAO,CAAC,IAAM,UACnD,GAAGU,EAEJ,SAAAK,EAAAA,IAAC,MAAA,CACC,UAAW,GAAGC,EAAO,IAAI,IAAIA,EAAOJ,CAAY,CAAC,GACjD,MAAO,CACL,MAAO,GAAGZ,CAAO,IACjB,GAAIY,IAAiB,UAAYJ,EAAc,CAAE,WAAYA,CAAA,EAAgB,CAAA,CAAC,CAChF,CAAA,CACF,CAAA,EAIJ,OAAIJ,IAAY,OAAeW,EAAAA,IAAC,MAAA,CAAI,UAAW,GAAGC,EAAO,QAAQ,IAAIP,GAAa,EAAE,GAAK,SAAAK,EAAM,EAG7FG,OAAC,OAAI,UAAW,GAAGD,EAAO,IAAI,IAAIP,GAAa,EAAE,GAC9C,SAAA,CAAAJ,GAASQ,EACRI,EAAAA,KAAC,MAAA,CAAI,UAAWD,EAAO,KACpB,SAAA,CAAAX,EAAQU,EAAAA,IAAC,QAAK,UAAWC,EAAO,MAAQ,SAAAX,CAAA,CAAM,QAAW,OAAA,CAAA,CAAK,EAC/DU,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGC,EAAO,KAAK,IAAIL,EAAQ,GAAKK,EAAO,OAAO,GAAK,SAAAH,CAAA,CAAQ,CAAA,CAAA,CAC9E,EACE,KACHC,CAAA,EACH,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as s,j as t}from"./index-CpgkRaTi.js";import{D as y}from"./Dialog-CNd7q89m.js";import{u as N}from"./global-BHjd6fVZ.js";const R="_body_1kukj_1",w="_form_1kukj_8",E="_label_1kukj_14",g="_inputRow_1kukj_19",C="_input_1kukj_19",I="_reveal_1kukj_40",S="_error_1kukj_51",D="_actions_1kukj_56",M="_cancel_1kukj_63",T="_submit_1kukj_72",e={body:R,form:w,label:E,inputRow:g,input:C,reveal:I,error:S,actions:D,cancel:M,submit:T},F=/^[a-f0-9]{64}$/;function $({open:p,onClose:o,onUnlocked:_,reason:k,tokenLabel:h="Mutation token",tokenHelp:f="the mutation token ashlr serve printed"}){const{setToken:b}=N(),[n,i]=s.useState(""),[r,j]=s.useState(!1),[l,c]=s.useState(null),u=s.useRef(null),x=s.useId(),m=s.useId();function v(a){a.preventDefault();const d=n.trim();if(!F.test(d)){c(`Expected 64 hex characters — ${f}.`);return}b(d),i(""),c(null),o(),_?.()}return t.jsxs(y,{open:p,onClose:o,titleId:x,title:"Unlock actions",initialFocusRef:u,children:[t.jsxs("p",{className:e.body,children:[k??"This action mutates the fleet and requires the dispatch token."," It is held in memory only, for this browser tab, and is cleared automatically after 20 minutes idle."]}),t.jsxs("form",{onSubmit:v,className:e.form,noValidate:!0,children:[t.jsx("label",{htmlFor:m,className:e.label,children:h}),t.jsxs("div",{className:e.inputRow,children:[t.jsx("input",{ref:u,id:m,type:r?"text":"password",autoComplete:"off",autoCorrect:"off",spellCheck:!1,className:e.input,value:n,onChange:a=>i(a.target.value),"aria-invalid":l?!0:void 0,placeholder:"64 hex characters"}),t.jsx("button",{type:"button",className:e.reveal,onClick:()=>j(a=>!a),"aria-pressed":r,children:r?"Hide":"Show"})]}),l?t.jsx("p",{className:e.error,role:"alert",children:l}):null,t.jsxs("div",{className:e.actions,children:[t.jsx("button",{type:"button",className:e.cancel,onClick:o,children:"Cancel"}),t.jsx("button",{type:"submit",className:e.submit,disabled:n.trim().length===0,children:"Unlock"})]})]})]})}export{$ as M};
|
|
2
|
-
//# sourceMappingURL=MutationTokenDialog-DYF8n_RD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MutationTokenDialog-DYF8n_RD.js","sources":["../../../../../../src/web-ui/components/auth/MutationTokenDialog.tsx"],"sourcesContent":["/**\n * components/auth/MutationTokenDialog.tsx — replaces window.prompt() for\n * the mutation token (foundation brief item 5, the \"biggest reason\n * operators abandon the UI for the CLI\" finding). A focus-managed dialog\n * instead of a blocking native prompt, and a session-scoped hold (see\n * auth-store.ts) so approving 12 proposals is one paste, not twelve.\n *\n * The token is NEVER written to localStorage/sessionStorage/cookies — only\n * held in an in-memory module variable in auth-store.ts, cleared on tab\n * close, idle timeout, or the explicit \"Lock\" action here.\n */\nimport { useId, useRef, useState, type FormEvent } from 'react';\nimport { Dialog } from '../primitives/Dialog.js';\nimport { useMutationHold } from '../../data/hooks.js';\nimport styles from './MutationTokenDialog.module.css';\n\nconst TOKEN_RE = /^[a-f0-9]{64}$/;\n\nexport interface MutationTokenDialogProps {\n open: boolean;\n onClose: () => void;\n onUnlocked?: () => void;\n /** Human context for why the token is being requested right now. */\n reason?: string;\n /** Scoped consoles can name their own startup token without changing the hold. */\n tokenLabel?: string;\n tokenHelp?: string;\n}\n\nexport function MutationTokenDialog({ open, onClose, onUnlocked, reason, tokenLabel = 'Mutation token',\n tokenHelp = 'the mutation token ashlr serve printed' }: MutationTokenDialogProps) {\n const { setToken } = useMutationHold();\n const [value, setValue] = useState('');\n const [reveal, setReveal] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const titleId = useId();\n const inputId = useId();\n\n function submit(e: FormEvent) {\n e.preventDefault();\n const trimmed = value.trim();\n if (!TOKEN_RE.test(trimmed)) {\n setError(`Expected 64 hex characters — ${tokenHelp}.`);\n return;\n }\n setToken(trimmed);\n setValue('');\n setError(null);\n onClose();\n onUnlocked?.();\n }\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"Unlock actions\" initialFocusRef={inputRef}>\n <p className={styles.body}>\n {reason ?? 'This action mutates the fleet and requires the dispatch token.'} It is held in\n memory only, for this browser tab, and is cleared automatically after 20 minutes idle.\n </p>\n <form onSubmit={submit} className={styles.form} noValidate>\n <label htmlFor={inputId} className={styles.label}>\n {tokenLabel}\n </label>\n <div className={styles.inputRow}>\n <input\n ref={inputRef}\n id={inputId}\n type={reveal ? 'text' : 'password'}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n className={styles.input}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n aria-invalid={error ? true : undefined}\n placeholder=\"64 hex characters\"\n />\n <button\n type=\"button\"\n className={styles.reveal}\n onClick={() => setReveal((r) => !r)}\n aria-pressed={reveal}\n >\n {reveal ? 'Hide' : 'Show'}\n </button>\n </div>\n {error ? (\n <p className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n <div className={styles.actions}>\n <button type=\"button\" className={styles.cancel} onClick={onClose}>\n Cancel\n </button>\n <button type=\"submit\" className={styles.submit} disabled={value.trim().length === 0}>\n Unlock\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n"],"names":["TOKEN_RE","MutationTokenDialog","open","onClose","onUnlocked","reason","tokenLabel","tokenHelp","setToken","useMutationHold","value","setValue","useState","reveal","setReveal","error","setError","inputRef","useRef","titleId","useId","inputId","submit","e","trimmed","jsxs","Dialog","styles","jsx","r"],"mappings":"6aAgBMA,EAAW,iBAaV,SAASC,EAAoB,CAAE,KAAAC,EAAM,QAAAC,EAAS,WAAAC,EAAY,OAAAC,EAAQ,WAAAC,EAAa,iBACpF,UAAAC,EAAY,wCAAyC,EAA6B,CAClF,KAAM,CAAE,SAAAC,CAAA,EAAaC,EAAA,EACf,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,EAAE,EAC/B,CAACC,EAAQC,CAAS,EAAIF,EAAAA,SAAS,EAAK,EACpC,CAACG,EAAOC,CAAQ,EAAIJ,EAAAA,SAAwB,IAAI,EAChDK,EAAWC,EAAAA,OAAyB,IAAI,EACxCC,EAAUC,EAAAA,MAAA,EACVC,EAAUD,EAAAA,MAAA,EAEhB,SAASE,EAAOC,EAAc,CAC5BA,EAAE,eAAA,EACF,MAAMC,EAAUd,EAAM,KAAA,EACtB,GAAI,CAACV,EAAS,KAAKwB,CAAO,EAAG,CAC3BR,EAAS,gCAAgCT,CAAS,GAAG,EACrD,MACF,CACAC,EAASgB,CAAO,EAChBb,EAAS,EAAE,EACXK,EAAS,IAAI,EACbb,EAAA,EACAC,IAAA,CACF,CAEA,OACEqB,OAACC,GAAO,KAAAxB,EAAY,QAAAC,EAAkB,QAAAgB,EAAkB,MAAM,iBAAiB,gBAAiBF,EAC9F,SAAA,CAAAQ,EAAAA,KAAC,IAAA,CAAE,UAAWE,EAAO,KAClB,SAAA,CAAAtB,GAAU,iEAAiE,uGAAA,EAE9E,EACAoB,EAAAA,KAAC,QAAK,SAAUH,EAAQ,UAAWK,EAAO,KAAM,WAAU,GACxD,SAAA,CAAAC,MAAC,SAAM,QAASP,EAAS,UAAWM,EAAO,MACxC,SAAArB,EACH,EACAmB,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,SACrB,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,IAAKX,EACL,GAAII,EACJ,KAAMR,EAAS,OAAS,WACxB,aAAa,MACb,YAAY,MACZ,WAAY,GACZ,UAAWc,EAAO,MAClB,MAAAjB,EACA,SAAWa,GAAMZ,EAASY,EAAE,OAAO,KAAK,EACxC,eAAcR,EAAQ,GAAO,OAC7B,YAAY,mBAAA,CAAA,EAEda,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWD,EAAO,OAClB,QAAS,IAAMb,EAAWe,GAAM,CAACA,CAAC,EAClC,eAAchB,EAEb,WAAS,OAAS,MAAA,CAAA,CACrB,EACF,EACCE,QACE,IAAA,CAAE,UAAWY,EAAO,MAAO,KAAK,QAC9B,SAAAZ,CAAA,CACH,EACE,KACJU,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,QACrB,SAAA,CAAAC,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAWD,EAAO,OAAQ,QAASxB,EAAS,SAAA,QAAA,CAElE,EACAyB,EAAAA,IAAC,SAAA,CAAO,KAAK,SAAS,UAAWD,EAAO,OAAQ,SAAUjB,EAAM,KAAA,EAAO,SAAW,EAAG,SAAA,QAAA,CAErF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./index-CpgkRaTi.js";const r="_root_1lgxn_1",o="_spinner_1lgxn_9",n={root:r,spinner:o};function a({label:e="Refreshing"}){return s.jsxs("span",{className:n.root,role:"status","aria-live":"polite",children:[s.jsx("span",{className:n.spinner,"aria-hidden":"true"}),s.jsx("span",{className:"visually-hidden",children:e})]})}export{a as R};
|
|
2
|
-
//# sourceMappingURL=RefreshIndicator-DXJQXKyA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshIndicator-DXJQXKyA.js","sources":["../../../../../../src/web-ui/components/primitives/RefreshIndicator.tsx"],"sourcesContent":["/**\n * components/primitives/RefreshIndicator.tsx — the \"stale data, quietly\n * refreshing\" signal (foundation brief item 4: never blank the screen on\n * refresh). Pair with a QueryEntry's `status`:\n *\n * loading -> render a Skeleton instead of the view\n * refreshing -> render the view with data, plus <RefreshIndicator />\n * success -> render the view with data, no indicator\n * error -> render the view's error state\n */\nimport styles from './RefreshIndicator.module.css';\n\nexport function RefreshIndicator({ label = 'Refreshing' }: { label?: string }) {\n return (\n <span className={styles.root} role=\"status\" aria-live=\"polite\">\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className=\"visually-hidden\">{label}</span>\n </span>\n );\n}\n"],"names":["RefreshIndicator","label","jsxs","styles","jsx"],"mappings":"0GAYO,SAASA,EAAiB,CAAE,MAAAC,EAAQ,cAAoC,CAC7E,OACEC,OAAC,QAAK,UAAWC,EAAO,KAAM,KAAK,SAAS,YAAU,SACpD,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,QAAS,cAAY,OAAO,EACpDC,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAmB,SAAAH,CAAA,CAAM,CAAA,EAC3C,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._root_1lgxn_1{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px}._spinner_1lgxn_9{width:12px;height:12px;border-radius:var(--radius-full);border:2px solid var(--border-strong);border-top-color:var(--accent-500);animation:_spin_1lgxn_9 .7s linear infinite}@keyframes _spin_1lgxn_9{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._spinner_1lgxn_9{animation:none;border-top-color:var(--border-strong)}}:root[data-motion=reduce] ._spinner_1lgxn_9{animation:none;border-top-color:var(--border-strong)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._view_1an5o_3{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-5);min-width:0}._view_1an5o_3>*{min-width:0}._statusBar_1an5o_5{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-2) var(--space-5);padding-bottom:var(--space-3);border-bottom:1px solid var(--border-default);min-width:0}._sectionNav_1an5o_6{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1)}._sectionNav_1an5o_6 a{display:inline-flex;align-items:center;min-height:40px;padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);color:var(--text-secondary);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);text-decoration:none}._sectionNav_1an5o_6 a:hover{color:var(--text-link);background:var(--bg-hover)}._sectionNav_1an5o_6 a:focus-visible{color:var(--text-link);outline:2px solid var(--border-focus);outline-offset:2px}._detailSection_1an5o_10{display:grid;gap:var(--space-4);min-width:0;scroll-margin-top:var(--space-5)}._detailHeading_1an5o_11{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--space-2) var(--space-5);padding-top:var(--space-5);border-top:1px solid var(--border-default)}._detailHeading_1an5o_11 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-2xl-size);line-height:var(--text-2xl-line);letter-spacing:-.025em}._detailHeading_1an5o_11 p{color:var(--text-secondary);font-size:var(--text-sm-size);max-width:65ch}._detailSection_1an5o_10:focus-visible,._workspaceGrid_1an5o_14:focus-visible{outline:2px solid var(--border-focus);outline-offset:4px}._performanceScroll_1an5o_15{overflow-x:auto}._performanceScroll_1an5o_15:focus-visible{outline:2px solid var(--accent-500);outline-offset:-2px}._performanceTable_1an5o_17{width:100%;border-collapse:collapse;font-size:var(--text-sm-size);font-variant-numeric:tabular-nums}._performanceTable_1an5o_17 caption{text-align:left;padding:0 var(--space-5) var(--space-3);font-size:var(--text-xs-size);color:var(--text-secondary)}._performanceTable_1an5o_17 th,._performanceTable_1an5o_17 td{text-align:left;vertical-align:top;padding:var(--space-3);border-top:1px solid var(--border-subtle)}._performanceTable_1an5o_17 th:first-child,._performanceTable_1an5o_17 td:first-child{padding-left:var(--space-5)}._performanceTable_1an5o_17 th:last-child,._performanceTable_1an5o_17 td:last-child{padding-right:var(--space-5)}._performanceTable_1an5o_17 thead th{font-size:var(--text-xs-size);color:var(--text-secondary);font-weight:var(--font-weight-medium)}._performanceTable_1an5o_17 tbody th{font-weight:var(--font-weight-medium);min-width:150px;max-width:220px}._performanceTable_1an5o_17 td{min-width:105px}._performanceTable_1an5o_17 small{display:block;font-size:var(--text-xs-size);color:var(--text-secondary);margin-top:var(--space-1);font-weight:var(--font-weight-normal);overflow-wrap:anywhere}._performanceWorker_1an5o_26{color:var(--text-link);text-align:left;min-height:30px;overflow-wrap:anywhere}._performanceWorker_1an5o_26:hover{text-decoration:underline}._pageHeading_1an5o_28{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-4)}._pageHeading_1an5o_28 h1{font-family:var(--font-display, var(--font-ui));font-size:var(--text-3xl-size);line-height:var(--text-3xl-line);letter-spacing:-.035em}._pageHeading_1an5o_28 p,._sectionHeading_1an5o_30 p{color:var(--text-secondary);margin-top:var(--space-1);max-width:70ch}._headerActions_1an5o_31,._inline_1an5o_31{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2)}._primaryButton_1an5o_32,._secondaryButton_1an5o_32{min-height:38px;border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);border:1px solid var(--border-default)}._primaryButton_1an5o_32{background:var(--accent-600);color:var(--accent-contrast);border-color:var(--accent-600)}._primaryButton_1an5o_32:hover{background:var(--accent-700)}._secondaryButton_1an5o_32{background:var(--bg-surface)}._secondaryButton_1an5o_32:hover{background:var(--bg-hover)}._view_1an5o_3 button:disabled{opacity:.5;cursor:not-allowed}._freshness_1an5o_38{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);color:var(--text-secondary);font-size:var(--text-xs-size);min-width:0;overflow-wrap:anywhere}._freshness_1an5o_38 strong{color:var(--text-primary)}._notice_1an5o_40,._actionNotice_1an5o_40{padding:var(--space-4);border-radius:var(--radius-sm);line-height:var(--text-base-line)}._notice_1an5o_40{border:1px solid var(--status-warning-solid);background:var(--status-warning-bg)}._notice_1an5o_40 p{margin-top:var(--space-1);max-width:90ch}._actionNotice_1an5o_40{background:var(--status-info-bg);color:var(--status-info-fg)}._loading_1an5o_44{display:grid;gap:var(--space-4);padding:var(--space-6)}._supervisor_1an5o_45{display:flex;flex-wrap:wrap;gap:var(--space-3);align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);background:var(--bg-surface);border:1px solid var(--border-default);border-left:3px solid var(--accent-500);border-radius:var(--radius-sm);min-width:0}._supervisor_1an5o_45 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-md-size);line-height:var(--text-md-line)}._supervisor_1an5o_45 p{color:var(--text-secondary);margin-top:var(--space-1);font-size:var(--text-sm-size);overflow-wrap:anywhere}._ownedStrip_1an5o_48{flex-basis:100%;min-width:0;border-top:1px solid var(--border-default);padding-top:var(--space-3);display:grid;gap:var(--space-2)}._ownedHeading_1an5o_49{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-1) var(--space-3)}._ownedHeading_1an5o_49 h3{font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold)}._ownedHeading_1an5o_49>span{font-size:var(--text-xs-size);color:var(--text-secondary)}._ownedTasks_1an5o_52{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:var(--space-2)}._ownedTask_1an5o_52{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-1) var(--space-2);align-items:center;width:100%;min-height:48px;text-align:left;padding:var(--space-2) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas)}._ownedTask_1an5o_52 strong{font-size:var(--text-sm-size);overflow-wrap:anywhere}._ownedTask_1an5o_52>span:nth-child(2){grid-column:1;font-size:var(--text-xs-size);color:var(--text-secondary);overflow-wrap:anywhere}._ownedTask_1an5o_52>span:last-child{grid-column:2;grid-row:1 / 3}._ownedTask_1an5o_52:hover{background:var(--bg-hover)}._ownedTask_1an5o_52[aria-pressed=true]{border-color:var(--accent-500);background:var(--bg-selected)}._showOwned_1an5o_59{justify-self:start;color:var(--text-link);font-size:var(--text-sm-size);min-height:32px}._workspaceGrid_1an5o_14{display:grid;grid-template-columns:minmax(0,1fr) minmax(310px,360px);gap:var(--space-5);align-items:start;min-width:0;scroll-margin-top:var(--space-5)}._mainColumn_1an5o_61{display:grid;gap:var(--space-5);min-width:0}._sideColumn_1an5o_62{position:sticky;top:var(--space-5);max-height:calc(100dvh - 2 * var(--space-5));border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-surface);min-width:0;overflow:auto;scrollbar-gutter:stable}._tabs_1an5o_63{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid var(--border-default)}._tabs_1an5o_63 button{padding:var(--space-3);font-size:var(--text-sm-size);min-height:44px}._tabs_1an5o_63 button[aria-pressed=true]{box-shadow:inset 0 -2px var(--accent-500);color:var(--text-link);background:var(--bg-selected);font-weight:var(--font-weight-semibold)}._board_1an5o_66,._tasks_1an5o_66{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);overflow:hidden;min-width:0}._sectionHeading_1an5o_30{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-3);padding:var(--space-5)}._sectionHeading_1an5o_30 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-xl-size);line-height:var(--text-xl-line);letter-spacing:-.02em;overflow-wrap:anywhere}._sectionHeading_1an5o_30 p{font-size:var(--text-sm-size)}._preview_1an5o_70{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-3) var(--space-5);border-block:1px solid var(--border-default);background:var(--bg-selected)}._preview_1an5o_70 small{color:var(--text-secondary);font-size:var(--text-xs-size);margin-left:auto}._routeDot_1an5o_72{width:8px;height:8px;border-radius:var(--radius-full);background:var(--accent-500);flex-shrink:0}._capacityLane_1an5o_73{display:grid;grid-template-columns:minmax(145px,.7fr) minmax(0,1.6fr);padding:var(--space-5);border-bottom:1px solid var(--border-subtle);gap:var(--space-6);align-items:center}._capacitySource_1an5o_74{position:relative;min-width:0}._capacitySource_1an5o_74 h3{font-size:var(--text-md-size);line-height:var(--text-md-line);overflow-wrap:anywhere;margin-bottom:var(--space-2)}._sourceGlyph_1an5o_76{display:inline-flex;width:30px;height:30px;justify-content:center;align-items:center;border:1px solid var(--border-strong);border-radius:var(--radius-sm);color:var(--text-link);margin-bottom:var(--space-2);font-size:var(--text-xl-size)}._slotCount_1an5o_77{margin-bottom:var(--space-1);font-size:var(--text-sm-size)}._slotCount_1an5o_77 strong{font-size:var(--text-xl-size);font-weight:var(--font-weight-semibold)}._workerLanes_1an5o_79{display:grid;gap:var(--space-3);position:relative;min-width:0}._workerLanes_1an5o_79:before{content:"";position:absolute;left:calc(-1 * var(--space-3));top:50%;width:var(--space-3);border-top:2px solid var(--border-strong)}._workerLane_1an5o_79{position:relative;min-width:0}._workerLane_1an5o_79:before{content:"";position:absolute;left:calc(-1 * var(--space-3));width:var(--space-3);height:calc(100% + var(--space-3));top:calc(-1 * var(--space-3));border-left:2px solid var(--border-strong);pointer-events:none}._workerLane_1an5o_79:first-child:before{top:50%;height:calc(50% + var(--space-3))}._workerLane_1an5o_79:last-child:before{height:calc(50% + var(--space-3))}._workerLane_1an5o_79:only-child:before{display:none}._workerLane_1an5o_79:after{content:"";position:absolute;left:calc(-1 * var(--space-3));top:50%;width:var(--space-3);border-top:2px solid var(--border-strong);pointer-events:none}._workerButton_1an5o_87{width:100%;text-align:left;display:grid;gap:var(--space-1);padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas);min-width:0}._workerButton_1an5o_87:hover,._taskRow_1an5o_88:hover{background:var(--bg-hover)}._workerButton_1an5o_87[aria-pressed=true],._taskRow_1an5o_88[aria-pressed=true]{border-color:var(--accent-500);box-shadow:inset 3px 0 var(--accent-500);background:var(--bg-selected)}._nextWorker_1an5o_90{border-color:var(--accent-300)}._workerHeading_1an5o_91{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);flex-wrap:wrap}._workerHeading_1an5o_91 strong{font-size:var(--text-md-size);overflow-wrap:anywhere}._workerButton_1an5o_87 span{overflow-wrap:anywhere}._muted_1an5o_94{color:var(--text-secondary);font-size:var(--text-sm-size)}._caption_1an5o_95{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin-top:var(--space-1)}._occupied_1an5o_96{color:var(--status-running-fg);font-size:var(--text-xs-size);margin-top:var(--space-1)}._warning_1an5o_97{color:var(--status-warning-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line);margin-top:var(--space-2)}._boardNote_1an5o_98{padding:var(--space-3) var(--space-5);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);border-top:1px solid var(--border-subtle)}._inspector_1an5o_99{padding:var(--space-5);display:grid;gap:var(--space-4)}._inspector_1an5o_99>._sectionHeading_1an5o_30{padding:0}._inspectionTarget_1an5o_101 [data-inspector-heading]{scroll-margin-block:var(--space-5)}._inspectionTarget_1an5o_101 [data-inspector-heading]:focus{outline:2px solid var(--accent-500);outline-offset:4px;border-radius:var(--radius-xs)}._inspector_1an5o_99 h3{font-size:var(--text-lg-size)}._facts_1an5o_104{display:grid;gap:var(--space-3);margin:0;font-size:var(--text-sm-size)}._facts_1an5o_104>div{display:grid;grid-template-columns:minmax(110px,.9fr) minmax(0,1.1fr);gap:var(--space-3)}._facts_1an5o_104 dt{color:var(--text-secondary)}._facts_1an5o_104 dd{margin:0;overflow-wrap:anywhere}._routeNote_1an5o_108{padding:var(--space-3);background:var(--status-info-bg);color:var(--status-info-fg);border-radius:var(--radius-sm);font-size:var(--text-sm-size)}._reasonList_1an5o_109{list-style:disc;padding-left:var(--space-4);color:var(--status-warning-fg);font-size:var(--text-sm-size)}._reasonList_1an5o_109 li+li{margin-top:var(--space-1)}._quotaEvidence_1an5o_111,._windows_1an5o_112{display:grid;gap:var(--space-4)}._windowTitle_1an5o_113{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--space-1) var(--space-2);justify-content:space-between;font-size:var(--text-xs-size)}._windowTitle_1an5o_113 strong{font-weight:var(--font-weight-semibold);overflow-wrap:anywhere}._meter_1an5o_115{width:100%;height:10px;display:block;margin-top:var(--space-2);accent-color:var(--accent-500)}._meter_1an5o_115::-webkit-meter-bar{background:var(--bg-active);border:0;border-radius:var(--radius-xs)}._meter_1an5o_115::-webkit-meter-optimum-value{background:var(--accent-500);border-radius:var(--radius-xs)}._meter_1an5o_115::-moz-meter-bar{background:var(--accent-500)}._unknownMeter_1an5o_119{height:5px;margin-block:var(--space-2);border:1px dashed var(--status-unknown-solid);border-radius:var(--radius-xs);background:var(--status-unknown-bg)}._workspace_1an5o_14{font-size:var(--text-xs-size);color:var(--text-secondary)}._workspace_1an5o_14 code{display:block;color:var(--text-primary);overflow-wrap:anywhere;margin-top:var(--space-1)}._composer_1an5o_122{display:grid;gap:var(--space-4)}._composer_1an5o_122 label{display:grid;gap:var(--space-2);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._composer_1an5o_122 input,._composer_1an5o_122 textarea,._composer_1an5o_122 select,._filter_1an5o_124 select{width:100%;min-width:0;min-height:38px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:var(--space-2);background:var(--bg-input);color:var(--text-primary)}._composer_1an5o_122 textarea{resize:vertical;line-height:var(--text-base-line)}._composer_1an5o_122 fieldset{border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:var(--space-3);margin:0;min-width:0}._composer_1an5o_122 legend{padding-inline:var(--space-1);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._workerChoices_1an5o_128{display:grid;gap:var(--space-2);margin-top:var(--space-3)}._workerChoices_1an5o_128 label{display:flex;align-items:center;gap:var(--space-2);overflow-wrap:anywhere}._workerChoices_1an5o_128 input{width:16px;min-height:16px;height:16px;flex-shrink:0;accent-color:var(--accent-600)}._fieldPair_1an5o_131{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)}._filter_1an5o_124{display:grid;gap:var(--space-1);font-size:var(--text-xs-size);min-width:130px}._taskRows_1an5o_133{display:grid}._taskRow_1an5o_88{display:grid;grid-template-columns:minmax(0,1fr) minmax(100px,.6fr) auto;align-items:center;text-align:left;gap:var(--space-3);border:1px solid transparent;border-top-color:var(--border-subtle);padding:var(--space-3) var(--space-5);width:100%}._taskRow_1an5o_88 strong,._taskWorker_1an5o_135{overflow-wrap:anywhere;font-size:var(--text-sm-size)}._taskRow_1an5o_88 small{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);margin-top:var(--space-1)}._taskWorker_1an5o_135{color:var(--text-secondary)}._empty_1an5o_138{padding:var(--space-6);display:grid;gap:var(--space-2)}._empty_1an5o_138 h2,._empty_1an5o_138 h3{font-size:var(--text-lg-size)}._empty_1an5o_138 p{color:var(--text-secondary);max-width:60ch;font-size:var(--text-sm-size)}._accounting_1an5o_141{display:grid;gap:var(--space-2);padding:var(--space-4) var(--space-1);min-width:0;overflow-wrap:anywhere}._accounting_1an5o_141 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-lg-size)}._outputSection_1an5o_143{display:grid;gap:var(--space-3)}._output_1an5o_143{white-space:pre-wrap;overflow-wrap:anywhere;max-height:440px;overflow:auto;background:var(--bg-code);border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:var(--space-3);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin:0}@media(max-width:1100px){._workspaceGrid_1an5o_14{grid-template-columns:minmax(0,1fr);gap:var(--space-4)}._sideColumn_1an5o_62{position:static;max-height:none;scrollbar-gutter:auto}._capacityLane_1an5o_73{grid-template-columns:130px minmax(0,1fr);padding:var(--space-4);gap:var(--space-4)}._preview_1an5o_70 small{margin-left:0;flex-basis:100%}}@media(max-width:800px){._pageHeading_1an5o_28{flex-direction:column}._pageHeading_1an5o_28 h1{font-size:var(--text-2xl-size);line-height:var(--text-2xl-line)}._view_1an5o_3{gap:var(--space-4)}._statusBar_1an5o_5{align-items:flex-start}}@media(max-width:450px){._capacityLane_1an5o_73{grid-template-columns:1fr;gap:var(--space-4)}._workerLanes_1an5o_79{margin-left:var(--space-3)}._capacitySource_1an5o_74{padding-left:var(--space-1)}._workerLanes_1an5o_79:before{top:calc(-1 * var(--space-4));height:var(--space-4);border-left:2px solid var(--border-strong);border-top:0}._taskRow_1an5o_88{grid-template-columns:minmax(0,1fr) auto;padding:var(--space-3)}._taskWorker_1an5o_135{grid-column:1;grid-row:2}._taskRow_1an5o_88>span:last-child{grid-column:2;grid-row:1 / 3}._sectionHeading_1an5o_30{padding:var(--space-4);flex-wrap:wrap}._inspector_1an5o_99{padding:var(--space-4)}._facts_1an5o_104>div{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}@media(max-width:450px){._headerActions_1an5o_31{width:100%}._headerActions_1an5o_31 button{flex:1 1 auto}._sectionNav_1an5o_6{width:100%;justify-content:space-between}._sectionNav_1an5o_6 a{padding-inline:var(--space-2)}._fieldPair_1an5o_131{grid-template-columns:minmax(0,1fr)}._detailHeading_1an5o_11{padding-top:var(--space-3)}}._returnToMap_1an5o_149{align-self:flex-start;margin:var(--space-3) var(--space-4) 0;padding:var(--space-2);color:var(--accent-600);background:transparent;border:0;border-radius:var(--radius-xs);font:inherit;font-size:var(--text-sm-size);cursor:pointer}._returnToMap_1an5o_149:hover{text-decoration:underline}._returnToMap_1an5o_149:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}._collectorNotice_1an5o_152{display:grid;justify-items:start;gap:var(--space-2);margin:0 var(--space-5) var(--space-4);padding:var(--space-3);border-left:3px solid var(--border-strong);background:var(--bg-canvas);min-width:0;overflow-wrap:anywhere}._collectorNotice_1an5o_152 p{margin:0;max-width:78ch;font-size:var(--text-sm-size);color:var(--text-secondary)}._recoveryDetail_1an5o_154{display:grid;gap:var(--space-2);max-width:78ch;min-width:0}._recoveryDetail_1an5o_154 h3{margin:0;color:var(--text-primary);font-family:var(--font-display);font-size:var(--text-base-size);line-height:var(--text-base-line)}._recoveryDetail_1an5o_154 summary{width:fit-content;padding-block:var(--space-2);color:var(--text-link);font-size:var(--text-sm-size);cursor:pointer}._recoveryDetail_1an5o_154 summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}._recoveryDetail_1an5o_154 details p+p{margin-top:var(--space-2)}._panel_13cxn_1{border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);overflow:hidden}._heading_13cxn_2{display:flex;align-items:start;justify-content:space-between;gap:var(--space-4);padding:var(--space-4) var(--space-5)}._heading_13cxn_2 h2{margin:0;font-size:var(--text-lg-size);font-weight:var(--font-weight-semibold)}._heading_13cxn_2 p,._refresh_13cxn_4,._note_13cxn_4,._empty_13cxn_4{color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._heading_13cxn_2 p{margin:var(--space-1) 0 0}._refresh_13cxn_4{text-align:right}._accounts_13cxn_7{list-style:none;margin:0;padding:0}._account_13cxn_7{display:grid;grid-template-columns:minmax(200px,1fr) minmax(260px,1.7fr) minmax(160px,.75fr);gap:var(--space-5);padding:var(--space-5);border-top:1px solid var(--border-subtle)}._account_13cxn_7>div{min-width:0}._identity_13cxn_10 h3{font-size:var(--text-md-size);font-weight:var(--font-weight-semibold);margin:0 0 var(--space-1);overflow-wrap:anywhere}._identity_13cxn_10 p,._connection_13cxn_11 p,._window_13cxn_11 p{margin:var(--space-2) 0 0;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary)}._adapter_13cxn_12{display:block;margin-top:var(--space-3);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._caption_13cxn_13{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin-bottom:var(--space-2)}._badges_13cxn_14{display:flex;flex-wrap:wrap;gap:var(--space-2)}._connection_13cxn_11 ._warning_13cxn_15{color:var(--status-warning-fg)}._connection_13cxn_11{margin-top:var(--space-4)}._window_13cxn_11+._window_13cxn_11{margin-top:var(--space-3)}._windowHeading_13cxn_18{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:var(--space-2);font-size:var(--text-sm-size);overflow-wrap:anywhere}._window_13cxn_11 strong{font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);font-variant-numeric:tabular-nums}._track_13cxn_20{position:relative;margin-top:var(--space-2)}._meter_13cxn_21{display:block;width:100%;height:16px;margin:0;accent-color:var(--accent-500)}._meter_13cxn_21::-webkit-meter-bar{background:var(--bg-active);border:0;border-radius:var(--radius-xs)}._meter_13cxn_21::-webkit-meter-optimum-value{background:var(--accent-500);border-radius:var(--radius-xs)}._meter_13cxn_21::-moz-meter-bar{background:var(--accent-500)}._meter_13cxn_21[data-historical=true]{accent-color:var(--status-neutral-solid)}._meter_13cxn_21[data-historical=true]::-webkit-meter-optimum-value{background:var(--status-neutral-solid)}._meter_13cxn_21[data-historical=true]::-moz-meter-bar{background:var(--status-neutral-solid)}._track_13cxn_20[data-over-reference=true] ._meter_13cxn_21{accent-color:var(--status-warning-solid)}._track_13cxn_20[data-over-reference=true] ._meter_13cxn_21::-webkit-meter-optimum-value{background:var(--status-warning-solid)}._track_13cxn_20[data-over-reference=true] ._meter_13cxn_21::-moz-meter-bar{background:var(--status-warning-solid)}._referenceRegion_13cxn_31{position:absolute;top:3px;bottom:3px;pointer-events:none;background:repeating-linear-gradient(135deg,transparent,transparent 3px,var(--border-strong) 3px,var(--border-strong) 4px);opacity:.65}._referenceTick_13cxn_32{position:absolute;top:0;bottom:0;border-left:2px solid var(--text-primary);transform:translate(-1px);pointer-events:none}._referenceLegend_13cxn_33{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-4);padding:var(--space-3) var(--space-5);background:var(--bg-canvas);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._referenceLegend_13cxn_33 strong{font-weight:var(--font-weight-medium);color:var(--text-primary)}._legendTick_13cxn_35{height:14px;border-left:2px solid var(--text-primary)}._window_13cxn_11 ._overReference_13cxn_36{color:var(--status-warning-fg);font-weight:var(--font-weight-medium)}._window_13cxn_11 ._comparison_13cxn_37{color:var(--text-secondary)}._window_13cxn_11 ._quotaAction_13cxn_38{color:var(--text-primary);margin-top:var(--space-3)}._quotas_13cxn_39>._quotaAction_13cxn_38{color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line);margin:0 0 var(--space-3)}._unknownMeter_13cxn_40{height:5px;margin-block:var(--space-2);border:1px dashed var(--status-unknown-solid);background:var(--status-unknown-bg)}._freshness_13cxn_41 dl{margin:var(--space-3) 0 0;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary)}._freshness_13cxn_41 dl>div+div{margin-top:var(--space-2)}._freshness_13cxn_41 dt{font-weight:var(--font-weight-medium)}._freshness_13cxn_41 dd{margin:var(--space-1) 0 0;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}._note_13cxn_4{border-top:1px solid var(--border-subtle);margin:0;padding:var(--space-3) var(--space-5);background:var(--bg-canvas)}._empty_13cxn_4{padding:0 var(--space-5) var(--space-3)}@media(max-width:1050px){._account_13cxn_7{grid-template-columns:minmax(0,1fr) minmax(0,1.5fr);gap:var(--space-4)}._freshness_13cxn_41{grid-column:1 / -1}._freshness_13cxn_41 dl{display:flex;gap:var(--space-5)}._freshness_13cxn_41 dl>div+div{margin-top:0}}@media(max-width:540px){._heading_13cxn_2{flex-direction:column;gap:var(--space-2)}._refresh_13cxn_4{text-align:left}._account_13cxn_7{grid-template-columns:minmax(0,1fr)}._freshness_13cxn_41 dl{flex-wrap:wrap}}._panel_tq0rj_1{border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:var(--space-5);background:var(--bg-surface)}._heading_tq0rj_2{display:flex;justify-content:space-between;gap:var(--space-4)}._heading_tq0rj_2 h2{margin:0;font-size:var(--text-lg-size);font-weight:var(--font-weight-semibold)}._heading_tq0rj_2 p,._saved_tq0rj_4,._note_tq0rj_4,._warning_tq0rj_4,._conflict_tq0rj_4{font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._heading_tq0rj_2 p{margin:var(--space-1) 0 0;color:var(--text-secondary)}._saved_tq0rj_4{display:grid;align-content:start;gap:var(--space-1);text-align:right}._saved_tq0rj_4 strong{font-weight:var(--font-weight-medium)}._saved_tq0rj_4 span{color:var(--text-secondary);font-size:var(--text-xs-size)}._controls_tq0rj_9{display:flex;align-items:center;gap:var(--space-5);margin-top:var(--space-5)}._sliderArea_tq0rj_10{flex:1;min-width:180px}._sliderHeading_tq0rj_11{display:flex;justify-content:space-between;gap:var(--space-3);font-size:var(--text-sm-size)}._sliderHeading_tq0rj_11 output{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap}._sliderHeading_tq0rj_11 output span{font-family:var(--font-ui);color:var(--text-secondary);font-size:var(--text-xs-size)}._sliderArea_tq0rj_10 input{display:block;width:100%;margin:var(--space-2) 0;min-height:28px;accent-color:var(--accent-500)}._sliderArea_tq0rj_10 input:focus-visible,._save_tq0rj_4:focus-visible,._conflict_tq0rj_4 button:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._rangeLabels_tq0rj_16{display:flex;justify-content:space-between;font-size:var(--text-xs-size);color:var(--text-secondary)}._remainder_tq0rj_17{display:grid;gap:var(--space-1);border-left:1px solid var(--border-default);padding-left:var(--space-5)}._remainder_tq0rj_17 strong{font-size:var(--text-2xl-size);font-family:var(--font-mono);font-weight:var(--font-weight-medium);font-variant-numeric:tabular-nums}._remainder_tq0rj_17 span{font-size:var(--text-xs-size);color:var(--text-secondary)}._save_tq0rj_4,._conflict_tq0rj_4 button{min-height:36px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);cursor:pointer;font:inherit;font-size:var(--text-sm-size)}._save_tq0rj_4{background:var(--accent-600);color:var(--accent-contrast);border-color:var(--accent-600)}._conflict_tq0rj_4 button{background:var(--bg-surface);color:var(--text-primary)}._save_tq0rj_4:disabled,._conflict_tq0rj_4 button:disabled{opacity:.5;cursor:not-allowed}._note_tq0rj_4{margin:var(--space-4) 0 0;color:var(--text-secondary)}._warning_tq0rj_4{margin:var(--space-3) 0 0;color:var(--status-warning-fg)}._conflict_tq0rj_4{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);margin-top:var(--space-4);padding:var(--space-3);background:var(--status-warning-bg);color:var(--status-warning-fg);border-radius:var(--radius-sm)}._conflict_tq0rj_4 p{margin:0}@media(max-width:800px){._heading_tq0rj_2{flex-direction:column}._saved_tq0rj_4{text-align:left}._controls_tq0rj_9{flex-wrap:wrap}._sliderArea_tq0rj_10{flex-basis:100%}._remainder_tq0rj_17{border:0;padding:0;flex:1}}@media(max-width:540px){._conflict_tq0rj_4{align-items:start;flex-direction:column}._sliderHeading_tq0rj_11{flex-wrap:wrap}}._panel_thwgk_1{border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:var(--space-5);background:var(--bg-surface);min-width:0}._heading_thwgk_2{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--space-3) var(--space-5)}._heading_thwgk_2 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-lg-size);font-weight:var(--font-weight-semibold)}._heading_thwgk_2 p,._note_thwgk_4,._warning_thwgk_4,._notice_thwgk_4,._conflict_thwgk_4{font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._heading_thwgk_2 p{margin-top:var(--space-1);color:var(--text-secondary)}._saved_thwgk_6{font-size:var(--text-sm-size);text-align:right}._saved_thwgk_6 small{display:block;color:var(--text-secondary);margin-top:var(--space-1);font-size:var(--text-xs-size)}._workers_thwgk_8{margin-top:var(--space-4);border-block:1px solid var(--border-default)}._worker_thwgk_8{display:grid;grid-template-columns:auto minmax(0,1fr) minmax(120px,auto);align-items:center;gap:var(--space-3);min-height:68px;padding:var(--space-3) 0}._worker_thwgk_8+._worker_thwgk_8{border-top:1px solid var(--border-subtle)}._worker_thwgk_8 input{width:18px;height:18px;accent-color:var(--accent-500)}._worker_thwgk_8 input:focus-visible,._save_thwgk_6:focus-visible,._conflict_thwgk_4 button:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._identity_thwgk_13{min-width:0;overflow-wrap:anywhere}._identity_thwgk_13 strong{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._identity_thwgk_13 small{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);margin-top:var(--space-1)}._state_thwgk_16{font-size:var(--text-xs-size);color:var(--text-secondary);text-align:right;overflow-wrap:anywhere}._effective_thwgk_17{display:block;max-width:40ch;font-weight:var(--font-weight-medium);color:var(--status-warning-fg);margin-top:var(--space-1)}._actions_thwgk_18{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-3)}._note_thwgk_4{color:var(--text-secondary);margin-top:var(--space-3);max-width:78ch}._actions_thwgk_18 ._note_thwgk_4{margin-top:0}._save_thwgk_6,._conflict_thwgk_4 button{min-height:38px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);font:inherit;font-size:var(--text-sm-size)}._save_thwgk_6{background:var(--accent-600);color:var(--accent-contrast);border-color:var(--accent-600)}._conflict_thwgk_4 button{background:var(--bg-surface);color:var(--text-primary)}._save_thwgk_6:disabled,._conflict_thwgk_4 button:disabled,._worker_thwgk_8 input:disabled{opacity:.5;cursor:not-allowed}._warning_thwgk_4{color:var(--status-warning-fg);margin-top:var(--space-3)}._notice_thwgk_4{color:var(--status-info-fg);margin-top:var(--space-3)}._conflict_thwgk_4{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:var(--space-3);margin-top:var(--space-3);padding:var(--space-3);background:var(--status-warning-bg);color:var(--status-warning-fg);border-radius:var(--radius-sm)}@media(max-width:600px){._saved_thwgk_6{text-align:left}._worker_thwgk_8{grid-template-columns:auto minmax(0,1fr);gap:var(--space-2) var(--space-3)}._state_thwgk_16{grid-column:2;text-align:left}._panel_thwgk_1{padding:var(--space-4)}}._panel_sy6n3_1{min-width:0;padding:var(--space-5);border-inline-start:3px solid var(--accent-500);background:var(--bg-surface)}._heading_sy6n3_2{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--space-3) var(--space-5)}._heading_sy6n3_2 h2{font-family:var(--font-display, var(--font-ui));font-size:var(--text-lg-size);font-weight:var(--font-weight-semibold)}._heading_sy6n3_2 p,._note_sy6n3_4,._warning_sy6n3_4,._notice_sy6n3_4,._conflict_sy6n3_4{font-size:var(--text-sm-size);line-height:var(--text-sm-line);max-width:78ch}._heading_sy6n3_2 p{color:var(--text-secondary);margin-top:var(--space-1)}._saved_sy6n3_6{font-size:var(--text-sm-size);text-align:right}._saved_sy6n3_6 small,._identity_sy6n3_7 small{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);margin-top:var(--space-1)}._rows_sy6n3_8{margin-top:var(--space-4);border-block:1px solid var(--border-default)}._row_sy6n3_8{display:grid;grid-template-columns:auto minmax(0,1fr) minmax(120px,1fr);align-items:center;gap:var(--space-3);padding:var(--space-3) 0;min-height:68px}._row_sy6n3_8+._row_sy6n3_8{border-top:1px solid var(--border-subtle)}._row_sy6n3_8 input{width:18px;height:18px;accent-color:var(--accent-500)}._identity_sy6n3_7,._state_sy6n3_12{min-width:0;overflow-wrap:anywhere}._identity_sy6n3_7 strong{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._state_sy6n3_12{text-align:right;font-size:var(--text-xs-size);color:var(--text-secondary)}._state_sy6n3_12 strong{display:block;font-weight:var(--font-weight-medium);color:var(--status-warning-fg);margin-top:var(--space-1)}._actions_sy6n3_16{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--space-3);margin-top:var(--space-3)}._note_sy6n3_4{color:var(--text-secondary);margin-top:var(--space-3)}._actions_sy6n3_16 ._note_sy6n3_4{margin-top:0}._save_sy6n3_6,._conflict_sy6n3_4 button{min-height:38px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);font:inherit;font-size:var(--text-sm-size)}._save_sy6n3_6{background:var(--accent-600);color:var(--accent-contrast);border-color:var(--accent-600)}._conflict_sy6n3_4 button{background:var(--bg-surface);color:var(--text-primary)}._save_sy6n3_6:disabled,._conflict_sy6n3_4 button:disabled,._row_sy6n3_8 input:disabled{opacity:.5;cursor:not-allowed}._row_sy6n3_8 input:focus-visible,._save_sy6n3_6:focus-visible,._conflict_sy6n3_4 button:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._warning_sy6n3_4{color:var(--status-warning-fg);margin-top:var(--space-3)}._notice_sy6n3_4{color:var(--status-info-fg);margin-top:var(--space-3)}._conflict_sy6n3_4{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3);margin-top:var(--space-3);padding:var(--space-3);background:var(--status-warning-bg);color:var(--status-warning-fg);border-radius:var(--radius-sm)}@media(max-width:600px){._panel_sy6n3_1{padding:var(--space-4)}._saved_sy6n3_6{text-align:left}._row_sy6n3_8{grid-template-columns:auto minmax(0,1fr)}._state_sy6n3_12{grid-column:2;text-align:left}}._fleetMap_pb3nh_1{--trunk-width: 192px;--branch-gap: 36px;container-type:inline-size;min-width:0;overflow:hidden;border:1px solid var(--border-strong);border-radius:var(--radius-lg);background:var(--bg-surface);color:var(--text-primary)}._header_pb3nh_2{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-6);padding:var(--space-6) var(--space-6) var(--space-4)}._header_pb3nh_2 h2{margin:0 0 var(--space-2);font-family:var(--font-display, var(--font-ui));font-size:var(--text-2xl-size);line-height:var(--text-2xl-line);letter-spacing:-.035em}._header_pb3nh_2 p,._railHeader_pb3nh_4 p{margin:0;color:var(--text-secondary);line-height:1.5;max-width:75ch}._sample_pb3nh_5{display:grid;justify-items:end;flex-shrink:0;gap:var(--space-2);font-size:var(--text-xs-size);color:var(--text-tertiary)}._summary_pb3nh_6{display:flex;flex-wrap:wrap;gap:var(--space-3) var(--space-6);padding:0 var(--space-6) var(--space-5);font-size:var(--text-sm-size);color:var(--text-secondary);font-variant-numeric:tabular-nums}._summary_pb3nh_6 strong{color:var(--text-primary);font-family:var(--font-display, var(--font-ui));font-size:var(--text-lg-size);font-weight:var(--font-weight-semibold)}._evidenceNotice_pb3nh_8{margin:0;padding:var(--space-3) var(--space-6);background:var(--status-unknown-bg);color:var(--status-unknown-fg);font-size:var(--text-sm-size);line-height:1.5}._toolbar_pb3nh_9{display:flex;align-items:end;justify-content:space-between;flex-wrap:wrap;gap:var(--space-4);padding:var(--space-4) var(--space-6);background:var(--bg-canvas);border-block:1px solid var(--border-default)}._search_pb3nh_10{display:grid;flex:1 1 260px;max-width:440px;min-width:0;gap:var(--space-2)}._search_pb3nh_10 label{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._search_pb3nh_10 input{width:100%;min-width:0;box-sizing:border-box;padding:10px var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font:inherit;font-size:var(--text-sm-size)}._search_pb3nh_10 input::placeholder{color:var(--text-tertiary)}._workerPaging_pb3nh_14{display:grid;gap:var(--space-2);justify-items:end;font-size:var(--text-xs-size);color:var(--text-secondary)}._pager_pb3nh_15{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2);font-size:var(--text-xs-size);font-variant-numeric:tabular-nums}._pager_pb3nh_15 button{padding:6px 10px;min-height:32px;border:1px solid var(--border-strong);border-radius:var(--radius-xs);color:var(--text-primary);background:var(--bg-surface);font:inherit;cursor:pointer}._pager_pb3nh_15 button:disabled{color:var(--text-disabled);cursor:default}._pager_pb3nh_15 button:not(:disabled):hover{background:var(--bg-hover)}._laneHeadings_pb3nh_19{display:grid;grid-template-columns:var(--trunk-width) minmax(0,1fr) minmax(0,1.12fr);gap:var(--branch-gap);padding:var(--space-4) var(--space-6) var(--space-3);border-bottom:1px solid var(--border-subtle);font-size:var(--text-xs-size);font-weight:var(--font-weight-semibold);color:var(--text-secondary)}._topology_pb3nh_20{padding:0 var(--space-6)}._capacityTrunk_pb3nh_21{position:relative;display:grid;grid-template-columns:var(--trunk-width) minmax(0,1fr);column-gap:var(--branch-gap);padding-block:var(--space-5)}._capacityTrunk_pb3nh_21+._capacityTrunk_pb3nh_21{border-top:1px solid var(--border-subtle)}._capacityNode_pb3nh_23{align-self:center;position:relative;padding:var(--space-5) var(--space-4);border:1px solid var(--border-strong);border-inline-start:3px solid var(--text-link);border-radius:var(--radius-md) var(--radius-xs) var(--radius-xs) var(--radius-md);background:var(--bg-canvas)}._capacityNode_pb3nh_23:after{content:"";position:absolute;top:50%;left:100%;width:calc(var(--branch-gap) / 2);height:2px;background:var(--border-strong)}._capacityNode_pb3nh_23 h3{margin:0 0 var(--space-4);font-family:var(--font-display, var(--font-ui));font-size:var(--text-md-size);line-height:var(--text-md-line);overflow-wrap:anywhere}._capacityGlyph_pb3nh_27{display:none}._capacityCount_pb3nh_28{display:grid;gap:var(--space-1);margin:0 0 var(--space-3);font-size:var(--text-xs-size);color:var(--text-secondary);font-variant-numeric:tabular-nums}._capacityCount_pb3nh_28 strong{color:var(--text-primary);font-family:var(--font-display, var(--font-ui));font-size:var(--text-3xl-size);line-height:var(--text-3xl-line);letter-spacing:-.045em;font-weight:var(--font-weight-medium)}._meter_pb3nh_30{display:block;width:100%;height:8px;margin-bottom:var(--space-3);border:0;appearance:none;background:var(--border-default);border-radius:var(--radius-full)}._meter_pb3nh_30::-webkit-meter-bar{background:var(--border-default);border:0;border-radius:var(--radius-full)}._meter_pb3nh_30::-webkit-meter-optimum-value{background:var(--accent-600);border-radius:var(--radius-full)}._meter_pb3nh_30::-moz-meter-bar{background:var(--accent-600)}._unknownMeter_pb3nh_34{padding:var(--space-2);margin-bottom:var(--space-3);border:1px dashed var(--status-unknown-solid);color:var(--status-unknown-fg);background:var(--status-unknown-bg);border-radius:var(--radius-xs);font-size:var(--text-xs-size)}._workerBranches_pb3nh_35,._taskList_pb3nh_35,._railTasks_pb3nh_35{list-style:none;margin:0;padding:0;min-width:0}._workerBranches_pb3nh_35{position:relative;display:grid;align-content:center;gap:var(--space-4)}._workerBranches_pb3nh_35:before{content:"";position:absolute;left:calc(var(--branch-gap) / -2);top:0;bottom:0;width:2px;background:var(--border-strong)}._workerBranch_pb3nh_35{position:relative;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.12fr);gap:var(--branch-gap);align-items:center;min-width:0}._workerBranch_pb3nh_35:before{content:"";position:absolute;right:100%;top:50%;width:calc(var(--branch-gap) / 2);height:2px;background:var(--border-strong)}._workerNode_pb3nh_40,._taskNode_pb3nh_40{position:relative;display:grid;align-content:start;gap:var(--space-2);width:100%;box-sizing:border-box;min-width:0;padding:var(--space-4);text-align:left;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-primary);cursor:pointer;font:inherit}._workerNode_pb3nh_40{border-radius:var(--radius-lg);border-inline-start:3px solid var(--border-strong);background:var(--bg-surface-raised)}._taskNode_pb3nh_40{border-radius:var(--radius-xs);border-inline-start:3px solid var(--border-default);background:var(--bg-canvas)}._assignedWorker_pb3nh_43:after{content:"";position:absolute;top:50%;left:100%;width:calc(var(--branch-gap) / 2);border-top:1px solid var(--border-strong)}._workerNode_pb3nh_40:hover,._taskNode_pb3nh_40:hover{border-color:var(--accent-500);background:var(--bg-selected)}._workerNode_pb3nh_40[aria-pressed=true],._taskNode_pb3nh_40[aria-pressed=true]{border-color:var(--accent-600);background:var(--bg-selected);box-shadow:inset 0 0 0 1px var(--accent-600)}._workerNode_pb3nh_40:focus-visible,._taskNode_pb3nh_40:focus-visible,._pager_pb3nh_15 button:focus-visible,._search_pb3nh_10 input:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._nodeHeading_pb3nh_47{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:var(--space-2)}._nodeHeading_pb3nh_47 strong{flex:1 1 110px;min-width:0;font-family:var(--font-display, var(--font-ui));font-size:var(--text-md-size);line-height:var(--text-md-line);overflow-wrap:anywhere}._taskNode_pb3nh_40 ._nodeHeading_pb3nh_47 strong{font-family:var(--font-ui);font-size:var(--text-sm-size)}._nodeDetail_pb3nh_50,._workerReason_pb3nh_50,._provenance_pb3nh_50,._queueReason_pb3nh_50{display:block;font-size:var(--text-xs-size);line-height:1.45;overflow-wrap:anywhere}._nodeDetail_pb3nh_50{color:var(--text-secondary)}._workerReason_pb3nh_50{color:var(--text-primary)}._provenance_pb3nh_50{color:var(--text-secondary)}p._provenance_pb3nh_50{margin:var(--space-2) 0 0}._uncertain_pb3nh_55{margin:var(--space-3) 0;color:var(--status-unknown-fg);font-size:var(--text-xs-size);line-height:1.5}._assignments_pb3nh_56{min-width:0}._taskList_pb3nh_35{display:grid;gap:var(--space-2);position:relative}._taskList_pb3nh_35:before{content:"";position:absolute;top:0;bottom:0;left:calc(var(--branch-gap) / -2);border-left:1px solid var(--border-strong)}._taskList_pb3nh_35>li{position:relative;min-width:0}._connectedTask_pb3nh_60:before{content:"";position:absolute;top:50%;right:100%;width:calc(var(--branch-gap) / 2);border-top:1px solid var(--border-strong)}._activeTask_pb3nh_61{border-inline-start:3px solid var(--status-running-solid)}._highlightedBranch_pb3nh_62:before,._highlightedTrunk_pb3nh_62 ._capacityNode_pb3nh_23:after{background:var(--accent-600)}._highlightedBranch_pb3nh_62 ._connectedTask_pb3nh_60:before,._highlightedBranch_pb3nh_62 ._assignedWorker_pb3nh_43:after{border-top-color:var(--accent-600)}._highlightedBranch_pb3nh_62 ._taskList_pb3nh_35:before{border-left-color:var(--accent-600)}._highlightedTrunk_pb3nh_62 ._capacityNode_pb3nh_23{border-color:var(--accent-600)}._highlightedTrunk_pb3nh_62 ._workerBranches_pb3nh_35:before{background:var(--text-link)}._noAssignment_pb3nh_67{margin:0;padding:var(--space-4);border-left:1px dashed var(--border-strong);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.5}._noAssignment_pb3nh_67 span{display:block;margin-top:var(--space-2);font-size:var(--text-xs-size);color:var(--text-tertiary)}._assignmentFooter_pb3nh_69{display:grid;justify-items:start;gap:var(--space-2);margin-top:var(--space-2);color:var(--text-secondary);font-size:var(--text-xs-size)}._empty_pb3nh_70{padding:var(--space-8) 0;margin:0;color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.5}._selectionPath_pb3nh_71{margin:0;padding:var(--space-3) var(--space-6);background:var(--bg-selected);color:var(--text-link);font-size:var(--text-xs-size);line-height:1.5;overflow-wrap:anywhere}._queueState_pb3nh_72{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);padding:var(--space-4) var(--space-6);border-top:1px solid var(--border-default);background:var(--bg-canvas);font-size:var(--text-sm-size)}._queueState_pb3nh_72 p{margin:0;color:var(--text-secondary)}._queueState_pb3nh_72>span:last-child{color:var(--text-secondary);font-size:var(--text-xs-size)}._rail_pb3nh_4{padding:var(--space-5) var(--space-6);border-top:1px solid var(--border-default)}._railHeader_pb3nh_4{display:flex;align-items:start;justify-content:space-between;gap:var(--space-4)}._railHeader_pb3nh_4 h3{margin:0 0 var(--space-2);font-family:var(--font-display, var(--font-ui));font-size:var(--text-md-size);line-height:var(--text-md-line)}._railHeader_pb3nh_4 h3 span{display:inline-block;margin-left:var(--space-2);padding:0 7px;border-radius:var(--radius-xs);background:var(--bg-hover);color:var(--text-secondary);font-size:var(--text-sm-size);font-variant-numeric:tabular-nums}._railHeader_pb3nh_4 p{font-size:var(--text-xs-size)}._railTasks_pb3nh_35{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-3);margin-top:var(--space-3)}._railTasks_pb3nh_35>li{min-width:0}._railTasks_pb3nh_35 ._taskNode_pb3nh_40{height:100%;padding:var(--space-3)}._queueReason_pb3nh_50{color:var(--text-secondary)}._emptyRail_pb3nh_84{margin:var(--space-4) 0 0;color:var(--text-tertiary);font-size:var(--text-xs-size)}._footer_pb3nh_85{display:grid;gap:var(--space-1);padding:var(--space-4) var(--space-6);border-top:1px solid var(--border-default);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:1.5}@media(max-width:1100px){._fleetMap_pb3nh_1{--trunk-width: 172px;--branch-gap: 24px}._railTasks_pb3nh_35{grid-template-columns:repeat(2,minmax(0,1fr))}._header_pb3nh_2{flex-wrap:wrap}._sample_pb3nh_5{justify-items:start}}@media(max-width:800px){._fleetMap_pb3nh_1{--trunk-width: 150px;--branch-gap: 20px}._header_pb3nh_2,._toolbar_pb3nh_9,._rail_pb3nh_4,._footer_pb3nh_85,._queueState_pb3nh_72,._summary_pb3nh_6,._selectionPath_pb3nh_71,._evidenceNotice_pb3nh_8,._topology_pb3nh_20{padding-inline:var(--space-4)}._laneHeadings_pb3nh_19{display:none}._capacityNode_pb3nh_23{padding:var(--space-3)}._workerBranch_pb3nh_35{grid-template-columns:minmax(0,1fr);gap:var(--space-3);align-items:start}._workerBranch_pb3nh_35:before{top:44px}._assignments_pb3nh_56{padding-left:var(--space-4)}._assignedWorker_pb3nh_43:after{left:0;top:100%;height:var(--space-3);width:0;border-left:1px solid var(--border-strong);border-top:0}._taskList_pb3nh_35:before{left:calc(var(--space-4) * -1)}._connectedTask_pb3nh_60:before{width:var(--space-4)}._workerPaging_pb3nh_14{justify-items:start}}@media(max-width:520px){._header_pb3nh_2{gap:var(--space-3);padding-top:var(--space-4)}._header_pb3nh_2 h2{font-size:var(--text-xl-size);line-height:var(--text-xl-line)}._header_pb3nh_2 p{font-size:var(--text-sm-size)}._sample_pb3nh_5{max-width:100%;overflow-wrap:anywhere;flex-shrink:1}._capacityTrunk_pb3nh_21{grid-template-columns:minmax(0,1fr);gap:var(--space-4)}._capacityNode_pb3nh_23{margin-right:var(--space-5)}._capacityNode_pb3nh_23:after{left:var(--space-4);top:100%;height:var(--space-4);width:2px}._workerBranches_pb3nh_35{margin-left:var(--space-4);padding-left:var(--space-4)}._workerBranches_pb3nh_35:before{left:0}._workerBranch_pb3nh_35:before{width:var(--space-4)}._workerNode_pb3nh_40,._taskNode_pb3nh_40{padding:var(--space-3)}._railTasks_pb3nh_35{grid-template-columns:minmax(0,1fr)}._railHeader_pb3nh_4{flex-wrap:wrap}._summary_pb3nh_6{gap:var(--space-2) var(--space-4)}}@media(prefers-reduced-motion:reduce){._fleetMap_pb3nh_1 *,._fleetMap_pb3nh_1 *:before,._fleetMap_pb3nh_1 *:after{animation:none;transition:none;scroll-behavior:auto}}._header_pb3nh_2 h2:focus{outline:2px solid var(--border-focus);outline-offset:4px;border-radius:var(--radius-xs);scroll-margin-top:var(--space-4)}@container (max-width: 780px){._header_pb3nh_2{flex-wrap:wrap;gap:var(--space-3)}._sample_pb3nh_5,._workerPaging_pb3nh_14{justify-items:start}._topology_pb3nh_20{--trunk-width: 150px;--branch-gap: 24px}._laneHeadings_pb3nh_19{display:none}._workerBranch_pb3nh_35{grid-template-columns:minmax(0,1fr);gap:var(--space-3);align-items:start}._workerBranch_pb3nh_35:before{top:44px}._assignments_pb3nh_56{padding-left:var(--space-4)}._assignedWorker_pb3nh_43:after{left:0;top:100%;height:var(--space-3);width:0;border-left:1px solid var(--border-strong);border-top:0}._taskList_pb3nh_35:before{left:calc(var(--space-4) * -1)}._connectedTask_pb3nh_60:before{width:var(--space-4)}._railTasks_pb3nh_35{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (max-width: 520px){._header_pb3nh_2,._toolbar_pb3nh_9,._rail_pb3nh_4,._footer_pb3nh_85,._queueState_pb3nh_72,._summary_pb3nh_6,._selectionPath_pb3nh_71,._evidenceNotice_pb3nh_8,._topology_pb3nh_20{padding-inline:var(--space-4)}._capacityTrunk_pb3nh_21{grid-template-columns:minmax(0,1fr);gap:var(--space-4)}._capacityNode_pb3nh_23{margin-right:var(--space-5);padding:var(--space-4)}._capacityNode_pb3nh_23:after{left:var(--space-4);top:100%;height:var(--space-4);width:2px}._workerBranches_pb3nh_35{margin-left:var(--space-4);padding-left:var(--space-4)}._workerBranches_pb3nh_35:before{left:0}._workerBranch_pb3nh_35:before{width:var(--space-4)}._railTasks_pb3nh_35{grid-template-columns:minmax(0,1fr)}._railHeader_pb3nh_4{flex-wrap:wrap}}._workspace_trmiy_1{display:grid;grid-template-columns:192px minmax(0,1fr) 8px var(--workspace-dock-width, 320px);min-width:0;min-height:600px;height:clamp(600px,calc(100dvh - 180px),1100px);overflow:hidden;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-lg);color:var(--text-primary);font-family:var(--font-ui)}._workspace_trmiy_1>*{min-width:0}._fileBrowse_trmiy_3{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-block:var(--space-4)}._fileBrowse_trmiy_3 label{flex:1 1 180px;font-size:var(--text-xs-size)}._fileBrowse_trmiy_3 input{display:block;width:100%;box-sizing:border-box;min-height:40px;margin-top:var(--space-1);padding:var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);background:var(--bg-surface)}._fileHeading_trmiy_6{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);font-size:var(--text-sm-size);overflow-wrap:anywhere}._fileList_trmiy_7{list-style:none;padding:0;max-height:280px;overflow-y:auto}._fileList_trmiy_7 button{display:flex;align-items:baseline;gap:var(--space-2);width:100%;min-height:40px;padding:var(--space-2);border:0;border-bottom:1px solid var(--border-subtle);text-align:left;color:var(--text-primary);background:transparent}._fileList_trmiy_7 button:hover{background:var(--bg-hover)}._fileList_trmiy_7 button>span:nth-child(2){flex:1;min-width:0;overflow-wrap:anywhere}._fileList_trmiy_7 small{flex-shrink:0;color:var(--text-tertiary);font-size:var(--text-xs-size)}._files_trmiy_12 h4,._files_trmiy_12 code{overflow-wrap:anywhere}._filePreview_trmiy_13{font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:1.65;tab-size:2;white-space:pre-wrap;overflow-wrap:anywhere;unicode-bidi:plaintext;max-height:420px;overflow:auto;padding:var(--space-3);border:1px solid var(--border-default);background:var(--bg-surface);border-radius:var(--radius-sm)}._transcript_trmiy_14{margin-block:var(--space-5);padding:var(--space-4);border:1px solid var(--border-default);border-radius:var(--radius-md)}._transcript_trmiy_14 h3,._transcript_trmiy_14 h4{font-size:var(--text-sm-size);margin-block:var(--space-3)}._transcriptActions_trmiy_16{display:flex;flex-wrap:wrap;gap:var(--space-2)}._followUp_trmiy_17{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3);border-left:3px solid var(--accent-600);background:var(--bg-canvas);padding:var(--space-3);margin-bottom:var(--space-3);font-size:var(--text-xs-size);overflow-wrap:anywhere}._followUp_trmiy_17>div{flex:1 1 230px;min-width:0}._followUp_trmiy_17 p{color:var(--text-secondary);margin:var(--space-1) 0;line-height:1.6}._contextHistory_trmiy_20{font-size:var(--text-sm-size)}._contextHistory_trmiy_20 summary{cursor:pointer;padding-block:var(--space-3)}._contextHistory_trmiy_20 ol{padding-left:var(--space-5)}._contextHistory_trmiy_20 li{border-left:1px solid var(--border-default);padding-left:var(--space-3);overflow-wrap:anywhere}._retention_trmiy_24{display:flex;align-items:flex-start;gap:var(--space-2);margin-top:var(--space-3);font-size:var(--text-sm-size);color:var(--text-secondary)}._retention_trmiy_24 input{margin-top:3px;flex:0 0 auto}._workspace_trmiy_1 button,._workspace_trmiy_1 input,._workspace_trmiy_1 select,._workspace_trmiy_1 textarea{font:inherit}._workspace_trmiy_1 button{cursor:pointer}._workspace_trmiy_1 button:disabled,._workspace_trmiy_1 input:disabled,._workspace_trmiy_1 select:disabled,._workspace_trmiy_1 textarea:disabled{cursor:not-allowed;opacity:.65}._workspace_trmiy_1 button:focus-visible,._workspace_trmiy_1 input:focus-visible,._workspace_trmiy_1 select:focus-visible,._workspace_trmiy_1 textarea:focus-visible,._workspace_trmiy_1 summary:focus-visible,._resize_trmiy_29:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}._rail_trmiy_30{display:flex;flex-direction:column;min-width:0;min-height:0;padding:var(--space-5) var(--space-3);background:var(--bg-canvas);border-right:1px solid var(--border-subtle);overflow-y:auto;scrollbar-gutter:stable}._project_trmiy_31{display:flex;gap:var(--space-2);align-items:center}._projectList_trmiy_32{display:flex;flex-direction:column;flex-shrink:0;gap:var(--space-1);max-height:220px;overflow-y:auto;scrollbar-gutter:stable;margin-bottom:var(--space-5);padding-bottom:var(--space-4);border-bottom:1px solid var(--border-subtle)}._projectList_trmiy_32 h3{font-size:var(--text-xs-size);color:var(--text-tertiary);margin:0 0 var(--space-2)}._projectList_trmiy_32 button{display:flex;flex-wrap:wrap;gap:var(--space-1);align-items:center;justify-content:space-between;min-height:40px;text-align:left;padding:var(--space-2);border:0;border-radius:var(--radius-sm);color:var(--text-secondary);background:transparent;overflow-wrap:anywhere}._projectList_trmiy_32 button[aria-current]{color:var(--accent-600);background:var(--bg-selected)}._projectList_trmiy_32 button:hover{background:var(--bg-hover)}._projectList_trmiy_32 small{font-size:var(--text-xs-size);color:var(--text-tertiary)}._project_trmiy_31>div{min-width:0}._projectIcon_trmiy_39{display:grid;place-items:center;width:30px;height:30px;flex-shrink:0;color:var(--accent-600);font-size:var(--text-2xl-size)}._project_trmiy_31 h2{font:var(--font-weight-semibold) var(--text-md-size)/1.3 var(--font-display);overflow-wrap:anywhere;margin:0}._project_trmiy_31 p{color:var(--text-tertiary);font-size:var(--text-xs-size);margin:var(--space-1) 0 0}._projectPath_trmiy_42{color:var(--text-tertiary);overflow-wrap:anywhere;font-size:var(--text-xs-size);line-height:1.5;margin:var(--space-3) 0 var(--space-5)}._newTask_trmiy_43{flex-shrink:0;text-align:left;min-height:44px;padding:var(--space-2) var(--space-3);background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md);color:var(--text-primary)}._newTask_trmiy_43:hover,._subtleButton_trmiy_44:not(:disabled):hover{background:var(--bg-hover);border-color:var(--border-strong)}._railHeading_trmiy_45{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);color:var(--text-secondary);margin:var(--space-6) var(--space-2) var(--space-2)}._taskList_trmiy_46{padding:0;margin:0;list-style:none}._taskList_trmiy_46 button{width:100%;min-width:0;min-height:58px;padding:var(--space-2);border:0;border-radius:var(--radius-sm);color:var(--text-secondary);background:transparent;text-align:left;display:flex;flex-direction:column;gap:var(--space-1);align-items:flex-start}._taskList_trmiy_46 button>span:first-child{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size)}._taskList_trmiy_46 button:hover{background:var(--bg-hover)}._taskList_trmiy_46 button[aria-current]{background:var(--bg-selected);color:var(--accent-600)}._railFoot_trmiy_51{margin-top:auto;padding-top:var(--space-8);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:1.6}._center_trmiy_52{display:flex;flex-direction:column;min-height:0;min-width:0;overflow:hidden}._heading_trmiy_53{flex-shrink:0;padding:var(--space-5) var(--space-6);border-bottom:1px solid var(--border-subtle);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3)}._heading_trmiy_53>div{min-width:0;flex:1 1 180px}._heading_trmiy_53 h2{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:1.35;font-weight:var(--font-weight-medium);margin:0;overflow-wrap:anywhere}._heading_trmiy_53 p{font-size:var(--text-xs-size);color:var(--text-tertiary);margin:var(--space-1) 0 0;overflow-wrap:anywhere}._conversation_trmiy_57{flex:1;min-height:100px;overflow-y:auto;padding:var(--space-6);scrollbar-gutter:stable}._conversation_trmiy_57>*{max-width:78ch;margin-inline:auto}._invitation_trmiy_59{max-width:42ch;margin:clamp(24px,6vh,80px) auto}._workMark_trmiy_60{color:var(--accent-500);font-size:var(--text-3xl-size)}._invitation_trmiy_59 h3{font:var(--font-weight-medium) var(--text-2xl-size)/1.3 var(--font-display);margin:var(--space-4) 0 var(--space-3)}._invitation_trmiy_59 p{color:var(--text-secondary);font-size:var(--text-md-size);line-height:1.7}._request_trmiy_63{background:var(--bg-canvas);border-radius:var(--radius-md);padding:var(--space-4);margin-bottom:var(--space-6)}._request_trmiy_63 p{white-space:pre-wrap;overflow-wrap:anywhere;margin:var(--space-2) 0 0;line-height:1.6}._request_trmiy_63 h3,._answer_trmiy_65 h3,._dockContent_trmiy_65 h3{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);margin:0 0 var(--space-3)}._answer_trmiy_65{max-width:76ch;margin-bottom:var(--space-5)}._responseText_trmiy_67{max-width:78ch;font:var(--text-base-size)/1.75 var(--font-ui);white-space:pre-wrap;overflow-wrap:anywhere;tab-size:4;margin:var(--space-4) 0}._caption_trmiy_68{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:1.6;margin:var(--space-3) 0;overflow-wrap:anywhere}._notice_trmiy_69{color:var(--text-secondary);background:var(--bg-canvas);border-left:2px solid var(--border-strong);padding:var(--space-2) var(--space-3);font-size:var(--text-sm-size);line-height:1.6;margin-block:0 var(--space-4);overflow-wrap:anywhere}._error_trmiy_70{color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:1.6;margin:var(--space-3) 0 0;overflow-wrap:anywhere}._subtleButton_trmiy_44{background:var(--bg-surface);color:var(--text-primary);border:1px solid var(--border-default);border-radius:var(--radius-sm);min-height:40px;padding:var(--space-2) var(--space-3)}._composer_trmiy_72{flex-shrink:0;padding:var(--space-4) var(--space-5);border-top:1px solid var(--border-default);background:var(--bg-surface);max-height:56%;overflow-y:auto;scrollbar-gutter:stable}._composer_trmiy_72>label{display:block;font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);color:var(--text-secondary);margin-bottom:var(--space-2)}._composer_trmiy_72 textarea{display:block;width:100%;resize:vertical;min-height:88px;max-height:220px;border:1px solid var(--border-default);border-radius:var(--radius-sm);padding:var(--space-3);color:var(--text-primary);background:var(--bg-canvas);font-size:var(--text-base-size);line-height:1.6}._composer_trmiy_72 textarea::placeholder{color:var(--text-tertiary)}._composeControls_trmiy_76{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:flex-end;margin-top:var(--space-3)}._workerChoice_trmiy_77{flex:1 1 160px;min-width:0;font-size:var(--text-xs-size);color:var(--text-tertiary)}._workerChoice_trmiy_77 select{width:100%;margin-top:var(--space-1);text-overflow:ellipsis}._composer_trmiy_72 select,._composer_trmiy_72 input[type=number]{width:100%;max-width:100%;color:var(--text-primary);background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-sm);min-height:40px;padding:var(--space-1) var(--space-2);min-width:0;font-size:var(--text-sm-size)}._send_trmiy_80{min-height:40px;background:var(--accent-600);color:var(--accent-contrast);border:0;border-radius:var(--radius-md);padding:var(--space-2) var(--space-4);font-weight:var(--font-weight-medium)}._send_trmiy_80:not(:disabled):hover{background:var(--accent-700)}._fileButton_trmiy_82{position:relative;min-height:40px;display:flex;align-items:center;padding:var(--space-2);font-size:var(--text-xs-size);color:var(--text-secondary);border:1px solid var(--border-default);border-radius:var(--radius-sm);cursor:pointer;overflow:hidden}._fileButton_trmiy_82:hover{background:var(--bg-hover)}._fileButton_trmiy_82 input{position:absolute;inset:0;opacity:0;width:100%;cursor:pointer}._fileButton_trmiy_82:focus-within{outline:2px solid var(--border-focus);outline-offset:2px}._options_trmiy_86{font-size:var(--text-xs-size);color:var(--text-secondary);margin-top:var(--space-3)}._options_trmiy_86 summary{cursor:pointer;padding:var(--space-2) 0}._options_trmiy_86>div{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(140px,100%),1fr));gap:var(--space-3) var(--space-2);margin-top:var(--space-2)}._options_trmiy_86 label{display:flex;flex-direction:column;min-width:0;gap:var(--space-1)}._attachments_trmiy_90{list-style:none;padding:0;margin:var(--space-2) 0;display:flex;flex-wrap:wrap;gap:var(--space-2)}._attachments_trmiy_90 li{display:flex;gap:var(--space-1);align-items:center;min-width:0;max-width:100%;background:var(--bg-selected);border-radius:var(--radius-sm);padding:var(--space-1) var(--space-2);font-size:var(--text-xs-size)}._attachments_trmiy_90 li span{overflow-wrap:anywhere}._attachments_trmiy_90 button{flex-shrink:0;background:transparent;color:var(--text-secondary);border:0;border-radius:var(--radius-xs);min-width:32px;min-height:32px}._attachments_trmiy_90 button:not(:disabled):hover{background:var(--bg-active)}._resize_trmiy_29{position:relative;cursor:col-resize;background:var(--bg-canvas);border-inline:1px solid var(--border-subtle);touch-action:none}._resize_trmiy_29:after{content:"";position:absolute;width:2px;height:32px;left:2px;top:calc(50% - 16px);border-radius:var(--radius-full);background:var(--border-strong)}._resize_trmiy_29:hover,._resize_trmiy_29:focus-visible{background:var(--bg-selected)}._resize_trmiy_29:hover:after,._resize_trmiy_29:focus-visible:after{background:var(--border-focus)}._resize_trmiy_29:focus-visible{outline-offset:-2px}._dock_trmiy_65{min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--bg-canvas)}._dockTabs_trmiy_101{flex-shrink:0;display:flex;flex-wrap:wrap;gap:var(--space-1);padding:var(--space-3);border-bottom:1px solid var(--border-default)}._dockTabs_trmiy_101 button{background:transparent;border:0;border-radius:var(--radius-sm);color:var(--text-secondary);min-height:36px;padding:var(--space-2) var(--space-3);font-size:var(--text-sm-size)}._dockTabs_trmiy_101 button[aria-selected=true]{color:var(--text-primary);background:var(--bg-surface);box-shadow:var(--shadow-sm)}._dockContent_trmiy_65{flex:1;overflow-y:auto;padding:var(--space-5);min-height:0;scrollbar-gutter:stable}._facts_trmiy_105{margin:0}._facts_trmiy_105>div{margin:0 0 var(--space-4)}._facts_trmiy_105 dt{color:var(--text-tertiary);font-size:var(--text-xs-size)}._facts_trmiy_105 dd{color:var(--text-primary);font-size:var(--text-sm-size);line-height:1.6;margin:var(--space-1) 0 0;overflow-wrap:anywhere}._capabilities_trmiy_109{flex-shrink:0;border-top:1px solid var(--border-default);padding:var(--space-4);margin:0;color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:1.6;overflow-wrap:anywhere}._mobileNav_trmiy_110{display:none}._engineeringPane_trmiy_111{grid-column:2 / -1;min-width:0;min-height:0;overflow:auto;flex:1}._engineeringLink_trmiy_112{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);width:100%;min-height:40px;margin-top:var(--space-2);padding:var(--space-2) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);font-size:var(--text-sm-size);text-align:left}._engineeringLink_trmiy_112[aria-pressed=true]{background:var(--bg-selected);border-color:var(--accent-300);color:var(--accent-600)}@media(max-width:1280px){._workspace_trmiy_1{grid-template-columns:176px minmax(0,1fr) 8px var(--workspace-dock-width, 320px)}._heading_trmiy_53,._conversation_trmiy_57{padding:var(--space-4)}._composer_trmiy_72{padding:var(--space-3)}}@media(max-width:1120px){._workspace_trmiy_1{display:flex;flex-direction:column;height:max(620px,calc(100dvh - 180px));min-height:620px}._mobileNav_trmiy_110{flex-shrink:0;display:flex;padding:var(--space-2);gap:var(--space-2);border-bottom:1px solid var(--border-default)}._mobileNav_trmiy_110 button{background:var(--bg-canvas);color:var(--text-secondary);border:0;border-radius:var(--radius-sm);min-height:44px;flex:1}._mobileNav_trmiy_110 button[aria-pressed=true]{background:var(--bg-selected);color:var(--accent-600)}._workspace_trmiy_1 [data-mobile-visible=false],._resize_trmiy_29{display:none}._rail_trmiy_30,._center_trmiy_52,._dock_trmiy_65{flex:1;min-height:0}._rail_trmiy_30{border-right:0}._composer_trmiy_72{max-height:60%}}@media(max-width:440px){._options_trmiy_86>div{grid-template-columns:1fr}._composeControls_trmiy_76{align-items:stretch}._workerChoice_trmiy_77{flex-basis:100%}._send_trmiy_80{flex:1}._heading_trmiy_53{padding:var(--space-4) var(--space-3)}._composer_trmiy_72 textarea,._composer_trmiy_72 select,._composer_trmiy_72 input[type=number]{font-size:16px}}@media(pointer:coarse){._workspace_trmiy_1 button,._fileButton_trmiy_82,._composer_trmiy_72 select,._composer_trmiy_72 input[type=number]{min-height:44px}._attachments_trmiy_90 button{min-width:44px}._options_trmiy_86 summary{padding-block:var(--space-3)}}@media(prefers-reduced-motion:reduce){._workspace_trmiy_1 *,._workspace_trmiy_1 *:before,._workspace_trmiy_1 *:after{scroll-behavior:auto;animation:none;transition:none}}._panel_40a9p_1{margin:var(--space-5) var(--space-6);padding:var(--space-5);border:1px solid var(--border-strong);border-left:3px solid var(--accent-500);background:var(--bg-canvas)}._heading_40a9p_2,._entries_40a9p_2 li>div,._actions_40a9p_2{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3)}._heading_40a9p_2 h3{font-family:var(--font-display);font-size:var(--text-xl-size);letter-spacing:-.02em;margin:0}._panel_40a9p_1 p{max-width:78ch;font-size:var(--text-sm-size);color:var(--text-secondary);line-height:1.6;overflow-wrap:anywhere}._facts_40a9p_5{display:flex;flex-wrap:wrap;gap:var(--space-5);margin-block:var(--space-4)}._facts_40a9p_5 dt{font-size:var(--text-xs-size);color:var(--text-secondary)}._facts_40a9p_5 dd{margin:var(--space-1) 0 0;font-size:var(--text-sm-size);font-variant-numeric:tabular-nums}._entries_40a9p_2{margin:0;padding:0;list-style:none}._entries_40a9p_2 li{padding-block:var(--space-3);border-top:1px solid var(--border-default)}._entries_40a9p_2 strong{font-size:var(--text-sm-size);overflow-wrap:anywhere}._entries_40a9p_2 p{margin:var(--space-2) 0 0}._scope_40a9p_12{border-top:1px solid var(--border-default);padding-top:var(--space-3)}._recovery_40a9p_13{min-width:0;margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--border-default)}._recovery_40a9p_13 h4{margin:0;font-family:var(--font-display);font-size:var(--text-base-size);overflow-wrap:anywhere}._recovery_40a9p_13 ._heading_40a9p_2{justify-content:flex-start}._recovery_40a9p_13 dd{overflow-wrap:anywhere}._recoveryDetails_40a9p_17 summary{padding-block:var(--space-3);font-size:var(--text-sm-size);cursor:pointer;overflow-wrap:anywhere}._recoveryDetails_40a9p_17 summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._actions_40a9p_2{justify-content:flex-end}._admission_40a9p_20{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--space-4);border-top:1px solid var(--border-default);padding-block:var(--space-4)}._admission_40a9p_20>div{flex:1 1 260px;min-width:0}._admission_40a9p_20 h4{font-size:var(--text-sm-size);margin:0;overflow-wrap:anywhere}._actions_40a9p_2 button,._admission_40a9p_20 button{min-height:40px;padding:var(--space-2) var(--space-4);border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);font-size:var(--text-sm-size)}._admission_40a9p_20 button{color:var(--accent-contrast);background:var(--accent-600);border-color:var(--accent-600)}._actions_40a9p_2 button:disabled,._admission_40a9p_20 button:disabled{opacity:.5;cursor:not-allowed}._actions_40a9p_2 button:focus-visible,._admission_40a9p_20 button:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}@media(max-width:720px){._panel_40a9p_1{margin-inline:var(--space-4);padding:var(--space-4)}._actions_40a9p_2 button{flex:1}}@media(pointer:coarse){._actions_40a9p_2 button{min-height:44px}}._panel_ky5r8_1{margin:var(--space-5) var(--space-6);border:1px solid var(--border-strong);background:var(--bg-canvas);padding:var(--space-5);min-width:0}._heading_ky5r8_2{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3)}._heading_ky5r8_2 h3{margin:0;font-family:var(--font-display);font-size:var(--text-xl-size);letter-spacing:-.02em}._heading_ky5r8_2 p,._scope_ky5r8_4,._empty_ky5r8_4,._explanation_ky5r8_4,._reason_ky5r8_4,._warning_ky5r8_4{max-width:78ch;font-size:var(--text-sm-size);line-height:1.6;color:var(--text-secondary);overflow-wrap:anywhere}._heading_ky5r8_2 p{margin:var(--space-2) 0 0}._facts_ky5r8_6{display:flex;flex-wrap:wrap;gap:var(--space-4) var(--space-6);margin-block:var(--space-5)}._facts_ky5r8_6 dt,._label_ky5r8_7,._availability_ky5r8_7{font-size:var(--text-xs-size);color:var(--text-secondary)}._facts_ky5r8_6 dd{margin:var(--space-1) 0 0;font-size:var(--text-sm-size);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}._lineage_ky5r8_9{list-style:none;padding:0;margin:0}._lineage_ky5r8_9>li{border-top:1px solid var(--border-default);padding-block:var(--space-5)}._relationship_ky5r8_11{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr) minmax(0,1fr);gap:var(--space-4);align-items:start}._enrollment_ky5r8_12,._phase_ky5r8_12{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);min-width:0}._enrollment_ky5r8_12 code,._phase_ky5r8_12 code{max-width:100%;overflow-wrap:anywhere;font-size:var(--text-xs-size);line-height:1.6}._enrollment_ky5r8_12 code{font-size:var(--text-sm-size);color:var(--text-primary)}._phase_ky5r8_12{position:relative;padding-top:var(--space-5)}._connector_ky5r8_16{position:absolute;top:var(--space-2);inset-inline:0;border-top:1px solid var(--border-strong)}._connector_ky5r8_16:after{content:"";position:absolute;right:0;top:-4px;width:6px;height:6px;border-right:1px solid var(--border-strong);border-top:1px solid var(--border-strong);transform:rotate(45deg)}._inspect_ky5r8_18{min-height:40px;padding:var(--space-2) var(--space-3);border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-primary);font-size:var(--text-sm-size)}._inspect_ky5r8_18:hover:enabled{background:var(--bg-hover)}._inspect_ky5r8_18:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._inspect_ky5r8_18:disabled{opacity:.5;cursor:not-allowed}._explanation_ky5r8_4,._reason_ky5r8_4{margin:var(--space-3) 0 0}._reason_ky5r8_4,._warning_ky5r8_4{color:var(--status-warning-fg)}._warning_ky5r8_4{background:var(--status-warning-bg);padding:var(--space-3)}._scope_ky5r8_4{border-top:1px solid var(--border-default);margin:var(--space-3) 0 0;padding-top:var(--space-3)}._empty_ky5r8_4{padding-block:var(--space-3)}@media(max-width:720px){._panel_ky5r8_1{margin-inline:var(--space-4);padding:var(--space-4)}._relationship_ky5r8_11{grid-template-columns:minmax(0,1fr);gap:var(--space-3);border-left:1px solid var(--border-strong);padding-left:var(--space-4)}._phase_ky5r8_12{padding-block:var(--space-2)}._connector_ky5r8_16{display:none}._facts_ky5r8_6{gap:var(--space-3)}}@media(pointer:coarse){._inspect_ky5r8_18{min-height:44px}}@media(prefers-reduced-motion:reduce){._panel_ky5r8_1 *,._panel_ky5r8_1 *:before,._panel_ky5r8_1 *:after{animation:none;transition:none;scroll-behavior:auto}}._composer_jwxxg_1{margin:var(--space-5) var(--space-6);border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);min-width:0}._header_jwxxg_2{padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--border-default)}._header_jwxxg_2 h3,._summary_jwxxg_3 h4{font-family:var(--font-display);font-size:var(--text-lg-size);margin:0 0 var(--space-2)}._header_jwxxg_2 p,._note_jwxxg_4,._summary_jwxxg_3 p,._feedback_jwxxg_4{color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.6;max-width:78ch;margin:0}._columns_jwxxg_5{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr)}._form_jwxxg_6{display:grid;gap:var(--space-4);padding:var(--space-5);min-width:0}._field_jwxxg_7{display:grid;gap:var(--space-2);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);min-width:0}._field_jwxxg_7 :is(input,textarea,select){min-width:0;width:100%;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);padding:var(--space-2) var(--space-3);font:inherit;font-weight:var(--font-weight-normal);min-height:40px}._field_jwxxg_7 textarea{min-height:132px;resize:vertical;line-height:1.6}._summary_jwxxg_3{padding:var(--space-5);border-left:1px solid var(--border-default);background:var(--bg-canvas);min-width:0}._facts_jwxxg_11{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);margin:var(--space-4) 0}._facts_jwxxg_11 dt{color:var(--text-secondary);font-size:var(--text-xs-size)}._facts_jwxxg_11 dd{margin:var(--space-1) 0 0;font-size:var(--text-sm-size);overflow-wrap:anywhere}._summary_jwxxg_3 ul{padding-left:var(--space-4);margin:var(--space-2) 0 var(--space-4);list-style:disc;font-size:var(--text-sm-size);line-height:1.6;overflow-wrap:anywhere}._summary_jwxxg_3 h5{margin:var(--space-4) 0 var(--space-2);font-size:var(--text-sm-size)}._review_jwxxg_16{margin:0 var(--space-5) var(--space-4);padding:var(--space-4);background:var(--bg-canvas);border-left:3px solid var(--accent-500);min-width:0}._review_jwxxg_16 h4{margin:0 0 var(--space-2);font-family:var(--font-display);font-size:var(--text-md-size)}._review_jwxxg_16 p{font-size:var(--text-sm-size);line-height:1.6;margin:var(--space-2) 0;overflow-wrap:anywhere}._review_jwxxg_16 code{overflow-wrap:anywhere;font-size:var(--text-xs-size)}._actions_jwxxg_20{display:flex;flex-wrap:wrap;gap:var(--space-3);padding:var(--space-4) var(--space-5);border-top:1px solid var(--border-default)}._button_jwxxg_21,._primary_jwxxg_21{min-height:40px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);background:var(--bg-surface);font:inherit;font-size:var(--text-sm-size)}._primary_jwxxg_21{background:var(--accent-600);color:var(--accent-contrast);border-color:var(--accent-600)}._composer_jwxxg_1 :is(button,input,textarea,select):focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._composer_jwxxg_1 :disabled{opacity:.5;cursor:not-allowed}._feedback_jwxxg_4{margin:var(--space-3) var(--space-5);padding:var(--space-3);overflow-wrap:anywhere}._error_jwxxg_26{color:var(--status-warning-fg);background:var(--status-warning-bg)}@media(max-width:850px){._columns_jwxxg_5{grid-template-columns:1fr}._summary_jwxxg_3{border-left:0;border-top:1px solid var(--border-default)}}@media(max-width:720px){._composer_jwxxg_1{margin:var(--space-4)}._header_jwxxg_2,._form_jwxxg_6,._summary_jwxxg_3,._actions_jwxxg_20{padding:var(--space-4)}._field_jwxxg_7 :is(input,textarea,select){font-size:16px}._facts_jwxxg_11{grid-template-columns:1fr}._review_jwxxg_16{margin-inline:var(--space-4)}}@media(pointer:coarse){._composer_jwxxg_1 :is(button,input,select){min-height:44px}}@media(prefers-reduced-motion:reduce){._composer_jwxxg_1 *,._composer_jwxxg_1 *:before,._composer_jwxxg_1 *:after{animation:none;transition:none;scroll-behavior:auto}}._outcomes_1kjhl_1{min-width:0;max-width:100%;padding:var(--space-5) var(--space-6);border-top:1px solid var(--border-default);color:var(--text-primary);font-family:var(--font-ui)}._header_1kjhl_2{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--space-4)}._header_1kjhl_2 h3{font-family:var(--font-display);font-size:var(--text-md-size);margin:0}._outcomes_1kjhl_1 p{max-width:78ch;font-size:var(--text-sm-size);line-height:1.6;overflow-wrap:anywhere;margin:var(--space-2) 0}._outcomes_1kjhl_1 button{min-height:40px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);padding:var(--space-2) var(--space-4);font-size:var(--text-sm-size)}._outcomes_1kjhl_1 button:enabled:hover{background:var(--bg-hover)}._outcomes_1kjhl_1 button:disabled{opacity:.5;cursor:not-allowed}._outcomes_1kjhl_1 :is(button,summary,[tabindex]):focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._overview_1kjhl_9,._measurement_1kjhl_9{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:var(--space-5);padding-block:var(--space-4)}._overview_1kjhl_9{background:var(--bg-canvas);padding:var(--space-4);margin-block:var(--space-4)}._campaign_1kjhl_11{min-width:0;padding-block:var(--space-5);border-top:1px solid var(--border-default)}._campaign_1kjhl_11 h4{font-family:var(--font-display);margin:0 0 var(--space-2);font-size:var(--text-base-size);overflow-wrap:anywhere}._campaign_1kjhl_11 h5{font-size:var(--text-sm-size);margin:0}._tableScroll_1kjhl_14{width:100%;max-width:100%;overflow-x:auto;margin-block:var(--space-3)}._tableScroll_1kjhl_14 table{min-width:580px;width:100%;border-collapse:collapse;text-align:left;font-size:var(--text-xs-size);font-variant-numeric:tabular-nums}._tableScroll_1kjhl_14 caption{text-align:left;color:var(--text-secondary);margin-bottom:var(--space-2)}._tableScroll_1kjhl_14 :is(th,td){text-align:left;vertical-align:top;padding:var(--space-3);border-bottom:1px solid var(--border-default);overflow-wrap:anywhere;max-width:300px}._tableScroll_1kjhl_14 thead{background:var(--bg-canvas)}._tableScroll_1kjhl_14 th{font-weight:500}._usage_1kjhl_20{display:flex;flex-direction:column;gap:var(--space-1);font-size:var(--text-xs-size);line-height:1.55;overflow-wrap:anywhere}._measurements_1kjhl_21{display:flex;flex-direction:column;gap:var(--space-4)}._usage_1kjhl_20 span,._note_1kjhl_22,._scope_1kjhl_22,._header_1kjhl_2 p{color:var(--text-secondary)}._details_1kjhl_23 summary{font-size:var(--text-sm-size);cursor:pointer;min-height:36px;padding-block:var(--space-2)}._identities_1kjhl_24{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-3);font-size:var(--text-xs-size)}._identities_1kjhl_24 dt{color:var(--text-secondary)}._identities_1kjhl_24 dd{margin:var(--space-1) 0;overflow-wrap:anywhere}._outcomes_1kjhl_1 code{font-size:var(--text-xs-size);overflow-wrap:anywhere}._reasons_1kjhl_28{padding-left:var(--space-4);font-size:var(--text-xs-size);line-height:1.6;overflow-wrap:anywhere}._scope_1kjhl_22{border-top:1px solid var(--border-default);padding-top:var(--space-4)}._warning_1kjhl_30{color:var(--status-warning-fg);background:var(--status-warning-bg);padding:var(--space-3)}._block_1kjhl_31{display:block;font-weight:400;padding-top:var(--space-1)}@media(max-width:720px){._outcomes_1kjhl_1{padding:var(--space-4)}._overview_1kjhl_9,._measurement_1kjhl_9,._identities_1kjhl_24{grid-template-columns:minmax(0,1fr)}._header_1kjhl_2 button{width:100%}}._engineering_8bc3y_1{min-height:100%;font-family:var(--font-ui);background:var(--bg-surface)}._header_8bc3y_2{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--space-4);padding:var(--space-6);border-bottom:1px solid var(--border-default)}._eyebrow_8bc3y_3{margin:0 0 var(--space-2);font-size:var(--text-xs-size);font-weight:600;letter-spacing:.08em;color:var(--text-secondary)}._header_8bc3y_2 h2{font-family:var(--font-display);font-size:clamp(24px,2.6vw,34px);line-height:1.15;letter-spacing:-.035em;margin:0 0 var(--space-2)}._header_8bc3y_2 p:last-child,._objective_8bc3y_5 p,._controls_8bc3y_5 p{margin:0;color:var(--text-secondary);line-height:1.6;font-size:var(--text-sm-size)}._button_8bc3y_6,._primary_8bc3y_6{min-height:40px;padding:var(--space-2) var(--space-4);border-radius:var(--radius-sm);border:1px solid var(--border-strong);font-size:var(--text-sm-size);font-weight:500;background:var(--bg-surface)}._button_8bc3y_6:hover:enabled{background:var(--bg-hover)}._primary_8bc3y_6{background:var(--accent-600);border-color:var(--accent-600);color:var(--accent-contrast)}._primary_8bc3y_6:hover:enabled{background:var(--accent-700)}._engineering_8bc3y_1 button:disabled{opacity:.5;cursor:not-allowed}._engineering_8bc3y_1 :is(button,select,summary):focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._selection_8bc3y_12{padding:var(--space-4) var(--space-6);display:flex;align-items:flex-end;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap}._selection_8bc3y_12 label{display:flex;flex-direction:column;gap:var(--space-2);font-size:var(--text-xs-size);color:var(--text-secondary);min-width:0;flex:1;max-width:400px}._selection_8bc3y_12 select{width:100%;border:1px solid var(--border-strong);background:var(--bg-input);border-radius:var(--radius-sm);min-height:40px;padding:var(--space-2) var(--space-3);color:var(--text-primary);font-size:var(--text-sm-size)}._admission_8bc3y_15{margin:0 var(--space-6) var(--space-5);padding:var(--space-4) var(--space-5);border:1px solid var(--border-strong);border-radius:var(--radius-sm)}._admissionHeading_8bc3y_16{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3)}._admission_8bc3y_15 h3{font-family:var(--font-display);font-size:var(--text-md-size);margin:0}._admission_8bc3y_15 p,._admissionReasons_8bc3y_18{font-size:var(--text-sm-size);line-height:1.6;max-width:78ch;overflow-wrap:anywhere}._admission_8bc3y_15 p{color:var(--text-secondary);margin:var(--space-3) 0 0}._admissionReasons_8bc3y_18{margin:var(--space-3) 0;padding-left:var(--space-4);list-style:disc}._admissionReasons_8bc3y_18 li+li{margin-top:var(--space-2)}._admission_8bc3y_15 ._sample_8bc3y_22{font-size:var(--text-xs-size)}._mission_8bc3y_23{margin:0 var(--space-6) var(--space-6);padding:var(--space-5);background:var(--bg-canvas);border-left:3px solid var(--accent-500);display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-6);align-items:center}._objective_8bc3y_5 h3{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:1.4;letter-spacing:-.02em;margin:var(--space-2) 0;overflow-wrap:anywhere}._metrics_8bc3y_25{display:flex;gap:var(--space-5);margin:0}._metrics_8bc3y_25 dt{font-size:var(--text-xs-size);color:var(--text-secondary)}._metrics_8bc3y_25 dd{font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:28px;margin:var(--space-2) 0 0;letter-spacing:-.04em}._content_8bc3y_28{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(220px,1fr);border-block:1px solid var(--border-default)}._flow_8bc3y_29{min-width:0;padding:var(--space-5) var(--space-6)}._sectionTitle_8bc3y_30{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-2);justify-content:space-between;margin-bottom:var(--space-5)}._sectionTitle_8bc3y_30 h3,._inspector_8bc3y_31 h3{font-family:var(--font-display);margin:0;font-size:var(--text-md-size)}._sectionTitle_8bc3y_30 span{font-size:var(--text-xs-size);color:var(--text-tertiary)}._campaigns_8bc3y_33{margin:0;padding:0;list-style:none}._campaigns_8bc3y_33>li{display:grid;grid-template-columns:34px minmax(0,1fr);column-gap:var(--space-3);position:relative;padding-bottom:var(--space-5)}._campaigns_8bc3y_33>li:not(:last-child):before{content:"";position:absolute;top:34px;left:16px;bottom:0;border-left:1px solid var(--border-strong)}._number_8bc3y_36{font-variant-numeric:tabular-nums;font-family:var(--font-display);font-size:var(--text-sm-size);background:var(--bg-selected);border:1px solid var(--accent-300);color:var(--accent-600);display:grid;place-items:center;width:34px;height:34px;border-radius:50%}._campaign_8bc3y_33{min-width:0;padding-top:var(--space-1)}._campaign_8bc3y_33 h4{font-size:var(--text-base-size);margin:0 0 var(--space-2);overflow-wrap:anywhere}._campaign_8bc3y_33 p{font-size:var(--text-sm-size);line-height:1.6;margin:0 0 var(--space-3);overflow-wrap:anywhere}._campaign_8bc3y_33 ._dependencies_8bc3y_40{color:var(--text-secondary);font-size:var(--text-xs-size)}._target_8bc3y_41{display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--space-2);padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas)}._target_8bc3y_41 span{font-size:var(--text-xs-size);color:var(--text-secondary)}._target_8bc3y_41 code{font-size:var(--text-xs-size);overflow-wrap:anywhere}._campaign_8bc3y_33 details{margin-top:var(--space-3)}._engineering_8bc3y_1 summary{font-size:var(--text-xs-size);color:var(--text-secondary);cursor:pointer;min-height:32px;padding-block:var(--space-2)}._limits_8bc3y_46{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);margin-block:var(--space-2) var(--space-4)}._limits_8bc3y_46 dt,._facts_8bc3y_47 dt{font-size:var(--text-xs-size);color:var(--text-secondary)}._limits_8bc3y_46 dd,._facts_8bc3y_47 dd{margin:var(--space-1) 0 0;font-size:var(--text-sm-size);overflow-wrap:anywhere}._inspector_8bc3y_31{min-width:0;padding:var(--space-5);border-left:1px solid var(--border-default);background:var(--bg-canvas)}._facts_8bc3y_47{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4);margin-block:var(--space-5)}._inspector_8bc3y_31 p{color:var(--text-secondary);font-size:var(--text-xs-size);line-height:1.65}._receipts_8bc3y_52{margin:0;padding:0;list-style:none}._receipts_8bc3y_52 li{padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);margin-bottom:var(--space-3);background:var(--bg-surface)}._receipts_8bc3y_52 strong{display:block;margin-bottom:var(--space-2);font-size:var(--text-sm-size);overflow-wrap:anywhere}._receipts_8bc3y_52 code,._identity_8bc3y_55 code{font-size:var(--text-xs-size);overflow-wrap:anywhere}._reasons_8bc3y_56{margin:var(--space-3) 0;padding-left:var(--space-4);list-style:disc;font-size:var(--text-xs-size);color:var(--text-secondary)}._scope_8bc3y_57{border-top:1px solid var(--border-default);margin-top:var(--space-4);padding-top:var(--space-3)}._controls_8bc3y_5{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);padding:var(--space-5) var(--space-6)}._controls_8bc3y_5>div:first-child{max-width:54ch}._controls_8bc3y_5 strong{font-size:var(--text-sm-size);display:block;margin-bottom:var(--space-2)}._actions_8bc3y_61{display:flex;flex-shrink:0;gap:var(--space-2);flex-wrap:wrap}._message_8bc3y_62,._warning_8bc3y_62,._error_8bc3y_62{margin:var(--space-3) var(--space-6);padding:var(--space-3);font-size:var(--text-sm-size);line-height:1.6;overflow-wrap:anywhere}._message_8bc3y_62{background:var(--bg-canvas);color:var(--text-secondary)}._warning_8bc3y_62{background:var(--status-warning-bg);color:var(--status-warning-fg)}._error_8bc3y_62{background:var(--status-danger-bg);color:var(--status-danger-fg)}._empty_8bc3y_66{margin:var(--space-6);padding-block:var(--space-6);max-width:62ch;color:var(--text-secondary);line-height:1.7}._empty_8bc3y_66 h3{color:var(--text-primary);font-family:var(--font-display);font-size:var(--text-xl-size)}._orbit_8bc3y_68{display:inline-block;color:var(--accent-600);font-size:48px;line-height:1}@media(max-width:1500px){._mission_8bc3y_23{grid-template-columns:1fr;gap:var(--space-4)}._controls_8bc3y_5{flex-wrap:wrap}}@media(max-width:720px){._content_8bc3y_28{grid-template-columns:1fr}._inspector_8bc3y_31{border-left:0;border-top:1px solid var(--border-default)}._header_8bc3y_2,._selection_8bc3y_12,._flow_8bc3y_29,._controls_8bc3y_5{padding:var(--space-4)}._mission_8bc3y_23,._admission_8bc3y_15{margin-inline:var(--space-4);padding:var(--space-4)}._metrics_8bc3y_25{gap:var(--space-4);flex-wrap:wrap}._actions_8bc3y_61{width:100%}._actions_8bc3y_61 button{flex:1}._selection_8bc3y_12 select{font-size:16px}}@media(pointer:coarse){._engineering_8bc3y_1 :is(button,select,summary){min-height:44px}}@media(prefers-reduced-motion:reduce){._engineering_8bc3y_1 *,._engineering_8bc3y_1 *:before,._engineering_8bc3y_1 *:after{animation:none;transition:none;scroll-behavior:auto}}._bar_l0wsp_1{display:flex;justify-content:space-between;align-items:center;gap:var(--space-5);padding:var(--space-4) max(var(--space-6),calc((100vw - 1440px)/2));border-bottom:1px solid var(--border-default);background:var(--bg-surface)}._identity_l0wsp_2{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2) var(--space-4);min-width:0}._brand_l0wsp_3{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3);min-width:0}._brand_l0wsp_3 strong{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:-.035em}._brandMark_l0wsp_5{flex-shrink:0;width:var(--space-8);height:var(--space-8);fill:none;stroke:var(--accent-600);stroke-width:1.8;stroke-linejoin:round;stroke-linecap:round}._workspace_l0wsp_6{padding-left:var(--space-3);border-left:1px solid var(--border-strong);color:var(--text-secondary);font-size:var(--text-sm-size)}._scopeBadge_l0wsp_7{padding:var(--space-1) var(--space-2);background:var(--bg-canvas);color:var(--text-secondary);border:1px solid var(--border-default);border-radius:var(--radius-xs);font-size:var(--text-xs-size)}._store_l0wsp_8{min-width:0;font-size:var(--text-xs-size);color:var(--text-secondary)}._store_l0wsp_8[open]{flex-basis:100%}._store_l0wsp_8 summary{cursor:pointer;padding:var(--space-2) 0;min-height:32px}._store_l0wsp_8 code{display:block;max-width:72ch;padding:var(--space-3);background:var(--bg-surface-raised);border:1px solid var(--border-strong);border-radius:var(--radius-sm);font-size:var(--text-xs-size);color:var(--text-primary);overflow-wrap:anywhere}._actions_l0wsp_12{display:flex;flex-shrink:0;gap:var(--space-2)}._actions_l0wsp_12 button,._notice_l0wsp_13 button{min-height:36px;padding:var(--space-2) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);font-size:var(--text-sm-size)}._actions_l0wsp_12 button:hover,._notice_l0wsp_13 button:hover{background:var(--bg-hover)}._main_l0wsp_15{max-width:1488px;margin:auto;padding:var(--space-6)}._notice_l0wsp_13{display:grid;justify-items:start;gap:var(--space-3);padding:var(--space-5);background:var(--status-warning-bg);border:1px solid var(--status-warning-solid);border-radius:var(--radius-md)}._checking_l0wsp_17{padding:var(--space-8)}@media(max-width:1000px){._identity_l0wsp_2{gap:var(--space-2) var(--space-3)}._brand_l0wsp_3{flex-basis:100%}}@media(max-width:700px){._bar_l0wsp_1{flex-direction:column;align-items:stretch;padding:var(--space-4);gap:var(--space-3)}._main_l0wsp_15{padding:var(--space-5) var(--space-4)}._actions_l0wsp_12{justify-content:flex-end}}
|