@rulemetric/cli 0.15.1 → 0.17.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/chunk-2PO5I3XR.js +1 -0
- package/dist/chunk-3MYCWZ63.js +1 -0
- package/dist/chunk-4ZDE63UG.js +1 -0
- package/dist/{chunk-LLXC5SRC.js → chunk-5A6TMSRO.js} +1 -1
- package/dist/{chunk-U3PIBPHT.js → chunk-5CVP5NFH.js} +1 -1
- package/dist/{chunk-OAETRNTE.js → chunk-65LFPUDB.js} +1 -1
- package/dist/{chunk-W6MMJRFZ.js → chunk-7YZURVZD.js} +1 -1
- package/dist/{chunk-CYCH2EQC.js → chunk-AKCCNLHL.js} +1 -1
- package/dist/{chunk-TU2AR6XO.js → chunk-B22HYCBV.js} +1 -1
- package/dist/chunk-CDSSOOIG.js +1 -0
- package/dist/{chunk-GJHFIQVO.js → chunk-CPDW7WW2.js} +10 -10
- package/dist/{chunk-XCH4HPEZ.js → chunk-DHIEGG4T.js} +1 -1
- package/dist/{chunk-5Z6XXOJL.js → chunk-E4CIJ67Z.js} +1 -1
- package/dist/{chunk-CIKQXFQ2.js → chunk-EFEPD4AZ.js} +1 -1
- package/dist/{chunk-GDLQNY4V.js → chunk-EMZFZCS4.js} +1 -1
- package/dist/chunk-F5GSKVF2.js +1 -0
- package/dist/chunk-FCALFMZV.js +1 -0
- package/dist/{chunk-RE7RAZQ5.js → chunk-FHRBW4AQ.js} +5 -5
- package/dist/chunk-GGUXEZC3.js +1 -0
- package/dist/{chunk-IFIWDL7G.js → chunk-GIQ2HK3W.js} +1 -1
- package/dist/{chunk-HXOQUYG3.js → chunk-HBDKOU2N.js} +1 -1
- package/dist/chunk-HTAHNQZJ.js +1 -0
- package/dist/{chunk-5IL3EEIE.js → chunk-IMN4BWAR.js} +1 -1
- package/dist/{chunk-ZMVTSYD4.js → chunk-KGU2IW54.js} +1 -1
- package/dist/{chunk-WQFR2LOY.js → chunk-KOORMTZO.js} +1 -1
- package/dist/chunk-KUW6AVSI.js +1 -0
- package/dist/{chunk-D5XLTSRV.js → chunk-QXPGTEMO.js} +1 -1
- package/dist/{chunk-2U6PAYCD.js → chunk-RDQXK5LG.js} +1 -1
- package/dist/chunk-STUNT4N3.js +1 -0
- package/dist/chunk-SW24KZ5C.js +1 -0
- package/dist/{chunk-EE4TZAZI.js → chunk-TSLBCZ5P.js} +1 -1
- package/dist/{chunk-5GFEEYHM.js → chunk-USKRCVX3.js} +1 -1
- package/dist/chunk-VBGHPAUT.js +2 -0
- package/dist/{chunk-JOXTWLLK.js → chunk-WL34G6IR.js} +1 -1
- package/dist/{chunk-NBTC5FNV.js → chunk-X23L2MF6.js} +1 -1
- package/dist/chunk-XFOG2PDJ.js +1 -0
- package/dist/{chunk-6T6YFPBW.js → chunk-ZBTJ5R7C.js} +1 -1
- package/dist/{chunk-7LFCZI64.js → chunk-ZKPURXUS.js} +1 -1
- package/dist/chunk-ZLBYYLJZ.js +3 -0
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/evals/agent.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/research/resume-scoped-outcomes.js +1 -0
- package/dist/commands/sessions/list.js +1 -1
- package/dist/commands/suggestions/accept.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/ActiveJobsList.js +1 -1
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
- package/dist/dashboard/launcher/NewLaunchForm.js +1 -1
- package/dist/{dist-OVXV2FFO.js → dist-5647V2E7.js} +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/agent-presence.js +1 -0
- package/dist/lib/eval-case-generator.js +1 -1
- package/dist/lib/eval-conversation-handler.js +1 -1
- package/dist/lib/evolution-enrolment.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/instructions/acceptance/accept-hook.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-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-refresh-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/finalize-scoped-launch.js +1 -0
- package/dist/lib/jobs/handlers/prepare-suggestion-live.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-launch.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/handlers/process-suggestion-eval.js +1 -0
- package/dist/lib/llm-client.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/scoped-outcome-store.js +1 -0
- package/dist/lib/work-report.js +1 -1
- package/oclif.manifest.json +43 -1
- package/package.json +6 -6
- package/dist/chunk-CZBO3A6B.js +0 -3
- package/dist/chunk-JIW2PCHU.js +0 -1
- package/dist/chunk-L562Y4RN.js +0 -1
- package/dist/chunk-PZS55PW2.js +0 -1
- package/dist/chunk-UNVURR4E.js +0 -1
- package/dist/chunk-WVNTUKED.js +0 -1
- package/dist/chunk-X3BBFDRD.js +0 -1
- package/dist/chunk-XXPWPKTD.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as L}from"./chunk-QXPGTEMO.js";import{a as w}from"./chunk-5RBLIVBF.js";import{b as l,c as m,f as g}from"./chunk-CDSSOOIG.js";import{h as f}from"./chunk-GIXHG5FK.js";import{a as u}from"./chunk-ZLLER3HP.js";async function $(r){if(!r.worktree?.create)return r;let{branch:a,baseRef:p}=r.worktree,s=await L({repoRoot:r.projectPath,branch:a,baseRef:p});return{...r,projectPath:s.path,gitBranch:s.branch}}u($,"resolveWorktreeForLaunch");async function I(r,a){let{mirrorId:p,tool:s}=r,{config:e}=r,n=u(t=>a.logger.info(t),"log");if(a.job.attempts>1)throw new w(`process_launch is not safe to retry (attempt ${a.job.attempts}). Re-launch manually.`);e=await $(e),e.worktree?.create&&n(`Worktree resolved: ${e.projectPath} (branch ${e.gitBranch})`);let h=!!e.scopedConfirmation&&e.mode==="headless";if(h)try{await m(e.scopedConfirmation.id)}catch(t){n(`scoped protocol staging failed (will fetch after exit): ${t instanceof Error?t.message:String(t)}`)}n(`Launching ${s}...`);let{getLauncher:b}=await import("./dist-5647V2E7.js"),c=await b(s).launch(e);n(`Launch completed: sessionId=${c.sessionId}`);let i;if(h)try{i=await g(e,c.sessionId)}catch(t){let o=l(t,c.sessionId,e.scopedConfirmation.id);i=o,o.status!=="recorded"&&n(`scoped outcome ${o.status} at ${o.step}: ${o.reason}${o.receiptDir?` (receipt: ${o.receiptDir})`:""}`)}let d={...c,...i?{studyOutcome:i}:{},worktreePath:e.worktree?.create?e.projectPath:void 0,runId:e.runId};return await f(`/api/launch-jobs/${p}/state`,{result:d}).catch(t=>{n(`result persist failed: ${t instanceof Error?t.message:String(t)}`)}),d}u(I,"processLaunch");export{$ as a,I as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as ne}from"./chunk-5TM7AOH2.js";import{b as re}from"./chunk-IEQDLURA.js";import{d as se,e as oe,f as ae}from"./chunk-KINIFUZQ.js";import{a as W}from"./chunk-KOORMTZO.js";import{a as q}from"./chunk-Q7IDLOSP.js";import{b as J}from"./chunk-2PO5I3XR.js";import{a as K}from"./chunk-TQM7MF5C.js";import{a as Y}from"./chunk-RDQXK5LG.js";import{a as U}from"./chunk-ZYGBABMZ.js";import{a as F}from"./chunk-GIQ2HK3W.js";import{a as N}from"./chunk-STUNT4N3.js";import{b as G}from"./chunk-E4CIJ67Z.js";import{c as L}from"./chunk-FZMO7XSN.js";import{a as O}from"./chunk-5A6TMSRO.js";import{a as B}from"./chunk-FCALFMZV.js";import{b as x}from"./chunk-5RBLIVBF.js";import{a as Z}from"./chunk-GGUXEZC3.js";import{a as P}from"./chunk-ZLBYYLJZ.js";import{a as j}from"./chunk-USKRCVX3.js";import{a as Q}from"./chunk-7YZURVZD.js";import{d as D}from"./chunk-SW24KZ5C.js";import{a as ee}from"./chunk-QPAOX7P2.js";import{e as T}from"./chunk-EFEPD4AZ.js";import{a as z}from"./chunk-AKCCNLHL.js";import{a as X}from"./chunk-VUNJGZPP.js";import{a as te}from"./chunk-4ZDE63UG.js";import{b as S,c as $,f as o,g as E,i as V,j as b}from"./chunk-F5GSKVF2.js";import{k as C}from"./chunk-KGU2IW54.js";import{d as M}from"./chunk-GPBN4ROE.js";import{b as R,e as y,f as H}from"./chunk-GIXHG5FK.js";import{a as l}from"./chunk-ZLLER3HP.js";var A=null,h=null,ue={process_eval:B,process_suggestion_eval:N,process_insights:W,process_launch:J,process_send_message:U,process_conversation:O,process_session_goal:F,distill_memories:G,memory_ab:K,process_run_cleanup:Y,cron_refine_cases:j,cron_retire_unused_skills:ee,cron_reconcile_attribution:P,cron_suggest_instructions:T,cron_refresh_skills:D,cron_refresh_pricing:Q,cron_eval_autorun:X,cron_auto_accept_suggestions:z,cron_instruction_training:Z,cron_instruction_evolution:C,process_judge_review:q,harbor_ab:L},ie=500,le=1e4,de=Object.keys(ue),me=new Set([]);function ge(e=process.env){return e.DATABASE_URL?de:de.filter(t=>!me.has(t))}l(ge,"availableCapabilities");var fe=3e4,_e=3e4;async function ke(e,t,s=M()){let i=[...s.claudeBin?["claude"]:[],...s.codexBin?["codex"]:[],...s.piBin?["pi"]:[]],c=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${t}&measurementProtocol=1&studyProtocol=1&scopedCollector=2&memorySnapshots=1&boundedAutorun=1&measurementEngines=${encodeURIComponent(i.join(","))}`,d=await y(`/api/work/next?${c}`);return d==null||typeof d=="string"?null:d}l(ke,"pollForWork");function ve(e,t,s){return{logger:{info:l(i=>t(i),"info"),warn:l(i=>t(i),"warn"),error:l(i=>t(i),"error")},job:{attempts:e},leaseSignal:s}}l(ve,"makeHelpers");async function we(e,t,s,i){let c=ue[e.kind],d=Date.now();if(o(s,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!c){let n=`unknown kind: ${e.kind}`;o(s,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:n}),await H(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:n,terminal:!0}).catch(()=>{});return}let w=new AbortController,p=!1,_,m=l(()=>{p||(o(s,{event:"heartbeat",jobId:e.id}),b(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken},{budgetMs:Math.min($,Math.max(0,t-1e3)),signal:i,log:s,event:"heartbeat",jobId:e.id}).then(n=>{if(!(n.ok||p)){if(V(n.error)){p=!0,_!==void 0&&clearInterval(_),o(s,{event:"lease_lost",jobId:e.id,kind:e.kind,elapsedMs:Date.now()-d,error:n.error instanceof Error?n.error.message:String(n.error)}),w.abort(new Error(`lease lost for job ${e.id} (${e.kind}); stop work`));return}o(s,{event:"heartbeat_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}))},"beat");_=setInterval(m,t),h={jobId:e.id,beat:m};let a;try{let n=ve(e.attempts,s,w.signal);a={kind:"complete",result:await c(e.payload,n)??{}}}catch(n){let k=A?.pausesSince(d)??[],g=ae(k),r=n instanceof Error?n.message:String(n),f=x(n),u=!f&&oe(k);a={kind:"fail",message:g?`${g}; ${r}`:r,pausedDuringJob:!!g,terminal:f,hostSuspended:u}}try{if(p)o(s,{event:"lease_lost_stop",jobId:e.id,kind:e.kind,durationMs:Date.now()-d,handlerOutcome:a.kind,...a.kind==="fail"?{error:a.message}:{}});else if(a.kind==="complete"){o(s,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-d});let n=await b(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:a.result},{budgetMs:S,signal:i,log:s,event:"complete_post",jobId:e.id});n.ok||o(s,{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{o(s,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-d,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:i,log:s,event:"fail_post",jobId:e.id});n.ok||o(s,{event:"fail_post_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}finally{clearInterval(_),h=null}}l(we,"runOne");var ce=new Set(["process_eval","process_suggestion_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 t=e.log??(()=>{}),s=e.pollWaitMs??fe,i=e.heartbeatIntervalMs??_e,c=e.capabilities??ge();o(t,{event:"agent_start",capabilities:c,pollWaitMs:s,heartbeatIntervalMs:i});try{let r=re();r.removed.length>0&&o(t,{event:"eval_worktrees_swept",removed:r.removed.length})}catch(r){o(t,{event:"eval_worktree_sweep_failed",error:r instanceof Error?r.message:String(r)})}A=se({signal:e.signal,onPause:l(r=>{o(t,{event:"machine_pause",...r,jobId:h?.jobId??null}),h?.beat()},"onPause")});let d=te(c,e.signal,t,e.version,()=>A);ne({signal:e.signal,log:t}).catch(r=>{o(t,{event:"tt_heartbeat_fatal",error:r instanceof Error?r.message:String(r)})});let w=5*6e4,p=0,_=l(()=>{if(!e.readInstalledVersion||!e.version)return!1;let r=Date.now();if(r-p<w)return!1;p=r;let f=e.readInstalledVersion();return!!(f&&f!==e.version)},"versionDrifted"),m=new AbortController,a=m.signal;e.signal.aborted?m.abort():e.signal.addEventListener("abort",()=>m.abort(),{once:!0});let n=l(async(r,f)=>{let u=ie;for(;!a.aborted;){if(_()){o(t,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),m.abort(),e.onVersionDrift?.();break}let I=null;try{I=await ke([...f],s)}catch(v){let pe=v instanceof R?v.statusCode:void 0;if(o(t,{event:"poll_error",lane:r,status:pe,error:v instanceof Error?v.message:String(v)}),!await E(u,a))break;u=Math.min(u*2,le);continue}if(!I){if(o(t,{event:"poll_204",lane:r}),!await E(u,a))break;u=Math.min(u*2,le);continue}u=ie,await we(I,i,t,a)}},"runLane"),k=c.filter(r=>ce.has(r)),g=c.filter(r=>!ce.has(r));k.length>0&&g.length>0?(o(t,{event:"agent_lanes",heavy:k.length,fast:g.length}),await Promise.all([n("heavy",k),n("fast",g)])):await n("single",c),await d.shutdown(),o(t,{event:"agent_stop"})}l(ze,"runAgentLoop");export{ue as a,de as b,ge as c,ke as d,ze as e};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as i}from"./chunk-F5GSKVF2.js";import{b as p}from"./chunk-PIVEJTNF.js";import{d as g}from"./chunk-GPBN4ROE.js";import{f as m}from"./chunk-GIXHG5FK.js";import{a as n}from"./chunk-ZLLER3HP.js";var E=3e4,P=`thin-agent-${process.pid}`,a=null;function A(v,y,l,h,b){let d;try{let e=g();d={claude:e.claudeBin!=null,codex:e.codexBin!=null,pi:e.piBin!=null,codexModel:e.codexConfiguredModel}}catch{}let c;try{c=p()}catch{}let s=n(e=>m("/api/workers/heartbeat",{workerType:"cli-worker",clientName:P,clientVersion:h,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:e,metadata:{capabilities:v,mode:"thin-agent",measurementProtocol:1,studyProtocol:1,scopedCollector:2,memorySnapshots:1,boundedAutorun:1,llmEngines:d,harborReady:c,machine:b()?.summary()}}).then(r=>{let o=r?.advisory;o&&o.message!==a?(a=o.message,i(l,{event:"worker_advisory",code:o.code,message:o.message})):o||(a=null)}).catch(r=>{i(l,{event:"presence_heartbeat_error",error:r instanceof Error?r.message:String(r)})}),"send");s("alive");let f=setInterval(()=>s("alive"),E),t=null,u=n(()=>t||(clearInterval(f),t=Promise.race([s("shutting_down"),new Promise(e=>setTimeout(e,2e3).unref())]),t),"sayGoodbye");return y.addEventListener("abort",()=>{u()},{once:!0}),{shutdown:u}}n(A,"startPresenceHeartbeat");export{A as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as i}from"./chunk-
|
|
1
|
+
import{a as i}from"./chunk-WL34G6IR.js";import{h as s}from"./chunk-GIXHG5FK.js";import{a as n}from"./chunk-ZLLER3HP.js";async function l(a,c){let{mirrorId:g,evalTargetId:p,config:r}=a,e=n(o=>c.logger.info(o),"log");await i(r,p,e);let t={type:"conversation",conversationId:r.conversationId};return await s(`/api/eval-jobs/${g}/state`,{result:t}).catch(o=>{e(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),t}n(l,"processConversation");export{l as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as f,b as M}from"./chunk-
|
|
1
|
+
import{a as f,b as M}from"./chunk-HTAHNQZJ.js";import{e as _,f as S}from"./chunk-X6CF5KTW.js";import{a as o}from"./chunk-ZLLER3HP.js";import*as m from"node:fs/promises";import*as x from"node:path";import{eq as j}from"drizzle-orm";import{randomBytes as Y}from"node:crypto";var A="#0d9488",h="#1a1a1a",$="#666666",C="#f5f5f7",N="#ffffff",D="#e5e5e9",I=["Added","Changed","Fixed","Removed","Deprecated","Security"];function U(e){let t=["January","February","March","April","May","June","July","August","September","October","November","December"],[n,r,a]=e.split("-").map(d=>parseInt(d,10));return!n||!r||!a||r<1||r>12?e:`${t[r-1]} ${a}, ${n}`}o(U,"formatIsoDate");function l(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}o(l,"escapeHtml");function z(e){let t=[];for(let n of I){let r=e[n];r&&r.length>0&&t.push({name:n,items:r})}return t}o(z,"orderedSections");function v(e){let{version:t,date:n,sections:r,unsubscribeUrl:a,productUrl:d,recipientName:u}=e,c=U(n),s=`What's new in RuleMetric \u2014 ${c}`,y=u?`Hi ${u},`:"Hi there,",i=z(r),p=new Date().getUTCFullYear(),b=i.map(({name:R,items:E})=>{let w=E.map(O=>` <li style="margin:0 0 6px 0;font-size:15px;line-height:1.5;color:${h};">${l(O)}</li>`).join(`
|
|
2
2
|
`);return` <h3 style="margin:24px 0 8px 0;font-size:16px;line-height:1.3;font-weight:600;color:${h};">${R}</h3>
|
|
3
3
|
<ul style="margin:0 0 8px 0;padding-left:20px;">
|
|
4
4
|
${w}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as t,e as E}from"./chunk-
|
|
1
|
+
import{b as t,e as E}from"./chunk-KGU2IW54.js";import{a as r}from"./chunk-ZLLER3HP.js";function s(o=10,_=t){for(let e=1;e<=o;e++)if(E(e,o,_).feasible)return e;return o}r(s,"minFeasibleLiveCases");var S=s(),A=3;export{s as a,S as b,A as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{e as b,g as y}from"./chunk-
|
|
1
|
+
import{e as b,g as y}from"./chunk-DHIEGG4T.js";import{e as M,f as w}from"./chunk-GIXHG5FK.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} ===
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as $}from"./chunk-CVPAKEEZ.js";import{h}from"./chunk-
|
|
1
|
+
import{h as $}from"./chunk-CVPAKEEZ.js";import{h}from"./chunk-FHRBW4AQ.js";import{e as b}from"./chunk-GIXHG5FK.js";import{a as g}from"./chunk-ZLLER3HP.js";import{existsSync as A,statSync as w}from"node:fs";async function R(y,k){let n=g(s=>k?.logger?.info?.(s)??console.log(s),"log"),{projectPath:o}=y,r=`[cron_auto_accept_suggestions] ${o}`;if(!o)return{skipped:"no-project-path"};if(!A(o)||!w(o).isDirectory())return n(`${r}: project directory no longer exists on this machine \u2014 skipping`),{skipped:"project-path-missing"};let e=await $(()=>b(`/api/instruction-suggestions/auto-acceptable?projectPath=${encodeURIComponent(o)}`),{log:n,label:"auto-acceptable",idempotent:!0});if(!e.consent.allowed)return n(`${r}: ${e.consent.reason??"no consent"} (${e.consent.source})`),{skipped:"no-consent",reason:e.consent.reason};for(let s of e.refused)n(`${r}: refused "${s.name}" \u2014 ${s.reason}`);if(e.eligible.length===0)return n(`${r}: nothing to adopt`+(e.budget?` (rules ${e.budget.used}/${e.budget.max}`+(e.budget.skillsUsed!==void 0?`, skills ${e.budget.skillsUsed}`+(e.budget.skillsMax==null?" (uncapped)":`/${e.budget.skillsMax}`):"")+` used in ${e.budget.windowDays}d)`:"")),{skipped:"nothing-eligible",refused:e.refused.length,adopted:0};let i=0,f=0,a=0,l=0,d=0,u=0,c=0,m=[];for(let s of e.eligible)try{let t=await h({suggestionId:s.id,dir:o,projectPath:o,actor:"auto"});if(t.action==="added")i+=1,m.push(t.name),s.type==="skill"&&(f+=1),n(`${r}: adopted ${s.type==="skill"?"skill":"rule"} "${t.name}" (score ${s.score.toFixed(2)})`);else if(t.action==="redundant"){t.partialOverlap?d+=1:l+=1;for(let p of t.messages)n(`${r}: ${p}`)}else if(t.action==="unresolvable-reference"){u+=1;for(let p of t.messages)n(`${r}: ${p}`)}else a+=1,n(`${r}: "${t.name}" was already in CLAUDE.md`)}catch(t){c+=1,n(`${r}: failed to adopt "${s.name}" \u2014 ${t instanceof Error?t.message:String(t)}`)}return n(`${r}: ${i} adopted, ${a} already present, ${l} already covered in other words, ${d} refused for partial overlap, ${u} refused for naming files this project does not have, ${c} failed, ${e.refused.length} refused upstream. Undo any of them with \`rulemetric suggestions undo <instruction-id>\`.`),{adopted:i,skills:f,alreadyPresent:a,redundant:l,partialOverlaps:d,unresolvableReferences:u,failed:c,refused:e.refused.length,names:m}}g(R,"cronAutoAcceptSuggestions");export{R as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as l,e as s,h as E}from"./chunk-NJ5UED3H.js";import{
|
|
1
|
+
import{b as T}from"./chunk-ZXF5NE54.js";import{d as l,e as s,h as E}from"./chunk-NJ5UED3H.js";import{a as g}from"./chunk-ZLLER3HP.js";import{useState as a}from"react";import{Box as c,Text as r,useInput as _}from"ink";import L from"ink-text-input";import G from"ink-select-input";import{jsx as t,jsxs as m}from"react/jsx-runtime";var p=["tool","project","mode","prompt","submit"];function U({launchers:f,defaultProjectPath:w,defaultTool:A,defaultPrompt:D,defaultResumeSessionId:v,focused:i,onSubmit:R}){let[b,C]=a(A??f[0]?.tool??"claude_code"),[u,M]=a(w),[P,O]=a("interactive"),[d,S]=a(D??""),[o,F]=a("tool"),[j,I]=a(!1),[y,h]=a(null),B=d.trim().length>0&&u.trim().length>0&&!j;_((e,x)=>{if(i)if(x.upArrow){let n=p.indexOf(o);n>0&&F(p[n-1])}else if(x.downArrow){let n=p.indexOf(o);n<p.length-1&&F(p[n+1])}else x.return&&o==="submit"&&B?N():o==="mode"&&(e===" "||x.return)&&O(n=>n==="interactive"?"headless":"interactive")});async function N(){I(!0),h(null);try{await R({tool:b,config:{projectPath:u,prompt:d,mode:P,...v?{resumeSessionId:v}:{}}}),S(""),h(null)}catch(e){h(e instanceof Error?e.message:String(e))}finally{I(!1)}}return g(N,"doSubmit"),m(c,{flexDirection:"column",paddingX:1,children:[t(r,{bold:!0,color:l,children:"\u25BC New launch"}),m(c,{children:[t(r,{color:o==="tool"&&i?l:s,children:" Tool: "}),o==="tool"&&i?t(G,{items:f.map(e=>({label:T(e.tool),value:e.tool})),initialIndex:Math.max(0,f.findIndex(e=>e.tool===b)),onSelect:e=>C(e.value)}):t(r,{children:T(b)})]}),m(c,{children:[t(r,{color:o==="project"&&i?l:s,children:" Project: "}),o==="project"&&i?t(L,{value:u,onChange:M}):t(r,{children:u})]}),m(c,{children:[t(r,{color:o==="mode"&&i?l:s,children:" Mode: "}),t(r,{children:P==="interactive"?"(\u2022) interactive ( ) headless":"( ) interactive (\u2022) headless"})]}),m(c,{children:[t(r,{color:o==="prompt"&&i?l:s,children:" Prompt: "}),o==="prompt"&&i?t(L,{value:d,onChange:S}):t(r,{children:d||"(empty)"})]}),t(c,{marginTop:1,children:m(r,{color:o==="submit"&&i?l:s,children:[B?" [ Submit ]":" [ Submit (disabled) ]",j?" \u2026submitting":""]})}),y&&m(r,{color:E,children:[" \u2717 ",y]})]})}g(U,"NewLaunchForm");export{U as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as v,j as D,k as R,l as x,m as E,n as f,o as I,p as m,q as P,r as $,s as b,t as O}from"./chunk-XFOG2PDJ.js";import{b as w,c as S}from"./chunk-SIGZEQ3K.js";import{b as y,e as h,f as l}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import{join as L}from"node:path";import{pathToFileURL as j}from"node:url";import{scriptsDir as _}from"@rulemetric/hooks/scripts-dir";var T=2e7,a=class extends Error{constructor(e,n,i,o,s){super(n,s instanceof Error?{cause:s}:void 0);this.phase=e;this.step=i;this.receiptDir=o;this.name="ScopedOutcomeError"}static{c(this,"ScopedOutcomeError")}};function H(t,r,e){if(t instanceof a&&t.phase==="deliver"&&t.receiptDir)return{status:"undelivered",sessionId:r,studyId:e,receiptDir:t.receiptDir,step:t.step,reason:t.message};let n=t instanceof a?t.step:"measure",i=t instanceof a?t.receiptDir:null;return{status:"unmeasured",sessionId:r,studyId:e,step:n,reason:t instanceof Error?t.message:String(t),receiptDir:i}}c(H,"scopedOutcomeFailure");async function A(){return import(j(L(_,"scoped-live.mjs")).href)}c(A,"loadCollector");async function z(t){let{confirmation:r}=await h(`/api/scoped-live-confirmations/${t}/contract`);return D(t,r.protocol),r.protocol}c(z,"stageScopedProtocol");async function B(t,r){let e=t.scopedConfirmation,n=v(e.id,r),i=f(n);if(i)return{dir:n,record:i,created:!1};let o=S(r,w(()=>null,()=>null)),s=o?$(o):null;if(!o||s===null||s>T)throw new a("collect","Completed actor transcript is missing or exceeds the capture bound","transcript",null);let u=x(n,o),p=R(e.id);if(p===null)try{p=await z(e.id)}catch(d){throw new a("collect",`Frozen protocol unavailable after exit: ${d.message}`,"protocol",n,d)}let g;try{let d=await A();d.transcriptEvidence(u.path,r),g=d.collectScopedOutcome(p,e.taskId,r,t.projectPath,u.path)}catch(d){throw new a("collect",d.message,"measure",n,d)}let k=E(n,{confirmationId:e.id,taskId:e.taskId,externalSessionId:r,projectPath:t.projectPath,collectedAt:new Date().toISOString(),transcriptSha256:u.sha256,transcriptBytes:u.bytes,receipt:g});return{dir:n,...k}}c(B,"collectScopedReceipt");async function C(t){let r=f(t);if(!r)throw new a("collect",`No receipt at ${t}; the outcome was never measured and cannot be reconstructed`,"measure",t);let e=I(t);if(e.completedAt)return{ledger:e,record:r};e.attempts+=1;let n=c(s=>e.completed.includes(s),"done"),i=c(s=>{n(s)||e.completed.push(s),m(t,e)},"mark"),o=c(async(s,u)=>{if(!n(s)){try{await u()}catch(p){throw e.lastError={at:new Date().toISOString(),step:s,message:p.message},m(t,e),new a("deliver",`${s} failed: ${p.message}`,s,t,p)}e.lastError=null,i(s)}},"run");return await o("session",async()=>{let s=await l("/api/sessions",{tool:"claude_code",externalSessionId:r.externalSessionId,projectPath:r.projectPath});e.sessionId=s.id}),await o("reimport",async()=>{await l(`/api/sessions/${e.sessionId}/reimport`,{tool:"claude_code",content:P(t).toString("utf8")})}),await o("verify",async()=>{await l(`/api/scoped-live-confirmations/${r.confirmationId}/verify`,r.receipt)}),await o("settle",async()=>{await l("/api/instruction-experiments/settle",{projectPath:r.projectPath})}),e.completedAt=new Date().toISOString(),m(t,e),{ledger:e,record:r}}c(C,"deliverScopedReceipt");async function J(t,r){let e=t.scopedConfirmation,{dir:n,created:i}=await B(t,r);return await C(n),{status:"recorded",sessionId:r,studyId:e.id,receiptDir:n,resumed:!i}}c(J,"finalizeScopedLaunch");async function K(t=()=>{}){let r={scanned:0,delivered:0,failed:0,unmeasured:0,entries:[]};for(let e of b()){if(r.scanned+=1,O(e)){r.entries.push({dir:e.dir,status:"already_delivered"});continue}if(!e.receipt){r.unmeasured+=1,r.entries.push({dir:e.dir,status:"unmeasured",reason:e.hasTranscript?"transcript preserved but no receipt was collected":"entry has neither transcript nor receipt"}),t(`scoped outcome ${e.confirmationId}/${e.externalSessionId}: unmeasured (no receipt); not reconstructed`);continue}try{await C(e.dir),r.delivered+=1,r.entries.push({dir:e.dir,status:"delivered"}),t(`scoped outcome ${e.confirmationId}/${e.externalSessionId}: delivered`)}catch(n){r.failed+=1;let i=n instanceof a?n.step:"unknown",o=n instanceof Error?n.cause:void 0,s=o instanceof y?` (${o.statusCode})`:"";r.entries.push({dir:e.dir,status:"failed",step:i,reason:n.message}),t(`scoped outcome ${e.confirmationId}/${e.externalSessionId}: ${i} still failing${s}: ${n.message}`)}}return r}c(K,"resumePendingScopedOutcomes");export{a,H as b,z as c,B as d,C as e,J as f,K as g};
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import{a as l,b as Lt}from"./chunk-ZLLER3HP.js";var
|
|
1
|
+
import{a as l,b as Lt}from"./chunk-ZLLER3HP.js";var Qe=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Xe=["user_message","assistant_message","assistant_response","tool_call","tool_result","thinking","error"];var Jt=new Set(["","unknown","<synthetic>"]);function Gt(e){if(typeof e!="string")return null;let t=e.trim();return Jt.has(t)?null:t}l(Gt,"resolveEventModel");var C=class{static{l(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
|
|
2
2
|
`).filter(c=>c.trim()),o=[];for(let c of n)try{o.push(JSON.parse(c))}catch{}let s=o.filter(c=>c.type==="user"||c.type==="assistant"),r=null,i=null,u={},a=o.find(c=>c.type==="user");a&&(r=a.cwd??null,i=a.gitBranch??null,a.version&&(u.claudeCodeVersion=a.version),a.sessionId&&(u.sessionId=a.sessionId));let p=o.find(c=>c.type==="assistant");p?.message?.model&&(u.model=p.message.model);let m=[],f=0;for(let c of s){let y=c.timestamp??new Date().toISOString();if(c.type==="user"){let h=c.message?.content;if(typeof h=="string")m.push({sequence:f++,eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{}});else if(Array.isArray(h))for(let _ of h)_.type==="tool_result"&&m.push({sequence:f++,eventType:"tool_result",content:typeof _.content=="string"?_.content:JSON.stringify(_.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{toolUseId:_.tool_use_id}})}else if(c.type==="assistant"){let h=Array.isArray(c.message?.content)?c.message.content:[],_=c.message?.usage,I=_?{input:_.input_tokens??0,output:_.output_tokens??0,cacheRead:_.cache_read_input_tokens??0,cacheWrite:_.cache_creation_input_tokens??0}:null,T={};c.message?.model&&(T.model=c.message.model);let x=Gt(c.message?.model);c.message?.stop_reason&&(T.stopReason=c.message.stop_reason),c.requestId&&(T.requestId=c.requestId),_?.service_tier&&(T.serviceTier=_.service_tier),_?.speed&&(T.speed=_.speed),_?.cache_creation&&(T.cacheCreationDetail=_.cache_creation),_?.server_tool_use&&(T.serverToolUse=_.server_tool_use);for(let S of h)S.type==="text"?m.push({sequence:f++,eventType:"assistant_message",content:S.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:T}):S.type==="thinking"?m.push({sequence:f++,eventType:"thinking",content:S.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:T}):S.type==="tool_use"&&m.push({sequence:f++,eventType:"tool_call",content:null,toolName:S.name??"unknown",toolInput:S.input??null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:{...T,toolUseId:S.id}})}}let d=m.map(c=>c.timestamp).sort(),g=new Date().toISOString();return{tool:"claude_code",projectPath:r,gitBranch:i,startedAt:d[0]??g,endedAt:d[d.length-1]??null,events:m,metadata:u}}};var A=class{static{l(this,"CursorAdapter")}tool="cursor";parse(t){let n=Lt("better-sqlite3"),o=new n(t,{readonly:!0});try{let s=o.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return s?this.parseComposerJson(s.value):this.emptySession()}finally{o.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=Object.values(n.allComposers??{});if(o.length===0)return this.emptySession();let s=o.sort((p,m)=>{let f=p.createdAt?new Date(p.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-f})[0],r=s.conversation??[],i=[];for(let p=0;p<r.length;p++){let m=r[p],f=m.createdAt??new Date().toISOString();i.push({sequence:p,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let u=i.map(p=>p.timestamp).sort(),a=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:u[0]??a,endedAt:u[u.length-1]??null,events:i,metadata:{composerId:s.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var N=class{static{l(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=n.requests??[],s=[],r=0;for(let a of o){let p=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:r++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}}),a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():p;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),u=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??u,endedAt:i[i.length-1]??null,events:s,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var P=class{static{l(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=n.requests??[],s=[],r=0;for(let a of o){let p=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:r++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}}),a.toolCalls)for(let m of a.toolCalls){let f=m.timestamp?new Date(m.timestamp).toISOString():p;s.push({sequence:r++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():p;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),u=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??u,endedAt:i[i.length-1]??null,events:s,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle},...n.agentMode!=null&&{agentMode:n.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var D=class{static{l(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let s=(n.events??[]).map((i,u)=>({sequence:i.sequence??u,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),r=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??s[0]?.timestamp??r,endedAt:n.endedAt??s[s.length-1]?.timestamp??null,events:s,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};function Bt(e){try{return JSON.parse(e)}catch{return e}}l(Bt,"safeJsonParse");function tt(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
|
|
3
3
|
|
|
4
|
-
`):""}l(tt,"textFromBlocks");function Ft(e){if(!e)return null;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),o=(e.output_tokens??0)+(e.reasoning_output_tokens??0);return n===0&&o===0&&t===0?null:{input:n,output:o,cacheRead:t,cacheWrite:0}}l(Ft,"tokenUsageFromCodex");function Ht(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}l(Ht,"normalizeTimestamp");function et(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}l(et,"freshCodexState");var
|
|
4
|
+
`):""}l(tt,"textFromBlocks");function Ft(e){if(!e)return null;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),o=(e.output_tokens??0)+(e.reasoning_output_tokens??0);return n===0&&o===0&&t===0?null:{input:n,output:o,cacheRead:t,cacheWrite:0}}l(Ft,"tokenUsageFromCodex");function Ht(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}l(Ht,"normalizeTimestamp");function et(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}l(et,"freshCodexState");var E=class{static{l(this,"CodexAdapter")}tool="codex";parse(t){let n=et(),{events:o,projectPath:s,gitBranch:r,metadata:i}=this.parseLines(t,n),u=o.map(p=>p.timestamp).sort(),a=new Date().toISOString();return{tool:"codex",projectPath:s,gitBranch:r,startedAt:u[0]??a,endedAt:u[u.length-1]??null,events:o,metadata:i}}parseAppend(t,n){let o={...n,callNames:{...n.callNames}},{events:s}=this.parseLines(t,o);return{events:s,state:o}}parseLines(t,n){let o=t.split(`
|
|
5
5
|
`).filter(m=>m.trim()),s=[],r={},i=n.callNames,u=null,a=null,p=null;for(let m of o){let f;try{f=JSON.parse(m)}catch{continue}let d=f.payload;if(!d)continue;let g=Ht(f.timestamp);if(f.type==="session_meta"){p=d.session_id??d.id??p,u=d.cwd??u,d.git_branch&&(a=d.git_branch),d.model&&(n.model=d.model),r.sessionId=p,r.codexSessionId=p,r.originator=d.originator,r.source=d.source,r.modelProvider=d.model_provider,r.codexCliVersion=d.cli_version;continue}if(f.type==="turn_context"){u=d.cwd??u,d.model&&(n.model=d.model,r.model=d.model);continue}if(f.type==="response_item"&&d.type==="message"){if(d.role==="user"){let c=tt(d.content,["input_text"]);if(!c)continue;s.push({sequence:n.sequence++,eventType:"user_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{}})}else if(d.role==="assistant"){let c=tt(d.content,["output_text"]);if(!c)continue;s.push({sequence:n.sequence++,eventType:"assistant_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:g,metadata:n.model?{model:n.model}:{}})}continue}if(f.type==="response_item"&&d.type==="function_call"){let c=d.name??"unknown";d.call_id&&(i[d.call_id]=c);let y=typeof d.arguments=="string"?Bt(d.arguments):{};s.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:c,toolInput:y&&typeof y=="object"&&!Array.isArray(y)?y:{arguments:y},toolOutput:null,tokenUsage:null,model:n.model,timestamp:g,metadata:{callId:d.call_id}});continue}if(f.type==="response_item"&&d.type==="function_call_output"){let c=d.call_id?i[d.call_id]??null:null;s.push({sequence:n.sequence++,eventType:"tool_result",content:d.output??null,toolName:c,toolInput:null,toolOutput:d.output==null?null:{output:d.output},tokenUsage:null,model:n.model,timestamp:g,metadata:{callId:d.call_id}});continue}if(f.type==="event_msg"&&d.type==="token_count"){let c=d.info,y=c?.total_token_usage?.total_tokens??0;if(y>0&&y===n.prevCumulativeTotal)continue;y>0&&(n.prevCumulativeTotal=y);let h=Ft(c?.last_token_usage??c?.total_token_usage);if(!h)continue;let _=c?.model??c?.model_name??n.model;s.push({sequence:n.sequence++,eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:h,model:_??null,timestamp:g,metadata:{codexEventType:"token_count",..._?{model:_}:{},reasoningOutputTokens:c?.last_token_usage?.reasoning_output_tokens??0,usage:{input_tokens:h.input,output_tokens:h.output,cache_read_input_tokens:h.cacheRead??0,cache_creation_input_tokens:h.cacheWrite??0}}})}}return{events:s,projectPath:u,gitBranch:a,sessionId:p,metadata:r}}};function nt(e,t){let n=e??(typeof t=="number"?new Date(t).toISOString():""),o=new Date(n);return Number.isFinite(o.getTime())?o.toISOString():new Date().toISOString()}l(nt,"timestamp");function st(e){return Array.isArray(e.content)?e.content:[]}l(st,"blocks");function ot(e){return typeof e.content=="string"?e.content:st(e).filter(t=>t.type==="text").map(t=>t.text??"").filter(Boolean).join(`
|
|
6
6
|
|
|
7
|
-
`)}l(ot,"messageText");function Wt(e){if(!e)return null;let t={input:Math.max(0,e.input??0),output:Math.max(0,e.output??0),cacheRead:Math.max(0,e.cacheRead??0),cacheWrite:Math.max(0,e.cacheWrite??0)};return Object.values(t).some(n=>n>0)?t:null}l(Wt,"usageOf");var
|
|
8
|
-
`)){if(!f.trim())continue;let d;try{d=JSON.parse(f)}catch{continue}if(d.type==="session"){r||(r=nt(d.timestamp)),s=d.cwd??s,o.sessionId=d.id,o.piSessionId=d.id,o.sessionVersion=d.version;continue}if(d.type==="model_change"){i=d.provider??i,u=d.modelId??u,i&&(o.provider=i),u&&(o.model=u);continue}if(d.type!=="message"||!d.message)continue;let g=d.message,c=nt(d.timestamp,g.timestamp);if(i=g.provider??i,u=g.model??u,i&&(o.provider=i),u&&(o.model=u),g.role==="user"){let h=ot(g);if(!h)continue;a({eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:c,metadata:{}});continue}if(g.role==="toolResult"){let h=ot(g);a({eventType:"tool_result",content:h||null,toolName:g.toolName??null,toolInput:null,toolOutput:{content:h,details:g.details??null,isError:g.isError??!1},tokenUsage:null,model:u,timestamp:c,metadata:{toolCallId:g.toolCallId,isError:g.isError??!1}});continue}if(g.role!=="assistant")continue;if(g.stopReason==="error"||g.stopReason==="aborted"){a({eventType:"error",content:g.errorMessage??`Pi stopped with ${g.stopReason}`,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,stopReason:g.stopReason}});continue}for(let h of st(g))h.type==="thinking"&&h.thinking?a({eventType:"thinking",content:h.thinking,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="text"&&h.text?a({eventType:"assistant_message",content:h.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="toolCall"&&h.name&&a({eventType:"tool_call",content:null,toolName:h.name,toolInput:h.arguments??{},toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,toolCallId:h.id}});let y=Wt(g.usage);y&&a({eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:y,model:u,timestamp:c,metadata:{piEventType:"assistant_usage",provider:i,responseId:g.responseId,stopReason:g.stopReason,costUsd:g.usage?.cost?.total,usage:{input_tokens:y.input,output_tokens:y.output,cache_read_input_tokens:y.cacheRead??0,cache_creation_input_tokens:y.cacheWrite??0}}})}let p=n.map(f=>f.timestamp).sort(),m=new Date().toISOString();return{tool:"pi",projectPath:s,gitBranch:null,startedAt:r??p[0]??m,endedAt:p[p.length-1]??null,events:n,metadata:o}}};var zt={claude_code:l(()=>new C,"claude_code"),cursor:l(()=>new A,"cursor"),vscode_copilot:l(()=>new N,"vscode_copilot"),copilot_agent:l(()=>new P,"copilot_agent"),rulemetric_mcp:l(()=>new D,"rulemetric_mcp"),codex:l(()=>new
|
|
7
|
+
`)}l(ot,"messageText");function Wt(e){if(!e)return null;let t={input:Math.max(0,e.input??0),output:Math.max(0,e.output??0),cacheRead:Math.max(0,e.cacheRead??0),cacheWrite:Math.max(0,e.cacheWrite??0)};return Object.values(t).some(n=>n>0)?t:null}l(Wt,"usageOf");var b=class{static{l(this,"PiAdapter")}tool="pi";parse(t){let n=[],o={},s=null,r=null,i=null,u=null,a=l(f=>{n.push({sequence:n.length,...f})},"push");for(let f of t.split(`
|
|
8
|
+
`)){if(!f.trim())continue;let d;try{d=JSON.parse(f)}catch{continue}if(d.type==="session"){r||(r=nt(d.timestamp)),s=d.cwd??s,o.sessionId=d.id,o.piSessionId=d.id,o.sessionVersion=d.version;continue}if(d.type==="model_change"){i=d.provider??i,u=d.modelId??u,i&&(o.provider=i),u&&(o.model=u);continue}if(d.type!=="message"||!d.message)continue;let g=d.message,c=nt(d.timestamp,g.timestamp);if(i=g.provider??i,u=g.model??u,i&&(o.provider=i),u&&(o.model=u),g.role==="user"){let h=ot(g);if(!h)continue;a({eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:c,metadata:{}});continue}if(g.role==="toolResult"){let h=ot(g);a({eventType:"tool_result",content:h||null,toolName:g.toolName??null,toolInput:null,toolOutput:{content:h,details:g.details??null,isError:g.isError??!1},tokenUsage:null,model:u,timestamp:c,metadata:{toolCallId:g.toolCallId,isError:g.isError??!1}});continue}if(g.role!=="assistant")continue;if(g.stopReason==="error"||g.stopReason==="aborted"){a({eventType:"error",content:g.errorMessage??`Pi stopped with ${g.stopReason}`,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,stopReason:g.stopReason}});continue}for(let h of st(g))h.type==="thinking"&&h.thinking?a({eventType:"thinking",content:h.thinking,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="text"&&h.text?a({eventType:"assistant_message",content:h.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="toolCall"&&h.name&&a({eventType:"tool_call",content:null,toolName:h.name,toolInput:h.arguments??{},toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,toolCallId:h.id}});let y=Wt(g.usage);y&&a({eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:y,model:u,timestamp:c,metadata:{piEventType:"assistant_usage",provider:i,responseId:g.responseId,stopReason:g.stopReason,costUsd:g.usage?.cost?.total,usage:{input_tokens:y.input,output_tokens:y.output,cache_read_input_tokens:y.cacheRead??0,cache_creation_input_tokens:y.cacheWrite??0}}})}let p=n.map(f=>f.timestamp).sort(),m=new Date().toISOString();return{tool:"pi",projectPath:s,gitBranch:null,startedAt:r??p[0]??m,endedAt:p[p.length-1]??null,events:n,metadata:o}}};var zt={claude_code:l(()=>new C,"claude_code"),cursor:l(()=>new A,"cursor"),vscode_copilot:l(()=>new N,"vscode_copilot"),copilot_agent:l(()=>new P,"copilot_agent"),rulemetric_mcp:l(()=>new D,"rulemetric_mcp"),codex:l(()=>new E,"codex"),pi:l(()=>new b,"pi")};function Kt(e){let t=zt[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}l(Kt,"getAdapter");function Vt(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
|
|
9
9
|
`)[0],o=null;try{o=JSON.parse(n)}catch{try{o=JSON.parse(t)}catch{}}if(o){if(o.type==="user"||o.type==="assistant")return"claude_code";if(o.type==="session"&&typeof o.id=="string"&&typeof o.cwd=="string"&&typeof o.version=="number")return"pi";if(Array.isArray(o.events)&&!o.requests&&!o.allComposers)return"rulemetric_mcp";if(Array.isArray(o.requests))return o.requests.some(r=>Array.isArray(r.toolCalls))||o.agentMode?"copilot_agent":"vscode_copilot";if(o.allComposers)return"cursor"}if(!o)try{let s=t.split(`
|
|
10
|
-
`).filter(r=>r.trim());if(s.length>1){let r=JSON.parse(s[0]);if(r.type==="user"||r.type==="assistant")return"claude_code"}}catch{}}return null}l(Vt,"detectTool");import{readdir as H,stat as W}from"fs/promises";import{basename as
|
|
10
|
+
`).filter(r=>r.trim());if(s.length>1){let r=JSON.parse(s[0]);if(r.type==="user"||r.type==="assistant")return"claude_code"}}catch{}}return null}l(Vt,"detectTool");import{readdir as H,stat as W}from"fs/promises";import{basename as Qt,join as w}from"path";import{homedir as R}from"os";var Xt={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};function Yt(){return process.env.CLAUDE_CONFIG_DIR||w(R(),".claude")}l(Yt,"getClaudeDir");function Zt(){return w(Yt(),"projects")}l(Zt,"getProjectsDir");function te(){return process.platform==="darwin"?w(R(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?w(R(),"AppData","Roaming","Claude","local-agent-mode-sessions"):w(R(),".config","Claude","local-agent-mode-sessions")}l(te,"getDesktopSessionsDir");async function ee(e){let t=[];async function n(o,s){if(s>8)return;let r=await H(o).catch(()=>[]);for(let i of r){if(i==="node_modules"||i===".git")continue;let u=w(o,i);if((await W(u).catch(()=>null))?.isDirectory())if(i==="projects"){let p=await H(u).catch(()=>[]);for(let m of p){let f=w(u,m);(await W(f).catch(()=>null))?.isDirectory()&&t.push(f)}}else await n(u,s+1)}}return l(n,"walk"),await n(e,0),t}l(ee,"findDesktopProjectDirs");var rt={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,o]of Object.entries(Xt))if(t.startsWith(n))return o;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=Zt();try{let o=await H(t);for(let s of o){let r=w(t,s);(await W(r).catch(()=>null))?.isDirectory()&&e.push({path:r,project:s,provider:"claude"})}}catch{}let n=await ee(te());for(let o of n)e.push({path:o,project:Qt(o),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}};import{readdir as $,readFile as at,stat as ne}from"fs/promises";import{basename as oe,join as O}from"path";import{homedir as se}from"os";var re={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},it={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};function ae(){return process.env.CODEX_HOME??O(se(),".codex")}l(ae,"getCodexDir");function ie(e){return e.replace(/^\//,"").replace(/\//g,"-")}l(ie,"sanitizeProject");async function le(e){try{let n=(await at(e,"utf-8")).split(`
|
|
11
11
|
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(le,"readFirstLine");async function ce(e){let t=await le(e);if(!t)return{valid:!1};let n=t.type==="session_meta"&&typeof t.payload?.originator=="string"&&t.payload.originator.toLowerCase().startsWith("codex");return{valid:n,meta:n?t:void 0}}l(ce,"isValidCodexSession");async function ue(e){let t=O(e,"sessions"),n=[],o;try{o=await $(t)}catch{return n}for(let s of o){if(!/^\d{4}$/.test(s))continue;let r=O(t,s),i=await $(r).catch(()=>[]);for(let u of i){if(!/^\d{2}$/.test(u))continue;let a=O(r,u),p=await $(a).catch(()=>[]);for(let m of p){if(!/^\d{2}$/.test(m))continue;let f=O(a,m),d=await $(f).catch(()=>[]);for(let g of d){if(!g.startsWith("rollout-")||!g.endsWith(".jsonl"))continue;let c=O(f,g);if(!(await ne(c).catch(()=>null))?.isFile())continue;let{valid:h,meta:_}=await ce(c);if(!h||!_)continue;let I=_.payload?.cwd??"unknown";n.push({path:c,project:ie(I),provider:"codex"})}}}}return n}l(ue,"discoverSessionsInDir");function pe(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}l(pe,"resolveModel");function de(e,t){return{async*parse(){let n;try{n=await at(e.path,"utf-8")}catch{return}let o=n.split(`
|
|
12
|
-
`).filter(g=>g.trim()),s,r="",i=0,u=0,a=0,p=0,m=0,f=[],d="";for(let g of o){let c;try{c=JSON.parse(g)}catch{continue}if(c.type==="session_meta"){r=c.payload?.session_id??oe(e.path,".jsonl"),s=c.payload?.model;continue}if(c.type==="response_item"&&c.payload?.type==="function_call"){let y=c.payload.name??"";f.push(it[y]??y);continue}if(c.type==="response_item"&&c.payload?.type==="message"&&c.payload?.role==="user"){let y=(c.payload.content??[]).filter(h=>h.type==="input_text").map(h=>h.text??"").filter(Boolean);y.length>0&&(d=y.join(" "));continue}if(c.type==="event_msg"&&c.payload?.type==="token_count"){let y=c.payload.info;if(!y)continue;let h=y.total_token_usage?.total_tokens??0;if(h>0&&h===i)continue;i=h;let _=y.last_token_usage,I=0,T=0,x=0,S=0;if(_)I=_.input_tokens??0,T=_.cached_input_tokens??0,x=_.output_tokens??0,S=_.reasoning_output_tokens??0;else if(h>0){let v=y.total_token_usage;if(!v)continue;I=(v.input_tokens??0)-u,T=(v.cached_input_tokens??0)-a,x=(v.output_tokens??0)-p,S=(v.reasoning_output_tokens??0)-m}if(!_){let v=y.total_token_usage;v&&(u=v.input_tokens??0,a=v.cached_input_tokens??0,p=v.output_tokens??0,m=v.reasoning_output_tokens??0)}if(I+T+x+S===0)continue;let Mt=Math.max(0,I-T),qt=pe(c.payload,s),
|
|
12
|
+
`).filter(g=>g.trim()),s,r="",i=0,u=0,a=0,p=0,m=0,f=[],d="";for(let g of o){let c;try{c=JSON.parse(g)}catch{continue}if(c.type==="session_meta"){r=c.payload?.session_id??oe(e.path,".jsonl"),s=c.payload?.model;continue}if(c.type==="response_item"&&c.payload?.type==="function_call"){let y=c.payload.name??"";f.push(it[y]??y);continue}if(c.type==="response_item"&&c.payload?.type==="message"&&c.payload?.role==="user"){let y=(c.payload.content??[]).filter(h=>h.type==="input_text").map(h=>h.text??"").filter(Boolean);y.length>0&&(d=y.join(" "));continue}if(c.type==="event_msg"&&c.payload?.type==="token_count"){let y=c.payload.info;if(!y)continue;let h=y.total_token_usage?.total_tokens??0;if(h>0&&h===i)continue;i=h;let _=y.last_token_usage,I=0,T=0,x=0,S=0;if(_)I=_.input_tokens??0,T=_.cached_input_tokens??0,x=_.output_tokens??0,S=_.reasoning_output_tokens??0;else if(h>0){let v=y.total_token_usage;if(!v)continue;I=(v.input_tokens??0)-u,T=(v.cached_input_tokens??0)-a,x=(v.output_tokens??0)-p,S=(v.reasoning_output_tokens??0)-m}if(!_){let v=y.total_token_usage;v&&(u=v.input_tokens??0,a=v.cached_input_tokens??0,p=v.output_tokens??0,m=v.reasoning_output_tokens??0)}if(I+T+x+S===0)continue;let Mt=Math.max(0,I-T),qt=pe(c.payload,s),Z=c.timestamp??"",F=`codex:${e.path}:${Z}:${h}`;if(t.has(F))continue;t.add(F),yield{provider:"codex",model:qt,inputTokens:Mt,outputTokens:x,cacheCreationInputTokens:0,cacheReadInputTokens:T,cachedInputTokens:T,reasoningTokens:S,costUSD:0,tools:f,bashCommands:[],timestamp:Z,speed:"standard",deduplicationKey:F,userMessage:d,sessionId:r},f=[],d=""}}}}}l(de,"createParser");var lt={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(re))if(e.startsWith(t))return n;return e},toolDisplayName(e){return it[e]??e},async discoverSessions(){return ue(ae())},createSessionParser(e,t){return de(e,t)}};import{readdir as me,readFile as ct,stat as fe}from"fs/promises";import{basename as ut,dirname as he,join as z}from"path";import{homedir as ge}from"os";var ye={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},pt={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},_e=Object.entries(ye).sort((e,t)=>t[0].length-e[0].length);function Se(){return z(ge(),".copilot","session-state")}l(Se,"getCopilotSessionStateDir");function Te(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}l(Te,"parseCwd");function Ie(e,t){return{async*parse(){let n;try{n=await ct(e.path,"utf-8")}catch{return}let o=ut(he(e.path)),s=n.split(`
|
|
13
13
|
`).filter(u=>u.trim()),r="",i="";for(let u of s){let a;try{a=JSON.parse(u)}catch{continue}if(a.type==="session.model_change"){r=a.data.newModel??r;continue}if(a.type==="user.message"){i=a.data.content??"";continue}if(a.type==="assistant.message"){let{messageId:p,outputTokens:m,toolRequests:f=[]}=a.data;if(m===0||!r)continue;let d=`copilot:${o}:${p}`;if(t.has(d))continue;t.add(d);let g=f.map(c=>c.name??"").filter(Boolean).map(c=>pt[c]??c);yield{provider:"copilot",model:r,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:g,bashCommands:[],timestamp:a.timestamp??"",speed:"standard",deduplicationKey:d,userMessage:i,sessionId:o},i=""}}}}}l(Ie,"createParser");async function ve(e){let t=[],n;try{n=await me(e)}catch{return t}for(let o of n){let s=z(e,o,"events.jsonl");if(!(await fe(s).catch(()=>null))?.isFile())continue;let i=o;try{let u=await ct(z(e,o,"workspace.yaml"),"utf-8"),a=Te(u);a&&(i=ut(a))}catch{}t.push({path:s,project:i,provider:"copilot"})}return t}l(ve,"discoverSessionsInDir");var dt={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of _e)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return pt[e]??e},async discoverSessions(){return ve(Se())},createSessionParser(e,t){return Ie(e,t)}};import{readdir as mt,readFile as ht,stat as ft}from"fs/promises";import{basename as gt,join as K}from"path";import{homedir as xe}from"os";var we={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},yt={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},ke=Object.entries(we).sort((e,t)=>t[0].length-e[0].length);function Oe(){return K(xe(),".pi","agent","sessions")}l(Oe,"getPiSessionsDir");async function Ce(e){try{let n=(await ht(e,"utf-8")).split(`
|
|
14
14
|
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(Ce,"readFirstEntry");function Ae(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}l(Ae,"extractBashCommands");async function Ne(e){let t=[],n;try{n=await mt(e)}catch{return t}for(let o of n){let s=K(e,o);if(!(await ft(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await mt(s)}catch{continue}for(let u of i){if(!u.endsWith(".jsonl"))continue;let a=K(s,u);if(!(await ft(a).catch(()=>null))?.isFile())continue;let m=await Ce(a);if(!m||m.type!=="session")continue;let f=m.cwd??o;t.push({path:a,project:gt(f),provider:"pi"})}}return t}l(Ne,"discoverSessionsInDir");function Pe(e,t){return{async*parse(){let n;try{n=await ht(e.path,"utf-8")}catch{return}let o=n.split(`
|
|
15
|
-
`).filter(i=>i.trim()),s=gt(e.path,".jsonl"),r="";for(let[i,u]of o.entries()){let a;try{a=JSON.parse(u)}catch{continue}if(a.type==="session"){s=a.id??s;continue}if(a.type!=="message")continue;let p=a.message;if(!p)continue;if(p.role==="user"){let S=(p.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);S.length>0&&(r=S.join(" "));continue}if(p.role!=="assistant"||!p.usage)continue;let{input:m,output:f,cacheRead:d,cacheWrite:g}=p.usage;if(m===0&&f===0)continue;let c=p.model??"gpt-5",y=p.responseId??"",h=`pi:${e.path}:${y||a.id||a.timestamp||String(i)}`;if(t.has(h))continue;t.add(h);let _=(p.content??[]).filter(S=>S.type==="toolCall"&&S.name),I=_.map(S=>yt[S.name]??S.name),T=_.filter(S=>S.name==="bash").flatMap(S=>{let k=S.arguments?.command;return typeof k=="string"?Ae(k):[]}),x=a.timestamp??"";yield{provider:"pi",model:c,inputTokens:m,outputTokens:f,cacheCreationInputTokens:g,cacheReadInputTokens:d,cachedInputTokens:d,reasoningTokens:0,costUSD:0,tools:I,bashCommands:T,timestamp:x,speed:"standard",deduplicationKey:h,userMessage:r,sessionId:s},r=""}}}}l(Pe,"createParser");var _t={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of ke)if(e.startsWith(t))return n;return e},toolDisplayName(e){return yt[e]??e},async discoverSessions(){return Ne(Oe())},createSessionParser(e,t){return Pe(e,t)}};var xt=[rt,lt,dt,_t],St=null,Tt=!1;async function wt(){if(Tt)return St;Tt=!0;try{let{cursor:e}=await import("./cursor-T7AMCMKS.js");return St=e,e}catch{return null}}l(wt,"loadCursor");var It=null,vt=!1;async function kt(){if(vt)return It;vt=!0;try{let{opencode:e}=await import("./opencode-QRJ3BH23.js");return It=e,e}catch{return null}}l(kt,"loadOpenCode");async function Ot(){let[e,t]=await Promise.all([wt(),kt()]),n=[...xt];return e&&n.push(e),t&&n.push(t),n}l(Ot,"getAllProviders");async function De(e){let t=await Ot(),n=e&&e!=="all"?t.filter(s=>s.name===e):t,o=[];for(let s of n){let r=await s.discoverSessions();o.push(...r)}return o}l(De,"discoverAllSessions");async function
|
|
15
|
+
`).filter(i=>i.trim()),s=gt(e.path,".jsonl"),r="";for(let[i,u]of o.entries()){let a;try{a=JSON.parse(u)}catch{continue}if(a.type==="session"){s=a.id??s;continue}if(a.type!=="message")continue;let p=a.message;if(!p)continue;if(p.role==="user"){let S=(p.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);S.length>0&&(r=S.join(" "));continue}if(p.role!=="assistant"||!p.usage)continue;let{input:m,output:f,cacheRead:d,cacheWrite:g}=p.usage;if(m===0&&f===0)continue;let c=p.model??"gpt-5",y=p.responseId??"",h=`pi:${e.path}:${y||a.id||a.timestamp||String(i)}`;if(t.has(h))continue;t.add(h);let _=(p.content??[]).filter(S=>S.type==="toolCall"&&S.name),I=_.map(S=>yt[S.name]??S.name),T=_.filter(S=>S.name==="bash").flatMap(S=>{let k=S.arguments?.command;return typeof k=="string"?Ae(k):[]}),x=a.timestamp??"";yield{provider:"pi",model:c,inputTokens:m,outputTokens:f,cacheCreationInputTokens:g,cacheReadInputTokens:d,cachedInputTokens:d,reasoningTokens:0,costUSD:0,tools:I,bashCommands:T,timestamp:x,speed:"standard",deduplicationKey:h,userMessage:r,sessionId:s},r=""}}}}l(Pe,"createParser");var _t={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of ke)if(e.startsWith(t))return n;return e},toolDisplayName(e){return yt[e]??e},async discoverSessions(){return Ne(Oe())},createSessionParser(e,t){return Pe(e,t)}};var xt=[rt,lt,dt,_t],St=null,Tt=!1;async function wt(){if(Tt)return St;Tt=!0;try{let{cursor:e}=await import("./cursor-T7AMCMKS.js");return St=e,e}catch{return null}}l(wt,"loadCursor");var It=null,vt=!1;async function kt(){if(vt)return It;vt=!0;try{let{opencode:e}=await import("./opencode-QRJ3BH23.js");return It=e,e}catch{return null}}l(kt,"loadOpenCode");async function Ot(){let[e,t]=await Promise.all([wt(),kt()]),n=[...xt];return e&&n.push(e),t&&n.push(t),n}l(Ot,"getAllProviders");async function De(e){let t=await Ot(),n=e&&e!=="all"?t.filter(s=>s.name===e):t,o=[];for(let s of n){let r=await s.discoverSessions();o.push(...r)}return o}l(De,"discoverAllSessions");async function Ee(e){return e==="cursor"?await wt()??void 0:e==="opencode"?await kt()??void 0:xt.find(t=>t.name===e)}l(Ee,"getProvider");import{spawn as Y}from"node:child_process";import{randomUUID as Ue}from"node:crypto";import{writeFile as At}from"node:fs/promises";import{tmpdir as Nt}from"node:os";import{join as Pt}from"node:path";import{spawn as be}from"node:child_process";function V(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}l(V,"sanitizeTmuxName");function Q(e){let t=[...e.runId?[`RULEMETRIC_RUN_ID=${e.runId}`]:[],...e.scopedConfirmation?[`RULEMETRIC_SCOPED_CONFIRMATION_ID=${e.scopedConfirmation.id}`,`RULEMETRIC_SCOPED_TASK_ID=${e.scopedConfirmation.taskId}`,`RULEMETRIC_SCOPED_CONFIGURATION_HASH=${e.scopedConfirmation.configurationHash}`]:[]],n=t.length?["env",...t,"claude"]:["claude"];return e.resumeSessionId&&n.push("--resume",e.resumeSessionId),e.model&&n.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...n]}l(Q,"buildTmuxLaunchArgs");function U(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}l(U,"buildTmuxSendKeysArgs");function Re(e){return["has-session","-t",e]}l(Re,"buildTmuxHasSessionArgs");function j(e){return`tmux attach -t ${e}`}l(j,"buildTmuxAttachCommand");function $e(){let e=["/opt/homebrew/bin","/usr/local/bin"],t=(process.env.PATH??"").split(":").filter(Boolean),n=e.filter(o=>!t.includes(o));return n.length===0?process.env:{...process.env,PATH:[...t,...n].join(":")}}l($e,"tmuxSpawnEnv");function X(e){return new Promise(t=>{let n=be("tmux",e,{stdio:["ignore","ignore","pipe"],env:$e()}),o="";n.stderr.on("data",s=>{o+=s.toString()}),n.on("close",s=>t({code:s,stderr:o})),n.on("error",s=>t({code:null,stderr:s.message}))})}l(X,"runTmux");async function Ct(){return(await X(["-V"])).code===0}l(Ct,"isTmuxAvailable");var Dt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,je=/^[a-f0-9]{64}$/;function Me(e){if(e){if(Dt.test(e.id)&&je.test(e.configurationHash)&&e.taskId.length>0&&e.taskId.length<=500)return e;console.warn("[claude-code-launcher] dropping invalid scoped confirmation identity")}}l(Me,"validateScopedConfirmation");function qe(e){if(e!==void 0){if(Dt.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}l(qe,"validateRunId");function M(e){return`'${e.replace(/'/g,"'\\''")}'`}l(M,"shellSingleQuote");var q=class{static{l(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Ue(),o={...t,runId:qe(t.runId),scopedConfirmation:Me(t.scopedConfirmation)};return o.mode==="headless"?this.launchHeadless(o,n):this.launchInteractive(o,n)}async launchHeadless(t,n){let o=["-p",t.prompt??"","--output-format","json"];t.scopedConfirmation&&o.push("--session-id",n,"--tools","Read,Write,Edit,Bash"),t.systemPrompt&&o.push("--system-prompt",t.systemPrompt),t.model&&o.push("--model",t.model);let s={...process.env};return delete s.CLAUDECODE,delete s.HTTPS_PROXY,t.runId&&(s.RULEMETRIC_RUN_ID=t.runId),t.scopedConfirmation&&(t.model&&(s.RULEMETRIC_SCOPED_REQUESTED_MODEL=t.model),s.RULEMETRIC_SCOPED_CONFIRMATION_ID=t.scopedConfirmation.id,s.RULEMETRIC_SCOPED_TASK_ID=t.scopedConfirmation.taskId,s.RULEMETRIC_SCOPED_CONFIGURATION_HASH=t.scopedConfirmation.configurationHash),new Promise(r=>{let i=Y("claude",o,{cwd:t.projectPath,env:s,stdio:["ignore","pipe","pipe"]}),u="",a="";i.stdout.on("data",m=>{u+=m.toString()}),i.stderr.on("data",m=>{a+=m.toString()});let p=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",m=>{p&&clearTimeout(p);let f=u;try{let d=JSON.parse(u);f=d.result??d.content??u}catch{}r({sessionId:n,pid:i.pid,exitCode:m,output:f,error:m!==0?a:void 0})}),i.on("error",m=>{p&&clearTimeout(p),r({sessionId:n,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??Ct)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let o=this.options.runTmux??X,s=V(`claude-${t.resumeSessionId??n}`),r=await o(Q({sessionName:s,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId,scopedConfirmation:t.scopedConfirmation}));if(r.code!==0)return this.launchInteractiveTerminal(t,n,"tmux_launch_failed",`tmux new-session exited ${r.code}: ${r.stderr.trim()||"no stderr"}`);let i=await this.openTerminalAttach(s,n);if(t.prompt){let u=await o(U(s,t.prompt));if(u.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${u.code}: ${u.stderr.trim()||"no stderr"}`};let a=await o(U(s,"Enter",{literal:!1}));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${a.code}: ${a.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:s,attachCommand:j(s),live:!0}}}async openTerminalAttach(t,n){let o=Pt(Nt(),`rulemetric-attach-${n}.command`),s=`#!/bin/zsh
|
|
16
16
|
rm -- "$0"
|
|
17
17
|
${j(t)}
|
|
18
|
-
`;return await At(o,s,{mode:493}),new Promise(r=>{let i=
|
|
18
|
+
`;return await At(o,s,{mode:493}),new Promise(r=>{let i=Y("open",["-a","Terminal",o],{stdio:["ignore","pipe","pipe"]}),u="";i.stderr.on("data",a=>{u+=a.toString()}),i.on("close",a=>{r(a===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${a}: ${u.trim()||"no stderr"}`})}),i.on("error",a=>{r({error:`Failed to spawn open attach: ${a.message}`})})})}async launchInteractiveTerminal(t,n,o,s){let r=["claude"];t.resumeSessionId?r.push("--resume",t.resumeSessionId):t.prompt&&r.push("-p",JSON.stringify(t.prompt)),t.model&&r.push("--model",t.model);let i=r.join(" "),u=Pt(Nt(),`rulemetric-launch-${n}.command`),a=t.runId?`export RULEMETRIC_RUN_ID=${M(t.runId)}
|
|
19
19
|
`:"",p=t.scopedConfirmation?`export RULEMETRIC_SCOPED_CONFIRMATION_ID=${M(t.scopedConfirmation.id)}
|
|
20
20
|
export RULEMETRIC_SCOPED_TASK_ID=${M(t.scopedConfirmation.taskId)}
|
|
21
21
|
export RULEMETRIC_SCOPED_CONFIGURATION_HASH=${M(t.scopedConfirmation.configurationHash)}
|
|
@@ -23,6 +23,6 @@ export RULEMETRIC_SCOPED_CONFIGURATION_HASH=${M(t.scopedConfirmation.configurati
|
|
|
23
23
|
rm -- "$0"
|
|
24
24
|
cd ${JSON.stringify(t.projectPath)} || exit
|
|
25
25
|
`+a+p+`${i}
|
|
26
|
-
`;return await At(u,m,{mode:493}),new Promise(f=>{let d=
|
|
26
|
+
`;return await At(u,m,{mode:493}),new Promise(f=>{let d=Y("open",["-a","Terminal",u],{stdio:["ignore","pipe","pipe"]}),g="";d.stderr.on("data",c=>{g+=c.toString()}),d.on("close",c=>{if(c===0)f({sessionId:n,pid:d.pid,liveSendAvailable:!1,fallbackReason:o,...s?{error:s}:{}});else{let y=g.trim()||"no stderr";f({sessionId:n,pid:d.pid,liveSendAvailable:!1,fallbackReason:o,error:s?`${s}; open exited ${c}: ${y}`:`open exited ${c}: ${y}`})}}),d.on("error",c=>{f({sessionId:n,liveSendAvailable:!1,fallbackReason:o,error:`Failed to spawn open: ${c.message}`})})})}};import{spawn as Et}from"node:child_process";import{randomUUID as Le}from"node:crypto";var L=class{static{l(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Le();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let o=["-q",t.prompt??""];return t.model&&o.push("--model",t.model),new Promise(s=>{let r=Et("codex",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",p=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:p,output:i,error:p!==0?u:void 0})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn codex: ${p.message}`})})})}launchInteractive(t,n){let o=["codex"];t.prompt&&o.push(JSON.stringify(t.prompt));let s=`cd ${JSON.stringify(t.projectPath)} && ${o.join(" ")}`,r=Et("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return r.unref(),Promise.resolve({sessionId:n,pid:r.pid})}};import{spawn as bt}from"node:child_process";import{randomUUID as Je}from"node:crypto";function Ge(e){let t=e.mode==="headless"?["--print","--mode","json","--no-session"]:[];return e.systemPrompt&&t.push("--system-prompt",e.systemPrompt),e.model&&t.push("--model",e.model),e.prompt&&t.push(e.prompt),t}l(Ge,"buildPiLaunchArgs");function Be(e){let t;for(let o of e.split(`
|
|
27
27
|
`))if(o.trim())try{let s=JSON.parse(o);if(s.type!=="agent_end"||!Array.isArray(s.messages))continue;t=s.messages.filter(r=>r.role==="assistant").at(-1)}catch{}if(!t)return{output:e};if(t.stopReason==="error"||t.stopReason==="aborted")return{output:"",error:`Pi provider error: ${t.errorMessage??t.stopReason}`};let n=t.content?.filter(o=>o.type==="text"&&typeof o.text=="string").map(o=>o.text).join(`
|
|
28
|
-
`)??"";return n?{output:n}:{output:e}}l(Be,"parsePiLaunchOutput");var J=class{static{l(this,"PiLauncher")}tool="pi";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Je(),o=Ge(t);if(t.mode==="interactive"){let s=["pi",...o].map(u=>JSON.stringify(u)).join(" "),r=`cd ${JSON.stringify(t.projectPath)} && ${s}`,i=
|
|
28
|
+
`)??"";return n?{output:n}:{output:e}}l(Be,"parsePiLaunchOutput");var J=class{static{l(this,"PiLauncher")}tool="pi";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Je(),o=Ge(t);if(t.mode==="interactive"){let s=["pi",...o].map(u=>JSON.stringify(u)).join(" "),r=`cd ${JSON.stringify(t.projectPath)} && ${s}`,i=bt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return i.unref(),{sessionId:n,pid:i.pid}}return new Promise(s=>{let r=bt("pi",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>r.kill("SIGTERM"),t.timeout):null;r.on("close",p=>{a&&clearTimeout(a);let m=Be(i);s({sessionId:n,pid:r.pid,exitCode:p,output:m.output,error:m.error??(p!==0?u.trim()||i.trim()||`pi exited ${p}`:void 0)})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn pi: ${p.message}`})})})}};import{spawn as Rt}from"node:child_process";import{randomUUID as Fe}from"node:crypto";var G=class{static{l(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Fe();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let o=["--message",t.prompt??"","--yes"];return t.model&&o.push("--model",t.model),new Promise(s=>{let r=Rt("aider",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",p=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:p,output:i,error:p!==0?u:void 0})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn aider: ${p.message}`})})})}launchInteractive(t,n){let o=["aider"];t.model&&o.push("--model",t.model);let s=`cd ${JSON.stringify(t.projectPath)} && ${o.join(" ")}`,r=Rt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return r.unref(),Promise.resolve({sessionId:n,pid:r.pid})}};import{spawn as He}from"node:child_process";import{randomUUID as We}from"node:crypto";var B=class{static{l(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=We();if(t.mode==="headless")return{sessionId:n,error:`${this.tool} does not support headless mode`};let o=`cd ${JSON.stringify(t.projectPath)} && echo "Session ${n} \u2014 tool: ${this.tool}" && exec $SHELL`,s=He("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),{sessionId:n,pid:s.pid}}};var $t={claude_code:l(()=>new q,"claude_code"),codex:l(()=>new L,"codex"),pi:l(()=>new J,"pi"),aider:l(()=>new G,"aider")};function ze(e){let t=$t[e];return t?t():new B(e)}l(ze,"getLauncher");function Ke(){return Object.entries($t).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}l(Ke,"getAvailableLaunchers");import Ut from"node:path";function jt(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}l(jt,"sanitizeBranch");function Ve(e){return Ut.resolve(e.basePath??Ut.join(e.repoRoot,"..",".rulemetric-worktrees",jt(e.branch)))}l(Ve,"worktreePathFor");export{Qe as a,Xe as b,C as c,A as d,N as e,P as f,D as g,et as h,E as i,b as j,Kt as k,Vt as l,Ot as m,De as n,Ee as o,V as p,Q as q,U as r,Re as s,j as t,ze as u,Ke as v,jt as w,Ve as x};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as S,b as P}from"./chunk-PPAHIVG5.js";import{a as
|
|
1
|
+
import{a as S,b as P}from"./chunk-PPAHIVG5.js";import{a as V,b as v,c as T}from"./chunk-5MXZJWQS.js";import{a as E,b as C,c as _}from"./chunk-CT7FWSIU.js";import{a as b}from"./chunk-N7ODX6PO.js";import{d as K}from"./chunk-JNLDISBA.js";import{c as z,d as H}from"./chunk-GPBN4ROE.js";import{a as g,b as U}from"./chunk-6XTLP2G7.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execSync as M,spawn as ee}from"node:child_process";import{tmpdir as B}from"node:os";import{mkdtempSync as te,rmSync as ne,writeFileSync as re}from"node:fs";import{join as Y}from"node:path";function oe(t,o){let{available:r,backend:n}=o??{available:c(l=>g(l)!==null,"available"),backend:A()},e=P(t);if(r(e.bin))return{bin:e.bin,args:e.args,delivery:e.delivery??"stdin",substitutedFrom:null};let i=n==="codex-cli"?S.codex:n==="claude-cli"?S.claude_code:n==="copilot-cli"?S.copilot:null;return!i||!r(i.bin)?null:{bin:i.bin,args:i.args,delivery:i.delivery??"stdin",substitutedFrom:e.bin}}c(oe,"planToolExecution");function X(t,o=300){let r=t.trim().replace(/\s+/g," ");return r.length>o?`${r.slice(0,o)}\u2026`:r}c(X,"excerpt");async function ye(t,o,r){let n=oe(t);if(!n){let s=`no engine can run ${t}'s prompt: ${P(t).bin} is not installed and no substitutable backend was detected`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let{bin:e,args:i,delivery:l}=n;n.substitutedFrom&&console.warn(`[llm-client] ${n.substitutedFrom} is not installed \u2014 running ${t}'s analysis prompt on ${e} instead`);let a=g(e);if(!a){let s=`${e} not found on PATH, well-known dirs, or the node bin dir`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let u=`${o}
|
|
2
2
|
|
|
3
3
|
SESSION DATA:
|
|
4
4
|
${r}`,m={...b()};delete m.HTTPS_PROXY;let p=null,y=i,$=u;if(l==="argv-file"){p=te(Y(B(),"rulemetric-tool-prompt-"));let s=Y(p,"session-data.txt");re(s,r),y=[...i,`@${s}`,`${o}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as E}from"./chunk-
|
|
1
|
+
import{g as E}from"./chunk-DHIEGG4T.js";import{b,e as y,f as k,h as M}from"./chunk-GIXHG5FK.js";import{a as u}from"./chunk-ZLLER3HP.js";var v=50,I=24e3,P=3,R=3,C=40,N=4e3,x=new Set(["fact","decision","correction","convention"]),L=`You are distilling DURABLE, PROJECT-SPECIFIC knowledge from an AI coding session so a future agent working on the SAME project starts smarter.
|
|
2
2
|
|
|
3
3
|
Extract ONLY facts / decisions / corrections / conventions that will STILL be true and useful in FUTURE sessions \u2014 architecture facts, deliberate design decisions, corrections of a wrong approach, or project conventions.
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as X}from"./chunk-HOQPVOMF.js";import{b as D}from"./chunk-GIRPEMTW.js";import{a as x}from"./chunk-MODXEGCU.js";import{e as J,g as B}from"./chunk-
|
|
1
|
+
import{c as X}from"./chunk-HOQPVOMF.js";import{b as D}from"./chunk-GIRPEMTW.js";import{a as x}from"./chunk-MODXEGCU.js";import{e as J,g as B}from"./chunk-DHIEGG4T.js";import{e as w,f as R}from"./chunk-GIXHG5FK.js";import{c as H,d as U}from"./chunk-X6CF5KTW.js";import{a as u}from"./chunk-ZLLER3HP.js";import{readFileSync as q,realpathSync as V}from"node:fs";import y from"node:path";import A from"node:os";function Q(s){let n=y.resolve(s);if(n===y.resolve(A.homedir()))return!1;let a=y.parse(n).root;if(n===a)return!1;try{let o=V(A.tmpdir());if(V(n)===o)return!1}catch{}return!0}u(Q,"isScorableProjectPath");var Z=5,ee=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),te=48,ne=.5,O=400,oe=3,re=.6,se=1;function ae(s){let n=s.bloated??[],a=new Set([...s.harmful.map(o=>o.id),...s.candidates.map(o=>o.id)]);return n.filter(o=>!a.has(o.id)).slice(0,se).map(o=>({instructionId:o.id,estimatedTokens:o.estimatedTokens,topProjectId:o.topProjectId??null,score:.55,reason:`Costs ~${o.estimatedTokens} tokens every session and measures neutral across ${o.exposures} exposed session(s) \u2014 enough data to detect an effect, and none found. Consider shortening "${o.name}" rather than removing it.`+(o.containsSafetyLanguage?" CAUTION: it contains guardrail language (destructive-command or credential rules) \u2014 preserve those lines when shortening.":"")}))}u(ae,"buildTrimProposals");async function ie(s,n,a){let o=[],i=0;for(let d of s)try{await a("/api/instruction-experiments",{instructionId:d.instructionId,projectPath:n,source:"groom"}),i++}catch(g){let m=g instanceof Error?g.message:String(g);o.push({...d,reason:`${d.reason} (not measurable by withholding: ${m})`})}return{nominated:i,unmeasurable:o}}u(ie,"nominateRemovals");function ce(s){let n=[];for(let o of s.harmful){let i=o.verdict.delta;n.push({instructionId:o.id,score:Math.min(.95,.75+Math.abs(i)),topProjectId:o.topProjectId??null,reason:`Measured harmful: sessions using "${o.name}" scored ${(i*100).toFixed(1)}pp worse across ${o.exposures} exposed session(s). Observational \u2014 review before archiving.`})}let a=new Set(s.harmful.map(o=>o.id));for(let o of s.candidates)a.has(o.id)||n.push({instructionId:o.id,score:re,topProjectId:o.topProjectId??null,reason:`Unused: "${o.name}" is ${o.reason} (${o.totalExposures} lifetime exposure(s)) but still costs context budget every session.`});return n.slice(0,oe)}u(ce,"buildRemovalProposals");function le(){let s=y.join(A.homedir(),".config","rulemetric","skills-registry.json");try{let n=q(s,"utf-8"),a=JSON.parse(n),o=new Date(a.generatedAt).getTime();return Number.isNaN(o)?"unknown":Date.now()-o>te*60*60*1e3?"stale":"fresh"}catch{return"unknown"}}u(le,"observeSkillsRegistry");var Re=u(async(s,n)=>{let a=J(),o=a!=="none";o?n.logger.info(`Scoring backend: ${a}`):n.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping relevance scoring. Removal/trim proposals still run \u2014 they need no LLM.");let i;try{i=(await w("/api/sessions/project-paths?limit="+ee)).projectPaths}catch(e){n.logger.warn(`Failed to fetch project paths: ${e instanceof Error?e.message:String(e)}`);return}if(i.length===0){n.logger.info("No recent project paths; nothing to score");return}let d=new Map;try{let e=await w("/api/projects?limit=200");for(let t of e.projects??[])t.primaryCheckoutPath&&d.set(x(t.primaryCheckoutPath),t.id)}catch(e){n.logger.warn(`Failed to fetch projects for id resolution: ${e instanceof Error?e.message:String(e)}`)}let g=new Map;try{let e=await w(`/api/catalog?limit=200&proposable=1&contentPreview=${O}`);for(let t of e)g.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.contentPreview??"").slice(0,O)})}catch(e){n.logger.warn(`Failed to fetch catalog: ${e instanceof Error?e.message:String(e)}`)}try{let e=await w("/api/instructions?limit=100");for(let t of e.instructions??[])g.has(t.id)||g.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,O)})}catch(e){n.logger.warn(`Failed to fetch personal instructions: ${e instanceof Error?e.message:String(e)}`)}let m=[],p=[];try{let e=await w("/api/insights/groom-candidates");if(!e.captureHealthy)n.logger.info(`Grooming paused: ${e.reason??"capture unhealthy"}`);else{m=ce(e),p=ae(e);let t=e.safetyGuarded+e.harmfulSafetyGuarded;n.logger.info(`Removal proposals: ${m.length} (${e.harmful.length} measured-harmful, ${e.candidates.length} never-used, ${t} withheld by the safety allowlist); trim proposals: ${p.length} (${(e.bloated??[]).length} measured-neutral and expensive, ${e.trimSafetyFlagged??0} flagged as containing guardrail language)`)}}catch(e){n.logger.warn(`Failed to fetch groom candidates: ${e instanceof Error?e.message:String(e)}`)}let b=[...g.values()];if(b.length===0&&m.length===0&&p.length===0){n.logger.info("No candidate instructions and nothing to retire; nothing to score");return}n.logger.info(`Scoring ${b.length} candidates across ${i.length} project(s)`);let M=0,l=null,I=new Set;for(let e of i)try{let t=x(e);if(!Q(t)){n.logger.info(`Skipping ${t}: not a project directory (home/root)`);continue}let f=D(t),k=o&&f.length>0;f.length===0&&n.logger.info(`${t}: insufficient language signals; removal/trim only`);let v=X(t),z={name:y.basename(t),description:v.description,languages:f,topics:v.topics,dependencies:v.dependencies},E=k?U(b):[];k&&n.logger.info(`Scoring ${b.length} candidates for ${t} in ${E.length} batch(es)`);let C=[],$=0;for(let r of E)try{let c=await B(H(z,r),"",4096);if(!c){$++;continue}let T=c.recommendations??[];for(let P of T)typeof P.instructionId=="string"&&typeof P.score=="number"&&typeof P.reason=="string"&&C.push({instructionId:P.instructionId,score:P.score,reason:P.reason})}catch(c){$++,n.logger.warn(`Batch failed for ${t}: ${c instanceof Error?c.message:String(c)}`)}$>0&&n.logger.warn(`${$}/${E.length} batch(es) failed for ${t} (backend ${a}); suggestions are partial`),k&&C.length===0&&n.logger.warn(`No usable LLM output for ${t} (backend ${a})`);let K=C.filter(r=>r.score>=ne).sort((r,c)=>c.score-r.score).slice(0,Z),_=d.get(t),W=l===null||l===t;l===null&&(l=t);let N=u(r=>r.topProjectId?r.topProjectId===_:W,"placeHere"),F=m.filter(N),{nominated:L,unmeasurable:G}=await ie(F,t,R);L>0&&n.logger.info(`${t}: ${L} removal candidate(s) nominated for randomised withholding instead of the feed`);let h=[...K.map(r=>({instructionId:r.instructionId,score:r.score,reason:r.reason,kind:"add"})),...G.map(({topProjectId:r,...c})=>({...c,kind:"remove"})),...p.filter(N).map(({estimatedTokens:r,topProjectId:c,...T})=>({...T,kind:"trim"}))];if(h.length===0){n.logger.info(`Nothing to suggest for ${t}`);continue}await R("/api/instruction-suggestions/batch-upsert",{projectPath:t,..._?{projectId:_}:{},suggestions:h}),n.logger.info(`${t}: ${h.filter(r=>r.kind==="add").length} add + ${h.filter(r=>r.kind==="remove").length} remove + ${h.filter(r=>r.kind==="trim").length} trim`);for(let r of h)r.kind!=="add"&&I.add(r.instructionId);let Y=new Set(G.map(r=>r.instructionId));for(let r of F)Y.has(r.instructionId)||I.add(r.instructionId);M++}catch(t){n.logger.warn(`Failed to score ${e}: ${t instanceof Error?t.message:String(t)}`)}let j=[...m.filter(e=>!I.has(e.instructionId)),...p.filter(e=>!I.has(e.instructionId)).map(({estimatedTokens:e,...t})=>t)];if(j.length>0&&l)try{let e=new Set(p.map(t=>t.instructionId));await R("/api/instruction-suggestions/batch-upsert",{projectPath:l,...d.get(l)?{projectId:d.get(l)}:{},suggestions:j.map(({topProjectId:t,...f})=>({...f,kind:e.has(f.instructionId)?"trim":"remove"}))}),n.logger.info(`Orphan sweep: ${j.length} proposal(s) whose project was not scored this run placed on ${l}`)}catch(e){n.logger.warn(`Orphan sweep failed: ${e instanceof Error?e.message:String(e)}`)}let S=le();if(S==="unknown")n.logger.warn("Skills registry unreadable or has no usable generatedAt; leaving suggestion staleness unchanged");else try{await R("/api/instruction-suggestions/mark-stale",{stale:S==="stale"}),S==="stale"?n.logger.warn("Skills registry is stale (>48h); marked catalog-skill suggestions stale"):n.logger.info("Skills registry is fresh; cleared staleness on catalog-skill suggestions")}catch{}n.logger.info(`Done: scored ${M}/${i.length} projects`)},"cronSuggestInstructions");export{Q as a,ae as b,ie as c,ce as d,Re as e};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as j}from"./chunk-PJ4RIUI3.js";import{a as E}from"./chunk-
|
|
1
|
+
import{a as j}from"./chunk-PJ4RIUI3.js";import{a as E}from"./chunk-X23L2MF6.js";import{a as J}from"./chunk-B22HYCBV.js";import{d as T}from"./chunk-NJ5UED3H.js";import{b as I,c as P,d as v}from"./chunk-NWV66NMA.js";import{a as b}from"./chunk-ZLLER3HP.js";import{useEffect as R,useState as i}from"react";import{Box as l,Text as s,useInput as Z}from"ink";import{jsx as t,jsxs as a}from"react/jsx-runtime";function K({onClose:A,activeOrg:F,defaultProjectPath:y,width:_}){let{jobs:u,error:L,loading:$,refetch:S}=j(20),[M,C]=i([]),[d,m]=i("list"),[f,w]=i(0),[h,g]=i(null),[x,B]=i(null),[p,c]=i(null);R(()=>{v().then(C).catch(o=>{let r=o instanceof Error?o.message:String(o);c(`couldn't load launchers: ${r}`),C([{tool:"claude_code",capabilities:{headless:!0,interactive:!0,remoteSpawn:!0}}])})},[]),R(()=>{if(!p)return;let o=setTimeout(()=>c(null),5e3);return()=>clearTimeout(o)},[p]),Z((o,r)=>{if(h){if(o==="y"||o==="Y"){let e=h.id;g(null),P(e).then(()=>{S(),c(`cancelled ${e.slice(0,8)}`)}).catch(n=>c(`cancel failed: ${n instanceof Error?n.message:String(n)}`))}else(o==="n"||o==="N"||r.escape)&&g(null);return}if(r.escape){if(d!=="none"){m("none");return}A();return}if(r.tab){m(e=>e==="list"?"form":e==="form"?"none":"list");return}if(o!=="q"&&d==="list"){if(r.upArrow)w(e=>Math.max(0,e-1));else if(r.downArrow)w(e=>Math.min(u.length-1,e+1));else if(o==="c"){let e=u[f];e&&(e.status==="running"||e.status==="queued"||e.status==="pending")&&g(e)}else if(o==="r"){let e=u[f],n=e?.result?.externalSessionId;e&&e.tool==="claude_code"&&n?(B({tool:"claude_code",projectPath:e.config.projectPath,resumeSessionId:n}),m("form")):c("resume needs a Claude Code session with a session id")}else if(o==="o"){let n=u[f]?.result?.externalSessionId;if(n){let O=process.env.RULEMETRIC_WEB_URL??"http://localhost:5174";import("node:child_process").then(({spawn:U})=>{U("open",[`${O}/sessions/${n}`],{detached:!0,stdio:"ignore"}).unref()})}}}});async function N(o){await I(o),B(null),m("list"),c("launched"),S()}return b(N,"handleSubmit"),a(l,{flexDirection:"column",borderStyle:"round",borderColor:T,width:_,paddingX:1,children:[a(l,{children:[t(s,{bold:!0,color:T,children:"Launcher"}),t(s,{dimColor:!0,children:" active org: "}),t(s,{children:F??"(none)"}),$&&t(s,{dimColor:!0,children:" loading\u2026"}),L&&a(s,{color:"#F55B5B",children:[" \u26A0 ",L]})]}),t(l,{marginTop:1,children:t(E,{jobs:u,selectedIndex:f,focused:d==="list"})}),t(l,{marginTop:1,children:t(J,{launchers:M,defaultProjectPath:x?.projectPath??y,defaultTool:x?.tool,defaultResumeSessionId:x?.resumeSessionId,focused:d==="form",onSubmit:N})}),h&&t(l,{marginTop:1,children:a(s,{color:"#FFD700",children:["Cancel job ",h.id.slice(0,8),"? (y/n)"]})}),p&&t(l,{marginTop:1,children:a(s,{dimColor:!0,children:["\xB7 ",p]})}),t(l,{marginTop:1,children:a(s,{dimColor:!0,children:["\u2191\u2193 select tab focus c cancel r resume o open esc ",d==="none"?"close":"back"]})})]})}b(K,"LauncherOverlay");export{K as a};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as a,f as m}from"./chunk-GIXHG5FK.js";import{a as s}from"./chunk-ZLLER3HP.js";var R=new Set([408,429,502,503,504]),_=12e4,T=2e4,b=1e3,f=15e3;function l(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[agent-loop] log_error event=${e.event}`)}}s(l,"structuredLog");function p(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let u=setTimeout(()=>{e.removeEventListener("abort",o),r(!0)},t),o=s(()=>{clearTimeout(u),e.removeEventListener("abort",o),r(!1)},"onAbort");e.addEventListener("abort",o,{once:!0})})}s(p,"abortableSleep");function d(t){return t instanceof a?R.has(t.statusCode):!0}s(d,"isRetryableReportError");function S(t){return t instanceof a&&t.statusCode===404}s(S,"isDefinitiveLeaseLoss");async function v(t,e,r){let u=Date.now()+r.budgetMs,o=b;for(let i=1;;i++)try{return await m(t,e),{ok:!0,attempts:i}}catch(n){let c=u-Date.now();if(!d(n)||c<=0||r.signal.aborted)return{ok:!1,attempts:i,error:n};if(l(r.log,{event:`${r.event}_retry`,jobId:r.jobId,attempt:i,status:n instanceof a?n.statusCode:void 0,error:n instanceof Error?n.message:String(n),retryInMs:Math.min(o,c)}),!await p(Math.min(o,c),r.signal))return{ok:!1,attempts:i,error:n};o=Math.min(o*2,f)}}s(v,"postReportWithRetry");export{R as a,_ as b,T as c,b as d,f as e,l as f,p as g,d as h,S as i,v as j};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as K,b as N,c as M,d as X,e as Y}from"./chunk-JU5ZNXPK.js";import{a as h}from"./chunk-5RBLIVBF.js";import{c as W}from"./chunk-VBGHPAUT.js";import{a as Z}from"./chunk-KR36ZDGN.js";import{b as ee}from"./chunk-HBDKOU2N.js";import{a as C,c as V}from"./chunk-FADINV4H.js";import{f as j}from"./chunk-SWSOEYC7.js";import{a as Q}from"./chunk-FG343JM3.js";import{a as q,f as B}from"./chunk-4GOXEEXZ.js";import{e as R,f as I,h as $}from"./chunk-GIXHG5FK.js";import{a as x}from"./chunk-ZLLER3HP.js";import{execFileSync as re}from"node:child_process";import{tmpdir as te}from"node:os";async function he(a,k){let{mirrorId:u,evalTargetId:p}=a,s=a.measurement?{...a.config,...V({...a.config,measurement:a.measurement})}:a.config,l=x(e=>k.logger.info(e),"log"),t=a.study?W.parse(a.study):null;if(t&&t.protocol.scope.engine!=="claude")throw new h("Frozen study isolation is currently verified only for Claude");if(t&&K(t.protocol)!==t.protocolHash)throw new h("Study snapshot hash mismatch");let P=await R(`/api/eval-targets/${p}`),d=a.candidateSnapshot?{...P,...a.candidateSnapshot}:P,c=await R(`/api/eval-targets/${p}/evals`);if(t&&(c=t.protocol.tasks.filter(e=>e.split===(t.protocol.analysis.role==="frozen_validation"?"validation":"exploration")).map(e=>({id:e.evalId,name:e.taskId,prompt:e.prompt,expectedOutput:"",expectations:[]}))),c.length===0&&s.generateIfEmpty){l("No eval cases on target \u2014 generating from content via local LLM...");let e=await ee({content:d.content,name:d.name,...a.measurement?{measurement:a.measurement}:{}});if(e===null)throw new Error("Case generation requires a local LLM backend (Claude or Codex CLI) \u2014 none available on this worker.");let r=[];for(let n of e)r.push(await I(`/api/eval-targets/${p}/evals`,n));c=r,l(`Generated ${r.length} eval case(s)`)}if(a.candidateSnapshot&&(c=c.slice(0,5)),c.length===0)throw new h("No evals defined for target");let _=null;if(t&&(_=re(t.protocol.scope.engine,["--version"],{encoding:"utf8",timeout:1e4}).trim(),_!==t.protocol.scope.harnessVersion))throw new h("Observed harness version differs from frozen protocol");if(t){if(s.engine!==t.protocol.scope.engine||s.model!==t.protocol.scope.model||s.runsPerEval!==t.protocol.analysis.repetitions||s.timeout!==t.protocol.analysis.maxSecondsPerCall*1e3||s.skipBaseline||new Date(t.protocol.scope.expiresAt)<=new Date)throw new h("Study execution configuration differs from frozen protocol or scope expired");for(let e of t.protocol.tasks.filter(r=>c.some(n=>n.id===r.evalId))){let r=j({baseDir:te(),engine:t.protocol.scope.engine});try{N(r.workDir,[...e.files,...e.oracleFiles]);let n=M(r.workDir,e);if(!n.primaryPassed||!n.safeguardsPassed)throw new h(`Oracle failed for ${e.taskId}; no actor calls started`)}finally{r.cleanup()}}}let ne=s.runsPerEval??1,D=s.timeout??12e4,H=t?1:s.iteration??1,S=new Set;if(k.job.attempts>1)for(let r=0;;r+=100){let n=await R(`/api/eval-targets/${p}/runs?jobId=${u}&limit=100&offset=${r}`);for(let i of n)S.add(`${i.evalId}|${i.configuration}|${i.runNumber}|${i.iteration}`);if(n.length<100)break}let T=[{name:"with_target",content:t?.protocol.treatment.content??d.content}];s.skipBaseline||T.push({name:"without_target",...t?{content:t.protocol.baseline.content}:{}});let f=[];for(let e of c)for(let r of T)for(let n=1;n<=ne;n++)S.has(`${e.id}|${r.name}|${n}|${H}`)||f.push({eval_:e,configuration:r.name,targetContent:r.content,runNumber:n});t&&f.sort((e,r)=>e.eval_.id.localeCompare(r.eval_.id)||e.runNumber-r.runNumber||((c.findIndex(n=>n.id===e.eval_.id)+e.runNumber)%2?e.configuration.localeCompare(r.configuration):r.configuration.localeCompare(e.configuration))),S.size>0&&l(`Resuming attempt ${k.job.attempts}: ${S.size} run(s) already persisted, ${f.length} remaining`);let m=f.length,v=0,w=q(s.engine),b=Math.min(s.parallel??1,4);await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:0,current:null,message:`Starting ${m} eval runs (concurrency: ${b})...`}});let y=[];async function F(e){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;l(`[${v+1}/${m}] ${r}`);let n=j({...t?{baseDir:te()}:{},targetType:t?"instruction":d.type,targetContent:e.targetContent,targetName:d.name,engine:w});n.leakedFiles.length&&l(`\u26A0 CONTAMINATED ${r}: ${n.leakedFiles.join(", ")} survived the strip`);try{let i=t?.protocol.tasks.find(U=>U.evalId===e.eval_.id),g=e.configuration==="with_target"?"treatment":"baseline";t&&i&&N(n.workDir,[...i.files,...t.protocol[g].files]);let O=t&&i?Y(n.workDir,i,t.protocol[g],w):null;t&&i&&await I(`/api/studies/${t.id}/calls`,{jobId:u,taskId:i.taskId,arm:g,repetition:e.runNumber});let o=await B({prompt:e.eval_.prompt,targetContent:t?e.targetContent:n.systemPrompt,...t?{appendTarget:!0}:{},workDir:n.workDir,timeout:D,model:s.model,engine:w,...t?{writableFixture:!0}:{}}),G={};!s.skipGrading&&e.eval_.expectations.length>0&&!o.error&&(G=await Q({...C({engine:w,model:s.model},{engine:s.graderEngine,model:s.graderModel}),prompt:e.eval_.prompt,output:o.output,expectations:e.eval_.expectations,timeout:D}));let A=t?X(t.protocol,o):null,L=t&&i?{studyId:t.id,protocolHash:t.protocolHash,taskId:i.taskId,arm:g,repetition:e.runNumber,eligible:A===null,exclusion:A,...M(n.workDir,i),deliveryHash:O.deliveryHash,fixtureHash:O.fixtureHash,harnessVersion:_,engine:o.engine??null,model:o.model??null,provider:o.engine==="claude"?"anthropic":o.provider??null,durationMs:o.durationMs,tokens:o.totalTokens||null,costUsd:o.costUsd??null}:null;return{jobId:u,evalId:e.eval_.id,evalTargetId:d.id,evalTargetVersion:d.version,configuration:e.configuration,runNumber:e.runNumber,iteration:H,status:o.error?"failed":"completed",outputs:{...L?{study:L}:{},...a.candidateSnapshot?{candidateHash:a.candidateSnapshot.contentHash,suggestionId:a.candidateSnapshot.suggestionId,evidenceKind:"constructed_evaluation"}:{},...o.usage?{usage:o.usage}:{},...o.error?{error:o.error}:{transcript:o.output,...o.model?{model:o.model}:{}},methodology:n.methodology,delivery:n.delivery,isolated:n.isWorktree,engine:o.engine??w,model:o.model??null,deliveryRegime:`${d.type}:${w}:${n.methodology}`,...a.measurement?{measurement:a.measurement}:{},...o.provider?{provider:o.provider}:{},...o.costUsd!=null?{costUsd:o.costUsd}:{},...n.leakedFiles.length?{leakedFiles:n.leakedFiles}:{}},timing:{duration_ms:o.durationMs,total_tokens:o.totalTokens},grading:G,worktree:n.isWorktree?!0:void 0}}finally{n.cleanup()}}if(x(F,"processItem"),b<=1)for(let e of f){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`,n=await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:r,message:`Executing ${r}...`}});if(a.candidateSnapshot&&n?.status==="cancelled")throw new h("Suggestion testing cancelled; no further actor calls");let i=await F(e);await I("/api/eval-runs",i),y.push(i),v++,await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:r,message:`Completed ${r}`}})}else{l(`Running ${m} evals with concurrency=${b} (worktree isolation)`);for(let e=0;e<f.length;e+=b){let r=f.slice(e,e+b),n=`batch ${Math.floor(e/b)+1}/${Math.ceil(f.length/b)}`;await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:n,message:`Executing ${n} (${r.length} parallel)...`}});let i=await Promise.all(r.map(F));for(let g of i)await I("/api/eval-runs",g),y.push(g),v++;await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:n,message:`Completed ${n}`}})}}let J=oe(y),E;if(!s.skipGrading&&y.some(e=>e.grading&&Object.keys(e.grading).length>0))try{l(`Running meta-judge for job ${u}...`);let e=c.map(r=>{let i=y.filter(g=>g.evalId===r.id&&g.configuration==="with_target")[0];return{evalName:r.name,prompt:r.prompt,expectations:r.expectations,grading:i?.grading?i.grading:null,output:i?.outputs?.transcript?.slice(0,500)}});E=await Z({...C({engine:w,model:s.model},{engine:s.graderEngine,model:s.graderModel}),targetName:d.name,evalResults:e,timeout:6e4}),l(`Meta-judge: quality=${E.quality_score}/5, issues=${E.issues.length}`)}catch(e){l(`Meta-judge failed (non-fatal): ${e instanceof Error?e.message:String(e)}`)}let z=E?{...J,meta_judgement:E}:J;return l(`Job ${u} completed: ${v}/${m} runs`),await $(`/api/eval-jobs/${u}/state`,{result:z}).catch(e=>{l(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),z}x(he,"processEval");function oe(a){let k=a.filter(l=>l.status==="completed"),u=a.filter(l=>l.status==="failed"),p=k.filter(l=>{let t=l.grading;return t&&Object.keys(t).length>0}),s=p.length>0?p.reduce((l,t)=>l+(t.grading?.summary?.pass_rate??0),0)/p.length:null;return{total:a.length,completed:k.length,failed:u.length,avgPassRate:s}}x(oe,"buildSummary");export{he as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as U,b as F}from"./chunk-
|
|
1
|
+
import{a as U,b as F}from"./chunk-ZBTJ5R7C.js";import{a as h,b as I}from"./chunk-ISYU5BMU.js";import{a as $,b as k,e as R}from"./chunk-LJRE3LZ2.js";import{d as w}from"./chunk-GYNZ3OZF.js";import{g as C,i as D,j as P}from"./chunk-UPFH72PF.js";import{e as v,f as x,i as j}from"./chunk-GIXHG5FK.js";import{D as b,F as S,G as T,o as A}from"./chunk-X6CF5KTW.js";import{a as l}from"./chunk-ZLLER3HP.js";import*as u from"node:fs";import*as m from"node:path";var O=new Set(["mcp","subagent","feature"]);function ie(e,t,n){return E(m.join(e,"CLAUDE.md"),t,n)}l(ie,"appendToCLAUDEmd");function E(e,t,n){let i=$(t),s=k(t),a=u.existsSync(e)?u.readFileSync(e,"utf8"):"";if(a.includes(i))return!1;let p=`${a.length>0&&!a.endsWith(`
|
|
2
2
|
`)?`
|
|
3
3
|
|
|
4
4
|
`:a.length>0?`
|
|
@@ -6,7 +6,7 @@ import{a as U,b as F}from"./chunk-6T6YFPBW.js";import{a as h,b as I}from"./chunk
|
|
|
6
6
|
${i}
|
|
7
7
|
${n}
|
|
8
8
|
${s}
|
|
9
|
-
`;return u.mkdirSync(m.dirname(e),{recursive:!0}),u.writeFileSync(e,a+p,"utf8"),!0}l(
|
|
10
|
-
`+d.replace(/^\n+/,"")).replace(/^\n+/,"");return u.writeFileSync(e,o,"utf8"),!0}l(
|
|
11
|
-
already covered by ${f.matchedSource??f.matchedId} (${(f.similarity*100).toFixed(0)}% match): "${g(f.matchedDirective)}"`),...y?[]:["Still wanted, and not adopted:",...r.novel.map(f=>` "${g(f)}"`),"Propose those on their own and they can be adopted, tracked and undone individually."],"Add it anyway with `--force` if the overlap is not real."]}}}if(i.type==="skill")return H(e,{...i,id:n});if(i.type==="hook")return F(e,{...i,id:n});if(O.has(i.type??""))return{action:"manual-required",instructionId:n,name:i.name,fileModified:!1,messages:[`Not installed: ${i.name} is a ${i.type} artifact, and installing one runs code or edits tool configuration \u2014 that always requires a human.`,` Review it: rulemetric instructions get ${n}`,"Nothing was written. This proposal will keep appearing until you act on it or dismiss it."]};let p=
|
|
12
|
-
repeats ${r.matchedSource??r.matchedId} (${(r.similarity*100).toFixed(0)}%): "${g(r.matchedDirective)}"`)]:[];return{action:d?"added":"already-present",instructionId:n,name:i.name,fileModified:d,partialOverlap:d?c:void 0,messages:d?[`Accepted: added ${i.name} to ${p.map(r=>m.relative(e.dir,r.path)).join(", ")}. It will be active starting in your next session.`,...o]:[`Already present: ${i.name} is already in CLAUDE.md (block id: ${n}).`]}}l(ae,"acceptSuggestion");async function H(e,t){if(!e.force){let o=
|
|
9
|
+
`;return u.mkdirSync(m.dirname(e),{recursive:!0}),u.writeFileSync(e,a+p,"utf8"),!0}l(E,"appendBlockToFile");function N(e,t,n,i={}){return w(e,i).filter(s=>E(s.path,t,n))}l(N,"appendToAgentInstructionFiles");function _(e,t,n={}){return w(e,n).filter(i=>L(i.path,t))}l(_,"removeFromAgentInstructionFiles");function re(e,t){return L(m.join(e,"CLAUDE.md"),t)}l(re,"removeFromCLAUDEmd");function L(e,t){if(!u.existsSync(e))return!1;let n=$(t),i=k(t),s=u.readFileSync(e,"utf8"),a=s.indexOf(n);if(a===-1)return!1;let c=s.indexOf(i,a);if(c===-1)return!1;let p=s.slice(0,a),d=s.slice(c+i.length),o=(p.replace(/\n+$/,"")+`
|
|
10
|
+
`+d.replace(/^\n+/,"")).replace(/^\n+/,"");return u.writeFileSync(e,o,"utf8"),!0}l(L,"removeBlockFromFile");function g(e,t=90){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}l(g,"truncate");function q(e){return v(`/api/instruction-suggestions/${encodeURIComponent(e)}`)}l(q,"fetchSuggestion");async function ae(e){let t=e.suggestion??await q(e.suggestionId);if(t.kind==="remove")return B(e,t);if(t.kind==="trim")return K(e,t);if(t.broadAdoptionAllowed===!1)throw new Error("Scoped study owns delivery; no broad adoption authority");let n=t.instructionId;t.instructionScope==="public"&&(n=(await x(`/api/instructions/${encodeURIComponent(t.instructionId)}/promote-from-public`,{targetScope:"personal"})).instructionId);let i=await v(`/api/instructions/${encodeURIComponent(n)}`),a=i.type!=="skill"&&i.type!=="hook"&&!O.has(i.type??"")?T(i.content,r=>u.existsSync(m.join(e.dir,r))):[];if(a.length>0)return await I(e.suggestionId,e.projectPath,n,e.actor,"unresolvable_reference"),{action:"unresolvable-reference",instructionId:n,name:i.name,fileModified:!1,unresolvable:a,messages:[`Refused: ${i.name} tells the agent to run something this project does not have.`,...a.map(r=>` ${r.path} \u2014 no such file under ${e.dir}`),"Nothing was written. A confident instruction pointing at a file that is not there costs every future session the time it takes to discover that."]};let c;if(!e.force){let r=b(i.content,R(e.dir)),M=e.actor==="auto"?r.matches.length>0:r.redundant;if(!r.redundant&&r.matches.length>0&&(c=r),M){let y=r.redundant;return await I(e.suggestionId,e.projectPath,n,e.actor,y?"redundant":"partial_overlap"),{action:"redundant",instructionId:n,name:i.name,fileModified:!1,redundancy:r,partialOverlap:y?void 0:r,messages:[y?`Skipped: ${i.name} already applies here in different words \u2014 adding it would spend context to say the same thing twice.`:`Refused: ${r.matches.length} of ${r.matches.length+r.novel.length} asks in ${i.name} are already covered here, so adopting it would restate the file back at itself.`,...r.matches.map(f=>` "${g(f.directive)}"
|
|
11
|
+
already covered by ${f.matchedSource??f.matchedId} (${(f.similarity*100).toFixed(0)}% match): "${g(f.matchedDirective)}"`),...y?[]:["Still wanted, and not adopted:",...r.novel.map(f=>` "${g(f)}"`),"Propose those on their own and they can be adopted, tracked and undone individually."],"Add it anyway with `--force` if the overlap is not real."]}}}if(i.type==="skill")return H(e,{...i,id:n});if(i.type==="hook")return F(e,{...i,id:n});if(O.has(i.type??""))return{action:"manual-required",instructionId:n,name:i.name,fileModified:!1,messages:[`Not installed: ${i.name} is a ${i.type} artifact, and installing one runs code or edits tool configuration \u2014 that always requires a human.`,` Review it: rulemetric instructions get ${n}`,"Nothing was written. This proposal will keep appearing until you act on it or dismiss it."]};let p=N(e.dir,n,i.content),d=p.length>0;await h(e.suggestionId,e.projectPath,n,e.actor);let o=d&&c?[` Note: ${c.matches.length} of ${c.matches.length+c.novel.length} asks in this rule already appear elsewhere in context; it was added for the rest.`,...c.matches.map(r=>` "${g(r.directive)}"
|
|
12
|
+
repeats ${r.matchedSource??r.matchedId} (${(r.similarity*100).toFixed(0)}%): "${g(r.matchedDirective)}"`)]:[];return{action:d?"added":"already-present",instructionId:n,name:i.name,fileModified:d,partialOverlap:d?c:void 0,messages:d?[`Accepted: added ${i.name} to ${p.map(r=>m.relative(e.dir,r.path)).join(", ")}. It will be active starting in your next session.`,...o]:[`Already present: ${i.name} is already in CLAUDE.md (block id: ${n}).`]}}l(ae,"acceptSuggestion");async function H(e,t){if(!e.force){let o=S({name:t.name,content:t.content},D(e.dir));if(o)return await I(e.suggestionId,e.projectPath,t.id,e.actor),{action:"redundant",instructionId:t.id,name:t.name,fileModified:!1,duplicateOf:o,messages:[`Skipped: ${t.name} is already installed here as ${o.name}`+(o.reason==="name-stem"?" (same skill, different content-hash suffix).":` (${(o.similarity*100).toFixed(0)}% identical body).`),` Installed: ${P(e.dir,o.name)}`,"A second copy is not more available \u2014 it is one more thing to keep in sync."]}}let n=C({dir:e.dir,name:t.name,content:t.content,description:t.description}),i=[...n.warnings],s=[m.relative(e.dir,n.skillFile)];n.linkKind!=="none"&&s.push(m.relative(e.dir,n.linkPath));let a={boundaryClass:"inside",targets:s,requires:[],provides:[`skill:${n.dirName}`]},c={kind:"delete-paths",paths:s},p=A(a,c);if(p.length===0)try{await U({instructionId:t.id,projectPath:e.projectPath,targetPath:n.skillFile,beforeHash:"",appliedHash:"",boundaryClass:a.boundaryClass,targets:a.targets,inverse:c,requires:a.requires,provides:a.provides,applyMode:e.actor==="auto"?"auto":"human"})}catch(o){i.push(`the effect ledger did not record this install (${o instanceof Error?o.message:String(o)}) \u2014 \`suggestions undo\` will not remove it; delete ${s.join(" and ")} by hand.`)}else i.push(`no reversible inverse could be recorded (${p.map(o=>o.message).join("; ")}).`);await h(e.suggestionId,e.projectPath,t.id,e.actor);let d=[`Accepted: installed skill ${n.dirName} to ${m.relative(e.dir,n.skillFile)}.`];n.linkKind==="none"&&d.push("Claude Code will NOT see it yet \u2014 its path is taken by a directory this command did not create."),d.push("It loads on demand, so it costs no context until a task matches its description."),d.push(`Undo with: rulemetric suggestions undo ${t.id}`);for(let o of i)d.push(` Warning: ${o}`);return{action:"added",instructionId:t.id,name:t.name,fileModified:!0,messages:d}}l(H,"acceptSkill");async function K(e,t){let n=t.estimatedTokens?` It currently costs roughly ${t.estimatedTokens} tokens per session (estimated).`:"";return await h(e.suggestionId,e.projectPath,t.instructionId,e.actor),{action:"acknowledged",instructionId:t.instructionId,name:t.name,fileModified:!1,messages:[`Noted: ${t.name} is measured neutral, not harmful.${n}`,"Nothing was changed \u2014 trimming is a judgement call about which parts carry the value,","and the measurement only found the absence of a detectable effect, not which half to cut.",` View it: rulemetric instructions get ${t.instructionId}`," Then edit CLAUDE.md (or the instruction) and let the next measurement cycle re-check it.","This suggestion will stop re-surfacing."]}}l(K,"acknowledgeTrim");async function B(e,t){let n=_(e.dir,t.instructionId).length>0;await j(`/api/instructions/${encodeURIComponent(t.instructionId)}`);let i=t.estimatedTokens?` Frees roughly ${t.estimatedTokens} tokens of context per session (estimated).`:"",s=n?[`Retired: removed ${t.name} from CLAUDE.md and archived it.${i}`]:[`Archived ${t.name}.${i}`,"CLAUDE.md was not modified \u2014 no rulemetric-managed block for this instruction was found in this directory. If you added it by hand, remove it yourself."];return s.push("Undo with: rulemetric instructions restore "+t.instructionId),await h(e.suggestionId,e.projectPath,t.instructionId,e.actor),{action:n?"retired":"archived-only",instructionId:t.instructionId,name:t.name,fileModified:n,messages:s}}l(B,"acceptRemoval");export{ie as a,E as b,N as c,_ as d,re as e,L as f,q as g,ae as h};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e as g,f as m}from"./chunk-GIXHG5FK.js";import{a as l}from"./chunk-ZLLER3HP.js";async function f(c,p){let r=l(e=>p?.logger?.info?.(e)??console.log(e),"log"),{projectPath:o}=c,i=`[cron_instruction_training] ${o}`;if(!o)return{skipped:"no-project-path"};let n=await m("/api/instruction-experiments/settle",{projectPath:o}),a=n.settled.map(e=>e.outcome),d=a.filter(e=>e==="graduated").length;for(let e of n.settled)r(`${i}: experiment ${e.experimentId} \u2192 ${e.outcome}`);n.examined>0&&r(`${i}: examined ${n.examined} running experiment(s) \u2014 ${n.settled.length} settled (${d} graduated), ${n.stillRunning} still gathering`);let t=await g(`/api/instruction-suggestions/trialable?projectPath=${encodeURIComponent(o)}`);for(let e of t.refused)r(`${i}: not trialling "${e.name}" \u2014 ${e.reason}`);if(t.candidates.length===0)return r(`${i}: no new trial started (${t.running}/${t.limits.maxConcurrent} running, ${t.slots} slot(s) free)`),{examined:n.examined,settled:n.settled.length,graduated:d,nominated:0,running:t.running,outcomes:a};let u=0;for(let e of t.candidates)try{let s=await m(`/api/instruction-suggestions/${e.id}/test`,{});if(s.existing){r(`${i}: comparison already recorded for "${e.name}" (${s.evalJobId})`);continue}u+=1,r(`${i}: queued bounded comparison and live-study preparation for "${e.name}"`)}catch(s){r(`${i}: could not measure "${e.name}" \u2014 ${s instanceof Error?s.message:String(s)}`)}return{examined:n.examined,settled:n.settled.length,graduated:d,nominated:u,queued:u,running:t.running,outcomes:a}}l(f,"cronInstructionTraining");export{f as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{h as o}from"./chunk-CVPAKEEZ.js";import{g as f}from"./chunk-
|
|
1
|
+
import{h as o}from"./chunk-CVPAKEEZ.js";import{g as f}from"./chunk-DHIEGG4T.js";import{b as y,e as m,h as d}from"./chunk-GIXHG5FK.js";import{a as S}from"./chunk-ZLLER3HP.js";var _=1800*1e3,G=300*1e3,R=10,T=`Given these messages from an AI coding session, write a 1-2 sentence summary of what the user is trying to accomplish. Focus on the goal, not the steps. No preamble.
|
|
2
2
|
|
|
3
3
|
Return strict JSON in the form: {"goalSummary": "..."}`;async function N(n,e={}){let w=e.llm??f,i=e.now??Date.now,v=e.getSession??(async s=>{try{return await o(()=>m(`/api/sessions/${s}`),{label:"session detail",idempotent:!0})}catch(t){if(t instanceof y&&t.statusCode===404)return null;throw t}}),l=e.getEvents??((s,t)=>o(()=>m(`/api/sessions/${s}/events?limit=${t.limit}&sort=${t.sort}`),{label:"session events",idempotent:!0})),P=e.saveGoal??(async(s,t)=>{await o(()=>d(`/api/sessions/${s}/enrich`,{analysis:t}),{label:"session enrich"})}),r=await v(n.sessionId);if(!r)return{skipped:"not_found"};let[A]=await l(n.sessionId,{limit:1,sort:"desc"}),h=new Date(A?.timestamp??r.startedAt).getTime();if(i()-h>_)return{skipped:"stale"};let c=r.analysis??{},g=c.goalSummaryAt?new Date(c.goalSummaryAt).getTime():0;if(g&&i()-g<G)return{skipped:"recent"};let u=(await l(n.sessionId,{limit:R*2,sort:"asc"})).filter(s=>s.content&&(s.eventType==="user_message"||s.eventType==="assistant_response")).map(s=>`${s.eventType==="user_message"?"USER":"ASSISTANT"}: ${s.content}`).join(`
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as p}from"./chunk-T7HZZ4DJ.js";import{g as l}from"./chunk-
|
|
1
|
+
import{b as p}from"./chunk-T7HZZ4DJ.js";import{g as l}from"./chunk-DHIEGG4T.js";import{a}from"./chunk-ZLLER3HP.js";var g=5,h=a(e=>e==null?"n/a":`${Math.round(e*100)}%`,"pct");function b(e){return!e||e.length===0?"":`
|
|
2
2
|
|
|
3
3
|
## Prior cases that FAILED to discriminate \u2014 do NOT reproduce these
|
|
4
4
|
The cases below were run WITH and WITHOUT the instruction and did NOT separate the two
|