@rulemetric/cli 0.12.7 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-command.js +1 -1
- package/dist/{chunk-INSKP5ED.js → chunk-25Q3Y7TC.js} +1 -1
- package/dist/{chunk-YSLKV4XC.js → chunk-25RDT32M.js} +1 -1
- package/dist/{chunk-HQCPGDQE.js → chunk-2EX27VJ3.js} +1 -1
- package/dist/{chunk-MJ5H7RDK.js → chunk-3MDEGOUG.js} +1 -1
- package/dist/{chunk-AGK5AUWT.js → chunk-3UPHCQWI.js} +1 -1
- package/dist/{chunk-FE2UWAIP.js → chunk-4COLIGD7.js} +1 -1
- package/dist/chunk-4FSQSETR.js +12 -0
- package/dist/{chunk-2KJAM2NG.js → chunk-4N43IBXH.js} +1 -1
- package/dist/chunk-4VN5PG2S.js +1 -0
- package/dist/chunk-5MXZJWQS.js +2 -0
- package/dist/{chunk-OOFGV7EX.js → chunk-5XK6LB2T.js} +1 -1
- package/dist/{chunk-MILLBGCB.js → chunk-6GAIYJ6K.js} +1 -1
- package/dist/chunk-6QLZT7EP.js +1 -0
- package/dist/{chunk-GRPUY2EZ.js → chunk-6W2GSV4O.js} +1 -1
- package/dist/{chunk-W23MESHM.js → chunk-6WQG6C7F.js} +1 -1
- package/dist/chunk-6XTLP2G7.js +1 -0
- package/dist/{chunk-E4RGYYBC.js → chunk-6ZPSVZNH.js} +1 -1
- package/dist/{chunk-TBU5SWA4.js → chunk-7AWFSFR7.js} +1 -1
- package/dist/{chunk-UGACB66X.js → chunk-APDRR6FS.js} +1 -1
- package/dist/{chunk-AFYZYXQ3.js → chunk-BG55WDDX.js} +1 -1
- package/dist/chunk-BZS5QRWB.js +4 -0
- package/dist/chunk-C42NTI2V.js +3 -0
- package/dist/{chunk-A2LHEUNW.js → chunk-CYYDQFRY.js} +1 -1
- package/dist/{chunk-NKJTNGXR.js → chunk-DUBBL57L.js} +1 -1
- package/dist/{chunk-E7XOYGL5.js → chunk-F6DAHCJC.js} +8 -8
- package/dist/{chunk-WCIX5KWG.js → chunk-GBWQENAH.js} +1 -1
- package/dist/{chunk-GOA5Q6TY.js → chunk-GJBS6QYC.js} +1 -1
- package/dist/{chunk-FUYR7CFD.js → chunk-H3BCWSYO.js} +1 -1
- package/dist/chunk-HLNHBZLI.js +1 -0
- package/dist/{chunk-WO6MS654.js → chunk-HLQZR4XJ.js} +1 -1
- package/dist/{chunk-DCH3QWB7.js → chunk-I3M5VBLT.js} +1 -1
- package/dist/{chunk-WMIUFMDI.js → chunk-J5HW45PZ.js} +9 -9
- package/dist/{chunk-CPDMJGTC.js → chunk-J6QMBMC2.js} +1 -1
- package/dist/{chunk-W67DO5PT.js → chunk-JNFB22FD.js} +1 -1
- package/dist/chunk-JWFRI32Y.js +3 -0
- package/dist/{chunk-WTMJSL7R.js → chunk-KCOJLTVX.js} +1 -1
- package/dist/chunk-KINIFUZQ.js +1 -0
- package/dist/{chunk-RFISMWRW.js → chunk-KV5A77XW.js} +1 -1
- package/dist/{chunk-DPCAPIQB.js → chunk-LTQ5BJYL.js} +1 -1
- package/dist/{chunk-G3HODHFN.js → chunk-M2VVRQKA.js} +1 -1
- package/dist/chunk-MLV2RHRE.js +1 -0
- package/dist/{chunk-UA5GEVGW.js → chunk-MNQPCNGQ.js} +1 -1
- package/dist/chunk-N7GK33PU.js +1 -0
- package/dist/{chunk-L54TWWBY.js → chunk-NBEZ5FAU.js} +1 -1
- package/dist/{chunk-PWTTCSQA.js → chunk-NRYLYMDM.js} +1 -1
- package/dist/{chunk-BTQQPQRG.js → chunk-O2HCD6XL.js} +1 -1
- package/dist/chunk-OZNKMJ5B.js +1 -0
- package/dist/{chunk-VYZKKSX4.js → chunk-P2WSDHIA.js} +1 -1
- package/dist/chunk-PPXOC7IV.js +1 -0
- package/dist/{chunk-5PM4E27L.js → chunk-PVGUDJD7.js} +1 -1
- package/dist/chunk-QFKUSNUB.js +1 -0
- package/dist/{chunk-EZHL527S.js → chunk-QTCWOIT4.js} +1 -1
- package/dist/chunk-R4QIPG4V.js +2 -0
- package/dist/{chunk-O65AQZYB.js → chunk-RGUCR7T6.js} +1 -1
- package/dist/chunk-RJX75Y7J.js +1 -0
- package/dist/{chunk-KJRMGTAO.js → chunk-RK663O4M.js} +1 -1
- package/dist/chunk-RO3ZZVCG.js +1 -0
- package/dist/{chunk-NF2BIEAF.js → chunk-SBGXIPRN.js} +1 -1
- package/dist/{chunk-S2SKT5PV.js → chunk-SN3CHV66.js} +1 -1
- package/dist/chunk-U3XKXJ3A.js +5 -0
- package/dist/chunk-U7TBEC3I.js +5 -0
- package/dist/{chunk-CZTTW3MZ.js → chunk-UE76F2NQ.js} +1 -1
- package/dist/chunk-UM4CBCXI.js +1 -0
- package/dist/{chunk-22ZDUL6H.js → chunk-UYPBIXF2.js} +1 -1
- package/dist/{chunk-5N5S3NKS.js → chunk-V2USQH27.js} +1 -1
- package/dist/{chunk-PVPYLKB3.js → chunk-VH2EAP4J.js} +1 -1
- package/dist/{chunk-UTAETY5Z.js → chunk-VIQ25ORK.js} +1 -1
- package/dist/chunk-VMJH4DNA.js +14 -0
- package/dist/{chunk-XFAFMYIP.js → chunk-VXUKXGRX.js} +1 -1
- package/dist/{chunk-BJSVATVJ.js → chunk-WH3IPXXQ.js} +2 -2
- package/dist/chunk-WHQ4BDSM.js +4 -0
- package/dist/{chunk-GHWBW2IW.js → chunk-WJZY5Y22.js} +1 -1
- package/dist/chunk-WOJ733IB.js +1 -0
- package/dist/{chunk-AKXGUQ5B.js → chunk-WQX4RRBQ.js} +1 -1
- package/dist/{chunk-ARC4Q3GL.js → chunk-WY3VVX3R.js} +1 -1
- package/dist/{chunk-Z4YVOVMM.js → chunk-Y7QIOPN5.js} +1 -1
- package/dist/{chunk-UKOI2Q4J.js → chunk-YI2OWO6R.js} +1 -1
- package/dist/{chunk-DSJNZWCZ.js → chunk-ZGW3N3A6.js} +1 -1
- package/dist/commands/antigravity/backfill.js +1 -1
- package/dist/commands/auth/create-key.js +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/revoke-key.js +1 -1
- package/dist/commands/auth/signup.js +1 -1
- package/dist/commands/auth/status.js +1 -1
- package/dist/commands/capture/scope.js +1 -1
- package/dist/commands/catalog/index.js +1 -1
- package/dist/commands/catalog/recommend.js +1 -1
- package/dist/commands/crons/list.js +1 -1
- package/dist/commands/crons/run.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/eval-targets/create.js +1 -1
- package/dist/commands/eval-targets/list.js +1 -1
- package/dist/commands/evals/agent.js +3 -3
- package/dist/commands/evals/auto-run.js +1 -1
- package/dist/commands/evals/benchmark.js +1 -1
- package/dist/commands/evals/compare.js +1 -1
- package/dist/commands/evals/create.js +1 -1
- package/dist/commands/evals/optimize-description.js +1 -1
- package/dist/commands/evals/optimize.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/evals/run.js +1 -1
- package/dist/commands/evals/validate-judge.js +1 -1
- package/dist/commands/experiments/list.js +1 -1
- package/dist/commands/gateway/ensure.js +1 -1
- package/dist/commands/hooks/emit-instructions.js +1 -1
- package/dist/commands/hooks/install.js +1 -1
- package/dist/commands/hooks/run.js +1 -1
- package/dist/commands/hooks/uninstall.js +1 -1
- package/dist/commands/instructions/create.js +1 -1
- package/dist/commands/instructions/dedupe.js +1 -1
- package/dist/commands/instructions/delete.js +1 -1
- package/dist/commands/instructions/fork.js +1 -1
- package/dist/commands/instructions/get.js +1 -1
- package/dist/commands/instructions/list.js +1 -1
- package/dist/commands/instructions/promote.js +1 -1
- package/dist/commands/instructions/pull.js +1 -1
- package/dist/commands/instructions/restore.js +1 -1
- package/dist/commands/instructions/retract.js +1 -1
- package/dist/commands/instructions/upstream.js +1 -1
- package/dist/commands/instructions/versions.js +1 -1
- package/dist/commands/launcher.js +1 -1
- package/dist/commands/local/down.js +1 -1
- package/dist/commands/local/up.js +1 -1
- package/dist/commands/org/current.js +1 -1
- package/dist/commands/org/list.js +1 -1
- package/dist/commands/org/switch.js +1 -1
- package/dist/commands/packs/add-instruction.js +1 -1
- package/dist/commands/packs/apply.js +1 -1
- package/dist/commands/packs/create.js +1 -1
- package/dist/commands/packs/fork.js +1 -1
- package/dist/commands/packs/get.js +1 -1
- package/dist/commands/packs/list.js +1 -1
- package/dist/commands/packs/remove-instruction.js +1 -1
- package/dist/commands/proxy/env.js +1 -1
- package/dist/commands/proxy/logs.js +1 -1
- package/dist/commands/proxy/restart.js +1 -1
- package/dist/commands/proxy/setup.js +1 -1
- package/dist/commands/proxy/start.js +1 -1
- package/dist/commands/proxy/status.js +1 -1
- package/dist/commands/proxy/stop.js +1 -1
- package/dist/commands/research/backfill.js +1 -1
- package/dist/commands/research/tail-transcript.js +1 -1
- package/dist/commands/service/install.js +1 -1
- package/dist/commands/service/status.js +1 -1
- package/dist/commands/service/uninstall.js +1 -1
- package/dist/commands/sessions/analyze.js +1 -1
- package/dist/commands/sessions/delete.js +1 -1
- package/dist/commands/sessions/end.js +1 -1
- package/dist/commands/sessions/import.js +1 -1
- package/dist/commands/sessions/list.js +1 -1
- package/dist/commands/sessions/start.js +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/skills/export-approved.js +1 -1
- package/dist/commands/skills/install.js +1 -1
- package/dist/commands/skills/list.js +1 -1
- package/dist/commands/skills/publish.js +1 -1
- package/dist/commands/skills/search.js +1 -1
- package/dist/commands/skills/update.js +1 -1
- package/dist/commands/suggestions/accept.js +1 -1
- package/dist/commands/suggestions/auto.js +1 -1
- package/dist/commands/suggestions/dismiss.js +1 -1
- package/dist/commands/suggestions/list.js +1 -1
- package/dist/commands/suggestions/refresh.js +1 -1
- package/dist/commands/suggestions/undo.js +1 -1
- package/dist/dashboard/Dashboard.js +1 -1
- package/dist/dashboard/data.js +1 -1
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
- package/dist/dashboard/launcher/api.js +1 -1
- package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
- package/dist/{dist-XEWF3R3N.js → dist-45KJH5M7.js} +1 -1
- package/dist/lib/active-org-refresh.js +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/antigravity-transcript.js +1 -1
- package/dist/lib/api-client.js +1 -1
- package/dist/lib/codex-exec.js +1 -1
- package/dist/lib/ensure-api-key.js +1 -1
- package/dist/lib/ensure-fresh-token.js +1 -1
- package/dist/lib/eval-analyzer.js +1 -1
- package/dist/lib/eval-benchmark.js +1 -1
- package/dist/lib/eval-candidate-run.js +1 -1
- package/dist/lib/eval-case-generator.js +1 -1
- package/dist/lib/eval-conversation-handler.js +1 -1
- package/dist/lib/eval-executor.js +1 -1
- package/dist/lib/eval-grader.js +1 -1
- package/dist/lib/eval-meta-judge.js +1 -1
- package/dist/lib/eval-resume.js +1 -1
- package/dist/lib/eval-run-batch.js +1 -1
- package/dist/lib/eval-trigger-tester.js +1 -1
- package/dist/lib/evolution-enrolment.js +1 -1
- package/dist/lib/gateway-entry.js +1 -1
- package/dist/lib/gateway.js +1 -1
- package/dist/lib/harbor-readiness.js +1 -0
- package/dist/lib/insights/generation/installed-asks.js +1 -1
- package/dist/lib/insights/nomination/nominate.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/instruction-snapshot.js +1 -1
- package/dist/lib/instructions/acceptance/accept-events.js +1 -1
- package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
- package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -0
- package/dist/lib/instructions/acceptance/hook-install.js +1 -1
- package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
- package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
- package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
- package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
- package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
- package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
- package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
- package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
- package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
- package/dist/lib/jobs/handlers/distill-memories.js +1 -1
- package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -0
- package/dist/lib/jobs/handlers/harbor-ab.js +1 -0
- package/dist/lib/jobs/handlers/process-changelog.js +1 -1
- package/dist/lib/jobs/handlers/process-conversation.js +1 -1
- package/dist/lib/jobs/handlers/process-eval.js +1 -1
- package/dist/lib/jobs/handlers/process-insights.js +1 -1
- package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
- package/dist/lib/jobs/handlers/process-launch.js +1 -1
- package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
- package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
- package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
- package/dist/lib/jobs/shed-retry.js +1 -0
- package/dist/lib/judge-review-runner.js +1 -1
- package/dist/lib/llm-client.js +1 -1
- package/dist/lib/llm-json.js +1 -0
- package/dist/lib/machine-pause-detector.js +1 -1
- package/dist/lib/manual-tasks-meta.js +1 -1
- package/dist/lib/manual-tasks.js +1 -1
- package/dist/lib/projects/workspace/worktree.js +1 -1
- package/dist/lib/refine-cases.js +1 -1
- package/dist/lib/research-client.js +1 -1
- package/dist/lib/retraction.js +1 -1
- package/dist/lib/reviewer-detect.js +1 -1
- package/dist/lib/setup-steps.js +1 -1
- package/dist/lib/telemetry.js +1 -1
- package/dist/lib/terminal-target-heartbeat.js +1 -1
- package/dist/lib/tool-bin.js +1 -0
- package/dist/lib/transcript-instruction-linking.js +1 -0
- package/dist/lib/transcript-sync.js +1 -1
- package/dist/lib/work-report.js +1 -0
- package/oclif.manifest.json +336 -329
- package/package.json +8 -7
- package/dist/chunk-3DZD322E.js +0 -1
- package/dist/chunk-47YDQYTD.js +0 -14
- package/dist/chunk-5OX6YKTR.js +0 -5
- package/dist/chunk-APXQLQZY.js +0 -1
- package/dist/chunk-C6GLNE6X.js +0 -1
- package/dist/chunk-CNQ5DTNC.js +0 -1
- package/dist/chunk-EVD5A3VI.js +0 -1
- package/dist/chunk-GWDZNGUP.js +0 -2
- package/dist/chunk-LUCVMLHV.js +0 -1
- package/dist/chunk-QBNLZJIR.js +0 -6
- package/dist/chunk-RIVEBBZC.js +0 -3
- package/dist/chunk-RLEMDKQ4.js +0 -12
- package/dist/chunk-TZA4HAVF.js +0 -1
- package/dist/chunk-UUFCTEBT.js +0 -1
- package/dist/chunk-UXB6DRR7.js +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Re}from"./chunk-M7QSC64D.js";import{i as Ae}from"./chunk-DPCAPIQB.js";import{c as we}from"./chunk-G7V4ZZZ3.js";import{a as Pe,b as ye,c as ve,d as ke,e as ee,f as Ce}from"./chunk-W23MESHM.js";import{b as ce,i as ue,j as pe,k as de,l as ge,m as me,n as fe}from"./chunk-LB24UKHZ.js";import{d as he,e as be,g as $e}from"./chunk-PWTTCSQA.js";import{d as se,e as Z,f as le}from"./chunk-VBXL7XO7.js";import{e as P,f as K}from"./chunk-UGACB66X.js";import{a as u}from"./chunk-ZLLER3HP.js";import{createHash as We}from"node:crypto";import{existsSync as Ee,readFileSync as Se,writeFileSync as Ne}from"node:fs";var W=u(a=>We("sha256").update(a).digest("hex"),"sha256"),Ie=1.3,te=4,Le=20;function Fe(a,i){if(!a.configured||i<=0)return te;let t=Math.ceil(a.minPairs*Ie/i);return Math.min(Le,Math.max(te,t))}u(Fe,"passCapFor");function je(a,i=10,t=te){if(a<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let l=Math.ceil(i*Ie),e=Math.min(t,Math.ceil(l/a)),r=e*a;return r<i?{passes:e,expectedPairs:r,feasible:!1,reason:`${a} live case(s) x ${t} passes = ${a*t} pairs at best, below the ${i} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:e,expectedPairs:r,feasible:!0}}u(je,"planPasses");var Ue=60,qe=u(a=>typeof a=="object"&&a!==null&&typeof a.withScore=="number"&&typeof a.withoutScore=="number","isPair");function Ge(a,i,t){let l=[...a].sort((e,r)=>Date.parse(r.createdAt)-Date.parse(e.createdAt));for(let e of l){if(e.applied)continue;let r=e.gates?.accumulation;if(!r||typeof r!="object"||r.priorContentHash!==i||r.targetPairs!==t||typeof r.candidateContentHash!="string"||!Array.isArray(r.pairs))continue;let o=r.pairs.filter(qe);if(o.length===r.pairs.length&&!(o.length>=t))return{promotionId:e.id,candidateContentHash:r.candidateContentHash,pairs:o,runs:typeof r.runs=="number"?r.runs:1}}return null}u(Ge,"findOpenAccumulation");var Be=5,xe=u(a=>Array.isArray(a)?a.filter(i=>typeof i=="string"):[],"stringList"),j=u(a=>typeof a=="number"&&Number.isFinite(a)?a:null,"finite");function Xe(a,i,t=Be){let l=[...a].filter(o=>o.fromContentHash===i).sort((o,g)=>Date.parse(g.createdAt)-Date.parse(o.createdAt)),e=[],r=new Set;for(let o of l){let g=o.toContentHash??o.id;if(r.has(g))continue;r.add(g);let y=o.verdict??null,S=j(y?.delta),x=j(y?.ci?.lower),H=j(y?.ci?.upper),C=j(y?.nWith),ne=y?.sufficient===!0&&S!=null&&x!=null&&H!=null&&C!=null?{delta:S,ciLower:x,ciUpper:H,nPairs:C}:null;if(e.push({decision:typeof o.decision=="string"?o.decision:"unknown",applied:o.applied===!0,at:typeof o.createdAt=="string"?o.createdAt:"",rationale:typeof o.proposalRationale=="string"?o.proposalRationale:"",touched:xe(o.touchedSections),refusals:xe(o.refusals),measured:ne}),e.length>=t)break}return e}u(Xe,"summarisePriorDecisions");function ze(a,i){let t=i.accumulate??(a.autoEvolveAccumulate===!0||a.autoEvolveAccumulate==="true"),l=i.accumulateTargetPairs??a.autoEvolveAccumulateTarget,e=typeof l=="string"?Number.parseInt(l,10):l,r=typeof e=="number"&&Number.isInteger(e)&&e>0?e:Ue;return{enabled:t,targetPairs:r}}u(ze,"readAccumulateConfig");function Qe(a){let i=a.accumulateEnabled&&a.pairCount<a.targetPairs;return{apply:a.consented&&!i,peeking:i}}u(Qe,"resolveApply");async function it(a,i){let t=u(n=>i?.logger?.info?.(n)??console.log(n),"log"),{evalTargetId:l}=a,e=`[cron_instruction_evolution] ${l}`,r=await P(`/api/eval-targets/${l}`),o=r.metadata??{},g=null,y=!1;if(r.name.startsWith("/")&&Ee(r.name))try{if(g=Se(r.name,"utf8"),g!==r.content){let n=await K(`/api/eval-targets/${l}/sync-content`,{content:g});y=n.synced,t(`${e}: target content drifted from disk by ${Math.abs(g.length-r.content.length)} chars \u2014 synced to disk truth (v${n.version}). Prior verdicts against the old text dissolve via content-hash keying.`),r={...r,content:g,version:n.version}}}catch(n){t(`${e}: disk sync failed (${n instanceof Error?n.message:String(n)}) \u2014 measuring the stored snapshot`)}let S=!1;try{S=(await P("/api/settings/evolution-account")).paused}catch(n){t(`${e}: could not read the account switch (${n instanceof Error?n.message:String(n)}) \u2014 pausing to be safe`),S=!0}if(S)return t(`${e}: PAUSED for the whole account (profiles.evolution_paused) \u2014 no model budget spent.`),{skipped:"paused-account"};if(pe(o))return t(`${e}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let x=Re(r);if(x)return t(`${e}: ${x.reason}`),x;let H=a.apply??(o.autoEvolveApply===!0||o.autoEvolveApply==="true"),C=Ve(o);if(C==null){if(H)return t(`${e}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};t(`${e}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),C=[]}let $=(await P(`/api/eval-targets/${l}/evals`)).filter(n=>!n.retiredAt);if($.length===0)return{skipped:"no-live-cases"};let N=ue(o);N.note&&t(`${e}: ${N.note}`);let v=je($.length,N.minPairs,Fe(N,$.length));if(!v.feasible)return t(`${e}: cannot reach a sufficient verdict \u2014 ${v.reason}`),{skipped:"cannot-reach-min-n",reason:v.reason};let He=de({liveCases:$.length,passes:v.passes});t(`${e}: budget for this run \u2014 ${fe(He)}`);let U=await P(`/api/eval-targets/${l}/judge-calibration`);if(!U.powerCheck.adequate){let n=(U.powerCheck.reasons??[]).join("; ");return t(`${e}: not adequately powered, skipping before spending budget \u2014 ${n}`),{skipped:"not-adequate",reason:n}}let re=le,_e=Date.now()-re*24*60*60*1e3,q=await P(`/api/eval-targets/${l}/promotions?limit=200`),ae=q.promotions.filter(n=>n.applied&&Date.parse(n.createdAt)>=_e).length;if(ae>=Z)return t(`${e}: change budget looks exhausted (${ae}/${Z} applied in ${re}d), skipping before spending budget`),{skipped:"budget-exhausted"};try{let n=await P("/api/usage/current-limits"),c=we({limits:n,now:new Date});if(!c.ok)return t(`${e}: deferring before spending budget \u2014 ${c.reason}`),{skipped:"quota-exhausted",reason:c.reason}}catch(n){t(`${e}: quota unknown (${n instanceof Error?n.message:String(n)}) \u2014 proceeding`)}let L=se();if(!L.green)return t(`${e}: A/A canary is RED \u2014 halting. ${L.failures.join(" | ")}`),{skipped:"canary-red",reason:L.failures.join(" | ")};let G=r.content,D=W(G),p=ze(o,a),k=p.enabled?Ge(q.promotions,D,p.targetPairs):null,m,F,w=[],_=0,B=ce,f=k?null:ye(o,D);if(f){m=f.content,F="",B=0;try{w=await ke({evalTargetId:l,candidateContentHash:f.hash})}catch(n){return t(`${e}: could not rebuild banked pairs (${n instanceof Error?n.message:String(n)})`),{skipped:"resume-read-failed",reason:f.hash}}t(`${e}: resuming interrupted cycle \u2014 ${w.length}/${f.plannedPairs} pair(s) rebuilt from eval_runs, no proposal call spent`)}else if(k){let n=await P(`/api/promotions/${k.promotionId}`);if(W(n.toContent)!==k.candidateContentHash)return t(`${e}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:k.promotionId};m=n.toContent,F=n.proposalRationale??"",w=k.pairs,_=k.runs,B=0,t(`${e}: continuing accumulation ${k.promotionId} \u2014 ${w.length}/${p.targetPairs} pair(s) carried from ${_} prior run(s)`)}else{let n=U.caseDiscrimination?.cases??[],c=[];if(r.name.startsWith("/")){let s=r.name.slice(0,r.name.lastIndexOf("/"));try{let b=await P(`/api/insights/evidence?projectPath=${encodeURIComponent(s)}`);b.analyzedAt&&(c=[...b.friction.map(Y=>`Real-session friction (insights, ${b.analyzedAt.slice(0,10)}): ${Y}`),...b.whatWorks.map(Y=>`Working well in real sessions \u2014 do not break: ${Y}`)],c.length>0&&t(`${e}: proposer sees ${b.friction.length} friction + ${b.whatWorks.length} what-works item(s) from insights`))}catch(b){t(`${e}: insights evidence unavailable (${b instanceof Error?b.message:String(b)}) \u2014 proposing without it`)}}let T=[];try{T=Xe(q.promotions,D)}catch(s){t(`${e}: could not summarise prior decisions (${s instanceof Error?s.message:String(s)}) \u2014 proposing without them`)}T.length>0&&t(`${e}: proposer sees ${T.length} prior decision(s) against this exact body (${T.map(s=>`${s.decision}${s.measured?"/measured":""}`).join(", ")})`);let M=await Ae({currentContent:r.content,targetType:r.type,targetName:r.name,immutableSections:C,evidence:{nonDiscriminating:n.filter(s=>!s.discriminating).map(s=>`${s.name??s.assertion??"unnamed"} \u2014 ${s.note}`),weakest:n.filter(s=>s.discriminating&&s.withPassRate<s.withoutPassRate).map(s=>({name:s.name??s.assertion??"unnamed",withPassRate:s.withPassRate,withoutPassRate:s.withoutPassRate})),priorDecisions:T,notes:c}});if(!M.ok)return t(`${e}: no usable proposal \u2014 ${M.reason}`),{skipped:"no-proposal",reason:M.reason};m=M.proposal.candidateContent,F=M.proposal.rationale}let I=f?ve({plannedPairs:f.plannedPairs||v.expectedPairs,carriedPairs:w.length,liveCases:$.length}):v.passes;t(`${e}: measuring ${$.length} case(s) x ${I} pass(es) = up to ${$.length*I} pairs, candidate vs prior version`+(f?` (resumed; ${w.length} pair(s) already banked)`:""));let A=[],X=[],Oe=Date.now(),oe=0,z=0;for(let n=1;n<=I;n++){let c=await $e({cases:$,candidateContent:m,priorVersionContent:G,concurrency:a.concurrency??2,runNumber:n,opts:{targetId:l,targetVersion:r.version??1,iteration:1,timeout:a.timeout??24e4,model:a.model,graderModel:a.graderModel,skipGrading:!1,targetType:r.type,targetName:r.name,candidateContentHash:W(m)},onLog:t});if(A.push(...c.pairs),X.push(...c.results),oe+=c.completed,z+=c.failed,t(`${e}: pass ${n}/${I} \u2014 ${c.pairs.length} pair(s), running total ${A.length}`),c.abortedForQuota){t(`${e}: stopping after pass ${n}/${I} \u2014 ${c.abortedForQuota}. Remaining passes would spend against an exhausted account.`);break}}let R=[...w,...A],O=he(X),Q=A.length>0,d=ge({runs:X,plannedPairs:v.expectedPairs,usablePairs:A.length,verdictPairs:Q?R.length:A.length,proposalCalls:B,passes:I,liveCases:$.length,wallMs:Date.now()-Oe});if(t(`${e}: ${oe} completed, ${z} failed, ${A.length} usable pair(s) \u2014 spent ~${d.modelCalls} model calls (${d.proposalCalls} proposal + ${d.executorCalls} executor + >=${d.graderCalls} grader) in ${(d.wallMs/6e4).toFixed(1)} min`+(Q?`; the ${d.verdictPairs} pair(s) behind this verdict resolve +/-${me(d.mde)} at 80% power`:"")),!Q)return{skipped:O.infrastructureFailed?"infrastructure-failure":"no-pairs",reason:O.infrastructureFailed?`${O.infrastructureFailed} run(s) never executed (${O.summary.describe()}) \u2014 the environment failed, not the target`:`${z} run(s) failed or were ungradeable`,cost:d};let V=be({pairs:R.length,minPairs:10,accounting:O});if(V.kind==="infrastructure-incomplete")return t(`${e}: not posting a verdict \u2014 ${V.reason}`),await ee({evalTargetId:l,meta:o,blob:Ce({content:m,hash:W(m),priorHash:D,plannedPairs:f?.plannedPairs||v.expectedPairs,now:new Date}),log:t,tag:e}),{skipped:"infrastructure-incomplete",reason:V.reason,cost:d};p.enabled&&t(`${e}: accumulated ${R.length}/${p.targetPairs} pair(s) over ${_+1} run(s) on one candidate`);let ie=H,{apply:Te,peeking:Me}=Qe({consented:ie,accumulateEnabled:p.enabled,pairCount:R.length,targetPairs:p.targetPairs});ie&&Me&&t(`${e}: interim readout at ${R.length}/${p.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let h=await K(`/api/eval-targets/${l}/promotions`,{candidateContent:m,proposalSource:"llm",proposalRationale:F,pairs:R,canaryGreen:L.green,measuredAgainstContentHash:D,immutableSections:C,apply:Te,measurementCost:d,...p.enabled?{accumulation:{candidateContentHash:W(m),priorContentHash:D,targetPairs:p.targetPairs,carriedPairs:w.length,runs:_+1}}:{}});t(`${e}: ${h.decision}${h.applied?" (APPLIED)":""} \u2014 ${h.rationale}`+(h.refusals.length>0?` | refusals: ${h.refusals.join("; ")}`:"")),(f||o[Pe])&&await ee({evalTargetId:l,meta:o,blob:null,log:t,tag:e});let J=!1,E;if(h.applied&&r.name.startsWith("/"))try{Ee(r.name)?Se(r.name,"utf8")!==G?E="file changed since measurement started \u2014 refusing to clobber; next cycle re-syncs":(Ne(r.name,m,"utf8"),J=!0):E="file no longer exists on disk",t(J?`${e}: measured improvement written to ${r.name} (undo: git checkout -- ${r.name})`:`${e}: NOT written to disk \u2014 ${E}`)}catch(n){E=n instanceof Error?n.message:String(n),t(`${e}: disk write-back failed \u2014 ${E}. The eval target is updated; the file is not.`)}return{decision:h.decision,applied:h.applied,nPairs:R.length,promotionId:h.id,cost:d,diskSynced:y,...h.applied?{fileWritten:J,...E?{fileWriteSkipped:E}:{}}:{},...p.enabled?{carriedPairs:w.length,accumulationRuns:_+1}:{}}}u(it,"cronInstructionEvolution");function Ve(a){let i=a.immutableSections;return i==null||!Array.isArray(i)?null:i.filter(t=>typeof t=="string")}u(Ve,"readImmutableSections");export{Ie as a,te as b,Le as c,Fe as d,je as e,Ue as f,Ge as g,Be as h,Xe as i,ze as j,Qe as k,it as l,Ve as m};
|
|
1
|
+
import{a as Re}from"./chunk-M7QSC64D.js";import{i as Ae}from"./chunk-LTQ5BJYL.js";import{c as we}from"./chunk-G7V4ZZZ3.js";import{a as Pe,b as ye,c as ve,d as ke,e as ee,f as Ce}from"./chunk-6WQG6C7F.js";import{b as ce,i as ue,j as pe,k as de,l as ge,m as me,n as fe}from"./chunk-LB24UKHZ.js";import{d as he,e as be,g as $e}from"./chunk-NRYLYMDM.js";import{d as se,e as Z,f as le}from"./chunk-VBXL7XO7.js";import{e as P,f as K}from"./chunk-APDRR6FS.js";import{a as u}from"./chunk-ZLLER3HP.js";import{createHash as We}from"node:crypto";import{existsSync as Ee,readFileSync as Se,writeFileSync as Ne}from"node:fs";var W=u(a=>We("sha256").update(a).digest("hex"),"sha256"),Ie=1.3,te=4,Le=20;function Fe(a,i){if(!a.configured||i<=0)return te;let t=Math.ceil(a.minPairs*Ie/i);return Math.min(Le,Math.max(te,t))}u(Fe,"passCapFor");function je(a,i=10,t=te){if(a<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let l=Math.ceil(i*Ie),e=Math.min(t,Math.ceil(l/a)),r=e*a;return r<i?{passes:e,expectedPairs:r,feasible:!1,reason:`${a} live case(s) x ${t} passes = ${a*t} pairs at best, below the ${i} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:e,expectedPairs:r,feasible:!0}}u(je,"planPasses");var Ue=60,qe=u(a=>typeof a=="object"&&a!==null&&typeof a.withScore=="number"&&typeof a.withoutScore=="number","isPair");function Ge(a,i,t){let l=[...a].sort((e,r)=>Date.parse(r.createdAt)-Date.parse(e.createdAt));for(let e of l){if(e.applied)continue;let r=e.gates?.accumulation;if(!r||typeof r!="object"||r.priorContentHash!==i||r.targetPairs!==t||typeof r.candidateContentHash!="string"||!Array.isArray(r.pairs))continue;let o=r.pairs.filter(qe);if(o.length===r.pairs.length&&!(o.length>=t))return{promotionId:e.id,candidateContentHash:r.candidateContentHash,pairs:o,runs:typeof r.runs=="number"?r.runs:1}}return null}u(Ge,"findOpenAccumulation");var Be=5,xe=u(a=>Array.isArray(a)?a.filter(i=>typeof i=="string"):[],"stringList"),j=u(a=>typeof a=="number"&&Number.isFinite(a)?a:null,"finite");function Xe(a,i,t=Be){let l=[...a].filter(o=>o.fromContentHash===i).sort((o,g)=>Date.parse(g.createdAt)-Date.parse(o.createdAt)),e=[],r=new Set;for(let o of l){let g=o.toContentHash??o.id;if(r.has(g))continue;r.add(g);let y=o.verdict??null,S=j(y?.delta),x=j(y?.ci?.lower),H=j(y?.ci?.upper),C=j(y?.nWith),ne=y?.sufficient===!0&&S!=null&&x!=null&&H!=null&&C!=null?{delta:S,ciLower:x,ciUpper:H,nPairs:C}:null;if(e.push({decision:typeof o.decision=="string"?o.decision:"unknown",applied:o.applied===!0,at:typeof o.createdAt=="string"?o.createdAt:"",rationale:typeof o.proposalRationale=="string"?o.proposalRationale:"",touched:xe(o.touchedSections),refusals:xe(o.refusals),measured:ne}),e.length>=t)break}return e}u(Xe,"summarisePriorDecisions");function ze(a,i){let t=i.accumulate??(a.autoEvolveAccumulate===!0||a.autoEvolveAccumulate==="true"),l=i.accumulateTargetPairs??a.autoEvolveAccumulateTarget,e=typeof l=="string"?Number.parseInt(l,10):l,r=typeof e=="number"&&Number.isInteger(e)&&e>0?e:Ue;return{enabled:t,targetPairs:r}}u(ze,"readAccumulateConfig");function Qe(a){let i=a.accumulateEnabled&&a.pairCount<a.targetPairs;return{apply:a.consented&&!i,peeking:i}}u(Qe,"resolveApply");async function it(a,i){let t=u(n=>i?.logger?.info?.(n)??console.log(n),"log"),{evalTargetId:l}=a,e=`[cron_instruction_evolution] ${l}`,r=await P(`/api/eval-targets/${l}`),o=r.metadata??{},g=null,y=!1;if(r.name.startsWith("/")&&Ee(r.name))try{if(g=Se(r.name,"utf8"),g!==r.content){let n=await K(`/api/eval-targets/${l}/sync-content`,{content:g});y=n.synced,t(`${e}: target content drifted from disk by ${Math.abs(g.length-r.content.length)} chars \u2014 synced to disk truth (v${n.version}). Prior verdicts against the old text dissolve via content-hash keying.`),r={...r,content:g,version:n.version}}}catch(n){t(`${e}: disk sync failed (${n instanceof Error?n.message:String(n)}) \u2014 measuring the stored snapshot`)}let S=!1;try{S=(await P("/api/settings/evolution-account")).paused}catch(n){t(`${e}: could not read the account switch (${n instanceof Error?n.message:String(n)}) \u2014 pausing to be safe`),S=!0}if(S)return t(`${e}: PAUSED for the whole account (profiles.evolution_paused) \u2014 no model budget spent.`),{skipped:"paused-account"};if(pe(o))return t(`${e}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let x=Re(r);if(x)return t(`${e}: ${x.reason}`),x;let H=a.apply??(o.autoEvolveApply===!0||o.autoEvolveApply==="true"),C=Ve(o);if(C==null){if(H)return t(`${e}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};t(`${e}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),C=[]}let $=(await P(`/api/eval-targets/${l}/evals`)).filter(n=>!n.retiredAt);if($.length===0)return{skipped:"no-live-cases"};let N=ue(o);N.note&&t(`${e}: ${N.note}`);let v=je($.length,N.minPairs,Fe(N,$.length));if(!v.feasible)return t(`${e}: cannot reach a sufficient verdict \u2014 ${v.reason}`),{skipped:"cannot-reach-min-n",reason:v.reason};let He=de({liveCases:$.length,passes:v.passes});t(`${e}: budget for this run \u2014 ${fe(He)}`);let U=await P(`/api/eval-targets/${l}/judge-calibration`);if(!U.powerCheck.adequate){let n=(U.powerCheck.reasons??[]).join("; ");return t(`${e}: not adequately powered, skipping before spending budget \u2014 ${n}`),{skipped:"not-adequate",reason:n}}let re=le,_e=Date.now()-re*24*60*60*1e3,q=await P(`/api/eval-targets/${l}/promotions?limit=200`),ae=q.promotions.filter(n=>n.applied&&Date.parse(n.createdAt)>=_e).length;if(ae>=Z)return t(`${e}: change budget looks exhausted (${ae}/${Z} applied in ${re}d), skipping before spending budget`),{skipped:"budget-exhausted"};try{let n=await P("/api/usage/current-limits"),c=we({limits:n,now:new Date});if(!c.ok)return t(`${e}: deferring before spending budget \u2014 ${c.reason}`),{skipped:"quota-exhausted",reason:c.reason}}catch(n){t(`${e}: quota unknown (${n instanceof Error?n.message:String(n)}) \u2014 proceeding`)}let L=se();if(!L.green)return t(`${e}: A/A canary is RED \u2014 halting. ${L.failures.join(" | ")}`),{skipped:"canary-red",reason:L.failures.join(" | ")};let G=r.content,D=W(G),p=ze(o,a),k=p.enabled?Ge(q.promotions,D,p.targetPairs):null,m,F,w=[],_=0,B=ce,f=k?null:ye(o,D);if(f){m=f.content,F="",B=0;try{w=await ke({evalTargetId:l,candidateContentHash:f.hash})}catch(n){return t(`${e}: could not rebuild banked pairs (${n instanceof Error?n.message:String(n)})`),{skipped:"resume-read-failed",reason:f.hash}}t(`${e}: resuming interrupted cycle \u2014 ${w.length}/${f.plannedPairs} pair(s) rebuilt from eval_runs, no proposal call spent`)}else if(k){let n=await P(`/api/promotions/${k.promotionId}`);if(W(n.toContent)!==k.candidateContentHash)return t(`${e}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:k.promotionId};m=n.toContent,F=n.proposalRationale??"",w=k.pairs,_=k.runs,B=0,t(`${e}: continuing accumulation ${k.promotionId} \u2014 ${w.length}/${p.targetPairs} pair(s) carried from ${_} prior run(s)`)}else{let n=U.caseDiscrimination?.cases??[],c=[];if(r.name.startsWith("/")){let s=r.name.slice(0,r.name.lastIndexOf("/"));try{let b=await P(`/api/insights/evidence?projectPath=${encodeURIComponent(s)}`);b.analyzedAt&&(c=[...b.friction.map(Y=>`Real-session friction (insights, ${b.analyzedAt.slice(0,10)}): ${Y}`),...b.whatWorks.map(Y=>`Working well in real sessions \u2014 do not break: ${Y}`)],c.length>0&&t(`${e}: proposer sees ${b.friction.length} friction + ${b.whatWorks.length} what-works item(s) from insights`))}catch(b){t(`${e}: insights evidence unavailable (${b instanceof Error?b.message:String(b)}) \u2014 proposing without it`)}}let T=[];try{T=Xe(q.promotions,D)}catch(s){t(`${e}: could not summarise prior decisions (${s instanceof Error?s.message:String(s)}) \u2014 proposing without them`)}T.length>0&&t(`${e}: proposer sees ${T.length} prior decision(s) against this exact body (${T.map(s=>`${s.decision}${s.measured?"/measured":""}`).join(", ")})`);let M=await Ae({currentContent:r.content,targetType:r.type,targetName:r.name,immutableSections:C,evidence:{nonDiscriminating:n.filter(s=>!s.discriminating).map(s=>`${s.name??s.assertion??"unnamed"} \u2014 ${s.note}`),weakest:n.filter(s=>s.discriminating&&s.withPassRate<s.withoutPassRate).map(s=>({name:s.name??s.assertion??"unnamed",withPassRate:s.withPassRate,withoutPassRate:s.withoutPassRate})),priorDecisions:T,notes:c}});if(!M.ok)return t(`${e}: no usable proposal \u2014 ${M.reason}`),{skipped:"no-proposal",reason:M.reason};m=M.proposal.candidateContent,F=M.proposal.rationale}let I=f?ve({plannedPairs:f.plannedPairs||v.expectedPairs,carriedPairs:w.length,liveCases:$.length}):v.passes;t(`${e}: measuring ${$.length} case(s) x ${I} pass(es) = up to ${$.length*I} pairs, candidate vs prior version`+(f?` (resumed; ${w.length} pair(s) already banked)`:""));let A=[],X=[],Oe=Date.now(),oe=0,z=0;for(let n=1;n<=I;n++){let c=await $e({cases:$,candidateContent:m,priorVersionContent:G,concurrency:a.concurrency??2,runNumber:n,opts:{targetId:l,targetVersion:r.version??1,iteration:1,timeout:a.timeout??24e4,model:a.model,graderModel:a.graderModel,skipGrading:!1,targetType:r.type,targetName:r.name,candidateContentHash:W(m)},onLog:t});if(A.push(...c.pairs),X.push(...c.results),oe+=c.completed,z+=c.failed,t(`${e}: pass ${n}/${I} \u2014 ${c.pairs.length} pair(s), running total ${A.length}`),c.abortedForQuota){t(`${e}: stopping after pass ${n}/${I} \u2014 ${c.abortedForQuota}. Remaining passes would spend against an exhausted account.`);break}}let R=[...w,...A],O=he(X),Q=A.length>0,d=ge({runs:X,plannedPairs:v.expectedPairs,usablePairs:A.length,verdictPairs:Q?R.length:A.length,proposalCalls:B,passes:I,liveCases:$.length,wallMs:Date.now()-Oe});if(t(`${e}: ${oe} completed, ${z} failed, ${A.length} usable pair(s) \u2014 spent ~${d.modelCalls} model calls (${d.proposalCalls} proposal + ${d.executorCalls} executor + >=${d.graderCalls} grader) in ${(d.wallMs/6e4).toFixed(1)} min`+(Q?`; the ${d.verdictPairs} pair(s) behind this verdict resolve +/-${me(d.mde)} at 80% power`:"")),!Q)return{skipped:O.infrastructureFailed?"infrastructure-failure":"no-pairs",reason:O.infrastructureFailed?`${O.infrastructureFailed} run(s) never executed (${O.summary.describe()}) \u2014 the environment failed, not the target`:`${z} run(s) failed or were ungradeable`,cost:d};let V=be({pairs:R.length,minPairs:10,accounting:O});if(V.kind==="infrastructure-incomplete")return t(`${e}: not posting a verdict \u2014 ${V.reason}`),await ee({evalTargetId:l,meta:o,blob:Ce({content:m,hash:W(m),priorHash:D,plannedPairs:f?.plannedPairs||v.expectedPairs,now:new Date}),log:t,tag:e}),{skipped:"infrastructure-incomplete",reason:V.reason,cost:d};p.enabled&&t(`${e}: accumulated ${R.length}/${p.targetPairs} pair(s) over ${_+1} run(s) on one candidate`);let ie=H,{apply:Te,peeking:Me}=Qe({consented:ie,accumulateEnabled:p.enabled,pairCount:R.length,targetPairs:p.targetPairs});ie&&Me&&t(`${e}: interim readout at ${R.length}/${p.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let h=await K(`/api/eval-targets/${l}/promotions`,{candidateContent:m,proposalSource:"llm",proposalRationale:F,pairs:R,canaryGreen:L.green,measuredAgainstContentHash:D,immutableSections:C,apply:Te,measurementCost:d,...p.enabled?{accumulation:{candidateContentHash:W(m),priorContentHash:D,targetPairs:p.targetPairs,carriedPairs:w.length,runs:_+1}}:{}});t(`${e}: ${h.decision}${h.applied?" (APPLIED)":""} \u2014 ${h.rationale}`+(h.refusals.length>0?` | refusals: ${h.refusals.join("; ")}`:"")),(f||o[Pe])&&await ee({evalTargetId:l,meta:o,blob:null,log:t,tag:e});let J=!1,E;if(h.applied&&r.name.startsWith("/"))try{Ee(r.name)?Se(r.name,"utf8")!==G?E="file changed since measurement started \u2014 refusing to clobber; next cycle re-syncs":(Ne(r.name,m,"utf8"),J=!0):E="file no longer exists on disk",t(J?`${e}: measured improvement written to ${r.name} (undo: git checkout -- ${r.name})`:`${e}: NOT written to disk \u2014 ${E}`)}catch(n){E=n instanceof Error?n.message:String(n),t(`${e}: disk write-back failed \u2014 ${E}. The eval target is updated; the file is not.`)}return{decision:h.decision,applied:h.applied,nPairs:R.length,promotionId:h.id,cost:d,diskSynced:y,...h.applied?{fileWritten:J,...E?{fileWriteSkipped:E}:{}}:{},...p.enabled?{carriedPairs:w.length,accumulationRuns:_+1}:{}}}u(it,"cronInstructionEvolution");function Ve(a){let i=a.immutableSections;return i==null||!Array.isArray(i)?null:i.filter(t=>typeof t=="string")}u(Ve,"readImmutableSections");export{Ie as a,te as b,Le as c,Fe as d,je as e,Ue as f,Ge as g,Be as h,Xe as i,ze as j,Qe as k,it as l,Ve as m};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as P}from"./chunk-BZS5QRWB.js";import{c as T,d as k}from"./chunk-SBGXIPRN.js";import{a}from"./chunk-ZLLER3HP.js";import{spawn as M}from"node:child_process";var w=["claude","codex"];function R(t,e=process.env){if(t)return t;let o=e.RULEMETRIC_EVAL_ENGINE?.trim().toLowerCase();if(!o)return"claude";if(w.includes(o))return o;throw new Error(`RULEMETRIC_EVAL_ENGINE="${e.RULEMETRIC_EVAL_ENGINE}" is not a known engine (expected one of: ${w.join(", ")})`)}a(R,"resolveEvalEngine");function L(t,e=process.env){return t?.trim()||e.RULEMETRIC_CODEX_MODEL?.trim()||k().codexConfiguredModel||T}a(L,"resolveCodexEvalModel");function N(t){try{let e=JSON.parse(t),o=e.result??e.content??t,u=e.usage?.total_tokens??(e.usage?.input_tokens??0)+(e.usage?.output_tokens??0),r;if(e.modelUsage&&typeof e.modelUsage=="object"){let s=-1;for(let[l,d]of Object.entries(e.modelUsage)){let n=typeof d?.outputTokens=="number"?d.outputTokens:0;n>s&&(s=n,r=l)}}return{output:o,totalTokens:u,model:r}}catch{return{output:t,totalTokens:0}}}a(N,"parseClaudeJsonOutput");function A(t){let{prompt:e,targetContent:o,systemPrompt:u,model:r}=t,s=["-p",e,"--output-format","json","--settings",JSON.stringify({disableAllHooks:!0})],l=o??u;return l&&s.push("--system-prompt",l),r&&s.push("--model",r),s}a(A,"buildClaudeArgs");function h(t,e,o,u){let r=e.trim()||o.trim()||u.trim()||"(no output on stderr or stdout)";return`Exit code ${t}: ${r.slice(0,1e3)}`}a(h,"describeExitFailure");async function S(t){let{prompt:e,targetContent:o,systemPrompt:u,workDir:r,timeout:s,model:l}=t,d=o??u,n=await P({prompt:e,systemPrompt:d,model:L(l),timeout:s,workDir:r});return{output:n.output,exitCode:n.exitCode,durationMs:n.durationMs,totalTokens:n.usage?.totalTokens??0,model:n.model,engine:"codex",delivery:d?"prompt_prefix":"none",error:n.error}}a(S,"executeCodexArm");async function $(t){let{prompt:e,targetContent:o,systemPrompt:u,workDir:r=process.cwd(),timeout:s=12e4,model:l}=t;if(R(t.engine)==="codex")return S({...t,workDir:r,timeout:s});let d=A({prompt:e,targetContent:o,systemPrompt:u,model:l}),n=o??u?"system_prompt":"none",E=Date.now();return new Promise(g=>{let p={...process.env};delete p.CLAUDECODE,delete p.HTTPS_PROXY;let _=["/opt/homebrew/bin","/usr/local/bin"],f=(p.PATH??"").split(":").filter(Boolean),x=_.filter(i=>!f.includes(i));x.length&&(p.PATH=[...f,...x].join(":"));let c=M("claude",d,{cwd:r,env:p,stdio:["ignore","pipe","pipe"]}),m="",v="";c.stdout.on("data",i=>{m+=i.toString()}),c.stderr.on("data",i=>{v+=i.toString()});let C=setTimeout(()=>{c.kill("SIGTERM"),g({output:m,exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:n,error:`Timed out after ${s}ms`})},s);c.on("close",i=>{clearTimeout(C);let D=Date.now()-E,{output:y,totalTokens:b,model:O}=N(m);g({output:y,exitCode:i,durationMs:D,totalTokens:b,model:O,engine:"claude",delivery:n,error:i!==0?h(i,v,y,m):void 0})}),c.on("error",i=>{clearTimeout(C),g({output:"",exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:n,error:`Failed to spawn claude: ${i.message}`})})})}a($,"executeEval");export{R as a,L as b,N as c,A as d,h as e,$ as f};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as I}from"./chunk-5RBLIVBF.js";import{a as
|
|
1
|
+
import{a as I}from"./chunk-5RBLIVBF.js";import{a as T,b as P,c as H,d as A}from"./chunk-SJKS3PYX.js";import{a as W}from"./chunk-2EX27VJ3.js";import{a as j,d as O}from"./chunk-3UKZJAFS.js";import{c as U}from"./chunk-4COLIGD7.js";import{b as x,d as L,f as S}from"./chunk-U3XKXJ3A.js";import{e as _,f as J,h as d}from"./chunk-APDRR6FS.js";import{a as z,b as F}from"./chunk-J5HW45PZ.js";import{a as f}from"./chunk-ZLLER3HP.js";var B=f((l,{limit:a,sort:n,eventTypes:s})=>_(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function is(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:g}=l,t=f(e=>a.logger.info(e),"log");if(g?.sessionId)return Y({mirrorId:n,sessionId:g.sessionId},t);t(`Processing insights job ${n}...`),await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:e}=await J("/api/sessions/repair-analyzed-at",{});e>0&&t(` Repaired analyzed_at on ${e} orphan session(s).`)}catch(e){t(` Warning: analyzed_at repair failed: ${e instanceof Error?e.message:String(e)}`)}let p=20,w=200,v=15*6e4,D=3,C=Date.now()+v;if(L()!=="none"){let e=0,o=0;try{for(;e<w&&Date.now()<C;){let c=await _(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${o}`);if(c.length===0)break;t(` Generating facets for ${c.length} un-analyzed sessions (drained ${e} so far)...`);for(let $=0;$<c.length&&!(e>=w||Date.now()>=C);$+=D){let R=c.slice($,$+D);await Promise.all(R.map(async m=>{if(!(e>=w||Date.now()>=C))try{let u=await O(q=>B(m.id,q));if(u.turnCount<2){e++,o++;return}let k=await S(A,u.text,4096);k&&typeof k.outcome=="string"?(await d(`/api/sessions/${m.id}/enrich`,{analysis:{source:"generated_facets",...k,graderVersion:2},...m.eventCount!=null?{analyzedEventCount:m.eventCount}:{},analyzedTurnCount:u.turnCount}),t(` Generated facets for session ${m.id} (${m.tool}, ${u.turnCount} turns)`)):o++,e++}catch(u){t(` Failed to generate facets for session ${m.id}: ${u instanceof Error?u.message:String(u)}`),e++,o++}}))}if(c.length<p)break}}catch(c){t(` Warning: facet generation failed after ${e} sessions: ${c instanceof Error?c.message:String(c)}`)}if(e>0){let c=Date.now()>=C?`time budget (${Math.round(v/6e4)}m)`:e>=w?`hard cap (${w})`:"queue empty";t(` Facet drain stopped on ${c} after ${e} session(s); the rest resume next run.`)}}let b=await K(s,r);if(!b)throw new I("No session data found \u2014 ensure sessions are captured and enriched.");t(` Found ${b.stats.sessions} sessions, generating recommendations...`);let E=await Z(s,t);E&&t(` Generator memory: ${E.split(`
|
|
2
2
|
`).length} lines of prior-advice context`);let i={},y=[],h=P.length+1;for(let e=0;e<P.length;e++){let o=P[e];t(` [${e+1}/${h}] Generating ${o.name}...`);try{await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:o.name,current:e+1,total:h,partial:{...i}}})}catch(u){t(` Warning: progress update failed for ${o.name}: ${u instanceof Error?u.message:String(u)}`)}t(` Running LLM prompt for ${o.name}...`);let c=o.usesGeneratorMemory&&E?`${b.summary}
|
|
3
3
|
${E}`:b.summary,$=Date.now(),R=await S(o.prompt,c,o.maxTokens,{timeoutMs:o.timeoutMs}),m=Date.now()-$;R?(i[o.name]=R,t(` Got result for ${o.name} (${Math.round(m/1e3)}s)`)):(y.push(o.name),t(` No result for ${o.name} after ${Math.round(m/1e3)}s (budget ${Math.round((o.timeoutMs??12e4)/1e3)}s) \u2014 section DROPPED`))}t(` [${h}/${h}] Generating at_a_glance...`),await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"at_a_glance",current:h,total:h,partial:{...i}}});let V=[b.summary,i.what_works?`
|
|
4
4
|
## What Works
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{e as d}from"./chunk-QWCEZEDO.js";import{
|
|
1
|
+
import{e as d}from"./chunk-QWCEZEDO.js";import{a as R,g as v,h as T,j as I,m as C}from"./chunk-OZQNSELV.js";import{d as g}from"./chunk-SBGXIPRN.js";import{e as _}from"./chunk-APDRR6FS.js";import{g as m,l as k}from"./chunk-PZNWH4VQ.js";import{a as i}from"./chunk-ZLLER3HP.js";import{execSync as j}from"node:child_process";import{existsSync as p,readFileSync as y}from"node:fs";import{homedir as f}from"node:os";import{join as a}from"node:path";var P=["install","auth","hooks","worker"],O=["judge"],M=[...P,...O];function $(){return{projectPath:process.cwd(),configDir:k()}}i($,"defaultContext");var A=a(f(),".mitmproxy","mitmproxy-ca-cert.pem");function S(e){if(!e)return"";if(e.length<=8)return"*".repeat(e.length);let t=e.slice(0,4),n=e.slice(-4);return`${t}${"*".repeat(Math.max(4,e.length-8))}${n}`}i(S,"maskToken");function te(e,t){let n=e===null?[]:e.replace(/\n$/,"").split(`
|
|
2
2
|
`),o=t===null?[]:t.replace(/\n$/,"").split(`
|
|
3
3
|
`),s=[],u=Math.max(n.length,o.length);for(let c=0;c<u;c++){let l=n[c],r=o[c];l===r?s.push(` ${l}`):(l!==void 0&&s.push(`-${l}`),r!==void 0&&s.push(`+${r}`))}return s.join(`
|
|
4
4
|
`)}i(te,"renderDiff");function x(e,t){let n=a(e,"env");if(!p(n))return null;try{let s=y(n,"utf-8").match(new RegExp(`^${t}=(.+)$`,"m"));return s?s[1]:null}catch{return null}}i(x,"readEnvValue");async function b(){if(!m())return!1;try{return(await Promise.race([_("/api/setup/status"),new Promise((t,n)=>setTimeout(()=>n(new Error("setup/status timeout")),2500))]))?.workerActive===!0}catch{return!1}}i(b,"workerActive");function E(e,t){let n=a(e,".claude",t),o={},s=null;if(p(n))try{s=y(n,"utf-8").replace(/\n$/,""),o=JSON.parse(s)}catch{o={}}return{settings:o,before:s}}i(E,"readProjectSettings");function D(e){let{settings:t,before:n}=E(e,"settings.local.json");return v(t),{before:n,after:JSON.stringify(t,null,2)}}i(D,"projectHooksSettings");function N(e){let{settings:t,before:n}=E(e,"settings.local.json"),o={...t.env??{}};return o.HTTPS_PROXY=`http://localhost:${d}`,o.NO_PROXY=I,o.NODE_EXTRA_CA_CERTS=A,{before:n,after:JSON.stringify({...t,env:o},null,2)}}i(N,"projectProxyEnvSettings");function U(e){let{settings:t,before:n}=E(e,"settings.json");if(n===null)return null;let{removed:o}=C(t,d);return o?{before:n,after:JSON.stringify(t,null,2)}:null}i(U,"projectSharedSettingsMigration");var Y=a(f(),"Library","LaunchAgents","com.rulemetric.worker.plist"),G=a(f(),".config","systemd","user","rulemetric-worker.service");function h(e){j(e,{stdio:"inherit"})}i(h,"runCommand");var L=[{id:"install",title:"Install the CLI",command:"npm install -g @rulemetric/cli",async detect(){return m()||await b()},async plan(){return{id:"install",title:"Install the CLI",command:"npm install -g @rulemetric/cli",artifacts:[{path:"npm install -g @rulemetric/cli",kind:"command",before:null,after:"rulemetric --version # verifies the binary is on PATH"}]}},async apply(){h("npm install -g @rulemetric/cli")}},{id:"auth",title:"Authenticate",command:"rulemetric auth login",async detect(){return m()},async plan(e){let t=a(e.configDir,"env"),n=null;if(p(t))try{n=X(y(t,"utf-8"))}catch{n="(unreadable)"}let o=x(e.configDir,"RULEMETRIC_ACCESS_TOKEN"),u=[`RULEMETRIC_ACCESS_TOKEN=${S(o||"<token-from-login>")}`],c=x(e.configDir,"RULEMETRIC_API_KEY");c&&u.push(`RULEMETRIC_API_KEY=${S(c)}`);let l=process.env.RULEMETRIC_API_URL;l&&u.push(`RULEMETRIC_API_URL=${l}`);let r=u.join(`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{a as i}from"./chunk-ZLLER3HP.js";function
|
|
2
|
-
`)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}i(
|
|
1
|
+
import{a as i}from"./chunk-ZLLER3HP.js";function Z(e){return(e.trim().split(`
|
|
2
|
+
`)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}i(Z,"recommendationTitle");function Q(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let o=n.claude_md_additions;return Array.isArray(o)&&(t.recommendation_candidates=o.flatMap(r=>{if(!r||typeof r!="object")return[];let s=r;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let a=s.addition.trim();return[{title:Z(a),artifact:"instruction",canonicalBody:a,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:a},{harness:"codex",target:"AGENTS.md",body:a}]}]})),e}i(Q,"normalizeRecommendationCandidates");var ee=new Set(["instruction"]);function te(e){if(!e||typeof e!="object")return e;let t=e,n=t.recommendation_candidates;if(!Array.isArray(n)||n.length===0)return e;let o=n.filter(s=>!!s&&typeof s=="object"&&typeof s.canonicalBody=="string"&&s.canonicalBody.trim().length>0);for(let s of o){if(Array.isArray(s.renderings)&&s.renderings.length>0)continue;let a=s.canonicalBody.trim(),c=ee.has(String(s.artifact));s.renderings=c?[{harness:"claude_code",target:"CLAUDE.md",body:a},{harness:"codex",target:"AGENTS.md",body:a}]:[{harness:"claude_code",target:"manual",body:a},{harness:"codex",target:"manual",body:a}]}let r=t.suggestions&&typeof t.suggestions=="object"?t.suggestions:{};return(!Array.isArray(r.claude_md_additions)||r.claude_md_additions.length===0)&&(r.claude_md_additions=o.filter(s=>s.artifact==="instruction").map(s=>({addition:s.canonicalBody.trim(),why:typeof s.rationale=="string"?s.rationale:"",prompt_scaffold:"Add to CLAUDE.md (and AGENTS.md for Codex)."}))),(!Array.isArray(r.features_to_try)||r.features_to_try.length===0)&&(r.features_to_try=o.filter(s=>s.artifact!=="instruction").map(s=>({feature:typeof s.title=="string"?s.title:"Proposed change",one_liner:typeof s.rationale=="string"?s.rationale:"",why_for_you:typeof s.outcomeMetric=="string"?`Aimed at ${s.outcomeMetric}.`:"",example_code:s.canonicalBody.trim()}))),Array.isArray(r.usage_patterns)||(r.usage_patterns=[]),t.suggestions=r,e}i(te,"deriveLegacyPresentation");function ne(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let o=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(o)?o:void 0}return oe(e),Q(e),e}i(ne,"normalizeRecommendations");function oe(e){if(!e||typeof e!="object")return;let t=e;if(Array.isArray(t.recommendation_candidates)&&t.recommendation_candidates.length>0)return;let n=t.suggestions;if(!n||typeof n!="object")return;let o=n.recommendation_candidates;!Array.isArray(o)||o.length===0||(t.recommendation_candidates=o)}i(oe,"liftNestedCandidates");import{z as d}from"zod";var L=["org","team","project","personal"],I=d.object({name:d.string().min(1),description:d.string().min(1),type:d.literal("instruction").default("instruction"),scope:d.enum(L),version:d.string().min(1),tags:d.array(d.string()).optional(),compatibility:d.array(d.string()).optional(),slots:d.record(d.string(),d.string()).optional(),metadata:d.record(d.string(),d.unknown()).optional()});import{z as p}from"zod";var N=p.object({name:p.string().min(1),description:p.string().min(1),type:p.literal("prompt"),version:p.string().min(1),tags:p.array(p.string()).optional(),variables:p.array(p.string()).optional(),metadata:p.record(p.string(),p.unknown()).optional()});function _(e,t){let n=t.map(o=>`- ID: ${o.id}
|
|
3
3
|
Name: ${o.name}
|
|
4
4
|
Description: ${o.description}
|
|
5
5
|
Tags: ${o.tags.join(", ")}
|
|
@@ -32,17 +32,17 @@ Return your response as JSON in this exact format:
|
|
|
32
32
|
]
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
Only include instructions with a relevance score >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}i(
|
|
35
|
+
Only include instructions with a relevance score >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}i(_,"buildRecommendationPrompt");var P=32e3,re={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function D(e,t={}){if(e.length===0)return[];let n=t.charBudget??P,o=_(re,[]).length,r=[],s=[],a=0;for(let c of e){let l=se(c);s.length>0&&o+a+l>n&&(r.push(s),s=[],a=0),s.push(c),a+=l}return s.length>0&&r.push(s),r}i(D,"batchCandidatesForPrompt");function se(e){return`- ID: ${e.id}
|
|
36
36
|
Name: ${e.name}
|
|
37
37
|
Description: ${e.description}
|
|
38
38
|
Tags: ${e.tags.join(", ")}
|
|
39
|
-
Preview: ${e.contentPreview}`.length+2}i(
|
|
40
|
-
`),r=[];for(let m=0;m<o.length;m+=1)
|
|
39
|
+
Preview: ${e.contentPreview}`.length+2}i(se,"renderedSize");var j=["Added","Changed","Fixed","Removed","Deprecated","Security"],ie=/^##\s+\[([^\]]+)\](?:\s*[-–]\s*(\d{4}-\d{2}-\d{2}))?\s*$/,ae=/^###\s+(.+?)\s*$/,ce=/^[-*]\s+(.*\S)\s*$/,le=/^ {2,}(\S.*)$/;function ue(e){let t=e.split(/\r?\n/),n=[],o=null,r=null,s=null;for(let a of t){let c=a.match(ie);if(c){o&&n.push(o);let m=c[1].trim();o={version:m,date:c[2]??null,unreleased:m.toLowerCase()==="unreleased",sections:{}},r=null,s=null;continue}if(!o)continue;let l=a.match(ae);if(l){let m=l[1].trim();j.includes(m)?(r=m,o.sections[r]||(o.sections[r]=[]),s=o.sections[r]):(r=null,s=null);continue}if(!r||!s)continue;let u=a.match(ce);if(u){s.push(u[1]);continue}let f=a.match(le);if(f&&s.length>0){s[s.length-1]+=" "+f[1].trim();continue}}return o&&n.push(o),{entries:n}}i(ue,"parseChangelog");function me(e){return e.entries.filter(t=>t.unreleased?!1:Object.values(t.sections).some(n=>n&&n.length>0))}i(me,"announceableEntries");function E(e){let t=/^(#{1,6})\s+/.exec(e);return t?t[1].length:0}i(E,"headingLevel");function $(e){return e.replace(/^#{1,6}\s+/,"").replace(/[`*_~]/g,"").trim().toLowerCase()}i($,"normaliseHeading");function de(e,t){let n=$(t);if(n.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let o=e.split(`
|
|
40
|
+
`),r=[];for(let m=0;m<o.length;m+=1)E(o[m])>0&&$(o[m])===n&&r.push(m);if(r.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(r.length>1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let s=r[0],a=E(o[s]),c=o.length;for(let m=s+1;m<o.length;m+=1){let S=E(o[m]);if(S>0&&S<=a){c=m;break}}let l=o.slice(s,c).join(`
|
|
41
41
|
`),u=[...o.slice(0,s),...o.slice(c)];return u.join("").trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:u.join(`
|
|
42
42
|
`).replace(/\n{3,}/g,`
|
|
43
43
|
|
|
44
|
-
`),removed:!0,removedText:l}}i(
|
|
44
|
+
`),removed:!0,removedText:l}}i(de,"removeMarkdownSection");function pe(e,t){let n=t.trim();if(n.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let o=e.indexOf(n);if(o===-1)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(e.indexOf(n,o+1)!==-1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let r=(e.slice(0,o)+e.slice(o+n.length)).replace(/\n{3,}/g,`
|
|
45
45
|
|
|
46
|
-
`);return r.trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:r,removed:!0,removedText:n}}i(me,"removeExactBlock");var M=["HTTPS_PROXY","HTTP_PROXY","NODE_EXTRA_CA_CERTS"];function pe(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);if(!n.hooks)return{value:n,removed:!1,removedDescriptions:[],reason:"not-found"};let o=[];for(let[r,s]of Object.entries(n.hooks)){if(!Array.isArray(s))continue;let a=s.filter(c=>{let l=(c.hooks??[]).some(u=>typeof u.command=="string"&&u.command.includes(t));return l&&o.push(`${r}: ${c.matcher??"*"} \u2192 ${(c.hooks??[]).map(u=>u.command).join(", ")}`),!l});a.length===0?delete n.hooks[r]:n.hooks[r]=a}return Object.keys(n.hooks).length===0&&delete n.hooks,{value:n,removed:o.length>0,removedDescriptions:o,...o.length===0?{reason:"not-found"}:{}}}i(pe,"removeHookByCommand");function de(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);return!n.mcpServers||!(t in n.mcpServers)?{value:n,removed:!1,removedDescriptions:[],reason:"not-found"}:(delete n.mcpServers[t],Object.keys(n.mcpServers).length===0&&delete n.mcpServers,{value:n,removed:!0,removedDescriptions:[`mcpServers.${t}`]})}i(de,"removeMcpServer");function E(e){if(!e||typeof e!="object")return[];let t=e.env;return t?M.filter(n=>n in t):[]}i(E,"protectedEnvKeysPresent");function fe(e,t){let n=E(e),o=new Set(E(t));return n.filter(r=>!o.has(r))}i(fe,"lostProtectedEnvKeys");function he(e,t){let n=`HTTP ${e}`;if(!t||typeof t!="object")return{message:n};let o=t,r=typeof o.error=="string"&&o.error?o.error:o.error?JSON.stringify(o.error):n,s=typeof o.code=="string"&&o.code?o.code:void 0;return s?{message:r,code:s}:{message:r}}i(he,"parseApiError");var T=["inside","outside"];function y(e){return e.trim().toLowerCase()}i(y,"normalizeDependencyKey");function ge(e){let t=[];if(T.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${T.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let r of e.targets)if(typeof r!="string"||r.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(r=>typeof r=="string"&&(r.startsWith("/")||/^[A-Za-z]:[\\/]/.test(r)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let o=e.targets.filter(r=>typeof r=="string"&&r.split(/[\\/]/).includes(".."));o.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${o.join(", ")})`})}for(let n of["requires","provides"]){let o=e[n];if(!Array.isArray(o)){t.push({field:n,message:"must be an array of dependency keys"});continue}o.some(r=>typeof r!="string"||r.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}i(ge,"validateArtifactSpec");function ye(e,t){let n=[],o=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let r=t.paths.filter(s=>!o.has(s));return r.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${r.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),o.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}i(ye,"validateArtifactInverse");var U="artifact";function A(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}i(A,"stringArray");function xe(e){if(!e||typeof e!="object")return null;let t=e[U];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:A(n.targets),requires:A(n.requires),provides:A(n.provides)}}i(xe,"parseArtifactSpec");var ve=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];function H(e){return e.appliedAt?e.appliedAt instanceof Date?e.appliedAt.getTime():new Date(e.appliedAt).getTime():0}i(H,"appliedAtMs");function Se(e){return[...e].sort((t,n)=>{let o=H(n)-H(t);return o!==0?o:(n.applySeq??0)-(t.applySeq??0)})}i(Se,"orderForReversal");var z=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","PreCompact","Notification","Stop","SubagentStop"],b=".claude/settings.local.json";function F(e){return`# rm-artifact:${e}`}i(F,"hookTag");function _e(e,t){return`${e.trim()} ${F(t)}`}i(_e,"taggedHookCommand");var Ee=new Set(["if","then","else","elif","fi","for","while","until","do","done","case","esac","function","return","exit","cd","echo","test","true","false"]);function k(e){let t=e.trim().split(/\s+/)[0]??"";return!/^[a-z][a-z0-9_-]*$/.test(t)||Ee.has(t)?null:y(`cmd:${t}`)}i(k,"inferredCommandRequirement");function Ae(e,t){let n=new Set((t?.requires??[]).map(y).filter(Boolean)),o=k(e.command);return o&&n.add(o),{boundaryClass:"outside",targets:[b],requires:[...n],provides:(t?.provides??[]).map(y).filter(Boolean)}}i(Ae,"hookArtifactSpec");function x(e){let t=[];z.includes(e.event)||t.push({field:"event",message:`unknown hook event ${JSON.stringify(e.event)} \u2014 a hook on an event that never fires is indistinguishable from one that was never installed`});let n=(e.command??"").trim();return n.length===0?t.push({field:"command",message:"a hook with no command installs nothing"}):(/[\r\n]/.test(n)&&t.push({field:"command",message:"multi-line commands are refused: the identity tag is a trailing shell comment, which would silence only the final line, and a human reviewing an install should read one line"}),n.includes("\0")&&t.push({field:"command",message:"command contains a NUL byte"}),n.includes("rulemetric")&&t.push({field:"command",message:'refused: `rulemetric hooks uninstall` deletes every hook whose command contains "rulemetric", so installing one here would make this hook collateral damage of an unrelated command'}),n.includes("rm-artifact:")&&t.push({field:"command",message:"command already carries an artifact tag \u2014 installing it would produce two identities for one entry"})),e.matcher!==void 0&&(typeof e.matcher!="string"||e.matcher.trim().length===0)&&t.push({field:"matcher",message:"matcher must be a non-empty string when present"}),t}i(x,"validateHookSpec");function Te(e){let t=[`runs on: ${e.event}${e.matcher?` (tools matching ${e.matcher})`:""}`,`spawns: ${e.command.trim()}`,`writes: ${b} (one entry, tagged with this artifact's id)`],n=k(e.command);return n&&t.push(`needs: ${n} on PATH`),t}i(Te,"describeHookCapability");var Y="hook";function h(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}i(h,"asRecord");function K(e){let t=e.event,n=e.command;if(typeof t!="string"||typeof n!="string")return null;let o=typeof e.matcher=="string"?e.matcher:void 0;return{event:t,matcher:o,command:n}}i(K,"readBareSpec");function B(e){let t=h(e.hooks)??e,n=[];for(let[o,r]of Object.entries(t))if(Array.isArray(r))for(let s of r){let a=h(s);if(!a)continue;let c=typeof a.matcher=="string"&&a.matcher.length>0?a.matcher:void 0,l=Array.isArray(a.hooks)?a.hooks:[];for(let u of l){let f=h(u)?.command;typeof f=="string"&&n.push({event:o,matcher:c,command:f})}}return n.length===0?{spec:null,problems:[]}:n.length>1?{spec:null,problems:[{field:"hook",message:`proposal describes ${n.length} hook entries; one proposal installs exactly one hook, so its inverse stays exact and its review stays readable`}]}:{spec:n[0],problems:[]}}i(B,"readSettingsFragment");function be(e){let t=[],n=/```[a-zA-Z]*\n([\s\S]*?)```/g,o;for(;(o=n.exec(e))!==null;)t.push(o[1]);return t}i(be,"fencedBlocks");function ke(e){let t=h(h(e.frontmatter)?.artifact),n=t?h(t[Y]):null;if(n){let o=K(n);if(o)return{spec:o,problems:x(o),source:"envelope"};let r=B(n);if(r.spec)return{spec:r.spec,problems:x(r.spec),source:"envelope"};if(r.problems.length>0)return{spec:null,problems:r.problems,source:"envelope"}}for(let o of be(e.content??"")){let r;try{r=JSON.parse(o)}catch{continue}let s=h(r);if(!s)continue;let a=K(s);if(a)return{spec:a,problems:x(a),source:"content-fragment"};let c=B(s);if(c.spec)return{spec:c.spec,problems:x(c.spec),source:"content-fragment"};if(c.problems.length>0)return{spec:null,problems:c.problems,source:"content-fragment"}}return{spec:null,problems:[{field:"hook",message:"no hook spec found \u2014 a hook proposal must carry {event, command} in its artifact envelope or a JSON settings fragment in its body"}],source:"none"}}i(ke,"parseHookSpec");var Ce=/[\p{L}\p{N}]+/gu;function C(e){let t=new Set;for(let n of e.toLowerCase().matchAll(Ce)){let o=` ${n[0]} `;for(let r=0;r+3<=o.length;r+=1)t.add(o.slice(r,r+3))}return t}i(C,"trigrams");function g(e,t){let n=C(e),o=C(t);if(n.size===0||o.size===0)return 0;let r=0,[s,a]=n.size<=o.size?[n,o]:[o,n];for(let l of s)a.has(l)&&(r+=1);let c=n.size+o.size-r;return c===0?0:r/c}i(g,"trigramSimilarity");var w=.3,Oe=15;function O(e){let n=e.replace(/<!--[\s\S]*?-->/g," ").replace(/```[\s\S]*?```/g," "),o=[];for(let r of n.split(`
|
|
47
|
-
`)){let s=r.trim();if(s.length===0||s.startsWith("#"))continue;let a=s.replace(/^(?:[-*+]|\d+[.)])\s+/,"").trim();if(a.length!==0)for(let c of a.split(/(?<=[.!?])\s+(?=[A-Z(`"'*])/)){let l=c.trim();l.length>=
|
|
48
|
-
`,Math.max(0,a-1))+1,a))))&&(n.has(l)||(n.add(l),o.push({reference:s,path:l})))}return o}i(
|
|
46
|
+
`);return r.trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:r,removed:!0,removedText:n}}i(pe,"removeExactBlock");var M=["HTTPS_PROXY","HTTP_PROXY","NODE_EXTRA_CA_CERTS"];function fe(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);if(!n.hooks)return{value:n,removed:!1,removedDescriptions:[],reason:"not-found"};let o=[];for(let[r,s]of Object.entries(n.hooks)){if(!Array.isArray(s))continue;let a=s.filter(c=>{let l=(c.hooks??[]).some(u=>typeof u.command=="string"&&u.command.includes(t));return l&&o.push(`${r}: ${c.matcher??"*"} \u2192 ${(c.hooks??[]).map(u=>u.command).join(", ")}`),!l});a.length===0?delete n.hooks[r]:n.hooks[r]=a}return Object.keys(n.hooks).length===0&&delete n.hooks,{value:n,removed:o.length>0,removedDescriptions:o,...o.length===0?{reason:"not-found"}:{}}}i(fe,"removeHookByCommand");function he(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);return!n.mcpServers||!(t in n.mcpServers)?{value:n,removed:!1,removedDescriptions:[],reason:"not-found"}:(delete n.mcpServers[t],Object.keys(n.mcpServers).length===0&&delete n.mcpServers,{value:n,removed:!0,removedDescriptions:[`mcpServers.${t}`]})}i(he,"removeMcpServer");function v(e){if(!e||typeof e!="object")return[];let t=e.env;return t?M.filter(n=>n in t):[]}i(v,"protectedEnvKeysPresent");function ge(e,t){let n=v(e),o=new Set(v(t));return n.filter(r=>!o.has(r))}i(ge,"lostProtectedEnvKeys");function ye(e,t){let n=`HTTP ${e}`;if(!t||typeof t!="object")return{message:n};let o=t,r=typeof o.error=="string"&&o.error?o.error:o.error?JSON.stringify(o.error):n,s=typeof o.code=="string"&&o.code?o.code:void 0;return s?{message:r,code:s}:{message:r}}i(ye,"parseApiError");var T=["inside","outside"];function y(e){return e.trim().toLowerCase()}i(y,"normalizeDependencyKey");function xe(e){let t=[];if(T.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${T.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let r of e.targets)if(typeof r!="string"||r.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(r=>typeof r=="string"&&(r.startsWith("/")||/^[A-Za-z]:[\\/]/.test(r)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let o=e.targets.filter(r=>typeof r=="string"&&r.split(/[\\/]/).includes(".."));o.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${o.join(", ")})`})}for(let n of["requires","provides"]){let o=e[n];if(!Array.isArray(o)){t.push({field:n,message:"must be an array of dependency keys"});continue}o.some(r=>typeof r!="string"||r.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}i(xe,"validateArtifactSpec");function _e(e,t){let n=[],o=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let r=t.paths.filter(s=>!o.has(s));return r.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${r.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),o.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}i(_e,"validateArtifactInverse");var B="artifact";function A(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}i(A,"stringArray");function Se(e){if(!e||typeof e!="object")return null;let t=e[B];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:A(n.targets),requires:A(n.requires),provides:A(n.provides)}}i(Se,"parseArtifactSpec");var Ee=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];function H(e){return e.appliedAt?e.appliedAt instanceof Date?e.appliedAt.getTime():new Date(e.appliedAt).getTime():0}i(H,"appliedAtMs");function ve(e){return[...e].sort((t,n)=>{let o=H(n)-H(t);return o!==0?o:(n.applySeq??0)-(t.applySeq??0)})}i(ve,"orderForReversal");var z=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","PreCompact","Notification","Stop","SubagentStop"],b=".claude/settings.local.json";function F(e){return`# rm-artifact:${e}`}i(F,"hookTag");function Ae(e,t){return`${e.trim()} ${F(t)}`}i(Ae,"taggedHookCommand");var Te=new Set(["if","then","else","elif","fi","for","while","until","do","done","case","esac","function","return","exit","cd","echo","test","true","false"]);function k(e){let t=e.trim().split(/\s+/)[0]??"";return!/^[a-z][a-z0-9_-]*$/.test(t)||Te.has(t)?null:y(`cmd:${t}`)}i(k,"inferredCommandRequirement");function be(e,t){let n=new Set((t?.requires??[]).map(y).filter(Boolean)),o=k(e.command);return o&&n.add(o),{boundaryClass:"outside",targets:[b],requires:[...n],provides:(t?.provides??[]).map(y).filter(Boolean)}}i(be,"hookArtifactSpec");function x(e){let t=[];z.includes(e.event)||t.push({field:"event",message:`unknown hook event ${JSON.stringify(e.event)} \u2014 a hook on an event that never fires is indistinguishable from one that was never installed`});let n=(e.command??"").trim();return n.length===0?t.push({field:"command",message:"a hook with no command installs nothing"}):(/[\r\n]/.test(n)&&t.push({field:"command",message:"multi-line commands are refused: the identity tag is a trailing shell comment, which would silence only the final line, and a human reviewing an install should read one line"}),n.includes("\0")&&t.push({field:"command",message:"command contains a NUL byte"}),n.includes("rulemetric")&&t.push({field:"command",message:'refused: `rulemetric hooks uninstall` deletes every hook whose command contains "rulemetric", so installing one here would make this hook collateral damage of an unrelated command'}),n.includes("rm-artifact:")&&t.push({field:"command",message:"command already carries an artifact tag \u2014 installing it would produce two identities for one entry"})),e.matcher!==void 0&&(typeof e.matcher!="string"||e.matcher.trim().length===0)&&t.push({field:"matcher",message:"matcher must be a non-empty string when present"}),t}i(x,"validateHookSpec");function ke(e){let t=[`runs on: ${e.event}${e.matcher?` (tools matching ${e.matcher})`:""}`,`spawns: ${e.command.trim()}`,`writes: ${b} (one entry, tagged with this artifact's id)`],n=k(e.command);return n&&t.push(`needs: ${n} on PATH`),t}i(ke,"describeHookCapability");var W="hook";function h(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}i(h,"asRecord");function U(e){let t=e.event,n=e.command;if(typeof t!="string"||typeof n!="string")return null;let o=typeof e.matcher=="string"?e.matcher:void 0;return{event:t,matcher:o,command:n}}i(U,"readBareSpec");function K(e){let t=h(e.hooks)??e,n=[];for(let[o,r]of Object.entries(t))if(Array.isArray(r))for(let s of r){let a=h(s);if(!a)continue;let c=typeof a.matcher=="string"&&a.matcher.length>0?a.matcher:void 0,l=Array.isArray(a.hooks)?a.hooks:[];for(let u of l){let f=h(u)?.command;typeof f=="string"&&n.push({event:o,matcher:c,command:f})}}return n.length===0?{spec:null,problems:[]}:n.length>1?{spec:null,problems:[{field:"hook",message:`proposal describes ${n.length} hook entries; one proposal installs exactly one hook, so its inverse stays exact and its review stays readable`}]}:{spec:n[0],problems:[]}}i(K,"readSettingsFragment");function Ce(e){let t=[],n=/```[a-zA-Z]*\n([\s\S]*?)```/g,o;for(;(o=n.exec(e))!==null;)t.push(o[1]);return t}i(Ce,"fencedBlocks");function Oe(e){let t=h(h(e.frontmatter)?.artifact),n=t?h(t[W]):null;if(n){let o=U(n);if(o)return{spec:o,problems:x(o),source:"envelope"};let r=K(n);if(r.spec)return{spec:r.spec,problems:x(r.spec),source:"envelope"};if(r.problems.length>0)return{spec:null,problems:r.problems,source:"envelope"}}for(let o of Ce(e.content??"")){let r;try{r=JSON.parse(o)}catch{continue}let s=h(r);if(!s)continue;let a=U(s);if(a)return{spec:a,problems:x(a),source:"content-fragment"};let c=K(s);if(c.spec)return{spec:c.spec,problems:x(c.spec),source:"content-fragment"};if(c.problems.length>0)return{spec:null,problems:c.problems,source:"content-fragment"}}return{spec:null,problems:[{field:"hook",message:"no hook spec found \u2014 a hook proposal must carry {event, command} in its artifact envelope or a JSON settings fragment in its body"}],source:"none"}}i(Oe,"parseHookSpec");var Y="claude-haiku-4-5",G=[{task:"rm-batch-task",instructions:"rm-batch-task/inject.md",class:"proven",axis:"reward",measured:"2026-09-02 n=25/arm Haiku 4.5: 0/25 \u2192 25/25, delta +1.000, 95% CI [+0.734, +1.000]"},{task:"rm-locality-task",instructions:"rm-locality-task/inject.md",class:"proven",axis:"cost",measured:"2026-09-02 n=25/arm Haiku 4.5: 25/25 both arms, cost \u221225.6%/trial, 95% CI [\u22120.0171, \u22120.0107]"},{task:"rm-migrations-task",instructions:"rm-migrations-task/inject.md",class:"negative",axis:"reward",measured:"2026-08-31 Haiku 4.5: flat after two reworks \u2014 redundant with the model's priors on this shape"},{task:"rm-pagination-task",instructions:"rm-pagination-task/inject.md",class:"negative",axis:"reward",measured:"2026-09-02 n=25/arm Haiku 4.5: 25/25 baseline under --allowedTools Bash; the rule costs +8.0%/trial and buys nothing"}];function Re(e){return G.filter(t=>t.class===e)}i(Re,"harborTasksOfClass");function we(e,t){return{task:e.task,instructions:e.instructions,class:e.class,axis:e.axis,model:Y,nTrials:25,lane:t}}i(we,"harborPayloadFor");var Le=/[\p{L}\p{N}]+/gu;function C(e){let t=new Set;for(let n of e.toLowerCase().matchAll(Le)){let o=` ${n[0]} `;for(let r=0;r+3<=o.length;r+=1)t.add(o.slice(r,r+3))}return t}i(C,"trigrams");function g(e,t){let n=C(e),o=C(t);if(n.size===0||o.size===0)return 0;let r=0,[s,a]=n.size<=o.size?[n,o]:[o,n];for(let l of s)a.has(l)&&(r+=1);let c=n.size+o.size-r;return c===0?0:r/c}i(g,"trigramSimilarity");var R=.3,Ie=15;function O(e){let n=e.replace(/<!--[\s\S]*?-->/g," ").replace(/```[\s\S]*?```/g," "),o=[];for(let r of n.split(`
|
|
47
|
+
`)){let s=r.trim();if(s.length===0||s.startsWith("#"))continue;let a=s.replace(/^(?:[-*+]|\d+[.)])\s+/,"").trim();if(a.length!==0)for(let c of a.split(/(?<=[.!?])\s+(?=[A-Z(`"'*])/)){let l=c.trim();l.length>=Ie&&o.push(l)}}return o}i(O,"splitDirectives");function q(e,t,n=R){let o=O(e);if(o.length===0)return{redundant:!1,coverage:0,matches:[],novel:[]};let r=t.flatMap(c=>O(c.content).map(l=>({text:l,id:c.id,source:c.source}))),s=[],a=[];for(let c of o){let l=null;for(let u of r){let f=g(c,u.text);f<n||(l===null||f>l.similarity)&&(l={directive:c,matchedDirective:u.text,matchedId:u.id,matchedSource:u.source,similarity:f})}l?s.push(l):a.push(c)}return{redundant:a.length===0,coverage:s.length/o.length,matches:s,novel:a}}i(q,"assessRedundancy");function Ne(e,t=R){let n=[];for(let o=0;o<e.length;o+=1){let r=q(e[o].content,e.slice(0,o),t);r.matches.length>0&&n.push({instruction:e[o],verdict:r})}return n}i(Ne,"findInternalRedundancy");var V=.5,Pe=/-(?=[0-9a-f]{6}$)[0-9a-f]*[0-9][0-9a-f]*$/;function w(e){return e.trim().toLowerCase().replace(/^skills--/,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(Pe,"").replace(/-+$/,"")}i(w,"skillNameStem");function De(e,t,n=V){let o=w(e.name);for(let s of t)if(o.length>0&&w(s.name)===o)return{name:s.name,similarity:g(e.content,s.content),reason:"name-stem"};let r=null;for(let s of t){let a=g(e.content,s.content);a<n||(r===null||a>r.similarity)&&(r={name:s.name,similarity:a,reason:"body"})}return r}i(De,"assessSkillDuplication");var je=new Set(["sh","bash","zsh","fish"]),$e=new Set(["mjs","cjs","js","ts","py","rb","pl"]),Me=/(?:^|[\s(`'"])(?:sudo\s+)?(?:node|npx|pnpm|npm|yarn|bun|deno|tsx|ts-node|vitest|jest|python3?|python|ruby|perl|bash|sh|zsh|exec|run|dlx)\s+(?:[-\w=@./]+\s+)*$/,He=/(?:\.\/)?(?:[\w.@-]+\/)+[\w.@-]+\.\w+/g;function Be(e){return e.replace(/```[\w-]*\n?/g," ").replace(/`/g," ")}i(Be,"stripCodeMarkers");function Ue(e){let t=e.trim();return t=t.replace(/[.,;:)\]]+$/,""),t.startsWith("./")&&(t=t.slice(2)),t.length===0||t.startsWith("/")||t.startsWith("~")||t.startsWith("..")||/[<>{}*?]/.test(t)?null:t}i(Ue,"normalise");function X(e){let t=Be(e),n=new Set,o=[];for(let r of t.matchAll(He)){let s=r[0],a=r.index??0,c=t.slice(Math.max(0,a-1),a);if(c.length>0&&!/[\s(['"=]/.test(c))continue;let l=Ue(s);if(!l)continue;let u=l.slice(l.lastIndexOf(".")+1).toLowerCase();(je.has(u)||$e.has(u)&&(s.startsWith("./")||Me.test(t.slice(t.lastIndexOf(`
|
|
48
|
+
`,Math.max(0,a-1))+1,a))))&&(n.has(l)||(n.add(l),o.push({reference:s,path:l})))}return o}i(X,"extractCommandReferences");function Ke(e,t){return X(e).filter(n=>!t(n.path))}i(Ke,"findUnresolvableReferences");import Ut from"gray-matter";import{z as J}from"zod";var Wt=J.object({type:J.enum(["instruction","prompt"])});export{te as a,ne as b,_ as c,D as d,ue as e,me as f,de as g,pe as h,fe as i,he as j,ge as k,ye as l,y as m,xe as n,_e as o,Se as p,Ee as q,ve as r,b as s,F as t,Ae as u,be as v,ke as w,Oe as x,Re as y,we as z,O as A,q as B,Ne as C,De as D,Ke as E};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{f as k,k as b}from"./chunk-OZQNSELV.js";import{m as v,s as f,u as y}from"./chunk-
|
|
1
|
+
import{f as k,k as b}from"./chunk-OZQNSELV.js";import{m as v,s as f,u as y}from"./chunk-J5HW45PZ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{createHash as D}from"node:crypto";import{existsSync as d,readFileSync as H,writeFileSync as O,mkdirSync as I}from"node:fs";import{delimiter as R,dirname as j,join as m,resolve as w}from"node:path";function P(e){return b(m(e,".claude"),!1)}o(P,"adoptedHookSettingsPath");function B(e){return D("sha256").update(e).digest("hex")}o(B,"sha256");function h(e){return B(d(e)?H(e,"utf-8"):"")}o(h,"fileHash");function x(e){if(!d(e))return{settings:{}};let t=H(e,"utf-8");try{let n=JSON.parse(t);return!n||typeof n!="object"||Array.isArray(n)?{unreadable:!0}:{settings:n}}catch{return{unreadable:!0}}}o(x,"readSettings");function p(e,t){let n=e.hooks;if(!n||typeof n!="object")return[];let r=n[t];return Array.isArray(r)?r:[]}o(p,"hookBlocks");function A(e,t){return p(e,t).flatMap(n=>(n?.hooks??[]).map(r=>r?.command).filter(r=>typeof r=="string"))}o(A,"commandsFor");function W(e){let t=P(e.dir);if(!t.endsWith("settings.local.json"))return{status:"refused",reason:`refusing to write ${t}: adopted hooks are machine-local and only ever land in settings.local.json`};let n=x(t);if("unreadable"in n)return{status:"refused",reason:`${t} exists but is not readable as JSON. Nothing was written \u2014 installing would mean replacing a settings file this command could not read.`};let r=n.settings,s=y(e.spec.command,e.instructionId),a=h(t),l=o((g,S)=>({kind:"remove-hook-entry",file:f,event:e.spec.event,command:s,backupPath:S,hashAtWrite:g}),"inverseFor");if(A(r,e.spec.event).includes(s))return{status:"already-present",target:f,command:s,inverse:l(a,`${t}.bak`),beforeHash:a};let c={...e.spec.matcher?{matcher:e.spec.matcher}:{},hooks:[{type:"command",command:s}]},u=r.hooks&&typeof r.hooks=="object"?r.hooks:{};u[e.spec.event]=[...p(r,e.spec.event),c],r.hooks=u;let{backupPath:i}=k(t,r);return i||(i=`${t}.bak`,I(j(i),{recursive:!0}),O(i,`{}
|
|
2
2
|
`)),{status:"installed",target:f,command:s,inverse:l(h(t),i),beforeHash:a}}o(W,"installHook");function _(e){let t=w(e.dir,e.inverse.file);if(!d(t))return{removed:!1,drifted:!0,code:"file-missing",reason:`${e.inverse.file} no longer exists`};let n=x(t);if("unreadable"in n)return{removed:!1,drifted:!0,code:"unreadable",reason:`${e.inverse.file} is not readable as JSON; refusing to rewrite it`};let r=n.settings,s=h(t)!==e.inverse.hashAtWrite,a=A(r,e.inverse.event).filter(i=>i===e.inverse.command);if(a.length===0)return{removed:!1,drifted:s,code:"not-present",reason:"the recorded entry is no longer present \u2014 nothing to remove"};if(a.length>1)return{removed:!1,drifted:s,code:"ambiguous",reason:`${a.length} entries carry this exact command; refusing to guess which one this artifact installed`};let l=p(r,e.inverse.event).map(i=>({...i,hooks:(i?.hooks??[]).filter(g=>g?.command!==e.inverse.command)})).filter(i=>(i.hooks??[]).length>0),c=r.hooks;l.length===0?delete c[e.inverse.event]:c[e.inverse.event]=l,Object.keys(c).length===0&&delete r.hooks;let{backupPath:u}=k(t,r);return{removed:!0,drifted:s,backupPath:u}}o(_,"uninstallHook");function K(e){return(process.env.PATH??"").split(R).filter(Boolean).some(n=>d(m(n,e)))}o(K,"commandOnPath");function $(e,t){return d(m(e,".agents","skills",t))||d(m(e,".claude","skills",t))}o($,"skillInstalled");function z(e,t){let n={satisfied:[],missing:[],unverifiable:[]};for(let r of t){let s=v(r);if(!s)continue;let[a,...l]=s.split(":"),c=l.join(":").trim();if(!c){n.unverifiable.push(s);continue}a==="cmd"?(K(c)?n.satisfied:n.missing).push(s):a==="skill"?($(e,c)?n.satisfied:n.missing).push(s):a==="file"?(d(w(e,c))?n.satisfied:n.missing).push(s):n.unverifiable.push(s)}return n}o(z,"checkDependencies");export{P as a,W as b,_ as c,z as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as T}from"./chunk-5RBLIVBF.js";import{a as S}from"./chunk-
|
|
1
|
+
import{a as T}from"./chunk-5RBLIVBF.js";import{a as S}from"./chunk-VXUKXGRX.js";import{b as A}from"./chunk-RK663O4M.js";import{e as x}from"./chunk-GN3ZHQ46.js";import{a as C}from"./chunk-WH3IPXXQ.js";import{f as M}from"./chunk-HLNHBZLI.js";import{e as k,f as E,h as p}from"./chunk-APDRR6FS.js";import{a as w}from"./chunk-ZLLER3HP.js";async function W(v,f){let{mirrorId:i,evalTargetId:g,config:o}=v,a=w(e=>f.logger.info(e),"log"),s=await k(`/api/eval-targets/${g}`),$=await k(`/api/eval-targets/${g}/evals`);if($.length===0&&o.generateIfEmpty){a("No eval cases on target \u2014 generating from content via local LLM...");let e=await A({content:s.content,name:s.name});if(e===null)throw new Error("Case generation requires an LLM backend (claude CLI on PATH or ANTHROPIC_API_KEY) \u2014 none available on this worker.");let n=[];for(let t of e)n.push(await E(`/api/eval-targets/${g}/evals`,t));$=n,a(`Generated ${n.length} eval case(s)`)}if($.length===0)throw new T("No evals defined for target");let G=o.runsPerEval??1,R=o.timeout??12e4,j=o.iteration??1,y=new Set;if(f.job.attempts>1)for(let n=0;;n+=100){let t=await k(`/api/eval-targets/${g}/runs?jobId=${i}&limit=100&offset=${n}`);for(let r of t)y.add(`${r.evalId}|${r.configuration}|${r.runNumber}|${r.iteration}`);if(t.length<100)break}let _=[{name:"with_target",content:s.content}];o.skipBaseline||_.push({name:"without_target"});let d=[];for(let e of $)for(let n of _)for(let t=1;t<=G;t++)y.has(`${e.id}|${n.name}|${t}|${j}`)||d.push({eval_:e,configuration:n.name,targetContent:n.content,runNumber:t});y.size>0&&a(`Resuming attempt ${f.job.attempts}: ${y.size} run(s) already persisted, ${d.length} remaining`);let l=d.length,u=0,m=Math.min(o.parallel??1,4);await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:0,current:null,message:`Starting ${l} eval runs (concurrency: ${m})...`}});let b=[];async function I(e){let n=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;a(`[${u+1}/${l}] ${n}`);let t=x({targetType:s.type,targetContent:e.targetContent,targetName:s.name});t.leakedFiles.length&&a(`\u26A0 CONTAMINATED ${n}: ${t.leakedFiles.join(", ")} survived the strip`);try{let r=await M({prompt:e.eval_.prompt,targetContent:t.systemPrompt,workDir:t.workDir,timeout:R,model:o.model}),c={};return!o.skipGrading&&e.eval_.expectations.length>0&&!r.error&&(c=await C({prompt:e.eval_.prompt,output:r.output,expectations:e.eval_.expectations,model:o.graderModel??o.model,timeout:R})),{jobId:i,evalId:e.eval_.id,evalTargetId:s.id,evalTargetVersion:s.version,configuration:e.configuration,runNumber:e.runNumber,iteration:j,status:r.error?"failed":"completed",outputs:{...r.error?{error:r.error}:{transcript:r.output,...r.model?{model:r.model}:{}},methodology:t.methodology,delivery:t.delivery,isolated:t.isWorktree,...t.leakedFiles.length?{leakedFiles:t.leakedFiles}:{}},timing:{duration_ms:r.durationMs,total_tokens:r.totalTokens},grading:c,worktree:t.isWorktree?!0:void 0}}finally{t.cleanup()}}if(w(I,"processItem"),m<=1)for(let e of d){let n=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Executing ${n}...`}});let t=await I(e);await E("/api/eval-runs",t),b.push(t),u++,await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Completed ${n}`}})}else{a(`Running ${l} evals with concurrency=${m} (worktree isolation)`);for(let e=0;e<d.length;e+=m){let n=d.slice(e,e+m),t=`batch ${Math.floor(e/m)+1}/${Math.ceil(d.length/m)}`;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Executing ${t} (${n.length} parallel)...`}});let r=await Promise.all(n.map(I));for(let c of r)await E("/api/eval-runs",c),b.push(c),u++;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Completed ${t}`}})}}let P=J(b),h;if(!o.skipGrading&&b.some(e=>e.grading&&Object.keys(e.grading).length>0))try{a(`Running meta-judge for job ${i}...`);let e=$.map(n=>{let r=b.filter(c=>c.evalId===n.id&&c.configuration==="with_target")[0];return{evalName:n.name,prompt:n.prompt,expectations:n.expectations,grading:r?.grading?r.grading:null,output:r?.outputs?.transcript?.slice(0,500)}});h=await S({targetName:s.name,evalResults:e,model:o.graderModel??o.model,timeout:6e4}),a(`Meta-judge: quality=${h.quality_score}/5, issues=${h.issues.length}`)}catch(e){a(`Meta-judge failed (non-fatal): ${e instanceof Error?e.message:String(e)}`)}let N=h?{...P,meta_judgement:h}:P;return a(`Job ${i} completed: ${u}/${l} runs`),await p(`/api/eval-jobs/${i}/state`,{result:N}).catch(e=>{a(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),N}w(W,"processEval");function J(v){let f=v.filter(a=>a.status==="completed"),i=v.filter(a=>a.status==="failed"),g=f.filter(a=>{let s=a.grading;return s&&Object.keys(s).length>0}),o=g.length>0?g.reduce((a,s)=>a+(s.grading?.summary?.pass_rate??0),0)/g.length:null;return{total:v.length,completed:f.length,failed:i.length,avgPassRate:o}}w(J,"buildSummary");export{W as a};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{h as R}from"./chunk-RJX75Y7J.js";import{a as S,b as v,c as $,f as w,g as A}from"./chunk-SIGZEQ3K.js";import{e as y,f}from"./chunk-APDRR6FS.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execFileSync as x}from"node:child_process";import{openSync as P,readSync as C,closeSync as j,readFileSync as E}from"node:fs";function I(l){let t;try{t=P(l,"r");let o=Buffer.alloc(64*1024),s=C(t,o,0,o.length,0),i=o.subarray(0,s).toString("utf-8");for(let r of i.split(`
|
|
2
|
+
`))if(r.startsWith("{"))try{let a=JSON.parse(r).cwd;if(typeof a=="string"&&a.startsWith("/"))return a}catch{}return null}catch{return null}finally{t!==void 0&&j(t)}}c(I,"readTranscriptCwd");function W(l){let t=c(r=>{try{return x("git",["-C",l,...r],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:5e3}).trim()||null}catch{return null}},"git");if(!t(["rev-parse","--show-toplevel"]))return null;let s=t(["rev-parse","--git-dir"]),i=t(["rev-parse","--git-common-dir"]);return{gitRemote:t(["remote","get-url","origin"]),gitRootCommit:t(["rev-list","--max-parents=0","HEAD"])?.split(`
|
|
3
|
+
`).pop()?.trim()??null,gitBranch:t(["branch","--show-current"]),isWorktree:!!s&&!!i&&s!==i}}c(W,"gitAnchors");async function O(l,t,o=v(W,I)){let s=Math.min(l.limit??200,1e3),i=await R(()=>y(`/api/sessions/unattributed?limit=${s}`),{log:c(e=>t.logger.info(e),"log"),label:"sessions/unattributed",idempotent:!0}),r=i.sessions??[],a=i.total??r.length;if(r.length===0)return t.logger.info("no unattributed sessions"),{scanned:0,repaired:0,reimported:0,unrepairable:0,remaining:0};let m=0,g=0,u=0;for(let e of r){if(!e.externalSessionId){u++;continue}let n=A(e,o);if(!n){u++;continue}try{await f("/api/sessions",{tool:e.tool,externalSessionId:e.externalSessionId,projectPath:n.projectPath,...n.gitBranch?{gitBranch:n.gitBranch}:{},metadata:{...n.gitRemote?{gitRemote:n.gitRemote}:{},...n.gitRootCommit?{gitRootCommit:n.gitRootCommit}:{},isWorktree:n.isWorktree,reconciledAttribution:!0}}),m++}catch(d){u++,t.logger.info(`reconcile failed for ${e.externalSessionId}: ${d.message}`);continue}let p=e.tool==="claude_code"?$(e.externalSessionId,o):null,b=w({tool:e.tool,pathWasJunk:!!e.projectPath&&S(e.projectPath),endedAt:e.endedAt??null,transcript:p?o.stat(p):null});if(b.reimport&&p)try{let d=E(p,"utf-8");await f(`/api/sessions/${e.id}/reimport`,{content:d,tool:"claude_code"}),g++}catch(d){t.logger.info(`reimport failed for ${e.externalSessionId} (${b.reason}): ${d.message}`)}}let h=a-m;return t.logger.info(`reconciled attribution: scanned=${r.length} repaired=${m} reimported=${g} unrepairable=${u} remaining=${h} (of ${a} total)`),{scanned:r.length,repaired:m,reimported:g,unrepairable:u,remaining:h}}c(O,"cronReconcileAttribution");export{O as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as k}from"./chunk-GN3ZHQ46.js";import{a as f}from"./chunk-KGURGIZ2.js";import{a as $}from"./chunk-
|
|
1
|
+
import{e as k}from"./chunk-GN3ZHQ46.js";import{a as f}from"./chunk-KGURGIZ2.js";import{a as $}from"./chunk-WH3IPXXQ.js";import{f as v}from"./chunk-HLNHBZLI.js";import{f as p}from"./chunk-APDRR6FS.js";import{a as c}from"./chunk-ZLLER3HP.js";async function x(m,t,s=()=>{}){let{eval_:r,configuration:i,targetContent:g,runNumber:o}=m;s(`[${i}] ${r.name} run#${o} \u2014 executing...`);let a=k({targetType:t.targetType,targetContent:g,targetName:t.targetName}),d={methodology:a.methodology,delivery:a.delivery,isolated:a.isWorktree,...t.candidateContentHash?{candidateContentHash:t.candidateContentHash}:{},...a.leakedFiles.length?{leakedFiles:a.leakedFiles}:{}};a.isWorktree||s(`[${i}] ${r.name} run#${o} \u2014 \u26A0 no git worktree; running without repo context`),a.leakedFiles.length&&s(`[${i}] ${r.name} run#${o} \u2014 \u26A0 CONTAMINATED: ${a.leakedFiles.join(", ")} survived the strip`);try{let n=await v({prompt:r.prompt,targetContent:a.systemPrompt,workDir:a.workDir,timeout:t.timeout,model:t.model});if(n.error){let e=f(n.error);return s(`[${i}] ${r.name} run#${o} \u2014 FAILED (${e.kind}): ${n.error}`),{evalId:r.id,evalTargetId:t.targetId,evalTargetVersion:t.targetVersion,configuration:i,runNumber:o,iteration:t.iteration,status:"failed",outputs:{error:n.error,failureKind:e.kind,failureClass:e.class,...d},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens},grading:{},failure:e}}s(`[${i}] ${r.name} run#${o} \u2014 completed in ${(n.durationMs/1e3).toFixed(1)}s`);let u={};if(!t.skipGrading&&r.expectations.length>0){s(`[${i}] ${r.name} run#${o} \u2014 grading...`);let e=await $({prompt:r.prompt,output:n.output,expectations:r.expectations,model:t.graderModel??t.model,timeout:t.timeout});u=e,s(`[${i}] ${r.name} run#${o} \u2014 grading done: pass_rate=${e.summary.pass_rate==null?"n/a (all assertions errored)":`${(e.summary.pass_rate*100).toFixed(0)}%`}`)}return{evalId:r.id,evalTargetId:t.targetId,evalTargetVersion:t.targetVersion,configuration:i,runNumber:o,iteration:t.iteration,status:"completed",outputs:{transcript:n.output,...d},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens,total_duration_seconds:n.durationMs/1e3},grading:u}}finally{a.cleanup()}}c(x,"executeAndGradeCase");async function R(m){let{cases:t,targetContent:s,concurrency:r,runNumber:i,opts:g,skipBaseline:o,onLog:a=c(()=>{},"onLog")}=m,d=o?["with_target"]:["with_target","without_target"],n=[];for(let e of t)for(let l of d)n.push({eval_:e,configuration:l,targetContent:l==="with_target"?s:void 0,runNumber:i});let u=[];for(let e=0;e<n.length;e+=Math.max(1,r)){let l=n.slice(e,e+Math.max(1,r)),h=await Promise.all(l.map(b=>x(b,g,a)));u.push(...h)}for(let e of u)try{await p("/api/eval-runs",e)}catch(l){a(` \u26A0 failed to post a run result: ${l instanceof Error?l.message:String(l)}`)}try{await p(`/api/eval-targets/${g.targetId}/label-state`,{})}catch(e){a(` \u26A0 label-state notification skipped: ${e instanceof Error?e.message:String(e)}`)}return{completed:u.filter(e=>e.status==="completed").length,failed:u.filter(e=>e.status==="failed").length,results:u}}c(R,"runBatchAndPost");export{x as a,R as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"./chunk-ZLLER3HP.js";var g=5e3;function S(){let e=process.cpuUsage();return{wallMs:Date.now(),monoMs:Number(process.hrtime.bigint()/1000000n),cpuMs:(e.user+e.system)/1e3}}a(S,"takeClockSample");function f(e,t,u,o=5e3){let r=t.wallMs-e.wallMs,s=t.monoMs-e.monoMs,i=Math.max(0,t.cpuMs-e.cpuMs);if(r<u+o)return null;let l={detectedAt:new Date(t.wallMs).toISOString(),lastSeenAt:new Date(e.wallMs).toISOString(),wallGapMs:r,monoGapMs:s,cpuMs:i,expectedMs:u};return r-s>o?{kind:"suspend",evidence:"clock",...l}:{kind:i>r*.25?"stall":"suspend",evidence:"cpu",...l}}a(f,"classifyGap");var P=15e3,b=50;function w(e={}){let t=e.intervalMs??P,u=e.sample??S,o=e.setIntervalFn??setInterval,r=e.clearIntervalFn??clearInterval,s=u(),i=new Date(s.wallMs).toISOString(),l=[],d=0,p=0,m=0,M=o(a(()=>{let n=u(),c=f(s,n,t);if(s=n,!!c){c.kind==="suspend"?d++:p++,m+=c.wallGapMs-c.expectedMs,l.push(c),l.length>b&&l.shift();try{e.onPause?.(c)}catch{}}},"tick"),t);M.unref?.();let v=a(()=>r(M),"stop");return e.signal?.addEventListener("abort",v,{once:!0}),{summary:a(()=>{let n=l[l.length-1];return{suspends:d,stalls:p,pausedMs:m,lastPause:n?{kind:n.kind,evidence:n.evidence,detectedAt:n.detectedAt,lastSeenAt:n.lastSeenAt,wallGapMs:n.wallGapMs}:null,since:i}},"summary"),pausesSince:a(n=>l.filter(c=>new Date(c.detectedAt).getTime()>=n),"pausesSince"),stop:v}}a(w,"startPauseDetector");function A(e){return e.some(t=>t.kind==="suspend"&&t.evidence==="clock")}a(A,"hasDefinitiveSuspend");function h(e){if(e.length===0)return"";let t=e.reduce((s,i)=>s+i.wallGapMs,0),u=new Set(e.map(s=>s.kind==="suspend"?"machine suspended":"event loop stalled")),o=Math.round(t/6e4),r=o>=1?`${o}m`:`${Math.round(t/1e3)}s`;return`${[...u].join(" + ")} for ${r} during this job (${e.length} pause${e.length===1?"":"s"}, last resumed ${e[e.length-1].detectedAt})`}a(h,"describePauses");export{g as a,S as b,f as c,w as d,A as e,h as f};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{w}from"./chunk-
|
|
1
|
+
import{w}from"./chunk-F6DAHCJC.js";import{a as m}from"./chunk-N7ODX6PO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as g}from"node:child_process";import d from"node:fs";import b from"node:path";function c(e,t){return new Promise((r,n)=>{let o=g("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:m()}),i="",f="";o.stdout.on("data",a=>{i+=a.toString()}),o.stderr.on("data",a=>{f+=a.toString()}),o.on("error",a=>n(new Error(`git ${e.join(" ")} failed to spawn: ${a.message}`))),o.on("close",a=>{a===0?r({code:a,stdout:i,stderr:f}):n(new Error(`git ${e.join(" ")} exited ${a}: ${f.trim()||i.trim()}`))})})}s(c,"runGit");async function k(e,t){if(!t||!t.trim())throw new Error('invalid branch name "": branch must be a non-empty git refname');if(t.startsWith("-"))throw new Error(`invalid branch name "${t}": must not start with "-" (git would parse it as an option)`);if(/\s/.test(t))throw new Error(`invalid branch name "${t}": must not contain whitespace`);try{await c(["check-ref-format","--branch",t],e)}catch{throw new Error(`invalid branch name "${t}": not a valid git refname`)}}s(k,"assertValidBranch");function h(e){let t=b.resolve(e);try{return d.realpathSync(t)}catch{return t}}s(h,"canonical");function y(e){let t=[],r=null;for(let n of e.split(`
|
|
2
2
|
`))n.startsWith("worktree ")?(r&&t.push(r),r={path:n.slice(9).trim()}):n.startsWith("branch ")&&r&&(r.branch=n.slice(7).trim().replace(/^refs\/heads\//,""));return r&&t.push(r),t}s(y,"parseWorktreeList");async function v(e,t){try{return await c(["show-ref","--verify","--quiet",`refs/heads/${t}`],e),!0}catch{return!1}}s(v,"branchExists");async function B(e){let{repoRoot:t,branch:r,baseRef:n,allowExistingBranch:o=!1}=e;await k(t,r);let i=w({repoRoot:t,branch:r,basePath:e.basePath}),f=await c(["worktree","list","--porcelain"],t),a=y(f.stdout),p=a.find(u=>u.branch===r);if(p)return{path:h(p.path),branch:r,created:!1};let l=a.find(u=>h(u.path)===i);if(l)return{path:h(l.path),branch:l.branch??r,created:!1};if(await v(t,r)){if(!o)throw new Error(`branch "${r}" already exists with no worktree; refusing to clobber (pass allowExistingBranch:true to attach a worktree onto it)`);return await c(["worktree","add",i,r],t),{path:h(i),branch:r,created:!0}}return await c(["worktree","add",i,"-b",r,n],t),{path:h(i),branch:r,created:!0}}s(B,"ensureWorktree");async function S(e){let{repoRoot:t,worktreePath:r}=e;if(!d.existsSync(r))return{removed:!1,reason:"absent"};let n=!1;try{n=(await c(["status","--porcelain"],r)).stdout.trim().length>0}catch{n=!1}if(n)return{removed:!1,reason:"dirty"};try{return await c(["worktree","remove",r],t),{removed:!0}}catch(o){let i=o instanceof Error?o.message:String(o);if(/not a working tree|No such file or directory|not a valid path|is not a working tree/i.test(i))return{removed:!1,reason:"absent"};throw o}}s(S,"removeWorktree");export{c as a,B as b,S as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as E}from"./chunk-
|
|
1
|
+
import{g as E}from"./chunk-U3XKXJ3A.js";import{a as r}from"./chunk-ZLLER3HP.js";var g="<<<FILE-CONTENT-BEGIN>>>",m="<<<FILE-CONTENT-END>>>",b="<RATIONALE>",R="</RATIONALE>",u="<PROPOSED_INSTRUCTION>",p="</PROPOSED_INSTRUCTION>",d=.5,f=3;function y(e){let t=e.immutableSections.length>0?e.immutableSections.map(s=>` - ${s}`).join(`
|
|
2
2
|
`):" (none)",o=e.evidence.priorDecisions.length>0?["6. You have edited this file before. The attempts are listed below with"," how each was judged. Do not re-propose an edit that was MEASURED and"," rejected: it was replayed against this exact file and did not beat it,"," so measuring it again spends the same budget for the same answer. An"," attempt marked NOT MEASURED is different \u2014 the gate stopped it before"," it earned a verdict, so whether it would have helped is still unknown."]:[],n=e.currentContent.trim().length,i=` It is currently ${n} characters. Your proposal must stay between ${Math.ceil(n*d)} and ${Math.floor(n*f)} characters \u2014 outside that it is discarded unmeasured as a truncation or runaway rewrite.`;return["You are improving an AI coding assistant instruction file so that it scores","better on a fixed set of evaluation cases.","",`The file is a ${e.targetType} named "${e.targetName}".`,i,"","RULES",`0. The current file is EXACTLY the text between ${g} and`,` ${m} in the data message. Headings after the closing`," sentinel (underperforming cases, notes, prior attempts) are evidence",' ABOUT the file \u2014 they are not in the file, and "removing" one of them'," is not an edit. Do not include the sentinels in your output.","1. Return the COMPLETE new file, not a diff, not a patch, not a summary,"," and not an excerpt. Everything you omit will be DELETED from the file.","2. Preserve everything you are not deliberately changing, byte for byte.","3. Make a focused edit. You are one step in a measured loop: a small change"," that can be attributed beats a rewrite that cannot.","4. Do not edit these sections or anything nested under them \u2014 an edit that"," touches them is refused downstream and the whole proposal is wasted:",t,"5. Do not add meta-commentary about the evaluation, the loop, or this"," prompt to the file. The file is read by other agents as instructions.",...o,"","OUTPUT FORMAT \u2014 exactly this, with no text before or after:",b,"One or two sentences: what you changed and which evidence motivated it.",R,u,"The complete new file content.",p].join(`
|
|
3
3
|
`)}r(y,"buildProposerSystemPrompt");var h=r(e=>`${e>=0?"+":"-"}${Math.abs(e*100).toFixed(1)}pp`,"signedPp");function O(e){let t=/^\d{4}-\d{2}-\d{2}/.exec(e.at??"")?.[0]??"undated",o;if(e.measured){let i=e.measured;o=`MEASURED against this exact file and ${e.decision==="promote"?"ACCEPTED":"REJECTED"}: ${h(i.delta)} (CI ${h(i.ciLower)} to ${h(i.ciUpper)}, ${i.nPairs} paired cases)`}else o=`NOT MEASURED \u2014 the gate refused it, so its merit is still unknown: ${e.refusals.length>0?e.refusals.join("; "):"no reason recorded"}`;let n=[`- ${t} \u2014 ${o}`];return e.decision==="promote"&&n.push(e.applied?" The file WAS rewritten by this decision.":" Dry run: the file was NOT rewritten, so this edit is still available."),e.touched.length>0&&n.push(` Sections touched: ${e.touched.join(", ")}`),e.rationale.trim()!==""&&n.push(` You said at the time: ${e.rationale.trim()}`),n.join(`
|
|
4
4
|
`)}r(O,"describePriorDecision");function P(e){let t=e.evidence,o=["## CURRENT FILE CONTENT","","The file is EXACTLY the text between the two sentinel lines below \u2014","nothing before the first sentinel or after the second is part of it.","Everything after the closing sentinel is evidence ABOUT the file.","",g,e.currentContent,m,""];if(t.weakest.length>0){o.push("## CASES WHERE THIS FILE CURRENTLY UNDERPERFORMS","");for(let n of t.weakest)o.push(`- ${n.name}: passes ${(n.withPassRate*100).toFixed(0)}% with the file vs ${(n.withoutPassRate*100).toFixed(0)}% without it`);o.push("")}return t.nonDiscriminating.length>0&&o.push("## CASES THAT CARRY NO SIGNAL EITHER WAY","","These score the same with and without the file. Changing the file to chase","them is unlikely to move anything.","",...t.nonDiscriminating.map(n=>`- ${n}`),""),t.priorDecisions.length>0&&o.push("## WHAT YOU ALREADY PROPOSED FOR THIS FILE, AND HOW IT WAS JUDGED","","Newest first. Every attempt listed here was made against the file above,","byte for byte. Attempts against a different version of the file are not","shown, because a verdict earned by different text says nothing about this","one.","",...t.priorDecisions.map(O),""),t.notes.length>0&&o.push("## NOTES","",...t.notes.map(n=>`- ${n}`),""),o.join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as u}from"./chunk-
|
|
1
|
+
import{c as u}from"./chunk-5XK6LB2T.js";import{b as c,e as y,f as m}from"./chunk-APDRR6FS.js";import{a as n,b as t,i as s,k as p}from"./chunk-PZNWH4VQ.js";import{a}from"./chunk-ZLLER3HP.js";import{hostname as l}from"node:os";async function R(f,r,h){t();let o=process.env.RULEMETRIC_API_KEY,d=n().apiKey;if(o||d)try{await y("/api/profile");return}catch(e){if(!(e instanceof c)||e.statusCode!==401)return;if(o){r('Your exported RULEMETRIC_API_KEY was rejected (revoked?). Unset it or replace it with a fresh key (`rulemetric auth create-key --name "my-laptop"`).');return}p(),t(),r("Stored API key was rejected (revoked?) \u2014 replacing it with a fresh one.")}let i=`${l()} (auto)`;try{let e=await m("/api/auth/api-keys",{name:i});s(e.key,process.env.RULEMETRIC_API_URL),t(),f(`Created API key "${i}" for hooks + proxy auth (saved to your config).`),u("key_created",{},h)}catch(e){let k=e instanceof Error?e.message:String(e);r(`Could not auto-create an API key (${k}). Hooks/proxy will work via your session token for ABOUT AN HOUR \u2014 the token expires, and capture then stops until a key exists. Run \`rulemetric auth create-key --name "my-laptop"\` (or \`rulemetric auth login\` again) to fix this permanently.`)}}a(R,"ensureDeviceApiKey");export{R as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as S,c as B,f as s,g as R,i as b}from"./chunk-QFKUSNUB.js";import{c as ne}from"./chunk-4N43IBXH.js";import{b as re}from"./chunk-IEQDLURA.js";import{d as te,e as oe,f as se}from"./chunk-KINIFUZQ.js";import{a as q}from"./chunk-VIQ25ORK.js";import{b as $}from"./chunk-6ZPSVZNH.js";import{a as K}from"./chunk-RGUCR7T6.js";import{a as Y}from"./chunk-WY3VVX3R.js";import{a as O}from"./chunk-ZYGBABMZ.js";import{a as U}from"./chunk-U7TBEC3I.js";import{e as D}from"./chunk-Y7QIOPN5.js";import{b as G}from"./chunk-DUBBL57L.js";import{c as C}from"./chunk-WHQ4BDSM.js";import{a as F}from"./chunk-3MDEGOUG.js";import{a as W}from"./chunk-JNFB22FD.js";import{a as J}from"./chunk-HLQZR4XJ.js";import{b as V}from"./chunk-5RBLIVBF.js";import{a as X}from"./chunk-SN3CHV66.js";import{a as Z}from"./chunk-6W2GSV4O.js";import{a as x}from"./chunk-JWFRI32Y.js";import{a as j}from"./chunk-25Q3Y7TC.js";import{a as Q}from"./chunk-MNQPCNGQ.js";import{a as P}from"./chunk-PZS55PW2.js";import{a as ee}from"./chunk-WQX4RRBQ.js";import{a as z}from"./chunk-WOJ733IB.js";import{b as N}from"./chunk-UM4CBCXI.js";import{l as L}from"./chunk-H3BCWSYO.js";import{d as T}from"./chunk-SBGXIPRN.js";import{b as H,e as M,f as y}from"./chunk-APDRR6FS.js";import{a as i}from"./chunk-ZLLER3HP.js";var A=null,h=null,ce={process_eval:W,process_insights:J,process_launch:$,process_send_message:O,process_conversation:F,process_session_goal:U,distill_memories:G,memory_ab:K,process_run_cleanup:Y,cron_refine_cases:j,cron_retire_unused_skills:ee,cron_reconcile_attribution:x,cron_suggest_instructions:D,cron_refresh_skills:P,cron_refresh_pricing:Q,cron_eval_autorun:X,cron_auto_accept_suggestions:z,cron_instruction_training:Z,cron_instruction_evolution:L,process_judge_review:q,harbor_ab:C},ae=Object.keys(ce),me=new Set([]);function pe(e=process.env){return e.DATABASE_URL?ae:ae.filter(r=>!me.has(r))}i(pe,"availableCapabilities");var ge=3e4,_e=3e4,fe=3e4,ie=500,le=1e4,ve=`thin-agent-${process.pid}`,I=null;function ke(e,r,t,u){let m;try{let l=T();m={claude:l.claudeBin!=null,codex:l.codexBin!=null,codexModel:l.codexConfiguredModel}}catch{}let p;try{p=N()}catch{}let g=i(l=>y("/api/workers/heartbeat",{workerType:"cli-worker",clientName:ve,clientVersion:u,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:l,metadata:{capabilities:e,mode:"thin-agent",llmEngines:m,harborReady:p,machine:A?.summary()}}).then(d=>{let c=d?.advisory;c&&c.message!==I?(I=c.message,s(t,{event:"worker_advisory",code:c.code,message:c.message})):c||(I=null)}).catch(d=>{s(t,{event:"presence_heartbeat_error",error:d instanceof Error?d.message:String(d)})}),"send");g("alive");let f=setInterval(()=>g("alive"),fe),a=null,n=i(()=>a||(clearInterval(f),a=Promise.race([g("shutting_down"),new Promise(l=>setTimeout(l,2e3).unref())]),a),"sayGoodbye");return r.addEventListener("abort",()=>{n()},{once:!0}),{shutdown:n}}i(ke,"startPresenceHeartbeat");async function we(e,r){let t=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${r}`,u=await M(`/api/work/next?${t}`);return u==null||typeof u=="string"?null:u}i(we,"pollForWork");function be(e,r){return{logger:{info:i(t=>r(t),"info"),warn:i(t=>r(t),"warn"),error:i(t=>r(t),"error")},job:{attempts:e}}}i(be,"makeHelpers");async function he(e,r,t,u){let m=ce[e.kind],p=Date.now();if(s(t,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!m){let n=`unknown kind: ${e.kind}`;s(t,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:n}),await y(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:n,terminal:!0}).catch(()=>{});return}let g=i(()=>{s(t,{event:"heartbeat",jobId:e.id}),b(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken},{budgetMs:Math.min(B,Math.max(0,r-1e3)),signal:u,log:t,event:"heartbeat",jobId:e.id}).then(n=>{n.ok||s(t,{event:"heartbeat_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})})},"beat"),f=setInterval(g,r);h={jobId:e.id,beat:g};let a;try{let n=be(e.attempts,t);a={kind:"complete",result:await m(e.payload,n)??{}}}catch(n){let l=A?.pausesSince(p)??[],d=se(l),c=n instanceof Error?n.message:String(n),v=V(n),o=!v&&oe(l);a={kind:"fail",message:d?`${d}; ${c}`:c,pausedDuringJob:!!d,terminal:v,hostSuspended:o}}try{if(a.kind==="complete"){s(t,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-p});let n=await b(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:a.result},{budgetMs:S,signal:u,log:t,event:"complete_post",jobId:e.id});n.ok||s(t,{event:"complete_post_error",jobId:e.id,kind:e.kind,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}else{s(t,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-p,terminal:a.terminal,error:a.message,...a.pausedDuringJob?{pausedDuringJob:!0}:{},...a.hostSuspended?{hostSuspended:!0}:{}});let n=await b(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:a.message,terminal:a.terminal,hostSuspended:a.hostSuspended},{budgetMs:S,signal:u,log:t,event:"fail_post",jobId:e.id});n.ok||s(t,{event:"fail_post_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}finally{clearInterval(f),h=null}}i(he,"runOne");var de=new Set(["process_eval","process_conversation","process_insights","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_eval_autorun","cron_instruction_evolution","process_judge_review","harbor_ab"]);async function Ze(e){let r=e.log??(()=>{}),t=e.pollWaitMs??ge,u=e.heartbeatIntervalMs??_e,m=e.capabilities??pe();s(r,{event:"agent_start",capabilities:m,pollWaitMs:t,heartbeatIntervalMs:u});try{let o=re();o.removed.length>0&&s(r,{event:"eval_worktrees_swept",removed:o.removed.length})}catch(o){s(r,{event:"eval_worktree_sweep_failed",error:o instanceof Error?o.message:String(o)})}A=te({signal:e.signal,onPause:i(o=>{s(r,{event:"machine_pause",...o,jobId:h?.jobId??null}),h?.beat()},"onPause")});let p=ke(m,e.signal,r,e.version);ne({signal:e.signal,log:r}).catch(o=>{s(r,{event:"tt_heartbeat_fatal",error:o instanceof Error?o.message:String(o)})});let g=5*6e4,f=0,a=i(()=>{if(!e.readInstalledVersion||!e.version)return!1;let o=Date.now();if(o-f<g)return!1;f=o;let w=e.readInstalledVersion();return!!(w&&w!==e.version)},"versionDrifted"),n=new AbortController,l=n.signal;e.signal.aborted?n.abort():e.signal.addEventListener("abort",()=>n.abort(),{once:!0});let d=i(async(o,w)=>{let _=ie;for(;!l.aborted;){if(a()){s(r,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),n.abort(),e.onVersionDrift?.();break}let E=null;try{E=await we([...w],t)}catch(k){let ue=k instanceof H?k.statusCode:void 0;if(s(r,{event:"poll_error",lane:o,status:ue,error:k instanceof Error?k.message:String(k)}),!await R(_,l))break;_=Math.min(_*2,le);continue}if(!E){if(s(r,{event:"poll_204",lane:o}),!await R(_,l))break;_=Math.min(_*2,le);continue}_=ie,await he(E,u,r,l)}},"runLane"),c=m.filter(o=>de.has(o)),v=m.filter(o=>!de.has(o));c.length>0&&v.length>0?(s(r,{event:"agent_lanes",heavy:c.length,fast:v.length}),await Promise.all([d("heavy",c),d("fast",v)])):await d("single",m),await p.shutdown(),s(r,{event:"agent_stop"})}i(Ze,"runAgentLoop");export{ce as a,ae as b,pe as c,we as d,Ze as e};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as b,f as y}from"./chunk-
|
|
1
|
+
import{d as b,f as y}from"./chunk-U3XKXJ3A.js";import{e as M,f as w}from"./chunk-APDRR6FS.js";import{a as u}from"./chunk-ZLLER3HP.js";var $={anthropic:["https://platform.claude.com/docs/en/about-claude/pricing.md"],openai:["https://platform.openai.com/docs/pricing"]},R=.7,v=16e3,x=["You extract LLM API pricing from a provider pricing page.","You will be given the page text in <data> tags and, in this system prompt,","a list of model ids to find. For EACH requested model id, return its","published USD price per 1,000,000 tokens.","","Rules:","- Only report a model if you can find its rate ON THE PAGE. If it is not on"," the page, set found=false and omit the numbers \u2014 never guess from memory.","- inputPerM and outputPerM are the standard (non-batch, non-priority) rates.","- cacheReadPerM: the cached/discounted-input rate if published, else omit.","- For Anthropic models ONLY, if cache-write rates are not explicitly listed,"," compute them as cacheWrite5mPerM = inputPerM * 1.25 and"," cacheWrite1hPerM = inputPerM * 2.0. For all other providers, omit them.","- confidence is 0..1: how sure you are the numbers are correct for THIS id.","- contextWindow in tokens if stated, else omit.","","Respond with ONLY a JSON object of the form:",'{"rates":[{"modelId":"...","found":true,"confidence":0.9,"inputPerM":5,"outputPerM":25,"cacheReadPerM":0.5,"contextWindow":1000000}]}'].join(`
|
|
2
2
|
`);async function C(f){try{let n=await fetch(f,{headers:{accept:"text/plain, text/markdown, text/html"}});if(!n.ok)return null;let i=await n.text();return i.length>v?i.slice(0,v):i}catch{return null}}u(C,"fetchPage");var L=u(async(f,n)=>{let i=await M("/api/pricing/coverage"),I=[...i.unpriced,...i.stale],m=new Map;for(let r of I)m.set(`${r.provider}::${r.modelId}`,r);let a=[...m.values()];if(a.length===0)return n.logger.info("[cron-refresh-pricing] coverage clean \u2014 nothing unpriced or stale"),{status:"clean",checked:i.unpriced.length+i.stale.length};if(b()==="none")return n.logger.warn(`[cron-refresh-pricing] ${a.length} model(s) need pricing but no LLM backend (install the claude CLI or set ANTHROPIC_API_KEY) \u2014 skipping`),{status:"no-llm",pending:a.length};let d=new Map;for(let r of a){let o=d.get(r.provider)??[];o.push(r.modelId),d.set(r.provider,o)}let t={written:0,unchanged:0,flagged:0,rejected:0,skipped:0},c=[];for(let[r,o]of d){let h=$[r];if(!h){n.logger.warn(`[cron-refresh-pricing] no pricing source configured for provider '${r}' (${o.length} model(s)) \u2014 skipping`),t.skipped+=o.length;continue}let p="",l="";for(let e of h){let s=await C(e);s&&(p+=`
|
|
3
3
|
|
|
4
4
|
=== ${e} ===
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as i}from"./chunk-C42NTI2V.js";import{a as r}from"./chunk-ZLLER3HP.js";var c={codex:"codex"},l=class{constructor(t){this.deps=t}static{r(this,"TranscriptInstructionLinker")}lastPosted=new Map;async emit(t){let o=c[t.tool];if(!o)return"unsupported-tool";if(!t.projectPath)return"no-project-path";let a=this.deps.buildSnapshot??i,s;try{s=a(t.projectPath,o)}catch{return"failed"}if(!s)return"no-instruction-files";if(this.lastPosted.get(t.sessionId)===s.request_hash)return"unchanged";try{await this.deps.postSnapshot(t.sessionId,s),await this.deps.linkInstructions(t.sessionId)}catch(e){return this.deps.log?.(`instruction linking failed for ${t.sessionId}: ${e instanceof Error?e.message:String(e)}`),"failed"}return this.lastPosted.set(t.sessionId,s.request_hash),this.deps.log?.(`linked ${s.context_items.length} ${o} instruction file(s) for ${t.sessionId}`),"linked"}};function d(n){if(typeof n!="object"||n===null)return null;let t=n.id;return typeof t=="string"&&t.length>0?t:null}r(d,"sessionIdFromImportResult");export{c as a,l as b,d as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{f as p}from"./chunk-HLNHBZLI.js";import{a as l}from"./chunk-ZLLER3HP.js";var k=[{name:"git-commit-helper",description:"Writes conventional commit messages and PR descriptions from a diff"},{name:"sql-query-optimizer",description:"Analyzes slow SQL queries and proposes indexes and rewrites"},{name:"i18n-string-extractor",description:"Finds hardcoded UI strings and extracts them into translation files"}],T=`You are an AI coding assistant with access to a set of optional skills. When a user request matches a skill's description, you invoke that skill before answering; when no skill applies, you answer directly without one. Descriptions are your ONLY information about each skill.
|
|
2
2
|
|
|
3
3
|
{{CATALOG}}
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as E}from"./chunk-
|
|
1
|
+
import{a as E}from"./chunk-KCOJLTVX.js";import{b as R,c as x}from"./chunk-KGURGIZ2.js";import{f as F}from"./chunk-APDRR6FS.js";import{a as s}from"./chunk-ZLLER3HP.js";var A="with_candidate",$="with_prior_version";function k(n){let t=n.filter(e=>e.configuration===A),r=[];for(let e of t){let u=n.find(o=>o.configuration===$&&o.evalId===e.evalId&&o.runNumber===e.runNumber);if(!u)continue;let l=h(e),f=h(u);l==null||f==null||r.push({withScore:l,withoutScore:f})}return r}s(k,"pairCandidateRuns");function h(n){return n.status!=="completed"?null:n.grading?.summary?.pass_rate??null}s(h,"evidenceOf");function P(n){let t=[],r=0;for(let e of n){if(e.status==="failed"){t.push(e.failure??{kind:"unknown",class:"infrastructure"});continue}h(e)==null&&(r+=1)}return{infrastructureFailed:t.length,ungradeable:r,summary:R(t)}}s(P,"accountForFailures");function Q(n){let{pairs:t,minPairs:r,accounting:e}=n;return t>=r?{kind:"proceed"}:e.infrastructureFailed<=0?{kind:"proceed"}:{kind:"infrastructure-incomplete",reason:`${t}/${r} pair(s) \u2014 ${e.infrastructureFailed} run(s) never executed (${e.summary.describe()}). Retry when the environment recovers; this is not a statement about the target.`}}s(Q,"attributeShortfall");function w(n,t,r,e){let u=[];for(let l of n)u.push({eval_:l,configuration:A,targetContent:t,runNumber:e}),u.push({eval_:l,configuration:$,targetContent:r,runNumber:e});return u}s(w,"buildCandidateQueue");async function N(n){let{cases:t,candidateContent:r,priorVersionContent:e,concurrency:u,runNumber:l,opts:f,onLog:o=s(()=>{},"onLog")}=n,p=w(t,r,e,l),i=[],b=Math.max(1,u),g=null;for(let a=0;a<p.length;a+=b){let d=p.slice(a,a+b);i.push(...await Promise.all(d.map(c=>E(c,f,o))));let y=i.find(c=>c.failure&&x(c.failure.kind));if(y?.failure){g=y.failure.kind;let c=p.length-i.length;o(` \u26D4 aborting batch \u2014 ${g}: the account is out of quota. Skipped ${c} remaining run(s) that would certainly have failed.`);break}}for(let a of i)try{await F("/api/eval-runs",a)}catch(d){o(` \u26A0 failed to post a run result: ${d instanceof Error?d.message:String(d)}`)}let C=k(i),m=P(i),v=t.length-C.length;if(v>0){let a=m.infrastructureFailed?` \u2014 ${m.infrastructureFailed} run(s) never executed (${m.summary.describe()})`:"";o(` \u26A0 ${v}/${t.length} case(s) produced no usable pair (failed or ungradeable arm)${a}`)}return{completed:i.filter(a=>a.status==="completed").length,failed:i.filter(a=>a.status==="failed").length,results:i,pairs:C,accounting:m,abortedForQuota:g}}s(N,"runCandidateBatchAndPost");export{A as a,$ as b,k as c,P as d,Q as e,w as f,N as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as $}from"./chunk-VBXL7XO7.js";import{e as w,f as k}from"./chunk-
|
|
1
|
+
import{b as $}from"./chunk-VBXL7XO7.js";import{e as w,f as k}from"./chunk-APDRR6FS.js";import{a as u}from"./chunk-ZLLER3HP.js";function h(e){if(e.length===0)return{mean:0,stddev:0,min:0,max:0};let n=e.reduce((s,a)=>s+a,0)/e.length,o=e.reduce((s,a)=>s+(a-n)**2,0)/e.length;return{mean:Math.round(n*1e3)/1e3,stddev:Math.round(Math.sqrt(o)*1e3)/1e3,min:Math.min(...e),max:Math.max(...e)}}u(h,"computeStats");var x="with_target",E="without_target";function _(e){let n=e.grading.summary?.pass_rate;return typeof n=="number"&&n>=1}u(_,"fullPass");function b(e){return e.grading.summary?.pass_rate!=null}u(b,"hasGrading");function R(e){let n=e.timing.total_tokens;return typeof n=="number"&&n>0?n:void 0}u(R,"tokensOf");function v(e){let n=e.timing.duration_ms;return typeof n=="number"&&!isNaN(n)?n/1e3:void 0}u(v,"secondsOf");function y(e,n){let o={};for(let s of e)(o[n(s)]??=[]).push(s);return o}u(y,"groupBy");function C(e,n){let o=y(e.filter(b),i=>i.evalId),s=y(n.filter(b),i=>i.evalId),a=u((i,l)=>i.runNumber-l.runNumber,"byRun"),t=[];for(let i of Object.keys(o)){let l=o[i].sort(a),d=(s[i]??[]).sort(a);for(let r=0;r<Math.min(l.length,d.length);r++){let c={withScore:_(l[r])?1:0,withoutScore:_(d[r])?1:0},f=R(l[r]),g=R(d[r]);f!=null&&g!=null&&(c.withCost=f,c.withoutCost=g);let p=v(l[r]),m=v(d[r]);p!=null&&m!=null&&(c.withLatency=p,c.withoutLatency=m),t.push(c)}}return t}u(C,"pairRunsByEval");function T(e){let n=e.filter(r=>r.status==="completed");if(n.length===0)return{runSummary:{},verdict:null,notes:["No completed runs found"],totalRuns:0};let o=y(n,r=>r.configuration),s={},a=[];for(let[r,c]of Object.entries(o)){let f=c.filter(b).map(m=>m.grading.summary.pass_rate),g=c.map(v).filter(m=>m!=null),p=c.map(R).filter(m=>m!=null);s[r]={},f.length>0&&(s[r].pass_rate=h(f)),g.length>0&&(s[r].time_seconds=h(g)),p.length>0&&(s[r].tokens=h(p))}let t=null,i=o[x]??[],l=o[E]??[],d=C(i,l);if(d.length>0){if(t=$(d),!t.sufficient)a.push(t.insufficientReason??"Insufficient data for a significance verdict.");else if(t.significant){let r=t.delta>=0?"improves":"reduces",c=t.pValue!=null?`, McNemar p=${t.pValue.toFixed(4)}`:"";a.push(`Target ${r} the pass rate by ${Math.abs(t.delta*100).toFixed(0)}% (95% CI ${(t.ci.lower*100).toFixed(0)}\u2013${(t.ci.upper*100).toFixed(0)}%, n=${t.nWith}${c}).`)}else a.push(`No significant effect on pass rate (95% CI ${(t.ci.lower*100).toFixed(0)}\u2013${(t.ci.upper*100).toFixed(0)}%, n=${t.nWith}).`);t.costDelta!=null&&Math.round(t.costDelta)!==0&&a.push(`Token cost delta: ${t.costDelta>=0?"+":""}${Math.round(t.costDelta)} tokens/task.`),t.latencyDelta!=null&&Math.abs(t.latencyDelta)>1&&a.push(`Target ${t.latencyDelta>0?"adds":"saves"} ${Math.abs(t.latencyDelta).toFixed(1)}s/task.`)}for(let r of Object.values(s))if(r.pass_rate&&r.pass_rate.stddev>.2){a.push(`High pass-rate variance (stddev=${r.pass_rate.stddev.toFixed(2)}) \u2014 results may be unreliable.`);break}return{runSummary:s,verdict:t,notes:a,totalRuns:n.length}}u(T,"summarizeRuns");async function S(e,n){let o=n?`&iteration=${n}`:"",s=100,a=[];for(let t=0;t<1e5;t+=s){let i=await w(`/api/eval-targets/${e}/runs?limit=${s}&offset=${t}&activeCasesOnly=1${o}`);if(a.push(...i),i.length<s)break}return T(a)}u(S,"aggregateBenchmark");async function B(e,n,o){return k(`/api/eval-targets/${e}/benchmarks`,{iteration:n,runSummary:o.runSummary,notes:o.notes})}u(B,"postBenchmark");export{T as a,S as b,B as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as l}from"./chunk-ZLLER3HP.js";import d from"node:fs";import a from"node:path";var T={claude_code:"CLAUDE.md",codex:"AGENTS.md",copilot:a.join(".github","copilot-instructions.md")},u=["claude_code","codex","copilot"];function p(t){return u.includes(t)}l(p,"isTool");function I(t){if(t===void 0)return null;let n=t.trim();if(!n||n.toLowerCase()==="auto")return null;let e=[];for(let c of n.split(",")){let o=c.trim().toLowerCase().replace(/-/g,"_"),r=o==="claude"||o==="claudecode"?"claude_code":o==="copilot_agent"||o==="vscode_copilot"?"copilot":o;p(r)?e.includes(r)||e.push(r):console.warn(`[instructions] RULEMETRIC_INSTRUCTION_TARGETS: ignoring unknown tool "${c.trim()}" (known: ${u.join(", ")})`)}return e.length>0?e:null}l(I,"parseInstructionTargetsEnv");function _(t,n={}){let e=n.env??process.env,c=n.tools??I(e.RULEMETRIC_INSTRUCTION_TARGETS),o=l(i=>{let s=a.join(t,T[i]);return{tool:i,path:s,existed:d.existsSync(s)}},"target");if(c)return c.map(o);let r=[o("claude_code")];for(let i of u){if(i==="claude_code")continue;let s=o(i);s.existed&&r.push(s)}return r}l(_,"resolveInstructionTargets");export{T as a,u as b,I as c,_ as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as l}from"./chunk-
|
|
1
|
+
import{c as l}from"./chunk-APDRR6FS.js";import{c as a,l as u}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";var c=120*1e3,t=null;async function k(){if(process.env.RULEMETRIC_API_KEY)return!0;let e=a(u());if(!e.isRefreshable(c))return!0;let r=e.loadToken();return r?.refreshToken?t||(t=f(e,r).finally(()=>{t=null}),t):!0}o(k,"ensureFreshToken");async function f(e,r){let s;try{s=await fetch(`${l()}/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:r.refreshToken})})}catch{return!0}if(s.status===401)return e.clearToken(),!1;if(!s.ok)return!0;let n=await s.json().catch(()=>null);if(!n?.accessToken||!n.refreshToken)return!0;let i={accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt??r.expiresAt,email:n.email??r.email};return e.saveToken(i),e.saveEnvFile(i.accessToken),!0}o(f,"doRefresh");export{k as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as l}from"./chunk-ZLLER3HP.js";var _=25;function $(e,s,r=1.959964){let n=1+r*r/s,c=(e+r*r/(2*s))/n,d=r*Math.sqrt(e*(1-e)/s+r*r/(4*s*s))/n;return[c-d,c+d]}l($,"wilson");function x(e,s,r,n){let[c,d]=$(e,s),[u,i]=$(r,n);return[u-d,i-c]}l(x,"newcombe");var w=l(e=>`${e>=0?"+":""}${e.toFixed(3)}`,"fmt"),f=l(e=>`${e.passes}/${e.n}`,"counts");function N(e){let s=e.provenance;if(s&&!s.comparable)return{decision:"incomparable",reason:`the two arms were not the same harness, so this is not an A/B of the rule: ${s.reasons.join("; ")}. Nothing here is evidence about the instruction \u2014 re-run both arms on one harness before reading anything into the numbers.`,reward:{delta:null,ci:null}};let r=v(e);return s?.pooled_across.length?{...r,reason:`${r.reason} [pooled across ${s.pooled_across.join(", ")} by explicit --allow-cross]`}:r}l(N,"judgeSweep");function v(e){let s=e.minN??25,{baseline:r,with:n}=e;if(r.passes==null||n.passes==null||r.n===0||n.n===0)return{decision:"unmeasured",reason:`no reward recorded for the ${[r.passes==null||r.n===0?"baseline":null,n.passes==null||n.n===0?"with-arm":null].filter(Boolean).join(" and ")} arm \u2014 nothing to decide on; check the job dir for a harness error before reading this as a result`,reward:{delta:null,ci:null}};let c=r.passes/r.n,d=n.passes/n.n,u=d-c,i=x(c,r.n,d,n.n),b=i[0]>0||i[1]<0,m=r.n<s||n.n<s,a=`baseline ${f(r)} \u2192 with ${f(n)}, delta ${w(u)}, 95% CI [${w(i[0])}, ${w(i[1])}]`,t={delta:u,ci:i},p=m?` (n=${r.n}/${n.n}, below the ${s}/arm floor)`:"";if(e.taskClass==="proven"&&e.axis==="reward")return i[0]>0?{decision:"holds",reason:`still discriminates: ${a}`,reward:t}:m?{decision:"undecided",reason:`interval does not exclude zero${p}: ${a}`,reward:t}:{decision:"regression",reason:`a PROVEN discriminator went flat: ${a}. At this depth a flat result is a real change \u2014 the rule, the model, or the harness (the last observed cause was a harness permission change nobody thought was under test). Do not pool this run with earlier ones.`,reward:t};if(e.taskClass==="proven"&&e.axis==="cost"){let o=e.cost;if(!o)return{decision:"unmeasured",reason:`no per-trial cost measured \u2014 a cost task with no cost telemetry is UNKNOWN, not $0 (${a})`,reward:t};let h=`cost ${o.delta_pct==null?"n/a":`${o.delta_pct>=0?"+":""}${o.delta_pct.toFixed(1)}%`}/trial, 95% CI [${o.ci_usd[0].toFixed(4)}, ${o.ci_usd[1].toFixed(4)}] USD`;return o.decision==="cheaper"&&!o.reward.regressed?{decision:"holds",reason:`still cheaper at equal reward: ${h}; reward ${a}`,reward:t}:o.decision==="undecided"&&m?{decision:"undecided",reason:`cost interval spans zero${p}: ${h}`,reward:t}:o.reward.regressed?{decision:"regression",reason:`the with-arm solved LESS (${a}) \u2014 a cheaper arm that solves less is not a saving; ${h}`,reward:t}:{decision:"regression",reason:`a PROVEN cost saving did not reproduce: ${h} (decision ${o.decision}); reward ${a}`,reward:t}}let g=e.cost?.decision==="cheaper"&&!e.cost.reward.regressed;return b||g?{decision:"now_discriminates",reason:`a task measured as a NEGATIVE started discriminating \u2014 ${b?`reward now discriminates: ${a}`:`cost now discriminates at equal reward: ${e.cost.delta_pct?.toFixed(1)}%/trial`}. Re-measure by hand before moving it to the proven set; the 08-31 scorecard was wrong once already.`,reward:t}:m?{decision:"undecided",reason:`flat, but${p}: ${a}`,reward:t}:{decision:"flat",reason:`still flat, as measured: ${a}`,reward:t}}l(v,"judgeMeasured");export{_ as a,$ as b,x as c,N as d};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as $}from"./chunk-
|
|
1
|
+
import{b as $}from"./chunk-RK663O4M.js";import{a as C}from"./chunk-BG55WDDX.js";import{a as y}from"./chunk-WH3IPXXQ.js";import{f}from"./chunk-HLNHBZLI.js";import{e as h,f as w}from"./chunk-APDRR6FS.js";import{a as v}from"./chunk-ZLLER3HP.js";async function N(n,i,p){let{conversationId:a,messageId:g,messageContent:r}=n,o=await h(`/api/eval-targets/${i}`),c=await h(`/api/eval-targets/${i}/evals`),e=await h(`/api/eval-conversations/${a}/messages`),t=e.findIndex(l=>l.id===g);if(t>=0&&e.slice(t+1).some(u=>u.role==="assistant"&&(u.type==="results"||u.type==="proposal"||u.type==="generated"||u.type==="text"))){p(`Message ${g} already processed \u2014 skipping (idempotency guard)`);return}let s=v(async(l,u,m)=>{await w(`/api/eval-conversations/${a}/messages/assistant`,{content:l,type:u,data:m})},"postMessage"),d=await _(o,c,e,r,p);p(`Action: ${d.action}`);try{switch(d.action){case"run_evals":await x(o,c,a,s,p);break;case"generate_cases":await k(o,i,a,s,p);break;case"analyze_results":case"propose_changes":await E(o,c,e,r,a,s,p);break;case"respond":await s(d.response,"text");break}}catch(l){let u=l instanceof Error?l.message:String(l);throw await s(`Something went wrong: ${u}`,"text").catch(()=>{}),l}}v(N,"processConversationJob");async function _(n,i,p,a,g){let r=p.slice(-10).map(e=>`${e.role}: ${e.content.slice(0,200)}`).join(`
|
|
2
2
|
`),o=`You are an eval assistant. Decide what action to take based on the user's message.
|
|
3
3
|
|
|
4
4
|
## Current State
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as c,f as m}from"./chunk-APDRR6FS.js";import{a as s}from"./chunk-ZLLER3HP.js";var R=new Set([408,429,502,503,504]),_=12e4,T=2e4,b=1e3,l=15e3;function p(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[agent-loop] log_error event=${e.event}`)}}s(p,"structuredLog");function f(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let a=setTimeout(()=>{e.removeEventListener("abort",o),r(!0)},t),o=s(()=>{clearTimeout(a),e.removeEventListener("abort",o),r(!1)},"onAbort");e.addEventListener("abort",o,{once:!0})})}s(f,"abortableSleep");function g(t){return t instanceof c?R.has(t.statusCode):!0}s(g,"isRetryableReportError");async function S(t,e,r){let a=Date.now()+r.budgetMs,o=b;for(let i=1;;i++)try{return await m(t,e),{ok:!0,attempts:i}}catch(n){let u=a-Date.now();if(!g(n)||u<=0||r.signal.aborted)return{ok:!1,attempts:i,error:n};if(p(r.log,{event:`${r.event}_retry`,jobId:r.jobId,attempt:i,status:n instanceof c?n.statusCode:void 0,error:n instanceof Error?n.message:String(n),retryInMs:Math.min(o,u)}),!await f(Math.min(o,u),r.signal))return{ok:!1,attempts:i,error:n};o=Math.min(o*2,l)}}s(S,"postReportWithRetry");export{R as a,_ as b,T as c,b as d,l as e,p as f,f as g,g as h,S as i};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as E,d as R}from"./chunk-
|
|
1
|
+
import{b as E,d as R}from"./chunk-APDRR6FS.js";import{a as o}from"./chunk-ZLLER3HP.js";import{createHash as C}from"node:crypto";import{existsSync as A,mkdirSync as I,readFileSync as p,renameSync as L,rmdirSync as M,writeFileSync as m}from"node:fs";import{homedir as U,tmpdir as x}from"node:os";import{join as c}from"node:path";var $=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function v(t){return $.test(t)?t:`antigravity-${C("sha256").update(t).digest("hex").slice(0,16)}`}o(v,"hookSessionKey");var _=100,F=new Set(["RUN_COMMAND","VIEW_FILE","LIST_DIRECTORY","CODE_ACTION","GREP_SEARCH","SEARCH_WEB"]),H=new Set(["CONVERSATION_HISTORY","KNOWLEDGE_ARTIFACTS","CHECKPOINT"]);function T(){return process.env.RULEMETRIC_CONFIG_DIR??c(U(),".config","rulemetric")}o(T,"configDir");function O(){return c(T(),"antigravity-state")}o(O,"stateDir");function P(t){return c(O(),`${t}.json`)}o(P,"stateFile");function k(){let t=c(T(),"env");if(A(t))try{let n=p(t,"utf-8");for(let r of n.split(/\r?\n/)){let e=r.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);if(!e)continue;let i=e[1];if(process.env[i]!==void 0)continue;let s=e[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),process.env[i]=s}}catch{}}o(k,"loadEnvFile");function b(t){try{let n=p(P(t),"utf-8"),r=JSON.parse(n);if(r&&typeof r=="object"&&"lastStepIdx"in r){let e=r.lastStepIdx;if(typeof e=="number"&&Number.isFinite(e))return{lastStepIdx:e}}}catch{}return null}o(b,"loadState");function g(t,n){I(O(),{recursive:!0});let r=P(t),e=`${r}.tmp`;m(e,JSON.stringify(n),{mode:384});try{L(e,r)}catch{m(r,JSON.stringify(n),{mode:384})}}o(g,"saveState");function N(t){let n=process.env.TMPDIR??x(),r=c(n,"rulemetric"),e=c(r,v(t));try{return p(e,"utf-8").trim()||null}catch{return null}}o(N,"resolveRwSessionId");function W(t){let n=process.env.TMPDIR??x(),r=c(n,"rulemetric"),e=v(t),i=c(r,`${e}.seq`),s=c(r,`${e}.seqlock`),l=Date.now()+5e3;for(;Date.now()<l;)try{I(s);break}catch{}let a=1;try{a=parseInt(p(i,"utf-8").trim(),10)+1,(!Number.isFinite(a)||a<1)&&(a=1)}catch{a=1}try{m(i,String(a))}catch{}try{M(s)}catch{}return a}o(W,"nextSequence");function Y(t,n){let r;try{r=p(t,"utf-8")}catch{return[]}let e=[];for(let i of r.split(/\r?\n/))if(i.trim())try{let s=JSON.parse(i);typeof s.step_index=="number"&&s.step_index>n&&e.push(s)}catch{}return e.sort((i,s)=>i.step_index-s.step_index),e}o(Y,"readNewRecords");function G(t){let n;try{n=p(t,"utf-8")}catch{return-1}let r=-1;for(let e of n.split(/\r?\n/))if(e.trim())try{let i=JSON.parse(e);typeof i.step_index=="number"&&i.step_index>r&&(r=i.step_index)}catch{}return r}o(G,"findMaxStepIndex");function J(t){let n=t.match(/<USER_REQUEST>\s*([\s\S]*?)\s*<\/USER_REQUEST>/);return n?n[1].trim():t.trim()}o(J,"extractUserPrompt");function j(t,n){let r=t.created_at??new Date().toISOString(),e={antigravityStepIndex:t.step_index,antigravitySource:t.source,antigravityType:t.type};if(H.has(t.type)||F.has(t.type))return null;if(t.source==="USER_EXPLICIT"&&t.type==="USER_INPUT")return{sequence:n,eventType:"user_message",content:J(t.content??""),timestamp:r,metadata:e};if(t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"){let i=[];return t.thinking&&t.thinking.trim()&&i.push(`[thinking]
|
|
2
2
|
${t.thinking.trim()}`),t.content&&t.content.trim()&&i.push(t.content.trim()),t.tool_calls&&t.tool_calls.length>0&&(e.antigravityToolCalls=t.tool_calls.map(s=>s.name).filter(Boolean)),{sequence:n,eventType:"assistant_response",content:i.join(`
|
|
3
3
|
|
|
4
4
|
`)||null,timestamp:r,metadata:e}}return t.source==="MODEL"&&t.type==="GENERIC"?{sequence:n,eventType:"tool_result",content:t.content??null,timestamp:r,metadata:e}:t.source==="SYSTEM"&&(t.type==="SYSTEM_MESSAGE"||t.type==="ERROR_MESSAGE")?null:{sequence:n,eventType:`antigravity_${t.type.toLowerCase()}`,content:t.content??null,timestamp:r,metadata:e}}o(j,"classifyRecord");function q(t){try{let n=JSON.parse(t);return n&&typeof n=="object"?n:null}catch{return null}}o(q,"parseHookPayload");async function K(t,n,r,e,i={}){let s=i.errorSink??(u=>process.stderr.write(u)),l=0,a=0,d=0,S=0,f=e;for(let u of t){l++,i.onProgress?.({attempted:l,total:t.length,record:u});let w=W(r),y=j(u,w);if(!y)S++;else try{await R(`/api/sessions/${n}/events`,{method:"POST",body:y}),a++}catch(h){d++;let D=h instanceof E?h.statusCode:"unknown";s(`[antigravity-tailer] failed step=${u.step_index} type=${u.type} status=${D}
|