@ashlr/hub 3.5.1 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +165 -0
- package/README.md +3 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/activation.d.ts +41 -0
- package/dist/cli/activation.js +485 -0
- package/dist/cli/activation.js.map +1 -0
- package/dist/core/daemon/cutoff-checkpoint-scheduler.js +7 -0
- package/dist/core/daemon/cutoff-checkpoint-scheduler.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +19 -0
- package/dist/core/daemon/loop.js +235 -5
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/overnight-status.d.ts +152 -0
- package/dist/core/daemon/overnight-status.js +275 -0
- package/dist/core/daemon/overnight-status.js.map +1 -0
- package/dist/core/daemon/post-merge-halt.d.ts +212 -0
- package/dist/core/daemon/post-merge-halt.js +503 -0
- package/dist/core/daemon/post-merge-halt.js.map +1 -0
- package/dist/core/daemon/run-window.d.ts +218 -0
- package/dist/core/daemon/run-window.js +420 -0
- package/dist/core/daemon/run-window.js.map +1 -0
- package/dist/core/fleet/generated-repair-resolution.d.ts +36 -0
- package/dist/core/fleet/generated-repair-resolution.js +245 -0
- package/dist/core/fleet/generated-repair-resolution.js.map +1 -0
- package/dist/core/local-runtime/llama/port.d.ts +17 -0
- package/dist/core/local-runtime/llama/port.js +47 -0
- package/dist/core/local-runtime/llama/port.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-host.d.ts +54 -0
- package/dist/core/local-runtime/llama/proxy-host.js +159 -0
- package/dist/core/local-runtime/llama/proxy-host.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-process.d.ts +148 -0
- package/dist/core/local-runtime/llama/proxy-process.js +250 -0
- package/dist/core/local-runtime/llama/proxy-process.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-record.d.ts +40 -0
- package/dist/core/local-runtime/llama/proxy-record.js +133 -0
- package/dist/core/local-runtime/llama/proxy-record.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +118 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.js +511 -0
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +1 -0
- package/dist/core/policy/local-only.d.ts +142 -2
- package/dist/core/policy/local-only.js +204 -15
- package/dist/core/policy/local-only.js.map +1 -1
- package/dist/core/run/budget.d.ts +22 -8
- package/dist/core/run/budget.js +80 -12
- package/dist/core/run/budget.js.map +1 -1
- package/dist/core/run/sandboxed-engine.js +3 -3
- package/dist/core/run/sandboxed-engine.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +61 -9
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +60 -8
- package/dist/core/verse/session-engine.d.ts +42 -1
- package/dist/core/verse/session-engine.js +79 -2
- package/dist/core/verse/session-engine.js.map +1 -1
- package/dist/core/web/public/next/assets/{App-BbVoUCIi.js → App-BsbJFA2j.js} +2 -2
- package/dist/core/web/public/next/assets/{App-BbVoUCIi.js.map → App-BsbJFA2j.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js → ApprovalsSection-2CCSoBTJ.js} +2 -2
- package/dist/core/web/public/next/assets/{ApprovalsSection-BW9iVjUa.js.map → ApprovalsSection-2CCSoBTJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{AutonomySection-Cpk_oEhc.css → AutonomySection-CHjxJt2z.css} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-yeNNUPur.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-BfnLe5dT.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js +80 -0
- package/dist/core/web/public/next/assets/ChatSection-DwDDnCZQ.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js → ConfirmDialog-C363ty_c.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-CXevY3Au.js.map → ConfirmDialog-C363ty_c.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js → Dialog-nK15L1M0.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-Bn0CgEGz.js.map → Dialog-nK15L1M0.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js → DiffViewer-D369eZe8.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-QKyisN2L.js.map → DiffViewer-D369eZe8.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-D88QlDpG.css +1 -0
- package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js +2 -0
- package/dist/core/web/public/next/assets/McpSection-DVgiSYG1.js.map +1 -0
- package/dist/core/web/public/next/assets/Meter-CLcr-4wS.css +1 -0
- package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js +2 -0
- package/dist/core/web/public/next/assets/Meter-Cmo1pLbk.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js → MutationTokenDialog-B9I4PAcp.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-DbSHPy3w.js.map → MutationTokenDialog-B9I4PAcp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js → ResourcePoolConsoleApp-z6tJj3s9.js} +2 -2
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-C-PCgCzo.js.map → ResourcePoolConsoleApp-z6tJj3s9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js → RouteErrorBoundary-OSajL45F.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-Dw8ZjmkS.js.map → RouteErrorBoundary-OSajL45F.js.map} +1 -1
- package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-B3YH2Npi.js.map +1 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js → UniverseConsoleApp-wEKIzl1M.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-Bk5HipM0.js.map → UniverseConsoleApp-wEKIzl1M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js → UniverseView-CQVpJqqI.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseView-D8k9q0ce.js.map → UniverseView-CQVpJqqI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js → UsageSection-dToBThXe.js} +2 -2
- package/dist/core/web/public/next/assets/{UsageSection-B2E06ZH1.js.map → UsageSection-dToBThXe.js.map} +1 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CMkCizvL.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DHU32JCQ.js.map +1 -0
- package/dist/core/web/public/next/assets/{charts-DSUpczxG.js → charts-BopViIha.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-DSUpczxG.js.map → charts-BopViIha.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-DMWakEhP.js +2 -0
- package/dist/core/web/public/next/assets/global-DMWakEhP.js.map +1 -0
- package/dist/core/web/public/next/assets/global-z-JfD3ow.css +1 -0
- package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js → icons-L06pQH6j.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-BxOX8-XB.js.map → icons-L06pQH6j.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-BMRIET7F.js → index-CXgVQHek.js} +3 -3
- package/dist/core/web/public/next/assets/{index-BMRIET7F.js.map → index-CXgVQHek.js.map} +1 -1
- package/dist/core/web/public/next/assets/{queries-AxnVa02h.js → queries-D3sSlan1.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-AxnVa02h.js.map → queries-D3sSlan1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js → use-guarded-action-BxfJ9E-n.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-BO6c94Wp.js.map → use-guarded-action-BxfJ9E-n.js.map} +1 -1
- package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-v0a1gl-C.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js +0 -80
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-LQiAn6Eu.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-D2E3mU9a.css +0 -1
- package/dist/core/web/public/next/assets/global-C4jfYHrj.js +0 -2
- package/dist/core/web/public/next/assets/global-C4jfYHrj.js.map +0 -1
- package/dist/core/web/public/next/assets/global-D463gG1X.css +0 -1
- package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js +0 -2
- package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,n as t,o as n}from"./index-BMRIET7F.js";import{N as r,a as i,c as a,i as o,o as s,p as c,v as l}from"./global-C4jfYHrj.js";import{i as u}from"./RouteErrorBoundary-Dw8ZjmkS.js";import{h as d,u as f}from"./queries-AxnVa02h.js";import{i as p,n as m,t as h}from"./ConfirmDialog-CXevY3Au.js";import{t as g}from"./MutationTokenDialog-DbSHPy3w.js";import{t as _}from"./DiffViewer-QKyisN2L.js";import{R as v,d as y}from"./VerseConsoleApp-CRfZUV-T.js";import{i as b,l as x}from"./format-BNYWGJat.js";import{t as S}from"./use-guarded-action-BO6c94Wp.js";var C=n(e(),1);function w(e){return[...e].sort((e,t)=>{let n=e.status===`pending`?0:1,r=t.status===`pending`?0:1;if(n!==r)return n-r;let i=Date.parse(e.createdAt),a=Date.parse(t.createdAt),o=Number.isNaN(i)?0:i,s=Number.isNaN(a)?0:a;return o===s?e.id.localeCompare(t.id):s-o})}function T(e,t,n){let r=t.trim().toLowerCase(),i=n.trim().toLowerCase();return!r&&!i?[...e]:e.filter(e=>!(r&&!e.title.toLowerCase().includes(r)&&!(e.summary??``).toLowerCase().includes(r)||i&&!(e.repo??``).toLowerCase().includes(i)))}function E(e,t){let n=t||`the target repository`;switch(e){case`pr`:return`Pushes a branch to ${n}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;case`patch`:return`Writes the diff to ${n} on disk now. Nothing is pushed, but the working tree changes.`;default:return`Applies this ${String(e)} proposal to ${n} now.`}}function D(e){return e===`pr`}function O(e){return e.engineModel?e.engineModel:e.engineTier?e.engineTier:null}var k={layout:`_layout_1e5d8_8`,listPane:`_listPane_1e5d8_9`,detailPane:`_detailPane_1e5d8_10`,filters:`_filters_1e5d8_12`,filterField:`_filterField_1e5d8_13`,filterLabel:`_filterLabel_1e5d8_14`,filterSelect:`_filterSelect_1e5d8_31`,count:`_count_1e5d8_46`,rows:`_rows_1e5d8_48`,row:`_row_1e5d8_48`,rowActive:`_rowActive_1e5d8_63`,riskRule:`_riskRule_1e5d8_68`,rowTitle:`_rowTitle_1e5d8_72`,rowMeta:`_rowMeta_1e5d8_73`,rowMetaMono:`_rowMetaMono_1e5d8_82`,rowAge:`_rowAge_1e5d8_83`,riskWord:`_riskWord_1e5d8_84`,detail:`_detail_1e5d8_10`,detailHead:`_detailHead_1e5d8_91`,detailTitle:`_detailTitle_1e5d8_92`,detailMeta:`_detailMeta_1e5d8_93`,summary:`_summary_1e5d8_95`,block:`_block_1e5d8_97`,blockTitle:`_blockTitle_1e5d8_98`,defs:`_defs_1e5d8_107`,muted:`_muted_1e5d8_111`,failedChecks:`_failedChecks_1e5d8_112`,actions:`_actions_1e5d8_114`,actionNote:`_actionNote_1e5d8_115`,reject:`_reject_1e5d8_116`,approve:`_approve_1e5d8_117`,decided:`_decided_1e5d8_133`,empty:`_empty_1e5d8_135`,emptyStrong:`_emptyStrong_1e5d8_136`,error:`_error_1e5d8_137`,skeletons:`_skeletons_1e5d8_138`},A=t(),j={"judge-ship-would-merge":{label:`Ship (would merge)`,tone:`success`},"judge-ship-review-required":{label:`Ship (review required)`,tone:`success`},"judge-review":{label:`Review`,tone:`warning`},"judge-noise":{label:`Noise`,tone:`neutral`},"judge-harmful":{label:`Harmful`,tone:`danger`},"judge-verdict-unrecognized":{label:`Unrecognized verdict`,tone:`unknown`},"judge-parse-failure":{label:`Judge parse failure — not a review`,tone:`unknown`},"judge-network-failure":{label:`Judge network failure — not a review`,tone:`unknown`}};function M(e){let t=e.filter(e=>e.action===`judged`&&e.judgeReasonCode);return t.length===0?null:t.reduce((e,t)=>Date.parse(t.ts)>Date.parse(e.ts)?t:e)}function N({id:e,dispatchEnabled:t,onDispatchDisabled:n,onDecided:i}){let f=l(d(e)),[v,y]=(0,C.useState)(null),[b,w]=(0,C.useState)(!1),[T,N]=(0,C.useState)(!1),[P,F]=(0,C.useState)(!1),[I,L]=(0,C.useState)(null);function R(e){L(null),y(e),r()?N(!0):w(!0)}function z(){w(!1),r()?N(!0):y(null)}async function B(){if(v){F(!0),L(null);try{v===`approve`?await m(e):await p(e),N(!1),y(null),i()}catch(e){e instanceof a?(N(!1),y(null),n()):L(S(e))}finally{F(!1)}}}if(f.status===`loading`)return(0,A.jsxs)(`div`,{className:k.detail,children:[(0,A.jsx)(o,{width:`55%`}),(0,A.jsx)(o,{width:`30%`}),(0,A.jsx)(o,{width:`88%`})]});if(f.status===`error`||!f.data)return(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:f.error?.message??`Could not load this proposal.`});let V=f.data,H=V.decisionEvidence,U=M(H?.decisions??[]),W=U?.judgeReasonCode?j[U.judgeReasonCode]:null,G=V.status===`pending`&&t,K=O(V),q=E(V.kind,V.repo);return(0,A.jsxs)(`div`,{className:k.detail,children:[(0,A.jsxs)(`header`,{className:k.detailHead,children:[(0,A.jsx)(`h3`,{className:k.detailTitle,children:V.title}),(0,A.jsxs)(`div`,{className:k.detailMeta,children:[(0,A.jsx)(c,{status:V.status}),(0,A.jsx)(`span`,{children:V.kind}),(0,A.jsx)(`code`,{title:V.repo??void 0,children:V.repo??`no repo`}),(0,A.jsx)(`span`,{children:V.riskClass?`${V.riskClass} risk`:`risk unstated`}),K?(0,A.jsx)(`code`,{children:K}):null,(0,A.jsxs)(`span`,{children:[`created `,x(V.createdAt)]}),V.decidedAt?(0,A.jsxs)(`span`,{children:[`decided `,x(V.decidedAt)]}):null,f.status===`refreshing`?(0,A.jsx)(s,{}):null]}),V.summary?(0,A.jsx)(`p`,{className:k.summary,children:V.summary}):null]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Evidence`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Evidence`}),(0,A.jsxs)(`dl`,{className:k.defs,children:[(0,A.jsx)(`dt`,{children:`Judge verdict`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(u,{quality:H?.sourceQuality,label:`judge verdict`,children:W&&U?.judgeReasonCode?(0,A.jsx)(c,{status:U.judgeReasonCode,tone:W.tone,children:W.label}):(0,A.jsx)(`span`,{className:k.muted,children:`not yet judged`})})}),(0,A.jsx)(`dt`,{children:`Verification`}),(0,A.jsx)(`dd`,{children:V.verifyResult?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(c,{status:V.verifyResult.passed?`success`:`failed`,children:V.verifyResult.passed?`passed`:`failed`}),V.verifyResult.ran&&V.verifyResult.ran.length>0?(0,A.jsxs)(`span`,{className:k.muted,children:[` · ran `,V.verifyResult.ran.map(e=>e.kind).join(`, `)]}):null,!V.verifyResult.passed&&V.verifyResult.failureCategory&&V.verifyResult.failureCategory!==`code`?(0,A.jsxs)(`span`,{className:k.muted,children:[` · `,V.verifyResult.failureCategory,` failure — the verifier itself, not the diff`]}):null,V.verifyResult.failed&&V.verifyResult.failed.length>0?(0,A.jsxs)(`p`,{className:k.failedChecks,children:[`failed: `,V.verifyResult.failed.join(`, `)]}):null]}):(0,A.jsx)(`span`,{className:k.muted,children:`not verified`})}),V.decisionReason?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Decision reason`}),(0,A.jsx)(`dd`,{children:V.decisionReason})]}):null,V.evidenceOutcome?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Gates`}),(0,A.jsxs)(`dd`,{className:k.muted,children:[V.evidenceOutcome.gateCount??0,` gate`,V.evidenceOutcome.gateCount===1?``:`s`,V.evidenceOutcome.policyAction?` · policy ${V.evidenceOutcome.policyAction}`:``,V.evidenceOutcome.trustBasis?` · trust ${V.evidenceOutcome.trustBasis}`:``]})]}):null,V.result?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Result`}),(0,A.jsx)(`dd`,{children:V.result})]}):null]})]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Provenance`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Provenance`}),(0,A.jsxs)(`dl`,{className:k.defs,children:[(0,A.jsx)(`dt`,{children:`Produced by`}),(0,A.jsx)(`dd`,{children:K?(0,A.jsx)(`code`,{children:K}):(0,A.jsx)(`span`,{className:k.muted,children:`unknown engine`})}),(0,A.jsx)(`dt`,{children:`Origin`}),(0,A.jsx)(`dd`,{children:V.origin}),V.workItemId?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Work item`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:V.workItemId})})]}):null,V.runId?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Run`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:V.runId})})]}):null,(0,A.jsx)(`dt`,{children:`Attestation`}),(0,A.jsxs)(`dd`,{className:k.muted,children:[V.producerProvenanceSig?`signed by the sandboxed producer (v${V.producerProvenanceVersion??2})`:V.provenanceSig?`legacy signature present`:`unsigned — earns no positive routing credit`,V.diffHash?` · diff hashed at signing time`:``]})]})]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Diff`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Diff`}),(0,A.jsx)(_,{diff:V.diff,proposalKind:V.kind})]}),V.status===`pending`?(0,A.jsxs)(`footer`,{className:k.actions,children:[(0,A.jsx)(`p`,{className:k.actionNote,children:t?q:`Read-only session — approve and reject are unavailable without dispatch.`}),I&&!T?(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:I}):null,(0,A.jsx)(`button`,{type:`button`,className:k.reject,disabled:!G||P,onClick:()=>R(`reject`),children:`Reject`}),(0,A.jsx)(`button`,{type:`button`,className:k.approve,disabled:!G||P,onClick:()=>R(`approve`),children:`Approve…`})]}):(0,A.jsxs)(`footer`,{className:k.decided,children:[`This proposal is already `,(0,A.jsx)(`strong`,{children:V.status}),` — no further action is available.`]}),(0,A.jsx)(g,{open:b,onClose:z,reason:v===`approve`?`Approving a proposal writes to a real repository and requires the dispatch token.`:`Rejecting a proposal requires the dispatch token.`,tokenHelp:`the mutation token ashlr verse printed`}),(0,A.jsx)(h,{open:T,onClose:()=>{N(!1),y(null),L(null)},title:v===`approve`?`Approve this ${V.kind} against ${V.repo?V.repo.split(`/`).pop():`the repository`}?`:`Reject this proposal?`,body:v===`approve`?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:V.title}),(0,A.jsx)(`br`,{}),`Kind `,(0,A.jsx)(`strong`,{children:V.kind}),` · repository `,(0,A.jsx)(`code`,{children:V.repo??`unknown`}),(0,A.jsx)(`br`,{}),(0,A.jsx)(`br`,{}),q,D(V.kind)?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`br`,{}),(0,A.jsx)(`br`,{}),`This one leaves your machine.`]}):null]}):(0,A.jsxs)(A.Fragment,{children:[`This rejects `,(0,A.jsx)(`strong`,{children:V.title}),` and discards it. It stays in history as rejected and is never applied.`]}),confirmLabel:v===`approve`?`Approve and ${D(V.kind)?`open the pull request`:`apply`}`:`Reject`,destructive:v===`approve`,busy:P,error:I,onConfirm:()=>void B()})]})}var P=[{value:`pending`,label:`Pending`},{value:`all`,label:`All statuses`},{value:`approved`,label:`Approved`},{value:`applied`,label:`Applied`},{value:`rejected`,label:`Rejected`},{value:`failed`,label:`Failed`},{value:`awaiting-host-merge`,label:`Awaiting host merge`}];function F({selectedId:e,onSelect:t}){let[n,r]=(0,C.useState)(`pending`),[a,o]=(0,C.useState)(``),[u,d]=(0,C.useState)(``),[p,m]=(0,C.useState)(0),h=(0,C.useRef)(new Map),g=l(f({status:n,limit:500})),_=(0,C.useMemo)(()=>w(T(g.data?.proposals??[],a,u)),[g.data,a,u]);function y(e){if(_.length!==0&&(e.key===`ArrowDown`||e.key===`ArrowUp`)){e.preventDefault();let t=e.key===`ArrowDown`?Math.min(p+1,_.length-1):Math.max(p-1,0);m(t),h.current.get(_[t].id)?.focus()}}return(0,A.jsxs)(`div`,{className:k.listPane,children:[(0,A.jsxs)(`div`,{className:k.filters,children:[(0,A.jsx)(v,{className:k.filterSelect,label:`Status`,value:n,onChange:e=>r(e.target.value),children:P.map(e=>(0,A.jsx)(`option`,{value:e.value,children:e.label},e.value))}),(0,A.jsxs)(`label`,{className:k.filterField,children:[(0,A.jsx)(`span`,{className:k.filterLabel,children:`Repo`}),(0,A.jsx)(`input`,{type:`text`,value:u,placeholder:`filter by repo`,onChange:e=>d(e.target.value)})]}),(0,A.jsxs)(`label`,{className:k.filterField,children:[(0,A.jsx)(`span`,{className:k.filterLabel,children:`Search`}),(0,A.jsx)(`input`,{type:`search`,value:a,placeholder:`title or summary`,onChange:e=>o(e.target.value)})]})]}),(0,A.jsxs)(`div`,{className:k.count,"aria-live":`polite`,children:[g.status===`refreshing`?(0,A.jsx)(s,{}):null,g.data?(0,A.jsxs)(`span`,{children:[_.length,` shown · `,g.data.pending,` pending`,g.data.truncated?` · capped, narrow the filter`:``]}):(0,A.jsx)(`span`,{children:`Loading proposals…`})]}),g.status===`loading`?(0,A.jsxs)(`div`,{className:k.skeletons,children:[(0,A.jsx)(i,{}),(0,A.jsx)(i,{}),(0,A.jsx)(i,{})]}):g.status===`error`?(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:g.error?.message??`Could not read the approvals queue.`}):_.length===0?(0,A.jsx)(`p`,{className:k.empty,children:n===`pending`&&!a&&!u?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:k.emptyStrong,children:`Nothing is waiting on you.`}),` The loop only produces proposals for enrolled repositories — if you expected something here, check the scope list in Autonomy.`]}):`No proposals match this filter.`}):(0,A.jsx)(`div`,{className:k.rows,role:`list`,onKeyDown:y,children:_.map((n,r)=>{let i=O(n);return(0,A.jsx)(`div`,{role:`listitem`,children:(0,A.jsxs)(`button`,{type:`button`,ref:e=>{e?h.current.set(n.id,e):h.current.delete(n.id)},tabIndex:r===p?0:-1,className:`${k.row} ${n.id===e?k.rowActive:``}`,"aria-current":n.id===e?`true`:void 0,onFocus:()=>m(r),onClick:()=>t(n.id),children:[(0,A.jsx)(`span`,{className:k.riskRule,"data-risk":n.riskClass??`unstated`,"aria-hidden":`true`}),(0,A.jsx)(`span`,{className:k.rowTitle,title:n.title,children:n.title}),(0,A.jsxs)(`span`,{className:k.rowMeta,children:[(0,A.jsx)(`span`,{className:k.riskWord,"data-risk":n.riskClass??`unstated`,children:n.riskClass?`${n.riskClass} risk`:`risk unstated`}),(0,A.jsx)(`span`,{className:k.rowMetaMono,title:n.repo??void 0,children:n.repo?n.repo.split(`/`).pop():`no repo`}),(0,A.jsx)(`span`,{className:k.rowMetaMono,title:i??void 0,children:i??`engine unknown`}),(0,A.jsx)(`span`,{className:k.rowAge,children:b(n.createdAt)}),n.status===`pending`?null:(0,A.jsx)(c,{status:n.status})]})]})},n.id)})})]})}var I={section:`_section_sshlm_7`,header:`_header_sshlm_9`,title:`_title_sshlm_22`,headerMeta:`_headerMeta_sshlm_30`,banner:`_banner_sshlm_32`,bannerTitle:`_bannerTitle_sshlm_42`,body:`_body_sshlm_44`,placeholder:`_placeholder_sshlm_46`,placeholderHint:`_placeholderHint_sshlm_47`};function L(){let e=l(y),t=l(f({status:`pending`,limit:500})),[n,r]=(0,C.useState)(null),[i,a]=(0,C.useState)(!1),o=(e.data?.dispatchEnabled??!0)&&!i,s=t.data?.pending;return(0,A.jsxs)(`section`,{className:I.section,"aria-label":`Approvals`,children:[(0,A.jsxs)(`header`,{className:I.header,"data-app-region":`drag`,children:[(0,A.jsx)(`h2`,{className:I.title,children:`Approvals`}),(0,A.jsx)(`span`,{className:I.headerMeta,children:typeof s==`number`?`${s} awaiting you`:`counting…`})]}),o?null:(0,A.jsxs)(`div`,{className:I.banner,role:`status`,children:[(0,A.jsx)(`span`,{className:I.bannerTitle,children:`Read-only session`}),`This server was started without dispatch, so approve and reject are unavailable. Diffs, verification results and provenance still read normally — run `,(0,A.jsx)(`code`,{children:`ashlr verse`}),` to decide.`]}),(0,A.jsxs)(`div`,{className:`${I.body} ${k.layout}`,children:[(0,A.jsx)(F,{selectedId:n,onSelect:r}),(0,A.jsx)(`div`,{className:k.detailPane,children:n?(0,A.jsx)(N,{id:n,dispatchEnabled:o,onDispatchDisabled:()=>a(!0),onDecided:()=>r(null)},n):(0,A.jsxs)(`div`,{className:I.placeholder,children:[`Select a proposal to read its diff, its verification result, and where it came from before deciding.`,(0,A.jsx)(`p`,{className:I.placeholderHint,children:`↑/↓ moves through the queue · pending proposals sort first.`})]})})]})]})}export{L as ApprovalsSection};
|
|
2
|
-
//# sourceMappingURL=ApprovalsSection-
|
|
1
|
+
import{a as e,n as t,o as n}from"./index-CXgVQHek.js";import{N as r,a as i,c as a,i as o,o as s,p as c,v as l}from"./global-DMWakEhP.js";import{i as u}from"./RouteErrorBoundary-OSajL45F.js";import{h as d,u as f}from"./queries-D3sSlan1.js";import{i as p,n as m,t as h}from"./ConfirmDialog-C363ty_c.js";import{t as g}from"./MutationTokenDialog-B9I4PAcp.js";import{t as _}from"./DiffViewer-D369eZe8.js";import{g as v,z as y}from"./VerseConsoleApp-DHU32JCQ.js";import{i as b,l as x}from"./format-BNYWGJat.js";import{t as S}from"./use-guarded-action-BxfJ9E-n.js";var C=n(e(),1);function w(e){return[...e].sort((e,t)=>{let n=e.status===`pending`?0:1,r=t.status===`pending`?0:1;if(n!==r)return n-r;let i=Date.parse(e.createdAt),a=Date.parse(t.createdAt),o=Number.isNaN(i)?0:i,s=Number.isNaN(a)?0:a;return o===s?e.id.localeCompare(t.id):s-o})}function T(e,t,n){let r=t.trim().toLowerCase(),i=n.trim().toLowerCase();return!r&&!i?[...e]:e.filter(e=>!(r&&!e.title.toLowerCase().includes(r)&&!(e.summary??``).toLowerCase().includes(r)||i&&!(e.repo??``).toLowerCase().includes(i)))}function E(e,t){let n=t||`the target repository`;switch(e){case`pr`:return`Pushes a branch to ${n}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;case`patch`:return`Writes the diff to ${n} on disk now. Nothing is pushed, but the working tree changes.`;default:return`Applies this ${String(e)} proposal to ${n} now.`}}function D(e){return e===`pr`}function O(e){return e.engineModel?e.engineModel:e.engineTier?e.engineTier:null}var k={layout:`_layout_1e5d8_8`,listPane:`_listPane_1e5d8_9`,detailPane:`_detailPane_1e5d8_10`,filters:`_filters_1e5d8_12`,filterField:`_filterField_1e5d8_13`,filterLabel:`_filterLabel_1e5d8_14`,filterSelect:`_filterSelect_1e5d8_31`,count:`_count_1e5d8_46`,rows:`_rows_1e5d8_48`,row:`_row_1e5d8_48`,rowActive:`_rowActive_1e5d8_63`,riskRule:`_riskRule_1e5d8_68`,rowTitle:`_rowTitle_1e5d8_72`,rowMeta:`_rowMeta_1e5d8_73`,rowMetaMono:`_rowMetaMono_1e5d8_82`,rowAge:`_rowAge_1e5d8_83`,riskWord:`_riskWord_1e5d8_84`,detail:`_detail_1e5d8_10`,detailHead:`_detailHead_1e5d8_91`,detailTitle:`_detailTitle_1e5d8_92`,detailMeta:`_detailMeta_1e5d8_93`,summary:`_summary_1e5d8_95`,block:`_block_1e5d8_97`,blockTitle:`_blockTitle_1e5d8_98`,defs:`_defs_1e5d8_107`,muted:`_muted_1e5d8_111`,failedChecks:`_failedChecks_1e5d8_112`,actions:`_actions_1e5d8_114`,actionNote:`_actionNote_1e5d8_115`,reject:`_reject_1e5d8_116`,approve:`_approve_1e5d8_117`,decided:`_decided_1e5d8_133`,empty:`_empty_1e5d8_135`,emptyStrong:`_emptyStrong_1e5d8_136`,error:`_error_1e5d8_137`,skeletons:`_skeletons_1e5d8_138`},A=t(),j={"judge-ship-would-merge":{label:`Ship (would merge)`,tone:`success`},"judge-ship-review-required":{label:`Ship (review required)`,tone:`success`},"judge-review":{label:`Review`,tone:`warning`},"judge-noise":{label:`Noise`,tone:`neutral`},"judge-harmful":{label:`Harmful`,tone:`danger`},"judge-verdict-unrecognized":{label:`Unrecognized verdict`,tone:`unknown`},"judge-parse-failure":{label:`Judge parse failure — not a review`,tone:`unknown`},"judge-network-failure":{label:`Judge network failure — not a review`,tone:`unknown`}};function M(e){let t=e.filter(e=>e.action===`judged`&&e.judgeReasonCode);return t.length===0?null:t.reduce((e,t)=>Date.parse(t.ts)>Date.parse(e.ts)?t:e)}function N({id:e,dispatchEnabled:t,onDispatchDisabled:n,onDecided:i}){let f=l(d(e)),[v,y]=(0,C.useState)(null),[b,w]=(0,C.useState)(!1),[T,N]=(0,C.useState)(!1),[P,F]=(0,C.useState)(!1),[I,L]=(0,C.useState)(null);function R(e){L(null),y(e),r()?N(!0):w(!0)}function z(){w(!1),r()?N(!0):y(null)}async function B(){if(v){F(!0),L(null);try{v===`approve`?await m(e):await p(e),N(!1),y(null),i()}catch(e){e instanceof a?(N(!1),y(null),n()):L(S(e))}finally{F(!1)}}}if(f.status===`loading`)return(0,A.jsxs)(`div`,{className:k.detail,children:[(0,A.jsx)(o,{width:`55%`}),(0,A.jsx)(o,{width:`30%`}),(0,A.jsx)(o,{width:`88%`})]});if(f.status===`error`||!f.data)return(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:f.error?.message??`Could not load this proposal.`});let V=f.data,H=V.decisionEvidence,U=M(H?.decisions??[]),W=U?.judgeReasonCode?j[U.judgeReasonCode]:null,G=V.status===`pending`&&t,K=O(V),q=E(V.kind,V.repo);return(0,A.jsxs)(`div`,{className:k.detail,children:[(0,A.jsxs)(`header`,{className:k.detailHead,children:[(0,A.jsx)(`h3`,{className:k.detailTitle,children:V.title}),(0,A.jsxs)(`div`,{className:k.detailMeta,children:[(0,A.jsx)(c,{status:V.status}),(0,A.jsx)(`span`,{children:V.kind}),(0,A.jsx)(`code`,{title:V.repo??void 0,children:V.repo??`no repo`}),(0,A.jsx)(`span`,{children:V.riskClass?`${V.riskClass} risk`:`risk unstated`}),K?(0,A.jsx)(`code`,{children:K}):null,(0,A.jsxs)(`span`,{children:[`created `,x(V.createdAt)]}),V.decidedAt?(0,A.jsxs)(`span`,{children:[`decided `,x(V.decidedAt)]}):null,f.status===`refreshing`?(0,A.jsx)(s,{}):null]}),V.summary?(0,A.jsx)(`p`,{className:k.summary,children:V.summary}):null]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Evidence`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Evidence`}),(0,A.jsxs)(`dl`,{className:k.defs,children:[(0,A.jsx)(`dt`,{children:`Judge verdict`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(u,{quality:H?.sourceQuality,label:`judge verdict`,children:W&&U?.judgeReasonCode?(0,A.jsx)(c,{status:U.judgeReasonCode,tone:W.tone,children:W.label}):(0,A.jsx)(`span`,{className:k.muted,children:`not yet judged`})})}),(0,A.jsx)(`dt`,{children:`Verification`}),(0,A.jsx)(`dd`,{children:V.verifyResult?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(c,{status:V.verifyResult.passed?`success`:`failed`,children:V.verifyResult.passed?`passed`:`failed`}),V.verifyResult.ran&&V.verifyResult.ran.length>0?(0,A.jsxs)(`span`,{className:k.muted,children:[` · ran `,V.verifyResult.ran.map(e=>e.kind).join(`, `)]}):null,!V.verifyResult.passed&&V.verifyResult.failureCategory&&V.verifyResult.failureCategory!==`code`?(0,A.jsxs)(`span`,{className:k.muted,children:[` · `,V.verifyResult.failureCategory,` failure — the verifier itself, not the diff`]}):null,V.verifyResult.failed&&V.verifyResult.failed.length>0?(0,A.jsxs)(`p`,{className:k.failedChecks,children:[`failed: `,V.verifyResult.failed.join(`, `)]}):null]}):(0,A.jsx)(`span`,{className:k.muted,children:`not verified`})}),V.decisionReason?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Decision reason`}),(0,A.jsx)(`dd`,{children:V.decisionReason})]}):null,V.evidenceOutcome?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Gates`}),(0,A.jsxs)(`dd`,{className:k.muted,children:[V.evidenceOutcome.gateCount??0,` gate`,V.evidenceOutcome.gateCount===1?``:`s`,V.evidenceOutcome.policyAction?` · policy ${V.evidenceOutcome.policyAction}`:``,V.evidenceOutcome.trustBasis?` · trust ${V.evidenceOutcome.trustBasis}`:``]})]}):null,V.result?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Result`}),(0,A.jsx)(`dd`,{children:V.result})]}):null]})]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Provenance`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Provenance`}),(0,A.jsxs)(`dl`,{className:k.defs,children:[(0,A.jsx)(`dt`,{children:`Produced by`}),(0,A.jsx)(`dd`,{children:K?(0,A.jsx)(`code`,{children:K}):(0,A.jsx)(`span`,{className:k.muted,children:`unknown engine`})}),(0,A.jsx)(`dt`,{children:`Origin`}),(0,A.jsx)(`dd`,{children:V.origin}),V.workItemId?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Work item`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:V.workItemId})})]}):null,V.runId?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`dt`,{children:`Run`}),(0,A.jsx)(`dd`,{children:(0,A.jsx)(`code`,{children:V.runId})})]}):null,(0,A.jsx)(`dt`,{children:`Attestation`}),(0,A.jsxs)(`dd`,{className:k.muted,children:[V.producerProvenanceSig?`signed by the sandboxed producer (v${V.producerProvenanceVersion??2})`:V.provenanceSig?`legacy signature present`:`unsigned — earns no positive routing credit`,V.diffHash?` · diff hashed at signing time`:``]})]})]}),(0,A.jsxs)(`section`,{className:k.block,"aria-label":`Diff`,children:[(0,A.jsx)(`h4`,{className:k.blockTitle,children:`Diff`}),(0,A.jsx)(_,{diff:V.diff,proposalKind:V.kind})]}),V.status===`pending`?(0,A.jsxs)(`footer`,{className:k.actions,children:[(0,A.jsx)(`p`,{className:k.actionNote,children:t?q:`Read-only session — approve and reject are unavailable without dispatch.`}),I&&!T?(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:I}):null,(0,A.jsx)(`button`,{type:`button`,className:k.reject,disabled:!G||P,onClick:()=>R(`reject`),children:`Reject`}),(0,A.jsx)(`button`,{type:`button`,className:k.approve,disabled:!G||P,onClick:()=>R(`approve`),children:`Approve…`})]}):(0,A.jsxs)(`footer`,{className:k.decided,children:[`This proposal is already `,(0,A.jsx)(`strong`,{children:V.status}),` — no further action is available.`]}),(0,A.jsx)(g,{open:b,onClose:z,reason:v===`approve`?`Approving a proposal writes to a real repository and requires the dispatch token.`:`Rejecting a proposal requires the dispatch token.`,tokenHelp:`the mutation token ashlr verse printed`}),(0,A.jsx)(h,{open:T,onClose:()=>{N(!1),y(null),L(null)},title:v===`approve`?`Approve this ${V.kind} against ${V.repo?V.repo.split(`/`).pop():`the repository`}?`:`Reject this proposal?`,body:v===`approve`?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`strong`,{children:V.title}),(0,A.jsx)(`br`,{}),`Kind `,(0,A.jsx)(`strong`,{children:V.kind}),` · repository `,(0,A.jsx)(`code`,{children:V.repo??`unknown`}),(0,A.jsx)(`br`,{}),(0,A.jsx)(`br`,{}),q,D(V.kind)?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`br`,{}),(0,A.jsx)(`br`,{}),`This one leaves your machine.`]}):null]}):(0,A.jsxs)(A.Fragment,{children:[`This rejects `,(0,A.jsx)(`strong`,{children:V.title}),` and discards it. It stays in history as rejected and is never applied.`]}),confirmLabel:v===`approve`?`Approve and ${D(V.kind)?`open the pull request`:`apply`}`:`Reject`,destructive:v===`approve`,busy:P,error:I,onConfirm:()=>void B()})]})}var P=[{value:`pending`,label:`Pending`},{value:`all`,label:`All statuses`},{value:`approved`,label:`Approved`},{value:`applied`,label:`Applied`},{value:`rejected`,label:`Rejected`},{value:`failed`,label:`Failed`},{value:`awaiting-host-merge`,label:`Awaiting host merge`}];function F({selectedId:e,onSelect:t}){let[n,r]=(0,C.useState)(`pending`),[a,o]=(0,C.useState)(``),[u,d]=(0,C.useState)(``),[p,m]=(0,C.useState)(0),h=(0,C.useRef)(new Map),g=l(f({status:n,limit:500})),_=(0,C.useMemo)(()=>w(T(g.data?.proposals??[],a,u)),[g.data,a,u]);function v(e){if(_.length!==0&&(e.key===`ArrowDown`||e.key===`ArrowUp`)){e.preventDefault();let t=e.key===`ArrowDown`?Math.min(p+1,_.length-1):Math.max(p-1,0);m(t),h.current.get(_[t].id)?.focus()}}return(0,A.jsxs)(`div`,{className:k.listPane,children:[(0,A.jsxs)(`div`,{className:k.filters,children:[(0,A.jsx)(y,{className:k.filterSelect,label:`Status`,value:n,onChange:e=>r(e.target.value),children:P.map(e=>(0,A.jsx)(`option`,{value:e.value,children:e.label},e.value))}),(0,A.jsxs)(`label`,{className:k.filterField,children:[(0,A.jsx)(`span`,{className:k.filterLabel,children:`Repo`}),(0,A.jsx)(`input`,{type:`text`,value:u,placeholder:`filter by repo`,onChange:e=>d(e.target.value)})]}),(0,A.jsxs)(`label`,{className:k.filterField,children:[(0,A.jsx)(`span`,{className:k.filterLabel,children:`Search`}),(0,A.jsx)(`input`,{type:`search`,value:a,placeholder:`title or summary`,onChange:e=>o(e.target.value)})]})]}),(0,A.jsxs)(`div`,{className:k.count,"aria-live":`polite`,children:[g.status===`refreshing`?(0,A.jsx)(s,{}):null,g.data?(0,A.jsxs)(`span`,{children:[_.length,` shown · `,g.data.pending,` pending`,g.data.truncated?` · capped, narrow the filter`:``]}):(0,A.jsx)(`span`,{children:`Loading proposals…`})]}),g.status===`loading`?(0,A.jsxs)(`div`,{className:k.skeletons,children:[(0,A.jsx)(i,{}),(0,A.jsx)(i,{}),(0,A.jsx)(i,{})]}):g.status===`error`?(0,A.jsx)(`p`,{className:k.error,role:`alert`,children:g.error?.message??`Could not read the approvals queue.`}):_.length===0?(0,A.jsx)(`p`,{className:k.empty,children:n===`pending`&&!a&&!u?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`span`,{className:k.emptyStrong,children:`Nothing is waiting on you.`}),` The loop only produces proposals for enrolled repositories — if you expected something here, check the scope list in Autonomy.`]}):`No proposals match this filter.`}):(0,A.jsx)(`div`,{className:k.rows,role:`list`,onKeyDown:v,children:_.map((n,r)=>{let i=O(n);return(0,A.jsx)(`div`,{role:`listitem`,children:(0,A.jsxs)(`button`,{type:`button`,ref:e=>{e?h.current.set(n.id,e):h.current.delete(n.id)},tabIndex:r===p?0:-1,className:`${k.row} ${n.id===e?k.rowActive:``}`,"aria-current":n.id===e?`true`:void 0,onFocus:()=>m(r),onClick:()=>t(n.id),children:[(0,A.jsx)(`span`,{className:k.riskRule,"data-risk":n.riskClass??`unstated`,"aria-hidden":`true`}),(0,A.jsx)(`span`,{className:k.rowTitle,title:n.title,children:n.title}),(0,A.jsxs)(`span`,{className:k.rowMeta,children:[(0,A.jsx)(`span`,{className:k.riskWord,"data-risk":n.riskClass??`unstated`,children:n.riskClass?`${n.riskClass} risk`:`risk unstated`}),(0,A.jsx)(`span`,{className:k.rowMetaMono,title:n.repo??void 0,children:n.repo?n.repo.split(`/`).pop():`no repo`}),(0,A.jsx)(`span`,{className:k.rowMetaMono,title:i??void 0,children:i??`engine unknown`}),(0,A.jsx)(`span`,{className:k.rowAge,children:b(n.createdAt)}),n.status===`pending`?null:(0,A.jsx)(c,{status:n.status})]})]})},n.id)})})]})}var I={section:`_section_sshlm_7`,header:`_header_sshlm_9`,title:`_title_sshlm_22`,headerMeta:`_headerMeta_sshlm_30`,banner:`_banner_sshlm_32`,bannerTitle:`_bannerTitle_sshlm_42`,body:`_body_sshlm_44`,placeholder:`_placeholder_sshlm_46`,placeholderHint:`_placeholderHint_sshlm_47`};function L(){let e=l(v),t=l(f({status:`pending`,limit:500})),[n,r]=(0,C.useState)(null),[i,a]=(0,C.useState)(!1),o=(e.data?.dispatchEnabled??!0)&&!i,s=t.data?.pending;return(0,A.jsxs)(`section`,{className:I.section,"aria-label":`Approvals`,children:[(0,A.jsxs)(`header`,{className:I.header,"data-app-region":`drag`,children:[(0,A.jsx)(`h2`,{className:I.title,children:`Approvals`}),(0,A.jsx)(`span`,{className:I.headerMeta,children:typeof s==`number`?`${s} awaiting you`:`counting…`})]}),o?null:(0,A.jsxs)(`div`,{className:I.banner,role:`status`,children:[(0,A.jsx)(`span`,{className:I.bannerTitle,children:`Read-only session`}),`This server was started without dispatch, so approve and reject are unavailable. Diffs, verification results and provenance still read normally — run `,(0,A.jsx)(`code`,{children:`ashlr verse`}),` to decide.`]}),(0,A.jsxs)(`div`,{className:`${I.body} ${k.layout}`,children:[(0,A.jsx)(F,{selectedId:n,onSelect:r}),(0,A.jsx)(`div`,{className:k.detailPane,children:n?(0,A.jsx)(N,{id:n,dispatchEnabled:o,onDispatchDisabled:()=>a(!0),onDecided:()=>r(null)},n):(0,A.jsxs)(`div`,{className:I.placeholder,children:[`Select a proposal to read its diff, its verification result, and where it came from before deciding.`,(0,A.jsx)(`p`,{className:I.placeholderHint,children:`↑/↓ moves through the queue · pending proposals sort first.`})]})})]})]})}export{L as ApprovalsSection};
|
|
2
|
+
//# sourceMappingURL=ApprovalsSection-2CCSoBTJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApprovalsSection-BW9iVjUa.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/approvals/approvals-model.ts","../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/approvals/ApprovalsList.tsx","../../../../../../src/web-ui/routes/verse/sections/ApprovalsSection.module.css","../../../../../../src/web-ui/routes/verse/sections/ApprovalsSection.tsx"],"sourcesContent":["/**\n * routes/verse/approvals/approvals-model.ts — the pure decisions behind the\n * approvals queue: what order rows come in, and exactly what a human is\n * agreeing to when they press Approve.\n *\n * Kept framework-free and unit-tested because both are easy to get subtly\n * wrong: \"pending first\" must survive a status filter that also returns\n * decided rows, and the approve consequence sentence is the last thing\n * standing between a click and a real pull request against a real remote.\n */\nimport type { Proposal, ProposalKind } from '../../../data/api-types.js';\n\n/** Pending first, then newest first within each group. Stable and total. */\nexport function orderProposals(rows: readonly Proposal[]): Proposal[] {\n return [...rows].sort((a, b) => {\n const pendingA = a.status === 'pending' ? 0 : 1;\n const pendingB = b.status === 'pending' ? 0 : 1;\n if (pendingA !== pendingB) return pendingA - pendingB;\n const tsA = Date.parse(a.createdAt);\n const tsB = Date.parse(b.createdAt);\n const safeA = Number.isNaN(tsA) ? 0 : tsA;\n const safeB = Number.isNaN(tsB) ? 0 : tsB;\n if (safeA !== safeB) return safeB - safeA;\n return a.id.localeCompare(b.id);\n });\n}\n\nexport type RiskClass = NonNullable<Proposal['riskClass']>;\n\n/** high → medium → low → unstated. Used for the risk column's sort affordance. */\nexport function riskRank(risk: Proposal['riskClass']): number {\n switch (risk) {\n case 'high':\n return 0;\n case 'medium':\n return 1;\n case 'low':\n return 2;\n default:\n return 3;\n }\n}\n\n/** Client-side narrowing over whatever page the server returned. */\nexport function filterProposals(rows: readonly Proposal[], search: string, repo: string): Proposal[] {\n const s = search.trim().toLowerCase();\n const r = repo.trim().toLowerCase();\n if (!s && !r) return [...rows];\n return rows.filter((p) => {\n if (s && !p.title.toLowerCase().includes(s) && !(p.summary ?? '').toLowerCase().includes(s)) return false;\n if (r && !(p.repo ?? '').toLowerCase().includes(r)) return false;\n return true;\n });\n}\n\n/**\n * What approving this proposal actually does, in one sentence, naming the\n * repo. `pr` is the dangerous one: it pushes a branch to the remote and opens\n * a real pull request, which is visible to other people and cannot be undone\n * from the dialog. The confirm step MUST show this before the click.\n */\nexport function describeApproveConsequence(kind: ProposalKind | string, repo: string | null): string {\n const where = repo ? repo : 'the target repository';\n switch (kind) {\n case 'pr':\n return `Pushes a branch to ${where}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;\n case 'patch':\n return `Writes the diff to ${where} on disk now. Nothing is pushed, but the working tree changes.`;\n default:\n return `Applies this ${String(kind)} proposal to ${where} now.`;\n }\n}\n\n/** True when approving reaches a remote — the loudest confirm wording. */\nexport function reachesRemote(kind: ProposalKind | string): boolean {\n return kind === 'pr';\n}\n\n/** The engine that produced the diff, as a short display string. */\nexport function engineOf(proposal: Pick<Proposal, 'engineModel' | 'engineTier'>): string | null {\n if (proposal.engineModel) return proposal.engineModel;\n if (proposal.engineTier) return proposal.engineTier;\n return null;\n}\n","/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.detailTitle { font-family: var(--font-display); font-size: var(--text-xl-size); line-height: var(--text-xl-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport { describeControlError } from '../autonomy/use-guarded-action.js';\nimport { describeApproveConsequence, engineOf, reachesRemote } from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n if (hasMutationHold()) setConfirmOpen(true);\n else setTokenPrompt(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) setConfirmOpen(true);\n else setPendingAction(null);\n }\n\n async function confirmAction() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <h3 className={styles.detailTitle}>{p.title}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n <span>{p.kind}</span>\n <code title={p.repo ?? undefined}>{p.repo ?? 'no repo'}</code>\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code>{engine}</code> : null}\n <span>created {formatRelative(p.createdAt)}</span>\n {p.decidedAt ? <span>decided {formatRelative(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {p.summary ? <p className={styles.summary}>{p.summary}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{p.decisionReason}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{p.result}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${p.repo ? p.repo.split('/').pop() : 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{p.title}</strong>\n <br />\n Kind <strong>{p.kind}</strong> · repository <code>{p.repo ?? 'unknown'}</code>\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{p.title}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={() => void confirmAction()}\n />\n </div>\n );\n}\n","/**\n * routes/verse/approvals/ApprovalsList.tsx — the triage queue.\n *\n * Reads the existing `GET /api/inbox?status=&limit=` through the shared\n * `inboxListQuery` (server-side status filter, client-side repo/text narrowing\n * over the returned page) and orders it pending-first via approvals-model.ts,\n * so a history filter still surfaces anything still awaiting a decision at the\n * top instead of burying it by date.\n *\n * Risk is carried by a 2px left rule AND by the word, never by colour alone.\n * Rows are buttons, not links: the Verse console has no router, selection is\n * section-local state.\n */\nimport { useMemo, useRef, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport type { Proposal } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { inboxListQuery, type InboxHistoryStatus } from '../../../data/queries.js';\nimport { formatAge } from '../autonomy/format.js';\nimport { engineOf, filterProposals, orderProposals } from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst STATUS_OPTIONS: { value: InboxHistoryStatus; label: string }[] = [\n { value: 'pending', label: 'Pending' },\n { value: 'all', label: 'All statuses' },\n { value: 'approved', label: 'Approved' },\n { value: 'applied', label: 'Applied' },\n { value: 'rejected', label: 'Rejected' },\n { value: 'failed', label: 'Failed' },\n { value: 'awaiting-host-merge', label: 'Awaiting host merge' },\n];\n\nexport interface ApprovalsListProps {\n selectedId: string | null;\n onSelect: (id: string) => void;\n}\n\nexport function ApprovalsList({ selectedId, onSelect }: ApprovalsListProps) {\n const [status, setStatus] = useState<InboxHistoryStatus>('pending');\n const [search, setSearch] = useState('');\n const [repo, setRepo] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(0);\n const rowRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n const query = useQuery(inboxListQuery({ status, limit: 500 }));\n\n const rows = useMemo<Proposal[]>(\n () => orderProposals(filterProposals(query.data?.proposals ?? [], search, repo)),\n [query.data, search, repo],\n );\n\n function onKeyDown(e: React.KeyboardEvent) {\n if (rows.length === 0) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const next = e.key === 'ArrowDown' ? Math.min(focusedIndex + 1, rows.length - 1) : Math.max(focusedIndex - 1, 0);\n setFocusedIndex(next);\n rowRefs.current.get(rows[next]!.id)?.focus();\n }\n }\n\n return (\n <div className={styles.listPane}>\n <div className={styles.filters}>\n {/* Select primitive — see the note in ActivityPanel: an unreset\n <select> is a default browser control, which §7 forbids. */}\n <Select\n className={styles.filterSelect}\n label=\"Status\"\n value={status}\n onChange={(e) => setStatus(e.target.value as InboxHistoryStatus)}\n >\n {STATUS_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </Select>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Repo</span>\n <input type=\"text\" value={repo} placeholder=\"filter by repo\" onChange={(e) => setRepo(e.target.value)} />\n </label>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Search</span>\n <input type=\"search\" value={search} placeholder=\"title or summary\" onChange={(e) => setSearch(e.target.value)} />\n </label>\n </div>\n\n <div className={styles.count} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {query.data ? (\n <span>\n {rows.length} shown · {query.data.pending} pending\n {query.data.truncated ? ' · capped, narrow the filter' : ''}\n </span>\n ) : (\n <span>Loading proposals…</span>\n )}\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not read the approvals queue.'}\n </p>\n ) : rows.length === 0 ? (\n <p className={styles.empty}>\n {status === 'pending' && !search && !repo ? (\n <>\n <span className={styles.emptyStrong}>Nothing is waiting on you.</span> The loop only produces proposals\n for enrolled repositories — if you expected something here, check the scope list in Autonomy.\n </>\n ) : (\n 'No proposals match this filter.'\n )}\n </p>\n ) : (\n <div className={styles.rows} role=\"list\" onKeyDown={onKeyDown}>\n {rows.map((p, i) => {\n const engine = engineOf(p);\n return (\n <div role=\"listitem\" key={p.id}>\n <button\n type=\"button\"\n ref={(el) => {\n if (el) rowRefs.current.set(p.id, el);\n else rowRefs.current.delete(p.id);\n }}\n tabIndex={i === focusedIndex ? 0 : -1}\n className={`${styles.row} ${p.id === selectedId ? styles.rowActive : ''}`}\n aria-current={p.id === selectedId ? 'true' : undefined}\n onFocus={() => setFocusedIndex(i)}\n onClick={() => onSelect(p.id)}\n >\n <span className={styles.riskRule} data-risk={p.riskClass ?? 'unstated'} aria-hidden=\"true\" />\n <span className={styles.rowTitle} title={p.title}>\n {p.title}\n </span>\n <span className={styles.rowMeta}>\n <span className={styles.riskWord} data-risk={p.riskClass ?? 'unstated'}>\n {p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}\n </span>\n <span className={styles.rowMetaMono} title={p.repo ?? undefined}>\n {p.repo ? p.repo.split('/').pop() : 'no repo'}\n </span>\n <span className={styles.rowMetaMono} title={engine ?? undefined}>\n {engine ?? 'engine unknown'}\n </span>\n <span className={styles.rowAge}>{formatAge(p.createdAt)}</span>\n {p.status === 'pending' ? null : <StatusBadge status={p.status} />}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * routes/verse/sections/ApprovalsSection.module.css — section shell only\n * (48px header strip + the read-only banner). The list/detail panes style\n * themselves in ../approvals/approvals.module.css.\n */\n\n.section { display: flex; flex-direction: column; min-height: 0; height: 100%; background: var(--bg-canvas); }\n\n.header {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n /* DESIGN-V2 §4: header strips are --strip-height, and the token is what the\n desktop shell's inset maths is written against. */\n height: var(--strip-height);\n padding: 0 var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.title {\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, -0.02em);\n color: var(--text-primary);\n}\n.headerMeta { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.banner {\n flex-shrink: 0;\n padding: var(--space-3) var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.banner code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.bannerTitle { display: block; color: var(--text-primary); font-weight: var(--font-weight-medium); }\n\n.body { flex: 1; min-height: 0; }\n\n.placeholder { padding: var(--space-8) var(--space-6); max-width: 62ch; font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); }\n.placeholderHint { margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n/* ---- desktop shell (see desktop/README.md \"Desktop shell contract\") -----\n * In the Tauri window the OS title bar overlays the top 48px and the macOS\n * traffic lights float over the top-LEFT 92px of the WINDOW. This strip does\n * not start at the window's left edge — the 56px rail does — so the inset it\n * owes is the overlap, never the full 92px. Both vars are absent in a\n * browser, where the expression floors to 0px and the layout is unchanged. */\n.header {\n padding-left: max(\n var(--space-5),\n calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px))\n );\n}\n","/**\n * routes/verse/sections/ApprovalsSection.tsx — the leash's other end: what the\n * autonomous loop produced while the human was out of it, and the two buttons\n * that decide its fate. Lazy-mounted by VerseApp's rail; takes no props.\n *\n * List + detail are section-local state rather than routed, because the Verse\n * console deliberately has no router (app/VerseConsoleApp.tsx). Selection\n * survives a background refresh; it does not survive a reload, which is\n * correct — a stale approval id is worse than an empty pane.\n *\n * A server without dispatch 404s approve/reject. That is surfaced once, at the\n * top, as a read-only session — the diff, the evidence and the provenance are\n * all still worth reading in that mode, so nothing else is hidden.\n */\nimport { useState } from 'react';\nimport { useQuery } from '../../../data/hooks.js';\nimport { inboxListQuery } from '../../../data/queries.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { ApprovalsList } from '../approvals/ApprovalsList.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport approvals from '../approvals/approvals.module.css';\nimport styles from './ApprovalsSection.module.css';\n\nexport function ApprovalsSection() {\n const bootstrap = useQuery(verseBootstrapQuery);\n const pending = useQuery(inboxListQuery({ status: 'pending', limit: 500 }));\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n const pendingCount = pending.data?.pending;\n\n return (\n <section className={styles.section} aria-label=\"Approvals\">\n <header className={styles.header} data-app-region=\"drag\">\n <h2 className={styles.title}>Approvals</h2>\n <span className={styles.headerMeta}>\n {typeof pendingCount === 'number' ? `${pendingCount} awaiting you` : 'counting…'}\n </span>\n </header>\n\n {!dispatchEnabled ? (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerTitle}>Read-only session</span>\n This server was started without dispatch, so approve and reject are unavailable. Diffs, verification results\n and provenance still read normally — run <code>ashlr verse</code> to decide.\n </div>\n ) : null}\n\n <div className={`${styles.body} ${approvals.layout}`}>\n <ApprovalsList selectedId={selectedId} onSelect={setSelectedId} />\n <div className={approvals.detailPane}>\n {selectedId ? (\n <ApprovalDetail\n key={selectedId}\n id={selectedId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => setSelectedId(null)}\n />\n ) : (\n <div className={styles.placeholder}>\n Select a proposal to read its diff, its verification result, and where it came from before deciding.\n <p className={styles.placeholderHint}>↑/↓ moves through the queue · pending proposals sort first.</p>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ApprovalsSection-2CCSoBTJ.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/approvals/approvals-model.ts","../../../../../../src/web-ui/routes/verse/approvals/approvals.module.css","../../../../../../src/web-ui/routes/verse/approvals/ApprovalDetail.tsx","../../../../../../src/web-ui/routes/verse/approvals/ApprovalsList.tsx","../../../../../../src/web-ui/routes/verse/sections/ApprovalsSection.module.css","../../../../../../src/web-ui/routes/verse/sections/ApprovalsSection.tsx"],"sourcesContent":["/**\n * routes/verse/approvals/approvals-model.ts — the pure decisions behind the\n * approvals queue: what order rows come in, and exactly what a human is\n * agreeing to when they press Approve.\n *\n * Kept framework-free and unit-tested because both are easy to get subtly\n * wrong: \"pending first\" must survive a status filter that also returns\n * decided rows, and the approve consequence sentence is the last thing\n * standing between a click and a real pull request against a real remote.\n */\nimport type { Proposal, ProposalKind } from '../../../data/api-types.js';\n\n/** Pending first, then newest first within each group. Stable and total. */\nexport function orderProposals(rows: readonly Proposal[]): Proposal[] {\n return [...rows].sort((a, b) => {\n const pendingA = a.status === 'pending' ? 0 : 1;\n const pendingB = b.status === 'pending' ? 0 : 1;\n if (pendingA !== pendingB) return pendingA - pendingB;\n const tsA = Date.parse(a.createdAt);\n const tsB = Date.parse(b.createdAt);\n const safeA = Number.isNaN(tsA) ? 0 : tsA;\n const safeB = Number.isNaN(tsB) ? 0 : tsB;\n if (safeA !== safeB) return safeB - safeA;\n return a.id.localeCompare(b.id);\n });\n}\n\nexport type RiskClass = NonNullable<Proposal['riskClass']>;\n\n/** high → medium → low → unstated. Used for the risk column's sort affordance. */\nexport function riskRank(risk: Proposal['riskClass']): number {\n switch (risk) {\n case 'high':\n return 0;\n case 'medium':\n return 1;\n case 'low':\n return 2;\n default:\n return 3;\n }\n}\n\n/** Client-side narrowing over whatever page the server returned. */\nexport function filterProposals(rows: readonly Proposal[], search: string, repo: string): Proposal[] {\n const s = search.trim().toLowerCase();\n const r = repo.trim().toLowerCase();\n if (!s && !r) return [...rows];\n return rows.filter((p) => {\n if (s && !p.title.toLowerCase().includes(s) && !(p.summary ?? '').toLowerCase().includes(s)) return false;\n if (r && !(p.repo ?? '').toLowerCase().includes(r)) return false;\n return true;\n });\n}\n\n/**\n * What approving this proposal actually does, in one sentence, naming the\n * repo. `pr` is the dangerous one: it pushes a branch to the remote and opens\n * a real pull request, which is visible to other people and cannot be undone\n * from the dialog. The confirm step MUST show this before the click.\n */\nexport function describeApproveConsequence(kind: ProposalKind | string, repo: string | null): string {\n const where = repo ? repo : 'the target repository';\n switch (kind) {\n case 'pr':\n return `Pushes a branch to ${where}'s remote and opens a real pull request. Other people can see it immediately, and this dialog cannot undo it.`;\n case 'patch':\n return `Writes the diff to ${where} on disk now. Nothing is pushed, but the working tree changes.`;\n default:\n return `Applies this ${String(kind)} proposal to ${where} now.`;\n }\n}\n\n/** True when approving reaches a remote — the loudest confirm wording. */\nexport function reachesRemote(kind: ProposalKind | string): boolean {\n return kind === 'pr';\n}\n\n/** The engine that produced the diff, as a short display string. */\nexport function engineOf(proposal: Pick<Proposal, 'engineModel' | 'engineTier'>): string | null {\n if (proposal.engineModel) return proposal.engineModel;\n if (proposal.engineTier) return proposal.engineTier;\n return null;\n}\n","/**\n * routes/verse/approvals/approvals.module.css — list + detail styling for the\n * Approvals surface. Same language as the cockpit: hairlines, no cards, tight\n * radii, Space Grotesk on identifiers and numerals, colour reserved for risk\n * and for the two irreversible buttons.\n */\n\n.layout { display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); min-height: 0; height: 100%; }\n.listPane { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border-subtle); background: var(--bg-surface); }\n.detailPane { display: flex; flex-direction: column; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; background: var(--bg-canvas); }\n\n.filters { flex-shrink: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.filterField { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 120px; }\n.filterLabel { font-family: var(--font-display); font-size: var(--text-2xs-size, 11px); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; color: var(--text-tertiary); }\n.filters input {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n}\n\n/* The Select primitive renders its own <label>; restyle it to the uppercase\n micro-label the sibling text filters use so the row still reads as one\n group. Descendant element selector, so it stays module-scoped. */\n/* Layout comes from the primitive's own .field; this only matches the\n sibling text filters' flex behaviour. */\n.filterSelect { flex: 1; min-width: 120px; }\n.filterSelect > label {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size, 11px);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-regular, 400);\n color: var(--text-tertiary);\n}\n\n/* WebKit paints its own clear affordance inside type=search, which is a\n default browser control (§7). Sidebar.module.css already resets it. */\n.filters input[type='search']::-webkit-search-cancel-button { appearance: none; }\n\n\n.count { flex-shrink: 0; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--text-xs-size); color: var(--text-tertiary); border-bottom: 1px solid var(--border-subtle); }\n\n.rows { flex: 1; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; }\n.row {\n display: grid;\n grid-template-columns: 2px minmax(0, 1fr);\n column-gap: var(--space-3);\n width: 100%;\n padding: var(--space-3) var(--space-4);\n border: 0;\n border-bottom: 1px solid var(--border-subtle);\n background: transparent;\n text-align: left;\n color: var(--text-primary);\n cursor: pointer;\n}\n.row:hover { background: var(--bg-hover); }\n.rowActive { background: var(--bg-selected); }\n/* Inset, because .rows scrolls (`overflow-y: auto`) and a full-width row's\n outward ring is clipped at the left and right edges. The global ring is\n silenced so only one paints. */\n.row:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; box-shadow: none; }\n.riskRule { grid-row: 1 / span 2; border-radius: var(--radius-full); background: var(--border-strong); }\n.riskRule[data-risk=\"high\"] { background: var(--status-danger-solid); }\n.riskRule[data-risk=\"medium\"] { background: var(--status-warning-solid); }\n.riskRule[data-risk=\"low\"] { background: var(--status-success-solid); }\n.rowTitle { font-size: var(--text-sm-size); line-height: var(--text-sm-line); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.rowMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-1) var(--space-3); margin-top: 2px; font-size: var(--text-xs-size); color: var(--text-tertiary); }\n/* --text-tertiary is a direct declaration on a CHILD, so the parent's\n :hover/[aria-current] colour change does not reach it — only the ground\n under it moves. Measured on --bg-selected it is 3.95:1 in light and 4.40:1\n in dark, both under the 4.5:1 floor in DESIGN-V2 §6; --text-secondary is\n 6.32:1 on the worst of them. design/tokens-contrast.test.ts now pins the\n token pair so the gap cannot reopen. */\n.row:hover .rowMeta,\n.rowActive .rowMeta { color: var(--text-secondary); }\n.rowMetaMono { font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 14ch; }\n.rowAge { font-family: var(--font-display); }\n.riskWord { font-family: var(--font-display); letter-spacing: var(--tracking-label, 0.06em); text-transform: uppercase; font-size: var(--text-2xs-size, 11px); }\n.riskWord[data-risk=\"high\"] { color: var(--status-danger-fg); }\n.riskWord[data-risk=\"medium\"] { color: var(--status-warning-fg); }\n.riskWord[data-risk=\"low\"] { color: var(--status-success-fg); }\n\n/* --- detail ------------------------------------------------------------- */\n.detail { padding: var(--space-5) var(--space-6) var(--space-16); max-width: 1040px; }\n.detailHead { padding-bottom: var(--space-4); border-bottom: 1px solid var(--border-subtle); }\n.detailTitle { font-family: var(--font-display); font-size: var(--text-xl-size); line-height: var(--text-xl-line); font-weight: var(--font-weight-semibold); letter-spacing: var(--tracking-display, -0.02em); }\n.detailMeta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n.detailMeta code { font-family: var(--font-mono); }\n.summary { margin-top: var(--space-3); font-size: var(--text-base-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 72ch; }\n\n.block { padding-block: var(--space-5); border-bottom: 1px solid var(--border-subtle); }\n.blockTitle {\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n letter-spacing: var(--tracking-label, 0.06em);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-tertiary);\n margin-bottom: var(--space-3);\n}\n.defs { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: 0; font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.defs dt { color: var(--text-tertiary); }\n.defs dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }\n.defs dd code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.muted { color: var(--text-tertiary); }\n.failedChecks { margin: var(--space-1) 0 0; font-family: var(--font-mono); font-size: var(--text-xs-size); color: var(--status-danger-fg); }\n\n.actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: var(--space-2); padding-top: var(--space-5); }\n.actionNote { flex: 1; min-width: 240px; font-size: var(--text-xs-size); line-height: var(--text-xs-line); color: var(--text-secondary); }\n.reject,\n.approve {\n min-height: var(--density-row, 32px);\n padding: 0 var(--space-4);\n border-radius: var(--radius-sm);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n}\n.reject { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary); }\n.reject:hover:not(:disabled) { border-color: var(--status-danger-solid); color: var(--status-danger-fg); }\n.approve { border: 1px solid var(--accent-500); background: var(--accent-500); color: var(--accent-contrast); }\n.approve:hover:not(:disabled) { background: var(--accent-600); border-color: var(--accent-600); }\n.reject:disabled,\n.approve:disabled { border-color: var(--border-default); background: var(--bg-surface); color: var(--text-disabled); cursor: not-allowed; }\n\n.decided { padding-top: var(--space-5); font-size: var(--text-sm-size); color: var(--text-secondary); }\n\n.empty { padding: var(--space-8) var(--space-6); font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); max-width: 62ch; }\n.emptyStrong { color: var(--text-primary); font-weight: var(--font-weight-medium); }\n.error { margin: var(--space-4); padding: var(--space-3); border: 1px solid var(--status-danger-solid); border-radius: var(--radius-sm); background: var(--status-danger-bg); color: var(--status-danger-fg); font-size: var(--text-sm-size); line-height: var(--text-sm-line); }\n.skeletons { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); }\n\n@media (max-width: 900px) {\n .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, 38%) minmax(0, 1fr); }\n .listPane { border-right: 0; border-bottom: 1px solid var(--border-subtle); }\n .detail { padding: var(--space-4) var(--space-4) var(--space-12); }\n}\n","/**\n * routes/verse/approvals/ApprovalDetail.tsx — everything a human needs before\n * deciding, and an approve path that cannot fire on one click.\n *\n * Reuses the inbox review machinery verbatim (`DiffViewer` + `diff-parser.ts`\n * + `highlight.ts`, and `ConfirmDialog`) rather than growing a second diff\n * renderer, per docs/VERSE-CONTRACT-V2.md.\n *\n * Two rules enforced here:\n * - **Judge evidence is epistemic.** A `judge-parse-failure` /\n * `judge-network-failure` is an infra failure, never a considered verdict,\n * and a degraded decisions-ledger read renders \"unknown\" via <Epistemic/>\n * instead of letting an empty array read as \"never judged\".\n * - **Nothing signed is ever printed.** Provenance shows WHETHER a proposal\n * carries a producer attestation, never the HMAC itself — the same rule\n * that keeps launcher commands and tokens off every Verse payload.\n */\nimport { useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Epistemic } from '../../../components/primitives/Epistemic.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport type { DecisionEntry, JudgeDecisionReasonCode } from '../../../data/api-types.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { approveProposal, rejectProposal } from '../../../data/mutations.js';\nimport { proposalDetailQuery } from '../../../data/queries.js';\nimport { ConfirmDialog } from '../../inbox/ConfirmDialog.js';\nimport { DiffViewer } from '../../inbox/DiffViewer.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport { describeControlError } from '../autonomy/use-guarded-action.js';\nimport { describeApproveConsequence, engineOf, reachesRemote } from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst JUDGE_REASON_DISPLAY: Record<JudgeDecisionReasonCode, { label: string; tone: Tone }> = {\n 'judge-ship-would-merge': { label: 'Ship (would merge)', tone: 'success' },\n 'judge-ship-review-required': { label: 'Ship (review required)', tone: 'success' },\n 'judge-review': { label: 'Review', tone: 'warning' },\n 'judge-noise': { label: 'Noise', tone: 'neutral' },\n 'judge-harmful': { label: 'Harmful', tone: 'danger' },\n 'judge-verdict-unrecognized': { label: 'Unrecognized verdict', tone: 'unknown' },\n 'judge-parse-failure': { label: 'Judge parse failure — not a review', tone: 'unknown' },\n 'judge-network-failure': { label: 'Judge network failure — not a review', tone: 'unknown' },\n};\n\nfunction latestJudged(decisions: DecisionEntry[]): DecisionEntry | null {\n const judged = decisions.filter((d) => d.action === 'judged' && d.judgeReasonCode);\n if (judged.length === 0) return null;\n return judged.reduce((a, b) => (Date.parse(b.ts) > Date.parse(a.ts) ? b : a));\n}\n\ntype PendingAction = 'approve' | 'reject' | null;\n\nexport interface ApprovalDetailProps {\n id: string;\n dispatchEnabled: boolean;\n onDispatchDisabled: () => void;\n onDecided: () => void;\n}\n\nexport function ApprovalDetail({ id, dispatchEnabled, onDispatchDisabled, onDecided }: ApprovalDetailProps) {\n const query = useQuery(proposalDetailQuery(id));\n const [pendingAction, setPendingAction] = useState<PendingAction>(null);\n const [tokenPrompt, setTokenPrompt] = useState(false);\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [actionError, setActionError] = useState<string | null>(null);\n\n function requestAction(action: 'approve' | 'reject') {\n setActionError(null);\n setPendingAction(action);\n if (hasMutationHold()) setConfirmOpen(true);\n else setTokenPrompt(true);\n }\n\n function closeTokenPrompt() {\n setTokenPrompt(false);\n // Live read — MutationTokenDialog closes synchronously after setToken().\n if (hasMutationHold()) setConfirmOpen(true);\n else setPendingAction(null);\n }\n\n async function confirmAction() {\n if (!pendingAction) return;\n setBusy(true);\n setActionError(null);\n try {\n if (pendingAction === 'approve') await approveProposal(id);\n else await rejectProposal(id);\n setConfirmOpen(false);\n setPendingAction(null);\n onDecided();\n } catch (err) {\n if (err instanceof DispatchDisabledError) {\n setConfirmOpen(false);\n setPendingAction(null);\n onDispatchDisabled();\n } else {\n setActionError(describeControlError(err));\n }\n } finally {\n setBusy(false);\n }\n }\n\n if (query.status === 'loading') {\n return (\n <div className={styles.detail}>\n <SkeletonLine width=\"55%\" />\n <SkeletonLine width=\"30%\" />\n <SkeletonLine width=\"88%\" />\n </div>\n );\n }\n\n if (query.status === 'error' || !query.data) {\n return (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not load this proposal.'}\n </p>\n );\n }\n\n const p = query.data;\n const evidence = p.decisionEvidence;\n const judged = latestJudged(evidence?.decisions ?? []);\n const judgeDisplay = judged?.judgeReasonCode ? JUDGE_REASON_DISPLAY[judged.judgeReasonCode] : null;\n const canDecide = p.status === 'pending' && dispatchEnabled;\n const engine = engineOf(p);\n const consequence = describeApproveConsequence(p.kind, p.repo);\n\n return (\n <div className={styles.detail}>\n <header className={styles.detailHead}>\n <h3 className={styles.detailTitle}>{p.title}</h3>\n <div className={styles.detailMeta}>\n <StatusBadge status={p.status} />\n <span>{p.kind}</span>\n <code title={p.repo ?? undefined}>{p.repo ?? 'no repo'}</code>\n <span>{p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}</span>\n {engine ? <code>{engine}</code> : null}\n <span>created {formatRelative(p.createdAt)}</span>\n {p.decidedAt ? <span>decided {formatRelative(p.decidedAt)}</span> : null}\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n </div>\n {p.summary ? <p className={styles.summary}>{p.summary}</p> : null}\n </header>\n\n <section className={styles.block} aria-label=\"Evidence\">\n <h4 className={styles.blockTitle}>Evidence</h4>\n <dl className={styles.defs}>\n <dt>Judge verdict</dt>\n <dd>\n <Epistemic quality={evidence?.sourceQuality} label=\"judge verdict\">\n {judgeDisplay && judged?.judgeReasonCode ? (\n <StatusBadge status={judged.judgeReasonCode} tone={judgeDisplay.tone}>\n {judgeDisplay.label}\n </StatusBadge>\n ) : (\n <span className={styles.muted}>not yet judged</span>\n )}\n </Epistemic>\n </dd>\n\n <dt>Verification</dt>\n <dd>\n {p.verifyResult ? (\n <>\n <StatusBadge status={p.verifyResult.passed ? 'success' : 'failed'}>\n {p.verifyResult.passed ? 'passed' : 'failed'}\n </StatusBadge>\n {p.verifyResult.ran && p.verifyResult.ran.length > 0 ? (\n <span className={styles.muted}> · ran {p.verifyResult.ran.map((r) => r.kind).join(', ')}</span>\n ) : null}\n {!p.verifyResult.passed && p.verifyResult.failureCategory && p.verifyResult.failureCategory !== 'code' ? (\n <span className={styles.muted}> · {p.verifyResult.failureCategory} failure — the verifier itself, not the diff</span>\n ) : null}\n {p.verifyResult.failed && p.verifyResult.failed.length > 0 ? (\n <p className={styles.failedChecks}>failed: {p.verifyResult.failed.join(', ')}</p>\n ) : null}\n </>\n ) : (\n <span className={styles.muted}>not verified</span>\n )}\n </dd>\n\n {p.decisionReason ? (\n <>\n <dt>Decision reason</dt>\n <dd>{p.decisionReason}</dd>\n </>\n ) : null}\n\n {p.evidenceOutcome ? (\n <>\n <dt>Gates</dt>\n <dd className={styles.muted}>\n {p.evidenceOutcome.gateCount ?? 0} gate{p.evidenceOutcome.gateCount === 1 ? '' : 's'}\n {p.evidenceOutcome.policyAction ? ` · policy ${p.evidenceOutcome.policyAction}` : ''}\n {p.evidenceOutcome.trustBasis ? ` · trust ${p.evidenceOutcome.trustBasis}` : ''}\n </dd>\n </>\n ) : null}\n\n {p.result ? (\n <>\n <dt>Result</dt>\n <dd>{p.result}</dd>\n </>\n ) : null}\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Provenance\">\n <h4 className={styles.blockTitle}>Provenance</h4>\n <dl className={styles.defs}>\n <dt>Produced by</dt>\n <dd>{engine ? <code>{engine}</code> : <span className={styles.muted}>unknown engine</span>}</dd>\n <dt>Origin</dt>\n <dd>{p.origin}</dd>\n {p.workItemId ? (\n <>\n <dt>Work item</dt>\n <dd>\n <code>{p.workItemId}</code>\n </dd>\n </>\n ) : null}\n {p.runId ? (\n <>\n <dt>Run</dt>\n <dd>\n <code>{p.runId}</code>\n </dd>\n </>\n ) : null}\n <dt>Attestation</dt>\n <dd className={styles.muted}>\n {/* The signature itself is never rendered — only whether one exists. */}\n {p.producerProvenanceSig\n ? `signed by the sandboxed producer (v${p.producerProvenanceVersion ?? 2})`\n : p.provenanceSig\n ? 'legacy signature present'\n : 'unsigned — earns no positive routing credit'}\n {p.diffHash ? ' · diff hashed at signing time' : ''}\n </dd>\n </dl>\n </section>\n\n <section className={styles.block} aria-label=\"Diff\">\n <h4 className={styles.blockTitle}>Diff</h4>\n <DiffViewer diff={p.diff} proposalKind={p.kind} />\n </section>\n\n {p.status === 'pending' ? (\n <footer className={styles.actions}>\n <p className={styles.actionNote}>\n {dispatchEnabled ? consequence : 'Read-only session — approve and reject are unavailable without dispatch.'}\n </p>\n {actionError && !confirmOpen ? (\n <p className={styles.error} role=\"alert\">\n {actionError}\n </p>\n ) : null}\n <button type=\"button\" className={styles.reject} disabled={!canDecide || busy} onClick={() => requestAction('reject')}>\n Reject\n </button>\n <button type=\"button\" className={styles.approve} disabled={!canDecide || busy} onClick={() => requestAction('approve')}>\n Approve…\n </button>\n </footer>\n ) : (\n <footer className={styles.decided}>\n This proposal is already <strong>{p.status}</strong> — no further action is available.\n </footer>\n )}\n\n <MutationTokenDialog\n open={tokenPrompt}\n onClose={closeTokenPrompt}\n reason={\n pendingAction === 'approve'\n ? 'Approving a proposal writes to a real repository and requires the dispatch token.'\n : 'Rejecting a proposal requires the dispatch token.'\n }\n tokenHelp=\"the mutation token ashlr verse printed\"\n />\n\n <ConfirmDialog\n open={confirmOpen}\n onClose={() => {\n setConfirmOpen(false);\n setPendingAction(null);\n setActionError(null);\n }}\n title={\n pendingAction === 'approve'\n ? `Approve this ${p.kind} against ${p.repo ? p.repo.split('/').pop() : 'the repository'}?`\n : 'Reject this proposal?'\n }\n body={\n pendingAction === 'approve' ? (\n <>\n <strong>{p.title}</strong>\n <br />\n Kind <strong>{p.kind}</strong> · repository <code>{p.repo ?? 'unknown'}</code>\n <br />\n <br />\n {consequence}\n {reachesRemote(p.kind) ? (\n <>\n <br />\n <br />\n This one leaves your machine.\n </>\n ) : null}\n </>\n ) : (\n <>\n This rejects <strong>{p.title}</strong> and discards it. It stays in history as rejected and is never\n applied.\n </>\n )\n }\n confirmLabel={pendingAction === 'approve' ? `Approve and ${reachesRemote(p.kind) ? 'open the pull request' : 'apply'}` : 'Reject'}\n // Approve is the irreversible one — a `pr` pushes a branch and opens a\n // real PR other people can see, a `patch` writes to disk now. Reject\n // only discards a proposal that stays in history. Putting the danger\n // styling on Reject trained the reflex that the red button is the safe\n // one; VERSE-CONTRACT-V2 calls Approve destructive explicitly.\n destructive={pendingAction === 'approve'}\n busy={busy}\n error={actionError}\n onConfirm={() => void confirmAction()}\n />\n </div>\n );\n}\n","/**\n * routes/verse/approvals/ApprovalsList.tsx — the triage queue.\n *\n * Reads the existing `GET /api/inbox?status=&limit=` through the shared\n * `inboxListQuery` (server-side status filter, client-side repo/text narrowing\n * over the returned page) and orders it pending-first via approvals-model.ts,\n * so a history filter still surfaces anything still awaiting a decision at the\n * top instead of burying it by date.\n *\n * Risk is carried by a 2px left rule AND by the word, never by colour alone.\n * Rows are buttons, not links: the Verse console has no router, selection is\n * section-local state.\n */\nimport { useMemo, useRef, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport type { Proposal } from '../../../data/api-types.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { inboxListQuery, type InboxHistoryStatus } from '../../../data/queries.js';\nimport { formatAge } from '../autonomy/format.js';\nimport { engineOf, filterProposals, orderProposals } from './approvals-model.js';\nimport styles from './approvals.module.css';\n\nconst STATUS_OPTIONS: { value: InboxHistoryStatus; label: string }[] = [\n { value: 'pending', label: 'Pending' },\n { value: 'all', label: 'All statuses' },\n { value: 'approved', label: 'Approved' },\n { value: 'applied', label: 'Applied' },\n { value: 'rejected', label: 'Rejected' },\n { value: 'failed', label: 'Failed' },\n { value: 'awaiting-host-merge', label: 'Awaiting host merge' },\n];\n\nexport interface ApprovalsListProps {\n selectedId: string | null;\n onSelect: (id: string) => void;\n}\n\nexport function ApprovalsList({ selectedId, onSelect }: ApprovalsListProps) {\n const [status, setStatus] = useState<InboxHistoryStatus>('pending');\n const [search, setSearch] = useState('');\n const [repo, setRepo] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(0);\n const rowRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n const query = useQuery(inboxListQuery({ status, limit: 500 }));\n\n const rows = useMemo<Proposal[]>(\n () => orderProposals(filterProposals(query.data?.proposals ?? [], search, repo)),\n [query.data, search, repo],\n );\n\n function onKeyDown(e: React.KeyboardEvent) {\n if (rows.length === 0) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const next = e.key === 'ArrowDown' ? Math.min(focusedIndex + 1, rows.length - 1) : Math.max(focusedIndex - 1, 0);\n setFocusedIndex(next);\n rowRefs.current.get(rows[next]!.id)?.focus();\n }\n }\n\n return (\n <div className={styles.listPane}>\n <div className={styles.filters}>\n {/* Select primitive — see the note in ActivityPanel: an unreset\n <select> is a default browser control, which §7 forbids. */}\n <Select\n className={styles.filterSelect}\n label=\"Status\"\n value={status}\n onChange={(e) => setStatus(e.target.value as InboxHistoryStatus)}\n >\n {STATUS_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </Select>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Repo</span>\n <input type=\"text\" value={repo} placeholder=\"filter by repo\" onChange={(e) => setRepo(e.target.value)} />\n </label>\n <label className={styles.filterField}>\n <span className={styles.filterLabel}>Search</span>\n <input type=\"search\" value={search} placeholder=\"title or summary\" onChange={(e) => setSearch(e.target.value)} />\n </label>\n </div>\n\n <div className={styles.count} aria-live=\"polite\">\n {query.status === 'refreshing' ? <RefreshIndicator /> : null}\n {query.data ? (\n <span>\n {rows.length} shown · {query.data.pending} pending\n {query.data.truncated ? ' · capped, narrow the filter' : ''}\n </span>\n ) : (\n <span>Loading proposals…</span>\n )}\n </div>\n\n {query.status === 'loading' ? (\n <div className={styles.skeletons}>\n <SkeletonRow />\n <SkeletonRow />\n <SkeletonRow />\n </div>\n ) : query.status === 'error' ? (\n <p className={styles.error} role=\"alert\">\n {query.error?.message ?? 'Could not read the approvals queue.'}\n </p>\n ) : rows.length === 0 ? (\n <p className={styles.empty}>\n {status === 'pending' && !search && !repo ? (\n <>\n <span className={styles.emptyStrong}>Nothing is waiting on you.</span> The loop only produces proposals\n for enrolled repositories — if you expected something here, check the scope list in Autonomy.\n </>\n ) : (\n 'No proposals match this filter.'\n )}\n </p>\n ) : (\n <div className={styles.rows} role=\"list\" onKeyDown={onKeyDown}>\n {rows.map((p, i) => {\n const engine = engineOf(p);\n return (\n <div role=\"listitem\" key={p.id}>\n <button\n type=\"button\"\n ref={(el) => {\n if (el) rowRefs.current.set(p.id, el);\n else rowRefs.current.delete(p.id);\n }}\n tabIndex={i === focusedIndex ? 0 : -1}\n className={`${styles.row} ${p.id === selectedId ? styles.rowActive : ''}`}\n aria-current={p.id === selectedId ? 'true' : undefined}\n onFocus={() => setFocusedIndex(i)}\n onClick={() => onSelect(p.id)}\n >\n <span className={styles.riskRule} data-risk={p.riskClass ?? 'unstated'} aria-hidden=\"true\" />\n <span className={styles.rowTitle} title={p.title}>\n {p.title}\n </span>\n <span className={styles.rowMeta}>\n <span className={styles.riskWord} data-risk={p.riskClass ?? 'unstated'}>\n {p.riskClass ? `${p.riskClass} risk` : 'risk unstated'}\n </span>\n <span className={styles.rowMetaMono} title={p.repo ?? undefined}>\n {p.repo ? p.repo.split('/').pop() : 'no repo'}\n </span>\n <span className={styles.rowMetaMono} title={engine ?? undefined}>\n {engine ?? 'engine unknown'}\n </span>\n <span className={styles.rowAge}>{formatAge(p.createdAt)}</span>\n {p.status === 'pending' ? null : <StatusBadge status={p.status} />}\n </span>\n </button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","/**\n * routes/verse/sections/ApprovalsSection.module.css — section shell only\n * (48px header strip + the read-only banner). The list/detail panes style\n * themselves in ../approvals/approvals.module.css.\n */\n\n.section { display: flex; flex-direction: column; min-height: 0; height: 100%; background: var(--bg-canvas); }\n\n.header {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n /* DESIGN-V2 §4: header strips are --strip-height, and the token is what the\n desktop shell's inset maths is written against. */\n height: var(--strip-height);\n padding: 0 var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n.title {\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, -0.02em);\n color: var(--text-primary);\n}\n.headerMeta { font-family: var(--font-display); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n.banner {\n flex-shrink: 0;\n padding: var(--space-3) var(--space-5);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-base-line);\n}\n.banner code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n.bannerTitle { display: block; color: var(--text-primary); font-weight: var(--font-weight-medium); }\n\n.body { flex: 1; min-height: 0; }\n\n.placeholder { padding: var(--space-8) var(--space-6); max-width: 62ch; font-size: var(--text-sm-size); line-height: var(--text-base-line); color: var(--text-secondary); }\n.placeholderHint { margin-top: var(--space-2); font-size: var(--text-xs-size); color: var(--text-tertiary); }\n\n/* ---- desktop shell (see desktop/README.md \"Desktop shell contract\") -----\n * In the Tauri window the OS title bar overlays the top 48px and the macOS\n * traffic lights float over the top-LEFT 92px of the WINDOW. This strip does\n * not start at the window's left edge — the 56px rail does — so the inset it\n * owes is the overlap, never the full 92px. Both vars are absent in a\n * browser, where the expression floors to 0px and the layout is unchanged. */\n.header {\n padding-left: max(\n var(--space-5),\n calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px))\n );\n}\n","/**\n * routes/verse/sections/ApprovalsSection.tsx — the leash's other end: what the\n * autonomous loop produced while the human was out of it, and the two buttons\n * that decide its fate. Lazy-mounted by VerseApp's rail; takes no props.\n *\n * List + detail are section-local state rather than routed, because the Verse\n * console deliberately has no router (app/VerseConsoleApp.tsx). Selection\n * survives a background refresh; it does not survive a reload, which is\n * correct — a stale approval id is worse than an empty pane.\n *\n * A server without dispatch 404s approve/reject. That is surfaced once, at the\n * top, as a read-only session — the diff, the evidence and the provenance are\n * all still worth reading in that mode, so nothing else is hidden.\n */\nimport { useState } from 'react';\nimport { useQuery } from '../../../data/hooks.js';\nimport { inboxListQuery } from '../../../data/queries.js';\nimport { ApprovalDetail } from '../approvals/ApprovalDetail.js';\nimport { ApprovalsList } from '../approvals/ApprovalsList.js';\nimport { verseBootstrapQuery } from '../verse-queries.js';\nimport approvals from '../approvals/approvals.module.css';\nimport styles from './ApprovalsSection.module.css';\n\nexport function ApprovalsSection() {\n const bootstrap = useQuery(verseBootstrapQuery);\n const pending = useQuery(inboxListQuery({ status: 'pending', limit: 500 }));\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [dispatchDenied, setDispatchDenied] = useState(false);\n\n const dispatchEnabled = (bootstrap.data?.dispatchEnabled ?? true) && !dispatchDenied;\n const pendingCount = pending.data?.pending;\n\n return (\n <section className={styles.section} aria-label=\"Approvals\">\n <header className={styles.header} data-app-region=\"drag\">\n <h2 className={styles.title}>Approvals</h2>\n <span className={styles.headerMeta}>\n {typeof pendingCount === 'number' ? `${pendingCount} awaiting you` : 'counting…'}\n </span>\n </header>\n\n {!dispatchEnabled ? (\n <div className={styles.banner} role=\"status\">\n <span className={styles.bannerTitle}>Read-only session</span>\n This server was started without dispatch, so approve and reject are unavailable. Diffs, verification results\n and provenance still read normally — run <code>ashlr verse</code> to decide.\n </div>\n ) : null}\n\n <div className={`${styles.body} ${approvals.layout}`}>\n <ApprovalsList selectedId={selectedId} onSelect={setSelectedId} />\n <div className={approvals.detailPane}>\n {selectedId ? (\n <ApprovalDetail\n key={selectedId}\n id={selectedId}\n dispatchEnabled={dispatchEnabled}\n onDispatchDisabled={() => setDispatchDenied(true)}\n onDecided={() => setSelectedId(null)}\n />\n ) : (\n <div className={styles.placeholder}>\n Select a proposal to read its diff, its verification result, and where it came from before deciding.\n <p className={styles.placeholderHint}>↑/↓ moves through the queue · pending proposals sort first.</p>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
._panel_1lat4_12{border-top:1px solid var(--border-subtle);padding-block:var(--space-6)}._panel_1lat4_12:first-of-type{padding-top:var(--space-4);border-top:0}._panelHead_1lat4_15{justify-content:space-between;align-items:baseline;gap:var(--space-3);margin-bottom:var(--space-4);display:flex}._panelTitle_1lat4_16{font-family:var(--font-display);font-size:var(--text-xs-size);line-height:var(--text-xs-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._panelHeadSpaced_1lat4_25{margin-top:var(--space-6)}._panelNote_1lat4_26{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._panelActions_1lat4_27{align-items:center;gap:var(--space-2);display:flex}._status_1lat4_30{gap:var(--space-4);flex-direction:column;display:flex}._statusTop_1lat4_31{align-items:center;gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}._runState_1lat4_32{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);display:inline-flex}._runDot_1lat4_33{border-radius:var(--radius-full);background:var(--status-neutral-solid);flex-shrink:0;width:8px;height:8px}._runState_1lat4_32[data-state=running] ._runDot_1lat4_33{background:var(--status-running-solid)}._runState_1lat4_32[data-state=stopped] ._runDot_1lat4_33{background:var(--status-neutral-solid)}._runState_1lat4_32[data-state=unknown] ._runDot_1lat4_33{background:var(--status-unknown-solid)}._runState_1lat4_32[data-state=killed] ._runDot_1lat4_33{background:var(--status-danger-solid)}._facts_1lat4_39{gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}._fact_1lat4_39{flex-direction:column;gap:2px;min-width:0;display:flex}._factLabel_1lat4_41{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)}._factValue_1lat4_42{font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);white-space:nowrap}._factValue_1lat4_42[data-tone=warning]{color:var(--status-warning-fg)}._factValue_1lat4_42[data-tone=danger]{color:var(--status-danger-fg)}._factValue_1lat4_42[data-tone=success]{color:var(--status-success-fg)}._factValue_1lat4_42[data-tone=unknown]{color:var(--status-unknown-fg)}._budget_1lat4_49{gap:var(--space-2);flex-direction:column;display:flex}._budgetLine_1lat4_50{justify-content:space-between;align-items:baseline;gap:var(--space-2);flex-wrap:wrap;display:flex}._budgetLabel_1lat4_51{font-family:var(--font-display);font-size:var(--text-sm-size);color:var(--text-primary)}._budgetNote_1lat4_52{font-size:var(--text-xs-size);color:var(--text-tertiary)}._meter_1lat4_53{--meter-color:var(--accent-500);background:var(--meter-track);height:2px;overflow:hidden}._meter_1lat4_53[data-state=warn]{--meter-color:var(--status-warning-solid)}._meter_1lat4_53[data-state=over],._meter_1lat4_53[data-state=stopped]{--meter-color:var(--status-danger-solid)}._meter_1lat4_53[data-state=unknown]{--meter-color:var(--status-unknown-solid)}._meterFill_1lat4_58{background:var(--meter-color);height:100%;transition:width var(--duration-base) var(--ease-decelerate)}._controls_1lat4_61{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._button_1lat4_62{min-height:var(--density-row,32px);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-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._button_1lat4_62:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-strong)}._button_1lat4_62:disabled{color:var(--text-disabled);cursor:not-allowed}._buttonPrimary_1lat4_76{border-color:var(--accent-500);color:var(--accent-600)}._buttonPrimary_1lat4_76:hover:not(:disabled){background:var(--bg-selected)}._emergency_1lat4_80{align-items:center;gap:var(--space-3);margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--border-default);flex-wrap:wrap;display:flex}._emergencyButton_1lat4_81{min-height:var(--density-row,32px);padding:0 var(--space-4);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);cursor:pointer}._emergencyButton_1lat4_81:hover:not(:disabled){border-color:var(--status-danger-fg);background:var(--status-danger-bg)}._emergencyButton_1lat4_81:disabled{border-color:var(--border-default);background:var(--bg-surface);color:var(--text-disabled);cursor:not-allowed}._emergencyNote_1lat4_102{min-width:220px;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex:1}._capGrid_1lat4_105{gap:var(--space-4) var(--space-5);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}._cap_1lat4_105{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._capLabel_1lat4_107{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)}._capRow_1lat4_108{align-items:center;gap:var(--space-2);display:flex}._capInput_1lat4_109{min-width:0;min-height:var(--density-row,32px);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-family:var(--font-display);font-size:var(--text-sm-size);flex:1}._capInput_1lat4_109:focus-visible{border-color:var(--border-focus)}._capInput_1lat4_109:disabled{color:var(--text-disabled);background:var(--bg-canvas);cursor:not-allowed}._capInputInvalid_1lat4_123{border-color:var(--status-danger-solid)}._capUnit_1lat4_124{font-size:var(--text-xs-size);color:var(--text-tertiary);white-space:nowrap}._capHelp_1lat4_125{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._capUsage_1lat4_126{font-family:var(--font-display);font-size:var(--text-xs-size);color:var(--text-secondary)}._capError_1lat4_127{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--status-danger-fg)}._actionNote_1lat4_130{margin-top:var(--space-3);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary)}._capApplied_1lat4_131{align-items:center;gap:var(--space-1);font-size:var(--text-xs-size);color:var(--status-success-fg);display:inline-flex}._capApplied_1lat4_131:before{content:"✓"}._repoList_1lat4_135{flex-direction:column;display:flex}._repoRow_1lat4_136{align-items:center;gap:var(--space-3);min-height:var(--density-row,32px);padding:var(--space-1) 0;border-bottom:1px solid var(--border-subtle);display:flex}._repoName_1lat4_137{font-family:var(--font-display);font-size:var(--text-sm-size);color:var(--text-primary);white-space:nowrap}._repoPath_1lat4_138{min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;overflow:hidden}._repoMissing_1lat4_139{align-items:center;gap:var(--space-1);font-size:var(--text-xs-size);color:var(--status-warning-fg);white-space:nowrap;display:inline-flex}._addRow_1lat4_140{gap:var(--space-2);margin-top:var(--space-4);flex-wrap:wrap;display:flex}._addInput_1lat4_141{min-width:240px;min-height:var(--density-row,32px);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--text-xs-size);flex:1}._addInput_1lat4_141:focus-visible{border-color:var(--border-focus)}._tableScroll_1lat4_156{border:1px solid var(--border-subtle);border-radius:var(--radius-sm);scrollbar-gutter:stable;max-height:520px;overflow:auto}._table_1lat4_156{border-collapse:collapse;width:100%;font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._table_1lat4_156 th{font-family:var(--font-display);z-index:var(--z-sticky);padding:var(--space-2) var(--space-3);background:var(--bg-surface);border-bottom:1px solid var(--border-default);text-align:left;font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);white-space:nowrap;position:sticky;top:0}._table_1lat4_156 td{padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--border-subtle);vertical-align:top}._table_1lat4_156 tbody tr:hover{background:var(--bg-hover)}._cellAction_1lat4_176{font-family:var(--font-mono);color:var(--text-primary);white-space:nowrap}._cellTime_1lat4_177{font-family:var(--font-display);color:var(--text-tertiary);white-space:nowrap}._cellSummary_1lat4_178{color:var(--text-secondary)}._cellRepo_1lat4_179{font-family:var(--font-mono);color:var(--text-tertiary);white-space:nowrap}._table_1lat4_156 tbody tr:hover ._cellTime_1lat4_177,._table_1lat4_156 tbody tr:hover ._cellRepo_1lat4_179{color:var(--text-secondary)}._resultTag_1lat4_188{align-items:center;gap:var(--space-1);font-family:var(--font-display);white-space:nowrap;display:inline-flex}._resultTag_1lat4_188:before{content:"•"}._resultTag_1lat4_188[data-result=ok]{color:var(--status-success-fg)}._resultTag_1lat4_188[data-result=refused]{color:var(--status-warning-fg)}._resultTag_1lat4_188[data-result=error]{color:var(--status-danger-fg)}._resultTag_1lat4_188[data-result=ok]:before{content:"✓"}._resultTag_1lat4_188[data-result=refused]:before{content:"⊘"}._resultTag_1lat4_188[data-result=error]:before{content:"✕"}._filters_1lat4_197{align-items:flex-end;gap:var(--space-3);margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}._filterField_1lat4_198{gap:var(--space-1);flex-direction:column;display:flex}._filterLabel_1lat4_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-tertiary)}._filterField_1lat4_198 input{min-height:var(--density-row,32px);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-family:var(--font-ui);font-size:var(--text-xs-size)}._filterSelect_1lat4_214>label{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-regular,400);color:var(--text-tertiary)}._filterField_1lat4_198 input[type=search]::-webkit-search-cancel-button{appearance:none}._checkList_1lat4_229{flex-direction:column;display:flex}._check_1lat4_229{gap:var(--space-1) var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border-subtle);grid-template-columns:auto minmax(0,1fr);display:grid}._checkMark_1lat4_231{font-family:var(--font-display);font-size:var(--text-sm-size);grid-row:1/span 2}._check_1lat4_229[data-pass=true] ._checkMark_1lat4_231{color:var(--status-success-fg)}._check_1lat4_229[data-pass=false] ._checkMark_1lat4_231{color:var(--status-danger-fg)}._checkLabel_1lat4_234{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary)}._checkDetail_1lat4_235{font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._summaryColumns_1lat4_238{gap:var(--space-5);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}._summaryList_1lat4_239{flex-direction:column;display:flex}._summaryRow_1lat4_240{align-items:baseline;gap:var(--space-3);min-height:var(--density-row,32px);padding:var(--space-1) 0;border-bottom:1px solid var(--border-subtle);display:flex}._summaryTitle_1lat4_241{min-width:0;font-size:var(--text-sm-size);color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._summaryMeta_1lat4_242{font-family:var(--font-display);font-size:var(--text-xs-size);color:var(--text-tertiary);white-space:nowrap}._empty_1lat4_245{padding:var(--space-4) 0;font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:62ch}._emptyStrong_1lat4_246{color:var(--text-primary);font-weight:var(--font-weight-medium)}._error_1lat4_247{padding:var(--space-3);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._readOnly_1lat4_248{padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._readOnly_1lat4_248 code{font-family:var(--font-mono);font-size:var(--text-xs-size)}._skeletons_1lat4_250{gap:var(--space-2);flex-direction:column;display:flex}._srOnly_1lat4_251{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._meterFill_1lat4_58{transition:none}}._runtimeTop_1lat4_266{align-items:center;gap:var(--space-2) var(--space-3);margin-bottom:var(--space-4);flex-wrap:wrap;display:flex}._runtimeState_1lat4_267{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-base-size);line-height:var(--text-base-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);display:inline-flex}._runtimeStateText_1lat4_268{white-space:nowrap}._runtimeState_1lat4_267[data-state=running] ._runDot_1lat4_33{background:var(--status-success-solid)}._runtimeState_1lat4_267[data-state=starting] ._runDot_1lat4_33,._runtimeState_1lat4_267[data-state=stopping] ._runDot_1lat4_33{background:var(--status-running-solid)}._runtimeState_1lat4_267[data-state=stopped] ._runDot_1lat4_33{background:var(--status-neutral-solid)}._runtimeState_1lat4_267[data-state=unknown] ._runDot_1lat4_33{background:var(--status-unknown-solid)}._factWide_1lat4_275{flex:260px;min-width:0}._factMono_1lat4_276{font-family:var(--font-mono);font-size:var(--text-xs-size);text-overflow:ellipsis;overflow:hidden}._capacityBlock_1lat4_280{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border-subtle)}._capacityHead_1lat4_281{align-items:flex-start;gap:var(--space-4);display:flex}._capacityBig_1lat4_282{min-width:2ch;font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-3xl-size,30px);letter-spacing:var(--tracking-display,-.02em);line-height:1;font-weight:var(--font-weight-semibold);color:var(--text-primary);flex:none}._capacityBlock_1lat4_280[data-verdict=serialized] ._capacityBig_1lat4_282{color:var(--status-danger-fg)}._capacityBlock_1lat4_280[data-verdict=unknown] ._capacityBig_1lat4_282,._capacityBlock_1lat4_280[data-verdict=offline] ._capacityBig_1lat4_282{color:var(--text-tertiary)}._capacityWords_1lat4_296{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._capacityHeadline_1lat4_297{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);flex-wrap:wrap;display:flex}._capacityDetail_1lat4_298{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);max-width:68ch}._evidence_1lat4_301{margin-top:var(--space-4);padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas)}._evidenceLead_1lat4_302{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);margin-bottom:var(--space-3);max-width:68ch}._evidenceScroll_1lat4_303{overflow-x:auto}._evidenceTable_1lat4_304{border-collapse:collapse;width:100%;min-width:380px;font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._evidenceTable_1lat4_304 th,._evidenceTable_1lat4_304 td{padding:var(--space-1) var(--space-2);text-align:left;border-bottom:1px solid var(--border-subtle)}._evidenceTable_1lat4_304 thead th{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);font-weight:var(--font-weight-medium)}._evidenceTable_1lat4_304 tbody th{font-family:var(--font-display);color:var(--text-primary);font-weight:var(--font-weight-medium);white-space:nowrap}._evidenceTable_1lat4_304 tbody tr:last-child th,._evidenceTable_1lat4_304 tbody tr:last-child td{border-bottom:0}._evidenceNums_1lat4_309{font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--text-secondary);white-space:nowrap}._evidenceCode_1lat4_310{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);overflow-wrap:anywhere}._utilisation_1lat4_312{gap:var(--space-2);margin-top:var(--space-5);flex-direction:column;display:flex}._toggleRow_1lat4_315{justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}._toggleState_1lat4_316{align-items:center;gap:var(--space-2);display:inline-flex}._policyExplain_1lat4_317{margin-top:var(--space-3);font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:68ch}._policyExplain_1lat4_317 strong{color:var(--text-primary);font-weight:var(--font-weight-semibold)}._impact_1lat4_320{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border-subtle)}._impactTitle_1lat4_321{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);margin-bottom:var(--space-2)}._impactSummary_1lat4_322{font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-primary);max-width:68ch}._seatList_1lat4_323{margin-top:var(--space-3);flex-direction:column;display:flex}._seatRow_1lat4_324{gap:var(--space-1) var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border-subtle);grid-template-columns:minmax(64px,auto) minmax(0,1fr);align-items:baseline;display:grid}._seatEngine_1lat4_325{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);border-left:2px solid var(--engine-color,var(--border-strong));padding-left:var(--space-2);white-space:nowrap}._seatEngine_1lat4_325[data-engine=claude]{--engine-color:var(--engine-claude)}._seatEngine_1lat4_325[data-engine=codex]{--engine-color:var(--engine-codex)}._seatEngine_1lat4_325[data-engine=grok]{--engine-color:var(--engine-grok)}._seatEngine_1lat4_325[data-engine=local]{--engine-color:var(--engine-local)}._seatLabel_1lat4_340{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow-wrap:anywhere;min-width:0}._seatRefusal_1lat4_341{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);line-height:var(--text-xs-line);color:var(--text-tertiary);overflow-wrap:anywhere;grid-column:2}._pressure_1lat4_344{gap:var(--space-1);flex-direction:column;display:flex}._pressureHead_1lat4_345{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._pressureHeadline_1lat4_346{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:var(--text-lg-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);color:var(--text-primary)}._pressure_1lat4_344[data-state=queued] ._pressureHeadline_1lat4_346{color:var(--status-warning-fg)}._pressure_1lat4_344[data-state=unknown] ._pressureHeadline_1lat4_346{color:var(--status-unknown-fg)}._pressureDetail_1lat4_349{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);max-width:68ch}._fleetMeters_1lat4_351{align-items:end;gap:var(--space-3) var(--space-5);margin:var(--space-4) 0;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}._elapsedQualifier_1lat4_352{color:var(--text-tertiary);font-family:var(--font-ui);font-style:italic}._noteList_1lat4_353{gap:var(--space-1);margin-top:var(--space-3);flex-direction:column;list-style:none;display:flex}._repoStanding_1lat4_357{gap:var(--space-1);flex-wrap:wrap;align-items:center;display:inline-flex}._repoPriority_1lat4_364,._repoSection_1lat4_365,._repoOutsideFocus_1lat4_366{padding:0 var(--space-1);border-radius:var(--radius-sm);border:1px solid var(--border-subtle);font-size:var(--text-2xs,.6875rem);color:var(--text-muted);white-space:nowrap;line-height:1.6}._repoPriority_1lat4_364{border-color:var(--accent);color:var(--text-default)}._repoOutsideFocus_1lat4_366{font-style:italic}._section_1vgpf_8{background:var(--bg-canvas);flex-direction:column;height:100%;min-height:0;display:flex}._header_1vgpf_10{justify-content:space-between;align-items:center;gap:var(--space-3);height:var(--strip-height);padding:0 var(--space-5);border-bottom:1px solid var(--border-subtle);background:var(--bg-surface);flex-shrink:0;display:flex}._title_1vgpf_23{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,-.02em);color:var(--text-primary)}._headerActions_1vgpf_31{align-items:center;gap:var(--space-2);display:flex}._ghost_1vgpf_32{min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);color:var(--text-secondary);font-family:var(--font-ui);font-size:var(--text-xs-size);cursor:pointer;background:0 0;border:0}._ghost_1vgpf_32:hover{background:var(--bg-hover);color:var(--text-primary)}._scroll_1vgpf_45{scrollbar-gutter:stable;flex:1;min-height:0;overflow-y:auto}._measure_1vgpf_46{max-width:1040px;padding:var(--space-5) var(--space-5) var(--space-16);margin:0 auto}._banner_1vgpf_48{margin-bottom:var(--space-5);padding:var(--space-3) var(--space-4);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._banner_1vgpf_48 code{font-family:var(--font-mono);font-size:var(--text-xs-size)}._bannerTitle_1vgpf_59{color:var(--text-primary);font-weight:var(--font-weight-medium);display:block}._failure_1vgpf_61{padding:var(--space-4);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._retry_1vgpf_70{margin-top:var(--space-3);min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);color:inherit;font-family:var(--font-ui);font-size:var(--text-xs-size);cursor:pointer;background:0 0;border:1px solid}._loading_1vgpf_82{gap:var(--space-3);flex-direction:column;display:flex}@media (max-width:900px){._measure_1vgpf_46{padding:var(--space-4) var(--space-4) var(--space-12)}}._header_1vgpf_10{padding-left:max(var(--space-5), calc(var(--app-traffic-light-inset,0px) - var(--rail-width,56px)))}
|
|
1
|
+
._panel_1lat4_12{border-top:1px solid var(--border-subtle);padding-block:var(--space-6)}._panel_1lat4_12:first-of-type{padding-top:var(--space-4);border-top:0}._panelHead_1lat4_15{justify-content:space-between;align-items:baseline;gap:var(--space-3);margin-bottom:var(--space-4);display:flex}._panelTitle_1lat4_16{font-family:var(--font-display);font-size:var(--text-xs-size);line-height:var(--text-xs-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._panelHeadSpaced_1lat4_25{margin-top:var(--space-6)}._panelNote_1lat4_26{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._panelActions_1lat4_27{align-items:center;gap:var(--space-2);display:flex}._status_1lat4_30{gap:var(--space-4);flex-direction:column;display:flex}._statusTop_1lat4_31{align-items:center;gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}._runState_1lat4_32{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);display:inline-flex}._runDot_1lat4_33{border-radius:var(--radius-full);background:var(--status-neutral-solid);flex-shrink:0;width:8px;height:8px}._runState_1lat4_32[data-state=running] ._runDot_1lat4_33{background:var(--status-running-solid)}._runState_1lat4_32[data-state=stopped] ._runDot_1lat4_33{background:var(--status-neutral-solid)}._runState_1lat4_32[data-state=unknown] ._runDot_1lat4_33{background:var(--status-unknown-solid)}._runState_1lat4_32[data-state=killed] ._runDot_1lat4_33{background:var(--status-danger-solid)}._facts_1lat4_39{gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}._fact_1lat4_39{flex-direction:column;gap:2px;min-width:0;display:flex}._factLabel_1lat4_41{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)}._factValue_1lat4_42{font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);white-space:nowrap}._factValue_1lat4_42[data-tone=warning]{color:var(--status-warning-fg)}._factValue_1lat4_42[data-tone=danger]{color:var(--status-danger-fg)}._factValue_1lat4_42[data-tone=success]{color:var(--status-success-fg)}._factValue_1lat4_42[data-tone=unknown]{color:var(--status-unknown-fg)}._budget_1lat4_49{gap:var(--space-2);flex-direction:column;display:flex}._budgetLine_1lat4_50{justify-content:space-between;align-items:baseline;gap:var(--space-2);flex-wrap:wrap;display:flex}._budgetLabel_1lat4_51{font-family:var(--font-display);font-size:var(--text-sm-size);color:var(--text-primary)}._budgetNote_1lat4_52{font-size:var(--text-xs-size);color:var(--text-tertiary)}._meter_1lat4_53{--meter-color:var(--accent-500);background:var(--meter-track);height:2px;overflow:hidden}._meter_1lat4_53[data-state=warn]{--meter-color:var(--status-warning-solid)}._meter_1lat4_53[data-state=over],._meter_1lat4_53[data-state=stopped]{--meter-color:var(--status-danger-solid)}._meter_1lat4_53[data-state=unknown]{--meter-color:var(--status-unknown-solid)}._meterFill_1lat4_58{background:var(--meter-color);height:100%;transition:width var(--duration-base) var(--ease-decelerate)}._controls_1lat4_61{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._button_1lat4_62{min-height:var(--density-row,32px);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-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._button_1lat4_62:hover:not(:disabled){background:var(--bg-hover);border-color:var(--border-strong)}._button_1lat4_62:disabled{color:var(--text-disabled);cursor:not-allowed}._buttonPrimary_1lat4_76{border-color:var(--accent-500);color:var(--accent-600)}._buttonPrimary_1lat4_76:hover:not(:disabled){background:var(--bg-selected)}._emergency_1lat4_80{align-items:center;gap:var(--space-3);margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--border-default);flex-wrap:wrap;display:flex}._emergencyButton_1lat4_81{min-height:var(--density-row,32px);padding:0 var(--space-4);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-family:var(--font-ui);font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);cursor:pointer}._emergencyButton_1lat4_81:hover:not(:disabled){border-color:var(--status-danger-fg);background:var(--status-danger-bg)}._emergencyButton_1lat4_81:disabled{border-color:var(--border-default);background:var(--bg-surface);color:var(--text-disabled);cursor:not-allowed}._emergencyNote_1lat4_102{min-width:220px;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);flex:1}._capGrid_1lat4_105{gap:var(--space-4) var(--space-5);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}._cap_1lat4_105{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._capLabel_1lat4_107{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)}._capRow_1lat4_108{align-items:center;gap:var(--space-2);display:flex}._capInput_1lat4_109{min-width:0;min-height:var(--density-row,32px);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-family:var(--font-display);font-size:var(--text-sm-size);flex:1}._capInput_1lat4_109:focus-visible{border-color:var(--border-focus)}._capInput_1lat4_109:disabled{color:var(--text-disabled);background:var(--bg-canvas);cursor:not-allowed}._capInputInvalid_1lat4_123{border-color:var(--status-danger-solid)}._capUnit_1lat4_124{font-size:var(--text-xs-size);color:var(--text-tertiary);white-space:nowrap}._capHelp_1lat4_125{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._capUsage_1lat4_126{font-family:var(--font-display);font-size:var(--text-xs-size);color:var(--text-secondary)}._capError_1lat4_127{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--status-danger-fg)}._actionNote_1lat4_130{margin-top:var(--space-3);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary)}._capApplied_1lat4_131{align-items:center;gap:var(--space-1);font-size:var(--text-xs-size);color:var(--status-success-fg);display:inline-flex}._capApplied_1lat4_131:before{content:"✓"}._repoList_1lat4_135{flex-direction:column;display:flex}._repoRow_1lat4_136{align-items:center;gap:var(--space-3);min-height:var(--density-row,32px);padding:var(--space-1) 0;border-bottom:1px solid var(--border-subtle);display:flex}._repoName_1lat4_137{font-family:var(--font-display);font-size:var(--text-sm-size);color:var(--text-primary);white-space:nowrap}._repoPath_1lat4_138{min-width:0;font-family:var(--font-mono);font-size:var(--text-xs-size);color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;overflow:hidden}._repoMissing_1lat4_139{align-items:center;gap:var(--space-1);font-size:var(--text-xs-size);color:var(--status-warning-fg);white-space:nowrap;display:inline-flex}._addRow_1lat4_140{gap:var(--space-2);margin-top:var(--space-4);flex-wrap:wrap;display:flex}._addInput_1lat4_141{min-width:240px;min-height:var(--density-row,32px);padding:0 var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-input);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--text-xs-size);flex:1}._addInput_1lat4_141:focus-visible{border-color:var(--border-focus)}._tableScroll_1lat4_156{border:1px solid var(--border-subtle);border-radius:var(--radius-sm);scrollbar-gutter:stable;max-height:520px;overflow:auto}._table_1lat4_156{border-collapse:collapse;width:100%;font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._table_1lat4_156 th{font-family:var(--font-display);z-index:var(--z-sticky);padding:var(--space-2) var(--space-3);background:var(--bg-surface);border-bottom:1px solid var(--border-default);text-align:left;font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);white-space:nowrap;position:sticky;top:0}._table_1lat4_156 td{padding:var(--space-1) var(--space-3);border-bottom:1px solid var(--border-subtle);vertical-align:top}._table_1lat4_156 tbody tr:hover{background:var(--bg-hover)}._cellAction_1lat4_176{font-family:var(--font-mono);color:var(--text-primary);white-space:nowrap}._cellTime_1lat4_177{font-family:var(--font-display);color:var(--text-tertiary);white-space:nowrap}._cellSummary_1lat4_178{color:var(--text-secondary)}._cellRepo_1lat4_179{font-family:var(--font-mono);color:var(--text-tertiary);white-space:nowrap}._table_1lat4_156 tbody tr:hover ._cellTime_1lat4_177,._table_1lat4_156 tbody tr:hover ._cellRepo_1lat4_179{color:var(--text-secondary)}._resultTag_1lat4_188{align-items:center;gap:var(--space-1);font-family:var(--font-display);white-space:nowrap;display:inline-flex}._resultTag_1lat4_188:before{content:"•"}._resultTag_1lat4_188[data-result=ok]{color:var(--status-success-fg)}._resultTag_1lat4_188[data-result=refused]{color:var(--status-warning-fg)}._resultTag_1lat4_188[data-result=error]{color:var(--status-danger-fg)}._resultTag_1lat4_188[data-result=ok]:before{content:"✓"}._resultTag_1lat4_188[data-result=refused]:before{content:"⊘"}._resultTag_1lat4_188[data-result=error]:before{content:"✕"}._filters_1lat4_197{align-items:flex-end;gap:var(--space-3);margin-bottom:var(--space-3);flex-wrap:wrap;display:flex}._filterField_1lat4_198{gap:var(--space-1);flex-direction:column;display:flex}._filterLabel_1lat4_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-tertiary)}._filterField_1lat4_198 input{min-height:var(--density-row,32px);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-family:var(--font-ui);font-size:var(--text-xs-size)}._filterSelect_1lat4_214>label{font-family:var(--font-display);font-size:var(--text-2xs-size,11px);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-regular,400);color:var(--text-tertiary)}._filterField_1lat4_198 input[type=search]::-webkit-search-cancel-button{appearance:none}._checkList_1lat4_229{flex-direction:column;display:flex}._check_1lat4_229{gap:var(--space-1) var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border-subtle);grid-template-columns:auto minmax(0,1fr);display:grid}._checkMark_1lat4_231{font-family:var(--font-display);font-size:var(--text-sm-size);grid-row:1/span 2}._check_1lat4_229[data-pass=true] ._checkMark_1lat4_231{color:var(--status-success-fg)}._check_1lat4_229[data-pass=false] ._checkMark_1lat4_231{color:var(--status-danger-fg)}._checkLabel_1lat4_234{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary)}._checkDetail_1lat4_235{font-family:var(--font-mono);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._summaryColumns_1lat4_238{gap:var(--space-5);grid-template-columns:repeat(auto-fit,minmax(280px,1fr));display:grid}._summaryList_1lat4_239{flex-direction:column;display:flex}._summaryRow_1lat4_240{align-items:baseline;gap:var(--space-3);min-height:var(--density-row,32px);padding:var(--space-1) 0;border-bottom:1px solid var(--border-subtle);display:flex}._summaryTitle_1lat4_241{min-width:0;font-size:var(--text-sm-size);color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}._summaryMeta_1lat4_242{font-family:var(--font-display);font-size:var(--text-xs-size);color:var(--text-tertiary);white-space:nowrap}._empty_1lat4_245{padding:var(--space-4) 0;font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:62ch}._emptyStrong_1lat4_246{color:var(--text-primary);font-weight:var(--font-weight-medium)}._error_1lat4_247{padding:var(--space-3);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-sm-line)}._readOnly_1lat4_248{padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._readOnly_1lat4_248 code{font-family:var(--font-mono);font-size:var(--text-xs-size)}._skeletons_1lat4_250{gap:var(--space-2);flex-direction:column;display:flex}._srOnly_1lat4_251{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._meterFill_1lat4_58{transition:none}}._runtimeTop_1lat4_266{align-items:center;gap:var(--space-2) var(--space-3);margin-bottom:var(--space-4);flex-wrap:wrap;display:flex}._runtimeState_1lat4_267{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-base-size);line-height:var(--text-base-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);display:inline-flex}._runtimeStateText_1lat4_268{white-space:nowrap}._runtimeState_1lat4_267[data-state=running] ._runDot_1lat4_33{background:var(--status-success-solid)}._runtimeState_1lat4_267[data-state=starting] ._runDot_1lat4_33,._runtimeState_1lat4_267[data-state=stopping] ._runDot_1lat4_33{background:var(--status-running-solid)}._runtimeState_1lat4_267[data-state=stopped] ._runDot_1lat4_33{background:var(--status-neutral-solid)}._runtimeState_1lat4_267[data-state=unknown] ._runDot_1lat4_33{background:var(--status-unknown-solid)}._factWide_1lat4_275{flex:260px;min-width:0}._factMono_1lat4_276{font-family:var(--font-mono);font-size:var(--text-xs-size);text-overflow:ellipsis;overflow:hidden}._capacityBlock_1lat4_280{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border-subtle)}._capacityHead_1lat4_281{align-items:flex-start;gap:var(--space-4);display:flex}._capacityBig_1lat4_282{min-width:2ch;font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-3xl-size,30px);letter-spacing:var(--tracking-display,-.02em);line-height:1;font-weight:var(--font-weight-semibold);color:var(--text-primary);flex:none}._capacityBlock_1lat4_280[data-verdict=serialized] ._capacityBig_1lat4_282{color:var(--status-danger-fg)}._capacityBlock_1lat4_280[data-verdict=unknown] ._capacityBig_1lat4_282,._capacityBlock_1lat4_280[data-verdict=offline] ._capacityBig_1lat4_282{color:var(--text-tertiary)}._capacityWords_1lat4_296{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._capacityHeadline_1lat4_297{align-items:center;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);flex-wrap:wrap;display:flex}._capacityDetail_1lat4_298{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);max-width:68ch}._evidence_1lat4_301{margin-top:var(--space-4);padding:var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-canvas)}._evidenceLead_1lat4_302{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);margin-bottom:var(--space-3);max-width:68ch}._evidenceScroll_1lat4_303{overflow-x:auto}._evidenceTable_1lat4_304{border-collapse:collapse;width:100%;min-width:380px;font-size:var(--text-xs-size);line-height:var(--text-xs-line)}._evidenceTable_1lat4_304 th,._evidenceTable_1lat4_304 td{padding:var(--space-1) var(--space-2);text-align:left;border-bottom:1px solid var(--border-subtle)}._evidenceTable_1lat4_304 thead th{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);font-weight:var(--font-weight-medium)}._evidenceTable_1lat4_304 tbody th{font-family:var(--font-display);color:var(--text-primary);font-weight:var(--font-weight-medium);white-space:nowrap}._evidenceTable_1lat4_304 tbody tr:last-child th,._evidenceTable_1lat4_304 tbody tr:last-child td{border-bottom:0}._evidenceNums_1lat4_309{font-family:var(--font-display);font-variant-numeric:tabular-nums;color:var(--text-secondary);white-space:nowrap}._evidenceCode_1lat4_310{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);color:var(--text-tertiary);overflow-wrap:anywhere}._utilisation_1lat4_312{gap:var(--space-2);margin-top:var(--space-5);flex-direction:column;display:flex}._toggleRow_1lat4_315{justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}._toggleState_1lat4_316{align-items:center;gap:var(--space-2);display:inline-flex}._policyExplain_1lat4_317{margin-top:var(--space-3);font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:68ch}._policyExplain_1lat4_317 strong{color:var(--text-primary);font-weight:var(--font-weight-semibold)}._impact_1lat4_320{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border-subtle)}._impactTitle_1lat4_321{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);margin-bottom:var(--space-2)}._impactSummary_1lat4_322{font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-primary);max-width:68ch}._seatList_1lat4_323{margin-top:var(--space-3);flex-direction:column;display:flex}._seatRow_1lat4_324{gap:var(--space-1) var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border-subtle);grid-template-columns:minmax(64px,auto) minmax(0,1fr);align-items:baseline;display:grid}._seatEngine_1lat4_325{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);border-left:2px solid var(--engine-color,var(--border-strong));padding-left:var(--space-2);white-space:nowrap}._seatEngine_1lat4_325[data-engine=claude]{--engine-color:var(--engine-claude)}._seatEngine_1lat4_325[data-engine=codex]{--engine-color:var(--engine-codex)}._seatEngine_1lat4_325[data-engine=grok]{--engine-color:var(--engine-grok)}._seatEngine_1lat4_325[data-engine=local]{--engine-color:var(--engine-local)}._seatLabel_1lat4_340{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow-wrap:anywhere;min-width:0}._seatRefusal_1lat4_341{font-family:var(--font-mono);font-size:var(--text-2xs-size,11px);line-height:var(--text-xs-line);color:var(--text-tertiary);overflow-wrap:anywhere;grid-column:2}._pressure_1lat4_344{gap:var(--space-1);flex-direction:column;display:flex}._pressureHead_1lat4_345{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._pressureHeadline_1lat4_346{font-family:var(--font-display);font-size:var(--text-lg-size);line-height:var(--text-lg-line);font-weight:var(--font-weight-semibold);letter-spacing:var(--tracking-display,-.02em);color:var(--text-primary)}._pressure_1lat4_344[data-state=queued] ._pressureHeadline_1lat4_346{color:var(--status-warning-fg)}._pressure_1lat4_344[data-state=unknown] ._pressureHeadline_1lat4_346{color:var(--status-unknown-fg)}._pressureDetail_1lat4_349{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);max-width:68ch}._fleetMeters_1lat4_351{align-items:end;gap:var(--space-3) var(--space-5);margin:var(--space-4) 0;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));display:grid}._elapsedQualifier_1lat4_352{color:var(--text-tertiary);font-family:var(--font-ui);font-style:italic}._noteList_1lat4_353{gap:var(--space-1);margin-top:var(--space-3);flex-direction:column;list-style:none;display:flex}._repoStanding_1lat4_357{gap:var(--space-1);flex-wrap:wrap;align-items:center;display:inline-flex}._repoPriority_1lat4_364,._repoSection_1lat4_365,._repoOutsideFocus_1lat4_366{padding:0 var(--space-1);border-radius:var(--radius-sm);border:1px solid var(--border-subtle);font-size:var(--text-2xs,.6875rem);color:var(--text-muted);white-space:nowrap;line-height:1.6}._repoPriority_1lat4_364{border-color:var(--accent);color:var(--text-default)}._repoOutsideFocus_1lat4_366{font-style:italic}._armedTop_8ujh1_22{justify-content:space-between;align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}._armedState_8ujh1_30{align-items:center;gap:var(--space-2);display:inline-flex}._haltRow_8ujh1_36{align-items:center;gap:var(--space-2);flex-wrap:wrap;display:flex}._haltNote_8ujh1_43{margin-top:var(--space-3);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);max-width:68ch}._heavier_8ujh1_53{margin-top:var(--space-4);padding-top:var(--space-4);border-top:1px solid var(--border-subtle);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary);max-width:68ch}._heavier_8ujh1_53 strong{color:var(--text-secondary);font-weight:var(--font-weight-semibold)}._facts_8ujh1_69{gap:var(--space-3) var(--space-5);margin:var(--space-5) 0 0;flex-wrap:wrap;display:flex}._fact_8ujh1_69{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._factWide_8ujh1_83{flex:26ch}._factLabel_8ujh1_87{font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._factValue_8ujh1_95{font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow-wrap:anywhere;min-width:0;margin:0}._factMono_8ujh1_106{font-family:var(--font-mono);font-size:var(--text-xs-size)}._stop_8ujh1_112{gap:var(--space-2);margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px solid var(--border-subtle);flex-direction:column;display:flex}._stopHead_8ujh1_121{justify-content:space-between;align-items:baseline;gap:var(--space-2);flex-wrap:wrap;display:flex}._stopHeadline_8ujh1_129{font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-medium);color:var(--text-primary)}._stopRemaining_8ujh1_137{font-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-secondary);white-space:nowrap}._stopDetail_8ujh1_146{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary);max-width:68ch}._ledger_8ujh1_154{margin-top:var(--space-5)}._ledgerTitle_8ujh1_158{align-items:baseline;gap:var(--space-2);font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);margin-bottom:var(--space-2);display:flex}._ledgerCount_8ujh1_171{font-variant-numeric:tabular-nums;letter-spacing:normal;color:var(--text-secondary)}._ledgerEmpty_8ujh1_177{font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary)}._ledgerList_8ujh1_183{flex-direction:column;list-style:none;display:flex}._ledgerRow_8ujh1_189{gap:var(--space-1) var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border-subtle);transition:background-color var(--duration-fast) var(--ease-standard);grid-template-columns:minmax(8ch,auto) minmax(0,1fr);align-items:baseline;display:grid}._ledgerRow_8ujh1_189:hover{background:var(--bg-hover)}._ledgerRepo_8ujh1_203{font-family:var(--font-mono);font-size:var(--text-2xs-size);color:var(--text-tertiary);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}._ledgerChange_8ujh1_212{font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary);overflow-wrap:anywhere;min-width:0}._ledgerMeta_8ujh1_222{font-family:var(--font-mono);font-size:var(--text-2xs-size);line-height:var(--text-xs-line);color:var(--text-tertiary);overflow-wrap:anywhere;grid-column:2}._form_8ujh1_232{align-items:flex-end;gap:var(--space-3) var(--space-5);flex-wrap:wrap;display:flex}._field_8ujh1_239{gap:var(--space-1);flex-direction:column;min-width:0;display:flex}._fieldLabel_8ujh1_246{font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;color:var(--text-tertiary)}._input_8ujh1_254{min-height:var(--control-h);min-width:10ch;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-family:var(--font-display);font-variant-numeric:tabular-nums;font-size:var(--text-sm-size)}._input_8ujh1_254:focus-visible{border-color:var(--border-focus)}._input_8ujh1_254:disabled{color:var(--text-disabled);background:var(--bg-canvas);cursor:not-allowed}._rulePreview_8ujh1_277{margin-top:var(--space-3);font-family:var(--font-display);font-size:var(--text-sm-size);line-height:var(--text-sm-line);color:var(--text-primary)}._armRow_8ujh1_285{align-items:center;gap:var(--space-2);margin-top:var(--space-4);flex-wrap:wrap;display:flex}._authorisation_8ujh1_17{margin-top:var(--space-5);padding:var(--space-3) var(--space-4);border-left:2px solid var(--border-strong);background:var(--bg-canvas);border-radius:0 var(--radius-sm) var(--radius-sm) 0}._authorisationTitle_8ujh1_305{font-family:var(--font-display);font-size:var(--text-2xs-size);letter-spacing:var(--tracking-label,.06em);text-transform:uppercase;font-weight:var(--font-weight-semibold);color:var(--text-tertiary);margin-bottom:var(--space-2)}._authorisationBody_8ujh1_315{font-size:var(--text-sm-size);line-height:var(--text-base-line);color:var(--text-secondary);max-width:68ch}._authorisationBody_8ujh1_315 strong{color:var(--text-primary);font-weight:var(--font-weight-semibold)}._authorisationCaveat_8ujh1_327{margin-top:var(--space-2);font-size:var(--text-xs-size);line-height:var(--text-xs-line);color:var(--status-warning-fg);max-width:68ch}._authorisationCaveat_8ujh1_327 strong{font-weight:var(--font-weight-semibold)}@media (prefers-reduced-motion:reduce){:root:not([data-motion=full]) ._ledgerRow_8ujh1_189{transition:none}}._section_1vgpf_8{background:var(--bg-canvas);flex-direction:column;height:100%;min-height:0;display:flex}._header_1vgpf_10{justify-content:space-between;align-items:center;gap:var(--space-3);height:var(--strip-height);padding:0 var(--space-5);border-bottom:1px solid var(--border-subtle);background:var(--bg-surface);flex-shrink:0;display:flex}._title_1vgpf_23{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,-.02em);color:var(--text-primary)}._headerActions_1vgpf_31{align-items:center;gap:var(--space-2);display:flex}._ghost_1vgpf_32{min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);color:var(--text-secondary);font-family:var(--font-ui);font-size:var(--text-xs-size);cursor:pointer;background:0 0;border:0}._ghost_1vgpf_32:hover{background:var(--bg-hover);color:var(--text-primary)}._scroll_1vgpf_45{scrollbar-gutter:stable;flex:1;min-height:0;overflow-y:auto}._measure_1vgpf_46{max-width:1040px;padding:var(--space-5) var(--space-5) var(--space-16);margin:0 auto}._banner_1vgpf_48{margin-bottom:var(--space-5);padding:var(--space-3) var(--space-4);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-secondary);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._banner_1vgpf_48 code{font-family:var(--font-mono);font-size:var(--text-xs-size)}._bannerTitle_1vgpf_59{color:var(--text-primary);font-weight:var(--font-weight-medium);display:block}._failure_1vgpf_61{padding:var(--space-4);border:1px solid var(--status-danger-solid);border-radius:var(--radius-sm);background:var(--status-danger-bg);color:var(--status-danger-fg);font-size:var(--text-sm-size);line-height:var(--text-base-line)}._retry_1vgpf_70{margin-top:var(--space-3);min-height:var(--control-h-sm);padding:0 var(--space-3);border-radius:var(--radius-sm);color:inherit;font-family:var(--font-ui);font-size:var(--text-xs-size);cursor:pointer;background:0 0;border:1px solid}._loading_1vgpf_82{gap:var(--space-3);flex-direction:column;display:flex}@media (max-width:900px){._measure_1vgpf_46{padding:var(--space-4) var(--space-4) var(--space-12)}}._header_1vgpf_10{padding-left:max(var(--space-5), calc(var(--app-traffic-light-inset,0px) - var(--rail-width,56px)))}
|