agentwrangler 0.1.0 → 0.1.1-next.2f6c1df
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/README.md +82 -94
- package/dist/apply/jobs.js +6 -2
- package/dist/daemon/index.js +9 -3
- package/dist/daemon/readiness.js +26 -1
- package/dist/daemon/router.js +4 -2
- package/dist/db/migrations/016_ingest_offset_file_version.sql +8 -0
- package/dist/db/migrations/017_ingest_metric_events.sql +22 -0
- package/dist/detector/detectors/d10_catalog_footprint.js +2 -2
- package/dist/detector/detectors/d1_ctx_always_loaded.js +9 -9
- package/dist/detector/detectors/d2_session_long_full_context.js +2 -2
- package/dist/detector/detectors/d4_model_mismatch.js +3 -3
- package/dist/detector/detectors/d6_tool_result_bloat.js +1 -1
- package/dist/detector/detectors/d7_loop_retry_waste.js +1 -1
- package/dist/detector/detectors/d8_cache_write_churn.js +2 -2
- package/dist/detector/detectors/d9_idle_background_session.js +1 -1
- package/dist/detector/measurement.js +3 -2
- package/dist/hook/precompact-checkpoint-hook.mjs +74 -25
- package/dist/ingest/ingestor.js +151 -62
- package/dist/ingest/pricing.js +15 -0
- package/dist/ingest/tail.js +55 -11
- package/dist/query/api/cost-per-success.js +13 -1
- package/dist/query/api/delivery.js +25 -3
- package/dist/query/api/effectiveness.js +30 -5
- package/dist/query/api/efficiency-headroom.js +12 -14
- package/dist/query/api/outcomes.js +2 -1
- package/dist/query/api/overview.js +90 -6
- package/dist/query/settings-store.js +2 -0
- package/dist/query/spend.js +64 -2
- package/dist/ui/assets/BarChart-BC-ciS9d.js +3 -0
- package/dist/ui/assets/BriefsPage-Dls6npt7.js +2 -0
- package/dist/ui/assets/CacheWriteSpikesChart-ncVwVoud.js +1 -0
- package/dist/ui/assets/CartesianChart-CRV6h2et.js +84 -0
- package/dist/ui/assets/Chip-EizRm13x.js +1 -0
- package/dist/ui/assets/ComposedChart-CrOxp6Ym.js +1 -0
- package/dist/ui/assets/EmptyState-9kcoimjj.js +1 -0
- package/dist/ui/assets/FlavorDecomposition-DRZxH0vQ.js +1 -0
- package/dist/ui/assets/FrictionCell-BGYB9UKh.js +2 -0
- package/dist/ui/assets/GlossaryPage-CRyQb1Hn.js +1 -0
- package/dist/ui/assets/HotSessionsPage-DfE90Kxi.js +1 -0
- package/dist/ui/assets/InfoTip-CmcYFNQt.js +1 -0
- package/dist/ui/assets/Legend-BCXsSaEM.js +5 -0
- package/dist/ui/assets/Line-2rUzs15v.js +1 -0
- package/dist/ui/assets/OverviewPage-Bm5KvXqa.js +2 -0
- package/dist/ui/assets/RecommendationsPage-CvSl3lzp.js +2 -0
- package/dist/ui/assets/Scatter-DpIZt_y5.js +1 -0
- package/dist/ui/assets/SessionDetailPage-w_lSgite.js +1 -0
- package/dist/ui/assets/SettingsPage-CfUoP8lB.js +25 -0
- package/dist/ui/assets/Skeleton-DjuxPm_D.js +1 -0
- package/dist/ui/assets/SpendPercentileChip-DYun7Wzh.js +1 -0
- package/dist/ui/assets/TrendChart-gyhHK9H_.js +1 -0
- package/dist/ui/assets/WorkspaceDetailPage-DacPKaKA.js +1 -0
- package/dist/ui/assets/WorkspacesPage-DiNQaAYG.js +1 -0
- package/dist/ui/assets/chart-theme-DnpNuyRt.js +1 -0
- package/dist/ui/assets/graphicalItemSelectors-CFhpQjLz.js +1 -0
- package/dist/ui/assets/index-D_IJsvkJ.css +1 -0
- package/dist/ui/assets/index-hbaLYHUX.js +41 -0
- package/dist/ui/assets/prompt-templates-CVzMex9L.js +13 -0
- package/dist/ui/assets/rec-sessions-ggz9MYgP.js +1 -0
- package/dist/ui/assets/useExperimentalActions-B7J8gIkb.js +1 -0
- package/dist/ui/assets/workspace-label-CysPJNc0.js +1 -0
- package/dist/ui/index.html +2 -2
- package/package.json +21 -5
- package/dist/ui/assets/index-DnRKgc21.css +0 -1
- package/dist/ui/assets/index-h1Q1wWq5.js +0 -168
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as h,w as B,x as V,y as U,z as q,j as e}from"./index-hbaLYHUX.js";import{s as K,S as G}from"./SpendPercentileChip-DYun7Wzh.js";import{w as H}from"./workspace-label-CysPJNc0.js";import{g as _,C as Q,s as Y}from"./chart-theme-DnpNuyRt.js";import{e as X}from"./prompt-templates-CVzMex9L.js";import{C as p}from"./Chip-EizRm13x.js";import{E as J}from"./EmptyState-9kcoimjj.js";import{I as x}from"./InfoTip-CmcYFNQt.js";import{a as $}from"./Skeleton-DjuxPm_D.js";import{F as Z}from"./FrictionCell-BGYB9UKh.js";import{R as ee,C as te,X as se,Y as ne,T as ie}from"./CartesianChart-CRV6h2et.js";import{C as re}from"./ComposedChart-CrOxp6Ym.js";import{L as ae}from"./Line-2rUzs15v.js";import{S as oe,R as le}from"./Scatter-DpIZt_y5.js";function M(t){return t===null?"N/A":`$${(t/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function m(t){return t.toLocaleString("en-US")}function P(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:String(Math.round(t))}function ce(t,i){if(t===null||i===null)return"N/A";const l=Math.max(new Date(i).getTime()-new Date(t).getTime(),0),o=Math.round(l/6e4);return o<60?`${o}m`:`${Math.floor(o/60)}h ${o%60}m`}function de(t){return H({workspace_id:t.workspace_id,repo_owner:t.repo_owner??null,repo_name:t.repo_name??null,repo_path:t.repo_path??null,repo_canonical:t.repo_canonical??null})}function O(t){return t.provisional?e.jsx(p,{kind:"LIVE",label:"LIVE"}):t.cost_claim==="LIST_EQUIV_STALE"?e.jsx(p,{kind:"LIST_EQUIV_STALE"}):t.cost_claim==="LIST_EQUIV"?e.jsx(p,{kind:"LIST_EQUIV"}):e.jsx("span",{children:t.cost_claim})}function N(t){var i;(i=navigator.clipboard)==null||i.writeText(t)}function he(t){return t===null?"var(--green)":t>=.5?"var(--red)":t>=.25?"var(--amber)":"var(--green)"}function ue(t){return typeof t=="number"?t.toLocaleString("en-US"):String(t)}function pe({driver:t}){const i=Object.entries(t.measured).slice(0,3),l=t.routing==="rec_card"?`#/recommendations?focus=${encodeURIComponent(t.rec_id)}`:"#/settings",o=t.routing==="rec_card"?"View rec":"Install hook";return e.jsxs("div",{className:"cost-driver-row","data-testid":"cost-driver-row","data-detector":t.detector_id,style:{display:"flex",alignItems:"flex-start",gap:10,padding:"8px 0",borderBottom:"1px solid var(--line)"},children:[e.jsx("span",{className:"driver-severity-dot","aria-label":`severity ${t.share!==null?Math.round(t.share*100):0}%`,style:{width:10,height:10,borderRadius:"50%",background:he(t.share),flexShrink:0,marginTop:3}}),e.jsxs("div",{style:{flex:1},children:[e.jsx("span",{style:{fontWeight:600,fontSize:12},children:t.label}),t.share!==null&&e.jsxs("span",{className:"driver-share",style:{marginLeft:8,fontSize:11,color:"var(--text-muted)"},children:[Math.round(t.share*100),"% share"]}),e.jsx("div",{style:{marginTop:2,fontSize:11,color:"var(--text-muted)"},children:i.map(([d,r])=>e.jsxs("span",{style:{marginRight:12},children:[d,": ",ue(r)]},d))}),t.approx_usd!==void 0&&e.jsxs("div",{className:"driver-approx-usd",style:{fontSize:11,color:"var(--text-muted)",marginTop:2},children:["≈$",t.approx_usd.toFixed(2),"/wk (this driver only)"]})]}),e.jsx("a",{href:l,className:`driver-chip driver-chip-${t.routing}`,"data-testid":`driver-route-${t.routing}`,"data-rec-id":t.routing==="rec_card"?t.rec_id:void 0,style:{fontSize:11,padding:"2px 8px",borderRadius:4,border:"1px solid var(--line)",textDecoration:"none",color:"var(--text)",flexShrink:0},children:o})]})}function me({drivers:t}){const i=X(t),[l,o]=h.useState(!1);function d(){N(i.text),o(!0),setTimeout(()=>o(!1),2e3)}return e.jsxs("div",{className:"card","data-testid":"cost-drivers-panel",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["Cost drivers"," ",e.jsx(x,{label:"What the cost-drivers panel shows",content:"Shows where this session's estimated value came from: context sent again, cache writes, and model choice. Start with the largest item."})]}),e.jsxs("div",{className:"chips",children:[e.jsx(p,{kind:"OBS_PROXY"}),e.jsxs("span",{className:"section-meta",children:["p",t.percentile.toFixed(0)]})]})]}),e.jsx("div",{style:{padding:"0 16px"},children:t.drivers.map(r=>e.jsx(pe,{driver:r},r.detector_id))}),e.jsxs("div",{style:{padding:"12px 16px 8px"},children:[e.jsx("p",{className:"kpi-fn",style:{margin:"0 0 8px"},children:"Each figure is a separate signal. Do not add them together."}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{fontSize:11,fontWeight:600,color:"var(--text-muted)"},children:"GUIDED prompt"}),e.jsx("button",{type:"button",className:"btn-secondary",onClick:d,"data-testid":"copy-drivers-prompt",style:{fontSize:11,padding:"2px 10px"},children:l?"Copied!":"Copy prompt"})]}),e.jsx("pre",{className:"driver-prompt-preview","data-testid":"driver-prompt-text",style:{fontSize:11,lineHeight:1.5,background:"var(--panel2)",border:"1px solid var(--line)",borderRadius:4,padding:"8px 10px",marginTop:6,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:i.text})]})]})}function xe(t){return t.map((i,l)=>({...i,idx:l+1,cache_write_total:i.cache_write_5m+i.cache_write_1h+i.cache_write_other}))}function _e({turns:t,compactionCount:i=0}){if(t.length===0)return null;const l=xe(t),o=l.filter(r=>r.cache_write_total>0),d=i>0?` · ${i} compaction(s)`:"";return e.jsxs("div",{className:"card","data-testid":"context-growth-chart",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["Context per turn"," ",e.jsx(x,{label:"What the context-growth chart shows",content:"Context size for each turn. Context is sent again each turn, so a rising line can increase estimated value. A steep climb can be a reason to use /clear or split the task."})]}),e.jsx("div",{className:"chips",children:e.jsx(p,{kind:"OBS_PROXY"})})]}),e.jsx(ee,{width:"100%",height:130,children:e.jsxs(re,{data:l,margin:{top:8,right:16,bottom:4,left:0},children:[e.jsx(te,{..._.grid}),e.jsx(se,{dataKey:"idx",type:"number",allowDecimals:!1,axisLine:_.axisLine,tickLine:_.tickLine,tickCount:_.tickCount,interval:"preserveStartEnd",minTickGap:24,tickFormatter:r=>`Turn ${r}`,tick:{fontSize:11}}),e.jsx(ne,{dataKey:"context_tokens",axisLine:_.axisLine,tickLine:_.tickLine,tickFormatter:P,width:54}),e.jsx(ie,{content:e.jsx(Q,{labelFormatter:r=>`Turn ${String(r)}`,valueFormatter:r=>typeof r=="number"?P(r):String(r??"N/A")})}),e.jsx(ae,{type:"monotone",dataKey:"context_tokens",name:"Context",stroke:Y[0],strokeWidth:2,dot:!1,isAnimationActive:!1}),o.length>0&&e.jsx(oe,{data:o,dataKey:"context_tokens",name:"Cache write",fill:"var(--amber)",isAnimationActive:!1}),e.jsx(le,{y:16e4,stroke:"var(--red)",strokeDasharray:"4 4",ifOverflow:"extendDomain",label:{value:"160K warning",fill:"var(--red)",position:"insideTopRight"}})]})}),e.jsx("p",{className:"kpi-fn",style:{margin:"0 16px 12px"},children:`Context for each turn · amber dots show a cache write · red line marks 80% of the 200K context window${d}`})]})}function Ie({sessionId:t,onBack:i}){var R;const[l,o]=h.useState({status:"loading"}),[d,r]=h.useState({status:"loading"}),[c,b]=h.useState([]),[f,T]=h.useState(100),[y,w]=h.useState(null),[S,L]=h.useState(!1),[k,C]=h.useState(null),[j,E]=h.useState(null),[g,I]=h.useState(null);h.useEffect(()=>{let n=!1;return o({status:"loading"}),r({status:"loading"}),b([]),T(100),w(null),C(null),E(null),I(null),(async()=>{var u,v;try{const a=await B(t);if(n||(o({status:"ok",value:a}),a.data===null))return}catch(a){n||o({status:"error",message:String(a)});return}try{const a=await V(t);if(n)return;r({status:"ok",value:a}),b(((u=a.data)==null?void 0:u.items)??[]),w(((v=a.data)==null?void 0:v.next_cursor)??null)}catch(a){n||r({status:"error",message:String(a)})}try{const a=await U(t);if(n)return;E(a.data??null)}catch{}try{const a=await q(t);if(n)return;I(a)}catch{}})(),()=>{n=!0}},[t]);const F=()=>{if(f<c.length){T(n=>n+100);return}y===null||S||(L(!0),C(null),V(t,{after:y}).then(n=>{var u;b(v=>{var a;return[...v,...((a=n.data)==null?void 0:a.items)??[]]}),w(((u=n.data)==null?void 0:u.next_cursor)??null)}).catch(n=>C(String(n))).finally(()=>L(!1)))};if(l.status==="loading")return e.jsx("div",{className:"session-detail","aria-busy":"true","aria-label":"Loading session detail",children:e.jsx($,{height:180})});if(l.status==="error")return e.jsxs("div",{className:"banner banner-error",role:"alert",children:["Could not load session: ",l.message]});const s=l.value.data;if(s===null)return e.jsxs("div",{className:"empty-state session-detail-empty",children:[e.jsx("span",{className:"empty-state-text",children:"Session not found."}),e.jsx("button",{type:"button",className:"btn-secondary",onClick:i,children:"Back to overview"})]});const W=n=>n.cache_write_5m+n.cache_write_1h+n.cache_write_other,z=c.slice(0,f),D=c.length>0&&c.every(n=>{var u;return n.cost_claim===((u=c[0])==null?void 0:u.cost_claim)})?(R=c[0])==null?void 0:R.cost_claim:null,A=D===null?null:c[0]??null;return e.jsxs("section",{className:"session-detail",children:[e.jsx("button",{type:"button",className:"btn-secondary session-back",onClick:i,children:"Back to overview"}),e.jsxs("div",{className:"page-top",children:[e.jsxs("div",{className:"page-title",children:[e.jsx("h1",{children:"Session detail"}),e.jsxs("p",{className:"page-sub",children:[de(s)," ·"," ",e.jsx("button",{type:"button",className:"live-session-link",onClick:()=>N(s.session_id),title:s.session_id,"aria-label":`Copy session ${s.session_id}`,children:K(s.session_id)})]}),e.jsx("button",{type:"button",className:"live-session-link page-sub",onClick:()=>N(s.file_path),title:s.file_path,children:"Copy source path"})]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"flex-end",gap:6},children:[e.jsx(p,{kind:s.state==="LIVE"?"LIVE":"LIST_EQUIV",label:s.state}),g!=null&&e.jsx(G,{percentile:g.percentile,n:g.n,windowDays:g.window_days})]})]}),e.jsx("div",{style:{display:"flex",justifyContent:"flex-end",padding:"0 0 4px"},children:e.jsx(x,{label:"What these KPIs summarize",content:"A quick view of turns, estimated value, context, and outcome. Open the sections below to understand each one."})}),e.jsxs("div",{className:"session-kpis",children:[e.jsxs("div",{children:[e.jsx("span",{children:"Turns"}),e.jsx("b",{children:m(s.turn_count)})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Estimated value"}),e.jsx("b",{children:M(s.cost_equiv_u)})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Duration"}),e.jsx("b",{children:ce(s.first_turn_at,s.last_turn_at)})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Started"}),e.jsx("b",{children:s.first_turn_at?new Date(s.first_turn_at).toLocaleString():"N/A"})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Last turn"}),e.jsx("b",{children:s.last_turn_at?new Date(s.last_turn_at).toLocaleString():"N/A"})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Hygiene flags"}),e.jsx("b",{children:s.hygiene_flags.length>0?s.hygiene_flags.join(", "):"None"})]}),e.jsxs("div",{children:[e.jsxs("span",{children:["Turns through first commit"," ",e.jsx(x,{label:"Turns through first commit",content:"The number of main-conversation turns through the first commit. Empty when this session made no commit. This counts turns, not the quality of the result."})]}),e.jsx("b",{"data-testid":"turns-to-first-commit",children:s.turns_to_first_commit!==void 0?s.turns_to_first_commit!==null?String(s.turns_to_first_commit):"—/no commit":"—"})]}),e.jsxs("div",{children:[e.jsxs("span",{children:["Reconciled Bash/edit activity without an observed commit"," ",e.jsx(x,{label:"Reconciled activity without an observed commit",content:"Shown only for a reconciled session with at least 10 user turns, Bash/Write/Edit/NotebookEdit activity, and no observed SHA. This is an activity cohort, not abandonment or a judgment about usefulness."})]}),e.jsx("b",{"data-testid":"deep-abandoned",children:s.deep_abandoned===!0?e.jsx(p,{kind:"DIRECTIONAL",label:"DEEP ACTIVITY, NO OBSERVED COMMIT"}):"No"})]})]}),j!==null&&(j.percentile>=75||j.drivers.length>=1)&&e.jsx(me,{drivers:j}),e.jsxs("div",{className:"card","data-testid":"friction-strip",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["Friction signals"," ",e.jsx(x,{label:"What the friction band means",content:"A legacy heuristic based on observed errors, test outcomes, and interaction/context signals. It is not a health or quality rating. Interrupt telemetry and API request exposure are unavailable; the details show counts, available rates, and limits."})]}),e.jsx("div",{className:"chips",children:e.jsx(p,{kind:"DIRECTIONAL"})})]}),e.jsxs("div",{style:{padding:"8px 16px 12px"},children:[e.jsx(x,{label:"What the friction components are",content:"Operational errors, test outcomes, and interaction/context signals are shown separately. A test failure followed by a later pass is not task failure or proof that the same test recovered."}),e.jsx(Z,{counts:{api_error_count:s.api_error_count,tool_error_count:s.tool_error_count,test_fail_count:s.test_fail_count,compaction_count:s.compaction_count,interrupt_count:s.interrupt_count,interrupts_supported:s.interrupts_supported,api_error_eligible_request_count:s.api_error_eligible_request_count,api_error_rate:s.api_error_rate,tool_completed_count:s.tool_completed_count,tool_completed_error_count:s.tool_completed_error_count,tool_error_rate:s.tool_error_rate,test_completed_count:s.test_completed_count,test_pass_count:s.test_pass_count,test_outcome:s.test_outcome,user_turn_count:s.user_turn_count,turn_count:s.turn_count,gap_median_s:s.gap_median_s,gap_p90_s:s.gap_p90_s,long_gap_count:s.long_gap_count,gap_n:s.gap_n},variant:"strip"})]})]}),e.jsx(_e,{turns:c,compactionCount:s.compaction_count}),e.jsxs("div",{className:"card session-timeline",children:[e.jsxs("div",{className:"section-head",children:[e.jsx("h2",{children:"Turn timeline"}),e.jsxs("div",{className:"chips",children:[e.jsx("span",{className:"section-meta",children:"Oldest first"}),A!==null&&e.jsxs("span",{children:["Claim: ",O({...A,provisional:!1})]})]})]}),d.status==="loading"&&e.jsx("div",{className:"table-wrap","aria-busy":"true",children:e.jsx($,{height:90})}),d.status==="error"&&e.jsxs("div",{className:"banner banner-error",role:"alert",children:["Could not load turns: ",d.message]}),d.status==="ok"&&c.length===0&&e.jsx(J,{headline:"No turns recorded for this session",why:"No turns have been recorded for this session.",whatWillAppear:"Per-turn token, context, and cost aggregates will appear when the daemon observes them."}),d.status==="ok"&&c.length>0&&e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Time"}),e.jsx("th",{children:"Model"}),e.jsx("th",{children:"Chain"}),e.jsx("th",{children:"Input"}),e.jsx("th",{children:"Output"}),e.jsx("th",{children:"Thinking"}),e.jsx("th",{children:"Cache read"}),e.jsx("th",{children:"Cache write"}),e.jsx("th",{children:"Context"}),e.jsx("th",{children:"Estimated value"}),e.jsx("th",{children:"How it is estimated"})]})}),e.jsx("tbody",{children:z.map(n=>e.jsxs("tr",{children:[e.jsx("td",{children:new Date(n.ts).toLocaleTimeString()}),e.jsx("td",{children:n.model}),e.jsx("td",{children:n.is_sidechain===!0&&e.jsx("span",{className:"chip chip-na",children:"side"})}),e.jsx("td",{children:m(n.input_tokens)}),e.jsx("td",{children:m(n.output_tokens)}),e.jsx("td",{children:n.thinking_tokens===null?"N/A":m(n.thinking_tokens)}),e.jsx("td",{children:m(n.cache_read_tokens)}),e.jsx("td",{children:m(W(n))}),e.jsx("td",{children:m(n.context_tokens)}),e.jsx("td",{children:M(n.cost_equiv_u)}),e.jsx("td",{children:n.provisional||n.cost_claim!==D?O(n):"—"})]},n.message_id))})]})}),d.status==="ok"&&c.length>0&&(f<c.length||y!==null)&&e.jsxs("div",{className:"session-load-more",children:[e.jsxs("p",{className:"section-meta",children:["showing ",Math.min(f,c.length)," of ",c.length," turns"]}),k!==null&&e.jsxs("div",{className:"banner banner-error",role:"alert",children:["Could not load more turns: ",k]}),e.jsx("button",{type:"button",className:"btn-secondary",onClick:F,disabled:S,children:S?"Loading…":k===null?"Load more":"Retry loading turns"})]})]})]})}export{_e as ContextGrowthChart,Ie as default};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import{r as a,j as e,e as M,A as U,B as H,C as G,k as q,i as V,D as K,E as Y,v as F,F as L,G as X,H as D,I as Q,J,p as Z,K as ee,M as te,N as se}from"./index-hbaLYHUX.js";import{u as ne,s as ae}from"./useExperimentalActions-B7J8gIkb.js";import{C as ie}from"./Chip-EizRm13x.js";import{I as le}from"./InfoTip-CmcYFNQt.js";function W({children:t,labelledBy:n,onCancel:l}){const m=a.useRef(null);return a.useEffect(()=>{const r=document.activeElement,d=m.current;return d==null||d.showModal(),()=>{d==null||d.close(),r instanceof HTMLElement&&r.isConnected&&r.focus()}},[]),e.jsx("dialog",{ref:m,"aria-labelledby":n,className:"settings-modal",onCancel:r=>{r.preventDefault(),l()},children:t})}const z={daily_usd:13,source_url:"https://code.claude.com/docs/en/costs",fetched_date:"2026-09-02"},R={daily_usd:30,source_url:"https://code.claude.com/docs/en/costs",fetched_date:"2026-09-02"},O={claim:"<5% of subscribers",source:"official Anthropic X post, 2025-07-28"},re="Benchmark figures are from enterprise API-billed users. Your figure is a subscription-plan estimate (LIST_EQUIV) — a reference point, not a like-for-like comparison.";function oe(t){return`$${t.toFixed(2)}`}function ce(t){const n=t.filter(m=>m.turns>0);return n.length===0?null:n.reduce((m,r)=>m+r.cost_equiv_u,0)/n.length/1e6}function de(){const[t,n]=a.useState("loading"),[l,m]=a.useState(!1);return a.useEffect(()=>{let r=!1;return(async()=>{try{const d=await M({preset:"30d"},"day");if(r)return;if((d==null?void 0:d.data)==null){n(null);return}n(ce(d.data.buckets))}catch{r||(m(!0),n(null))}})(),()=>{r=!0}},[]),e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},"aria-label":"Benchmark anchors",children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15},children:"Published benchmarks"}),e.jsx("p",{className:"settings-hint","aria-label":"not-like-for-like caveat",style:{marginBottom:14},children:re}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[e.jsxs("div",{className:"settings-health-row","aria-label":"benchmark avg per day",children:[e.jsx("span",{className:"settings-health-label",children:"Average daily API bill (enterprise)"}),e.jsxs("span",{className:"settings-health-value",children:["$",z.daily_usd,"/day"]}),e.jsxs("span",{className:"section-meta",children:["Source:"," ",e.jsx("a",{href:z.source_url,target:"_blank",rel:"noopener noreferrer","aria-label":"benchmark avg citation",children:"code.claude.com/docs/en/costs"})," ","· fetched ",z.fetched_date]})]}),e.jsxs("div",{className:"settings-health-row","aria-label":"benchmark p90 per day",children:[e.jsx("span",{className:"settings-health-label",children:"90th-percentile daily API bill (enterprise)"}),e.jsxs("span",{className:"settings-health-value",children:["$",R.daily_usd,"/day"]}),e.jsxs("span",{className:"section-meta",children:["Source:"," ",e.jsx("a",{href:R.source_url,target:"_blank",rel:"noopener noreferrer","aria-label":"benchmark p90 citation",children:"code.claude.com/docs/en/costs"})," ","· fetched ",R.fetched_date]})]}),e.jsxs("div",{className:"settings-health-row","aria-label":"cap impact claim",children:[e.jsx("span",{className:"settings-health-label",children:"Reached a usage limit"}),e.jsx("span",{className:"settings-health-value",children:O.claim}),e.jsx("span",{className:"section-meta",children:O.source})]}),e.jsxs("div",{className:"settings-health-row","aria-label":"own cost per active day",children:[e.jsx("span",{className:"settings-health-label",children:"Your estimated value per active day (30 days)"}),e.jsx("span",{className:"settings-health-value","aria-label":"own active day cost value",children:t==="loading"?"…":l?"unavailable":t===null?"no data":oe(t)}),e.jsx("span",{className:"section-meta",children:"Mean over active days (turns > 0) in the last 30 days. LIST_EQUIV estimate."})]})]})]})}function ue(t){return`Update ~/.claude/settings.json by merging these three AgentWrangler PreToolUse hook entries. For each command, use the installed AgentWrangler hook script path that ends in the named filename:
|
|
2
|
+
|
|
3
|
+
- { "matcher": "*", "hooks": [{ "type": "command", "command": "<AgentWrangler hook path>/context-budget-hook.mjs" }] }
|
|
4
|
+
- { "matcher": "*", "hooks": [{ "type": "command", "command": "<AgentWrangler hook path>/loop-guard-hook.mjs" }] }
|
|
5
|
+
- { "matcher": "*", "hooks": [{ "type": "command", "command": "<AgentWrangler hook path>/limit-burn-hook.mjs" }] }
|
|
6
|
+
|
|
7
|
+
Make this idempotent and safe to re-run: do not duplicate an already-present AgentWrangler hook entry. Preserve all unrelated settings and any other hooks. This copied prompt intentionally installs only these three hooks; Settings' Install directly action also installs the dangerous-command Bash hook and the PreCompact checkpoint hook.
|
|
8
|
+
|
|
9
|
+
Current thresholds (managed in the AgentWrangler dashboard)
|
|
10
|
+
- context_window: ${t.context_window}
|
|
11
|
+
- soft_pct: ${t.soft_pct}
|
|
12
|
+
- hard_pct: ${t.hard_pct}
|
|
13
|
+
- d7_fail_count: ${t.d7_fail_count}
|
|
14
|
+
- d7_window_turns: ${t.d7_window_turns}
|
|
15
|
+
- d9_idle_seconds: ${t.d9_idle_seconds}
|
|
16
|
+
|
|
17
|
+
The hook commands fetch these thresholds live from the AgentWrangler daemon; they are documented here for reference and are not stored in settings.json. This change takes effect immediately because Claude Code watches settings.json.`}function he(){return`Update ~/.claude/settings.json by removing only the AgentWrangler PreToolUse hook entries whose commands reference these filenames:
|
|
18
|
+
|
|
19
|
+
- context-budget-hook.mjs
|
|
20
|
+
- loop-guard-hook.mjs
|
|
21
|
+
- limit-burn-hook.mjs
|
|
22
|
+
|
|
23
|
+
Make this idempotent and safe to re-run: do not duplicate or remove any unrelated settings or hooks. Preserve every non-AgentWrangler PreToolUse entry. This copied uninstall prompt removes only these three hooks; Settings' Uninstall directly action also removes the dangerous-command and PreCompact hooks. This change takes effect immediately because Claude Code watches settings.json.`}function $(t){return t.replace(/\\/g,"/").split("/").filter(Boolean).pop()??t}function me({settings:t,onSaved:n}){var S;const[l,m]=a.useState(t.limit_tokens!==null?String(t.limit_tokens):""),[r,d]=a.useState(t.scan_roots.join(`
|
|
24
|
+
`)),[p,h]=a.useState(String(t.activity_window_secs)),[x,j]=a.useState(!1),[f,u]=a.useState(!1),[g,b]=a.useState(null),[_,o]=a.useState(!1),[s,k]=a.useState(t.limit_provenance),[w,c]=a.useState((S=t.limit_provenance)!=null&&S.includes("LOW CONFIDENCE")?"low":null),[y,N]=a.useState(!1),E=t.limit_resets_at,P=(s==null?void 0:s.startsWith("calibrated"))===!0&&E!==null&&Date.now()>new Date(E).getTime();async function i(){b(null),u(!0);try{const v=await X();if(v.data===null){b("Calibration returned no data — try again.");return}if(!v.data.ok){b(v.data.reason);return}m(String(v.data.limit_tokens)),k(v.data.provenance),c(v.data.confidence??null);const I=await U();I.data!==null&&n(I.data)}catch(v){b(v instanceof Error?v.message:String(v))}finally{u(!1)}}async function T(){o(!1);const v=r.split(`
|
|
25
|
+
`).map(C=>C.trim()).filter(Boolean),I=l.trim();let A;if(I==="")A=null;else{const C=Number(I);if(!Number.isFinite(C)||C<0){b("Weekly token limit must be a non-negative number.");return}A=C}const B=Number(p.trim());if(!Number.isFinite(B)||B<1){b("Activity window must be a whole number of seconds (>= 1).");return}b(null),j(!0);try{const C=await D({...y?{limit_tokens:A}:{},scan_roots:v,activity_window_secs:B});C.data!==null&&(n(C.data),o(!0),setTimeout(()=>o(!1),2e3))}catch(C){b(C instanceof Error?C.message:String(C))}finally{j(!1)}}return e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 14px",fontSize:15},children:"Configuration"}),e.jsx("p",{className:"settings-hint",children:"Estimates your weekly token allowance from recent usage, so the dashboard can forecast when you may reach it."}),e.jsxs("div",{className:"settings-field",children:[e.jsx("button",{type:"button",className:"settings-calibrate-primary-btn",onClick:i,disabled:f,title:"Estimate the weekly token limit from Claude Code's reported usage percentage",children:f?"Calibrating…":s!=null&&s.startsWith("calibrated")?"Re-calibrate from usage":"Calibrate from usage"}),e.jsx("p",{className:"settings-calibrate-desc",children:"Uses Claude Code's reported usage percentage to estimate your weekly limit. Saves the estimate automatically when successful."}),(s==null?void 0:s.startsWith("calibrated"))&&l!==""&&e.jsxs("div",{className:"settings-calibrate-result","aria-label":"Calibration result",children:[Number(l).toLocaleString()," tokens/wk · ",s,(w==="low"||s.includes("LOW CONFIDENCE"))&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"chip bfc-chip-low-confidence",role:"status","aria-label":"LOW CONFIDENCE",children:"LOW CONFIDENCE"}),e.jsx(le,{label:"What LOW CONFIDENCE means",content:"This limit was calibrated from under 10% usage, so the projected cap is a rough guess. Re-calibrate after you've used ~10% of a window for a stable number."})]})]}),P&&e.jsx("output",{className:"settings-hint",style:{display:"block",marginTop:2,fontSize:11,color:"var(--amber, #f59e0b)"},children:"A new weekly window has started — consider re-calibrating."}),e.jsxs("div",{className:"settings-advanced-override",children:[e.jsxs("label",{className:"settings-label",htmlFor:"limit-tokens",children:["Weekly token limit",e.jsx("span",{className:"settings-hint",children:" (blank = forecast OFF)"})]}),e.jsx("span",{className:"settings-hint",style:{marginBottom:4,fontSize:11},children:"Advanced: manual override — use if Calibrate is unavailable or you need a specific value."}),e.jsx("input",{id:"limit-tokens",className:"settings-input",type:"number",min:0,value:l,onChange:v=>{m(v.target.value),N(!0),s!=null&&s.startsWith("calibrated")&&k("manual")},placeholder:"e.g. 10000000000"}),s==="manual"&&e.jsx("div",{className:"settings-hint",style:{marginTop:4,fontSize:11},"aria-label":"Limit provenance",children:"manual override"})]})]}),e.jsxs("div",{className:"settings-field",children:[e.jsxs("label",{className:"settings-label",htmlFor:"scan-roots",children:["Scan roots",e.jsxs("span",{className:"settings-hint",children:[" ","(one absolute path per line; restart the daemon after saving)"]})]}),e.jsx("textarea",{id:"scan-roots",className:"settings-textarea",rows:3,value:r,onChange:v=>d(v.target.value),spellCheck:!1})]}),e.jsxs("div",{className:"settings-field",children:[e.jsx("label",{className:"settings-label",htmlFor:"activity-window",children:"Activity window (seconds)"}),e.jsx("input",{id:"activity-window",className:"settings-input",type:"number",min:1,value:p,onChange:v=>h(v.target.value)})]}),g!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",children:g}),e.jsx("button",{type:"button",className:"settings-save-btn",onClick:T,disabled:x,children:x?"Saving…":_?"Saved":"Save config"})]})}function pe({settings:t,onSaved:n}){const[l,m]=a.useState(!1),[r,d]=a.useState(!1),[p,h]=a.useState(null),[x,j]=a.useState(t.bytes_per_token_provenance),[f,u]=a.useState(t.bytes_per_token),g=t.bytes_per_token_calibration_enabled;async function b(o){h(null),m(!0);try{const s=await D({bytes_per_token_calibration_enabled:o});s.data!==null&&n(s.data)}catch(s){h(s instanceof Error?s.message:String(s))}finally{m(!1)}}async function _(){h(null),d(!0);try{const o=await Q();if(o.data===null){h("Calibration returned no data — try again.");return}if(!o.data.ok){h(o.data.reason);return}u(o.data.ratio),j(o.data.provenance);const s=await U();s.data!==null&&n(s.data)}catch(o){h(o instanceof Error?o.message:String(o))}finally{d(!1)}}return e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 10px",fontSize:15},children:"Bytes→token calibration"}),e.jsx("p",{className:"settings-hint",style:{marginBottom:10},children:"Sends ~150 sampled tool-output snippets to Anthropic’s free token-counter to calibrate cost estimates. The same text your Claude Code session already sent when it ran. Nothing is stored — only the resulting ratio. Off by default."}),e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[e.jsx("input",{type:"checkbox",checked:g,disabled:l,onChange:o=>{b(o.target.checked)}}),e.jsx("span",{children:"Enable opt-in calibration"})]}),g&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"settings-calibrate-primary-btn",onClick:()=>{_()},disabled:r,title:"Sample tool-result output and count tokens via Anthropic count_tokens API",children:r?"Calibrating…":x!==null?"Recalibrate":"Calibrate now"}),f!==null&&x!==null&&e.jsxs("div",{className:"settings-calibrate-result","aria-label":"Bytes-per-token calibration result",style:{marginTop:8},children:[f.toFixed(4)," bytes/token · ",x]})]}),p!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",style:{marginTop:8},children:p})]})}function ge({mappings:t,onSaved:n}){const[l,m]=a.useState(t),[r,d]=a.useState(!1),[p,h]=a.useState(!1),[x,j]=a.useState(null),[f,u]=a.useState(!1),g=a.useRef(null),b=t.map(s=>s.workspace_id).sort().join(" ");a.useEffect(()=>{b!==g.current&&(g.current=b,m(t))},[b,t]);function _(s,k,w){m(c=>c.map((y,N)=>N===s?{...y,[k]:w||null}:y))}async function o(){h(!0),j(null),u(!1);try{const s=await D({workspace_mappings:l.map(k=>({workspace_id:k.workspace_id,repo_path:k.repo_path,repo_canonical:k.repo_canonical}))});s.data!==null&&(n(s.data),u(!0),setTimeout(()=>u(!1),2e3))}catch(s){j(s instanceof Error?s.message:String(s))}finally{h(!1)}}return e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 14px",fontSize:15},children:"Workspace Mappings"}),e.jsx("p",{className:"settings-hint",children:"Maps each session's working directory to a named workspace so spend rolls up per project."}),e.jsxs("label",{children:[e.jsx("input",{type:"checkbox",checked:r,onChange:s=>d(s.target.checked)})," ","Show transient workspaces"]}),e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Workspace"}),e.jsx("th",{children:"Repo path"}),e.jsx("th",{children:"Canonical (owner/repo)"})]})}),e.jsx("tbody",{children:l.map((s,k)=>s.is_transient&&!r?null:e.jsxs("tr",{children:[e.jsxs("td",{style:{color:"var(--soft)"},children:[s.project_slug,s.is_transient&&" (transient)"]}),e.jsx("td",{children:e.jsx("input",{"aria-label":`Repo path for ${s.project_slug}`,className:"settings-table-input",value:s.repo_path??"",onChange:w=>_(k,"repo_path",w.target.value),placeholder:"/absolute/path/to/repo"})}),e.jsxs("td",{children:[e.jsx("input",{"aria-label":`Canonical for ${s.project_slug}`,className:"settings-table-input",value:s.repo_canonical??"",onChange:w=>_(k,"repo_canonical",w.target.value),placeholder:"owner/repo"}),s.repo_canonical===null&&s.mapping_reason!==void 0&&e.jsx("div",{className:"settings-hint",style:{marginTop:4,fontSize:12},role:"note",children:s.mapping_reason})]})]},s.workspace_id))})]})}),x!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",children:x}),e.jsx("button",{type:"button",className:"settings-save-btn",style:{marginTop:12},onClick:o,disabled:p,children:p?"Saving…":f?"Saved":"Save mappings"})]})}function fe({health:t}){const n=t.files_seen===0?0:t.lines_quarantined/t.files_seen,l=n<.01?{kind:"EXACT",label:"Healthy"}:n<=.05?{kind:"LIST_EQUIV_STALE",label:"Warning"}:{kind:"PROXY",label:"Errors"},m=[["Files seen","Files the daemon found while scanning.",t.files_seen],["Files parsed","Files successfully read into aggregate metrics.",t.files_parsed],["Lines quarantined","Lines skipped after a parse problem; raw content is not retained here.",t.lines_quarantined],["Synthetic excluded","Generated fixture data excluded from the health count.",t.synthetic_excluded],["Duplicate drops","Repeated observations ignored to keep aggregates accurate.",t.duplicate_drops]],r=t.parser_version_mix,d=Object.entries(r);return e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsxs("h2",{style:{margin:"0 0 14px",fontSize:15},children:["Parser Health ",e.jsx(ie,{...l})]}),e.jsxs("div",{className:"settings-health-grid",children:[m.map(([p,h,x])=>e.jsxs("div",{className:"settings-health-row",children:[e.jsx("span",{className:"settings-health-label",title:h,children:p}),e.jsx("span",{className:"settings-health-value",children:String(x)}),e.jsx("span",{className:"section-meta",children:h})]},p)),d.length>0&&e.jsxs("div",{className:"settings-health-row",children:[e.jsx("span",{className:"settings-health-label",children:"Parser coverage"}),e.jsxs("span",{className:"settings-health-value",title:`Parser versions: ${d.map(([p,h])=>`${p}: ${h}`).join(", ")}`,children:[d.reduce((p,[,h])=>p+h,0).toLocaleString()," ","parsed files"]})]})]})]})}function xe({rows:t}){return t.length===0?null:e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15},children:"Parse Failures"}),e.jsx("p",{style:{color:"var(--muted)",fontSize:12,margin:"0 0 12px"},children:"Latest 100 first-quarantined pointers"}),e.jsx("ul",{style:{margin:0,paddingLeft:18,fontFamily:"monospace",fontSize:12},children:t.map(n=>e.jsxs("li",{children:[n.file_path,":",n.line_no," · ",n.error_class," · ",n.seen_at]},`${n.file_path}:${n.line_no}:${n.seen_at}`))})]})}function be({reports:t}){return t.length===0?null:e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 14px",fontSize:15},children:"Weekly Reports"}),e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Period start"}),e.jsx("th",{children:"Period end"}),e.jsx("th",{children:"Generated at"}),e.jsx("th",{children:"Download"})]})}),e.jsx("tbody",{children:t.map(n=>e.jsxs("tr",{children:[e.jsx("td",{title:L(n.period_start),children:F(n.period_start)}),e.jsx("td",{title:L(n.period_end),children:F(n.period_end)}),e.jsx("td",{title:L(n.generated_at),children:F(n.generated_at)}),e.jsx("td",{children:e.jsx("a",{download:`${n.report_id}.json`,href:`data:application/json;charset=utf-8,${encodeURIComponent(n.content_json)}`,children:"Download JSON"})})]},n.report_id))})]})})]})}function je(){const[t,n]=a.useState(null);return a.useEffect(()=>{Promise.resolve(G()).then(l=>n(l??null)).catch(()=>n(null))},[]),e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15},children:"Usage reader"}),t===null&&e.jsx("p",{style:{color:"var(--muted)",margin:0},children:"Loading…"}),(t==null?void 0:t.authenticated)&&e.jsxs("p",{style:{margin:0},"aria-label":"oauth reader status",children:["usage reader: authenticated as ",e.jsx("strong",{children:t.tier??"unknown tier"})]}),t!==null&&!t.authenticated&&e.jsxs("p",{style:{margin:0,color:"var(--amber, #f59e0b)"},"aria-label":"oauth reader status",children:["not signed in — ",t.reason??"re-login to Claude Code"]})]})}function ye(){const[t,n]=a.useState(null);return a.useEffect(()=>{Promise.resolve(q()).then(l=>n(l??null)).catch(()=>n(null))},[]),e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15},children:"Outcomes sync"}),e.jsxs("p",{className:"settings-hint",children:["Compares sessions with your git history to distinguish finished work from abandoned work. It is optional and needs the GitHub command-line tool (",e.jsx("code",{children:"gh"}),") available to the daemon plus a read-only GitHub token."]}),t===null&&e.jsx("p",{style:{color:"var(--muted)",margin:0},children:"Loading…"}),(t==null?void 0:t.configured)&&e.jsxs("p",{style:{margin:0},"aria-label":"github token status",children:["GitHub token: configured ",e.jsxs("strong",{children:["(",t.source,")"]})]}),t!==null&&!t.configured&&e.jsx("p",{style:{margin:0,color:"var(--amber, #f59e0b)"},"aria-label":"github token status",children:t.reason??"outcomes sync: no GitHub token — set AW_GITHUB_TOKEN"})]})}function ve(){const[t,n]=a.useState(null),[l,m]=a.useState(!1),[r,d]=a.useState(null),[p,h]=a.useState(null),[x,j]=a.useState(null);a.useEffect(()=>{Promise.resolve(V()).then(c=>{(c==null?void 0:c.data)!=null&&n(c.data)}).catch(()=>{})},[]);const f=(t==null?void 0:t.installed)??!1,u=t===null?null:ue(t),g=he();async function b(c,y){try{await navigator.clipboard.writeText(c),h(y),setTimeout(()=>h(null),2e3)}catch{d("Copy failed — your browser may not support clipboard access.")}}async function _(c){m(!0),d(null),j(null);try{const y=await(c?Z():ee());t!==null&&n({...t,installed:c});const N=c?"Installed":"Uninstalled";j(y.changed?`${N} — wrote ${y.settingsPath}`:c?`Already installed — no change to ${y.settingsPath}`:`Not installed — no change to ${y.settingsPath}`)}catch(y){d(y instanceof Error?y.message:String(y))}finally{m(!1)}}async function o(c,y){if(t===null)return;const N=Number(y);if(Number.isFinite(N))try{const E=await J({[c]:N});E.data!==null&&n({...E.data,installed:t.installed})}catch(E){d(E instanceof Error?E.message:String(E))}}async function s(c,y){const N=Number(y);Number.isFinite(N)&&await o(c,String(N/100))}const k=c=>Math.round(c).toLocaleString("en-US"),w=c=>Math.round(c*100);return e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsxs("div",{className:"fb5-panel-header",children:[e.jsx("h2",{style:{margin:0,fontSize:15},children:"In-session guards"}),t!==null&&e.jsx("span",{className:`fb5-status-pill ${f?"fb5-status-installed":"fb5-status-not-installed"}`,"aria-label":f?"Installed":"Not installed",children:f?"● Installed":"Not installed"})]}),e.jsx("p",{style:{color:"var(--muted)",fontSize:12,margin:"6px 0 14px"},children:"Hooks give Claude Code local reminders about context size, repeated failures, and spend. The direct install also adds a dangerous-command check and a checkpoint before compaction."}),t!==null&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fb5-guard-cards",children:[e.jsxs("div",{className:"fb5-guard-card",children:[e.jsx("div",{className:"fb5-guard-card-title",children:"Context budget"}),e.jsxs("div",{className:"fb5-guard-inputs",children:[e.jsxs("label",{className:"fb5-guard-label",children:["Context window",e.jsx("input",{"aria-label":"Context window (tokens)",className:"settings-input fb5-guard-input",type:"number",min:"1000",step:"1000",value:t.context_window,onChange:c=>void o("context_window",c.target.value)}),"tokens"]}),e.jsxs("label",{className:"fb5-guard-label",children:["Warn at",e.jsx("input",{"aria-label":"Soft threshold percent",className:"settings-input fb5-guard-input",type:"number",min:"1",max:"99",value:w(t.soft_pct),onChange:c=>void s("soft_pct",c.target.value)}),"% of the window (≈ ",k(t.soft_pct*t.context_window)," tokens)"]}),e.jsxs("label",{className:"fb5-guard-label",children:["Urgent at",e.jsx("input",{"aria-label":"Hard threshold percent",className:"settings-input fb5-guard-input",type:"number",min:"1",max:"100",value:w(t.hard_pct),onChange:c=>void s("hard_pct",c.target.value)}),"% of the window (≈ ",k(t.hard_pct*t.context_window)," tokens)"]})]}),e.jsx("p",{className:"fb5-field-hint",style:{marginTop:8},children:"Set the window to 1,000,000 if you run 1M-context models. Both thresholds only warn — a session already past the window is measured against its real size."})]}),e.jsxs("div",{className:"fb5-guard-card",children:[e.jsx("div",{className:"fb5-guard-card-title",children:"Loop guard"}),e.jsx("div",{className:"fb5-guard-inputs",children:e.jsxs("label",{className:"fb5-guard-label",children:["After",e.jsx("input",{"aria-label":"Identical-failure count",className:"settings-input fb5-guard-input",type:"number",min:"1",step:"1",value:t.d7_fail_count,onChange:c=>void o("d7_fail_count",c.target.value)}),"identical failures within",e.jsx("input",{"aria-label":"Loop window (turns)",className:"settings-input fb5-guard-input",type:"number",min:"1",step:"1",value:t.d7_window_turns,onChange:c=>void o("d7_window_turns",c.target.value)}),"turns"]})})]}),e.jsxs("div",{className:"fb5-guard-card",children:[e.jsx("div",{className:"fb5-guard-card-title",children:"Burn alert"}),e.jsx("div",{className:"fb5-guard-inputs",children:e.jsxs("label",{className:"fb5-guard-label",children:["Send 5h/weekly pace and 15%/50% checkpoint alerts after the session has been idle for this many seconds",e.jsx("input",{"aria-label":"Idle cutoff (seconds)",className:"settings-input fb5-guard-input",type:"number",min:"1",step:"1",value:t.d9_idle_seconds,onChange:c=>void o("d9_idle_seconds",c.target.value)}),"s"]})})]})]}),e.jsx("p",{className:"fb5-field-hint",children:"fields: context_window, soft_pct, hard_pct, d7_fail_count, d7_window_turns, d9_idle_seconds"})]}),r!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",children:r}),x!==null&&e.jsx("output",{className:"fb5-field-hint","aria-label":"install status",style:{display:"block"},children:x}),e.jsxs("div",{className:"fb5-actions",children:[e.jsxs("div",{className:"fb5-action-group",children:[e.jsx("button",{type:"button",className:"settings-save-btn",onClick:()=>u!==null&&void b(u,"install"),disabled:t===null,children:p==="install"?"Copied!":"Copy install prompt"}),e.jsx("button",{type:"button",className:"fb5-secondary-btn",onClick:()=>void _(!0),disabled:l||t===null,children:l?"Installing…":"Install directly — writes ~/.claude/settings.json for you"}),e.jsx("p",{className:"settings-hint",style:{margin:"10px 0 6px"},children:"Install prompt — copy this exact text into Claude Code if you prefer to review the change there."}),e.jsx("textarea",{"aria-label":"Install prompt text",className:"settings-textarea",readOnly:!0,rows:8,value:u??"Loading the current hook settings…",style:{minHeight:150,resize:"vertical",border:"1px solid var(--line)",background:"var(--bg)",fontFamily:"monospace",fontSize:12}})]}),e.jsxs("div",{className:"fb5-action-group",children:[e.jsx("button",{type:"button",className:"settings-cancel-btn",onClick:()=>void b(g,"uninstall"),children:p==="uninstall"?"Copied!":"Copy uninstall prompt"}),e.jsx("button",{type:"button",className:"fb5-secondary-btn",onClick:()=>void _(!1),disabled:l,children:l?"Uninstalling…":"Uninstall directly"}),e.jsx("p",{className:"settings-hint",style:{margin:"10px 0 6px"},children:"Uninstall prompt — copy this exact text to remove only AgentWrangler's copied hooks."}),e.jsx("textarea",{"aria-label":"Uninstall prompt text",className:"settings-textarea",readOnly:!0,rows:6,value:g,style:{minHeight:120,resize:"vertical",border:"1px solid var(--line)",background:"var(--bg)",fontFamily:"monospace",fontSize:12}})]})]}),e.jsx("p",{className:"fb5-takes-effect",children:"Takes effect immediately, no restart."})]})}function ke(){const[t,n]=a.useState([]),[l,m]=a.useState(null),[r,d]=a.useState(null),[p,h]=a.useState(null),[x,j]=a.useState(new Set),[f,u]=a.useState(new Set),[g,b]=a.useState(null),[_,o]=a.useState(!1);a.useEffect(()=>{Promise.resolve(K()).then(i=>n((i==null?void 0:i.data)??[])).catch(()=>n([])),Promise.resolve(Y()).then(i=>m((i==null?void 0:i.data)??null)).catch(()=>m(null))},[]);const s=new Set(t.map(i=>i.session_id)),k=new Set(((l==null?void 0:l.agents)??[]).map(i=>i.session_id)),w=(l==null?void 0:l.available)===!0?(l.agents??[]).filter(i=>s.has(i.session_id)&&!f.has(i.session_id)):[],c=(l==null?void 0:l.available)===!0?t.filter(i=>!k.has(i.session_id)).length+f.size:0,y=w.filter(i=>i.pid!==null);async function N(i){if(i.pid===null)return;const T=i.pid;j(S=>new Set(S).add(T)),b(null);try{await te(T),u(S=>new Set(S).add(i.session_id))}catch(S){b(S instanceof Error?S.message:String(S))}finally{j(S=>{const v=new Set(S);return v.delete(T),v})}}async function E(i){b(null);for(const T of i)await N(T)}async function P(){try{await navigator.clipboard.writeText("claude agents"),o(!0),setTimeout(()=>o(!1),2e3)}catch{}}return e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15},children:"Idle background sessions"}),e.jsx("p",{style:{color:"var(--muted)",fontSize:12,margin:"0 0 12px"},children:"Idle sessions use no tokens until they resume. A resumed session may need to rewrite expired saved context. End only sessions you no longer need."}),l!==null&&!l.available&&e.jsx("output",{className:"banner banner-warning",style:{marginBottom:12},children:l.reason??"liveness unknown"}),(l===null||!l.available)&&t.length>0&&e.jsx("ul",{style:{margin:0,paddingLeft:18,fontFamily:"monospace",fontSize:12},children:t.map(i=>e.jsxs("li",{children:[e.jsx("a",{href:`#/sessions/${i.session_id}`,children:i.session_id})," ·"," ",Math.floor(i.idle_seconds/60)," idle min ·"," ",i.cap_weighted_tokens.toLocaleString()," cap-weighted tokens"]},i.session_id))}),(l===null||!l.available)&&t.length===0&&e.jsx("p",{style:{color:"var(--muted)",margin:0},children:"No idle background sessions found."}),(l==null?void 0:l.available)===!0&&e.jsxs(e.Fragment,{children:[w.length>0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Session"}),e.jsx("th",{children:"Workspace"}),e.jsx("th",{children:"Kind"}),e.jsx("th",{children:"Status"}),e.jsx("th",{children:"Idle min"}),e.jsx("th",{title:"Tokens currently held in the session context",children:"Context held (tokens)"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:w.map(i=>e.jsxs("tr",{children:[e.jsx("td",{style:{fontFamily:"monospace",fontSize:12},children:e.jsx("a",{href:`#/sessions/${i.session_id}`,children:i.session_id})}),e.jsx("td",{style:{color:"var(--soft)",fontSize:12},children:i.workspace_id??$(i.cwd)??"—"}),e.jsx("td",{style:{fontSize:12},children:i.kind}),e.jsx("td",{style:{fontSize:12},children:i.status}),e.jsx("td",{style:{fontSize:12},children:Math.floor(i.idle_seconds/60)}),e.jsx("td",{style:{fontSize:12},children:i.cap_weighted_context_held.toLocaleString()}),e.jsx("td",{children:i.pid!==null?e.jsx("button",{type:"button",className:"fb6-end-btn",disabled:x.has(i.pid),onClick:()=>d(i),children:x.has(i.pid)?"Ending…":"End session"}):e.jsxs("span",{className:"fb6-bg-cta",children:["Manage in terminal: ",e.jsx("code",{className:"fb6-code",children:"claude agents"}),e.jsx("button",{type:"button",className:"fb6-copy-btn",onClick:()=>void P(),children:_?"Copied":"Copy"})]})})]},i.session_id))})]})}),y.length>0&&e.jsx("button",{type:"button",className:"fb6-bulk-end-btn",style:{marginTop:10},onClick:()=>h(y),children:"End all idle interactive sessions"})]}):e.jsx("p",{style:{color:"var(--muted)",margin:0},children:"No live idle sessions found."}),c>0&&e.jsxs("p",{className:"fb6-ended-line",children:[c," past ",c===1?"session":"sessions"," ended — closed sessions cost nothing."]})]}),g!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",style:{marginTop:8},children:g}),r!==null&&e.jsx("div",{className:"settings-modal-backdrop",children:e.jsxs(W,{labelledBy:"end-session-title",onCancel:()=>d(null),children:[e.jsx("h3",{id:"end-session-title",style:{margin:"0 0 10px"},children:"End session?"}),e.jsxs("p",{style:{color:"var(--soft)",fontSize:13,margin:"0 0 8px"},children:[e.jsx("strong",{children:"Session:"})," ",r.name||r.session_id]}),e.jsxs("p",{style:{color:"var(--soft)",fontSize:13,margin:"0 0 8px"},children:[e.jsx("strong",{children:"Process ID (PID):"})," ",r.pid]}),e.jsxs("p",{style:{color:"var(--soft)",fontSize:13,margin:"0 0 14px"},children:[e.jsx("strong",{children:"Working dir:"})," ",e.jsx("code",{style:{fontFamily:"monospace"},children:r.cwd})]}),e.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"flex-end"},children:[e.jsx("button",{type:"button",className:"settings-cancel-btn",onClick:()=>d(null),children:"Cancel"}),e.jsx("button",{type:"button",className:"settings-reset-confirm-btn",onClick:()=>{if(r===null)return;const i=r;d(null),N(i)},children:"Confirm End"})]})]})}),p!==null&&e.jsx("div",{className:"settings-modal-backdrop",children:e.jsxs(W,{labelledBy:"bulk-end-title",onCancel:()=>h(null),children:[e.jsx("h3",{id:"bulk-end-title",style:{margin:"0 0 10px"},children:"End all idle interactive sessions?"}),e.jsx("ul",{style:{margin:"0 0 14px",paddingLeft:18,fontSize:13},children:p.map(i=>e.jsxs("li",{style:{color:"var(--soft)",marginBottom:4},children:["Process ID (PID) ",i.pid," —"," ",e.jsx("code",{style:{fontFamily:"monospace"},children:i.cwd})]},i.session_id))}),e.jsxs("div",{style:{display:"flex",gap:10,justifyContent:"flex-end"},children:[e.jsx("button",{type:"button",className:"settings-cancel-btn",onClick:()=>h(null),children:"Cancel"}),e.jsx("button",{type:"button",className:"settings-reset-confirm-btn",onClick:()=>{if(p===null)return;const i=p;h(null),E(i)},children:"Confirm End All"})]})]})})]})}function _e({dbPath:t,onReset:n}){const[l,m]=a.useState(!1),[r,d]=a.useState(""),[p,h]=a.useState(!1),[x,j]=a.useState(null),f=a.useRef(null),u=$(t),g=r===u;function b(){d(""),j(null),m(!0),setTimeout(()=>{var s;return(s=f.current)==null?void 0:s.focus()},50)}function _(){m(!1),d(""),j(null)}async function o(){if(g){h(!0),j(null);try{const s=await se();s.data!==null&&(n(s.data),m(!1))}catch(s){j(s instanceof Error?s.message:String(s))}finally{h(!1)}}}return e.jsxs("div",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 6px",fontSize:15,color:"var(--red)"},children:"Reset Database"}),e.jsx("p",{style:{color:"var(--muted)",fontSize:12,margin:"0 0 12px"},children:"Permanently deletes all ingested session, turn, and workspace data. Config and schema are preserved. This cannot be undone."}),e.jsx("button",{type:"button",className:"settings-reset-btn",onClick:b,children:"Reset database…"}),l&&e.jsx("div",{className:"settings-modal-backdrop",children:e.jsxs(W,{labelledBy:"reset-modal-title",onCancel:()=>{p||_()},children:[e.jsx("h3",{id:"reset-modal-title",style:{margin:"0 0 10px",color:"var(--red)"},children:"Confirm reset"}),e.jsxs("p",{style:{color:"var(--soft)",fontSize:13,margin:"0 0 14px"},children:["Type ",e.jsx("strong",{style:{color:"var(--text)"},children:u})," to confirm. All ingested data will be permanently deleted."]}),e.jsx("input",{ref:f,"aria-label":"Type the database name to confirm reset",className:"settings-input",value:r,onChange:s=>d(s.target.value),placeholder:u,autoComplete:"off"}),x!==null&&e.jsx("div",{className:"settings-inline-error",role:"alert",style:{marginTop:8},children:x}),e.jsxs("div",{style:{display:"flex",gap:10,marginTop:14,justifyContent:"flex-end"},children:[e.jsx("button",{type:"button",className:"settings-cancel-btn",onClick:_,disabled:p,children:"Cancel"}),e.jsx("button",{type:"button",className:"settings-reset-confirm-btn",onClick:o,disabled:!g||p,"aria-disabled":!g,children:p?"Resetting…":"Reset database"})]})]})})]})}function we(){return e.jsxs("section",{className:"settings-onboarding-card","aria-labelledby":"getting-started-title",children:[e.jsx("h2",{id:"getting-started-title",children:"Getting started"}),e.jsx("p",{children:"Follow your first-run progress and next steps on Overview."})]})}const Ne=[["Configuration","configuration"],["Workspaces","workspaces"],["In-session guards","in-session-guards"],["Idle sessions","idle-sessions"],["Outcomes sync","outcomes-sync"],["Advanced","advanced"]];function Ie(){const t=ne(),[n,l]=a.useState({status:"loading"}),[m,r]=a.useState([]),[d,p]=a.useState(!1),h=a.useRef(null),x=a.useCallback(()=>{l({status:"loading"}),U().then(u=>l({status:"ok",value:u})).catch(u=>l({status:"error",message:String(u)})),Promise.resolve(H()).then(u=>r(u??[])).catch(()=>r([]))},[]);a.useEffect(()=>{x()},[x]);function j(u){l(g=>g.status==="ok"?{status:"ok",value:{...g.value,data:u}}:g)}const f=n.status==="ok"?n.value.data:null;return a.useEffect(()=>{if(n.status!=="ok")return;const u=()=>{var s,k;const g=new URLSearchParams(window.location.hash.split("?")[1]??"").get("section"),_=g===null?void 0:{configuration:"settings-configuration","scan-roots":"scan-roots",calibration:"limit-tokens",workspaces:"settings-workspaces","outcomes-sync":"settings-outcomes-sync","in-session-guards":"settings-in-session-guards","idle-sessions":"settings-idle-sessions",advanced:"settings-advanced","parser-health":"settings-parser-health"}[g];if(_===void 0)return;(g==="advanced"||g==="parser-health")&&((s=h.current)==null||s.setAttribute("open",""),p(!0));const o=document.getElementById(_);(k=o==null?void 0:o.scrollIntoView)==null||k.call(o,{block:"start"}),o==null||o.focus({preventScroll:!0})};return u(),window.addEventListener("hashchange",u),()=>window.removeEventListener("hashchange",u)},[n.status]),e.jsxs("div",{children:[e.jsx("div",{className:"page-top",children:e.jsxs("div",{className:"page-title",children:[e.jsx("h1",{children:"Settings"}),e.jsx("p",{className:"page-sub",children:"Usage limits, monitored folders, session warnings, and diagnostics"})]})}),n.status==="loading"&&e.jsxs("div",{"aria-busy":"true","aria-label":"Loading settings",children:[e.jsx("div",{className:"settings-skeleton"}),e.jsx("div",{className:"settings-skeleton"}),e.jsx("div",{className:"settings-skeleton"})]}),n.status==="error"&&e.jsxs("div",{className:"banner banner-error",role:"alert","aria-live":"assertive",children:[e.jsxs("span",{children:["⚠ Failed to load settings — ",n.message]}),e.jsx("button",{type:"button",className:"banner-retry",onClick:x,children:"Retry"})]}),f!==null&&e.jsxs(e.Fragment,{children:[e.jsx("nav",{"aria-label":"Settings sections",style:{display:"flex",flexWrap:"wrap",gap:8,marginBottom:14},children:Ne.map(([u,g])=>e.jsx("a",{className:"settings-cancel-btn",href:`#/settings?section=${g}`,style:{textDecoration:"none"},children:u},g))}),e.jsxs("div",{style:{color:"var(--muted)",fontSize:11,marginBottom:14,fontFamily:"monospace"},children:["Local database: ",f.db_path," · port ",f.port]}),(f.scan_roots.length===0||f.parser_health.files_seen===0)&&e.jsx(we,{}),e.jsxs("div",{id:"settings-configuration",tabIndex:-1,children:[e.jsx(me,{settings:f,onSaved:j}),e.jsx(pe,{settings:f,onSaved:j}),e.jsx(je,{})]}),e.jsx("div",{id:"settings-outcomes-sync",tabIndex:-1,children:e.jsx(ye,{})}),e.jsx("div",{id:"settings-in-session-guards",tabIndex:-1,children:e.jsx(ve,{})}),e.jsx("div",{id:"settings-idle-sessions",tabIndex:-1,children:e.jsx(ke,{})}),e.jsx("div",{id:"settings-workspaces",tabIndex:-1,children:e.jsx(ge,{mappings:f.workspace_mappings,onSaved:j})}),e.jsx("div",{id:"settings-advanced",tabIndex:-1,children:e.jsxs("details",{ref:h,open:d,onToggle:u=>p(u.currentTarget.open),children:[e.jsx("summary",{children:"Advanced and diagnostics"}),e.jsx("p",{className:"settings-hint",style:{marginTop:10},children:"Use these details to troubleshoot local ingestion or enable features still being evaluated."}),e.jsxs("section",{className:"card",style:{padding:"18px 20px",marginBottom:16},children:[e.jsx("h2",{style:{margin:"0 0 14px",fontSize:15},children:"Experimental actions"}),e.jsx("p",{className:"settings-hint",children:"Turns on methods still under validation; their numbers show an EXP chip and should be read as directional."}),e.jsxs("label",{children:[e.jsx("input",{type:"checkbox",checked:t,onChange:u=>ae(u.target.checked)})," ","Experimental actions"]}),e.jsx("p",{children:"Off by default. When on, shows the experimental Apply/dry-run controls on recommendation cards. Tracking requires a completed action; Dismiss remains available."})]}),e.jsxs("div",{id:"settings-parser-health",tabIndex:-1,children:[e.jsx(fe,{health:f.parser_health}),e.jsx(xe,{rows:f.quarantine_rows})]}),e.jsx(de,{}),e.jsx(be,{reports:m}),e.jsx(_e,{dbPath:f.db_path,onReset:j})]})})]})]})}export{Ie as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,r as a}from"./index-hbaLYHUX.js";const r=220;function c(){const[t,n]=a.useState(()=>typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches);return a.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const s=window.matchMedia("(prefers-reduced-motion: reduce)"),i=()=>n(s.matches);return i(),s.addEventListener("change",i),()=>s.removeEventListener("change",i)},[]),t}function l(){return e.jsxs("div",{className:"kpi skeleton-kpi","aria-busy":"true","aria-label":"Loading",children:[e.jsx("div",{className:"skeleton skeleton-line",style:{width:"50%"},"aria-hidden":"true"}),e.jsx("div",{className:"skeleton skeleton-value","aria-hidden":"true"}),e.jsx("div",{className:"skeleton skeleton-line",style:{width:"70%"},"aria-hidden":"true"}),e.jsx("div",{className:"chips",children:e.jsx("span",{className:"skeleton skeleton-chip","aria-hidden":"true"})})]})}function u({cols:t}){return e.jsx("tr",{"aria-hidden":"true",children:Array.from({length:t}).map((n,s)=>e.jsx("td",{children:e.jsx("span",{className:"skeleton skeleton-line",style:{width:"60%"}})},s))})}function o({height:t=48,className:n=""}){return e.jsx("div",{className:`skeleton skeleton-block${n?` ${n}`:""}`,style:{width:"100%",height:t,borderRadius:8,display:"block"},"aria-hidden":"true"})}function h({height:t=r}){return e.jsx(o,{height:t,className:"skeleton-chart"})}export{l as S,o as a,u as b,h as c,c as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as i}from"./index-hbaLYHUX.js";import{C as n}from"./Chip-EizRm13x.js";function h(t){return`${t.slice(0,8)}…`}function l({percentile:t,n:o,windowDays:e=90}){if(t==null)return null;const s=Math.round(t*100),a=Math.min(99,Math.max(1,100-s));return i.jsx(n,{kind:"EXACT",label:`top ${a}% by estimated value`,title:`This session has estimated value at or above ${s}% of your ${o} sessions in this workspace over the past ${e} days.`})}export{l as S,h as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as p,T as q,j as e}from"./index-hbaLYHUX.js";import{w as $}from"./workspace-label-CysPJNc0.js";import{C as X}from"./Chip-EizRm13x.js";import{u as Y,c as z}from"./Skeleton-DjuxPm_D.js";import{g as s,C as h,s as j}from"./chart-theme-DnpNuyRt.js";import{a4 as A,a5 as H,R as w,C as f,X as x,Y as k,T as g}from"./CartesianChart-CRV6h2et.js";import{B as S,a as C}from"./BarChart-BC-ciS9d.js";import{L as P}from"./Legend-BCXsSaEM.js";import{S as F,R as G}from"./Scatter-DpIZt_y5.js";import{L as D}from"./Line-2rUzs15v.js";import"./graphicalItemSelectors-CFhpQjLz.js";var Q=["axis"],V=p.forwardRef((t,i)=>p.createElement(A,{chartName:"LineChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:Q,tooltipPayloadSearcher:H,categoricalChartProps:t,ref:i})),J=["item"],Z=p.forwardRef((t,i)=>p.createElement(A,{chartName:"ScatterChart",defaultTooltipEventType:"item",validateTooltipEventTypes:J,tooltipPayloadSearcher:H,categoricalChartProps:t,ref:i}));function M(t){const i=t/1e6;return i>=1?`$${i.toFixed(2)}`:i>=.01?`$${i.toFixed(3)}`:`$${i.toFixed(4)}`}function B(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:String(Math.round(t))}function E(t){return`${(t*100).toFixed(1)}%`}const R=8;function fe(t){return t<=R?0:Math.ceil(t/R)-1}function y(t){return j[t%j.length]??j[0]}function ee(t){const i=[],n=new Map;for(const r of t.by_workspace)i.includes(r.workspace_id)||(i.push(r.workspace_id),n.set(r.workspace_id,r.project_slug));const o=new Map;for(const r of t.by_workspace){const c=o.get(r.bucket)??{bucket:r.bucket};c[r.workspace_id]=r.cost_equiv_u/1e6,o.set(r.bucket,c)}for(const r of t.adoption_markers)o.has(r.bucket)||o.set(r.bucket,{bucket:r.bucket});for(const r of o.values())for(const c of i)r[c]===void 0&&(r[c]=0);return{rows:Array.from(o.values()).sort((r,c)=>String(r.bucket).localeCompare(String(c.bucket))),workspaceIds:i,labelMap:n}}function I(t,i,n){const o=[...t],l=new Set(o.map(r=>r.bucket));for(const r of i.adoption_markers)l.has(r.bucket)||(o.push(n(r.bucket)),l.add(r.bucket));return o.sort((r,c)=>r.bucket.localeCompare(c.bucket))}function _(t){return String(t).padStart(2,"0")}function te(t,i){const n=new Date(t);if(i==="month")return t.slice(0,7);if(i==="day")return`${n.getFullYear()}-${_(n.getMonth()+1)}-${_(n.getDate())}`;const o=n.getUTCFullYear(),l=Date.UTC(o,0,1),r=Math.floor((Date.UTC(o,n.getUTCMonth(),n.getUTCDate())-l)/864e5),d=(7-(new Date(l).getUTCDay()+6)%7)%7,m=r<d?0:1+Math.floor((r-d)/7);return`${o}-${_(m)}`}function ae(t){return[...t.sessions].sort((i,n)=>i.first_turn_at.localeCompare(n.first_turn_at)||i.session_id.localeCompare(n.session_id)).map(i=>({x:te(i.first_turn_at,t.bucket),y:i.cost_equiv_u/1e6,name:i.project_slug}))}function O(t){const i=t.trim()||"Recommendation adopted";return i.length<=36?i:`${i.slice(0,33)}...`}function v(t){return(t.adoption_markers??[]).map(i=>e.jsx(G,{x:i.bucket,ifOverflow:"extendDomain",stroke:"var(--amber, #f59e0b)",strokeDasharray:"4 3",label:{value:O(i.lever),position:"insideTopRight",fill:"var(--amber, #f59e0b)",fontSize:10}},`${i.rec_id}-${i.adopted_at}`))}function K({state:t,isAnimationActive:i}){if(t.status==="loading")return e.jsxs("div",{"aria-busy":"true","aria-label":"Loading headroom trend",style:{marginTop:20},children:[e.jsx("p",{className:"kpi-fn",children:"Headroom vs cap over time"}),e.jsx(z,{height:210})]});if(t.status==="error")return e.jsx("div",{className:"banner banner-error",role:"alert",style:{marginTop:20},children:e.jsxs("span",{children:["Headroom trend unavailable - ",t.message]})});if(t.status!=="ok"||t.value.data===null)return null;const n=t.value.data;return n.state==="NO_LIMIT"?e.jsx("div",{className:"banner banner-info","data-testid":"headroom-no-limit",style:{marginTop:20},children:e.jsx("span",{children:"Headroom trend is off - calibrate first in Settings."})}):n.points.length===0?e.jsx("div",{className:"banner banner-info",style:{marginTop:20},children:e.jsx("span",{children:"No headroom data in this window."})}):e.jsxs("div",{"data-testid":"headroom-trend-panel",style:{marginTop:20},children:[e.jsxs("p",{className:"kpi-fn",style:{marginBottom:4},children:["Headroom vs cap per ",n.bucket," - percent-native"]}),e.jsxs("div",{className:"kpi-fn",style:{marginBottom:4,opacity:.85},children:[e.jsx("span",{style:{color:"var(--teal, #2dd4bf)",marginRight:16},children:"0.1x headline - unverified cap coefficient"}),e.jsx("span",{style:{color:"var(--amber, #f59e0b)"},children:"1.0x upper-bound - unverified cap coefficient"})]}),e.jsx("p",{className:"kpi-fn",style:{marginBottom:8,opacity:.75},children:"Percent-native headroom has no absolute-cap denominator; negative values mean the limit was exceeded."}),e.jsx(w,{width:"100%",height:210,children:e.jsxs(V,{data:n.points,margin:{top:4,right:16,left:0,bottom:4},children:[e.jsx(f,{...s.grid}),e.jsx(x,{dataKey:"bucket",interval:"preserveStartEnd",axisLine:s.axisLine,tickLine:s.tickLine,tickCount:s.tickCount,tick:{fontSize:11}}),e.jsx(k,{axisLine:s.axisLine,tickLine:s.tickLine,tickFormatter:o=>E(o),tick:{fontSize:11},width:60}),e.jsx(g,{content:e.jsx(h,{valueFormatter:o=>typeof o=="number"?E(o):String(o??"N/A")})}),e.jsx(P,{}),e.jsx(D,{type:"monotone",dataKey:"headroom_headline",name:"0.1x headline",stroke:j[0],strokeWidth:2,dot:{r:3},isAnimationActive:i}),e.jsx(D,{type:"monotone",dataKey:"headroom_upper",name:"1.0x upper-bound",stroke:j[1],strokeWidth:2,dot:{r:3},isAnimationActive:i})]})})]})}function xe({state:t}){const[i,n]=p.useState({status:"idle"}),o=Y(),[l,r]=p.useState(!0),c=!o&&l;return p.useEffect(()=>{t.status==="ok"&&t.value.data!==null&&r(!1)},[t]),p.useEffect(()=>{if(t.status!=="ok"||t.value.data===null){n({status:"idle"});return}let d=!1;n(u=>u.status==="ok"?u:{status:"loading"});const{from:m,to:b}=t.value.meta.window;return q({from:m,to:b},t.value.data.bucket).then(u=>{d||n({status:"ok",value:u})}).catch(u=>{d||n({status:"error",message:String(u)})}),()=>{d=!0}},[t]),e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsx("h2",{children:"Spend Over Time"}),e.jsx("div",{className:"chips",children:e.jsx(X,{kind:"LIST_EQUIV"})})]}),t.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading trend data",children:e.jsx(z,{})}),t.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Trend data unavailable — ",t.message]})}),t.status==="ok"&&t.value.data!==null&&e.jsx(ie,{data:t.value.data,headroomState:i,isAnimationActive:c}),t.status==="ok"&&t.value.data===null&&e.jsx("div",{className:"banner banner-info",children:e.jsx("span",{children:"No spend data in this window."})})]})}function ie({data:t,headroomState:i,isAnimationActive:n}){const{rows:o,workspaceIds:l,labelMap:r}=ee(t),c=ae(t),d=t.adoption_markers.map(a=>({x:a.bucket,y:0,name:""}));new Set(c.map(a=>a.x)).size;const m=l.length===0,b=m?I(t.buckets.map(a=>({bucket:a.bucket,cost:a.cost_equiv_u/1e6})),t,a=>({bucket:a,cost:0})):[],L=I(t.cap_weighted,t,a=>({bucket:a,cap_weighted_tokens:0,turns:0})),u=o.length>0||b.length>0,T=c.length>0||d.length>0,U=L.length>0,N=i.status!=="idle";return!u&&!T?e.jsxs("div",{children:[e.jsx("div",{className:"banner banner-info",children:e.jsx("span",{children:"No spend data in this window."})}),N&&e.jsx(K,{state:i,isAnimationActive:n})]}):e.jsxs("div",{children:[t.adoption_markers.length>0&&e.jsx("div",{className:"kpi-fn","aria-label":"Adoption markers",style:{marginBottom:8},children:t.adoption_markers.map(a=>e.jsxs("span",{style:{marginRight:12,color:"var(--amber, #f59e0b)"},children:[e.jsx("span",{title:a.lever.trim()||"Recommendation adopted",style:{display:"inline-block",maxWidth:"36ch",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",verticalAlign:"bottom"},children:O(a.lever)})," ","· ",a.bucket]},a.rec_id))}),u&&e.jsxs("div",{style:{marginBottom:20},children:[e.jsxs("p",{className:"kpi-fn",style:{marginBottom:8},children:["Spend by ",t.bucket," · stacked by workspace"]}),e.jsx(w,{width:"100%",height:220,children:m?e.jsxs(S,{data:b,margin:{top:4,right:16,left:0,bottom:4},children:[e.jsx(f,{...s.grid}),e.jsx(x,{dataKey:"bucket",interval:"preserveStartEnd",axisLine:s.axisLine,tickLine:s.tickLine,tickCount:s.tickCount,tick:{fontSize:11}}),v(t),e.jsx(k,{tickFormatter:a=>`$${a.toFixed(2)}`,axisLine:s.axisLine,tickLine:s.tickLine,tick:{fontSize:11},width:60}),e.jsx(g,{content:e.jsx(h,{valueFormatter:a=>typeof a=="number"?M(a*1e6):String(a??"N/A")})}),e.jsx(C,{dataKey:"cost",name:"Spend",fill:y(0),isAnimationActive:n})]}):e.jsxs(S,{data:o,margin:{top:4,right:16,left:0,bottom:4},children:[e.jsx(f,{...s.grid}),e.jsx(x,{dataKey:"bucket",interval:"preserveStartEnd",axisLine:s.axisLine,tickLine:s.tickLine,tickCount:s.tickCount,tick:{fontSize:11}}),v(t),e.jsx(k,{tickFormatter:a=>`$${a.toFixed(2)}`,axisLine:s.axisLine,tickLine:s.tickLine,tick:{fontSize:11},width:60}),e.jsx(g,{content:e.jsx(h,{valueFormatter:a=>typeof a=="number"?`$${a.toFixed(4)}`:String(a??"N/A")})}),e.jsx(P,{formatter:a=>$({workspace_id:a,repo_path:r.get(a)??null})}),l.map((a,W)=>e.jsx(C,{dataKey:a,stackId:"a",fill:y(W),name:$({workspace_id:a,repo_path:r.get(a)??null}),isAnimationActive:n},a))]})})]}),T&&e.jsxs("div",{children:[e.jsx("p",{className:"kpi-fn",style:{marginBottom:8},children:"Session cost over time · each dot = one reconciled session"}),e.jsx(w,{width:"100%",height:180,children:e.jsxs(Z,{margin:{top:4,right:16,left:0,bottom:4},children:[e.jsx(f,{...s.grid}),e.jsx(x,{dataKey:"x",type:"category",allowDuplicatedCategory:!1,interval:"preserveStartEnd",axisLine:s.axisLine,tickLine:s.tickLine,tickCount:s.tickCount,tickFormatter:a=>a.slice(5),tick:{fontSize:11},name:"Date"}),v(t),e.jsx(k,{dataKey:"y",type:"number",tickFormatter:a=>`$${a.toFixed(3)}`,axisLine:s.axisLine,tickLine:s.tickLine,tick:{fontSize:11},width:60,name:"Cost"}),e.jsx(g,{cursor:{strokeDasharray:"3 3"},content:e.jsx(h,{valueFormatter:a=>typeof a=="number"?M(a*1e6):String(a??"N/A")})}),e.jsx(F,{data:c,fill:y(0),name:"Session cost",isAnimationActive:n}),e.jsx(F,{data:d,fillOpacity:0,strokeOpacity:0,isAnimationActive:!1,legendType:"none",name:"Adoption marker domain"})]})})]}),U&&e.jsxs("div",{style:{marginTop:20},children:[e.jsxs("p",{className:"kpi-fn",style:{marginBottom:4},children:["Cap-weighted tokens per ",t.bucket," · estimated cap draw"]}),e.jsx("p",{className:"kpi-fn",style:{marginBottom:8,opacity:.75},children:`Cap-weighted (COEFF=${t.cap_read_coeff}× cache reads) — unverified: Anthropic has not published a cap coefficient.`}),e.jsx(w,{width:"100%",height:200,children:e.jsxs(S,{data:L,margin:{top:4,right:16,left:0,bottom:4},children:[e.jsx(f,{...s.grid}),e.jsx(x,{dataKey:"bucket",interval:"preserveStartEnd",axisLine:s.axisLine,tickLine:s.tickLine,tickCount:s.tickCount,tick:{fontSize:11}}),v(t),e.jsx(k,{axisLine:s.axisLine,tickLine:s.tickLine,tickFormatter:B,tick:{fontSize:11},width:60}),e.jsx(g,{content:e.jsx(h,{valueFormatter:a=>typeof a=="number"?B(a):String(a??"N/A")})}),e.jsx(C,{dataKey:"cap_weighted_tokens",name:"Cap-weighted tokens",fill:y(2),isAnimationActive:n})]})})]}),N&&e.jsx(K,{state:i,isAnimationActive:n})]})}export{ae as buildSessionScatterData,xe as default,O as markerLabel,fe as xAxisInterval};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,r as m,a as M,O as B,P as F,Q as W,R as A,S as z}from"./index-hbaLYHUX.js";import{w as V}from"./workspace-label-CysPJNc0.js";import{C as l}from"./Chip-EizRm13x.js";import{E as T}from"./EmptyState-9kcoimjj.js";import{I as b}from"./InfoTip-CmcYFNQt.js";import{S as f,a as g}from"./Skeleton-DjuxPm_D.js";function $(s){return new Intl.NumberFormat("en-US",{maximumFractionDigits:0}).format(s)}function Q({data:s}){var n;if(s===null||s.observed_turns===0||s.inventory_rows===0)return e.jsxs("section",{className:"card","aria-label":"Context composition",children:[e.jsx("h2",{children:"Context composition"}),e.jsx("p",{className:"muted",children:(s==null?void 0:s.observed_turns)===0?"No turns were observed for this workspace in the last 7 days.":"This workspace has not yet been scanned for CLAUDE.md or memory files."})]});const c=((n=s.rows.find(o=>o.key==="session_residual"))==null?void 0:n.share)??0;return e.jsxs("section",{className:"card","aria-label":"Context composition",children:[e.jsx("h2",{children:"Context composition"}),e.jsxs("p",{className:"muted",children:["Average context sent with each turn: ",$(s.observed_context_tokens??0)," tokens (last 7 days)."]}),s.rows.map(o=>e.jsxs("div",{style:{marginTop:"0.75rem"},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",gap:"1rem"},children:[e.jsx("span",{children:o.key==="always_loaded"?"CLAUDE.md and memory files":"Session history and tools"}),e.jsxs("span",{children:[$(o.tokens)," tokens",o.share===null?"":` (${Math.round(o.share*100)}%)`]})]}),e.jsx("div",{className:"context-composition-bar","aria-hidden":"true",children:e.jsx("div",{className:`context-composition-segment context-composition-segment-${o.key}`,style:{width:`${Math.round((o.share??0)*100)}%`},children:(o.share??0)>.2&&`${Math.round((o.share??0)*100)}%`})})]},o.key)),c>.7&&e.jsx("p",{className:"context-composition-interpretation",children:"Session history is >70% of context — use /clear more often at task boundaries to reset accumulated conversation and reduce per-turn cost."}),e.jsx("p",{className:"muted",style:{marginTop:"0.75rem"},children:"v1 attribution uses estimated current CLAUDE.md and MEMORY token counts only (±5–10% tokenizer error). It excludes the system prompt and dynamic MCP schemas. Session history, tool outputs, and unattributed fixed overhead remain combined in the residual."})]})}function U(s){return s===null?"—":`${(s*100).toFixed(1)}%`}function X(s){return s===null?"—":`${s.toFixed(0)}%`}function G(s){return s==null?"—":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(s)}function Y({rows:s,workspaceSpendById:c}){return e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsx("h2",{children:"Workspace outcomes"}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"EXPERIMENTAL"})})]}),s===null||s.length===0?e.jsx("div",{className:"banner banner-info",children:e.jsx("span",{children:"No linked work items. Map a repository in Settings and configure a GitHub token to enable outcome linkage."})}):e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Workspace"}),e.jsx("th",{children:"Est. value / turn"}),e.jsx("th",{title:"100 minus premium-model (Opus/Fable) share across non-sidechain, non-provisional turns",children:"Standard-model share"}),e.jsx("th",{children:"Pull requests"}),e.jsx("th",{children:"Open"}),e.jsx("th",{children:"Successful outcome"}),e.jsx("th",{children:"Needs follow-up"}),e.jsx("th",{children:"Successful-outcome signal"}),e.jsx("th",{title:"Completed sessions with at least one Bash tool event are eligible.",children:"Eligible sessions linked"})]})}),e.jsx("tbody",{children:s.map(n=>e.jsxs("tr",{children:[e.jsx("td",{children:n.project_slug}),e.jsx("td",{children:G(c==null?void 0:c.get(n.workspace_id))}),e.jsx("td",{children:X(n.adherence_score)}),e.jsx("td",{children:n.total_n}),e.jsx("td",{children:n.in_progress_n}),e.jsx("td",{children:n.success_n}),e.jsx("td",{children:n.failure_n}),e.jsx("td",{children:U(n.success_rate)}),e.jsx("td",{children:U(n.linkage_rate)})]},n.workspace_id))})]})})]})}function x(s){return`$${(s/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function K(s){return s===null?"—":`$${s.toFixed(3)}`}function H(s){return s==null?"—":s>=1e3?`${Math.round(s/1e3)}k`:`${Math.round(s)}`}function J(s){if(s===null)return"—";try{return new Date(s).toLocaleString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return s}}function re({workspaceId:s,onBack:c}){var E,L,R;const[n,o]=m.useState({status:"loading"}),[d,N]=m.useState({status:"loading"}),[p,S]=m.useState({status:"loading"}),[u,w]=m.useState({status:"loading"}),[j,C]=m.useState({status:"loading"}),[h,P]=m.useState({status:"loading"});m.useEffect(()=>{M({preset:"7d"}).then(t=>o({status:"ok",value:t})).catch(t=>o({status:"error",message:String(t)})),B(s,{preset:"7d"}).then(t=>N({status:"ok",value:t})).catch(t=>N({status:"error",message:String(t)})),F(s).then(t=>S({status:"ok",value:t})).catch(t=>S({status:"error",message:String(t)})),W().then(t=>w({status:"ok",value:t})).catch(t=>w({status:"error",message:String(t)})),A(s).then(t=>C({status:"ok",value:t})).catch(t=>C({status:"error",message:String(t)})),z({preset:"7d"},s).then(t=>P({status:"ok",value:t})).catch(t=>P({status:"error",message:String(t)}))},[s]);const a=(n.status==="ok"?((E=n.value.data)==null?void 0:E.items)??[]:[]).find(t=>t.workspace_id===s),q=a?V({workspace_id:a.workspace_id,repo_owner:a.repo_owner??null,repo_name:a.repo_name??null,repo_path:a.repo_path??null,repo_canonical:a.repo_canonical??null}):s,k=d.status==="ok"?((L=d.value.data)==null?void 0:L.items)??[]:[],I=p.status==="ok"?p.value.data:null,y=u.status==="ok"?u.value.data:null,_=(y==null?void 0:y.find(t=>t.workspace_id===s))??null,O=_!==null?[_]:null,D=a?new Map([[s,a.usd_per_turn]]):new Map,r=j.status==="ok"?j.value.data:null,i=h.status==="ok"?h.value.data:null;return e.jsxs("div",{children:[e.jsxs("div",{className:"page-top",children:[e.jsxs("div",{className:"page-title",children:[e.jsx("button",{type:"button",className:"btn-ghost",onClick:c,"aria-label":"Back to workspaces",style:{marginRight:8},children:"← Back"}),e.jsx("h1",{style:{display:"inline"},children:q}),e.jsx("p",{className:"page-sub",children:"Workspace detail · last 7 days"})]}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"LIST_EQUIV"})})]}),e.jsxs("div",{className:"kpi-grid",children:[n.status==="loading"&&e.jsxs(e.Fragment,{children:[e.jsx(f,{}),e.jsx(f,{}),e.jsx(f,{})]}),n.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Workspace data unavailable — ",n.message]})}),n.status==="ok"&&a!==void 0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"kpi card",children:[e.jsx("div",{className:"kpi-label",children:"SPEND (7d)"}),e.jsx("div",{className:"kpi-value",children:x(a.cost_equiv_u)}),e.jsxs("div",{className:"kpi-subval",children:[a.turns.toLocaleString()," reconciled turns"]}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"LIST_EQUIV"})})]}),e.jsxs("div",{className:"kpi card",children:[e.jsx("div",{className:"kpi-label",children:"$/TURN"}),e.jsx("div",{className:"kpi-value",children:K(a.usd_per_turn)}),e.jsxs("div",{className:"kpi-subval",children:["Ctx/turn: ",H(a.avg_context_per_turn)]}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"LIST_EQUIV"})})]}),e.jsxs("div",{className:"kpi card",children:[e.jsx("div",{className:"kpi-label",children:"SESSIONS (7d)"}),e.jsx("div",{className:"kpi-value",children:d.status==="ok"?((R=d.value.data)==null?void 0:R.items.length)??0:"…"}),e.jsx("div",{className:"kpi-subval",children:a.has_live?"● live now":"No live sessions"}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"EXACT"})})]})]}),n.status==="ok"&&a===void 0&&e.jsx("div",{className:"banner banner-info",role:"note",children:e.jsxs("span",{children:["No spend data found for workspace ",e.jsx("code",{children:s})," in the last 7 days."]})})]}),e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsx("h2",{children:"Top sessions"}),e.jsx("span",{className:"section-meta",children:e.jsx(l,{kind:"LIST_EQUIV"})})]}),d.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading sessions",children:e.jsx(g,{})}),d.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Sessions unavailable — ",d.message]})}),d.status==="ok"&&k.length===0&&e.jsx(T,{headline:"No sessions found",why:"No sessions were recorded for this workspace in the last 7 days.",whatWillAppear:"Session rows will appear after Claude Code activity is detected."}),d.status==="ok"&&k.length>0&&e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Session"}),e.jsx("th",{children:"State"}),e.jsx("th",{children:"Turns"}),e.jsx("th",{children:"Cost"}),e.jsx("th",{children:"Last active"})]})}),e.jsx("tbody",{children:k.slice().sort((t,v)=>(v.cost_equiv_u??0)-(t.cost_equiv_u??0)).slice(0,10).map(t=>e.jsxs("tr",{style:{cursor:"pointer"},onClick:()=>{window.location.hash=`#/sessions/${encodeURIComponent(t.session_id)}`},tabIndex:0,onKeyDown:v=>{(v.key==="Enter"||v.key===" ")&&(v.preventDefault(),window.location.hash=`#/sessions/${encodeURIComponent(t.session_id)}`)},"aria-label":`Open session ${t.session_id}`,children:[e.jsxs("td",{children:[e.jsx("code",{style:{fontSize:11},children:t.session_id.slice(-12)}),t.state==="LIVE"&&e.jsx(l,{kind:"LIVE",label:"LIVE"})]}),e.jsx("td",{children:t.state}),e.jsx("td",{children:t.turn_count}),e.jsx("td",{children:t.cost_equiv_u!==null?x(t.cost_equiv_u):"—"}),e.jsx("td",{children:J(t.last_turn_at)})]},t.session_id))})]})})]}),e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsx("div",{className:"section-head",children:e.jsx("h2",{children:"Where tokens went"})}),e.jsx("div",{style:{marginBottom:8},children:e.jsx("a",{href:`#/recommendations?ws=${encodeURIComponent(s)}`,style:{fontSize:13},children:"View workspace recommendations →"})}),p.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading context composition",children:e.jsx(g,{})}),p.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Context composition unavailable — ",p.message]})}),p.status==="ok"&&e.jsx(Q,{data:I})]}),e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsxs("div",{className:"section-head",children:[e.jsx("h2",{children:"Outcomes"}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"EXPERIMENTAL"})})]}),u.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading outcomes",children:e.jsx(g,{})}),u.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Outcomes unavailable — ",u.message]})}),u.status==="ok"&&_===null&&e.jsx(T,{headline:"No outcome data",why:"No pull requests are linked to sessions in this workspace.",whatWillAppear:"Outcome signals and pull-request status will appear after linked work is observed."}),u.status==="ok"&&_!==null&&e.jsx(Y,{rows:O,workspaceSpendById:D})]}),n.status==="ok"&&a!==void 0&&(a.deep_abandoned_spend_u!==void 0||a.early_abandoned_spend_u!==void 0)&&e.jsxs("div",{className:"card",style:{marginBottom:13},"data-testid":"ef1-abandoned-spend",children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["Reconciled no-commit activity"," ",e.jsx(b,{label:"Reconciled no-commit activity",content:"Splits reconciled Bash, Edit, Write, and NotebookEdit activity without an observed commit into long sessions with at least 10 user turns and early sessions with fewer than 10. It is activity without a recorded commit, not an abandonment finding; LIVE sessions remain in total spend but are excluded from this cohort."})]}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"OBS_PROXY"})})]}),e.jsxs("dl",{style:{display:"grid",gridTemplateColumns:"max-content 1fr",gap:"3px 16px",margin:"8px 16px 12px",fontSize:12,color:"var(--text-muted)"},children:[e.jsx("dt",{children:"Long no-commit activity (10+ user turns)"}),e.jsx("dd",{style:{margin:0},"data-testid":"deep-abandoned-spend",children:a.deep_abandoned_spend_u!==void 0?x(a.deep_abandoned_spend_u):"—"}),e.jsx("dt",{children:"Early no-commit activity (under 10 user turns)"}),e.jsx("dd",{style:{margin:0},"data-testid":"early-abandoned-spend",children:a.early_abandoned_spend_u!==void 0?x(a.early_abandoned_spend_u):"—"})]})]}),e.jsxs("div",{className:"card",style:{marginBottom:13},"data-testid":"ef2-closure-proxy",children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["No later workspace session within 48h"," ",e.jsx(b,{label:"No later workspace session within 48h",content:"This is a workspace-history, as-of-time observation for reconciled no-commit sessions. It is independent of the selected date range. No later workspace session within 48 hours does not establish task resolution; a later session can be unrelated work. Pending means 48 hours has not passed."})]}),e.jsx("div",{className:"chips",children:e.jsx(l,{kind:"DIRECTIONAL"})})]}),j.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading closure proxy",children:e.jsx(g,{})}),j.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Closure proxy unavailable — ",j.message]})}),j.status==="ok"&&r!==null&&e.jsxs("div",{style:{padding:"8px 16px 12px",fontSize:13},children:[e.jsx("div",{"data-testid":"closure-proxy-summary",style:{marginBottom:8},children:r.no_commit_session_count===0?e.jsx("span",{style:{color:"var(--text-muted)"},children:"No no-commit sessions observed."}):e.jsx("span",{children:(r.no_later_workspace_session_share??r.resolved_share)!==null?`${r.no_later_workspace_session_count??r.resolved_count} of ${(r.no_later_workspace_session_count??r.resolved_count)+(r.later_workspace_session_count??r.unresolved_count)} reconciled no-commit sessions had no later workspace session within 48h (${Math.round((r.no_later_workspace_session_share??r.resolved_share??0)*100)}%)`:`${r.no_commit_session_count} no-commit sessions — all PENDING (48h window not elapsed)`})}),e.jsxs("dl",{style:{display:"grid",gridTemplateColumns:"max-content 1fr",gap:"3px 16px",margin:0,fontSize:11,color:"var(--text-muted)"},children:[e.jsx("dt",{children:"No later workspace session"}),e.jsx("dd",{style:{margin:0},"data-testid":"closure-resolved",children:r.no_later_workspace_session_count??r.resolved_count}),e.jsx("dt",{children:"Later workspace session"}),e.jsx("dd",{style:{margin:0},"data-testid":"closure-unresolved",children:r.later_workspace_session_count??r.unresolved_count}),e.jsx("dt",{children:"Pending"}),e.jsx("dd",{style:{margin:0},"data-testid":"closure-pending",children:r.pending_count})]}),e.jsx("p",{className:"kpi-fn",style:{marginTop:8,marginBottom:0},children:"A later session can be unrelated work; burst-working operators can false-flag this observation. PENDING sessions are excluded from the observation denominator."})]})]}),e.jsxs("div",{className:"card",style:{marginBottom:13},"data-testid":"r4a-cost-per-success",children:[e.jsxs("div",{className:"section-head",children:[e.jsxs("h2",{children:["Unique linked-session cost per merged PR"," ",e.jsx(b,{label:"Unique linked-session cost per merged PR",content:"The terminal-date merged PR cohort counts each linked session once, even if it links to multiple merged PRs. Shared sessions are reported as coverage and are never allocated across PRs. Full linked-session lifecycle cost differs from the separate session-start linkage coverage observation. A merge is a reviewer decision, not proof of quality."})]}),e.jsxs("div",{className:"chips",children:[e.jsx(l,{kind:"DIRECTIONAL"}),e.jsx(l,{kind:"OBS_PROXY"})]})]}),h.status==="loading"&&e.jsx("div",{"aria-busy":"true","aria-label":"Loading cost per delivered outcome",children:e.jsx(g,{})}),h.status==="error"&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Cost per delivered outcome unavailable — ",h.message]})}),h.status==="ok"&&i!==null&&e.jsxs("div",{style:{padding:"8px 16px 12px",fontSize:13},children:[e.jsx("div",{"data-testid":"r4a-summary",style:{marginBottom:8},children:i.merged_pr_count===0?e.jsx("span",{style:{color:"var(--text-muted)"},children:"No merged pull requests are linked in this period, so the value per merged pull request is unavailable."}):e.jsxs("span",{children:[i.merged_pr_count," merged PR",i.merged_pr_count===1?"":"s"," at"," ",i.cost_per_merged_pr_u!==null?x(i.cost_per_merged_pr_u):"—"," ","per merged PR (unique linked-session lifecycle cost)."]})}),e.jsxs("dl",{style:{display:"grid",gridTemplateColumns:"max-content 1fr",gap:"3px 16px",margin:0,fontSize:11,color:"var(--text-muted)"},children:[e.jsx("dt",{children:"Unique linked-session cost / merged PRs"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-cost-per-merged-pr",children:i.cost_per_merged_pr_u!==null?x(i.cost_per_merged_pr_u):"— (no merged PRs yet)"}),e.jsx("dt",{children:"Merged pull requests"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-merged-count",children:i.merged_pr_count}),e.jsx("dt",{children:"Unique linked sessions"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-unique-linked-session-count",children:i.unique_linked_session_count??"— unavailable"}),e.jsx("dt",{children:"Shared across merged PRs"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-shared-linked-session-count",children:i.shared_linked_session_count??"— unavailable"}),e.jsx("dt",{children:"Closed unmerged"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-closed-count",children:i.closed_unmerged_count}),e.jsx("dt",{children:"Est. value per commit session"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-cost-per-commit-session",children:i.cost_per_commit_session_u!==null?x(i.cost_per_commit_session_u):"— (no commit-sessions yet)"}),e.jsx("dt",{children:"Commit sessions"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-commit-session-count",children:i.commit_session_count}),e.jsx("dt",{children:"In-window sessions linked to pull requests"}),e.jsx("dd",{style:{margin:0},"data-testid":"r4a-linkage-coverage",children:i.linkage_coverage_pct!==null?`${Math.round(i.linkage_coverage_pct)}%`:"—"})]}),e.jsxs("p",{className:"kpi-fn",style:{marginTop:8,marginBottom:0},children:[i.linkage_coverage_pct!==null?`Only ${Math.round(i.linkage_coverage_pct)}% of in-window sessions are linked to a PR — unlinked spend is excluded. `:"Linkage coverage is unavailable, so the linked-only view cannot be bounded. ","Survivorship: heavy-spend sessions that never open a PR are invisible. Merge is a reviewer's decision, not a quality guarantee. Full session cost is attributed to the PR cohort once (lifecycle attribution); shared sessions are coverage rather than allocation."]})]}),h.status==="ok"&&i===null&&e.jsx("div",{style:{padding:"8px 16px 12px",fontSize:13},"data-testid":"r4a-empty",children:e.jsx("span",{style:{color:"var(--text-muted)"},children:"No cost-per-success data for this workspace in the selected window."})})]})]})}export{re as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as m,a as T,e as E,Q as M,j as e}from"./index-hbaLYHUX.js";import{w as N}from"./workspace-label-CysPJNc0.js";import{C as W}from"./Chip-EizRm13x.js";import{E as $}from"./EmptyState-9kcoimjj.js";import{I as a}from"./InfoTip-CmcYFNQt.js";import{b}from"./Skeleton-DjuxPm_D.js";function A(s){return s.workspace_id==="__global__"?!0:s.is_transient??(s.repo_owner===null&&s.repo_name===null)}function I(s){return`$${(s/1e6).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function v(s){return s==null?"—":`${(s*100).toFixed(1)}%`}function O(s){return s===null?"—":`$${s.toFixed(3)}`}function R(s){return s==null?"—":s>=1e3?`${Math.round(s/1e3)}k`:`${Math.round(s)}`}function P(s){if(s.length===0)return"—";const l=Math.max(...s.map(r=>r.cost_equiv_u),1),c=42,i=14,o=4,d=2,x=s.length*o+Math.max(0,s.length-1)*d,g=Math.max(0,Math.floor((c-x)/2));return e.jsx("svg",{width:c,height:i,"aria-hidden":"true",style:{display:"block"},children:s.map((r,h)=>{const u=Math.max(1,Math.round(r.cost_equiv_u/l*(i-1)));return e.jsx("rect",{x:g+h*(o+d),y:i-u,width:o,height:u,fill:"var(--accent, #4a90e2)"},h)})})}function z(){const[s,l]=m.useState({status:"loading"}),[c,i]=m.useState({status:"loading"}),[o,d]=m.useState({status:"loading"}),[x,g]=m.useState(!1);m.useEffect(()=>{T({preset:"7d"}).then(t=>l({status:"ok",value:t})).catch(t=>l({status:"error",message:String(t)})),E({preset:"7d"},"day").then(t=>i({status:"ok",value:t})).catch(t=>i({status:"error",message:String(t)})),M().then(t=>d({status:"ok",value:t})).catch(t=>d({status:"error",message:String(t)}))},[]);const r=s.status==="ok"?s.value.data:null,h=c.status==="ok"?c.value.data:null,u=o.status==="ok"?o.value.data:null,_=((r==null?void 0:r.items)??[]).filter(t=>x||!A(t)),j=new Map;if(h!==null)for(const t of h.by_workspace){const p=j.get(t.workspace_id)??[];p.push({cost_equiv_u:t.cost_equiv_u}),j.set(t.workspace_id,p)}const w=new Map;if(u!==null)for(const t of u)w.set(t.workspace_id,t);const C=s.status==="loading",y=s.status==="error",f=9;return e.jsxs("div",{children:[e.jsxs("div",{className:"page-top",children:[e.jsxs("div",{className:"page-title",children:[e.jsx("h1",{children:"Workspaces"}),e.jsx("p",{className:"page-sub",children:"Compare estimated token value across repositories"})]}),e.jsx("div",{className:"chips",children:e.jsx(W,{kind:"LIST_EQUIV"})})]}),y&&e.jsx("div",{className:"banner banner-error",role:"alert",children:e.jsxs("span",{children:["Workspace data unavailable —"," ",s.message]})}),e.jsxs("div",{className:"card",style:{marginBottom:13},children:[e.jsx("div",{style:{marginBottom:10},children:e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:6,cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:x,onChange:t=>g(t.target.checked)}),"Show transient workspaces"]})}),C?e.jsx("div",{className:"table-wrap","aria-busy":"true","aria-label":"Loading workspaces",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Workspace"}),e.jsx("th",{children:"Est. value"}),e.jsx("th",{children:"Share of total"}),e.jsx("th",{children:"Trend"}),e.jsx("th",{children:"Context / turn"}),e.jsx("th",{children:"Cache-write share"}),e.jsx("th",{children:"High-cost model use"}),e.jsx("th",{children:"Est. value / turn"}),e.jsx("th",{children:"Outcome signal"})]})}),e.jsxs("tbody",{children:[e.jsx(b,{cols:f}),e.jsx(b,{cols:f}),e.jsx(b,{cols:f})]})]})}):!y&&_.length===0?e.jsx($,{headline:"No workspaces yet",why:"No spend data has been recorded for any workspace in the last 7 days.",whatWillAppear:"Workspace spend, efficiency metrics, and session history will appear after Claude Code activity is detected."}):e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Workspace"}),e.jsxs("th",{"aria-label":"Estimated value",children:["Est. value"," ",e.jsx(a,{label:"What estimated value means",content:"An estimate using public API list prices, not a bill. Use it to find the repositories where a change could matter most."})]}),e.jsxs("th",{"aria-label":"Share",children:["Share of total"," ",e.jsx(a,{label:"What Share means",content:"This workspace's percentage of your total modeled spend. A few workspaces usually dominate — start optimizing there."})]}),e.jsxs("th",{"aria-label":"Trend",children:["Trend"," ",e.jsx(a,{label:"What Trend means",content:"Direction of this workspace's spend versus the prior period. A sharp rise is worth opening before it compounds."})]}),e.jsxs("th",{"aria-label":"Context per turn",children:["Context / turn"," ",e.jsx(a,{label:"What context per turn means",content:"The average context tokens sent again on each turn. A high value can mean it is time to use /clear or split the work."})]}),e.jsxs("th",{"aria-label":"Cache-write share",children:["Cache-write share"," ",e.jsx(a,{label:"What Cache-write % means",content:"Share of all token categories that were cache writes. A high share can be worth investigating; it does not by itself prove the cache was invalidated."})]}),e.jsxs("th",{"aria-label":"High-cost model use",children:["High-cost model use"," ",e.jsx(a,{label:"What Premium % means",content:"Share of turns on premium models (Opus, Fable, or Mythos). Check /usage before moving routine work to Sonnet; your Sonnet limit may already be filling."})]}),e.jsxs("th",{"aria-label":"Estimated value per turn",children:["Est. value / turn"," ",e.jsx(a,{label:"What $/turn means",content:"Modeled cost per turn for this workspace — a size-independent efficiency number. Compare workspaces here rather than on total spend."})]}),e.jsxs("th",{"aria-label":"Outcome signal",title:"Outcome signal: based on a limited sample and may change.",children:["Outcome signal"," ",e.jsx(a,{label:"What outcome signal means",content:"Share of linked pull requests with a successful observed outcome among closed outcomes, including success with deferred work. This early estimate helps spot patterns only."})]})]})}),e.jsx("tbody",{children:_.map(t=>{const p=N({workspace_id:t.workspace_id,repo_owner:t.repo_owner??null,repo_name:t.repo_name??null,repo_path:t.repo_path??null,repo_canonical:t.repo_canonical??null}),S=j.get(t.workspace_id)??[],n=w.get(t.workspace_id);return e.jsxs("tr",{style:{cursor:"pointer"},onClick:()=>{window.location.hash=`#/workspaces/${encodeURIComponent(t.workspace_id)}`},tabIndex:0,onKeyDown:k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),window.location.hash=`#/workspaces/${encodeURIComponent(t.workspace_id)}`)},"aria-label":`Open ${p} workspace detail`,children:[e.jsxs("td",{children:[p,t.has_live&&e.jsx("span",{className:"nav-dot",style:{marginLeft:6,display:"inline-block"},"aria-label":"has live session"})]}),e.jsx("td",{children:I(t.cost_equiv_u)}),e.jsx("td",{children:e.jsxs("span",{style:{whiteSpace:"nowrap"},children:[v(t.cost_share),e.jsx("span",{"aria-hidden":"true",className:"share-bar",style:{display:"inline-block",marginLeft:4,height:8,width:Math.max(2,Math.round(t.cost_share*60)),background:"var(--accent, #4a90e2)",verticalAlign:"middle",borderRadius:2}})]})}),e.jsx("td",{"aria-label":`Trend: ${S.length} buckets`,children:P(S)}),e.jsx("td",{children:R(t.avg_context_per_turn)}),e.jsx("td",{children:v(t.cache_write_pct)}),e.jsx("td",{children:v(t.premium_pct??t.opus_pct)}),e.jsx("td",{children:O(t.usd_per_turn)}),e.jsxs("td",{children:[e.jsx(W,{kind:"EXPERIMENTAL",label:(n==null?void 0:n.success_rate)!==null&&(n==null?void 0:n.success_rate)!==void 0?`${(n.success_rate*100).toFixed(0)}%`:"—",title:"Outcome signal: based on a limited sample and may change."})," ",e.jsx(a,{label:"What this early estimate means",content:"This value uses a method that is still being checked. Use it to spot patterns, not to make precise claims."})]})]},t.workspace_id)})})]})}),e.jsx("div",{className:"table-footnotes",children:"Estimated value uses public API list prices; it is not billing data. Outcome signal is an early estimate based on a limited sample. Click a row to open the workspace detail."})]})]})}export{z as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as u}from"./index-hbaLYHUX.js";const e=["var(--series-1)","var(--series-2)","var(--series-3)","var(--series-4)","var(--series-5)"],n={axisLine:!1,tickLine:!1,grid:{stroke:"rgba(255, 255, 255, 0.07)",strokeDasharray:"5",horizontal:!0,vertical:!1},tickCount:5};function x({active:a,label:r,payload:i,labelFormatter:o,nameFormatter:c,valueFormatter:g}){return!a||!(i!=null&&i.length)?null:u.createElement("div",{style:{background:"#1e293b",border:"1px solid rgba(255, 255, 255, 0.12)",borderRadius:8,boxShadow:"0 10px 24px rgba(0, 0, 0, 0.3)",color:"var(--text)",fontSize:11,padding:"8px 10px"}},r!==void 0&&u.createElement("div",{style:{color:"var(--text-2)",marginBottom:5}},(o==null?void 0:o(r))??r),...i.map((s,t)=>{var v;return u.createElement("div",{key:`${s.dataKey??s.name??"series"}-${t}`,style:{color:((v=s.color)==null?void 0:v.startsWith("url("))===!0?e[t%e.length]:s.color??e[t%e.length]}},`${(c==null?void 0:c(s.name,s))??s.name??s.dataKey??"Value"}: `,(g==null?void 0:g(s.value,s))??String(s.value??"N/A"))}))}export{x as C,n as g,e as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ba as r}from"./CartesianChart-CRV6h2et.js";function d(i,s){var a,t;return(a=(t=i.graphicalItems.cartesianItems.find(e=>e.id===s))===null||t===void 0?void 0:t.xAxisId)!==null&&a!==void 0?a:r}function I(i,s){var a,t;return(a=(t=i.graphicalItems.cartesianItems.find(e=>e.id===s))===null||t===void 0?void 0:t.yAxisId)!==null&&a!==void 0?a:r}export{I as a,d as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg: #0b0f1a;--panel: #111827;--panel2: #1a2233;--line: rgba(255, 255, 255, .07);--sidebar: var(--bg);--text: #e2e8f0;--text-2: #94a3b8;--text-muted: #9aa9bd;--soft: var(--text-2);--muted: var(--text-muted);--cyan: #22d3ee;--violet: #a78bfa;--green: #34d399;--amber: #fbbf24;--rose: #fb7185;--purple: var(--violet);--red: var(--rose);--blue: #60a5fa;--orange: var(--amber);--teal: #2dd4bf;--series-1: var(--cyan);--series-2: var(--violet);--series-3: var(--blue);--series-4: var(--green);--series-5: var(--amber);--accent-ink: #06151a;--r: 15px;--shadow: 0 16px 38px rgba(0, 0, 0, .22)}:root[data-theme=light]{--bg: #f8fafc;--panel: #ffffff;--panel2: #f1f5f9;--line: rgba(15, 23, 42, .12);--sidebar: var(--bg);--text: #0f172a;--text-2: #475569;--text-muted: #526176;--soft: var(--text-2);--muted: var(--text-muted);--cyan: #0e657d;--violet: #7c3aed;--green: #04704f;--amber: #b45309;--rose: #be123c;--purple: var(--violet);--red: var(--rose);--blue: #2563eb;--orange: var(--amber);--teal: #0f6b63;--series-1: var(--cyan);--series-2: var(--violet);--series-3: var(--blue);--series-4: var(--green);--series-5: var(--amber);--accent-ink: #f8fafc;--shadow: 0 8px 24px rgba(15, 23, 42, .1);color-scheme:light}*,*:before,*:after{box-sizing:border-box}html{background:var(--bg)}body{margin:0;color:var(--text);background:var(--bg);font:14px/1.45 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,select,input{font:inherit}button{color:inherit}a{color:var(--cyan)}.shell{display:grid;grid-template-columns:238px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;background:var(--sidebar);border-right:1px solid var(--line);padding:22px 15px;z-index:5;overflow-y:auto;display:flex;flex-direction:column}.sidebar-links{display:flex;flex-direction:column;flex:1}.mobile-nav-toggle{display:none}:focus-visible{outline:2px solid var(--cyan);outline-offset:3px}.brand{display:flex;align-items:center;gap:11px;font-weight:780;font-size:17px;margin:0 7px 24px;flex-shrink:0}.brandmark{width:30px;height:30px;border:1px solid var(--line);border-radius:9px;display:grid;place-items:center;background:var(--panel);flex-shrink:0}.brandmark:before{content:"";width:13px;height:13px;border:2px solid var(--cyan);border-top-color:var(--purple);border-radius:4px;transform:rotate(12deg)}.navgroup{margin:13px 0 5px 10px;color:var(--text-muted);font-size:12px;text-transform:uppercase;letter-spacing:.08em}.nav-btn{width:100%;border:0;background:transparent;color:var(--muted);text-align:left;padding:10px 11px;border-radius:9px;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:9px}.nav-btn:hover:not(:disabled),.nav-btn.active{background:var(--panel2);color:var(--text)}.nav-btn:disabled{cursor:default;opacity:.5}.theme-toggle{width:100%;margin-top:6px;border:1px solid var(--line);background:transparent;color:var(--muted);text-align:left;padding:8px 11px;border-radius:9px;cursor:pointer;font-size:12px}.theme-toggle:hover{background:var(--panel2);color:var(--text)}.nav-badge{font-size:12px;padding:2px 6px;border-radius:99px;border:1px solid var(--line);color:var(--text-muted)}.nav-dot{width:7px;height:7px;border-radius:50%;background:var(--amber);flex-shrink:0}.sidebox{margin-top:auto;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px}.sidebox b{font-size:12px}.sidebox-sub{font-size:12px;color:var(--muted);margin-top:4px}.main-content{padding:23px 28px 48px;max-width:1720px;width:100%;margin:auto;min-width:0}.page-top{display:flex;justify-content:space-between;align-items:flex-start;gap:18px;margin-bottom:16px}.page-title h1{margin:0 0 4px;font-size:24px;letter-spacing:-.025em}.page-sub{color:var(--muted);font-size:12px}.banner{padding:10px 14px;border-radius:11px;margin-bottom:14px;display:flex;align-items:center;gap:10px;font-size:12px}.banner-info{border:1px solid var(--line);background:var(--panel2);color:var(--soft)}.banner-error{border:1px solid color-mix(in srgb,var(--rose) 45%,transparent);background:color-mix(in srgb,var(--rose) 9%,var(--bg));color:var(--rose)}.banner-retry{margin-left:auto;border:1px solid color-mix(in srgb,var(--rose) 45%,transparent);background:transparent;color:var(--rose);border-radius:7px;padding:4px 10px;font-size:12px;cursor:pointer;flex-shrink:0}.banner-retry:hover{background:color-mix(in srgb,var(--rose) 14%,var(--bg))}.date-range{display:flex;gap:4px;align-items:center}.date-preset-btn{border:1px solid var(--line);background:transparent;color:var(--muted);border-radius:8px;padding:6px 12px;font-size:12px;cursor:pointer}.date-preset-btn.active,.date-preset-btn:hover{background:var(--panel2);border-color:var(--cyan);color:var(--text)}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);min-width:0}.kpi-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:13px;margin-bottom:13px}.kpi{padding:14px}.kpi-label{color:var(--muted);font-size:12px;margin-bottom:6px}.kpi-value{font-size:24px;font-weight:780;letter-spacing:-.035em}.kpi-value-sm{font-size:16px;font-weight:700;letter-spacing:-.02em}.kpi-subval{font-size:12px;color:var(--soft);margin-top:4px}.kpi-off{font-size:18px;font-weight:700;color:var(--muted)}.kpi-off-hint{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.4}.chips{margin-top:7px;display:flex;flex-wrap:wrap;gap:4px}.kpi-fn{font-size:12px;color:var(--text-muted);margin-top:4px}.ctx-rows{display:grid;gap:6px;margin-top:4px}.ctx-row{display:grid;grid-template-columns:1fr auto;gap:6px;font-size:12px}.ctx-model{color:var(--soft);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ctx-value{color:var(--text);font-weight:600;text-align:right;white-space:nowrap}.chip{display:inline-flex;align-items:center;gap:5px;border-radius:99px;padding:3px 7px;font-size:12px;font-weight:700;border:1px solid transparent;white-space:nowrap}.chip-exact{background:#71d89b17;color:var(--green);border-color:#71d89b38}.chip-list-equiv{background:#4ecdc417;color:var(--teal);border-color:#4ecdc438}.chip-stale,.chip-partial{background:#f4c76617;color:var(--amber);border-color:#f4c76638}.chip-proxy{background:#ff858517;color:var(--red);border-color:#ff858538}.chip-obs-proxy{background:#65d3ff17;color:var(--cyan);border-color:#65d3ff38}.chip-experimental{background:#7fb3ff17;color:var(--blue);border-color:#7fb3ff38}.chip-na{background:#8492a614;color:var(--text-2);border-color:var(--line)}.chip-live{background:#ffad5517;color:var(--orange);border-color:#ffad5538}.chip-modeled{background:#b8a0ff17;color:var(--purple);border-color:#b8a0ff38}.chip-directional{background:#b8a0ff12;color:var(--purple);border-color:#b8a0ff2e}.chip-observed{background:#4ecdc417;color:var(--teal);border-color:#4ecdc438}.impact-ledger{margin-top:10px;display:grid;gap:8px}.ledger-entry{padding:8px 10px}.ledger-head{display:flex;justify-content:space-between;gap:8px;font-size:12px;align-items:baseline}.ledger-row{display:grid;grid-template-columns:1fr auto;gap:6px;font-size:12px;margin-top:5px}.ledger-key{color:var(--soft)}.ledger-val{text-align:right}.ledger-banner{margin-top:6px}.ledger-note{margin-top:5px}.detstatus-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.detstatus-item{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}.detstatus-name{font-weight:600;font-size:12px}.detstatus-note{color:var(--text-2);font-size:12px}.detstatus-active{background:#71d89b17;color:var(--green);border-color:#71d89b38}.detstatus-inactive{background:#8492a614;color:var(--text-2);border-color:var(--line)}.detstatus-blocked{background:#f4c76617;color:var(--amber);border-color:#f4c76638}.detstatus-not-evaluated{background:#8492a614;color:var(--text-2);border-color:var(--line)}.rec-badge{display:inline-block;padding:2px 8px;border-radius:6px;background:#7fb3ff1f;color:var(--blue);font-weight:700;margin-right:6px}.rec-section{margin-bottom:12px}.rec-section-label{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0 0 4px}.rec-evidence,.rec-formula-inputs{list-style:none;margin:0;padding:0;font-size:12px}.rec-evidence-key{color:var(--cyan)}.rec-savings-value{font-size:20px;font-weight:700;display:flex;align-items:center;gap:8px}.rec-formula-expr code{font-size:12px;color:var(--purple)}.rec-modeled-note{font-size:12px;color:var(--text-2);margin-top:6px}.rec-unvalidated-note{font-size:12px;color:var(--amber);margin:4px 0 0}.rec-ranking-explainer{max-width:860px;margin:4px 0 13px;color:var(--muted);font-size:12px;line-height:1.5}.rec-rank-explanation{padding:10px 12px;border-left:3px solid rgba(101,211,255,.45);border-radius:0 6px 6px 0;background:#65d3ff0d}.rec-rank-explanation p,.rec-success-measure{margin:0;color:var(--soft);font-size:12px;line-height:1.5}.rec-observations{margin:0;padding-left:20px;color:var(--soft);font-size:12px;line-height:1.5}.rec-observations li+li{margin-top:4px}.rec-collapsed-row{padding:14px 16px}.rec-group-header{padding:14px 16px 10px}.rec-group-detector,.rec-group-count{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}.rec-group-detector{font-weight:750;letter-spacing:.04em}.rec-group-count{white-space:nowrap}.rec-group-summary{display:flex;flex-wrap:wrap;gap:8px 16px;margin:2px 0 10px;color:var(--soft);font-size:12px;font-variant-numeric:tabular-nums}.rec-group-header .rec-rank-explanation{margin:8px 0 0}.rec-group-header .rec-actions-hint{text-align:left;margin-bottom:0}.rec-group-members{border-top:1px solid var(--line)}.rec-session-row{padding:12px 16px 2px;border-bottom:1px solid var(--line)}.rec-session-row:last-child{border-bottom:0}.rec-session-row .rec-collapsed-row{padding:0 0 10px}.rec-session-links{display:flex;flex-wrap:wrap;gap:5px 12px;list-style:none;margin:8px 0 0;padding:0;color:var(--muted);font-size:12px}.rec-session-links a{color:var(--cyan);text-decoration:underline;text-underline-offset:2px}.rec-session-links a:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.rec-session-label{color:var(--muted)}.rec-minor-items>summary{cursor:pointer;padding:10px 16px 12px;color:var(--cyan);font-size:12px;font-weight:650}.rec-minor-items>summary:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}.rec-details{padding:14px 16px;border-top:1px solid var(--line)}.rec-header-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}.rec-title{font-size:15px;font-weight:650;margin:0;color:var(--text);flex:1;min-width:0}.rec-headline{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.rec-headline-text{font-size:13px;font-weight:600;color:var(--soft)}.rec-confidence-tier{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;border:1px solid;border-radius:99px;padding:2px 7px;flex-shrink:0}.rec-confidence-tier--modeled{color:var(--cyan);background:#65d3ff1a;border-color:#65d3ff59}.rec-confidence-tier--advisory{color:var(--amber);background:#f4c7661a;border-color:#f4c76659}.rec-confidence-tier--directional{color:var(--purple);background:#b8a0ff1a;border-color:#b8a0ff59}.rec-confidence-tier--warning{color:var(--red);background:#ff85851a;border-color:#ff858559}.rec-rank-badge{font-size:12px;font-weight:700;color:var(--muted);background:#8492a61a;border:1px solid var(--line);border-radius:5px;padding:2px 6px;flex-shrink:0}.rec-category-chip,.rec-cross-ws-badge{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);background:#8492a614;border:1px solid var(--line);border-radius:99px;padding:2px 7px;flex-shrink:0}.rec-adopted-pill{font-size:12px;font-weight:700;color:var(--green);background:#71d89b1a;border:1px solid rgba(113,216,155,.25);border-radius:99px;padding:2px 7px;flex-shrink:0}.rec-flagship-banner{display:flex;align-items:center;gap:10px;padding:8px 16px;background:#65d3ff0d;border-bottom:1px solid rgba(101,211,255,.15);border-radius:var(--r) var(--r) 0 0}.rec-flagship-badge{font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--cyan);background:#65d3ff1a;border:1px solid rgba(101,211,255,.3);border-radius:5px;padding:2px 7px;flex-shrink:0}.rec-flagship-rationale{font-size:12px;color:var(--text-2)}.rec-action-btn{display:inline-block;border-radius:7px;padding:6px 12px;font:inherit;font-size:12px;font-weight:550;cursor:pointer;white-space:nowrap;border:1px solid var(--line);background:var(--panel2);color:var(--soft);transition:background .12s,border-color .12s}.rec-action-btn:hover:not(:disabled){background:var(--panel2);border-color:var(--cyan);color:var(--text)}.rec-action-btn:disabled{opacity:.4;cursor:default}.rec-action-btn--primary{background:#65d3ff1f;border-color:#65d3ff59;color:var(--cyan);font-weight:650}.rec-action-btn--primary:hover:not(:disabled){background:#65d3ff33;border-color:#65d3ff80;color:var(--cyan)}.rec-action-btn--ghost{background:transparent;border-color:var(--line);color:var(--muted)}.rec-action-btn--ghost:hover:not(:disabled){background:#8492a612;border-color:var(--cyan);color:var(--soft)}a.rec-action-btn{text-decoration:none}.rec-primary-action{margin:10px 16px;display:flex;flex-direction:column;align-items:flex-start;gap:8px}.rec-guided-prompt{width:100%}.rec-guided-toggle{font-size:12px}.rec-guided-prompt .rec-prompt-artifact{margin:8px 0 0}.rec-actions{display:flex;gap:8px;margin-top:12px;justify-content:flex-end;flex-wrap:wrap}.rec-actions-hint{font-size:12px;color:var(--muted);margin:6px 0 0;text-align:right}.rec-apply-panel{margin:10px 16px 14px;padding:10px 12px;border:1px solid var(--line);border-radius:7px;background:#ffffff08}.rec-apply-preview{max-height:220px;overflow:auto;margin:8px 0 10px;padding:10px;border-radius:6px;border:1px solid var(--line);background:var(--bg);color:var(--soft);font-size:12px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.rec-prompt-artifact{margin:10px 16px;padding:10px 12px;border:1px solid var(--line);border-radius:7px;background:#ffffff08}.rec-prompt-artifact textarea{display:block;box-sizing:border-box;width:100%;min-height:120px;margin:8px 0 10px;padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--soft);font:inherit;font-size:12px;line-height:1.45;resize:vertical}.rec-apply-status{margin:8px 16px 14px;font-size:12px;color:var(--soft)}.rec-apply-status--error{color:var(--rose)}.rec-diagnostics{margin:16px 0 12px;border:1px solid var(--line);border-radius:7px;background:#ffffff05;color:var(--muted);font-size:12px}.rec-diagnostics>summary{padding:9px 11px;cursor:pointer;color:var(--soft);font-weight:650}.rec-diagnostics[open]>summary{border-bottom:1px solid var(--line)}.rec-diagnostics-body{padding:11px}.rec-diagnostics-body .rec-section:last-child{margin-bottom:0}.rec-evidence-raw li,.rec-diagnostics-body code{overflow-wrap:anywhere;word-break:break-word}.skeleton{display:inline-block;background:linear-gradient(90deg,var(--panel) 25%,var(--panel2) 50%,var(--panel) 75%);background-size:200% 100%;animation:skeleton-pulse 1.5s infinite;animation-delay:.1s;border-radius:6px}.kpi-grid>.skeleton-kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow)}.skeleton-chart{display:block;width:100%}.skeleton-line{height:14px;display:block;margin-bottom:6px}.skeleton-value{height:28px;display:block;margin-bottom:8px;width:60%}.skeleton-chip{height:18px;width:70px;display:inline-block}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px 16px;color:var(--muted);text-align:center;gap:8px}.empty-state-icon{font-size:28px;opacity:.4}.empty-state-text{font-size:12px;line-height:1.5}.section-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:15px 16px 0}.section-head h2{font-size:14px;margin:0}.section-meta{font-size:12px;color:var(--muted)}.table-wrap{overflow-x:auto;padding:0 16px 16px;margin-top:12px}.table-wrap table{min-width:520px;overflow-wrap:normal}table{width:100%;border-collapse:collapse}th{text-align:left;color:var(--muted);font-size:12px;font-weight:650;padding:8px 9px;border-bottom:1px solid var(--line)}td{padding:9px;border-bottom:1px solid var(--line);color:var(--soft);font-size:12px;font-variant-numeric:tabular-nums}td:first-child{color:var(--text)}tr.total-row td{color:var(--text);font-weight:600;border-top:1px solid var(--line);border-bottom:0}.table-footnotes{padding:8px 16px 14px;font-size:12px;color:var(--text-muted);line-height:1.6}.live-strip-wrap{margin-bottom:13px}.live-strip{border:1px solid var(--line);border-radius:11px;background:var(--panel2);padding:12px 15px}.live-strip-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;font-size:12px;font-weight:600}.live-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--text-muted);margin-right:6px}.live-dot.on{background:var(--orange);animation:pulse 1.5s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.live-strip-empty{color:var(--muted);font-size:12px;padding:8px 0}.live-strip-freshness{font-size:12px;color:var(--muted);font-weight:400}.live-row-live td:first-child{border-left:3px solid var(--orange);padding-left:6px;transition:border-color .4s ease}.live-row-reconciled td:first-child{border-left:3px solid transparent;padding-left:6px;transition:border-color .4s ease}.live-session-link{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;padding:0;background:none;color:var(--cyan);cursor:pointer;font:inherit;text-decoration:underline;text-underline-offset:2px}.live-session-link:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.context-workspace-select{display:block;width:min(100%,28rem);margin-top:8px;padding:7px 10px;color:var(--text);color-scheme:dark;background:var(--panel2);border:1px solid var(--line);border-radius:8px}:root[data-theme=light] .context-workspace-select{color-scheme:light}.context-workspace-select:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}.session-detail{max-width:1000px}.session-back{margin-bottom:14px}.session-kpis{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-bottom:14px}.session-kpis>div{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:13px;display:grid;gap:5px;min-width:0;box-sizing:border-box}.session-kpis span{color:var(--muted);font-size:12px}.session-kpis b{font-size:14px;color:var(--text);font-variant-numeric:tabular-nums}.session-load-more{padding:0 16px 16px}.session-detail-empty{min-height:200px}.hot-session-row{cursor:pointer}.hot-session-row:hover>td{background:var(--panel2)}.settings-page{max-width:820px}.settings-section{margin-bottom:13px}.settings-body{padding:16px;display:flex;flex-direction:column;gap:18px}.settings-row{display:flex;align-items:flex-start;gap:16px}.settings-label{min-width:200px;font-size:13px;color:var(--text);display:flex;flex-direction:column;gap:3px;padding-top:6px}.settings-hint{font-size:12px;color:var(--muted);font-weight:400}.settings-field-wrap{flex:1;display:flex;flex-direction:column;gap:4px}.settings-input{flex:1;background:var(--panel2);border:1px solid var(--line);border-radius:8px;color:var(--text);padding:7px 10px;font:inherit;font-size:13px;min-width:0;width:100%}.settings-input:focus{outline:2px solid var(--cyan);outline-offset:1px}.settings-input[readonly]{color:var(--muted);cursor:default}.settings-input-sm{width:240px}.settings-textarea{background:var(--panel2);border:1px solid var(--line);border-radius:8px;color:var(--text);padding:7px 10px;font:inherit;font-size:13px;width:100%;resize:vertical;min-height:72px}.settings-input-error{border-color:var(--red)}.settings-error{font-size:12px;color:var(--red);margin:0}.settings-actions{display:flex;gap:8px;align-items:center}.settings-danger-zone{border-color:#ff858540}.ws-slug{font-family:ui-monospace,Cascadia Code,Fira Code,monospace;font-size:12px;color:var(--text);white-space:nowrap}.health-grid{padding:12px 16px 16px;display:flex;flex-direction:column;gap:8px}.health-row{display:flex;align-items:baseline;gap:12px;font-size:12px}.health-label{min-width:200px;color:var(--muted)}.health-value{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.health-warn{color:var(--amber)}.btn-primary{background:var(--cyan);color:var(--accent-ink);border:0;border-radius:8px;padding:8px 18px;font:inherit;font-size:13px;font-weight:650;cursor:pointer}.btn-primary:hover{filter:brightness(1.1)}.btn-secondary{background:transparent;color:var(--soft);border:1px solid var(--line);border-radius:8px;padding:8px 16px;font:inherit;font-size:13px;cursor:pointer}.btn-secondary:hover{background:var(--panel2)}.btn-destructive{background:transparent;color:var(--red);border:1px solid rgba(255,133,133,.35);border-radius:8px;padding:8px 16px;font:inherit;font-size:13px;cursor:pointer}.btn-destructive:hover:not(:disabled){background:#ff858514}.btn-destructive:disabled{opacity:.4;cursor:default}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:28px;width:min(480px,calc(100vw - 32px));display:flex;flex-direction:column;gap:14px;box-shadow:var(--shadow)}.modal-title{margin:0;font-size:18px;letter-spacing:-.02em}.modal-body{margin:0;font-size:13px;color:var(--soft);line-height:1.55}.modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.settings-field{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}.settings-field:last-of-type{margin-bottom:0}.settings-inline-error{font-size:12px;color:var(--red);border:1px solid rgba(255,133,133,.3);background:#ff85850f;border-radius:7px;padding:7px 11px;margin-top:8px}.settings-save-btn{background:var(--cyan);color:var(--accent-ink);border:0;border-radius:8px;padding:8px 18px;font:inherit;font-size:13px;font-weight:650;cursor:pointer;margin-top:14px}.settings-save-btn:hover:not(:disabled){filter:brightness(1.1)}.settings-save-btn:disabled{opacity:.6;cursor:default}.settings-calibrate-primary-btn{width:100%;background:var(--panel2);border:1.5px solid var(--cyan);border-radius:8px;color:var(--cyan);padding:10px 18px;font:inherit;font-size:13px;font-weight:650;cursor:pointer;text-align:center}.settings-calibrate-primary-btn:hover:not(:disabled){background:#00c8dc14}.settings-calibrate-primary-btn:disabled{opacity:.6;cursor:default}.settings-calibrate-desc{font-size:12px;color:var(--muted);margin:2px 0 6px}.settings-calibrate-result{font-size:12px;color:var(--text);background:#00c8dc0f;border:1px solid rgba(0,200,220,.2);border-radius:6px;padding:6px 10px;margin-bottom:6px}.settings-advanced-override{border-top:1px solid var(--line);padding-top:10px;margin-top:6px;display:flex;flex-direction:column;gap:2px}.settings-table-input{width:100%;background:var(--panel2);border:1px solid var(--line);border-radius:6px;color:var(--text);padding:5px 8px;font:inherit;font-size:12px}.settings-table-input:focus{outline:2px solid var(--cyan);outline-offset:1px}.settings-health-grid{display:flex;flex-direction:column;gap:8px}.settings-health-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:12px;font-size:13px}.settings-health-label{min-width:min(200px,100%);color:var(--muted)}.settings-health-value{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.settings-reset-btn{background:transparent;color:var(--red);border:1px solid rgba(255,133,133,.35);border-radius:8px;padding:8px 16px;font:inherit;font-size:13px;cursor:pointer}.settings-reset-btn:hover{background:#ff858514}.settings-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:200}.settings-modal{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:24px 28px;width:min(440px,calc(100vw - 32px));box-shadow:var(--shadow);margin:auto;max-height:calc(100dvh - 32px);overflow:auto;overflow-wrap:anywhere;color:inherit}.settings-modal::backdrop{background:#0000008c}.settings-cancel-btn{background:transparent;color:var(--soft);border:1px solid var(--line);border-radius:8px;padding:8px 16px;font:inherit;font-size:13px;cursor:pointer}.settings-cancel-btn:hover:not(:disabled){background:var(--panel2)}.settings-reset-confirm-btn{background:transparent;color:var(--red);border:1px solid rgba(255,133,133,.35);border-radius:8px;padding:8px 16px;font:inherit;font-size:13px;cursor:pointer}.settings-reset-confirm-btn:hover:not(:disabled){background:#ff858514}.settings-reset-confirm-btn:disabled{opacity:.4;cursor:default}.settings-skeleton{height:120px;border-radius:var(--r);background:linear-gradient(90deg,var(--panel) 25%,var(--panel2) 50%,var(--panel) 75%);background-size:400% 100%;animation:shimmer 1.4s ease infinite;animation-delay:.1s;margin-bottom:16px;border:1px solid var(--line)}@media(max-width:1280px){.kpi-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:800px){.ledger-row{grid-template-columns:minmax(0,1fr)}.ledger-head{flex-direction:column;align-items:flex-start}.ledger-val{text-align:left;max-width:100%}.shell{display:block}.sidebar{position:static;height:auto;padding:12px 16px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;border-right:0;border-bottom:1px solid var(--line);overflow:visible}.sidebar .brand{margin:0;gap:6px;font-size:15px}.mobile-nav-toggle{display:block;padding:8px;background:var(--panel);border:1px solid var(--muted);border-radius:6px}.sidebar-links{display:none;grid-column:1 / -1}.sidebar-links.is-open{display:flex}.page-top{display:block}.kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.main-content{padding:16px;overflow-wrap:anywhere}}@media(max-width:480px){.kpi-grid{grid-template-columns:minmax(0,1fr)}}.page-top-controls{display:flex;flex-direction:column;align-items:flex-end;gap:10px;min-width:0}.page-top-controls .banner-info{margin-bottom:0;max-width:min(760px,100%)}.banner-dismiss{flex-shrink:0;border:0;background:transparent;color:inherit;padding:0 2px;font:inherit;font-size:12px;line-height:1;cursor:pointer}.banner-dismiss:hover{color:var(--text)}.chip-legend{margin-bottom:14px}.chip-legend-toggle{border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--soft);padding:5px 9px;font:inherit;font-size:12px;cursor:pointer}.chip-legend-toggle:hover{color:var(--text);background:var(--panel2)}.chip-legend-panel{margin-top:8px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r);background:var(--panel)}.chip-legend-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px 16px;margin:0;padding:0;list-style:none}.chip-legend-item{display:flex;align-items:center;gap:8px;min-width:0;color:var(--soft);font-size:12px;line-height:1.35}.chip-legend-item .chip{flex-shrink:0}@media(max-width:800px){.page-top-controls{align-items:stretch;margin-top:12px}.page-top-controls .date-range{justify-content:flex-start}}.settings-onboarding-card{padding:16px 20px;margin-bottom:16px;border:1px solid rgba(0,200,220,.28);border-radius:var(--r);background:var(--panel)}.settings-onboarding-card h2{margin:0 0 10px;font-size:15px}.settings-onboarding-card ol{display:grid;gap:8px;margin:0;padding-left:22px;color:var(--soft);font-size:12px;line-height:1.45}.settings-onboarding-card strong{color:var(--text)}.daemon-unreachable{display:grid;min-height:100vh;place-items:center;padding:24px;background:var(--bg)}.daemon-unreachable-card{width:min(100%,440px);padding:32px;border:1px solid var(--line);border-radius:14px;background:var(--panel);box-shadow:var(--shadow)}.daemon-unreachable-brand{display:flex;align-items:center;gap:10px;color:var(--text);font-size:13px;font-weight:700;letter-spacing:.02em}.daemon-unreachable-mark{display:grid;width:30px;height:30px;place-items:center;border-radius:8px;background:var(--cyan);color:var(--accent-ink);font-size:12px;font-weight:800}.daemon-unreachable-card h1{margin:26px 0 10px;font-size:23px;letter-spacing:-.02em}.daemon-unreachable-card p{margin:0 0 8px;color:var(--soft);font-size:13px;line-height:1.55}.daemon-unreachable-command{display:block;margin:14px 0 22px;padding:10px 12px;overflow-x:auto;border:1px solid var(--line);border-radius:8px;background:var(--panel2);color:var(--cyan);font-family:ui-monospace,Cascadia Code,Fira Code,monospace;font-size:13px}.daemon-unreachable-retry{min-width:148px}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-delay:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:.01ms!important;transition-duration:.01ms!important}}.verdict-band{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,230px),1fr));gap:14px 24px;padding:18px 20px;margin-bottom:14px;background:linear-gradient(120deg,var(--panel),var(--panel2))}.verdict-band-summary{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.verdict-band-label,.verdict-band-caption{color:var(--text-muted);font-size:12px;letter-spacing:.07em}.verdict-band-value{margin:2px 0;color:var(--text);font-size:clamp(32px,3vw,36px);font-weight:780;letter-spacing:-.045em;font-variant-numeric:tabular-nums}.window-delta{display:inline-flex;align-items:center;width:fit-content;border:1px solid var(--line);border-radius:999px;padding:3px 7px;color:var(--text-2);background:var(--panel);font-size:12px;font-weight:700;white-space:nowrap}.window-delta-up{color:var(--rose)}.window-delta-down{color:var(--green)}.window-delta-new{color:var(--amber)}.verdict-band-trend{display:grid;align-content:center;gap:5px;color:var(--series-1);min-width:0}.verdict-band-trend span,.trend-sparkline-empty{color:var(--text-muted);font-size:12px}.trend-sparkline{width:100%;height:42px;overflow:visible}.trend-sparkline-empty{display:block;min-height:20px}.verdict-band-detail,.verdict-band-action{color:var(--text-2);font-size:12px}.verdict-band-detail strong{color:var(--text)}.verdict-band-action{justify-self:start;color:var(--cyan);text-decoration:none}.verdict-band-action:hover{color:var(--text);text-decoration:underline}.verdict-band-claim{color:var(--text-2)}.verdict-band-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.verdict-band-copy{border:1px solid var(--line);border-radius:7px;padding:5px 10px;color:var(--text);background:var(--panel);font-size:12px;font-weight:600;cursor:pointer}.verdict-band-copy:hover{border-color:var(--cyan);color:var(--cyan)}.rec-focus-highlight{outline:2px solid var(--cyan);outline-offset:2px}.rec-focus-banner{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;padding:5px 10px;border-radius:7px;background:color-mix(in srgb,var(--cyan) 12%,transparent);color:var(--text-2);font-size:12px}.rec-focus-banner-label{font-weight:600}.rec-focus-dismiss,.recs-focus-notice-dismiss{border:1px solid var(--line);border-radius:6px;padding:2px 8px;color:var(--text-2);background:var(--panel);font-size:12px;cursor:pointer}.rec-focus-dismiss:hover,.recs-focus-notice-dismiss:hover{color:var(--text);border-color:var(--cyan)}.recs-focus-notice{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;color:var(--text-2);background:var(--panel);font-size:12px}.section-subtitle{margin:2px 16px 8px;color:var(--text-muted);font-size:12px}.overview-secondary-kpis .kpi{padding:12px 14px;box-shadow:none}.overview-secondary-kpis .kpi-value{font-size:21px}.kpi-label-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.kpi-label-row .kpi-label{margin-bottom:6px}.overview-secondary-kpis .trend-sparkline{height:22px;margin-top:5px;color:var(--series-2)}@media(max-width:800px){.verdict-band{grid-template-columns:1fr}}.chip,.rec-confidence-tier{height:20px;padding:1px 7px;border:1px solid;font-size:12px;line-height:1}.rec-chip-row{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px}.rec-chip-overflow{display:inline-flex;align-items:center;gap:6px}.rec-chip-expander{min-height:20px;padding:1px 6px;border:1px solid rgba(148,163,184,.25);border-radius:999px;background:#94a3b81a;color:var(--text-2);font-size:12px;font-weight:700;line-height:1;cursor:pointer}.rec-chip-expander:hover{background:#94a3b82e}.chip-exact,.chip-list-equiv,.chip-obs-proxy,.chip-modeled,.rec-confidence-tier--modeled{background:#22d3ee1a;border-color:#22d3ee40;color:var(--cyan)}.chip-proxy,.chip-stale,.chip-live,.rec-confidence-tier--warning,.rec-confidence-tier--advisory{background:#fbbf241a;border-color:#fbbf2440;color:var(--amber)}.chip-experimental,.chip-directional,.rec-confidence-tier--directional{background:#a78bfa1a;border-color:#a78bfa40;color:var(--violet)}.chip-na{background:#94a3b81a;border-color:#94a3b840;color:var(--text-2)}.rec-pending-action-pill{color:var(--amber);font-size:12px;font-weight:700}.rec-action-toast{display:inline-flex;align-items:center;gap:10px;margin:8px 0 0;padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--panel2);color:var(--text);font-size:12px}.rec-action-toast-undo{border:0;padding:0;background:transparent;color:var(--cyan);font:inherit;font-weight:700;cursor:pointer}.rec-action-toast-undo:hover{color:var(--text);text-decoration:underline}.briefs-controls{display:flex;align-items:end;justify-content:space-between;gap:12px;margin-bottom:13px}.briefs-scope{display:grid;gap:5px;color:var(--muted);font-size:12px;font-weight:700}.briefs-scope select{min-width:220px}.briefs-prompt{margin:8px 0 0;padding:10px;overflow-x:auto;border:1px solid var(--line);border-radius:6px;background:var(--panel2);color:var(--text);font:12px / 1.45 var(--mono);white-space:pre-wrap}.briefs-lever+.briefs-lever{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}.context-composition-bar{height:1.5rem;margin-top:.25rem;overflow:hidden;background:var(--panel2)}.context-composition-segment{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text);font-size:12px;font-weight:700}.context-composition-segment-always_loaded{background:var(--accent)}.context-composition-segment-session_residual{background:var(--muted)}.context-composition-interpretation{margin:.75rem 0 0;color:var(--text)}.recommendations-summary-bar{display:flex;flex-wrap:wrap;gap:4px 10px;margin:0 0 10px;color:var(--text-2);font-size:12px}.recommendations-summary-bar span+span:before{margin-right:10px;color:var(--text-muted);content:"·"}.detector-status-details{margin-bottom:13px}.detector-status-details>summary{margin-bottom:8px;color:var(--text-2);font-size:12px;font-weight:700;cursor:pointer}.detector-status-details>.card{margin-bottom:0!important}.recs-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:14px 20px;padding:12px 14px;margin-bottom:16px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r)}.recs-toolbar-group{display:flex;flex-wrap:wrap;align-items:center;gap:7px;min-width:0;margin:0;padding:0;border:0}.recs-toolbar-legend{float:none;width:auto;padding:0;margin-right:4px;color:var(--text-muted);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.recs-chip{display:inline-flex;align-items:center;gap:5px;border-radius:99px;padding:4px 11px;font-size:12px;font-weight:700;color:var(--text-2);background:var(--panel2);border:1px solid var(--line);cursor:pointer;white-space:nowrap;transition:color .12s ease,border-color .12s ease,background .12s ease}.recs-chip:hover{color:var(--text);border-color:var(--cyan)}.recs-chip:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}.recs-chip--active{color:var(--cyan);background:#22d3ee1a;border-color:var(--cyan)}.recs-chip-count{color:var(--text-muted);font-weight:600}.recs-chip--active .recs-chip-count{color:var(--cyan)}.recs-toolbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:14px 18px;margin-left:auto}.recs-toolbar-label{display:inline-flex;align-items:center;gap:7px;color:var(--text-muted);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.recs-toolbar-select{padding:6px 9px;color:var(--text);color-scheme:dark;background:var(--panel2);border:1px solid var(--line);border-radius:8px;font-weight:600;letter-spacing:normal;text-transform:none;cursor:pointer}:root[data-theme=light] .recs-toolbar-select{color-scheme:light}.recs-toolbar-select:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}.bfc-headline{font-size:22px;font-weight:700;letter-spacing:-.01em;margin:6px 0 4px}.bfc-meter{position:relative;height:8px;border-radius:4px;background:#8492a62e;overflow:visible;margin:8px 0 4px}.bfc-meter-fill{height:100%;border-radius:4px 0 0 4px;max-width:100%}.bfc-fill-green{background:var(--green)}.bfc-fill-amber{background:var(--amber)}.bfc-fill-red{background:var(--red)}.bfc-tick{position:absolute;top:-3px;width:2px;height:14px;background:var(--muted);border-radius:1px;transform:translate(-50%);pointer-events:none}.bfc-caption{font-size:12px;color:var(--muted);margin:2px 0 6px}.bfc-state-chip{font-size:12px;font-weight:700;letter-spacing:.07em}.bfc-chip-green{background:#34d3991f;color:var(--green);border-color:#34d39947}.bfc-chip-amber{background:#fbbf241f;color:var(--amber);border-color:#fbbf2447}.bfc-chip-red{background:#fb71851f;color:var(--red);border-color:#fb718547}.bfc-delta-chip{font-size:12px;font-weight:600}.bfc-delta-amber{background:#fbbf241f;color:var(--amber);border-color:#fbbf2447}.bfc-delta-green{background:#34d3991f;color:var(--green);border-color:#34d39947}.bfc-delta-neutral{background:#8492a61a;color:var(--muted);border-color:transparent}.bfc-chip-low-confidence{background:#a78bfa1f;color:var(--violet);border-color:#a78bfa47;font-size:12px;font-weight:700;letter-spacing:.06em}.scope-strip{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px;padding:8px 0 4px}.scope-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:var(--r);border:1px solid var(--line);background:var(--panel2);color:var(--text-2);font-size:12px;font-weight:600;cursor:pointer;transition:background .12s,border-color .12s,color .12s}.scope-chip:hover{background:var(--panel);border-color:var(--muted);color:var(--text)}.scope-chip--active{background:var(--panel);border-color:var(--text-muted);color:var(--text)}.scope-chip--global{border-color:color-mix(in srgb,var(--violet) 40%,transparent);color:var(--violet)}.scope-chip--global.scope-chip--active{background:color-mix(in srgb,var(--violet) 12%,var(--panel2));border-color:var(--violet);color:var(--violet)}.scope-chip--global:hover{background:color-mix(in srgb,var(--violet) 8%,var(--panel2));border-color:var(--violet);color:var(--violet)}.scope-chip--workspace{border-color:color-mix(in srgb,var(--blue) 40%,transparent);color:var(--blue)}.scope-chip--workspace.scope-chip--active{background:color-mix(in srgb,var(--blue) 12%,var(--panel2));border-color:var(--blue);color:var(--blue)}.scope-chip--workspace:hover{background:color-mix(in srgb,var(--blue) 8%,var(--panel2));border-color:var(--blue);color:var(--blue)}.scope-chip-count{font-weight:400;opacity:.75}:root[data-theme=light] .scope-chip--global{border-color:color-mix(in srgb,var(--violet) 50%,transparent)}:root[data-theme=light] .scope-chip--workspace{border-color:color-mix(in srgb,var(--blue) 50%,transparent)}@media(prefers-color-scheme:light){:root:not([data-theme=dark]) .scope-chip--global{border-color:color-mix(in srgb,var(--violet) 50%,transparent)}:root:not([data-theme=dark]) .scope-chip--workspace{border-color:color-mix(in srgb,var(--blue) 50%,transparent)}}.rec-scope-badge{display:inline-flex;align-items:center;padding:2px 7px;border-radius:99px;font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;line-height:1.4;flex-shrink:0}.rec-scope-badge--global{background:color-mix(in srgb,var(--violet) 15%,transparent);color:var(--violet);border:1px solid color-mix(in srgb,var(--violet) 35%,transparent)}.rec-scope-badge--workspace{background:color-mix(in srgb,var(--blue) 15%,transparent);color:var(--blue);border:1px solid color-mix(in srgb,var(--blue) 35%,transparent)}.rec-prompt-scope-caption{display:block;margin-top:4px;font-size:12px;color:var(--muted);font-style:italic}.recs-summary-header{background:var(--card-bg);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px 10px;margin-bottom:13px}.recs-summary-main{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 16px;margin-bottom:8px}.recs-summary-count{display:flex;align-items:baseline;gap:4px}.recs-summary-count-number{font-size:1.6rem;font-weight:700;color:var(--fg);line-height:1}.recs-summary-count-label{font-size:.9rem;color:var(--muted)}.recs-summary-lever{margin:0;font-size:.85rem;color:var(--fg)}.recs-summary-trio{display:flex;flex-wrap:wrap;gap:4px 16px;justify-content:flex-end;font-size:.8rem;color:var(--muted)}.recs-summary-trio strong{color:var(--fg);font-weight:600}.recs-summary-header .scope-strip{margin-bottom:10px}.fb5-panel-header{display:flex;align-items:center;gap:10px;margin-bottom:0}.fb5-status-pill{display:inline-block;padding:2px 10px;border-radius:99px;font-size:12px;font-weight:700}.fb5-status-installed{background:#22c55e26;color:var(--green, #22c55e);border:1px solid var(--green, #22c55e)}.fb5-status-not-installed{background:var(--panel2);color:var(--text-muted);border:1px solid var(--line)}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .fb5-status-installed{background:#22c55e1f}}.fb5-guard-cards{display:flex;flex-direction:column;gap:10px;margin-bottom:10px}.fb5-guard-card{background:var(--panel2);border:1px solid var(--line);border-radius:var(--r);padding:10px 14px}.fb5-guard-card-title{font-size:12px;font-weight:700;margin-bottom:8px;color:var(--text)}.fb5-guard-inputs{display:flex;flex-wrap:wrap;gap:8px}.fb5-guard-label{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2)}.fb5-guard-input{width:88px;padding:3px 6px!important;font-size:12px!important}.fb5-field-hint{font-size:12px;color:var(--text-muted);margin:0 0 12px;font-family:monospace}.fb5-actions{display:flex;flex-wrap:wrap;gap:10px 18px;margin-bottom:6px}.fb5-action-group{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.fb5-secondary-btn{background:transparent;border:1px solid var(--line);border-radius:var(--r);color:var(--text-2);padding:6px 12px;font-size:12px;cursor:pointer;transition:border-color .12s,color .12s}.fb5-secondary-btn:hover:not(:disabled){border-color:var(--cyan);color:var(--text)}.fb5-secondary-btn:disabled{opacity:.5;cursor:not-allowed}.fb5-takes-effect{font-size:12px;color:var(--text-muted);margin:0}.fb6-end-btn{padding:3px 10px;background:transparent;border:1px solid var(--line);border-radius:var(--r);color:var(--text-2);font-size:12px;cursor:pointer;transition:border-color .12s,color .12s;white-space:nowrap}.fb6-end-btn:hover:not(:disabled){border-color:var(--red, #ef4444);color:var(--red, #ef4444)}.fb6-end-btn:disabled{opacity:.5;cursor:not-allowed}.fb6-bg-cta{font-size:12px;color:var(--text-muted);display:inline-flex;align-items:center;gap:4px;white-space:nowrap}.fb6-code{font-family:monospace;font-size:12px;background:var(--panel2);border:1px solid var(--line);border-radius:4px;padding:1px 4px}.fb6-copy-btn{background:transparent;border:none;color:var(--cyan);font-size:12px;cursor:pointer;padding:0 4px}.fb6-bulk-end-btn{background:transparent;border:1px solid var(--line);border-radius:var(--r);color:var(--text-2);padding:6px 14px;font-size:12px;cursor:pointer;transition:border-color .12s,color .12s}.fb6-bulk-end-btn:hover{border-color:var(--red, #ef4444);color:var(--red, #ef4444)}.fb6-ended-line{font-size:12px;color:var(--text-muted);margin:8px 0 0}.briefs-window{color:var(--muted);font-size:12px;font-weight:700}.briefs-verdict{padding:14px 16px}.briefs-verdict-line{margin:0;font-size:15px;font-weight:600;line-height:1.5}.briefs-verdict-line strong{font-size:18px;font-weight:800}.briefs-verdict-sep{color:var(--line)}.briefs-friction{font-weight:700;text-transform:uppercase;letter-spacing:.04em;font-size:12px}.briefs-friction-LOW{color:var(--green)}.briefs-friction-ELEVATED{color:var(--amber)}.briefs-friction-HIGH{color:var(--red)}.brief-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:13px 0}.brief-tile{padding:14px 16px;border:1px solid var(--line);border-radius:var(--r);background:var(--panel)}.brief-tile-label{color:var(--muted);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.brief-tile-value{margin:6px 0 4px;font-size:24px;font-weight:800;letter-spacing:-.01em}.brief-tile-delta{font-size:12px;font-weight:700}.brief-tile-delta-up{color:var(--red)}.brief-tile-delta-down{color:var(--green)}.brief-tile-delta-flat,.brief-tile-delta-none{color:var(--text-muted)}.briefs-action-list{margin:0;padding:0 0 0 20px;display:grid;gap:12px}.briefs-action{display:flex;align-items:start;justify-content:space-between;gap:12px}.briefs-action-main{display:grid;gap:3px}.briefs-action-copy{flex-shrink:0}.briefs-details{margin-top:13px}.briefs-details>summary{cursor:pointer;padding:10px 14px;border:1px solid var(--line);border-radius:var(--r);background:var(--panel);color:var(--muted);font-size:13px;font-weight:700}.briefs-details[open]>summary{margin-bottom:12px}.first-run-step-hint{margin:2px 0 0 22px;font-size:11.5px;color:var(--muted);line-height:1.4}.first-run-activation{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}.first-run-activation-title{margin:0 0 8px;font-size:12px;font-weight:700;color:var(--soft);text-transform:uppercase;letter-spacing:.03em}.first-run-activation ul{display:grid;gap:8px;margin:0;padding-left:22px;color:var(--soft);font-size:12px;line-height:1.45}.first-run-activation a{color:var(--teal);white-space:nowrap}.first-run-glossary-link{margin:12px 0 0;font-size:12px;color:var(--muted)}.first-run-glossary-link a{color:var(--teal)}.nav-btn-small{font-size:12px;opacity:.85}.glossary-section p{margin:0 0 8px;font-size:13px;line-height:1.55;color:var(--soft)}.glossary-section p:last-child{margin-bottom:0}.glossary-chip-list{margin:0}.glossary-chip-row{display:grid;grid-template-columns:160px 1fr;gap:12px;align-items:start;padding:6px 0;border-top:1px solid var(--line)}.glossary-chip-row:first-child{border-top:none}.glossary-chip-row dt{margin:0}.glossary-chip-row dd{margin:0;font-size:12.5px;line-height:1.5;color:var(--soft)}.prompt-code{display:block;width:100%;min-height:180px;resize:vertical;box-sizing:border-box;min-width:0;max-width:100%;max-height:240px;overflow:auto;margin:12px 0;padding:14px;border:1px solid var(--line);border-radius:var(--r);background:var(--bg);color:var(--text);font:12px/1.6 ui-monospace,Consolas,monospace;white-space:pre-wrap;overflow-wrap:anywhere}.prompt-code:focus-visible{outline:2px solid var(--cyan);outline-offset:3px}.fb5-guard-label{flex-wrap:wrap}.fb5-guard-input{flex-shrink:0;width:88px}.fb5-guard-input[aria-label="Context window (tokens)"]{width:116px}.verdict-prompt{grid-column:1 / -1}.rec-prompt-artifact textarea{font-family:ui-monospace,Consolas,monospace}.rec-collapsed-row>.rec-prompt-artifact,.rec-group-header>.rec-prompt-artifact{margin:16px 0}.rec-actions{justify-content:flex-start}.rec-actions-hint{text-align:left}.rec-ranking-explainer{max-width:78ch;line-height:1.6}.recs-summary-main{align-items:baseline;gap:8px 20px}.recs-summary-trio{display:none}.recs-remaining-queue>summary,.detector-status-details>summary{padding:14px 0}.briefs-action{display:list-item;padding:16px;border:1px solid var(--line);border-radius:var(--r)}.briefs-action-main{min-width:0;gap:10px}.briefs-action-main p{margin:0;line-height:1.6}.briefs-action-copy{margin-top:12px}.briefs-action-main code{overflow-wrap:anywhere}@media(max-width:640px){.rec-header-row{align-items:flex-start}.rec-title{flex-basis:100%;overflow-wrap:anywhere}.rec-actions{gap:10px}.rec-action-btn{min-height:40px}.briefs-action{padding:12px}}
|