@ashlr/hub 3.4.0 → 3.5.1
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 +107 -1
- package/README.md +3 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/local-runtime.js +40 -9
- package/dist/cli/local-runtime.js.map +1 -1
- package/dist/core/fleet/external-skill-audit.js +1 -1
- package/dist/core/fleet/external-skill-audit.js.map +1 -1
- package/dist/core/local-eval/classify.d.ts +57 -0
- package/dist/core/local-eval/classify.js +121 -0
- package/dist/core/local-eval/classify.js.map +1 -0
- package/dist/core/local-eval/configuration.d.ts +37 -0
- package/dist/core/local-eval/configuration.js +171 -0
- package/dist/core/local-eval/configuration.js.map +1 -0
- package/dist/core/local-eval/index.d.ts +15 -0
- package/dist/core/local-eval/index.js +16 -0
- package/dist/core/local-eval/index.js.map +1 -0
- package/dist/core/local-eval/main.d.ts +31 -0
- package/dist/core/local-eval/main.js +174 -0
- package/dist/core/local-eval/main.js.map +1 -0
- package/dist/core/local-eval/report.d.ts +25 -0
- package/dist/core/local-eval/report.js +157 -0
- package/dist/core/local-eval/report.js.map +1 -0
- package/dist/core/local-eval/runner.d.ts +55 -0
- package/dist/core/local-eval/runner.js +290 -0
- package/dist/core/local-eval/runner.js.map +1 -0
- package/dist/core/local-eval/tasks.d.ts +22 -0
- package/dist/core/local-eval/tasks.js +303 -0
- package/dist/core/local-eval/tasks.js.map +1 -0
- package/dist/core/local-eval/trace.d.ts +67 -0
- package/dist/core/local-eval/trace.js +309 -0
- package/dist/core/local-eval/trace.js.map +1 -0
- package/dist/core/local-eval/types.d.ts +262 -0
- package/dist/core/local-eval/types.js +23 -0
- package/dist/core/local-eval/types.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.d.ts +68 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.js +120 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.d.ts +15 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.js +21 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy.d.ts +2 -1
- package/dist/core/local-runtime/llama/anthropic-proxy.js +14 -6
- package/dist/core/local-runtime/llama/anthropic-proxy.js.map +1 -1
- package/dist/core/local-runtime/llama/anthropic-shim.d.ts +33 -0
- package/dist/core/local-runtime/llama/anthropic-shim.js +59 -0
- package/dist/core/local-runtime/llama/anthropic-shim.js.map +1 -1
- package/dist/core/local-runtime/llama/config.d.ts +123 -6
- package/dist/core/local-runtime/llama/config.js +196 -6
- package/dist/core/local-runtime/llama/config.js.map +1 -1
- package/dist/core/local-runtime/llama/index.d.ts +15 -0
- package/dist/core/local-runtime/llama/index.js +13 -0
- package/dist/core/local-runtime/llama/index.js.map +1 -1
- package/dist/core/local-runtime/llama/paths.d.ts +17 -0
- package/dist/core/local-runtime/llama/paths.js +25 -0
- package/dist/core/local-runtime/llama/paths.js.map +1 -1
- package/dist/core/local-runtime/llama/proxy-invocation.d.ts +101 -0
- package/dist/core/local-runtime/llama/proxy-invocation.js +134 -0
- package/dist/core/local-runtime/llama/proxy-invocation.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-launchd.d.ts +83 -0
- package/dist/core/local-runtime/llama/proxy-launchd.js +216 -0
- package/dist/core/local-runtime/llama/proxy-launchd.js.map +1 -0
- package/dist/core/local-runtime/llama/shapes.d.ts +2 -1
- package/dist/core/local-runtime/llama/shapes.js +2 -1
- package/dist/core/local-runtime/llama/shapes.js.map +1 -1
- package/dist/core/verse/adapters/claude.js +16 -0
- package/dist/core/verse/adapters/claude.js.map +1 -1
- package/dist/core/verse/adapters/codex.js +60 -2
- package/dist/core/verse/adapters/codex.js.map +1 -1
- package/dist/core/verse/adapters/grok.js +13 -0
- package/dist/core/verse/adapters/grok.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +8 -9
- package/dist/core/verse/control-api.js +14 -114
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +50 -0
- package/dist/core/verse/github-api.js +211 -0
- package/dist/core/verse/github-api.js.map +1 -0
- package/dist/core/verse/github-proposal.d.ts +64 -0
- package/dist/core/verse/github-proposal.js +186 -0
- package/dist/core/verse/github-proposal.js.map +1 -0
- package/dist/core/verse/github-repo.d.ts +104 -0
- package/dist/core/verse/github-repo.js +476 -0
- package/dist/core/verse/github-repo.js.map +1 -0
- package/dist/core/verse/github-types.d.ts +174 -0
- package/dist/core/verse/github-types.js +31 -0
- package/dist/core/verse/github-types.js.map +1 -0
- package/dist/core/verse/mcp-cli-health.d.ts +149 -0
- package/dist/core/verse/mcp-cli-health.js +227 -0
- package/dist/core/verse/mcp-cli-health.js.map +1 -0
- package/dist/core/verse/mcp-control-api.d.ts +68 -0
- package/dist/core/verse/mcp-control-api.js +322 -0
- package/dist/core/verse/mcp-control-api.js.map +1 -0
- package/dist/core/verse/mcp-mutation.d.ts +187 -0
- package/dist/core/verse/mcp-mutation.js +471 -0
- package/dist/core/verse/mcp-mutation.js.map +1 -0
- package/dist/core/verse/mcp-scope.d.ts +114 -0
- package/dist/core/verse/mcp-scope.js +149 -0
- package/dist/core/verse/mcp-scope.js.map +1 -0
- package/dist/core/verse/mcp-seat-view.d.ts +197 -0
- package/dist/core/verse/mcp-seat-view.js +322 -0
- package/dist/core/verse/mcp-seat-view.js.map +1 -0
- package/dist/core/verse/path-guard.d.ts +115 -0
- package/dist/core/verse/path-guard.js +171 -0
- package/dist/core/verse/path-guard.js.map +1 -0
- package/dist/core/verse/seats.js +30 -2
- package/dist/core/verse/seats.js.map +1 -1
- package/dist/core/verse/session-engine.js +60 -1
- package/dist/core/verse/session-engine.js.map +1 -1
- package/dist/core/verse/session-store.js +20 -0
- package/dist/core/verse/session-store.js.map +1 -1
- package/dist/core/verse/types.d.ts +225 -1
- package/dist/core/verse/types.js +26 -0
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +16 -1
- package/dist/core/verse/verse-api.js +338 -16
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +130 -0
- package/dist/core/verse/workspaces.js +501 -0
- package/dist/core/verse/workspaces.js.map +1 -0
- package/dist/core/web/api.js +23 -0
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/public/next/assets/App-BbVoUCIi.js +7 -0
- package/dist/core/web/public/next/assets/App-BbVoUCIi.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Cgi6j1Gk.css +1 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-BW9iVjUa.js +2 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-BW9iVjUa.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-CRqHUhED.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-Cpk_oEhc.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js +80 -0
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-LQiAn6Eu.css +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CXevY3Au.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CXevY3Au.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-Bn0CgEGz.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-Bn0CgEGz.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-C8HHTnVE.css +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-QKyisN2L.js +7 -0
- package/dist/core/web/public/next/assets/DiffViewer-QKyisN2L.js.map +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-DbSHPy3w.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DbSHPy3w.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-C-PCgCzo.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-C-PCgCzo.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-Dw8ZjmkS.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Dw8ZjmkS.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-CWxtTNlD.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bk5HipM0.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bk5HipM0.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Dh7A-hLD.css +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Bqa8DH57.css +1 -0
- package/dist/core/web/public/next/assets/UniverseView-D8k9q0ce.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-D8k9q0ce.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-B2E06ZH1.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-B2E06ZH1.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-D2E3mU9a.css +1 -0
- package/dist/core/web/public/next/assets/charts-CsrtT4rk.css +1 -0
- package/dist/core/web/public/next/assets/charts-DSUpczxG.js +2 -0
- package/dist/core/web/public/next/assets/charts-DSUpczxG.js.map +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-C4jfYHrj.js +2 -0
- package/dist/core/web/public/next/assets/global-C4jfYHrj.js.map +1 -0
- package/dist/core/web/public/next/assets/global-D463gG1X.css +1 -0
- package/dist/core/web/public/next/assets/icons-BxOX8-XB.js +2 -0
- package/dist/core/web/public/next/assets/icons-BxOX8-XB.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BMRIET7F.js +11 -0
- package/dist/core/web/public/next/assets/index-BMRIET7F.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-AxnVa02h.js +2 -0
- package/dist/core/web/public/next/assets/queries-AxnVa02h.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BO6c94Wp.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BO6c94Wp.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-cE4LkKpE.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/README.md +4 -0
- 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/cli/activation.d.ts +0 -41
- package/dist/cli/activation.js +0 -485
- package/dist/cli/activation.js.map +0 -1
- package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
- package/dist/core/fleet/generated-repair-resolution.js +0 -245
- package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
- package/dist/core/local-runtime/llama/port.d.ts +0 -17
- package/dist/core/local-runtime/llama/port.js +0 -47
- package/dist/core/local-runtime/llama/port.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
- package/dist/core/local-runtime/llama/proxy-host.js +0 -159
- package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
- package/dist/core/local-runtime/llama/proxy-process.js +0 -250
- package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
- package/dist/core/local-runtime/llama/proxy-record.js +0 -133
- package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
- package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
- package/dist/core/web/public/next/assets/App-BCKqSppK.css +0 -1
- package/dist/core/web/public/next/assets/App-LuILXjWG.js +0 -16
- package/dist/core/web/public/next/assets/App-LuILXjWG.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-B_Xor8JH.js +0 -2
- package/dist/core/web/public/next/assets/ApprovalsSection-B_Xor8JH.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-CRP59wSb.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BB8RD-tv.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BEwITtPJ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-BEwITtPJ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DrxqhBPK.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-bRAzlMth.js +0 -77
- package/dist/core/web/public/next/assets/ChatSection-bRAzlMth.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-BqkZdPs_.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-BqkZdPs_.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-CPmedg4S.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-CPmedg4S.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-DxN7RgB5.css +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DmPJbeM_.js +0 -7
- package/dist/core/web/public/next/assets/DiffViewer-DmPJbeM_.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-hN7X6wGT.css +0 -1
- package/dist/core/web/public/next/assets/Epistemic-DiyMyeaN.css +0 -1
- package/dist/core/web/public/next/assets/Epistemic-M3SxLHjq.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-M3SxLHjq.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-CGBsbXUX.css +0 -1
- package/dist/core/web/public/next/assets/Meter-D_X7c9U3.js +0 -2
- package/dist/core/web/public/next/assets/Meter-D_X7c9U3.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Ba5ZHu-8.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Ba5ZHu-8.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-O7jUBOmX.css +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-vHGpmyzb.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-vHGpmyzb.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-B5g6JEVk.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-B5g6JEVk.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DLl4DbGG.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BIpdnxp-.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CroxuKoi.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CroxuKoi.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DGJMdUh2.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-p-7FCGfn.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-p-7FCGfn.js.map +0 -1
- package/dist/core/web/public/next/assets/Skeleton-4qq4HuJO.js +0 -2
- package/dist/core/web/public/next/assets/Skeleton-4qq4HuJO.js.map +0 -1
- package/dist/core/web/public/next/assets/Skeleton-D2JaTXyv.css +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-BbEdqEGn.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-BbEdqEGn.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-TpDqZf6K.css +0 -1
- package/dist/core/web/public/next/assets/TableView-R6Yeztp1.css +0 -1
- package/dist/core/web/public/next/assets/TableView-nyYs7Sv1.js +0 -2
- package/dist/core/web/public/next/assets/TableView-nyYs7Sv1.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CiZZxRPV.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DjTpQUrA.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DjTpQUrA.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-BtApwayT.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-BtApwayT.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-gBxl6yum.css +0 -1
- package/dist/core/web/public/next/assets/UsageSection-Db99N6ao.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-Db99N6ao.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-UUYDidOg.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-COa3J2dO.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-COa3J2dO.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-BeRYd1Bu.css +0 -1
- package/dist/core/web/public/next/assets/global-CNVapoV1.js +0 -2
- package/dist/core/web/public/next/assets/global-CNVapoV1.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BkUlX2Se.js +0 -51
- package/dist/core/web/public/next/assets/index-BkUlX2Se.js.map +0 -1
- package/dist/core/web/public/next/assets/index-YNTgDG2b.js +0 -2
- package/dist/core/web/public/next/assets/index-YNTgDG2b.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-C9XS4SYq.js +0 -2
- package/dist/core/web/public/next/assets/queries-C9XS4SYq.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-Bql1nA-z.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-Bql1nA-z.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-IrNQKtER.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-IrNQKtER.js.map +0 -1
- package/node_modules/which/CHANGELOG.md +0 -166
- /package/node_modules/marked/{LICENSE.md → LICENSE} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._chip_rrd6q_8{align-items:center;gap:var(--space-1);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--status-unknown-fg);white-space:nowrap;flex:none;display:inline-flex}._chipGlyph_rrd6q_22{font-family:var(--font-ui);letter-spacing:0;font-size:10px;line-height:1}._chip_rrd6q_8[data-capacity=ready]{color:var(--status-success-fg)}._chip_rrd6q_8[data-capacity=tight]{color:var(--status-warning-fg)}._chip_rrd6q_8[data-capacity=blocked]{color:var(--status-danger-fg)}._chip_rrd6q_8[data-capacity=unread]{color:var(--status-unknown-fg)}._window_rrd6q_35,._windowLead_rrd6q_36{flex-direction:column;gap:2px;min-width:0;display:flex}._windowLead_rrd6q_36 ._windowLabel_rrd6q_43,._windowLead_rrd6q_36 ._pct_rrd6q_44{color:var(--text-primary)}._windowLabel_rrd6q_43{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-secondary);overflow:hidden}._pct_rrd6q_44{font-variant-numeric:tabular-nums;font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-secondary)}._flag_rrd6q_60{font-family:var(--font-ui);font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);font-weight:var(--font-weight-medium);color:var(--status-danger-fg);white-space:nowrap}._unknownHead_rrd6q_69{justify-content:space-between;align-items:baseline;gap:var(--space-2);min-width:0;display:flex}._unknownValue_rrd6q_76{font-family:var(--font-ui);font-style:italic;font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--status-unknown-fg);flex:none}._unknownRule_rrd6q_85{border:0;border-top:1px dashed var(--border-strong);width:100%;height:0;margin:3px 0 0}._reset_rrd6q_93{text-overflow:ellipsis;font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-tertiary);margin:0;overflow:hidden}._note_rrd6q_104{gap:var(--space-2);flex-direction:column;min-width:0;display:flex}._noteHead_rrd6q_110{align-items:baseline;gap:var(--space-1) var(--space-2);flex-wrap:wrap;min-width:0;display:flex}._plan_rrd6q_117{padding:0 var(--space-1);border:1px solid var(--border-default);border-radius:var(--radius-xs);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-secondary);white-space:nowrap;flex:none}._noteSummary_rrd6q_130{min-width:0;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex:100%}._credits_rrd6q_137{font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-tertiary);margin:0}._composer_1q5ss_5{padding:0 var(--space-6) var(--space-4);background:var(--bg-surface);flex-shrink:0}._box_1q5ss_10{width:100%;max-width:var(--measure-read);border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--bg-input);transition:border-color var(--duration-fast) var(--ease-standard);margin:0 auto}._box_1q5ss_10:has(>._textarea_1q5ss_21:focus){border-color:var(--accent-500);box-shadow:0 0 0 1px var(--accent-500)}._boxListening_1q5ss_28{border-color:var(--status-running-solid)}._textarea_1q5ss_21{width:100%;min-height:calc(var(--control-h) + var(--space-2));resize:none;max-height:40vh;padding:var(--space-3) var(--space-3) var(--space-1);color:var(--text-primary);font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed);background:0 0;border:0;display:block}._textarea_1q5ss_21::placeholder{color:var(--text-tertiary)}._textarea_1q5ss_21:focus-visible{box-shadow:none;outline:none}._textarea_1q5ss_21:disabled{color:var(--text-secondary);cursor:not-allowed}._row_1q5ss_47{align-items:center;gap:var(--space-1);padding:var(--space-1) var(--space-2) var(--space-2) var(--space-2);display:flex}._spacer_1q5ss_53{flex:1}._engine-claude_1q5ss_56{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_1q5ss_57{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_1q5ss_58{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_1q5ss_59{--verse-engine:var(--engine-local,#7c5cff)}._engineDot_1q5ss_60{border-radius:var(--radius-full);background:var(--verse-engine,var(--text-tertiary));flex-shrink:0;width:5px;height:5px}._seatField_1q5ss_69{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._seatFieldCompact_1q5ss_70{flex-direction:row;align-items:center;max-width:320px}._fieldLabel_1q5ss_71{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);color:var(--text-primary)}._seatSelect_1q5ss_72{width:100%;min-height:var(--control-h);max-width:100%;padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:var(--text-sm-size);text-overflow:ellipsis}._seatSelect_1q5ss_72:hover:not(:disabled){border-color:var(--border-strong)}._seatSelect_1q5ss_72:disabled{opacity:.6;cursor:not-allowed}._seatFieldCompact_1q5ss_70 ._seatSelect_1q5ss_72{min-height:var(--control-h-sm);font-size:var(--text-xs-size);background:0 0;border-color:#0000}._seatPillWrap_1q5ss_89{min-width:0;display:inline-flex;position:relative}._seatPill_1q5ss_89{align-items:center;gap:var(--space-2);max-width:34ch;min-height:var(--control-h-xs);padding:0 var(--space-2);border-radius:var(--radius-xs);color:var(--text-secondary);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);display:inline-flex}._seatPill_1q5ss_89:hover:not(:disabled),._seatPill_1q5ss_89[aria-expanded=true]{background:var(--bg-hover);color:var(--text-primary)}._seatPill_1q5ss_89:active:not(:disabled){background:var(--bg-active)}._seatPill_1q5ss_89:disabled{opacity:.6;cursor:not-allowed}._seatPillText_1q5ss_107{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._seatMenu_1q5ss_109{bottom:calc(100% + var(--space-2));z-index:var(--z-dropdown);min-width:260px;max-width:360px;padding:var(--space-1);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface-raised);color:var(--text-primary);box-shadow:var(--shadow-menu,var(--shadow-md));flex-direction:column;gap:1px;display:flex;position:absolute;left:0}._seatMenuHeading_1q5ss_126{margin:0 0 var(--space-1);padding:var(--space-2) var(--space-2) var(--space-2);border-bottom:1px solid var(--border-subtle);font-size:var(--text-xs-size);color:var(--text-tertiary)}._seatMenuHeading_1q5ss_126 strong{color:var(--text-primary);font-weight:var(--font-weight-medium)}._seatMenuEmpty_1q5ss_134{padding:var(--space-2);font-size:var(--text-xs-size);color:var(--text-tertiary);margin:0}._seatMenuItem_1q5ss_135{align-items:center;gap:var(--space-2);width:100%;padding:var(--space-2);border-radius:var(--radius-xs);text-align:left;color:var(--text-primary);display:flex}._seatMenuItem_1q5ss_135:hover,._seatMenuItem_1q5ss_135:focus-visible{background:var(--bg-hover)}._seatMenuItem_1q5ss_135:active{background:var(--bg-active)}._seatMenuText_1q5ss_148{flex-direction:column;gap:1px;min-width:0;display:flex}._seatMenuPrimary_1q5ss_149{font-size:var(--text-sm-size)}._seatMenuSecondary_1q5ss_150{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary)}._seatMenuCapacity_1q5ss_156{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._seatMenuItem_1q5ss_135[data-capacity=tight] ._seatMenuCapacity_1q5ss_156{color:var(--status-warning-fg)}._seatMenuItem_1q5ss_135[data-capacity=blocked] ._seatMenuCapacity_1q5ss_156{color:var(--status-danger-fg)}._dictationWrap_1q5ss_167{align-items:center;display:inline-flex;position:relative}._dictation_1q5ss_167{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-xs);color:var(--text-tertiary);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);justify-content:center;align-items:center;display:inline-flex;position:relative}._dictation_1q5ss_167:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}._dictation_1q5ss_167:active:not(:disabled){background:var(--bg-active)}._dictation_1q5ss_167:disabled{opacity:.45;cursor:not-allowed}._dictationLive_1q5ss_182{color:var(--status-running-fg);background:var(--status-running-bg)}._dictationPulse_1q5ss_183{border-radius:var(--radius-sm);border:1px solid var(--status-running-solid);pointer-events:none;animation:1.4s ease-out infinite _verse-ring_1q5ss_1;position:absolute;inset:-2px}._dictationHint_1q5ss_191{bottom:calc(100% + var(--space-2));width:max-content;max-width:260px;padding:var(--space-2) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface-raised);color:var(--text-primary);box-shadow:var(--shadow-menu,var(--shadow-md));font-size:var(--text-xs-size);line-height:var(--text-xs-line);opacity:0;pointer-events:none;transition:opacity var(--duration-fast) var(--ease-standard);z-index:var(--z-dropdown);position:absolute;right:0}._dictationWrap_1q5ss_167:hover ._dictationHint_1q5ss_191,._dictationWrap_1q5ss_167:focus-within ._dictationHint_1q5ss_191{opacity:1}._dictationError_1q5ss_212{margin-left:var(--space-2);font-size:var(--text-xs-size);color:var(--status-danger-fg)}._send_1q5ss_215,._stop_1q5ss_216{align-items:center;gap:var(--space-2);min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);border:1px solid #0000;display:inline-flex}._send_1q5ss_215{background:var(--accent-600);color:var(--accent-contrast)}._send_1q5ss_215:hover:not(:disabled){background:var(--accent-700)}._send_1q5ss_215:active:not(:disabled){background:var(--accent-700);border-color:var(--accent-700)}._send_1q5ss_215:disabled{opacity:.4;cursor:not-allowed}._stop_1q5ss_216{border-color:var(--border-default);color:var(--text-primary)}._stop_1q5ss_216:hover{border-color:var(--status-danger-solid);color:var(--status-danger-fg)}._stop_1q5ss_216:active{background:var(--status-danger-bg)}._stopIcon_1q5ss_235{background:currentColor;border-radius:1px;width:8px;height:8px}._help_1q5ss_238{max-width:var(--measure-read);margin:var(--space-2) auto 0;min-height:var(--text-2xs-line);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);line-height:1.4}._helpQuiet_1q5ss_246{min-height:0;margin-top:0}._help_1q5ss_238 kbd{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);color:var(--text-secondary);padding:0 3px}._helpError_1q5ss_255{color:var(--status-danger-fg)}@keyframes _verse-ring_1q5ss_1{0%{opacity:.9;transform:scale(.94)}to{opacity:0;transform:scale(1.35)}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._dictationPulse_1q5ss_183{animation:none}}:root[data-motion=reduce] ._dictationPulse_1q5ss_183{animation:none}@media (max-width:900px){._composer_1q5ss_5{padding:0 var(--space-4) var(--space-3)}}@media (max-width:640px){._row_1q5ss_47{flex-wrap:wrap}._seatPill_1q5ss_89{max-width:100%}._textarea_1q5ss_21{font-size:16px}}._cost_1q5ss_283{max-width:var(--measure-read);margin:var(--space-2) auto 0;padding-left:var(--space-3);border-left:2px solid var(--status-warning-solid);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed)}._cost_1q5ss_283[data-tone=danger]{border-left-color:var(--status-danger-solid)}._costFigure_1q5ss_295{font-family:var(--font-display);font-variant-numeric:tabular-nums;font-weight:var(--font-weight-medium);color:var(--text-primary)}._width_1185y_1{width:min(520px,100vw - 32px)}._form_1185y_3{gap:var(--space-4);display:grid}._field_1185y_4{gap:var(--space-1);min-width:0;display:grid}._label_1185y_5{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._optional_1185y_13{font-weight:var(--font-weight-regular);letter-spacing:0;text-transform:none;opacity:.8}._select_1185y_15,._input_1185y_16{width:100%;min-height:var(--control-h);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-size:var(--text-sm-size);text-overflow:ellipsis}._input_1185y_16::placeholder{color:var(--text-tertiary)}._select_1185y_15,._input_1185y_16{transition:border-color var(--duration-fast) var(--ease-standard), box-shadow var(--duration-fast) var(--ease-standard)}._select_1185y_15:hover:not(:disabled),._input_1185y_16:hover:not(:disabled){border-color:var(--border-strong)}._select_1185y_15:focus-visible,._input_1185y_16:focus-visible{border-color:var(--border-focus);box-shadow:var(--shadow-focus-ring)}._hint_1185y_40{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._error_1185y_41{padding-left:var(--space-3);border-left:2px solid var(--status-danger-solid);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._actions_1185y_49{justify-content:flex-end;gap:var(--space-2);display:flex}._cancel_1185y_50,._create_1185y_51{min-height:var(--control-h);padding:0 var(--space-4);border-radius:var(--radius-sm);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);border:1px solid #0000}._cancel_1185y_50{color:var(--text-secondary)}._cancel_1185y_50:hover{background:var(--bg-hover);color:var(--text-primary)}._cancel_1185y_50:active{background:var(--bg-active)}._create_1185y_51{background:var(--accent-600);color:var(--accent-contrast)}._create_1185y_51:hover:not(:disabled),._create_1185y_51:active:not(:disabled){background:var(--accent-700)}._create_1185y_51:disabled{opacity:.4;cursor:not-allowed}._capacity_1185y_72{padding-left:var(--space-3);border-left:1px solid var(--border-default)}._rootRow_1185y_78{gap:var(--space-2);margin-top:var(--space-2);align-items:center;display:flex}._rootRow_1185y_78 ._input_1185y_16{flex:auto;min-width:0}._removeRoot_1185y_87,._addRoot_1185y_88{padding:var(--space-1) var(--space-2);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--surface-raised);color:var(--text-default);font-size:var(--text-xs);cursor:pointer;flex:none}._addRoot_1185y_88{margin-top:var(--space-2);align-self:flex-start}._removeRoot_1185y_87:hover,._addRoot_1185y_88:hover{border-color:var(--border-strong,var(--border-subtle))}._width_k2wwr_1{width:min(560px,100vw - 32px)}._input_k2wwr_3{width:100%;min-height:calc(var(--control-h) + var(--space-1));padding:0 var(--space-3);margin-bottom:var(--space-2);border:0;border-bottom:1px solid var(--border-subtle);color:var(--text-primary);font-size:var(--text-md-size);background:0 0;border-radius:0}._input_k2wwr_3::placeholder{color:var(--text-tertiary)}._input_k2wwr_3:focus-visible{box-shadow:inset 0 -1px 0 var(--accent-500);border-bottom-color:var(--accent-500);outline:none}._list_k2wwr_19{max-height:min(60vh,440px);margin:0;padding:0;list-style:none;overflow-y:auto}._row_k2wwr_27{align-items:center;gap:var(--space-3);min-height:calc(var(--density-row) + var(--space-2));padding:var(--space-1) var(--space-3);cursor:pointer;color:var(--text-secondary);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);grid-template-columns:2px minmax(0,1fr) auto;display:grid}._row_k2wwr_27:hover:not(._rowActive_k2wwr_41){background:var(--bg-hover);color:var(--text-primary)}._rowActive_k2wwr_41{background:var(--bg-selected);color:var(--text-primary)}._marker_k2wwr_44{width:2px;height:var(--engine-marker-h);background:var(--verse-engine,var(--text-tertiary));border-radius:1px}._engine-claude_k2wwr_45{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_k2wwr_46{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_k2wwr_47{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_k2wwr_48{--verse-engine:var(--engine-local,#7c5cff)}._rowText_k2wwr_50{flex-direction:column;gap:1px;min-width:0;display:flex}._rowPrimary_k2wwr_51{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);color:var(--text-primary);overflow:hidden}._rowSecondary_k2wwr_58{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);overflow:hidden}._rowActive_k2wwr_41 ._rowSecondary_k2wwr_58,._row_k2wwr_27:hover ._rowSecondary_k2wwr_58,._rowActive_k2wwr_41 ._rowTrailing_k2wwr_67,._row_k2wwr_27:hover ._rowTrailing_k2wwr_67{color:var(--text-secondary)}._rowTrailing_k2wwr_67{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._emptyRow_k2wwr_76{padding:var(--space-4) var(--space-3);color:var(--text-tertiary);font-size:var(--text-sm-size)}._roots_1h85g_8{padding:var(--space-4) var(--space-4) 0}._title_1h85g_10{align-items:center;gap:var(--space-2);margin:0 0 var(--space-2);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;display:flex}._count_1h85g_22{padding:0 var(--space-1);border-radius:var(--radius-sm);background:var(--surface-raised);font-variant-numeric:tabular-nums;letter-spacing:0}._workspace_1h85g_30{margin:0 0 var(--space-2);font-size:var(--text-xs);color:var(--text-muted)}._list_1h85g_36{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._root_1h85g_8{padding:var(--space-2);border-radius:var(--radius-sm);border-left:3px solid var(--border-subtle);background:var(--surface-raised)}._root_1h85g_8[data-tone=primary]{border-left-color:var(--accent)}._root_1h85g_8[data-tone=extra]{border-left-color:var(--border-strong,var(--border-subtle))}._root_1h85g_8[data-tone=unreachable]{border-left-color:var(--warning,#b7791f)}._root_1h85g_8[data-tone=missing]{border-left-color:var(--danger,#c53030)}._rootHead_1h85g_57{justify-content:space-between;align-items:baseline;gap:var(--space-2);display:flex}._name_1h85g_64{font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}._badge_1h85g_72{font-size:var(--text-2xs,.6875rem);text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);flex:none}._git_1h85g_80,._remote_1h85g_81,._caveat_1h85g_82{margin:var(--space-1) 0 0;font-size:var(--text-xs);color:var(--text-muted)}._git_1h85g_80{font-variant-numeric:tabular-nums}._remote_1h85g_81{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._caveat_1h85g_82{color:var(--text-strong,var(--text-default))}._note_1h85g_99,._error_1h85g_100{margin:var(--space-2) 0 0;font-size:var(--text-xs);color:var(--text-muted);line-height:1.45}._error_1h85g_100{color:var(--danger,#c53030)}._panel_b2xdj_3{background:var(--bg-canvas);flex-direction:column;min-height:0;display:flex}._head_b2xdj_10{justify-content:space-between;align-items:center;gap:var(--space-2);height:var(--strip-height);padding:0 var(--space-2) 0 var(--space-4);border-bottom:1px solid var(--border-subtle);flex-shrink:0;display:flex}._title_b2xdj_22{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._close_b2xdj_30{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-xs);color:var(--text-tertiary);font-size:var(--text-md-size);transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);justify-content:center;align-items:center;line-height:1;display:flex}._close_b2xdj_30:hover{background:var(--bg-hover);color:var(--text-primary)}._close_b2xdj_30:active{background:var(--bg-active)}._scroll_b2xdj_45{min-height:0;padding-bottom:var(--space-6);scrollbar-gutter:stable;flex:1;overflow-y:auto}._section_b2xdj_46{padding:var(--space-4) var(--space-4) 0}._section_b2xdj_46+._section_b2xdj_46{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--border-subtle)}._sectionTitle_b2xdj_48{align-items:baseline;gap:var(--space-2);margin-bottom:var(--space-3);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);flex-wrap:wrap;display:flex}._asOf_b2xdj_64{font-family:var(--font-display);font-weight:var(--font-weight-regular,400);font-variant-numeric:tabular-nums;letter-spacing:0;text-transform:none;color:var(--text-tertiary);margin-left:auto}._refresh_b2xdj_73{min-height:var(--control-h-xs);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-xs);font-family:var(--font-ui);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);letter-spacing:0;text-transform:none;color:var(--text-secondary);transition:border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex:none}._refresh_b2xdj_73:hover{border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-hover)}._refresh_b2xdj_73:active{background:var(--bg-active)}._count_b2xdj_89{font-variant-numeric:tabular-nums;color:var(--text-secondary)}._skeleton_b2xdj_90{gap:var(--space-2);flex-direction:column;display:flex}._muted_b2xdj_91{color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._muted_b2xdj_91 code{font-size:.95em}._engineGroup_b2xdj_95+._engineGroup_b2xdj_95{margin-top:var(--space-4)}._engineTitle_b2xdj_96{margin-bottom:var(--space-2);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);color:var(--text-tertiary)}._groupToggle_b2xdj_105,._seatToggle_b2xdj_106{align-items:center;gap:var(--space-2);width:100%;min-width:0;min-height:var(--control-h-xs);text-align:left;color:inherit;display:flex}._groupToggle_b2xdj_105{font:inherit;letter-spacing:inherit}._seatToggle_b2xdj_106{min-height:var(--density-row,32px)}._groupToggle_b2xdj_105:hover,._seatToggle_b2xdj_106:hover{color:var(--text-secondary)}._groupToggle_b2xdj_105:focus-visible,._seatToggle_b2xdj_106:focus-visible{outline:2px solid var(--accent-500);outline-offset:2px;border-radius:var(--radius-xs)}._twist_b2xdj_126{width:0;height:0;transition:transform var(--duration-fast) var(--ease-standard);border-top:3px solid #0000;border-bottom:3px solid #0000;border-left:4px solid;flex:none}._twist_b2xdj_126[data-open]{transform:rotate(90deg)}._groupToggle_b2xdj_105 ._count_b2xdj_89{margin-left:auto}._seatList_b2xdj_137,._models_b2xdj_137,._runningList_b2xdj_137{margin:0;padding:0;list-style:none}._seat_b2xdj_106{padding-left:var(--space-3);border-left:2px solid var(--verse-engine,var(--border-subtle))}._seat_b2xdj_106+._seat_b2xdj_106{margin-top:var(--space-3)}._engine-claude_b2xdj_143{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_b2xdj_144{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_b2xdj_145{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_b2xdj_146{--verse-engine:var(--engine-local,#7c5cff)}._seatHead_b2xdj_148{justify-content:space-between;align-items:center;gap:var(--space-2);min-width:0;display:flex}._seatToggle_b2xdj_106 ._seatLabel_b2xdj_149{color:var(--text-primary);flex:1}._seatLabel_b2xdj_149{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);color:var(--text-primary);overflow:hidden}._seatMeta_b2xdj_158{gap:var(--space-1);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);flex-wrap:wrap;margin-top:2px;display:flex}._seatSummary_b2xdj_166{margin-top:var(--space-1);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary)}._plan_b2xdj_169{font-family:var(--font-display);text-transform:uppercase;letter-spacing:var(--tracking-label,.06em);color:var(--text-secondary)}._num_b2xdj_170{font-family:var(--font-display);font-variant-numeric:tabular-nums}._notes_b2xdj_174{margin:var(--space-2) 0 0;gap:var(--space-1);flex-direction:column;padding:0;list-style:none;display:flex}._notes_b2xdj_174 li{padding-left:var(--space-2);border-left:1px solid var(--border-default);font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-tertiary);overflow-wrap:anywhere}._seatWindows_b2xdj_191{margin-top:var(--space-2);gap:var(--space-2);flex-direction:column;display:flex}._credits_b2xdj_192{margin:var(--space-2) 0 0;font-size:var(--text-2xs-size,11px);line-height:var(--text-2xs-line,14px);color:var(--text-tertiary)}._local_b2xdj_195{gap:var(--space-1);flex-direction:column;display:flex}._mono_b2xdj_196{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._models_b2xdj_137{margin-top:var(--space-1);flex-direction:column;gap:2px;display:flex}._models_b2xdj_137 code{font-size:var(--text-2xs-size,11px);color:var(--text-secondary)}._runningList_b2xdj_137{gap:var(--space-1);flex-direction:column;display:flex}._runningRow_b2xdj_209{align-items:center;gap:var(--space-2);min-width:0;display:flex}._runningOpen_b2xdj_210{align-items:center;gap:var(--space-2);min-width:0;min-height:var(--density-row,32px);padding:0 var(--space-2);margin-left:calc(-1 * var(--space-2));border-radius:var(--radius-xs);text-align:left;transition:background var(--duration-fast) var(--ease-standard);flex:1;grid-template-columns:6px minmax(0,1fr);display:grid}._runningOpen_b2xdj_210:hover{background:var(--bg-hover)}._runningOpen_b2xdj_210:active{background:var(--bg-active)}._runningOpen_b2xdj_210:hover ._runningMeta_b2xdj_230,._runningOpen_b2xdj_210:active ._runningMeta_b2xdj_230{color:var(--text-secondary)}._runningDot_b2xdj_232{border-radius:var(--radius-full);background:var(--status-running-solid);width:6px;height:6px;animation:1.8s ease-out infinite _verse-pulse-res_b2xdj_1}._runningTitle_b2xdj_239{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);color:var(--text-primary);grid-column:2;overflow:hidden}._runningMeta_b2xdj_230{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);grid-column:2;overflow:hidden}._stop_b2xdj_255{min-height:var(--control-h-xs);padding:0 var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-xs);color:var(--text-secondary);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);transition:border-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex-shrink:0}._stop_b2xdj_255:hover{border-color:var(--status-danger-solid);color:var(--status-danger-fg)}._stop_b2xdj_255:active{background:var(--status-danger-bg)}._usage_b2xdj_270{gap:var(--space-2) var(--space-4);grid-template-columns:1fr 1fr;margin:0;display:grid}._usage_b2xdj_270>div{flex-direction:column;gap:1px;min-width:0;display:flex}._usage_b2xdj_270 dt{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._usage_b2xdj_270 dd{font-family:var(--font-display);font-size:var(--text-sm-size);font-variant-numeric:tabular-nums;color:var(--text-primary);margin:0}@keyframes _verse-pulse-res_b2xdj_1{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--status-running-solid) 55%, transparent)}to{box-shadow:0 0 0 5px #0000}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._runningDot_b2xdj_232{animation:none}:root:not([data-motion=full]) ._twist_b2xdj_126{transition:none}}:root[data-motion=reduce] ._runningDot_b2xdj_232{animation:none}:root[data-motion=reduce] ._twist_b2xdj_126{transition:none}._sidebar_bu0vt_1{background:var(--bg-canvas);flex-direction:column;min-height:0;display:flex}._head_bu0vt_9{align-items:center;gap:var(--space-1);height:var(--strip-height);padding:0 var(--space-2) 0 var(--space-3);border-bottom:1px solid var(--border-subtle);height:calc(var(--strip-height) + var(--app-titlebar-height,0px));padding-top:var(--app-titlebar-height,0px);flex-shrink:0;display:flex;position:relative}._headDragStrip_bu0vt_40{height:var(--app-titlebar-height,0px);-webkit-app-region:drag;app-region:drag;pointer-events:auto;position:absolute;top:0;left:0;right:0}._search_bu0vt_51{flex:1;align-items:center;min-width:0;display:flex;position:relative}._searchIcon_bu0vt_58{color:var(--text-tertiary);pointer-events:none;display:flex;position:absolute;left:0}._search_bu0vt_51 input{width:100%;height:var(--control-h-sm);padding:0 var(--space-2) 0 22px;color:var(--text-primary);font-size:var(--text-sm-size);background:0 0;border:0}._search_bu0vt_51 input::placeholder{color:var(--text-tertiary)}._search_bu0vt_51 input::-webkit-search-cancel-button{appearance:none}._search_bu0vt_51:focus-within ._searchIcon_bu0vt_58{color:var(--accent-500)}._iconButton_bu0vt_80{width:var(--control-h-sm);height:var(--control-h-sm);border-radius:var(--radius-sm);color:var(--text-tertiary);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex-shrink:0;justify-content:center;align-items:center;display:flex}._iconButton_bu0vt_80:hover:not(:disabled){color:var(--text-primary);background:var(--bg-hover)}._iconButton_bu0vt_80:active:not(:disabled){background:var(--bg-active)}._iconButton_bu0vt_80:disabled{color:var(--text-disabled);cursor:not-allowed}._scroll_bu0vt_98{min-height:0;padding-bottom:var(--space-4);scrollbar-gutter:stable;flex:1;overflow-y:auto}._skeleton_bu0vt_105{gap:var(--space-3);padding:var(--space-4) var(--space-3);flex-direction:column;display:flex}._error_bu0vt_106{gap:var(--space-2);padding:var(--space-4) var(--space-3);color:var(--status-danger-fg);font-size:var(--text-sm-size);justify-items:start;display:grid}._error_bu0vt_106 button{min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-xs-size);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard)}._error_bu0vt_106 button:hover{background:var(--bg-hover);border-color:var(--border-strong)}._error_bu0vt_106 button:active{background:var(--bg-active)}._empty_bu0vt_125{padding:var(--space-8) var(--space-4);color:var(--text-tertiary);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._emptyTitle_bu0vt_131{color:var(--text-secondary);font-weight:var(--font-weight-medium);margin-bottom:var(--space-1)}._group_bu0vt_133{padding-top:var(--space-4)}._groupTitle_bu0vt_134{font-family:var(--font-display);align-items:baseline;gap:var(--space-2);padding:0 var(--space-3) var(--space-1);font-size:var(--text-2xs-size,11px);line-height:1.4;font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);display:flex}._groupName_bu0vt_147{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._enrolled_bu0vt_148{color:var(--text-tertiary);opacity:.7;font-weight:var(--font-weight-regular);flex-shrink:0}._list_bu0vt_150{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._session_bu0vt_153{align-items:center;gap:var(--space-2);width:100%;min-height:var(--density-row,32px);padding:0 var(--space-3) 0 var(--space-3);color:var(--text-secondary);text-align:left;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);grid-template-columns:2px minmax(0,1fr) auto auto;display:grid;position:relative}._session_bu0vt_153:hover{background:var(--bg-hover);color:var(--text-primary)}._session_bu0vt_153:active{background:var(--bg-active)}._session_bu0vt_153[aria-current]{background:var(--bg-selected);color:var(--text-primary)}._marker_bu0vt_170{width:2px;height:var(--engine-marker-h);background:var(--verse-engine,var(--text-tertiary));border-radius:1px}._engine-claude_bu0vt_176{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_bu0vt_177{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_bu0vt_178{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_bu0vt_179{--verse-engine:var(--engine-local,#7c5cff)}._sessionText_bu0vt_181{text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm-size);line-height:var(--text-sm-line);overflow:hidden}._running_bu0vt_190{border-radius:var(--radius-full);background:var(--status-running-solid);width:6px;height:6px;animation:1.8s ease-out infinite _verse-pulse_bu0vt_1}._errored_bu0vt_197{width:12px;height:12px;color:var(--status-danger-fg);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-bold);justify-content:center;align-items:center;line-height:1;display:flex}._seatSpent_bu0vt_212{width:12px;height:12px;color:var(--status-danger-fg);flex:none;justify-content:center;align-items:center;font-size:9px;line-height:1;display:flex}._time_bu0vt_224{text-align:right;min-width:3ch;font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);flex-shrink:0}._session_bu0vt_153:hover ._time_bu0vt_224,._session_bu0vt_153[aria-current] ._time_bu0vt_224{color:var(--text-secondary)}._footer_bu0vt_243{height:var(--control-h);padding:0 var(--space-3);border-top:1px solid var(--border-subtle);flex-shrink:0;align-items:center;display:flex}._footerButton_bu0vt_251{min-height:var(--control-h-xs);padding:0 var(--space-2);margin-left:calc(-1 * var(--space-2));border-radius:var(--radius-xs);color:var(--text-tertiary);font-size:var(--text-2xs-size,11px);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard)}._footerButton_bu0vt_251:hover{color:var(--text-primary);background:var(--bg-hover)}._footerButton_bu0vt_251:active{background:var(--bg-active)}@keyframes _verse-pulse_bu0vt_1{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--status-running-solid) 55%, transparent)}to{box-shadow:0 0 0 5px #0000}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._running_bu0vt_190{animation:none}}:root[data-motion=reduce] ._running_bu0vt_190{animation:none}._workspace_yz289_1{background:var(--bg-surface);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}._header_yz289_11{align-items:center;gap:var(--space-2);height:var(--strip-height);padding:0 var(--space-3);border-bottom:1px solid var(--border-subtle);flex-shrink:0;display:flex;position:relative}._headerSpacer_yz289_23{min-width:var(--space-2);flex:1}._title_yz289_25{min-width:0;margin-left:calc(-1 * var(--space-2));font-family:var(--font-display);font-size:var(--text-md-size);line-height:1.2;font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-display,-.02em)}._titleButton_yz289_29{max-width:100%;padding:2px var(--space-2);border-radius:var(--radius-xs);color:inherit;font:inherit;letter-spacing:inherit;text-align:left;text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}._titleButton_yz289_29:hover:not(:disabled){background:var(--bg-hover)}._titleButton_yz289_29:active:not(:disabled){background:var(--bg-active)}._titleButton_yz289_29:disabled{cursor:default}._titleInput_yz289_59{width:100%;max-width:48ch;padding:2px var(--space-2);border:1px solid var(--accent-500);border-radius:var(--radius-xs);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-display);font-size:var(--text-md-size);font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-display,-.02em)}._titleSkeleton_yz289_72{height:calc(var(--text-md-size) * 1.2);border-radius:var(--radius-xs);width:22ch;max-width:40%}._seatPill_yz289_81{align-items:center;gap:var(--space-2);min-width:0;max-width:34ch;padding:0 var(--space-2);height:var(--control-h-xs);border-radius:var(--radius-xs);background:color-mix(in srgb, var(--verse-engine,var(--text-tertiary)) 10%, transparent);color:var(--text-secondary);font-size:var(--text-2xs-size,11px);flex-shrink:0;display:inline-flex}._seatPill_yz289_81[data-seat-capacity]{max-width:46ch}._engineDot_yz289_100{border-radius:var(--radius-full);background:var(--verse-engine,var(--text-tertiary));flex-shrink:0;width:5px;height:5px}._seatText_yz289_107{text-overflow:ellipsis;white-space:nowrap;color:var(--text-primary);font-weight:var(--font-weight-medium);overflow:hidden}._projectName_yz289_114{padding-left:var(--space-2);border-left:1px solid var(--border-default);color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;overflow:hidden}._engine-claude_yz289_123{--verse-engine:var(--engine-claude,#c96442)}._engine-codex_yz289_124{--verse-engine:var(--engine-codex,#10a37f)}._engine-grok_yz289_125{--verse-engine:var(--engine-grok,#6b7280)}._engine-local_yz289_126{--verse-engine:var(--engine-local,#7c5cff)}._streamState_yz289_128{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);flex-shrink:0}._ghost_yz289_130,._ghostIcon_yz289_131,._danger_yz289_132{border-radius:var(--radius-xs);color:var(--text-tertiary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);flex-shrink:0}._ghostIcon_yz289_131{width:var(--control-h-sm);height:var(--control-h-sm);justify-content:center;align-items:center;display:flex}._ghost_yz289_130{min-height:var(--control-h-xs);padding:0 var(--space-2)}._ghostIcon_yz289_131:hover:not(:disabled),._ghost_yz289_130:hover:not(:disabled){color:var(--text-primary);background:var(--bg-hover)}._ghostIcon_yz289_131:active:not(:disabled),._ghost_yz289_130:active:not(:disabled){background:var(--bg-active)}._ghostIcon_yz289_131:disabled,._ghost_yz289_130:disabled{opacity:.4;cursor:not-allowed}._ghostIcon_yz289_131[aria-pressed=true]{color:var(--text-primary)}._danger_yz289_132{min-height:var(--control-h-xs);padding:0 var(--space-2);color:var(--status-danger-fg)}._danger_yz289_132:hover:not(:disabled){background:var(--status-danger-bg)}._danger_yz289_132:active:not(:disabled){background:var(--status-danger-bg);border-color:var(--status-danger-solid)}._confirm_yz289_158{align-items:center;gap:var(--space-1);display:inline-flex}._confirmText_yz289_159{font-size:var(--text-xs-size);color:var(--text-secondary)}._meter_yz289_170{--meter-color:var(--accent-500);--meter-text:var(--text-secondary);align-items:baseline;gap:var(--space-2);flex-shrink:0;display:inline-flex}._meter-warn_yz289_178{--meter-color:var(--status-warning-solid);--meter-text:var(--status-warning-fg)}._meter-danger_yz289_179{--meter-color:var(--status-danger-solid);--meter-text:var(--status-danger-fg)}._meter-unknown_yz289_180{--meter-color:var(--border-strong);--meter-text:var(--text-tertiary)}._meterTrack_yz289_183{background:0 0;height:2px;position:absolute;bottom:-1px;left:0;right:0}._meterFill_yz289_191{background:var(--meter-color);height:100%;transition:width var(--duration-slow) var(--ease-decelerate), background var(--duration-base) var(--ease-standard)}._meterInline_yz289_196 ._meterTrack_yz289_183{background:var(--meter-track);border-radius:var(--radius-full);width:64px;position:static;overflow:hidden}._meterText_yz289_204{align-items:baseline;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);display:inline-flex}._meterTokens_yz289_213{white-space:nowrap}._meterPercent_yz289_217{text-align:right;min-width:4ch;color:var(--meter-text);font-weight:var(--font-weight-medium)}._emptyState_yz289_221{justify-content:center;align-items:flex-start;gap:var(--space-3);max-width:52ch;padding:var(--space-8) var(--space-6);flex-direction:column;flex:1;margin:0 auto;display:flex}._emptyMark_yz289_232{color:var(--accent-500)}._emptyTitle_yz289_233{font-family:var(--font-display);font-size:var(--text-2xl-size);line-height:var(--text-2xl-line);font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-display,-.02em)}._emptyBody_yz289_240{color:var(--text-secondary);font-size:var(--text-md-size);line-height:var(--text-md-line)}._emptyButton_yz289_241{align-items:center;gap:var(--space-2);min-height:var(--control-h);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);transition:border-color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);display:inline-flex}._emptyButton_yz289_241:hover{border-color:var(--accent-500)}._emptyButton_yz289_241:active{background:var(--bg-active)}._emptyButton_yz289_241 kbd{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary)}._emptyWarn_yz289_257{padding-left:var(--space-3);border-left:2px solid var(--status-warning-solid);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._emptyWarn_yz289_257 code{font-size:var(--text-xs-size);color:var(--text-primary)}@media (max-width:900px){._projectName_yz289_114{display:none}}@media (max-width:760px){._meterTokens_yz289_213{display:none}._seatPill_yz289_81{max-width:18ch}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._meterFill_yz289_191{transition:none}}._header_yz289_11{padding-left:max(var(--space-3), calc(var(--app-traffic-light-inset,0px) - var(--rail-width,56px)))}._diff_6z1ga_30{--diff-add:color-mix(in srgb, var(--status-success-solid) 22%, var(--bg-code));--diff-del:color-mix(in srgb, var(--status-danger-solid) 22%, var(--bg-code));border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-code);overflow:hidden}._visuallyHidden_6z1ga_46{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._diffMulti_6z1ga_58{min-width:0}._diffHead_6z1ga_60{align-items:center;gap:var(--space-3);min-height:var(--control-h-xs);padding:0 var(--space-2) 0 var(--space-3);border-bottom:1px solid var(--border-subtle);display:flex}._diffPath_6z1ga_68{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-secondary);direction:rtl;flex:auto;overflow:hidden}._diffOldPath_6z1ga_83{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);direction:rtl;flex:0 auto;overflow:hidden}._diffOldPath_6z1ga_83:after{content:" →";color:var(--text-tertiary)}._diffStatus_6z1ga_101{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-secondary);flex:none}._diffStats_6z1ga_110{gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;flex:none;display:flex}._diffAdd_6z1ga_118{color:var(--status-success-fg)}._diffDel_6z1ga_119{color:var(--status-danger-fg)}._diffNotice_6z1ga_121{padding:var(--space-2) var(--space-3);font-family:var(--font-mono);font-size:var(--text-xs-size);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-secondary);margin:0}._diffEmpty_6z1ga_130{padding:var(--space-3);color:var(--text-tertiary);font-size:var(--text-xs-size)}._diffTable_6z1ga_136{border-collapse:collapse;table-layout:fixed;width:100%;font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed)}._diffNo_6z1ga_121{width:42px;min-width:42px;padding:0 var(--space-2);text-align:right;vertical-align:top;-webkit-user-select:none;user-select:none;font-variant-numeric:tabular-nums;color:var(--text-secondary)}._diffMarker_6z1ga_30{text-align:center;vertical-align:top;-webkit-user-select:none;user-select:none;width:14px;min-width:14px;color:var(--text-secondary)}._diffText_6z1ga_159{padding:0 var(--space-2) 0 0;vertical-align:top;white-space:pre-wrap;overflow-wrap:anywhere}._diffCode_6z1ga_179{font-family:inherit}._diffRow_add_6z1ga_181{background:var(--diff-add)}._diffRow_del_6z1ga_182{background:var(--diff-del)}._diffRow_context_6z1ga_183{background:0 0}._diffHunkRow_6z1ga_185>*{padding-top:var(--space-1);padding-bottom:var(--space-1);border-top:1px solid var(--border-subtle);background:var(--bg-canvas)}._diffHunkRow_6z1ga_185:first-child>*{border-top:0}._diffHunkHead_6z1ga_192{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._diffMore_6z1ga_200,._commandMore_6z1ga_201,._activityMore_6z1ga_202{width:100%;min-height:var(--control-h-xs);padding:0 var(--space-3);border-top:1px solid var(--border-subtle);color:var(--text-secondary);font-family:var(--font-ui);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);text-align:left;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background:0 0;display:block}._diffMore_6z1ga_200:hover,._commandMore_6z1ga_201:hover,._activityMore_6z1ga_202:hover{background:var(--bg-hover);color:var(--text-primary)}._diffUnanchored_6z1ga_221{padding:var(--space-2) var(--space-3);border-top:1px solid var(--border-subtle);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);margin:0}._tok_plain_6z1ga_232{color:var(--text-primary)}._tok_comment_6z1ga_233{color:var(--text-tertiary);font-style:italic}._tok_string_6z1ga_234{color:var(--status-success-fg)}._tok_number_6z1ga_235{color:var(--status-warning-fg)}._tok_keyword_6z1ga_236{color:var(--accent-600);font-weight:var(--font-weight-medium)}._command_6z1ga_201{border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-code);overflow:hidden}._command_6z1ga_201[data-failed=true]{border-left:2px solid var(--status-danger-solid)}._commandLine_6z1ga_250{align-items:baseline;gap:var(--space-2);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);display:flex}._commandPrompt_6z1ga_257{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);-webkit-user-select:none;user-select:none;flex:none}._commandText_6z1ga_264{min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);color:var(--text-primary);white-space:pre-wrap;overflow-wrap:anywhere}._commandStatus_6z1ga_274{align-items:center;gap:var(--space-3);min-height:var(--control-h-xs);padding:0 var(--space-3);border-bottom:1px solid var(--border-subtle);display:flex}._commandStatusText_6z1ga_282{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-variant-numeric:tabular-nums;color:var(--text-secondary)}._commandStatusText_6z1ga_282[data-tone=bad]{color:var(--status-danger-fg)}._commandStatusText_6z1ga_282[data-tone=pending]{color:var(--status-warning-fg)}._commandMeta_6z1ga_292{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary)}._commandPre_6z1ga_297{max-height:420px;padding:var(--space-3);font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);white-space:pre;color:var(--text-primary);tab-size:8;margin:0;overflow:auto}._commandPending_6z1ga_309{padding:var(--space-3);color:var(--text-tertiary);font-size:var(--text-xs-size);margin:0}._activity_6z1ga_202{margin-top:var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);overflow:hidden}._activityHead_6z1ga_327{align-items:baseline;gap:var(--space-2);min-height:var(--control-h-xs);padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas);display:flex}._activityCount_6z1ga_336{font-family:var(--font-display);font-size:var(--text-xs-size);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums;color:var(--text-primary)}._activityLabel_6z1ga_343{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-secondary)}._activityBreakdown_6z1ga_350{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);margin-left:auto}._activityList_6z1ga_356{margin:0;padding:0;list-style:none}._activityRow_6z1ga_358{align-items:center;gap:var(--space-2);width:100%;min-height:var(--density-row-sm);padding:0 var(--space-3) 0 0;text-align:left;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard);background:0 0;border:0;grid-template-columns:2px 6ch minmax(0,1fr) auto auto;display:grid}._activityRow_6z1ga_358:hover{background:var(--bg-hover)}._activityRow_6z1ga_358:active{background:var(--bg-active)}._activityRule_6z1ga_380{background:var(--border-default);align-self:stretch}._activityRow_6z1ga_358[data-action=edit] ._activityRule_6z1ga_380{background:var(--status-info-solid)}._activityRow_6z1ga_358[data-action=create] ._activityRule_6z1ga_380{background:var(--status-success-solid)}._activityRow_6z1ga_358[data-action=delete] ._activityRule_6z1ga_380,._activityRow_6z1ga_358[data-failed=true] ._activityRule_6z1ga_380{background:var(--status-danger-solid)}._activityVerb_6z1ga_375{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);padding-left:var(--space-3);white-space:nowrap}._activityRow_6z1ga_358[data-action=edit] ._activityVerb_6z1ga_375,._activityRow_6z1ga_358[data-action=create] ._activityVerb_6z1ga_375,._activityRow_6z1ga_358[data-action=delete] ._activityVerb_6z1ga_375{color:var(--text-secondary)}._activityFailed_6z1ga_379{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;white-space:nowrap;color:var(--status-danger-fg);flex:none}._activityPath_6z1ga_411{align-items:baseline;gap:var(--space-2);min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);display:flex}._activityName_6z1ga_419{color:var(--text-primary);white-space:nowrap}._activityDir_6z1ga_420{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;color:var(--text-tertiary);font-size:var(--text-2xs-size,11px);direction:rtl;overflow:hidden}._activityTimes_6z1ga_430,._activityDelta_6z1ga_431{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);white-space:nowrap}._activityDelta_6z1ga_431{gap:var(--space-2);display:flex}._activityAdd_6z1ga_439{color:var(--status-success-fg)}._activityDel_6z1ga_431{color:var(--status-danger-fg)}._nav_6z1ga_446{z-index:1;align-items:center;gap:var(--space-2);min-height:var(--density-row,32px);padding:0 var(--space-3);border-bottom:1px solid var(--border-subtle);flex-shrink:0;display:flex;position:relative}._navSpacer_6z1ga_457{flex:1}._navOutlineButton_6z1ga_459{align-items:center;gap:var(--space-1);min-height:var(--control-h-xs);padding:0 var(--space-2);border-radius:var(--radius-xs);color:var(--text-secondary);cursor:pointer;transition:background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);background:0 0;border:0;display:inline-flex}._navOutlineButton_6z1ga_459:hover{background:var(--bg-hover);color:var(--text-primary)}._navChevron_6z1ga_473{transition:transform var(--duration-fast) var(--ease-standard);display:inline-flex}._navChevron_6z1ga_473[data-open=true]{transform:rotate(90deg)}._navCount_6z1ga_475{font-family:var(--font-display);font-size:var(--text-xs-size);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._navWord_6z1ga_481{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase}._navSearch_6z1ga_488{align-items:center;gap:var(--space-2);min-width:12ch;height:var(--control-h-xs);padding:0 var(--space-2);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-input);transition:border-color var(--duration-fast) var(--ease-standard);flex:0 26ch;display:flex}._navSearch_6z1ga_488:focus-within{border-color:var(--accent-500);box-shadow:var(--shadow-focus-ring)}._navSearchIcon_6z1ga_512{color:var(--text-tertiary);display:inline-flex}._navSearch_6z1ga_488 input{min-width:0;color:var(--text-primary);font-family:var(--font-ui);font-size:var(--text-xs-size);background:0 0;border:0;flex:1}._navSearch_6z1ga_488 input::-webkit-search-cancel-button{display:none}._navSearch_6z1ga_488 input:focus-visible{box-shadow:none;outline:none}._navMatches_6z1ga_525{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-secondary);white-space:nowrap}._navStep_6z1ga_532{gap:2px;display:inline-flex}._navStep_6z1ga_532 button{min-width:var(--control-h-xs);min-height:var(--control-h-xs);border-radius:var(--radius-xs);color:var(--text-secondary);cursor:pointer;background:0 0;border:0;line-height:1}._navStep_6z1ga_532 button:hover{background:var(--bg-hover);color:var(--text-primary)}._navError_6z1ga_545{align-items:center;gap:var(--space-2);min-height:var(--control-h-xs);padding:0 var(--space-2);border:0;border-left:2px solid var(--status-danger-solid);border-radius:0 var(--radius-xs) var(--radius-xs) 0;color:var(--status-danger-fg);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);white-space:nowrap;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard);background:0 0;display:inline-flex}._navError_6z1ga_545:hover{background:var(--status-danger-bg)}._navErrorGlyph_6z1ga_563{font-family:var(--font-display);font-weight:var(--font-weight-semibold)}._outline_6z1ga_568{top:calc(100% + 2px);left:var(--space-2);right:var(--space-2);max-width:var(--measure-read);max-height:min(60vh,520px);padding:var(--space-1);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface-raised);box-shadow:var(--shadow-menu,var(--shadow-md));position:absolute;overflow-y:auto}._outlineEmpty_6z1ga_582{padding:var(--space-3);color:var(--text-tertiary);font-size:var(--text-xs-size)}._outlineList_6z1ga_587{margin:0;padding:0;list-style:none}._outlineRow_6z1ga_588{gap:var(--space-2);width:100%;padding:var(--space-2);border-radius:var(--radius-xs);text-align:left;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard);background:0 0;border:0;grid-template-columns:3ch minmax(0,1fr) auto;display:grid}._outlineRow_6z1ga_588:hover{background:var(--bg-hover)}._outlineIndex_6z1ga_602{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);padding-top:2px}._outlineBody_6z1ga_609{gap:2px;min-width:0;display:grid}._outlineTitle_6z1ga_610{font-size:var(--text-xs-size);color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._outlineSnippet_6z1ga_617{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._outlineMeta_6z1ga_627{font-size:var(--text-2xs-size,11px);color:var(--text-tertiary)}._outlineStatus_6z1ga_631{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);color:var(--text-tertiary)}._outlineRow_6z1ga_588[data-status=error] ._outlineStatus_6z1ga_631{color:var(--status-danger-fg)}._outlineRow_6z1ga_588[data-status=running] ._outlineStatus_6z1ga_631{color:var(--status-running-fg)}@media (max-width:900px){._navSearch_6z1ga_488{flex-basis:14ch}._activityRow_6z1ga_358{grid-template-columns:2px 6ch minmax(0,1fr) auto auto}._activityDir_6z1ga_420{display:none}}._transcriptWrap_yy5uu_5{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}._transcript_yy5uu_5{min-height:0;padding:var(--space-8) var(--space-6) var(--space-6);scrollbar-gutter:stable;scroll-behavior:smooth;flex:1;overflow-y:auto}._list_yy5uu_14{gap:var(--space-6);width:100%;max-width:var(--measure-read);flex-direction:column;margin:0 auto;padding:0;list-style:none;display:flex}._item_yy5uu_24{min-width:0}._skeleton_yy5uu_26{max-width:var(--measure-read);gap:calc(var(--text-base-line-relaxed) - var(--text-base-line));flex-direction:column;margin:0 auto;display:flex}._skeletonUser_yy5uu_38{margin-block:var(--space-2);padding-left:var(--space-4)}._loadError_yy5uu_39{gap:var(--space-3);max-width:var(--measure-read);margin:var(--space-8) auto 0;padding-left:var(--space-4);border-left:2px solid var(--status-danger-solid);color:var(--text-secondary);font-size:var(--text-sm-size);justify-items:start;display:grid}._loadError_yy5uu_39 button{min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);color:var(--text-primary);font-size:var(--text-xs-size);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard)}._loadError_yy5uu_39 button:hover{background:var(--bg-hover);border-color:var(--border-strong)}._loadError_yy5uu_39 button:active{background:var(--bg-active)}._empty_yy5uu_62{max-width:var(--measure-read);color:var(--text-secondary);margin:clamp(24px,12vh,120px) auto 0}._emptyTitle_yy5uu_63{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-medium);letter-spacing:var(--tracking-display,-.02em);color:var(--text-primary);margin-bottom:var(--space-2)}._emptyBody_yy5uu_72{font-size:var(--text-sm-size);line-height:var(--text-sm-line);max-width:52ch}._user_yy5uu_75{display:block}._userText_yy5uu_76{padding-left:var(--space-4);border-left:2px solid var(--border-strong);color:var(--text-secondary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed)}._assistant_yy5uu_87{display:block}._markdown_yy5uu_31{color:var(--text-primary);font-size:var(--text-base-size);line-height:var(--text-base-line-relaxed);overflow-wrap:anywhere}._markdown_yy5uu_31>*+*{margin-top:var(--space-4)}._markdown_yy5uu_31 p{margin:0}._markdown_yy5uu_31 h1,._markdown_yy5uu_31 h2,._markdown_yy5uu_31 h3,._markdown_yy5uu_31 h4{font-family:var(--font-display);letter-spacing:var(--tracking-display,-.02em);font-weight:var(--font-weight-semibold);margin-top:var(--space-6);margin-bottom:calc(-1 * var(--space-1))}._markdown_yy5uu_31 h1{font-size:var(--text-xl-size);line-height:var(--text-xl-line)}._markdown_yy5uu_31 h2{font-size:var(--text-lg-size);line-height:var(--text-lg-line)}._markdown_yy5uu_31 h3{font-size:var(--text-md-size);line-height:var(--text-md-line)}._markdown_yy5uu_31 h4{font-size:var(--text-base-size);font-weight:var(--font-weight-medium)}._markdown_yy5uu_31 ul,._markdown_yy5uu_31 ol{margin-block:0;padding-left:1.5em}._markdown_yy5uu_31 ul{list-style:outside}._markdown_yy5uu_31 ol{list-style:decimal}._markdown_yy5uu_31 ul ul{list-style:circle}._markdown_yy5uu_31 li{padding-left:.15em}._markdown_yy5uu_31 li::marker{color:var(--text-tertiary)}._markdown_yy5uu_31 li+li,._markdown_yy5uu_31 li>ul,._markdown_yy5uu_31 li>ol{margin-top:var(--space-2)}._markdown_yy5uu_31 a{color:var(--text-link);text-underline-offset:2px;text-decoration:underline}._markdown_yy5uu_31 blockquote{padding-left:var(--space-4);border-left:2px solid var(--border-strong);color:var(--text-secondary);margin:0}._markdown_yy5uu_31 hr{border:0;border-top:1px solid var(--border-subtle);margin-block:var(--space-6)}._markdown_yy5uu_31 table{border-collapse:collapse;font-size:var(--text-sm-size);max-width:100%;display:block;overflow-x:auto}._markdown_yy5uu_31 th,._markdown_yy5uu_31 td{padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);text-align:left;vertical-align:top}._markdown_yy5uu_31 th{border-bottom-color:var(--border-default);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._markdown_yy5uu_31 tr:last-child td{border-bottom:0}._markdown_yy5uu_31 img{border-radius:var(--radius-xs)}._markdown_yy5uu_31 code{font-family:var(--font-mono);background:var(--bg-code);border-radius:var(--radius-xs);padding:.1em .3em;font-size:.92em}._markdown_yy5uu_31 pre{padding:var(--space-4);padding-top:var(--control-h-xs);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);background:var(--bg-code);font-size:var(--text-sm-size);line-height:var(--text-sm-line-relaxed);tab-size:2;margin:0;position:relative;overflow-x:auto}._markdown_yy5uu_31 pre code{font-size:inherit;white-space:pre;background:0 0;padding:0}._codeHead_yy5uu_182{justify-content:space-between;align-items:center;gap:var(--space-2);height:var(--control-h-xs);padding:0 var(--space-2) 0 var(--space-4);pointer-events:none;display:flex;position:absolute;top:0;left:0;right:0}._codeLang_yy5uu_199{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-secondary)}._copy_yy5uu_198{pointer-events:auto;min-height:calc(var(--control-h-xs) - var(--space-1));padding:0 var(--space-2);border-radius:var(--radius-xs);color:var(--text-secondary);font-family:var(--font-ui);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-medium);opacity:0;transition:opacity var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard)}._markdown_yy5uu_31 pre:hover ._copy_yy5uu_198,._copy_yy5uu_198:focus-visible{opacity:1}._copy_yy5uu_198:hover{color:var(--text-primary);background:var(--bg-hover)}._copy_yy5uu_198:active{background:var(--bg-active)}._caret_yy5uu_224,._streaming_yy5uu_225>:last-child:after{content:"";vertical-align:-.15em;background:var(--accent-500);width:2px;height:1em;animation:_verse-caret_yy5uu_1 1.2s var(--ease-standard) infinite;margin-left:2px;display:inline-block}._caret_yy5uu_224{vertical-align:middle}._thinking_yy5uu_238{color:var(--text-tertiary);font-size:var(--text-sm-size)}._thinkingSummary_yy5uu_239{cursor:pointer;align-items:center;gap:var(--space-2);min-height:var(--density-row,32px);font-style:italic;list-style:none;display:inline-flex}._thinkingSummary_yy5uu_239::-webkit-details-marker{display:none}._thinkingSummary_yy5uu_239:before{content:"›";transition:transform var(--duration-fast) var(--ease-standard);font-style:normal}._thinking_yy5uu_238[open] ._thinkingSummary_yy5uu_239:before{transform:rotate(90deg)}._thinkingBody_yy5uu_251{margin-top:var(--space-2);padding-left:var(--space-4);border-left:2px solid var(--border-subtle);white-space:pre-wrap;overflow-wrap:anywhere;line-height:var(--text-sm-line-relaxed);color:var(--text-secondary)}._tool_yy5uu_262,._toolRun_yy5uu_263{font-size:var(--text-sm-size)}._toolLine_yy5uu_265{align-items:center;gap:var(--space-2);min-height:var(--density-row-sm);padding-left:var(--space-3);border-left:2px solid var(--border-subtle);cursor:pointer;color:var(--text-tertiary);grid-template-columns:12px auto minmax(0,1fr) auto;list-style:none;display:grid}._toolLine_yy5uu_265::-webkit-details-marker{display:none}._toolLine_yy5uu_265{transition:color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard)}._toolLine_yy5uu_265:hover{color:var(--text-secondary);background:var(--bg-hover)}._toolLine_yy5uu_265:active{background:var(--bg-active)}._toolLine_yy5uu_265:hover ._toolArg_yy5uu_283,._toolLine_yy5uu_265:hover ._toolState_yy5uu_283,._toolLine_yy5uu_265:active ._toolArg_yy5uu_283,._toolLine_yy5uu_265:active ._toolState_yy5uu_283{color:var(--text-secondary)}._toolGlyph_yy5uu_294{width:12px;height:12px;transition:transform var(--duration-fast) var(--ease-standard);border:1px solid;border-radius:2px}._tool_yy5uu_262[open]>._toolLine_yy5uu_265>._toolGlyph_yy5uu_294,._toolRun_yy5uu_263[open]>._toolLine_yy5uu_265>._toolGlyph_yy5uu_294{background:currentColor}._toolName_yy5uu_304{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-secondary);white-space:nowrap}._toolArg_yy5uu_283{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);overflow:hidden}._toolState_yy5uu_283{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary);white-space:nowrap;justify-self:end}._toolFailed_yy5uu_328>._toolLine_yy5uu_265{border-left-color:var(--status-danger-solid)}._toolFailed_yy5uu_328>._toolLine_yy5uu_265>._toolState_yy5uu_283{color:var(--status-danger-fg)}._toolBody_yy5uu_331,._toolRunBody_yy5uu_332{gap:var(--space-3);margin-top:var(--space-2);padding-left:var(--space-3);border-left:2px solid var(--border-subtle);display:grid}._toolRunList_yy5uu_339{gap:var(--space-2);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}._toolRunList_yy5uu_339>li{min-width:0}._toolLabel_yy5uu_341{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary);margin-bottom:var(--space-1)}._toolPre_yy5uu_350{max-height:360px;padding:var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-xs);background:var(--bg-code);font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-primary);margin:0;overflow:auto}._toolPending_yy5uu_365{color:var(--text-tertiary);font-size:var(--text-xs-size)}._note_yy5uu_368{padding-left:var(--space-4);border-left:2px solid var(--border-subtle);color:var(--text-tertiary);font-size:var(--text-sm-size)}._noteError_yy5uu_374{border-left-color:var(--status-danger-solid);color:var(--status-danger-fg)}._meta_yy5uu_375{padding-left:var(--space-4)}._noteDuration_yy5uu_376{font-family:var(--font-display);font-variant-numeric:tabular-nums}._metaText_yy5uu_380{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;color:var(--text-tertiary)}._jump_yy5uu_387{left:50%;bottom:var(--space-4);align-items:center;gap:var(--space-2);min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-full);background:var(--bg-surface-raised);color:var(--text-secondary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);box-shadow:var(--shadow-menu,var(--shadow-md));transition:color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);display:inline-flex;position:absolute;transform:translate(-50%)}._jump_yy5uu_387:hover{color:var(--text-primary);border-color:var(--border-strong)}._jump_yy5uu_387:active{background:var(--bg-active)}._jumpUnseen_yy5uu_410{border-color:var(--accent-500);color:var(--text-primary)}@keyframes _verse-caret_yy5uu_1{50%{opacity:.15}}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._transcript_yy5uu_5{scroll-behavior:auto}:root:not([data-motion=full]) ._caret_yy5uu_224,:root:not([data-motion=full]) ._streaming_yy5uu_225>:last-child:after{animation:none}}:root[data-motion=reduce] ._caret_yy5uu_224,:root[data-motion=reduce] ._streaming_yy5uu_225>:last-child:after{animation:none}:root[data-motion=reduce] ._transcript_yy5uu_5{scroll-behavior:auto}@media (max-width:900px){._transcript_yy5uu_5{padding:var(--space-5) var(--space-4)}}._turn_yy5uu_435{min-width:0;scroll-margin-block:var(--space-6);border-radius:var(--radius-xs);display:block}._turn_yy5uu_435:focus-visible{outline:2px solid var(--accent-500);outline-offset:var(--space-2);box-shadow:none}._turnItems_yy5uu_457{gap:var(--space-6);flex-direction:column;min-width:0;margin:0;padding:0;list-style:none;display:flex}._turn_yy5uu_435[data-match]{box-shadow:-2px 0 0 0 var(--text-tertiary)}._turn_yy5uu_435[data-match=active]{box-shadow:-2px 0 0 0 var(--accent-500)}._turn_yy5uu_435[data-flash],[data-flash]{animation:_verse-flash_yy5uu_1 1.4s var(--ease-standard) 1}@keyframes _verse-flash_yy5uu_1{0%,60%{background:var(--bg-selected)}to{background:0 0}}._turnErrorJump_yy5uu_493{margin-top:var(--space-3);min-height:var(--control-h-xs);padding:0 var(--space-2);border:0;border-left:2px solid var(--status-danger-solid);color:var(--status-danger-fg);font-size:var(--text-xs-size);cursor:pointer;transition:background var(--duration-fast) var(--ease-standard);background:0 0;align-items:center;display:inline-flex}._turnErrorJump_yy5uu_493:hover{background:var(--status-danger-bg)}._toolLine_yy5uu_265{grid-template-columns:12px auto minmax(0,1fr) auto auto}._toolDelta_yy5uu_511{gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-2xs-size,11px);font-variant-numeric:tabular-nums;white-space:nowrap;display:inline-flex}._toolAdd_yy5uu_519{color:var(--status-success-fg)}._toolDel_yy5uu_511{color:var(--status-danger-fg)}._toolNote_yy5uu_522{margin-top:var(--space-2);color:var(--text-tertiary);font-size:var(--text-xs-size);line-height:var(--text-xs-line-relaxed)}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._turn_yy5uu_435[data-flash],:root:not([data-motion=full]) [data-flash]{animation:none}}:root[data-motion=reduce] ._turn_yy5uu_435[data-flash],:root[data-motion=reduce] [data-flash]{animation:none}._chat_fzgvr_6{grid-template-columns:var(--verse-sidebar-width,264px) 1px minmax(0, 1fr) 1px var(--verse-resources-width,320px);background:var(--bg-canvas);height:100%;min-height:0;color:var(--text-primary);flex:1;display:grid;position:relative;overflow:hidden}._chat_fzgvr_6[data-resources=closed]{grid-template-columns:var(--verse-sidebar-width,264px) 1px minmax(0, 1fr)}._chat_fzgvr_6[data-sidebar=collapsed]{grid-template-columns:0 0 minmax(0, 1fr) 1px var(--verse-resources-width,320px)}._chat_fzgvr_6[data-sidebar=collapsed][data-resources=closed]{grid-template-columns:0 0 minmax(0,1fr)}._chat_fzgvr_6[data-sidebar=collapsed]>nav{display:none}._chat_fzgvr_6>*{min-width:0;min-height:0}._main_fzgvr_30{background:var(--bg-surface);flex-direction:column;min-width:0;min-height:0;display:flex}._main_fzgvr_30:focus{outline:none}._banner_fzgvr_40,._bannerWarn_fzgvr_41{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-5);font-size:var(--text-sm-size);line-height:var(--text-sm-line);border-bottom:1px solid var(--border-subtle);flex-shrink:0;display:flex}._banner_fzgvr_40{background:var(--status-danger-bg);color:var(--status-danger-fg)}._bannerWarn_fzgvr_41{background:var(--status-warning-bg);color:var(--status-warning-fg)}._bannerWarn_fzgvr_41 code{font-size:var(--text-xs-size)}._banner_fzgvr_40 button{min-height:var(--control-h-sm);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-primary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium);transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);flex-shrink:0}._banner_fzgvr_40 button:hover{background:var(--bg-hover);border-color:var(--border-strong)}._banner_fzgvr_40 button:active{background:var(--bg-active)}._resize_fzgvr_75{cursor:col-resize;background:var(--border-subtle);touch-action:none;transition:background var(--duration-fast) var(--ease-standard);position:relative}._resize_fzgvr_75:before{content:"";inset-block:0;position:absolute;left:-4px;right:-4px}._resize_fzgvr_75:hover,._resize_fzgvr_75:focus-visible{background:var(--accent-500)}._chat_fzgvr_6[data-sidebar=collapsed]>._resize_fzgvr_75:first-of-type,._scrim_fzgvr_94{display:none}@media (max-width:900px){._chat_fzgvr_6,._chat_fzgvr_6[data-resources=open]{grid-template-columns:var(--verse-sidebar-width,264px) 1px minmax(0, 1fr)}._chat_fzgvr_6[data-sidebar=collapsed],._chat_fzgvr_6[data-sidebar=collapsed][data-resources=open]{grid-template-columns:0 0 minmax(0,1fr)}._chat_fzgvr_6>aside,._chat_fzgvr_6>._resize_fzgvr_75:last-of-type{display:none}}@media (max-width:760px){._chat_fzgvr_6,._chat_fzgvr_6[data-sidebar=collapsed]{grid-template-columns:minmax(0,1fr)}._chat_fzgvr_6>nav{z-index:var(--z-overlay);inset-block:0;width:min(var(--verse-sidebar-width,264px), 86vw);box-shadow:var(--shadow-menu,var(--shadow-lg));position:absolute;left:0}._chat_fzgvr_6>._resize_fzgvr_75{display:none}._scrim_fzgvr_94{z-index:calc(var(--z-overlay) - 1);background:var(--bg-overlay);cursor:default;display:block;position:absolute;inset:0}._chat_fzgvr_6[data-sidebar=collapsed] ._scrim_fzgvr_94{display:none}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t,o as n}from"./index-BMRIET7F.js";import{G as r,I as i,W as a,j as o,u as s}from"./global-C4jfYHrj.js";import{t as c}from"./Dialog-Bn0CgEGz.js";var l=class extends Error{constructor(){super(`No mutation token held for this session yet.`),this.name=`MissingMutationTokenError`}};async function u(e,t){let n=o();if(!n)throw new l;let r=await s(e,t,n);return i(),r}async function d(){await u(`/api/fleet/pause`,{}),a(`dashboard-snapshot`),a(`control-snapshot`),a(`fleet`),a(`fleet-activity`)}async function f(){await u(`/api/fleet/resume`,{}),a(`dashboard-snapshot`),a(`control-snapshot`),a(`fleet`),a(`fleet-activity`)}async function p(e){await u(`/api/inbox/${encodeURIComponent(e)}/approve`,{}),a(`inbox`),a(`dashboard-snapshot`),a(`proposal-detail-${e}`),r(`inbox-list:`)}async function m(e){await u(`/api/inbox/${encodeURIComponent(e)}/reject`,{}),a(`inbox`),a(`dashboard-snapshot`),a(`proposal-detail-${e}`),r(`inbox-list:`)}var h=n(e(),1),g={body:`_body_15hsz_1`,error:`_error_15hsz_8`,actions:`_actions_15hsz_17`,cancel:`_cancel_15hsz_23`,confirm:`_confirm_15hsz_33`,destructive:`_destructive_15hsz_48`},_=t();function v({open:e,onClose:t,title:n,body:r,confirmLabel:i,destructive:a,onConfirm:o,busy:s,error:l}){let u=(0,h.useId)(),d=(0,h.useRef)(null);return(0,_.jsxs)(c,{open:e,onClose:t,titleId:u,title:n,initialFocusRef:d,children:[(0,_.jsx)(`div`,{className:g.body,children:r}),l?(0,_.jsx)(`p`,{className:g.error,role:`alert`,children:l}):null,(0,_.jsxs)(`div`,{className:g.actions,children:[(0,_.jsx)(`button`,{type:`button`,className:g.cancel,onClick:t,disabled:s,children:`Cancel`}),(0,_.jsx)(`button`,{ref:d,type:`button`,className:a?g.destructive:g.confirm,onClick:o,disabled:s,children:s?`Working…`:i})]})]})}export{f as a,m as i,p as n,d as r,v as t};
|
|
2
|
+
//# sourceMappingURL=ConfirmDialog-CXevY3Au.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog-CXevY3Au.js","names":[],"sources":["../../../../../../src/web-ui/data/mutations.ts","../../../../../../src/web-ui/routes/inbox/ConfirmDialog.module.css","../../../../../../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",".body {\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n line-height: var(--text-sm-line);\n margin: var(--space-3) 0;\n}\n\n.error {\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-size: var(--text-xs-size);\n margin-bottom: var(--space-3);\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2);\n}\n\n.cancel {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n\n.confirm {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-sm);\n border: 1px solid var(--accent-600);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.confirm:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.destructive {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-sm);\n border: 1px solid var(--status-danger-solid);\n background: var(--status-danger-solid);\n color: var(--text-on-accent);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.destructive:disabled {\n opacity: 0.6;\n cursor: not-allowed;\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"],"mappings":"oKAiBA,IAAM,EAAN,cAAwC,KAAM,CAC5C,aAAc,CACZ,MAAM,8CAA8C,EACpD,KAAK,KAAO,2BACd,CACF,EAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,eAAsB,GAA4B,CAChD,MAAM,EAAK,mBAAoB,CAAC,CAAC,EACjC,EAAW,oBAAoB,EAC/B,EAAW,kBAAkB,EAC7B,EAAW,OAAO,EAClB,EAAW,gBAAgB,CAC7B,CAEA,eAAsB,GAA6B,CACjD,MAAM,EAAK,oBAAqB,CAAC,CAAC,EAClC,EAAW,oBAAoB,EAC/B,EAAW,kBAAkB,EAC7B,EAAW,OAAO,EAClB,EAAW,gBAAgB,CAC7B,CAEA,eAAsB,EAAgB,EAA2B,CAC/D,MAAM,EAAK,cAAc,mBAAmB,CAAE,EAAE,UAAW,CAAC,CAAC,EAC7D,EAAW,OAAO,EAClB,EAAW,oBAAoB,EAC/B,EAAW,mBAAmB,GAAI,EAClC,EAAiB,aAAa,CAChC,CAEA,eAAsB,EAAe,EAA2B,CAC9D,MAAM,EAAK,cAAc,mBAAmB,CAAE,EAAE,SAAU,CAAC,CAAC,EAC5D,EAAW,OAAO,EAClB,EAAW,oBAAoB,EAC/B,EAAW,mBAAmB,GAAI,EAClC,EAAiB,aAAa,CAChC,4LE5BA,SAAgB,EAAc,CAAE,OAAM,UAAS,QAAO,OAAM,eAAc,cAAa,YAAW,OAAM,SAA6B,CACnI,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAa,EAAA,OAAA,CAA0B,IAAI,EAEjD,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAc,OAAe,UAAkB,UAAgB,QAAO,gBAAiB,EAAvF,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAO,SAAA,CAAU,CAAA,EACvC,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAC9B,SAAA,CACA,CAAA,EACD,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,QAAS,EAAS,SAAU,EAAM,SAAA,QAE1E,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,IAAK,EACL,KAAK,SACL,UAAW,EAAc,EAAO,YAAc,EAAO,QACrD,QAAS,EACT,SAAU,EAET,SAAA,EAAO,WAAa,CACf,CAAA,CACL,GACC,GAEZ"}
|
package/dist/core/web/public/next/assets/{ConfirmDialog-cYuivhCX.css → ConfirmDialog-Dx15x0Ho.css}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
._body_15hsz_1{font-size:var(--text-sm-size);color:var(--text-secondary);line-height:var(--text-sm-line);margin:var(--space-3) 0}._error_15hsz_8{padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-xs-size);margin-bottom:var(--space-3)}._actions_15hsz_17{
|
|
1
|
+
._body_15hsz_1{font-size:var(--text-sm-size);color:var(--text-secondary);line-height:var(--text-sm-line);margin:var(--space-3) 0}._error_15hsz_8{padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-xs-size);margin-bottom:var(--space-3)}._actions_15hsz_17{justify-content:flex-end;gap:var(--space-2);display:flex}._cancel_15hsz_23{padding:var(--space-2) var(--space-4);border-radius:var(--radius-sm);border:1px solid var(--border-default);background:var(--bg-surface);color:var(--text-secondary);font-size:var(--text-sm-size);cursor:pointer}._confirm_15hsz_33{padding:var(--space-2) var(--space-4);border-radius:var(--radius-sm);border:1px solid var(--accent-600);background:var(--accent-600);color:var(--text-on-accent);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._confirm_15hsz_33:disabled{opacity:.6;cursor:not-allowed}._destructive_15hsz_48{padding:var(--space-2) var(--space-4);border-radius:var(--radius-sm);border:1px solid var(--status-danger-solid);background:var(--status-danger-solid);color:var(--text-on-accent);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._destructive_15hsz_48:disabled{opacity:.6;cursor:not-allowed}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r}from"./index-BMRIET7F.js";var i=r(t(),1),a=r(e(),1),o=[`a[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`].join(`,`);function s(e){return Array.from(e.querySelectorAll(o)).filter(e=>e.offsetParent!==null)}function c({open:e,containerRef:t,onClose:n,initialFocusRef:r}){(0,a.useEffect)(()=>{if(!e)return;let n=document.activeElement;return(r?.current??t.current)?.focus({preventScroll:!0}),()=>{n?.focus?.({preventScroll:!0})}},[e]),(0,a.useEffect)(()=>{if(!e)return;function r(e){if(e.key===`Escape`){e.stopPropagation(),n();return}if(e.key!==`Tab`)return;let r=t.current;if(!r)return;let i=s(r);if(i.length===0)return;let a=i[0],o=i[i.length-1];e.shiftKey&&document.activeElement===a?(e.preventDefault(),o.focus()):!e.shiftKey&&document.activeElement===o&&(e.preventDefault(),a.focus())}return document.addEventListener(`keydown`,r,!0),()=>document.removeEventListener(`keydown`,r,!0)},[e,n])}var l={backdrop:`_backdrop_10r5p_1`,fade:`_fade_10r5p_1`,dialog:`_dialog_10r5p_13`,rise:`_rise_10r5p_1`,title:`_title_10r5p_25`,description:`_description_10r5p_36`},u=n();function d({open:e,onClose:t,titleId:n,title:r,description:o,children:s,initialFocusRef:d,widthClassName:f}){let p=(0,a.useRef)(null);return c({open:e,containerRef:p,onClose:t,initialFocusRef:d}),e?(0,i.createPortal)((0,u.jsx)(`div`,{className:l.backdrop,onMouseDown:e=>e.target===e.currentTarget&&t(),children:(0,u.jsxs)(`div`,{ref:p,className:`${l.dialog} ${f??``}`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":n,tabIndex:-1,children:[(0,u.jsx)(`h2`,{id:n,className:l.title,children:r}),o?(0,u.jsx)(`p`,{className:l.description,children:o}):null,s]})}),document.body):null}export{d as t};
|
|
2
|
+
//# sourceMappingURL=Dialog-Bn0CgEGz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dialog-Bn0CgEGz.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/focus-trap.ts","../../../../../../src/web-ui/components/primitives/Dialog.module.css","../../../../../../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",".backdrop {\n position: fixed;\n inset: 0;\n background: var(--bg-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding-top: 12vh;\n z-index: var(--z-dialog);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.dialog {\n width: min(480px, calc(100vw - var(--space-8)));\n max-height: 76vh;\n overflow: auto;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-dialog);\n padding: var(--space-5);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.title {\n margin: 0 0 var(--space-4);\n font-family: var(--font-display);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-display);\n}\n\n/* Sits between title and body: the title's bottom margin collapses into\n this one's top, so give the pair the same rhythm as a title alone. */\n.description {\n margin: calc(var(--space-4) * -1 + var(--space-1)) 0 var(--space-4);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rise {\n from {\n opacity: 0;\n transform: translateY(4px);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .backdrop,\n :root:not([data-motion=\"full\"]) .dialog {\n animation: none;\n }\n}\n\n:root[data-motion=\"reduce\"] .backdrop,\n:root[data-motion=\"reduce\"] .dialog {\n animation: none;\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"],"mappings":"kFAgBa,EAAqB,CAChC,UACA,yBACA,wBACA,yBACA,2BACA,iCACF,CAAC,CAAC,KAAK,GAAG,EAGV,SAAgB,EAAgB,EAAkC,CAChE,OAAO,MAAM,KAAK,EAAK,iBAA8B,CAAkB,CAAC,CAAC,CAAC,OAAQ,GAAO,EAAG,eAAiB,IAAI,CACnH,CASA,SAAgB,EAAa,CAAE,OAAM,eAAc,UAAS,mBAA2C,EACrG,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAM,OACX,IAAM,EAAoB,SAAS,cAInC,OAHe,GAAiB,SAAW,EAAa,QAAA,EAChD,MAAM,CAAE,cAAe,EAAK,CAAC,MAExB,CACX,GAAmB,QAAQ,CAAE,cAAe,EAAK,CAAC,CACpD,CAEF,EAAG,CAAC,CAAI,CAAC,GAET,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAM,OACX,SAAS,EAAU,EAAkB,CACnC,GAAI,EAAE,MAAQ,SAAU,CACtB,EAAE,gBAAgB,EAClB,EAAQ,EACR,MACF,CACA,GAAI,EAAE,MAAQ,MAAO,OACrB,IAAM,EAAO,EAAa,QAC1B,GAAI,CAAC,EAAM,OACX,IAAM,EAAY,EAAgB,CAAI,EACtC,GAAI,EAAU,SAAW,EAAG,OAC5B,IAAM,EAAQ,EAAU,GAClB,EAAO,EAAU,EAAU,OAAS,GACtC,EAAE,UAAY,SAAS,gBAAkB,GAC3C,EAAE,eAAe,EACjB,EAAK,MAAM,GACF,CAAC,EAAE,UAAY,SAAS,gBAAkB,IACnD,EAAE,eAAe,EACjB,EAAM,MAAM,EAEhB,CAEA,OADA,SAAS,iBAAiB,UAAW,EAAW,EAAI,MACvC,SAAS,oBAAoB,UAAW,EAAW,EAAI,CAEtE,EAAG,CAAC,EAAM,CAAO,CAAC,CACpB,4KE9CA,SAAgB,EAAO,CACrB,OACA,UACA,UACA,QACA,cACA,WACA,kBACA,kBACc,CACd,IAAM,GAAA,EAAY,EAAA,OAAA,CAAuB,IAAI,EAM7C,OAJA,EAAa,CAAE,OAAM,aAAc,EAAW,UAAS,iBAAgB,CAAC,EAEnE,GAEL,EAAO,EAAA,aAAA,EACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAU,YAAc,GAAM,EAAE,SAAW,EAAE,eAAiB,EAAQ,EAC3F,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,IAAK,EACL,UAAW,GAAG,EAAO,OAAO,GAAG,GAAkB,KACjD,KAAK,SACL,aAAW,OACX,kBAAiB,EACjB,SAAU,GANZ,SAAA,EAQE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAI,EAAS,UAAW,EAAO,MAChC,SAAA,CACC,CAAA,EACH,GAAc,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,YAAc,SAAA,CAAe,CAAA,EAAI,KACpE,CACE,GACF,CAAA,EACL,SAAS,IACX,EApBkB,IAqBpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._backdrop_10r5p_1{background:var(--bg-overlay);z-index:var(--z-dialog);animation:_fade_10r5p_1 var(--duration-fast) var(--ease-standard);justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}._dialog_10r5p_13{width:min(480px, calc(100vw - var(--space-8)));background:var(--bg-surface-raised);border:1px solid var(--border-default);border-radius:var(--radius-lg);max-height:76vh;box-shadow:var(--shadow-dialog);padding:var(--space-5);animation:_rise_10r5p_1 var(--duration-base) var(--ease-decelerate);overflow:auto}._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}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._viewer_gf84p_1{gap:var(--space-4);grid-template-columns:minmax(180px,260px) 1fr;align-items:start;min-height:0;display:grid}._malformedNotice_gf84p_9{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);grid-column:1/-1}._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{gap:var(--space-1);border:1px solid var(--border-subtle);border-radius:var(--radius-md);padding:var(--space-2);flex-direction:column;max-height:480px;display:flex;position:sticky;top:0;overflow-y:auto}._treeItem_gf84p_40{align-items:center;gap:var(--space-2);width:100%;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);text-align:left;font-size:var(--text-xs-size);color:var(--text-secondary);cursor:pointer;background:0 0;border:none;display:flex}._treeItem_gf84p_40:hover{background:var(--bg-hover)}._treeItemActive_gf84p_59{background:var(--bg-selected);color:var(--text-primary)}._statusDot_gf84p_64{border-radius:var(--radius-full);flex:none;width:8px;height:8px}._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{text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-mono);flex:auto;overflow:hidden}._treeStats_gf84p_83{gap:var(--space-1);font-variant-numeric:tabular-nums;flex:none;display:flex}._add_gf84p_89{color:var(--status-success-fg)}._del_gf84p_90{color:var(--status-danger-fg)}._body_gf84p_92{border:1px solid var(--border-subtle);border-radius:var(--radius-md);min-width:0;overflow:hidden}._fileHeader_gf84p_99{justify-content:space-between;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas);display:flex}._filePath_gf84p_109{font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._modeToggle_gf84p_118{gap:var(--space-1);flex:none;display:flex}._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{border-collapse:collapse;width:100%;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);-webkit-user-select:none;user-select:none;vertical-align:top;font-variant-numeric:tabular-nums}._lineMarker_gf84p_184{text-align:center;-webkit-user-select:none;user-select:none;vertical-align:top;width:16px;min-width:16px}._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:0 0}._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)}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{a as e,n as t,o as n}from"./index-BMRIET7F.js";var r=n(e(),1),i=/^diff --git a\/(.+) b\/(.+)$/,a=/^--- (?:a\/(.+)|(\/dev\/null))\s*$/,o=/^\+\+\+ (?:b\/(.+)|(\/dev\/null))\s*$/,s=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/;function c(e){return e.replace(/^[ab]\//,``)}function l(e){let t=e.split(`
|
|
2
|
+
`),n=t.some(e=>i.test(e)),r=[];for(let e=0;e<t.length;e++){let o=t[e];(n?i.test(o):a.test(o))&&r.push(e)}if(r.length===0)return[];let o=[];for(let e=0;e<r.length;e++){let n=r[e],i=e+1<r.length?r[e+1]:t.length;o.push(t.slice(n,i).join(`
|
|
3
|
+
`))}return o}function u(e,t){let n=e.split(`
|
|
4
|
+
`);n.length>0&&n[n.length-1]===``&&n.pop();let r=null,l=null,u=-1;for(let e=0;e<n.length;e++){let t=n[e],s=a.exec(t);if(s){r=s[2]?null:c(s[1]);continue}let d=o.exec(t);if(d){l=d[2]?null:c(d[1]),u=e+1;break}let f=i.exec(t);f&&r===null&&l===null&&(r=f[1]??null,l=f[2]??null)}let d=`modified`;r===null&&l!==null?d=`added`:r!==null&&l===null?d=`deleted`:r!==null&&l!==null&&r!==l&&(d=`renamed`);let f=l??r??`(unknown file ${t+1})`,p=[],m=0,h=0,g=null;if(u===-1){let e=n.join(`
|
|
5
|
+
`).trim();return{id:`${t}:${f}`,oldPath:r,newPath:l,displayPath:f,status:d,hunks:[],additions:0,deletions:0,unparsedNotice:e||null}}let _=u;for(;_<n.length;){let e=s.exec(n[_]);if(!e){n[_].trim()&&(g=((g?g+`
|
|
6
|
+
`:``)+n[_]).trim()),_++;continue}let t=Number(e[1]),r=e[2]===void 0?1:Number(e[2]),i=Number(e[3]),a=e[4]===void 0?1:Number(e[4]),o={header:n[_],oldStart:t,oldLines:r,newStart:i,newLines:a,lines:[]};_++;let c=t,l=i;for(;_<n.length&&!s.test(n[_]);){let e=n[_];if(e.startsWith(`\\`)){_++;continue}let t=e[0],r=e.slice(1);t===`+`?(o.lines.push({kind:`add`,text:r,oldLineNo:null,newLineNo:l}),l++,m++):t===`-`?(o.lines.push({kind:`del`,text:r,oldLineNo:c,newLineNo:null}),c++,h++):(o.lines.push({kind:`context`,text:t===` `?r:e,oldLineNo:c,newLineNo:l}),c++,l++),_++}p.push(o)}return{id:`${t}:${f}`,oldPath:r,newPath:l,displayPath:f,status:d,hunks:p,additions:m,deletions:h,unparsedNotice:g}}function d(e){let t=e??``;if(!t.trim())return{files:[],malformed:!1};let n=l(t);return n.length===0?{malformed:!0,files:[{id:`raw`,oldPath:null,newPath:null,displayPath:`(unparsed diff)`,status:`modified`,hunks:[],additions:0,deletions:0,unparsedNotice:t}]}:{files:n.map((e,t)=>u(e,t)),malformed:!1}}function f(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r.kind===`context`){t.push({left:r,right:r}),n++;continue}let i=[];for(;n<e.length&&e[n].kind===`del`;)i.push(e[n]),n++;let a=[];for(;n<e.length&&e[n].kind===`add`;)a.push(e[n]),n++;let o=Math.max(i.length,a.length);for(let e=0;e<o;e++)t.push({left:i[e]??null,right:a[e]??null})}return t}var p={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 m(e){return e?p[e.split(`.`).pop()?.toLowerCase()??``]??`plain`:`plain`}var h={"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`.split(`.`)),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`.split(`.`)),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},g={"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 _(e,t){let n=g[t];if(!n)return[{kind:`plain`,text:e}];let r=h[t],i=[],a=0;n.lastIndex=0;let o;for(;o=n.exec(e);){o.index>a&&i.push({kind:`plain`,text:e.slice(a,o.index)});let s=o.groups??{};if(s.comment!==void 0)i.push({kind:`comment`,text:o[0]});else if(s.string!==void 0)i.push({kind:`string`,text:o[0]});else if(s.number!==void 0)i.push({kind:`number`,text:o[0]});else if(s.word!==void 0){let e=t===`json`||r.has(s.word);i.push({kind:e?`keyword`:`plain`,text:o[0]})}else i.push({kind:`plain`,text:o[0]});a=o.index+o[0].length,o[0].length===0&&n.lastIndex++}return a<e.length&&i.push({kind:`plain`,text:e.slice(a)}),i}var v={viewer:`_viewer_gf84p_1`,malformedNotice:`_malformedNotice_gf84p_9`,empty:`_empty_gf84p_18`,tree:`_tree_gf84p_27`,treeItem:`_treeItem_gf84p_40`,treeItemActive:`_treeItemActive_gf84p_59`,statusDot:`_statusDot_gf84p_64`,status_added:`_status_added_gf84p_70`,status_deleted:`_status_deleted_gf84p_71`,status_modified:`_status_modified_gf84p_72`,status_renamed:`_status_renamed_gf84p_73`,treePath:`_treePath_gf84p_75`,treeStats:`_treeStats_gf84p_83`,add:`_add_gf84p_89`,del:`_del_gf84p_90`,body:`_body_gf84p_92`,fileHeader:`_fileHeader_gf84p_99`,filePath:`_filePath_gf84p_109`,modeToggle:`_modeToggle_gf84p_118`,modeActive:`_modeActive_gf84p_132`,notice:`_notice_gf84p_138`,emptyFile:`_emptyFile_gf84p_149`,hunkTable:`_hunkTable_gf84p_155`,hunkCaption:`_hunkCaption_gf84p_163`,lineNo:`_lineNo_gf84p_173`,lineMarker:`_lineMarker_gf84p_184`,lineText:`_lineText_gf84p_192`,hunkTableSplit:`_hunkTableSplit_gf84p_199`,rowBlank:`_rowBlank_gf84p_203`,row_add:`_row_add_gf84p_207`,row_del:`_row_del_gf84p_210`,row_context:`_row_context_gf84p_213`,code:`_code_gf84p_217`,tok_plain:`_tok_plain_gf84p_221`,tok_comment:`_tok_comment_gf84p_222`,tok_string:`_tok_string_gf84p_223`,tok_number:`_tok_number_gf84p_224`,tok_keyword:`_tok_keyword_gf84p_225`},y=t();function b({diff:e,proposalKind:t}){let n=(0,r.useMemo)(()=>d(e),[e]),[i,a]=(0,r.useState)(n.files[0]?.id??null),[o,s]=(0,r.useState)(`unified`);if((0,r.useEffect)(()=>{a(n.files[0]?.id??null)},[e]),n.files.length===0)return(0,y.jsxs)(`div`,{className:v.empty,children:[`No diff attached to this proposal (kind: `,t,`).`]});let c=n.files.find(e=>e.id===i)??n.files[0];function l(e){let t=n.files.findIndex(e=>e.id===c.id);e.key===`ArrowDown`?(e.preventDefault(),a(n.files[Math.min(t+1,n.files.length-1)].id)):e.key===`ArrowUp`&&(e.preventDefault(),a(n.files[Math.max(t-1,0)].id))}return(0,y.jsxs)(`div`,{className:v.viewer,children:[n.malformed?(0,y.jsx)(`p`,{className:v.malformedNotice,children:`Could not parse this as a unified diff — showing raw content.`}):null,(0,y.jsx)(`div`,{className:v.tree,role:`tree`,"aria-label":`Changed files`,onKeyDown:l,children:n.files.map(e=>(0,y.jsxs)(`button`,{type:`button`,role:`treeitem`,"aria-selected":e.id===c.id,tabIndex:e.id===c.id?0:-1,className:`${v.treeItem} ${e.id===c.id?v.treeItemActive:``}`,onClick:()=>a(e.id),children:[(0,y.jsx)(`span`,{className:`${v.statusDot} ${v[`status_${e.status}`]}`,"aria-hidden":`true`}),(0,y.jsx)(`span`,{className:v.treePath,title:e.displayPath,children:e.displayPath}),(0,y.jsxs)(`span`,{className:v.treeStats,children:[e.additions>0?(0,y.jsxs)(`span`,{className:v.add,children:[`+`,e.additions]}):null,e.deletions>0?(0,y.jsxs)(`span`,{className:v.del,children:[`-`,e.deletions]}):null]})]},e.id))}),(0,y.jsxs)(`div`,{className:v.body,children:[(0,y.jsxs)(`div`,{className:v.fileHeader,children:[(0,y.jsx)(`span`,{className:v.filePath,children:c.displayPath}),(0,y.jsxs)(`div`,{className:v.modeToggle,role:`group`,"aria-label":`Diff view mode`,children:[(0,y.jsx)(`button`,{type:`button`,"aria-pressed":o===`unified`,className:o===`unified`?v.modeActive:``,onClick:()=>s(`unified`),children:`Unified`}),(0,y.jsx)(`button`,{type:`button`,"aria-pressed":o===`split`,className:o===`split`?v.modeActive:``,onClick:()=>s(`split`),children:`Split`})]})]}),c.unparsedNotice?(0,y.jsx)(`pre`,{className:v.notice,children:c.unparsedNotice}):null,c.hunks.length===0&&!c.unparsedNotice?(0,y.jsx)(`p`,{className:v.emptyFile,children:`No line-level changes captured for this file.`}):c.hunks.map((e,t)=>(0,y.jsx)(x,{hunk:e,mode:o,path:c.displayPath},t))]})]})}function x({hunk:e,mode:t,path:n}){let r=m(n);if(t===`split`){let t=f(e.lines);return(0,y.jsxs)(`table`,{className:`${v.hunkTable} ${v.hunkTableSplit}`,children:[(0,y.jsx)(`caption`,{className:v.hunkCaption,children:e.header}),(0,y.jsx)(`tbody`,{children:t.map((e,t)=>(0,y.jsxs)(`tr`,{children:[(0,y.jsx)(`td`,{className:v.lineNo,children:e.left?.oldLineNo??``}),(0,y.jsx)(`td`,{className:`${v.lineText} ${e.left?v[`row_${e.left.kind}`]:v.rowBlank}`,children:e.left?(0,y.jsx)(S,{text:e.left.text,lang:r}):null}),(0,y.jsx)(`td`,{className:v.lineNo,children:e.right?.newLineNo??``}),(0,y.jsx)(`td`,{className:`${v.lineText} ${e.right?v[`row_${e.right.kind}`]:v.rowBlank}`,children:e.right?(0,y.jsx)(S,{text:e.right.text,lang:r}):null})]},t))})]})}return(0,y.jsxs)(`table`,{className:v.hunkTable,children:[(0,y.jsx)(`caption`,{className:v.hunkCaption,children:e.header}),(0,y.jsx)(`tbody`,{children:e.lines.map((e,t)=>(0,y.jsxs)(`tr`,{className:v[`row_${e.kind}`],children:[(0,y.jsx)(`td`,{className:v.lineNo,children:e.oldLineNo??``}),(0,y.jsx)(`td`,{className:v.lineNo,children:e.newLineNo??``}),(0,y.jsx)(`td`,{className:v.lineMarker,"aria-hidden":`true`,children:e.kind===`add`?`+`:e.kind===`del`?`-`:``}),(0,y.jsx)(`td`,{className:v.lineText,children:(0,y.jsx)(S,{text:e.text,lang:r})})]},t))})]})}function S({text:e,lang:t}){let n=_(e,t);return(0,y.jsx)(`code`,{className:v.code,children:n.map((e,t)=>(0,y.jsx)(`span`,{className:v[`tok_${e.kind}`],children:e.text},t))})}export{d as i,m as n,_ as r,b as t};
|
|
7
|
+
//# sourceMappingURL=DiffViewer-QKyisN2L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffViewer-QKyisN2L.js","names":[],"sources":["../../../../../../src/web-ui/routes/inbox/diff-parser.ts","../../../../../../src/web-ui/routes/inbox/highlight.ts","../../../../../../src/web-ui/routes/inbox/DiffViewer.module.css","../../../../../../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",".viewer {\n display: grid;\n grid-template-columns: minmax(180px, 260px) 1fr;\n gap: var(--space-4);\n align-items: start;\n min-height: 0;\n}\n\n.malformedNotice {\n grid-column: 1 / -1;\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n font-size: var(--text-xs-size);\n}\n\n.empty {\n padding: var(--space-6);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n border: 1px dashed var(--border-default);\n border-radius: var(--radius-md);\n}\n\n.tree {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n padding: var(--space-2);\n max-height: 480px;\n overflow-y: auto;\n position: sticky;\n top: 0;\n}\n\n.treeItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-sm);\n background: transparent;\n border: none;\n text-align: left;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n cursor: pointer;\n}\n\n.treeItem:hover {\n background: var(--bg-hover);\n}\n\n.treeItemActive {\n background: var(--bg-selected);\n color: var(--text-primary);\n}\n\n.statusDot {\n flex: 0 0 auto;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n}\n.status_added { background: var(--status-success-solid); }\n.status_deleted { background: var(--status-danger-solid); }\n.status_modified { background: var(--status-info-solid); }\n.status_renamed { background: var(--status-warning-solid); }\n\n.treePath {\n flex: 1 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n}\n\n.treeStats {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n font-variant-numeric: tabular-nums;\n}\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.body {\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n overflow: hidden;\n}\n\n.fileHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n}\n\n.filePath {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.modeToggle {\n flex: 0 0 auto;\n display: flex;\n gap: var(--space-1);\n}\n.modeToggle button {\n padding: var(--space-1) var(--space-2);\n font-size: var(--text-xs-size);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-surface);\n color: var(--text-secondary);\n cursor: pointer;\n}\n.modeActive {\n background: var(--accent-50);\n border-color: var(--accent-500) !important;\n color: var(--accent-600) !important;\n}\n\n.notice {\n margin: var(--space-3);\n padding: var(--space-2);\n background: var(--bg-code);\n border-radius: var(--radius-sm);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n.emptyFile {\n padding: var(--space-4);\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n.hunkTable {\n width: 100%;\n border-collapse: collapse;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n table-layout: fixed;\n}\n\n.hunkCaption {\n caption-side: top;\n text-align: left;\n padding: var(--space-1) var(--space-3);\n color: var(--text-tertiary);\n background: var(--bg-canvas);\n border-bottom: 1px solid var(--border-subtle);\n border-top: 1px solid var(--border-subtle);\n}\n\n.lineNo {\n width: 44px;\n min-width: 44px;\n padding: 0 var(--space-2);\n text-align: right;\n color: var(--text-disabled);\n user-select: none;\n vertical-align: top;\n font-variant-numeric: tabular-nums;\n}\n\n.lineMarker {\n width: 16px;\n min-width: 16px;\n text-align: center;\n user-select: none;\n vertical-align: top;\n}\n\n.lineText {\n padding: 0 var(--space-2);\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n}\n\n.hunkTableSplit .lineText {\n width: 50%;\n}\n\n.rowBlank {\n background: var(--bg-canvas);\n}\n\n.row_add {\n background: var(--status-success-bg);\n}\n.row_del {\n background: var(--status-danger-bg);\n}\n.row_context {\n background: transparent;\n}\n\n.code {\n font-family: inherit;\n}\n\n.tok_plain { color: var(--text-primary); }\n.tok_comment { color: var(--text-tertiary); font-style: italic; }\n.tok_string { color: var(--status-success-fg); }\n.tok_number { color: var(--status-warning-fg); }\n.tok_keyword { color: var(--accent-600); font-weight: var(--font-weight-medium); }\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"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
._body_1kukj_1{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-secondary);margin-bottom:var(--space-4)}._form_1kukj_8{
|
|
1
|
+
._body_1kukj_1{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-secondary);margin-bottom:var(--space-4)}._form_1kukj_8{gap:var(--space-2);flex-direction:column;display:flex}._label_1kukj_14{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium)}._inputRow_1kukj_19{gap:var(--space-2);display:flex}._input_1kukj_19{padding:var(--space-3);border-radius:var(--radius-md);border:1px solid var(--border-default);background:var(--bg-input);font-family:var(--font-mono);font-size:var(--text-sm-size);flex:1;min-width:0}._input_1kukj_19:focus-visible{border-color:var(--border-focus);box-shadow:var(--shadow-focus-ring)}._reveal_1kukj_40{padding:0 var(--space-3);border-radius:var(--radius-md);border:1px solid var(--border-default);font-size:var(--text-sm-size);color:var(--text-secondary)}._reveal_1kukj_40:hover{background:var(--bg-hover)}._error_1kukj_51{color:var(--status-danger-fg);font-size:var(--text-sm-size)}._actions_1kukj_56{justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-3);display:flex}._cancel_1kukj_63{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);color:var(--text-secondary)}._cancel_1kukj_63:hover{background:var(--bg-hover)}._submit_1kukj_72{padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);background:var(--accent-500);color:var(--text-on-accent);font-weight:var(--font-weight-medium)}._submit_1kukj_72:hover:not(:disabled){background:var(--accent-600)}._submit_1kukj_72:disabled{opacity:.5;cursor:not-allowed}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,n as t,o as n}from"./index-BMRIET7F.js";import{_ as r}from"./global-C4jfYHrj.js";import{t as i}from"./Dialog-Bn0CgEGz.js";var a=n(e(),1),o={body:`_body_1kukj_1`,form:`_form_1kukj_8`,label:`_label_1kukj_14`,inputRow:`_inputRow_1kukj_19`,input:`_input_1kukj_19`,reveal:`_reveal_1kukj_40`,error:`_error_1kukj_51`,actions:`_actions_1kukj_56`,cancel:`_cancel_1kukj_63`,submit:`_submit_1kukj_72`},s=t(),c=/^[a-f0-9]{64}$/;function l({open:e,onClose:t,onUnlocked:n,reason:l,tokenLabel:u=`Mutation token`,tokenHelp:d=`the mutation token ashlr serve printed`}){let{setToken:f}=r(),[p,m]=(0,a.useState)(``),[h,g]=(0,a.useState)(!1),[_,v]=(0,a.useState)(null),y=(0,a.useRef)(null),b=(0,a.useId)(),x=(0,a.useId)();function S(e){e.preventDefault();let r=p.trim();if(!c.test(r)){v(`Expected 64 hex characters — ${d}.`);return}f(r),m(``),v(null),t(),n?.()}return(0,s.jsxs)(i,{open:e,onClose:t,titleId:b,title:`Unlock actions`,initialFocusRef:y,children:[(0,s.jsxs)(`p`,{className:o.body,children:[l??`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.`]}),(0,s.jsxs)(`form`,{onSubmit:S,className:o.form,noValidate:!0,children:[(0,s.jsx)(`label`,{htmlFor:x,className:o.label,children:u}),(0,s.jsxs)(`div`,{className:o.inputRow,children:[(0,s.jsx)(`input`,{ref:y,id:x,type:h?`text`:`password`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,className:o.input,value:p,onChange:e=>m(e.target.value),"aria-invalid":_?!0:void 0,placeholder:`64 hex characters`}),(0,s.jsx)(`button`,{type:`button`,className:o.reveal,onClick:()=>g(e=>!e),"aria-pressed":h,children:h?`Hide`:`Show`})]}),_?(0,s.jsx)(`p`,{className:o.error,role:`alert`,children:_}):null,(0,s.jsxs)(`div`,{className:o.actions,children:[(0,s.jsx)(`button`,{type:`button`,className:o.cancel,onClick:t,children:`Cancel`}),(0,s.jsx)(`button`,{type:`submit`,className:o.submit,disabled:p.trim().length===0,children:`Unlock`})]})]})]})}export{l as t};
|
|
2
|
+
//# sourceMappingURL=MutationTokenDialog-DbSHPy3w.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MutationTokenDialog-DbSHPy3w.js","names":[],"sources":["../../../../../../src/web-ui/components/auth/MutationTokenDialog.module.css","../../../../../../src/web-ui/components/auth/MutationTokenDialog.tsx"],"sourcesContent":[".body {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n margin-bottom: var(--space-4);\n}\n\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.label {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n}\n\n.inputRow {\n display: flex;\n gap: var(--space-2);\n}\n\n.input {\n flex: 1;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n background: var(--bg-input);\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n min-width: 0;\n}\n\n.input:focus-visible {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.reveal {\n padding: 0 var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-default);\n font-size: var(--text-sm-size);\n color: var(--text-secondary);\n}\n.reveal:hover {\n background: var(--bg-hover);\n}\n\n.error {\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-3);\n}\n\n.cancel {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n color: var(--text-secondary);\n}\n.cancel:hover {\n background: var(--bg-hover);\n}\n\n.submit {\n padding: var(--space-2) var(--space-4);\n border-radius: var(--radius-md);\n background: var(--accent-500);\n color: var(--text-on-accent);\n font-weight: var(--font-weight-medium);\n}\n.submit:hover:not(:disabled) {\n background: var(--accent-600);\n}\n.submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n","/**\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"],"mappings":"2ZCgBM,EAAW,iBAajB,SAAgB,EAAoB,CAAE,OAAM,UAAS,aAAY,SAAQ,aAAa,iBACpF,YAAY,0CAAsE,CAClF,GAAM,CAAE,YAAa,EAAgB,EAC/B,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,EAAK,EACpC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAwB,IAAI,EAChD,GAAA,EAAW,EAAA,OAAA,CAAyB,IAAI,EACxC,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAU,EAAA,MAAA,CAAM,EAEtB,SAAS,EAAO,EAAc,CAC5B,EAAE,eAAe,EACjB,IAAM,EAAU,EAAM,KAAK,EAC3B,GAAI,CAAC,EAAS,KAAK,CAAO,EAAG,CAC3B,EAAS,gCAAgC,EAAU,EAAE,EACrD,MACF,CACA,EAAS,CAAO,EAChB,EAAS,EAAE,EACX,EAAS,IAAI,EACb,EAAQ,EACR,IAAa,CACf,CAEA,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAc,OAAe,UAAkB,UAAS,MAAM,iBAAiB,gBAAiB,EAAhG,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CACG,GAAU,iEAAiE,uGAE3E,CACH,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,SAAU,EAAQ,UAAW,EAAO,KAAM,WAAA,GAAhD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,QAAS,EAAS,UAAW,EAAO,MACxC,SAAA,CACI,CAAA,GACP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,GAAI,EACJ,KAAM,EAAS,OAAS,WACxB,aAAa,MACb,YAAY,MACZ,WAAY,GACZ,UAAW,EAAO,MACX,QACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EACxC,eAAc,EAAQ,GAAO,IAAA,GAC7B,YAAY,mBACb,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,OAClB,YAAe,EAAW,GAAM,CAAC,CAAC,EAClC,eAAc,EAEb,SAAA,EAAS,OAAS,MACb,CAAA,CACL,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAO,KAAK,QAC9B,SAAA,CACA,CAAA,EACD,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAO,QAAvB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,QAAS,EAAS,SAAA,QAE1D,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,OAAQ,SAAU,EAAM,KAAK,CAAC,CAAC,SAAW,EAAG,SAAA,QAE7E,CAAA,CACL,GACD,CACA,CAAA,CAAA,GAEZ"}
|