@rulemetric/cli 0.14.2 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-5PMTNNA6.js → chunk-2U6PAYCD.js} +1 -1
- package/dist/{chunk-6AAAHV2B.js → chunk-3H44B6PB.js} +1 -1
- package/dist/chunk-4GOXEEXZ.js +1 -0
- package/dist/{chunk-H4QPAEEA.js → chunk-5GFEEYHM.js} +1 -1
- package/dist/{chunk-RYCVPQYK.js → chunk-5IL3EEIE.js} +1 -1
- package/dist/{chunk-VCUW2NAP.js → chunk-5Z6XXOJL.js} +1 -1
- package/dist/{chunk-Q36QSFSB.js → chunk-6QMIDH6X.js} +1 -1
- package/dist/{chunk-H2FMAJUJ.js → chunk-7LE2W3WP.js} +1 -1
- package/dist/{chunk-6TGFU6RU.js → chunk-7LFCZI64.js} +1 -1
- package/dist/{chunk-7H4HJ2RV.js → chunk-BU3ZGLQG.js} +1 -1
- package/dist/{chunk-QENSCK77.js → chunk-CIKQXFQ2.js} +1 -1
- package/dist/{chunk-ISFPPDDB.js → chunk-D5XLTSRV.js} +1 -1
- package/dist/{chunk-RR7V5CK5.js → chunk-EE4TZAZI.js} +1 -1
- package/dist/{chunk-T47SFA5X.js → chunk-FADINV4H.js} +1 -1
- package/dist/{chunk-DVU5PHPM.js → chunk-FG343JM3.js} +1 -1
- package/dist/chunk-GJHFIQVO.js +28 -0
- package/dist/{chunk-LB24UKHZ.js → chunk-GYKYJJNF.js} +1 -1
- package/dist/{chunk-DXNUCWUX.js → chunk-HXOQUYG3.js} +1 -1
- package/dist/{chunk-HM63AB2C.js → chunk-IFIWDL7G.js} +1 -1
- package/dist/chunk-ISEUEYSC.js +1 -0
- package/dist/chunk-JIW2PCHU.js +1 -0
- package/dist/chunk-JNLDISBA.js +4 -0
- package/dist/{chunk-FS3TAQAE.js → chunk-JOXTWLLK.js} +1 -1
- package/dist/chunk-JU5ZNXPK.js +1 -0
- package/dist/chunk-KFNFLMUR.js +3 -0
- package/dist/{chunk-7MTYUTUN.js → chunk-KR36ZDGN.js} +1 -1
- package/dist/{chunk-O4K4M5G6.js → chunk-LJE5J3EW.js} +1 -1
- package/dist/{chunk-PXYK4MBX.js → chunk-LLXC5SRC.js} +1 -1
- package/dist/{chunk-WIKCYUZC.js → chunk-OAETRNTE.js} +1 -1
- package/dist/{chunk-KOYHJFB3.js → chunk-PDXHRF4E.js} +1 -1
- package/dist/{chunk-F5PJN2EY.js → chunk-Q7IDLOSP.js} +1 -1
- package/dist/{chunk-ZK3ACE4T.js → chunk-T7HZZ4DJ.js} +1 -1
- package/dist/{chunk-5VNEHPGC.js → chunk-TQM7MF5C.js} +1 -1
- package/dist/{chunk-EBWV4SUS.js → chunk-U3PIBPHT.js} +1 -1
- package/dist/chunk-UNVURR4E.js +1 -0
- package/dist/{chunk-VXNICAVG.js → chunk-VUNJGZPP.js} +1 -1
- package/dist/{chunk-J6RQ5AH2.js → chunk-W6MMJRFZ.js} +1 -1
- package/dist/{chunk-XZW5ZHFC.js → chunk-WQFR2LOY.js} +1 -1
- package/dist/chunk-WVNTUKED.js +1 -0
- package/dist/{chunk-XIOYV5A7.js → chunk-X3BBFDRD.js} +1 -1
- package/dist/{chunk-7BCZDVIU.js → chunk-XCH4HPEZ.js} +1 -1
- package/dist/{chunk-RSVNQ2XI.js → chunk-YXMAGC53.js} +1 -1
- package/dist/chunk-ZMVTSYD4.js +1 -0
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/evals/agent.js +1 -1
- package/dist/commands/evals/auto-run.js +1 -1
- package/dist/commands/evals/benchmark.js +1 -1
- package/dist/commands/evals/compare.js +1 -1
- package/dist/commands/evals/optimize-description.js +1 -1
- package/dist/commands/evals/optimize.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/evals/run.js +1 -1
- package/dist/commands/evals/validate-judge.js +1 -1
- package/dist/commands/sessions/list.js +1 -1
- package/dist/dashboard/Dashboard.js +1 -1
- package/dist/dashboard/data.js +1 -1
- package/dist/{dist-GSHUC7UU.js → dist-OVXV2FFO.js} +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/codex-exec.js +1 -1
- package/dist/lib/eval-analyzer.js +1 -1
- package/dist/lib/eval-benchmark.js +1 -1
- package/dist/lib/eval-candidate-run.js +1 -1
- package/dist/lib/eval-case-generator.js +1 -1
- package/dist/lib/eval-conversation-handler.js +1 -1
- package/dist/lib/eval-executor.js +1 -1
- package/dist/lib/eval-grader.js +1 -1
- package/dist/lib/eval-meta-judge.js +1 -1
- package/dist/lib/eval-resume.js +1 -1
- package/dist/lib/eval-run-batch.js +1 -1
- package/dist/lib/eval-trigger-tester.js +1 -1
- package/dist/lib/evolution-cost.js +1 -1
- package/dist/lib/evolution-enrolment.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/instruction-restoration.js +1 -0
- package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
- package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
- package/dist/lib/jobs/handlers/cron-refresh-pricing.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/process-changelog.js +1 -1
- package/dist/lib/jobs/handlers/process-conversation.js +1 -1
- package/dist/lib/jobs/handlers/process-eval.js +1 -1
- package/dist/lib/jobs/handlers/process-insights.js +1 -1
- package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
- package/dist/lib/jobs/handlers/process-launch.js +1 -1
- package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
- package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
- package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
- package/dist/lib/judge-review-runner.js +1 -1
- package/dist/lib/llm-client.js +1 -1
- package/dist/lib/manual-tasks.js +1 -1
- package/dist/lib/measurement-llm.js +1 -1
- package/dist/lib/optimize-compare.js +1 -1
- package/dist/lib/projects/workspace/worktree.js +1 -1
- package/dist/lib/refine-cases.js +1 -1
- package/dist/lib/study-fixture.js +1 -0
- package/oclif.manifest.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-3NWJ7CZ2.js +0 -1
- package/dist/chunk-FBSZ6KCM.js +0 -1
- package/dist/chunk-H33XYL7O.js +0 -1
- package/dist/chunk-Q776YUBD.js +0 -1
- package/dist/chunk-SG4UDDHB.js +0 -4
- package/dist/chunk-T75KAEJO.js +0 -25
- package/dist/chunk-VBXL7XO7.js +0 -1
- package/dist/chunk-ZTQUGAZG.js +0 -1
package/dist/chunk-T75KAEJO.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import{a as l,b as Mt}from"./chunk-ZLLER3HP.js";var Ve=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Ke=["user_message","assistant_message","assistant_response","tool_call","tool_result","thinking","error"];var qt=new Set(["","unknown","<synthetic>"]);function Jt(e){if(typeof e!="string")return null;let t=e.trim();return qt.has(t)?null:t}l(Jt,"resolveEventModel");var A=class{static{l(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
|
|
2
|
-
`).filter(p=>p.trim()),o=[];for(let p of n)try{o.push(JSON.parse(p))}catch{}let s=o.filter(p=>p.type==="user"||p.type==="assistant"),r=null,i=null,c={},a=o.find(p=>p.type==="user");a&&(r=a.cwd??null,i=a.gitBranch??null,a.version&&(c.claudeCodeVersion=a.version),a.sessionId&&(c.sessionId=a.sessionId));let u=o.find(p=>p.type==="assistant");u?.message?.model&&(c.model=u.message.model);let d=[],f=0;for(let p of s){let y=p.timestamp??new Date().toISOString();if(p.type==="user"){let g=p.message?.content;if(typeof g=="string")d.push({sequence:f++,eventType:"user_message",content:g,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{}});else if(Array.isArray(g))for(let _ of g)_.type==="tool_result"&&d.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(p.type==="assistant"){let g=Array.isArray(p.message?.content)?p.message.content:[],_=p.message?.usage,x=_?{input:_.input_tokens??0,output:_.output_tokens??0,cacheRead:_.cache_read_input_tokens??0,cacheWrite:_.cache_creation_input_tokens??0}:null,v={};p.message?.model&&(v.model=p.message.model);let w=Jt(p.message?.model);p.message?.stop_reason&&(v.stopReason=p.message.stop_reason),p.requestId&&(v.requestId=p.requestId),_?.service_tier&&(v.serviceTier=_.service_tier),_?.speed&&(v.speed=_.speed),_?.cache_creation&&(v.cacheCreationDetail=_.cache_creation),_?.server_tool_use&&(v.serverToolUse=_.server_tool_use);for(let S of g)S.type==="text"?d.push({sequence:f++,eventType:"assistant_message",content:S.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:x,model:w,timestamp:y,metadata:v}):S.type==="thinking"?d.push({sequence:f++,eventType:"thinking",content:S.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:x,model:w,timestamp:y,metadata:v}):S.type==="tool_use"&&d.push({sequence:f++,eventType:"tool_call",content:null,toolName:S.name??"unknown",toolInput:S.input??null,toolOutput:null,tokenUsage:x,model:w,timestamp:y,metadata:{...v,toolUseId:S.id}})}}let m=d.map(p=>p.timestamp).sort(),h=new Date().toISOString();return{tool:"claude_code",projectPath:r,gitBranch:i,startedAt:m[0]??h,endedAt:m[m.length-1]??null,events:d,metadata:c}}};var N=class{static{l(this,"CursorAdapter")}tool="cursor";parse(t){let n=Mt("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((u,d)=>{let f=u.createdAt?new Date(u.createdAt).getTime():0;return(d.createdAt?new Date(d.createdAt).getTime():0)-f})[0],r=s.conversation??[],i=[];for(let u=0;u<r.length;u++){let d=r[u],f=d.createdAt??new Date().toISOString();i.push({sequence:u,eventType:d.type===1?"user_message":"assistant_message",content:d.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let c=i.map(u=>u.timestamp).sort(),a=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:c[0]??a,endedAt:c[c.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 P=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 u=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:u,metadata:{}}),a.response){let d=a.response.timestamp?new Date(a.response.timestamp).toISOString():u;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:d,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??c,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 b=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 u=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:u,metadata:{}}),a.toolCalls)for(let d of a.toolCalls){let f=d.timestamp?new Date(d.timestamp).toISOString():u;s.push({sequence:r++,eventType:"tool_call",content:null,toolName:d.name??"unknown",toolInput:d.input??null,toolOutput:d.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(a.response){let d=a.response.timestamp?new Date(a.response.timestamp).toISOString():u;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:d,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??c,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,c)=>({sequence:i.sequence??c,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 Q(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
|
|
3
|
-
|
|
4
|
-
`):""}l(Q,"textFromBlocks");function Gt(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(Gt,"tokenUsageFromCodex");function Lt(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}l(Lt,"normalizeTimestamp");function tt(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}l(tt,"freshCodexState");var C=class{static{l(this,"CodexAdapter")}tool="codex";parse(t){let n=tt(),{events:o,projectPath:s,gitBranch:r,metadata:i}=this.parseLines(t,n),c=o.map(u=>u.timestamp).sort(),a=new Date().toISOString();return{tool:"codex",projectPath:s,gitBranch:r,startedAt:c[0]??a,endedAt:c[c.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
|
-
`).filter(d=>d.trim()),s=[],r={},i=n.callNames,c=null,a=null,u=null;for(let d of o){let f;try{f=JSON.parse(d)}catch{continue}let m=f.payload;if(!m)continue;let h=Lt(f.timestamp);if(f.type==="session_meta"){u=m.session_id??m.id??u,c=m.cwd??c,m.git_branch&&(a=m.git_branch),m.model&&(n.model=m.model),r.sessionId=u,r.codexSessionId=u,r.originator=m.originator,r.source=m.source,r.modelProvider=m.model_provider,r.codexCliVersion=m.cli_version;continue}if(f.type==="turn_context"){c=m.cwd??c,m.model&&(n.model=m.model,r.model=m.model);continue}if(f.type==="response_item"&&m.type==="message"){if(m.role==="user"){let p=Q(m.content,["input_text"]);if(!p)continue;s.push({sequence:n.sequence++,eventType:"user_message",content:p,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:h,metadata:{}})}else if(m.role==="assistant"){let p=Q(m.content,["output_text"]);if(!p)continue;s.push({sequence:n.sequence++,eventType:"assistant_message",content:p,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:h,metadata:n.model?{model:n.model}:{}})}continue}if(f.type==="response_item"&&m.type==="function_call"){let p=m.name??"unknown";m.call_id&&(i[m.call_id]=p);let y=typeof m.arguments=="string"?Bt(m.arguments):{};s.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:p,toolInput:y&&typeof y=="object"&&!Array.isArray(y)?y:{arguments:y},toolOutput:null,tokenUsage:null,model:n.model,timestamp:h,metadata:{callId:m.call_id}});continue}if(f.type==="response_item"&&m.type==="function_call_output"){let p=m.call_id?i[m.call_id]??null:null;s.push({sequence:n.sequence++,eventType:"tool_result",content:m.output??null,toolName:p,toolInput:null,toolOutput:m.output==null?null:{output:m.output},tokenUsage:null,model:n.model,timestamp:h,metadata:{callId:m.call_id}});continue}if(f.type==="event_msg"&&m.type==="token_count"){let p=m.info,y=p?.total_token_usage?.total_tokens??0;if(y>0&&y===n.prevCumulativeTotal)continue;y>0&&(n.prevCumulativeTotal=y);let g=Gt(p?.last_token_usage??p?.total_token_usage);if(!g)continue;let _=p?.model??p?.model_name??n.model;s.push({sequence:n.sequence++,eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:g,model:_??null,timestamp:h,metadata:{codexEventType:"token_count",..._?{model:_}:{},reasoningOutputTokens:p?.last_token_usage?.reasoning_output_tokens??0,usage:{input_tokens:g.input,output_tokens:g.output,cache_read_input_tokens:g.cacheRead??0,cache_creation_input_tokens:g.cacheWrite??0}}})}}return{events:s,projectPath:c,gitBranch:a,sessionId:u,metadata:r}}};function et(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(et,"timestamp");function ot(e){return Array.isArray(e.content)?e.content:[]}l(ot,"blocks");function nt(e){return typeof e.content=="string"?e.content:ot(e).filter(t=>t.type==="text").map(t=>t.text??"").filter(Boolean).join(`
|
|
6
|
-
|
|
7
|
-
`)}l(nt,"messageText");function Ft(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(Ft,"usageOf");var j=class{static{l(this,"PiAdapter")}tool="pi";parse(t){let n=[],o={},s=null,r=null,i=null,c=null,a=l(f=>{n.push({sequence:n.length,...f})},"push");for(let f of t.split(`
|
|
8
|
-
`)){if(!f.trim())continue;let m;try{m=JSON.parse(f)}catch{continue}if(m.type==="session"){r||(r=et(m.timestamp)),s=m.cwd??s,o.sessionId=m.id,o.piSessionId=m.id,o.sessionVersion=m.version;continue}if(m.type==="model_change"){i=m.provider??i,c=m.modelId??c,i&&(o.provider=i),c&&(o.model=c);continue}if(m.type!=="message"||!m.message)continue;let h=m.message,p=et(m.timestamp,h.timestamp);if(i=h.provider??i,c=h.model??c,i&&(o.provider=i),c&&(o.model=c),h.role==="user"){let g=nt(h);if(!g)continue;a({eventType:"user_message",content:g,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}});continue}if(h.role==="toolResult"){let g=nt(h);a({eventType:"tool_result",content:g||null,toolName:h.toolName??null,toolInput:null,toolOutput:{content:g,details:h.details??null,isError:h.isError??!1},tokenUsage:null,model:c,timestamp:p,metadata:{toolCallId:h.toolCallId,isError:h.isError??!1}});continue}if(h.role!=="assistant")continue;if(h.stopReason==="error"||h.stopReason==="aborted"){a({eventType:"error",content:h.errorMessage??`Pi stopped with ${h.stopReason}`,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:c,timestamp:p,metadata:{provider:i,stopReason:h.stopReason}});continue}for(let g of ot(h))g.type==="thinking"&&g.thinking?a({eventType:"thinking",content:g.thinking,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:c,timestamp:p,metadata:{provider:i}}):g.type==="text"&&g.text?a({eventType:"assistant_message",content:g.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:c,timestamp:p,metadata:{provider:i}}):g.type==="toolCall"&&g.name&&a({eventType:"tool_call",content:null,toolName:g.name,toolInput:g.arguments??{},toolOutput:null,tokenUsage:null,model:c,timestamp:p,metadata:{provider:i,toolCallId:g.id}});let y=Ft(h.usage);y&&a({eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:y,model:c,timestamp:p,metadata:{piEventType:"assistant_usage",provider:i,responseId:h.responseId,stopReason:h.stopReason,costUsd:h.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 u=n.map(f=>f.timestamp).sort(),d=new Date().toISOString();return{tool:"pi",projectPath:s,gitBranch:null,startedAt:r??u[0]??d,endedAt:u[u.length-1]??null,events:n,metadata:o}}};var Wt={claude_code:l(()=>new A,"claude_code"),cursor:l(()=>new N,"cursor"),vscode_copilot:l(()=>new P,"vscode_copilot"),copilot_agent:l(()=>new b,"copilot_agent"),rulemetric_mcp:l(()=>new D,"rulemetric_mcp"),codex:l(()=>new C,"codex"),pi:l(()=>new j,"pi")};function Ht(e){let t=Wt[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}l(Ht,"getAdapter");function zt(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
|
|
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(zt,"detectTool");import{readdir as F,stat as W}from"fs/promises";import{basename as Vt,join as I}from"path";import{homedir as $}from"os";var Kt={"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 Xt(){return process.env.CLAUDE_CONFIG_DIR||I($(),".claude")}l(Xt,"getClaudeDir");function Yt(){return I(Xt(),"projects")}l(Yt,"getProjectsDir");function Zt(){return process.platform==="darwin"?I($(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?I($(),"AppData","Roaming","Claude","local-agent-mode-sessions"):I($(),".config","Claude","local-agent-mode-sessions")}l(Zt,"getDesktopSessionsDir");async function Qt(e){let t=[];async function n(o,s){if(s>8)return;let r=await F(o).catch(()=>[]);for(let i of r){if(i==="node_modules"||i===".git")continue;let c=I(o,i);if((await W(c).catch(()=>null))?.isDirectory())if(i==="projects"){let u=await F(c).catch(()=>[]);for(let d of u){let f=I(c,d);(await W(f).catch(()=>null))?.isDirectory()&&t.push(f)}}else await n(c,s+1)}}return l(n,"walk"),await n(e,0),t}l(Qt,"findDesktopProjectDirs");var st={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,o]of Object.entries(Kt))if(t.startsWith(n))return o;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=Yt();try{let o=await F(t);for(let s of o){let r=I(t,s);(await W(r).catch(()=>null))?.isDirectory()&&e.push({path:r,project:s,provider:"claude"})}}catch{}let n=await Qt(Zt());for(let o of n)e.push({path:o,project:Vt(o),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}};import{readdir as U,readFile as rt,stat as te}from"fs/promises";import{basename as ee,join as O}from"path";import{homedir as ne}from"os";var oe={"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"},at={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 se(){return process.env.CODEX_HOME??O(ne(),".codex")}l(se,"getCodexDir");function re(e){return e.replace(/^\//,"").replace(/\//g,"-")}l(re,"sanitizeProject");async function ae(e){try{let n=(await rt(e,"utf-8")).split(`
|
|
11
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(ae,"readFirstLine");async function ie(e){let t=await ae(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(ie,"isValidCodexSession");async function le(e){let t=O(e,"sessions"),n=[],o;try{o=await U(t)}catch{return n}for(let s of o){if(!/^\d{4}$/.test(s))continue;let r=O(t,s),i=await U(r).catch(()=>[]);for(let c of i){if(!/^\d{2}$/.test(c))continue;let a=O(r,c),u=await U(a).catch(()=>[]);for(let d of u){if(!/^\d{2}$/.test(d))continue;let f=O(a,d),m=await U(f).catch(()=>[]);for(let h of m){if(!h.startsWith("rollout-")||!h.endsWith(".jsonl"))continue;let p=O(f,h);if(!(await te(p).catch(()=>null))?.isFile())continue;let{valid:g,meta:_}=await ie(p);if(!g||!_)continue;let x=_.payload?.cwd??"unknown";n.push({path:p,project:re(x),provider:"codex"})}}}}return n}l(le,"discoverSessionsInDir");function ce(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}l(ce,"resolveModel");function ue(e,t){return{async*parse(){let n;try{n=await rt(e.path,"utf-8")}catch{return}let o=n.split(`
|
|
12
|
-
`).filter(h=>h.trim()),s,r="",i=0,c=0,a=0,u=0,d=0,f=[],m="";for(let h of o){let p;try{p=JSON.parse(h)}catch{continue}if(p.type==="session_meta"){r=p.payload?.session_id??ee(e.path,".jsonl"),s=p.payload?.model;continue}if(p.type==="response_item"&&p.payload?.type==="function_call"){let y=p.payload.name??"";f.push(at[y]??y);continue}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload?.role==="user"){let y=(p.payload.content??[]).filter(g=>g.type==="input_text").map(g=>g.text??"").filter(Boolean);y.length>0&&(m=y.join(" "));continue}if(p.type==="event_msg"&&p.payload?.type==="token_count"){let y=p.payload.info;if(!y)continue;let g=y.total_token_usage?.total_tokens??0;if(g>0&&g===i)continue;i=g;let _=y.last_token_usage,x=0,v=0,w=0,S=0;if(_)x=_.input_tokens??0,v=_.cached_input_tokens??0,w=_.output_tokens??0,S=_.reasoning_output_tokens??0;else if(g>0){let T=y.total_token_usage;if(!T)continue;x=(T.input_tokens??0)-c,v=(T.cached_input_tokens??0)-a,w=(T.output_tokens??0)-u,S=(T.reasoning_output_tokens??0)-d}if(!_){let T=y.total_token_usage;T&&(c=T.input_tokens??0,a=T.cached_input_tokens??0,u=T.output_tokens??0,d=T.reasoning_output_tokens??0)}if(x+v+w+S===0)continue;let Rt=Math.max(0,x-v),Et=ce(p.payload,s),Z=p.timestamp??"",L=`codex:${e.path}:${Z}:${g}`;if(t.has(L))continue;t.add(L),yield{provider:"codex",model:Et,inputTokens:Rt,outputTokens:w,cacheCreationInputTokens:0,cacheReadInputTokens:v,cachedInputTokens:v,reasoningTokens:S,costUSD:0,tools:f,bashCommands:[],timestamp:Z,speed:"standard",deduplicationKey:L,userMessage:m,sessionId:r},f=[],m=""}}}}}l(ue,"createParser");var it={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(oe))if(e.startsWith(t))return n;return e},toolDisplayName(e){return at[e]??e},async discoverSessions(){return le(se())},createSessionParser(e,t){return ue(e,t)}};import{readdir as pe,readFile as lt,stat as me}from"fs/promises";import{basename as ct,dirname as de,join as H}from"path";import{homedir as fe}from"os";var he={"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"},ut={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"},ge=Object.entries(he).sort((e,t)=>t[0].length-e[0].length);function ye(){return H(fe(),".copilot","session-state")}l(ye,"getCopilotSessionStateDir");function _e(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}l(_e,"parseCwd");function Se(e,t){return{async*parse(){let n;try{n=await lt(e.path,"utf-8")}catch{return}let o=ct(de(e.path)),s=n.split(`
|
|
13
|
-
`).filter(c=>c.trim()),r="",i="";for(let c of s){let a;try{a=JSON.parse(c)}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:u,outputTokens:d,toolRequests:f=[]}=a.data;if(d===0||!r)continue;let m=`copilot:${o}:${u}`;if(t.has(m))continue;t.add(m);let h=f.map(p=>p.name??"").filter(Boolean).map(p=>ut[p]??p);yield{provider:"copilot",model:r,inputTokens:0,outputTokens:d,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:h,bashCommands:[],timestamp:a.timestamp??"",speed:"standard",deduplicationKey:m,userMessage:i,sessionId:o},i=""}}}}}l(Se,"createParser");async function ve(e){let t=[],n;try{n=await pe(e)}catch{return t}for(let o of n){let s=H(e,o,"events.jsonl");if(!(await me(s).catch(()=>null))?.isFile())continue;let i=o;try{let c=await lt(H(e,o,"workspace.yaml"),"utf-8"),a=_e(c);a&&(i=ct(a))}catch{}t.push({path:s,project:i,provider:"copilot"})}return t}l(ve,"discoverSessionsInDir");var pt={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of ge)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return ut[e]??e},async discoverSessions(){return ve(ye())},createSessionParser(e,t){return Se(e,t)}};import{readdir as mt,readFile as ft,stat as dt}from"fs/promises";import{basename as ht,join as z}from"path";import{homedir as xe}from"os";var Te={"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"},gt={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"},we=Object.entries(Te).sort((e,t)=>t[0].length-e[0].length);function Ie(){return z(xe(),".pi","agent","sessions")}l(Ie,"getPiSessionsDir");async function ke(e){try{let n=(await ft(e,"utf-8")).split(`
|
|
14
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(ke,"readFirstEntry");function Oe(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}l(Oe,"extractBashCommands");async function Ae(e){let t=[],n;try{n=await mt(e)}catch{return t}for(let o of n){let s=z(e,o);if(!(await dt(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await mt(s)}catch{continue}for(let c of i){if(!c.endsWith(".jsonl"))continue;let a=z(s,c);if(!(await dt(a).catch(()=>null))?.isFile())continue;let d=await ke(a);if(!d||d.type!=="session")continue;let f=d.cwd??o;t.push({path:a,project:ht(f),provider:"pi"})}}return t}l(Ae,"discoverSessionsInDir");function Ne(e,t){return{async*parse(){let n;try{n=await ft(e.path,"utf-8")}catch{return}let o=n.split(`
|
|
15
|
-
`).filter(i=>i.trim()),s=ht(e.path,".jsonl"),r="";for(let[i,c]of o.entries()){let a;try{a=JSON.parse(c)}catch{continue}if(a.type==="session"){s=a.id??s;continue}if(a.type!=="message")continue;let u=a.message;if(!u)continue;if(u.role==="user"){let S=(u.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);S.length>0&&(r=S.join(" "));continue}if(u.role!=="assistant"||!u.usage)continue;let{input:d,output:f,cacheRead:m,cacheWrite:h}=u.usage;if(d===0&&f===0)continue;let p=u.model??"gpt-5",y=u.responseId??"",g=`pi:${e.path}:${y||a.id||a.timestamp||String(i)}`;if(t.has(g))continue;t.add(g);let _=(u.content??[]).filter(S=>S.type==="toolCall"&&S.name),x=_.map(S=>gt[S.name]??S.name),v=_.filter(S=>S.name==="bash").flatMap(S=>{let k=S.arguments?.command;return typeof k=="string"?Oe(k):[]}),w=a.timestamp??"";yield{provider:"pi",model:p,inputTokens:d,outputTokens:f,cacheCreationInputTokens:h,cacheReadInputTokens:m,cachedInputTokens:m,reasoningTokens:0,costUSD:0,tools:x,bashCommands:v,timestamp:w,speed:"standard",deduplicationKey:g,userMessage:r,sessionId:s},r=""}}}}l(Ne,"createParser");var yt={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of we)if(e.startsWith(t))return n;return e},toolDisplayName(e){return gt[e]??e},async discoverSessions(){return Ae(Ie())},createSessionParser(e,t){return Ne(e,t)}};var Tt=[st,it,pt,yt],_t=null,St=!1;async function wt(){if(St)return _t;St=!0;try{let{cursor:e}=await import("./cursor-T7AMCMKS.js");return _t=e,e}catch{return null}}l(wt,"loadCursor");var vt=null,xt=!1;async function It(){if(xt)return vt;xt=!0;try{let{opencode:e}=await import("./opencode-QRJ3BH23.js");return vt=e,e}catch{return null}}l(It,"loadOpenCode");async function kt(){let[e,t]=await Promise.all([wt(),It()]),n=[...Tt];return e&&n.push(e),t&&n.push(t),n}l(kt,"getAllProviders");async function Pe(e){let t=await kt(),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(Pe,"discoverAllSessions");async function be(e){return e==="cursor"?await wt()??void 0:e==="opencode"?await It()??void 0:Tt.find(t=>t.name===e)}l(be,"getProvider");import{spawn as Y}from"node:child_process";import{randomUUID as $e}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 De}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 K(e){let t=e.runId?["env",`RULEMETRIC_RUN_ID=${e.runId}`,"claude"]:["claude"];return e.resumeSessionId&&t.push("--resume",e.resumeSessionId),e.model&&t.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...t]}l(K,"buildTmuxLaunchArgs");function R(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}l(R,"buildTmuxSendKeysArgs");function Ce(e){return["has-session","-t",e]}l(Ce,"buildTmuxHasSessionArgs");function E(e){return`tmux attach -t ${e}`}l(E,"buildTmuxAttachCommand");function je(){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(je,"tmuxSpawnEnv");function X(e){return new Promise(t=>{let n=De("tmux",e,{stdio:["ignore","ignore","pipe"],env:je()}),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 Ot(){return(await X(["-V"])).code===0}l(Ot,"isTmuxAvailable");var Ue=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Re(e){if(e!==void 0){if(Ue.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}l(Re,"validateRunId");function Ee(e){return`'${e.replace(/'/g,"'\\''")}'`}l(Ee,"shellSingleQuote");var M=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=$e(),o={...t,runId:Re(t.runId)};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.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),new Promise(r=>{let i=Y("claude",o,{cwd:t.projectPath,env:s,stdio:["ignore","pipe","pipe"]}),c="",a="";i.stdout.on("data",d=>{c+=d.toString()}),i.stderr.on("data",d=>{a+=d.toString()});let u=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",d=>{u&&clearTimeout(u);let f=c;try{let m=JSON.parse(c);f=m.result??m.content??c}catch{}r({sessionId:n,pid:i.pid,exitCode:d,output:f,error:d!==0?a:void 0})}),i.on("error",d=>{u&&clearTimeout(u),r({sessionId:n,error:`Failed to spawn claude: ${d.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??Ot)().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(K({sessionName:s,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId}));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 c=await o(R(s,t.prompt));if(c.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${c.code}: ${c.stderr.trim()||"no stderr"}`};let a=await o(R(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:E(s),live:!0}}}async openTerminalAttach(t,n){let o=Pt(Nt(),`rulemetric-attach-${n}.command`),s=`#!/bin/zsh
|
|
16
|
-
rm -- "$0"
|
|
17
|
-
${E(t)}
|
|
18
|
-
`;return await At(o,s,{mode:493}),new Promise(r=>{let i=Y("open",["-a","Terminal",o],{stdio:["ignore","pipe","pipe"]}),c="";i.stderr.on("data",a=>{c+=a.toString()}),i.on("close",a=>{r(a===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${a}: ${c.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(" "),c=Pt(Nt(),`rulemetric-launch-${n}.command`),a=t.runId?`export RULEMETRIC_RUN_ID=${Ee(t.runId)}
|
|
19
|
-
`:"",u=`#!/bin/zsh
|
|
20
|
-
rm -- "$0"
|
|
21
|
-
cd ${JSON.stringify(t.projectPath)} || exit
|
|
22
|
-
`+a+`${i}
|
|
23
|
-
`;return await At(c,u,{mode:493}),new Promise(d=>{let f=Y("open",["-a","Terminal",c],{stdio:["ignore","pipe","pipe"]}),m="";f.stderr.on("data",h=>{m+=h.toString()}),f.on("close",h=>{if(h===0)d({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,...s?{error:s}:{}});else{let p=m.trim()||"no stderr";d({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,error:s?`${s}; open exited ${h}: ${p}`:`open exited ${h}: ${p}`})}}),f.on("error",h=>{d({sessionId:n,liveSendAvailable:!1,fallbackReason:o,error:`Failed to spawn open: ${h.message}`})})})}};import{spawn as bt}from"node:child_process";import{randomUUID as Me}from"node:crypto";var q=class{static{l(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Me();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=bt("codex",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";r.stdout.on("data",u=>{i+=u.toString()}),r.stderr.on("data",u=>{c+=u.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",u=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:u,output:i,error:u!==0?c:void 0})}),r.on("error",u=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn codex: ${u.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=bt("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 Dt}from"node:child_process";import{randomUUID as qe}from"node:crypto";function Je(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(Je,"buildPiLaunchArgs");function Be(e){let t;for(let o of e.split(`
|
|
24
|
-
`))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(`
|
|
25
|
-
`)??"";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=qe(),o=Je(t);if(t.mode==="interactive"){let s=["pi",...o].map(c=>JSON.stringify(c)).join(" "),r=`cd ${JSON.stringify(t.projectPath)} && ${s}`,i=Dt("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=Dt("pi",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";r.stdout.on("data",u=>{i+=u.toString()}),r.stderr.on("data",u=>{c+=u.toString()});let a=t.timeout?setTimeout(()=>r.kill("SIGTERM"),t.timeout):null;r.on("close",u=>{a&&clearTimeout(a);let d=Be(i);s({sessionId:n,pid:r.pid,exitCode:u,output:d.output,error:d.error??(u!==0?c.trim()||i.trim()||`pi exited ${u}`:void 0)})}),r.on("error",u=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn pi: ${u.message}`})})})}};import{spawn as Ct}from"node:child_process";import{randomUUID as Ge}from"node:crypto";var B=class{static{l(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Ge();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=Ct("aider",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";r.stdout.on("data",u=>{i+=u.toString()}),r.stderr.on("data",u=>{c+=u.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",u=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:u,output:i,error:u!==0?c:void 0})}),r.on("error",u=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn aider: ${u.message}`})})})}launchInteractive(t,n){let o=["aider"];t.model&&o.push("--model",t.model);let s=`cd ${JSON.stringify(t.projectPath)} && ${o.join(" ")}`,r=Ct("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 Le}from"node:child_process";import{randomUUID as Fe}from"node:crypto";var G=class{static{l(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=Fe();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=Le("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),{sessionId:n,pid:s.pid}}};var jt={claude_code:l(()=>new M,"claude_code"),codex:l(()=>new q,"codex"),pi:l(()=>new J,"pi"),aider:l(()=>new B,"aider")};function We(e){let t=jt[e];return t?t():new G(e)}l(We,"getLauncher");function He(){return Object.entries(jt).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}l(He,"getAvailableLaunchers");import $t from"node:path";function Ut(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}l(Ut,"sanitizeBranch");function ze(e){return $t.resolve(e.basePath??$t.join(e.repoRoot,"..",".rulemetric-worktrees",Ut(e.branch)))}l(ze,"worktreePathFor");export{Ve as a,Ke as b,A as c,N as d,P as e,b as f,D as g,tt as h,C as i,j,Ht as k,zt as l,kt as m,Pe as n,be as o,V as p,K as q,R as r,Ce as s,E as t,We as u,He as v,Ut as w,ze as x};
|
package/dist/chunk-VBXL7XO7.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as i}from"./chunk-ZLLER3HP.js";var _=1.959963984540054;function F(n,t,e=_){if(t===0)return{lower:0,upper:1};let o=n/t,r=e*e,c=1+r/t,l=(o+r/(2*t))/c,u=e/c*Math.sqrt(o*(1-o)/t+r/(4*t*t));return{lower:Math.max(0,l-u),upper:Math.min(1,l+u)}}i(F,"wilsonInterval");function O(n,t){let e=n,o=t,r=e+o;if(r===0)return{pValue:1,nDiscordant:0};let c=Math.min(e,o),l=Math.pow(.5,r),u=l;for(let s=1;s<=c;s++)l*=(r-s+1)/s,u+=l;return{pValue:Math.min(1,2*u),nDiscordant:r}}i(O,"mcnemarExact");function k(n,t,e=10){return{sufficient:n>=e&&t>=e,minN:e,nWith:n,nWithout:t,shortfall:{with:Math.max(0,e-n),without:Math.max(0,e-t)}}}i(k,"assessSufficiency");function M(n){let t=n>>>0;return()=>{t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}i(M,"seededRandom");function T(n,t){let e=n.length;if(e===1)return n[0];let o=(e-1)*t,r=Math.floor(o),c=Math.ceil(o);return r===c?n[r]:n[r]+(o-r)*(n[c]-n[r])}i(T,"sortedQuantile");function L(n,t={}){let e=n.length;if(e===0)return{estimate:0,lower:0,upper:0,iterations:0};let o=t.iterations??1e4,r=t.ciLevel??.95,c=M(t.seed??1),l=n.reduce((a,m)=>a+m,0)/e,u=new Array(o);for(let a=0;a<o;a++){let m=0;for(let h=0;h<e;h++)m+=n[c()*e|0];u[a]=m/e}u.sort((a,m)=>a-m);let s=(1-r)/2;return{estimate:l,lower:T(u,s),upper:T(u,1-s),iterations:o}}i(L,"pairedBootstrapCI");function U(n,t={}){let e=n.filter(d=>d.withScores.length>0&&d.withoutScores.length>0);if(e.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let o=i(d=>d.reduce((p,g)=>p+g,0)/d.length,"mean"),r=e.map(d=>d.withScores.length*d.withoutScores.length/(d.withScores.length+d.withoutScores.length)),c=r.reduce((d,p)=>d+p,0),l=i(d=>d.reduce((p,g,w)=>p+r[w]*g,0)/c,"combine"),u=l(e.map(d=>o(d.withScores)-o(d.withoutScores))),s=t.iterations??1e4,a=t.ciLevel??.95,m=M(t.seed??1),h=new Array(s),b=0,A=0;for(let d=0;d<s;d++){let p=e.map(w=>{let $=0;for(let v=0;v<w.withScores.length;v++)$+=w.withScores[m()*w.withScores.length|0];let y=0;for(let v=0;v<w.withoutScores.length;v++)y+=w.withoutScores[m()*w.withoutScores.length|0];return $/w.withScores.length-y/w.withoutScores.length}),g=l(p);h[d]=g,g<=0&&b++,g>=0&&A++}h.sort((d,p)=>d-p);let S=(1-a)/2;return{estimate:u,lower:T(h,S),upper:T(h,1-S),pValue:Math.min(1,2*Math.min(b,A)/s),iterations:s}}i(U,"stratifiedBootstrapCI");function H(n,t){let e=n.length,o=t.length;if(e===0||o===0)return 0;let r=[...n.map(a=>({t:a,exposed:!0})),...t.map(a=>({t:a,exposed:!1}))].sort((a,m)=>a.t-m.t),c=0,l=0;for(;l<r.length;){let a=l;for(;a+1<r.length&&r[a+1].t===r[l].t;)a++;let m=(l+1+a+1)/2;for(let h=l;h<=a;h++)r[h].exposed&&(c+=m);l=a+1}let s=(c-e*(e+1)/2)/(e*o);return Math.abs(s-.5)}i(H,"cohortTimeSeparation");var C=.35,N=900*1e3;function j(n,t,e=C,o=N){if(n.length===0||t.length===0)return!1;let r=[...n,...t];return Math.max(...r)-Math.min(...r)<o?!1:H(n,t)>e}i(j,"isTimeSeparated");var G=i(n=>n===0||n===1,"isBinary");function J(n,t,e){return n.every(r=>r[t]!=null&&r[e]!=null)?n.reduce((r,c)=>r+(c[t]-c[e]),0)/n.length:null}i(J,"meanPairDelta");function W(n,t={}){let e=t.baseline??"no-rule",o=t.minN??10,r=n.length,c=n.map(d=>d.withScore-d.withoutScore),l=r===0?0:c.reduce((d,p)=>d+p,0)/r,u=L(c,{seed:t.seed,iterations:t.iterations}),s={lower:u.lower,upper:u.upper},a=n.every(d=>G(d.withScore)&&G(d.withoutScore)),m=null;if(a&&r>0){let d=0,p=0;for(let g of n)g.withScore===1&&g.withoutScore===0?d++:g.withScore===0&&g.withoutScore===1&&p++;m=O(d,p).pValue}let{sufficient:h}=k(r,r,o),b=s.lower>0||s.upper<0,S={mode:"controlled",baseline:e,delta:l,ci:s,pValue:m,significant:h&&b,sufficient:h,nWith:r,nWithout:r,costDelta:J(n,"withCost","withoutCost"),latencyDelta:J(n,"withLatency","withoutLatency"),confounded:!1};return h||(S.insufficientReason=`insufficient data: need >= ${o} paired tasks per cohort, have ${r}`),S}i(W,"buildControlledVerdict");var de=2;function z(n,t={}){let e=t.minN??10,o=t.minPerStratum??de,r=t.maxTimeSeparation??C,c=t.minStratumSpanMs??N,l=n.filter(f=>f.withScores.length>=o&&f.withoutScores.length>=o),u=l.filter(f=>f.withTimes!=null&&f.withoutTimes!=null&&j(f.withTimes,f.withoutTimes,r,c)),s=new Set(u.map(f=>f.key)),a=l.filter(f=>!s.has(f.key)),m=n.filter(f=>f.withScores.length>0&&f.withoutScores.length>0&&(f.withScores.length<o||f.withoutScores.length<o)).length,h=a.reduce((f,x)=>f+x.withScores.length,0),b=a.reduce((f,x)=>f+x.withoutScores.length,0),A=U(a,{seed:t.seed,iterations:t.iterations}),S={lower:A.lower,upper:A.upper},d=A.estimate,p=a.length>0&&h>=e&&b>=e,g=a.length>0?A.pValue:null,w=p&&(S.lower>0||S.upper<0),$=n.reduce((f,x)=>f+x.withScores.length+x.withoutScores.length,0),y=$>0?(h+b)/$:0,v={mode:"observational",baseline:t.baseline??"no-rule",delta:d,ci:S,pValue:g,significant:w,sufficient:p,nWith:h,nWithout:b,costDelta:null,latencyDelta:null,confounded:!0,strata:a.length,strataDroppedForTimeSeparation:u.length,coverage:y};if(!p){let f=m>0?` (${m} project(s) had both cohorts but fewer than ${o} sessions in one of them)`:"",x=u.length>0?` ${u.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";v.insufficientReason=a.length===0?u.length>0?`insufficient data: no comparable cohort.${x}${f}`:`insufficient data: no project has >= ${o} exposed AND >= ${o} unexposed sessions to compare within${f}`:`insufficient data: need >= ${e} sessions per cohort across comparable projects, have ${h} exposed / ${b} unexposed${f}${x?`.${x}`:""}`}return v}i(z,"buildStratifiedVerdict");function Q(n){let t=new Map;for(let e of n){let o=t.get(e.stratum);o||(o={key:e.stratum,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},t.set(e.stratum,o)),(e.exposed?o.withScores:o.withoutScores).push(e.score),e.time!=null&&(e.exposed?o.withTimes:o.withoutTimes).push(e.time)}for(let e of t.values())(e.withTimes.length!==e.withScores.length||e.withoutTimes.length!==e.withoutScores.length)&&(delete e.withTimes,delete e.withoutTimes);return[...t.values()]}i(Q,"toStrata");var R=.05;function K(n,t={}){let e=t.trialIndex??0,o=t.seed??1,r=t.exposedFraction??.5,c=t.effect??0,l=M(o+e*2),u=n.map(s=>{let a=l()<r;return{stratum:s.stratum,score:a?s.score+c:s.score,exposed:a,time:s.time}});return z(Q(u),{seed:o+e*2+1,iterations:t.iterations??500,minN:t.minN,minPerStratum:t.minPerStratum})}i(K,"runCalibrationTrial");function q(n,t={}){let e=t.trials??200,o=[];for(let r=0;r<e;r++)o.push(K(n,{...t,trialIndex:r}));return D(o,t.effect??0)}i(q,"calibrate");function D(n,t){let e=0,o=0,r=0,c=0;for(let s of n)s.sufficient&&(e++,s.significant&&o++,r+=s.delta,c=Math.max(c,Math.abs(s.delta)));let l=e>0?o/e:0,u=F(o,e,_);return{trials:n.length,evaluated:e,insufficient:n.length-e,significantTrials:o,significantRate:l,significantRateCi:u,meanDelta:e>0?r/e:0,maxAbsDelta:c,alpha:R,effect:t,calibrated:t===0&&e>0&&u.lower<=R&&R<=u.upper}}i(D,"summarizeTrials");function I(n,t={}){return q(n,{...t,effect:0})}i(I,"aaCalibration");function Y(n,t,e={}){return q(n,{...e,effect:t})}i(Y,"powerCheck");var he=.8416212335729143;var te=[{ym:"2026-03",n:122,mean:.287},{ym:"2026-04",n:50,mean:.07},{ym:"2026-05",n:267,mean:.089},{ym:"2026-06",n:61,mean:.201},{ym:"2026-07",n:162,mean:.071}],B=662;function Z(n=2){let t=[];for(let e of te){let o=Math.round(e.n*e.mean);for(let r=0;r<e.n;r++)t.push({stratum:`proj-${r%n}|${e.ym}`,score:r<o?1:0})}if(n===2&&t.length!==B)throw new Error(`realisticCanaryCorpus: expected ${B} sessions, built ${t.length}`);return t}i(Z,"realisticCanaryCorpus");function ne(n=600){return Array.from({length:n},(t,e)=>({stratum:"only",score:e%4===0?1:0}))}i(ne,"flatCanaryCorpus");var oe=50,re=4,P={min:.2,max:.7};function me(n,t){let e=M(t),o=P.max-P.min;return Array.from({length:n},()=>P.min+e()*o)}i(me,"caseDifficulties");function ee(n,t,e){let o=0;for(let r=0;r<t;r++)e()<n&&o++;return o/t}i(ee,"passRate");function ie(n={}){let t=n.trialIndex??0,e=n.seed??1,o=n.cases??oe,r=n.assertions??re,c=n.effect??0,l=me(o,e),u=M(e+t*2),s=l.map(a=>({withScore:ee(a+c,r,u),withoutScore:ee(a,r,u)}));return W(s,{baseline:"prior-version",seed:e+t*2+1,iterations:n.iterations??500,minN:n.minN})}i(ie,"runControlledCalibrationTrial");function X(n={}){let t=n.trials??200,e=[];for(let o=0;o<t;o++)e.push(ie({...n,trialIndex:o}));return D(e,n.effect??0)}i(X,"controlledCalibration");function ae(n={}){return X({...n,effect:0})}i(ae,"controlledAaCalibration");function se(n,t={}){return X({...t,effect:n})}i(se,"controlledPowerCheck");var ce={maxSignificantRate:.15,maxMeanAbsDelta:.02,maxWorstCaseDelta:.15,powerProbeEffect:.2,minPower:.9,minPowerMeanDelta:.15};function E(n,t,e){let o=e.filter(r=>!r.ok).map(r=>r.why);return{name:n,passed:o.length===0,detail:o.length===0?`${n}: ok (rate=${t.significantRate.toFixed(3)}, meanDelta=${t.meanDelta.toFixed(4)}, evaluated=${t.evaluated}/${t.trials})`:`${n}: ${o.join("; ")}`,result:t}}i(E,"check");function pe(n={}){let t=n.trials??200,e=n.powerTrials??200,o=ce,r=[],c=I(ne(),{trials:t,seed:11});r.push(E("aa-flat",c,[{ok:c.calibrated,why:`\u03B1=${R} outside rate CI [${c.significantRateCi.lower.toFixed(3)}, ${c.significantRateCi.upper.toFixed(3)}]`},{ok:c.significantRate<o.maxSignificantRate,why:`false-positive rate ${c.significantRate.toFixed(3)} \u2265 ${o.maxSignificantRate}`},{ok:Math.abs(c.meanDelta)<o.maxMeanAbsDelta,why:`mean delta ${c.meanDelta.toFixed(4)} not centred on zero`}]));let l=I(Z(),{trials:t,seed:23});r.push(E("aa-realistic",l,[{ok:l.calibrated,why:`\u03B1=${R} outside rate CI [${l.significantRateCi.lower.toFixed(3)}, ${l.significantRateCi.upper.toFixed(3)}]`},{ok:l.significantRate<o.maxSignificantRate,why:`false-positive rate ${l.significantRate.toFixed(3)} \u2265 ${o.maxSignificantRate}`},{ok:Math.abs(l.meanDelta)<o.maxMeanAbsDelta,why:`mean delta ${l.meanDelta.toFixed(4)} not centred on zero`},{ok:l.maxAbsDelta<o.maxWorstCaseDelta,why:`worst single-trial delta ${l.maxAbsDelta.toFixed(3)} \u2265 ${o.maxWorstCaseDelta}`}]));let u=Y(Z(),o.powerProbeEffect,{trials:e,seed:5});r.push(E("power-observational",u,[{ok:u.significantRate>o.minPower,why:`detects +${o.powerProbeEffect} only ${u.significantRate.toFixed(3)} of the time`},{ok:u.meanDelta>o.minPowerMeanDelta,why:`measured mean delta ${u.meanDelta.toFixed(3)} understates the injected +${o.powerProbeEffect}`}]));let s=ae({trials:t,seed:31});r.push(E("aa-controlled",s,[{ok:s.calibrated,why:`\u03B1=${R} outside rate CI [${s.significantRateCi.lower.toFixed(3)}, ${s.significantRateCi.upper.toFixed(3)}]`},{ok:s.significantRate<o.maxSignificantRate,why:`false-positive rate ${s.significantRate.toFixed(3)} \u2265 ${o.maxSignificantRate}`},{ok:Math.abs(s.meanDelta)<o.maxMeanAbsDelta,why:`mean delta ${s.meanDelta.toFixed(4)} not centred on zero`}]));let a=se(o.powerProbeEffect,{trials:e,seed:37});r.push(E("power-controlled",a,[{ok:a.significantRate>o.minPower,why:`detects +${o.powerProbeEffect} only ${a.significantRate.toFixed(3)} of the time`}]));let m=r.filter(h=>!h.passed).map(h=>h.detail);return{green:m.length===0,checks:r,failures:m}}i(pe,"runPromotionCanary");var we=3,xe=7;export{_ as a,W as b,he as c,pe as d,we as e,xe as f};
|
package/dist/chunk-ZTQUGAZG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as z}from"./chunk-5RBLIVBF.js";import{a as L}from"./chunk-7MTYUTUN.js";import{b as A}from"./chunk-DXNUCWUX.js";import{a as j,c as G}from"./chunk-T47SFA5X.js";import{f as P}from"./chunk-SWSOEYC7.js";import{a as S}from"./chunk-DVU5PHPM.js";import{a as J,f as T}from"./chunk-FBSZ6KCM.js";import{e as y,f as R,h as f}from"./chunk-GIXHG5FK.js";import{a as E}from"./chunk-ZLLER3HP.js";async function X(s,v){let{mirrorId:l,evalTargetId:u}=s,o=s.measurement?{...s.config,...G({...s.config,measurement:s.measurement})}:s.config,a=E(e=>v.logger.info(e),"log"),i=await y(`/api/eval-targets/${u}`),b=await y(`/api/eval-targets/${u}/evals`);if(b.length===0&&o.generateIfEmpty){a("No eval cases on target \u2014 generating from content via local LLM...");let e=await A({content:i.content,name:i.name,...s.measurement?{measurement:s.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 t of e)r.push(await R(`/api/eval-targets/${u}/evals`,t));b=r,a(`Generated ${r.length} eval case(s)`)}if(b.length===0)throw new z("No evals defined for target");let F=o.runsPerEval??1,_=o.timeout??12e4,I=o.iteration??1,k=new Set;if(v.job.attempts>1)for(let r=0;;r+=100){let t=await y(`/api/eval-targets/${u}/runs?jobId=${l}&limit=100&offset=${r}`);for(let n of t)k.add(`${n.evalId}|${n.configuration}|${n.runNumber}|${n.iteration}`);if(t.length<100)break}let M=[{name:"with_target",content:i.content}];o.skipBaseline||M.push({name:"without_target"});let d=[];for(let e of b)for(let r of M)for(let t=1;t<=F;t++)k.has(`${e.id}|${r.name}|${t}|${I}`)||d.push({eval_:e,configuration:r.name,targetContent:r.content,runNumber:t});k.size>0&&a(`Resuming attempt ${v.job.attempts}: ${k.size} run(s) already persisted, ${d.length} remaining`);let g=d.length,c=0,$=J(o.engine),p=Math.min(o.parallel??1,4);await f(`/api/eval-jobs/${l}/progress`,{status:"running",progress:{total:g,completed:0,current:null,message:`Starting ${g} eval runs (concurrency: ${p})...`}});let h=[];async function x(e){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;a(`[${c+1}/${g}] ${r}`);let t=P({targetType:i.type,targetContent:e.targetContent,targetName:i.name,engine:$});t.leakedFiles.length&&a(`\u26A0 CONTAMINATED ${r}: ${t.leakedFiles.join(", ")} survived the strip`);try{let n=await T({prompt:e.eval_.prompt,targetContent:t.systemPrompt,workDir:t.workDir,timeout:_,model:o.model,engine:$}),m={};return!o.skipGrading&&e.eval_.expectations.length>0&&!n.error&&(m=await S({...j({engine:$,model:o.model},{engine:o.graderEngine,model:o.graderModel}),prompt:e.eval_.prompt,output:n.output,expectations:e.eval_.expectations,timeout:_})),{jobId:l,evalId:e.eval_.id,evalTargetId:i.id,evalTargetVersion:i.version,configuration:e.configuration,runNumber:e.runNumber,iteration:I,status:n.error?"failed":"completed",outputs:{...n.error?{error:n.error}:{transcript:n.output,...n.model?{model:n.model}:{}},methodology:t.methodology,delivery:t.delivery,isolated:t.isWorktree,engine:n.engine??$,model:n.model??null,deliveryRegime:`${i.type}:${$}:${t.methodology}`,...s.measurement?{measurement:s.measurement}:{},...n.provider?{provider:n.provider}:{},...n.costUsd!=null?{costUsd:n.costUsd}:{},...t.leakedFiles.length?{leakedFiles:t.leakedFiles}:{}},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens},grading:m,worktree:t.isWorktree?!0:void 0}}finally{t.cleanup()}}if(E(x,"processItem"),p<=1)for(let e of d){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;await f(`/api/eval-jobs/${l}/progress`,{status:"running",progress:{total:g,completed:c,current:r,message:`Executing ${r}...`}});let t=await x(e);await R("/api/eval-runs",t),h.push(t),c++,await f(`/api/eval-jobs/${l}/progress`,{status:"running",progress:{total:g,completed:c,current:r,message:`Completed ${r}`}})}else{a(`Running ${g} evals with concurrency=${p} (worktree isolation)`);for(let e=0;e<d.length;e+=p){let r=d.slice(e,e+p),t=`batch ${Math.floor(e/p)+1}/${Math.ceil(d.length/p)}`;await f(`/api/eval-jobs/${l}/progress`,{status:"running",progress:{total:g,completed:c,current:t,message:`Executing ${t} (${r.length} parallel)...`}});let n=await Promise.all(r.map(x));for(let m of n)await R("/api/eval-runs",m),h.push(m),c++;await f(`/api/eval-jobs/${l}/progress`,{status:"running",progress:{total:g,completed:c,current:t,message:`Completed ${t}`}})}}let N=O(h),w;if(!o.skipGrading&&h.some(e=>e.grading&&Object.keys(e.grading).length>0))try{a(`Running meta-judge for job ${l}...`);let e=b.map(r=>{let n=h.filter(m=>m.evalId===r.id&&m.configuration==="with_target")[0];return{evalName:r.name,prompt:r.prompt,expectations:r.expectations,grading:n?.grading?n.grading:null,output:n?.outputs?.transcript?.slice(0,500)}});w=await L({...j({engine:$,model:o.model},{engine:o.graderEngine,model:o.graderModel}),targetName:i.name,evalResults:e,timeout:6e4}),a(`Meta-judge: quality=${w.quality_score}/5, issues=${w.issues.length}`)}catch(e){a(`Meta-judge failed (non-fatal): ${e instanceof Error?e.message:String(e)}`)}let C=w?{...N,meta_judgement:w}:N;return a(`Job ${l} completed: ${c}/${g} runs`),await f(`/api/eval-jobs/${l}/state`,{result:C}).catch(e=>{a(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),C}E(X,"processEval");function O(s){let v=s.filter(a=>a.status==="completed"),l=s.filter(a=>a.status==="failed"),u=v.filter(a=>{let i=a.grading;return i&&Object.keys(i).length>0}),o=u.length>0?u.reduce((a,i)=>a+(i.grading?.summary?.pass_rate??0),0)/u.length:null;return{total:s.length,completed:v.length,failed:l.length,avgPassRate:o}}E(O,"buildSummary");export{X as a};
|